<?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>23361</bug_id>
          
          <creation_ts>2009-01-15 15:02:04 -0800</creation_ts>
          <short_desc>Optimize images in layer when using accelerated compositing</short_desc>
          <delta_ts>2009-03-25 18:39:15 -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>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P3</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>23359</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Simon Fraser (smfr)">simon.fraser</reporter>
          <assigned_to name="Dean Jackson">dino</assigned_to>
          <cc>cmarrin</cc>
    
    <cc>dino</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>105976</commentid>
    <comment_count>0</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-15 15:02:04 -0800</bug_when>
    <thetext>When a composited RenderLayer is created for a single &lt;img&gt;, then we can do some optimizations that we&apos;ll track in this bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115076</commentid>
    <comment_count>1</comment_count>
      <attachid>28916</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2009-03-24 16:36:45 -0700</bug_when>
    <thetext>Created attachment 28916
initial patch for coding review

Simon,

Here&apos;s a first pass. Pls check for style and approach. I&apos;ll add a ChangeLog and (manual) tests in a sec</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115081</commentid>
    <comment_count>2</comment_count>
      <attachid>28916</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-03-24 16:50:15 -0700</bug_when>
    <thetext>Comment on attachment 28916
initial patch for coding review

&gt; diff --git a/WebCore/rendering/RenderImage.cpp b/WebCore/rendering/RenderImage.cpp

