<?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>35312</bug_id>
          
          <creation_ts>2010-02-23 12:31:48 -0800</creation_ts>
          <short_desc>[Qt] GraphicsLayer: preserves-3d and backface visibility</short_desc>
          <delta_ts>2010-04-29 00:18:08 -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>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc>http://webkit.org/blog-files/3d-transforms/morphing-cubes.html</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Qt</keywords>
          <priority>P3</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>38074</dependson>
          <blocked>35784</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Noam Rosenthal">noam</reporter>
          <assigned_to name="Noam Rosenthal">noam</assigned_to>
          <cc>abarth</cc>
    
    <cc>ariya.hidayat</cc>
    
    <cc>commit-queue</cc>
    
    <cc>eric</cc>
    
    <cc>hausmann</cc>
    
    <cc>kenneth</cc>
    
    <cc>vestbo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>193076</commentid>
    <comment_count>0</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-02-23 12:31:48 -0800</bug_when>
    <thetext>Currently Qt AC only supports 3D transforms and animations, but doesn&apos;t support full 3D with backface-visibility and preserves-3d. Work on it is ongoing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193171</commentid>
    <comment_count>1</comment_count>
      <attachid>49338</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-02-23 16:14:42 -0800</bug_when>
    <thetext>Created attachment 49338
WIP: preserves-3d and backface-visibility

This is not ready to review, as it&apos;s still a bit buggy. 
http://webkit.org/blog-files/3d-transforms/morphing-cubes.html works fine, but http://webkit.org/blog-files/3d-transforms/poster-circle.html doesn&apos;t, for example.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196514</commentid>
    <comment_count>2</comment_count>
    <who name="Tor Arne Vestbø">vestbo</who>
    <bug_when>2010-03-05 09:39:47 -0800</bug_when>
    <thetext>
Please follow the QtWebKit bug reporting guidelines when reporting bugs.

See http://trac.webkit.org/wiki/QtWebKitBugs

Specifically:

  - The &apos;QtWebKit&apos; component should be used for bugs/features in the public QtWebKit API layer, not to signify that the bug is specific to the Qt port of WebKit

    http://trac.webkit.org/wiki/QtWebKitBugs#Component</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214458</commentid>
    <comment_count>3</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-04-19 19:38:05 -0700</bug_when>
    <thetext>Why was this bug closed? Is the patch landed? or not needed anymore? If it is not obvious why you close a bug, please add a comment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214466</commentid>
    <comment_count>4</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-04-19 21:13:55 -0700</bug_when>
    <thetext>hm... not sure who closed this, if it was me it was by mistake.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>217392</commentid>
    <comment_count>5</comment_count>
      <attachid>54355</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-04-26 17:47:22 -0700</bug_when>
    <thetext>Created attachment 54355
better way to do preserves-3D</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218001</commentid>
    <comment_count>6</comment_count>
      <attachid>54462</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-04-27 15:40:55 -0700</bug_when>
    <thetext>Created attachment 54462
preserves-3d works with Qt!

This patch makes all the preserves-3d examples work. It&apos;s a good solution until we have full 3D in Qt.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218004</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-27 15:42:13 -0700</bug_when>
    <thetext>Attachment 54462 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
