<?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>176089</bug_id>
          
          <creation_ts>2017-08-29 19:49:34 -0700</creation_ts>
          <short_desc>[GTK][WPE] Fix playback of GIFs</short_desc>
          <delta_ts>2017-10-04 02:10:32 -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>Images</component>
          <version>Other</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=176118</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Michael Catanzaro">mcatanzaro</reporter>
          <assigned_to name="Miguel Gomez">magomez</assigned_to>
          <cc>bugs-noreply</cc>
    
    <cc>buildbot</cc>
    
    <cc>cgarcia</cc>
    
    <cc>clopez</cc>
    
    <cc>commit-queue</cc>
    
    <cc>jer.noble</cc>
    
    <cc>magomez</cc>
    
    <cc>mcatanzaro</cc>
    
    <cc>sabouhallawa</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>zan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1343402</commentid>
    <comment_count>0</comment_count>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2017-08-29 19:49:34 -0700</bug_when>
    <thetext>We need to fix playback of imgur .gifv videos. They play super slowly.

E.g. http://i.imgur.com/YSxwPUC.gifv</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343482</commentid>
    <comment_count>1</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2017-08-30 00:40:37 -0700</bug_when>
    <thetext>I can&apos;t reproduce it</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343550</commentid>
    <comment_count>2</comment_count>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2017-08-30 08:54:50 -0700</bug_when>
    <thetext>(In reply to Carlos Garcia Campos from comment #1)
&gt; I can&apos;t reproduce it

Seems .givf can be a wrapper around either GIF or MP4. You&apos;re getting the MP4 so it plays fine. I&apos;m getting the GIF, which is broken. Here is a direct link to the GIF:

http://i.imgur.com/YSxwPUC.gif

I think GIFs on many websites have been broken for a long time (about one year now). The first iteration is extremely slow and choppy. After the first iteration, it plays properly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1349910</commentid>
    <comment_count>3</comment_count>
    <who name="Jer Noble">jer.noble</who>
    <bug_when>2017-09-18 08:46:52 -0700</bug_when>
    <thetext>In bug #176118, I think I discovered a clue about what might be causing the choppy decode during the first play through. The image-decoders/ decoders used on GTK+ will attempt to decode the entire image frame when asked whether the frame is &quot;complete&quot; (i.e., has all its data available) or what the frame&apos;s duration is. These operations happen on the main thread, so the decode is synchronous, and depending on the amount of time required to decode the frame, will cause playback to miss one-or-more subsequent frames, or for those frames to be delivered late.

An interesting area of investigation would be to see if &quot;parsing&quot; of image data can be separated from &quot;decoding&quot; of frames, so that answers to the questions of &quot;is this frame complete&quot; and &quot;what is this frame&apos;s duration&quot; can be answered synchronously and cheaply without requiring a full decode of the frame.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1349911</commentid>
    <comment_count>4</comment_count>
    <who name="Said Abou-Hallawa">sabouhallawa</who>
    <bug_when>2017-09-18 08:55:55 -0700</bug_when>
    <thetext>(In reply to Michael Catanzaro from comment #2)
&gt; (In reply to Carlos Garcia Campos from comment #1)
&gt; &gt; I can&apos;t reproduce it
&gt; 
&gt; Seems .givf can be a wrapper around either GIF or MP4. You&apos;re getting the
&gt; MP4 so it plays fine. I&apos;m getting the GIF, which is broken. Here is a direct
&gt; link to the GIF:
&gt; 
&gt; http://i.imgur.com/YSxwPUC.gif
&gt; 
&gt; I think GIFs on many websites have been broken for a long time (about one
&gt; year now). The first iteration is extremely slow and choppy. After the first
&gt; iteration, it plays properly.

Is the problem fixed if you disable async image decoding for animated images? You can disable it in mini browser from Settings/Enable Animated Image Async Decoding.

If the problem is fixed when async image decoding is disabled, you can disable async image decoding by making ImageSource::canUseAsyncDecoding() returns false for GTK always. This will restore the old behavior till you have a proper fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1349991</commentid>
    <comment_count>5</comment_count>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2017-09-18 11:03:24 -0700</bug_when>
    <thetext>(In reply to Said Abou-Hallawa from comment #4)
&gt; Is the problem fixed if you disable async image decoding for animated
&gt; images? You can disable it in mini browser from Settings/Enable Animated
&gt; Image Async Decoding.

GTK and WPE do not expose that setting.

&gt; If the problem is fixed when async image decoding is disabled, you can
&gt; disable async image decoding by making ImageSource::canUseAsyncDecoding()
&gt; returns false for GTK always. This will restore the old behavior till you
&gt; have a proper fix.

No difference. :/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1351183</commentid>
    <comment_count>6</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2017-09-21 07:17:18 -0700</bug_when>
    <thetext>I have uploaded here some examples of large animations where the problem is much easier to reproduce:


https://people.igalia.com/clopez/wkbug/image_animations_big/

With the 5second version of the gif the first time it plays it takes a lot to load and then it plays really slowly  on the first play.. after it finishes the first play it plays at an ok speed (I guess this is because its slow decoding the image frames into memory or something like that?)


With the 5second version of the apng it plays just fine from the first run.


The 20second version of the gif makes thing much worse and the 20second of the apng causes a crash on the webprocess :(


Feel free to download the images to your disk and you will see it makes no difference to load from local disk, the network speed is not to blame here.

I also uploaded mp4 and webm versions of the animations so you can check how they should play.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1351577</commentid>
    <comment_count>7</comment_count>
    <who name="Zan Dobersek">zan</who>
    <bug_when>2017-09-22 01:51:32 -0700</bug_when>
    <thetext>(In reply to Michael Catanzaro from comment #2)
&gt; http://i.imgur.com/YSxwPUC.gif
&gt; 

As the GIF is being played, newer and newer frames have to be decoded, originating from GIFImageDecoder::frameBufferAtIndex():
http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp#L104

BitmapImage independently enforces a 30MB limit for decoded image data in destroyDecodedDataIfNecessary(). Once that is hit, the frame buffer cache is wiped out for the BitmapImage&apos;s ImageSource and the associated GIFImageDecoder:
http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/graphics/BitmapImage.cpp#L72
http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/graphics/ImageSource.cpp#L66

In GIFImageDecoder::clearFrameBufferCache(), this also wipes out the associated GIFImageReader object:
http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp#L121

The problem manifests when subsequent GIFImageDecoder::decode() calls, now with a newly-created GIFImageReader, want to decode for GIFFullQuery, and it worsens when doing so for higher-index frames. This specific GIFImageReader::decode() call becomes expensive:
http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp#L327

After each GIFImageReader re-creation, the decoding in that object has to start over, which is then becoming increasingly expensive the further we go into the GIF playback.

The lightning GIF has 390 frames, and this destroy-and-recreate-GIFImageReader occurrence kicks in approximately every 25-26th frame. For last 5 occurrences (frames 262, 288, 314, 340, 366), this decoding blocks the main thread from ~900 up to ~1100 milliseconds every time, so yeah.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1352322</commentid>
    <comment_count>8</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2017-09-25 12:27:01 -0700</bug_when>
    <thetext>(In reply to Zan Dobersek from comment #7)
&gt; (In reply to Michael Catanzaro from comment #2)
&gt; &gt; http://i.imgur.com/YSxwPUC.gif
&gt; &gt; 
&gt; 
&gt; As the GIF is being played, newer and newer frames have to be decoded,
&gt; originating from GIFImageDecoder::frameBufferAtIndex():
&gt; http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/image-
&gt; decoders/gif/GIFImageDecoder.cpp#L104
&gt; 
&gt; BitmapImage independently enforces a 30MB limit for decoded image data in
&gt; destroyDecodedDataIfNecessary(). Once that is hit, the frame buffer cache is
&gt; wiped out for the BitmapImage&apos;s ImageSource and the associated
&gt; GIFImageDecoder:
&gt; http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/graphics/
&gt; BitmapImage.cpp#L72
&gt; http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/graphics/
&gt; ImageSource.cpp#L66
&gt; 
&gt; In GIFImageDecoder::clearFrameBufferCache(), this also wipes out the
&gt; associated GIFImageReader object:
&gt; http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/image-
&gt; decoders/gif/GIFImageDecoder.cpp#L121
&gt; 
&gt; The problem manifests when subsequent GIFImageDecoder::decode() calls, now
&gt; with a newly-created GIFImageReader, want to decode for GIFFullQuery, and it
&gt; worsens when doing so for higher-index frames. This specific
&gt; GIFImageReader::decode() call becomes expensive:
&gt; http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/image-
&gt; decoders/gif/GIFImageDecoder.cpp#L327
&gt; 
&gt; After each GIFImageReader re-creation, the decoding in that object has to
&gt; start over, which is then becoming increasingly expensive the further we go
&gt; into the GIF playback.
&gt; 
&gt; The lightning GIF has 390 frames, and this
&gt; destroy-and-recreate-GIFImageReader occurrence kicks in approximately every
&gt; 25-26th frame. For last 5 occurrences (frames 262, 288, 314, 340, 366), this
&gt; decoding blocks the main thread from ~900 up to ~1100 milliseconds every
&gt; time, so yeah.

I think there are more issues here.

As I only can see an slow play the first time the GIF plays (for any of the examples: lightning or bigbuck5s.gif).

Once the first iteration loop is played, then the second (and posterior) iteration loops play perfectly fine.

I also tested to remove the LargeAnimationCutoff limit and there is no difference. Same behaviour than before.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1352393</commentid>
    <comment_count>9</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2017-09-25 13:53:31 -0700</bug_when>
    <thetext>Another example of a GIF that will be really really slow loading (even from local disk) and slow playing the first loop. Will play fine second and posterior loops: 

http://i.imgur.com/qvKlqC8.gif

For the related fix on Chromium, check https://bugs.chromium.org/p/chromium/issues/detail?id=462733</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1352598</commentid>
    <comment_count>10</comment_count>
    <who name="Zan Dobersek">zan</who>
    <bug_when>2017-09-25 23:47:09 -0700</bug_when>
    <thetext>(In reply to Carlos Alberto Lopez Perez from comment #8)
&gt; I think there are more issues here.
&gt; 
&gt; As I only can see an slow play the first time the GIF plays (for any of the
&gt; examples: lightning or bigbuck5s.gif).
&gt; 
&gt; Once the first iteration loop is played, then the second (and posterior)
&gt; iteration loops play perfectly fine.
&gt; 

That&apos;s because at this point all the decoding is already done, and there&apos;s image data accessible without the need for decoding.

&gt; I also tested to remove the LargeAnimationCutoff limit and there is no
&gt; difference. Same behaviour than before.

Don&apos;t remove it. Increase it to a gigabyte and observe there&apos;s no stuttering.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1352600</commentid>
    <comment_count>11</comment_count>
    <who name="Zan Dobersek">zan</who>
    <bug_when>2017-09-25 23:59:18 -0700</bug_when>
    <thetext>The m_reader deletion in GIFImageDecoder::clearFrameBufferCache() was introduced in bug #159089:
http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp#L174

If commented out, stuttering playback of GIFs is fixed. There&apos;s also no flickering reintroduced that was described and fixed in bug #159089, but I&apos;d need someone else to double-check that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1352625</commentid>
    <comment_count>12</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2017-09-26 02:57:00 -0700</bug_when>
    <thetext>(In reply to Michael Catanzaro from comment #0)
&gt; We need to fix playback of imgur .gifv videos. They play super slowly.
&gt; 
&gt; E.g. http://i.imgur.com/YSxwPUC.gifv

Mmmm... is the above resource actually a GIF? ^^ 

At least to me it loads an HTML resource that ends loading a video: http://i.imgur.com/YSxwPUC.mp4 :\


https://help.imgur.com/hc/en-us/articles/208606616-What-is-GIFV-</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1352627</commentid>
    <comment_count>13</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2017-09-26 03:23:01 -0700</bug_when>
    <thetext>(In reply to Zan Dobersek from comment #11)
&gt; The m_reader deletion in GIFImageDecoder::clearFrameBufferCache() was
&gt; introduced in bug #159089:
&gt; http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/image-
&gt; decoders/gif/GIFImageDecoder.cpp#L174
&gt; 
&gt; If commented out, stuttering playback of GIFs is fixed. There&apos;s also no
&gt; flickering reintroduced that was described and fixed in bug #159089, but I&apos;d
&gt; need someone else to double-check that.

I tested this and I can confirm it fixes the slow playback on the first loop.
This is what I tested:

$ cd /tmp
$ mkdir giftests
$ wget http://i.imgur.com/qvKlqC8.gif -O kangaroos.gif
$ wget https://people.igalia.com/clopez/wkbug/image_animations_big/bigbuck5s.gif
$ wget https://people.igalia.com/clopez/wkbug/image_animations_big/bigbuck20s.gif
$ ls -sh1
total 187M
88M bigbuck20s.gif
18M bigbuck5s.gif
82M kangaroos.gif


Then load GTK MiniBrowser with url file:///tmp/giftests and start measuring time and memory once clicked on the gif

Currently:

kangaroos:  7350 MB WebProcess memory usage --  41sec to load from disk -- 25 sec first loop --- 15 sec second lop
bigbuck5s:   515 MB WebProcess memory usage --  2.5sec to load from disk -- 7 sec first loop --- 5 sec second lop
bigbuck20s: 8500 MB WebProcess memory usage --  48sec to load from disk -- 54 sec first loop --- 20 sec second lop


After commenting this out:

kangaroos:  similar memory usage, same time to load from disk, *but* it plays fine on the first loop (15 seconds) and without glitch
bigbuck5s:  similar memory usage, same time to load from disk, *but* it plays fine on the first loop (5 seconds) and without glitch
bigbuck20s: similar memory usage, same time to load from disk, *but* it plays fine on the first loop (20 seconds) and without glitch
 


So I think we have at least 3 bugs:

 - 1) Slow playback of GIFs on first loop (that seems to be fixed by your suggested fix of commenting out the deletion of the m_reader)
 - 2) Slow decoding of the GIFs (even when loading from disk)
 - 3) Huge memory usage of long GIFs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1352632</commentid>
    <comment_count>14</comment_count>
      <attachid>321810</attachid>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2017-09-26 04:33:59 -0700</bug_when>
    <thetext>Created attachment 321810
PoC patch based on https://crbug.com/462733

I&apos;m uploading (not for final review, still comments about it very much welcomed), a PoC patch based on https://crbug.com/462733

With this (and plus the fix of commenting the reader deletion ttps://bugs.webkit.org/show_bug.cgi?id=159089 ) I get this results:

kangaroos:   690 MB WebProcess memory usage --  &lt;1sec to load from disk -- 15 sec first loop --- 15 sec second lop
bigbuck5s:   300 MB WebProcess memory usage --  &lt;1sec to load from disk -- 5 sec first loop --- 5 sec second lop
bigbuck20s: 1030 MB WebProcess memory usage --  &lt;1sec to load from disk -- 20 sec first loop --- 20 sec second lop


So looks like almost fixed.

But there is like some bugs on the current patch, as the GIF sometimes (1 every 5 tries) doesn&apos;t play on the first load and has to be re-tried until it plays</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1352633</commentid>
    <comment_count>15</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-09-26 04:37:31 -0700</bug_when>
    <thetext>Attachment 321810 did not pass style-queue:


ERROR: Source/WebCore/platform/image-decoders/FastSharedBufferReader.h:82:  Could not find a newline character at the end of the file.  [whitespace/ending_newline] [5]
ERROR: Tools/TestWebKitAPI/Tests/WebCore/FastSharedBufferReaderTest.cpp:34:  Found header this file implements after other header. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
ERROR: Tools/TestWebKitAPI/Tests/WebCore/FastSharedBufferReaderTest.cpp:36:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Tools/TestWebKitAPI/Tests/WebCore/FastSharedBufferReaderTest.cpp:101:  One line control clauses should not use braces.  [whitespace/braces] [4]
ERROR: Source/WebCore/platform/image-decoders/gif/GIFImageReader.h:0:  No copyright message found.  You should have a line: &quot;Copyright [year] &lt;Copyright Owner&gt;&quot;  [legal/copyright] [5]
ERROR: Source/WebCore/platform/image-decoders/gif/GIFImageReader.h:44:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/WebCore/platform/image-decoders/FastSharedBufferReader.cpp:31:  Found header this file implements before WebCore config.h. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
ERROR: Source/WebCore/platform/image-decoders/gif/GIFImageReader.cpp:0:  No copyright message found.  You should have a line: &quot;Copyright [year] &lt;Copyright Owner&gt;&quot;  [legal/copyright] [5]
ERROR: Source/WebCore/platform/image-decoders/gif/GIFImageReader.cpp:506:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebCore/platform/image-decoders/gif/GIFImageReader.cpp:511:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebCore/ChangeLog:10:  You should remove the &apos;No new tests&apos; and either add and list tests, or explain why no new tests were possible.  [changelog/nonewtests] [5]
Total errors found: 11 in 10 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>1352636</commentid>
    <comment_count>16</comment_count>
    <who name="Miguel Gomez">magomez</who>
    <bug_when>2017-09-26 05:06:11 -0700</bug_when>
    <thetext>&gt; So I think we have at least 3 bugs:
&gt; 
&gt;  - 1) Slow playback of GIFs on first loop (that seems to be fixed by your
&gt; suggested fix of commenting out the deletion of the m_reader)
&gt;  - 2) Slow decoding of the GIFs (even when loading from disk)
&gt;  - 3) Huge memory usage of long GIFs.

Without checking this concrete issue carefully (maybe this changed lately), some comments.

- The image decoding is not something that happens once. When enough decoded images are stored and they reach a concrete size, stored frames will be deleted to keep the size under control. Due to this it can happen that frames are not requested in the common order. This is the reason behind the destruction of m_reader, which would expect to be requested the next frame in the animation but it can actually be requested a former frame, and that causes that wrong frames are being drawn. I&apos;m not sure whether we can somehow reposition the reader instead of destroying it, we need to check that.

- Regarding the memory usage, there should be this limit I mentioned to avoid it (the LargeAnimationCutoff metioned by Zan). If you remove it, then all the decoded frames are stored and that makes the second play smoother, but consumes a lot of memory on large animations. Also, during the first play, there won&apos;t be requests to delete decoded frames, which means that the m_reader won&apos;t be destroyed and the decoding will be faster.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1352641</commentid>
    <comment_count>17</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2017-09-26 06:32:20 -0700</bug_when>
    <thetext>(In reply to Miguel Gomez from comment #16)

&gt; 
&gt; - Regarding the memory usage, there should be this limit I mentioned to
&gt; avoid it (the LargeAnimationCutoff metioned by Zan). If you remove it, then
&gt; all the decoded frames are stored and that makes the second play smoother,
&gt; but consumes a lot of memory on large animations. Also, during the first
&gt; play, there won&apos;t be requests to delete decoded frames, which means that the
&gt; m_reader won&apos;t be destroyed and the decoding will be faster.

I didn&apos;t removed the LargeAnimationCutoff for any of the tests I posted above.

Current WebKitGTK+ trunk is using 8GB of RAM to play the images of kangaroos or bigbuck20s on my laptop.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1352645</commentid>
    <comment_count>18</comment_count>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2017-09-26 07:19:20 -0700</bug_when>
    <thetext>(In reply to Carlos Alberto Lopez Perez from comment #12)
&gt; (In reply to Michael Catanzaro from comment #0)
&gt; &gt; We need to fix playback of imgur .gifv videos. They play super slowly.
&gt; &gt; 
&gt; &gt; E.g. http://i.imgur.com/YSxwPUC.gifv
&gt; 
&gt; Mmmm... is the above resource actually a GIF? ^^ 
&gt; 
&gt; At least to me it loads an HTML resource that ends loading a video:
&gt; http://i.imgur.com/YSxwPUC.mp4 :\
&gt; 
&gt; 
&gt; https://help.imgur.com/hc/en-us/articles/208606616-What-is-GIFV-

Use the .gif URL in comment #2.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1355816</commentid>
    <comment_count>19</comment_count>
    <who name="Miguel Gomez">magomez</who>
    <bug_when>2017-10-03 08:10:32 -0700</bug_when>
    <thetext>(In reply to Zan Dobersek from comment #7)
&gt; (In reply to Michael Catanzaro from comment #2)
&gt; &gt; http://i.imgur.com/YSxwPUC.gif
&gt; &gt; 
&gt; 
&gt; As the GIF is being played, newer and newer frames have to be decoded,
&gt; originating from GIFImageDecoder::frameBufferAtIndex():
&gt; http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/image-
&gt; decoders/gif/GIFImageDecoder.cpp#L104
&gt; 
&gt; BitmapImage independently enforces a 30MB limit for decoded image data in
&gt; destroyDecodedDataIfNecessary(). Once that is hit, the frame buffer cache is
&gt; wiped out for the BitmapImage&apos;s ImageSource and the associated
&gt; GIFImageDecoder:
&gt; http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/graphics/
&gt; BitmapImage.cpp#L72
&gt; http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/graphics/
&gt; ImageSource.cpp#L66
&gt; 
&gt; In GIFImageDecoder::clearFrameBufferCache(), this also wipes out the
&gt; associated GIFImageReader object:
&gt; http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/image-
&gt; decoders/gif/GIFImageDecoder.cpp#L121
&gt; 
&gt; The problem manifests when subsequent GIFImageDecoder::decode() calls, now
&gt; with a newly-created GIFImageReader, want to decode for GIFFullQuery, and it
&gt; worsens when doing so for higher-index frames. This specific
&gt; GIFImageReader::decode() call becomes expensive:
&gt; http://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/image-
&gt; decoders/gif/GIFImageDecoder.cpp#L327
&gt; 
&gt; After each GIFImageReader re-creation, the decoding in that object has to
&gt; start over, which is then becoming increasingly expensive the further we go
&gt; into the GIF playback.
&gt; 
&gt; The lightning GIF has 390 frames, and this
&gt; destroy-and-recreate-GIFImageReader occurrence kicks in approximately every
&gt; 25-26th frame. For last 5 occurrences (frames 262, 288, 314, 340, 366), this
&gt; decoding blocks the main thread from ~900 up to ~1100 milliseconds every
&gt; time, so yeah.

Perfectly explained Zan.

Currently the GIFImageReader cannot decode a frame that was already decoded. So when older frames get deleted from the cache and they have to be decoded again, the reader won&apos;t decode anything. This is why when clearing the cache the reader is being deleted as well, so it&apos;s able to re-decode already decoded frames. Without the reader deletion, if older frames are removed from the cache, when they are requested again to the reader nothing is returned from the decoder.

But as Zan explains, everytime the reader is re-created, it has to parse the whole animation data, and then it decodes all the frames until the requested one, and this gets more and more expensive as the animation grows.

I think I found a way to rewind the reader to be able to decode older frames without having to delete it. Let me test it carefully and I&apos;ll upload the patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1355824</commentid>
    <comment_count>20</comment_count>
      <attachid>322524</attachid>
    <who name="Miguel Gomez">magomez</who>
    <bug_when>2017-10-03 08:29:03 -0700</bug_when>
    <thetext>Created attachment 322524
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1355827</commentid>
    <comment_count>21</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-10-03 08:29:58 -0700</bug_when>
    <thetext>Attachment 322524 did not pass style-queue:


ERROR: Source/WebCore/platform/image-decoders/gif/GIFImageReader.cpp:0:  No copyright message found.  You should have a line: &quot;Copyright [year] &lt;Copyright Owner&gt;&quot;  [legal/copyright] [5]
Total errors found: 1 in 2 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>1356291</commentid>
    <comment_count>22</comment_count>
      <attachid>322524</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-10-04 02:09:03 -0700</bug_when>
    <thetext>Comment on attachment 322524
Patch

Clearing flags on attachment: 322524

Committed r222836: &lt;http://trac.webkit.org/changeset/222836&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1356292</commentid>
    <comment_count>23</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-10-04 02:09:05 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1356294</commentid>
    <comment_count>24</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2017-10-04 02:10:32 -0700</bug_when>
    <thetext>&lt;rdar://problem/34808431&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>321810</attachid>
            <date>2017-09-26 04:33:59 -0700</date>
            <delta_ts>2017-10-03 08:28:54 -0700</delta_ts>
            <desc>PoC patch based on https://crbug.com/462733</desc>
            <filename>poc-patch-based-on-crbug-462733.patch</filename>
            <type>text/plain</type>
            <size>29934</size>
            <attacher name="Carlos Alberto Lopez Perez">clopez</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBjMjZmNWI5NDc1YS4uNzM2ZjkwZTk0MWUgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwzMSBAQAorMjAxNy0wOS0yNiAgQ2FybG9zIEFsYmVydG8gTG9wZXogUGVyZXogIDxjbG9w
ZXpAaWdhbGlhLmNvbT4KKworICAgICAgICBbR1RLXVtXUEVdIEZpeCBwbGF5YmFjayBvZiBHSUZz
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzYwODkK
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBXSVAgcGF0
Y2gsIGJhc2VkIG9uIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9z
cmMvKy81MDEzNDE1MDk5ZmVkNzBjOGFkNDBlMDE3ZjA5MGNhYTk3NjlkMmJlCisKKyAgICAgICAg
Tm8gbmV3IHRlc3RzIChPT1BTISkuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9JbWFnZURlY29kZXJz
LmNtYWtlOgorICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL0Zhc3RTaGFyZWRCdWZm
ZXJSZWFkZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkZhc3RTaGFyZWRCdWZmZXJS
ZWFkZXI6OkZhc3RTaGFyZWRCdWZmZXJSZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6RmFzdFNo
YXJlZEJ1ZmZlclJlYWRlcjo6Z2V0Q29uc2VjdXRpdmVEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6
OkZhc3RTaGFyZWRCdWZmZXJSZWFkZXI6OmdldFNvbWVEYXRhKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9pbWFnZS1kZWNvZGVycy9GYXN0U2hhcmVkQnVmZmVyUmVhZGVyLmg6IEFkZGVkLgorICAgICAg
ICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJbWFnZURlY29kZXIuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6R0lGSW1hZ2VEZWNvZGVyOjpjbGVhckZyYW1lQnVmZmVyQ2FjaGUpOgor
ICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJbWFnZVJlYWRlci5jcHA6
CisgICAgICAgIChHSUZGcmFtZUNvbnRleHQ6OmRlY29kZSk6CisgICAgICAgIChHSUZJbWFnZVJl
YWRlcjo6ZGVjb2RlKToKKyAgICAgICAgKEdJRkltYWdlUmVhZGVyOjpwYXJzZSk6CisgICAgICAg
ICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvZ2lmL0dJRkltYWdlUmVhZGVyLmg6CisgICAgICAg
IChHSUZJbWFnZVJlYWRlcjo6Z2xvYmFsQ29sb3JtYXApOgorICAgICAgICAoR0lGSW1hZ2VSZWFk
ZXI6OmxvY2FsQ29sb3JtYXApOgorICAgICAgICAoR0lGSW1hZ2VSZWFkZXI6OmRhdGEpOgorCiAy
MDE3LTA5LTI1ICBDaHJpcyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CiAKICAgICAgICAgTWFr
ZSBTdG9yZWRDcmVkZW50aWFscyBhbiBlbnVtIGNsYXNzIGFuZCByZW5hbWUgaXRzIGhlYWRlcgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vSW1hZ2VEZWNvZGVycy5jbWFrZSBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0ltYWdlRGVjb2RlcnMuY21ha2UKaW5kZXggNDQwY2My
ZmNlM2QuLjIxNTQ3YjQzMjg3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9J
bWFnZURlY29kZXJzLmNtYWtlCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0ltYWdlRGVj
b2RlcnMuY21ha2UKQEAgLTksNiArOSw4IEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfSU5DTFVERV9E
SVJFQ1RPUklFUwogKQogCiBsaXN0KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKKyAgICBwbGF0Zm9y
bS9pbWFnZS1kZWNvZGVycy9GYXN0U2hhcmVkQnVmZmVyUmVhZGVyLmNwcAorCiAgICAgcGxhdGZv
cm0vaW1hZ2UtZGVjb2RlcnMvU2NhbGFibGVJbWFnZURlY29kZXIuY3BwCiAKICAgICBwbGF0Zm9y
bS9pbWFnZS1kZWNvZGVycy9ibXAvQk1QSW1hZ2VEZWNvZGVyLmNwcApkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvRmFzdFNoYXJlZEJ1ZmZlclJlYWRl
ci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9GYXN0U2hhcmVk
QnVmZmVyUmVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u
ZDlmNzYwN2YyODkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9p
bWFnZS1kZWNvZGVycy9GYXN0U2hhcmVkQnVmZmVyUmVhZGVyLmNwcApAQCAtMCwwICsxLDc3IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRo
ZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK
KyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIElu
Yy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklC
VVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
CisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgIkZhc3RTaGFyZWRCdWZmZXJSZWFkZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitGYXN0U2hhcmVkQnVmZmVyUmVhZGVyOjpGYXN0U2hhcmVkQnVmZmVyUmVhZGVyKFJlZlB0
cjxTaGFyZWRCdWZmZXI+JiYgZGF0YSkKKyAgICA6IG1fZGF0YShkYXRhKQorICAgICwgbV9zZWdt
ZW50KDApCisgICAgLCBtX3NlZ21lbnRMZW5ndGgoMCkKKyAgICAsIG1fZGF0YVBvc2l0aW9uKDAp
Cit7Cit9CisKK2NvbnN0IGNoYXIqIEZhc3RTaGFyZWRCdWZmZXJSZWFkZXI6OmdldENvbnNlY3V0
aXZlRGF0YShzaXplX3QgZGF0YVBvc2l0aW9uLCBzaXplX3QgbGVuZ3RoLCBjaGFyKiBidWZmZXIp
Cit7CisgICAgUkVMRUFTRV9BU1NFUlQoZGF0YVBvc2l0aW9uICsgbGVuZ3RoIDw9IG1fZGF0YS0+
c2l6ZSgpKTsKKworICAgIC8vIFVzZSB0aGUgY2FjaGVkIHNlZ21lbnQgaWYgaXQgY2FuIHNlcnZl
IHRoZSByZXF1ZXN0LgorICAgIGlmIChkYXRhUG9zaXRpb24gPj0gbV9kYXRhUG9zaXRpb24gJiYg
ZGF0YVBvc2l0aW9uICsgbGVuZ3RoIDw9IG1fZGF0YVBvc2l0aW9uICsgbV9zZWdtZW50TGVuZ3Ro
KQorICAgICAgICByZXR1cm4gbV9zZWdtZW50ICsgZGF0YVBvc2l0aW9uIC0gbV9kYXRhUG9zaXRp
b247CisKKyAgICAvLyBSZXR1cm4gYSBwb2ludGVyIGludG8gfG1fZGF0YXwgaWYgdGhlIHJlcXVl
c3QgZG9lc24ndCBzcGFuIHNlZ21lbnRzLgorICAgIG1fZGF0YVBvc2l0aW9uID0gZGF0YVBvc2l0
aW9uOworICAgIGF1dG8gZGF0YVNlZ21lbnQgPSBtX2RhdGEtPmdldFNvbWVEYXRhKG1fZGF0YVBv
c2l0aW9uKTsKKyAgICBpZiAobGVuZ3RoIDw9IGRhdGFTZWdtZW50LnNpemUoKSkKKyAgICAgICAg
cmV0dXJuIGRhdGFTZWdtZW50LmRhdGEoKTsKKworICAgIGZvciAoY2hhciogdGVtcEJ1ZmZlciA9
IGJ1ZmZlcjsgbGVuZ3RoOykgeworICAgICAgICBzaXplX3QgY29weSA9IHN0ZDo6bWluKGxlbmd0
aCwgZGF0YVNlZ21lbnQuc2l6ZSgpKTsKKyAgICAgICAgbWVtY3B5KHRlbXBCdWZmZXIsIGRhdGFT
ZWdtZW50LmRhdGEoKSwgY29weSk7CisgICAgICAgIG1fZGF0YVBvc2l0aW9uICs9IGNvcHk7Cisg
ICAgICAgIGxlbmd0aCAtPSBjb3B5OworICAgICAgICB0ZW1wQnVmZmVyICs9IGNvcHk7CisKKyAg
ICAgICAgZGF0YVNlZ21lbnQgPSBtX2RhdGEtPmdldFNvbWVEYXRhKG1fZGF0YVBvc2l0aW9uKTsK
KyAgICB9CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworc2l6ZV90IEZhc3RTaGFyZWRCdWZmZXJS
ZWFkZXI6OmdldFNvbWVEYXRhKGNvbnN0IGNoYXIqJiBzb21lRGF0YSwgc2l6ZV90IGRhdGFQb3Np
dGlvbikKK3sKKyAgICBhdXRvIGRhdGFTZWdtZW50ID0gbV9kYXRhLT5nZXRTb21lRGF0YShkYXRh
UG9zaXRpb24pOworICAgIHNvbWVEYXRhID0gZGF0YVNlZ21lbnQuZGF0YSgpOworICAgIG1fZGF0
YVBvc2l0aW9uID0gZGF0YVBvc2l0aW9uOworICAgIHJldHVybiBkYXRhU2VnbWVudC5zaXplKCk7
Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL0Zhc3RTaGFyZWRCdWZmZXJSZWFkZXIuaCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL0Zhc3RTaGFyZWRCdWZmZXJSZWFkZXIu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYzhlZGE3MDc4NzcKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9G
YXN0U2hhcmVkQnVmZmVyUmVhZGVyLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24u
CisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMg
b2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMi
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisj
aW5jbHVkZSAiUGxhdGZvcm1FeHBvcnRNYWNyb3MuaCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmZXIu
aCIKKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8g
VGhpcyBjbGFzcyBpcyB1c2VkIGJ5IGltYWdlIGRlY29kZXJzIHRvIGF2b2lkIG1lbW9yeSBjb25z
b2xpZGF0aW9uIGFuZAorLy8gdGhlcmVmb3JlIG1pbmltaXplcyB0aGUgY29zdCBvZiBtZW1vcnkg
Y29weWluZyB3aGVuIHRoZSBkZWNvZGVycworLy8gcmVwZWF0ZWRseSByZWFkIGZyb20gYSBidWZm
ZXIgdGhhdCBpcyBjb250aW51YWxseSBncm93aW5nIGR1ZSB0byBuZXR3b3JrCisvLyB0cmFmZmlj
LgorY2xhc3MgV0VCQ09SRV9FWFBPUlQgRmFzdFNoYXJlZEJ1ZmZlclJlYWRlciB7CitwdWJsaWM6
CisgICAgRmFzdFNoYXJlZEJ1ZmZlclJlYWRlcihSZWZQdHI8U2hhcmVkQnVmZmVyPiYmIGRhdGEp
OworCisgICAgLy8gUmV0dXJucyBhIGNvbnNlY3V0aXZlIGJ1ZmZlciB0aGF0IGNhcnJpZXMgdGhl
IGRhdGEgc3RhcnRpbmcKKyAgICAvLyBhdCB8ZGF0YVBvc2l0aW9ufCB3aXRoIHxsZW5ndGh8IGJ5
dGVzLgorICAgIC8vIFRoaXMgbWV0aG9kIHJldHVybnMgYSBwb2ludGVyIHRvIGEgbWVtb3J5IHNl
Z21lbnQgc3RvcmVkIGluCisgICAgLy8gfG1fZGF0YXwgaWYgc3VjaCBhIGNvbnNlY3V0aXZlIGJ1
ZmZlciBjYW4gYmUgZm91bmQuCisgICAgLy8gT3RoZXJ3aXNlIGNvcGllcyBpbnRvIHxidWZmZXJ8
IGFuZCByZXR1cm5zIGl0LgorICAgIC8vIENhbGxlciBtdXN0IGVuc3VyZSB0aGVyZSBhcmUgZW5v
dWdoIGJ5dGVzIGluIHxtX2RhdGF8IGFuZCB8YnVmZmVyfC4KKyAgICBjb25zdCBjaGFyKiBnZXRD
b25zZWN1dGl2ZURhdGEoc2l6ZV90IGRhdGFQb3NpdGlvbiwgc2l6ZV90IGxlbmd0aCwgY2hhciog
YnVmZmVyKTsKKworICAgIC8vIFdyYXBzIFNoYXJlZEJ1ZmZlcjo6Z2V0U29tZURhdGEoKS4KKyAg
ICBzaXplX3QgZ2V0U29tZURhdGEoY29uc3QgY2hhciomIHNvbWVEYXRhLCBzaXplX3QgZGF0YVBv
c2l0aW9uKTsKKworICAgIC8vIFJldHVybnMgYSBieXRlIGF0IHxkYXRhUG9zaXRpb258LgorICAg
IC8vIENhbGxlciBtdXN0IGVuc3VyZSB0aGVyZSBhcmUgZW5vdWdoIGJ5dGVzIGluIHxtX2RhdGF8
LgorICAgIGlubGluZSBjaGFyIGdldE9uZUJ5dGUoc2l6ZV90IGRhdGFQb3NpdGlvbikKKyAgICB7
CisgICAgICAgIHJldHVybiAqZ2V0Q29uc2VjdXRpdmVEYXRhKGRhdGFQb3NpdGlvbiwgMSwgMCk7
CisgICAgfQorCisgICAgc2l6ZV90IHNpemUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IG1fZGF0YS0+c2l6ZSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBSZWZQdHI8U2hhcmVkQnVm
ZmVyPiBtX2RhdGE7CisKKyAgICAvLyBDYWNoZXMgdGhlIGxhc3Qgc2VnbWVudCBvZiB8bV9kYXRh
fCBhY2Nlc3NlZCwgc2luY2Ugc3Vic2VxdWVudCByZWFkcyBhcmUKKyAgICAvLyBsaWtlbHkgdG8g
cmUtYWNjZXNzIGl0LgorICAgIGNvbnN0IGNoYXIqIG1fc2VnbWVudDsKKyAgICBzaXplX3QgbV9z
ZWdtZW50TGVuZ3RoOworCisgICAgLy8gRGF0YSBwb3NpdGlvbiBpbiB8bV9kYXRhfCBwb2ludGVk
IGJ5IHxtX3NlZ21lbnR8LgorICAgIHNpemVfdCBtX2RhdGFQb3NpdGlvbjsKK307CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VEZWNv
ZGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJ
bWFnZURlY29kZXIuY3BwCmluZGV4IGRkZDBkMGU0YjI2Li41ZTIyYzU2ZWZkNiAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvZ2lmL0dJRkltYWdlRGVj
b2Rlci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvZ2lm
L0dJRkltYWdlRGVjb2Rlci5jcHAKQEAgLTE3Myw3ICsxNzMsMTAgQEAgdm9pZCBHSUZJbWFnZURl
Y29kZXI6OmNsZWFyRnJhbWVCdWZmZXJDYWNoZShzaXplX3QgY2xlYXJCZWZvcmVGcmFtZSkKIAog
ICAgIC8vIFdoZW4gc29tZSBmcmFtZXMgYXJlIGNsZWFyZWQsIHRoZSByZWFkZXIgaXMgb3V0IG9m
IHN5bmMsIHNpbmNlIHRoZSBjYWxsZXIgbWlnaHQgYXNrIGZvciBhbnkgZnJhbWUgbm90CiAgICAg
Ly8gbmVjZXNzYXJpbHkgaW4gdGhlIG9yZGVyIGV4cGVjdGVkIGJ5IHRoZSByZWFkZXIuIFNlZSBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU5MDg5LgotICAgIG1fcmVh
ZGVyID0gbnVsbHB0cjsKKworICAgIC8vIEZJWE1FITogRGVsZXRpbmcgdGhlIHJlYWRlciBjYXVz
ZXMgdGhlIGZpcnN0IGxvb3AgdG8gcGxheSBzbG93CisgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE3NjA4OSNjMTMKKyAgICAvLyBtX3JlYWRlciA9IG51bGxw
dHI7CiB9CiAKIGJvb2wgR0lGSW1hZ2VEZWNvZGVyOjpoYXZlRGVjb2RlZFJvdyh1bnNpZ25lZCBm
cmFtZUluZGV4LCBjb25zdCBWZWN0b3I8dW5zaWduZWQgY2hhcj4mIHJvd0J1ZmZlciwgc2l6ZV90
IHdpZHRoLCBzaXplX3Qgcm93TnVtYmVyLCB1bnNpZ25lZCByZXBlYXRDb3VudCwgYm9vbCB3cml0
ZVRyYW5zcGFyZW50UGl4ZWxzKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
aW1hZ2UtZGVjb2RlcnMvZ2lmL0dJRkltYWdlUmVhZGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJbWFnZVJlYWRlci5jcHAKaW5kZXggMDk2NTg1
OWZlOWUuLmFmNjI4OTVmZmEwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9p
bWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VSZWFkZXIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJbWFnZVJlYWRlci5jcHAKQEAgLTMxMyw3
ICszMTMsNyBAQCBib29sIEdJRkxaV0NvbnRleHQ6OmRvTFpXKGNvbnN0IHVuc2lnbmVkIGNoYXIq
IGJsb2NrLCBzaXplX3QgYnl0ZXNJbkJsb2NrKQogLy8gUGVyZm9ybSBkZWNvZGluZyBmb3IgdGhp
cyBmcmFtZS4gZnJhbWVEZWNvZGVkIHdpbGwgYmUgdHJ1ZSBpZiB0aGUgZW50aXJlIGZyYW1lIGlz
IGRlY29kZWQuCiAvLyBSZXR1cm5zIGZhbHNlIGlmIGEgZGVjb2RpbmcgZXJyb3Igb2NjdXJyZWQu
IFRoaXMgaXMgYSBmYXRhbCBlcnJvciBhbmQgY2F1c2VzIHRoZSBHSUZJbWFnZVJlYWRlciB0byBz
ZXQgdGhlICJkZWNvZGUgZmFpbGVkIiBmbGFnLgogLy8gT3RoZXJ3aXNlLCBlaXRoZXIgbm90IGVu
b3VnaCBkYXRhIGlzIGF2YWlsYWJsZSB0byBkZWNvZGUgZnVydGhlciB0aGFuIGJlZm9yZSwgb3Ig
dGhlIG5ldyBkYXRhIGhhcyBiZWVuIGRlY29kZWQgc3VjY2Vzc2Z1bGx5OyByZXR1cm5zIHRydWUg
aW4gdGhpcyBjYXNlLgotYm9vbCBHSUZGcmFtZUNvbnRleHQ6OmRlY29kZShjb25zdCB1bnNpZ25l
ZCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuZ3RoLCBXZWJDb3JlOjpHSUZJbWFnZURlY29kZXIqIGNs
aWVudCwgYm9vbCogZnJhbWVEZWNvZGVkKQorYm9vbCBHSUZGcmFtZUNvbnRleHQ6OmRlY29kZShX
ZWJDb3JlOjpGYXN0U2hhcmVkQnVmZmVyUmVhZGVyKiByZWFkZXIsIFdlYkNvcmU6OkdJRkltYWdl
RGVjb2RlciogY2xpZW50LCBib29sKiBmcmFtZURlY29kZWQpCiB7CiAgICAgKmZyYW1lRGVjb2Rl
ZCA9IGZhbHNlOwogICAgIGlmICghbV9sendDb250ZXh0KSB7CkBAIC0zMzQsMTAgKzMzNCwxOCBA
QCBib29sIEdJRkZyYW1lQ29udGV4dDo6ZGVjb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEs
IHNpemVfdCBsZW5ndGgsIFdlYkNvcmU6OgogICAgIHdoaWxlIChtX2N1cnJlbnRMendCbG9jayA8
IG1fbHp3QmxvY2tzLnNpemUoKSAmJiBtX2x6d0NvbnRleHQtPmhhc1JlbWFpbmluZ1Jvd3MoKSkg
ewogICAgICAgICBzaXplX3QgYmxvY2tQb3NpdGlvbiA9IG1fbHp3QmxvY2tzW21fY3VycmVudEx6
d0Jsb2NrXS5ibG9ja1Bvc2l0aW9uOwogICAgICAgICBzaXplX3QgYmxvY2tTaXplID0gbV9sendC
bG9ja3NbbV9jdXJyZW50THp3QmxvY2tdLmJsb2NrU2l6ZTsKLSAgICAgICAgaWYgKGJsb2NrUG9z
aXRpb24gKyBibG9ja1NpemUgPiBsZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICAgIGlmICghbV9sendDb250ZXh0LT5kb0xaVyhkYXRhICsgYmxvY2tQb3NpdGlvbiwgYmxv
Y2tTaXplKSkKKyAgICAgICAgaWYgKGJsb2NrUG9zaXRpb24gKyBibG9ja1NpemUgPiByZWFkZXIt
PnNpemUoKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB3aGlsZSAoYmxv
Y2tTaXplKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBzZWdtZW50ID0gMDsKKyAgICAgICAg
ICAgIHNpemVfdCBzZWdtZW50TGVuZ3RoID0gcmVhZGVyLT5nZXRTb21lRGF0YShzZWdtZW50LCBi
bG9ja1Bvc2l0aW9uKTsKKyAgICAgICAgICAgIHNpemVfdCBkZWNvZGVTaXplID0gc3RkOjptaW4o
c2VnbWVudExlbmd0aCwgYmxvY2tTaXplKTsKKyAgICAgICAgICAgIGlmICghbV9sendDb250ZXh0
LT5kb0xaVyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihzZWdtZW50KSwg
ZGVjb2RlU2l6ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
YmxvY2tQb3NpdGlvbiArPSBkZWNvZGVTaXplOworICAgICAgICAgICAgYmxvY2tTaXplIC09IGRl
Y29kZVNpemU7CisgICAgICAgIH0KICAgICAgICAgKyttX2N1cnJlbnRMendCbG9jazsKICAgICB9
CiAKQEAgLTM1NSw2ICszNjMsOCBAQCBib29sIEdJRkZyYW1lQ29udGV4dDo6ZGVjb2RlKGNvbnN0
IHVuc2lnbmVkIGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgsIFdlYkNvcmU6OgogLy8gUmV0dXJu
IHRydWUgaWYgZGVjb2RpbmcgaGFzIHByb2dyZXNzZWQuIFJldHVybiBmYWxzZSBpZiBhbiBlcnJv
ciBoYXMgb2NjdXJyZWQuCiBib29sIEdJRkltYWdlUmVhZGVyOjpkZWNvZGUoR0lGSW1hZ2VEZWNv
ZGVyOjpHSUZRdWVyeSBxdWVyeSwgdW5zaWduZWQgaGFsdEF0RnJhbWUpCiB7CisgICAgV2ViQ29y
ZTo6RmFzdFNoYXJlZEJ1ZmZlclJlYWRlciByZWFkZXIobV9kYXRhLmNvcHlSZWYoKSk7CisKICAg
ICBBU1NFUlQobV9ieXRlc1JlYWQgPD0gbV9kYXRhLT5zaXplKCkpOwogCiAgICAgaWYgKCFwYXJz
ZShtX2J5dGVzUmVhZCwgbV9kYXRhLT5zaXplKCkgLSBtX2J5dGVzUmVhZCwgcXVlcnkgPT0gR0lG
SW1hZ2VEZWNvZGVyOjpHSUZTaXplUXVlcnkpKQpAQCAtMzY3LDcgKzM3Nyw3IEBAIGJvb2wgR0lG
SW1hZ2VSZWFkZXI6OmRlY29kZShHSUZJbWFnZURlY29kZXI6OkdJRlF1ZXJ5IHF1ZXJ5LCB1bnNp
Z25lZCBoYWx0QXRGcmFtCiAgICAgICAgIGJvb2wgZnJhbWVEZWNvZGVkID0gZmFsc2U7CiAgICAg
ICAgIEdJRkZyYW1lQ29udGV4dCogY3VycmVudEZyYW1lID0gbV9mcmFtZXNbbV9jdXJyZW50RGVj
b2RpbmdGcmFtZV0uZ2V0KCk7CiAKLSAgICAgICAgaWYgKCFjdXJyZW50RnJhbWUtPmRlY29kZShk
YXRhKDApLCBtX2RhdGEtPnNpemUoKSwgbV9jbGllbnQsICZmcmFtZURlY29kZWQpKQorICAgICAg
ICBpZiAoIWN1cnJlbnRGcmFtZS0+ZGVjb2RlKCZyZWFkZXIsIG1fY2xpZW50LCAmZnJhbWVEZWNv
ZGVkKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAvLyBXZSBuZWVkIG1v
cmUgZGF0YSB0byBjb250aW51ZSBkZWNvZGluZy4KQEAgLTM5OCwxMiArNDA4LDE2IEBAIGJvb2wg
R0lGSW1hZ2VSZWFkZXI6OnBhcnNlKHNpemVfdCBkYXRhUG9zaXRpb24sIHNpemVfdCBsZW4sIGJv
b2wgcGFyc2VTaXplT25seSkKICAgICBpZiAobGVuIDwgbV9ieXRlc1RvQ29uc3VtZSkKICAgICAg
ICAgcmV0dXJuIHRydWU7CiAKKyAgICBXZWJDb3JlOjpGYXN0U2hhcmVkQnVmZmVyUmVhZGVyIHJl
YWRlcihtX2RhdGEuY29weVJlZigpKTsKKworICAgIC8vIEEgcmVhZCBidWZmZXIgb2YgMTYgYnl0
ZXMgaXMgZW5vdWdoIHRvIGFjY29tb2RhdGUgYWxsIHBvc3NpYmxlIHJlYWRzIGZvciBwYXJzaW5n
LgorICAgIGNoYXIgcmVhZEJ1ZmZlclsxNl07CisKICAgICAvLyBUaGlzIGxvb3AgcmVhZHMgYXMg
bWFueSBjb21wb25lbnRzIGZyb20gfG1fZGF0YXwgYXMgcG9zc2libGUuCiAgICAgLy8gQXQgdGhl
IGJlZ2lubmluZyBvZiBlYWNoIGl0ZXJhdGlvbiwgZGF0YVBvc2l0aW9uIHdpbGwgYmUgYWR2YW5j
ZWQgYnkgbV9ieXRlc1RvQ29uc3VtZSB0bwogICAgIC8vIHBvaW50IHRvIHRoZSBuZXh0IGNvbXBv
bmVudC4gbGVuIHdpbGwgYmUgZGVjcmVtZW50ZWQgYWNjb3JkaW5nbHkuCiAgICAgd2hpbGUgKGxl
biA+PSBtX2J5dGVzVG9Db25zdW1lKSB7CiAgICAgICAgIGNvbnN0IHNpemVfdCBjdXJyZW50Q29t
cG9uZW50UG9zaXRpb24gPSBkYXRhUG9zaXRpb247Ci0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGNo
YXIqIGN1cnJlbnRDb21wb25lbnQgPSBkYXRhKGRhdGFQb3NpdGlvbik7CiAKICAgICAgICAgLy8g
TWFyayB0aGUgY3VycmVudCBjb21wb25lbnQgYXMgY29uc3VtZWQuIE5vdGUgdGhhdCBjdXJyZW50
Q29tcG9uZW50IHdpbGwgcmVtYWluIHBvaW50ZWQgYXQgdGhpcwogICAgICAgICAvLyBjb21wb25l
bnQgdW50aWwgdGhlIG5leHQgbG9vcCBpdGVyYXRpb24uCkBAIC00MjAsMTYgKzQzNCwxOCBAQCBi
b29sIEdJRkltYWdlUmVhZGVyOjpwYXJzZShzaXplX3QgZGF0YVBvc2l0aW9uLCBzaXplX3QgbGVu
LCBib29sIHBhcnNlU2l6ZU9ubHkpCiAKICAgICAgICAgY2FzZSBHSUZMWldTdGFydDogewogICAg
ICAgICAgICAgQVNTRVJUKCFtX2ZyYW1lcy5pc0VtcHR5KCkpOwotICAgICAgICAgICAgbV9mcmFt
ZXMubGFzdCgpLT5zZXREYXRhU2l6ZSgqY3VycmVudENvbXBvbmVudCk7CisgICAgICAgICAgICBt
X2ZyYW1lcy5sYXN0KCktPnNldERhdGFTaXplKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHJl
YWRlci5nZXRPbmVCeXRlKGN1cnJlbnRDb21wb25lbnRQb3NpdGlvbikpKTsKICAgICAgICAgICAg
IEdFVE4oMSwgR0lGU3ViQmxvY2spOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAog
ICAgICAgICBjYXNlIEdJRlR5cGU6IHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGN1cnJlbnRD
b21wb25lbnQgPSByZWFkZXIuZ2V0Q29uc2VjdXRpdmVEYXRhKGN1cnJlbnRDb21wb25lbnRQb3Np
dGlvbiwgNiwgcmVhZEJ1ZmZlcik7CisKICAgICAgICAgICAgIC8vIEFsbCBHSUYgZmlsZXMgYmVn
aW4gd2l0aCAiR0lGODdhIiBvciAiR0lGODlhIi4KLSAgICAgICAgICAgIGlmICghc3RybmNtcCgo
Y2hhciopY3VycmVudENvbXBvbmVudCwgIkdJRjg5YSIsIDYpKQorICAgICAgICAgICAgaWYgKCFt
ZW1jbXAoY3VycmVudENvbXBvbmVudCwgIkdJRjg5YSIsIDYpKQogICAgICAgICAgICAgICAgIG1f
dmVyc2lvbiA9IDg5OwotICAgICAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoKGNoYXIqKWN1cnJl
bnRDb21wb25lbnQsICJHSUY4N2EiLCA2KSkKKyAgICAgICAgICAgIGVsc2UgaWYgKCFtZW1jbXAo
Y3VycmVudENvbXBvbmVudCwgIkdJRjg3YSIsIDYpKQogICAgICAgICAgICAgICAgIG1fdmVyc2lv
biA9IDg3OwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
QEAgLTQzOCw2ICs0NTQsOCBAQCBib29sIEdJRkltYWdlUmVhZGVyOjpwYXJzZShzaXplX3QgZGF0
YVBvc2l0aW9uLCBzaXplX3QgbGVuLCBib29sIHBhcnNlU2l6ZU9ubHkpCiAgICAgICAgIH0KIAog
ICAgICAgICBjYXNlIEdJRkdsb2JhbEhlYWRlcjogeworICAgICAgICAgICAgY29uc3QgdW5zaWdu
ZWQgY2hhciogY3VycmVudENvbXBvbmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWdu
ZWQgY2hhcio+KHJlYWRlci5nZXRDb25zZWN1dGl2ZURhdGEoY3VycmVudENvbXBvbmVudFBvc2l0
aW9uLCA1LCByZWFkQnVmZmVyKSk7CisKICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGhlaWdo
dCBhbmQgd2lkdGggb2YgdGhlICJzY3JlZW4iIG9yIGZyYW1lIGludG8gd2hpY2ggaW1hZ2VzIGFy
ZSByZW5kZXJlZC4gVGhlCiAgICAgICAgICAgICAvLyBpbmRpdmlkdWFsIGltYWdlcyBjYW4gYmUg
c21hbGxlciB0aGFuIHRoZSBzY3JlZW4gc2l6ZSBhbmQgbG9jYXRlZCB3aXRoIGFuIG9yaWdpbiBh
bnl3aGVyZQogICAgICAgICAgICAgLy8gd2l0aGluIHRoZSBzY3JlZW4uCkBAIC00ODMsMTIgKzUw
MSwxNCBAQCBib29sIEdJRkltYWdlUmVhZGVyOjpwYXJzZShzaXplX3QgZGF0YVBvc2l0aW9uLCBz
aXplX3QgbGVuLCBib29sIHBhcnNlU2l6ZU9ubHkpCiAgICAgICAgIH0KIAogICAgICAgICBjYXNl
IEdJRkltYWdlU3RhcnQ6IHsKLSAgICAgICAgICAgIGlmICgqY3VycmVudENvbXBvbmVudCA9PSAn
OycpIHsgLy8gdGVybWluYXRvci4KKyAgICAgICAgICAgIGNvbnN0IGNoYXIgY3VycmVudENvbXBv
bmVudCA9IHJlYWRlci5nZXRPbmVCeXRlKGN1cnJlbnRDb21wb25lbnRQb3NpdGlvbik7CisKKyAg
ICAgICAgICAgIGlmIChjdXJyZW50Q29tcG9uZW50ID09ICc7JykgeyAvLyB0ZXJtaW5hdG9yLgog
ICAgICAgICAgICAgICAgIEdFVE4oMCwgR0lGRG9uZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7
CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICgqY3VycmVudENvbXBvbmVudCA9PSAn
IScpIHsgLy8gZXh0ZW5zaW9uLgorICAgICAgICAgICAgaWYgKGN1cnJlbnRDb21wb25lbnQgPT0g
JyEnKSB7IC8vIGV4dGVuc2lvbi4KICAgICAgICAgICAgICAgICBHRVROKDIsIEdJRkV4dGVuc2lv
bik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC00OTgsNyArNTE4
LDcgQEAgYm9vbCBHSUZJbWFnZVJlYWRlcjo6cGFyc2Uoc2l6ZV90IGRhdGFQb3NpdGlvbiwgc2l6
ZV90IGxlbiwgYm9vbCBwYXJzZVNpemVPbmx5KQogICAgICAgICAgICAgLy8gYmV0d2VlbiBibG9j
a3MuIFRoZSBHSUY4N2Egc3BlYyB0ZWxscyB1cyB0byBrZWVwIHJlYWRpbmcKICAgICAgICAgICAg
IC8vIHVudGlsIHdlIGZpbmQgYW4gaW1hZ2Ugc2VwYXJhdG9yLCBidXQgR0lGODlhIHNheXMgc3Vj
aAogICAgICAgICAgICAgLy8gYSBmaWxlIGlzIGNvcnJ1cHQuIFdlIGZvbGxvdyBHSUY4OWEgYW5k
IGJhaWwgb3V0LgotICAgICAgICAgICAgaWYgKCpjdXJyZW50Q29tcG9uZW50ICE9ICcsJykKKyAg
ICAgICAgICAgIGlmIChjdXJyZW50Q29tcG9uZW50ICE9ICcsJykKICAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CiAKICAgICAgICAgICAgIEdFVE4oOSwgR0lGSW1hZ2VIZWFkZXIpOwpAQCAt
NTA2LDYgKzUyNiw4IEBAIGJvb2wgR0lGSW1hZ2VSZWFkZXI6OnBhcnNlKHNpemVfdCBkYXRhUG9z
aXRpb24sIHNpemVfdCBsZW4sIGJvb2wgcGFyc2VTaXplT25seSkKICAgICAgICAgfQogCiAgICAg
ICAgIGNhc2UgR0lGRXh0ZW5zaW9uOiB7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFy
KiBjdXJyZW50Q29tcG9uZW50ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFy
Kj4ocmVhZGVyLmdldENvbnNlY3V0aXZlRGF0YShjdXJyZW50Q29tcG9uZW50UG9zaXRpb24sIDIs
IHJlYWRCdWZmZXIpKTsKKwogICAgICAgICAgICAgc2l6ZV90IGJ5dGVzSW5CbG9jayA9IGN1cnJl
bnRDb21wb25lbnRbMV07CiAgICAgICAgICAgICBHSUZTdGF0ZSBlcyA9IEdJRlNraXBCbG9jazsK
IApAQCAtNTQ2LDEwICs1NjgsMTEgQEAgYm9vbCBHSUZJbWFnZVJlYWRlcjo6cGFyc2Uoc2l6ZV90
IGRhdGFQb3NpdGlvbiwgc2l6ZV90IGxlbiwgYm9vbCBwYXJzZVNpemVPbmx5KQogICAgICAgICB9
CiAKICAgICAgICAgY2FzZSBHSUZDb25zdW1lQmxvY2s6IHsKLSAgICAgICAgICAgIGlmICghKmN1
cnJlbnRDb21wb25lbnQpCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGN1cnJlbnRD
b21wb25lbnQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihyZWFkZXIuZ2V0T25lQnl0ZShj
dXJyZW50Q29tcG9uZW50UG9zaXRpb24pKTsKKyAgICAgICAgICAgIGlmICghY3VycmVudENvbXBv
bmVudCkKICAgICAgICAgICAgICAgICBHRVROKDEsIEdJRkltYWdlU3RhcnQpOwogICAgICAgICAg
ICAgZWxzZQotICAgICAgICAgICAgICAgIEdFVE4oKmN1cnJlbnRDb21wb25lbnQsIEdJRlNraXBC
bG9jayk7CisgICAgICAgICAgICAgICAgR0VUTihjdXJyZW50Q29tcG9uZW50LCBHSUZTa2lwQmxv
Y2spOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNTU5LDYgKzU4Miw4IEBA
IGJvb2wgR0lGSW1hZ2VSZWFkZXI6OnBhcnNlKHNpemVfdCBkYXRhUG9zaXRpb24sIHNpemVfdCBs
ZW4sIGJvb2wgcGFyc2VTaXplT25seSkKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgR0lGQ29u
dHJvbEV4dGVuc2lvbjogeworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogY3VycmVu
dENvbXBvbmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KHJlYWRl
ci5nZXRDb25zZWN1dGl2ZURhdGEoY3VycmVudENvbXBvbmVudFBvc2l0aW9uLCA0LCByZWFkQnVm
ZmVyKSk7CisKICAgICAgICAgICAgIGFkZEZyYW1lSWZOZWNlc3NhcnkoKTsKICAgICAgICAgICAg
IEdJRkZyYW1lQ29udGV4dCogY3VycmVudEZyYW1lID0gbV9mcmFtZXMubGFzdCgpLmdldCgpOwog
ICAgICAgICAgICAgY3VycmVudEZyYW1lLT5pc1RyYW5zcGFyZW50ID0gKmN1cnJlbnRDb21wb25l
bnQgJiAweDE7CkBAIC01ODEsOCArNjA2LDkgQEAgYm9vbCBHSUZJbWFnZVJlYWRlcjo6cGFyc2Uo
c2l6ZV90IGRhdGFQb3NpdGlvbiwgc2l6ZV90IGxlbiwgYm9vbCBwYXJzZVNpemVPbmx5KQogICAg
ICAgICB9CiAKICAgICAgICAgY2FzZSBHSUZDb21tZW50RXh0ZW5zaW9uOiB7Ci0gICAgICAgICAg
ICBpZiAoKmN1cnJlbnRDb21wb25lbnQpCi0gICAgICAgICAgICAgICAgR0VUTigqY3VycmVudENv
bXBvbmVudCwgR0lGQ29uc3VtZUNvbW1lbnQpOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQg
Y2hhciBjdXJyZW50Q29tcG9uZW50ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocmVhZGVy
LmdldE9uZUJ5dGUoY3VycmVudENvbXBvbmVudFBvc2l0aW9uKSk7CisgICAgICAgICAgICBpZiAo
Y3VycmVudENvbXBvbmVudCkKKyAgICAgICAgICAgICAgICBHRVROKGN1cnJlbnRDb21wb25lbnQs
IEdJRkNvbnN1bWVDb21tZW50KTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBH
RVROKDEsIEdJRkltYWdlU3RhcnQpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC01OTUsMTkgKzYy
MSwyNCBAQCBib29sIEdJRkltYWdlUmVhZGVyOjpwYXJzZShzaXplX3QgZGF0YVBvc2l0aW9uLCBz
aXplX3QgbGVuLCBib29sIHBhcnNlU2l6ZU9ubHkpCiAKICAgICAgICAgY2FzZSBHSUZBcHBsaWNh
dGlvbkV4dGVuc2lvbjogewogICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG5ldHNjYXBlIGFwcGxp
Y2F0aW9uIGV4dGVuc2lvbi4KLSAgICAgICAgICAgIGlmIChtX2J5dGVzVG9Db25zdW1lID09IDEx
IAotICAgICAgICAgICAgICAgICYmICghc3RybmNtcCgoY2hhciopY3VycmVudENvbXBvbmVudCwg
Ik5FVFNDQVBFMi4wIiwgMTEpIHx8ICFzdHJuY21wKChjaGFyKiljdXJyZW50Q29tcG9uZW50LCAi
QU5JTUVYVFMxLjAiLCAxMSkpKQotICAgICAgICAgICAgICAgIEdFVE4oMSwgR0lGTmV0c2NhcGVF
eHRlbnNpb25CbG9jayk7Ci0gICAgICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiAobV9ieXRl
c1RvQ29uc3VtZSA9PSAxMSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIq
IGN1cnJlbnRDb21wb25lbnQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIq
PihyZWFkZXIuZ2V0Q29uc2VjdXRpdmVEYXRhKGN1cnJlbnRDb21wb25lbnRQb3NpdGlvbiwgMTEs
IHJlYWRCdWZmZXIpKTsKKworICAgICAgICAgICAgICAgIGlmICghbWVtY21wKGN1cnJlbnRDb21w
b25lbnQsICJORVRTQ0FQRTIuMCIsIDExKSB8fCAhbWVtY21wKGN1cnJlbnRDb21wb25lbnQsICJB
TklNRVhUUzEuMCIsIDExKSkKKyAgICAgICAgICAgICAgICAgICAgR0VUTigxLCBHSUZOZXRzY2Fw
ZUV4dGVuc2lvbkJsb2NrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1fc3Rh
dGUgIT0gR0lGTmV0c2NhcGVFeHRlbnNpb25CbG9jaykKICAgICAgICAgICAgICAgICBHRVROKDEs
IEdJRkNvbnN1bWVCbG9jayk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAg
ICAgIC8vIE5ldHNjYXBlLXNwZWNpZmljIEdJRiBleHRlbnNpb246IGFuaW1hdGlvbiBsb29waW5n
LgogICAgICAgICBjYXNlIEdJRk5ldHNjYXBlRXh0ZW5zaW9uQmxvY2s6IHsKKyAgICAgICAgICAg
IGNvbnN0IGludCBjdXJyZW50Q29tcG9uZW50ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4o
cmVhZGVyLmdldE9uZUJ5dGUoY3VycmVudENvbXBvbmVudFBvc2l0aW9uKSk7CiAgICAgICAgICAg
ICAvLyBHSUZDb25zdW1lTmV0c2NhcGVFeHRlbnNpb24gYWx3YXlzIHJlYWRzIDMgYnl0ZXMgZnJv
bSB0aGUgc3RyZWFtOyB3ZSBzaG91bGQgYXQgbGVhc3Qgd2FpdCBmb3IgdGhpcyBhbW91bnQuCi0g
ICAgICAgICAgICBpZiAoKmN1cnJlbnRDb21wb25lbnQpCi0gICAgICAgICAgICAgICAgR0VUTihz
dGQ6Om1heCgzLCBzdGF0aWNfY2FzdDxpbnQ+KCpjdXJyZW50Q29tcG9uZW50KSksIEdJRkNvbnN1
bWVOZXRzY2FwZUV4dGVuc2lvbik7CisgICAgICAgICAgICBpZiAoY3VycmVudENvbXBvbmVudCkK
KyAgICAgICAgICAgICAgICBHRVROKHN0ZDo6bWF4KDMsIGN1cnJlbnRDb21wb25lbnQpLCBHSUZD
b25zdW1lTmV0c2NhcGVFeHRlbnNpb24pOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAg
ICAgIEdFVE4oMSwgR0lGSW1hZ2VTdGFydCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTYxNSw2
ICs2NDYsOCBAQCBib29sIEdJRkltYWdlUmVhZGVyOjpwYXJzZShzaXplX3QgZGF0YVBvc2l0aW9u
LCBzaXplX3QgbGVuLCBib29sIHBhcnNlU2l6ZU9ubHkpCiAKICAgICAgICAgLy8gUGFyc2UgbmV0
c2NhcGUtc3BlY2lmaWMgYXBwbGljYXRpb24gZXh0ZW5zaW9ucwogICAgICAgICBjYXNlIEdJRkNv
bnN1bWVOZXRzY2FwZUV4dGVuc2lvbjogeworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hh
ciogY3VycmVudENvbXBvbmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hh
cio+KHJlYWRlci5nZXRDb25zZWN1dGl2ZURhdGEoY3VycmVudENvbXBvbmVudFBvc2l0aW9uLCAz
LCByZWFkQnVmZmVyKSk7CisKICAgICAgICAgICAgIGludCBuZXRzY2FwZUV4dGVuc2lvbiA9IGN1
cnJlbnRDb21wb25lbnRbMF0gJiA3OwogCiAgICAgICAgICAgICAvLyBMb29wIGVudGlyZSBhbmlt
YXRpb24gc3BlY2lmaWVkICMgb2YgdGltZXMuIE9ubHkgcmVhZCB0aGUgbG9vcCBjb3VudCBkdXJp
bmcgdGhlIGZpcnN0IGl0ZXJhdGlvbi4KQEAgLTY0Miw2ICs2NzUsNyBAQCBib29sIEdJRkltYWdl
UmVhZGVyOjpwYXJzZShzaXplX3QgZGF0YVBvc2l0aW9uLCBzaXplX3QgbGVuLCBib29sIHBhcnNl
U2l6ZU9ubHkpCiAKICAgICAgICAgY2FzZSBHSUZJbWFnZUhlYWRlcjogewogICAgICAgICAgICAg
dW5zaWduZWQgaGVpZ2h0LCB3aWR0aCwgeE9mZnNldCwgeU9mZnNldDsKKyAgICAgICAgICAgIGNv
bnN0IHVuc2lnbmVkIGNoYXIqIGN1cnJlbnRDb21wb25lbnQgPSByZWludGVycHJldF9jYXN0PGNv
bnN0IHVuc2lnbmVkIGNoYXIqPihyZWFkZXIuZ2V0Q29uc2VjdXRpdmVEYXRhKGN1cnJlbnRDb21w
b25lbnRQb3NpdGlvbiwgOSwgcmVhZEJ1ZmZlcikpOwogCiAgICAgICAgICAgICAvKiBHZXQgaW1h
Z2Ugb2Zmc2V0cywgd2l0aCByZXNwZWN0IHRvIHRoZSBzY3JlZW4gb3JpZ2luICovCiAgICAgICAg
ICAgICB4T2Zmc2V0ID0gR0VUSU5UMTYoY3VycmVudENvbXBvbmVudCk7CkBAIC03NDEsNyArNzc1
LDcgQEAgYm9vbCBHSUZJbWFnZVJlYWRlcjo6cGFyc2Uoc2l6ZV90IGRhdGFQb3NpdGlvbiwgc2l6
ZV90IGxlbiwgYm9vbCBwYXJzZVNpemVPbmx5KQogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBH
SUZTdWJCbG9jazogewotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGJ5dGVzSW5CbG9jayA9ICpj
dXJyZW50Q29tcG9uZW50OworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGJ5dGVzSW5CbG9jayA9
IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHJlYWRlci5nZXRPbmVCeXRlKGN1cnJlbnRDb21w
b25lbnRQb3NpdGlvbikpOwogICAgICAgICAgICAgaWYgKGJ5dGVzSW5CbG9jaykKICAgICAgICAg
ICAgICAgICBHRVROKGJ5dGVzSW5CbG9jaywgR0lGTFpXKTsKICAgICAgICAgICAgIGVsc2Ugewpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvZ2lmL0dJ
RkltYWdlUmVhZGVyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9n
aWYvR0lGSW1hZ2VSZWFkZXIuaAppbmRleCA0MGIxZDY5ZjEyYS4uM2UwZGExNDgzOWIgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJbWFn
ZVJlYWRlci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dp
Zi9HSUZJbWFnZVJlYWRlci5oCkBAIC00MSw2ICs0MSw3IEBACiAvLyBzbyB3ZSB3aWxsIHRvby4K
ICNpbmNsdWRlICJHSUZJbWFnZURlY29kZXIuaCIKICNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIK
KyNpbmNsdWRlICJGYXN0U2hhcmVkQnVmZmVyUmVhZGVyLmgiCiAjaW5jbHVkZSA8d3RmL1ZlY3Rv
ci5oPgogCiAjZGVmaW5lIE1BWF9MWldfQklUUyAgICAgICAgICAxMgpAQCAtMTk4LDcgKzE5OSw3
IEBAIHB1YmxpYzoKICAgICAgICAgbV9sendCbG9ja3MuYXBwZW5kKEdJRkxaV0Jsb2NrKHBvc2l0
aW9uLCBzaXplKSk7CiAgICAgfQogCi0gICAgYm9vbCBkZWNvZGUoY29uc3QgdW5zaWduZWQgY2hh
ciogZGF0YSwgc2l6ZV90IGxlbmd0aCwgV2ViQ29yZTo6R0lGSW1hZ2VEZWNvZGVyKiBjbGllbnQs
IGJvb2wqIGZyYW1lRGVjb2RlZCk7CisgICAgYm9vbCBkZWNvZGUoV2ViQ29yZTo6RmFzdFNoYXJl
ZEJ1ZmZlclJlYWRlciosIFdlYkNvcmU6OkdJRkltYWdlRGVjb2RlciogY2xpZW50LCBib29sKiBm
cmFtZURlY29kZWQpOwogCiAgICAgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3QgeyByZXR1cm4gbV9p
c0NvbXBsZXRlOyB9CiAgICAgdm9pZCBzZXRDb21wbGV0ZSgpIHsgbV9pc0NvbXBsZXRlID0gdHJ1
ZTsgfQpAQCAtMjYxLDcgKzI2Miw3IEBAIHB1YmxpYzoKICAgICB9CiAgICAgaW50IGxvb3BDb3Vu
dCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9vcENvdW50OyB9CiAKLSAgICBjb25zdCB1bnNpZ25lZCBj
aGFyKiBnbG9iYWxDb2xvcm1hcCgpIGNvbnN0CisgICAgY29uc3QgdW5zaWduZWQgY2hhciogZ2xv
YmFsQ29sb3JtYXAoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1faXNHbG9iYWxDb2xvcm1hcERl
ZmluZWQgPyBkYXRhKG1fZ2xvYmFsQ29sb3JtYXBQb3NpdGlvbikgOiAwOwogICAgIH0KQEAgLTI3
MCw3ICsyNzEsNyBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBtX2lzR2xvYmFsQ29sb3JtYXBE
ZWZpbmVkID8gbV9nbG9iYWxDb2xvcm1hcFNpemUgOiAwOwogICAgIH0KIAotICAgIGNvbnN0IHVu
c2lnbmVkIGNoYXIqIGxvY2FsQ29sb3JtYXAoY29uc3QgR0lGRnJhbWVDb250ZXh0KiBmcmFtZSkg
Y29uc3QKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBsb2NhbENvbG9ybWFwKGNvbnN0IEdJRkZy
YW1lQ29udGV4dCogZnJhbWUpCiAgICAgewogICAgICAgICByZXR1cm4gZnJhbWUtPmlzTG9jYWxD
b2xvcm1hcERlZmluZWQgPyBkYXRhKGZyYW1lLT5sb2NhbENvbG9ybWFwUG9zaXRpb24pIDogMDsK
ICAgICB9CkBAIC0yODgsOSArMjg5LDE1IEBAIHByaXZhdGU6CiAgICAgYm9vbCBwYXJzZShzaXpl
X3QgZGF0YVBvc2l0aW9uLCBzaXplX3QgbGVuLCBib29sIHBhcnNlU2l6ZU9ubHkpOwogICAgIHZv
aWQgc2V0UmVtYWluaW5nQnl0ZXMoc2l6ZV90KTsKIAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIq
IGRhdGEoc2l6ZV90IGRhdGFQb3NpdGlvbikgY29uc3QKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFy
KiBkYXRhKHNpemVfdCBkYXRhUG9zaXRpb24pCiAgICAgewotICAgICAgICByZXR1cm4gcmVpbnRl
cnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4obV9kYXRhLT5kYXRhKCkpICsgZGF0YVBv
c2l0aW9uOworICAgICAgICAvLyBGSVhNRSEgU2VlIHNoYXJlZGJ1ZmZlci5oCisgICAgICAgIC8v
IENhbGxpbmcgbV9kYXRhLT5kYXRhKCkgaXMgc3RpbGwgbmVlZGVkIGJlY2F1c2UgaXQgY2F1c2Vz
IGFsbCB0aGUgZGF0YSBzZWdtZW50cyB0byBiZSBjb3BpZWQgaW50byBvbmUgc2VnbWVudCBpZiB0
aGV5IGFyZSBub3QgYWxyZWFkeS4KKyAgICAgICAgLy8gSXRlcmF0ZSB0aGUgc2VnbWVudHMgdXNp
bmcgYmVnaW4oKSBhbmQgZW5kKCkgaW5zdGVhZC4KKyAgICAgICAgbV9kYXRhLT5kYXRhKCk7Cisg
ICAgICAgIGNoYXIgcmVhZEJ1ZmZlclsxNl07CisgICAgICAgIFdlYkNvcmU6OkZhc3RTaGFyZWRC
dWZmZXJSZWFkZXIgcmVhZGVyKG1fZGF0YS5jb3B5UmVmKCkpOworICAgICAgICByZXR1cm4gcmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4ocmVhZGVyLmdldENvbnNlY3V0aXZl
RGF0YShkYXRhUG9zaXRpb24sIDEwLCByZWFkQnVmZmVyKSk7CiAgICAgfQogCiAgICAgdm9pZCBh
ZGRGcmFtZUlmTmVjZXNzYXJ5KCk7CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cgYi9Ub29s
cy9DaGFuZ2VMb2cKaW5kZXggYWViNGZlZTIyM2EuLmJkN2M3NmQ3ZTUxIDEwMDY0NAotLS0gYS9U
b29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAKKzIw
MTctMDktMjYgIENhcmxvcyBBbGJlcnRvIExvcGV6IFBlcmV6ICA8Y2xvcGV6QGlnYWxpYS5jb20+
CisKKyAgICAgICAgW0dUS11bV1BFXSBGaXggcGxheWJhY2sgb2YgR0lGcworICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MDg5CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBUZXN0V2ViS2l0QVBJL1BsYXRm
b3JtR1RLLmNtYWtlOgorICAgICAgICAqIFRlc3RXZWJLaXRBUEkvVGVzdHMvV2ViQ29yZS9GYXN0
U2hhcmVkQnVmZmVyUmVhZGVyVGVzdC5jcHA6IEFkZGVkLgorICAgICAgICAoVGVzdFdlYktpdEFQ
STo6VEVTVCk6CisKIDIwMTctMDktMjUgIENvbW1pdCBRdWV1ZSAgPGNvbW1pdC1xdWV1ZUB3ZWJr
aXQub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGxpbmcgb3V0IHIyMjI0NTUuCmRpZmYg
LS1naXQgYS9Ub29scy9UZXN0V2ViS2l0QVBJL1BsYXRmb3JtR1RLLmNtYWtlIGIvVG9vbHMvVGVz
dFdlYktpdEFQSS9QbGF0Zm9ybUdUSy5jbWFrZQppbmRleCA2MjMxZTE2MTk1Zi4uNGQzMDlkYTY2
YjIgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1Rlc3RXZWJLaXRBUEkvUGxhdGZvcm1HVEsuY21ha2UKKysr
IGIvVG9vbHMvVGVzdFdlYktpdEFQSS9QbGF0Zm9ybUdUSy5jbWFrZQpAQCAtMTM5LDYgKzEzOSw3
IEBAIGFkZF9leGVjdXRhYmxlKFRlc3RXZWJDb3JlCiAgICAgJHtURVNUV0VCS0lUQVBJX0RJUn0v
VGVzdHMvV2ViQ29yZS9NSU1FVHlwZVJlZ2lzdHJ5LmNwcAogICAgICR7VEVTVFdFQktJVEFQSV9E
SVJ9L1Rlc3RzL1dlYkNvcmUvUHVibGljU3VmZml4LmNwcAogICAgICR7VEVTVFdFQktJVEFQSV9E
SVJ9L1Rlc3RzL1dlYkNvcmUvU2VjdXJpdHlPcmlnaW4uY3BwCisgICAgJHtURVNUV0VCS0lUQVBJ
X0RJUn0vVGVzdHMvV2ViQ29yZS9GYXN0U2hhcmVkQnVmZmVyUmVhZGVyVGVzdC5jcHAKICAgICAk
e1RFU1RXRUJLSVRBUElfRElSfS9UZXN0cy9XZWJDb3JlL1NoYXJlZEJ1ZmZlci5jcHAKICAgICAk
e1RFU1RXRUJLSVRBUElfRElSfS9UZXN0cy9XZWJDb3JlL1NoYXJlZEJ1ZmZlclRlc3QuY3BwCiAg
ICAgJHtURVNUV0VCS0lUQVBJX0RJUn0vVGVzdHMvV2ViQ29yZS9VUkwuY3BwCmRpZmYgLS1naXQg
YS9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYkNvcmUvRmFzdFNoYXJlZEJ1ZmZlclJlYWRl
clRlc3QuY3BwIGIvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJDb3JlL0Zhc3RTaGFyZWRC
dWZmZXJSZWFkZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MC4uYWNjNThiMjA4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9UZXN0V2ViS2l0QVBJL1Rl
c3RzL1dlYkNvcmUvRmFzdFNoYXJlZEJ1ZmZlclJlYWRlclRlc3QuY3BwCkBAIC0wLDAgKzEsMTA0
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGlu
IHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xl
IEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0
byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisg
KiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlclRlc3QuaCIKKwor
I2luY2x1ZGUgIkZhc3RTaGFyZWRCdWZmZXJSZWFkZXIuaCIKKworLy8jaW5jbHVkZSA8Z3Rlc3Qv
Z3Rlc3QuaD4KKworbmFtZXNwYWNlIFRlc3RXZWJLaXRBUEkgeworCituYW1lc3BhY2UgeworCit2
b2lkIHByZXBhcmVSZWZlcmVuY2VEYXRhKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCit7Cisg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpCisgICAgICAgIGJ1ZmZlcltpXSA9
IGk7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKK1RFU1QoRmFzdFNoYXJlZEJ1ZmZlclJlYWRlclRl
c3QsIG5vblNlcXVlbnRpYWxSZWFkcykKK3sKKyAgICAvLyBUaGlzIGlzIDQgdGltZXMgU2hhcmVk
QnVmZmVyJ3Mgc2VnbWVudCBzaXplLgorICAgIGNoYXIgcmVmZXJlbmNlRGF0YVsxNjM4NF07Cisg
ICAgcHJlcGFyZVJlZmVyZW5jZURhdGEocmVmZXJlbmNlRGF0YSwgc2l6ZW9mKHJlZmVyZW5jZURh
dGEpKTsKKyAgICBSZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBkYXRhID0gV2ViQ29yZTo6
U2hhcmVkQnVmZmVyOjpjcmVhdGUoKTsKKyAgICBkYXRhLT5hcHBlbmQocmVmZXJlbmNlRGF0YSwg
c2l6ZW9mKHJlZmVyZW5jZURhdGEpKTsKKworICAgIFdlYkNvcmU6OkZhc3RTaGFyZWRCdWZmZXJS
ZWFkZXIgcmVhZGVyKGRhdGEuY29weVJlZigpKTsKKworICAgIC8vIFJlYWQgc2l6ZSBpcyBwcmlt
ZSBzdWNoIHRoZXJlIHdpbGwgYmUgYSBzZWdtZW50LXNwYW5uaW5nCisgICAgLy8gcmVhZCBldmVu
dHVhbGx5LgorICAgIGNoYXIgdGVtcEJ1ZmZlclsxN107CisgICAgZm9yIChzaXplX3QgZGF0YVBv
c2l0aW9uID0gMDsgZGF0YVBvc2l0aW9uICsgc2l6ZW9mKHRlbXBCdWZmZXIpIDwgc2l6ZW9mKHJl
ZmVyZW5jZURhdGEpOyBkYXRhUG9zaXRpb24gKz0gc2l6ZW9mKHRlbXBCdWZmZXIpKSB7CisgICAg
ICAgIGNvbnN0IGNoYXIqIGJsb2NrID0gcmVhZGVyLmdldENvbnNlY3V0aXZlRGF0YSgKKyAgICAg
ICAgICAgIGRhdGFQb3NpdGlvbiwgc2l6ZW9mKHRlbXBCdWZmZXIpLCB0ZW1wQnVmZmVyKTsKKyAg
ICAgICAgQVNTRVJUX0ZBTFNFKG1lbWNtcChibG9jaywgcmVmZXJlbmNlRGF0YSArIGRhdGFQb3Np
dGlvbiwgc2l6ZW9mKHRlbXBCdWZmZXIpKSk7CisgICAgfQorfQorCitURVNUKEZhc3RTaGFyZWRC
dWZmZXJSZWFkZXJUZXN0LCByZWFkQmFja3dhcmRzKQoreworICAgIC8vIFRoaXMgaXMgNCB0aW1l
cyBTaGFyZWRCdWZmZXIncyBzZWdtZW50IHNpemUuCisgICAgY2hhciByZWZlcmVuY2VEYXRhWzE2
Mzg0XTsKKyAgICBwcmVwYXJlUmVmZXJlbmNlRGF0YShyZWZlcmVuY2VEYXRhLCBzaXplb2YocmVm
ZXJlbmNlRGF0YSkpOworICAgIFJlZlB0cjxXZWJDb3JlOjpTaGFyZWRCdWZmZXI+IGRhdGEgPSBX
ZWJDb3JlOjpTaGFyZWRCdWZmZXI6OmNyZWF0ZSgpOworICAgIGRhdGEtPmFwcGVuZChyZWZlcmVu
Y2VEYXRhLCBzaXplb2YocmVmZXJlbmNlRGF0YSkpOworCisgICAgV2ViQ29yZTo6RmFzdFNoYXJl
ZEJ1ZmZlclJlYWRlciByZWFkZXIoZGF0YS5jb3B5UmVmKCkpOworCisgICAgLy8gUmVhZCBzaXpl
IGlzIHByaW1lIHN1Y2ggdGhlcmUgd2lsbCBiZSBhIHNlZ21lbnQtc3Bhbm5pbmcKKyAgICAvLyBy
ZWFkIGV2ZW50dWFsbHkuCisgICAgY2hhciB0ZW1wQnVmZmVyWzE3XTsKKyAgICBmb3IgKHNpemVf
dCBkYXRhT2Zmc2V0ID0gc2l6ZW9mKHRlbXBCdWZmZXIpOyBkYXRhT2Zmc2V0IDwgc2l6ZW9mKHJl
ZmVyZW5jZURhdGEpOyBkYXRhT2Zmc2V0ICs9IHNpemVvZih0ZW1wQnVmZmVyKSkgeworICAgICAg
ICBjb25zdCBjaGFyKiBibG9jayA9IHJlYWRlci5nZXRDb25zZWN1dGl2ZURhdGEoCisgICAgICAg
ICAgICBzaXplb2YocmVmZXJlbmNlRGF0YSkgLSBkYXRhT2Zmc2V0LCBzaXplb2YodGVtcEJ1ZmZl
ciksIHRlbXBCdWZmZXIpOworICAgICAgICBBU1NFUlRfRkFMU0UobWVtY21wKGJsb2NrLCByZWZl
cmVuY2VEYXRhICsgc2l6ZW9mKHJlZmVyZW5jZURhdGEpIC0gZGF0YU9mZnNldCwgc2l6ZW9mKHRl
bXBCdWZmZXIpKSk7CisgICAgfQorfQorCitURVNUKEZhc3RTaGFyZWRCdWZmZXJSZWFkZXJUZXN0
LCBieXRlQnlCeXRlKQoreworICAgIC8vIFRoaXMgaXMgNCB0aW1lcyBTaGFyZWRCdWZmZXIncyBz
ZWdtZW50IHNpemUuCisgICAgY2hhciByZWZlcmVuY2VEYXRhWzE2Mzg0XTsKKyAgICBwcmVwYXJl
UmVmZXJlbmNlRGF0YShyZWZlcmVuY2VEYXRhLCBzaXplb2YocmVmZXJlbmNlRGF0YSkpOworICAg
IFJlZlB0cjxXZWJDb3JlOjpTaGFyZWRCdWZmZXI+IGRhdGEgPSBXZWJDb3JlOjpTaGFyZWRCdWZm
ZXI6OmNyZWF0ZSgpOworICAgIGRhdGEtPmFwcGVuZChyZWZlcmVuY2VEYXRhLCBzaXplb2YocmVm
ZXJlbmNlRGF0YSkpOworCisgICAgV2ViQ29yZTo6RmFzdFNoYXJlZEJ1ZmZlclJlYWRlciByZWFk
ZXIoZGF0YS5jb3B5UmVmKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHJl
ZmVyZW5jZURhdGEpOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKHJlZmVyZW5jZURhdGFbaV0s
IHJlYWRlci5nZXRPbmVCeXRlKGkpKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIFRlc3RX
ZWJLaXRBUEkK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>322524</attachid>
            <date>2017-10-03 08:29:03 -0700</date>
            <delta_ts>2017-10-04 02:09:03 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-176089-20171003172901.patch</filename>
            <type>text/plain</type>
            <size>4884</size>
            <attacher name="Miguel Gomez">magomez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjIyNzcxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggN2NhOTU0ZDYwZjExYjhh
ODJjM2MxNTY5MDZlMTJiZTAxNjk0OWI0NS4uYjYxZjI2YjgwNTQ1YjkxOWFkYTcxMjVhNzE5MWFk
MGUwODIzYjMzMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIzIEBACisyMDE3LTEwLTAzICBNaWd1
ZWwgR29tZXogIDxtYWdvbWV6QGlnYWxpYS5jb20+CisKKyAgICAgICAgW0dUS11bV1BFXSBGaXgg
cGxheWJhY2sgb2YgR0lGcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MTc2MDg5CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgQWxsb3cgR0lGSW1hZ2VSZWFkZXIgdG8gZGVjb2RlIGFnYWluIGFscmVhZHkgZGVj
b2RlZCBmcmFtZXMuIFRoYW5rcyB0byB0aGlzLCB3ZSBkb24ndAorICAgICAgICBuZWVkIHRvIGRl
bGV0ZSB0aGUgR0lGSW1hZ2VSZWFkZXIgd2hlbiBHSUZJbWFnZURlY29kZXI6OmNsZWFyRnJhbWVC
dWZmZXJDYWNoZSgpIGlzCisgICAgICAgIGNhbGxlZCwgYW5kIHRoZSB3ZSBkb24ndCBuZWVkIHRo
ZSBsb2NrIHRvIGF2b2lkIGNyYXNoZXMgaW4gdGhhdCBzaXR1YXRpb24uCisKKyAgICAgICAgQ292
ZXJlZCBieSBleGlzdGVudCB0ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29k
ZXJzL2dpZi9HSUZJbWFnZURlY29kZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6R0lGSW1hZ2VE
ZWNvZGVyOjpjbGVhckZyYW1lQnVmZmVyQ2FjaGUpOgorICAgICAgICAoV2ViQ29yZTo6R0lGSW1h
Z2VEZWNvZGVyOjpkZWNvZGUpOgorICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dp
Zi9HSUZJbWFnZURlY29kZXIuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9n
aWYvR0lGSW1hZ2VSZWFkZXIuY3BwOgorICAgICAgICAoR0lGSW1hZ2VSZWFkZXI6OmRlY29kZSk6
CisKIDIwMTctMTAtMDIgIE15bGVzIEMuIE1heGZpZWxkICA8bW1heGZpZWxkQGFwcGxlLmNvbT4K
IAogICAgICAgICBNb3ZlIExpbmVFbmRpbmcue2gsY3BwfSBmcm9tIFdlYkNvcmUvcGxhdGZvcm0v
dGV4dCB0byB3dGYvdGV4dApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1h
Z2UtZGVjb2RlcnMvZ2lmL0dJRkltYWdlRGVjb2Rlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9pbWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VEZWNvZGVyLmNwcAppbmRleCBkZGQwZDBl
NGIyNjQyM2Y3ZGNjOGY3NjRmNzEzNGRmYjYxNGY4YzVlLi44MmU4NWRjMDM1ODhhMGJjY2ZkYzUz
OGIxOTM0ZmU4MjFmYWU1OWUxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9p
bWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VEZWNvZGVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VEZWNvZGVyLmNwcApAQCAtMTI1
LDEwICsxMjUsNiBAQCB2b2lkIEdJRkltYWdlRGVjb2Rlcjo6Y2xlYXJGcmFtZUJ1ZmZlckNhY2hl
KHNpemVfdCBjbGVhckJlZm9yZUZyYW1lKQogICAgIGlmIChtX2ZyYW1lQnVmZmVyQ2FjaGUuaXNF
bXB0eSgpKQogICAgICAgICByZXR1cm47IC8vIE5vdGhpbmcgdG8gZG8uCiAKLSAgICAvLyBMb2Nr
IHRoZSBkZWNvZGVsb2NrIGhlcmUsIGFzIHdlIGFyZSBnb2luZyB0byBkZXN0cm95IHRoZSBHSUZJ
bWFnZVJlYWRlciBhbmQgZG9pbmcgc28gd2hpbGUKLSAgICAvLyB0aGVyZSdzIGFuIG9uZ29pbmcg
ZGVjb2RlIHdpbGwgY2F1c2UgYSBjcmFzaC4KLSAgICBMb2NrSG9sZGVyIGxvY2tlcihtX2RlY29k
ZUxvY2spOwotCiAgICAgLy8gVGhlICItMSIgaGVyZSBpcyB0cmlja3kuICBJdCBkb2VzIG5vdCBt
ZWFuIHRoYXQgfGNsZWFyQmVmb3JlRnJhbWV8IGlzIHRoZQogICAgIC8vIGxhc3QgZnJhbWUgd2Ug
d2lzaCB0byBwcmVzZXJ2ZSwgYnV0IHJhdGhlciB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gY2xlYXIK
ICAgICAvLyB0aGUgdmVyeSBsYXN0IGZyYW1lIGluIHRoZSBjYWNoZTogaXQncyBlbXB0eSAoc28g
Y2xlYXJpbmcgaXQgaXMKQEAgLTE3MCwxMCArMTY2LDYgQEAgdm9pZCBHSUZJbWFnZURlY29kZXI6
OmNsZWFyRnJhbWVCdWZmZXJDYWNoZShzaXplX3QgY2xlYXJCZWZvcmVGcmFtZSkKICAgICAgICAg
aWYgKGotPmlzSW52YWxpZCgpKQogICAgICAgICAgICAgai0+Y2xlYXIoKTsKICAgICB9Ci0KLSAg
ICAvLyBXaGVuIHNvbWUgZnJhbWVzIGFyZSBjbGVhcmVkLCB0aGUgcmVhZGVyIGlzIG91dCBvZiBz
eW5jLCBzaW5jZSB0aGUgY2FsbGVyIG1pZ2h0IGFzayBmb3IgYW55IGZyYW1lIG5vdAotICAgIC8v
IG5lY2Vzc2FyaWx5IGluIHRoZSBvcmRlciBleHBlY3RlZCBieSB0aGUgcmVhZGVyLiBTZWUgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1OTA4OS4KLSAgICBtX3JlYWRl
ciA9IG51bGxwdHI7CiB9CiAKIGJvb2wgR0lGSW1hZ2VEZWNvZGVyOjpoYXZlRGVjb2RlZFJvdyh1
bnNpZ25lZCBmcmFtZUluZGV4LCBjb25zdCBWZWN0b3I8dW5zaWduZWQgY2hhcj4mIHJvd0J1ZmZl
ciwgc2l6ZV90IHdpZHRoLCBzaXplX3Qgcm93TnVtYmVyLCB1bnNpZ25lZCByZXBlYXRDb3VudCwg
Ym9vbCB3cml0ZVRyYW5zcGFyZW50UGl4ZWxzKQpAQCAtMzAyLDcgKzI5NCw2IEBAIHZvaWQgR0lG
SW1hZ2VEZWNvZGVyOjpkZWNvZGUodW5zaWduZWQgaGFsdEF0RnJhbWUsIEdJRlF1ZXJ5IHF1ZXJ5
LCBib29sIGFsbERhdGFSCiAgICAgaWYgKGZhaWxlZCgpKQogICAgICAgICByZXR1cm47CiAKLSAg
ICBMb2NrSG9sZGVyIGxvY2tlcihtX2RlY29kZUxvY2spOwogICAgIGlmICghbV9yZWFkZXIpIHsK
ICAgICAgICAgbV9yZWFkZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPEdJRkltYWdlUmVhZGVyPih0aGlz
KTsKICAgICAgICAgbV9yZWFkZXItPnNldERhdGEobV9kYXRhLmdldCgpKTsKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJbWFnZURlY29k
ZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJbWFn
ZURlY29kZXIuaAppbmRleCA3N2QwMWZmMGRjZmM0MzJjMmY3ZDE3OWExOWJmYzkyYzRmMjNmNTk4
Li5lMWViMDQ0ZjA5NjZhZGQ2NzU5OGRiYjRlYzBmOTkzMTllYTZhN2Q2IDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VEZWNvZGVy
LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvZ2lmL0dJRklt
YWdlRGVjb2Rlci5oCkBAIC04MCw3ICs4MCw2IEBAIHByaXZhdGU6CiAgICAgYm9vbCBtX2N1cnJl
bnRCdWZmZXJTYXdBbHBoYTsKICAgICBtdXRhYmxlIFJlcGV0aXRpb25Db3VudCBtX3JlcGV0aXRp
b25Db3VudCB7IFJlcGV0aXRpb25Db3VudE9uY2UgfTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8R0lG
SW1hZ2VSZWFkZXI+IG1fcmVhZGVyOwotICAgIExvY2sgbV9kZWNvZGVMb2NrOwogfTsKIAogfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
aW1hZ2UtZGVjb2RlcnMvZ2lmL0dJRkltYWdlUmVhZGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJbWFnZVJlYWRlci5jcHAKaW5kZXggMDk2NTg1
OWZlOWU5OWQ3OGYxMTI4N2ZlZjMzM2NjMzZkMzBlNGVmMC4uN2QwYjAxMDZjNDY5NWNlYjQ4OWI1
ZmQ5NWE1MGMzYTJhZjE5ODcwMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
aW1hZ2UtZGVjb2RlcnMvZ2lmL0dJRkltYWdlUmVhZGVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VSZWFkZXIuY3BwCkBAIC0zNjMs
NiArMzYzLDEyIEBAIGJvb2wgR0lGSW1hZ2VSZWFkZXI6OmRlY29kZShHSUZJbWFnZURlY29kZXI6
OkdJRlF1ZXJ5IHF1ZXJ5LCB1bnNpZ25lZCBoYWx0QXRGcmFtCiAgICAgaWYgKHF1ZXJ5ICE9IEdJ
RkltYWdlRGVjb2Rlcjo6R0lGRnVsbFF1ZXJ5KQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAorICAg
IC8vIEFscmVhZHkgZGVjb2RlZCBmcmFtZXMgY2FuIGJlIGRlbGV0ZWQgZnJvbSB0aGUgY2FjaGUg
YW5kIHRoZW4gdGhleSByZXF1aXJlIHRvIGJlIGRlY29kZWQgYWdhaW4sIHNvCisgICAgLy8gdGhl
IGhhbHRBdEZyYW1lIHZhbHVlIHdlIHJlY2VpdmUgaGVyZSBtYXkgYmUgbG93ZXIgdGhhbiBtX2N1
cnJlbnREZWNvZGluZ0ZyYW1lLiBJbiB0aGlzIGNhc2UKKyAgICAvLyB3ZSBwb3NpdGlvbiBtX2N1
cnJlbnREZWNvZGluZ0ZyYW1lIHRvIGhhbHRBdEZyYW1lIGFuZCBkZWNvZGUgZnJvbSB0aGVyZS4K
KyAgICAvLyBTZWUgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0x
NzYwODkuCisgICAgbV9jdXJyZW50RGVjb2RpbmdGcmFtZSA9IHN0ZDo6bWluKG1fY3VycmVudERl
Y29kaW5nRnJhbWUsIHN0YXRpY19jYXN0PHNpemVfdD4oaGFsdEF0RnJhbWUpKTsKKwogICAgIHdo
aWxlIChtX2N1cnJlbnREZWNvZGluZ0ZyYW1lIDwgc3RkOjptaW4obV9mcmFtZXMuc2l6ZSgpLCBz
dGF0aWNfY2FzdDxzaXplX3Q+KGhhbHRBdEZyYW1lKSkpIHsKICAgICAgICAgYm9vbCBmcmFtZURl
Y29kZWQgPSBmYWxzZTsKICAgICAgICAgR0lGRnJhbWVDb250ZXh0KiBjdXJyZW50RnJhbWUgPSBt
X2ZyYW1lc1ttX2N1cnJlbnREZWNvZGluZ0ZyYW1lXS5nZXQoKTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>