&gt; +void RenderImage::notifyFinished(CachedResource* newImage)
&gt; +{
&gt; +    if (documentBeingDestroyed())
&gt; +        return;
&gt; +
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    if ((newImage == m_cachedImage) &amp;&amp; layer()) {

It&apos;s slightly faster to test hasLayer(), not layer().

&gt; +// A layer can use an inner content layer if the render layer&apos;s object is a replaced object and has no children.
&gt; +// This allows the GraphicsLayer to display the RenderLayer contents directly; it&apos;s used for images and video.

Not video.

&gt; +    // Video always uses an inner layer (for now).
&gt; +    if (renderObject-&gt;isVideo())
&gt; +        return true;

Remove this.

&gt; +        // FIXME: video can go here once we hook up accelerated compositing for video
&gt; +        /* if (renderer()-&gt;isVideo()) {
&gt; +            drawsContent = hasBoxDecorations || renderer()-&gt;style()-&gt;hasBackground();
&gt; +        } */

Remove this.

&gt; +        if (renderer()-&gt;isImage()) {
&gt; +            RenderImage* imageRenderer = (RenderImage*)renderer();
&gt; +            if (imageRenderer &amp;&amp; imageRenderer-&gt;cachedImage() &amp;&amp; imageRenderer-&gt;cachedImage()-&gt;image())
&gt; +                m_graphicsLayer-&gt;setContentsToImage(imageRenderer-&gt;cachedImage()-&gt;image());
&gt; +            
&gt; +            drawsContent = false;
&gt; +        }
&gt; +        
&gt; +        if (rendererHasBackground()) {
&gt; +            m_graphicsLayer-&gt;setBackgroundColor(rendererBackgroundColor());
&gt; +            hasImageBackgroundColor = true;
&gt; +        }
&gt; +    } else {
&gt; +        m_graphicsLayer-&gt;clearContents();
&gt; +        drawsContent = true;
&gt; +    }
&gt; +    
&gt; +    if (isSimpleContainerCompositingLayer())
&gt;          drawsContent = false;

I don&apos;t think we need to call isSimpleContainerCompositingLayer() if we&apos;ve already determined that this
is a simple image layer.

&gt; +void RenderLayerBacking::rendererContentChanged()
&gt; +{
&gt; +    bool hasBoxDecorations;
&gt; +    if (useInnerContentLayer(hasBoxDecorations) &amp;&amp; renderer()-&gt;isImage()) {
&gt; +        RenderImage* imageRenderer = (RenderImage*)renderer();
&gt; +        if (imageRenderer &amp;&amp;
&gt; +            imageRenderer-&gt;cachedImage() &amp;&amp;
&gt; +            imageRenderer-&gt;cachedImage()-&gt;image() &amp;&amp;
&gt; +            imageRenderer-&gt;cachedImage()-&gt;isLoaded()) {
&gt; +            // We have to wait until the image is fully loaded before setting it on the layer.

Not when &lt;rdar://problem/5798760&gt; is fixed. We should think about whether we want to set images
on layers while the image is being loaded.

&gt; +            // This is a no-op if the layer doesn&apos;t have an inner layer for the image.
&gt; +            m_graphicsLayer-&gt;setContentsToImage(imageRenderer-&gt;cachedImage()-&gt;image());
&gt; +            
&gt; +            // Image animation is &quot;lazy&quot;, in that it automatically stops unless someone is drawing
&gt; +            // the image. So we have to kick the animation each time; this has the downside that the
&gt; +            // image will keep animating, even if it&apos;s layer is not visible.

its, not it&apos;s.

&gt; diff --git a/WebCore/rendering/RenderLayerBacking.h b/WebCore/rendering/RenderLayerBacking.h

&gt; +    // Returns true if we can optimize the RenderLayer to draw the replaced content
&gt; +    // directly into a compositing buffer
&gt; +    bool useInnerContentLayer(bool&amp; hasBoxDecorations) const;

I&apos;m not a big fan of returning hasBoxDecorations as a side-effect of this method. Can it just
be an accessor on the style?

&gt; diff --git a/WebCore/rendering/RenderObject.h b/WebCore/rendering/RenderObject.h
&gt; index c52b1ae..11631b0 100644
&gt; --- a/WebCore/rendering/RenderObject.h
&gt; +++ b/WebCore/rendering/RenderObject.h
&gt; @@ -269,6 +269,7 @@ public:
&gt;      virtual bool isTextControl() const { return false; }
&gt;      virtual bool isTextArea() const { return false; }
&gt;      virtual bool isTextField() const { return false; }
&gt; +    virtual bool isVideo() const { return false; }

I don&apos;t think we want this now.

&gt; diff --git a/WebCore/rendering/RenderVideo.h b/WebCore/rendering/RenderVideo.h
&gt; index 43c1e7b..b69c1f7 100644
&gt; --- a/WebCore/rendering/RenderVideo.h
&gt; +++ b/WebCore/rendering/RenderVideo.h
&gt; @@ -41,6 +41,8 @@ public:
&gt;  
&gt;      virtual const char* renderName() const { return &quot;RenderVideo&quot;; }
&gt;  
&gt; +    virtual bool isVideo() const { return true; }

Ditto.

r- for now, but I think it&apos;s generally OK.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115122</commentid>
    <comment_count>3</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2009-03-25 03:31:10 -0700</bug_when>
    <thetext>&gt; I don&apos;t think we need to call isSimpleContainerCompositingLayer() if we&apos;ve
&gt; already determined that this
&gt; is a simple image layer.

I think we have to - this code is called from a few different places and not always on a simple image.

e.g. updateAfterLayout()

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115124</commentid>
    <comment_count>4</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2009-03-25 03:34:58 -0700</bug_when>
    <thetext>&gt; I&apos;m not a big fan of returning hasBoxDecorations as a side-effect of this
&gt; method. Can it just be an accessor on the style?

Yeah, this was ugly and not necessary.

I changed it to canUseInnerContentLayer(), taking no parameters.

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115125</commentid>
    <comment_count>5</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2009-03-25 03:36:48 -0700</bug_when>
    <thetext>&gt; Not when &lt;rdar://problem/5798760&gt; is fixed. We should think about whether we
&gt; want to set images on layers while the image is being loaded.

I think we should leave this in for now. That bug doesn&apos;t look like it will be fixed for Leopard anytime soon (or ever).

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115129</commentid>
    <comment_count>6</comment_count>
      <attachid>28927</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2009-03-25 04:04:25 -0700</bug_when>
    <thetext>Created attachment 28927
updated patch (with changelog and manual test)

Addressed all review comments. Now with changelog and a manual test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115177</commentid>
    <comment_count>7</comment_count>
      <attachid>28927</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-03-25 10:42:41 -0700</bug_when>
    <thetext>Comment on attachment 28927
updated patch (with changelog and manual test)

&gt; diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
&gt; index 3c2a777..6529e61 100644
&gt; --- a/WebCore/ChangeLog
&gt; +++ b/WebCore/ChangeLog
&gt; @@ -1,3 +1,35 @@
&gt; +2009-03-25  Dean Jackson  &lt;dino@apple.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).

Normally the bug URL goes right here on a line by itself.

&gt; diff --git a/WebCore/manual-tests/resources/simple_image.png b/WebCore/manual-tests/resources/simple_image.png

I think these should be pixel tests, though I&apos;m not sure where they should live. They could go anywhere,
since they will look OK with accel-comp turned off, and it&apos;s fine to put a dummy 3d transform in the css.

&gt; diff --git a/WebCore/rendering/RenderLayer.cpp b/WebCore/rendering/RenderLayer.cpp
&gt; index 6ca9174..6861016 100644
&gt; --- a/WebCore/rendering/RenderLayer.cpp
&gt; +++ b/WebCore/rendering/RenderLayer.cpp
&gt; @@ -224,6 +224,15 @@ RenderLayerCompositor* RenderLayer::compositor() const
&gt;      ASSERT(renderer()-&gt;view());
&gt;      return renderer()-&gt;view()-&gt;compositor();
&gt;  }
&gt; +    
&gt; +void RenderLayer::rendererContentChanged()
&gt; +{
&gt; +    if (compositor()-&gt;updateLayerCompositingState(this, StyleDifferenceEqual))
&gt; +        compositor()-&gt;setCompositingLayersNeedUpdate();     // FIXME: layers will only get updated after the next layout.

I&apos;m not sure that updateLayerCompositingState() here can ever cause the layer to move
between compositing and non-compositing, so the setCompositingLayersNeedUpdate() may not
be required.

&gt; diff --git a/WebCore/rendering/RenderLayerBacking.cpp b/WebCore/rendering/RenderLayerBacking.cpp

&gt; +    // Reject anything that has a border, a border-radius, outline, margin or padding.
&gt; +    bool hasBoxDecorations = hasBorderOutlineOrShadow(style) || style-&gt;hasMargin() || style-&gt;hasPadding();
&gt; +    
&gt; +    // Only optimize images that are unadorned.
&gt; +    if (renderObject-&gt;isImage())
&gt; +        return !hasBoxDecorations;

No point computing hasBoxDecorations if you are not an image.

&gt; @@ -572,9 +602,36 @@ void RenderLayerBacking::detectDrawingOptimizations()
&gt;  {
&gt;      bool drawsContent = true;
&gt;  
&gt; -    if (isSimpleContainerCompositingLayer() || paintingGoesToWindow())
&gt; +    // Check if a replaced layer can be further simplified.
&gt; +    bool hasImageBackgroundColor = false;
&gt; +    if (canUseInnerContentLayer()) {
&gt; +        if (renderer()-&gt;isImage()) {
&gt; +            RenderImage* imageRenderer = (RenderImage*)renderer();
&gt; +            if (imageRenderer &amp;&amp; imageRenderer-&gt;cachedImage() &amp;&amp; imageRenderer-&gt;cachedImage()-&gt;image())
&gt; +                m_graphicsLayer-&gt;setContentsToImage(imageRenderer-&gt;cachedImage()-&gt;image());

Hmm, this might set the image before it&apos;s fully loaded. Maybe we should just call
rendererContentChanged() here, to avoid code duplication.

&gt; +            drawsContent = false;
&gt; +        }
&gt; +        
&gt; +        if (rendererHasBackground()) {
&gt; +            m_graphicsLayer-&gt;setBackgroundColor(rendererBackgroundColor());
&gt; +            hasImageBackgroundColor = true;
&gt; +        }
&gt; +    } else {
&gt; +        m_graphicsLayer-&gt;clearContents();
&gt; +        drawsContent = true;
&gt; +    }
&gt; +    
&gt; +    if (isSimpleContainerCompositingLayer())
&gt;          drawsContent = false;

I think this should be an else if, since you can&apos;t have canUseInnerContentLayer() and
isSimpleContainerCompositingLayer().

&gt; -
&gt; +    else if (!hasImageBackgroundColor) {
&gt; +        // Clear the background color in case we are swapping away from a simple layer.
&gt; +        m_graphicsLayer-&gt;clearBackgroundColor();
&gt; +    }

The logic flow here is confusing. Maybe it should be:

if (canUseInnerContentLayer()) {

} else {
    if (isSimpleContainerCompositingLayer())
        ...
    else if (!hasImageBackgroundColor)
        ...
}

r=me with the test in a better place, and the suggestions above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115243</commentid>
    <comment_count>8</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2009-03-25 16:05:09 -0700</bug_when>
    <thetext>&gt; +void RenderLayer::rendererContentChanged()
&gt;&gt; +{
&gt;&gt; +    if (compositor()-&gt;updateLayerCompositingState(this, StyleDifferenceEqual))
&gt; &gt; +        compositor()-&gt;setCompositingLayersNeedUpdate();     // FIXME: layers will only get updated after the next layout.

&gt; I&apos;m not sure that updateLayerCompositingState() here can ever cause the layer
&gt; to move
&gt; between compositing and non-compositing, so the
&gt; setCompositingLayersNeedUpdate() may not
&gt; be required.

I think you&apos;re right. removing that code.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115269</commentid>
    <comment_count>9</comment_count>
      <attachid>28954</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2009-03-25 17:10:33 -0700</bug_when>
    <thetext>Created attachment 28954
extracted patch for animated gif updates

Simon, please check this small change to RenderImage::imageChanged(). It fixes animated gifs in composited layers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115271</commentid>
    <comment_count>10</comment_count>
      <attachid>28954</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-03-25 17:27:27 -0700</bug_when>
    <thetext>Comment on attachment 28954
extracted patch for animated gif updates

&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +        if (hasLayer()) {
&gt; +            // tell any potential compositing layers
&gt; +            // that the image needs updating.
&gt; +            layer()-&gt;rendererContentChanged();

Sentence case for the comment, please (and you can probably put it on one line).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115279</commentid>
    <comment_count>11</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2009-03-25 18:39:15 -0700</bug_when>
    <thetext>Committed r41996
	M	WebCore/ChangeLog
	M	WebCore/platform/graphics/Image.h
	A	WebCore/manual-tests/simple-image-compositing.html
	A	WebCore/manual-tests/resources/simple_image.png
	M	WebCore/rendering/RenderLayer.cpp
	M	WebCore/rendering/RenderImage.cpp
	M	WebCore/rendering/RenderLayerBacking.h
	M	WebCore/rendering/RenderImage.h
	M	WebCore/rendering/RenderLayerBacking.cpp
	M	WebCore/rendering/RenderLayer.h
	A	LayoutTests/platform/mac/compositing/direct-image-compositing-expected.txt
	A	LayoutTests/platform/mac/compositing/direct-image-compositing-expected.checksum
	A	LayoutTests/platform/mac/compositing/direct-image-compositing-expected.png
	M	LayoutTests/ChangeLog
	A	LayoutTests/compositing/direct-image-compositing.html
	A	LayoutTests/compositing/resources/simple_image.png
</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28916</attachid>
            <date>2009-03-24 16:36:45 -0700</date>
            <delta_ts>2009-03-25 04:04:25 -0700</delta_ts>
            <desc>initial patch for coding review</desc>
            <filename>simple-image.patch</filename>
            <type>text/plain</type>
            <size>11063</size>
            <attacher name="Dean Jackson">dino</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2UuaCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2UuaAppbmRleCBiODMyYmU5Li5kNmJkZTExIDEwMDY0NAot
LS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ltYWdlLmgKKysrIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9JbWFnZS5oCkBAIC0xMTQsOSArMTE0LDkgQEAgcHVibGljOgogCiAgICAg
U2hhcmVkQnVmZmVyKiBkYXRhKCkgeyByZXR1cm4gbV9kYXRhLmdldCgpOyB9CiAKLSAgICAvLyBJ
dCBtYXkgbG9vayB1bnVzdWFsIHRoYXQgdGhlcmUgaXMgbm8gc3RhcnQgYW5pbWF0aW9uIGNhbGwg
YXMgcHVibGljIEFQSS4gIFRoaXMgaXMgYmVjYXVzZQotICAgIC8vIHdlIHN0YXJ0IGFuZCBzdG9w
IGFuaW1hdGluZyBsYXppbHkuICBBbmltYXRpb24gYmVnaW5zIHdoZW5ldmVyIHNvbWVvbmUgZHJh
d3MgdGhlIGltYWdlLiAgSXQgd2lsbAotICAgIC8vIGF1dG9tYXRpY2FsbHkgcGF1c2Ugb25jZSBh
bGwgb2JzZXJ2ZXJzIG5vIGxvbmdlciB3YW50IHRvIHJlbmRlciB0aGUgaW1hZ2UgYW55d2hlcmUu
CisgICAgLy8gQW5pbWF0aW9uIGJlZ2lucyB3aGVuZXZlciBzb21lb25lIGRyYXdzIHRoZSBpbWFn
ZSwgc28gc3RhcnRBbmltYXRpb24oKSBpcyBub3Qgbm9ybWFsbHkgY2FsbGVkLgorICAgIC8vIEl0
IHdpbGwgYXV0b21hdGljYWxseSBwYXVzZSBvbmNlIGFsbCBvYnNlcnZlcnMgbm8gbG9uZ2VyIHdh
bnQgdG8gcmVuZGVyIHRoZSBpbWFnZSBhbnl3aGVyZS4KKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnRB
bmltYXRpb24oYm9vbCAvKmNhdGNoVXBJZk5lY2Vzc2FyeSovID0gdHJ1ZSkgeyB9CiAgICAgdmly
dHVhbCB2b2lkIHN0b3BBbmltYXRpb24oKSB7fQogICAgIHZpcnR1YWwgdm9pZCByZXNldEFuaW1h
dGlvbigpIHt9CiAgICAgCkBAIC0xNTgsOCArMTU4LDYgQEAgcHJvdGVjdGVkOgogICAgIHZpcnR1
YWwgYm9vbCBtYXlGaWxsV2l0aFNvbGlkQ29sb3IoKSB7IHJldHVybiBmYWxzZTsgfQogICAgIHZp
cnR1YWwgQ29sb3Igc29saWRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIENvbG9yKCk7IH0KICAgICAK
LSAgICB2aXJ0dWFsIHZvaWQgc3RhcnRBbmltYXRpb24oYm9vbCAvKmNhdGNoVXBJZk5lY2Vzc2Fy
eSovID0gdHJ1ZSkgeyB9Ci0gICAgCiAgICAgdmlydHVhbCB2b2lkIGRyYXdQYXR0ZXJuKEdyYXBo
aWNzQ29udGV4dCosIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgVHJhbnNmb3JtYXRp
b25NYXRyaXgmIHBhdHRlcm5UcmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciwgY29uc3QgRmxvYXRS
ZWN0JiBkZXN0UmVjdCk7CiAjaWYgUExBVEZPUk0oQ0cpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJJbWFnZS5jcHAgYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbWFnZS5j
cHAKaW5kZXggODJmMzc0MS4uOGVjMWRjMiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVySW1hZ2UuY3BwCisrKyBiL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckltYWdlLmNwcApA
QCAtMzE0LDYgKzMxNCwyMCBAQCB2b2lkIFJlbmRlckltYWdlOjppbWFnZUNoYW5nZWQoV3JhcHBl
ZEltYWdlUHRyIG5ld0ltYWdlLCBjb25zdCBJbnRSZWN0KiByZWN0KQogICAgIH0KIH0KIAordm9p
ZCBSZW5kZXJJbWFnZTo6bm90aWZ5RmluaXNoZWQoQ2FjaGVkUmVzb3VyY2UqIG5ld0ltYWdlKQor
eworICAgIGlmIChkb2N1bWVudEJlaW5nRGVzdHJveWVkKCkpCisgICAgICAgIHJldHVybjsKKwor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBpZiAoKG5ld0ltYWdlID09IG1f
Y2FjaGVkSW1hZ2UpICYmIGxheWVyKCkpIHsKKyAgICAgICAgLy8gVGVsbCBhbnkgcG90ZW50aWFs
IGNvbXBvc2l0aW5nIGxheWVycyB0aGF0IHRoZSBpbWFnZQorICAgICAgICAvLyBpcyBkb25lIGFu
ZCB0aGV5IGNhbiByZWZlcmVuY2UgaXQgZGlyZWN0bHkuCisgICAgICAgIGxheWVyKCktPnJlbmRl
cmVyQ29udGVudENoYW5nZWQoKTsKKyAgICB9CisjZW5kaWYKK30KKyAgICAKIHZvaWQgUmVuZGVy
SW1hZ2U6OnJlc2V0QW5pbWF0aW9uKCkKIHsKICAgICBpZiAobV9jYWNoZWRJbWFnZSkgewpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW1hZ2UuaCBiL1dlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlckltYWdlLmgKaW5kZXggZjNlMGU0MC4uMDQyNDUyZiAxMDA2NDQKLS0tIGEvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVySW1hZ2UuaAorKysgYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJJbWFnZS5oCkBAIC00OCw2ICs0OCw3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIGludCBtaW5p
bXVtUmVwbGFjZWRIZWlnaHQoKSBjb25zdDsKIAogICAgIHZpcnR1YWwgdm9pZCBpbWFnZUNoYW5n
ZWQoV3JhcHBlZEltYWdlUHRyLCBjb25zdCBJbnRSZWN0KiA9IDApOworICAgIHZpcnR1YWwgdm9p
ZCBub3RpZnlGaW5pc2hlZChDYWNoZWRSZXNvdXJjZSopOwogICAgIAogICAgIGJvb2wgc2V0SW1h
Z2VTaXplRm9yQWx0VGV4dChDYWNoZWRJbWFnZSogbmV3SW1hZ2UgPSAwKTsKIApkaWZmIC0tZ2l0
IGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXIuY3BwIGIvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyTGF5ZXIuY3BwCmluZGV4IDZjYTkxNzQuLjY4NjEwMTYgMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckxheWVyLmNwcAorKysgYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJMYXllci5jcHAKQEAgLTIyNCw2ICsyMjQsMTUgQEAgUmVuZGVyTGF5ZXJDb21wb3NpdG9yKiBS
ZW5kZXJMYXllcjo6Y29tcG9zaXRvcigpIGNvbnN0CiAgICAgQVNTRVJUKHJlbmRlcmVyKCktPnZp
ZXcoKSk7CiAgICAgcmV0dXJuIHJlbmRlcmVyKCktPnZpZXcoKS0+Y29tcG9zaXRvcigpOwogfQor
ICAgIAordm9pZCBSZW5kZXJMYXllcjo6cmVuZGVyZXJDb250ZW50Q2hhbmdlZCgpCit7CisgICAg
aWYgKGNvbXBvc2l0b3IoKS0+dXBkYXRlTGF5ZXJDb21wb3NpdGluZ1N0YXRlKHRoaXMsIFN0eWxl
RGlmZmVyZW5jZUVxdWFsKSkKKyAgICAgICAgY29tcG9zaXRvcigpLT5zZXRDb21wb3NpdGluZ0xh
eWVyc05lZWRVcGRhdGUoKTsgICAgIC8vIEZJWE1FOiBsYXllcnMgd2lsbCBvbmx5IGdldCB1cGRh
dGVkIGFmdGVyIHRoZSBuZXh0IGxheW91dC4KKyAgICAKKyAgICBpZiAobV9iYWNraW5nKQorICAg
ICAgICBtX2JhY2tpbmctPnJlbmRlcmVyQ29udGVudENoYW5nZWQoKTsKK30gICAgCiAjZW5kaWYg
Ly8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQogCiB2b2lkIFJlbmRlckxheWVyOjpzZXRT
dGF0aWNZKGludCBzdGF0aWNZKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
TGF5ZXIuaCBiL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyLmgKaW5kZXggYmU0ZDJkNS4u
MTNjYjkwMiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXIuaAorKysg
Yi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllci5oCkBAIC0yODIsNiArMjgyLDEwIEBAIHB1
YmxpYzoKICAgICAKICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCiAgICAgUmVuZGVy
TGF5ZXJDb21wb3NpdG9yKiBjb21wb3NpdG9yKCkgY29uc3Q7CisgICAgCisgICAgLy8gTm90aWZp
Y2F0aW9uIGZyb20gdGhlIHJlbmRlcmVyIHRoYXQgaXRzIGNvbnRlbnQgY2hhbmdlZCAoZS5nLiBj
dXJyZW50IGZyYW1lIG9mIGltYWdlIGNoYW5nZWQpLgorICAgIC8vIEFsbG93cyB1cGRhdGVzIG9m
IGxheWVyIGNvbnRlbnQgd2l0aG91dCByZXBhaW50aW5nLgorICAgIHZvaWQgcmVuZGVyZXJDb250
ZW50Q2hhbmdlZCgpOwogI2VuZGlmCiAgICAgCiAgICAgdm9pZCB1cGRhdGVMYXllclBvc2l0aW9u
KCk7CmRpZmYgLS1naXQgYS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckJhY2tpbmcuY3Bw
IGIvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5nLmNwcAppbmRleCAyOWM0Njc2
Li5iZTI2YTk2IDEwMDY0NAotLS0gYS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckJhY2tp
bmcuY3BwCisrKyBiL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5jcHAKQEAg
LTU1NSw2ICs1NTUsNDAgQEAgYm9vbCBSZW5kZXJMYXllckJhY2tpbmc6Omhhc05vbkNvbXBvc2l0
aW5nQ29udGVudCgpIGNvbnN0CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCisvLyBBIGxheWVyIGNh
biB1c2UgYW4gaW5uZXIgY29udGVudCBsYXllciBpZiB0aGUgcmVuZGVyIGxheWVyJ3Mgb2JqZWN0
IGlzIGEgcmVwbGFjZWQgb2JqZWN0IGFuZCBoYXMgbm8gY2hpbGRyZW4uCisvLyBUaGlzIGFsbG93
cyB0aGUgR3JhcGhpY3NMYXllciB0byBkaXNwbGF5IHRoZSBSZW5kZXJMYXllciBjb250ZW50cyBk
aXJlY3RseTsgaXQncyB1c2VkIGZvciBpbWFnZXMgYW5kIHZpZGVvLgorYm9vbCBSZW5kZXJMYXll
ckJhY2tpbmc6OnVzZUlubmVyQ29udGVudExheWVyKGJvb2wmIGhhc0JveERlY29yYXRpb25zKSBj
b25zdAoreworICAgIFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0ID0gcmVuZGVyZXIoKTsKKyAg
ICAKKyAgICAvLyBSZWplY3QgYW55dGhpbmcgdGhhdCBpc24ndCBhIFJlbmRlclJlcGxhY2VkLgor
ICAgIGlmICghcmVuZGVyT2JqZWN0LT5pc1JlcGxhY2VkKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAKKyAgICBpZiAocmVuZGVyT2JqZWN0LT5oYXNNYXNrKCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSByZW5kZXJPYmplY3QtPnN0
eWxlKCk7CisgICAgCisgICAgLy8gVmlkZW8gYWx3YXlzIHVzZXMgYW4gaW5uZXIgbGF5ZXIgKGZv
ciBub3cpLgorICAgIGlmIChyZW5kZXJPYmplY3QtPmlzVmlkZW8oKSkKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgCisgICAgLy8gUmVqZWN0IGFueXRoaW5nIHRoYXQgaGFzIGEgYmFja2dyb3Vu
ZCBvdGhlciB0aGFuIGEgc29saWQgY29sb3IuCisgICAgaWYgKCFoYXNTaW1wbGVCYWNrZ3JvdW5k
KHN0eWxlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIC8vIFJlamVjdCBhbnl0
aGluZyB0aGF0IGhhcyBhIGJvcmRlciwgYSBib3JkZXItcmFkaXVzLCBvdXRsaW5lLCBtYXJnaW4g
b3IgcGFkZGluZy4KKyAgICBoYXNCb3hEZWNvcmF0aW9ucyA9IGhhc0JvcmRlck91dGxpbmVPclNo
YWRvdyhzdHlsZSkgfHwgc3R5bGUtPmhhc01hcmdpbigpIHx8IHN0eWxlLT5oYXNQYWRkaW5nKCk7
CisgICAgCisgICAgLy8gT25seSBvcHRpbWl6ZSBpbWFnZXMgdGhhdCBhcmUgdW5hZG9ybmVkLgor
ICAgIGlmIChyZW5kZXJPYmplY3QtPmlzSW1hZ2UoKSkKKyAgICAgICAgcmV0dXJuICFoYXNCb3hE
ZWNvcmF0aW9uczsKKyAgICAKKyAgICByZXR1cm4gZmFsc2U7Cit9CisgICAgCisgICAgCiAvLyBB
ICJzaW1wbGUgY29udGFpbmVyIGxheWVyIiBpcyBhIFJlbmRlckxheWVyIHdoaWNoIGhhcyBubyB2
aXNpYmxlIGNvbnRlbnQgdG8gcmVuZGVyLgogLy8gSXQgbWF5IGhhdmUgbm8gY2hpbGRyZW4sIG9y
IGFsbCBpdHMgY2hpbGRyZW4gbWF5IGJlIHRoZW1zZWx2ZXMgY29tcG9zaXRlZC4KIC8vIFRoaXMg
aXMgYSB1c2VmdWwgb3B0aW1pemF0aW9uLCBiZWNhdXNlIGl0IGFsbG93cyB1cyB0byBhdm9pZCBh
bGxvY2F0aW5nIGJhY2tpbmcgc3RvcmUuCkBAIC01NzIsOSArNjA2LDQxIEBAIHZvaWQgUmVuZGVy
TGF5ZXJCYWNraW5nOjpkZXRlY3REcmF3aW5nT3B0aW1pemF0aW9ucygpCiB7CiAgICAgYm9vbCBk
cmF3c0NvbnRlbnQgPSB0cnVlOwogCi0gICAgaWYgKGlzU2ltcGxlQ29udGFpbmVyQ29tcG9zaXRp
bmdMYXllcigpIHx8IHBhaW50aW5nR29lc1RvV2luZG93KCkpCisgICAgLy8gQ2hlY2sgaWYgYSBy
ZXBsYWNlZCBsYXllciBjYW4gYmUgZnVydGhlciBzaW1wbGlmaWVkLgorICAgIGJvb2wgaGFzQm94
RGVjb3JhdGlvbnMgPSBmYWxzZTsKKyAgICBib29sIGhhc0ltYWdlQmFja2dyb3VuZENvbG9yID0g
ZmFsc2U7CisgICAgaWYgKHVzZUlubmVyQ29udGVudExheWVyKGhhc0JveERlY29yYXRpb25zKSkg
eworICAgICAgICAvLyBGSVhNRTogdmlkZW8gY2FuIGdvIGhlcmUgb25jZSB3ZSBob29rIHVwIGFj
Y2VsZXJhdGVkIGNvbXBvc2l0aW5nIGZvciB2aWRlbworICAgICAgICAvKiBpZiAocmVuZGVyZXIo
KS0+aXNWaWRlbygpKSB7CisgICAgICAgICAgICBkcmF3c0NvbnRlbnQgPSBoYXNCb3hEZWNvcmF0
aW9ucyB8fCByZW5kZXJlcigpLT5zdHlsZSgpLT5oYXNCYWNrZ3JvdW5kKCk7CisgICAgICAgIH0g
Ki8KKyAgICAgICAgaWYgKHJlbmRlcmVyKCktPmlzSW1hZ2UoKSkgeworICAgICAgICAgICAgUmVu
ZGVySW1hZ2UqIGltYWdlUmVuZGVyZXIgPSAoUmVuZGVySW1hZ2UqKXJlbmRlcmVyKCk7CisgICAg
ICAgICAgICBpZiAoaW1hZ2VSZW5kZXJlciAmJiBpbWFnZVJlbmRlcmVyLT5jYWNoZWRJbWFnZSgp
ICYmIGltYWdlUmVuZGVyZXItPmNhY2hlZEltYWdlKCktPmltYWdlKCkpCisgICAgICAgICAgICAg
ICAgbV9ncmFwaGljc0xheWVyLT5zZXRDb250ZW50c1RvSW1hZ2UoaW1hZ2VSZW5kZXJlci0+Y2Fj
aGVkSW1hZ2UoKS0+aW1hZ2UoKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRyYXdzQ29u
dGVudCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocmVuZGVyZXJI
YXNCYWNrZ3JvdW5kKCkpIHsKKyAgICAgICAgICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0QmFja2dy
b3VuZENvbG9yKHJlbmRlcmVyQmFja2dyb3VuZENvbG9yKCkpOworICAgICAgICAgICAgaGFzSW1h
Z2VCYWNrZ3JvdW5kQ29sb3IgPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgbV9ncmFwaGljc0xheWVyLT5jbGVhckNvbnRlbnRzKCk7CisgICAgICAgIGRyYXdzQ29udGVu
dCA9IHRydWU7CisgICAgfQorICAgIAorICAgIGlmIChpc1NpbXBsZUNvbnRhaW5lckNvbXBvc2l0
aW5nTGF5ZXIoKSkKICAgICAgICAgZHJhd3NDb250ZW50ID0gZmFsc2U7Ci0KKyAgICBlbHNlIGlm
ICghaGFzSW1hZ2VCYWNrZ3JvdW5kQ29sb3IpIHsKKyAgICAgICAgLy8gQ2xlYXIgdGhlIGJhY2tn
cm91bmQgY29sb3IgaW4gY2FzZSB3ZSBhcmUgc3dhcHBpbmcgYXdheSBmcm9tIGEgc2ltcGxlIGxh
eWVyLgorICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPmNsZWFyQmFja2dyb3VuZENvbG9yKCk7Cisg
ICAgfQorICAgIAorICAgIGlmIChwYWludGluZ0dvZXNUb1dpbmRvdygpKQorICAgICAgICBkcmF3
c0NvbnRlbnQgPSBmYWxzZTsKKyAgICAKICAgICBtX2dyYXBoaWNzTGF5ZXItPnNldERyYXdzQ29u
dGVudChkcmF3c0NvbnRlbnQpOwogfQogCkBAIC01ODMsNiArNjQ5LDI4IEBAIHZvaWQgUmVuZGVy
TGF5ZXJCYWNraW5nOjppbnZhbGlkYXRlRHJhd2luZ09wdGltaXphdGlvbnMoKQogICAgIG1fc2lt
cGxlQ29tcG9zaXRpbmdMYXllclN0YXR1c0RpcnR5ID0gdHJ1ZTsKIH0KIAordm9pZCBSZW5kZXJM
YXllckJhY2tpbmc6OnJlbmRlcmVyQ29udGVudENoYW5nZWQoKQoreworICAgIGJvb2wgaGFzQm94
RGVjb3JhdGlvbnM7CisgICAgaWYgKHVzZUlubmVyQ29udGVudExheWVyKGhhc0JveERlY29yYXRp
b25zKSAmJiByZW5kZXJlcigpLT5pc0ltYWdlKCkpIHsKKyAgICAgICAgUmVuZGVySW1hZ2UqIGlt
YWdlUmVuZGVyZXIgPSAoUmVuZGVySW1hZ2UqKXJlbmRlcmVyKCk7CisgICAgICAgIGlmIChpbWFn
ZVJlbmRlcmVyICYmCisgICAgICAgICAgICBpbWFnZVJlbmRlcmVyLT5jYWNoZWRJbWFnZSgpICYm
CisgICAgICAgICAgICBpbWFnZVJlbmRlcmVyLT5jYWNoZWRJbWFnZSgpLT5pbWFnZSgpICYmCisg
ICAgICAgICAgICBpbWFnZVJlbmRlcmVyLT5jYWNoZWRJbWFnZSgpLT5pc0xvYWRlZCgpKSB7Cisg
ICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHdhaXQgdW50aWwgdGhlIGltYWdlIGlzIGZ1bGx5IGxv
YWRlZCBiZWZvcmUgc2V0dGluZyBpdCBvbiB0aGUgbGF5ZXIuCisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIC8vIFRoaXMgaXMgYSBuby1vcCBpZiB0aGUgbGF5ZXIgZG9lc24ndCBoYXZlIGFuIGlu
bmVyIGxheWVyIGZvciB0aGUgaW1hZ2UuCisgICAgICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnNl
dENvbnRlbnRzVG9JbWFnZShpbWFnZVJlbmRlcmVyLT5jYWNoZWRJbWFnZSgpLT5pbWFnZSgpKTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSW1hZ2UgYW5pbWF0aW9uIGlzICJsYXp5Iiwg
aW4gdGhhdCBpdCBhdXRvbWF0aWNhbGx5IHN0b3BzIHVubGVzcyBzb21lb25lIGlzIGRyYXdpbmcK
KyAgICAgICAgICAgIC8vIHRoZSBpbWFnZS4gU28gd2UgaGF2ZSB0byBraWNrIHRoZSBhbmltYXRp
b24gZWFjaCB0aW1lOyB0aGlzIGhhcyB0aGUgZG93bnNpZGUgdGhhdCB0aGUKKyAgICAgICAgICAg
IC8vIGltYWdlIHdpbGwga2VlcCBhbmltYXRpbmcsIGV2ZW4gaWYgaXQncyBsYXllciBpcyBub3Qg
dmlzaWJsZS4KKyAgICAgICAgICAgIGltYWdlUmVuZGVyZXItPmNhY2hlZEltYWdlKCktPmltYWdl
KCktPnN0YXJ0QW5pbWF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIEZsb2F0UG9pbnQz
RCBSZW5kZXJMYXllckJhY2tpbmc6OmNvbXB1dGVUcmFuc2Zvcm1PcmlnaW4oY29uc3QgSW50UmVj
dCYgYm9yZGVyQm94KSBjb25zdAogewogICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHJlbmRlcmVy
KCktPnN0eWxlKCk7CmRpZmYgLS1naXQgYS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckJh
Y2tpbmcuaCBiL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5oCmluZGV4IDBm
N2RkY2MuLmE0MGFjY2YgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVy
QmFja2luZy5oCisrKyBiL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5oCkBA
IC04OCw2ICs4OCw5IEBAIHB1YmxpYzoKICAgICAvLyByIGlzIGluIHRoZSBjb29yZGluYXRlIHNw
YWNlIG9mIHRoZSBsYXllcidzIHJlbmRlciBvYmplY3QKICAgICB2b2lkIHNldENvbnRlbnRzTmVl
ZERpc3BsYXlJblJlY3QoY29uc3QgSW50UmVjdCYgcik7CiAKKyAgICAvLyBOb3RpZmljYXRpb24g
ZnJvbSB0aGUgcmVuZGVyZXIgdGhhdCBpdHMgY29udGVudCBjaGFuZ2VkOyB1c2VkIGJ5IFJlbmRl
ckltYWdlLgorICAgIHZvaWQgcmVuZGVyZXJDb250ZW50Q2hhbmdlZCgpOworCiAgICAgLy8gSW50
ZXJmYWNlIHRvIHN0YXJ0LCBmaW5pc2gsIHN1c3BlbmQgYW5kIHJlc3VtZSBhbmltYXRpb25zIGFu
ZCB0cmFuc2l0aW9ucwogICAgIGJvb2wgc3RhcnRBbmltYXRpb24oZG91YmxlIGJlZ2luVGltZSwg
Y29uc3QgQW5pbWF0aW9uKiBhbmltLCBjb25zdCBLZXlmcmFtZUxpc3QmIGtleWZyYW1lcyk7CiAg
ICAgYm9vbCBzdGFydFRyYW5zaXRpb24oZG91YmxlIGJlZ2luVGltZSwgaW50IHByb3BlcnR5LCBj
b25zdCBSZW5kZXJTdHlsZSogZnJvbVN0eWxlLCBjb25zdCBSZW5kZXJTdHlsZSogdG9TdHlsZSk7
CkBAIC0xMzUsNiArMTM4LDkgQEAgcHJpdmF0ZToKICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhp
cyBSZW5kZXJMYXllciBvbmx5IGhhcyBjb250ZW50IHRoYXQgY2FuIGJlIHJlbmRlcmVkIGRpcmVj
dGx5CiAgICAgLy8gYnkgdGhlIGNvbXBvc2l0aW5nIGxheWVyLCB3aXRob3V0IGRyYXdpbmcgKGUu
Zy4gc29saWQgYmFja2dyb3VuZCBjb2xvcikuCiAgICAgYm9vbCBpc1NpbXBsZUNvbnRhaW5lckNv
bXBvc2l0aW5nTGF5ZXIoKTsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgd2UgY2FuIG9wdGltaXpl
IHRoZSBSZW5kZXJMYXllciB0byBkcmF3IHRoZSByZXBsYWNlZCBjb250ZW50CisgICAgLy8gZGly
ZWN0bHkgaW50byBhIGNvbXBvc2l0aW5nIGJ1ZmZlcgorICAgIGJvb2wgdXNlSW5uZXJDb250ZW50
TGF5ZXIoYm9vbCYgaGFzQm94RGVjb3JhdGlvbnMpIGNvbnN0OwogCiAgICAgYm9vbCByZW5kZXJl
ckhhc0JhY2tncm91bmQoKSBjb25zdDsKICAgICBjb25zdCBDb2xvciYgcmVuZGVyZXJCYWNrZ3Jv
dW5kQ29sb3IoKSBjb25zdDsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9i
amVjdC5oIGIvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgKaW5kZXggYzUyYjFhZS4u
MTE2MzFiMCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgKKysr
IGIvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgKQEAgLTI2OSw2ICsyNjksNyBAQCBw
dWJsaWM6CiAgICAgdmlydHVhbCBib29sIGlzVGV4dENvbnRyb2woKSBjb25zdCB7IHJldHVybiBm
YWxzZTsgfQogICAgIHZpcnR1YWwgYm9vbCBpc1RleHRBcmVhKCkgY29uc3QgeyByZXR1cm4gZmFs
c2U7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNUZXh0RmllbGQoKSBjb25zdCB7IHJldHVybiBmYWxz
ZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc1ZpZGVvKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0K
ICAgICB2aXJ0dWFsIGJvb2wgaXNXaWRnZXQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCiAg
ICAgYm9vbCBpc1Jvb3QoKSBjb25zdCB7IHJldHVybiBkb2N1bWVudCgpLT5kb2N1bWVudEVsZW1l
bnQoKSA9PSBtX25vZGU7IH0KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclZp
ZGVvLmggYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJWaWRlby5oCmluZGV4IDQzYzFlN2IuLmI2
OWMxZjcgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclZpZGVvLmgKKysrIGIv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVmlkZW8uaApAQCAtNDEsNiArNDEsOCBAQCBwdWJsaWM6
CiAKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAi
UmVuZGVyVmlkZW8iOyB9CiAKKyAgICB2aXJ0dWFsIGJvb2wgaXNWaWRlbygpIGNvbnN0IHsgcmV0
dXJuIHRydWU7IH0KKyAgICAKICAgICB2aXJ0dWFsIHZvaWQgcGFpbnRSZXBsYWNlZChQYWludElu
Zm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpOwogCiAgICAgdmlydHVhbCB2b2lkIGxheW91
dCgpOwo=
</data>
<flag name="review"
          id="14294"
          type_id="1"
          status="-"
          setter="simon.fraser"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28927</attachid>
            <date>2009-03-25 04:04:25 -0700</date>
            <delta_ts>2009-03-25 10:42:41 -0700</delta_ts>
            <desc>updated patch (with changelog and manual test)</desc>
            <filename>simple-image.patch</filename>
            <type>text/plain</type>
            <size>13770</size>
            <attacher name="Dean Jackson">dino</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2MyYTc3Ny4uNjUyOWU2MSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNSBAQAorMjAwOS0wMy0yNSAgRGVhbiBKYWNrc29u
ICA8ZGlub0BhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgV2hlbiB1c2luZyBoYXJkd2FyZSBjb21wb3NpdGluZywgc29tZSBpbWFnZXMg
Y2FuIGJlIGRpcmVjdGx5CisgICAgICAgIHJlbmRlcmVkIGJ5IHRoZSBoYXJkd2FyZSAtIG5vIG5l
ZWQgdG8gZHJhdyB0aGVtIGludG8gYSBzZXBhcmF0ZQorICAgICAgICBjb250ZXh0LCB0aGVyZWZv
cmUgc2F2aW5nIG1lbW9yeS4KKyAgICAgICAgT25seSBpbWFnZXMgd2l0aCBjZXJ0YWluIHN0eWxl
IHByb3BlcnRpZXMgY2FuIGJlIGRpcmVjdGx5CisgICAgICAgIGNvbXBvc2l0ZWQgLSBiYXNpY2Fs
bHkgYW55dGhpbmcgdGhhdCBpcyBub3QgYSBzaW1wbGUgaW1hZ2UgcmVxdWlyZXMKKyAgICAgICAg
dGhlIHVzdWFsIHJlbmRlcmluZyBwYXRoIChlZy4gaWYgdGhlIGltYWdlIGhhcyBib3JkZXJzKS4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIzMzYxCisK
KyAgICAgICAgKiBtYW51YWwtdGVzdHMvcmVzb3VyY2VzL3NpbXBsZV9pbWFnZS5wbmc6IEFkZGVk
LgorICAgICAgICAqIG1hbnVhbC10ZXN0cy9zaW1wbGUtaW1hZ2UtY29tcG9zaXRpbmcuaHRtbDog
QWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2UuaDoKKyAgICAgICAgKFdl
YkNvcmU6OkltYWdlOjpzdGFydEFuaW1hdGlvbik6CisgICAgICAgICAgICAtIG1vdmUgdGhpcyB0
byBwdWJsaWMKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVySW1hZ2UuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVySW1hZ2U6Om5vdGlmeUZpbmlzaGVkKToKKyAgICAgICAgICAgIC0gbGV0
IHRoZSBjb21wb3NpdGluZyBsYXllciBrbm93IHRoYXQgaXQgY2FuIHJlbmRlciB0aGUgaW1hZ2UK
KyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVySW1hZ2UuaDoKKyAgICAgICAgKiByZW5kZXJpbmcv
UmVuZGVyTGF5ZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTGF5ZXI6OnJlbmRlcmVy
Q29udGVudENoYW5nZWQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJMYXllci5oOgorICAg
ICAgICAqIHJlbmRlcmluZy9SZW5kZXJMYXllckJhY2tpbmcuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyTGF5ZXJCYWNraW5nOjpjYW5Vc2VJbm5lckNvbnRlbnRMYXllcik6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJMYXllckJhY2tpbmc6OmRldGVjdERyYXdpbmdPcHRpbWl6YXRpb25z
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckxheWVyQmFja2luZzo6cmVuZGVyZXJDb250ZW50
Q2hhbmdlZCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5oOgorICAg
ICAgICAgICAgLSBjb2RlIHRvIGhvb2sgdXAgZGlyZWN0IGNvbXBvc2l0aW5nIG9mIGltYWdlcyB3
aGVyZQorICAgICAgICAgICAgICBwb3NzaWJsZQorCiAyMDA5LTAzLTIzICBTYW0gV2VpbmlnICA8
c2FtQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQW5kZXJzIENhcmxzc29uLgpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9tYW51YWwtdGVzdHMvcmVzb3VyY2VzL3NpbXBsZV9pbWFnZS5w
bmcgYi9XZWJDb3JlL21hbnVhbC10ZXN0cy9yZXNvdXJjZXMvc2ltcGxlX2ltYWdlLnBuZwpuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njg1Mzk5CkJpbmFyeSBmaWxlcyAvZGV2
L251bGwgYW5kIGIvV2ViQ29yZS9tYW51YWwtdGVzdHMvcmVzb3VyY2VzL3NpbXBsZV9pbWFnZS5w
bmcgZGlmZmVyCmRpZmYgLS1naXQgYS9XZWJDb3JlL21hbnVhbC10ZXN0cy9zaW1wbGUtaW1hZ2Ut
Y29tcG9zaXRpbmcuaHRtbCBiL1dlYkNvcmUvbWFudWFsLXRlc3RzL3NpbXBsZS1pbWFnZS1jb21w
b3NpdGluZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NGZmZWQK
LS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL21hbnVhbC10ZXN0cy9zaW1wbGUtaW1hZ2UtY29t
cG9zaXRpbmcuaHRtbApAQCAtMCwwICsxLDc2IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0v
L1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgorICAgImh0dHA6Ly93d3cudzMu
b3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CisKKzxodG1sIGxhbmc9ImVuIj4KKzxoZWFkPgorICA8
bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNl
dD11dGYtOCI+CisgIDx0aXRsZT5DaGVja2luZyBmb3Igc2ltcGxlIGltYWdlIGxheWVyIG9wdGlt
aXNhdGlvbjwvdGl0bGU+CisgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiI+
CisgICAgaW1nIHsKKyAgICAgIGZsb2F0OiBsZWZ0OworICAgICAgd2lkdGg6IDE1MHB4OworICAg
ICAgaGVpZ2h0OiAxNTBweDsKKyAgICB9CisgICAgcCB7CisgICAgICBjbGVhcjogYm90aDsKKyAg
ICAgIG1hcmdpbjogMWVtIDJlbTsKKyAgICAgIGhlaWdodDogMTgwcHg7CisgICAgfQorICAgIGlt
ZyB7CisgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgMCk7CisgICAg
fQorICAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorCisgIDxoMT5JbWFnZSBvcHRpbWlzYXRp
b24gaW4gbGF5ZXJzPC9oMT4KKworICA8cCBzdHlsZT0iaGVpZ2h0OiBhdXRvIj4KKyAgICBJbiBv
cmRlciB0byBydW4gdGhpcyB0ZXN0IHlvdSBzaG91bGQgZW5hYmxlIHRoZSBkZWJ1Z2dpbmcgb3B0
aW9ucyB0aGF0IGluZGljYXRlCisgICAgd2hhdCB0eXBlIG9mIGNvbXBvc2l0aW5nIGxheWVyIGlz
IGJlaW5nIHVzZWQuCisgIDwvcD4KKyAgCis8cHJlPgorZGVmYXVsdHMgd3JpdGUgY29tLmFwcGxl
LlNhZmFyaSBXZWJDb3JlTGF5ZXJSZXBhaW50Q291bnRlciAtYm9vbCB5ZXMKK2RlZmF1bHRzIHdy
aXRlIGNvbS5hcHBsZS5TYWZhcmkgV2ViQ29yZUxheWVyQm9yZGVycyAtYm9vbCB5ZXMKKzwvcHJl
PgorICAKKyAgPHAgc3R5bGU9ImhlaWdodDogYXV0byI+CisgICAgRGlyZWN0bHkgY29tcG9zaXRl
ZCBpbWFnZSBsYXllcnMgd2lsbCBoYXZlIGEgeWVsbG93IGJvcmRlciBhbmQgbm8gcmVwYWludCBj
b3VudGVyLgorICA8L3A+CisKKyAgPHA+CisgICAgPGltZyBzcmM9InJlc291cmNlcy9zaW1wbGVf
aW1hZ2UucG5nIj4KKyAgICBCYXNpYyBpbWFnZSAtIG5vIHN0eWxlIC0gY2FuIGJlIGRpcmVjdGx5
IGNvbXBvc2l0ZWQKKyAgPC9wPgorCisgIDxwPgorICAgIDxpbWcgc3JjPSJyZXNvdXJjZXMvc2lt
cGxlX2ltYWdlLnBuZyIgc3R5bGU9ImJvcmRlcjogNXB4IHNvbGlkIGJsdWU7Ij4KKyAgICA1cHgg
Ymx1ZSBib3JkZXIgLSBjYW4gTk9UIGJlIGRpcmVjdGx5IGNvbXBvc2l0ZWQKKyAgPC9wPgorCisg
IDxwPgorICAgIDxpbWcgc3JjPSJyZXNvdXJjZXMvc2ltcGxlX2ltYWdlLnBuZyIgc3R5bGU9Im1h
cmdpbjogMTBweCAyMHB4OyI+CisgICAgbWFyZ2luIC0gY2FuIE5PVCBiZSBkaXJlY3RseSBjb21w
b3NpdGVkCisgIDwvcD4KKworICA8cD4KKyAgICA8aW1nIHNyYz0icmVzb3VyY2VzL3NpbXBsZV9p
bWFnZS5wbmciIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiBncmV5OyI+CisgICAgc29saWQgYmFj
a2dyb3VuZCAtIGNhbiBiZSBkaXJlY3RseSBjb21wb3NpdGVkCisgIDwvcD4KKworICA8cD4KKyAg
ICA8aW1nIHNyYz0icmVzb3VyY2VzL3NpbXBsZV9pbWFnZS5wbmciIHN0eWxlPSJiYWNrZ3JvdW5k
OiBvcmFuZ2UgdXJsKHJlc291cmNlcy9zaW1wbGVfaW1hZ2UucG5nKSAtNTBweCAtNTBweDsiPgor
ICAgIGJhY2tncm91bmQgaW1hZ2UgLSBjYW4gTk9UIGJlIGRpcmVjdGx5IGNvbXBvc2l0ZWQKKyAg
PC9wPgorCisgIDxwPgorICAgIDxpbWcgc3JjPSJyZXNvdXJjZXMvc2ltcGxlX2ltYWdlLnBuZyIg
c3R5bGU9Ii13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAxMGRlZyk7Ij4KKyAg
ICByb3RhdGVkIGJ1dCBvdGhlcndpc2Ugbm8gc3R5bGUgLSBjYW4gYmUgZGlyZWN0bHkgY29tcG9z
aXRlZAorICA8L3A+CisKKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2UuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
SW1hZ2UuaAppbmRleCBiODMyYmU5Li5kNmJkZTExIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0ltYWdlLmgKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9JbWFn
ZS5oCkBAIC0xMTQsOSArMTE0LDkgQEAgcHVibGljOgogCiAgICAgU2hhcmVkQnVmZmVyKiBkYXRh
KCkgeyByZXR1cm4gbV9kYXRhLmdldCgpOyB9CiAKLSAgICAvLyBJdCBtYXkgbG9vayB1bnVzdWFs
IHRoYXQgdGhlcmUgaXMgbm8gc3RhcnQgYW5pbWF0aW9uIGNhbGwgYXMgcHVibGljIEFQSS4gIFRo
aXMgaXMgYmVjYXVzZQotICAgIC8vIHdlIHN0YXJ0IGFuZCBzdG9wIGFuaW1hdGluZyBsYXppbHku
ICBBbmltYXRpb24gYmVnaW5zIHdoZW5ldmVyIHNvbWVvbmUgZHJhd3MgdGhlIGltYWdlLiAgSXQg
d2lsbAotICAgIC8vIGF1dG9tYXRpY2FsbHkgcGF1c2Ugb25jZSBhbGwgb2JzZXJ2ZXJzIG5vIGxv
bmdlciB3YW50IHRvIHJlbmRlciB0aGUgaW1hZ2UgYW55d2hlcmUuCisgICAgLy8gQW5pbWF0aW9u
IGJlZ2lucyB3aGVuZXZlciBzb21lb25lIGRyYXdzIHRoZSBpbWFnZSwgc28gc3RhcnRBbmltYXRp
b24oKSBpcyBub3Qgbm9ybWFsbHkgY2FsbGVkLgorICAgIC8vIEl0IHdpbGwgYXV0b21hdGljYWxs
eSBwYXVzZSBvbmNlIGFsbCBvYnNlcnZlcnMgbm8gbG9uZ2VyIHdhbnQgdG8gcmVuZGVyIHRoZSBp
bWFnZSBhbnl3aGVyZS4KKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnRBbmltYXRpb24oYm9vbCAvKmNh
dGNoVXBJZk5lY2Vzc2FyeSovID0gdHJ1ZSkgeyB9CiAgICAgdmlydHVhbCB2b2lkIHN0b3BBbmlt
YXRpb24oKSB7fQogICAgIHZpcnR1YWwgdm9pZCByZXNldEFuaW1hdGlvbigpIHt9CiAgICAgCkBA
IC0xNTgsOCArMTU4LDYgQEAgcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgYm9vbCBtYXlGaWxsV2l0
aFNvbGlkQ29sb3IoKSB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgQ29sb3Igc29saWRD
b2xvcigpIGNvbnN0IHsgcmV0dXJuIENvbG9yKCk7IH0KICAgICAKLSAgICB2aXJ0dWFsIHZvaWQg
c3RhcnRBbmltYXRpb24oYm9vbCAvKmNhdGNoVXBJZk5lY2Vzc2FyeSovID0gdHJ1ZSkgeyB9Ci0g
ICAgCiAgICAgdmlydHVhbCB2b2lkIGRyYXdQYXR0ZXJuKEdyYXBoaWNzQ29udGV4dCosIGNvbnN0
IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5U
cmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQm
IHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCk7CiAj
aWYgUExBVEZPUk0oQ0cpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbWFn
ZS5jcHAgYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbWFnZS5jcHAKaW5kZXggODJmMzc0MS4u
MjQ5MjQxOSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW1hZ2UuY3BwCisr
KyBiL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckltYWdlLmNwcApAQCAtMzE0LDYgKzMxNCwyMCBA
QCB2b2lkIFJlbmRlckltYWdlOjppbWFnZUNoYW5nZWQoV3JhcHBlZEltYWdlUHRyIG5ld0ltYWdl
LCBjb25zdCBJbnRSZWN0KiByZWN0KQogICAgIH0KIH0KIAordm9pZCBSZW5kZXJJbWFnZTo6bm90
aWZ5RmluaXNoZWQoQ2FjaGVkUmVzb3VyY2UqIG5ld0ltYWdlKQoreworICAgIGlmIChkb2N1bWVu
dEJlaW5nRGVzdHJveWVkKCkpCisgICAgICAgIHJldHVybjsKKworI2lmIFVTRShBQ0NFTEVSQVRF
RF9DT01QT1NJVElORykKKyAgICBpZiAoKG5ld0ltYWdlID09IG1fY2FjaGVkSW1hZ2UpICYmIGhh
c0xheWVyKCkpIHsKKyAgICAgICAgLy8gdGVsbCBhbnkgcG90ZW50aWFsIGNvbXBvc2l0aW5nIGxh
eWVycworICAgICAgICAvLyB0aGF0IHRoZSBpbWFnZSBpcyBkb25lIGFuZCB0aGV5IGNhbiByZWZl
cmVuY2UgaXQgZGlyZWN0bHkuCisgICAgICAgIGxheWVyKCktPnJlbmRlcmVyQ29udGVudENoYW5n
ZWQoKTsKKyAgICB9CisjZW5kaWYKK30KKyAgICAKIHZvaWQgUmVuZGVySW1hZ2U6OnJlc2V0QW5p
bWF0aW9uKCkKIHsKICAgICBpZiAobV9jYWNoZWRJbWFnZSkgewpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVySW1hZ2UuaCBiL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckltYWdl
LmgKaW5kZXggZjNlMGU0MC4uMDQyNDUyZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVySW1hZ2UuaAorKysgYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbWFnZS5oCkBAIC00
OCw2ICs0OCw3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIGludCBtaW5pbXVtUmVwbGFjZWRIZWln
aHQoKSBjb25zdDsKIAogICAgIHZpcnR1YWwgdm9pZCBpbWFnZUNoYW5nZWQoV3JhcHBlZEltYWdl
UHRyLCBjb25zdCBJbnRSZWN0KiA9IDApOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlGaW5pc2hl
ZChDYWNoZWRSZXNvdXJjZSopOwogICAgIAogICAgIGJvb2wgc2V0SW1hZ2VTaXplRm9yQWx0VGV4
dChDYWNoZWRJbWFnZSogbmV3SW1hZ2UgPSAwKTsKIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyTGF5ZXIuY3BwIGIvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXIuY3Bw
CmluZGV4IDZjYTkxNzQuLjY4NjEwMTYgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckxheWVyLmNwcAorKysgYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllci5jcHAKQEAg
LTIyNCw2ICsyMjQsMTUgQEAgUmVuZGVyTGF5ZXJDb21wb3NpdG9yKiBSZW5kZXJMYXllcjo6Y29t
cG9zaXRvcigpIGNvbnN0CiAgICAgQVNTRVJUKHJlbmRlcmVyKCktPnZpZXcoKSk7CiAgICAgcmV0
dXJuIHJlbmRlcmVyKCktPnZpZXcoKS0+Y29tcG9zaXRvcigpOwogfQorICAgIAordm9pZCBSZW5k
ZXJMYXllcjo6cmVuZGVyZXJDb250ZW50Q2hhbmdlZCgpCit7CisgICAgaWYgKGNvbXBvc2l0b3Io
KS0+dXBkYXRlTGF5ZXJDb21wb3NpdGluZ1N0YXRlKHRoaXMsIFN0eWxlRGlmZmVyZW5jZUVxdWFs
KSkKKyAgICAgICAgY29tcG9zaXRvcigpLT5zZXRDb21wb3NpdGluZ0xheWVyc05lZWRVcGRhdGUo
KTsgICAgIC8vIEZJWE1FOiBsYXllcnMgd2lsbCBvbmx5IGdldCB1cGRhdGVkIGFmdGVyIHRoZSBu
ZXh0IGxheW91dC4KKyAgICAKKyAgICBpZiAobV9iYWNraW5nKQorICAgICAgICBtX2JhY2tpbmct
PnJlbmRlcmVyQ29udGVudENoYW5nZWQoKTsKK30gICAgCiAjZW5kaWYgLy8gVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQogCiB2b2lkIFJlbmRlckxheWVyOjpzZXRTdGF0aWNZKGludCBzdGF0
aWNZKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXIuaCBiL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckxheWVyLmgKaW5kZXggYmU0ZDJkNS4uMTNjYjkwMiAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXIuaAorKysgYi9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJMYXllci5oCkBAIC0yODIsNiArMjgyLDEwIEBAIHB1YmxpYzoKICAgICAKICNp
ZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCiAgICAgUmVuZGVyTGF5ZXJDb21wb3NpdG9y
KiBjb21wb3NpdG9yKCkgY29uc3Q7CisgICAgCisgICAgLy8gTm90aWZpY2F0aW9uIGZyb20gdGhl
IHJlbmRlcmVyIHRoYXQgaXRzIGNvbnRlbnQgY2hhbmdlZCAoZS5nLiBjdXJyZW50IGZyYW1lIG9m
IGltYWdlIGNoYW5nZWQpLgorICAgIC8vIEFsbG93cyB1cGRhdGVzIG9mIGxheWVyIGNvbnRlbnQg
d2l0aG91dCByZXBhaW50aW5nLgorICAgIHZvaWQgcmVuZGVyZXJDb250ZW50Q2hhbmdlZCgpOwog
I2VuZGlmCiAgICAgCiAgICAgdm9pZCB1cGRhdGVMYXllclBvc2l0aW9uKCk7CmRpZmYgLS1naXQg
YS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckJhY2tpbmcuY3BwIGIvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5nLmNwcAppbmRleCAyOWM0Njc2Li5mM2ZlNjZmIDEwMDY0
NAotLS0gYS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckJhY2tpbmcuY3BwCisrKyBiL1dl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5jcHAKQEAgLTU1NSw2ICs1NTUsMzYg
QEAgYm9vbCBSZW5kZXJMYXllckJhY2tpbmc6Omhhc05vbkNvbXBvc2l0aW5nQ29udGVudCgpIGNv
bnN0CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCisvLyBBIGxheWVyIGNhbiB1c2UgYW4gaW5uZXIg
Y29udGVudCBsYXllciBpZiB0aGUgcmVuZGVyIGxheWVyJ3Mgb2JqZWN0IGlzIGEgcmVwbGFjZWQg
b2JqZWN0IGFuZCBoYXMgbm8gY2hpbGRyZW4uCisvLyBUaGlzIGFsbG93cyB0aGUgR3JhcGhpY3NM
YXllciB0byBkaXNwbGF5IHRoZSBSZW5kZXJMYXllciBjb250ZW50cyBkaXJlY3RseTsgaXQncyB1
c2VkIGZvciBpbWFnZXMuCitib29sIFJlbmRlckxheWVyQmFja2luZzo6Y2FuVXNlSW5uZXJDb250
ZW50TGF5ZXIoKSBjb25zdAoreworICAgIFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0ID0gcmVu
ZGVyZXIoKTsKKyAgICAKKyAgICAvLyBSZWplY3QgYW55dGhpbmcgdGhhdCBpc24ndCBhIFJlbmRl
clJlcGxhY2VkLgorICAgIGlmICghcmVuZGVyT2JqZWN0LT5pc1JlcGxhY2VkKCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBpZiAocmVuZGVyT2JqZWN0LT5oYXNNYXNrKCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSByZW5k
ZXJPYmplY3QtPnN0eWxlKCk7CisgICAgCisgICAgLy8gUmVqZWN0IGFueXRoaW5nIHRoYXQgaGFz
IGEgYmFja2dyb3VuZCBvdGhlciB0aGFuIGEgc29saWQgY29sb3IuCisgICAgaWYgKCFoYXNTaW1w
bGVCYWNrZ3JvdW5kKHN0eWxlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIC8v
IFJlamVjdCBhbnl0aGluZyB0aGF0IGhhcyBhIGJvcmRlciwgYSBib3JkZXItcmFkaXVzLCBvdXRs
aW5lLCBtYXJnaW4gb3IgcGFkZGluZy4KKyAgICBib29sIGhhc0JveERlY29yYXRpb25zID0gaGFz
Qm9yZGVyT3V0bGluZU9yU2hhZG93KHN0eWxlKSB8fCBzdHlsZS0+aGFzTWFyZ2luKCkgfHwgc3R5
bGUtPmhhc1BhZGRpbmcoKTsKKyAgICAKKyAgICAvLyBPbmx5IG9wdGltaXplIGltYWdlcyB0aGF0
IGFyZSB1bmFkb3JuZWQuCisgICAgaWYgKHJlbmRlck9iamVjdC0+aXNJbWFnZSgpKQorICAgICAg
ICByZXR1cm4gIWhhc0JveERlY29yYXRpb25zOworICAgIAorICAgIHJldHVybiBmYWxzZTsKK30K
KyAgICAKKyAgICAKIC8vIEEgInNpbXBsZSBjb250YWluZXIgbGF5ZXIiIGlzIGEgUmVuZGVyTGF5
ZXIgd2hpY2ggaGFzIG5vIHZpc2libGUgY29udGVudCB0byByZW5kZXIuCiAvLyBJdCBtYXkgaGF2
ZSBubyBjaGlsZHJlbiwgb3IgYWxsIGl0cyBjaGlsZHJlbiBtYXkgYmUgdGhlbXNlbHZlcyBjb21w
b3NpdGVkLgogLy8gVGhpcyBpcyBhIHVzZWZ1bCBvcHRpbWl6YXRpb24sIGJlY2F1c2UgaXQgYWxs
b3dzIHVzIHRvIGF2b2lkIGFsbG9jYXRpbmcgYmFja2luZyBzdG9yZS4KQEAgLTU3Miw5ICs2MDIs
MzYgQEAgdm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OmRldGVjdERyYXdpbmdPcHRpbWl6YXRpb25z
KCkKIHsKICAgICBib29sIGRyYXdzQ29udGVudCA9IHRydWU7CiAKLSAgICBpZiAoaXNTaW1wbGVD
b250YWluZXJDb21wb3NpdGluZ0xheWVyKCkgfHwgcGFpbnRpbmdHb2VzVG9XaW5kb3coKSkKKyAg
ICAvLyBDaGVjayBpZiBhIHJlcGxhY2VkIGxheWVyIGNhbiBiZSBmdXJ0aGVyIHNpbXBsaWZpZWQu
CisgICAgYm9vbCBoYXNJbWFnZUJhY2tncm91bmRDb2xvciA9IGZhbHNlOworICAgIGlmIChjYW5V
c2VJbm5lckNvbnRlbnRMYXllcigpKSB7CisgICAgICAgIGlmIChyZW5kZXJlcigpLT5pc0ltYWdl
KCkpIHsKKyAgICAgICAgICAgIFJlbmRlckltYWdlKiBpbWFnZVJlbmRlcmVyID0gKFJlbmRlcklt
YWdlKilyZW5kZXJlcigpOworICAgICAgICAgICAgaWYgKGltYWdlUmVuZGVyZXIgJiYgaW1hZ2VS
ZW5kZXJlci0+Y2FjaGVkSW1hZ2UoKSAmJiBpbWFnZVJlbmRlcmVyLT5jYWNoZWRJbWFnZSgpLT5p
bWFnZSgpKQorICAgICAgICAgICAgICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0Q29udGVudHNUb0lt
YWdlKGltYWdlUmVuZGVyZXItPmNhY2hlZEltYWdlKCktPmltYWdlKCkpOworICAgICAgICAgICAg
CisgICAgICAgICAgICBkcmF3c0NvbnRlbnQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgaWYgKHJlbmRlcmVySGFzQmFja2dyb3VuZCgpKSB7CisgICAgICAgICAgICBtX2dy
YXBoaWNzTGF5ZXItPnNldEJhY2tncm91bmRDb2xvcihyZW5kZXJlckJhY2tncm91bmRDb2xvcigp
KTsKKyAgICAgICAgICAgIGhhc0ltYWdlQmFja2dyb3VuZENvbG9yID0gdHJ1ZTsKKyAgICAgICAg
fQorICAgIH0gZWxzZSB7CisgICAgICAgIG1fZ3JhcGhpY3NMYXllci0+Y2xlYXJDb250ZW50cygp
OworICAgICAgICBkcmF3c0NvbnRlbnQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICBpZiAoaXNT
aW1wbGVDb250YWluZXJDb21wb3NpdGluZ0xheWVyKCkpCiAgICAgICAgIGRyYXdzQ29udGVudCA9
IGZhbHNlOwotCisgICAgZWxzZSBpZiAoIWhhc0ltYWdlQmFja2dyb3VuZENvbG9yKSB7CisgICAg
ICAgIC8vIENsZWFyIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGluIGNhc2Ugd2UgYXJlIHN3YXBwaW5n
IGF3YXkgZnJvbSBhIHNpbXBsZSBsYXllci4KKyAgICAgICAgbV9ncmFwaGljc0xheWVyLT5jbGVh
ckJhY2tncm91bmRDb2xvcigpOworICAgIH0KKyAgICAKKyAgICBpZiAocGFpbnRpbmdHb2VzVG9X
aW5kb3coKSkKKyAgICAgICAgZHJhd3NDb250ZW50ID0gZmFsc2U7CisgICAgCiAgICAgbV9ncmFw
aGljc0xheWVyLT5zZXREcmF3c0NvbnRlbnQoZHJhd3NDb250ZW50KTsKIH0KIApAQCAtNTgzLDYg
KzY0MCwyNyBAQCB2b2lkIFJlbmRlckxheWVyQmFja2luZzo6aW52YWxpZGF0ZURyYXdpbmdPcHRp
bWl6YXRpb25zKCkKICAgICBtX3NpbXBsZUNvbXBvc2l0aW5nTGF5ZXJTdGF0dXNEaXJ0eSA9IHRy
dWU7CiB9CiAKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjpyZW5kZXJlckNvbnRlbnRDaGFuZ2Vk
KCkKK3sKKyAgICBpZiAoY2FuVXNlSW5uZXJDb250ZW50TGF5ZXIoKSAmJiByZW5kZXJlcigpLT5p
c0ltYWdlKCkpIHsKKyAgICAgICAgUmVuZGVySW1hZ2UqIGltYWdlUmVuZGVyZXIgPSAoUmVuZGVy
SW1hZ2UqKXJlbmRlcmVyKCk7CisgICAgICAgIGlmIChpbWFnZVJlbmRlcmVyICYmCisgICAgICAg
ICAgICBpbWFnZVJlbmRlcmVyLT5jYWNoZWRJbWFnZSgpICYmCisgICAgICAgICAgICBpbWFnZVJl
bmRlcmVyLT5jYWNoZWRJbWFnZSgpLT5pbWFnZSgpICYmCisgICAgICAgICAgICBpbWFnZVJlbmRl
cmVyLT5jYWNoZWRJbWFnZSgpLT5pc0xvYWRlZCgpKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZl
IHRvIHdhaXQgdW50aWwgdGhlIGltYWdlIGlzIGZ1bGx5IGxvYWRlZCBiZWZvcmUgc2V0dGluZyBp
dCBvbiB0aGUgbGF5ZXIuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBu
by1vcCBpZiB0aGUgbGF5ZXIgZG9lc24ndCBoYXZlIGFuIGlubmVyIGxheWVyIGZvciB0aGUgaW1h
Z2UuCisgICAgICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnNldENvbnRlbnRzVG9JbWFnZShpbWFn
ZVJlbmRlcmVyLT5jYWNoZWRJbWFnZSgpLT5pbWFnZSgpKTsKKyAgICAgICAgICAgIAorICAgICAg
ICAgICAgLy8gSW1hZ2UgYW5pbWF0aW9uIGlzICJsYXp5IiwgaW4gdGhhdCBpdCBhdXRvbWF0aWNh
bGx5IHN0b3BzIHVubGVzcyBzb21lb25lIGlzIGRyYXdpbmcKKyAgICAgICAgICAgIC8vIHRoZSBp
bWFnZS4gU28gd2UgaGF2ZSB0byBraWNrIHRoZSBhbmltYXRpb24gZWFjaCB0aW1lOyB0aGlzIGhh
cyB0aGUgZG93bnNpZGUgdGhhdCB0aGUKKyAgICAgICAgICAgIC8vIGltYWdlIHdpbGwga2VlcCBh
bmltYXRpbmcsIGV2ZW4gaWYgaXRzIGxheWVyIGlzIG5vdCB2aXNpYmxlLgorICAgICAgICAgICAg
aW1hZ2VSZW5kZXJlci0+Y2FjaGVkSW1hZ2UoKS0+aW1hZ2UoKS0+c3RhcnRBbmltYXRpb24oKTsK
KyAgICAgICAgfQorICAgIH0KK30KKwogRmxvYXRQb2ludDNEIFJlbmRlckxheWVyQmFja2luZzo6
Y29tcHV0ZVRyYW5zZm9ybU9yaWdpbihjb25zdCBJbnRSZWN0JiBib3JkZXJCb3gpIGNvbnN0CiB7
CiAgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gcmVuZGVyZXIoKS0+c3R5bGUoKTsKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5oIGIvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5nLmgKaW5kZXggMGY3ZGRjYy4uNDk2ZjQ0NSAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5nLmgKKysrIGIvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5nLmgKQEAgLTg4LDYgKzg4LDkgQEAgcHVibGlj
OgogICAgIC8vIHIgaXMgaW4gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2YgdGhlIGxheWVyJ3MgcmVu
ZGVyIG9iamVjdAogICAgIHZvaWQgc2V0Q29udGVudHNOZWVkRGlzcGxheUluUmVjdChjb25zdCBJ
bnRSZWN0JiByKTsKIAorICAgIC8vIE5vdGlmaWNhdGlvbiBmcm9tIHRoZSByZW5kZXJlciB0aGF0
IGl0cyBjb250ZW50IGNoYW5nZWQ7IHVzZWQgYnkgUmVuZGVySW1hZ2UuCisgICAgdm9pZCByZW5k
ZXJlckNvbnRlbnRDaGFuZ2VkKCk7CisKICAgICAvLyBJbnRlcmZhY2UgdG8gc3RhcnQsIGZpbmlz
aCwgc3VzcGVuZCBhbmQgcmVzdW1lIGFuaW1hdGlvbnMgYW5kIHRyYW5zaXRpb25zCiAgICAgYm9v
bCBzdGFydEFuaW1hdGlvbihkb3VibGUgYmVnaW5UaW1lLCBjb25zdCBBbmltYXRpb24qIGFuaW0s
IGNvbnN0IEtleWZyYW1lTGlzdCYga2V5ZnJhbWVzKTsKICAgICBib29sIHN0YXJ0VHJhbnNpdGlv
bihkb3VibGUgYmVnaW5UaW1lLCBpbnQgcHJvcGVydHksIGNvbnN0IFJlbmRlclN0eWxlKiBmcm9t
U3R5bGUsIGNvbnN0IFJlbmRlclN0eWxlKiB0b1N0eWxlKTsKQEAgLTEzNSw2ICsxMzgsOSBAQCBw
cml2YXRlOgogICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFJlbmRlckxheWVyIG9ubHkgaGFz
IGNvbnRlbnQgdGhhdCBjYW4gYmUgcmVuZGVyZWQgZGlyZWN0bHkKICAgICAvLyBieSB0aGUgY29t
cG9zaXRpbmcgbGF5ZXIsIHdpdGhvdXQgZHJhd2luZyAoZS5nLiBzb2xpZCBiYWNrZ3JvdW5kIGNv
bG9yKS4KICAgICBib29sIGlzU2ltcGxlQ29udGFpbmVyQ29tcG9zaXRpbmdMYXllcigpOworICAg
IC8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBjYW4gb3B0aW1pemUgdGhlIFJlbmRlckxheWVyIHRvIGRy
YXcgdGhlIHJlcGxhY2VkIGNvbnRlbnQKKyAgICAvLyBkaXJlY3RseSBpbnRvIGEgY29tcG9zaXRp
bmcgYnVmZmVyCisgICAgYm9vbCBjYW5Vc2VJbm5lckNvbnRlbnRMYXllcigpIGNvbnN0OwogCiAg
ICAgYm9vbCByZW5kZXJlckhhc0JhY2tncm91bmQoKSBjb25zdDsKICAgICBjb25zdCBDb2xvciYg
cmVuZGVyZXJCYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsK
</data>
<flag name="review"
          id="14301"
          type_id="1"
          status="+"
          setter="simon.fraser"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28954</attachid>
            <date>2009-03-25 17:10:33 -0700</date>
            <delta_ts>2009-03-25 17:27:27 -0700</delta_ts>
            <desc>extracted patch for animated gif updates</desc>
            <filename>image-diff.patch</filename>
            <type>text/plain</type>
            <size>630</size>
            <attacher name="Dean Jackson">dino</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckltYWdlLmNwcCBiL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckltYWdlLmNwcAppbmRleCAyNDkyNDE5Li42YTcyYTdhIDEwMDY0NAot
LS0gYS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbWFnZS5jcHAKKysrIGIvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVySW1hZ2UuY3BwCkBAIC0zMTEsNiArMzExLDE0IEBAIHZvaWQgUmVuZGVySW1h
Z2U6OmltYWdlQ2hhbmdlZChXcmFwcGVkSW1hZ2VQdHIgbmV3SW1hZ2UsIGNvbnN0IEludFJlY3Qq
IHJlY3QpCiAgICAgICAgICAgICByZXBhaW50UmVjdCA9IGNvbnRlbnRCb3hSZWN0KCk7CiAgICAg
ICAgIAogICAgICAgICByZXBhaW50UmVjdGFuZ2xlKHJlcGFpbnRSZWN0KTsKKworI2lmIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAgICAgaWYgKGhhc0xheWVyKCkpIHsKKyAgICAg
ICAgICAgIC8vIHRlbGwgYW55IHBvdGVudGlhbCBjb21wb3NpdGluZyBsYXllcnMKKyAgICAgICAg
ICAgIC8vIHRoYXQgdGhlIGltYWdlIG5lZWRzIHVwZGF0aW5nLgorICAgICAgICAgICAgbGF5ZXIo
KS0+cmVuZGVyZXJDb250ZW50Q2hhbmdlZCgpOworICAgICAgICB9CisjZW5kaWYKICAgICB9CiB9
CiAK
</data>
<flag name="review"
          id="14321"
          type_id="1"
          status="+"
          setter="simon.fraser"
    />
          </attachment>
      

    </bug>

</bugzilla>