WebCore/platform/graphics/qt/GraphicsLayerQt.cpp:288:  An else statement can be removed when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
WebCore/platform/graphics/qt/GraphicsLayerQt.cpp:355:  Missing space before ( in if(  [whitespace/parens] [5]
WARNING: File exempt from style guide. Skipping: &quot;WebKit/qt/Api/qgraphicswebview.cpp&quot;
Total errors found: 2 in 5 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218077</commentid>
    <comment_count>8</comment_count>
      <attachid>54462</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-04-27 17:28:36 -0700</bug_when>
    <thetext>Comment on attachment 54462
preserves-3d works with Qt!

uploaded wrong patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218095</commentid>
    <comment_count>9</comment_count>
      <attachid>54488</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-04-27 17:50:30 -0700</bug_when>
    <thetext>Created attachment 54488
uploading correct patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218342</commentid>
    <comment_count>10</comment_count>
      <attachid>54488</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-04-28 05:44:22 -0700</bug_when>
    <thetext>Comment on attachment 54488
uploading correct patch

&gt; diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
&gt; index dfd08fb..07cefb0 100644
&gt; --- a/WebCore/ChangeLog
&gt; +++ b/WebCore/ChangeLog
&gt; @@ -1,3 +1,22 @@
&gt; +2010-04-27  Noam Rosenthal  &lt;noam.rosenthal@nokia.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        [Qt] GraphicsLayer: preserves-3d and backface visibility
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=35312
&gt; +
&gt; +        Implement preserves-3d by maintaining the 3D transformation heirarchy inside GraphicsLayerQt, and extrapolating
&gt; +        the relative QTransform. When the extrapolation fails (un-invertible matrix) we ignore the transformation change.
&gt; +
&gt; +        WebKitSite/blog-files/3d-transforms test now work with Qt.
&gt; +
&gt; +        * platform/graphics/qt/GraphicsLayerQt.cpp:
&gt; +        (WebCore::GraphicsLayerQtImpl::updateTransform):
&gt; +        (WebCore::GraphicsLayerQtImpl::opaqueArea):
&gt; +        (WebCore::GraphicsLayerQtImpl::boundingRect):
&gt; +        (WebCore::GraphicsLayerQtImpl::paint):
&gt; +        (WebCore::GraphicsLayerQtImpl::flushChanges):
&gt; +
&gt;  2010-04-27  Adam Barth  &lt;abarth@webkit.org&gt;
&gt;  
&gt;          Reviewed by Eric Seidel.
&gt; diff --git a/WebCore/platform/graphics/qt/GraphicsLayerQt.cpp b/WebCore/platform/graphics/qt/GraphicsLayerQt.cpp
&gt; index a31d045..1c4c275 100644
&gt; --- a/WebCore/platform/graphics/qt/GraphicsLayerQt.cpp
&gt; +++ b/WebCore/platform/graphics/qt/GraphicsLayerQt.cpp
&gt; @@ -32,14 +32,11 @@
&gt;  #include &lt;QtCore/qmetaobject.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/qpixmapcache.h&gt;
&gt;  #include &lt;QtGui/qstyleoption.h&gt;
&gt; @@ -135,6 +132,8 @@ public:
&gt;      // the compositor lets us special-case images and colors, so we try to do so
&gt;      enum StaticContentType { HTMLContentType, PixmapContentType, ColorContentType, MediaContentType};
&gt;  
&gt; +    const GraphicsLayerQtImpl* rootLayer() const;
&gt; +
&gt;      GraphicsLayerQtImpl(GraphicsLayerQt* newLayer);
&gt;      virtual ~GraphicsLayerQtImpl();
&gt;  
&gt; @@ -143,9 +142,8 @@ public:
&gt;      virtual QRectF boundingRect() const;
&gt;      virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
&gt;  
&gt; -    // we manage transforms ourselves because transform-origin acts differently in webkit and in Qt
&gt; +    // We manage transforms ourselves because transform-origin acts differently in webkit and in Qt, and we need it as a fallback in case we encounter an un-invertible matrix
&gt;      void setBaseTransform(const TransformationMatrix&amp;);
&gt; -    QTransform computeTransform(const TransformationMatrix&amp; baseTransform) const;
&gt;      void updateTransform();
&gt;  
&gt;      // let the compositor-API tell us which properties were changed
&gt; @@ -163,10 +161,6 @@ public:
&gt;      // or ChromeClientQt::scheduleCompositingLayerSync (meaning the sync will happen ASAP)
&gt;      void flushChanges(bool recursive = true, bool forceTransformUpdate = false);
&gt;  
&gt; -    // optimization: returns true if this or an ancestor has a transform animation running.
&gt; -    // this enables us to use ItemCoordinatesCache while the animation is running, otherwise we have to recache for every frame
&gt; -    bool isTransformAnimationRunning() const;
&gt; -
&gt;  public slots:
&gt;      // we need to notify the client (aka the layer compositor) when the animation actually starts
&gt;      void notifyAnimationStarted();
&gt; @@ -182,6 +176,7 @@ public:
&gt;      GraphicsLayerQt* m_layer;
&gt;  
&gt;      TransformationMatrix m_baseTransform;
&gt; +    TransformationMatrix m_transformRelativeToRootLayer;
&gt;      bool m_transformAnimationRunning;
&gt;      bool m_opacityAnimationRunning;
&gt;      QWeakPointer&lt;MaskEffectQt&gt; m_maskEffect;
&gt; @@ -288,6 +283,14 @@ GraphicsLayerQtImpl::~GraphicsLayerQtImpl()
&gt;  #endif
&gt;  }
&gt;  
&gt; +const GraphicsLayerQtImpl* GraphicsLayerQtImpl::rootLayer() const
&gt; +{
&gt; +    if (const GraphicsLayerQtImpl* parent = qobject_cast&lt;const GraphicsLayerQtImpl*&gt;(parentObject()))
&gt; +        return parent-&gt;rootLayer();
&gt; +    return this;
&gt; +}
&gt; +
&gt; +
&gt;  
&gt;  QPixmap GraphicsLayerQtImpl::recache(const QRegion&amp; regionToUpdate)
&gt;  {
&gt; @@ -299,7 +302,7 @@ QPixmap GraphicsLayerQtImpl::recache(const QRegion&amp; regionToUpdate)
&gt;  
&gt;      // We might be drawing into an existing cache.
&gt;      if (!QPixmapCache::find(m_backingStoreKey, &amp;pixmap))
&gt; -        region = QRegion(boundingRect().toAlignedRect());
&gt; +        region = QRegion(QRect(0, 0, m_size.width(), m_size.height()));
&gt;  
&gt;      if (m_size != pixmap.size()) {
&gt;          pixmap = QPixmap(m_size.toSize());
&gt; @@ -325,63 +328,93 @@ QPixmap GraphicsLayerQtImpl::recache(const QRegion&amp; regionToUpdate)
&gt;  
&gt;  void GraphicsLayerQtImpl::updateTransform()
&gt;  {
&gt; -    setBaseTransform(isTransformAnimationRunning() ? m_baseTransform : m_layer-&gt;transform());
&gt; -}
&gt; -
&gt; -void GraphicsLayerQtImpl::setBaseTransform(const TransformationMatrix&amp; baseTransform)
&gt; -{
&gt; -    m_baseTransform = baseTransform;
&gt; -    setTransform(computeTransform(baseTransform));
&gt; -}
&gt; -
&gt; -QTransform GraphicsLayerQtImpl::computeTransform(const TransformationMatrix&amp; baseTransform) const
&gt; -{
&gt; -    if (!m_layer)
&gt; -        return baseTransform;
&gt; -
&gt; -    TransformationMatrix computedTransform;
&gt; +    if (!m_transformAnimationRunning)
&gt; +        m_baseTransform = m_layer-&gt;transform();
&gt;  
&gt; -    // The origin for childrenTransform is always the center of the ancestor which contains the childrenTransform.
&gt; -    // this has to do with how WebCore implements -webkit-perspective and -webkit-perspective-origin, which are the CSS
&gt; -    // attribute that call setChildrenTransform
&gt; -    QPointF offset = -pos() - boundingRect().bottomRight() / 2;
&gt; +    TransformationMatrix localTransform;
&gt;  
&gt; -    for (const GraphicsLayerQtImpl* ancestor = this; (ancestor = qobject_cast&lt;GraphicsLayerQtImpl*&gt;(ancestor-&gt;parentObject())); ) {
&gt; -        if (!ancestor-&gt;m_state.childrenTransform.isIdentity()) {
&gt; -            const QPointF offset = mapFromItem(ancestor, QPointF(ancestor-&gt;m_size.width() / 2, ancestor-&gt;m_size.height() / 2));
&gt; -            computedTransform
&gt; -                .translate(offset.x(), offset.y())
&gt; -                .multLeft(ancestor-&gt;m_state.childrenTransform)
&gt; -                .translate(-offset.x(), -offset.y());
&gt; -            break;
&gt; -        }
&gt; -    }
&gt; +    GraphicsLayerQtImpl* parent = qobject_cast&lt;GraphicsLayerQtImpl*&gt;(parentObject());
&gt;  
&gt;      // webkit has relative-to-size originPoint, graphics-view has a pixel originPoint, here we convert
&gt;      // we have to manage this ourselves because QGraphicsView&apos;s transformOrigin is incompatible
&gt;      const qreal originX = m_state.anchorPoint.x() * m_size.width();
&gt;      const qreal originY = m_state.anchorPoint.y() * m_size.height();
&gt; -    computedTransform
&gt; -            .translate3d(originX, originY, m_state.anchorPoint.z())
&gt; -            .multLeft(baseTransform)
&gt; +
&gt; +    // We ignore QGraphicsItem::pos completely, and use only transforms - because we have to maintain that ourselves for 3D.
&gt; +    localTransform
&gt; +            .translate3d(originX + m_state.pos.x(), originY + m_state.pos.y(), m_state.anchorPoint.z())
&gt; +            .multLeft(m_baseTransform)
&gt;              .translate3d(-originX, -originY, -m_state.anchorPoint.z());
&gt;  
&gt; -    // now we project to 2D
&gt; -    return QTransform(computedTransform);
&gt; +    // This is the actual 3D transform of this item, with the ancestors&apos; transform baked in.
&gt; +    m_transformRelativeToRootLayer = TransformationMatrix(parent ? parent-&gt;m_transformRelativeToRootLayer : TransformationMatrix())
&gt; +                                         .multLeft(localTransform);
&gt; +
&gt; +    // Now we have enough information to determine if the layer is facing backwards.
&gt; +    if (!m_state.backfaceVisibility &amp;&amp; m_transformRelativeToRootLayer.inverse().m33() &lt; 0) {
&gt; +        setVisible(false);
&gt; +        // No point in making extra calculations for invisible elements.
&gt; +        return;
&gt; +    }
&gt; +
&gt; +    // Simplistic depth test - we stack the item behind its parent if its computed z is lower than the parent&apos;s computed z at the item&apos;s center point.
&gt; +    if (parent) {
&gt; +        const QPointF centerPointMappedToRoot = rootLayer()-&gt;mapFromItem(this, m_size.width() / 2, m_size.height() / 2);
&gt; +        setFlag(ItemStacksBehindParent,
&gt; +                m_transformRelativeToRootLayer.mapPoint(FloatPoint3D(centerPointMappedToRoot.x(), centerPointMappedToRoot.y(), 0)).z() &lt;
&gt; +                parent-&gt;m_transformRelativeToRootLayer.mapPoint(FloatPoint3D(centerPointMappedToRoot.x(), centerPointMappedToRoot.y(), 0)).z());
&gt; +    }
&gt; +
&gt; +    // The item is front-facing or backface-visibility is on.
&gt; +    setVisible(true);
&gt; +
&gt; +    // Flatten to 2D-space of this item if it doesn&apos;t preserve 3D.
&gt; +    if (!m_state.preserves3D) {
&gt; +        m_transformRelativeToRootLayer.setM13(0);
&gt; +        m_transformRelativeToRootLayer.setM23(0);
&gt; +        m_transformRelativeToRootLayer.setM31(0);
&gt; +        m_transformRelativeToRootLayer.setM32(0);
&gt; +        m_transformRelativeToRootLayer.setM33(1);
&gt; +        m_transformRelativeToRootLayer.setM34(0);
&gt; +        m_transformRelativeToRootLayer.setM43(0);
&gt; +    }
&gt; +
&gt; +    // Apply perspective for the use of this item&apos;s children. Perspective is always applied from the item&apos;s center.
&gt; +    if (!m_state.childrenTransform.isIdentity())
&gt; +        m_transformRelativeToRootLayer
&gt; +            .translate(m_size.width() / 2, m_size.height() /2)
&gt; +            .multLeft(m_state.childrenTransform)
&gt; +            .translate(-m_size.width() / 2, -m_size.height() /2);
&gt; +
&gt; +    bool inverseOk = true;
&gt; +    // Use QTransform::inverse to extrapolate the relative transform of this item, based on the parent&apos;s transform relative to
&gt; +    // the root layer and the desired transform for this item relative to the root layer.
&gt; +    const QTransform parentTransform = parent ? parent-&gt;itemTransform(rootLayer()) : QTransform();
&gt; +    const QTransform transform2D = QTransform(m_transformRelativeToRootLayer) * parentTransform.inverted(&amp;inverseOk);
&gt; +
&gt; +    // In rare cases the transformation cannot be inversed - in that case we don&apos;t apply the transformation at all, otherwise we&apos;d flicker.
&gt; +    // FIXME: This should be amended when Qt moves to a real 3D scene-graph.
&gt; +    if (!inverseOk)
&gt; +        return;
&gt; +
&gt; +    setTransform(transform2D);
&gt; +
&gt; +    const QList&lt;QGraphicsItem*&gt; children = childItems();
&gt; +    for (QList&lt;QGraphicsItem*&gt;::const_iterator it = children.begin(); it != children.end(); ++it)
&gt; +        if (GraphicsLayerQtImpl* layer= qobject_cast&lt;GraphicsLayerQtImpl*&gt;((*it)-&gt;toGraphicsObject()))
&gt; +            layer-&gt;updateTransform();
&gt;  }
&gt;  
&gt; -bool GraphicsLayerQtImpl::isTransformAnimationRunning() const
&gt; +void GraphicsLayerQtImpl::setBaseTransform(const TransformationMatrix&amp; baseTransform)
&gt;  {
&gt; -    if (m_transformAnimationRunning)
&gt; -        return true;
&gt; -    if (GraphicsLayerQtImpl* parent = qobject_cast&lt;GraphicsLayerQtImpl*&gt;(parentObject()))
&gt; -        return parent-&gt;isTransformAnimationRunning();
&gt; -    return false;
&gt; +    m_baseTransform = baseTransform;
&gt; +    updateTransform();
&gt;  }
&gt;  
&gt;  QPainterPath GraphicsLayerQtImpl::opaqueArea() const
&gt;  {
&gt;      QPainterPath painterPath;
&gt; +
&gt;      // we try out best to return the opaque area, maybe it will help graphics-view render less items
&gt;      if (m_currentContent.backgroundColor.isValid() &amp;&amp; m_currentContent.backgroundColor.alpha() == 0xff)
&gt;          painterPath.addRect(boundingRect());
&gt; @@ -411,10 +444,9 @@ void GraphicsLayerQtImpl::paint(QPainter* painter, const QStyleOptionGraphicsIte
&gt;      case HTMLContentType:
&gt;          if (m_state.drawsContent) {
&gt;              QPixmap backingStore;
&gt; -            // We might need to recache, in case we try to paint and the cache
&gt; -            // was purged (e.g. if it was full).
&gt; +            // We might need to recache, in case we try to paint and the cache was purged (e.g. if it was full).
&gt;              if (!QPixmapCache::find(m_backingStoreKey, &amp;backingStore) || backingStore.size() != m_size.toSize())
&gt; -                backingStore = recache(QRegion(boundingRect().toAlignedRect()));
&gt; +                backingStore = recache(QRegion(m_state.contentsRect));
&gt;              painter-&gt;drawPixmap(0, 0, backingStore);
&gt;          }
&gt;          break;
&gt; @@ -500,9 +532,6 @@ void GraphicsLayerQtImpl::flushChanges(bool recursive, bool forceUpdateTransform
&gt;          }
&gt;      }
&gt;  
&gt; -    if ((m_changeMask &amp; PositionChange) &amp;&amp; (m_layer-&gt;position() != m_state.pos))
&gt; -        setPos(m_layer-&gt;position().x(), m_layer-&gt;position().y());
&gt; -
&gt;      if (m_changeMask &amp; SizeChange) {
&gt;          if (m_layer-&gt;size() != m_state.size) {
&gt;              prepareGeometryChange();
&gt; @@ -515,7 +544,7 @@ void GraphicsLayerQtImpl::flushChanges(bool recursive, bool forceUpdateTransform
&gt;          if (scene())
&gt;              scene()-&gt;update();
&gt;  
&gt; -    if (m_changeMask &amp; (ChildrenTransformChange | Preserves3DChange | TransformChange | AnchorPointChange | SizeChange)) {
&gt; +    if (m_changeMask &amp; (ChildrenTransformChange | Preserves3DChange | TransformChange | AnchorPointChange | SizeChange | BackfaceVisibilityChange | PositionChange)) {
&gt;          // due to the differences between the way WebCore handles transforms and the way Qt handles transforms,
&gt;          // all these elements affect the transforms of all the descendants.
&gt;          forceUpdateTransform = true;
&gt; @@ -587,9 +616,6 @@ void GraphicsLayerQtImpl::flushChanges(bool recursive, bool forceUpdateTransform
&gt;      if ((m_changeMask &amp; BackgroundColorChange) &amp;&amp; (m_pendingContent.backgroundColor != m_currentContent.backgroundColor))
&gt;          update();
&gt;  
&gt; -    // FIXME: the following flags are currently not handled, as they don&apos;t have a clear test or are in low priority
&gt; -    // GeometryOrientationChange, ContentsOrientationChange, BackfaceVisibilityChange, ChildrenTransformChange, Preserves3DChange
&gt; -
&gt;      m_state.maskLayer = m_layer-&gt;maskLayer();
&gt;      m_state.pos = m_layer-&gt;position();
&gt;      m_state.anchorPoint = m_layer-&gt;anchorPoint();
WebCore/ChangeLog:9
 +          the relative QTransform. When the extrapolation fails (un-invertible matrix) we ignore the transformation change.
Is this the same behaviour as other platforms? (mac)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218344</commentid>
    <comment_count>11</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-04-28 05:45:29 -0700</bug_when>
    <thetext>Oh sorry, new review system :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218374</commentid>
    <comment_count>12</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2010-04-28 06:50:38 -0700</bug_when>
    <thetext>*** Bug 38074 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218386</commentid>
    <comment_count>13</comment_count>
      <attachid>54488</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-04-28 07:23:30 -0700</bug_when>
    <thetext>Comment on attachment 54488
uploading correct patch

Clearing flags on attachment: 54488

Committed r58408: &lt;http://trac.webkit.org/changeset/58408&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218387</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-04-28 07:23:36 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218398</commentid>
    <comment_count>15</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-28 07:54:50 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/58408 might have broken SnowLeopard Intel Release (Tests)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218870</commentid>
    <comment_count>16</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-04-29 00:17:55 -0700</bug_when>
    <thetext>Revision r58408 cherry-picked into qtwebkit-2.0 with commit d310f9fc02e82ab25aa251c480ac5b000ef6368b</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>49338</attachid>
            <date>2010-02-23 16:14:42 -0800</date>
            <delta_ts>2010-04-27 17:50:30 -0700</delta_ts>
            <desc>WIP: preserves-3d and backface-visibility</desc>
            <filename>patch-35312-1.diff</filename>
            <type>text/plain</type>
            <size>18447</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5ZXJR
dC5jcHAJKHJldmlzaW9uIDU1MTc0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9H
cmFwaGljc0xheWVyUXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMzYsMTkgKzEzNiwxMiBAQCBw
dWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIHBhaW50KFFQYWludGVyKiwgY29uc3QgUVN0eWxlT3B0
aW9uR3JhcGhpY3NJdGVtKiwgUVdpZGdldCopOwogCiAgICAgLy8gd2UgbWFuYWdlIHRyYW5zZm9y
bXMgb3Vyc2VsdmVzIGJlY2F1c2UgdHJhbnNmb3JtLW9yaWdpbiBhY3RzIGRpZmZlcmVudGx5IGlu
IHdlYmtpdCBhbmQgaW4gUXQKLSAgICB2b2lkIHNldEJhc2VUcmFuc2Zvcm0oY29uc3QgVHJhbnNm
b3JtYXRpb25NYXRyaXgmKTsKICAgICBRVHJhbnNmb3JtIGNvbXB1dGVUcmFuc2Zvcm0oY29uc3Qg
VHJhbnNmb3JtYXRpb25NYXRyaXgmIGJhc2VUcmFuc2Zvcm0pIGNvbnN0OwotICAgIHZvaWQgdXBk
YXRlVHJhbnNmb3JtKCk7CisgICAgdm9pZCB1cGRhdGVUcmFuc2Zvcm0oYm9vbCByZWN1cnNpdmUp
OwogCiAgICAgLy8gbGV0IHRoZSBjb21wb3NpdG9yLUFQSSB0ZWxsIHVzIHdoaWNoIHByb3BlcnRp
ZXMgd2VyZSBjaGFuZ2VkCiAgICAgdm9pZCBub3RpZnlDaGFuZ2UoQ2hhbmdlTWFzayk7CiAKLSAg
ICAvLyBjYWxsZWQgd2hlbiB0aGUgY29tcG9zaXRvciBpcyByZWFkeSBmb3IgdXMgdG8gc2hvdyB0
aGUgY2hhbmdlcyBvbiBzY3JlZW4KLSAgICAvLyB0aGlzIGlzIGNhbGxlZCBpbmRpcmVjdGx5IGZy
b20gQ2hyb21lQ2xpZW50UXQ6OnNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24K
LSAgICAvLyAobWVhbmluZyB0aGUgc3luYyB3b3VsZCBoYXBwZW4gdG9nZXRoZXIgd2l0aCB0aGUg
bmV4dCBkcmF3KQotICAgIC8vIG9yIENocm9tZUNsaWVudFF0OjpzY2hlZHVsZUNvbXBvc2l0aW5n
TGF5ZXJTeW5jIChtZWFuaW5nIHRoZSBzeW5jIHdpbGwgaGFwcGVuIEFTQVApCi0gICAgdm9pZCBm
bHVzaENoYW5nZXMoYm9vbCByZWN1cnNpdmUgPSB0cnVlLCBib29sIGZvcmNlVHJhbnNmb3JtVXBk
YXRlID0gZmFsc2UpOwotCiAgICAgLy8gb3B0aW1pemF0aW9uOiB3aGVuIHdlIGhhdmUgYW4gYW5p
bWF0aW9uIHJ1bm5pbmcgb24gYW4gZWxlbWVudCB3aXRoIG5vIGNvbnRlbnRzLCB0aGF0IGhhcyBj
aGlsZC1lbGVtZW50cyB3aXRoIGNvbnRlbnRzLAogICAgIC8vIEFMTCBvZiB0aGVtIGhhdmUgdG8g
aGF2ZSBJdGVtQ29vcmRpbmF0ZUNhY2hlIGFuZCBub3QgRGV2aWNlQ29vcmRpbmF0ZUNhY2hlCiAg
ICAgdm9pZCBhZGp1c3RDYWNoaW5nUmVjdXJzaXZlbHkoYm9vbCBhbmltYXRpb25Jc1J1bm5pbmcp
OwpAQCAtMTY4LDcgKzE2MSw2IEBAIHNpZ25hbHM6CiBwdWJsaWM6CiAgICAgR3JhcGhpY3NMYXll
clF0KiBtX2xheWVyOwogCi0gICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbV9iYXNlVHJhbnNmb3Jt
OwogICAgIGJvb2wgbV90cmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nOwogICAgIGJvb2wgbV9vcGFj
aXR5QW5pbWF0aW9uUnVubmluZzsKICAgICBRV2Vha1BvaW50ZXI8TWFza0VmZmVjdFF0PiBtX21h
c2tFZmZlY3Q7CkBAIC0yMDAsMTMgKzE5MiwzMCBAQCBwdWJsaWM6CiAgICAgUUxpc3Q8UVdlYWtQ
b2ludGVyPFFBYnN0cmFjdEFuaW1hdGlvbj4gPiBtX2FuaW1hdGlvbnM7CiAgICAgUVRpbWVyIG1f
c3VzcGVuZFRpbWVyOwogCisgICAgc3RydWN0IEZsdXNoT3B0aW9ucyB7CisgICAgICAgIGJvb2wg
cmVjdXJzaXZlOworICAgICAgICBib29sIGZvcmNlVXBkYXRlVHJhbnNmb3JtOworICAgICAgICBi
b29sIGZvcmNlVXBkYXRlUGVyc3BlY3RpdmU7CisgICAgICAgIEdyYXBoaWNzTGF5ZXJRdEltcGwq
IGFuY2VzdG9yV2l0aFBlcnNwZWN0aXZlOworICAgICAgICBGbHVzaE9wdGlvbnMoYm9vbCBuZXdS
ZWN1cnNpdmUgPSB0cnVlKQorICAgICAgICAgICAgICAgIDogcmVjdXJzaXZlKG5ld1JlY3Vyc2l2
ZSkKKyAgICAgICAgICAgICAgICAsIGZvcmNlVXBkYXRlVHJhbnNmb3JtKGZhbHNlKQorICAgICAg
ICAgICAgICAgICwgZm9yY2VVcGRhdGVQZXJzcGVjdGl2ZShmYWxzZSkKKyAgICAgICAgICAgICAg
ICAsIGFuY2VzdG9yV2l0aFBlcnNwZWN0aXZlKDApCisgICAgICAgIHsKKyAgICAgICAgfQorICAg
IH07CisKICAgICBzdHJ1Y3QgU3RhdGUgewogICAgICAgICBHcmFwaGljc0xheWVyKiBtYXNrTGF5
ZXI7CiAgICAgICAgIEZsb2F0UG9pbnQgcG9zOwogICAgICAgICBGbG9hdFBvaW50M0QgYW5jaG9y
UG9pbnQ7CiAgICAgICAgIEZsb2F0U2l6ZSBzaXplOwotICAgICAgICBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCB0cmFuc2Zvcm07CisgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGJhc2VUcmFuc2Zv
cm07CiAgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGNoaWxkcmVuVHJhbnNmb3JtOworICAg
ICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBwZXJzcGVjdGl2ZVRyYW5zZm9ybTsKKyAgICAgICAg
VHJhbnNmb3JtYXRpb25NYXRyaXggcHJlc2VydmUzRFRyYW5zZm9ybTsKKyAgICAgICAgVHJhbnNm
b3JtYXRpb25NYXRyaXggYW5pbWF0ZWRUcmFuc2Zvcm07CiAgICAgICAgIENvbG9yIGJhY2tncm91
bmRDb2xvcjsKICAgICAgICAgQ29sb3IgY3VycmVudENvbG9yOwogICAgICAgICBHcmFwaGljc0xh
eWVyOjpDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gZ2VvT3JpZW50YXRpb247CkBA
IC0yMTQsNiArMjIzLDcgQEAgcHVibGljOgogICAgICAgICBmbG9hdCBvcGFjaXR5OwogICAgICAg
ICBRUmVjdCBjb250ZW50c1JlY3Q7CiAKKwogICAgICAgICBib29sIHByZXNlcnZlczNEOiAxOwog
ICAgICAgICBib29sIG1hc2tzVG9Cb3VuZHM6IDE7CiAgICAgICAgIGJvb2wgZHJhd3NDb250ZW50
OiAxOwpAQCAtMjI4LDYgKzIzOCwxMyBAQCBwdWJsaWM6CiAgICAgICAgIH0KICAgICB9IG1fc3Rh
dGU7CiAKKworICAgIC8vIGNhbGxlZCB3aGVuIHRoZSBjb21wb3NpdG9yIGlzIHJlYWR5IGZvciB1
cyB0byBzaG93IHRoZSBjaGFuZ2VzIG9uIHNjcmVlbgorICAgIC8vIHRoaXMgaXMgY2FsbGVkIGlu
ZGlyZWN0bHkgZnJvbSBDaHJvbWVDbGllbnRRdDo6c2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5bmNo
cm9uaXphdGlvbgorICAgIC8vIChtZWFuaW5nIHRoZSBzeW5jIHdvdWxkIGhhcHBlbiB0b2dldGhl
ciB3aXRoIHRoZSBuZXh0IGRyYXcpCisgICAgLy8gb3IgQ2hyb21lQ2xpZW50UXQ6OnNjaGVkdWxl
Q29tcG9zaXRpbmdMYXllclN5bmMgKG1lYW5pbmcgdGhlIHN5bmMgd2lsbCBoYXBwZW4gQVNBUCkK
KyAgICB2b2lkIGZsdXNoQ2hhbmdlcyhGbHVzaE9wdGlvbnMgb3B0aW9ucyA9IEZsdXNoT3B0aW9u
cygpKTsKKwogICAgIGZyaWVuZCBjbGFzcyBBbmltYXRpb25RdEJhc2U7CiB9OwogCkBAIC0yNDUs
NiArMjYyLDcgQEAgR3JhcGhpY3NMYXllclF0SW1wbDo6R3JhcGhpY3NMYXllclF0SW1wbAogICAg
IC8vIHRoZXkgYXJlIGlnbm9yZWQgYW5kIHBhc3NlZCB0byB0aGUgaXRlbSBiZWxvdy4KICAgICBz
ZXRFbmFibGVkKHRydWUpOwogCisKICAgICAvLyB3ZSdsbCBzZXQgdGhlIGNhY2hlIHdoZW4gd2Ug
a25vdyB3aGF0J3MgZ29pbmcgb24KICAgICBzZXRDYWNoZU1vZGUoTm9DYWNoZSk7CiAKQEAgLTI4
Niw1NCArMzA0LDgxIEBAIHZvaWQgR3JhcGhpY3NMYXllclF0SW1wbDo6YWRqdXN0Q2FjaGluZ1IK
ICAgICB9ICAgIAogfQogCi12b2lkIEdyYXBoaWNzTGF5ZXJRdEltcGw6OnVwZGF0ZVRyYW5zZm9y
bSgpCit2b2lkIEdyYXBoaWNzTGF5ZXJRdEltcGw6OnVwZGF0ZVRyYW5zZm9ybShib29sIHJlY3Vy
c2l2ZSkKIHsKLSAgICBzZXRCYXNlVHJhbnNmb3JtKGlzVHJhbnNmb3JtQW5pbWF0aW9uUnVubmlu
ZygpID8gbV9iYXNlVHJhbnNmb3JtIDogbV9sYXllci0+dHJhbnNmb3JtKCkpOwotfQorICAgIC8v
IGZpcnN0IHdlIGJha2UgdHJhbnNmb3JtT3JpZ2luICYgdHJhbnNmb3JtIGludG8gbV9iYXNlVHJh
bnNmb3JtCisgICAgLy8gdHJhbnNmb3JtT3JpZ2luIGZyb20gV2ViQ29yZSBpcyByZWxhdGl2ZSwg
d2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIGFic29sdXRlIHBpeGVscyBiYXNlZCBvbiBzaXplCisg
ICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3JtID0gbV90cmFuc2Zvcm1BbmltYXRpb25S
dW5uaW5nID8gbV9zdGF0ZS5hbmltYXRlZFRyYW5zZm9ybSA6IG1fbGF5ZXItPnRyYW5zZm9ybSgp
OworICAgIGNvbnN0IHFyZWFsIG9yaWdpblggPSBtX2xheWVyLT5hbmNob3JQb2ludCgpLngoKSAq
IG1fbGF5ZXItPnNpemUoKS53aWR0aCgpOworICAgIGNvbnN0IHFyZWFsIG9yaWdpblkgPSBtX2xh
eWVyLT5hbmNob3JQb2ludCgpLnkoKSAqIG1fbGF5ZXItPnNpemUoKS5oZWlnaHQoKTsKKyAgICBt
X3N0YXRlLmJhc2VUcmFuc2Zvcm0KKyAgICAgICAgLm1ha2VJZGVudGl0eSgpCisgICAgICAgIC50
cmFuc2xhdGUzZChvcmlnaW5YLCBvcmlnaW5ZLCBtX2xheWVyLT5hbmNob3JQb2ludCgpLnooKSkK
KyAgICAgICAgLm11bHRMZWZ0KHRyYW5zZm9ybSkKKyAgICAgICAgLnRyYW5zbGF0ZTNkKC1vcmln
aW5YLCAtb3JpZ2luWSwgLW1fbGF5ZXItPmFuY2hvclBvaW50KCkueigpKTsKKworICAgIC8vIHdl
IG5vdyBhcHBseSBwZXJzcGVjdGl2ZSBhbmQgYWNjb3VudCBmb3IgM0QgaWYgdGhlIHBhcmVudCBw
cmVzZXJ2ZXMgaXQKKyAgICB0cmFuc2Zvcm0gPSBtX3N0YXRlLnBlcnNwZWN0aXZlVHJhbnNmb3Jt
OworICAgIEdyYXBoaWNzTGF5ZXJRdEltcGwqIHBhcmVudCA9IHFvYmplY3RfY2FzdDxHcmFwaGlj
c0xheWVyUXRJbXBsKj4ocGFyZW50T2JqZWN0KCkpOworICAgIGlmIChwYXJlbnQgJiYgcGFyZW50
LT5tX2xheWVyLT5wcmVzZXJ2ZXMzRCgpKSB7CisgICAgICAgIC8vIHdlIGludmVydCB0aGUgUXQt
bWFuYWdlZCB0cmFuc2Zvcm1zLCB0byByZS1hcHBseSBhcyAzRCB0cmFuc2Zvcm1zCisgICAgICAg
IC8vIG9wdGltYWxseSB0aGlzIHdvdWxkIGJlIGRvbmUgd2l0aCBJdGVtSWdub3Jlc1RyYW5zZm9y
bWF0aW9ucywgYnV0IHRoYXQgZmxhZyBkb2Vzbid0IHdvcmsgd2VsbAorICAgICAgICBRVHJhbnNm
b3JtIGNvbXBlbnNhdGlvbjsKKyAgICAgICAgZm9yIChHcmFwaGljc0xheWVyUXRJbXBsKiBhbmNl
c3RvciA9IHBhcmVudDsgYW5jZXN0b3I7IGFuY2VzdG9yID0gcW9iamVjdF9jYXN0PEdyYXBoaWNz
TGF5ZXJRdEltcGwqPihhbmNlc3Rvci0+cGFyZW50T2JqZWN0KCkpKSB7CisgICAgICAgICAgICBi
b29sIGludmVydE9rID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbXBlbnNhdGlvbiA9IGFuY2VzdG9y
LT50cmFuc2Zvcm0oKS5pbnZlcnRlZCgmaW52ZXJ0T2spICogY29tcGVuc2F0aW9uOworICAgICAg
ICAgICAgaWYgKCFpbnZlcnRPaykKKyAgICAgICAgICAgICAgICBxRGVidWcoKSA8PCAiRmFpbGVk
IGludmVydDogIiA8PCBhbmNlc3Rvci0+dHJhbnNmb3JtKCk7CisgICAgICAgIH0KKyAgICAgICAg
dHJhbnNmb3JtCisgICAgICAgICAgICAgICAgLm11bHRMZWZ0KHBhcmVudC0+bV9zdGF0ZS5wcmVz
ZXJ2ZTNEVHJhbnNmb3JtKQorICAgICAgICAgICAgICAgIC5tdWx0TGVmdChtX3N0YXRlLmJhc2VU
cmFuc2Zvcm0pOwogCi12b2lkIEdyYXBoaWNzTGF5ZXJRdEltcGw6OnNldEJhc2VUcmFuc2Zvcm0o
Y29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIGJhc2VUcmFuc2Zvcm0pCi17Ci0gICAgbV9iYXNl
VHJhbnNmb3JtID0gYmFzZVRyYW5zZm9ybTsKLSAgICBzZXRUcmFuc2Zvcm0oY29tcHV0ZVRyYW5z
Zm9ybShiYXNlVHJhbnNmb3JtKSk7Ci19CisgICAgICAgIHNldFRyYW5zZm9ybShjb21wZW5zYXRp
b24pOworICAgICAgICBzZXRUcmFuc2Zvcm0odHJhbnNmb3JtLCB0cnVlKTsKKyAgICB9IGVsc2Ug
eworICAgICAgICB0cmFuc2Zvcm0ubXVsdExlZnQobV9zdGF0ZS5iYXNlVHJhbnNmb3JtKTsKKyAg
ICAgICAgc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7CisgICAgfQogCi1RVHJhbnNmb3JtIEdyYXBo
aWNzTGF5ZXJRdEltcGw6OmNvbXB1dGVUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRy
aXgmIGJhc2VUcmFuc2Zvcm0pIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2xheWVyKQotICAgICAgICBy
ZXR1cm4gYmFzZVRyYW5zZm9ybTsKKyAgICAvLyB3ZSBjaGVjayBpZiB0aGUgaXRlbSBmYWNlcyBi
YWNrd2FyZHMKKyAgICBzZXRWaXNpYmxlKG1fbGF5ZXItPmJhY2tmYWNlVmlzaWJpbGl0eSgpIHx8
IHRyYW5zZm9ybS5pbnZlcnNlKCkubTMzKCkgPj0gMCk7CiAKLSAgICBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCBjb21wdXRlZFRyYW5zZm9ybTsKIAotICAgIC8vIFRoZSBvcmlnaW4gZm9yIGNoaWxkcmVu
VHJhbnNmb3JtIGlzIGFsd2F5cyB0aGUgY2VudGVyIG9mIHRoZSBhbmNlc3RvciB3aGljaCBjb250
YWlucyB0aGUgY2hpbGRyZW5UcmFuc2Zvcm0uCi0gICAgLy8gdGhpcyBoYXMgdG8gZG8gd2l0aCBo
b3cgV2ViQ29yZSBpbXBsZW1lbnRzIC13ZWJraXQtcGVyc3BlY3RpdmUgYW5kIC13ZWJraXQtcGVy
c3BlY3RpdmUtb3JpZ2luLCB3aGljaCBhcmUgdGhlIENTUwotICAgIC8vIGF0dHJpYnV0ZSB0aGF0
IGNhbGwgc2V0Q2hpbGRyZW5UcmFuc2Zvcm0KLSAgICBRUG9pbnRGIG9mZnNldCA9IC1wb3MoKSAt
IGJvdW5kaW5nUmVjdCgpLmJvdHRvbVJpZ2h0KCkgLyAyOwotICAgIGNvbnN0IEdyYXBoaWNzTGF5
ZXJRdEltcGwqIGFuY2VzdG9yID0gdGhpczsKLSAgICB3aGlsZSAoKGFuY2VzdG9yID0gcW9iamVj
dF9jYXN0PEdyYXBoaWNzTGF5ZXJRdEltcGwqPihhbmNlc3Rvci0+cGFyZW50T2JqZWN0KCkpKSkg
ewotICAgICAgICBpZiAoIWFuY2VzdG9yLT5tX3N0YXRlLmNoaWxkcmVuVHJhbnNmb3JtLmlzSWRl
bnRpdHkoKSkgewotICAgICAgICAgICAgb2Zmc2V0ICs9IGFuY2VzdG9yLT5ib3VuZGluZ1JlY3Qo
KS5ib3R0b21SaWdodCgpIC8gMjsKLSAgICAgICAgICAgIGNvbXB1dGVkVHJhbnNmb3JtCi0gICAg
ICAgICAgICAgICAgLnRyYW5zbGF0ZShvZmZzZXQueCgpLCBvZmZzZXQueSgpKQotICAgICAgICAg
ICAgICAgIC5tdWx0TGVmdChhbmNlc3Rvci0+bV9zdGF0ZS5jaGlsZHJlblRyYW5zZm9ybSkKLSAg
ICAgICAgICAgICAgICAudHJhbnNsYXRlKC1vZmZzZXQueCgpLCAtb2Zmc2V0LnkoKSk7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgLT0gYW5jZXN0b3ItPnBv
cygpOworICAgIC8vIHdlIGNvbXB1dGUgdGhlIHZhbHVlIHVzZWQgZm9yIHRoaXMgaXRlbSdzIGRl
c2NlbmRhbnRzJyAzRCBjYWxjdWxhdGlvbnMKKyAgICBtX3N0YXRlLnByZXNlcnZlM0RUcmFuc2Zv
cm0gPSBtX3N0YXRlLmJhc2VUcmFuc2Zvcm07CisgICAgaWYgKCFtX2xheWVyLT5wcmVzZXJ2ZXMz
RCgpKSB7CisgICAgICAgIC8vIGZsYXR0ZW4KKyAgICAgICAgbV9zdGF0ZS5wcmVzZXJ2ZTNEVHJh
bnNmb3JtLnNldE0xMygwKTsKKyAgICAgICAgbV9zdGF0ZS5wcmVzZXJ2ZTNEVHJhbnNmb3JtLnNl
dE0yMygwKTsKKyAgICAgICAgbV9zdGF0ZS5wcmVzZXJ2ZTNEVHJhbnNmb3JtLnNldE0zMSgwKTsK
KyAgICAgICAgbV9zdGF0ZS5wcmVzZXJ2ZTNEVHJhbnNmb3JtLnNldE0zMigwKTsKKyAgICAgICAg
bV9zdGF0ZS5wcmVzZXJ2ZTNEVHJhbnNmb3JtLnNldE0zMygxKTsKKyAgICAgICAgbV9zdGF0ZS5w
cmVzZXJ2ZTNEVHJhbnNmb3JtLnNldE0zNCgwKTsKKyAgICAgICAgbV9zdGF0ZS5wcmVzZXJ2ZTNE
VHJhbnNmb3JtLnNldE00MygwKTsKICAgICB9CiAKLSAgICBjb21wdXRlZFRyYW5zZm9ybS5tdWx0
TGVmdChiYXNlVHJhbnNmb3JtKTsKKyAgICBtX3N0YXRlLnByZXNlcnZlM0RUcmFuc2Zvcm0gPSBw
YXJlbnQgPyBtX3N0YXRlLnByZXNlcnZlM0RUcmFuc2Zvcm0gKiBwYXJlbnQtPm1fc3RhdGUucHJl
c2VydmUzRFRyYW5zZm9ybSA6IG1fc3RhdGUucHJlc2VydmUzRFRyYW5zZm9ybTsKIAotICAgIC8v
IHdlYmtpdCBoYXMgcmVsYXRpdmUtdG8tc2l6ZSBvcmlnaW5Qb2ludCwgZ3JhcGhpY3MtdmlldyBo
YXMgYSBwaXhlbCBvcmlnaW5Qb2ludCwgaGVyZSB3ZSBjb252ZXJ0Ci0gICAgLy8gd2UgaGF2ZSB0
byBtYW5hZ2UgdGhpcyBvdXJzZWx2ZXMgYmVjYXVzZSBRR3JhcGhpY3NWaWV3J3MgdHJhbnNmb3Jt
T3JpZ2luIGlzIGluY29tcGF0aWJsZQotICAgIGNvbnN0IHFyZWFsIG9yaWdpblggPSBtX3N0YXRl
LmFuY2hvclBvaW50LngoKSAqIG1fc2l6ZS53aWR0aCgpOwotICAgIGNvbnN0IHFyZWFsIG9yaWdp
blkgPSBtX3N0YXRlLmFuY2hvclBvaW50LnkoKSAqIG1fc2l6ZS5oZWlnaHQoKTsKLSAgICBjb21w
dXRlZFRyYW5zZm9ybSA9IFRyYW5zZm9ybWF0aW9uTWF0cml4KCkKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAudHJhbnNsYXRlKG9yaWdpblgsIG9yaWdpblkpCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLm11bHRpcGx5KGNvbXB1dGVkVHJhbnNmb3JtKQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC50cmFuc2xhdGUoLW9yaWdpblgsIC1vcmlnaW5ZKTsKKyAgICAvLyB0aGlz
IGZ1bmN0aW9uIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGFub3RoZXIgZnVuY3Rpb24gdGhhdCBhbHJl
YWR5IHJlY3Vyc2VzLiB3ZSBkb24ndCB3YW50IHRvIG92ZXJkbyB0aGUgdHJhbnNmb3JtIGNvbXB1
dGF0aW9ucworICAgIGlmICghcmVjdXJzaXZlKQorICAgICAgICByZXR1cm47CisKKyAgICBRTGlz
dDxRR3JhcGhpY3NJdGVtKj4gY2hpbGRyZW4gPSBjaGlsZEl0ZW1zKCk7CisgICAgZm9yIChRTGlz
dDxRR3JhcGhpY3NJdGVtKj46Oml0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uYmVnaW4oKTsgaXQgIT0g
Y2hpbGRyZW4uZW5kKCk7ICsraXQpCisgICAgICAgIGlmIChHcmFwaGljc0xheWVyUXRJbXBsKiBp
dGVtID0gcW9iamVjdF9jYXN0PEdyYXBoaWNzTGF5ZXJRdEltcGwqPigoKml0KS0+dG9HcmFwaGlj
c09iamVjdCgpKSkKKyAgICAgICAgICAgIGl0ZW0tPnVwZGF0ZVRyYW5zZm9ybSh0cnVlKTsKIAot
ICAgIC8vIG5vdyB3ZSBwcm9qZWN0IHRvIDJECi0gICAgcmV0dXJuIFFUcmFuc2Zvcm0oY29tcHV0
ZWRUcmFuc2Zvcm0pOworfQorCitzdGF0aWMgVHJhbnNmb3JtYXRpb25NYXRyaXggZnJvbVFUcmFu
c2Zvcm0oY29uc3QgUVRyYW5zZm9ybSYgdHJhbnNmb3JtKQoreworICAgIHJldHVybiBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCgKKyAgICAgICAgICAgIHRyYW5zZm9ybS5tMTEoKSwgdHJhbnNmb3JtLm0x
MigpLCAwLCB0cmFuc2Zvcm0ubTEzKCksCisgICAgICAgICAgICB0cmFuc2Zvcm0ubTIxKCksIHRy
YW5zZm9ybS5tMjIoKSwgMCwgdHJhbnNmb3JtLm0yMygpLAorICAgICAgICAgICAgMCwgMCwgMSwg
MCwKKyAgICAgICAgICAgIHRyYW5zZm9ybS5tMzEoKSwgdHJhbnNmb3JtLm0zMigpLCAwLCB0cmFu
c2Zvcm0ubTMzKCkKKyAgICAgICAgICAgICk7CiB9CiAKIGJvb2wgR3JhcGhpY3NMYXllclF0SW1w
bDo6aXNUcmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nKCkgY29uc3QKQEAgLTQwMyw3ICs0NDgsNyBA
QCB2b2lkIEdyYXBoaWNzTGF5ZXJRdEltcGw6Om5vdGlmeUNoYW5nZShDCiAgICAgICAgIG1fbGF5
ZXItPmNsaWVudCgpLT5ub3RpZnlTeW5jUmVxdWlyZWQobV9sYXllcik7CiB9CiAKLXZvaWQgR3Jh
cGhpY3NMYXllclF0SW1wbDo6Zmx1c2hDaGFuZ2VzKGJvb2wgcmVjdXJzaXZlLCBib29sIGZvcmNl
VXBkYXRlVHJhbnNmb3JtKQordm9pZCBHcmFwaGljc0xheWVyUXRJbXBsOjpmbHVzaENoYW5nZXMo
Rmx1c2hPcHRpb25zIG9wdGlvbnMpCiB7CiAgICAgLy8gdGhpcyBpcyB0aGUgYnVsayBvZiB0aGUg
d29yay4gdW5kZXJzdGFuZGluZyB3aGF0IHRoZSBjb21wb3NpdG9yIGlzIHRyeWluZyB0byBhY2hp
ZXZlLAogICAgIC8vIHdoYXQgZ3JhcGhpY3MtdmlldyBjYW4gZG8sIGFuZCB0cnlpbmcgdG8gZmlu
ZCBhIHNhbmUgY29tbW9uLWdyb3VuZHMKQEAgLTQ3MCwxNSArNTE1LDQxIEBAIHZvaWQgR3JhcGhp
Y3NMYXllclF0SW1wbDo6Zmx1c2hDaGFuZ2VzKGIKICAgICAgICAgICAgIG1fc2l6ZSA9IFFTaXpl
RihtX2xheWVyLT5zaXplKCkud2lkdGgoKSwgbV9sYXllci0+c2l6ZSgpLmhlaWdodCgpKTsKICAg
ICAgICAgfQogICAgIH0KLSAgICAvLyBGSVhNRTogdGhpcyBpcyBhIGhhY2ssIGR1ZSB0byBhIHBy
b2JhYmxlIFFHcmFwaGljc1NjZW5lIGJ1ZyB3aGVuIHJhcGlkbHkgbW9kaWZ5aW5nIHRoZSBwZXJz
cGVjdGl2ZQotICAgIC8vIGJ1dCB3aXRob3V0IHRoaXMgbGluZSB3ZSBnZXQgZ3JhcGhpYyBhcnRp
ZmFjdHMKLSAgICBpZiAoKG1fY2hhbmdlTWFzayAmIENoaWxkcmVuVHJhbnNmb3JtQ2hhbmdlKSAm
JiBtX3N0YXRlLmNoaWxkcmVuVHJhbnNmb3JtICE9IG1fbGF5ZXItPmNoaWxkcmVuVHJhbnNmb3Jt
KCkpCisgICAgaWYgKG9wdGlvbnMuYW5jZXN0b3JXaXRoUGVyc3BlY3RpdmUpIHsKKyAgICAgICAg
Ly8gVGhlIG9yaWdpbiBmb3IgY2hpbGRyZW5UcmFuc2Zvcm0gaXMgYWx3YXlzIHRoZSBjZW50ZXIg
b2YgdGhlIGFuY2VzdG9yIHdoaWNoIGNvbnRhaW5zIHRoZSBjaGlsZHJlblRyYW5zZm9ybS4KKyAg
ICAgICAgLy8gdGhpcyBoYXMgdG8gZG8gd2l0aCBob3cgV2ViQ29yZSBpbXBsZW1lbnRzIC13ZWJr
aXQtcGVyc3BlY3RpdmUgYW5kIC13ZWJraXQtcGVyc3BlY3RpdmUtb3JpZ2luLCB3aGljaCBhcmUg
dGhlIENTUworICAgICAgICAvLyBhdHRyaWJ1dGUgdGhhdCBjYWxsIHNldENoaWxkcmVuVHJhbnNm
b3JtCisgICAgICAgIGNvbnN0IFFQb2ludEYgb2Zmc2V0ID0gb3B0aW9ucy5hbmNlc3RvcldpdGhQ
ZXJzcGVjdGl2ZS0+bWFwVG9JdGVtKHRoaXMsIG9wdGlvbnMuYW5jZXN0b3JXaXRoUGVyc3BlY3Rp
dmUtPm1fc2l6ZS53aWR0aCgpIC8gMiwgIG9wdGlvbnMuYW5jZXN0b3JXaXRoUGVyc3BlY3RpdmUt
Pm1fc2l6ZS5oZWlnaHQoKSAvIDIpOworICAgICAgICBtX3N0YXRlLnBlcnNwZWN0aXZlVHJhbnNm
b3JtCisgICAgICAgICAgICAubWFrZUlkZW50aXR5KCkKKyAgICAgICAgICAgIC50cmFuc2xhdGUo
b2Zmc2V0LngoKSwgb2Zmc2V0LnkoKSkKKyAgICAgICAgICAgIC5tdWx0TGVmdChvcHRpb25zLmFu
Y2VzdG9yV2l0aFBlcnNwZWN0aXZlLT5tX3N0YXRlLmNoaWxkcmVuVHJhbnNmb3JtKQorICAgICAg
ICAgICAgLnRyYW5zbGF0ZSgtb2Zmc2V0LngoKSwgLW9mZnNldC55KCkpOworICAgICAgICBvcHRp
b25zLmZvcmNlVXBkYXRlVHJhbnNmb3JtID0gdHJ1ZTsKKyAgICB9CisKKworICAgIGlmICgobV9j
aGFuZ2VNYXNrICYgQ2hpbGRyZW5UcmFuc2Zvcm1DaGFuZ2UpICYmIG1fc3RhdGUuY2hpbGRyZW5U
cmFuc2Zvcm0gIT0gbV9sYXllci0+Y2hpbGRyZW5UcmFuc2Zvcm0oKSkgeworICAgICAgICBvcHRp
b25zLmZvcmNlVXBkYXRlUGVyc3BlY3RpdmUgPSB0cnVlOworICAgICAgICBtX3N0YXRlLmNoaWxk
cmVuVHJhbnNmb3JtID0gbV9sYXllci0+Y2hpbGRyZW5UcmFuc2Zvcm0oKTsKKyAgICAgICAgb3B0
aW9ucy5hbmNlc3RvcldpdGhQZXJzcGVjdGl2ZSA9IDA7CisgICAgICAgIGZvciAoR3JhcGhpY3NM
YXllclF0SW1wbCogYW5jZXN0b3IgPSB0aGlzOworICAgICAgICAgICAgICBhbmNlc3RvciAmJiAh
b3B0aW9ucy5hbmNlc3RvcldpdGhQZXJzcGVjdGl2ZTsKKyAgICAgICAgICAgICAgYW5jZXN0b3Ig
PSBxb2JqZWN0X2Nhc3Q8R3JhcGhpY3NMYXllclF0SW1wbCo+KGFuY2VzdG9yLT5wYXJlbnRPYmpl
Y3QoKSkpIHsKKworICAgICAgICAgICAgaWYgKCFhbmNlc3Rvci0+bV9zdGF0ZS5jaGlsZHJlblRy
YW5zZm9ybS5pc0lkZW50aXR5KCkpCisgICAgICAgICAgICAgICAgb3B0aW9ucy5hbmNlc3Rvcldp
dGhQZXJzcGVjdGl2ZSA9IGFuY2VzdG9yOworICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FOiB0
aGlzIGlzIGEgaGFjaywgZHVlIHRvIGEgcHJvYmFibGUgUUdyYXBoaWNzU2NlbmUgYnVnIHdoZW4g
cmFwaWRseSBtb2RpZnlpbmcgdGhlIHBlcnNwZWN0aXZlCisgICAgICAgIC8vIGJ1dCB3aXRob3V0
IHRoaXMgbGluZSB3ZSBnZXQgZ3JhcGhpYyBhcnRpZmFjdHMKICAgICAgICAgc2NlbmUoKS0+dXBk
YXRlKCk7CisgICAgfQogCiAgICAgaWYgKG1fY2hhbmdlTWFzayAmIChDaGlsZHJlblRyYW5zZm9y
bUNoYW5nZSB8IFByZXNlcnZlczNEQ2hhbmdlIHwgVHJhbnNmb3JtQ2hhbmdlIHwgQW5jaG9yUG9p
bnRDaGFuZ2UgfCBTaXplQ2hhbmdlKSkgewogICAgICAgICAvLyBkdWUgdG8gdGhlIGRpZmZlcmVu
Y2VzIGJldHdlZW4gdGhlIHdheSBXZWJDb3JlIGhhbmRsZXMgdHJhbnNmb3JtcyBhbmQgdGhlIHdh
eSBRdCBoYW5kbGVzIHRyYW5zZm9ybXMsCiAgICAgICAgIC8vIGFsbCB0aGVzZSBlbGVtZW50cyBh
ZmZlY3QgdGhlIHRyYW5zZm9ybXMgb2YgYWxsIHRoZSBkZXNjZW5kYW50cy4KLSAgICAgICAgZm9y
Y2VVcGRhdGVUcmFuc2Zvcm0gPSB0cnVlOworICAgICAgICBtX3N0YXRlLnByZXNlcnZlczNEID0g
bV9sYXllci0+cHJlc2VydmVzM0QoKTsKKyAgICAgICAgb3B0aW9ucy5mb3JjZVVwZGF0ZVRyYW5z
Zm9ybSA9IHRydWU7CiAgICAgfQogCiAgICAgaWYgKG1fY2hhbmdlTWFzayAmIChDb250ZW50Q2hh
bmdlIHwgRHJhd3NDb250ZW50Q2hhbmdlIHwgTWFza0xheWVyQ2hhbmdlKSkgewpAQCAtNTI4LDYg
KzU5OSw5IEBAIHZvaWQgR3JhcGhpY3NMYXllclF0SW1wbDo6Zmx1c2hDaGFuZ2VzKGIKICAgICAg
ICAgfQogICAgIH0KIAorICAgIGlmIChvcHRpb25zLmZvcmNlVXBkYXRlUGVyc3BlY3RpdmUpIHsK
KyAgICB9CisKICAgICBpZiAoKG1fY2hhbmdlTWFzayAmIE9wYWNpdHlDaGFuZ2UpICYmIG1fc3Rh
dGUub3BhY2l0eSAhPSBtX2xheWVyLT5vcGFjaXR5KCkpCiAgICAgICAgIHNldE9wYWNpdHkobV9s
YXllci0+b3BhY2l0eSgpKTsKIApAQCAtNTY0LDcgKzYzOCw2IEBAIHZvaWQgR3JhcGhpY3NMYXll
clF0SW1wbDo6Zmx1c2hDaGFuZ2VzKGIKICAgICBtX3N0YXRlLnBvcyA9IG1fbGF5ZXItPnBvc2l0
aW9uKCk7CiAgICAgbV9zdGF0ZS5hbmNob3JQb2ludCA9IG1fbGF5ZXItPmFuY2hvclBvaW50KCk7
CiAgICAgbV9zdGF0ZS5zaXplID0gbV9sYXllci0+c2l6ZSgpOwotICAgIG1fc3RhdGUudHJhbnNm
b3JtID0gbV9sYXllci0+dHJhbnNmb3JtKCk7CiAgICAgbV9zdGF0ZS5nZW9PcmllbnRhdGlvbiA9
IG1fbGF5ZXItPmdlb21ldHJ5T3JpZW50YXRpb24oKTsKICAgICBtX3N0YXRlLmNvbnRlbnRzT3Jp
ZW50YXRpb24gPW1fbGF5ZXItPmNvbnRlbnRzT3JpZW50YXRpb24oKTsKICAgICBtX3N0YXRlLm9w
YWNpdHkgPSBtX2xheWVyLT5vcGFjaXR5KCk7CkBAIC01ODYsMTAgKzY1OSwxMCBAQCB2b2lkIEdy
YXBoaWNzTGF5ZXJRdEltcGw6OmZsdXNoQ2hhbmdlcyhiCiAKIAogYWZ0ZXJMYXllckNoYW5nZXM6
Ci0gICAgaWYgKGZvcmNlVXBkYXRlVHJhbnNmb3JtKQotICAgICAgICB1cGRhdGVUcmFuc2Zvcm0o
KTsKKyAgICBpZiAob3B0aW9ucy5mb3JjZVVwZGF0ZVRyYW5zZm9ybSkKKyAgICAgICAgdXBkYXRl
VHJhbnNmb3JtKGZhbHNlKTsKIAotICAgIGlmICghcmVjdXJzaXZlKQorICAgIGlmICghb3B0aW9u
cy5yZWN1cnNpdmUpCiAgICAgICAgIHJldHVybjsgICAgCiAKICAgICBRTGlzdDxRR3JhcGhpY3NJ
dGVtKj4gY2hpbGRyZW4gPSBjaGlsZEl0ZW1zKCk7CkBAIC01OTksNyArNjcyLDcgQEAgYWZ0ZXJM
YXllckNoYW5nZXM6CiAgICAgZm9yIChRTGlzdDxRR3JhcGhpY3NJdGVtKj46OmNvbnN0X2l0ZXJh
dG9yIGl0ID0gY2hpbGRyZW4uYmVnaW4oKTsgaXQgIT0gY2hpbGRyZW4uZW5kKCk7ICsraXQpIHsK
ICAgICAgICAgaWYgKFFHcmFwaGljc0l0ZW0qIGl0ZW0gPSAqaXQpCiAgICAgICAgICAgICBpZiAo
R3JhcGhpY3NMYXllclF0SW1wbCogbGF5ZXIgPSBxb2JqZWN0X2Nhc3Q8R3JhcGhpY3NMYXllclF0
SW1wbCo+KGl0ZW0tPnRvR3JhcGhpY3NPYmplY3QoKSkpCi0gICAgICAgICAgICAgICAgbGF5ZXIt
PmZsdXNoQ2hhbmdlcyh0cnVlLCBmb3JjZVVwZGF0ZVRyYW5zZm9ybSk7CisgICAgICAgICAgICAg
ICAgbGF5ZXItPmZsdXNoQ2hhbmdlcyhvcHRpb25zKTsKICAgICB9CiB9CiAKQEAgLTczMyw5ICs4
MDYsOCBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0UG9zaXRpb24oY29uc3QgCiAvLyByZWlt
cCBmcm9tIEdyYXBoaWNzTGF5ZXIuaAogdm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldEFuY2hvclBv
aW50KGNvbnN0IEZsb2F0UG9pbnQzRCYgcCkKIHsKLSAgICBpZiAoYW5jaG9yUG9pbnQoKSAhPSBw
KQotICAgICAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpBbmNo
b3JQb2ludENoYW5nZSk7CiAgICAgR3JhcGhpY3NMYXllcjo6c2V0QW5jaG9yUG9pbnQocCk7Cisg
ICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6QW5jaG9yUG9pbnRD
aGFuZ2UpOwogfQogCiAvLyByZWltcCBmcm9tIEdyYXBoaWNzTGF5ZXIuaApAQCAtNzQ5LDkgKzgy
MSw4IEBAIHZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRTaXplKGNvbnN0IEZsb2EKIC8vIHJlaW1w
IGZyb20gR3JhcGhpY3NMYXllci5oCiB2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0VHJhbnNmb3Jt
KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQogewotICAgIGlmICghbV9pbXBsLT5tX3Ry
YW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcgJiYgdHJhbnNmb3JtKCkgIT0gdCkKLSAgICAgICBtX2lt
cGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpUcmFuc2Zvcm1DaGFuZ2UpOwog
ICAgIEdyYXBoaWNzTGF5ZXI6OnNldFRyYW5zZm9ybSh0KTsKKyAgICBtX2ltcGwtPm5vdGlmeUNo
YW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpUcmFuc2Zvcm1DaGFuZ2UpOwogfQogCiAvLyByZWlt
cCBmcm9tIEdyYXBoaWNzTGF5ZXIuaApAQCAtNzY0LDkgKzgzNSw4IEBAIHZvaWQgR3JhcGhpY3NM
YXllclF0OjpzZXRDaGlsZHJlblRyYW5zZm8KIC8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5o
CiB2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0UHJlc2VydmVzM0QoYm9vbCBiKQogewotICAgIGlm
IChiICE9IHByZXNlcnZlczNEKCkpOwotICAgICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBo
aWNzTGF5ZXJRdEltcGw6OlByZXNlcnZlczNEQ2hhbmdlKTsKICAgICBHcmFwaGljc0xheWVyOjpz
ZXRQcmVzZXJ2ZXMzRChiKTsKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVy
UXRJbXBsOjpQcmVzZXJ2ZXMzRENoYW5nZSk7CiB9CiAKIC8vIHJlaW1wIGZyb20gR3JhcGhpY3NM
YXllci5oCkBAIC04MjUsMTUgKzg5NSwxNCBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0T3Bh
Y2l0eShmbG9hdCBvCiB2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0Q29udGVudHNSZWN0KGNvbnN0
IEludFJlY3QmIHIpCiB7CiAgICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0
SW1wbDo6Q29udGVudHNSZWN0Q2hhbmdlKTsKLSAgICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50
c1JlY3Qocik7CiB9CiAKIC8vIHJlaW1wIGZyb20gR3JhcGhpY3NMYXllci5oCiB2b2lkIEdyYXBo
aWNzTGF5ZXJRdDo6c2V0Q29udGVudHNUb0ltYWdlKEltYWdlKiBpbWFnZSkKIHsKKyAgICBHcmFw
aGljc0xheWVyOjpzZXRDb250ZW50c1RvSW1hZ2UoaW1hZ2UpOwogICAgIG1faW1wbC0+bm90aWZ5
Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNvbnRlbnRDaGFuZ2UpOwogICAgIG1faW1wbC0+
bV9wZW5kaW5nQ29udGVudC5jb250ZW50VHlwZSA9IEdyYXBoaWNzTGF5ZXJRdEltcGw6OkhUTUxD
b250ZW50VHlwZTsKLSAgICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c1RvSW1hZ2UoaW1hZ2Up
OwogICAgIGlmIChpbWFnZSkgewogICAgICAgICBRUGl4bWFwKiBweG0gPSBpbWFnZS0+bmF0aXZl
SW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKICAgICAgICAgaWYgKHB4bSkgewpAQCAtODQ4LDEwICs5
MTcsMTAgQEAgdm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldENvbnRlbnRzVG9JbWFnZQogLy8gcmVp
bXAgZnJvbSBHcmFwaGljc0xheWVyLmgKIHZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRDb250ZW50
c0JhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYgY29sb3IpCiB7CisgICAgR3JhcGhpY3NMYXll
cjo6c2V0Q29udGVudHNCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwogICAgIG1faW1wbC0+bm90aWZ5
Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNvbnRlbnRDaGFuZ2UpOwogICAgIG1faW1wbC0+
bV9wZW5kaW5nQ29udGVudC5jb250ZW50VHlwZSA9IEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNvbG9y
Q29udGVudFR5cGU7CiAgICAgbV9pbXBsLT5tX3BlbmRpbmdDb250ZW50LmNvbnRlbnRzQmFja2dy
b3VuZENvbG9yID0gUUNvbG9yKGNvbG9yKTsKLSAgICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50
c0JhY2tncm91bmRDb2xvcihjb2xvcik7CiB9CiAKIHZvaWQgR3JhcGhpY3NMYXllclF0OjpzZXRD
b250ZW50c1RvTWVkaWEoUGxhdGZvcm1MYXllciogbWVkaWEpCkBAIC04NjYsMjIgKzkzNSwyMiBA
QCB2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6c2V0Q29udGVudHNUb01lZGlhCiAvLyByZWltcCBmcm9t
IEdyYXBoaWNzTGF5ZXIuaAogdm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldEdlb21ldHJ5T3JpZW50
YXRpb24oQ29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIG9yaWVudGF0aW9uKQogewot
ICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6Okdlb21ldHJ5T3Jp
ZW50YXRpb25DaGFuZ2UpOwogICAgIEdyYXBoaWNzTGF5ZXI6OnNldEdlb21ldHJ5T3JpZW50YXRp
b24ob3JpZW50YXRpb24pOworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJR
dEltcGw6Okdlb21ldHJ5T3JpZW50YXRpb25DaGFuZ2UpOwogfQogCiAvLyByZWltcCBmcm9tIEdy
YXBoaWNzTGF5ZXIuaAogdm9pZCBHcmFwaGljc0xheWVyUXQ6OnNldENvbnRlbnRzT3JpZW50YXRp
b24oQ29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIG9yaWVudGF0aW9uKQogewotICAg
IG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdEltcGw6OkNvbnRlbnRzT3JpZW50
YXRpb25DaGFuZ2UpOwogICAgIEdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRzT3JpZW50YXRpb24o
b3JpZW50YXRpb24pOworICAgIG1faW1wbC0+bm90aWZ5Q2hhbmdlKEdyYXBoaWNzTGF5ZXJRdElt
cGw6OkNvbnRlbnRzT3JpZW50YXRpb25DaGFuZ2UpOwogfQogCiAvLyByZWltcCBmcm9tIEdyYXBo
aWNzTGF5ZXIuaAogdm9pZCBHcmFwaGljc0xheWVyUXQ6OmRpc3RyaWJ1dGVPcGFjaXR5KGZsb2F0
IG8pCiB7Ci0gICAgbV9pbXBsLT5ub3RpZnlDaGFuZ2UoR3JhcGhpY3NMYXllclF0SW1wbDo6T3Bh
Y2l0eUNoYW5nZSk7CiAgICAgbV9pbXBsLT5tX3N0YXRlLmRpc3RyaWJ1dGVPcGFjaXR5ID0gdHJ1
ZTsKKyAgICBtX2ltcGwtPm5vdGlmeUNoYW5nZShHcmFwaGljc0xheWVyUXRJbXBsOjpPcGFjaXR5
Q2hhbmdlKTsKIH0KIAogLy8gcmVpbXAgZnJvbSBHcmFwaGljc0xheWVyLmgKQEAgLTEwNzcsNyAr
MTE0Niw3IEBAIHB1YmxpYzoKICAgICAgICAgLy8gdGhpcyBjYW1lIHVwIGR1cmluZyB0aGUgY29t
cG9zaXRpbmcvYW5pbWF0aW9uIExheW91dFRlc3RzCiAgICAgICAgIC8vIHdoZW4gdGhlIGFuaW1h
dGlvbiBkaWVzLCB0aGUgdHJhbnNmb3JtIGhhcyB0byBnbyBiYWNrIHRvIGRlZmF1bHQKICAgICAg
ICAgaWYgKG1fbGF5ZXIpCi0gICAgICAgICAgICBtX2xheWVyLmRhdGEoKS0+dXBkYXRlVHJhbnNm
b3JtKCk7CisgICAgICAgICAgICBtX2xheWVyLmRhdGEoKS0+dXBkYXRlVHJhbnNmb3JtKHRydWUp
OwogICAgIH0KIAogICAgIC8vIHRoZSBpZGVhIGlzIHRoYXQgd2UgbGV0IFdlYkNvcmUgbWFuYWdl
IHRoZSB0cmFuc2Zvcm0tb3BlcmF0aW9ucwpAQCAtMTEwMyw3ICsxMTcyLDggQEAgcHVibGljOgog
ICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YXJnZXRPcGVyYXRpb25zLnNpemUo
KTsgKytpKQogICAgICAgICAgICAgICAgIHRhcmdldE9wZXJhdGlvbnMub3BlcmF0aW9ucygpW2ld
LT5ibGVuZChzb3VyY2VPcGVyYXRpb25zLmF0KGkpLCBwcm9ncmVzcyktPmFwcGx5KHRyYW5zZm9y
bU1hdHJpeCwgbV9ib3hTaXplKTsKICAgICAgICAgfQotICAgICAgICBtX2xheWVyLmRhdGEoKS0+
c2V0QmFzZVRyYW5zZm9ybSh0cmFuc2Zvcm1NYXRyaXgpOworICAgICAgICBtX2xheWVyLmRhdGEo
KS0+bV9zdGF0ZS5hbmltYXRlZFRyYW5zZm9ybSA9IHRyYW5zZm9ybU1hdHJpeDsKKyAgICAgICAg
bV9sYXllci5kYXRhKCktPnVwZGF0ZVRyYW5zZm9ybSh0cnVlKTsKICAgICB9CiAKICAgICB2aXJ0
dWFsIHZvaWQgdXBkYXRlU3RhdGUoUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSBuZXdTdGF0ZSwg
UUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSBvbGRTdGF0ZSkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54355</attachid>
            <date>2010-04-26 17:47:22 -0700</date>
            <delta_ts>2010-04-27 17:50:30 -0700</delta_ts>
            <desc>better way to do preserves-3D</desc>
            <filename>patch-3D.diff</filename>
            <type>text/plain</type>
            <size>19593</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0
LmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0LmNwcApp
bmRleCBhMzFkMDQ1Li4xMTdjYjAyIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3F0L0dyYXBoaWNzTGF5ZXJRdC5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9xdC9HcmFwaGljc0xheWVyUXQuY3BwCkBAIC0zMiwxNCArMzIsMTEgQEAKICNpbmNsdWRlIDxR
dENvcmUvcW1ldGFvYmplY3QuaD4KICNpbmNsdWRlIDxRdENvcmUvcXNldC5oPgogI2luY2x1ZGUg
PFF0Q29yZS9xdGltZXIuaD4KLSNpbmNsdWRlIDxRdEd1aS9xYml0bWFwLmg+CiAjaW5jbHVkZSA8
UXRHdWkvcWNvbG9yLmg+CiAjaW5jbHVkZSA8UXRHdWkvcWdyYXBoaWNzZWZmZWN0Lmg+CiAjaW5j
bHVkZSA8UXRHdWkvcWdyYXBoaWNzaXRlbS5oPgogI2luY2x1ZGUgPFF0R3VpL3FncmFwaGljc3Nj
ZW5lLmg+Ci0jaW5jbHVkZSA8UXRHdWkvcW1hdHJpeDR4NC5oPgogI2luY2x1ZGUgPFF0R3VpL3Fw
YWludGVyLmg+Ci0jaW5jbHVkZSA8UXRHdWkvcXBhbGV0dGUuaD4KICNpbmNsdWRlIDxRdEd1aS9x
cGl4bWFwLmg+CiAjaW5jbHVkZSA8UXRHdWkvcXBpeG1hcGNhY2hlLmg+CiAjaW5jbHVkZSA8UXRH
dWkvcXN0eWxlb3B0aW9uLmg+CkBAIC0xMzUsNiArMTMyLDggQEAgcHVibGljOgogICAgIC8vIHRo
ZSBjb21wb3NpdG9yIGxldHMgdXMgc3BlY2lhbC1jYXNlIGltYWdlcyBhbmQgY29sb3JzLCBzbyB3
ZSB0cnkgdG8gZG8gc28KICAgICBlbnVtIFN0YXRpY0NvbnRlbnRUeXBlIHsgSFRNTENvbnRlbnRU
eXBlLCBQaXhtYXBDb250ZW50VHlwZSwgQ29sb3JDb250ZW50VHlwZSwgTWVkaWFDb250ZW50VHlw
ZX07CiAKKyAgICBjb25zdCBHcmFwaGljc0xheWVyUXRJbXBsKiByb290TGF5ZXIoKSBjb25zdDsK
KwogICAgIEdyYXBoaWNzTGF5ZXJRdEltcGwoR3JhcGhpY3NMYXllclF0KiBuZXdMYXllcik7CiAg
ICAgdmlydHVhbCB+R3JhcGhpY3NMYXllclF0SW1wbCgpOwogCkBAIC0xNDMsOSArMTQyLDggQEAg
cHVibGljOgogICAgIHZpcnR1YWwgUVJlY3RGIGJvdW5kaW5nUmVjdCgpIGNvbnN0OwogICAgIHZp
cnR1YWwgdm9pZCBwYWludChRUGFpbnRlciosIGNvbnN0IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRl
bSosIFFXaWRnZXQqKTsKIAotICAgIC8vIHdlIG1hbmFnZSB0cmFuc2Zvcm1zIG91cnNlbHZlcyBi
ZWNhdXNlIHRyYW5zZm9ybS1vcmlnaW4gYWN0cyBkaWZmZXJlbnRseSBpbiB3ZWJraXQgYW5kIGlu
IFF0CisgICAgLy8gV2UgbWFuYWdlIHRyYW5zZm9ybXMgb3Vyc2VsdmVzIGJlY2F1c2UgdHJhbnNm
b3JtLW9yaWdpbiBhY3RzIGRpZmZlcmVudGx5IGluIHdlYmtpdCBhbmQgaW4gUXQsIGFuZCB3ZSBu
ZWVkIGl0IGFzIGEgZmFsbGJhY2sgaW4gY2FzZSB3ZSBlbmNvdW50ZXIgYW4gdW4taW52ZXJ0aWJs
ZSBtYXRyaXgKICAgICB2b2lkIHNldEJhc2VUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25N
YXRyaXgmKTsKLSAgICBRVHJhbnNmb3JtIGNvbXB1dGVUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXgmIGJhc2VUcmFuc2Zvcm0pIGNvbnN0OwogICAgIHZvaWQgdXBkYXRlVHJhbnNm
b3JtKCk7CiAKICAgICAvLyBsZXQgdGhlIGNvbXBvc2l0b3ItQVBJIHRlbGwgdXMgd2hpY2ggcHJv
cGVydGllcyB3ZXJlIGNoYW5nZWQKQEAgLTE2MywxMCArMTYxLDYgQEAgcHVibGljOgogICAgIC8v
IG9yIENocm9tZUNsaWVudFF0OjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJTeW5jIChtZWFuaW5n
IHRoZSBzeW5jIHdpbGwgaGFwcGVuIEFTQVApCiAgICAgdm9pZCBmbHVzaENoYW5nZXMoYm9vbCBy
ZWN1cnNpdmUgPSB0cnVlLCBib29sIGZvcmNlVHJhbnNmb3JtVXBkYXRlID0gZmFsc2UpOwogCi0g
ICAgLy8gb3B0aW1pemF0aW9uOiByZXR1cm5zIHRydWUgaWYgdGhpcyBvciBhbiBhbmNlc3RvciBo
YXMgYSB0cmFuc2Zvcm0gYW5pbWF0aW9uIHJ1bm5pbmcuCi0gICAgLy8gdGhpcyBlbmFibGVzIHVz
IHRvIHVzZSBJdGVtQ29vcmRpbmF0ZXNDYWNoZSB3aGlsZSB0aGUgYW5pbWF0aW9uIGlzIHJ1bm5p
bmcsIG90aGVyd2lzZSB3ZSBoYXZlIHRvIHJlY2FjaGUgZm9yIGV2ZXJ5IGZyYW1lCi0gICAgYm9v
bCBpc1RyYW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcoKSBjb25zdDsKLQogcHVibGljIHNsb3RzOgog
ICAgIC8vIHdlIG5lZWQgdG8gbm90aWZ5IHRoZSBjbGllbnQgKGFrYSB0aGUgbGF5ZXIgY29tcG9z
aXRvcikgd2hlbiB0aGUgYW5pbWF0aW9uIGFjdHVhbGx5IHN0YXJ0cwogICAgIHZvaWQgbm90aWZ5
QW5pbWF0aW9uU3RhcnRlZCgpOwpAQCAtMTgyLDYgKzE3Niw4IEBAIHB1YmxpYzoKICAgICBHcmFw
aGljc0xheWVyUXQqIG1fbGF5ZXI7CiAKICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtX2Jhc2VU
cmFuc2Zvcm07CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbV9jb21wdXRlZFRyYW5zZm9ybTsK
KyAgICBib29sIG1fdXNlRGVmYXVsdFRyYW5zZm9ybXM7CiAgICAgYm9vbCBtX3RyYW5zZm9ybUFu
aW1hdGlvblJ1bm5pbmc7CiAgICAgYm9vbCBtX29wYWNpdHlBbmltYXRpb25SdW5uaW5nOwogICAg
IFFXZWFrUG9pbnRlcjxNYXNrRWZmZWN0UXQ+IG1fbWFza0VmZmVjdDsKQEAgLTI4OCw2ICsyODQs
MTUgQEAgR3JhcGhpY3NMYXllclF0SW1wbDo6fkdyYXBoaWNzTGF5ZXJRdEltcGwoKQogI2VuZGlm
CiB9CiAKK2NvbnN0IEdyYXBoaWNzTGF5ZXJRdEltcGwqIEdyYXBoaWNzTGF5ZXJRdEltcGw6OnJv
b3RMYXllcigpIGNvbnN0Cit7CisgICAgaWYgKGNvbnN0IEdyYXBoaWNzTGF5ZXJRdEltcGwqIHBh
cmVudCA9IHFvYmplY3RfY2FzdDxjb25zdCBHcmFwaGljc0xheWVyUXRJbXBsKj4ocGFyZW50T2Jq
ZWN0KCkpKQorICAgICAgICByZXR1cm4gcGFyZW50LT5yb290TGF5ZXIoKTsKKyAgICBlbHNlCisg
ICAgICAgIHJldHVybiB0aGlzOworfQorCisKIAogUVBpeG1hcCBHcmFwaGljc0xheWVyUXRJbXBs
OjpyZWNhY2hlKGNvbnN0IFFSZWdpb24mIHJlZ2lvblRvVXBkYXRlKQogewpAQCAtMjk5LDcgKzMw
NCw3IEBAIFFQaXhtYXAgR3JhcGhpY3NMYXllclF0SW1wbDo6cmVjYWNoZShjb25zdCBRUmVnaW9u
JiByZWdpb25Ub1VwZGF0ZSkKIAogICAgIC8vIFdlIG1pZ2h0IGJlIGRyYXdpbmcgaW50byBhbiBl
eGlzdGluZyBjYWNoZS4KICAgICBpZiAoIVFQaXhtYXBDYWNoZTo6ZmluZChtX2JhY2tpbmdTdG9y
ZUtleSwgJnBpeG1hcCkpCi0gICAgICAgIHJlZ2lvbiA9IFFSZWdpb24oYm91bmRpbmdSZWN0KCku
dG9BbGlnbmVkUmVjdCgpKTsKKyAgICAgICAgcmVnaW9uID0gUVJlZ2lvbihRUmVjdCgwLCAwLCBt
X3NpemUud2lkdGgoKSwgbV9zaXplLmhlaWdodCgpKSk7CiAKICAgICBpZiAobV9zaXplICE9IHBp
eG1hcC5zaXplKCkpIHsKICAgICAgICAgcGl4bWFwID0gUVBpeG1hcChtX3NpemUudG9TaXplKCkp
OwpAQCAtMzI1LDczICszMzAsMTAwIEBAIFFQaXhtYXAgR3JhcGhpY3NMYXllclF0SW1wbDo6cmVj
YWNoZShjb25zdCBRUmVnaW9uJiByZWdpb25Ub1VwZGF0ZSkKIAogdm9pZCBHcmFwaGljc0xheWVy
UXRJbXBsOjp1cGRhdGVUcmFuc2Zvcm0oKQogewotICAgIHNldEJhc2VUcmFuc2Zvcm0oaXNUcmFu
c2Zvcm1BbmltYXRpb25SdW5uaW5nKCkgPyBtX2Jhc2VUcmFuc2Zvcm0gOiBtX2xheWVyLT50cmFu
c2Zvcm0oKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NMYXllclF0SW1wbDo6c2V0QmFzZVRyYW5zZm9y
bShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgYmFzZVRyYW5zZm9ybSkKLXsKLSAgICBtX2Jh
c2VUcmFuc2Zvcm0gPSBiYXNlVHJhbnNmb3JtOwotICAgIHNldFRyYW5zZm9ybShjb21wdXRlVHJh
bnNmb3JtKGJhc2VUcmFuc2Zvcm0pKTsKLX0KLQotUVRyYW5zZm9ybSBHcmFwaGljc0xheWVyUXRJ
bXBsOjpjb21wdXRlVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBiYXNlVHJh
bnNmb3JtKSBjb25zdAotewotICAgIGlmICghbV9sYXllcikKLSAgICAgICAgcmV0dXJuIGJhc2VU
cmFuc2Zvcm07CisgICAgaWYgKCFtX3RyYW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcpCisgICAgICAg
IG1fYmFzZVRyYW5zZm9ybSA9IG1fbGF5ZXItPnRyYW5zZm9ybSgpOwogCi0gICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXggY29tcHV0ZWRUcmFuc2Zvcm07CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXgg
bG9jYWxUcmFuc2Zvcm07CiAKICAgICAvLyBUaGUgb3JpZ2luIGZvciBjaGlsZHJlblRyYW5zZm9y
bSBpcyBhbHdheXMgdGhlIGNlbnRlciBvZiB0aGUgYW5jZXN0b3Igd2hpY2ggY29udGFpbnMgdGhl
IGNoaWxkcmVuVHJhbnNmb3JtLgogICAgIC8vIHRoaXMgaGFzIHRvIGRvIHdpdGggaG93IFdlYkNv
cmUgaW1wbGVtZW50cyAtd2Via2l0LXBlcnNwZWN0aXZlIGFuZCAtd2Via2l0LXBlcnNwZWN0aXZl
LW9yaWdpbiwgd2hpY2ggYXJlIHRoZSBDU1MKICAgICAvLyBhdHRyaWJ1dGUgdGhhdCBjYWxsIHNl
dENoaWxkcmVuVHJhbnNmb3JtCi0gICAgUVBvaW50RiBvZmZzZXQgPSAtcG9zKCkgLSBib3VuZGlu
Z1JlY3QoKS5ib3R0b21SaWdodCgpIC8gMjsKLQotICAgIGZvciAoY29uc3QgR3JhcGhpY3NMYXll
clF0SW1wbCogYW5jZXN0b3IgPSB0aGlzOyAoYW5jZXN0b3IgPSBxb2JqZWN0X2Nhc3Q8R3JhcGhp
Y3NMYXllclF0SW1wbCo+KGFuY2VzdG9yLT5wYXJlbnRPYmplY3QoKSkpOyApIHsKLSAgICAgICAg
aWYgKCFhbmNlc3Rvci0+bV9zdGF0ZS5jaGlsZHJlblRyYW5zZm9ybS5pc0lkZW50aXR5KCkpIHsK
LSAgICAgICAgICAgIGNvbnN0IFFQb2ludEYgb2Zmc2V0ID0gbWFwRnJvbUl0ZW0oYW5jZXN0b3Is
IFFQb2ludEYoYW5jZXN0b3ItPm1fc2l6ZS53aWR0aCgpIC8gMiwgYW5jZXN0b3ItPm1fc2l6ZS5o
ZWlnaHQoKSAvIDIpKTsKLSAgICAgICAgICAgIGNvbXB1dGVkVHJhbnNmb3JtCi0gICAgICAgICAg
ICAgICAgLnRyYW5zbGF0ZShvZmZzZXQueCgpLCBvZmZzZXQueSgpKQotICAgICAgICAgICAgICAg
IC5tdWx0TGVmdChhbmNlc3Rvci0+bV9zdGF0ZS5jaGlsZHJlblRyYW5zZm9ybSkKLSAgICAgICAg
ICAgICAgICAudHJhbnNsYXRlKC1vZmZzZXQueCgpLCAtb2Zmc2V0LnkoKSk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotICAgIH0KKyAgICBRUG9pbnRGIG9mZnNldCA9IC1RUG9pbnRG
KG1fc3RhdGUucG9zLngoKSwgbV9zdGF0ZS5wb3MueSgpKSAtIGJvdW5kaW5nUmVjdCgpLmJvdHRv
bVJpZ2h0KCkgLyAyOworICAgIEdyYXBoaWNzTGF5ZXJRdEltcGwqIHBhcmVudCA9IHFvYmplY3Rf
Y2FzdDxHcmFwaGljc0xheWVyUXRJbXBsKj4ocGFyZW50T2JqZWN0KCkpOwogCiAgICAgLy8gd2Vi
a2l0IGhhcyByZWxhdGl2ZS10by1zaXplIG9yaWdpblBvaW50LCBncmFwaGljcy12aWV3IGhhcyBh
IHBpeGVsIG9yaWdpblBvaW50LCBoZXJlIHdlIGNvbnZlcnQKICAgICAvLyB3ZSBoYXZlIHRvIG1h
bmFnZSB0aGlzIG91cnNlbHZlcyBiZWNhdXNlIFFHcmFwaGljc1ZpZXcncyB0cmFuc2Zvcm1Pcmln
aW4gaXMgaW5jb21wYXRpYmxlCiAgICAgY29uc3QgcXJlYWwgb3JpZ2luWCA9IG1fc3RhdGUuYW5j
aG9yUG9pbnQueCgpICogbV9zaXplLndpZHRoKCk7CiAgICAgY29uc3QgcXJlYWwgb3JpZ2luWSA9
IG1fc3RhdGUuYW5jaG9yUG9pbnQueSgpICogbV9zaXplLmhlaWdodCgpOwotICAgIGNvbXB1dGVk
VHJhbnNmb3JtCi0gICAgICAgICAgICAudHJhbnNsYXRlM2Qob3JpZ2luWCwgb3JpZ2luWSwgbV9z
dGF0ZS5hbmNob3JQb2ludC56KCkpCi0gICAgICAgICAgICAubXVsdExlZnQoYmFzZVRyYW5zZm9y
bSkKKworICAgIC8vIFdlIGlnbm9yZSBRR3JhcGhpY3NJdGVtOjpwb3MgY29tcGxldGVseSwgYW5k
IHVzZSBvbmx5IHRyYW5zZm9ybXMgLSBiZWNhdXNlIHdlIGhhdmUgdG8gbWFpbnRhaW4gdGhhdCBv
dXJzZWx2ZXMgZm9yIDNELgorICAgIGxvY2FsVHJhbnNmb3JtCisgICAgICAgICAgICAudHJhbnNs
YXRlM2Qob3JpZ2luWCArIG1fc3RhdGUucG9zLngoKSwgb3JpZ2luWSArIG1fc3RhdGUucG9zLnko
KSwgbV9zdGF0ZS5hbmNob3JQb2ludC56KCkpCisgICAgICAgICAgICAubXVsdExlZnQobV9iYXNl
VHJhbnNmb3JtKQogICAgICAgICAgICAgLnRyYW5zbGF0ZTNkKC1vcmlnaW5YLCAtb3JpZ2luWSwg
LW1fc3RhdGUuYW5jaG9yUG9pbnQueigpKTsKIAotICAgIC8vIG5vdyB3ZSBwcm9qZWN0IHRvIDJE
Ci0gICAgcmV0dXJuIFFUcmFuc2Zvcm0oY29tcHV0ZWRUcmFuc2Zvcm0pOworICAgIC8vIFRoaXMg
aXMgdGhlIGFjdHVhbCAzRCB0cmFuc2Zvcm0gb2YgdGhpcyBpdGVtLCB3aXRoIHRoZSBhbmNlc3Rv
cnMnIHRyYW5zZm9ybSBiYWtlZCBpbi4KKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBjb21wdXRl
ZFRyYW5zZm9ybSA9CisgICAgICAgICAgICAocGFyZW50ID8gVHJhbnNmb3JtYXRpb25NYXRyaXgo
cGFyZW50LT5tX2NvbXB1dGVkVHJhbnNmb3JtKSA6IFRyYW5zZm9ybWF0aW9uTWF0cml4KCkpCisg
ICAgICAgICAgICAgICAgLm11bHRMZWZ0KGxvY2FsVHJhbnNmb3JtKTsKKworICAgIC8vIE5vdyB3
ZSBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIGxheWVyIGlzIGZh
Y2luZyBiYWNrd2FyZHMuCisgICAgaWYoIW1fc3RhdGUuYmFja2ZhY2VWaXNpYmlsaXR5ICYmIGNv
bXB1dGVkVHJhbnNmb3JtLmludmVyc2UoKS5tMzMoKSA8IDApIHsKKyAgICAgICAgc2V0VmlzaWJs
ZShmYWxzZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZXRWaXNpYmxlKHRydWUp
OworCisgICAgLy8gRmxhdHRlbiB0byAyRC1zcGFjZSBvZiB0aGlzIGl0ZW0gaWYgaXQgZG9lc24n
dCBwcmVzZXJ2ZSAzRC4KKyAgICBpZiAoIW1fc3RhdGUucHJlc2VydmVzM0QpIHsKKyAgICAgICAg
Y29tcHV0ZWRUcmFuc2Zvcm0uc2V0TTEzKDApOworICAgICAgICBjb21wdXRlZFRyYW5zZm9ybS5z
ZXRNMjMoMCk7CisgICAgICAgIGNvbXB1dGVkVHJhbnNmb3JtLnNldE0zMSgwKTsKKyAgICAgICAg
Y29tcHV0ZWRUcmFuc2Zvcm0uc2V0TTMyKDApOworICAgICAgICBjb21wdXRlZFRyYW5zZm9ybS5z
ZXRNMzMoMSk7CisgICAgICAgIGNvbXB1dGVkVHJhbnNmb3JtLnNldE0zNCgwKTsKKyAgICAgICAg
Y29tcHV0ZWRUcmFuc2Zvcm0uc2V0TTQzKDApOworICAgIH0KKworICAgIGlmICghbV9zdGF0ZS5j
aGlsZHJlblRyYW5zZm9ybS5pc0lkZW50aXR5KCkpCisgICAgICAgIGNvbXB1dGVkVHJhbnNmb3Jt
CisgICAgICAgICAgICAudHJhbnNsYXRlKG1fc2l6ZS53aWR0aCgpIC8gMiwgbV9zaXplLmhlaWdo
dCgpIC8yKQorICAgICAgICAgICAgLm11bHRMZWZ0KG1fc3RhdGUuY2hpbGRyZW5UcmFuc2Zvcm0p
CisgICAgICAgICAgICAudHJhbnNsYXRlKC1tX3NpemUud2lkdGgoKSAvIDIsIC1tX3NpemUuaGVp
Z2h0KCkgLzIpOworCisgICAgY29uc3QgUVRyYW5zZm9ybSByZXF1aXJlZE92ZXJhbGxUcmFuc2Zv
cm0yRChjb21wdXRlZFRyYW5zZm9ybSk7CisgICAgY29uc3QgUVRyYW5zZm9ybSBwYXJlbnRUcmFu
c2Zvcm0gPSBwYXJlbnQgPyBwYXJlbnQtPml0ZW1UcmFuc2Zvcm0ocm9vdExheWVyKCkpIDogUVRy
YW5zZm9ybSgpOworCisgICAgYm9vbCBpbnZlcnNlT2sgPSB0cnVlOworICAgIGNvbnN0IFFUcmFu
c2Zvcm0gdHJhbnNmb3JtMkQgPSByZXF1aXJlZE92ZXJhbGxUcmFuc2Zvcm0yRCAqIHBhcmVudFRy
YW5zZm9ybS5pbnZlcnRlZCgmaW52ZXJzZU9rKTsKKyAgICBpZiAobV91c2VEZWZhdWx0VHJhbnNm
b3JtcyAhPSBpbnZlcnNlT2sgfHwgKCFpbnZlcnNlT2sgJiYgbV9jb21wdXRlZFRyYW5zZm9ybSAh
PSBjb21wdXRlZFRyYW5zZm9ybSkpIHsKKyAgICAgICAgcHJlcGFyZUdlb21ldHJ5Q2hhbmdlKCk7
CisgICAgICAgIG1fdXNlRGVmYXVsdFRyYW5zZm9ybXMgPSBpbnZlcnNlT2s7CisgICAgfQorCisg
ICAgc2V0VHJhbnNmb3JtKG1fdXNlRGVmYXVsdFRyYW5zZm9ybXMgPyAgdHJhbnNmb3JtMkQgOiBR
VHJhbnNmb3JtKCkpOworICAgIG1fY29tcHV0ZWRUcmFuc2Zvcm0gPSBjb21wdXRlZFRyYW5zZm9y
bTsKKworICAgIGNvbnN0IFFMaXN0PFFHcmFwaGljc0l0ZW0qPiBjaGlsZHJlbiA9IGNoaWxkSXRl
bXMoKTsKKyAgICBmb3IgKFFMaXN0PFFHcmFwaGljc0l0ZW0qPjo6Y29uc3RfaXRlcmF0b3IgaXQg
PSBjaGlsZHJlbi5iZWdpbigpOyBpdCAhPSBjaGlsZHJlbi5lbmQoKTsgKytpdCkKKyAgICAgICAg
aWYgKEdyYXBoaWNzTGF5ZXJRdEltcGwqIGxheWVyPSBxb2JqZWN0X2Nhc3Q8R3JhcGhpY3NMYXll
clF0SW1wbCo+KCgqaXQpLT50b0dyYXBoaWNzT2JqZWN0KCkpKQorICAgICAgICAgICAgbGF5ZXIt
PnVwZGF0ZVRyYW5zZm9ybSgpOwogfQogCi1ib29sIEdyYXBoaWNzTGF5ZXJRdEltcGw6OmlzVHJh
bnNmb3JtQW5pbWF0aW9uUnVubmluZygpIGNvbnN0Cit2b2lkIEdyYXBoaWNzTGF5ZXJRdEltcGw6
OnNldEJhc2VUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIGJhc2VUcmFuc2Zv
cm0pCiB7Ci0gICAgaWYgKG1fdHJhbnNmb3JtQW5pbWF0aW9uUnVubmluZykKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgaWYgKEdyYXBoaWNzTGF5ZXJRdEltcGwqIHBhcmVudCA9IHFvYmplY3Rf
Y2FzdDxHcmFwaGljc0xheWVyUXRJbXBsKj4ocGFyZW50T2JqZWN0KCkpKQotICAgICAgICByZXR1
cm4gcGFyZW50LT5pc1RyYW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcoKTsKLSAgICByZXR1cm4gZmFs
c2U7CisgICAgbV9iYXNlVHJhbnNmb3JtID0gYmFzZVRyYW5zZm9ybTsKKyAgICB1cGRhdGVUcmFu
c2Zvcm0oKTsKIH0KIAogUVBhaW50ZXJQYXRoIEdyYXBoaWNzTGF5ZXJRdEltcGw6Om9wYXF1ZUFy
ZWEoKSBjb25zdAogewogICAgIFFQYWludGVyUGF0aCBwYWludGVyUGF0aDsKKyAgICAvLyBJbiBv
cmRlciB0byBzdXBwb3J0IDNEIHdpdGggUUdyYXBoaWNzVmlldywgd2UgaGF2ZSB0byBpbnZlcnQg
M3gzIG1hdHJpY2VzOiBhbiBvcGVyYXRpb24gdGhhdCBzb21ldGltZXMgZmFpbHMuCisgICAgLy8g
QXMgYSBmYWxsYmFjaywgd2UgbWFuYWdlIHRoZSB0cmFuc2Zvcm1hdGlvbnMgaGVyZS4KKyAgICBR
VHJhbnNmb3JtIHRyYW5zZm9ybTJkID0gbV91c2VEZWZhdWx0VHJhbnNmb3JtcyA/IFFUcmFuc2Zv
cm0oKSA6IG1fY29tcHV0ZWRUcmFuc2Zvcm07CisKICAgICAvLyB3ZSB0cnkgb3V0IGJlc3QgdG8g
cmV0dXJuIHRoZSBvcGFxdWUgYXJlYSwgbWF5YmUgaXQgd2lsbCBoZWxwIGdyYXBoaWNzLXZpZXcg
cmVuZGVyIGxlc3MgaXRlbXMKICAgICBpZiAobV9jdXJyZW50Q29udGVudC5iYWNrZ3JvdW5kQ29s
b3IuaXNWYWxpZCgpICYmIG1fY3VycmVudENvbnRlbnQuYmFja2dyb3VuZENvbG9yLmFscGhhKCkg
PT0gMHhmZikKLSAgICAgICAgcGFpbnRlclBhdGguYWRkUmVjdChib3VuZGluZ1JlY3QoKSk7Cisg
ICAgICAgIHBhaW50ZXJQYXRoLmFkZFBvbHlnb24odHJhbnNmb3JtMmQubWFwKFFQb2x5Z29uRihi
b3VuZGluZ1JlY3QoKSkpKTsKICAgICBlbHNlIHsKICAgICAgICAgaWYgKG1fc3RhdGUuY29udGVu
dHNPcGFxdWUKICAgICAgICAgICAgIHx8IChtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRUeXBlID09
IENvbG9yQ29udGVudFR5cGUgJiYgbV9jdXJyZW50Q29udGVudC5jb250ZW50c0JhY2tncm91bmRD
b2xvci5hbHBoYSgpID09IDB4ZmYpCiAgICAgICAgICAgICB8fCAobV9jdXJyZW50Q29udGVudC5j
b250ZW50VHlwZSA9PSBNZWRpYUNvbnRlbnRUeXBlKQogICAgICAgICAgICAgfHwgKG1fY3VycmVu
dENvbnRlbnQuY29udGVudFR5cGUgPT0gUGl4bWFwQ29udGVudFR5cGUgJiYgIW1fY3VycmVudENv
bnRlbnQucGl4bWFwLmhhc0FscGhhKCkpKSB7CiAKLSAgICAgICAgICAgIHBhaW50ZXJQYXRoLmFk
ZFJlY3QobV9zdGF0ZS5jb250ZW50c1JlY3QpOworICAgICAgICAgICAgcGFpbnRlclBhdGguYWRk
UG9seWdvbih0cmFuc2Zvcm0yZC5tYXAoUVBvbHlnb25GKFFSZWN0RihtX3N0YXRlLmNvbnRlbnRz
UmVjdCkpKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHBhaW50ZXJQYXRoOwpAQCAt
Mzk5LDEzICs0MzEsMjAgQEAgUVBhaW50ZXJQYXRoIEdyYXBoaWNzTGF5ZXJRdEltcGw6Om9wYXF1
ZUFyZWEoKSBjb25zdAogCiBRUmVjdEYgR3JhcGhpY3NMYXllclF0SW1wbDo6Ym91bmRpbmdSZWN0
KCkgY29uc3QKIHsKLSAgICByZXR1cm4gUVJlY3RGKFFQb2ludEYoMCwgMCksIFFTaXplRihtX3Np
emUpKTsKKyAgICBRVHJhbnNmb3JtIHRyYW5zZm9ybTJkID0gbV91c2VEZWZhdWx0VHJhbnNmb3Jt
cyA/IFFUcmFuc2Zvcm0oKSA6IG1fY29tcHV0ZWRUcmFuc2Zvcm07CisgICAgcmV0dXJuIHRyYW5z
Zm9ybTJkLm1hcFJlY3QoUVJlY3RGKDAsIDAsIG1fc2l6ZS53aWR0aCgpLCBtX3NpemUuaGVpZ2h0
KCkpKTsKIH0KIAogdm9pZCBHcmFwaGljc0xheWVyUXRJbXBsOjpwYWludChRUGFpbnRlciogcGFp
bnRlciwgY29uc3QgUVN0eWxlT3B0aW9uR3JhcGhpY3NJdGVtKiBvcHRpb24sIFFXaWRnZXQqIHdp
ZGdldCkKIHsKKyAgICBpZiAoIW1fdXNlRGVmYXVsdFRyYW5zZm9ybXMpIHsKKyAgICAgICAgLy8g
SW4gb3JkZXIgdG8gc3VwcG9ydCAzRCB3aXRoIFFHcmFwaGljc1ZpZXcsIHdlIGhhdmUgdG8gaW52
ZXJ0IDN4MyBtYXRyaWNlczogYW4gb3BlcmF0aW9uIHRoYXQgc29tZXRpbWVzIGZhaWxzLgorICAg
ICAgICAvLyBBcyBhIGZhbGxiYWNrLCB3ZSBtYW5hZ2UgdGhlIHRyYW5zZm9ybWF0aW9ucyBoZXJl
LgorICAgICAgICBwYWludGVyLT5zZXRUcmFuc2Zvcm0ocm9vdExheWVyKCktPnNjZW5lVHJhbnNm
b3JtKCksIGZhbHNlKTsKKyAgICAgICAgcGFpbnRlci0+c2V0VHJhbnNmb3JtKG1fY29tcHV0ZWRU
cmFuc2Zvcm0sIHRydWUpOworICAgIH0KICAgICBpZiAobV9jdXJyZW50Q29udGVudC5iYWNrZ3Jv
dW5kQ29sb3IuaXNWYWxpZCgpKQotICAgICAgICBwYWludGVyLT5maWxsUmVjdChvcHRpb24tPnJl
Y3QsIFFDb2xvcihtX2N1cnJlbnRDb250ZW50LmJhY2tncm91bmRDb2xvcikpOworICAgICAgICBw
YWludGVyLT5maWxsUmVjdChRUmVjdEYoMCwgMCwgbV9zaXplLndpZHRoKCksIG1fc2l6ZS5oZWln
aHQoKSksIFFDb2xvcihtX2N1cnJlbnRDb250ZW50LmJhY2tncm91bmRDb2xvcikpOwogCiAgICAg
c3dpdGNoIChtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRUeXBlKSB7CiAgICAgY2FzZSBIVE1MQ29u
dGVudFR5cGU6CkBAIC00MTQsNyArNDUzLDcgQEAgdm9pZCBHcmFwaGljc0xheWVyUXRJbXBsOjpw
YWludChRUGFpbnRlciogcGFpbnRlciwgY29uc3QgUVN0eWxlT3B0aW9uR3JhcGhpY3NJdGUKICAg
ICAgICAgICAgIC8vIFdlIG1pZ2h0IG5lZWQgdG8gcmVjYWNoZSwgaW4gY2FzZSB3ZSB0cnkgdG8g
cGFpbnQgYW5kIHRoZSBjYWNoZQogICAgICAgICAgICAgLy8gd2FzIHB1cmdlZCAoZS5nLiBpZiBp
dCB3YXMgZnVsbCkuCiAgICAgICAgICAgICBpZiAoIVFQaXhtYXBDYWNoZTo6ZmluZChtX2JhY2tp
bmdTdG9yZUtleSwgJmJhY2tpbmdTdG9yZSkgfHwgYmFja2luZ1N0b3JlLnNpemUoKSAhPSBtX3Np
emUudG9TaXplKCkpCi0gICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlID0gcmVjYWNoZShRUmVn
aW9uKGJvdW5kaW5nUmVjdCgpLnRvQWxpZ25lZFJlY3QoKSkpOworICAgICAgICAgICAgICAgIGJh
Y2tpbmdTdG9yZSA9IHJlY2FjaGUoUVJlZ2lvbihtX3N0YXRlLmNvbnRlbnRzUmVjdCkpOwogICAg
ICAgICAgICAgcGFpbnRlci0+ZHJhd1BpeG1hcCgwLCAwLCBiYWNraW5nU3RvcmUpOwogICAgICAg
ICB9CiAgICAgICAgIGJyZWFrOwpAQCAtNDI4LDYgKzQ2Nyw4IEBAIHZvaWQgR3JhcGhpY3NMYXll
clF0SW1wbDo6cGFpbnQoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFTdHlsZU9wdGlvbkdyYXBo
aWNzSXRlCiAgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gcGFpbnQgYW55dGhpbmc6IHdlIGhh
dmUgYSBRR3JhcGhpY3NJdGVtIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQKICAgICAgICAgYnJlYWs7
CiAgICAgfQorCisKIH0KIAogdm9pZCBHcmFwaGljc0xheWVyUXRJbXBsOjpub3RpZnlTeW5jUmVx
dWlyZWQoKQpAQCAtNDU2LDcgKzQ5Nyw3IEBAIHZvaWQgR3JhcGhpY3NMYXllclF0SW1wbDo6Zmx1
c2hDaGFuZ2VzKGJvb2wgcmVjdXJzaXZlLCBib29sIGZvcmNlVXBkYXRlVHJhbnNmb3JtCiAgICAg
ICAgIGlmICghbV9sYXllci0+cGFyZW50KCkgJiYgIXBhcmVudEl0ZW0oKSkKICAgICAgICAgICAg
IHNldFBhcmVudEl0ZW0oMCk7CiAgICAgICAgIGVsc2UgaWYgKG1fbGF5ZXIgJiYgbV9sYXllci0+
cGFyZW50KCkgJiYgbV9sYXllci0+cGFyZW50KCktPm5hdGl2ZUxheWVyKCkgIT0gcGFyZW50SXRl
bSgpKQotICAgICAgICAgICAgc2V0UGFyZW50SXRlbShtX2xheWVyLT5wYXJlbnQoKS0+bmF0aXZl
TGF5ZXIoKSk7CisgICAgICAgICAgICAgICAgc2V0UGFyZW50SXRlbShtX2xheWVyLT5wYXJlbnQo
KS0+bmF0aXZlTGF5ZXIoKSk7CiAgICAgfQogCiAgICAgaWYgKG1fY2hhbmdlTWFzayAmIENoaWxk
cmVuQ2hhbmdlKSB7CkBAIC01MDAsOSArNTQxLDYgQEAgdm9pZCBHcmFwaGljc0xheWVyUXRJbXBs
OjpmbHVzaENoYW5nZXMoYm9vbCByZWN1cnNpdmUsIGJvb2wgZm9yY2VVcGRhdGVUcmFuc2Zvcm0K
ICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICgobV9jaGFuZ2VNYXNrICYgUG9zaXRpb25DaGFu
Z2UpICYmIChtX2xheWVyLT5wb3NpdGlvbigpICE9IG1fc3RhdGUucG9zKSkKLSAgICAgICAgc2V0
UG9zKG1fbGF5ZXItPnBvc2l0aW9uKCkueCgpLCBtX2xheWVyLT5wb3NpdGlvbigpLnkoKSk7Ci0K
ICAgICBpZiAobV9jaGFuZ2VNYXNrICYgU2l6ZUNoYW5nZSkgewogICAgICAgICBpZiAobV9sYXll
ci0+c2l6ZSgpICE9IG1fc3RhdGUuc2l6ZSkgewogICAgICAgICAgICAgcHJlcGFyZUdlb21ldHJ5
Q2hhbmdlKCk7CkBAIC01MTUsNyArNTUzLDcgQEAgdm9pZCBHcmFwaGljc0xheWVyUXRJbXBsOjpm
bHVzaENoYW5nZXMoYm9vbCByZWN1cnNpdmUsIGJvb2wgZm9yY2VVcGRhdGVUcmFuc2Zvcm0KICAg
ICAgICAgaWYgKHNjZW5lKCkpCiAgICAgICAgICAgICBzY2VuZSgpLT51cGRhdGUoKTsKIAotICAg
IGlmIChtX2NoYW5nZU1hc2sgJiAoQ2hpbGRyZW5UcmFuc2Zvcm1DaGFuZ2UgfCBQcmVzZXJ2ZXMz
RENoYW5nZSB8IFRyYW5zZm9ybUNoYW5nZSB8IEFuY2hvclBvaW50Q2hhbmdlIHwgU2l6ZUNoYW5n
ZSkpIHsKKyAgICBpZiAobV9jaGFuZ2VNYXNrICYgKENoaWxkcmVuVHJhbnNmb3JtQ2hhbmdlIHwg
UHJlc2VydmVzM0RDaGFuZ2UgfCBUcmFuc2Zvcm1DaGFuZ2UgfCBBbmNob3JQb2ludENoYW5nZSB8
IFNpemVDaGFuZ2UgfCBCYWNrZmFjZVZpc2liaWxpdHlDaGFuZ2UgfCBQb3NpdGlvbkNoYW5nZSkp
IHsKICAgICAgICAgLy8gZHVlIHRvIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB3YXkgV2Vi
Q29yZSBoYW5kbGVzIHRyYW5zZm9ybXMgYW5kIHRoZSB3YXkgUXQgaGFuZGxlcyB0cmFuc2Zvcm1z
LAogICAgICAgICAvLyBhbGwgdGhlc2UgZWxlbWVudHMgYWZmZWN0IHRoZSB0cmFuc2Zvcm1zIG9m
IGFsbCB0aGUgZGVzY2VuZGFudHMuCiAgICAgICAgIGZvcmNlVXBkYXRlVHJhbnNmb3JtID0gdHJ1
ZTsKQEAgLTU4OCw3ICs2MjYsNyBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJRdEltcGw6OmZsdXNoQ2hh
bmdlcyhib29sIHJlY3Vyc2l2ZSwgYm9vbCBmb3JjZVVwZGF0ZVRyYW5zZm9ybQogICAgICAgICB1
cGRhdGUoKTsKIAogICAgIC8vIEZJWE1FOiB0aGUgZm9sbG93aW5nIGZsYWdzIGFyZSBjdXJyZW50
bHkgbm90IGhhbmRsZWQsIGFzIHRoZXkgZG9uJ3QgaGF2ZSBhIGNsZWFyIHRlc3Qgb3IgYXJlIGlu
IGxvdyBwcmlvcml0eQotICAgIC8vIEdlb21ldHJ5T3JpZW50YXRpb25DaGFuZ2UsIENvbnRlbnRz
T3JpZW50YXRpb25DaGFuZ2UsIEJhY2tmYWNlVmlzaWJpbGl0eUNoYW5nZSwgQ2hpbGRyZW5UcmFu
c2Zvcm1DaGFuZ2UsIFByZXNlcnZlczNEQ2hhbmdlCisgICAgLy8gR2VvbWV0cnlPcmllbnRhdGlv
bkNoYW5nZSwgQ29udGVudHNPcmllbnRhdGlvbkNoYW5nZSwgUHJlc2VydmVzM0RDaGFuZ2UKIAog
ICAgIG1fc3RhdGUubWFza0xheWVyID0gbV9sYXllci0+bWFza0xheWVyKCk7CiAgICAgbV9zdGF0
ZS5wb3MgPSBtX2xheWVyLT5wb3NpdGlvbigpOwpAQCAtMTE0Miw4ICsxMTgwLDYgQEAgcHVibGlj
OgogICAgIHsKICAgICAgICAgaWYgKG1fZmlsbHNGb3J3YXJkcykKICAgICAgICAgICAgIHNldEN1
cnJlbnRUaW1lKDEpOwotICAgICAgICBlbHNlIGlmIChtX2xheWVyICYmIG1fbGF5ZXIuZGF0YSgp
LT5tX2xheWVyKQotICAgICAgICAgICAgbV9sYXllci5kYXRhKCktPnNldEJhc2VUcmFuc2Zvcm0o
bV9sYXllci5kYXRhKCktPm1fbGF5ZXItPnRyYW5zZm9ybSgpKTsKICAgICB9CiAKICAgICAvLyB0
aGUgaWRlYSBpcyB0aGF0IHdlIGxldCBXZWJDb3JlIG1hbmFnZSB0aGUgdHJhbnNmb3JtLW9wZXJh
dGlvbnMKQEAgLTExNTQsMzMgKzExOTAsMjUgQEAgcHVibGljOgogICAgIHsKICAgICAgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3JtTWF0cml4OwogCi0gICAgICAgIC8vIHNvbWV0aW1l
cyB0aGUgYW5pbWF0aW9uIHZhbHVlcyBmcm9tIFdlYkNvcmUgYXJlIG1pc2xlYWRpbmcgYW5kIHdl
IGhhdmUgdG8gdXNlIHRoZSBhY3R1YWwgbWF0cml4IGFzIHNvdXJjZQotICAgICAgICAvLyBUaGUg
TWFjIGltcGxlbWVudGF0aW9uIHNpbXBseSBkb2Vzbid0IHRyeSB0byBhY2NlbGVyYXRlIHRob3Nl
IChlLmcuIDM2MGRlZyByb3RhdGlvbiksIGJ1dCB3ZSBkby4KLSAgICAgICAgaWYgKHByb2dyZXNz
ID09IDEgfHwgIXRhcmdldE9wZXJhdGlvbnMuc2l6ZSgpIHx8IHNvdXJjZU9wZXJhdGlvbnMgPT0g
dGFyZ2V0T3BlcmF0aW9ucykgewotICAgICAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggc291
cmNlTWF0cml4OwotICAgICAgICAgICAgc291cmNlT3BlcmF0aW9ucy5hcHBseShtX2JveFNpemUs
IHNvdXJjZU1hdHJpeCk7Ci0gICAgICAgICAgICB0cmFuc2Zvcm1NYXRyaXggPSBtX3NvdXJjZU1h
dHJpeDsKLSAgICAgICAgICAgIHRyYW5zZm9ybU1hdHJpeC5ibGVuZChzb3VyY2VNYXRyaXgsIDEg
LSBwcm9ncmVzcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib29sIHZhbGlkVHJh
bnNmb3JtTGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgY29uc3QgaW50IHNvdXJjZU9wZXJhdGlv
bkNvdW50ID0gc291cmNlT3BlcmF0aW9ucy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoc291cmNl
T3BlcmF0aW9uQ291bnQpIHsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0T3BlcmF0aW9ucy5z
aXplKCkgIT0gc291cmNlT3BlcmF0aW9uQ291bnQpCi0gICAgICAgICAgICAgICAgICAgIHZhbGlk
VHJhbnNmb3JtTGlzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAg
ICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc291cmNlT3BlcmF0aW9uQ291bnQgJiYg
dmFsaWRUcmFuc2Zvcm1MaXN0czsgKytqKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFz
b3VyY2VPcGVyYXRpb25zLm9wZXJhdGlvbnMoKVtqXS0+aXNTYW1lVHlwZSgqdGFyZ2V0T3BlcmF0
aW9ucy5vcGVyYXRpb25zKClbal0pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlk
VHJhbnNmb3JtTGlzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgYm9vbCB2YWxp
ZFRyYW5zZm9ybUxpc3RzID0gdHJ1ZTsKKyAgICAgICAgY29uc3QgaW50IHNvdXJjZU9wZXJhdGlv
bkNvdW50ID0gc291cmNlT3BlcmF0aW9ucy5zaXplKCk7CisgICAgICAgIGlmIChzb3VyY2VPcGVy
YXRpb25Db3VudCkgeworICAgICAgICAgICAgaWYgKHRhcmdldE9wZXJhdGlvbnMuc2l6ZSgpICE9
IHNvdXJjZU9wZXJhdGlvbkNvdW50KQorICAgICAgICAgICAgICAgIHZhbGlkVHJhbnNmb3JtTGlz
dHMgPSBmYWxzZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVf
dCBqID0gMDsgaiA8IHNvdXJjZU9wZXJhdGlvbkNvdW50ICYmIHZhbGlkVHJhbnNmb3JtTGlzdHM7
ICsraikKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzb3VyY2VPcGVyYXRpb25zLm9wZXJhdGlv
bnMoKVtqXS0+aXNTYW1lVHlwZSgqdGFyZ2V0T3BlcmF0aW9ucy5vcGVyYXRpb25zKClbal0pKQor
ICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRUcmFuc2Zvcm1MaXN0cyA9IGZhbHNlOworICAg
ICAgICB9CiAKLSAgICAgICAgICAgIGlmICh2YWxpZFRyYW5zZm9ybUxpc3RzKSB7Ci0gICAgICAg
ICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YXJnZXRPcGVyYXRpb25zLnNpemUoKTsg
KytpKQotICAgICAgICAgICAgICAgICAgICB0YXJnZXRPcGVyYXRpb25zLm9wZXJhdGlvbnMoKVtp
XS0+YmxlbmQoc291cmNlT3BlcmF0aW9ucy5hdChpKSwgcHJvZ3Jlc3MpLT5hcHBseSh0cmFuc2Zv
cm1NYXRyaXgsIG1fYm94U2l6ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
ICAgIHRhcmdldE9wZXJhdGlvbnMuYXBwbHkobV9ib3hTaXplLCB0cmFuc2Zvcm1NYXRyaXgpOwot
ICAgICAgICAgICAgICAgIHRyYW5zZm9ybU1hdHJpeC5ibGVuZChtX3NvdXJjZU1hdHJpeCwgcHJv
Z3Jlc3MpOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAodmFsaWRUcmFuc2Zvcm1MaXN0cykg
eworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YXJnZXRPcGVyYXRpb25zLnNp
emUoKTsgKytpKQorICAgICAgICAgICAgICAgIHRhcmdldE9wZXJhdGlvbnMub3BlcmF0aW9ucygp
W2ldLT5ibGVuZChzb3VyY2VPcGVyYXRpb25zLmF0KGkpLCBwcm9ncmVzcyktPmFwcGx5KHRyYW5z
Zm9ybU1hdHJpeCwgbV9ib3hTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRh
cmdldE9wZXJhdGlvbnMuYXBwbHkobV9ib3hTaXplLCB0cmFuc2Zvcm1NYXRyaXgpOworICAgICAg
ICAgICAgdHJhbnNmb3JtTWF0cml4LmJsZW5kKG1fc291cmNlTWF0cml4LCBwcm9ncmVzcyk7CiAg
ICAgICAgIH0KKwogICAgICAgICBtX2xheWVyLmRhdGEoKS0+c2V0QmFzZVRyYW5zZm9ybSh0cmFu
c2Zvcm1NYXRyaXgpOwogICAgICAgICBpZiAobV9maWxsc0ZvcndhcmRzKQogICAgICAgICAgICAg
bV9sYXllci5kYXRhKCktPm1fbGF5ZXItPnNldFRyYW5zZm9ybShtX2xheWVyLmRhdGEoKS0+bV9i
YXNlVHJhbnNmb3JtKTsKQEAgLTExOTksNyArMTIyNywxMCBAQCBwdWJsaWM6CiAgICAgICAgICAg
ICBtX3NvdXJjZU1hdHJpeCA9IG1fbGF5ZXIuZGF0YSgpLT5tX2xheWVyLT50cmFuc2Zvcm0oKTsK
ICAgICAgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5tX3RyYW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcg
PSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlID09IFFBYnN0cmFjdEFuaW1hdGlv
bjo6U3RvcHBlZCkgeworICAgICAgICAgICAgLy8gV2UgdXBkYXRlIHRoZSB0cmFuc2Zvcm0gYmFj
ayB0byB0aGUgZGVmYXVsdC4gVGhpcyBhbHJlYWR5IHRha2VzIGZpbGwtbW9kZXMgaW50byBhY2Nv
dW50LgogICAgICAgICAgICAgbV9sYXllci5kYXRhKCktPm1fdHJhbnNmb3JtQW5pbWF0aW9uUnVu
bmluZyA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1fbGF5ZXIgJiYgbV9sYXllci5kYXRhKCkt
Pm1fbGF5ZXIpCisgICAgICAgICAgICAgICAgbV9sYXllci5kYXRhKCktPnNldEJhc2VUcmFuc2Zv
cm0obV9sYXllci5kYXRhKCktPm1fbGF5ZXItPnRyYW5zZm9ybSgpKTsKICAgICAgICAgfQogICAg
IH0KIApAQCAtMTIxNyw4ICsxMjQ4LDYgQEAgcHVibGljOgogICAgIHsKICAgICAgICAgaWYgKG1f
ZmlsbHNGb3J3YXJkcykKICAgICAgICAgICAgIHNldEN1cnJlbnRUaW1lKDEpOwotICAgICAgICBl
bHNlIGlmIChtX2xheWVyICYmIG1fbGF5ZXIuZGF0YSgpLT5tX2xheWVyKQotICAgICAgICAgICAg
bV9sYXllci5kYXRhKCktPnNldE9wYWNpdHkobV9sYXllci5kYXRhKCktPm1fbGF5ZXItPm9wYWNp
dHkoKSk7CiAgICAgfQogICAgIHZpcnR1YWwgdm9pZCBhcHBseUZyYW1lKGNvbnN0IHFyZWFsJiBm
cm9tVmFsdWUsIGNvbnN0IHFyZWFsJiB0b1ZhbHVlLCBxcmVhbCBwcm9ncmVzcykKICAgICB7CkBA
IC0xMjQwLDYgKzEyNjksMTIgQEAgcHVibGljOgogCiAgICAgICAgIGlmIChtX2xheWVyKQogICAg
ICAgICAgICAgbV9sYXllci5kYXRhKCktPm1fb3BhY2l0eUFuaW1hdGlvblJ1bm5pbmcgPSAobmV3
U3RhdGUgPT0gUUFic3RyYWN0QW5pbWF0aW9uOjpSdW5uaW5nKTsKKworICAgICAgICAvLyBJZiBz
dG9wcGVkLCB3ZSB1cGRhdGUgdGhlIG9wYWNpdHkgYmFjayB0byB0aGUgZGVmYXVsdC4gVGhpcyBh
bHJlYWR5IHRha2VzIGZpbGwtbW9kZXMgaW50byBhY2NvdW50LgorICAgICAgICBpZiAobmV3U3Rh
dGUgPT0gU3RvcHBlZCkKKyAgICAgICAgICAgIGlmIChtX2xheWVyICYmIG1fbGF5ZXIuZGF0YSgp
LT5tX2xheWVyKQorICAgICAgICAgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5zZXRPcGFjaXR5KG1f
bGF5ZXIuZGF0YSgpLT5tX2xheWVyLT5vcGFjaXR5KCkpOworCiAgICAgfQogfTsKIApAQCAtMTMw
NSw2ICsxMzQwLDggQEAgdm9pZCBHcmFwaGljc0xheWVyUXQ6OnJlbW92ZUFuaW1hdGlvbnNGb3JQ
cm9wZXJ0eShBbmltYXRlZFByb3BlcnR5SUQgaWQpCiAgICAgICAgIGlmICgqaXQpIHsKICAgICAg
ICAgICAgIEFuaW1hdGlvblF0QmFzZSogYW5pbSA9IHN0YXRpY19jYXN0PEFuaW1hdGlvblF0QmFz
ZSo+KGl0LT5kYXRhKCkpOwogICAgICAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+bV93ZWJraXRQ
cm9wZXJ0eUlEID09IGlkKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBzdG9wIHRo
ZSBhbmltYXRpb24gcmlnaHQgYXdheSwgb3IgaXQgbWlnaHQgZmxpY2tlciBiZWZvcmUgaXQncyBk
ZWxldGVkLgorICAgICAgICAgICAgICAgIGFuaW0tPnN0b3AoKTsKICAgICAgICAgICAgICAgICBh
bmltLT5kZWxldGVMYXRlcigpOwogICAgICAgICAgICAgICAgIGl0ID0gbV9pbXBsLT5tX2FuaW1h
dGlvbnMuZXJhc2UoaXQpOwogICAgICAgICAgICAgICAgIC0taXQ7CkBAIC0xMzE5LDcgKzEzNTYs
OSBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6cmVtb3ZlQW5pbWF0aW9uc0ZvcktleWZyYW1lcyhj
b25zdCBTdHJpbmcmIG5hbWUpCiAgICAgICAgIGlmICgqaXQpIHsKICAgICAgICAgICAgIEFuaW1h
dGlvblF0QmFzZSogYW5pbSA9IHN0YXRpY19jYXN0PEFuaW1hdGlvblF0QmFzZSo+KCgqaXQpLmRh
dGEoKSk7CiAgICAgICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5tX2tleWZyYW1lc05hbWUgPT0g
UVN0cmluZyhuYW1lKSkgewotICAgICAgICAgICAgICAgICgqaXQpLmRhdGEoKS0+ZGVsZXRlTGF0
ZXIoKTsKKyAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHN0b3AgdGhlIGFuaW1hdGlvbiBy
aWdodCBhd2F5LCBvciBpdCBtaWdodCBmbGlja2VyIGJlZm9yZSBpdCdzIGRlbGV0ZWQuCisgICAg
ICAgICAgICAgICAgYW5pbS0+c3RvcCgpOworICAgICAgICAgICAgICAgIGFuaW0tPmRlbGV0ZUxh
dGVyKCk7CiAgICAgICAgICAgICAgICAgaXQgPSBtX2ltcGwtPm1fYW5pbWF0aW9ucy5lcmFzZShp
dCk7CiAgICAgICAgICAgICAgICAgLS1pdDsKICAgICAgICAgICAgIH0K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54462</attachid>
            <date>2010-04-27 15:40:55 -0700</date>
            <delta_ts>2010-04-27 17:50:30 -0700</delta_ts>
            <desc>preserves-3d works with Qt!</desc>
            <filename>patch-3d.diff</filename>
            <type>text/plain</type>
            <size>22283</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZGZkMDhmYi4uMDdjZWZiMCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyNyBAQAorMjAxMC0wNC0yNyAgTm9hbSBSb3NlbnRo
YWwgIDxub2FtLnJvc2VudGhhbEBub2tpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgW1F0XSBHcmFwaGljc0xheWVyOiBwcmVzZXJ2ZXMtM2Qg
YW5kIGJhY2tmYWNlIHZpc2liaWxpdHkKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTM1MzEyCisKKyAgICAgICAgSW1wbGVtZW50IHByZXNlcnZlcy0zZCBi
eSBtYWludGFpbmluZyB0aGUgM0QgdHJhbnNmb3JtYXRpb24gaGVpcmFyY2h5IGluc2lkZSBHcmFw
aGljc0xheWVyUXQsIGFuZCBleHRyYXBvbGF0aW5nCisgICAgICAgIHRoZSByZWxhdGl2ZSBRVHJh
bnNmb3JtLiBXaGVuIHRoZSBleHRyYXBvbGF0aW9uIGZhaWxzICh1bi1pbnZlcnRpYmxlIG1hdHJp
eCkgd2UgaWdub3JlIHRoZSB0cmFuc2Zvcm1hdGlvbiBjaGFuZ2UuCisKKyAgICAgICAgV2ViS2l0
U2l0ZS9ibG9nLWZpbGVzLzNkLXRyYW5zZm9ybXMgdGVzdCBub3cgd29yayB3aXRoIFF0LgorCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0QuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmlzR0xFUzJDb21wbGlhbnQpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5ZXJRdC5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0xheWVyUXRJbXBsOjp1cGRhdGVUcmFuc2Zvcm0pOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NMYXllclF0SW1wbDo6b3BhcXVlQXJlYSk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0xheWVyUXRJbXBsOjpib3VuZGluZ1JlY3QpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NMYXllclF0SW1wbDo6cGFpbnQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NMYXllclF0SW1wbDo6Zmx1c2hDaGFuZ2VzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9xdC9NZWRpYVBsYXllclByaXZhdGVRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBs
YXllclByaXZhdGU6OnN1cHBvcnRzVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXll
clByaXZhdGU6OnRvdGFsQnl0ZXMpOgorCiAyMDEwLTA0LTI3ICBBZGFtIEJhcnRoICA8YWJhcnRo
QHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlkZWwuCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNELmNwcCBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0QuY3BwCmluZGV4IDk3NDY1
ZTIuLjk3NWYxMmMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhp
Y3NDb250ZXh0M0QuY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3ND
b250ZXh0M0QuY3BwCkBAIC0zNSw2ICszNSwxMSBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
K2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzR0xFUzJDb21wbGlhbnQoKSBjb25zdAoreworcmV0
dXJuIHRydWU7Cit9CisKIGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmV4dHJhY3RJbWFnZURhdGEo
SW1hZ2UqIGltYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBi
b29sIGZsaXBZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29s
IHByZW11bHRpcGx5QWxwaGEsCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3F0L0dyYXBoaWNzTGF5ZXJRdC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dy
YXBoaWNzTGF5ZXJRdC5jcHAKaW5kZXggYTMxZDA0NS4uYWE0YjA5ZSAxMDA2NDQKLS0tIGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0xheWVyUXQuY3BwCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0LmNwcApAQCAtMzIsMTQgKzMy
LDExIEBACiAjaW5jbHVkZSA8UXRDb3JlL3FtZXRhb2JqZWN0Lmg+CiAjaW5jbHVkZSA8UXRDb3Jl
L3FzZXQuaD4KICNpbmNsdWRlIDxRdENvcmUvcXRpbWVyLmg+Ci0jaW5jbHVkZSA8UXRHdWkvcWJp
dG1hcC5oPgogI2luY2x1ZGUgPFF0R3VpL3Fjb2xvci5oPgogI2luY2x1ZGUgPFF0R3VpL3FncmFw
aGljc2VmZmVjdC5oPgogI2luY2x1ZGUgPFF0R3VpL3FncmFwaGljc2l0ZW0uaD4KICNpbmNsdWRl
IDxRdEd1aS9xZ3JhcGhpY3NzY2VuZS5oPgotI2luY2x1ZGUgPFF0R3VpL3FtYXRyaXg0eDQuaD4K
ICNpbmNsdWRlIDxRdEd1aS9xcGFpbnRlci5oPgotI2luY2x1ZGUgPFF0R3VpL3FwYWxldHRlLmg+
CiAjaW5jbHVkZSA8UXRHdWkvcXBpeG1hcC5oPgogI2luY2x1ZGUgPFF0R3VpL3FwaXhtYXBjYWNo
ZS5oPgogI2luY2x1ZGUgPFF0R3VpL3FzdHlsZW9wdGlvbi5oPgpAQCAtMTM1LDYgKzEzMiw4IEBA
IHB1YmxpYzoKICAgICAvLyB0aGUgY29tcG9zaXRvciBsZXRzIHVzIHNwZWNpYWwtY2FzZSBpbWFn
ZXMgYW5kIGNvbG9ycywgc28gd2UgdHJ5IHRvIGRvIHNvCiAgICAgZW51bSBTdGF0aWNDb250ZW50
VHlwZSB7IEhUTUxDb250ZW50VHlwZSwgUGl4bWFwQ29udGVudFR5cGUsIENvbG9yQ29udGVudFR5
cGUsIE1lZGlhQ29udGVudFR5cGV9OwogCisgICAgY29uc3QgR3JhcGhpY3NMYXllclF0SW1wbCog
cm9vdExheWVyKCkgY29uc3Q7CisKICAgICBHcmFwaGljc0xheWVyUXRJbXBsKEdyYXBoaWNzTGF5
ZXJRdCogbmV3TGF5ZXIpOwogICAgIHZpcnR1YWwgfkdyYXBoaWNzTGF5ZXJRdEltcGwoKTsKIApA
QCAtMTQzLDkgKzE0Miw4IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFFSZWN0RiBib3VuZGluZ1Jl
Y3QoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUVBhaW50ZXIqLCBjb25zdCBRU3R5
bGVPcHRpb25HcmFwaGljc0l0ZW0qLCBRV2lkZ2V0Kik7CiAKLSAgICAvLyB3ZSBtYW5hZ2UgdHJh
bnNmb3JtcyBvdXJzZWx2ZXMgYmVjYXVzZSB0cmFuc2Zvcm0tb3JpZ2luIGFjdHMgZGlmZmVyZW50
bHkgaW4gd2Via2l0IGFuZCBpbiBRdAorICAgIC8vIFdlIG1hbmFnZSB0cmFuc2Zvcm1zIG91cnNl
bHZlcyBiZWNhdXNlIHRyYW5zZm9ybS1vcmlnaW4gYWN0cyBkaWZmZXJlbnRseSBpbiB3ZWJraXQg
YW5kIGluIFF0LCBhbmQgd2UgbmVlZCBpdCBhcyBhIGZhbGxiYWNrIGluIGNhc2Ugd2UgZW5jb3Vu
dGVyIGFuIHVuLWludmVydGlibGUgbWF0cml4CiAgICAgdm9pZCBzZXRCYXNlVHJhbnNmb3JtKGNv
bnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4Jik7Ci0gICAgUVRyYW5zZm9ybSBjb21wdXRlVHJhbnNm
b3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBiYXNlVHJhbnNmb3JtKSBjb25zdDsKICAg
ICB2b2lkIHVwZGF0ZVRyYW5zZm9ybSgpOwogCiAgICAgLy8gbGV0IHRoZSBjb21wb3NpdG9yLUFQ
SSB0ZWxsIHVzIHdoaWNoIHByb3BlcnRpZXMgd2VyZSBjaGFuZ2VkCkBAIC0xNjMsMTAgKzE2MSw2
IEBAIHB1YmxpYzoKICAgICAvLyBvciBDaHJvbWVDbGllbnRRdDo6c2NoZWR1bGVDb21wb3NpdGlu
Z0xheWVyU3luYyAobWVhbmluZyB0aGUgc3luYyB3aWxsIGhhcHBlbiBBU0FQKQogICAgIHZvaWQg
Zmx1c2hDaGFuZ2VzKGJvb2wgcmVjdXJzaXZlID0gdHJ1ZSwgYm9vbCBmb3JjZVRyYW5zZm9ybVVw
ZGF0ZSA9IGZhbHNlKTsKIAotICAgIC8vIG9wdGltaXphdGlvbjogcmV0dXJucyB0cnVlIGlmIHRo
aXMgb3IgYW4gYW5jZXN0b3IgaGFzIGEgdHJhbnNmb3JtIGFuaW1hdGlvbiBydW5uaW5nLgotICAg
IC8vIHRoaXMgZW5hYmxlcyB1cyB0byB1c2UgSXRlbUNvb3JkaW5hdGVzQ2FjaGUgd2hpbGUgdGhl
IGFuaW1hdGlvbiBpcyBydW5uaW5nLCBvdGhlcndpc2Ugd2UgaGF2ZSB0byByZWNhY2hlIGZvciBl
dmVyeSBmcmFtZQotICAgIGJvb2wgaXNUcmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nKCkgY29uc3Q7
Ci0KIHB1YmxpYyBzbG90czoKICAgICAvLyB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgY2xpZW50IChh
a2EgdGhlIGxheWVyIGNvbXBvc2l0b3IpIHdoZW4gdGhlIGFuaW1hdGlvbiBhY3R1YWxseSBzdGFy
dHMKICAgICB2b2lkIG5vdGlmeUFuaW1hdGlvblN0YXJ0ZWQoKTsKQEAgLTE4Miw2ICsxNzYsNyBA
QCBwdWJsaWM6CiAgICAgR3JhcGhpY3NMYXllclF0KiBtX2xheWVyOwogCiAgICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXggbV9iYXNlVHJhbnNmb3JtOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1f
dHJhbnNmb3JtUmVsYXRpdmVUb1Jvb3RMYXllcjsKICAgICBib29sIG1fdHJhbnNmb3JtQW5pbWF0
aW9uUnVubmluZzsKICAgICBib29sIG1fb3BhY2l0eUFuaW1hdGlvblJ1bm5pbmc7CiAgICAgUVdl
YWtQb2ludGVyPE1hc2tFZmZlY3RRdD4gbV9tYXNrRWZmZWN0OwpAQCAtMjg4LDYgKzI4MywxNSBA
QCBHcmFwaGljc0xheWVyUXRJbXBsOjp+R3JhcGhpY3NMYXllclF0SW1wbCgpCiAjZW5kaWYKIH0K
IAorY29uc3QgR3JhcGhpY3NMYXllclF0SW1wbCogR3JhcGhpY3NMYXllclF0SW1wbDo6cm9vdExh
eWVyKCkgY29uc3QKK3sKKyAgICBpZiAoY29uc3QgR3JhcGhpY3NMYXllclF0SW1wbCogcGFyZW50
ID0gcW9iamVjdF9jYXN0PGNvbnN0IEdyYXBoaWNzTGF5ZXJRdEltcGwqPihwYXJlbnRPYmplY3Qo
KSkpCisgICAgICAgIHJldHVybiBwYXJlbnQtPnJvb3RMYXllcigpOworICAgIGVsc2UKKyAgICAg
ICAgcmV0dXJuIHRoaXM7Cit9CisKKwogCiBRUGl4bWFwIEdyYXBoaWNzTGF5ZXJRdEltcGw6OnJl
Y2FjaGUoY29uc3QgUVJlZ2lvbiYgcmVnaW9uVG9VcGRhdGUpCiB7CkBAIC0yOTksNyArMzAzLDcg
QEAgUVBpeG1hcCBHcmFwaGljc0xheWVyUXRJbXBsOjpyZWNhY2hlKGNvbnN0IFFSZWdpb24mIHJl
Z2lvblRvVXBkYXRlKQogCiAgICAgLy8gV2UgbWlnaHQgYmUgZHJhd2luZyBpbnRvIGFuIGV4aXN0
aW5nIGNhY2hlLgogICAgIGlmICghUVBpeG1hcENhY2hlOjpmaW5kKG1fYmFja2luZ1N0b3JlS2V5
LCAmcGl4bWFwKSkKLSAgICAgICAgcmVnaW9uID0gUVJlZ2lvbihib3VuZGluZ1JlY3QoKS50b0Fs
aWduZWRSZWN0KCkpOworICAgICAgICByZWdpb24gPSBRUmVnaW9uKFFSZWN0KDAsIDAsIG1fc2l6
ZS53aWR0aCgpLCBtX3NpemUuaGVpZ2h0KCkpKTsKIAogICAgIGlmIChtX3NpemUgIT0gcGl4bWFw
LnNpemUoKSkgewogICAgICAgICBwaXhtYXAgPSBRUGl4bWFwKG1fc2l6ZS50b1NpemUoKSk7CkBA
IC0zMjUsNjMgKzMyOSw5MyBAQCBRUGl4bWFwIEdyYXBoaWNzTGF5ZXJRdEltcGw6OnJlY2FjaGUo
Y29uc3QgUVJlZ2lvbiYgcmVnaW9uVG9VcGRhdGUpCiAKIHZvaWQgR3JhcGhpY3NMYXllclF0SW1w
bDo6dXBkYXRlVHJhbnNmb3JtKCkKIHsKLSAgICBzZXRCYXNlVHJhbnNmb3JtKGlzVHJhbnNmb3Jt
QW5pbWF0aW9uUnVubmluZygpID8gbV9iYXNlVHJhbnNmb3JtIDogbV9sYXllci0+dHJhbnNmb3Jt
KCkpOwotfQorICAgIGlmICghbV90cmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nKQorICAgICAgICBt
X2Jhc2VUcmFuc2Zvcm0gPSBtX2xheWVyLT50cmFuc2Zvcm0oKTsKIAotdm9pZCBHcmFwaGljc0xh
eWVyUXRJbXBsOjpzZXRCYXNlVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBi
YXNlVHJhbnNmb3JtKQotewotICAgIG1fYmFzZVRyYW5zZm9ybSA9IGJhc2VUcmFuc2Zvcm07Ci0g
ICAgc2V0VHJhbnNmb3JtKGNvbXB1dGVUcmFuc2Zvcm0oYmFzZVRyYW5zZm9ybSkpOwotfQorICAg
IFRyYW5zZm9ybWF0aW9uTWF0cml4IGxvY2FsVHJhbnNmb3JtOwogCi1RVHJhbnNmb3JtIEdyYXBo
aWNzTGF5ZXJRdEltcGw6OmNvbXB1dGVUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRy
aXgmIGJhc2VUcmFuc2Zvcm0pIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2xheWVyKQotICAgICAgICBy
ZXR1cm4gYmFzZVRyYW5zZm9ybTsKLQotICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGNvbXB1dGVk
VHJhbnNmb3JtOwotCi0gICAgLy8gVGhlIG9yaWdpbiBmb3IgY2hpbGRyZW5UcmFuc2Zvcm0gaXMg
YWx3YXlzIHRoZSBjZW50ZXIgb2YgdGhlIGFuY2VzdG9yIHdoaWNoIGNvbnRhaW5zIHRoZSBjaGls
ZHJlblRyYW5zZm9ybS4KLSAgICAvLyB0aGlzIGhhcyB0byBkbyB3aXRoIGhvdyBXZWJDb3JlIGlt
cGxlbWVudHMgLXdlYmtpdC1wZXJzcGVjdGl2ZSBhbmQgLXdlYmtpdC1wZXJzcGVjdGl2ZS1vcmln
aW4sIHdoaWNoIGFyZSB0aGUgQ1NTCi0gICAgLy8gYXR0cmlidXRlIHRoYXQgY2FsbCBzZXRDaGls
ZHJlblRyYW5zZm9ybQotICAgIFFQb2ludEYgb2Zmc2V0ID0gLXBvcygpIC0gYm91bmRpbmdSZWN0
KCkuYm90dG9tUmlnaHQoKSAvIDI7Ci0KLSAgICBmb3IgKGNvbnN0IEdyYXBoaWNzTGF5ZXJRdElt
cGwqIGFuY2VzdG9yID0gdGhpczsgKGFuY2VzdG9yID0gcW9iamVjdF9jYXN0PEdyYXBoaWNzTGF5
ZXJRdEltcGwqPihhbmNlc3Rvci0+cGFyZW50T2JqZWN0KCkpKTsgKSB7Ci0gICAgICAgIGlmICgh
YW5jZXN0b3ItPm1fc3RhdGUuY2hpbGRyZW5UcmFuc2Zvcm0uaXNJZGVudGl0eSgpKSB7Ci0gICAg
ICAgICAgICBjb25zdCBRUG9pbnRGIG9mZnNldCA9IG1hcEZyb21JdGVtKGFuY2VzdG9yLCBRUG9p
bnRGKGFuY2VzdG9yLT5tX3NpemUud2lkdGgoKSAvIDIsIGFuY2VzdG9yLT5tX3NpemUuaGVpZ2h0
KCkgLyAyKSk7Ci0gICAgICAgICAgICBjb21wdXRlZFRyYW5zZm9ybQotICAgICAgICAgICAgICAg
IC50cmFuc2xhdGUob2Zmc2V0LngoKSwgb2Zmc2V0LnkoKSkKLSAgICAgICAgICAgICAgICAubXVs
dExlZnQoYW5jZXN0b3ItPm1fc3RhdGUuY2hpbGRyZW5UcmFuc2Zvcm0pCi0gICAgICAgICAgICAg
ICAgLnRyYW5zbGF0ZSgtb2Zmc2V0LngoKSwgLW9mZnNldC55KCkpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIH0KLSAgICB9CisgICAgR3JhcGhpY3NMYXllclF0SW1wbCogcGFyZW50ID0g
cW9iamVjdF9jYXN0PEdyYXBoaWNzTGF5ZXJRdEltcGwqPihwYXJlbnRPYmplY3QoKSk7CiAKICAg
ICAvLyB3ZWJraXQgaGFzIHJlbGF0aXZlLXRvLXNpemUgb3JpZ2luUG9pbnQsIGdyYXBoaWNzLXZp
ZXcgaGFzIGEgcGl4ZWwgb3JpZ2luUG9pbnQsIGhlcmUgd2UgY29udmVydAogICAgIC8vIHdlIGhh
dmUgdG8gbWFuYWdlIHRoaXMgb3Vyc2VsdmVzIGJlY2F1c2UgUUdyYXBoaWNzVmlldydzIHRyYW5z
Zm9ybU9yaWdpbiBpcyBpbmNvbXBhdGlibGUKICAgICBjb25zdCBxcmVhbCBvcmlnaW5YID0gbV9z
dGF0ZS5hbmNob3JQb2ludC54KCkgKiBtX3NpemUud2lkdGgoKTsKICAgICBjb25zdCBxcmVhbCBv
cmlnaW5ZID0gbV9zdGF0ZS5hbmNob3JQb2ludC55KCkgKiBtX3NpemUuaGVpZ2h0KCk7Ci0gICAg
Y29tcHV0ZWRUcmFuc2Zvcm0KLSAgICAgICAgICAgIC50cmFuc2xhdGUzZChvcmlnaW5YLCBvcmln
aW5ZLCBtX3N0YXRlLmFuY2hvclBvaW50LnooKSkKLSAgICAgICAgICAgIC5tdWx0TGVmdChiYXNl
VHJhbnNmb3JtKQorCisgICAgLy8gV2UgaWdub3JlIFFHcmFwaGljc0l0ZW06OnBvcyBjb21wbGV0
ZWx5LCBhbmQgdXNlIG9ubHkgdHJhbnNmb3JtcyAtIGJlY2F1c2Ugd2UgaGF2ZSB0byBtYWludGFp
biB0aGF0IG91cnNlbHZlcyBmb3IgM0QuCisgICAgbG9jYWxUcmFuc2Zvcm0KKyAgICAgICAgICAg
IC50cmFuc2xhdGUzZChvcmlnaW5YICsgbV9zdGF0ZS5wb3MueCgpLCBvcmlnaW5ZICsgbV9zdGF0
ZS5wb3MueSgpLCBtX3N0YXRlLmFuY2hvclBvaW50LnooKSkKKyAgICAgICAgICAgIC5tdWx0TGVm
dChtX2Jhc2VUcmFuc2Zvcm0pCiAgICAgICAgICAgICAudHJhbnNsYXRlM2QoLW9yaWdpblgsIC1v
cmlnaW5ZLCAtbV9zdGF0ZS5hbmNob3JQb2ludC56KCkpOwogCi0gICAgLy8gbm93IHdlIHByb2pl
Y3QgdG8gMkQKLSAgICByZXR1cm4gUVRyYW5zZm9ybShjb21wdXRlZFRyYW5zZm9ybSk7CisgICAg
Ly8gVGhpcyBpcyB0aGUgYWN0dWFsIDNEIHRyYW5zZm9ybSBvZiB0aGlzIGl0ZW0sIHdpdGggdGhl
IGFuY2VzdG9ycycgdHJhbnNmb3JtIGJha2VkIGluLgorICAgIG1fdHJhbnNmb3JtUmVsYXRpdmVU
b1Jvb3RMYXllciA9IFRyYW5zZm9ybWF0aW9uTWF0cml4KHBhcmVudCA/IHBhcmVudC0+bV90cmFu
c2Zvcm1SZWxhdGl2ZVRvUm9vdExheWVyIDogVHJhbnNmb3JtYXRpb25NYXRyaXgoKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm11bHRMZWZ0KGxvY2FsVHJhbnNm
b3JtKTsKKworICAgIC8vIE5vdyB3ZSBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBkZXRlcm1p
bmUgaWYgdGhlIGxheWVyIGlzIGZhY2luZyBiYWNrd2FyZHMuCisgICAgaWYoIW1fc3RhdGUuYmFj
a2ZhY2VWaXNpYmlsaXR5ICYmIG1fdHJhbnNmb3JtUmVsYXRpdmVUb1Jvb3RMYXllci5pbnZlcnNl
KCkubTMzKCkgPCAwKSB7CisgICAgICAgIHNldFZpc2libGUoZmFsc2UpOworICAgICAgICAvLyBO
byBwb2ludCBpbiBtYWtpbmcgZXh0cmEgY2FsY3VsYXRpb25zIGZvciBpbnZpc2libGUgZWxlbWVu
dHMuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBTaW1wbGlzdGljIGRlcHRoIHRl
c3QgLSB3ZSBzdGFjayB0aGUgaXRlbSBiZWhpbmQgaXRzIHBhcmVudCBpZiBpdHMgY29tcHV0ZWQg
eiBpcyBsb3dlciB0aGFuIHRoZSBwYXJlbnQncyBjb21wdXRlZCB6IGF0IHRoZSBpdGVtJ3MgY2Vu
dGVyIHBvaW50LgorICAgIGlmIChwYXJlbnQpIHsKKyAgICAgICAgY29uc3QgUVBvaW50RiBjZW50
ZXJQb2ludE1hcHBlZFRvUm9vdCA9IHJvb3RMYXllcigpLT5tYXBGcm9tSXRlbSh0aGlzLCBtX3Np
emUud2lkdGgoKSAvIDIsIG1fc2l6ZS5oZWlnaHQoKSAvIDIpOworICAgICAgICBzZXRGbGFnKEl0
ZW1TdGFja3NCZWhpbmRQYXJlbnQsCisgICAgICAgICAgICAgICAgbV90cmFuc2Zvcm1SZWxhdGl2
ZVRvUm9vdExheWVyLm1hcFBvaW50KEZsb2F0UG9pbnQzRChjZW50ZXJQb2ludE1hcHBlZFRvUm9v
dC54KCksIGNlbnRlclBvaW50TWFwcGVkVG9Sb290LnkoKSwgMCkpLnooKSA8CisgICAgICAgICAg
ICAgICAgcGFyZW50LT5tX3RyYW5zZm9ybVJlbGF0aXZlVG9Sb290TGF5ZXIubWFwUG9pbnQoRmxv
YXRQb2ludDNEKGNlbnRlclBvaW50TWFwcGVkVG9Sb290LngoKSwgY2VudGVyUG9pbnRNYXBwZWRU
b1Jvb3QueSgpLCAwKSkueigpKTsKKyAgICB9CisKKyAgICAvLyBUaGUgaXRlbSBpcyBmcm9udC1m
YWNpbmcgb3IgYmFja2ZhY2UtdmlzaWJpbGl0eSBpcyBvbi4KKyAgICBzZXRWaXNpYmxlKHRydWUp
OworCisgICAgLy8gRmxhdHRlbiB0byAyRC1zcGFjZSBvZiB0aGlzIGl0ZW0gaWYgaXQgZG9lc24n
dCBwcmVzZXJ2ZSAzRC4KKyAgICBpZiAoIW1fc3RhdGUucHJlc2VydmVzM0QpIHsKKyAgICAgICAg
bV90cmFuc2Zvcm1SZWxhdGl2ZVRvUm9vdExheWVyLnNldE0xMygwKTsKKyAgICAgICAgbV90cmFu
c2Zvcm1SZWxhdGl2ZVRvUm9vdExheWVyLnNldE0yMygwKTsKKyAgICAgICAgbV90cmFuc2Zvcm1S
ZWxhdGl2ZVRvUm9vdExheWVyLnNldE0zMSgwKTsKKyAgICAgICAgbV90cmFuc2Zvcm1SZWxhdGl2
ZVRvUm9vdExheWVyLnNldE0zMigwKTsKKyAgICAgICAgbV90cmFuc2Zvcm1SZWxhdGl2ZVRvUm9v
dExheWVyLnNldE0zMygxKTsKKyAgICAgICAgbV90cmFuc2Zvcm1SZWxhdGl2ZVRvUm9vdExheWVy
LnNldE0zNCgwKTsKKyAgICAgICAgbV90cmFuc2Zvcm1SZWxhdGl2ZVRvUm9vdExheWVyLnNldE00
MygwKTsKKyAgICB9CisKKyAgICAvLyBBcHBseSBwZXJzcGVjdGl2ZSBmb3IgdGhlIHVzZSBvZiB0
aGlzIGl0ZW0ncyBjaGlsZHJlbi4gUGVyc3BlY3RpdmUgaXMgYWx3YXlzIGFwcGxpZWQgZnJvbSB0
aGUgaXRlbSdzIGNlbnRlci4KKyAgICBpZiAoIW1fc3RhdGUuY2hpbGRyZW5UcmFuc2Zvcm0uaXNJ
ZGVudGl0eSgpKQorICAgICAgICBtX3RyYW5zZm9ybVJlbGF0aXZlVG9Sb290TGF5ZXIKKyAgICAg
ICAgICAgIC50cmFuc2xhdGUobV9zaXplLndpZHRoKCkgLyAyLCBtX3NpemUuaGVpZ2h0KCkgLzIp
CisgICAgICAgICAgICAubXVsdExlZnQobV9zdGF0ZS5jaGlsZHJlblRyYW5zZm9ybSkKKyAgICAg
ICAgICAgIC50cmFuc2xhdGUoLW1fc2l6ZS53aWR0aCgpIC8gMiwgLW1fc2l6ZS5oZWlnaHQoKSAv
Mik7CisKKyAgICBib29sIGludmVyc2VPayA9IHRydWU7CisgICAgLy8gVXNlIFFUcmFuc2Zvcm06
OmludmVyc2UgdG8gZXh0cmFwb2xhdGUgdGhlIHJlbGF0aXZlIHRyYW5zZm9ybSBvZiB0aGlzIGl0
ZW0sIGJhc2VkIG9uIHRoZSBwYXJlbnQncyB0cmFuc2Zvcm0gcmVsYXRpdmUgdG8KKyAgICAvLyB0
aGUgcm9vdCBsYXllciBhbmQgdGhlIGRlc2lyZWQgdHJhbnNmb3JtIGZvciB0aGlzIGl0ZW0gcmVs
YXRpdmUgdG8gdGhlIHJvb3QgbGF5ZXIuCisgICAgY29uc3QgUVRyYW5zZm9ybSBwYXJlbnRUcmFu
c2Zvcm0gPSBwYXJlbnQgPyBwYXJlbnQtPml0ZW1UcmFuc2Zvcm0ocm9vdExheWVyKCkpIDogUVRy
YW5zZm9ybSgpOworICAgIGNvbnN0IFFUcmFuc2Zvcm0gdHJhbnNmb3JtMkQgPSBRVHJhbnNmb3Jt
KG1fdHJhbnNmb3JtUmVsYXRpdmVUb1Jvb3RMYXllcikgKiBwYXJlbnRUcmFuc2Zvcm0uaW52ZXJ0
ZWQoJmludmVyc2VPayk7CisKKyAgICAvLyBJbiByYXJlIGNhc2VzIHRoZSB0cmFuc2Zvcm1hdGlv
biBjYW5ub3QgYmUgaW52ZXJzZWQgLSBpbiB0aGF0IGNhc2Ugd2UgZG9uJ3QgYXBwbHkgdGhlIHRy
YW5zZm9ybWF0aW9uIGF0IGFsbCwgb3RoZXJ3aXNlIHdlJ2QgZmxpY2tlci4KKyAgICAvLyBGSVhN
RTogVGhpcyBzaG91bGQgYmUgYW1lbmRlZCB3aGVuIFF0IG1vdmVzIHRvIGEgcmVhbCAzRCBzY2Vu
ZS1ncmFwaC4KKyAgICBpZiAoIWludmVyc2VPaykKKyAgICAgICAgcmV0dXJuOworCisgICAgc2V0
VHJhbnNmb3JtKHRyYW5zZm9ybTJEKTsKKworICAgIGNvbnN0IFFMaXN0PFFHcmFwaGljc0l0ZW0q
PiBjaGlsZHJlbiA9IGNoaWxkSXRlbXMoKTsKKyAgICBmb3IgKFFMaXN0PFFHcmFwaGljc0l0ZW0q
Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5iZWdpbigpOyBpdCAhPSBjaGlsZHJlbi5l
bmQoKTsgKytpdCkKKyAgICAgICAgaWYgKEdyYXBoaWNzTGF5ZXJRdEltcGwqIGxheWVyPSBxb2Jq
ZWN0X2Nhc3Q8R3JhcGhpY3NMYXllclF0SW1wbCo+KCgqaXQpLT50b0dyYXBoaWNzT2JqZWN0KCkp
KQorICAgICAgICAgICAgbGF5ZXItPnVwZGF0ZVRyYW5zZm9ybSgpOwogfQogCi1ib29sIEdyYXBo
aWNzTGF5ZXJRdEltcGw6OmlzVHJhbnNmb3JtQW5pbWF0aW9uUnVubmluZygpIGNvbnN0Cit2b2lk
IEdyYXBoaWNzTGF5ZXJRdEltcGw6OnNldEJhc2VUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRp
b25NYXRyaXgmIGJhc2VUcmFuc2Zvcm0pCiB7Ci0gICAgaWYgKG1fdHJhbnNmb3JtQW5pbWF0aW9u
UnVubmluZykKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKEdyYXBoaWNzTGF5ZXJRdElt
cGwqIHBhcmVudCA9IHFvYmplY3RfY2FzdDxHcmFwaGljc0xheWVyUXRJbXBsKj4ocGFyZW50T2Jq
ZWN0KCkpKQotICAgICAgICByZXR1cm4gcGFyZW50LT5pc1RyYW5zZm9ybUFuaW1hdGlvblJ1bm5p
bmcoKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgbV9iYXNlVHJhbnNmb3JtID0gYmFzZVRyYW5z
Zm9ybTsKKyAgICB1cGRhdGVUcmFuc2Zvcm0oKTsKIH0KIAogUVBhaW50ZXJQYXRoIEdyYXBoaWNz
TGF5ZXJRdEltcGw6Om9wYXF1ZUFyZWEoKSBjb25zdAogewogICAgIFFQYWludGVyUGF0aCBwYWlu
dGVyUGF0aDsKKwogICAgIC8vIHdlIHRyeSBvdXQgYmVzdCB0byByZXR1cm4gdGhlIG9wYXF1ZSBh
cmVhLCBtYXliZSBpdCB3aWxsIGhlbHAgZ3JhcGhpY3MtdmlldyByZW5kZXIgbGVzcyBpdGVtcwog
ICAgIGlmIChtX2N1cnJlbnRDb250ZW50LmJhY2tncm91bmRDb2xvci5pc1ZhbGlkKCkgJiYgbV9j
dXJyZW50Q29udGVudC5iYWNrZ3JvdW5kQ29sb3IuYWxwaGEoKSA9PSAweGZmKQogICAgICAgICBw
YWludGVyUGF0aC5hZGRSZWN0KGJvdW5kaW5nUmVjdCgpKTsKQEAgLTQxMSwxMCArNDQ1LDkgQEAg
dm9pZCBHcmFwaGljc0xheWVyUXRJbXBsOjpwYWludChRUGFpbnRlciogcGFpbnRlciwgY29uc3Qg
UVN0eWxlT3B0aW9uR3JhcGhpY3NJdGUKICAgICBjYXNlIEhUTUxDb250ZW50VHlwZToKICAgICAg
ICAgaWYgKG1fc3RhdGUuZHJhd3NDb250ZW50KSB7CiAgICAgICAgICAgICBRUGl4bWFwIGJhY2tp
bmdTdG9yZTsKLSAgICAgICAgICAgIC8vIFdlIG1pZ2h0IG5lZWQgdG8gcmVjYWNoZSwgaW4gY2Fz
ZSB3ZSB0cnkgdG8gcGFpbnQgYW5kIHRoZSBjYWNoZQotICAgICAgICAgICAgLy8gd2FzIHB1cmdl
ZCAoZS5nLiBpZiBpdCB3YXMgZnVsbCkuCisgICAgICAgICAgICAvLyBXZSBtaWdodCBuZWVkIHRv
IHJlY2FjaGUsIGluIGNhc2Ugd2UgdHJ5IHRvIHBhaW50IGFuZCB0aGUgY2FjaGUgd2FzIHB1cmdl
ZCAoZS5nLiBpZiBpdCB3YXMgZnVsbCkuCiAgICAgICAgICAgICBpZiAoIVFQaXhtYXBDYWNoZTo6
ZmluZChtX2JhY2tpbmdTdG9yZUtleSwgJmJhY2tpbmdTdG9yZSkgfHwgYmFja2luZ1N0b3JlLnNp
emUoKSAhPSBtX3NpemUudG9TaXplKCkpCi0gICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlID0g
cmVjYWNoZShRUmVnaW9uKGJvdW5kaW5nUmVjdCgpLnRvQWxpZ25lZFJlY3QoKSkpOworICAgICAg
ICAgICAgICAgIGJhY2tpbmdTdG9yZSA9IHJlY2FjaGUoUVJlZ2lvbihtX3N0YXRlLmNvbnRlbnRz
UmVjdCkpOwogICAgICAgICAgICAgcGFpbnRlci0+ZHJhd1BpeG1hcCgwLCAwLCBiYWNraW5nU3Rv
cmUpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtNTAwLDkgKzUzMyw2IEBAIHZvaWQg
R3JhcGhpY3NMYXllclF0SW1wbDo6Zmx1c2hDaGFuZ2VzKGJvb2wgcmVjdXJzaXZlLCBib29sIGZv
cmNlVXBkYXRlVHJhbnNmb3JtCiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoKG1fY2hhbmdl
TWFzayAmIFBvc2l0aW9uQ2hhbmdlKSAmJiAobV9sYXllci0+cG9zaXRpb24oKSAhPSBtX3N0YXRl
LnBvcykpCi0gICAgICAgIHNldFBvcyhtX2xheWVyLT5wb3NpdGlvbigpLngoKSwgbV9sYXllci0+
cG9zaXRpb24oKS55KCkpOwotCiAgICAgaWYgKG1fY2hhbmdlTWFzayAmIFNpemVDaGFuZ2UpIHsK
ICAgICAgICAgaWYgKG1fbGF5ZXItPnNpemUoKSAhPSBtX3N0YXRlLnNpemUpIHsKICAgICAgICAg
ICAgIHByZXBhcmVHZW9tZXRyeUNoYW5nZSgpOwpAQCAtNTE1LDcgKzU0NSw3IEBAIHZvaWQgR3Jh
cGhpY3NMYXllclF0SW1wbDo6Zmx1c2hDaGFuZ2VzKGJvb2wgcmVjdXJzaXZlLCBib29sIGZvcmNl
VXBkYXRlVHJhbnNmb3JtCiAgICAgICAgIGlmIChzY2VuZSgpKQogICAgICAgICAgICAgc2NlbmUo
KS0+dXBkYXRlKCk7CiAKLSAgICBpZiAobV9jaGFuZ2VNYXNrICYgKENoaWxkcmVuVHJhbnNmb3Jt
Q2hhbmdlIHwgUHJlc2VydmVzM0RDaGFuZ2UgfCBUcmFuc2Zvcm1DaGFuZ2UgfCBBbmNob3JQb2lu
dENoYW5nZSB8IFNpemVDaGFuZ2UpKSB7CisgICAgaWYgKG1fY2hhbmdlTWFzayAmIChDaGlsZHJl
blRyYW5zZm9ybUNoYW5nZSB8IFByZXNlcnZlczNEQ2hhbmdlIHwgVHJhbnNmb3JtQ2hhbmdlIHwg
QW5jaG9yUG9pbnRDaGFuZ2UgfCBTaXplQ2hhbmdlIHwgQmFja2ZhY2VWaXNpYmlsaXR5Q2hhbmdl
IHwgUG9zaXRpb25DaGFuZ2UpKSB7CiAgICAgICAgIC8vIGR1ZSB0byB0aGUgZGlmZmVyZW5jZXMg
YmV0d2VlbiB0aGUgd2F5IFdlYkNvcmUgaGFuZGxlcyB0cmFuc2Zvcm1zIGFuZCB0aGUgd2F5IFF0
IGhhbmRsZXMgdHJhbnNmb3JtcywKICAgICAgICAgLy8gYWxsIHRoZXNlIGVsZW1lbnRzIGFmZmVj
dCB0aGUgdHJhbnNmb3JtcyBvZiBhbGwgdGhlIGRlc2NlbmRhbnRzLgogICAgICAgICBmb3JjZVVw
ZGF0ZVRyYW5zZm9ybSA9IHRydWU7CkBAIC01ODcsOSArNjE3LDYgQEAgdm9pZCBHcmFwaGljc0xh
eWVyUXRJbXBsOjpmbHVzaENoYW5nZXMoYm9vbCByZWN1cnNpdmUsIGJvb2wgZm9yY2VVcGRhdGVU
cmFuc2Zvcm0KICAgICBpZiAoKG1fY2hhbmdlTWFzayAmIEJhY2tncm91bmRDb2xvckNoYW5nZSkg
JiYgKG1fcGVuZGluZ0NvbnRlbnQuYmFja2dyb3VuZENvbG9yICE9IG1fY3VycmVudENvbnRlbnQu
YmFja2dyb3VuZENvbG9yKSkKICAgICAgICAgdXBkYXRlKCk7CiAKLSAgICAvLyBGSVhNRTogdGhl
IGZvbGxvd2luZyBmbGFncyBhcmUgY3VycmVudGx5IG5vdCBoYW5kbGVkLCBhcyB0aGV5IGRvbid0
IGhhdmUgYSBjbGVhciB0ZXN0IG9yIGFyZSBpbiBsb3cgcHJpb3JpdHkKLSAgICAvLyBHZW9tZXRy
eU9yaWVudGF0aW9uQ2hhbmdlLCBDb250ZW50c09yaWVudGF0aW9uQ2hhbmdlLCBCYWNrZmFjZVZp
c2liaWxpdHlDaGFuZ2UsIENoaWxkcmVuVHJhbnNmb3JtQ2hhbmdlLCBQcmVzZXJ2ZXMzRENoYW5n
ZQotCiAgICAgbV9zdGF0ZS5tYXNrTGF5ZXIgPSBtX2xheWVyLT5tYXNrTGF5ZXIoKTsKICAgICBt
X3N0YXRlLnBvcyA9IG1fbGF5ZXItPnBvc2l0aW9uKCk7CiAgICAgbV9zdGF0ZS5hbmNob3JQb2lu
dCA9IG1fbGF5ZXItPmFuY2hvclBvaW50KCk7CkBAIC0xMTQyLDggKzExNjksNiBAQCBwdWJsaWM6
CiAgICAgewogICAgICAgICBpZiAobV9maWxsc0ZvcndhcmRzKQogICAgICAgICAgICAgc2V0Q3Vy
cmVudFRpbWUoMSk7Ci0gICAgICAgIGVsc2UgaWYgKG1fbGF5ZXIgJiYgbV9sYXllci5kYXRhKCkt
Pm1fbGF5ZXIpCi0gICAgICAgICAgICBtX2xheWVyLmRhdGEoKS0+c2V0QmFzZVRyYW5zZm9ybSht
X2xheWVyLmRhdGEoKS0+bV9sYXllci0+dHJhbnNmb3JtKCkpOwogICAgIH0KIAogICAgIC8vIHRo
ZSBpZGVhIGlzIHRoYXQgd2UgbGV0IFdlYkNvcmUgbWFuYWdlIHRoZSB0cmFuc2Zvcm0tb3BlcmF0
aW9ucwpAQCAtMTE1NCwzMyArMTE3OSwyNSBAQCBwdWJsaWM6CiAgICAgewogICAgICAgICBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm1NYXRyaXg7CiAKLSAgICAgICAgLy8gc29tZXRpbWVz
IHRoZSBhbmltYXRpb24gdmFsdWVzIGZyb20gV2ViQ29yZSBhcmUgbWlzbGVhZGluZyBhbmQgd2Ug
aGF2ZSB0byB1c2UgdGhlIGFjdHVhbCBtYXRyaXggYXMgc291cmNlCi0gICAgICAgIC8vIFRoZSBN
YWMgaW1wbGVtZW50YXRpb24gc2ltcGx5IGRvZXNuJ3QgdHJ5IHRvIGFjY2VsZXJhdGUgdGhvc2Ug
KGUuZy4gMzYwZGVnIHJvdGF0aW9uKSwgYnV0IHdlIGRvLgotICAgICAgICBpZiAocHJvZ3Jlc3Mg
PT0gMSB8fCAhdGFyZ2V0T3BlcmF0aW9ucy5zaXplKCkgfHwgc291cmNlT3BlcmF0aW9ucyA9PSB0
YXJnZXRPcGVyYXRpb25zKSB7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBzb3Vy
Y2VNYXRyaXg7Ci0gICAgICAgICAgICBzb3VyY2VPcGVyYXRpb25zLmFwcGx5KG1fYm94U2l6ZSwg
c291cmNlTWF0cml4KTsKLSAgICAgICAgICAgIHRyYW5zZm9ybU1hdHJpeCA9IG1fc291cmNlTWF0
cml4OwotICAgICAgICAgICAgdHJhbnNmb3JtTWF0cml4LmJsZW5kKHNvdXJjZU1hdHJpeCwgMSAt
IHByb2dyZXNzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJvb2wgdmFsaWRUcmFu
c2Zvcm1MaXN0cyA9IHRydWU7Ci0gICAgICAgICAgICBjb25zdCBpbnQgc291cmNlT3BlcmF0aW9u
Q291bnQgPSBzb3VyY2VPcGVyYXRpb25zLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChzb3VyY2VP
cGVyYXRpb25Db3VudCkgewotICAgICAgICAgICAgICAgIGlmICh0YXJnZXRPcGVyYXRpb25zLnNp
emUoKSAhPSBzb3VyY2VPcGVyYXRpb25Db3VudCkKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRU
cmFuc2Zvcm1MaXN0cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAg
ICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzb3VyY2VPcGVyYXRpb25Db3VudCAmJiB2
YWxpZFRyYW5zZm9ybUxpc3RzOyArK2opCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNv
dXJjZU9wZXJhdGlvbnMub3BlcmF0aW9ucygpW2pdLT5pc1NhbWVUeXBlKCp0YXJnZXRPcGVyYXRp
b25zLm9wZXJhdGlvbnMoKVtqXSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRU
cmFuc2Zvcm1MaXN0cyA9IGZhbHNlOwotICAgICAgICAgICAgfQorICAgICAgICBib29sIHZhbGlk
VHJhbnNmb3JtTGlzdHMgPSB0cnVlOworICAgICAgICBjb25zdCBpbnQgc291cmNlT3BlcmF0aW9u
Q291bnQgPSBzb3VyY2VPcGVyYXRpb25zLnNpemUoKTsKKyAgICAgICAgaWYgKHNvdXJjZU9wZXJh
dGlvbkNvdW50KSB7CisgICAgICAgICAgICBpZiAodGFyZ2V0T3BlcmF0aW9ucy5zaXplKCkgIT0g
c291cmNlT3BlcmF0aW9uQ291bnQpCisgICAgICAgICAgICAgICAgdmFsaWRUcmFuc2Zvcm1MaXN0
cyA9IGZhbHNlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90
IGogPSAwOyBqIDwgc291cmNlT3BlcmF0aW9uQ291bnQgJiYgdmFsaWRUcmFuc2Zvcm1MaXN0czsg
KytqKQorICAgICAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZU9wZXJhdGlvbnMub3BlcmF0aW9u
cygpW2pdLT5pc1NhbWVUeXBlKCp0YXJnZXRPcGVyYXRpb25zLm9wZXJhdGlvbnMoKVtqXSkpCisg
ICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFRyYW5zZm9ybUxpc3RzID0gZmFsc2U7CisgICAg
ICAgIH0KIAotICAgICAgICAgICAgaWYgKHZhbGlkVHJhbnNmb3JtTGlzdHMpIHsKLSAgICAgICAg
ICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRhcmdldE9wZXJhdGlvbnMuc2l6ZSgpOyAr
K2kpCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE9wZXJhdGlvbnMub3BlcmF0aW9ucygpW2ld
LT5ibGVuZChzb3VyY2VPcGVyYXRpb25zLmF0KGkpLCBwcm9ncmVzcyktPmFwcGx5KHRyYW5zZm9y
bU1hdHJpeCwgbV9ib3hTaXplKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAg
ICAgdGFyZ2V0T3BlcmF0aW9ucy5hcHBseShtX2JveFNpemUsIHRyYW5zZm9ybU1hdHJpeCk7Ci0g
ICAgICAgICAgICAgICAgdHJhbnNmb3JtTWF0cml4LmJsZW5kKG1fc291cmNlTWF0cml4LCBwcm9n
cmVzcyk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmICh2YWxpZFRyYW5zZm9ybUxpc3RzKSB7
CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRhcmdldE9wZXJhdGlvbnMuc2l6
ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgdGFyZ2V0T3BlcmF0aW9ucy5vcGVyYXRpb25zKClb
aV0tPmJsZW5kKHNvdXJjZU9wZXJhdGlvbnMuYXQoaSksIHByb2dyZXNzKS0+YXBwbHkodHJhbnNm
b3JtTWF0cml4LCBtX2JveFNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFy
Z2V0T3BlcmF0aW9ucy5hcHBseShtX2JveFNpemUsIHRyYW5zZm9ybU1hdHJpeCk7CisgICAgICAg
ICAgICB0cmFuc2Zvcm1NYXRyaXguYmxlbmQobV9zb3VyY2VNYXRyaXgsIHByb2dyZXNzKTsKICAg
ICAgICAgfQorCiAgICAgICAgIG1fbGF5ZXIuZGF0YSgpLT5zZXRCYXNlVHJhbnNmb3JtKHRyYW5z
Zm9ybU1hdHJpeCk7CiAgICAgICAgIGlmIChtX2ZpbGxzRm9yd2FyZHMpCiAgICAgICAgICAgICBt
X2xheWVyLmRhdGEoKS0+bV9sYXllci0+c2V0VHJhbnNmb3JtKG1fbGF5ZXIuZGF0YSgpLT5tX2Jh
c2VUcmFuc2Zvcm0pOwpAQCAtMTE5OSw3ICsxMjE2LDEwIEBAIHB1YmxpYzoKICAgICAgICAgICAg
IG1fc291cmNlTWF0cml4ID0gbV9sYXllci5kYXRhKCktPm1fbGF5ZXItPnRyYW5zZm9ybSgpOwog
ICAgICAgICAgICAgbV9sYXllci5kYXRhKCktPm1fdHJhbnNmb3JtQW5pbWF0aW9uUnVubmluZyA9
IHRydWU7CiAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUgPT0gUUFic3RyYWN0QW5pbWF0aW9u
OjpTdG9wcGVkKSB7CisgICAgICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIHRyYW5zZm9ybSBiYWNr
IHRvIHRoZSBkZWZhdWx0LiBUaGlzIGFscmVhZHkgdGFrZXMgZmlsbC1tb2RlcyBpbnRvIGFjY291
bnQuCiAgICAgICAgICAgICBtX2xheWVyLmRhdGEoKS0+bV90cmFuc2Zvcm1BbmltYXRpb25SdW5u
aW5nID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobV9sYXllciAmJiBtX2xheWVyLmRhdGEoKS0+
bV9sYXllcikKKyAgICAgICAgICAgICAgICBtX2xheWVyLmRhdGEoKS0+c2V0QmFzZVRyYW5zZm9y
bShtX2xheWVyLmRhdGEoKS0+bV9sYXllci0+dHJhbnNmb3JtKCkpOwogICAgICAgICB9CiAgICAg
fQogCkBAIC0xMjE3LDggKzEyMzcsNiBAQCBwdWJsaWM6CiAgICAgewogICAgICAgICBpZiAobV9m
aWxsc0ZvcndhcmRzKQogICAgICAgICAgICAgc2V0Q3VycmVudFRpbWUoMSk7Ci0gICAgICAgIGVs
c2UgaWYgKG1fbGF5ZXIgJiYgbV9sYXllci5kYXRhKCktPm1fbGF5ZXIpCi0gICAgICAgICAgICBt
X2xheWVyLmRhdGEoKS0+c2V0T3BhY2l0eShtX2xheWVyLmRhdGEoKS0+bV9sYXllci0+b3BhY2l0
eSgpKTsKICAgICB9CiAgICAgdmlydHVhbCB2b2lkIGFwcGx5RnJhbWUoY29uc3QgcXJlYWwmIGZy
b21WYWx1ZSwgY29uc3QgcXJlYWwmIHRvVmFsdWUsIHFyZWFsIHByb2dyZXNzKQogICAgIHsKQEAg
LTEyNDAsNiArMTI1OCwxMiBAQCBwdWJsaWM6CiAKICAgICAgICAgaWYgKG1fbGF5ZXIpCiAgICAg
ICAgICAgICBtX2xheWVyLmRhdGEoKS0+bV9vcGFjaXR5QW5pbWF0aW9uUnVubmluZyA9IChuZXdT
dGF0ZSA9PSBRQWJzdHJhY3RBbmltYXRpb246OlJ1bm5pbmcpOworCisgICAgICAgIC8vIElmIHN0
b3BwZWQsIHdlIHVwZGF0ZSB0aGUgb3BhY2l0eSBiYWNrIHRvIHRoZSBkZWZhdWx0LiBUaGlzIGFs
cmVhZHkgdGFrZXMgZmlsbC1tb2RlcyBpbnRvIGFjY291bnQuCisgICAgICAgIGlmIChuZXdTdGF0
ZSA9PSBTdG9wcGVkKQorICAgICAgICAgICAgaWYgKG1fbGF5ZXIgJiYgbV9sYXllci5kYXRhKCkt
Pm1fbGF5ZXIpCisgICAgICAgICAgICAgICAgbV9sYXllci5kYXRhKCktPnNldE9wYWNpdHkobV9s
YXllci5kYXRhKCktPm1fbGF5ZXItPm9wYWNpdHkoKSk7CisKICAgICB9CiB9OwogCkBAIC0xMzA1
LDYgKzEzMjksOCBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJRdDo6cmVtb3ZlQW5pbWF0aW9uc0ZvclBy
b3BlcnR5KEFuaW1hdGVkUHJvcGVydHlJRCBpZCkKICAgICAgICAgaWYgKCppdCkgewogICAgICAg
ICAgICAgQW5pbWF0aW9uUXRCYXNlKiBhbmltID0gc3RhdGljX2Nhc3Q8QW5pbWF0aW9uUXRCYXNl
Kj4oaXQtPmRhdGEoKSk7CiAgICAgICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5tX3dlYmtpdFBy
b3BlcnR5SUQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHN0b3AgdGhl
IGFuaW1hdGlvbiByaWdodCBhd2F5LCBvciBpdCBtaWdodCBmbGlja2VyIGJlZm9yZSBpdCdzIGRl
bGV0ZWQuCisgICAgICAgICAgICAgICAgYW5pbS0+c3RvcCgpOwogICAgICAgICAgICAgICAgIGFu
aW0tPmRlbGV0ZUxhdGVyKCk7CiAgICAgICAgICAgICAgICAgaXQgPSBtX2ltcGwtPm1fYW5pbWF0
aW9ucy5lcmFzZShpdCk7CiAgICAgICAgICAgICAgICAgLS1pdDsKQEAgLTEzMTksNyArMTM0NSw5
IEBAIHZvaWQgR3JhcGhpY3NMYXllclF0OjpyZW1vdmVBbmltYXRpb25zRm9yS2V5ZnJhbWVzKGNv
bnN0IFN0cmluZyYgbmFtZSkKICAgICAgICAgaWYgKCppdCkgewogICAgICAgICAgICAgQW5pbWF0
aW9uUXRCYXNlKiBhbmltID0gc3RhdGljX2Nhc3Q8QW5pbWF0aW9uUXRCYXNlKj4oKCppdCkuZGF0
YSgpKTsKICAgICAgICAgICAgIGlmIChhbmltICYmIGFuaW0tPm1fa2V5ZnJhbWVzTmFtZSA9PSBR
U3RyaW5nKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgKCppdCkuZGF0YSgpLT5kZWxldGVMYXRl
cigpOworICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc3RvcCB0aGUgYW5pbWF0aW9uIHJp
Z2h0IGF3YXksIG9yIGl0IG1pZ2h0IGZsaWNrZXIgYmVmb3JlIGl0J3MgZGVsZXRlZC4KKyAgICAg
ICAgICAgICAgICBhbmltLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgYW5pbS0+ZGVsZXRlTGF0
ZXIoKTsKICAgICAgICAgICAgICAgICBpdCA9IG1faW1wbC0+bV9hbmltYXRpb25zLmVyYXNlKGl0
KTsKICAgICAgICAgICAgICAgICAtLWl0OwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9NZWRpYVBsYXllclByaXZhdGVRdC5jcHAgYi9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L01lZGlhUGxheWVyUHJpdmF0ZVF0LmNwcAppbmRleCA0
ZDdiN2IwLi5mZGU5M2MwIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0
L01lZGlhUGxheWVyUHJpdmF0ZVF0LmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3F0L01lZGlhUGxheWVyUHJpdmF0ZVF0LmNwcApAQCAtNzcsOSArNzcsNiBAQCBNZWRpYVBsYXll
cjo6U3VwcG9ydHNUeXBlIE1lZGlhUGxheWVyUHJpdmF0ZTo6c3VwcG9ydHNUeXBlKGNvbnN0IFN0
cmluZyYgbWltZSwgYwogICAgIGlmICghbWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSAmJiAhbWlt
ZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkKICAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyOjpJc05v
dFN1cHBvcnRlZDsKIAotICAgIGlmIChRTWVkaWFQbGF5ZXI6Omhhc1N1cHBvcnQobWltZSwgUVN0
cmluZ0xpc3QoY29kZWMpKSA+PSBRdE1lZGlhU2VydmljZXM6OlByb2JhYmx5U3VwcG9ydGVkKQot
ICAgICAgICByZXR1cm4gTWVkaWFQbGF5ZXI6OklzU3VwcG9ydGVkOwotCiAgICAgcmV0dXJuIE1l
ZGlhUGxheWVyOjpNYXlCZVN1cHBvcnRlZDsKIH0KIApAQCAtMzQ0LDkgKzM0MSw2IEBAIHVuc2ln
bmVkIE1lZGlhUGxheWVyUHJpdmF0ZTo6Ynl0ZXNMb2FkZWQoKSBjb25zdAogCiB1bnNpZ25lZCBN
ZWRpYVBsYXllclByaXZhdGU6OnRvdGFsQnl0ZXMoKSBjb25zdAogewotICAgIGlmIChtX21lZGlh
UGxheWVyLT5hdmFpbGFibGVNZXRhRGF0YSgpLmNvbnRhaW5zKFF0TWVkaWFTZXJ2aWNlczo6U2l6
ZSkpCi0gICAgICAgIHJldHVybiBtX21lZGlhUGxheWVyLT5tZXRhRGF0YShRdE1lZGlhU2Vydmlj
ZXM6OlNpemUpLnRvSW50KCk7Ci0KICAgICByZXR1cm4gMTAwOwogfQogCmRpZmYgLS1naXQgYS9X
ZWJLaXQvcXQvQXBpL3FncmFwaGljc3dlYnZpZXcuY3BwIGIvV2ViS2l0L3F0L0FwaS9xZ3JhcGhp
Y3N3ZWJ2aWV3LmNwcAppbmRleCBjODY1YzRkLi5jYjkwYzZlIDEwMDY0NAotLS0gYS9XZWJLaXQv
cXQvQXBpL3FncmFwaGljc3dlYnZpZXcuY3BwCisrKyBiL1dlYktpdC9xdC9BcGkvcWdyYXBoaWNz
d2Vidmlldy5jcHAKQEAgLTEyNjMsOSArMTI2Myw3IEBAIHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6
a2V5UHJlc3NFdmVudChRS2V5RXZlbnQqIGV2KQogewogICAgIGlmIChkLT5wYWdlKQogICAgICAg
ICBkLT5wYWdlLT5ldmVudChldik7Ci0KLSAgICBpZiAoIWV2LT5pc0FjY2VwdGVkKCkpCi0gICAg
ICAgIFFHcmFwaGljc0l0ZW06OmtleVByZXNzRXZlbnQoZXYpOworICAgIGV2LT5hY2NlcHQoKTsK
IH0KIAogLyohIFxyZWltcApAQCAtMTI3NCw5ICsxMjcyLDkgQEAgdm9pZCBRR3JhcGhpY3NXZWJW
aWV3OjprZXlSZWxlYXNlRXZlbnQoUUtleUV2ZW50KiBldikKIHsKICAgICBpZiAoZC0+cGFnZSkK
ICAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotCi0gICAgaWYgKCFldi0+aXNBY2NlcHRlZCgp
KQorICAgIGVsc2UKICAgICAgICAgUUdyYXBoaWNzSXRlbTo6a2V5UmVsZWFzZUV2ZW50KGV2KTsK
KyAgICBldi0+YWNjZXB0KCk7CiB9CiAKIC8qISBccmVpbXAKZGlmZiAtLWdpdCBhL1dlYktpdC9x
dC9DaGFuZ2VMb2cgYi9XZWJLaXQvcXQvQ2hhbmdlTG9nCmluZGV4IDllZjE2ZWYuLjg4YTRjODkg
MTAwNjQ0Ci0tLSBhL1dlYktpdC9xdC9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0L3F0L0NoYW5nZUxv
ZwpAQCAtMSwzICsxLDE0IEBACisyMDEwLTA0LTI3ICBOb2FtIFJvc2VudGhhbCAgPG5vYW0ucm9z
ZW50aGFsQG5va2lhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBbUXRdIEdyYXBoaWNzTGF5ZXI6IHByZXNlcnZlcy0zZCBhbmQgYmFja2ZhY2Ug
dmlzaWJpbGl0eQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MzUzMTIKKworICAgICAgICAqIEFwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmNwcDoKKyAgICAgICAg
KFFHcmFwaGljc1dlYlZpZXc6OmtleVByZXNzRXZlbnQpOgorICAgICAgICAoUUdyYXBoaWNzV2Vi
Vmlldzo6a2V5UmVsZWFzZUV2ZW50KToKKwogMjAxMC0wNC0yNSAgU2FtIFdlaW5pZyAgPHNhbUB3
ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE1hY2llaiBTdGFjaG93aWFrLgo=
</data>
<flag name="review"
          id="38457"
          type_id="1"
          status="-"
          setter="noam"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54488</attachid>
            <date>2010-04-27 17:50:30 -0700</date>
            <delta_ts>2010-04-28 07:23:30 -0700</delta_ts>
            <desc>uploading correct patch</desc>
            <filename>patch-35312-2.diffpatch</filename>
            <type>text/plain</type>
            <size>13737</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZGZkMDhmYi4uMDdjZWZiMCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMiBAQAorMjAxMC0wNC0yNyAgTm9hbSBSb3NlbnRo
YWwgIDxub2FtLnJvc2VudGhhbEBub2tpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgW1F0XSBHcmFwaGljc0xheWVyOiBwcmVzZXJ2ZXMtM2Qg
YW5kIGJhY2tmYWNlIHZpc2liaWxpdHkKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTM1MzEyCisKKyAgICAgICAgSW1wbGVtZW50IHByZXNlcnZlcy0zZCBi
eSBtYWludGFpbmluZyB0aGUgM0QgdHJhbnNmb3JtYXRpb24gaGVpcmFyY2h5IGluc2lkZSBHcmFw
aGljc0xheWVyUXQsIGFuZCBleHRyYXBvbGF0aW5nCisgICAgICAgIHRoZSByZWxhdGl2ZSBRVHJh
bnNmb3JtLiBXaGVuIHRoZSBleHRyYXBvbGF0aW9uIGZhaWxzICh1bi1pbnZlcnRpYmxlIG1hdHJp
eCkgd2UgaWdub3JlIHRoZSB0cmFuc2Zvcm1hdGlvbiBjaGFuZ2UuCisKKyAgICAgICAgV2ViS2l0
U2l0ZS9ibG9nLWZpbGVzLzNkLXRyYW5zZm9ybXMgdGVzdCBub3cgd29yayB3aXRoIFF0LgorCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NMYXllclF0LmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdEltcGw6OnVwZGF0ZVRyYW5zZm9ybSk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyUXRJbXBsOjpvcGFxdWVBcmVhKToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJRdEltcGw6OmJvdW5kaW5nUmVjdCk6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0xheWVyUXRJbXBsOjpwYWludCk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0xheWVyUXRJbXBsOjpmbHVzaENoYW5nZXMpOgorCiAyMDEwLTA0LTI3ICBBZGFtIEJh
cnRoICA8YWJhcnRoQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlk
ZWwuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5
ZXJRdC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzTGF5ZXJRdC5j
cHAKaW5kZXggYTMxZDA0NS4uMWM0YzI3NSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9xdC9HcmFwaGljc0xheWVyUXQuY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvcXQvR3JhcGhpY3NMYXllclF0LmNwcApAQCAtMzIsMTQgKzMyLDExIEBACiAjaW5jbHVk
ZSA8UXRDb3JlL3FtZXRhb2JqZWN0Lmg+CiAjaW5jbHVkZSA8UXRDb3JlL3FzZXQuaD4KICNpbmNs
dWRlIDxRdENvcmUvcXRpbWVyLmg+Ci0jaW5jbHVkZSA8UXRHdWkvcWJpdG1hcC5oPgogI2luY2x1
ZGUgPFF0R3VpL3Fjb2xvci5oPgogI2luY2x1ZGUgPFF0R3VpL3FncmFwaGljc2VmZmVjdC5oPgog
I2luY2x1ZGUgPFF0R3VpL3FncmFwaGljc2l0ZW0uaD4KICNpbmNsdWRlIDxRdEd1aS9xZ3JhcGhp
Y3NzY2VuZS5oPgotI2luY2x1ZGUgPFF0R3VpL3FtYXRyaXg0eDQuaD4KICNpbmNsdWRlIDxRdEd1
aS9xcGFpbnRlci5oPgotI2luY2x1ZGUgPFF0R3VpL3FwYWxldHRlLmg+CiAjaW5jbHVkZSA8UXRH
dWkvcXBpeG1hcC5oPgogI2luY2x1ZGUgPFF0R3VpL3FwaXhtYXBjYWNoZS5oPgogI2luY2x1ZGUg
PFF0R3VpL3FzdHlsZW9wdGlvbi5oPgpAQCAtMTM1LDYgKzEzMiw4IEBAIHB1YmxpYzoKICAgICAv
LyB0aGUgY29tcG9zaXRvciBsZXRzIHVzIHNwZWNpYWwtY2FzZSBpbWFnZXMgYW5kIGNvbG9ycywg
c28gd2UgdHJ5IHRvIGRvIHNvCiAgICAgZW51bSBTdGF0aWNDb250ZW50VHlwZSB7IEhUTUxDb250
ZW50VHlwZSwgUGl4bWFwQ29udGVudFR5cGUsIENvbG9yQ29udGVudFR5cGUsIE1lZGlhQ29udGVu
dFR5cGV9OwogCisgICAgY29uc3QgR3JhcGhpY3NMYXllclF0SW1wbCogcm9vdExheWVyKCkgY29u
c3Q7CisKICAgICBHcmFwaGljc0xheWVyUXRJbXBsKEdyYXBoaWNzTGF5ZXJRdCogbmV3TGF5ZXIp
OwogICAgIHZpcnR1YWwgfkdyYXBoaWNzTGF5ZXJRdEltcGwoKTsKIApAQCAtMTQzLDkgKzE0Miw4
IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFFSZWN0RiBib3VuZGluZ1JlY3QoKSBjb25zdDsKICAg
ICB2aXJ0dWFsIHZvaWQgcGFpbnQoUVBhaW50ZXIqLCBjb25zdCBRU3R5bGVPcHRpb25HcmFwaGlj
c0l0ZW0qLCBRV2lkZ2V0Kik7CiAKLSAgICAvLyB3ZSBtYW5hZ2UgdHJhbnNmb3JtcyBvdXJzZWx2
ZXMgYmVjYXVzZSB0cmFuc2Zvcm0tb3JpZ2luIGFjdHMgZGlmZmVyZW50bHkgaW4gd2Via2l0IGFu
ZCBpbiBRdAorICAgIC8vIFdlIG1hbmFnZSB0cmFuc2Zvcm1zIG91cnNlbHZlcyBiZWNhdXNlIHRy
YW5zZm9ybS1vcmlnaW4gYWN0cyBkaWZmZXJlbnRseSBpbiB3ZWJraXQgYW5kIGluIFF0LCBhbmQg
d2UgbmVlZCBpdCBhcyBhIGZhbGxiYWNrIGluIGNhc2Ugd2UgZW5jb3VudGVyIGFuIHVuLWludmVy
dGlibGUgbWF0cml4CiAgICAgdm9pZCBzZXRCYXNlVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0
aW9uTWF0cml4Jik7Ci0gICAgUVRyYW5zZm9ybSBjb21wdXRlVHJhbnNmb3JtKGNvbnN0IFRyYW5z
Zm9ybWF0aW9uTWF0cml4JiBiYXNlVHJhbnNmb3JtKSBjb25zdDsKICAgICB2b2lkIHVwZGF0ZVRy
YW5zZm9ybSgpOwogCiAgICAgLy8gbGV0IHRoZSBjb21wb3NpdG9yLUFQSSB0ZWxsIHVzIHdoaWNo
IHByb3BlcnRpZXMgd2VyZSBjaGFuZ2VkCkBAIC0xNjMsMTAgKzE2MSw2IEBAIHB1YmxpYzoKICAg
ICAvLyBvciBDaHJvbWVDbGllbnRRdDo6c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyU3luYyAobWVh
bmluZyB0aGUgc3luYyB3aWxsIGhhcHBlbiBBU0FQKQogICAgIHZvaWQgZmx1c2hDaGFuZ2VzKGJv
b2wgcmVjdXJzaXZlID0gdHJ1ZSwgYm9vbCBmb3JjZVRyYW5zZm9ybVVwZGF0ZSA9IGZhbHNlKTsK
IAotICAgIC8vIG9wdGltaXphdGlvbjogcmV0dXJucyB0cnVlIGlmIHRoaXMgb3IgYW4gYW5jZXN0
b3IgaGFzIGEgdHJhbnNmb3JtIGFuaW1hdGlvbiBydW5uaW5nLgotICAgIC8vIHRoaXMgZW5hYmxl
cyB1cyB0byB1c2UgSXRlbUNvb3JkaW5hdGVzQ2FjaGUgd2hpbGUgdGhlIGFuaW1hdGlvbiBpcyBy
dW5uaW5nLCBvdGhlcndpc2Ugd2UgaGF2ZSB0byByZWNhY2hlIGZvciBldmVyeSBmcmFtZQotICAg
IGJvb2wgaXNUcmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nKCkgY29uc3Q7Ci0KIHB1YmxpYyBzbG90
czoKICAgICAvLyB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgY2xpZW50IChha2EgdGhlIGxheWVyIGNv
bXBvc2l0b3IpIHdoZW4gdGhlIGFuaW1hdGlvbiBhY3R1YWxseSBzdGFydHMKICAgICB2b2lkIG5v
dGlmeUFuaW1hdGlvblN0YXJ0ZWQoKTsKQEAgLTE4Miw2ICsxNzYsNyBAQCBwdWJsaWM6CiAgICAg
R3JhcGhpY3NMYXllclF0KiBtX2xheWVyOwogCiAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbV9i
YXNlVHJhbnNmb3JtOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1fdHJhbnNmb3JtUmVsYXRp
dmVUb1Jvb3RMYXllcjsKICAgICBib29sIG1fdHJhbnNmb3JtQW5pbWF0aW9uUnVubmluZzsKICAg
ICBib29sIG1fb3BhY2l0eUFuaW1hdGlvblJ1bm5pbmc7CiAgICAgUVdlYWtQb2ludGVyPE1hc2tF
ZmZlY3RRdD4gbV9tYXNrRWZmZWN0OwpAQCAtMjg4LDYgKzI4MywxNCBAQCBHcmFwaGljc0xheWVy
UXRJbXBsOjp+R3JhcGhpY3NMYXllclF0SW1wbCgpCiAjZW5kaWYKIH0KIAorY29uc3QgR3JhcGhp
Y3NMYXllclF0SW1wbCogR3JhcGhpY3NMYXllclF0SW1wbDo6cm9vdExheWVyKCkgY29uc3QKK3sK
KyAgICBpZiAoY29uc3QgR3JhcGhpY3NMYXllclF0SW1wbCogcGFyZW50ID0gcW9iamVjdF9jYXN0
PGNvbnN0IEdyYXBoaWNzTGF5ZXJRdEltcGwqPihwYXJlbnRPYmplY3QoKSkpCisgICAgICAgIHJl
dHVybiBwYXJlbnQtPnJvb3RMYXllcigpOworICAgIHJldHVybiB0aGlzOworfQorCisKIAogUVBp
eG1hcCBHcmFwaGljc0xheWVyUXRJbXBsOjpyZWNhY2hlKGNvbnN0IFFSZWdpb24mIHJlZ2lvblRv
VXBkYXRlKQogewpAQCAtMjk5LDcgKzMwMiw3IEBAIFFQaXhtYXAgR3JhcGhpY3NMYXllclF0SW1w
bDo6cmVjYWNoZShjb25zdCBRUmVnaW9uJiByZWdpb25Ub1VwZGF0ZSkKIAogICAgIC8vIFdlIG1p
Z2h0IGJlIGRyYXdpbmcgaW50byBhbiBleGlzdGluZyBjYWNoZS4KICAgICBpZiAoIVFQaXhtYXBD
YWNoZTo6ZmluZChtX2JhY2tpbmdTdG9yZUtleSwgJnBpeG1hcCkpCi0gICAgICAgIHJlZ2lvbiA9
IFFSZWdpb24oYm91bmRpbmdSZWN0KCkudG9BbGlnbmVkUmVjdCgpKTsKKyAgICAgICAgcmVnaW9u
ID0gUVJlZ2lvbihRUmVjdCgwLCAwLCBtX3NpemUud2lkdGgoKSwgbV9zaXplLmhlaWdodCgpKSk7
CiAKICAgICBpZiAobV9zaXplICE9IHBpeG1hcC5zaXplKCkpIHsKICAgICAgICAgcGl4bWFwID0g
UVBpeG1hcChtX3NpemUudG9TaXplKCkpOwpAQCAtMzI1LDYzICszMjgsOTMgQEAgUVBpeG1hcCBH
cmFwaGljc0xheWVyUXRJbXBsOjpyZWNhY2hlKGNvbnN0IFFSZWdpb24mIHJlZ2lvblRvVXBkYXRl
KQogCiB2b2lkIEdyYXBoaWNzTGF5ZXJRdEltcGw6OnVwZGF0ZVRyYW5zZm9ybSgpCiB7Ci0gICAg
c2V0QmFzZVRyYW5zZm9ybShpc1RyYW5zZm9ybUFuaW1hdGlvblJ1bm5pbmcoKSA/IG1fYmFzZVRy
YW5zZm9ybSA6IG1fbGF5ZXItPnRyYW5zZm9ybSgpKTsKLX0KLQotdm9pZCBHcmFwaGljc0xheWVy
UXRJbXBsOjpzZXRCYXNlVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBiYXNl
VHJhbnNmb3JtKQotewotICAgIG1fYmFzZVRyYW5zZm9ybSA9IGJhc2VUcmFuc2Zvcm07Ci0gICAg
c2V0VHJhbnNmb3JtKGNvbXB1dGVUcmFuc2Zvcm0oYmFzZVRyYW5zZm9ybSkpOwotfQotCi1RVHJh
bnNmb3JtIEdyYXBoaWNzTGF5ZXJRdEltcGw6OmNvbXB1dGVUcmFuc2Zvcm0oY29uc3QgVHJhbnNm
b3JtYXRpb25NYXRyaXgmIGJhc2VUcmFuc2Zvcm0pIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2xheWVy
KQotICAgICAgICByZXR1cm4gYmFzZVRyYW5zZm9ybTsKLQotICAgIFRyYW5zZm9ybWF0aW9uTWF0
cml4IGNvbXB1dGVkVHJhbnNmb3JtOworICAgIGlmICghbV90cmFuc2Zvcm1BbmltYXRpb25SdW5u
aW5nKQorICAgICAgICBtX2Jhc2VUcmFuc2Zvcm0gPSBtX2xheWVyLT50cmFuc2Zvcm0oKTsKIAot
ICAgIC8vIFRoZSBvcmlnaW4gZm9yIGNoaWxkcmVuVHJhbnNmb3JtIGlzIGFsd2F5cyB0aGUgY2Vu
dGVyIG9mIHRoZSBhbmNlc3RvciB3aGljaCBjb250YWlucyB0aGUgY2hpbGRyZW5UcmFuc2Zvcm0u
Ci0gICAgLy8gdGhpcyBoYXMgdG8gZG8gd2l0aCBob3cgV2ViQ29yZSBpbXBsZW1lbnRzIC13ZWJr
aXQtcGVyc3BlY3RpdmUgYW5kIC13ZWJraXQtcGVyc3BlY3RpdmUtb3JpZ2luLCB3aGljaCBhcmUg
dGhlIENTUwotICAgIC8vIGF0dHJpYnV0ZSB0aGF0IGNhbGwgc2V0Q2hpbGRyZW5UcmFuc2Zvcm0K
LSAgICBRUG9pbnRGIG9mZnNldCA9IC1wb3MoKSAtIGJvdW5kaW5nUmVjdCgpLmJvdHRvbVJpZ2h0
KCkgLyAyOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxvY2FsVHJhbnNmb3JtOwogCi0gICAg
Zm9yIChjb25zdCBHcmFwaGljc0xheWVyUXRJbXBsKiBhbmNlc3RvciA9IHRoaXM7IChhbmNlc3Rv
ciA9IHFvYmplY3RfY2FzdDxHcmFwaGljc0xheWVyUXRJbXBsKj4oYW5jZXN0b3ItPnBhcmVudE9i
amVjdCgpKSk7ICkgewotICAgICAgICBpZiAoIWFuY2VzdG9yLT5tX3N0YXRlLmNoaWxkcmVuVHJh
bnNmb3JtLmlzSWRlbnRpdHkoKSkgewotICAgICAgICAgICAgY29uc3QgUVBvaW50RiBvZmZzZXQg
PSBtYXBGcm9tSXRlbShhbmNlc3RvciwgUVBvaW50RihhbmNlc3Rvci0+bV9zaXplLndpZHRoKCkg
LyAyLCBhbmNlc3Rvci0+bV9zaXplLmhlaWdodCgpIC8gMikpOwotICAgICAgICAgICAgY29tcHV0
ZWRUcmFuc2Zvcm0KLSAgICAgICAgICAgICAgICAudHJhbnNsYXRlKG9mZnNldC54KCksIG9mZnNl
dC55KCkpCi0gICAgICAgICAgICAgICAgLm11bHRMZWZ0KGFuY2VzdG9yLT5tX3N0YXRlLmNoaWxk
cmVuVHJhbnNmb3JtKQotICAgICAgICAgICAgICAgIC50cmFuc2xhdGUoLW9mZnNldC54KCksIC1v
ZmZzZXQueSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQorICAgIEdy
YXBoaWNzTGF5ZXJRdEltcGwqIHBhcmVudCA9IHFvYmplY3RfY2FzdDxHcmFwaGljc0xheWVyUXRJ
bXBsKj4ocGFyZW50T2JqZWN0KCkpOwogCiAgICAgLy8gd2Via2l0IGhhcyByZWxhdGl2ZS10by1z
aXplIG9yaWdpblBvaW50LCBncmFwaGljcy12aWV3IGhhcyBhIHBpeGVsIG9yaWdpblBvaW50LCBo
ZXJlIHdlIGNvbnZlcnQKICAgICAvLyB3ZSBoYXZlIHRvIG1hbmFnZSB0aGlzIG91cnNlbHZlcyBi
ZWNhdXNlIFFHcmFwaGljc1ZpZXcncyB0cmFuc2Zvcm1PcmlnaW4gaXMgaW5jb21wYXRpYmxlCiAg
ICAgY29uc3QgcXJlYWwgb3JpZ2luWCA9IG1fc3RhdGUuYW5jaG9yUG9pbnQueCgpICogbV9zaXpl
LndpZHRoKCk7CiAgICAgY29uc3QgcXJlYWwgb3JpZ2luWSA9IG1fc3RhdGUuYW5jaG9yUG9pbnQu
eSgpICogbV9zaXplLmhlaWdodCgpOwotICAgIGNvbXB1dGVkVHJhbnNmb3JtCi0gICAgICAgICAg
ICAudHJhbnNsYXRlM2Qob3JpZ2luWCwgb3JpZ2luWSwgbV9zdGF0ZS5hbmNob3JQb2ludC56KCkp
Ci0gICAgICAgICAgICAubXVsdExlZnQoYmFzZVRyYW5zZm9ybSkKKworICAgIC8vIFdlIGlnbm9y
ZSBRR3JhcGhpY3NJdGVtOjpwb3MgY29tcGxldGVseSwgYW5kIHVzZSBvbmx5IHRyYW5zZm9ybXMg
LSBiZWNhdXNlIHdlIGhhdmUgdG8gbWFpbnRhaW4gdGhhdCBvdXJzZWx2ZXMgZm9yIDNELgorICAg
IGxvY2FsVHJhbnNmb3JtCisgICAgICAgICAgICAudHJhbnNsYXRlM2Qob3JpZ2luWCArIG1fc3Rh
dGUucG9zLngoKSwgb3JpZ2luWSArIG1fc3RhdGUucG9zLnkoKSwgbV9zdGF0ZS5hbmNob3JQb2lu
dC56KCkpCisgICAgICAgICAgICAubXVsdExlZnQobV9iYXNlVHJhbnNmb3JtKQogICAgICAgICAg
ICAgLnRyYW5zbGF0ZTNkKC1vcmlnaW5YLCAtb3JpZ2luWSwgLW1fc3RhdGUuYW5jaG9yUG9pbnQu
eigpKTsKIAotICAgIC8vIG5vdyB3ZSBwcm9qZWN0IHRvIDJECi0gICAgcmV0dXJuIFFUcmFuc2Zv
cm0oY29tcHV0ZWRUcmFuc2Zvcm0pOworICAgIC8vIFRoaXMgaXMgdGhlIGFjdHVhbCAzRCB0cmFu
c2Zvcm0gb2YgdGhpcyBpdGVtLCB3aXRoIHRoZSBhbmNlc3RvcnMnIHRyYW5zZm9ybSBiYWtlZCBp
bi4KKyAgICBtX3RyYW5zZm9ybVJlbGF0aXZlVG9Sb290TGF5ZXIgPSBUcmFuc2Zvcm1hdGlvbk1h
dHJpeChwYXJlbnQgPyBwYXJlbnQtPm1fdHJhbnNmb3JtUmVsYXRpdmVUb1Jvb3RMYXllciA6IFRy
YW5zZm9ybWF0aW9uTWF0cml4KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC5tdWx0TGVmdChsb2NhbFRyYW5zZm9ybSk7CisKKyAgICAvLyBOb3cgd2UgaGF2ZSBl
bm91Z2ggaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSBsYXllciBpcyBmYWNpbmcgYmFj
a3dhcmRzLgorICAgIGlmICghbV9zdGF0ZS5iYWNrZmFjZVZpc2liaWxpdHkgJiYgbV90cmFuc2Zv
cm1SZWxhdGl2ZVRvUm9vdExheWVyLmludmVyc2UoKS5tMzMoKSA8IDApIHsKKyAgICAgICAgc2V0
VmlzaWJsZShmYWxzZSk7CisgICAgICAgIC8vIE5vIHBvaW50IGluIG1ha2luZyBleHRyYSBjYWxj
dWxhdGlvbnMgZm9yIGludmlzaWJsZSBlbGVtZW50cy4KKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIC8vIFNpbXBsaXN0aWMgZGVwdGggdGVzdCAtIHdlIHN0YWNrIHRoZSBpdGVtIGJlaGlu
ZCBpdHMgcGFyZW50IGlmIGl0cyBjb21wdXRlZCB6IGlzIGxvd2VyIHRoYW4gdGhlIHBhcmVudCdz
IGNvbXB1dGVkIHogYXQgdGhlIGl0ZW0ncyBjZW50ZXIgcG9pbnQuCisgICAgaWYgKHBhcmVudCkg
eworICAgICAgICBjb25zdCBRUG9pbnRGIGNlbnRlclBvaW50TWFwcGVkVG9Sb290ID0gcm9vdExh
eWVyKCktPm1hcEZyb21JdGVtKHRoaXMsIG1fc2l6ZS53aWR0aCgpIC8gMiwgbV9zaXplLmhlaWdo
dCgpIC8gMik7CisgICAgICAgIHNldEZsYWcoSXRlbVN0YWNrc0JlaGluZFBhcmVudCwKKyAgICAg
ICAgICAgICAgICBtX3RyYW5zZm9ybVJlbGF0aXZlVG9Sb290TGF5ZXIubWFwUG9pbnQoRmxvYXRQ
b2ludDNEKGNlbnRlclBvaW50TWFwcGVkVG9Sb290LngoKSwgY2VudGVyUG9pbnRNYXBwZWRUb1Jv
b3QueSgpLCAwKSkueigpIDwKKyAgICAgICAgICAgICAgICBwYXJlbnQtPm1fdHJhbnNmb3JtUmVs
YXRpdmVUb1Jvb3RMYXllci5tYXBQb2ludChGbG9hdFBvaW50M0QoY2VudGVyUG9pbnRNYXBwZWRU
b1Jvb3QueCgpLCBjZW50ZXJQb2ludE1hcHBlZFRvUm9vdC55KCksIDApKS56KCkpOworICAgIH0K
KworICAgIC8vIFRoZSBpdGVtIGlzIGZyb250LWZhY2luZyBvciBiYWNrZmFjZS12aXNpYmlsaXR5
IGlzIG9uLgorICAgIHNldFZpc2libGUodHJ1ZSk7CisKKyAgICAvLyBGbGF0dGVuIHRvIDJELXNw
YWNlIG9mIHRoaXMgaXRlbSBpZiBpdCBkb2Vzbid0IHByZXNlcnZlIDNELgorICAgIGlmICghbV9z
dGF0ZS5wcmVzZXJ2ZXMzRCkgeworICAgICAgICBtX3RyYW5zZm9ybVJlbGF0aXZlVG9Sb290TGF5
ZXIuc2V0TTEzKDApOworICAgICAgICBtX3RyYW5zZm9ybVJlbGF0aXZlVG9Sb290TGF5ZXIuc2V0
TTIzKDApOworICAgICAgICBtX3RyYW5zZm9ybVJlbGF0aXZlVG9Sb290TGF5ZXIuc2V0TTMxKDAp
OworICAgICAgICBtX3RyYW5zZm9ybVJlbGF0aXZlVG9Sb290TGF5ZXIuc2V0TTMyKDApOworICAg
ICAgICBtX3RyYW5zZm9ybVJlbGF0aXZlVG9Sb290TGF5ZXIuc2V0TTMzKDEpOworICAgICAgICBt
X3RyYW5zZm9ybVJlbGF0aXZlVG9Sb290TGF5ZXIuc2V0TTM0KDApOworICAgICAgICBtX3RyYW5z
Zm9ybVJlbGF0aXZlVG9Sb290TGF5ZXIuc2V0TTQzKDApOworICAgIH0KKworICAgIC8vIEFwcGx5
IHBlcnNwZWN0aXZlIGZvciB0aGUgdXNlIG9mIHRoaXMgaXRlbSdzIGNoaWxkcmVuLiBQZXJzcGVj
dGl2ZSBpcyBhbHdheXMgYXBwbGllZCBmcm9tIHRoZSBpdGVtJ3MgY2VudGVyLgorICAgIGlmICgh
bV9zdGF0ZS5jaGlsZHJlblRyYW5zZm9ybS5pc0lkZW50aXR5KCkpCisgICAgICAgIG1fdHJhbnNm
b3JtUmVsYXRpdmVUb1Jvb3RMYXllcgorICAgICAgICAgICAgLnRyYW5zbGF0ZShtX3NpemUud2lk
dGgoKSAvIDIsIG1fc2l6ZS5oZWlnaHQoKSAvMikKKyAgICAgICAgICAgIC5tdWx0TGVmdChtX3N0
YXRlLmNoaWxkcmVuVHJhbnNmb3JtKQorICAgICAgICAgICAgLnRyYW5zbGF0ZSgtbV9zaXplLndp
ZHRoKCkgLyAyLCAtbV9zaXplLmhlaWdodCgpIC8yKTsKKworICAgIGJvb2wgaW52ZXJzZU9rID0g
dHJ1ZTsKKyAgICAvLyBVc2UgUVRyYW5zZm9ybTo6aW52ZXJzZSB0byBleHRyYXBvbGF0ZSB0aGUg
cmVsYXRpdmUgdHJhbnNmb3JtIG9mIHRoaXMgaXRlbSwgYmFzZWQgb24gdGhlIHBhcmVudCdzIHRy
YW5zZm9ybSByZWxhdGl2ZSB0bworICAgIC8vIHRoZSByb290IGxheWVyIGFuZCB0aGUgZGVzaXJl
ZCB0cmFuc2Zvcm0gZm9yIHRoaXMgaXRlbSByZWxhdGl2ZSB0byB0aGUgcm9vdCBsYXllci4KKyAg
ICBjb25zdCBRVHJhbnNmb3JtIHBhcmVudFRyYW5zZm9ybSA9IHBhcmVudCA/IHBhcmVudC0+aXRl
bVRyYW5zZm9ybShyb290TGF5ZXIoKSkgOiBRVHJhbnNmb3JtKCk7CisgICAgY29uc3QgUVRyYW5z
Zm9ybSB0cmFuc2Zvcm0yRCA9IFFUcmFuc2Zvcm0obV90cmFuc2Zvcm1SZWxhdGl2ZVRvUm9vdExh
eWVyKSAqIHBhcmVudFRyYW5zZm9ybS5pbnZlcnRlZCgmaW52ZXJzZU9rKTsKKworICAgIC8vIElu
IHJhcmUgY2FzZXMgdGhlIHRyYW5zZm9ybWF0aW9uIGNhbm5vdCBiZSBpbnZlcnNlZCAtIGluIHRo
YXQgY2FzZSB3ZSBkb24ndCBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gYXQgYWxsLCBvdGhlcndp
c2Ugd2UnZCBmbGlja2VyLgorICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhbWVuZGVkIHdo
ZW4gUXQgbW92ZXMgdG8gYSByZWFsIDNEIHNjZW5lLWdyYXBoLgorICAgIGlmICghaW52ZXJzZU9r
KQorICAgICAgICByZXR1cm47CisKKyAgICBzZXRUcmFuc2Zvcm0odHJhbnNmb3JtMkQpOworCisg
ICAgY29uc3QgUUxpc3Q8UUdyYXBoaWNzSXRlbSo+IGNoaWxkcmVuID0gY2hpbGRJdGVtcygpOwor
ICAgIGZvciAoUUxpc3Q8UUdyYXBoaWNzSXRlbSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGNoaWxk
cmVuLmJlZ2luKCk7IGl0ICE9IGNoaWxkcmVuLmVuZCgpOyArK2l0KQorICAgICAgICBpZiAoR3Jh
cGhpY3NMYXllclF0SW1wbCogbGF5ZXI9IHFvYmplY3RfY2FzdDxHcmFwaGljc0xheWVyUXRJbXBs
Kj4oKCppdCktPnRvR3JhcGhpY3NPYmplY3QoKSkpCisgICAgICAgICAgICBsYXllci0+dXBkYXRl
VHJhbnNmb3JtKCk7CiB9CiAKLWJvb2wgR3JhcGhpY3NMYXllclF0SW1wbDo6aXNUcmFuc2Zvcm1B
bmltYXRpb25SdW5uaW5nKCkgY29uc3QKK3ZvaWQgR3JhcGhpY3NMYXllclF0SW1wbDo6c2V0QmFz
ZVRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgYmFzZVRyYW5zZm9ybSkKIHsK
LSAgICBpZiAobV90cmFuc2Zvcm1BbmltYXRpb25SdW5uaW5nKQotICAgICAgICByZXR1cm4gdHJ1
ZTsKLSAgICBpZiAoR3JhcGhpY3NMYXllclF0SW1wbCogcGFyZW50ID0gcW9iamVjdF9jYXN0PEdy
YXBoaWNzTGF5ZXJRdEltcGwqPihwYXJlbnRPYmplY3QoKSkpCi0gICAgICAgIHJldHVybiBwYXJl
bnQtPmlzVHJhbnNmb3JtQW5pbWF0aW9uUnVubmluZygpOwotICAgIHJldHVybiBmYWxzZTsKKyAg
ICBtX2Jhc2VUcmFuc2Zvcm0gPSBiYXNlVHJhbnNmb3JtOworICAgIHVwZGF0ZVRyYW5zZm9ybSgp
OwogfQogCiBRUGFpbnRlclBhdGggR3JhcGhpY3NMYXllclF0SW1wbDo6b3BhcXVlQXJlYSgpIGNv
bnN0CiB7CiAgICAgUVBhaW50ZXJQYXRoIHBhaW50ZXJQYXRoOworCiAgICAgLy8gd2UgdHJ5IG91
dCBiZXN0IHRvIHJldHVybiB0aGUgb3BhcXVlIGFyZWEsIG1heWJlIGl0IHdpbGwgaGVscCBncmFw
aGljcy12aWV3IHJlbmRlciBsZXNzIGl0ZW1zCiAgICAgaWYgKG1fY3VycmVudENvbnRlbnQuYmFj
a2dyb3VuZENvbG9yLmlzVmFsaWQoKSAmJiBtX2N1cnJlbnRDb250ZW50LmJhY2tncm91bmRDb2xv
ci5hbHBoYSgpID09IDB4ZmYpCiAgICAgICAgIHBhaW50ZXJQYXRoLmFkZFJlY3QoYm91bmRpbmdS
ZWN0KCkpOwpAQCAtNDExLDEwICs0NDQsOSBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJRdEltcGw6OnBh
aW50KFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRU3R5bGVPcHRpb25HcmFwaGljc0l0ZQogICAg
IGNhc2UgSFRNTENvbnRlbnRUeXBlOgogICAgICAgICBpZiAobV9zdGF0ZS5kcmF3c0NvbnRlbnQp
IHsKICAgICAgICAgICAgIFFQaXhtYXAgYmFja2luZ1N0b3JlOwotICAgICAgICAgICAgLy8gV2Ug
bWlnaHQgbmVlZCB0byByZWNhY2hlLCBpbiBjYXNlIHdlIHRyeSB0byBwYWludCBhbmQgdGhlIGNh
Y2hlCi0gICAgICAgICAgICAvLyB3YXMgcHVyZ2VkIChlLmcuIGlmIGl0IHdhcyBmdWxsKS4KKyAg
ICAgICAgICAgIC8vIFdlIG1pZ2h0IG5lZWQgdG8gcmVjYWNoZSwgaW4gY2FzZSB3ZSB0cnkgdG8g
cGFpbnQgYW5kIHRoZSBjYWNoZSB3YXMgcHVyZ2VkIChlLmcuIGlmIGl0IHdhcyBmdWxsKS4KICAg
ICAgICAgICAgIGlmICghUVBpeG1hcENhY2hlOjpmaW5kKG1fYmFja2luZ1N0b3JlS2V5LCAmYmFj
a2luZ1N0b3JlKSB8fCBiYWNraW5nU3RvcmUuc2l6ZSgpICE9IG1fc2l6ZS50b1NpemUoKSkKLSAg
ICAgICAgICAgICAgICBiYWNraW5nU3RvcmUgPSByZWNhY2hlKFFSZWdpb24oYm91bmRpbmdSZWN0
KCkudG9BbGlnbmVkUmVjdCgpKSk7CisgICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlID0gcmVj
YWNoZShRUmVnaW9uKG1fc3RhdGUuY29udGVudHNSZWN0KSk7CiAgICAgICAgICAgICBwYWludGVy
LT5kcmF3UGl4bWFwKDAsIDAsIGJhY2tpbmdTdG9yZSk7CiAgICAgICAgIH0KICAgICAgICAgYnJl
YWs7CkBAIC01MDAsOSArNTMyLDYgQEAgdm9pZCBHcmFwaGljc0xheWVyUXRJbXBsOjpmbHVzaENo
YW5nZXMoYm9vbCByZWN1cnNpdmUsIGJvb2wgZm9yY2VVcGRhdGVUcmFuc2Zvcm0KICAgICAgICAg
fQogICAgIH0KIAotICAgIGlmICgobV9jaGFuZ2VNYXNrICYgUG9zaXRpb25DaGFuZ2UpICYmICht
X2xheWVyLT5wb3NpdGlvbigpICE9IG1fc3RhdGUucG9zKSkKLSAgICAgICAgc2V0UG9zKG1fbGF5
ZXItPnBvc2l0aW9uKCkueCgpLCBtX2xheWVyLT5wb3NpdGlvbigpLnkoKSk7Ci0KICAgICBpZiAo
bV9jaGFuZ2VNYXNrICYgU2l6ZUNoYW5nZSkgewogICAgICAgICBpZiAobV9sYXllci0+c2l6ZSgp
ICE9IG1fc3RhdGUuc2l6ZSkgewogICAgICAgICAgICAgcHJlcGFyZUdlb21ldHJ5Q2hhbmdlKCk7
CkBAIC01MTUsNyArNTQ0LDcgQEAgdm9pZCBHcmFwaGljc0xheWVyUXRJbXBsOjpmbHVzaENoYW5n
ZXMoYm9vbCByZWN1cnNpdmUsIGJvb2wgZm9yY2VVcGRhdGVUcmFuc2Zvcm0KICAgICAgICAgaWYg
KHNjZW5lKCkpCiAgICAgICAgICAgICBzY2VuZSgpLT51cGRhdGUoKTsKIAotICAgIGlmIChtX2No
YW5nZU1hc2sgJiAoQ2hpbGRyZW5UcmFuc2Zvcm1DaGFuZ2UgfCBQcmVzZXJ2ZXMzRENoYW5nZSB8
IFRyYW5zZm9ybUNoYW5nZSB8IEFuY2hvclBvaW50Q2hhbmdlIHwgU2l6ZUNoYW5nZSkpIHsKKyAg
ICBpZiAobV9jaGFuZ2VNYXNrICYgKENoaWxkcmVuVHJhbnNmb3JtQ2hhbmdlIHwgUHJlc2VydmVz
M0RDaGFuZ2UgfCBUcmFuc2Zvcm1DaGFuZ2UgfCBBbmNob3JQb2ludENoYW5nZSB8IFNpemVDaGFu
Z2UgfCBCYWNrZmFjZVZpc2liaWxpdHlDaGFuZ2UgfCBQb3NpdGlvbkNoYW5nZSkpIHsKICAgICAg
ICAgLy8gZHVlIHRvIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB3YXkgV2ViQ29yZSBoYW5k
bGVzIHRyYW5zZm9ybXMgYW5kIHRoZSB3YXkgUXQgaGFuZGxlcyB0cmFuc2Zvcm1zLAogICAgICAg
ICAvLyBhbGwgdGhlc2UgZWxlbWVudHMgYWZmZWN0IHRoZSB0cmFuc2Zvcm1zIG9mIGFsbCB0aGUg
ZGVzY2VuZGFudHMuCiAgICAgICAgIGZvcmNlVXBkYXRlVHJhbnNmb3JtID0gdHJ1ZTsKQEAgLTU4
Nyw5ICs2MTYsNiBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJRdEltcGw6OmZsdXNoQ2hhbmdlcyhib29s
IHJlY3Vyc2l2ZSwgYm9vbCBmb3JjZVVwZGF0ZVRyYW5zZm9ybQogICAgIGlmICgobV9jaGFuZ2VN
YXNrICYgQmFja2dyb3VuZENvbG9yQ2hhbmdlKSAmJiAobV9wZW5kaW5nQ29udGVudC5iYWNrZ3Jv
dW5kQ29sb3IgIT0gbV9jdXJyZW50Q29udGVudC5iYWNrZ3JvdW5kQ29sb3IpKQogICAgICAgICB1
cGRhdGUoKTsKIAotICAgIC8vIEZJWE1FOiB0aGUgZm9sbG93aW5nIGZsYWdzIGFyZSBjdXJyZW50
bHkgbm90IGhhbmRsZWQsIGFzIHRoZXkgZG9uJ3QgaGF2ZSBhIGNsZWFyIHRlc3Qgb3IgYXJlIGlu
IGxvdyBwcmlvcml0eQotICAgIC8vIEdlb21ldHJ5T3JpZW50YXRpb25DaGFuZ2UsIENvbnRlbnRz
T3JpZW50YXRpb25DaGFuZ2UsIEJhY2tmYWNlVmlzaWJpbGl0eUNoYW5nZSwgQ2hpbGRyZW5UcmFu
c2Zvcm1DaGFuZ2UsIFByZXNlcnZlczNEQ2hhbmdlCi0KICAgICBtX3N0YXRlLm1hc2tMYXllciA9
IG1fbGF5ZXItPm1hc2tMYXllcigpOwogICAgIG1fc3RhdGUucG9zID0gbV9sYXllci0+cG9zaXRp
b24oKTsKICAgICBtX3N0YXRlLmFuY2hvclBvaW50ID0gbV9sYXllci0+YW5jaG9yUG9pbnQoKTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>