<?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>26460</bug_id>
          
          <creation_ts>2009-06-16 15:30:22 -0700</creation_ts>
          <short_desc>Cross-platform ICO decoder should return all icons in file as separate frames, sorted by decreasing quality</short_desc>
          <delta_ts>2009-08-05 12:37:35 -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>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>26467</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Peter Kasting">pkasting</reporter>
          <assigned_to name="Peter Kasting">pkasting</assigned_to>
          <cc>eric</cc>
    
    <cc>zecke</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>126327</commentid>
    <comment_count>0</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-06-16 15:30:22 -0700</bug_when>
    <thetext>In order to unfork ImageSourceSkia, ICOImageDecoder.* needs to return all icons from a file instead of just one, and get rid of the &quot;preferred size&quot; concept (i.e. push this decision to the caller).  I think this will also require minor changes to RGBA32Buffer since the subsequent frames will differ in size from the original.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126342</commentid>
    <comment_count>1</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-06-16 16:06:50 -0700</bug_when>
    <thetext>Doing this is going to include changing BMPImageReader to be included in *ImageDecoder via composition rather than inheritance, and fixing it to lazily decode instead of decoding at setData() (which was never the right behavior).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126770</commentid>
    <comment_count>2</comment_count>
      <attachid>31509</attachid>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-06-18 14:15:58 -0700</bug_when>
    <thetext>Created attachment 31509
part one (Landed r44825)

This is just some miscellaneous cleanup I did while writing the main behavioral changes here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126772</commentid>
    <comment_count>3</comment_count>
      <attachid>31509</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-18 14:21:55 -0700</bug_when>
    <thetext>Comment on attachment 31509
part one (Landed r44825)

Will your change to:
 116 bool GIFImageDecoder::isSizeAvailable()

ever cause it to return true when m_failed?

Otherwise LGTM.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126773</commentid>
    <comment_count>4</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-06-18 14:27:21 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 31509 [review])
&gt; Will your change to:
&gt;  116 bool GIFImageDecoder::isSizeAvailable()
&gt; 
&gt; ever cause it to return true when m_failed?

No, because ImageDecoder::isSizeAvailable() checks this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126821</commentid>
    <comment_count>5</comment_count>
      <attachid>31519</attachid>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-06-18 17:18:01 -0700</bug_when>
    <thetext>Created attachment 31519
part two

The next patch is going to change BMPImageReader to not inherit from ImageDecoder, and instead change *ImageDecoder to inherit directly, and include a BMPImageReader as a member.

Since that&apos;s a large, hard-to-review change, this patch attempts to make it more readable by first landing as much non-functional stuff as possible to minimize the diff.  Specific items are mentioned in the ChangeLog entry, but none should have any functional effect.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126828</commentid>
    <comment_count>6</comment_count>
      <attachid>31519</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-18 17:34:48 -0700</bug_when>
    <thetext>Comment on attachment 31519
part two

I don&apos;t think the line wraping is really worth it.  But OK.  

You were going to clean up the:
 299         m_infoHeader.biClrUsed = readUint32(data, m_decodedOffset + 32);

stuff, and I&apos;ll look in more detail in a second pass. This is a big big to page into my brain all at once. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126837</commentid>
    <comment_count>7</comment_count>
      <attachid>31523</attachid>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-06-18 17:47:15 -0700</bug_when>
    <thetext>Created attachment 31523
part two, v2 (Modified and landed r44833)

Updated as promised.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126839</commentid>
    <comment_count>8</comment_count>
      <attachid>31523</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-18 17:57:15 -0700</bug_when>
    <thetext>Comment on attachment 31523
part two, v2 (Modified and landed r44833)

Style:
         inline uint32_t readUint32(SharedBuffer* data, int offset) const {
 50             return readUint32Helper(data, m_decodedOffset + offset);
 51         }
Fight your google instincts!  fight, fight fight! ;)

Why this change?
 115     RGBA32Buffer* buffer = &amp;m_frameBufferCache.first();

I don&apos;t think the wrapping to 80c is really helpful in cases liek this:

8         if (((m_headerOffset + m_infoHeader.biSize + SIZEOF_BITMASKS) &lt;
 479                 (m_headerOffset + m_infoHeader.biSize))
 480             || (m_imgDataOffset &amp;&amp; (m_imgDataOffset &lt;
 481                 (m_headerOffset + m_infoHeader.biSize + SIZEOF_BITMASKS)))) {
 482             setFailed();

or this:
             m_bitMasks[i] &amp;=
 511                 ((static_cast&lt;uint32_t&gt;(1) &lt;&lt; m_infoHeader.biBitCount) - 1);

are we trying to merge these with something?  If not, then there is no need to try and keep 80c wrapping.

Style:
137         inline uint16_t readUint16(SharedBuffer* data, int offset) const {
 138             return readUint16Helper(data, m_decodedOffset + offset);
 139         }
 140 
 141         inline uint32_t readUint32(SharedBuffer* data, int offset) const {
 142             return readUint32Helper(data, m_decodedOffset + offset);
 143         }

In general this looks fine.  Please address the above issues when landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126844</commentid>
    <comment_count>9</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-06-18 18:07:12 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 31523 [review])
&gt; Style:
&gt;          inline uint32_t readUint32(SharedBuffer* data, int offset) const {
&gt;  50             return readUint32Helper(data, m_decodedOffset + offset);
&gt;  51         }
&gt; Fight your google instincts!  fight, fight fight! ;)

I always have to look at these for several minutes to realize what style rule I&apos;m breaking!  Fixed.

&gt; Why this change?
&gt;  115     RGBA32Buffer* buffer = &amp;m_frameBufferCache.first();

Because in the next patch |buffer| is going to become a pointer member that gets set by the owner classes.  This goes halfway by making it a pointer now (but not member).

&gt; I don&apos;t think the wrapping to 80c is really helpful in cases liek this:
&gt; 
&gt; 8         if (((m_headerOffset + m_infoHeader.biSize + SIZEOF_BITMASKS) &lt;
&gt;  479                 (m_headerOffset + m_infoHeader.biSize))
&gt;  480             || (m_imgDataOffset &amp;&amp; (m_imgDataOffset &lt;
&gt;  481                 (m_headerOffset + m_infoHeader.biSize +
&gt; SIZEOF_BITMASKS)))) {
&gt;  482             setFailed();
&gt; 
&gt; or this:
&gt;              m_bitMasks[i] &amp;=
&gt;  511                 ((static_cast&lt;uint32_t&gt;(1) &lt;&lt; m_infoHeader.biBitCount) -
&gt; 1);
&gt; 
&gt; are we trying to merge these with something?  If not, then there is no need to
&gt; try and keep 80c wrapping.

I know WK doesn&apos;t have an 80c rule, but it doesn&apos;t really have a prohibition against it.  I do think they&apos;re more readable when I don&apos;t have to scroll my screen around :).

&gt; Style:
&gt; 137         inline uint16_t readUint16(SharedBuffer* data, int offset) const {
&gt;  138             return readUint16Helper(data, m_decodedOffset + offset);
&gt;  139         }
&gt;  140 
&gt;  141         inline uint32_t readUint32(SharedBuffer* data, int offset) const {
&gt;  142             return readUint32Helper(data, m_decodedOffset + offset);
&gt;  143         }

Yep, fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126854</commentid>
    <comment_count>10</comment_count>
      <attachid>31526</attachid>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-06-18 18:37:39 -0700</bug_when>
    <thetext>Created attachment 31526
part three (Landed r44874)

This is the bulk of the work -- switch from inheritance to composition (so that in the future ICOImageDecoder can decode several different BMPs within one file) and move to lazy decoding like the decoders are supposed to do.

Even though the nitpicky details about how to decode (e.g. structs to look through, offsets within them, how to decode individual pixels, etc.) have not changed, this patch is still pretty hard to review.  Sorry, I don&apos;t know how to make it simpler easily :/.  It _might_ be possible to just do composition first and then lazy decoding as a second pass, but they&apos;re so intertwined that it&apos;d take a lot of work, I&apos;d immediately throw all that work away, and I&apos;m not sure the separated patches would be more comprehensible.

Note that a lot of the diff here is still &quot;mechanical&quot; despite the last patch, like switching to the new, simpler-to-use form of the readUintX() wrappers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126886</commentid>
    <comment_count>11</comment_count>
      <attachid>31526</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-18 22:20:22 -0700</bug_when>
    <thetext>Comment on attachment 31526
part three (Landed r44874)

I assume BMPs are always single-frame?  We should have a comment to that effect here:
 RGBA32Buffer* BMPImageDecoder::frameBufferAtIndex(size_t index)
 70 {
 71     if (index)
 72         return 0;
 73 

Why do we have to pre-allocate the space:
74     if (m_frameBufferCache.isEmpty())
 75         m_frameBufferCache.resize(1);

Oh, I guess because we&apos;re grabbing it on the next line:
RGBA32Buffer* buffer = &amp;m_frameBufferCache.first();

Still seems awkward somehow.

We generally try to think of more descriptive names than &quot;Helper&quot;.

It seems strange that we have to do all these manual calls to set up the BMPImageReader:
1     if (!m_reader) {
 102         m_reader.set(new BMPImageReader(this, m_decodedOffset, imgDataOffset,
 103                                         false));
 104         m_reader-&gt;setData(m_data.get());
 105     }
 106 
 107     if (!m_frameBufferCache.isEmpty())
 108         m_reader-&gt;setBuffer(&amp;m_frameBufferCache.first());
 109 
 110     return m_reader-&gt;decodeBMP(onlySize);

I would think we could implement a virtual interface and pass &quot;this&quot; to the BMPReader and it could grab all this appropriate data itself?

processFileHeader should take a reference instead of a pointer.  There seems to be little value in using a pointer, especially since at the callsite you do:
&amp;&amp; !processFileHeader(&amp;imgDataOffset))

The arg name &quot;data&quot; doesn&apos;t really add much here:
 46         virtual void setData(SharedBuffer* data, bool allDataReceived);

getInfoHeaderSize is poorly named.  It does not actually return the size.  It should be something like updateInfoHeaderSize or calculateInfoHeaderSize or cacheInfoHeaderSize (You don&apos;t have to change it here, but next time you&apos;re cleaning up this code...)

m_parent seems like kinda a funny name for the owning decoder.  I guess I would have called it m_imageDecoder or m_owningDecoder maybe?  m_parent is fine... just initially confusing.

When you ask m_parent-&gt;size() aren&apos;t you getting the size of the first frame?  I guess all frames are the same size?  Is this true of ICO files too?

I think it&apos;s neat that setFailed() returns false, but it is a litlte confusing that in other places of the code we don&apos;t use:
return setFailed();

Is it possible/expected that the malloc of any of these framebuffers would/should fail?  Are there really large BMPs out there we need to be aware of?  I believe fastMalloc will just abort() if it fails, which is fine.

confused why your&apos;e not setting m_headerOffset anymore?
      m_decodedOffset = m_headerOffset = m_dirEntry.dwImageOffset;
 214     m_decodedOffset = m_dirEntry.dwImageOffset;

It seems you should either remove or rename BMPImageReader::size() to avoid confusion with m_parent-&gt;size()?

The 80c thing still seems silly to me.  Since we don&apos;t wrap to 80c in other parts of WebCore.


This change looks great!  I think that the management of buffers between ICODecoder and BMPImageReader is a little too manual/error-prone.  And the &quot;Helper&quot; name is silly, but I can&apos;t seem to come up with a better one.  I like that you split out the &quot;Helper&quot; code into another function, although you might not have needed to if the buffer management was simpler.

I don&apos;t really need to see this another time.  Please read through and deal with the nits above, but you&apos;re good to go.

I look forward to seeing these classes use things like IntPoint and IntSize :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126896</commentid>
    <comment_count>12</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-06-18 23:49:08 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; (From update of attachment 31526 [review])
&gt; I assume BMPs are always single-frame?  We should have a comment to that effect
&gt; here:
&gt;  RGBA32Buffer* BMPImageDecoder::frameBufferAtIndex(size_t index)
&gt;  70 {
&gt;  71     if (index)
&gt;  72         return 0;

I think this is too obvious to comment.  The identical code appears in the JPEG, PNG, and XBM decoders (and currently in the ICO decoder but that will eventually change).

&gt; Why do we have to pre-allocate the space:
&gt; 74     if (m_frameBufferCache.isEmpty())
&gt;  75         m_frameBufferCache.resize(1);
&gt; 
&gt; Oh, I guess because we&apos;re grabbing it on the next line:
&gt; RGBA32Buffer* buffer = &amp;m_frameBufferCache.first();
&gt; 
&gt; Still seems awkward somehow.

I don&apos;t understand how this is awkward.  For one, it duplicates all the other decoders, but for another, you have to return a non-NULL frame pointer for a valid frame index request, and the actual decoding core has to have somewhere to write to.  These constraints make sense, too, since there&apos;s such a thing as a frame with status &quot;empty&quot; so this doesn&apos;t actually allocate a bunch of memory for pixel data but just says &quot;ok, here&apos;s the struct that says what our results are if any&quot;.

&gt; It seems strange that we have to do all these manual calls to set up the
&gt; BMPImageReader:
&gt; 1     if (!m_reader) {
&gt;  102         m_reader.set(new BMPImageReader(this, m_decodedOffset,
&gt; imgDataOffset,
&gt;  103                                         false));
&gt;  104         m_reader-&gt;setData(m_data.get());
&gt;  105     }
&gt;  106 
&gt;  107     if (!m_frameBufferCache.isEmpty())
&gt;  108         m_reader-&gt;setBuffer(&amp;m_frameBufferCache.first());
&gt;  109 
&gt;  110     return m_reader-&gt;decodeBMP(onlySize);
&gt; 
&gt; I would think we could implement a virtual interface and pass &quot;this&quot; to the
&gt; BMPReader and it could grab all this appropriate data itself?

I am unwilling to touch this until after I have implemented multi-image ICO decoding; at that point I&apos;ll know better what the true interface constraints are.

At that point something like what you suggest could certainly be possible, though I don&apos;t think a separate virtual interface to expose all this, plus all the manual calls (on the callee side) to get the data, is actually simpler; it&apos;s just as complex as the above plus an extra interface.  So I&apos;m kind of skeptical.

&gt; processFileHeader should take a reference instead of a pointer.  There seems to
&gt; be little value in using a pointer, especially since at the callsite you do:
&gt; &amp;&amp; !processFileHeader(&amp;imgDataOffset))

I don&apos;t understand.  processFileHeader() is _setting_ imgDataOffset, so it&apos;s a pure outparam.  Are you saying that non-const refs are _preferable_ to pointers for pure outparams?  This would certainly be illegal Google style and it raises my personal hackles too.

&gt; The arg name &quot;data&quot; doesn&apos;t really add much here:
&gt;  46         virtual void setData(SharedBuffer* data, bool allDataReceived);

Will remove.  (I hate this style rule but I don&apos;t make the rules.)

&gt; getInfoHeaderSize is poorly named.  It does not actually return the size.  It
&gt; should be something like updateInfoHeaderSize or calculateInfoHeaderSize or
&gt; cacheInfoHeaderSize (You don&apos;t have to change it here, but next time you&apos;re
&gt; cleaning up this code...)

Will change to readInfoHeaderSize().

&gt; m_parent seems like kinda a funny name for the owning decoder.  I guess I would
&gt; have called it m_imageDecoder or m_owningDecoder maybe?  m_parent is fine...
&gt; just initially confusing.

|m_owner| would be fine with me if you think that would be clearer.  (Putting &quot;decoder&quot; in the name seems redundant with the type.)

&gt; When you ask m_parent-&gt;size() aren&apos;t you getting the size of the first frame? 
&gt; I guess all frames are the same size?  Is this true of ICO files too?

There aren&apos;t multiple frames.  Just one.  (I will see whether once I start decoding ICOs as multi-frame images this needs to change but for now it is accurate.)

&gt; I think it&apos;s neat that setFailed() returns false, but it is a litlte confusing
&gt; that in other places of the code we don&apos;t use:
&gt; return setFailed();

I assume you refer to the subclasses of ImageDecoder.  I think it would make sense to change ImageDecoder::setFailed() from void to bool for this same purpose.  The change seemed extraneous to this one.  I&apos;ll do it as a followup that will also peer through other decoders&apos; uses of m_failed.

&gt; Is it possible/expected that the malloc of any of these framebuffers
&gt; would/should fail?  Are there really large BMPs out there we need to be aware
&gt; of?  I believe fastMalloc will just abort() if it fails, which is fine.

The code explicitly handles this.  RGBA32Buffer::setSize() is the call that allocates, and callers check its return code and fail the decode if the allocation didn&apos;t succeed.

&gt; confused why your&apos;e not setting m_headerOffset anymore?
&gt;       m_decodedOffset = m_headerOffset = m_dirEntry.dwImageOffset;
&gt;  214     m_decodedOffset = m_dirEntry.dwImageOffset;

Because it doesn&apos;t exist (in the class where this code is).  An artifact of constructing the BMPImageReader where I do is that m_headerOffset is guaranteed to equal m_decodedOffset at that moment (if we&apos;ve succeeded in decoding so far) and that is what the BMPImageReader constructor sets up.

&gt; It seems you should either remove or rename BMPImageReader::size() to avoid
&gt; confusion with m_parent-&gt;size()?

I don&apos;t understand.  There is no BMPImageReader::size().

&gt; This change looks great!  I think that the management of buffers between
&gt; ICODecoder and BMPImageReader is a little too manual/error-prone.

This was designed with an eye towards what I&apos;ll need when I do multi-frame decoding in ICOs.  It doesn&apos;t seem too bad right now, honestly; there&apos;s only the image data and the framebuffer, right?  One change I could do to make things easier would be to make BMPImageReader a friend and let it slurp its owner&apos;s data directly instead of doing an extra setData() call on the owner side, but I don&apos;t know how much benefit that really counts as...

&gt; And the
&gt; &quot;Helper&quot; name is silly, but I can&apos;t seem to come up with a better one.

I could use decodeWrapper() and decode(), or decodeWithCheckForDataEnded() and decode(), or something... I dunno

&gt; I like
&gt; that you split out the &quot;Helper&quot; code into another function, although you might
&gt; not have needed to if the buffer management was simpler.

I actually could do it all inline, but I&apos;d have to use about twice as many conditionals.  I don&apos;t think buffer management complexity has anything to do with this needing two pieces... I just needed a convenient place to &quot;catch&quot; all the decode failures a la an exception handler.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127022</commentid>
    <comment_count>13</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-19 13:41:18 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; (In reply to comment #11)
&gt; &gt; processFileHeader should take a reference instead of a pointer.  There seems to
&gt; &gt; be little value in using a pointer, especially since at the callsite you do:
&gt; &gt; &amp;&amp; !processFileHeader(&amp;imgDataOffset))
&gt; 
&gt; I don&apos;t understand.  processFileHeader() is _setting_ imgDataOffset, so it&apos;s a
&gt; pure outparam.  Are you saying that non-const refs are _preferable_ to pointers
&gt; for pure outparams?  This would certainly be illegal Google style and it raises
&gt; my personal hackles too.

I use non-const references... but I&apos;ve never seen them as dangerous or confusing. :)

The WebKit Style guide seems mute on the issue.

&gt; &gt; m_parent seems like kinda a funny name for the owning decoder.  I guess I would
&gt; &gt; have called it m_imageDecoder or m_owningDecoder maybe?  m_parent is fine...
&gt; &gt; just initially confusing.
&gt; 
&gt; |m_owner| would be fine with me if you think that would be clearer.  (Putting
&gt; &quot;decoder&quot; in the name seems redundant with the type.)

Interesting.  I intentionally name my variables to make their type clear at all callsites.  I don&apos;t see it as redundant at all. :)

m_parent is also fine.

&gt; &gt; I think it&apos;s neat that setFailed() returns false, but it is a litlte confusing
&gt; &gt; that in other places of the code we don&apos;t use:
&gt; &gt; return setFailed();
&gt; 
&gt; I assume you refer to the subclasses of ImageDecoder.  I think it would make
&gt; sense to change ImageDecoder::setFailed() from void to bool for this same
&gt; purpose.  The change seemed extraneous to this one.  I&apos;ll do it as a followup
&gt; that will also peer through other decoders&apos; uses of m_failed.

Sounds fine.

&gt; &gt; It seems you should either remove or rename BMPImageReader::size() to avoid
&gt; &gt; confusion with m_parent-&gt;size()?
&gt; 
&gt; I don&apos;t understand.  There is no BMPImageReader::size().

You were changing callsites from &quot;size()&quot; to &quot;m_parent-&gt;size()&quot; I wanted to make sure that size() was gone.

&gt; &gt; This change looks great!  I think that the management of buffers between
&gt; &gt; ICODecoder and BMPImageReader is a little too manual/error-prone.
&gt; 
&gt; This was designed with an eye towards what I&apos;ll need when I do multi-frame
&gt; decoding in ICOs.  It doesn&apos;t seem too bad right now, honestly; there&apos;s only
&gt; the image data and the framebuffer, right?  One change I could do to make
&gt; things easier would be to make BMPImageReader a friend and let it slurp its
&gt; owner&apos;s data directly instead of doing an extra setData() call on the owner
&gt; side, but I don&apos;t know how much benefit that really counts as...
&gt; 
&gt; &gt; And the
&gt; &gt; &quot;Helper&quot; name is silly, but I can&apos;t seem to come up with a better one.
&gt; 
&gt; I could use decodeWrapper() and decode(), or decodeWithCheckForDataEnded() and
&gt; decode(), or something... I dunno

decodeWithCheckForDataEnded() sounds more desciptive than &quot;helper&quot; :)  But I haven&apos;t looked at the source to verify if it&apos;s an accurate name. :)

&gt; &gt; I like
&gt; &gt; that you split out the &quot;Helper&quot; code into another function, although you might
&gt; &gt; not have needed to if the buffer management was simpler.
&gt; 
&gt; I actually could do it all inline, but I&apos;d have to use about twice as many
&gt; conditionals.  I don&apos;t think buffer management complexity has anything to do
&gt; with this needing two pieces... I just needed a convenient place to &quot;catch&quot; all
&gt; the decode failures a la an exception handler.

OK.

Thanks for the replies.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127041</commentid>
    <comment_count>14</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-06-19 14:21:05 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; &gt; &gt; It seems you should either remove or rename BMPImageReader::size() to avoid
&gt; &gt; &gt; confusion with m_parent-&gt;size()?
&gt; &gt; 
&gt; &gt; I don&apos;t understand.  There is no BMPImageReader::size().
&gt; 
&gt; You were changing callsites from &quot;size()&quot; to &quot;m_parent-&gt;size()&quot; I wanted to
&gt; make sure that size() was gone.

Yes, size() was ImageDecoder::size() since BMPImageReader used to inherit from it.  Now it doesn&apos;t, so there is no size().

&gt; decodeWithCheckForDataEnded() sounds more desciptive than &quot;helper&quot; :)  But I
&gt; haven&apos;t looked at the source to verify if it&apos;s an accurate name. :)

Will change, and add comment to decode() saying not to call it directly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134646</commentid>
    <comment_count>15</comment_count>
      <attachid>33468</attachid>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-07-24 13:40:22 -0700</bug_when>
    <thetext>Created attachment 33468
part four

Some cleanup and plumbing I split out of the next patch (which, finally, implements the desired behavior), in order to make it more readable.

Mainly, this adds a new function ImageDecoder::frameSizeAtIndex(), and hooks the ImageSource::frameSizeAtIndex() implementations to it; no decoder actually implements it yet (the ICO decoder will after the next patch).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134655</commentid>
    <comment_count>16</comment_count>
      <attachid>33468</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-24 14:07:58 -0700</bug_when>
    <thetext>Comment on attachment 33468
part four

Can we test this using pixel tests?
Can we share:
+IntSize ImageSource::frameSizeAtIndex(size_t index) const
via some baseclass?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134660</commentid>
    <comment_count>17</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-07-24 14:14:10 -0700</bug_when>
    <thetext>(In reply to comment #16)
&gt; (From update of attachment 33468 [details])
&gt; Can we test this using pixel tests?

I know Chromium has some BMP and ICO unittests (although they do a lot more than just load the images and display them, they hook directly to the decoders so they can test things like breaking the input data into random chunks), it would probably be possible to create a few tests that are just &quot;load this BMP/ICO and ensure it displays&quot;.

One difficulty is that these open-source BMP and ICO decoders support more variants of the formats than the CG decoders do.  I&apos;d probably need to make some tests only run for non-CG ports...

The main difficulty here is that I haven&apos;t written a pixel test.  It&apos;s probably time to rectify that failure :)

&gt; Can we share:
&gt; +IntSize ImageSource::frameSizeAtIndex(size_t index) const
&gt; via some baseclass?

Yes, the whole point of this bug is to enable me to remove some hacks from the Skia ImageSource so we can then collapse most of the ImageSource implementations together.  So, I wouldn&apos;t worry about this right this second; it is planned :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134966</commentid>
    <comment_count>18</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-07-27 11:32:52 -0700</bug_when>
    <thetext>Fixed in r46423.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134989</commentid>
    <comment_count>19</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-07-27 13:21:00 -0700</bug_when>
    <thetext>Oops, I commented on the wrong bug.  Ignore that...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136350</commentid>
    <comment_count>20</comment_count>
      <attachid>33468</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-31 19:37:15 -0700</bug_when>
    <thetext>Comment on attachment 33468
part four

Sorry, forgot about this one.  Looks good!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136391</commentid>
    <comment_count>21</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-07-31 21:44:12 -0700</bug_when>
    <thetext>(In reply to comment #20)
&gt; (From update of attachment 33468 [details])
&gt; Sorry, forgot about this one.  Looks good!

I&apos;ve created an ICO decoder pixel test, but unfortunately the run-webkit-tests script doesn&apos;t seem to like my non-Cygwin-SVN setup, and I&apos;m not sure how to fix :(

Maybe I&apos;ll work with you to get it landed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136842</commentid>
    <comment_count>22</comment_count>
      <attachid>33468</attachid>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-03 16:49:09 -0700</bug_when>
    <thetext>Comment on attachment 33468
part four

Landed in r46738, clearing flags.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136870</commentid>
    <comment_count>23</comment_count>
      <attachid>34031</attachid>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-03 17:43:23 -0700</bug_when>
    <thetext>Created attachment 34031
Return multiple frames from ICO decoder

This is the heart of the change -- return multiple frames from the ICO decoder and eliminate the ImageSourceSkia hack.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137252</commentid>
    <comment_count>24</comment_count>
      <attachid>34031</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-04 22:11:56 -0700</bug_when>
    <thetext>Comment on attachment 34031
Return multiple frames from ICO decoder

When is &quot;*i&quot; going to be NULL?
     for (BMPReaders::iterator i(m_BMPReaders.begin());
 69          i != m_BMPReaders.end(); ++i) {
 70         if (*i)
 71             (*i)-&gt;setData(data);
7172     }

Seems rather strange to have readers in your list which will be null.

I believe the style is m_bmpReaders instead of m_BMPReaders.  and m_pngDecoders instead of m_PNGDecoders.

Seems this shoudl use early-return to avoid the long indented block:
 132     if (m_PNGDecoders[index]) {

 133         // The size calculated inside the PNGImageDecoder had better match the
 134         // one in the icon directory.

probably should be:
// Fail if the size the PNGImageDecoder calculated does not match the size in the directory

It seems IconDirectoryEntry should have a size() accessor which returns a IntSize() given that you have to convert it to an IntSize more than once.  Or at least that:
138             if ((pngSize.width() != dirEntry.bWidth)
 139                 || (pngSize.height() != dirEntry.bHeight)) {
would be simpler if it had such a function.

Seems another early return is in order:
 169     if (m_PNGDecoders[index]) {
 170         // Copy out PNG data to a separate vector and send to the PNG decoder.

We don&apos;t have any column wrapping rule:
199     return (m_decodedOffset &gt;=
 200             (sizeOfDirectory + (m_dirEntries.size() * sizeOfDirEntry)))
 201         || processDirectoryEntries();

Seems this block could instead be a helper function &quot;determineImageType&quot;:
208     if (!m_BMPReaders[index] &amp;&amp; !m_PNGDecoders[index]) {
 209         // Image type unknown.
maybe a separate function is not clearer, not sure.

Doesn&apos;t Vector have a VectorTraits or some such to specify a default value?  Or isnt&apos; there a .fill()?   I&apos;m surprised you have to use this VectorInitializer stuff, but maybe that&apos;s the right way...

No wrapping needed:
3     for (IconDirectoryEntries::iterator i(m_dirEntries.begin());
 284          i != m_dirEntries.end(); ++i)


It looks like the PNGDecoders type is never used.

Seems odd to use an iterator for one here and not the other:
68     for (BMPReaders::iterator i(m_BMPReaders.begin());
 69          i != m_BMPReaders.end(); ++i) {
 70         if (*i)
 71             (*i)-&gt;setData(data);
7172     }
 73     for (size_t i = 0; i &lt; m_PNGDecoders.size(); ++i)
 74         setDataForPNGDecoderAtIndex(i);

if the iterator is not used, then the BMPReaders typedef is never needed.

r- for the nits above.

Also, I look at the review queue every day, but I only click on bugs which Safari thinks are un-visited.  Occasionally I look through the whole queue (like I am doing tonight).  So I won&apos;t notice your patches if you keep attaching them to old bugs. :)  WebKit seems to be of many minds about whether to re-use bugs or not. :)  (I go either way depending on the patch.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137256</commentid>
    <comment_count>25</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-04 23:00:47 -0700</bug_when>
    <thetext>Some comments before I update the patch tomorrow.

(In reply to comment #24)
&gt; (From update of attachment 34031 [details])
&gt; When is &quot;*i&quot; going to be NULL?
&gt;      for (BMPReaders::iterator i(m_BMPReaders.begin());
&gt;  69          i != m_BMPReaders.end(); ++i) {
&gt;  70         if (*i)
&gt;  71             (*i)-&gt;setData(data);
&gt; 7172     }
&gt; 
&gt; Seems rather strange to have readers in your list which will be null.

*i will almost always be NULL.  There is potentially one BMP reader or PNG decoder per directory entry, but they are only instantiated when a caller actually requests the frame data for a particular entry.

You cannot do this nicely by having just one BMP reader and one PNG decoder as the old code did, because if you get asked for a different frame you have to discard all the probably-still-valuable decoding you did already and reset everything, redecoding the new frame from scratch.

If you try having arrays of objects, or guaranteed-not-null pointers, instead of this method, then you burn a lot of memory, especially on setData() calls (which create new data blobs for each PNG decoder), for pretty much no benefit.

I suppose rather than an array of mostly-NULL pointers, I could have used a linked list and kept a frame number alongside each decoder in the list.  But since BMPImageReader and PNGImageDecoder do not share a base class, I&apos;d need two lists; and since icons generally have very few entries (typically one, sometimes up to five or so), the code would be a bit more complex for no real gain.

&gt; I believe the style is m_bmpReaders instead of m_BMPReaders.  and m_pngDecoders
&gt; instead of m_PNGDecoders.

OK, will change.

&gt; Seems this shoudl use early-return to avoid the long indented block:
&gt;  132     if (m_PNGDecoders[index]) {

It&apos;s actually not &quot;early return&quot; either way, since you either do BMP as the indented block or PNG (there&apos;s no chance for &quot;if !PNG return;&quot; here).  BMP is the shorter code block, so I can swap them.  In my head it made a little more sense to me to have the BMP path be the &quot;main path&quot; through the function since that&apos;s the common case, but that&apos;s a pretty weak argument.

&gt;  133         // The size calculated inside the PNGImageDecoder had better match
&gt; the
&gt;  134         // one in the icon directory.
&gt; 
&gt; probably should be:
&gt; // Fail if the size the PNGImageDecoder calculated does not match the size in
&gt; the directory

Sure, OK

&gt; It seems IconDirectoryEntry should have a size() accessor which returns a
&gt; IntSize() given that you have to convert it to an IntSize more than once.  Or
&gt; at least that:
&gt; 138             if ((pngSize.width() != dirEntry.bWidth)
&gt;  139                 || (pngSize.height() != dirEntry.bHeight)) {
&gt; would be simpler if it had such a function.

Good idea.  I was trying to just write a simple dumb container of a struct that matched the Windows ICONDIRENTRY, but adding a simple accessor (one line of code) won&apos;t hurt it, and will indeed make a few spots less verbose.

&gt; Seems another early return is in order:
&gt;  169     if (m_PNGDecoders[index]) {
&gt;  170         // Copy out PNG data to a separate vector and send to the PNG
&gt; decoder.

Yes, this one is a legitimate early return candidate.

&gt; We don&apos;t have any column wrapping rule:
&gt; 199     return (m_decodedOffset &gt;=
&gt;  200             (sizeOfDirectory + (m_dirEntries.size() * sizeOfDirEntry)))
&gt;  201         || processDirectoryEntries();

That&apos;s right, and I&apos;m claiming that lack of rule as a justification for wrapping at 80 like the rest of this file (and most of the rest of the image decoder code), because code that goes for 200 characters is completely unreadable to me.

&gt; Seems this block could instead be a helper function &quot;determineImageType&quot;:
&gt; 208     if (!m_BMPReaders[index] &amp;&amp; !m_PNGDecoders[index]) {
&gt;  209         // Image type unknown.
&gt; maybe a separate function is not clearer, not sure.

I do not think a function here buys you anything.

&gt; Doesn&apos;t Vector have a VectorTraits or some such to specify a default value?  Or
&gt; isnt&apos; there a .fill()?   I&apos;m surprised you have to use this VectorInitializer
&gt; stuff, but maybe that&apos;s the right way...

I don&apos;t know if there is a better way of doing this.  I am open to such, as the current code is ugly.

&gt; No wrapping needed:
&gt; 3     for (IconDirectoryEntries::iterator i(m_dirEntries.begin());
&gt;  284          i != m_dirEntries.end(); ++i)

I&apos;m not changing this either :)

&gt; It looks like the PNGDecoders type is never used.

It&apos;s only used at the declaration of the object, but I&apos;m OK with that; any future additions of modifications that declare an iterator or a temp will have a handy type to use.  Using a typedef for things like this feels like a good habit to me.

&gt; Seems odd to use an iterator for one here and not the other:
&gt; 68     for (BMPReaders::iterator i(m_BMPReaders.begin());
&gt;  69          i != m_BMPReaders.end(); ++i) {
&gt;  70         if (*i)
&gt;  71             (*i)-&gt;setData(data);
&gt; 7172     }
&gt;  73     for (size_t i = 0; i &lt; m_PNGDecoders.size(); ++i)
&gt;  74         setDataForPNGDecoderAtIndex(i);

I&apos;d like to use an iterator for both, but sadly in the case of setting data for the PNG decoder I also need the index to look up the right directory entry.

Otherwise, I normally consider iterators preferable to operator[]().

&gt; I won&apos;t notice your patches if you keep
&gt; attaching them to old bugs. :)  WebKit seems to be of many minds about whether
&gt; to re-use bugs or not.

All the patches on here hang together as a logical unit and aren&apos;t really compelling in isolation.  It seems better to use one bug for them.  This is the last patch on this bug anyway.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137330</commentid>
    <comment_count>26</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-05 10:21:10 -0700</bug_when>
    <thetext>(In reply to comment #25)
&gt; &gt; Seems this shoudl use early-return to avoid the long indented block:
&gt; &gt;  132     if (m_PNGDecoders[index]) {
&gt; 
&gt; It&apos;s actually not &quot;early return&quot; either way,

Oops, I misread my own diff.  Yes it can be early return.  Sorry :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137355</commentid>
    <comment_count>27</comment_count>
      <attachid>34155</attachid>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-05 11:34:43 -0700</bug_when>
    <thetext>Created attachment 34155
Return multiple frames from ICO decoder, v2

Updated patch.  I changed IconDirectoryEntry to WebKit style and replaced the width and height members with an IntSize, which simplified a few things.  Also replaced my cumbersome VectorInitializer calls with calls to fill().  Other fixes as noted in my previous comments.  If you demand I modify my line wrapping I will :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137369</commentid>
    <comment_count>28</comment_count>
      <attachid>34155</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-05 12:14:20 -0700</bug_when>
    <thetext>Comment on attachment 34155
Return multiple frames from ICO decoder, v2

Wrong patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137372</commentid>
    <comment_count>29</comment_count>
      <attachid>34158</attachid>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-05 12:17:59 -0700</bug_when>
    <thetext>Created attachment 34158
Return multiple frames from ICO decoder, v2 (for real)

Oops</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137374</commentid>
    <comment_count>30</comment_count>
      <attachid>34158</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-05 12:24:56 -0700</bug_when>
    <thetext>Comment on attachment 34158
Return multiple frames from ICO decoder, v2 (for real)

I doubt the explicit namespace is needed here:
     WTF::deleteAllValues(m_bmpReaders);
 57     WTF::deleteAllValues(m_pngDecoders);

0 in C++
2     m_bmpReaders.fill(NULL, idCount);
 263     m_pngDecoders.fill(NULL, idCount);

Seems odd the sides of the cast are different:
 302     int width = static_cast&lt;uint8_t&gt;(m_data-&gt;data()[m_decodedOffset]);

virtual, no?
 44         ~ICOImageDecoder();

Looks sane enough.  Please note the comments above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137378</commentid>
    <comment_count>31</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-05 12:37:35 -0700</bug_when>
    <thetext>Fixed in r46807.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31509</attachid>
            <date>2009-06-18 14:15:58 -0700</date>
            <delta_ts>2009-06-18 14:29:33 -0700</delta_ts>
            <desc>part one (Landed r44825)</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>16459</size>
            <attacher name="Peter Kasting">pkasting</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDgyMSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzkgQEAKKzIwMDktMDYtMTggIFBldGVyIEthc3RpbmcgIDxwa2FzdGluZ0Bnb29n
bGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjQ2MCBwYXJ0IG9uZQor
ICAgICAgICBNYWtlIGlzU2l6ZUF2YWlsYWJsZSBub24tY29uc3QsIHNpbmNlIGl0J3Mgbm90IGxv
Z2ljYWxseSBjb25zdCAoaXQKKyAgICAgICAgdHJpZ2dlcnMgbGF6eSBkZWNvZGluZyksIGFuZCBz
aW1wbGlmeSBhbGwgdGhlIGltcGxlbWVudGF0aW9ucyAod2l0aG91dAorICAgICAgICBjaGFuZ2lu
ZyBiZWhhdmlvcjsganVzdCBtYWtlIGxlc3MgdmVyYm9zZSkuICBSZW1vdmUgc29tZSBvdGhlcgor
ICAgICAgICBpbmFwcHJvcHJpYXRlIGNvbnN0cywgd2hpY2ggZW5hYmxlcyB0aGUgcmVtb3ZhbCBv
ZiBhbGwgdGhlIG11dGFibGUKKyAgICAgICAgZGVjbGFyYXRpb25zIGluIHRoZSBkZWNvZGVycy4K
KworICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL0ltYWdlRGVjb2Rlci5oOgorICAg
ICAgICAoV2ViQ29yZTo6SW1hZ2VEZWNvZGVyOjppc1NpemVBdmFpbGFibGUpOgorICAgICAgICAo
V2ViQ29yZTo6SW1hZ2VEZWNvZGVyOjpzZXRTaXplKTogTWFrZSBwdWJsaWMgdG8gYXZvaWQgbmVl
ZGluZyBhIGZyaWVuZCBkZWNsYXJhdGlvbiBpbiB0aGUgSlBFRyBkZWNvZGVyLCBhbmQgYmVjYXVz
ZSB0aGUgSUNPL0JNUCBkZWNvZGVycyB3aWxsIHNvb24gbmVlZCB0aGlzLgorICAgICAgICAqIHBs
YXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJbWFnZURlY29kZXIuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6R0lGSW1hZ2VEZWNvZGVyOjppc1NpemVBdmFpbGFibGUpOgorICAgICAgICAoV2Vi
Q29yZTo6R0lGSW1hZ2VEZWNvZGVyOjpyZXBldGl0aW9uQ291bnQpOgorICAgICAgICAoV2ViQ29y
ZTo6R0lGSW1hZ2VEZWNvZGVyOjpkZWNvZGUpOgorICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRl
Y29kZXJzL2dpZi9HSUZJbWFnZURlY29kZXIuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1k
ZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklDT0lt
YWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1k
ZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVyLmg6CisgICAgICAgICogcGxhdGZvcm0vaW1hZ2Ut
ZGVjb2RlcnMvanBlZy9KUEVHSW1hZ2VEZWNvZGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkpQ
RUdJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpKUEVH
SW1hZ2VEZWNvZGVyOjpkZWNvZGUpOgorICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJz
L2pwZWcvSlBFR0ltYWdlRGVjb2Rlci5oOgorICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29k
ZXJzL3BuZy9QTkdJbWFnZURlY29kZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UE5HSW1hZ2VE
ZWNvZGVyOjppc1NpemVBdmFpbGFibGUpOgorICAgICAgICAoV2ViQ29yZTo6UE5HSW1hZ2VEZWNv
ZGVyOjpkZWNvZGUpOgorICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3BuZy9QTkdJ
bWFnZURlY29kZXIuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy94Ym0vWEJN
SW1hZ2VEZWNvZGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlhCTUltYWdlRGVjb2Rlcjo6aXNT
aXplQXZhaWxhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OlhCTUltYWdlRGVjb2Rlcjo6ZnJhbWVC
dWZmZXJBdEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlhCTUltYWdlRGVjb2Rlcjo6ZGVjb2Rl
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy94Ym0vWEJNSW1hZ2VEZWNvZGVy
Lmg6IFJlbmFtZSBkZWNvZGVYQk0oKSB0byBkZWNvZGUoKSBmb3IgY29uc2lzdGVuY3kgd2l0aCB0
aGUgSlBFRy9QTkcgZGVjb2RlcnMsIGFuZCBpbiB0aGUgZnV0dXJlIHRoZSBJQ08vQk1QIGRlY29k
ZXJzLgorCiAyMDA5LTA2LTE3ICBCcmVudCBGdWxnaGFtICA8YmZ1bGdoYW1Ad2Via2l0Lm9yZz4K
IAogICAgICAgICBSZXZpZXdlZCBieSBFcmljIFNlaWRlbC4KSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vaW1hZ2UtZGVjb2RlcnMvSW1hZ2VEZWNvZGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9JbWFnZURlY29kZXIuaAkocmV2aXNpb24gNDQ4MTkpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL0ltYWdlRGVjb2Rlci5oCSh3b3JraW5n
IGNvcHkpCkBAIC0yMDAsNyArMjAwLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICAv
LyBpbXBsZW1lbnRhdGlvbiBqdXN0IHJldHVybnMgdHJ1ZSBpZiB0aGUgc2l6ZSBoYXMgYmVlbiBz
ZXQgYW5kIHdlIGhhdmUgbm90CiAgICAgICAgIC8vIHNlZW4gYSBmYWlsdXJlLiBEZWNvZGVycyBt
YXkgd2FudCB0byBvdmVycmlkZSB0aGlzIHRvIGxhemlseSBkZWNvZGUKICAgICAgICAgLy8gZW5v
dWdoIG9mIHRoZSBpbWFnZSB0byBnZXQgdGhlIHNpemUuCi0gICAgICAgIHZpcnR1YWwgYm9vbCBp
c1NpemVBdmFpbGFibGUoKSBjb25zdAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTaXplQXZhaWxh
YmxlKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuICFtX2ZhaWxlZCAmJiBtX3NpemVB
dmFpbGFibGU7IAogICAgICAgICB9CkBAIC0yMTMsNiArMjEzLDIxIEBAIG5hbWVzcGFjZSBXZWJD
b3JlIHsKICAgICAgICAgICAgIHJldHVybiBtX3NpemU7CiAgICAgICAgIH0KIAorICAgICAgICAv
LyBDYWxsZWQgYnkgdGhlIGltYWdlIGRlY29kZXJzIHRvIHNldCB0aGVpciBkZWNvZGVkIHNpemUs
IHRoaXMgYWxzbyBjaGVjaworICAgICAgICAvLyB0aGUgc2l6ZSBmb3IgdmFsaWRpdHkuIEl0IHdp
bGwgcmV0dXJuIHRydWUgaWYgdGhlIHNpemUgd2FzIHNldCwgb3IgZmFsc2UKKyAgICAgICAgLy8g
aWYgdGhlcmUgaXMgYW4gZXJyb3IuIE9uIGVycm9yLCB0aGUgbV9mYWlsZWQgZmxhZyB3aWxsIGJl
IHNldCBhbmQgdGhlCisgICAgICAgIC8vIGNhbGxlciBzaG91bGQgaW1tZWRpYXRlbHkgc3RvcCBk
ZWNvZGluZy4KKyAgICAgICAgdmlydHVhbCBib29sIHNldFNpemUodW5zaWduZWQgd2lkdGgsIHVu
c2lnbmVkIGhlaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlzT3ZlclNpemUod2lk
dGgsIGhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBtX2ZhaWxlZCA9IHRydWU7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9zaXpl
ID0gSW50U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIG1fc2l6ZUF2YWlsYWJsZSA9
IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCiAgICAgICAgIC8v
IFRoZSB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIGZvciB0aGUgaW1hZ2UuICBDbGFzc2VzIHRoYXQg
c3VwcG9ydCBtdWx0aXBsZSBmcmFtZXMKICAgICAgICAgLy8gd2lsbCBzY2FuIHRoZSBpbWFnZSBk
YXRhIGZvciB0aGUgYW5zd2VyIGlmIHRoZXkgbmVlZCB0byAod2l0aG91dCBuZWNlc3NhcmlseQog
ICAgICAgICAvLyBkZWNvZGluZyBhbGwgb2YgdGhlIGluZGl2aWR1YWwgZnJhbWVzKS4KQEAgLTI0
MSwyNCArMjU2LDkgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB2aXJ0dWFsIHZvaWQg
Y2xlYXJGcmFtZUJ1ZmZlckNhY2hlKHNpemVfdCBjbGVhckJlZm9yZUZyYW1lKSB7IH0KIAogICAg
IHByb3RlY3RlZDoKLSAgICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSBpbWFnZSBkZWNvZGVycyB0byBz
ZXQgdGhlaXIgZGVjb2RlZCBzaXplLCB0aGlzIGFsc28gY2hlY2sKLSAgICAgICAgLy8gdGhlIHNp
emUgZm9yIHZhbGlkaXR5LiBJdCB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSBzaXplIHdhcyBzZXQs
IG9yIGZhbHNlCi0gICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLiBPbiBlcnJvciwgdGhl
IG1fZmFpbGVkIGZsYWcgd2lsbCBiZSBzZXQgYW5kIHRoZQotICAgICAgICAvLyBjYWxsZXIgc2hv
dWxkIGltbWVkaWF0ZWx5IHN0b3AgZGVjb2RpbmcuCi0gICAgICAgIGJvb2wgc2V0U2l6ZSh1bnNp
Z25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAo
aXNPdmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KSkgewotICAgICAgICAgICAgICAgIG1fZmFpbGVkID0g
dHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICBtX3NpemUgPSBJbnRTaXplKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgbV9z
aXplQXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9
Ci0KICAgICAgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gbV9kYXRhOyAvLyBUaGUgZW5jb2RlZCBk
YXRhLgogICAgICAgICBWZWN0b3I8UkdCQTMyQnVmZmVyPiBtX2ZyYW1lQnVmZmVyQ2FjaGU7Ci0g
ICAgICAgIG11dGFibGUgYm9vbCBtX2ZhaWxlZDsKKyAgICAgICAgYm9vbCBtX2ZhaWxlZDsKIAog
ICAgIHByaXZhdGU6CiAgICAgICAgIC8vIFNvbWUgY29kZSBwYXRocyBjb21wdXRlIHRoZSBzaXpl
IG9mIHRoZSBpbWFnZSBhcyAid2lkdGggKiBoZWlnaHQgKiA0IgpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9pbWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VEZWNvZGVyLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJbWFnZURlY29kZXIuY3Bw
CShyZXZpc2lvbiA0NDgxOSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvZ2lm
L0dJRkltYWdlRGVjb2Rlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTExMywxNyArMTEzLDEwIEBA
IHZvaWQgR0lGSW1hZ2VEZWNvZGVyOjpzZXREYXRhKFNoYXJlZEJ1ZmYKIH0KIAogLy8gV2hldGhl
ciBvciBub3QgdGhlIHNpemUgaW5mb3JtYXRpb24gaGFzIGJlZW4gZGVjb2RlZCB5ZXQuCi1ib29s
IEdJRkltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCkgY29uc3QKK2Jvb2wgR0lGSW1hZ2VE
ZWNvZGVyOjppc1NpemVBdmFpbGFibGUoKQogewotICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyBk
YXRhIHRvIGRlY29kZSwgc2VuZCBpdCB0byB0aGUgR0lGIHJlYWRlciBub3cuCi0gICAgaWYgKCFJ
bWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpICYmIG1fcmVhZGVyKSB7Ci0gICAgICAgIGlm
IChtX2ZhaWxlZCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAvLyBUaGUg
ZGVjb2RlciB3aWxsIGdvIGFoZWFkIGFuZCBhZ2dyZXNzaXZlbHkgY29uc3VtZSBldmVyeXRoaW5n
IHVwIHVudGlsIHRoZSBmaXJzdAotICAgICAgICAvLyBzaXplIGlzIGVuY291bnRlcmVkLgotICAg
ICAgICBkZWNvZGUoR0lGU2l6ZVF1ZXJ5LCAwKTsKLSAgICB9CisgICAgaWYgKCFJbWFnZURlY29k
ZXI6OmlzU2l6ZUF2YWlsYWJsZSgpICYmICFmYWlsZWQoKSAmJiBtX3JlYWRlcikKKyAgICAgICAg
IGRlY29kZShHSUZTaXplUXVlcnksIDApOwogCiAgICAgcmV0dXJuIEltYWdlRGVjb2Rlcjo6aXNT
aXplQXZhaWxhYmxlKCk7CiB9CkBAIC0xNTIsNyArMTQ1LDcgQEAgaW50IEdJRkltYWdlRGVjb2Rl
cjo6ZnJhbWVDb3VudCgpCiB9CiAKIC8vIFRoZSBudW1iZXIgb2YgcmVwZXRpdGlvbnMgdG8gcGVy
Zm9ybSBmb3IgYW4gYW5pbWF0aW9uIGxvb3AuCi1pbnQgR0lGSW1hZ2VEZWNvZGVyOjpyZXBldGl0
aW9uQ291bnQoKSBjb25zdAoraW50IEdJRkltYWdlRGVjb2Rlcjo6cmVwZXRpdGlvbkNvdW50KCkK
IHsKICAgICAvLyBUaGlzIHZhbHVlIGNhbiBhcnJpdmUgYXQgYW55IHBvaW50IGluIHRoZSBpbWFn
ZSBkYXRhIHN0cmVhbS4gIE1vc3QgR0lGcwogICAgIC8vIGluIHRoZSB3aWxkIGRlY2xhcmUgaXQg
bmVhciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLCBzbyBpdCB1c3VhbGx5IGlzCkBAIC0yMzcs
NyArMjMwLDcgQEAgdm9pZCBHSUZJbWFnZURlY29kZXI6OmNsZWFyRnJhbWVCdWZmZXJDYQogfQog
CiAvLyBGZWVkIGRhdGEgdG8gdGhlIEdJRiByZWFkZXIuCi12b2lkIEdJRkltYWdlRGVjb2Rlcjo6
ZGVjb2RlKEdJRlF1ZXJ5IHF1ZXJ5LCB1bnNpZ25lZCBoYWx0QXRGcmFtZSkgY29uc3QKK3ZvaWQg
R0lGSW1hZ2VEZWNvZGVyOjpkZWNvZGUoR0lGUXVlcnkgcXVlcnksIHVuc2lnbmVkIGhhbHRBdEZy
YW1lKQogewogICAgIGlmIChtX2ZhaWxlZCkKICAgICAgICAgcmV0dXJuOwpJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VEZWNvZGVyLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VEZWNvZGVy
LmgJKHJldmlzaW9uIDQ0ODE5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9n
aWYvR0lGSW1hZ2VEZWNvZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDE0ICs0NCwxNCBAQCBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXREYXRhKFNoYXJlZEJ1
ZmZlciogZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpOwogCiAgICAgICAgIC8vIFdoZXRoZXIg
b3Igbm90IHRoZSBzaXplIGluZm9ybWF0aW9uIGhhcyBiZWVuIGRlY29kZWQgeWV0LgotICAgICAg
ICB2aXJ0dWFsIGJvb2wgaXNTaXplQXZhaWxhYmxlKCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwg
Ym9vbCBpc1NpemVBdmFpbGFibGUoKTsKIAogICAgICAgICAvLyBUaGUgdG90YWwgbnVtYmVyIG9m
IGZyYW1lcyBmb3IgdGhlIGltYWdlLiAgV2lsbCBzY2FuIHRoZSBpbWFnZSBkYXRhIGZvciB0aGUg
YW5zd2VyCiAgICAgICAgIC8vICh3aXRob3V0IG5lY2Vzc2FyaWx5IGRlY29kaW5nIGFsbCBvZiB0
aGUgaW5kaXZpZHVhbCBmcmFtZXMpLgogICAgICAgICB2aXJ0dWFsIGludCBmcmFtZUNvdW50KCk7
CiAKICAgICAgICAgLy8gVGhlIG51bWJlciBvZiByZXBldGl0aW9ucyB0byBwZXJmb3JtIGZvciBh
biBhbmltYXRpb24gbG9vcC4KLSAgICAgICAgdmlydHVhbCBpbnQgcmVwZXRpdGlvbkNvdW50KCkg
Y29uc3Q7CisgICAgICAgIHZpcnR1YWwgaW50IHJlcGV0aXRpb25Db3VudCgpOwogCiAgICAgICAg
IHZpcnR1YWwgUkdCQTMyQnVmZmVyKiBmcmFtZUJ1ZmZlckF0SW5kZXgoc2l6ZV90IGluZGV4KTsK
IApAQCAtNzksOCArNzksOCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKICAgICAgICAgYm9vbCBt
X2ZyYW1lQ291bnRWYWxpZDsKICAgICAgICAgYm9vbCBtX2N1cnJlbnRCdWZmZXJTYXdBbHBoYTsK
LSAgICAgICAgbXV0YWJsZSBpbnQgbV9yZXBldGl0aW9uQ291bnQ7Ci0gICAgICAgIG11dGFibGUg
R0lGSW1hZ2VEZWNvZGVyUHJpdmF0ZSogbV9yZWFkZXI7CisgICAgICAgIGludCBtX3JlcGV0aXRp
b25Db3VudDsKKyAgICAgICAgR0lGSW1hZ2VEZWNvZGVyUHJpdmF0ZSogbV9yZWFkZXI7CiAgICAg
fTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9pbWFn
ZS1kZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2ljby9JQ09JbWFnZURlY29kZXIuY3BwCShyZXZpc2lv
biA0NDgxOSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvaWNvL0lDT0ltYWdl
RGVjb2Rlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgwLDcgKzgwLDcgQEAgUkdCQTMyQnVmZmVy
KiBJQ09JbWFnZURlY29kZXI6OmZyYW1lQnVmZgogICAgICAgICBCTVBJbWFnZVJlYWRlcjo6ZnJh
bWVCdWZmZXJBdEluZGV4KDApOwogfQogCi1ib29sIElDT0ltYWdlRGVjb2Rlcjo6aXNTaXplQXZh
aWxhYmxlKCkgY29uc3QKK2Jvb2wgSUNPSW1hZ2VEZWNvZGVyOjppc1NpemVBdmFpbGFibGUoKQog
ewogICAgIHJldHVybiAobV9pbWFnZVR5cGUgPT0gUE5HKSA/IG1fcG5nRGVjb2Rlci5pc1NpemVB
dmFpbGFibGUoKSA6CiAgICAgICAgIEJNUEltYWdlUmVhZGVyOjppc1NpemVBdmFpbGFibGUoKTsK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvaWNvL0lDT0ltYWdlRGVjb2Rl
ci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvaWNvL0lD
T0ltYWdlRGVjb2Rlci5oCShyZXZpc2lvbiA0NDgxOSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vaW1h
Z2UtZGVjb2RlcnMvaWNvL0lDT0ltYWdlRGVjb2Rlci5oCSh3b3JraW5nIGNvcHkpCkBAIC01NCw3
ICs1NCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdmlydHVhbCBSR0JBMzJCdWZm
ZXIqIGZyYW1lQnVmZmVyQXRJbmRleChzaXplX3QgaW5kZXgpOwogCiAgICAgICAgIC8vIEltYWdl
RGVjb2RlcgotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTaXplQXZhaWxhYmxlKCkgY29uc3Q7Cisg
ICAgICAgIHZpcnR1YWwgYm9vbCBpc1NpemVBdmFpbGFibGUoKTsKICAgICAgICAgdmlydHVhbCBJ
bnRTaXplIHNpemUoKSBjb25zdDsKIAogICAgIHByaXZhdGU6CkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2ltYWdlLWRlY29kZXJzL2pwZWcvSlBFR0ltYWdlRGVjb2Rlci5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9qcGVnL0pQRUdJbWFnZURlY29kZXIu
Y3BwCShyZXZpc2lvbiA0NDgxOSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMv
anBlZy9KUEVHSW1hZ2VEZWNvZGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDA5LDE3ICs0MDks
MTAgQEAgdm9pZCBKUEVHSW1hZ2VEZWNvZGVyOjpzZXREYXRhKFNoYXJlZEJ1ZgogfQogCiAvLyBX
aGV0aGVyIG9yIG5vdCB0aGUgc2l6ZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiBkZWNvZGVkIHlldC4K
LWJvb2wgSlBFR0ltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCkgY29uc3QKK2Jvb2wgSlBF
R0ltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCkKIHsKLSAgICAvLyBJZiB3ZSBoYXZlIHBl
bmRpbmcgZGF0YSB0byBkZWNvZGUsIHNlbmQgaXQgdG8gdGhlIEpQRUcgcmVhZGVyIG5vdy4KLSAg
ICBpZiAoIUltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCkgJiYgbV9yZWFkZXIpIHsKLSAg
ICAgICAgaWYgKG1fZmFpbGVkKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAg
IC8vIFRoZSBkZWNvZGVyIHdpbGwgZ28gYWhlYWQgYW5kIGFnZ3Jlc3NpdmVseSBjb25zdW1lIGV2
ZXJ5dGhpbmcgdXAgdW50aWwgdGhlCi0gICAgICAgIC8vIHNpemUgaXMgZW5jb3VudGVyZWQuCi0g
ICAgICAgIGRlY29kZSh0cnVlKTsKLSAgICB9CisgICAgaWYgKCFJbWFnZURlY29kZXI6OmlzU2l6
ZUF2YWlsYWJsZSgpICYmICFmYWlsZWQoKSAmJiBtX3JlYWRlcikKKyAgICAgICAgIGRlY29kZSh0
cnVlKTsKIAogICAgIHJldHVybiBJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpOwogfQpA
QCAtNDQwLDcgKzQzMyw3IEBAIFJHQkEzMkJ1ZmZlciogSlBFR0ltYWdlRGVjb2Rlcjo6ZnJhbWVC
dWYKIH0KIAogLy8gRmVlZCBkYXRhIHRvIHRoZSBKUEVHIHJlYWRlci4KLXZvaWQgSlBFR0ltYWdl
RGVjb2Rlcjo6ZGVjb2RlKGJvb2wgc2l6ZU9ubHkpIGNvbnN0Cit2b2lkIEpQRUdJbWFnZURlY29k
ZXI6OmRlY29kZShib29sIHNpemVPbmx5KQogewogICAgIGlmIChtX2ZhaWxlZCkKICAgICAgICAg
cmV0dXJuOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9qcGVnL0pQRUdJ
bWFnZURlY29kZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29k
ZXJzL2pwZWcvSlBFR0ltYWdlRGVjb2Rlci5oCShyZXZpc2lvbiA0NDgxOSkKKysrIFdlYkNvcmUv
cGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvanBlZy9KUEVHSW1hZ2VEZWNvZGVyLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTQ0LDEzICs0NCwxMyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIHZp
cnR1YWwgdm9pZCBzZXREYXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2
ZWQpOwogCiAgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHRoZSBzaXplIGluZm9ybWF0aW9uIGhh
cyBiZWVuIGRlY29kZWQgeWV0LgotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTaXplQXZhaWxhYmxl
KCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NpemVBdmFpbGFibGUoKTsKIAogICAg
ICAgICB2aXJ0dWFsIFJHQkEzMkJ1ZmZlciogZnJhbWVCdWZmZXJBdEluZGV4KHNpemVfdCBpbmRl
eCk7CiAgICAgICAgIAogICAgICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNBbHBoYSgpIGNvbnN0
IHsgcmV0dXJuIGZhbHNlOyB9CiAKLSAgICAgICAgdm9pZCBkZWNvZGUoYm9vbCBzaXplT25seSA9
IGZhbHNlKSBjb25zdDsKKyAgICAgICAgdm9pZCBkZWNvZGUoYm9vbCBzaXplT25seSA9IGZhbHNl
KTsKIAogICAgICAgICBKUEVHSW1hZ2VSZWFkZXIqIHJlYWRlcigpIHsgcmV0dXJuIG1fcmVhZGVy
OyB9CiAKQEAgLTU4LDggKzU4LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB2b2lk
IGpwZWdDb21wbGV0ZSgpOwogCiAgICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIGNsYXNzIEpQ
RUdJbWFnZVJlYWRlcjsKLSAgICAgICAgbXV0YWJsZSBKUEVHSW1hZ2VSZWFkZXIqIG1fcmVhZGVy
OworICAgICAgICBKUEVHSW1hZ2VSZWFkZXIqIG1fcmVhZGVyOwogICAgIH07CiAKIH0gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvcG5n
L1BOR0ltYWdlRGVjb2Rlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9pbWFn
ZS1kZWNvZGVycy9wbmcvUE5HSW1hZ2VEZWNvZGVyLmNwcAkocmV2aXNpb24gNDQ4MTkpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3BuZy9QTkdJbWFnZURlY29kZXIuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xNjAsMTcgKzE2MCwxMCBAQCB2b2lkIFBOR0ltYWdlRGVjb2Rlcjo6
c2V0RGF0YShTaGFyZWRCdWZmCiB9CiAKIC8vIFdoZXRoZXIgb3Igbm90IHRoZSBzaXplIGluZm9y
bWF0aW9uIGhhcyBiZWVuIGRlY29kZWQgeWV0LgotYm9vbCBQTkdJbWFnZURlY29kZXI6OmlzU2l6
ZUF2YWlsYWJsZSgpIGNvbnN0Citib29sIFBOR0ltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxl
KCkKIHsKLSAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgZGF0YSB0byBkZWNvZGUsIHNlbmQgaXQg
dG8gdGhlIFBORyByZWFkZXIgbm93LgotICAgIGlmICghSW1hZ2VEZWNvZGVyOjppc1NpemVBdmFp
bGFibGUoKSAmJiBtX3JlYWRlcikgewotICAgICAgICBpZiAobV9mYWlsZWQpCi0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8gVGhlIGRlY29kZXIgd2lsbCBnbyBhaGVhZCBh
bmQgYWdncmVzc2l2ZWx5IGNvbnN1bWUgZXZlcnl0aGluZyB1cCB1bnRpbCB0aGUKLSAgICAgICAg
Ly8gc2l6ZSBpcyBlbmNvdW50ZXJlZC4KLSAgICAgICAgZGVjb2RlKHRydWUpOwotICAgIH0KKyAg
ICBpZiAoIUltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCkgJiYgIWZhaWxlZCgpICYmIG1f
cmVhZGVyKQorICAgICAgICAgZGVjb2RlKHRydWUpOwogCiAgICAgcmV0dXJuIEltYWdlRGVjb2Rl
cjo6aXNTaXplQXZhaWxhYmxlKCk7CiB9CkBAIC0xOTEsNyArMTg0LDcgQEAgUkdCQTMyQnVmZmVy
KiBQTkdJbWFnZURlY29kZXI6OmZyYW1lQnVmZgogfQogCiAvLyBGZWVkIGRhdGEgdG8gdGhlIFBO
RyByZWFkZXIuCi12b2lkIFBOR0ltYWdlRGVjb2Rlcjo6ZGVjb2RlKGJvb2wgc2l6ZU9ubHkpIGNv
bnN0Cit2b2lkIFBOR0ltYWdlRGVjb2Rlcjo6ZGVjb2RlKGJvb2wgc2l6ZU9ubHkpCiB7CiAgICAg
aWYgKG1fZmFpbGVkKQogICAgICAgICByZXR1cm47CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2lt
YWdlLWRlY29kZXJzL3BuZy9QTkdJbWFnZURlY29kZXIuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3BuZy9QTkdJbWFnZURlY29kZXIuaAkocmV2aXNpb24g
NDQ4MTkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3BuZy9QTkdJbWFnZURl
Y29kZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNDQsMTEgKzQ0LDExIEBAIG5hbWVzcGFjZSBXZWJD
b3JlIHsKICAgICAgICAgdmlydHVhbCB2b2lkIHNldERhdGEoU2hhcmVkQnVmZmVyKiBkYXRhLCBi
b29sIGFsbERhdGFSZWNlaXZlZCk7CiAKICAgICAgICAgLy8gV2hldGhlciBvciBub3QgdGhlIHNp
emUgaW5mb3JtYXRpb24gaGFzIGJlZW4gZGVjb2RlZCB5ZXQuCi0gICAgICAgIHZpcnR1YWwgYm9v
bCBpc1NpemVBdmFpbGFibGUoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBib29sIGlzU2l6ZUF2
YWlsYWJsZSgpOwogCiAgICAgICAgIHZpcnR1YWwgUkdCQTMyQnVmZmVyKiBmcmFtZUJ1ZmZlckF0
SW5kZXgoc2l6ZV90IGluZGV4KTsKIAotICAgICAgICB2b2lkIGRlY29kZShib29sIHNpemVPbmx5
ID0gZmFsc2UpIGNvbnN0OworICAgICAgICB2b2lkIGRlY29kZShib29sIHNpemVPbmx5ID0gZmFs
c2UpOwogCiAgICAgICAgIFBOR0ltYWdlUmVhZGVyKiByZWFkZXIoKSB7IHJldHVybiBtX3JlYWRl
cjsgfQogCkBAIC01OSw3ICs1OSw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdm9p
ZCBwbmdDb21wbGV0ZSgpOwogCiAgICAgcHJpdmF0ZToKLSAgICAgICAgbXV0YWJsZSBQTkdJbWFn
ZVJlYWRlciogbV9yZWFkZXI7CisgICAgICAgIFBOR0ltYWdlUmVhZGVyKiBtX3JlYWRlcjsKICAg
ICB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2lt
YWdlLWRlY29kZXJzL3hibS9YQk1JbWFnZURlY29kZXIuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMveGJtL1hCTUltYWdlRGVjb2Rlci5jcHAJKHJldmlz
aW9uIDQ0ODE5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy94Ym0vWEJNSW1h
Z2VEZWNvZGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTYsMTcgKzU2LDEyIEBAIHZvaWQgWEJN
SW1hZ2VEZWNvZGVyOjpzZXREYXRhKFNoYXJlZEJ1ZmYKICAgICBtX2FsbERhdGFSZWNlaXZlZCA9
IGFsbERhdGFSZWNlaXZlZDsKIH0KIAotYm9vbCBYQk1JbWFnZURlY29kZXI6OmlzU2l6ZUF2YWls
YWJsZSgpIGNvbnN0Citib29sIFhCTUltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCkKIHsK
LSAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgZWl0aGVyIChhKSBub3QgYmUgY29uc3QsIG9yIChi
KSBub3QgYmUgZXhwZWN0ZWQgdG8KLSAgICAvLyBkbyBhbnl0aGluZyB0aGF0IGNoYW5nZXMgbV9z
aXplQXZhaWxhYmxlLiBUaGUgcG5nIGFuZCBqcGVnIGRlY29kZXJzCi0gICAgLy8gZ2V0IGFyb3Vu
ZCB0aGlzIHdpdGggY2FsbGJhY2tzIGZyb20gZXh0ZXJuYWwgbGlicmFyaWVzLgotICAgIC8vCi0g
ICAgLy8gRklYTUU6IEZpbmQgb3V0IGlmIHdlIGNhbiBwYXRjaCB3ZWJraXQgdG8gdGFrZSBjYXJl
IG9mIHRoaXMuCiAgICAgaWYgKCFJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpICYmICFt
X2ZhaWxlZCkKLSAgICAgICAgY29uc3RfY2FzdDxYQk1JbWFnZURlY29kZXIqPih0aGlzKS0+ZGVj
b2RlWEJNKHRydWUpOworICAgICAgICBkZWNvZGUodHJ1ZSk7CiAKLSAgICByZXR1cm4gIW1fZmFp
bGVkICYmIEltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCk7CisgICAgcmV0dXJuIEltYWdl
RGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCk7CiB9CiAKIFJHQkEzMkJ1ZmZlciogWEJNSW1hZ2VE
ZWNvZGVyOjpmcmFtZUJ1ZmZlckF0SW5kZXgoc2l6ZV90IGluZGV4KQpAQCAtNzksNyArNzQsNyBA
QCBSR0JBMzJCdWZmZXIqIFhCTUltYWdlRGVjb2Rlcjo6ZnJhbWVCdWZmCiAKICAgICAvLyBBdHRl
bXB0IHRvIGdldCB0aGUgc2l6ZSBpZiB3ZSBkb24ndCBoYXZlIGl0IHlldC4KICAgICBpZiAoIUlt
YWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCkpCi0gICAgICAgIGRlY29kZVhCTSh0cnVlKTsK
KyAgICAgICAgZGVjb2RlKHRydWUpOwogICAgIAogICAgIC8vIEluaXRpYWxpemUgdGhlIGZyYW1l
YnVmZmVyIGlmIG5lZWRlZC4KICAgICBSR0JBMzJCdWZmZXImIGJ1ZmZlciA9IG1fZnJhbWVCdWZm
ZXJDYWNoZVswXTsKQEAgLTk3LDcgKzkyLDcgQEAgUkdCQTMyQnVmZmVyKiBYQk1JbWFnZURlY29k
ZXI6OmZyYW1lQnVmZgogICAgICAgICAKICAgICAvLyBLZWVwIHRyeWluZyB0byBkZWNvZGUgdW50
aWwgd2UndmUgZ290IHRoZSBlbnRpcmUgaW1hZ2UuCiAgICAgaWYgKGJ1ZmZlci5zdGF0dXMoKSA9
PSBSR0JBMzJCdWZmZXI6OkZyYW1lUGFydGlhbCkKLSAgICAgICAgZGVjb2RlWEJNKGZhbHNlKTsK
KyAgICAgICAgZGVjb2RlKGZhbHNlKTsKIAogICAgIHJldHVybiAmYnVmZmVyOwogfQpAQCAtMjYx
LDcgKzI1Niw3IEBAIGJvb2wgWEJNSW1hZ2VEZWNvZGVyOjpkZWNvZGVEYXRhKCkKIH0KIAogLy8g
RGVjb2RlIGFzIG11Y2ggYXMgd2UgY2FuIG9mIHRoZSBYQk0gZmlsZS4KLXZvaWQgWEJNSW1hZ2VE
ZWNvZGVyOjpkZWNvZGVYQk0oYm9vbCBzaXplT25seSkKK3ZvaWQgWEJNSW1hZ2VEZWNvZGVyOjpk
ZWNvZGUoYm9vbCBzaXplT25seSkKIHsKICAgICBpZiAoZmFpbGVkKCkpCiAgICAgICAgIHJldHVy
bjsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMveGJtL1hCTUltYWdlRGVj
b2Rlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMveGJt
L1hCTUltYWdlRGVjb2Rlci5oCShyZXZpc2lvbiA0NDgxOSkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
aW1hZ2UtZGVjb2RlcnMveGJtL1hCTUltYWdlRGVjb2Rlci5oCSh3b3JraW5nIGNvcHkpCkBAIC00
NSw3ICs0NSw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogICAgICAgICB2aXJ0dWFsIHZvaWQg
c2V0RGF0YShTaGFyZWRCdWZmZXIqIGRhdGEsIGJvb2wgYWxsRGF0YVJlY2VpdmVkKTsKICAgICAg
ICAgLy8gV2hldGhlciBvciBub3QgdGhlIHNpemUgaW5mb3JtYXRpb24gaGFzIGJlZW4gZGVjb2Rl
ZCB5ZXQuCi0gICAgICAgIHZpcnR1YWwgYm9vbCBpc1NpemVBdmFpbGFibGUoKSBjb25zdDsKKyAg
ICAgICAgdmlydHVhbCBib29sIGlzU2l6ZUF2YWlsYWJsZSgpOwogICAgICAgICB2aXJ0dWFsIFJH
QkEzMkJ1ZmZlciogZnJhbWVCdWZmZXJBdEluZGV4KHNpemVfdCBpbmRleCk7CiAKICAgICBwcml2
YXRlOgpAQCAtNjUsNyArNjUsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIGJvb2wg
ZGVjb2RlSGVhZGVyKCk7CiAgICAgICAgIGJvb2wgZGVjb2RlRGF0dW0odWludDE2X3QqIHJlc3Vs
dCk7CiAgICAgICAgIGJvb2wgZGVjb2RlRGF0YSgpOwotICAgICAgICB2b2lkIGRlY29kZVhCTShi
b29sIHNpemVPbmx5KTsKKyAgICAgICAgdm9pZCBkZWNvZGUoYm9vbCBzaXplT25seSk7CiAKICAg
ICAgICAgLy8gRklYTUU6IENvcHlpbmcgYWxsIHRoZSBYQk0gZGF0YSBqdXN0IHNvIHdlIGNhbiBO
VUxMLXRlcm1pbmF0ZSwganVzdAogICAgICAgICAvLyBzbyB3ZSBjYW4gdXNlIHNzY2FuZigpIGFu
ZCBmcmllbmRzLCBpcyBsYW1lLiAgVGhlIGRlY29kZXIgc2hvdWxkIGJlCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31519</attachid>
            <date>2009-06-18 17:18:01 -0700</date>
            <delta_ts>2009-06-18 17:47:15 -0700</delta_ts>
            <desc>part two</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>45686</size>
            <attacher name="Peter Kasting">pkasting</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDgzMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTcgQEAKKzIwMDktMDYtMTggIFBldGVyIEthc3RpbmcgIDxwa2FzdGluZ0Bnb29n
bGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjQ2MCBwYXJ0IHR3bwor
ICAgICAgICBBdHRlbXB0IHRvIG1pbmltaXplIGRpZmYgb2YgZm9sbG93aW5nIGZ1bmN0aW9uYWwg
Y2hhbmdlIGJ5IGZpcnN0IGxhbmRpbmcKKyAgICAgICAgbm9uLWZ1bmN0aW9uYWwgY2hhbmdlIHRv
OgorICAgICAgICAqIE1ha2UgcmVhZFVpbnRYKCkgcHVibGljIGFuZCBzdGF0aWMgKHNpbmNlIHRo
ZXkgd2lsbCBuZWVkIHRvIGJlIG9uY2UKKyAgICAgICAgICBCTVBJbWFnZVJlYWRlciBpcyBpbmNs
dWRlZCBpbiAqSW1hZ2VEZWNvZGVyIHZpYSBjb21wb3NpdGlvbiByYXRoZXIKKyAgICAgICAgICB0
aGFuIGluaGVyaXRhbmNlKQorICAgICAgICAqIENoYW5nZSBkaXJlY3Qgc2V0dGluZyBvZiBtX2Zh
aWxlZCB0byB1c2Ugc2V0RmFpbGVkKCksIHNpbmNlIGluIHRoZQorICAgICAgICAgIG5leHQgcGF0
Y2ggbXVjaCBvZiB0aGlzIGNvZGUgd29uJ3QgZXZlbiBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gbV9m
YWlsZWQKKyAgICAgICAgKiBBZGQgYSBoZWxwZXIgZnVuY3Rpb24gaW4gSUNPSW1hZ2VEZWNvZGVy
IHRvIGRldGVybWluZSB0aGUgaW1hZ2UgdHlwZQorICAgICAgICAgIGluc3RlYWQgb2Ygc2ltcGx5
IGRvaW5nIGl0IGlubGluZQorICAgICAgICAqIFJld3JhcCBsaW5lcyB0aGF0IHVzZWQgdG8gYmUg
PD04MCBjb2xzIGFuZCBzbGlwcGVkIG92ZXIgaXQgZHVyaW5nIHRoZQorICAgICAgICAgIG9yaWdp
bmFsIGxhbmRpbmcgb2YgdGhlc2UgZGVjb2RlcnMKKyAgICAgICAgKiBPdGhlciBtaXNjLiBjaGFu
Z2VzLCBlLmcuIGFkZGluZyBjb25zdHJ1Y3RvciBkZWZpbml0aW9ucywgcmVvcmRlcmluZworICAg
ICAgICAgIGZ1bmN0aW9ucywgY2hhbmdpbmcgUkdCQTMyQnVmZmVyJiB0byBSR0JBMzJCdWZmZXIq
LCBldGMuIHRoYXQgaGF2ZSBubworICAgICAgICAgIGZ1bmN0aW9uYWwgZWZmZWN0IGJ1dCBtaW5p
bWl6ZSB0aGUgc3Vic2VxdWVudCBkaWZmIGZvciByZWFkYWJpbGl0eQorCisgICAgICAgICogcGxh
dGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlRGVjb2Rlci5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpCTVBJbWFnZURlY29kZXI6OkJNUEltYWdlRGVjb2Rlcik6CisgICAgICAgIChXZWJD
b3JlOjpCTVBJbWFnZURlY29kZXI6OnByb2Nlc3NGaWxlSGVhZGVyKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9pbWFnZS1kZWNvZGVycy9ibXAvQk1QSW1hZ2VEZWNvZGVyLmg6CisgICAgICAgICogcGxh
dGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlUmVhZGVyLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OkJNUEltYWdlUmVhZGVyOjpkZWNvZGVCTVApOgorICAgICAgICAoV2ViQ29yZTo6Qk1Q
SW1hZ2VSZWFkZXI6OmdldEluZm9IZWFkZXJTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkJNUElt
YWdlUmVhZGVyOjpwcm9jZXNzSW5mb0hlYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpCTVBJbWFn
ZVJlYWRlcjo6cmVhZEluZm9IZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VSZWFk
ZXI6OnByb2Nlc3NCaXRtYXNrcyk6CisgICAgICAgIChXZWJDb3JlOjpCTVBJbWFnZVJlYWRlcjo6
cHJvY2Vzc0NvbG9yVGFibGUpOgorICAgICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VSZWFkZXI6OnBy
b2Nlc3NSTEVEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkJNUEltYWdlUmVhZGVyOjpwcm9jZXNz
Tm9uUkxFRGF0YSk6CisgICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUElt
YWdlUmVhZGVyLmg6CisgICAgICAgIChXZWJDb3JlOjpCTVBJbWFnZVJlYWRlcjo6cmVhZFVpbnQx
Nik6CisgICAgICAgIChXZWJDb3JlOjpCTVBJbWFnZVJlYWRlcjo6cmVhZFVpbnQzMik6CisgICAg
ICAgIChXZWJDb3JlOjpCTVBJbWFnZVJlYWRlcjo6KToKKyAgICAgICAgKFdlYkNvcmU6OkJNUElt
YWdlUmVhZGVyOjpyZWFkQ3VycmVudFBpeGVsKToKKyAgICAgICAgKFdlYkNvcmU6OkJNUEltYWdl
UmVhZGVyOjpnZXRDb21wb25lbnQpOgorICAgICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VSZWFkZXI6
OnNldEkpOgorICAgICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VSZWFkZXI6OnNldFJHQkEpOgorICAg
ICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VSZWFkZXI6OmZpbGxSR0JBKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVyLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6SUNPSW1hZ2VEZWNvZGVyKToKKyAgICAgICAgKFdlYkNv
cmU6OklDT0ltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6
OklDT0ltYWdlRGVjb2Rlcjo6c2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpJQ09JbWFnZURlY29k
ZXI6OmRlY29kZUltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6cHJv
Y2Vzc0RpcmVjdG9yeSk6CisgICAgICAgIChXZWJDb3JlOjpJQ09JbWFnZURlY29kZXI6OnByb2Nl
c3NEaXJlY3RvcnlFbnRyaWVzKToKKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6
cmVhZERpcmVjdG9yeUVudHJ5KToKKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6
aXNCZXR0ZXJFbnRyeSk6CisgICAgICAgIChXZWJDb3JlOjpJQ09JbWFnZURlY29kZXI6OnByb2Nl
c3NJbWFnZVR5cGUpOgorICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2ljby9JQ09J
bWFnZURlY29kZXIuaDoKKwogMjAwOS0wNi0xOCAgUGV0ZXIgS2FzdGluZyAgPHBrYXN0aW5nQGdv
b2dsZS5jb20+CiAKICAgICAgICAgRml4IGJ1aWxkIGJ1c3RhZ2UuCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2ltYWdlLWRlY29kZXJzL2JtcC9CTVBJbWFnZURlY29kZXIuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlRGVjb2Rlci5j
cHAJKHJldmlzaW9uIDQ0ODMyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9i
bXAvQk1QSW1hZ2VEZWNvZGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzgsNiArMzgsMTEgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogLy8gZG9uJ3QgcGFjaykuCiBzdGF0aWMgY29uc3Qgc2l6ZV90
IHNpemVPZkZpbGVIZWFkZXIgPSAxNDsKIAorQk1QSW1hZ2VEZWNvZGVyOjpCTVBJbWFnZURlY29k
ZXIoKQorICAgIDogQk1QSW1hZ2VSZWFkZXIoKQoreworfQorCiB2b2lkIEJNUEltYWdlRGVjb2Rl
cjo6ZGVjb2RlSW1hZ2UoU2hhcmVkQnVmZmVyKiBkYXRhKQogewogICAgIC8vIFJlYWQgYW5kIHBy
b2Nlc3MgZmlsZSBoZWFkZXIuCkBAIC01Niw3ICs2MSw3IEBAIGJvb2wgQk1QSW1hZ2VEZWNvZGVy
Ojpwcm9jZXNzRmlsZUhlYWRlcigKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGNvbnN0IHVp
bnQxNl90IGZpbGVUeXBlID0KICAgICAgICAgKGRhdGEtPmRhdGEoKVswXSA8PCA4KSB8IHN0YXRp
Y19jYXN0PHVpbnQ4X3Q+KGRhdGEtPmRhdGEoKVsxXSk7Ci0gICAgbV9pbWdEYXRhT2Zmc2V0ID0g
cmVhZFVpbnQzMihkYXRhLCAxMCk7CisgICAgbV9pbWdEYXRhT2Zmc2V0ID0gcmVhZFVpbnQzMihk
YXRhLCBtX2RlY29kZWRPZmZzZXQgKyAxMCk7CiAgICAgbV9kZWNvZGVkT2Zmc2V0ID0gbV9oZWFk
ZXJPZmZzZXQgPSBzaXplT2ZGaWxlSGVhZGVyOwogCiAgICAgLy8gU2VlIGlmIHRoaXMgaXMgYSBi
aXRtYXAgZmlsZXR5cGUgd2UgdW5kZXJzdGFuZC4KQEAgLTczLDEwICs3OCwxMiBAQCBib29sIEJN
UEltYWdlRGVjb2Rlcjo6cHJvY2Vzc0ZpbGVIZWFkZXIoCiAgICAgICAgIEJJVE1BUEFSUkFZID0g
J0JBJywKICAgICAgICAgKi8KICAgICB9OwotICAgIGlmIChmaWxlVHlwZSAhPSBCTUFQKQotICAg
ICAgICBtX2ZhaWxlZCA9IHRydWU7CisgICAgaWYgKGZpbGVUeXBlICE9IEJNQVApIHsKKyAgICAg
ICAgc2V0RmFpbGVkKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLSAgICByZXR1
cm4gIW1fZmFpbGVkOworICAgIHJldHVybiB0cnVlOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2JtcC9CTVBJbWFnZURl
Y29kZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2Jt
cC9CTVBJbWFnZURlY29kZXIuaAkocmV2aXNpb24gNDQ4MzIpCisrKyBXZWJDb3JlL3BsYXRmb3Jt
L2ltYWdlLWRlY29kZXJzL2JtcC9CTVBJbWFnZURlY29kZXIuaAkod29ya2luZyBjb3B5KQpAQCAt
MzgsNiArMzgsOCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgLy8gVGhpcyBjbGFzcyBkZWNv
ZGVzIHRoZSBCTVAgaW1hZ2UgZm9ybWF0LgogICAgIGNsYXNzIEJNUEltYWdlRGVjb2RlciA6IHB1
YmxpYyBCTVBJbWFnZVJlYWRlciB7CiAgICAgcHVibGljOgorICAgICAgICBCTVBJbWFnZURlY29k
ZXIoKTsKKwogICAgICAgICB2aXJ0dWFsIFN0cmluZyBmaWxlbmFtZUV4dGVuc2lvbigpIGNvbnN0
IHsgcmV0dXJuICJibXAiOyB9CiAKICAgICAgICAgLy8gQk1QSW1hZ2VSZWFkZXIKSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlUmVhZGVyLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2JtcC9CTVBJbWFnZVJl
YWRlci5jcHAJKHJldmlzaW9uIDQ0ODMyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNv
ZGVycy9ibXAvQk1QSW1hZ2VSZWFkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05Miw0MSArOTIs
NDEgQEAgUkdCQTMyQnVmZmVyKiBCTVBJbWFnZVJlYWRlcjo6ZnJhbWVCdWZmZQogICAgIHJldHVy
biBpbmRleCA/IDAgOiAmbV9mcmFtZUJ1ZmZlckNhY2hlLmZpcnN0KCk7CiB9CiAKLXZvaWQgQk1Q
SW1hZ2VSZWFkZXI6OmRlY29kZUJNUChTaGFyZWRCdWZmZXIqIGRhdGEpCitib29sIEJNUEltYWdl
UmVhZGVyOjpkZWNvZGVCTVAoU2hhcmVkQnVmZmVyKiBkYXRhKQogewogICAgIC8vIENhbGN1bGF0
ZSBzaXplIG9mIGluZm8gaGVhZGVyLgogICAgIGlmICghbV9pbmZvSGVhZGVyLmJpU2l6ZSAmJiAh
Z2V0SW5mb0hlYWRlclNpemUoZGF0YSkpCi0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOwogCiAgICAgLy8gUmVhZCBhbmQgcHJvY2VzcyBpbmZvIGhlYWRlci4KICAgICBpZiAo
KG1fZGVjb2RlZE9mZnNldCA8IChtX2hlYWRlck9mZnNldCArIG1faW5mb0hlYWRlci5iaVNpemUp
KQogICAgICAgICAmJiAhcHJvY2Vzc0luZm9IZWFkZXIoZGF0YSkpCi0gICAgICAgIHJldHVybjsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gUmVhZCBhbmQgcHJvY2VzcyB0aGUgYml0
bWFza3MsIGlmIG5lZWRlZC4KICAgICBpZiAobV9uZWVkVG9Qcm9jZXNzQml0bWFza3MgJiYgIXBy
b2Nlc3NCaXRtYXNrcyhkYXRhKSkKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gZmFs
c2U7CiAKICAgICAvLyBSZWFkIGFuZCBwcm9jZXNzIHRoZSBjb2xvciB0YWJsZSwgaWYgbmVlZGVk
LgogICAgIGlmIChtX25lZWRUb1Byb2Nlc3NDb2xvclRhYmxlICYmICFwcm9jZXNzQ29sb3JUYWJs
ZShkYXRhKSkKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAv
LyBJbml0aWFsaXplIHRoZSBmcmFtZWJ1ZmZlciBpZiBuZWVkZWQuCi0gICAgUkdCQTMyQnVmZmVy
JiBidWZmZXIgPSBtX2ZyYW1lQnVmZmVyQ2FjaGUuZmlyc3QoKTsKLSAgICBpZiAoYnVmZmVyLnN0
YXR1cygpID09IFJHQkEzMkJ1ZmZlcjo6RnJhbWVFbXB0eSkgewotICAgICAgICBpZiAoIWJ1ZmZl
ci5zZXRTaXplKHNpemUoKS53aWR0aCgpLCBzaXplKCkuaGVpZ2h0KCkpKSB7CisgICAgUkdCQTMy
QnVmZmVyKiBidWZmZXIgPSAmbV9mcmFtZUJ1ZmZlckNhY2hlLmZpcnN0KCk7CisgICAgaWYgKGJ1
ZmZlci0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUVtcHR5KSB7CisgICAgICAgIGlm
ICghYnVmZmVyLT5zZXRTaXplKHNpemUoKS53aWR0aCgpLCBzaXplKCkuaGVpZ2h0KCkpKSB7CiAg
ICAgICAgICAgICAvLyBVbmFibGUgdG8gYWxsb2NhdGUuCi0gICAgICAgICAgICBtX2ZhaWxlZCA9
IHRydWU7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBzZXRGYWlsZWQoKTsKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBidWZmZXIuc2V0U3Rh
dHVzKFJHQkEzMkJ1ZmZlcjo6RnJhbWVQYXJ0aWFsKTsKKyAgICAgICAgYnVmZmVyLT5zZXRTdGF0
dXMoUkdCQTMyQnVmZmVyOjpGcmFtZVBhcnRpYWwpOwogICAgICAgICAvLyBzZXRTaXplKCkgY2Fs
bHMgZXJhc2VBUkdCKCksIHdoaWNoIHJlc2V0cyB0aGUgYWxwaGEgZmxhZywgc28gd2UgZm9yY2UK
ICAgICAgICAgLy8gaXQgYmFjayB0byBmYWxzZSBoZXJlLiAgV2UnbGwgc2V0IGl0IHRydWUgYmVs
b3cgaW4gYWxsIGNhc2VzIHdoZXJlCiAgICAgICAgIC8vIHRoZXNlIDBzIGNvdWxkIGFjdHVhbGx5
IHNob3cgdGhyb3VnaC4KLSAgICAgICAgYnVmZmVyLnNldEhhc0FscGhhKGZhbHNlKTsKKyAgICAg
ICAgYnVmZmVyLT5zZXRIYXNBbHBoYShmYWxzZSk7CiAKICAgICAgICAgLy8gRm9yIEJNUHMsIHRo
ZSBmcmFtZSBhbHdheXMgZmlsbHMgdGhlIGVudGlyZSBpbWFnZS4KLSAgICAgICAgYnVmZmVyLnNl
dFJlY3QoSW50UmVjdChJbnRQb2ludCgpLCBzaXplKCkpKTsKKyAgICAgICAgYnVmZmVyLT5zZXRS
ZWN0KEludFJlY3QoSW50UG9pbnQoKSwgc2l6ZSgpKSk7CiAKICAgICAgICAgaWYgKCFtX2lzVG9w
RG93bikKICAgICAgICAgICAgIG1fY29vcmQuc2V0WShzaXplKCkuaGVpZ2h0KCkgLSAxKTsKQEAg
LTEzOCwxNCArMTM4LDE0IEBAIHZvaWQgQk1QSW1hZ2VSZWFkZXI6OmRlY29kZUJNUChTaGFyZWRC
dWYKICAgICAgICAgICAgIHx8IChtX2luZm9IZWFkZXIuYmlDb21wcmVzc2lvbiA9PSBSTEU4KQog
ICAgICAgICAgICAgfHwgKG1faW5mb0hlYWRlci5iaUNvbXByZXNzaW9uID09IFJMRTI0KSkgewog
ICAgICAgICAgICAgaWYgKCFwcm9jZXNzUkxFRGF0YShkYXRhKSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9IGVsc2UgaWYg
KCFwcm9jZXNzTm9uUkxFRGF0YShkYXRhLCBmYWxzZSwgMCkpCi0gICAgICAgICAgICByZXR1cm47
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLy8gSWYgdGhlIGltYWdl
IGhhcyBhbiBBTkQgbWFzayBhbmQgdGhlcmUgd2FzIG5vIGFscGhhIGRhdGEsIHByb2Nlc3MgdGhl
CiAgICAgLy8gbWFzay4KLSAgICBpZiAoKG1fYW5kTWFza1N0YXRlID09IE5vdFlldERlY29kZWQp
ICYmICFidWZmZXIuaGFzQWxwaGEoKSkgeworICAgIGlmICgobV9hbmRNYXNrU3RhdGUgPT0gTm90
WWV0RGVjb2RlZCkgJiYgIWJ1ZmZlci0+aGFzQWxwaGEoKSkgewogICAgICAgICAvLyBSZXNldCBk
ZWNvZGluZyBjb29yZGluYXRlcyB0byBzdGFydCBvZiBpbWFnZS4KICAgICAgICAgbV9jb29yZC5z
ZXRYKDApOwogICAgICAgICBtX2Nvb3JkLnNldFkobV9pc1RvcERvd24gPyAwIDogKHNpemUoKS5o
ZWlnaHQoKSAtIDEpKTsKQEAgLTE1NiwxMCArMTU2LDExIEBAIHZvaWQgQk1QSW1hZ2VSZWFkZXI6
OmRlY29kZUJNUChTaGFyZWRCdWYKICAgICAgICAgbV9hbmRNYXNrU3RhdGUgPSBEZWNvZGluZzsK
ICAgICB9CiAgICAgaWYgKChtX2FuZE1hc2tTdGF0ZSA9PSBEZWNvZGluZykgJiYgIXByb2Nlc3NO
b25STEVEYXRhKGRhdGEsIGZhbHNlLCAwKSkKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1
cm4gZmFsc2U7CiAKICAgICAvLyBEb25lIQotICAgIGJ1ZmZlci5zZXRTdGF0dXMoUkdCQTMyQnVm
ZmVyOjpGcmFtZUNvbXBsZXRlKTsKKyAgICBidWZmZXItPnNldFN0YXR1cyhSR0JBMzJCdWZmZXI6
OkZyYW1lQ29tcGxldGUpOworICAgIHJldHVybiB0cnVlOwogfQogCiBib29sIEJNUEltYWdlUmVh
ZGVyOjpnZXRJbmZvSGVhZGVyU2l6ZShTaGFyZWRCdWZmZXIqIGRhdGEpCkBAIC0xNjksNyArMTcw
LDcgQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6Z2V0SW5mb0hlYWRlclNpemUoUwogICAgIGlmICgo
bV9kZWNvZGVkT2Zmc2V0ID4gZGF0YS0+c2l6ZSgpKQogICAgICAgICB8fCAoKGRhdGEtPnNpemUo
KSAtIG1fZGVjb2RlZE9mZnNldCkgPCA0KSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIG1f
aW5mb0hlYWRlci5iaVNpemUgPSByZWFkVWludDMyKGRhdGEsIDApOworICAgIG1faW5mb0hlYWRl
ci5iaVNpemUgPSByZWFkVWludDMyKGRhdGEsIG1fZGVjb2RlZE9mZnNldCk7CiAgICAgLy8gRG9u
J3QgaW5jcmVtZW50IG1fZGVjb2RlZE9mZnNldCBoZXJlLCBpdCBqdXN0IG1ha2VzIHRoZSBjb2Rl
IGluCiAgICAgLy8gcHJvY2Vzc0luZm9IZWFkZXIoKSBtb3JlIGNvbmZ1c2luZy4KIApAQCAtMTc5
LDcgKzE4MCw3IEBAIGJvb2wgQk1QSW1hZ2VSZWFkZXI6OmdldEluZm9IZWFkZXJTaXplKFMKICAg
ICBpZiAoKChtX2hlYWRlck9mZnNldCArIG1faW5mb0hlYWRlci5iaVNpemUpIDwgbV9oZWFkZXJP
ZmZzZXQpCiAgICAgICAgIHx8IChtX2ltZ0RhdGFPZmZzZXQKICAgICAgICAgICAgICYmIChtX2lt
Z0RhdGFPZmZzZXQgPCAobV9oZWFkZXJPZmZzZXQgKyBtX2luZm9IZWFkZXIuYmlTaXplKSkpKSB7
Ci0gICAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgc2V0RmFpbGVkKCk7CiAgICAgICAg
IHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTE5NSwxMCArMTk2LDEyIEBAIGJvb2wgQk1QSW1h
Z2VSZWFkZXI6OmdldEluZm9IZWFkZXJTaXplKFMKICAgICAgICAgICAgICAmJiAoKChtX2luZm9I
ZWFkZXIuYmlTaXplICYgMykgPT0gMCkgfHwgKG1faW5mb0hlYWRlci5iaVNpemUgPT0gNDIpCiAg
ICAgICAgICAgICAgICAgIHx8IChtX2luZm9IZWFkZXIuYmlTaXplID09IDQ2KSkpCiAgICAgICAg
IG1faXNPUzIyeCA9IHRydWU7Ci0gICAgZWxzZQotICAgICAgICBtX2ZhaWxlZCA9IHRydWU7Cisg
ICAgZWxzZSB7CisgICAgICAgIHNldEZhaWxlZCgpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQogCi0gICAgcmV0dXJuICFtX2ZhaWxlZDsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9v
bCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc0luZm9IZWFkZXIoU2hhcmVkQnVmZmVyKiBkYXRhKQpA
QCAtMjEzLDEzICsyMTYsMTMgQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc0luZm9IZWFk
ZXIoUwogCiAgICAgLy8gU2FuaXR5LWNoZWNrIGhlYWRlciB2YWx1ZXMuCiAgICAgaWYgKCFpc0lu
Zm9IZWFkZXJWYWxpZCgpKSB7Ci0gICAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgc2V0
RmFpbGVkKCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvLyBNYWtlIG91
ciBzaXplIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyLgogICAgIGlmICghc2V0U2l6ZShtX2luZm9I
ZWFkZXIuYmlXaWR0aCwgbV9pbmZvSGVhZGVyLmJpSGVpZ2h0KSkgewotICAgICAgICBtX2ZhaWxl
ZCA9IHRydWU7CisgICAgICAgIHNldEZhaWxlZCgpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgfQogCkBAIC0yNTgsMjIgKzI2MSwyMiBAQCBib29sIEJNUEltYWdlUmVhZGVyOjpyZWFkSW5m
b0hlYWRlcihTaGFyCiAgICAgbV9pbmZvSGVhZGVyLmJpQ2xyVXNlZCA9IDA7CiAKICAgICBpZiAo
bV9pc09TMjF4KSB7Ci0gICAgICAgIG1faW5mb0hlYWRlci5iaVdpZHRoID0gcmVhZFVpbnQxNihk
YXRhLCA0KTsKLSAgICAgICAgbV9pbmZvSGVhZGVyLmJpSGVpZ2h0ID0gcmVhZFVpbnQxNihkYXRh
LCA2KTsKKyAgICAgICAgbV9pbmZvSGVhZGVyLmJpV2lkdGggPSByZWFkVWludDE2KGRhdGEsIG1f
ZGVjb2RlZE9mZnNldCArIDQpOworICAgICAgICBtX2luZm9IZWFkZXIuYmlIZWlnaHQgPSByZWFk
VWludDE2KGRhdGEsIG1fZGVjb2RlZE9mZnNldCArIDYpOwogICAgICAgICBBU1NFUlQobV9hbmRN
YXNrU3RhdGUgPT0gTm9uZSk7ICAvLyBJQ08gaXMgYSBXaW5kb3dzIGZvcm1hdCwgbm90IE9TLzIh
Ci0gICAgICAgIG1faW5mb0hlYWRlci5iaUJpdENvdW50ID0gcmVhZFVpbnQxNihkYXRhLCAxMCk7
CisgICAgICAgIG1faW5mb0hlYWRlci5iaUJpdENvdW50ID0gcmVhZFVpbnQxNihkYXRhLCBtX2Rl
Y29kZWRPZmZzZXQgKyAxMCk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIG1f
aW5mb0hlYWRlci5iaVdpZHRoID0gcmVhZFVpbnQzMihkYXRhLCA0KTsKLSAgICBtX2luZm9IZWFk
ZXIuYmlIZWlnaHQgPSByZWFkVWludDMyKGRhdGEsIDgpOworICAgIG1faW5mb0hlYWRlci5iaVdp
ZHRoID0gcmVhZFVpbnQzMihkYXRhLCBtX2RlY29kZWRPZmZzZXQgKyA0KTsKKyAgICBtX2luZm9I
ZWFkZXIuYmlIZWlnaHQgPSByZWFkVWludDMyKGRhdGEsIG1fZGVjb2RlZE9mZnNldCArIDgpOwog
ICAgIGlmIChtX2FuZE1hc2tTdGF0ZSAhPSBOb25lKQogICAgICAgICBtX2luZm9IZWFkZXIuYmlI
ZWlnaHQgLz0gMjsKLSAgICBtX2luZm9IZWFkZXIuYmlCaXRDb3VudCA9IHJlYWRVaW50MTYoZGF0
YSwgMTQpOworICAgIG1faW5mb0hlYWRlci5iaUJpdENvdW50ID0gcmVhZFVpbnQxNihkYXRhLCBt
X2RlY29kZWRPZmZzZXQgKyAxNCk7CiAKICAgICAvLyBSZWFkIGNvbXByZXNzaW9uIHR5cGUsIGlm
IHByZXNlbnQuCiAgICAgaWYgKG1faW5mb0hlYWRlci5iaVNpemUgPj0gMjApIHsKLSAgICAgICAg
dWludDMyX3QgYmlDb21wcmVzc2lvbiA9IHJlYWRVaW50MzIoZGF0YSwgMTYpOworICAgICAgICB1
aW50MzJfdCBiaUNvbXByZXNzaW9uID0gcmVhZFVpbnQzMihkYXRhLCBtX2RlY29kZWRPZmZzZXQg
KyAxNik7CiAKICAgICAgICAgLy8gRGV0ZWN0IE9TLzIgMi54LXNwZWNpZmljIGNvbXByZXNzaW9u
IHR5cGVzLgogICAgICAgICBpZiAoKGJpQ29tcHJlc3Npb24gPT0gMykgJiYgKG1faW5mb0hlYWRl
ci5iaUJpdENvdW50ID09IDEpKSB7CkBAIC0yODQsMTUgKzI4NywxNiBAQCBib29sIEJNUEltYWdl
UmVhZGVyOjpyZWFkSW5mb0hlYWRlcihTaGFyCiAgICAgICAgICAgICBtX2lzT1MyMnggPSB0cnVl
OwogICAgICAgICB9IGVsc2UgaWYgKGJpQ29tcHJlc3Npb24gPiA1KSB7CiAgICAgICAgICAgICAv
LyBTb21lIHR5cGUgd2UgZG9uJ3QgdW5kZXJzdGFuZC4KLSAgICAgICAgICAgIG1fZmFpbGVkID0g
dHJ1ZTsKKyAgICAgICAgICAgIHNldEZhaWxlZCgpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwogICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1faW5mb0hlYWRlci5iaUNvbXByZXNzaW9u
ID0gc3RhdGljX2Nhc3Q8Q29tcHJlc3Npb25UeXBlPihiaUNvbXByZXNzaW9uKTsKKyAgICAgICAg
ICAgIG1faW5mb0hlYWRlci5iaUNvbXByZXNzaW9uID0KKyAgICAgICAgICAgICAgICBzdGF0aWNf
Y2FzdDxDb21wcmVzc2lvblR5cGU+KGJpQ29tcHJlc3Npb24pOwogICAgIH0KIAogICAgIC8vIFJl
YWQgY29sb3JzIHVzZWQsIGlmIHByZXNlbnQuCiAgICAgaWYgKG1faW5mb0hlYWRlci5iaVNpemUg
Pj0gMzYpCi0gICAgICAgIG1faW5mb0hlYWRlci5iaUNsclVzZWQgPSByZWFkVWludDMyKGRhdGEs
IDMyKTsKKyAgICAgICAgbV9pbmZvSGVhZGVyLmJpQ2xyVXNlZCA9IHJlYWRVaW50MzIoZGF0YSwg
bV9kZWNvZGVkT2Zmc2V0ICsgMzIpOwogCiAgICAgLy8gV2luZG93cyBWNCsgY2FuIHNhZmVseSBy
ZWFkIHRoZSBmb3VyIGJpdG1hc2tzIGZyb20gNDAtNTYgYnl0ZXMgaW4sIHNvIGRvCiAgICAgLy8g
dGhhdCBoZXJlLiAgSWYgdGhlIGJpdCBkZXB0aCBpcyBsZXNzIHRoYW4gMTYsIHRoZXNlIHZhbHVl
cyB3aWxsIGJlCkBAIC0zMDksMTAgKzMxMywxMCBAQCBib29sIEJNUEltYWdlUmVhZGVyOjpyZWFk
SW5mb0hlYWRlcihTaGFyCiAgICAgLy8gdG8gcGF5IGF0dGVudGlvbiB0byB0aGUgYWxwaGEgbWFz
ayBoZXJlLCBzbyB0aGVyZSdzIGEgc3BlY2lhbCBjYXNlIGluCiAgICAgLy8gcHJvY2Vzc0JpdG1h
c2tzKCkgdGhhdCBkb2Vzbid0IGFsd2F5cyBvdmVyd3JpdGUgdGhhdCB2YWx1ZS4KICAgICBpZiAo
aXNXaW5kb3dzVjRQbHVzKCkpIHsKLSAgICAgICAgbV9iaXRNYXNrc1swXSA9IHJlYWRVaW50MzIo
ZGF0YSwgNDApOwotICAgICAgICBtX2JpdE1hc2tzWzFdID0gcmVhZFVpbnQzMihkYXRhLCA0NCk7
Ci0gICAgICAgIG1fYml0TWFza3NbMl0gPSByZWFkVWludDMyKGRhdGEsIDQ4KTsKLSAgICAgICAg
bV9iaXRNYXNrc1szXSA9IHJlYWRVaW50MzIoZGF0YSwgNTIpOworICAgICAgICBtX2JpdE1hc2tz
WzBdID0gcmVhZFVpbnQzMihkYXRhLCBtX2RlY29kZWRPZmZzZXQgKyA0MCk7CisgICAgICAgIG1f
Yml0TWFza3NbMV0gPSByZWFkVWludDMyKGRhdGEsIG1fZGVjb2RlZE9mZnNldCArIDQ0KTsKKyAg
ICAgICAgbV9iaXRNYXNrc1syXSA9IHJlYWRVaW50MzIoZGF0YSwgbV9kZWNvZGVkT2Zmc2V0ICsg
NDgpOworICAgICAgICBtX2JpdE1hc2tzWzNdID0gcmVhZFVpbnQzMihkYXRhLCBtX2RlY29kZWRP
ZmZzZXQgKyA1Mik7CiAgICAgfQogCiAgICAgLy8gRGV0ZWN0IHRvcC1kb3duIEJNUHMuCkBAIC00
NzEsMTggKzQ3NSwyMCBAQCBib29sIEJNUEltYWdlUmVhZGVyOjpwcm9jZXNzQml0bWFza3MoU2hh
CiAKICAgICAgICAgLy8gRmFpbCBpZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBmaWxlIHNwYWNlIGZv
ciB0aGUgYml0bWFza3MuCiAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3QgU0laRU9GX0JJVE1B
U0tTID0gMTI7Ci0gICAgICAgIGlmICgoKG1faGVhZGVyT2Zmc2V0ICsgbV9pbmZvSGVhZGVyLmJp
U2l6ZSArIFNJWkVPRl9CSVRNQVNLUykgPCAobV9oZWFkZXJPZmZzZXQgKyBtX2luZm9IZWFkZXIu
YmlTaXplKSkKLSAgICAgICAgICAgIHx8IChtX2ltZ0RhdGFPZmZzZXQgJiYgKG1faW1nRGF0YU9m
ZnNldCA8IChtX2hlYWRlck9mZnNldCArIG1faW5mb0hlYWRlci5iaVNpemUgKyBTSVpFT0ZfQklU
TUFTS1MpKSkpIHsKLSAgICAgICAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKCgo
bV9oZWFkZXJPZmZzZXQgKyBtX2luZm9IZWFkZXIuYmlTaXplICsgU0laRU9GX0JJVE1BU0tTKSA8
CisgICAgICAgICAgICAgICAgKG1faGVhZGVyT2Zmc2V0ICsgbV9pbmZvSGVhZGVyLmJpU2l6ZSkp
CisgICAgICAgICAgICB8fCAobV9pbWdEYXRhT2Zmc2V0ICYmIChtX2ltZ0RhdGFPZmZzZXQgPAor
ICAgICAgICAgICAgICAgIChtX2hlYWRlck9mZnNldCArIG1faW5mb0hlYWRlci5iaVNpemUgKyBT
SVpFT0ZfQklUTUFTS1MpKSkpIHsKKyAgICAgICAgICAgIHNldEZhaWxlZCgpOwogICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgLy8gUmVhZCBiaXRtYXNrcy4K
ICAgICAgICAgaWYgKChkYXRhLT5zaXplKCkgLSBtX2RlY29kZWRPZmZzZXQpIDwgU0laRU9GX0JJ
VE1BU0tTKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBtX2JpdE1hc2tzWzBd
ID0gcmVhZFVpbnQzMihkYXRhLCAwKTsKLSAgICAgICAgbV9iaXRNYXNrc1sxXSA9IHJlYWRVaW50
MzIoZGF0YSwgNCk7Ci0gICAgICAgIG1fYml0TWFza3NbMl0gPSByZWFkVWludDMyKGRhdGEsIDgp
OworICAgICAgICBtX2JpdE1hc2tzWzBdID0gcmVhZFVpbnQzMihkYXRhLCBtX2RlY29kZWRPZmZz
ZXQpOworICAgICAgICBtX2JpdE1hc2tzWzFdID0gcmVhZFVpbnQzMihkYXRhLCBtX2RlY29kZWRP
ZmZzZXQgKyA0KTsKKyAgICAgICAgbV9iaXRNYXNrc1syXSA9IHJlYWRVaW50MzIoZGF0YSwgbV9k
ZWNvZGVkT2Zmc2V0ICsgOCk7CiAgICAgICAgIC8vIE5vIGFscGhhIGluIGFueXRoaW5nIG90aGVy
IHRoYW4gV2luZG93cyBWNCsuCiAgICAgICAgIG1fYml0TWFza3NbM10gPSAwOwogCkBAIC01MDEs
NyArNTA3LDggQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc0JpdG1hc2tzKFNoYQogICAg
ICAgICAvLyBzcGVjaWZ5IGEgYm9ndXMgYWxwaGEgY2hhbm5lbCBpbiBiaXRzIHRoYXQgZG9uJ3Qg
ZXhpc3QgaW4gdGhlIHBpeGVsCiAgICAgICAgIC8vIGRhdGEgKGZvciBleGFtcGxlLCBiaXRzIDI1
LTMxIGluIGEgMjQtYml0IFJHQiBmb3JtYXQpLgogICAgICAgICBpZiAobV9pbmZvSGVhZGVyLmJp
Qml0Q291bnQgPCAzMikKLSAgICAgICAgICAgIG1fYml0TWFza3NbaV0gJj0gKChzdGF0aWNfY2Fz
dDx1aW50MzJfdD4oMSkgPDwgbV9pbmZvSGVhZGVyLmJpQml0Q291bnQpIC0gMSk7CisgICAgICAg
ICAgICBtX2JpdE1hc2tzW2ldICY9CisgICAgICAgICAgICAgICAgKChzdGF0aWNfY2FzdDx1aW50
MzJfdD4oMSkgPDwgbV9pbmZvSGVhZGVyLmJpQml0Q291bnQpIC0gMSk7CiAKICAgICAgICAgLy8g
Rm9yIGVtcHR5IG1hc2tzIChjb21tb24gb24gdGhlIGFscGhhIGNoYW5uZWwsIGVzcGVjaWFsbHkg
YWZ0ZXIgdGhlCiAgICAgICAgIC8vIHRyaW1taW5nIGFib3ZlKSwgcXVpY2tseSBjbGVhciB0aGUg
c2hpZnRzIGFuZCBjb250aW51ZSwgdG8gYXZvaWQgYW4KQEAgLTUxNSw3ICs1MjIsNyBAQCBib29s
IEJNUEltYWdlUmVhZGVyOjpwcm9jZXNzQml0bWFza3MoU2hhCiAgICAgICAgIC8vIE1ha2Ugc3Vy
ZSBiaXRtYXNrIGRvZXMgbm90IG92ZXJsYXAgYW55IG90aGVyIGJpdG1hc2tzLgogICAgICAgICBm
b3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgewogICAgICAgICAgICAgaWYgKHRlbXBNYXNrICYg
bV9iaXRNYXNrc1tqXSkgewotICAgICAgICAgICAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICBzZXRGYWlsZWQoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUzMCw3ICs1MzcsNyBAQCBib29sIEJNUEltYWdl
UmVhZGVyOjpwcm9jZXNzQml0bWFza3MoU2hhCiAKICAgICAgICAgLy8gTWFrZSBzdXJlIGJpdG1h
c2sgaXMgY29udGlndW91cy4KICAgICAgICAgaWYgKHRlbXBNYXNrKSB7Ci0gICAgICAgICAgICBt
X2ZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICBzZXRGYWlsZWQoKTsKICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKICAgICAgICAgfQogCkBAIC01NTAsOSArNTU3LDExIEBAIGJvb2wgQk1QSW1h
Z2VSZWFkZXI6OnByb2Nlc3NDb2xvclRhYmxlKFMKICAgICBtX3RhYmxlU2l6ZUluQnl0ZXMgPSBt
X2luZm9IZWFkZXIuYmlDbHJVc2VkICogKG1faXNPUzIxeCA/IDMgOiA0KTsKIAogICAgIC8vIEZh
aWwgaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZmlsZSBzcGFjZSBmb3IgdGhlIGNvbG9yIHRhYmxl
LgotICAgIGlmICgoKG1faGVhZGVyT2Zmc2V0ICsgbV9pbmZvSGVhZGVyLmJpU2l6ZSArIG1fdGFi
bGVTaXplSW5CeXRlcykgPCAobV9oZWFkZXJPZmZzZXQgKyBtX2luZm9IZWFkZXIuYmlTaXplKSkK
LSAgICAgICAgfHwgKG1faW1nRGF0YU9mZnNldCAmJiAobV9pbWdEYXRhT2Zmc2V0IDwgKG1faGVh
ZGVyT2Zmc2V0ICsgbV9pbmZvSGVhZGVyLmJpU2l6ZSArIG1fdGFibGVTaXplSW5CeXRlcykpKSkg
ewotICAgICAgICBtX2ZhaWxlZCA9IHRydWU7CisgICAgaWYgKCgobV9oZWFkZXJPZmZzZXQgKyBt
X2luZm9IZWFkZXIuYmlTaXplICsgbV90YWJsZVNpemVJbkJ5dGVzKSA8CisgICAgICAgICAgICAo
bV9oZWFkZXJPZmZzZXQgKyBtX2luZm9IZWFkZXIuYmlTaXplKSkKKyAgICAgICAgfHwgKG1faW1n
RGF0YU9mZnNldCAmJiAobV9pbWdEYXRhT2Zmc2V0IDwKKyAgICAgICAgICAgIChtX2hlYWRlck9m
ZnNldCArIG1faW5mb0hlYWRlci5iaVNpemUgKyBtX3RhYmxlU2l6ZUluQnl0ZXMpKSkpIHsKKyAg
ICAgICAgc2V0RmFpbGVkKCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTYw
Niw3ICs2MTUsNyBAQCBib29sIEJNUEltYWdlUmVhZGVyOjpwcm9jZXNzUkxFRGF0YShTaGFyCiAK
ICAgICAvLyBJbXBvc3NpYmxlIHRvIGRlY29kZSByb3ctYXQtYS10aW1lLCBzbyBqdXN0IGRvIHRo
aW5ncyBhcyBhIHN0cmVhbSBvZgogICAgIC8vIGJ5dGVzLgotICAgIFJHQkEzMkJ1ZmZlciYgYnVm
ZmVyID0gbV9mcmFtZUJ1ZmZlckNhY2hlLmZpcnN0KCk7CisgICAgUkdCQTMyQnVmZmVyKiBidWZm
ZXIgPSAmbV9mcmFtZUJ1ZmZlckNhY2hlLmZpcnN0KCk7CiAgICAgd2hpbGUgKHRydWUpIHsKICAg
ICAgICAgLy8gRXZlcnkgZW50cnkgdGFrZXMgYXQgbGVhc3QgdHdvIGJ5dGVzOyBiYWlsIGlmIHRo
ZXJlIGlzbid0IGVub3VnaAogICAgICAgICAvLyBkYXRhLgpAQCAtNjE4LDcgKzYyNyw3IEBAIGJv
b2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NSTEVEYXRhKFNoYXIKICAgICAgICAgY29uc3QgdWlu
dDhfdCBjb3VudCA9IGRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXRdOwogICAgICAgICBjb25z
dCB1aW50OF90IGNvZGUgPSBkYXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0ICsgMV07CiAgICAg
ICAgIGlmICgoKGNvdW50ICE9IDApIHx8IChjb2RlICE9IDEpKSAmJiBwYXN0RW5kT2ZJbWFnZSgw
KSkgewotICAgICAgICAgICAgbV9mYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgc2V0RmFpbGVk
KCk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIApAQCAtNjI4LDcgKzYz
Nyw3IEBAIGJvb2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NSTEVEYXRhKFNoYXIKICAgICAgICAg
ICAgIGNhc2UgMDogIC8vIE1hZ2ljIHRva2VuOiBFT0wKICAgICAgICAgICAgICAgICAvLyBTa2lw
IGFueSByZW1haW5pbmcgcGl4ZWxzIGluIHRoaXMgcm93LgogICAgICAgICAgICAgICAgIGlmICht
X2Nvb3JkLngoKSA8IHNpemUoKS53aWR0aCgpKQotICAgICAgICAgICAgICAgICAgICBidWZmZXIu
c2V0SGFzQWxwaGEodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0SGFzQWxw
aGEodHJ1ZSk7CiAgICAgICAgICAgICAgICAgbW92ZUJ1ZmZlclRvTmV4dFJvdygpOwogCiAgICAg
ICAgICAgICAgICAgbV9kZWNvZGVkT2Zmc2V0ICs9IDI7CkBAIC02MzcsOCArNjQ2LDEwIEBAIGJv
b2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NSTEVEYXRhKFNoYXIKICAgICAgICAgICAgIGNhc2Ug
MTogIC8vIE1hZ2ljIHRva2VuOiBFT0YKICAgICAgICAgICAgICAgICAvLyBTa2lwIGFueSByZW1h
aW5pbmcgcGl4ZWxzIGluIHRoZSBpbWFnZS4KICAgICAgICAgICAgICAgICBpZiAoKG1fY29vcmQu
eCgpIDwgc2l6ZSgpLndpZHRoKCkpCi0gICAgICAgICAgICAgICAgICAgIHx8IChtX2lzVG9wRG93
biA/IChtX2Nvb3JkLnkoKSA8IChzaXplKCkuaGVpZ2h0KCkgLSAxKSkgOiAobV9jb29yZC55KCkg
PiAwKSkpCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXRIYXNBbHBoYSh0cnVlKTsKKyAg
ICAgICAgICAgICAgICAgICAgfHwgKG1faXNUb3BEb3duCisgICAgICAgICAgICAgICAgICAgICAg
ICA/IChtX2Nvb3JkLnkoKSA8IChzaXplKCkuaGVpZ2h0KCkgLSAxKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgIDogKG1fY29vcmQueSgpID4gMCkpKQorICAgICAgICAgICAgICAgICAgICBidWZm
ZXItPnNldEhhc0FscGhhKHRydWUpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCiAg
ICAgICAgICAgICBjYXNlIDI6IHsgIC8vIE1hZ2ljIHRva2VuOiBEZWx0YQpAQCAtNjUyLDEwICs2
NjMsMTAgQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc1JMRURhdGEoU2hhcgogICAgICAg
ICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgZHggPSBkYXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0
ICsgMl07CiAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBkeSA9IGRhdGEtPmRhdGEoKVtt
X2RlY29kZWRPZmZzZXQgKyAzXTsKICAgICAgICAgICAgICAgICBpZiAoKGR4ICE9IDApIHx8IChk
eSAhPSAwKSkKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnNldEhhc0FscGhhKHRydWUpOwor
ICAgICAgICAgICAgICAgICAgICBidWZmZXItPnNldEhhc0FscGhhKHRydWUpOwogICAgICAgICAg
ICAgICAgIGlmICgoKG1fY29vcmQueCgpICsgZHgpID4gc2l6ZSgpLndpZHRoKCkpIHx8CiAgICAg
ICAgICAgICAgICAgICAgIHBhc3RFbmRPZkltYWdlKGR5KSkgewotICAgICAgICAgICAgICAgICAg
ICBtX2ZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNldEZhaWxlZCgpOwogICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogCkBAIC03
MDUsNyArNzE2LDcgQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc1JMRURhdGEoU2hhcgog
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoKGNvbG9ySW5kZXhlc1swXSA+
PSBtX2luZm9IZWFkZXIuYmlDbHJVc2VkKQogICAgICAgICAgICAgICAgICAgICB8fCAoY29sb3JJ
bmRleGVzWzFdID49IG1faW5mb0hlYWRlci5iaUNsclVzZWQpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIG1fZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc2V0RmFpbGVkKCk7CiAg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAg
ICAgICAgICAgICAgZm9yIChpbnQgd2hpY2ggPSAwOyBtX2Nvb3JkLngoKSA8IGVuZFg7ICkgewpA
QCAtNzMwLDcgKzc0MSw3IEBAIGJvb2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NOb25STEVEYXRh
KFMKICAgICAvLyBGYWlsIGlmIHdlJ3JlIGJlaW5nIGFza2VkIHRvIGRlY29kZSBtb3JlIHBpeGVs
cyB0aGFuIHJlbWFpbiBpbiB0aGUgcm93LgogICAgIGNvbnN0IGludCBlbmRYID0gbV9jb29yZC54
KCkgKyBudW1QaXhlbHM7CiAgICAgaWYgKGVuZFggPiBzaXplKCkud2lkdGgoKSkgewotICAgICAg
ICBtX2ZhaWxlZCA9IHRydWU7CisgICAgICAgIHNldEZhaWxlZCgpOwogICAgICAgICByZXR1cm4g
ZmFsc2U7CiAgICAgfQogCkBAIC03NDgsNyArNzU5LDcgQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6
cHJvY2Vzc05vblJMRURhdGEoUwogCiAgICAgLy8gRGVjb2RlIGFzIG1hbnkgcm93cyBhcyB3ZSBj
YW4uICAoRm9yIFJMRSwgd2hlcmUgd2Ugb25seSB3YW50IHRvIGRlY29kZQogICAgIC8vIG9uZSBy
b3csIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoaXMgY29uZGl0aW9uIGlzIHRydWUuKQot
ICAgIFJHQkEzMkJ1ZmZlciYgYnVmZmVyID0gbV9mcmFtZUJ1ZmZlckNhY2hlLmZpcnN0KCk7Cisg
ICAgUkdCQTMyQnVmZmVyKiBidWZmZXIgPSAmbV9mcmFtZUJ1ZmZlckNhY2hlLmZpcnN0KCk7CiAg
ICAgd2hpbGUgKCFwYXN0RW5kT2ZJbWFnZSgwKSkgewogICAgICAgICAvLyBCYWlsIGlmIHdlIGRv
bid0IGhhdmUgZW5vdWdoIGRhdGEgZm9yIHRoZSBkZXNpcmVkIG51bWJlciBvZiBwaXhlbHMuCiAg
ICAgICAgIGlmICgoZGF0YS0+c2l6ZSgpIC0gbV9kZWNvZGVkT2Zmc2V0KSA8IHBhZGRlZE51bUJ5
dGVzKQpAQCAtNzYxLDcgKzc3Miw4IEBAIGJvb2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NOb25S
TEVEYXRhKFMKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgbWFzayA9ICgxIDw8IG1faW5mb0hl
YWRlci5iaUJpdENvdW50KSAtIDE7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBieXRlID0gMDsg
Ynl0ZSA8IHVucGFkZGVkTnVtQnl0ZXM7ICsrYnl0ZSkgewogICAgICAgICAgICAgICAgIHVpbnQ4
X3QgcGl4ZWxEYXRhID0gZGF0YS0+ZGF0YSgpW21fZGVjb2RlZE9mZnNldCArIGJ5dGVdOwotICAg
ICAgICAgICAgICAgIGZvciAoc2l6ZV90IHBpeGVsID0gMDsgKHBpeGVsIDwgcGl4ZWxzUGVyQnl0
ZSkgJiYgKG1fY29vcmQueCgpIDwgZW5kWCk7ICsrcGl4ZWwpIHsKKyAgICAgICAgICAgICAgICBm
b3IgKHNpemVfdCBwaXhlbCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAocGl4ZWwgPCBwaXhl
bHNQZXJCeXRlKSAmJiAobV9jb29yZC54KCkgPCBlbmRYKTsgKytwaXhlbCkgewogICAgICAgICAg
ICAgICAgICAgICBjb25zdCBzaXplX3QgY29sb3JJbmRleCA9CiAgICAgICAgICAgICAgICAgICAg
ICAgICAocGl4ZWxEYXRhID4+ICg4IC0gbV9pbmZvSGVhZGVyLmJpQml0Q291bnQpKSAmIG1hc2s7
CiAgICAgICAgICAgICAgICAgICAgIGlmIChtX2FuZE1hc2tTdGF0ZSA9PSBEZWNvZGluZykgewpA
QCAtNzcyLDEyICs3ODQsMTIgQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc05vblJMRURh
dGEoUwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2ViIHdpbGwgbm90IGJlIGRvaW5nIGEg
bG90IG9mIGludmVydGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvckluZGV4
KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UkdCQSgwLCAwLCAwLCAwKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuc2V0SGFzQWxwaGEodHJ1ZSk7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRIYXNBbHBoYSh0cnVlKTsKICAgICAg
ICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1f
Y29vcmQubW92ZSgxLCAwKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChjb2xvckluZGV4ID49IG1faW5mb0hlYWRlci5iaUNsclVzZWQp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZhaWxlZCA9IHRydWU7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc2V0RmFpbGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICAgICAgICAgICAgICAgc2V0SShjb2xvckluZGV4KTsKQEAgLTgwNiwxMCArODE4LDEwIEBAIGJv
b2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NOb25STEVEYXRhKFMKICAgICAgICAgICAgICAgICB9
IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtX3NlZW5Ob25aZXJvQWxwaGFQaXhlbCA9IHRy
dWU7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtX3NlZW5aZXJvQWxwaGFQaXhlbCkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnplcm9GaWxsKCk7CisgICAgICAgICAgICAgICAg
ICAgICAgICBidWZmZXItPnplcm9GaWxsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtX3Nl
ZW5aZXJvQWxwaGFQaXhlbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYg
KGFscGhhICE9IDI1NSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXRIYXNBbHBo
YSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0SGFzQWxwaGEodHJ1
ZSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgc2V0UkdCQShnZXRDb21w
b25lbnQocGl4ZWwsIDApLCBnZXRDb21wb25lbnQocGl4ZWwsIDEpLApJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9ibXAvQk1QSW1hZ2VSZWFkZXIuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2JtcC9CTVBJbWFnZVJlYWRlci5oCShy
ZXZpc2lvbiA0NDgzMikKKysrIFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JN
UEltYWdlUmVhZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTUwLDMyICs1MCwyMiBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXREYXRhKFNoYXJlZEJ1ZmZlciog
ZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpOwogICAgICAgICB2aXJ0dWFsIFJHQkEzMkJ1ZmZl
ciogZnJhbWVCdWZmZXJBdEluZGV4KHNpemVfdCBpbmRleCk7CiAKLSAgICBwcm90ZWN0ZWQ6Ci0g
ICAgICAgIGVudW0gQW5kTWFza1N0YXRlIHsKLSAgICAgICAgICAgIE5vbmUsCi0gICAgICAgICAg
ICBOb3RZZXREZWNvZGVkLAotICAgICAgICAgICAgRGVjb2RpbmcsCi0gICAgICAgIH07Ci0KLSAg
ICAgICAgLy8gRGVjb2RlcyBhIHNpbmdsZSBCTVAsIHN0YXJ0aW5nIHdpdGggYW4gaW5mbyBoZWFk
ZXIuCi0gICAgICAgIHZvaWQgZGVjb2RlQk1QKFNoYXJlZEJ1ZmZlciogZGF0YSk7Ci0KLSAgICAg
ICAgLy8gUmVhZCBhIHZhbHVlIGZyb20gfGRhdGFbbV9kZWNvZGVkT2Zmc2V0ICsgYWRkaXRpb25h
bE9mZnNldF18LCBjb252ZXJ0aW5nCi0gICAgICAgIC8vIGZyb20gbGl0dGxlIHRvIG5hdGl2ZSBl
bmRpYW5uZXNzLgotICAgICAgICBpbmxpbmUgdWludDE2X3QgcmVhZFVpbnQxNihTaGFyZWRCdWZm
ZXIqIGRhdGEsIGludCBhZGRpdGlvbmFsT2Zmc2V0KSBjb25zdAorICAgICAgICAvLyBSZWFkIGEg
dmFsdWUgZnJvbSB8ZGF0YVtvZmZzZXRdfCwgY29udmVydGluZyBmcm9tIGxpdHRsZSB0byBuYXRp
dmUKKyAgICAgICAgLy8gZW5kaWFubmVzcy4KKyAgICAgICAgc3RhdGljIGlubGluZSB1aW50MTZf
dCByZWFkVWludDE2KFNoYXJlZEJ1ZmZlciogZGF0YSwgaW50IG9mZnNldCkKICAgICAgICAgewog
ICAgICAgICAgICAgdWludDE2X3QgcmVzdWx0OwotICAgICAgICAgICAgbWVtY3B5KCZyZXN1bHQs
ICZkYXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0ICsgYWRkaXRpb25hbE9mZnNldF0sIDIpOwor
ICAgICAgICAgICAgbWVtY3B5KCZyZXN1bHQsICZkYXRhLT5kYXRhKClbb2Zmc2V0XSwgMik7CiAg
ICAgICAgICNpZiBQTEFURk9STShCSUdfRU5ESUFOKQogICAgICAgICAgICAgcmVzdWx0ID0gKChy
ZXN1bHQgJiAweGZmKSA8PCA4KSB8ICgocmVzdWx0ICYgMHhmZjAwKSA+PiA4KTsKICAgICAgICAg
I2VuZGlmCiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAKLSAgICAgICAg
aW5saW5lIHVpbnQzMl90IHJlYWRVaW50MzIoU2hhcmVkQnVmZmVyKiBkYXRhLCBpbnQgYWRkaXRp
b25hbE9mZnNldCkgY29uc3QKKyAgICAgICAgc3RhdGljIGlubGluZSB1aW50MzJfdCByZWFkVWlu
dDMyKFNoYXJlZEJ1ZmZlciogZGF0YSwgaW50IG9mZnNldCkKICAgICAgICAgewogICAgICAgICAg
ICAgdWludDMyX3QgcmVzdWx0OwotICAgICAgICAgICAgbWVtY3B5KCZyZXN1bHQsICZkYXRhLT5k
YXRhKClbbV9kZWNvZGVkT2Zmc2V0ICsgYWRkaXRpb25hbE9mZnNldF0sIDQpOworICAgICAgICAg
ICAgbWVtY3B5KCZyZXN1bHQsICZkYXRhLT5kYXRhKClbb2Zmc2V0XSwgNCk7CiAgICAgICAgICNp
ZiBQTEFURk9STShCSUdfRU5ESUFOKQogICAgICAgICAgICAgcmVzdWx0ID0gKChyZXN1bHQgJiAw
eGZmKSA8PCAyNCkgfCAoKHJlc3VsdCAmIDB4ZmYwMCkgPDwgOCkgfAogICAgICAgICAgICAgICAg
ICgocmVzdWx0ICYgMHhmZjAwMDApID4+IDgpIHwgKChyZXN1bHQgJiAweGZmMDAwMDAwKSA+PiAy
NCk7CkBAIC04MywyNiArNzMsMzcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICAgICAg
cmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogCisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVt
IEFuZE1hc2tTdGF0ZSB7CisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgTm90WWV0RGVj
b2RlZCwKKyAgICAgICAgICAgIERlY29kaW5nLAorICAgICAgICB9OworCisgICAgICAgIC8vIERv
ZXMgdGhlIGFjdHVhbCBkZWNvZGluZy4gIFJldHVybnMgd2hldGhlciBkZWNvZGluZyBzdWNjZWVk
ZWQuCisgICAgICAgIGJvb2wgZGVjb2RlQk1QKFNoYXJlZEJ1ZmZlciogZGF0YSk7CisKICAgICAg
ICAgLy8gQW4gaW5kZXggaW50byB8bV9kYXRhfCByZXByZXNlbnRpbmcgaG93IG11Y2ggd2UndmUg
YWxyZWFkeSBkZWNvZGVkLgogICAgICAgICBzaXplX3QgbV9kZWNvZGVkT2Zmc2V0OwogCiAgICAg
ICAgIC8vIFRoZSBmaWxlIG9mZnNldCBhdCB3aGljaCB0aGUgQk1QIGluZm8gaGVhZGVyIHN0YXJ0
cy4KICAgICAgICAgc2l6ZV90IG1faGVhZGVyT2Zmc2V0OwogCi0gICAgICAgIC8vIFRoZSBmaWxl
IG9mZnNldCBhdCB3aGljaCB0aGUgYWN0dWFsIGltYWdlIGJpdHMgc3RhcnQuICBXaGVuIGRlY29k
aW5nIElDTwotICAgICAgICAvLyBmaWxlcywgdGhpcyBpcyBzZXQgdG8gMCwgc2luY2UgaXQncyBu
b3Qgc3RvcmVkIGFueXdoZXJlIGluIGEgaGVhZGVyOyB0aGUKLSAgICAgICAgLy8gcmVhZGVyIGZ1
bmN0aW9ucyBleHBlY3QgdGhlIGltYWdlIGRhdGEgdG8gc3RhcnQgaW1tZWRpYXRlbHkgYWZ0ZXIg
dGhlCi0gICAgICAgIC8vIGhlYWRlciBhbmQgKGlmIG5lY2Vzc2FyeSkgY29sb3IgdGFibGUuCisg
ICAgICAgIC8vIFRoZSBmaWxlIG9mZnNldCBhdCB3aGljaCB0aGUgYWN0dWFsIGltYWdlIGJpdHMg
c3RhcnQuICBXaGVuIGRlY29kaW5nCisgICAgICAgIC8vIElDTyBmaWxlcywgdGhpcyBpcyBzZXQg
dG8gMCwgc2luY2UgaXQncyBub3Qgc3RvcmVkIGFueXdoZXJlIGluIGEKKyAgICAgICAgLy8gaGVh
ZGVyOyB0aGUgcmVhZGVyIGZ1bmN0aW9ucyBleHBlY3QgdGhlIGltYWdlIGRhdGEgdG8gc3RhcnQK
KyAgICAgICAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGhlYWRlciBhbmQgKGlmIG5lY2Vzc2Fy
eSkgY29sb3IgdGFibGUuCiAgICAgICAgIHNpemVfdCBtX2ltZ0RhdGFPZmZzZXQ7CiAKICAgICAg
ICAgLy8gSUNPcyBzdG9yZSBhIDFicHAgIm1hc2siIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYWlu
IGJpdG1hcCBpbWFnZSBkYXRhCiAgICAgICAgIC8vIChhbmQsIGNvbmZ1c2luZ2x5LCBhZGQgaXRz
IGhlaWdodCB0byB0aGUgYmlIZWlnaHQgdmFsdWUgaW4gdGhlIGluZm8KLSAgICAgICAgLy8gaGVh
ZGVyLCB0aHVzIGRvdWJsaW5nIGl0KS4gIFRoaXMgdmFyaWFibGUgdHJhY2tzIHdoZXRoZXIgd2Ug
aGF2ZSBzdWNoIGEKLSAgICAgICAgLy8gbWFzayBhbmQgaWYgd2UndmUgc3RhcnRlZCBkZWNvZGlu
ZyBpdCB5ZXQuCisgICAgICAgIC8vIGhlYWRlciwgdGh1cyBkb3VibGluZyBpdCkuICBUaGlzIHZh
cmlhYmxlIHRyYWNrcyB3aGV0aGVyIHdlIGhhdmUgc3VjaAorICAgICAgICAvLyBhIG1hc2sgYW5k
IGlmIHdlJ3ZlIHN0YXJ0ZWQgZGVjb2RpbmcgaXQgeWV0LgogICAgICAgICBBbmRNYXNrU3RhdGUg
bV9hbmRNYXNrU3RhdGU7CiAKICAgICBwcml2YXRlOgotICAgICAgICAvLyBUaGUgdmFyaW91cyBC
TVAgY29tcHJlc3Npb24gdHlwZXMuICBXZSBkb24ndCBjdXJyZW50bHkgZGVjb2RlIGFsbCB0aGVz
ZS4KKyAgICAgICAgLy8gVGhlIHZhcmlvdXMgQk1QIGNvbXByZXNzaW9uIHR5cGVzLiAgV2UgZG9u
J3QgY3VycmVudGx5IGRlY29kZSBhbGwKKyAgICAgICAgLy8gdGhlc2UuCiAgICAgICAgIGVudW0g
Q29tcHJlc3Npb25UeXBlIHsKICAgICAgICAgICAgIC8vIFVuaXZlcnNhbCB0eXBlcwogICAgICAg
ICAgICAgUkdCID0gMCwKQEAgLTExNyw4ICsxMTgsOCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAg
ICAgICAgICAgICBSTEUyNCwgICAgICAvLyBTdG9yZWQgaW4gZmlsZSBhcyA0CiAgICAgICAgIH07
CiAKLSAgICAgICAgLy8gVGhlc2UgYXJlIGJhc2VkIG9uIHRoZSBXaW5kb3dzIEJJVE1BUElORk9I
RUFERVIgYW5kIFJHQlRSSVBMRSBzdHJ1Y3RzLAotICAgICAgICAvLyBidXQgd2l0aCB1bm5lY2Vz
c2FyeSBlbnRyaWVzIHJlbW92ZWQuCisgICAgICAgIC8vIFRoZXNlIGFyZSBiYXNlZCBvbiB0aGUg
V2luZG93cyBCSVRNQVBJTkZPSEVBREVSIGFuZCBSR0JUUklQTEUKKyAgICAgICAgLy8gc3RydWN0
cywgYnV0IHdpdGggdW5uZWNlc3NhcnkgZW50cmllcyByZW1vdmVkLgogICAgICAgICBzdHJ1Y3Qg
Qml0bWFwSW5mb0hlYWRlciB7CiAgICAgICAgICAgICB1aW50MzJfdCBiaVNpemU7CiAgICAgICAg
ICAgICBpbnQzMl90IGJpV2lkdGg7CkBAIC0xMzMsMTYgKzEzNCwxNiBAQCBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAgICAgICAgICAgICB1aW50OF90IHJnYlJlZDsKICAgICAgICAgfTsKIAotICAgICAg
ICAvLyBEZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSBCTVAgaW5mbyBoZWFkZXIuICBSZXR1cm5z
IHRydWUgaWYgdGhlIHNpemUgaXMKLSAgICAgICAgLy8gdmFsaWQuCisgICAgICAgIC8vIERldGVy
bWluZXMgdGhlIHNpemUgb2YgdGhlIEJNUCBpbmZvIGhlYWRlci4gIFJldHVybnMgdHJ1ZSBpZiB0
aGUgc2l6ZQorICAgICAgICAvLyBpcyB2YWxpZC4KICAgICAgICAgYm9vbCBnZXRJbmZvSGVhZGVy
U2l6ZShTaGFyZWRCdWZmZXIqIGRhdGEpOwogCi0gICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgQk1Q
IGluZm8gaGVhZGVyLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBpbmZvIGhlYWRlciBjb3VsZCBiZQot
ICAgICAgICAvLyBkZWNvZGVkLgorICAgICAgICAvLyBQcm9jZXNzZXMgdGhlIEJNUCBpbmZvIGhl
YWRlci4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5mbyBoZWFkZXIgY291bGQKKyAgICAgICAgLy8g
YmUgZGVjb2RlZC4KICAgICAgICAgYm9vbCBwcm9jZXNzSW5mb0hlYWRlcihTaGFyZWRCdWZmZXIq
IGRhdGEpOwogCi0gICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgcHJvY2Vzc0luZm9IZWFk
ZXIoKSB3aGljaCBkb2VzIHRoZSBhY3R1YWwgcmVhZGluZyBvZgotICAgICAgICAvLyBoZWFkZXIg
dmFsdWVzIGZyb20gdGhlIGJ5dGUgc3RyZWFtLiAgUmV0dXJucyBmYWxzZSBvbiBlcnJvci4KKyAg
ICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwcm9jZXNzSW5mb0hlYWRlcigpIHdoaWNoIGRv
ZXMgdGhlIGFjdHVhbCByZWFkaW5nCisgICAgICAgIC8vIG9mIGhlYWRlciB2YWx1ZXMgZnJvbSB0
aGUgYnl0ZSBzdHJlYW0uICBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLgogICAgICAgICBib29sIHJl
YWRJbmZvSGVhZGVyKFNoYXJlZEJ1ZmZlciogZGF0YSk7CiAKICAgICAgICAgLy8gUmV0dXJucyB0
cnVlIGlmIHRoaXMgaXMgYSBXaW5kb3dzIFY0KyBCTVAuCkBAIC0xNTUsMTIgKzE1NiwxMyBAQCBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIC8vIFJldHVybnMgZmFsc2UgaWYgY29uc2lzdGVu
Y3kgZXJyb3JzIGFyZSBmb3VuZCBpbiB0aGUgaW5mbyBoZWFkZXIuCiAgICAgICAgIGJvb2wgaXNJ
bmZvSGVhZGVyVmFsaWQoKSBjb25zdDsKIAotICAgICAgICAvLyBGb3IgQklfQklURklFTERTIGlt
YWdlcywgaW5pdGlhbGl6ZXMgdGhlIG1fYml0TWFza3NbXSBhbmQgbV9iaXRPZmZzZXRzW10KLSAg
ICAgICAgLy8gYXJyYXlzLiAgcHJvY2Vzc0luZm9IZWFkZXIoKSB3aWxsIGluaXRpYWxpemUgdGhl
c2UgZm9yIG90aGVyIGNvbXByZXNzaW9uCi0gICAgICAgIC8vIHR5cGVzIHdoZXJlIG5lZWRlZC4K
KyAgICAgICAgLy8gRm9yIEJJX0JJVEZJRUxEUyBpbWFnZXMsIGluaXRpYWxpemVzIHRoZSBtX2Jp
dE1hc2tzW10gYW5kCisgICAgICAgIC8vIG1fYml0T2Zmc2V0c1tdIGFycmF5cy4gIHByb2Nlc3NJ
bmZvSGVhZGVyKCkgd2lsbCBpbml0aWFsaXplIHRoZXNlIGZvcgorICAgICAgICAvLyBvdGhlciBj
b21wcmVzc2lvbiB0eXBlcyB3aGVyZSBuZWVkZWQuCiAgICAgICAgIGJvb2wgcHJvY2Vzc0JpdG1h
c2tzKFNoYXJlZEJ1ZmZlciogZGF0YSk7CiAKLSAgICAgICAgLy8gRm9yIHBhbGV0dGVkIGltYWdl
cywgYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyB0aGUgbV9jb2xvclRhYmxlW10gYXJyYXkuCisg
ICAgICAgIC8vIEZvciBwYWxldHRlZCBpbWFnZXMsIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMg
dGhlIG1fY29sb3JUYWJsZVtdCisgICAgICAgIC8vIGFycmF5LgogICAgICAgICBib29sIHByb2Nl
c3NDb2xvclRhYmxlKFNoYXJlZEJ1ZmZlciogZGF0YSk7CiAKICAgICAgICAgLy8gUHJvY2Vzc2Vz
IGFuIFJMRS1lbmNvZGVkIGltYWdlLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBlbnRpcmUgaW1hZ2Ug
d2FzCkBAIC0xNzIsMTQgKzE3NCwxNSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIC8v
ICAgICBwcm9jZXNzIHxudW1QaXhlbHN8IHBpeGVscyBvbiB0aGUgY3VycmVudCByb3c7IHJldHVy
bnMgdHJ1ZSBvbgogICAgICAgICAvLyAgICAgc3VjY2Vzcy4KICAgICAgICAgLy8gICAqIGluUkxF
ID0gZmFsc2U6IHRoZSBkYXRhIGlzIGluc2lkZSBhIG5vbi1STEUtZW5jb2RlZCBiaXRtYXAuCi0g
ICAgICAgIC8vICAgICB8bnVtUGl4ZWxzfCBpcyBpZ25vcmVkLiAgRXhwZWN0cyB8bV9jb29yZHwg
dG8gcG9pbnQgYXQgdGhlIGJlZ2lubmluZwotICAgICAgICAvLyAgICAgb2YgdGhlIG5leHQgcm93
IHRvIGJlIGRlY29kZWQuICBUcmllcyB0byBwcm9jZXNzIGFzIG1hbnkgY29tcGxldGUKLSAgICAg
ICAgLy8gICAgIHJvd3MgYXMgcG9zc2libGUuICBSZXR1cm5zIHRydWUgaWYgdGhlIHdob2xlIGlt
YWdlIHdhcyBkZWNvZGVkLgorICAgICAgICAvLyAgICAgfG51bVBpeGVsc3wgaXMgaWdub3JlZC4g
IEV4cGVjdHMgfG1fY29vcmR8IHRvIHBvaW50IGF0IHRoZQorICAgICAgICAvLyAgICAgYmVnaW5u
aW5nIG9mIHRoZSBuZXh0IHJvdyB0byBiZSBkZWNvZGVkLiAgVHJpZXMgdG8gcHJvY2VzcyBhcwor
ICAgICAgICAvLyAgICAgbWFueSBjb21wbGV0ZSByb3dzIGFzIHBvc3NpYmxlLiAgUmV0dXJucyB0
cnVlIGlmIHRoZSB3aG9sZSBpbWFnZQorICAgICAgICAvLyAgICAgd2FzIGRlY29kZWQuCiAgICAg
ICAgIGJvb2wgcHJvY2Vzc05vblJMRURhdGEoU2hhcmVkQnVmZmVyKiBkYXRhLCBib29sIGluUkxF
LCBpbnQgbnVtUGl4ZWxzKTsKIAogICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJl
bnQgeS1jb29yZGluYXRlIHBsdXMgfG51bVJvd3N8IHdvdWxkIGJlIHBhc3QKLSAgICAgICAgLy8g
dGhlIGVuZCBvZiB0aGUgaW1hZ2UuICBIZXJlICJwbHVzIiBtZWFucyAidG93YXJkIHRoZSBlbmQg
b2YgdGhlIGltYWdlIiwKLSAgICAgICAgLy8gc28gZG93bndhcmRzIGZvciBtX2lzVG9wRG93biBp
bWFnZXMgYW5kIHVwd2FyZHMgb3RoZXJ3aXNlLgorICAgICAgICAvLyB0aGUgZW5kIG9mIHRoZSBp
bWFnZS4gIEhlcmUgInBsdXMiIG1lYW5zICJ0b3dhcmQgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAg
Ly8gaW1hZ2UiLCBzbyBkb3dud2FyZHMgZm9yIG1faXNUb3BEb3duIGltYWdlcyBhbmQgdXB3YXJk
cyBvdGhlcndpc2UuCiAgICAgICAgIGlubGluZSBib29sIHBhc3RFbmRPZkltYWdlKGludCBudW1S
b3dzKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbV9pc1RvcERvd24KQEAgLTE5MCwy
MiArMTkzLDIxIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgLy8gUmV0dXJucyB0aGUg
cGl4ZWwgZGF0YSBmb3IgdGhlIGN1cnJlbnQgWCBjb29yZGluYXRlIGluIGEgdWludDMyX3QuCiAg
ICAgICAgIC8vIEFzc3VtZXMgbV9kZWNvZGVkT2Zmc2V0IGhhcyBiZWVuIHNldCB0byB0aGUgYmVn
aW5uaW5nIG9mIHRoZSBjdXJyZW50CiAgICAgICAgIC8vIHJvdy4KLSAgICAgICAgLy8gTk9URTog
T25seSBhcyBtYW55IGJ5dGVzIG9mIHRoZSByZXR1cm4gdmFsdWUgYXMgYXJlIG5lZWRlZCB0byBo
b2xkIHRoZQotICAgICAgICAvLyBwaXhlbCBkYXRhIHdpbGwgYWN0dWFsbHkgYmUgc2V0LgorICAg
ICAgICAvLyBOT1RFOiBPbmx5IGFzIG1hbnkgYnl0ZXMgb2YgdGhlIHJldHVybiB2YWx1ZSBhcyBh
cmUgbmVlZGVkIHRvIGhvbGQKKyAgICAgICAgLy8gdGhlIHBpeGVsIGRhdGEgd2lsbCBhY3R1YWxs
eSBiZSBzZXQuCiAgICAgICAgIGlubGluZSB1aW50MzJfdCByZWFkQ3VycmVudFBpeGVsKFNoYXJl
ZEJ1ZmZlciogZGF0YSwgaW50IGJ5dGVzUGVyUGl4ZWwpIGNvbnN0CiAgICAgICAgIHsKLSAgICAg
ICAgICAgIGNvbnN0IGludCBhZGRpdGlvbmFsT2Zmc2V0ID0gbV9jb29yZC54KCkgKiBieXRlc1Bl
clBpeGVsOworICAgICAgICAgICAgY29uc3QgaW50IG9mZnNldCA9IG1fZGVjb2RlZE9mZnNldCAr
IG1fY29vcmQueCgpICogYnl0ZXNQZXJQaXhlbDsKICAgICAgICAgICAgIHN3aXRjaCAoYnl0ZXNQ
ZXJQaXhlbCkgewogICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHJldHVybiBy
ZWFkVWludDE2KGRhdGEsIGFkZGl0aW9uYWxPZmZzZXQpOworICAgICAgICAgICAgICAgIHJldHVy
biByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAKICAgICAgICAgICAgIGNhc2UgMzogewotICAg
ICAgICAgICAgICAgIC8vIEl0IGRvZXNuJ3QgbWF0dGVyIHRoYXQgd2UgbmV2ZXIgc2V0IHRoZSBt
b3N0IHNpZ25pZmljYW50IGJ5dGUgb2YKLSAgICAgICAgICAgICAgICAvLyB0aGUgcmV0dXJuIHZh
bHVlIGhlcmUgaW4gbGl0dGxlLWVuZGlhbiBtb2RlLCB0aGUgY2FsbGVyIHdvbid0Ci0gICAgICAg
ICAgICAgICAgLy8gcmVhZCBpdC4KKyAgICAgICAgICAgICAgICAvLyBJdCBkb2Vzbid0IG1hdHRl
ciB0aGF0IHdlIG5ldmVyIHNldCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlCisgICAgICAgICAg
ICAgICAgLy8gb2YgdGhlIHJldHVybiB2YWx1ZSBoZXJlIGluIGxpdHRsZS1lbmRpYW4gbW9kZSwg
dGhlIGNhbGxlcgorICAgICAgICAgICAgICAgIC8vIHdvbid0IHJlYWQgaXQuCiAgICAgICAgICAg
ICAgICAgdWludDMyX3QgcGl4ZWw7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZwaXhlbCwKLSAg
ICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQgKyBhZGRp
dGlvbmFsT2Zmc2V0XSwgMyk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZwaXhlbCwgJmRhdGEt
PmRhdGEoKVtvZmZzZXRdLCAzKTsKICAgICAgICAgI2lmIFBMQVRGT1JNKEJJR19FTkRJQU4pCiAg
ICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHBpeGVsICYgMHhmZjAwKSA8PCA4KSB8ICgocGl4ZWwg
JiAweGZmMDAwMCkgPj4gOCkgfAogICAgICAgICAgICAgICAgICAgICAoKHBpeGVsICYgMHhmZjAw
MDAwMCkgPj4gMjQpOwpAQCAtMjE0LDcgKzIxNiw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAg
ICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIHJldHVy
biByZWFkVWludDMyKGRhdGEsIGFkZGl0aW9uYWxPZmZzZXQpOworICAgICAgICAgICAgICAgIHJl
dHVybiByZWFkVWludDMyKGRhdGEsIG9mZnNldCk7CiAKICAgICAgICAgICAgIGRlZmF1bHQ6CiAg
ICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CkBAIC0yMjIsMTIgKzIyNCwxMiBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAg
ICAvLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZGVzaXJlZCBjb21wb25lbnQgKDAsIDEsIDIs
IDMgPT0gUiwgRywgQiwgQSkgaW4KLSAgICAgICAgLy8gdGhlIGdpdmVuIHBpeGVsIGRhdGEuCisg
ICAgICAgIC8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBkZXNpcmVkIGNvbXBvbmVudCAoMCwg
MSwgMiwgMyA9PSBSLCBHLCBCLCBBKQorICAgICAgICAvLyBpbiB0aGUgZ2l2ZW4gcGl4ZWwgZGF0
YS4KICAgICAgICAgaW5saW5lIHVuc2lnbmVkIGdldENvbXBvbmVudCh1aW50MzJfdCBwaXhlbCwg
aW50IGNvbXBvbmVudCkgY29uc3QKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICgocGl4
ZWwgJiBtX2JpdE1hc2tzW2NvbXBvbmVudF0pID4+IG1fYml0U2hpZnRzUmlnaHRbY29tcG9uZW50
XSkKLSAgICAgICAgICAgICAgICA8PCBtX2JpdFNoaWZ0c0xlZnRbY29tcG9uZW50XTsKKyAgICAg
ICAgICAgIHJldHVybiAoKHBpeGVsICYgbV9iaXRNYXNrc1tjb21wb25lbnRdKSA+PgorICAgICAg
ICAgICAgICAgIG1fYml0U2hpZnRzUmlnaHRbY29tcG9uZW50XSkgPDwgbV9iaXRTaGlmdHNMZWZ0
W2NvbXBvbmVudF07CiAgICAgICAgIH0KIAogICAgICAgICBpbmxpbmUgdW5zaWduZWQgZ2V0QWxw
aGEodWludDMyX3QgcGl4ZWwpIGNvbnN0CkBAIC0yNDAsNDkgKzI0Miw1NyBAQCBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBTZXRzIHRoZSBjdXJyZW50IHBpeGVs
IHRvIHRoZSBjb2xvciBnaXZlbiBieSB8Y29sb3JJbmRleHwuICBUaGlzIGFsc28KLSAgICAgICAg
Ly8gaW5jcmVtZW50cyB0aGUgcmVsZXZhbnQgbG9jYWwgdmFyaWFibGVzIHRvIG1vdmUgdGhlIGN1
cnJlbnQgcGl4ZWwgcmlnaHQKLSAgICAgICAgLy8gYnkgb25lLgorICAgICAgICAvLyBpbmNyZW1l
bnRzIHRoZSByZWxldmFudCBsb2NhbCB2YXJpYWJsZXMgdG8gbW92ZSB0aGUgY3VycmVudCBwaXhl
bAorICAgICAgICAvLyByaWdodCBieSBvbmUuCiAgICAgICAgIGlubGluZSB2b2lkIHNldEkoc2l6
ZV90IGNvbG9ySW5kZXgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHNldFJHQkEobV9jb2xvclRh
YmxlW2NvbG9ySW5kZXhdLnJnYlJlZCwgbV9jb2xvclRhYmxlW2NvbG9ySW5kZXhdLnJnYkdyZWVu
LAorICAgICAgICAgICAgc2V0UkdCQShtX2NvbG9yVGFibGVbY29sb3JJbmRleF0ucmdiUmVkLAor
ICAgICAgICAgICAgICAgICAgICBtX2NvbG9yVGFibGVbY29sb3JJbmRleF0ucmdiR3JlZW4sCiAg
ICAgICAgICAgICAgICAgICAgIG1fY29sb3JUYWJsZVtjb2xvckluZGV4XS5yZ2JCbHVlLCAweGZm
KTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIExpa2Ugc2V0SSgpLCBidXQgd2l0aCB0aGUgaW5k
aXZpZHVhbCBjb21wb25lbnQgdmFsdWVzIHNwZWNpZmllZC4KLSAgICAgICAgaW5saW5lIHZvaWQg
c2V0UkdCQSh1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLCB1bnNpZ25lZCBibHVlLCB1bnNp
Z25lZCBhbHBoYSkKKyAgICAgICAgaW5saW5lIHZvaWQgc2V0UkdCQSh1bnNpZ25lZCByZWQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZ3JlZW4sCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdW5zaWduZWQgYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB1bnNpZ25lZCBhbHBoYSkKICAgICAgICAgewogICAgICAgICAgICAgbV9mcmFtZUJ1ZmZlckNh
Y2hlLmZpcnN0KCkuc2V0UkdCQShtX2Nvb3JkLngoKSwgbV9jb29yZC55KCksIHJlZCwgZ3JlZW4s
IGJsdWUsIGFscGhhKTsKICAgICAgICAgICAgIG1fY29vcmQubW92ZSgxLCAwKTsKICAgICAgICAg
fQogCiAgICAgICAgIC8vIEZpbGxzIHBpeGVscyBmcm9tIHRoZSBjdXJyZW50IFgtY29vcmRpbmF0
ZSB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsCi0gICAgICAgIC8vIHxlbmRDb29yZHwgd2l0aCB0
aGUgY29sb3IgZ2l2ZW4gYnkgdGhlIGluZGl2aWR1YWwgY29tcG9uZW50cy4gIFRoaXMgYWxzbwot
ICAgICAgICAvLyBpbmNyZW1lbnRzIHRoZSByZWxldmFudCBsb2NhbCB2YXJpYWJsZXMgdG8gbW92
ZSB0aGUgY3VycmVudCBwaXhlbCByaWdodAotICAgICAgICAvLyB0byB8ZW5kQ29vcmR8LgotICAg
ICAgICBpbmxpbmUgdm9pZCBmaWxsUkdCQShpbnQgZW5kQ29vcmQsIHVuc2lnbmVkIHJlZCwgdW5z
aWduZWQgZ3JlZW4sIHVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIGFscGhhKQorICAgICAgICAvLyB8
ZW5kQ29vcmR8IHdpdGggdGhlIGNvbG9yIGdpdmVuIGJ5IHRoZSBpbmRpdmlkdWFsIGNvbXBvbmVu
dHMuICBUaGlzCisgICAgICAgIC8vIGFsc28gaW5jcmVtZW50cyB0aGUgcmVsZXZhbnQgbG9jYWwg
dmFyaWFibGVzIHRvIG1vdmUgdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gcGl4ZWwgcmlnaHQgdG8g
fGVuZENvb3JkfC4KKyAgICAgICAgaW5saW5lIHZvaWQgZmlsbFJHQkEoaW50IGVuZENvb3JkLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZWQsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB1bnNpZ25lZCBibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25l
ZCBhbHBoYSkKICAgICAgICAgewogICAgICAgICAgICAgd2hpbGUgKG1fY29vcmQueCgpIDwgZW5k
Q29vcmQpCiAgICAgICAgICAgICAgICAgc2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7
CiAgICAgICAgIH0KIAotICAgICAgICAvLyBSZXNldHMgdGhlIHJlbGV2YW50IGxvY2FsIHZhcmlh
YmxlcyB0byBzdGFydCBkcmF3aW5nIGF0IHRoZSBsZWZ0IGVkZ2Ugb2YKLSAgICAgICAgLy8gdGhl
ICJuZXh0IiByb3csIHdoZXJlICJuZXh0IiBpcyBhYm92ZSBvciBiZWxvdyB0aGUgY3VycmVudCBy
b3cgZGVwZW5kaW5nCi0gICAgICAgIC8vIG9uIHRoZSB2YWx1ZSBvZiB8bV9pc1RvcERvd258Lgor
ICAgICAgICAvLyBSZXNldHMgdGhlIHJlbGV2YW50IGxvY2FsIHZhcmlhYmxlcyB0byBzdGFydCBk
cmF3aW5nIGF0IHRoZSBsZWZ0IGVkZ2UKKyAgICAgICAgLy8gb2YgdGhlICJuZXh0IiByb3csIHdo
ZXJlICJuZXh0IiBpcyBhYm92ZSBvciBiZWxvdyB0aGUgY3VycmVudCByb3cKKyAgICAgICAgLy8g
ZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB8bV9pc1RvcERvd258LgogICAgICAgICB2b2lkIG1v
dmVCdWZmZXJUb05leHRSb3coKTsKIAogICAgICAgICAvLyBUaGUgQk1QIGluZm8gaGVhZGVyLgog
ICAgICAgICBCaXRtYXBJbmZvSGVhZGVyIG1faW5mb0hlYWRlcjsKIAotICAgICAgICAvLyBUcnVl
IGlmIHRoaXMgaXMgYW4gT1MvMiAxLnggKGFrYSBXaW5kb3dzIDIueCkgQk1QLiAgVGhlIHN0cnVj
dCBsYXlvdXRzCi0gICAgICAgIC8vIGZvciB0aGlzIHR5cGUgb2YgQk1QIGFyZSBzbGlnaHRseSBk
aWZmZXJlbnQgZnJvbSB0aGUgbGF0ZXIsIG1vcmUgY29tbW9uCi0gICAgICAgIC8vIGZvcm1hdHMu
CisgICAgICAgIC8vIFRydWUgaWYgdGhpcyBpcyBhbiBPUy8yIDEueCAoYWthIFdpbmRvd3MgMi54
KSBCTVAuICBUaGUgc3RydWN0CisgICAgICAgIC8vIGxheW91dHMgZm9yIHRoaXMgdHlwZSBvZiBC
TVAgYXJlIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIHRoZSBsYXRlciwKKyAgICAgICAgLy8gbW9y
ZSBjb21tb24gZm9ybWF0cy4KICAgICAgICAgYm9vbCBtX2lzT1MyMXg7CiAKICAgICAgICAgLy8g
VHJ1ZSBpZiB0aGlzIGlzIGFuIE9TLzIgMi54IEJNUC4gIFRoZSBtZWFuaW5ncyBvZiBjb21wcmVz
c2lvbiB0eXBlcyAzCiAgICAgICAgIC8vIGFuZCA0IGZvciB0aGlzIHR5cGUgb2YgQk1QIGRpZmZl
ciBmcm9tIFdpbmRvd3MgVjMrIEJNUHMuCiAgICAgICAgIC8vCi0gICAgICAgIC8vIFRoaXMgd2ls
bCBiZSBmYWxzZWx5IG5lZ2F0aXZlIGluIHNvbWUgY2FzZXMsIGJ1dCBvbmx5IG9uZXMgd2hlcmUg
dGhlIHdheQotICAgICAgICAvLyB3ZSBtaXNpbnRlcnByZXQgdGhlIGRhdGEgaXMgaXJyZWxldmFu
dC4KKyAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGZhbHNlbHkgbmVnYXRpdmUgaW4gc29tZSBjYXNl
cywgYnV0IG9ubHkgb25lcyB3aGVyZSB0aGUKKyAgICAgICAgLy8gd2F5IHdlIG1pc2ludGVycHJl
dCB0aGUgZGF0YSBpcyBpcnJlbGV2YW50LgogICAgICAgICBib29sIG1faXNPUzIyeDsKIAogICAg
ICAgICAvLyBUcnVlIGlmIHRoZSBCTVAgaXMgbm90IHZlcnRpY2FsbHkgZmxpcHBlZCwgdGhhdCBp
cywgdGhlIGZpcnN0IGxpbmUgb2YKQEAgLTI5MywxNSArMzAzLDE3IEBAIG5hbWVzcGFjZSBXZWJD
b3JlIHsKICAgICAgICAgYm9vbCBtX25lZWRUb1Byb2Nlc3NCaXRtYXNrczsKICAgICAgICAgYm9v
bCBtX25lZWRUb1Byb2Nlc3NDb2xvclRhYmxlOwogCi0gICAgICAgIC8vIE1hc2tzL29mZnNldHMg
Zm9yIHRoZSBjb2xvciB2YWx1ZXMgZm9yIG5vbi1wYWxldHRlIGZvcm1hdHMuICBUaGVzZSBhcmUK
LSAgICAgICAgLy8gYml0d2lzZSwgd2l0aCBhcnJheSBlbnRyaWVzIDAsIDEsIDIsIDMgY29ycmVz
cG9uZGluZyB0byBSLCBHLCBCLCBBLgorICAgICAgICAvLyBNYXNrcy9vZmZzZXRzIGZvciB0aGUg
Y29sb3IgdmFsdWVzIGZvciBub24tcGFsZXR0ZSBmb3JtYXRzLiAgVGhlc2UKKyAgICAgICAgLy8g
YXJlIGJpdHdpc2UsIHdpdGggYXJyYXkgZW50cmllcyAwLCAxLCAyLCAzIGNvcnJlc3BvbmRpbmcg
dG8gUiwgRywgQiwKKyAgICAgICAgLy8gQS4KICAgICAgICAgLy8KICAgICAgICAgLy8gVGhlIHJp
Z2h0L2xlZnQgc2hpZnQgdmFsdWVzIGFyZSBtZWFudCB0byBiZSBhcHBsaWVkIGFmdGVyIHRoZSBt
YXNrcy4KLSAgICAgICAgLy8gV2UgbmVlZCB0byByaWdodCBzaGlmdCB0byBjb21wZW5zYXRlIGZv
ciB0aGUgYml0ZmllbGRzJyBvZmZzZXRzIGludG8gdGhlCi0gICAgICAgIC8vIDMyIGJpdHMgb2Yg
cGl4ZWwgZGF0YSwgYW5kIGxlZnQgc2hpZnQgdG8gc2NhbGUgdGhlIGNvbG9yIHZhbHVlcyB1cCBm
b3IKLSAgICAgICAgLy8gZmllbGRzIHdpdGggbGVzcyB0aGFuIDggYml0cyBvZiBwcmVjaXNpb24u
ICBTYWRseSwgd2UgY2FuJ3QganVzdCBjb21iaW5lCi0gICAgICAgIC8vIHRoZXNlIGludG8gb25l
IHNoaWZ0IHZhbHVlIGJlY2F1c2UgdGhlIG5ldCBzaGlmdCBhbW91bnQgY291bGQgZ28gZWl0aGVy
Ci0gICAgICAgIC8vIGRpcmVjdGlvbi4gIChJZiBvbmx5ICI8PCAteCIgd2VyZSBlcXVpdmFsZW50
IHRvICI+PiB4Ii4uLikKKyAgICAgICAgLy8gV2UgbmVlZCB0byByaWdodCBzaGlmdCB0byBjb21w
ZW5zYXRlIGZvciB0aGUgYml0ZmllbGRzJyBvZmZzZXRzIGludG8KKyAgICAgICAgLy8gdGhlIDMy
IGJpdHMgb2YgcGl4ZWwgZGF0YSwgYW5kIGxlZnQgc2hpZnQgdG8gc2NhbGUgdGhlIGNvbG9yIHZh
bHVlcworICAgICAgICAvLyB1cCBmb3IgZmllbGRzIHdpdGggbGVzcyB0aGFuIDggYml0cyBvZiBw
cmVjaXNpb24uICBTYWRseSwgd2UgY2FuJ3QKKyAgICAgICAgLy8ganVzdCBjb21iaW5lIHRoZXNl
IGludG8gb25lIHNoaWZ0IHZhbHVlIGJlY2F1c2UgdGhlIG5ldCBzaGlmdCBhbW91bnQKKyAgICAg
ICAgLy8gY291bGQgZ28gZWl0aGVyIGRpcmVjdGlvbi4gIChJZiBvbmx5ICI8PCAteCIgd2VyZSBl
cXVpdmFsZW50IHRvCisgICAgICAgIC8vICI+PiB4Ii4uLikKICAgICAgICAgdWludDMyX3QgbV9i
aXRNYXNrc1s0XTsKICAgICAgICAgaW50IG1fYml0U2hpZnRzUmlnaHRbNF07CiAgICAgICAgIGlu
dCBtX2JpdFNoaWZ0c0xlZnRbNF07CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29k
ZXJzL2ljby9JQ09JbWFnZURlY29kZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vaW1hZ2UtZGVjb2RlcnMvaWNvL0lDT0ltYWdlRGVjb2Rlci5jcHAJKHJldmlzaW9uIDQ0ODMy
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVy
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzksNiArMzksMjUgQEAgbmFtZXNwYWNlIFdlYkNvcmUg
ewogc3RhdGljIGNvbnN0IHNpemVfdCBzaXplT2ZEaXJlY3RvcnkgPSA2Owogc3RhdGljIGNvbnN0
IHNpemVfdCBzaXplT2ZEaXJFbnRyeSA9IDE2OwogCitJQ09JbWFnZURlY29kZXI6OklDT0ltYWdl
RGVjb2Rlcihjb25zdCBJbnRTaXplJiBwcmVmZXJyZWRJY29uU2l6ZSkKKyAgICA6IEJNUEltYWdl
UmVhZGVyKCkKKyAgICAsIG1fcHJlZmVycmVkSWNvblNpemUocHJlZmVycmVkSWNvblNpemUpCisg
ICAgLCBtX2ltYWdlVHlwZShVbmtub3duKQoreworICAgIG1fYW5kTWFza1N0YXRlID0gTm90WWV0
RGVjb2RlZDsKK30KKworYm9vbCBJQ09JbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpCit7
CisgICAgcmV0dXJuIChtX2ltYWdlVHlwZSA9PSBQTkcpID8KKyAgICAgICAgbV9wbmdEZWNvZGVy
LmlzU2l6ZUF2YWlsYWJsZSgpIDogQk1QSW1hZ2VSZWFkZXI6OmlzU2l6ZUF2YWlsYWJsZSgpOwor
fQorCitJbnRTaXplIElDT0ltYWdlRGVjb2Rlcjo6c2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IChtX2ltYWdlVHlwZSA9PSBQTkcpID8gbV9wbmdEZWNvZGVyLnNpemUoKSA6IEJNUEltYWdlUmVh
ZGVyOjpzaXplKCk7Cit9CisKIHZvaWQgSUNPSW1hZ2VEZWNvZGVyOjpkZWNvZGVJbWFnZShTaGFy
ZWRCdWZmZXIqIGRhdGEpCiB7CiAgICAgLy8gUmVhZCBhbmQgcHJvY2VzcyBkaXJlY3RvcnkuCkBA
IC00NiwxOCArNjUsMTQgQEAgdm9pZCBJQ09JbWFnZURlY29kZXI6OmRlY29kZUltYWdlKFNoYXJl
ZAogICAgICAgICByZXR1cm47CiAKICAgICAvLyBSZWFkIGFuZCBwcm9jZXNzIGRpcmVjdG9yeSBl
bnRyaWVzLgotICAgIGlmICgobV9kZWNvZGVkT2Zmc2V0IDwgKHNpemVPZkRpcmVjdG9yeSArICht
X2RpcmVjdG9yeS5pZENvdW50ICogc2l6ZU9mRGlyRW50cnkpKSkKKyAgICBpZiAoKG1fZGVjb2Rl
ZE9mZnNldCA8CisgICAgICAgICAgICAoc2l6ZU9mRGlyZWN0b3J5ICsgKG1fZGlyZWN0b3J5Lmlk
Q291bnQgKiBzaXplT2ZEaXJFbnRyeSkpKQogICAgICAgICAmJiAhcHJvY2Vzc0RpcmVjdG9yeUVu
dHJpZXMoZGF0YSkpCiAgICAgICAgIHJldHVybjsKIAotICAgIC8vIENoZWNrIGlmIHRoaXMgZW50
cnkgaXMgYSBQTkc7IHdlIG5lZWQgNCBieXRlcyB0byBjaGVjayB0aGUgbWFnaWMgbnVtYmVyLgot
ICAgIGlmIChtX2ltYWdlVHlwZSA9PSBVbmtub3duKSB7Ci0gICAgICAgIGlmIChkYXRhLT5zaXpl
KCkgPCAobV9kaXJFbnRyeS5kd0ltYWdlT2Zmc2V0ICsgNCkpCi0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIG1faW1hZ2VUeXBlID0KLSAgICAgICAgICAgIHN0cm5jbXAoJmRhdGEtPmRhdGEo
KVttX2RpckVudHJ5LmR3SW1hZ2VPZmZzZXRdLCAiXHg4OVBORyIsIDQpID8KLSAgICAgICAgICAg
IEJNUCA6IFBORzsKLSAgICB9CisgICAgLy8gR2V0IHRoZSBpbWFnZSB0eXBlLgorICAgIGlmICgo
bV9pbWFnZVR5cGUgPT0gVW5rbm93bikgJiYgIXByb2Nlc3NJbWFnZVR5cGUoZGF0YSkpCisgICAg
ICAgIHJldHVybjsKIAogICAgIC8vIERlY29kZSBzZWxlY3RlZCBlbnRyeS4KICAgICBpZiAobV9p
bWFnZVR5cGUgPT0gUE5HKQpAQCAtODAsMjUgKzk1LDE0IEBAIFJHQkEzMkJ1ZmZlciogSUNPSW1h
Z2VEZWNvZGVyOjpmcmFtZUJ1ZmYKICAgICAgICAgQk1QSW1hZ2VSZWFkZXI6OmZyYW1lQnVmZmVy
QXRJbmRleCgwKTsKIH0KIAotYm9vbCBJQ09JbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgp
Ci17Ci0gICAgcmV0dXJuIChtX2ltYWdlVHlwZSA9PSBQTkcpID8gbV9wbmdEZWNvZGVyLmlzU2l6
ZUF2YWlsYWJsZSgpIDoKLSAgICAgICAgQk1QSW1hZ2VSZWFkZXI6OmlzU2l6ZUF2YWlsYWJsZSgp
OwotfQotCi1JbnRTaXplIElDT0ltYWdlRGVjb2Rlcjo6c2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIChtX2ltYWdlVHlwZSA9PSBQTkcpID8gbV9wbmdEZWNvZGVyLnNpemUoKSA6IEJNUEltYWdl
UmVhZGVyOjpzaXplKCk7Ci19Ci0KIGJvb2wgSUNPSW1hZ2VEZWNvZGVyOjpwcm9jZXNzRGlyZWN0
b3J5KFNoYXJlZEJ1ZmZlciogZGF0YSkKIHsKICAgICAvLyBSZWFkIGRpcmVjdG9yeS4KICAgICBB
U1NFUlQoIW1fZGVjb2RlZE9mZnNldCk7CiAgICAgaWYgKGRhdGEtPnNpemUoKSA8IHNpemVPZkRp
cmVjdG9yeSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNvbnN0IHVpbnQxNl90IGZpbGVU
eXBlID0gcmVhZFVpbnQxNihkYXRhLCAyKTsKLSAgICBtX2RpcmVjdG9yeS5pZENvdW50ID0gcmVh
ZFVpbnQxNihkYXRhLCA0KTsKKyAgICBjb25zdCB1aW50MTZfdCBmaWxlVHlwZSA9IHJlYWRVaW50
MTYoZGF0YSwgbV9kZWNvZGVkT2Zmc2V0ICsgMik7CisgICAgbV9kaXJlY3RvcnkuaWRDb3VudCA9
IHJlYWRVaW50MTYoZGF0YSwgbV9kZWNvZGVkT2Zmc2V0ICsgNCk7CiAgICAgbV9kZWNvZGVkT2Zm
c2V0ID0gc2l6ZU9mRGlyZWN0b3J5OwogCiAgICAgLy8gU2VlIGlmIHRoaXMgaXMgYW4gaWNvbiBm
aWxldHlwZSB3ZSB1bmRlcnN0YW5kLCBhbmQgbWFrZSBzdXJlIHdlIGhhdmUgYXQKQEAgLTEwOSwx
NyArMTEzLDE4IEBAIGJvb2wgSUNPSW1hZ2VEZWNvZGVyOjpwcm9jZXNzRGlyZWN0b3J5KFMKICAg
ICB9OwogICAgIGlmICgoKGZpbGVUeXBlICE9IElDT04pICYmIChmaWxlVHlwZSAhPSBDVVJTT1Ip
KSB8fAogICAgICAgICAgICAgKG1fZGlyZWN0b3J5LmlkQ291bnQgPT0gMCkpCi0gICAgICAgIG1f
ZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgc2V0RmFpbGVkKCk7CiAKLSAgICByZXR1cm4gIW1fZmFp
bGVkOworICAgIHJldHVybiAhZmFpbGVkKCk7CiB9CiAKIGJvb2wgSUNPSW1hZ2VEZWNvZGVyOjpw
cm9jZXNzRGlyZWN0b3J5RW50cmllcyhTaGFyZWRCdWZmZXIqIGRhdGEpCiB7CiAgICAgLy8gUmVh
ZCBkaXJlY3RvcnkgZW50cmllcy4KICAgICBBU1NFUlQobV9kZWNvZGVkT2Zmc2V0ID09IHNpemVP
ZkRpcmVjdG9yeSk7Ci0gICAgaWYgKChtX2RlY29kZWRPZmZzZXQgPiBkYXRhLT5zaXplKCkpIHx8
IChkYXRhLT5zaXplKCkgLSBtX2RlY29kZWRPZmZzZXQpIDwKLSAgICAgICAgICAgIChtX2RpcmVj
dG9yeS5pZENvdW50ICogc2l6ZU9mRGlyRW50cnkpKQorICAgIGlmICgobV9kZWNvZGVkT2Zmc2V0
ID4gZGF0YS0+c2l6ZSgpKQorICAgICAgICB8fCAoKGRhdGEtPnNpemUoKSAtIG1fZGVjb2RlZE9m
ZnNldCkgPAorICAgICAgICAgICAgKG1fZGlyZWN0b3J5LmlkQ291bnQgKiBzaXplT2ZEaXJFbnRy
eSkpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2Rp
cmVjdG9yeS5pZENvdW50OyArK2kpIHsKICAgICAgICAgY29uc3QgSWNvbkRpcmVjdG9yeUVudHJ5
IGRpckVudHJ5ID0gcmVhZERpcmVjdG9yeUVudHJ5KGRhdGEpOwpAQCAtMTMzLDcgKzEzOCw3IEBA
IGJvb2wgSUNPSW1hZ2VEZWNvZGVyOjpwcm9jZXNzRGlyZWN0b3J5RW4KICAgICAvLyBleGFtaW5l
IHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBpbWFnZSBkYXRhKS4KICAgICBpZiAoKG1fZGlyRW50
cnkuZHdJbWFnZU9mZnNldCA8IG1fZGVjb2RlZE9mZnNldCkgfHwKICAgICAgICAgICAgICgobV9k
aXJFbnRyeS5kd0ltYWdlT2Zmc2V0ICsgNCkgPCBtX2RpckVudHJ5LmR3SW1hZ2VPZmZzZXQpKSB7
Ci0gICAgICBtX2ZhaWxlZCA9IHRydWU7CisgICAgICBzZXRGYWlsZWQoKTsKICAgICAgIHJldHVy
biBmYWxzZTsKICAgICB9CiAKQEAgLTE1Myw4ICsxNTgsOCBAQCBJQ09JbWFnZURlY29kZXI6Oklj
b25EaXJlY3RvcnlFbnRyeSBJQ09JCiAgICAgZW50cnkuYkhlaWdodCA9IHN0YXRpY19jYXN0PHVp
bnQ4X3Q+KGRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQgKyAxXSk7CiAgICAgaWYgKGVudHJ5
LmJIZWlnaHQgPT0gMCkKICAgICAgICAgZW50cnkuYkhlaWdodCA9IDI1NjsKLSAgICBlbnRyeS53
Qml0Q291bnQgPSByZWFkVWludDE2KGRhdGEsIDYpOwotICAgIGVudHJ5LmR3SW1hZ2VPZmZzZXQg
PSByZWFkVWludDMyKGRhdGEsIDEyKTsKKyAgICBlbnRyeS53Qml0Q291bnQgPSByZWFkVWludDE2
KGRhdGEsIG1fZGVjb2RlZE9mZnNldCArIDYpOworICAgIGVudHJ5LmR3SW1hZ2VPZmZzZXQgPSBy
ZWFkVWludDMyKGRhdGEsIG1fZGVjb2RlZE9mZnNldCArIDEyKTsKIAogICAgIC8vIFNvbWUgaWNv
bnMgZG9uJ3QgaGF2ZSBhIGJpdCBkZXB0aCwgb25seSBhIGNvbG9yIGNvdW50LiAgQ29udmVydCB0
aGUKICAgICAvLyBjb2xvciBjb3VudCB0byB0aGUgbWluaW11bSBuZWNlc3NhcnkgYml0IGRlcHRo
LiAgSXQgZG9lc24ndCBtYXR0ZXIgaWYKQEAgLTE4OSw4ICsxOTQsOCBAQCBib29sIElDT0ltYWdl
RGVjb2Rlcjo6aXNCZXR0ZXJFbnRyeShjb25zCiAgICAgICAgIC8vIFRoZSBpY29uIGNsb3Nlc3Qg
dG8gdGhlIHByZWZlcnJlZCBhcmVhIHdpdGhvdXQgYmVpbmcgc21hbGxlciBpcwogICAgICAgICAv
LyBiZXR0ZXIuCiAgICAgICAgIGlmIChlbnRyeUFyZWEgIT0gZGlyRW50cnlBcmVhKSB7Ci0gICAg
ICAgICAgICByZXR1cm4gKGVudHJ5QXJlYSA8IGRpckVudHJ5QXJlYSkKLSAgICAgICAgICAgICAg
ICAmJiAoZW50cnlBcmVhID49IChtX3ByZWZlcnJlZEljb25TaXplLndpZHRoKCkgKiBtX3ByZWZl
cnJlZEljb25TaXplLmhlaWdodCgpKSk7CisgICAgICAgICAgICByZXR1cm4gKGVudHJ5QXJlYSA8
IGRpckVudHJ5QXJlYSkgJiYgKGVudHJ5QXJlYSA+PQorICAgICAgICAgICAgICAgIChtX3ByZWZl
cnJlZEljb25TaXplLndpZHRoKCkgKiBtX3ByZWZlcnJlZEljb25TaXplLmhlaWdodCgpKSk7CiAg
ICAgICAgIH0KICAgICB9CiAKQEAgLTIwMiw2ICsyMDcsMTkgQEAgYm9vbCBJQ09JbWFnZURlY29k
ZXI6OmlzQmV0dGVyRW50cnkoY29ucwogICAgIHJldHVybiAoZW50cnkud0JpdENvdW50ID4gbV9k
aXJFbnRyeS53Qml0Q291bnQpOwogfQogCitib29sIElDT0ltYWdlRGVjb2Rlcjo6cHJvY2Vzc0lt
YWdlVHlwZShTaGFyZWRCdWZmZXIqIGRhdGEpCit7CisgICAgLy8gQ2hlY2sgaWYgdGhpcyBlbnRy
eSBpcyBhIEJNUCBvciBhIFBORzsgd2UgbmVlZCA0IGJ5dGVzIHRvIGNoZWNrIHRoZSBtYWdpYwor
ICAgIC8vIG51bWJlci4KKyAgICBBU1NFUlQobV9kZWNvZGVkT2Zmc2V0ID09IG1fZGlyRW50cnku
ZHdJbWFnZU9mZnNldCk7CisgICAgaWYgKChtX2RlY29kZWRPZmZzZXQgPiBkYXRhLT5zaXplKCkp
CisgICAgICAgIHx8ICgoZGF0YS0+c2l6ZSgpIC0gbV9kZWNvZGVkT2Zmc2V0KSA8IDQpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgbV9pbWFnZVR5cGUgPQorICAgICAgICBzdHJuY21wKCZk
YXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0XSwgIlx4ODlQTkciLCA0KSA/IEJNUCA6IFBORzsK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBJQ09JbWFnZURlY29kZXI6OmRlY29kZVBORyhT
aGFyZWRCdWZmZXIqIGRhdGEpCiB7CiAgICAgLy8gQ29weSBvdXQgUE5HIGRhdGEgdG8gYSBzZXBh
cmF0ZSB2ZWN0b3IgYW5kIGluc3RhbnRpYXRlIFBORyBkZWNvZGVyLgpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVyLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVyLmgJ
KHJldmlzaW9uIDQ0ODMyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28v
SUNPSW1hZ2VEZWNvZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTQwLDIzICs0MCwxNyBAQCBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAgICAgY2xhc3MgSUNPSW1hZ2VEZWNvZGVyIDogcHVibGljIEJNUElt
YWdlUmVhZGVyIHsKICAgICBwdWJsaWM6CiAgICAgICAgIC8vIFNlZSBjb21tZW50cyBvbiB8bV9w
cmVmZXJyZWRJY29uU2l6ZXwgYmVsb3cuCi0gICAgICAgIElDT0ltYWdlRGVjb2Rlcihjb25zdCBJ
bnRTaXplJiBwcmVmZXJyZWRJY29uU2l6ZSkKLSAgICAgICAgICAgIDogbV9wcmVmZXJyZWRJY29u
U2l6ZShwcmVmZXJyZWRJY29uU2l6ZSkKLSAgICAgICAgICAgICwgbV9pbWFnZVR5cGUoVW5rbm93
bikKLSAgICAgICAgewotICAgICAgICAgICAgbV9hbmRNYXNrU3RhdGUgPSBOb3RZZXREZWNvZGVk
OwotICAgICAgICB9CisgICAgICAgIElDT0ltYWdlRGVjb2Rlcihjb25zdCBJbnRTaXplJiBwcmVm
ZXJyZWRJY29uU2l6ZSk7CiAKKyAgICAgICAgLy8gSW1hZ2VEZWNvZGVyCiAgICAgICAgIHZpcnR1
YWwgU3RyaW5nIGZpbGVuYW1lRXh0ZW5zaW9uKCkgY29uc3QgeyByZXR1cm4gImljbyI7IH0KKyAg
ICAgICAgdmlydHVhbCBib29sIGlzU2l6ZUF2YWlsYWJsZSgpOworICAgICAgICB2aXJ0dWFsIElu
dFNpemUgc2l6ZSgpIGNvbnN0OwogCiAgICAgICAgIC8vIEJNUEltYWdlUmVhZGVyCiAgICAgICAg
IHZpcnR1YWwgdm9pZCBkZWNvZGVJbWFnZShTaGFyZWRCdWZmZXIqIGRhdGEpOwogICAgICAgICB2
aXJ0dWFsIFJHQkEzMkJ1ZmZlciogZnJhbWVCdWZmZXJBdEluZGV4KHNpemVfdCBpbmRleCk7CiAK
LSAgICAgICAgLy8gSW1hZ2VEZWNvZGVyCi0gICAgICAgIHZpcnR1YWwgYm9vbCBpc1NpemVBdmFp
bGFibGUoKTsKLSAgICAgICAgdmlydHVhbCBJbnRTaXplIHNpemUoKSBjb25zdDsKLQogICAgIHBy
aXZhdGU6CiAgICAgICAgIGVudW0gSW1hZ2VUeXBlIHsKICAgICAgICAgICAgIFVua25vd24sCkBA
IC03NiwyMiArNzAsMjcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICAgICAgdWludDMy
X3QgZHdJbWFnZU9mZnNldDsKICAgICAgICAgfTsKIAotICAgICAgICAvLyBQcm9jZXNzZXMgdGhl
IElDT05ESVIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YS4gIFJldHVybnMgdHJ1ZSBpZiB0
aGUKLSAgICAgICAgLy8gZGlyZWN0b3J5IGNvdWxkIGJlIGRlY29kZWQuCisgICAgICAgIC8vIFBy
b2Nlc3NlcyB0aGUgSUNPTkRJUiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhLiAgUmV0dXJu
cyB0cnVlIGlmCisgICAgICAgIC8vIHRoZSBkaXJlY3RvcnkgY291bGQgYmUgZGVjb2RlZC4KICAg
ICAgICAgYm9vbCBwcm9jZXNzRGlyZWN0b3J5KFNoYXJlZEJ1ZmZlciopOwogCiAgICAgICAgIC8v
IFByb2Nlc3NlcyB0aGUgSUNPTkRJUkVOVFJZIHJlY29yZHMgYWZ0ZXIgdGhlIGRpcmVjdG9yeS4g
IEtlZXBzIHRoZQotICAgICAgICAvLyAiYmVzdCIgZW50cnkgYXMgdGhlIG9uZSB3ZSdsbCBkZWNv
ZGUuICBSZXR1cm5zIHRydWUgaWYgdGhlIGVudHJpZXMgY291bGQKLSAgICAgICAgLy8gYmUgZGVj
b2RlZC4KKyAgICAgICAgLy8gImJlc3QiIGVudHJ5IGFzIHRoZSBvbmUgd2UnbGwgZGVjb2RlLiAg
UmV0dXJucyB0cnVlIGlmIHRoZSBlbnRyaWVzCisgICAgICAgIC8vIGNvdWxkIGJlIGRlY29kZWQu
CiAgICAgICAgIGJvb2wgcHJvY2Vzc0RpcmVjdG9yeUVudHJpZXMoU2hhcmVkQnVmZmVyKik7CiAK
LSAgICAgICAgLy8gUmVhZHMgYW5kIHJldHVybnMgYSBkaXJlY3RvcnkgZW50cnkgZnJvbSB0aGUg
Y3VycmVudCBvZmZzZXQgaW50byB8ZGF0YXwuCisgICAgICAgIC8vIFJlYWRzIGFuZCByZXR1cm5z
IGEgZGlyZWN0b3J5IGVudHJ5IGZyb20gdGhlIGN1cnJlbnQgb2Zmc2V0IGludG8KKyAgICAgICAg
Ly8gfGRhdGF8LgogICAgICAgICBJY29uRGlyZWN0b3J5RW50cnkgcmVhZERpcmVjdG9yeUVudHJ5
KFNoYXJlZEJ1ZmZlciopOwogCiAgICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB8ZW50cnl8IGlz
IGEgcHJlZmVyYWJsZSBpY29uIGVudHJ5IHRvIG1fZGlyRW50cnkuCiAgICAgICAgIC8vIExhcmdl
ciBzaXplcywgb3IgZ3JlYXRlciBiaXRkZXB0aHMgYXQgdGhlIHNhbWUgc2l6ZSwgYXJlIHByZWZl
cmFibGUuCiAgICAgICAgIGJvb2wgaXNCZXR0ZXJFbnRyeShjb25zdCBJY29uRGlyZWN0b3J5RW50
cnkmKSBjb25zdDsKIAorICAgICAgICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRlc2lyZWQg
ZW50cnkgaXMgYSBCTVAgb3IgUE5HLiAgUmV0dXJucyB0cnVlCisgICAgICAgIC8vIGlmIHRoZSB0
eXBlIGNvdWxkIGJlIGRldGVybWluZWQuCisgICAgICAgIGJvb2wgcHJvY2Vzc0ltYWdlVHlwZShT
aGFyZWRCdWZmZXIqKTsKKwogICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgaW1hZ2UgdG8gYmUg
ZGVjb2RlZCBpcyBhIFBORyByYXRoZXIgdGhhbiBhIEJNUC4KICAgICAgICAgLy8gSW5zdGFudGlh
dGVzIGEgUE5HSW1hZ2VEZWNvZGVyLCBkZWNvZGVzIHRoZSBpbWFnZSwgYW5kIGNvcGllcyB0aGUK
ICAgICAgICAgLy8gcmVzdWx0cyBsb2NhbGx5Lgo=
</data>
<flag name="review"
          id="16161"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31523</attachid>
            <date>2009-06-18 17:47:15 -0700</date>
            <delta_ts>2009-06-18 18:15:04 -0700</delta_ts>
            <desc>part two, v2 (Modified and landed r44833)</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>41683</size>
            <attacher name="Peter Kasting">pkasting</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDgzMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjQgQEAKKzIwMDktMDYtMTggIFBldGVyIEthc3RpbmcgIDxwa2FzdGluZ0Bnb29n
bGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjQ2MCBwYXJ0IHR3bwor
ICAgICAgICBBdHRlbXB0IHRvIG1pbmltaXplIGRpZmYgb2YgZm9sbG93aW5nIGZ1bmN0aW9uYWwg
Y2hhbmdlIGJ5IGZpcnN0IGxhbmRpbmcKKyAgICAgICAgbm9uLWZ1bmN0aW9uYWwgY2hhbmdlIHRv
OgorICAgICAgICAqIE1ha2UgcmVhZFVpbnRYKCkgcHVibGljIGFuZCBzdGF0aWMgKHNpbmNlIHRo
ZXkgd2lsbCBuZWVkIHRvIGJlIG9uY2UKKyAgICAgICAgICBCTVBJbWFnZVJlYWRlciBpcyBpbmNs
dWRlZCBpbiAqSW1hZ2VEZWNvZGVyIHZpYSBjb21wb3NpdGlvbiByYXRoZXIKKyAgICAgICAgICB0
aGFuIGluaGVyaXRhbmNlKS4gIEFkZCB3cmFwcGVycyBpbiBlYWNoIGNsYXNzIHNvIGNhbGxlcnMg
Y2FuIGJlCisgICAgICAgICAgc2ltcGxlci4gIEluIHRoZSBuZXh0IHBhdGNoLCB0aGVzZSB3cmFw
cGVycyB3aWxsIGJlIGJlZWZlZCB1cCBzbGlnaHRseQorICAgICAgICAgIGFuZCB0aGUgY2FsbGVy
cyB3aWxsIGdldCBldmVuIHNpbXBsZXIuCisgICAgICAgICogQ2hhbmdlIGRpcmVjdCBzZXR0aW5n
IG9mIG1fZmFpbGVkIHRvIHVzZSBzZXRGYWlsZWQoKSwgc2luY2UgaW4gdGhlCisgICAgICAgICAg
bmV4dCBwYXRjaCBtdWNoIG9mIHRoaXMgY29kZSB3b24ndCBldmVuIGhhdmUgZGlyZWN0IGFjY2Vz
cyB0byBtX2ZhaWxlZAorICAgICAgICAqIEFkZCBhIGhlbHBlciBmdW5jdGlvbiBpbiBJQ09JbWFn
ZURlY29kZXIgdG8gZGV0ZXJtaW5lIHRoZSBpbWFnZSB0eXBlCisgICAgICAgICAgaW5zdGVhZCBv
ZiBzaW1wbHkgZG9pbmcgaXQgaW5saW5lCisgICAgICAgICogUmV3cmFwIGxpbmVzIHRoYXQgdXNl
ZCB0byBiZSA8PTgwIGNvbHMgYW5kIHNsaXBwZWQgb3ZlciBpdCBkdXJpbmcgdGhlCisgICAgICAg
ICAgb3JpZ2luYWwgbGFuZGluZyBvZiB0aGVzZSBkZWNvZGVycworICAgICAgICAqIE90aGVyIG1p
c2MuIGNoYW5nZXMsIGUuZy4gYWRkaW5nIGNvbnN0cnVjdG9yIGRlZmluaXRpb25zLCByZW9yZGVy
aW5nCisgICAgICAgICAgZnVuY3Rpb25zLCBjaGFuZ2luZyBSR0JBMzJCdWZmZXImIHRvIFJHQkEz
MkJ1ZmZlciosIGV0Yy4gdGhhdCBoYXZlIG5vCisgICAgICAgICAgZnVuY3Rpb25hbCBlZmZlY3Qg
YnV0IG1pbmltaXplIHRoZSBzdWJzZXF1ZW50IGRpZmYgZm9yIHJlYWRhYmlsaXR5CisKKworICAg
ICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2JtcC9CTVBJbWFnZURlY29kZXIuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VEZWNvZGVyOjpCTVBJbWFnZURlY29kZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VEZWNvZGVyOjpwcm9jZXNzRmlsZUhlYWRlcik6CisgICAg
ICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlRGVjb2Rlci5oOgorICAg
ICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VEZWNvZGVyOjpyZWFkVWludDMyKToKKyAgICAgICAgKiBw
bGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9ibXAvQk1QSW1hZ2VSZWFkZXIuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6Qk1QSW1hZ2VSZWFkZXI6OmRlY29kZUJNUCk6CisgICAgICAgIChXZWJDb3JlOjpC
TVBJbWFnZVJlYWRlcjo6Z2V0SW5mb0hlYWRlclNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Qk1Q
SW1hZ2VSZWFkZXI6OnByb2Nlc3NJbmZvSGVhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkJNUElt
YWdlUmVhZGVyOjpyZWFkSW5mb0hlYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpCTVBJbWFnZVJl
YWRlcjo6cHJvY2Vzc0JpdG1hc2tzKToKKyAgICAgICAgKFdlYkNvcmU6OkJNUEltYWdlUmVhZGVy
Ojpwcm9jZXNzQ29sb3JUYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpCTVBJbWFnZVJlYWRlcjo6
cHJvY2Vzc1JMRURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VSZWFkZXI6OnByb2Nl
c3NOb25STEVEYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9ibXAvQk1Q
SW1hZ2VSZWFkZXIuaDoKKyAgICAgICAgKFdlYkNvcmU6OkJNUEltYWdlUmVhZGVyOjpyZWFkVWlu
dDE2SGVscGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkJNUEltYWdlUmVhZGVyOjpyZWFkVWludDMy
SGVscGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkJNUEltYWdlUmVhZGVyOjopOgorICAgICAgICAo
V2ViQ29yZTo6Qk1QSW1hZ2VSZWFkZXI6OnJlYWRVaW50MTYpOgorICAgICAgICAoV2ViQ29yZTo6
Qk1QSW1hZ2VSZWFkZXI6OnJlYWRVaW50MzIpOgorICAgICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VS
ZWFkZXI6OnJlYWRDdXJyZW50UGl4ZWwpOgorICAgICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VSZWFk
ZXI6OmdldENvbXBvbmVudCk6CisgICAgICAgIChXZWJDb3JlOjpCTVBJbWFnZVJlYWRlcjo6c2V0
SSk6CisgICAgICAgIChXZWJDb3JlOjpCTVBJbWFnZVJlYWRlcjo6c2V0UkdCQSk6CisgICAgICAg
IChXZWJDb3JlOjpCTVBJbWFnZVJlYWRlcjo6ZmlsbFJHQkEpOgorICAgICAgICAqIHBsYXRmb3Jt
L2ltYWdlLWRlY29kZXJzL2ljby9JQ09JbWFnZURlY29kZXIuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6SUNPSW1hZ2VEZWNvZGVyOjpJQ09JbWFnZURlY29kZXIpOgorICAgICAgICAoV2ViQ29yZTo6
SUNPSW1hZ2VEZWNvZGVyOjppc1NpemVBdmFpbGFibGUpOgorICAgICAgICAoV2ViQ29yZTo6SUNP
SW1hZ2VEZWNvZGVyOjpzaXplKToKKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6
ZGVjb2RlSW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1hZ2VEZWNvZGVyOjpwcm9jZXNz
RGlyZWN0b3J5KToKKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6cHJvY2Vzc0Rp
cmVjdG9yeUVudHJpZXMpOgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1hZ2VEZWNvZGVyOjppc0Jl
dHRlckVudHJ5KToKKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6cHJvY2Vzc0lt
YWdlVHlwZSk6CisgICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvaWNvL0lDT0ltYWdl
RGVjb2Rlci5oOgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1hZ2VEZWNvZGVyOjpyZWFkVWludDE2
KToKKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6cmVhZFVpbnQzMik6CisKIDIw
MDktMDYtMTggIFBldGVyIEthc3RpbmcgIDxwa2FzdGluZ0Bnb29nbGUuY29tPgogCiAgICAgICAg
IEZpeCBidWlsZCBidXN0YWdlLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVy
cy9ibXAvQk1QSW1hZ2VEZWNvZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L2ltYWdlLWRlY29kZXJzL2JtcC9CTVBJbWFnZURlY29kZXIuY3BwCShyZXZpc2lvbiA0NDgzMikK
KysrIFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlRGVjb2Rlci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTM4LDYgKzM4LDExIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IC8vIGRvbid0IHBhY2spLgogc3RhdGljIGNvbnN0IHNpemVfdCBzaXplT2ZGaWxlSGVhZGVyID0g
MTQ7CiAKK0JNUEltYWdlRGVjb2Rlcjo6Qk1QSW1hZ2VEZWNvZGVyKCkKKyAgICA6IEJNUEltYWdl
UmVhZGVyKCkKK3sKK30KKwogdm9pZCBCTVBJbWFnZURlY29kZXI6OmRlY29kZUltYWdlKFNoYXJl
ZEJ1ZmZlciogZGF0YSkKIHsKICAgICAvLyBSZWFkIGFuZCBwcm9jZXNzIGZpbGUgaGVhZGVyLgpA
QCAtNzMsMTAgKzc4LDEyIEBAIGJvb2wgQk1QSW1hZ2VEZWNvZGVyOjpwcm9jZXNzRmlsZUhlYWRl
cigKICAgICAgICAgQklUTUFQQVJSQVkgPSAnQkEnLAogICAgICAgICAqLwogICAgIH07Ci0gICAg
aWYgKGZpbGVUeXBlICE9IEJNQVApCi0gICAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKKyAgICBpZiAo
ZmlsZVR5cGUgIT0gQk1BUCkgeworICAgICAgICBzZXRGYWlsZWQoKTsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KIAotICAgIHJldHVybiAhbV9mYWlsZWQ7CisgICAgcmV0dXJuIHRydWU7
CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vaW1h
Z2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlRGVjb2Rlci5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlRGVjb2Rlci5oCShyZXZpc2lvbiA0
NDgzMikKKysrIFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlRGVj
b2Rlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOCwxMiArMzgsMTggQEAgbmFtZXNwYWNlIFdlYkNv
cmUgewogICAgIC8vIFRoaXMgY2xhc3MgZGVjb2RlcyB0aGUgQk1QIGltYWdlIGZvcm1hdC4KICAg
ICBjbGFzcyBCTVBJbWFnZURlY29kZXIgOiBwdWJsaWMgQk1QSW1hZ2VSZWFkZXIgewogICAgIHB1
YmxpYzoKKyAgICAgICAgQk1QSW1hZ2VEZWNvZGVyKCk7CisKICAgICAgICAgdmlydHVhbCBTdHJp
bmcgZmlsZW5hbWVFeHRlbnNpb24oKSBjb25zdCB7IHJldHVybiAiYm1wIjsgfQogCiAgICAgICAg
IC8vIEJNUEltYWdlUmVhZGVyCiAgICAgICAgIHZpcnR1YWwgdm9pZCBkZWNvZGVJbWFnZShTaGFy
ZWRCdWZmZXIqKTsKIAogICAgIHByaXZhdGU6CisgICAgICAgIGlubGluZSB1aW50MzJfdCByZWFk
VWludDMyKFNoYXJlZEJ1ZmZlciogZGF0YSwgaW50IG9mZnNldCkgY29uc3QgeworICAgICAgICAg
ICAgcmV0dXJuIHJlYWRVaW50MzJIZWxwZXIoZGF0YSwgbV9kZWNvZGVkT2Zmc2V0ICsgb2Zmc2V0
KTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZSBoZWFkZXIgYXQg
dGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YS4gIFJldHVybnMgdHJ1ZSBpZgogICAgICAgICAvLyB0
aGUgZmlsZSBoZWFkZXIgY291bGQgYmUgZGVjb2RlZC4KICAgICAgICAgYm9vbCBwcm9jZXNzRmls
ZUhlYWRlcihTaGFyZWRCdWZmZXIqKTsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVj
b2RlcnMvYm1wL0JNUEltYWdlUmVhZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL2ltYWdlLWRlY29kZXJzL2JtcC9CTVBJbWFnZVJlYWRlci5jcHAJKHJldmlzaW9uIDQ0ODMy
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9ibXAvQk1QSW1hZ2VSZWFkZXIu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC05Miw0MSArOTIsNDEgQEAgUkdCQTMyQnVmZmVyKiBCTVBJ
bWFnZVJlYWRlcjo6ZnJhbWVCdWZmZQogICAgIHJldHVybiBpbmRleCA/IDAgOiAmbV9mcmFtZUJ1
ZmZlckNhY2hlLmZpcnN0KCk7CiB9CiAKLXZvaWQgQk1QSW1hZ2VSZWFkZXI6OmRlY29kZUJNUChT
aGFyZWRCdWZmZXIqIGRhdGEpCitib29sIEJNUEltYWdlUmVhZGVyOjpkZWNvZGVCTVAoU2hhcmVk
QnVmZmVyKiBkYXRhKQogewogICAgIC8vIENhbGN1bGF0ZSBzaXplIG9mIGluZm8gaGVhZGVyLgog
ICAgIGlmICghbV9pbmZvSGVhZGVyLmJpU2l6ZSAmJiAhZ2V0SW5mb0hlYWRlclNpemUoZGF0YSkp
Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gUmVhZCBh
bmQgcHJvY2VzcyBpbmZvIGhlYWRlci4KICAgICBpZiAoKG1fZGVjb2RlZE9mZnNldCA8IChtX2hl
YWRlck9mZnNldCArIG1faW5mb0hlYWRlci5iaVNpemUpKQogICAgICAgICAmJiAhcHJvY2Vzc0lu
Zm9IZWFkZXIoZGF0YSkpCi0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwog
CiAgICAgLy8gUmVhZCBhbmQgcHJvY2VzcyB0aGUgYml0bWFza3MsIGlmIG5lZWRlZC4KICAgICBp
ZiAobV9uZWVkVG9Qcm9jZXNzQml0bWFza3MgJiYgIXByb2Nlc3NCaXRtYXNrcyhkYXRhKSkKLSAg
ICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAvLyBSZWFkIGFuZCBw
cm9jZXNzIHRoZSBjb2xvciB0YWJsZSwgaWYgbmVlZGVkLgogICAgIGlmIChtX25lZWRUb1Byb2Nl
c3NDb2xvclRhYmxlICYmICFwcm9jZXNzQ29sb3JUYWJsZShkYXRhKSkKLSAgICAgICAgcmV0dXJu
OworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAvLyBJbml0aWFsaXplIHRoZSBmcmFtZWJ1
ZmZlciBpZiBuZWVkZWQuCi0gICAgUkdCQTMyQnVmZmVyJiBidWZmZXIgPSBtX2ZyYW1lQnVmZmVy
Q2FjaGUuZmlyc3QoKTsKLSAgICBpZiAoYnVmZmVyLnN0YXR1cygpID09IFJHQkEzMkJ1ZmZlcjo6
RnJhbWVFbXB0eSkgewotICAgICAgICBpZiAoIWJ1ZmZlci5zZXRTaXplKHNpemUoKS53aWR0aCgp
LCBzaXplKCkuaGVpZ2h0KCkpKSB7CisgICAgUkdCQTMyQnVmZmVyKiBidWZmZXIgPSAmbV9mcmFt
ZUJ1ZmZlckNhY2hlLmZpcnN0KCk7CisgICAgaWYgKGJ1ZmZlci0+c3RhdHVzKCkgPT0gUkdCQTMy
QnVmZmVyOjpGcmFtZUVtcHR5KSB7CisgICAgICAgIGlmICghYnVmZmVyLT5zZXRTaXplKHNpemUo
KS53aWR0aCgpLCBzaXplKCkuaGVpZ2h0KCkpKSB7CiAgICAgICAgICAgICAvLyBVbmFibGUgdG8g
YWxsb2NhdGUuCi0gICAgICAgICAgICBtX2ZhaWxlZCA9IHRydWU7Ci0gICAgICAgICAgICByZXR1
cm47CisgICAgICAgICAgICBzZXRGYWlsZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
ICAgICAgICAgfQotICAgICAgICBidWZmZXIuc2V0U3RhdHVzKFJHQkEzMkJ1ZmZlcjo6RnJhbWVQ
YXJ0aWFsKTsKKyAgICAgICAgYnVmZmVyLT5zZXRTdGF0dXMoUkdCQTMyQnVmZmVyOjpGcmFtZVBh
cnRpYWwpOwogICAgICAgICAvLyBzZXRTaXplKCkgY2FsbHMgZXJhc2VBUkdCKCksIHdoaWNoIHJl
c2V0cyB0aGUgYWxwaGEgZmxhZywgc28gd2UgZm9yY2UKICAgICAgICAgLy8gaXQgYmFjayB0byBm
YWxzZSBoZXJlLiAgV2UnbGwgc2V0IGl0IHRydWUgYmVsb3cgaW4gYWxsIGNhc2VzIHdoZXJlCiAg
ICAgICAgIC8vIHRoZXNlIDBzIGNvdWxkIGFjdHVhbGx5IHNob3cgdGhyb3VnaC4KLSAgICAgICAg
YnVmZmVyLnNldEhhc0FscGhhKGZhbHNlKTsKKyAgICAgICAgYnVmZmVyLT5zZXRIYXNBbHBoYShm
YWxzZSk7CiAKICAgICAgICAgLy8gRm9yIEJNUHMsIHRoZSBmcmFtZSBhbHdheXMgZmlsbHMgdGhl
IGVudGlyZSBpbWFnZS4KLSAgICAgICAgYnVmZmVyLnNldFJlY3QoSW50UmVjdChJbnRQb2ludCgp
LCBzaXplKCkpKTsKKyAgICAgICAgYnVmZmVyLT5zZXRSZWN0KEludFJlY3QoSW50UG9pbnQoKSwg
c2l6ZSgpKSk7CiAKICAgICAgICAgaWYgKCFtX2lzVG9wRG93bikKICAgICAgICAgICAgIG1fY29v
cmQuc2V0WShzaXplKCkuaGVpZ2h0KCkgLSAxKTsKQEAgLTEzOCwxNCArMTM4LDE0IEBAIHZvaWQg
Qk1QSW1hZ2VSZWFkZXI6OmRlY29kZUJNUChTaGFyZWRCdWYKICAgICAgICAgICAgIHx8IChtX2lu
Zm9IZWFkZXIuYmlDb21wcmVzc2lvbiA9PSBSTEU4KQogICAgICAgICAgICAgfHwgKG1faW5mb0hl
YWRlci5iaUNvbXByZXNzaW9uID09IFJMRTI0KSkgewogICAgICAgICAgICAgaWYgKCFwcm9jZXNz
UkxFRGF0YShkYXRhKSkKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwogICAgICAgICB9IGVsc2UgaWYgKCFwcm9jZXNzTm9uUkxFRGF0YShkYXRh
LCBmYWxzZSwgMCkpCi0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CiAgICAgfQogCiAgICAgLy8gSWYgdGhlIGltYWdlIGhhcyBhbiBBTkQgbWFzayBhbmQgdGhl
cmUgd2FzIG5vIGFscGhhIGRhdGEsIHByb2Nlc3MgdGhlCiAgICAgLy8gbWFzay4KLSAgICBpZiAo
KG1fYW5kTWFza1N0YXRlID09IE5vdFlldERlY29kZWQpICYmICFidWZmZXIuaGFzQWxwaGEoKSkg
eworICAgIGlmICgobV9hbmRNYXNrU3RhdGUgPT0gTm90WWV0RGVjb2RlZCkgJiYgIWJ1ZmZlci0+
aGFzQWxwaGEoKSkgewogICAgICAgICAvLyBSZXNldCBkZWNvZGluZyBjb29yZGluYXRlcyB0byBz
dGFydCBvZiBpbWFnZS4KICAgICAgICAgbV9jb29yZC5zZXRYKDApOwogICAgICAgICBtX2Nvb3Jk
LnNldFkobV9pc1RvcERvd24gPyAwIDogKHNpemUoKS5oZWlnaHQoKSAtIDEpKTsKQEAgLTE1Niwx
MCArMTU2LDExIEBAIHZvaWQgQk1QSW1hZ2VSZWFkZXI6OmRlY29kZUJNUChTaGFyZWRCdWYKICAg
ICAgICAgbV9hbmRNYXNrU3RhdGUgPSBEZWNvZGluZzsKICAgICB9CiAgICAgaWYgKChtX2FuZE1h
c2tTdGF0ZSA9PSBEZWNvZGluZykgJiYgIXByb2Nlc3NOb25STEVEYXRhKGRhdGEsIGZhbHNlLCAw
KSkKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAvLyBEb25l
IQotICAgIGJ1ZmZlci5zZXRTdGF0dXMoUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRlKTsKKyAg
ICBidWZmZXItPnNldFN0YXR1cyhSR0JBMzJCdWZmZXI6OkZyYW1lQ29tcGxldGUpOworICAgIHJl
dHVybiB0cnVlOwogfQogCiBib29sIEJNUEltYWdlUmVhZGVyOjpnZXRJbmZvSGVhZGVyU2l6ZShT
aGFyZWRCdWZmZXIqIGRhdGEpCkBAIC0xNzksNyArMTgwLDcgQEAgYm9vbCBCTVBJbWFnZVJlYWRl
cjo6Z2V0SW5mb0hlYWRlclNpemUoUwogICAgIGlmICgoKG1faGVhZGVyT2Zmc2V0ICsgbV9pbmZv
SGVhZGVyLmJpU2l6ZSkgPCBtX2hlYWRlck9mZnNldCkKICAgICAgICAgfHwgKG1faW1nRGF0YU9m
ZnNldAogICAgICAgICAgICAgJiYgKG1faW1nRGF0YU9mZnNldCA8IChtX2hlYWRlck9mZnNldCAr
IG1faW5mb0hlYWRlci5iaVNpemUpKSkpIHsKLSAgICAgICAgbV9mYWlsZWQgPSB0cnVlOworICAg
ICAgICBzZXRGYWlsZWQoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMTk1
LDEwICsxOTYsMTIgQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6Z2V0SW5mb0hlYWRlclNpemUoUwog
ICAgICAgICAgICAgICYmICgoKG1faW5mb0hlYWRlci5iaVNpemUgJiAzKSA9PSAwKSB8fCAobV9p
bmZvSGVhZGVyLmJpU2l6ZSA9PSA0MikKICAgICAgICAgICAgICAgICAgfHwgKG1faW5mb0hlYWRl
ci5iaVNpemUgPT0gNDYpKSkKICAgICAgICAgbV9pc09TMjJ4ID0gdHJ1ZTsKLSAgICBlbHNlCi0g
ICAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKKyAgICBlbHNlIHsKKyAgICAgICAgc2V0RmFpbGVkKCk7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLSAgICByZXR1cm4gIW1fZmFpbGVkOwor
ICAgIHJldHVybiB0cnVlOwogfQogCiBib29sIEJNUEltYWdlUmVhZGVyOjpwcm9jZXNzSW5mb0hl
YWRlcihTaGFyZWRCdWZmZXIqIGRhdGEpCkBAIC0yMTMsMTMgKzIxNiwxMyBAQCBib29sIEJNUElt
YWdlUmVhZGVyOjpwcm9jZXNzSW5mb0hlYWRlcihTCiAKICAgICAvLyBTYW5pdHktY2hlY2sgaGVh
ZGVyIHZhbHVlcy4KICAgICBpZiAoIWlzSW5mb0hlYWRlclZhbGlkKCkpIHsKLSAgICAgICAgbV9m
YWlsZWQgPSB0cnVlOworICAgICAgICBzZXRGYWlsZWQoKTsKICAgICAgICAgcmV0dXJuIGZhbHNl
OwogICAgIH0KIAogICAgIC8vIE1ha2Ugb3VyIHNpemUgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIu
CiAgICAgaWYgKCFzZXRTaXplKG1faW5mb0hlYWRlci5iaVdpZHRoLCBtX2luZm9IZWFkZXIuYmlI
ZWlnaHQpKSB7Ci0gICAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgc2V0RmFpbGVkKCk7
CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTI4NCwxMCArMjg3LDExIEBAIGJv
b2wgQk1QSW1hZ2VSZWFkZXI6OnJlYWRJbmZvSGVhZGVyKFNoYXIKICAgICAgICAgICAgIG1faXNP
UzIyeCA9IHRydWU7CiAgICAgICAgIH0gZWxzZSBpZiAoYmlDb21wcmVzc2lvbiA+IDUpIHsKICAg
ICAgICAgICAgIC8vIFNvbWUgdHlwZSB3ZSBkb24ndCB1bmRlcnN0YW5kLgotICAgICAgICAgICAg
bV9mYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgc2V0RmFpbGVkKCk7CiAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CiAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbV9pbmZvSGVhZGVyLmJp
Q29tcHJlc3Npb24gPSBzdGF0aWNfY2FzdDxDb21wcmVzc2lvblR5cGU+KGJpQ29tcHJlc3Npb24p
OworICAgICAgICAgICAgbV9pbmZvSGVhZGVyLmJpQ29tcHJlc3Npb24gPQorICAgICAgICAgICAg
ICAgIHN0YXRpY19jYXN0PENvbXByZXNzaW9uVHlwZT4oYmlDb21wcmVzc2lvbik7CiAgICAgfQog
CiAgICAgLy8gUmVhZCBjb2xvcnMgdXNlZCwgaWYgcHJlc2VudC4KQEAgLTQ3MSw5ICs0NzUsMTEg
QEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc0JpdG1hc2tzKFNoYQogCiAgICAgICAgIC8v
IEZhaWwgaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZmlsZSBzcGFjZSBmb3IgdGhlIGJpdG1hc2tz
LgogICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IFNJWkVPRl9CSVRNQVNLUyA9IDEyOwotICAg
ICAgICBpZiAoKChtX2hlYWRlck9mZnNldCArIG1faW5mb0hlYWRlci5iaVNpemUgKyBTSVpFT0Zf
QklUTUFTS1MpIDwgKG1faGVhZGVyT2Zmc2V0ICsgbV9pbmZvSGVhZGVyLmJpU2l6ZSkpCi0gICAg
ICAgICAgICB8fCAobV9pbWdEYXRhT2Zmc2V0ICYmIChtX2ltZ0RhdGFPZmZzZXQgPCAobV9oZWFk
ZXJPZmZzZXQgKyBtX2luZm9IZWFkZXIuYmlTaXplICsgU0laRU9GX0JJVE1BU0tTKSkpKSB7Ci0g
ICAgICAgICAgICBtX2ZhaWxlZCA9IHRydWU7CisgICAgICAgIGlmICgoKG1faGVhZGVyT2Zmc2V0
ICsgbV9pbmZvSGVhZGVyLmJpU2l6ZSArIFNJWkVPRl9CSVRNQVNLUykgPAorICAgICAgICAgICAg
ICAgIChtX2hlYWRlck9mZnNldCArIG1faW5mb0hlYWRlci5iaVNpemUpKQorICAgICAgICAgICAg
fHwgKG1faW1nRGF0YU9mZnNldCAmJiAobV9pbWdEYXRhT2Zmc2V0IDwKKyAgICAgICAgICAgICAg
ICAobV9oZWFkZXJPZmZzZXQgKyBtX2luZm9IZWFkZXIuYmlTaXplICsgU0laRU9GX0JJVE1BU0tT
KSkpKSB7CisgICAgICAgICAgICBzZXRGYWlsZWQoKTsKICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKICAgICAgICAgfQogCkBAIC01MDEsNyArNTA3LDggQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6
cHJvY2Vzc0JpdG1hc2tzKFNoYQogICAgICAgICAvLyBzcGVjaWZ5IGEgYm9ndXMgYWxwaGEgY2hh
bm5lbCBpbiBiaXRzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIHBpeGVsCiAgICAgICAgIC8vIGRh
dGEgKGZvciBleGFtcGxlLCBiaXRzIDI1LTMxIGluIGEgMjQtYml0IFJHQiBmb3JtYXQpLgogICAg
ICAgICBpZiAobV9pbmZvSGVhZGVyLmJpQml0Q291bnQgPCAzMikKLSAgICAgICAgICAgIG1fYml0
TWFza3NbaV0gJj0gKChzdGF0aWNfY2FzdDx1aW50MzJfdD4oMSkgPDwgbV9pbmZvSGVhZGVyLmJp
Qml0Q291bnQpIC0gMSk7CisgICAgICAgICAgICBtX2JpdE1hc2tzW2ldICY9CisgICAgICAgICAg
ICAgICAgKChzdGF0aWNfY2FzdDx1aW50MzJfdD4oMSkgPDwgbV9pbmZvSGVhZGVyLmJpQml0Q291
bnQpIC0gMSk7CiAKICAgICAgICAgLy8gRm9yIGVtcHR5IG1hc2tzIChjb21tb24gb24gdGhlIGFs
cGhhIGNoYW5uZWwsIGVzcGVjaWFsbHkgYWZ0ZXIgdGhlCiAgICAgICAgIC8vIHRyaW1taW5nIGFi
b3ZlKSwgcXVpY2tseSBjbGVhciB0aGUgc2hpZnRzIGFuZCBjb250aW51ZSwgdG8gYXZvaWQgYW4K
QEAgLTUxNSw3ICs1MjIsNyBAQCBib29sIEJNUEltYWdlUmVhZGVyOjpwcm9jZXNzQml0bWFza3Mo
U2hhCiAgICAgICAgIC8vIE1ha2Ugc3VyZSBiaXRtYXNrIGRvZXMgbm90IG92ZXJsYXAgYW55IG90
aGVyIGJpdG1hc2tzLgogICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgewogICAg
ICAgICAgICAgaWYgKHRlbXBNYXNrICYgbV9iaXRNYXNrc1tqXSkgewotICAgICAgICAgICAgICAg
IG1fZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzZXRGYWlsZWQoKTsKICAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUzMCw3
ICs1MzcsNyBAQCBib29sIEJNUEltYWdlUmVhZGVyOjpwcm9jZXNzQml0bWFza3MoU2hhCiAKICAg
ICAgICAgLy8gTWFrZSBzdXJlIGJpdG1hc2sgaXMgY29udGlndW91cy4KICAgICAgICAgaWYgKHRl
bXBNYXNrKSB7Ci0gICAgICAgICAgICBtX2ZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICBzZXRG
YWlsZWQoKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCkBAIC01NTAs
OSArNTU3LDExIEBAIGJvb2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NDb2xvclRhYmxlKFMKICAg
ICBtX3RhYmxlU2l6ZUluQnl0ZXMgPSBtX2luZm9IZWFkZXIuYmlDbHJVc2VkICogKG1faXNPUzIx
eCA/IDMgOiA0KTsKIAogICAgIC8vIEZhaWwgaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZmlsZSBz
cGFjZSBmb3IgdGhlIGNvbG9yIHRhYmxlLgotICAgIGlmICgoKG1faGVhZGVyT2Zmc2V0ICsgbV9p
bmZvSGVhZGVyLmJpU2l6ZSArIG1fdGFibGVTaXplSW5CeXRlcykgPCAobV9oZWFkZXJPZmZzZXQg
KyBtX2luZm9IZWFkZXIuYmlTaXplKSkKLSAgICAgICAgfHwgKG1faW1nRGF0YU9mZnNldCAmJiAo
bV9pbWdEYXRhT2Zmc2V0IDwgKG1faGVhZGVyT2Zmc2V0ICsgbV9pbmZvSGVhZGVyLmJpU2l6ZSAr
IG1fdGFibGVTaXplSW5CeXRlcykpKSkgewotICAgICAgICBtX2ZhaWxlZCA9IHRydWU7CisgICAg
aWYgKCgobV9oZWFkZXJPZmZzZXQgKyBtX2luZm9IZWFkZXIuYmlTaXplICsgbV90YWJsZVNpemVJ
bkJ5dGVzKSA8CisgICAgICAgICAgICAobV9oZWFkZXJPZmZzZXQgKyBtX2luZm9IZWFkZXIuYmlT
aXplKSkKKyAgICAgICAgfHwgKG1faW1nRGF0YU9mZnNldCAmJiAobV9pbWdEYXRhT2Zmc2V0IDwK
KyAgICAgICAgICAgIChtX2hlYWRlck9mZnNldCArIG1faW5mb0hlYWRlci5iaVNpemUgKyBtX3Rh
YmxlU2l6ZUluQnl0ZXMpKSkpIHsKKyAgICAgICAgc2V0RmFpbGVkKCk7CiAgICAgICAgIHJldHVy
biBmYWxzZTsKICAgICB9CiAKQEAgLTYwNiw3ICs2MTUsNyBAQCBib29sIEJNUEltYWdlUmVhZGVy
Ojpwcm9jZXNzUkxFRGF0YShTaGFyCiAKICAgICAvLyBJbXBvc3NpYmxlIHRvIGRlY29kZSByb3ct
YXQtYS10aW1lLCBzbyBqdXN0IGRvIHRoaW5ncyBhcyBhIHN0cmVhbSBvZgogICAgIC8vIGJ5dGVz
LgotICAgIFJHQkEzMkJ1ZmZlciYgYnVmZmVyID0gbV9mcmFtZUJ1ZmZlckNhY2hlLmZpcnN0KCk7
CisgICAgUkdCQTMyQnVmZmVyKiBidWZmZXIgPSAmbV9mcmFtZUJ1ZmZlckNhY2hlLmZpcnN0KCk7
CiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgLy8gRXZlcnkgZW50cnkgdGFrZXMgYXQgbGVh
c3QgdHdvIGJ5dGVzOyBiYWlsIGlmIHRoZXJlIGlzbid0IGVub3VnaAogICAgICAgICAvLyBkYXRh
LgpAQCAtNjE4LDcgKzYyNyw3IEBAIGJvb2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NSTEVEYXRh
KFNoYXIKICAgICAgICAgY29uc3QgdWludDhfdCBjb3VudCA9IGRhdGEtPmRhdGEoKVttX2RlY29k
ZWRPZmZzZXRdOwogICAgICAgICBjb25zdCB1aW50OF90IGNvZGUgPSBkYXRhLT5kYXRhKClbbV9k
ZWNvZGVkT2Zmc2V0ICsgMV07CiAgICAgICAgIGlmICgoKGNvdW50ICE9IDApIHx8IChjb2RlICE9
IDEpKSAmJiBwYXN0RW5kT2ZJbWFnZSgwKSkgewotICAgICAgICAgICAgbV9mYWlsZWQgPSB0cnVl
OworICAgICAgICAgICAgc2V0RmFpbGVkKCk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgICAgIH0KIApAQCAtNjI4LDcgKzYzNyw3IEBAIGJvb2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nl
c3NSTEVEYXRhKFNoYXIKICAgICAgICAgICAgIGNhc2UgMDogIC8vIE1hZ2ljIHRva2VuOiBFT0wK
ICAgICAgICAgICAgICAgICAvLyBTa2lwIGFueSByZW1haW5pbmcgcGl4ZWxzIGluIHRoaXMgcm93
LgogICAgICAgICAgICAgICAgIGlmIChtX2Nvb3JkLngoKSA8IHNpemUoKS53aWR0aCgpKQotICAg
ICAgICAgICAgICAgICAgICBidWZmZXIuc2V0SGFzQWxwaGEodHJ1ZSk7CisgICAgICAgICAgICAg
ICAgICAgIGJ1ZmZlci0+c2V0SGFzQWxwaGEodHJ1ZSk7CiAgICAgICAgICAgICAgICAgbW92ZUJ1
ZmZlclRvTmV4dFJvdygpOwogCiAgICAgICAgICAgICAgICAgbV9kZWNvZGVkT2Zmc2V0ICs9IDI7
CkBAIC02MzcsOCArNjQ2LDEwIEBAIGJvb2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NSTEVEYXRh
KFNoYXIKICAgICAgICAgICAgIGNhc2UgMTogIC8vIE1hZ2ljIHRva2VuOiBFT0YKICAgICAgICAg
ICAgICAgICAvLyBTa2lwIGFueSByZW1haW5pbmcgcGl4ZWxzIGluIHRoZSBpbWFnZS4KICAgICAg
ICAgICAgICAgICBpZiAoKG1fY29vcmQueCgpIDwgc2l6ZSgpLndpZHRoKCkpCi0gICAgICAgICAg
ICAgICAgICAgIHx8IChtX2lzVG9wRG93biA/IChtX2Nvb3JkLnkoKSA8IChzaXplKCkuaGVpZ2h0
KCkgLSAxKSkgOiAobV9jb29yZC55KCkgPiAwKSkpCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZl
ci5zZXRIYXNBbHBoYSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfHwgKG1faXNUb3BEb3du
CisgICAgICAgICAgICAgICAgICAgICAgICA/IChtX2Nvb3JkLnkoKSA8IChzaXplKCkuaGVpZ2h0
KCkgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKG1fY29vcmQueSgpID4gMCkpKQor
ICAgICAgICAgICAgICAgICAgICBidWZmZXItPnNldEhhc0FscGhhKHRydWUpOwogICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgICAgICAgICBjYXNlIDI6IHsgIC8vIE1hZ2ljIHRv
a2VuOiBEZWx0YQpAQCAtNjUyLDEwICs2NjMsMTAgQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6cHJv
Y2Vzc1JMRURhdGEoU2hhcgogICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgZHggPSBkYXRh
LT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0ICsgMl07CiAgICAgICAgICAgICAgICAgY29uc3QgdWlu
dDhfdCBkeSA9IGRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQgKyAzXTsKICAgICAgICAgICAg
ICAgICBpZiAoKGR4ICE9IDApIHx8IChkeSAhPSAwKSkKLSAgICAgICAgICAgICAgICAgICAgYnVm
ZmVyLnNldEhhc0FscGhhKHRydWUpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPnNldEhh
c0FscGhhKHRydWUpOwogICAgICAgICAgICAgICAgIGlmICgoKG1fY29vcmQueCgpICsgZHgpID4g
c2l6ZSgpLndpZHRoKCkpIHx8CiAgICAgICAgICAgICAgICAgICAgIHBhc3RFbmRPZkltYWdlKGR5
KSkgewotICAgICAgICAgICAgICAgICAgICBtX2ZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAg
ICAgICAgIHNldEZhaWxlZCgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgICAgICAgICAgICAgfQogCkBAIC03MDUsNyArNzE2LDcgQEAgYm9vbCBCTVBJbWFnZVJlYWRl
cjo6cHJvY2Vzc1JMRURhdGEoU2hhcgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg
ICBpZiAoKGNvbG9ySW5kZXhlc1swXSA+PSBtX2luZm9IZWFkZXIuYmlDbHJVc2VkKQogICAgICAg
ICAgICAgICAgICAgICB8fCAoY29sb3JJbmRleGVzWzFdID49IG1faW5mb0hlYWRlci5iaUNsclVz
ZWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICAgICAgc2V0RmFpbGVkKCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgd2hpY2ggPSAwOyBt
X2Nvb3JkLngoKSA8IGVuZFg7ICkgewpAQCAtNzMwLDcgKzc0MSw3IEBAIGJvb2wgQk1QSW1hZ2VS
ZWFkZXI6OnByb2Nlc3NOb25STEVEYXRhKFMKICAgICAvLyBGYWlsIGlmIHdlJ3JlIGJlaW5nIGFz
a2VkIHRvIGRlY29kZSBtb3JlIHBpeGVscyB0aGFuIHJlbWFpbiBpbiB0aGUgcm93LgogICAgIGNv
bnN0IGludCBlbmRYID0gbV9jb29yZC54KCkgKyBudW1QaXhlbHM7CiAgICAgaWYgKGVuZFggPiBz
aXplKCkud2lkdGgoKSkgewotICAgICAgICBtX2ZhaWxlZCA9IHRydWU7CisgICAgICAgIHNldEZh
aWxlZCgpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC03NDgsNyArNzU5LDcg
QEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc05vblJMRURhdGEoUwogCiAgICAgLy8gRGVj
b2RlIGFzIG1hbnkgcm93cyBhcyB3ZSBjYW4uICAoRm9yIFJMRSwgd2hlcmUgd2Ugb25seSB3YW50
IHRvIGRlY29kZQogICAgIC8vIG9uZSByb3csIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRo
aXMgY29uZGl0aW9uIGlzIHRydWUuKQotICAgIFJHQkEzMkJ1ZmZlciYgYnVmZmVyID0gbV9mcmFt
ZUJ1ZmZlckNhY2hlLmZpcnN0KCk7CisgICAgUkdCQTMyQnVmZmVyKiBidWZmZXIgPSAmbV9mcmFt
ZUJ1ZmZlckNhY2hlLmZpcnN0KCk7CiAgICAgd2hpbGUgKCFwYXN0RW5kT2ZJbWFnZSgwKSkgewog
ICAgICAgICAvLyBCYWlsIGlmIHdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgZm9yIHRoZSBkZXNp
cmVkIG51bWJlciBvZiBwaXhlbHMuCiAgICAgICAgIGlmICgoZGF0YS0+c2l6ZSgpIC0gbV9kZWNv
ZGVkT2Zmc2V0KSA8IHBhZGRlZE51bUJ5dGVzKQpAQCAtNzYxLDcgKzc3Miw4IEBAIGJvb2wgQk1Q
SW1hZ2VSZWFkZXI6OnByb2Nlc3NOb25STEVEYXRhKFMKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4
X3QgbWFzayA9ICgxIDw8IG1faW5mb0hlYWRlci5iaUJpdENvdW50KSAtIDE7CiAgICAgICAgICAg
ICBmb3IgKHNpemVfdCBieXRlID0gMDsgYnl0ZSA8IHVucGFkZGVkTnVtQnl0ZXM7ICsrYnl0ZSkg
ewogICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGl4ZWxEYXRhID0gZGF0YS0+ZGF0YSgpW21fZGVj
b2RlZE9mZnNldCArIGJ5dGVdOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IHBpeGVsID0g
MDsgKHBpeGVsIDwgcGl4ZWxzUGVyQnl0ZSkgJiYgKG1fY29vcmQueCgpIDwgZW5kWCk7ICsrcGl4
ZWwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBwaXhlbCA9IDA7CisgICAgICAgICAg
ICAgICAgICAgICAocGl4ZWwgPCBwaXhlbHNQZXJCeXRlKSAmJiAobV9jb29yZC54KCkgPCBlbmRY
KTsgKytwaXhlbCkgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgY29sb3JJbmRl
eCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAocGl4ZWxEYXRhID4+ICg4IC0gbV9pbmZvSGVh
ZGVyLmJpQml0Q291bnQpKSAmIG1hc2s7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtX2FuZE1h
c2tTdGF0ZSA9PSBEZWNvZGluZykgewpAQCAtNzcyLDEyICs3ODQsMTIgQEAgYm9vbCBCTVBJbWFn
ZVJlYWRlcjo6cHJvY2Vzc05vblJMRURhdGEoUwogICAgICAgICAgICAgICAgICAgICAgICAgLy8g
d2ViIHdpbGwgbm90IGJlIGRvaW5nIGEgbG90IG9mIGludmVydGluZy4KICAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIChjb2xvckluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c2V0UkdCQSgwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIu
c2V0SGFzQWxwaGEodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5z
ZXRIYXNBbHBoYSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1fY29vcmQubW92ZSgxLCAwKTsKICAgICAgICAgICAgICAg
ICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvckluZGV4ID49
IG1faW5mb0hlYWRlci5iaUNsclVzZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBt
X2ZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmFpbGVkKCk7
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAg
ICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgc2V0SShjb2xvckluZGV4KTsK
QEAgLTgwNiwxMCArODE4LDEwIEBAIGJvb2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NOb25STEVE
YXRhKFMKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtX3Nl
ZW5Ob25aZXJvQWxwaGFQaXhlbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtX3Nl
ZW5aZXJvQWxwaGFQaXhlbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnplcm9G
aWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnplcm9GaWxsKCk7CiAgICAg
ICAgICAgICAgICAgICAgICAgICBtX3NlZW5aZXJvQWxwaGFQaXhlbCA9IGZhbHNlOwogICAgICAg
ICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFscGhhICE9IDI1NSkKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGJ1ZmZlci5zZXRIYXNBbHBoYSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGJ1ZmZlci0+c2V0SGFzQWxwaGEodHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAg
ICAgICAgICAgc2V0UkdCQShnZXRDb21wb25lbnQocGl4ZWwsIDApLCBnZXRDb21wb25lbnQocGl4
ZWwsIDEpLApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9ibXAvQk1QSW1h
Z2VSZWFkZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJz
L2JtcC9CTVBJbWFnZVJlYWRlci5oCShyZXZpc2lvbiA0NDgzMikKKysrIFdlYkNvcmUvcGxhdGZv
cm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlUmVhZGVyLmgJKHdvcmtpbmcgY29weSkKQEAg
LTUwLDMyICs1MCwyMiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIHZpcnR1YWwgdm9p
ZCBzZXREYXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpOwogICAg
ICAgICB2aXJ0dWFsIFJHQkEzMkJ1ZmZlciogZnJhbWVCdWZmZXJBdEluZGV4KHNpemVfdCBpbmRl
eCk7CiAKLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGVudW0gQW5kTWFza1N0YXRlIHsKLSAgICAg
ICAgICAgIE5vbmUsCi0gICAgICAgICAgICBOb3RZZXREZWNvZGVkLAotICAgICAgICAgICAgRGVj
b2RpbmcsCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gRGVjb2RlcyBhIHNpbmdsZSBCTVAsIHN0
YXJ0aW5nIHdpdGggYW4gaW5mbyBoZWFkZXIuCi0gICAgICAgIHZvaWQgZGVjb2RlQk1QKFNoYXJl
ZEJ1ZmZlciogZGF0YSk7Ci0KLSAgICAgICAgLy8gUmVhZCBhIHZhbHVlIGZyb20gfGRhdGFbbV9k
ZWNvZGVkT2Zmc2V0ICsgYWRkaXRpb25hbE9mZnNldF18LCBjb252ZXJ0aW5nCi0gICAgICAgIC8v
IGZyb20gbGl0dGxlIHRvIG5hdGl2ZSBlbmRpYW5uZXNzLgotICAgICAgICBpbmxpbmUgdWludDE2
X3QgcmVhZFVpbnQxNihTaGFyZWRCdWZmZXIqIGRhdGEsIGludCBhZGRpdGlvbmFsT2Zmc2V0KSBj
b25zdAorICAgICAgICAvLyBSZWFkIGEgdmFsdWUgZnJvbSB8ZGF0YVtvZmZzZXRdfCwgY29udmVy
dGluZyBmcm9tIGxpdHRsZSB0byBuYXRpdmUKKyAgICAgICAgLy8gZW5kaWFubmVzcy4KKyAgICAg
ICAgc3RhdGljIGlubGluZSB1aW50MTZfdCByZWFkVWludDE2SGVscGVyKFNoYXJlZEJ1ZmZlciog
ZGF0YSwgaW50IG9mZnNldCkKICAgICAgICAgewogICAgICAgICAgICAgdWludDE2X3QgcmVzdWx0
OwotICAgICAgICAgICAgbWVtY3B5KCZyZXN1bHQsICZkYXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zm
c2V0ICsgYWRkaXRpb25hbE9mZnNldF0sIDIpOworICAgICAgICAgICAgbWVtY3B5KCZyZXN1bHQs
ICZkYXRhLT5kYXRhKClbb2Zmc2V0XSwgMik7CiAgICAgICAgICNpZiBQTEFURk9STShCSUdfRU5E
SUFOKQogICAgICAgICAgICAgcmVzdWx0ID0gKChyZXN1bHQgJiAweGZmKSA8PCA4KSB8ICgocmVz
dWx0ICYgMHhmZjAwKSA+PiA4KTsKICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICByZXR1cm4g
cmVzdWx0OwogICAgICAgICB9CiAKLSAgICAgICAgaW5saW5lIHVpbnQzMl90IHJlYWRVaW50MzIo
U2hhcmVkQnVmZmVyKiBkYXRhLCBpbnQgYWRkaXRpb25hbE9mZnNldCkgY29uc3QKKyAgICAgICAg
c3RhdGljIGlubGluZSB1aW50MzJfdCByZWFkVWludDMySGVscGVyKFNoYXJlZEJ1ZmZlciogZGF0
YSwgaW50IG9mZnNldCkKICAgICAgICAgewogICAgICAgICAgICAgdWludDMyX3QgcmVzdWx0Owot
ICAgICAgICAgICAgbWVtY3B5KCZyZXN1bHQsICZkYXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0
ICsgYWRkaXRpb25hbE9mZnNldF0sIDQpOworICAgICAgICAgICAgbWVtY3B5KCZyZXN1bHQsICZk
YXRhLT5kYXRhKClbb2Zmc2V0XSwgNCk7CiAgICAgICAgICNpZiBQTEFURk9STShCSUdfRU5ESUFO
KQogICAgICAgICAgICAgcmVzdWx0ID0gKChyZXN1bHQgJiAweGZmKSA8PCAyNCkgfCAoKHJlc3Vs
dCAmIDB4ZmYwMCkgPDwgOCkgfAogICAgICAgICAgICAgICAgICgocmVzdWx0ICYgMHhmZjAwMDAp
ID4+IDgpIHwgKChyZXN1bHQgJiAweGZmMDAwMDAwKSA+PiAyNCk7CkBAIC04MywyNiArNzMsMzcg
QEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAg
ICAgfQogCisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVtIEFuZE1hc2tTdGF0ZSB7CisgICAg
ICAgICAgICBOb25lLAorICAgICAgICAgICAgTm90WWV0RGVjb2RlZCwKKyAgICAgICAgICAgIERl
Y29kaW5nLAorICAgICAgICB9OworCisgICAgICAgIC8vIERvZXMgdGhlIGFjdHVhbCBkZWNvZGlu
Zy4gIFJldHVybnMgd2hldGhlciBkZWNvZGluZyBzdWNjZWVkZWQuCisgICAgICAgIGJvb2wgZGVj
b2RlQk1QKFNoYXJlZEJ1ZmZlciogZGF0YSk7CisKICAgICAgICAgLy8gQW4gaW5kZXggaW50byB8
bV9kYXRhfCByZXByZXNlbnRpbmcgaG93IG11Y2ggd2UndmUgYWxyZWFkeSBkZWNvZGVkLgogICAg
ICAgICBzaXplX3QgbV9kZWNvZGVkT2Zmc2V0OwogCiAgICAgICAgIC8vIFRoZSBmaWxlIG9mZnNl
dCBhdCB3aGljaCB0aGUgQk1QIGluZm8gaGVhZGVyIHN0YXJ0cy4KICAgICAgICAgc2l6ZV90IG1f
aGVhZGVyT2Zmc2V0OwogCi0gICAgICAgIC8vIFRoZSBmaWxlIG9mZnNldCBhdCB3aGljaCB0aGUg
YWN0dWFsIGltYWdlIGJpdHMgc3RhcnQuICBXaGVuIGRlY29kaW5nIElDTwotICAgICAgICAvLyBm
aWxlcywgdGhpcyBpcyBzZXQgdG8gMCwgc2luY2UgaXQncyBub3Qgc3RvcmVkIGFueXdoZXJlIGlu
IGEgaGVhZGVyOyB0aGUKLSAgICAgICAgLy8gcmVhZGVyIGZ1bmN0aW9ucyBleHBlY3QgdGhlIGlt
YWdlIGRhdGEgdG8gc3RhcnQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCi0gICAgICAgIC8vIGhlYWRl
ciBhbmQgKGlmIG5lY2Vzc2FyeSkgY29sb3IgdGFibGUuCisgICAgICAgIC8vIFRoZSBmaWxlIG9m
ZnNldCBhdCB3aGljaCB0aGUgYWN0dWFsIGltYWdlIGJpdHMgc3RhcnQuICBXaGVuIGRlY29kaW5n
CisgICAgICAgIC8vIElDTyBmaWxlcywgdGhpcyBpcyBzZXQgdG8gMCwgc2luY2UgaXQncyBub3Qg
c3RvcmVkIGFueXdoZXJlIGluIGEKKyAgICAgICAgLy8gaGVhZGVyOyB0aGUgcmVhZGVyIGZ1bmN0
aW9ucyBleHBlY3QgdGhlIGltYWdlIGRhdGEgdG8gc3RhcnQKKyAgICAgICAgLy8gaW1tZWRpYXRl
bHkgYWZ0ZXIgdGhlIGhlYWRlciBhbmQgKGlmIG5lY2Vzc2FyeSkgY29sb3IgdGFibGUuCiAgICAg
ICAgIHNpemVfdCBtX2ltZ0RhdGFPZmZzZXQ7CiAKICAgICAgICAgLy8gSUNPcyBzdG9yZSBhIDFi
cHAgIm1hc2siIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYWluIGJpdG1hcCBpbWFnZSBkYXRhCiAg
ICAgICAgIC8vIChhbmQsIGNvbmZ1c2luZ2x5LCBhZGQgaXRzIGhlaWdodCB0byB0aGUgYmlIZWln
aHQgdmFsdWUgaW4gdGhlIGluZm8KLSAgICAgICAgLy8gaGVhZGVyLCB0aHVzIGRvdWJsaW5nIGl0
KS4gIFRoaXMgdmFyaWFibGUgdHJhY2tzIHdoZXRoZXIgd2UgaGF2ZSBzdWNoIGEKLSAgICAgICAg
Ly8gbWFzayBhbmQgaWYgd2UndmUgc3RhcnRlZCBkZWNvZGluZyBpdCB5ZXQuCisgICAgICAgIC8v
IGhlYWRlciwgdGh1cyBkb3VibGluZyBpdCkuICBUaGlzIHZhcmlhYmxlIHRyYWNrcyB3aGV0aGVy
IHdlIGhhdmUgc3VjaAorICAgICAgICAvLyBhIG1hc2sgYW5kIGlmIHdlJ3ZlIHN0YXJ0ZWQgZGVj
b2RpbmcgaXQgeWV0LgogICAgICAgICBBbmRNYXNrU3RhdGUgbV9hbmRNYXNrU3RhdGU7CiAKICAg
ICBwcml2YXRlOgotICAgICAgICAvLyBUaGUgdmFyaW91cyBCTVAgY29tcHJlc3Npb24gdHlwZXMu
ICBXZSBkb24ndCBjdXJyZW50bHkgZGVjb2RlIGFsbCB0aGVzZS4KKyAgICAgICAgLy8gVGhlIHZh
cmlvdXMgQk1QIGNvbXByZXNzaW9uIHR5cGVzLiAgV2UgZG9uJ3QgY3VycmVudGx5IGRlY29kZSBh
bGwKKyAgICAgICAgLy8gdGhlc2UuCiAgICAgICAgIGVudW0gQ29tcHJlc3Npb25UeXBlIHsKICAg
ICAgICAgICAgIC8vIFVuaXZlcnNhbCB0eXBlcwogICAgICAgICAgICAgUkdCID0gMCwKQEAgLTEx
Nyw4ICsxMTgsOCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgICAgICBSTEUyNCwgICAg
ICAvLyBTdG9yZWQgaW4gZmlsZSBhcyA0CiAgICAgICAgIH07CiAKLSAgICAgICAgLy8gVGhlc2Ug
YXJlIGJhc2VkIG9uIHRoZSBXaW5kb3dzIEJJVE1BUElORk9IRUFERVIgYW5kIFJHQlRSSVBMRSBz
dHJ1Y3RzLAotICAgICAgICAvLyBidXQgd2l0aCB1bm5lY2Vzc2FyeSBlbnRyaWVzIHJlbW92ZWQu
CisgICAgICAgIC8vIFRoZXNlIGFyZSBiYXNlZCBvbiB0aGUgV2luZG93cyBCSVRNQVBJTkZPSEVB
REVSIGFuZCBSR0JUUklQTEUKKyAgICAgICAgLy8gc3RydWN0cywgYnV0IHdpdGggdW5uZWNlc3Nh
cnkgZW50cmllcyByZW1vdmVkLgogICAgICAgICBzdHJ1Y3QgQml0bWFwSW5mb0hlYWRlciB7CiAg
ICAgICAgICAgICB1aW50MzJfdCBiaVNpemU7CiAgICAgICAgICAgICBpbnQzMl90IGJpV2lkdGg7
CkBAIC0xMzMsMTYgKzEzNCwyNCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgICAgICB1
aW50OF90IHJnYlJlZDsKICAgICAgICAgfTsKIAotICAgICAgICAvLyBEZXRlcm1pbmVzIHRoZSBz
aXplIG9mIHRoZSBCTVAgaW5mbyBoZWFkZXIuICBSZXR1cm5zIHRydWUgaWYgdGhlIHNpemUgaXMK
LSAgICAgICAgLy8gdmFsaWQuCisgICAgICAgIGlubGluZSB1aW50MTZfdCByZWFkVWludDE2KFNo
YXJlZEJ1ZmZlciogZGF0YSwgaW50IG9mZnNldCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJu
IHJlYWRVaW50MTZIZWxwZXIoZGF0YSwgbV9kZWNvZGVkT2Zmc2V0ICsgb2Zmc2V0KTsKKyAgICAg
ICAgfQorCisgICAgICAgIGlubGluZSB1aW50MzJfdCByZWFkVWludDMyKFNoYXJlZEJ1ZmZlciog
ZGF0YSwgaW50IG9mZnNldCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHJlYWRVaW50MzJI
ZWxwZXIoZGF0YSwgbV9kZWNvZGVkT2Zmc2V0ICsgb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAg
ICAgIC8vIERldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIEJNUCBpbmZvIGhlYWRlci4gIFJldHVy
bnMgdHJ1ZSBpZiB0aGUgc2l6ZQorICAgICAgICAvLyBpcyB2YWxpZC4KICAgICAgICAgYm9vbCBn
ZXRJbmZvSGVhZGVyU2l6ZShTaGFyZWRCdWZmZXIqIGRhdGEpOwogCi0gICAgICAgIC8vIFByb2Nl
c3NlcyB0aGUgQk1QIGluZm8gaGVhZGVyLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBpbmZvIGhlYWRl
ciBjb3VsZCBiZQotICAgICAgICAvLyBkZWNvZGVkLgorICAgICAgICAvLyBQcm9jZXNzZXMgdGhl
IEJNUCBpbmZvIGhlYWRlci4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5mbyBoZWFkZXIgY291bGQK
KyAgICAgICAgLy8gYmUgZGVjb2RlZC4KICAgICAgICAgYm9vbCBwcm9jZXNzSW5mb0hlYWRlcihT
aGFyZWRCdWZmZXIqIGRhdGEpOwogCi0gICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgcHJv
Y2Vzc0luZm9IZWFkZXIoKSB3aGljaCBkb2VzIHRoZSBhY3R1YWwgcmVhZGluZyBvZgotICAgICAg
ICAvLyBoZWFkZXIgdmFsdWVzIGZyb20gdGhlIGJ5dGUgc3RyZWFtLiAgUmV0dXJucyBmYWxzZSBv
biBlcnJvci4KKyAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwcm9jZXNzSW5mb0hlYWRl
cigpIHdoaWNoIGRvZXMgdGhlIGFjdHVhbCByZWFkaW5nCisgICAgICAgIC8vIG9mIGhlYWRlciB2
YWx1ZXMgZnJvbSB0aGUgYnl0ZSBzdHJlYW0uICBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLgogICAg
ICAgICBib29sIHJlYWRJbmZvSGVhZGVyKFNoYXJlZEJ1ZmZlciogZGF0YSk7CiAKICAgICAgICAg
Ly8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBXaW5kb3dzIFY0KyBCTVAuCkBAIC0xNTUsMTIg
KzE2NCwxMyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIC8vIFJldHVybnMgZmFsc2Ug
aWYgY29uc2lzdGVuY3kgZXJyb3JzIGFyZSBmb3VuZCBpbiB0aGUgaW5mbyBoZWFkZXIuCiAgICAg
ICAgIGJvb2wgaXNJbmZvSGVhZGVyVmFsaWQoKSBjb25zdDsKIAotICAgICAgICAvLyBGb3IgQklf
QklURklFTERTIGltYWdlcywgaW5pdGlhbGl6ZXMgdGhlIG1fYml0TWFza3NbXSBhbmQgbV9iaXRP
ZmZzZXRzW10KLSAgICAgICAgLy8gYXJyYXlzLiAgcHJvY2Vzc0luZm9IZWFkZXIoKSB3aWxsIGlu
aXRpYWxpemUgdGhlc2UgZm9yIG90aGVyIGNvbXByZXNzaW9uCi0gICAgICAgIC8vIHR5cGVzIHdo
ZXJlIG5lZWRlZC4KKyAgICAgICAgLy8gRm9yIEJJX0JJVEZJRUxEUyBpbWFnZXMsIGluaXRpYWxp
emVzIHRoZSBtX2JpdE1hc2tzW10gYW5kCisgICAgICAgIC8vIG1fYml0T2Zmc2V0c1tdIGFycmF5
cy4gIHByb2Nlc3NJbmZvSGVhZGVyKCkgd2lsbCBpbml0aWFsaXplIHRoZXNlIGZvcgorICAgICAg
ICAvLyBvdGhlciBjb21wcmVzc2lvbiB0eXBlcyB3aGVyZSBuZWVkZWQuCiAgICAgICAgIGJvb2wg
cHJvY2Vzc0JpdG1hc2tzKFNoYXJlZEJ1ZmZlciogZGF0YSk7CiAKLSAgICAgICAgLy8gRm9yIHBh
bGV0dGVkIGltYWdlcywgYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyB0aGUgbV9jb2xvclRhYmxl
W10gYXJyYXkuCisgICAgICAgIC8vIEZvciBwYWxldHRlZCBpbWFnZXMsIGFsbG9jYXRlcyBhbmQg
aW5pdGlhbGl6ZXMgdGhlIG1fY29sb3JUYWJsZVtdCisgICAgICAgIC8vIGFycmF5LgogICAgICAg
ICBib29sIHByb2Nlc3NDb2xvclRhYmxlKFNoYXJlZEJ1ZmZlciogZGF0YSk7CiAKICAgICAgICAg
Ly8gUHJvY2Vzc2VzIGFuIFJMRS1lbmNvZGVkIGltYWdlLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBl
bnRpcmUgaW1hZ2Ugd2FzCkBAIC0xNzIsMTQgKzE4MiwxNSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAgICAgICAgIC8vICAgICBwcm9jZXNzIHxudW1QaXhlbHN8IHBpeGVscyBvbiB0aGUgY3VycmVu
dCByb3c7IHJldHVybnMgdHJ1ZSBvbgogICAgICAgICAvLyAgICAgc3VjY2Vzcy4KICAgICAgICAg
Ly8gICAqIGluUkxFID0gZmFsc2U6IHRoZSBkYXRhIGlzIGluc2lkZSBhIG5vbi1STEUtZW5jb2Rl
ZCBiaXRtYXAuCi0gICAgICAgIC8vICAgICB8bnVtUGl4ZWxzfCBpcyBpZ25vcmVkLiAgRXhwZWN0
cyB8bV9jb29yZHwgdG8gcG9pbnQgYXQgdGhlIGJlZ2lubmluZwotICAgICAgICAvLyAgICAgb2Yg
dGhlIG5leHQgcm93IHRvIGJlIGRlY29kZWQuICBUcmllcyB0byBwcm9jZXNzIGFzIG1hbnkgY29t
cGxldGUKLSAgICAgICAgLy8gICAgIHJvd3MgYXMgcG9zc2libGUuICBSZXR1cm5zIHRydWUgaWYg
dGhlIHdob2xlIGltYWdlIHdhcyBkZWNvZGVkLgorICAgICAgICAvLyAgICAgfG51bVBpeGVsc3wg
aXMgaWdub3JlZC4gIEV4cGVjdHMgfG1fY29vcmR8IHRvIHBvaW50IGF0IHRoZQorICAgICAgICAv
LyAgICAgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHJvdyB0byBiZSBkZWNvZGVkLiAgVHJpZXMgdG8g
cHJvY2VzcyBhcworICAgICAgICAvLyAgICAgbWFueSBjb21wbGV0ZSByb3dzIGFzIHBvc3NpYmxl
LiAgUmV0dXJucyB0cnVlIGlmIHRoZSB3aG9sZSBpbWFnZQorICAgICAgICAvLyAgICAgd2FzIGRl
Y29kZWQuCiAgICAgICAgIGJvb2wgcHJvY2Vzc05vblJMRURhdGEoU2hhcmVkQnVmZmVyKiBkYXRh
LCBib29sIGluUkxFLCBpbnQgbnVtUGl4ZWxzKTsKIAogICAgICAgICAvLyBSZXR1cm5zIHRydWUg
aWYgdGhlIGN1cnJlbnQgeS1jb29yZGluYXRlIHBsdXMgfG51bVJvd3N8IHdvdWxkIGJlIHBhc3QK
LSAgICAgICAgLy8gdGhlIGVuZCBvZiB0aGUgaW1hZ2UuICBIZXJlICJwbHVzIiBtZWFucyAidG93
YXJkIHRoZSBlbmQgb2YgdGhlIGltYWdlIiwKLSAgICAgICAgLy8gc28gZG93bndhcmRzIGZvciBt
X2lzVG9wRG93biBpbWFnZXMgYW5kIHVwd2FyZHMgb3RoZXJ3aXNlLgorICAgICAgICAvLyB0aGUg
ZW5kIG9mIHRoZSBpbWFnZS4gIEhlcmUgInBsdXMiIG1lYW5zICJ0b3dhcmQgdGhlIGVuZCBvZiB0
aGUKKyAgICAgICAgLy8gaW1hZ2UiLCBzbyBkb3dud2FyZHMgZm9yIG1faXNUb3BEb3duIGltYWdl
cyBhbmQgdXB3YXJkcyBvdGhlcndpc2UuCiAgICAgICAgIGlubGluZSBib29sIHBhc3RFbmRPZklt
YWdlKGludCBudW1Sb3dzKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbV9pc1RvcERv
d24KQEAgLTE5MCw4ICsyMDEsOCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIC8vIFJl
dHVybnMgdGhlIHBpeGVsIGRhdGEgZm9yIHRoZSBjdXJyZW50IFggY29vcmRpbmF0ZSBpbiBhIHVp
bnQzMl90LgogICAgICAgICAvLyBBc3N1bWVzIG1fZGVjb2RlZE9mZnNldCBoYXMgYmVlbiBzZXQg
dG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudAogICAgICAgICAvLyByb3cuCi0gICAgICAg
IC8vIE5PVEU6IE9ubHkgYXMgbWFueSBieXRlcyBvZiB0aGUgcmV0dXJuIHZhbHVlIGFzIGFyZSBu
ZWVkZWQgdG8gaG9sZCB0aGUKLSAgICAgICAgLy8gcGl4ZWwgZGF0YSB3aWxsIGFjdHVhbGx5IGJl
IHNldC4KKyAgICAgICAgLy8gTk9URTogT25seSBhcyBtYW55IGJ5dGVzIG9mIHRoZSByZXR1cm4g
dmFsdWUgYXMgYXJlIG5lZWRlZCB0byBob2xkCisgICAgICAgIC8vIHRoZSBwaXhlbCBkYXRhIHdp
bGwgYWN0dWFsbHkgYmUgc2V0LgogICAgICAgICBpbmxpbmUgdWludDMyX3QgcmVhZEN1cnJlbnRQ
aXhlbChTaGFyZWRCdWZmZXIqIGRhdGEsIGludCBieXRlc1BlclBpeGVsKSBjb25zdAogICAgICAg
ICB7CiAgICAgICAgICAgICBjb25zdCBpbnQgYWRkaXRpb25hbE9mZnNldCA9IG1fY29vcmQueCgp
ICogYnl0ZXNQZXJQaXhlbDsKQEAgLTIwMCw5ICsyMTEsOSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRVaW50MTYoZGF0YSwgYWRkaXRpb25hbE9mZnNl
dCk7CiAKICAgICAgICAgICAgIGNhc2UgMzogewotICAgICAgICAgICAgICAgIC8vIEl0IGRvZXNu
J3QgbWF0dGVyIHRoYXQgd2UgbmV2ZXIgc2V0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgb2YK
LSAgICAgICAgICAgICAgICAvLyB0aGUgcmV0dXJuIHZhbHVlIGhlcmUgaW4gbGl0dGxlLWVuZGlh
biBtb2RlLCB0aGUgY2FsbGVyIHdvbid0Ci0gICAgICAgICAgICAgICAgLy8gcmVhZCBpdC4KKyAg
ICAgICAgICAgICAgICAvLyBJdCBkb2Vzbid0IG1hdHRlciB0aGF0IHdlIG5ldmVyIHNldCB0aGUg
bW9zdCBzaWduaWZpY2FudCBieXRlCisgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHJldHVybiB2
YWx1ZSBoZXJlIGluIGxpdHRsZS1lbmRpYW4gbW9kZSwgdGhlIGNhbGxlcgorICAgICAgICAgICAg
ICAgIC8vIHdvbid0IHJlYWQgaXQuCiAgICAgICAgICAgICAgICAgdWludDMyX3QgcGl4ZWw7CiAg
ICAgICAgICAgICAgICAgbWVtY3B5KCZwaXhlbCwKICAgICAgICAgICAgICAgICAgICAgICAgJmRh
dGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQgKyBhZGRpdGlvbmFsT2Zmc2V0XSwgMyk7CkBAIC0y
MjIsMTIgKzIzMywxMiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgICAgICB9CiAgICAg
ICAgIH0KIAotICAgICAgICAvLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZGVzaXJlZCBjb21w
b25lbnQgKDAsIDEsIDIsIDMgPT0gUiwgRywgQiwgQSkgaW4KLSAgICAgICAgLy8gdGhlIGdpdmVu
IHBpeGVsIGRhdGEuCisgICAgICAgIC8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBkZXNpcmVk
IGNvbXBvbmVudCAoMCwgMSwgMiwgMyA9PSBSLCBHLCBCLCBBKQorICAgICAgICAvLyBpbiB0aGUg
Z2l2ZW4gcGl4ZWwgZGF0YS4KICAgICAgICAgaW5saW5lIHVuc2lnbmVkIGdldENvbXBvbmVudCh1
aW50MzJfdCBwaXhlbCwgaW50IGNvbXBvbmVudCkgY29uc3QKICAgICAgICAgewotICAgICAgICAg
ICAgcmV0dXJuICgocGl4ZWwgJiBtX2JpdE1hc2tzW2NvbXBvbmVudF0pID4+IG1fYml0U2hpZnRz
UmlnaHRbY29tcG9uZW50XSkKLSAgICAgICAgICAgICAgICA8PCBtX2JpdFNoaWZ0c0xlZnRbY29t
cG9uZW50XTsKKyAgICAgICAgICAgIHJldHVybiAoKHBpeGVsICYgbV9iaXRNYXNrc1tjb21wb25l
bnRdKSA+PgorICAgICAgICAgICAgICAgIG1fYml0U2hpZnRzUmlnaHRbY29tcG9uZW50XSkgPDwg
bV9iaXRTaGlmdHNMZWZ0W2NvbXBvbmVudF07CiAgICAgICAgIH0KIAogICAgICAgICBpbmxpbmUg
dW5zaWduZWQgZ2V0QWxwaGEodWludDMyX3QgcGl4ZWwpIGNvbnN0CkBAIC0yNDAsNDkgKzI1MSw1
NyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBTZXRzIHRo
ZSBjdXJyZW50IHBpeGVsIHRvIHRoZSBjb2xvciBnaXZlbiBieSB8Y29sb3JJbmRleHwuICBUaGlz
IGFsc28KLSAgICAgICAgLy8gaW5jcmVtZW50cyB0aGUgcmVsZXZhbnQgbG9jYWwgdmFyaWFibGVz
IHRvIG1vdmUgdGhlIGN1cnJlbnQgcGl4ZWwgcmlnaHQKLSAgICAgICAgLy8gYnkgb25lLgorICAg
ICAgICAvLyBpbmNyZW1lbnRzIHRoZSByZWxldmFudCBsb2NhbCB2YXJpYWJsZXMgdG8gbW92ZSB0
aGUgY3VycmVudCBwaXhlbAorICAgICAgICAvLyByaWdodCBieSBvbmUuCiAgICAgICAgIGlubGlu
ZSB2b2lkIHNldEkoc2l6ZV90IGNvbG9ySW5kZXgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHNl
dFJHQkEobV9jb2xvclRhYmxlW2NvbG9ySW5kZXhdLnJnYlJlZCwgbV9jb2xvclRhYmxlW2NvbG9y
SW5kZXhdLnJnYkdyZWVuLAorICAgICAgICAgICAgc2V0UkdCQShtX2NvbG9yVGFibGVbY29sb3JJ
bmRleF0ucmdiUmVkLAorICAgICAgICAgICAgICAgICAgICBtX2NvbG9yVGFibGVbY29sb3JJbmRl
eF0ucmdiR3JlZW4sCiAgICAgICAgICAgICAgICAgICAgIG1fY29sb3JUYWJsZVtjb2xvckluZGV4
XS5yZ2JCbHVlLCAweGZmKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIExpa2Ugc2V0SSgpLCBi
dXQgd2l0aCB0aGUgaW5kaXZpZHVhbCBjb21wb25lbnQgdmFsdWVzIHNwZWNpZmllZC4KLSAgICAg
ICAgaW5saW5lIHZvaWQgc2V0UkdCQSh1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLCB1bnNp
Z25lZCBibHVlLCB1bnNpZ25lZCBhbHBoYSkKKyAgICAgICAgaW5saW5lIHZvaWQgc2V0UkdCQSh1
bnNpZ25lZCByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZ3JlZW4s
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYmx1ZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB1bnNpZ25lZCBhbHBoYSkKICAgICAgICAgewogICAgICAgICAgICAg
bV9mcmFtZUJ1ZmZlckNhY2hlLmZpcnN0KCkuc2V0UkdCQShtX2Nvb3JkLngoKSwgbV9jb29yZC55
KCksIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKICAgICAgICAgICAgIG1fY29vcmQubW92ZSgx
LCAwKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEZpbGxzIHBpeGVscyBmcm9tIHRoZSBjdXJy
ZW50IFgtY29vcmRpbmF0ZSB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsCi0gICAgICAgIC8vIHxl
bmRDb29yZHwgd2l0aCB0aGUgY29sb3IgZ2l2ZW4gYnkgdGhlIGluZGl2aWR1YWwgY29tcG9uZW50
cy4gIFRoaXMgYWxzbwotICAgICAgICAvLyBpbmNyZW1lbnRzIHRoZSByZWxldmFudCBsb2NhbCB2
YXJpYWJsZXMgdG8gbW92ZSB0aGUgY3VycmVudCBwaXhlbCByaWdodAotICAgICAgICAvLyB0byB8
ZW5kQ29vcmR8LgotICAgICAgICBpbmxpbmUgdm9pZCBmaWxsUkdCQShpbnQgZW5kQ29vcmQsIHVu
c2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sIHVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIGFscGhh
KQorICAgICAgICAvLyB8ZW5kQ29vcmR8IHdpdGggdGhlIGNvbG9yIGdpdmVuIGJ5IHRoZSBpbmRp
dmlkdWFsIGNvbXBvbmVudHMuICBUaGlzCisgICAgICAgIC8vIGFsc28gaW5jcmVtZW50cyB0aGUg
cmVsZXZhbnQgbG9jYWwgdmFyaWFibGVzIHRvIG1vdmUgdGhlIGN1cnJlbnQKKyAgICAgICAgLy8g
cGl4ZWwgcmlnaHQgdG8gfGVuZENvb3JkfC4KKyAgICAgICAgaW5saW5lIHZvaWQgZmlsbFJHQkEo
aW50IGVuZENvb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZWQs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGdyZWVuLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBibHVlLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB1bnNpZ25lZCBhbHBoYSkKICAgICAgICAgewogICAgICAgICAgICAgd2hpbGUgKG1f
Y29vcmQueCgpIDwgZW5kQ29vcmQpCiAgICAgICAgICAgICAgICAgc2V0UkdCQShyZWQsIGdyZWVu
LCBibHVlLCBhbHBoYSk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBSZXNldHMgdGhlIHJlbGV2
YW50IGxvY2FsIHZhcmlhYmxlcyB0byBzdGFydCBkcmF3aW5nIGF0IHRoZSBsZWZ0IGVkZ2Ugb2YK
LSAgICAgICAgLy8gdGhlICJuZXh0IiByb3csIHdoZXJlICJuZXh0IiBpcyBhYm92ZSBvciBiZWxv
dyB0aGUgY3VycmVudCByb3cgZGVwZW5kaW5nCi0gICAgICAgIC8vIG9uIHRoZSB2YWx1ZSBvZiB8
bV9pc1RvcERvd258LgorICAgICAgICAvLyBSZXNldHMgdGhlIHJlbGV2YW50IGxvY2FsIHZhcmlh
YmxlcyB0byBzdGFydCBkcmF3aW5nIGF0IHRoZSBsZWZ0IGVkZ2UKKyAgICAgICAgLy8gb2YgdGhl
ICJuZXh0IiByb3csIHdoZXJlICJuZXh0IiBpcyBhYm92ZSBvciBiZWxvdyB0aGUgY3VycmVudCBy
b3cKKyAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB8bV9pc1RvcERvd258Lgog
ICAgICAgICB2b2lkIG1vdmVCdWZmZXJUb05leHRSb3coKTsKIAogICAgICAgICAvLyBUaGUgQk1Q
IGluZm8gaGVhZGVyLgogICAgICAgICBCaXRtYXBJbmZvSGVhZGVyIG1faW5mb0hlYWRlcjsKIAot
ICAgICAgICAvLyBUcnVlIGlmIHRoaXMgaXMgYW4gT1MvMiAxLnggKGFrYSBXaW5kb3dzIDIueCkg
Qk1QLiAgVGhlIHN0cnVjdCBsYXlvdXRzCi0gICAgICAgIC8vIGZvciB0aGlzIHR5cGUgb2YgQk1Q
IGFyZSBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgbGF0ZXIsIG1vcmUgY29tbW9uCi0gICAg
ICAgIC8vIGZvcm1hdHMuCisgICAgICAgIC8vIFRydWUgaWYgdGhpcyBpcyBhbiBPUy8yIDEueCAo
YWthIFdpbmRvd3MgMi54KSBCTVAuICBUaGUgc3RydWN0CisgICAgICAgIC8vIGxheW91dHMgZm9y
IHRoaXMgdHlwZSBvZiBCTVAgYXJlIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIHRoZSBsYXRlciwK
KyAgICAgICAgLy8gbW9yZSBjb21tb24gZm9ybWF0cy4KICAgICAgICAgYm9vbCBtX2lzT1MyMXg7
CiAKICAgICAgICAgLy8gVHJ1ZSBpZiB0aGlzIGlzIGFuIE9TLzIgMi54IEJNUC4gIFRoZSBtZWFu
aW5ncyBvZiBjb21wcmVzc2lvbiB0eXBlcyAzCiAgICAgICAgIC8vIGFuZCA0IGZvciB0aGlzIHR5
cGUgb2YgQk1QIGRpZmZlciBmcm9tIFdpbmRvd3MgVjMrIEJNUHMuCiAgICAgICAgIC8vCi0gICAg
ICAgIC8vIFRoaXMgd2lsbCBiZSBmYWxzZWx5IG5lZ2F0aXZlIGluIHNvbWUgY2FzZXMsIGJ1dCBv
bmx5IG9uZXMgd2hlcmUgdGhlIHdheQotICAgICAgICAvLyB3ZSBtaXNpbnRlcnByZXQgdGhlIGRh
dGEgaXMgaXJyZWxldmFudC4KKyAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGZhbHNlbHkgbmVnYXRp
dmUgaW4gc29tZSBjYXNlcywgYnV0IG9ubHkgb25lcyB3aGVyZSB0aGUKKyAgICAgICAgLy8gd2F5
IHdlIG1pc2ludGVycHJldCB0aGUgZGF0YSBpcyBpcnJlbGV2YW50LgogICAgICAgICBib29sIG1f
aXNPUzIyeDsKIAogICAgICAgICAvLyBUcnVlIGlmIHRoZSBCTVAgaXMgbm90IHZlcnRpY2FsbHkg
ZmxpcHBlZCwgdGhhdCBpcywgdGhlIGZpcnN0IGxpbmUgb2YKQEAgLTI5MywxNSArMzEyLDE3IEBA
IG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgYm9vbCBtX25lZWRUb1Byb2Nlc3NCaXRtYXNr
czsKICAgICAgICAgYm9vbCBtX25lZWRUb1Byb2Nlc3NDb2xvclRhYmxlOwogCi0gICAgICAgIC8v
IE1hc2tzL29mZnNldHMgZm9yIHRoZSBjb2xvciB2YWx1ZXMgZm9yIG5vbi1wYWxldHRlIGZvcm1h
dHMuICBUaGVzZSBhcmUKLSAgICAgICAgLy8gYml0d2lzZSwgd2l0aCBhcnJheSBlbnRyaWVzIDAs
IDEsIDIsIDMgY29ycmVzcG9uZGluZyB0byBSLCBHLCBCLCBBLgorICAgICAgICAvLyBNYXNrcy9v
ZmZzZXRzIGZvciB0aGUgY29sb3IgdmFsdWVzIGZvciBub24tcGFsZXR0ZSBmb3JtYXRzLiAgVGhl
c2UKKyAgICAgICAgLy8gYXJlIGJpdHdpc2UsIHdpdGggYXJyYXkgZW50cmllcyAwLCAxLCAyLCAz
IGNvcnJlc3BvbmRpbmcgdG8gUiwgRywgQiwKKyAgICAgICAgLy8gQS4KICAgICAgICAgLy8KICAg
ICAgICAgLy8gVGhlIHJpZ2h0L2xlZnQgc2hpZnQgdmFsdWVzIGFyZSBtZWFudCB0byBiZSBhcHBs
aWVkIGFmdGVyIHRoZSBtYXNrcy4KLSAgICAgICAgLy8gV2UgbmVlZCB0byByaWdodCBzaGlmdCB0
byBjb21wZW5zYXRlIGZvciB0aGUgYml0ZmllbGRzJyBvZmZzZXRzIGludG8gdGhlCi0gICAgICAg
IC8vIDMyIGJpdHMgb2YgcGl4ZWwgZGF0YSwgYW5kIGxlZnQgc2hpZnQgdG8gc2NhbGUgdGhlIGNv
bG9yIHZhbHVlcyB1cCBmb3IKLSAgICAgICAgLy8gZmllbGRzIHdpdGggbGVzcyB0aGFuIDggYml0
cyBvZiBwcmVjaXNpb24uICBTYWRseSwgd2UgY2FuJ3QganVzdCBjb21iaW5lCi0gICAgICAgIC8v
IHRoZXNlIGludG8gb25lIHNoaWZ0IHZhbHVlIGJlY2F1c2UgdGhlIG5ldCBzaGlmdCBhbW91bnQg
Y291bGQgZ28gZWl0aGVyCi0gICAgICAgIC8vIGRpcmVjdGlvbi4gIChJZiBvbmx5ICI8PCAteCIg
d2VyZSBlcXVpdmFsZW50IHRvICI+PiB4Ii4uLikKKyAgICAgICAgLy8gV2UgbmVlZCB0byByaWdo
dCBzaGlmdCB0byBjb21wZW5zYXRlIGZvciB0aGUgYml0ZmllbGRzJyBvZmZzZXRzIGludG8KKyAg
ICAgICAgLy8gdGhlIDMyIGJpdHMgb2YgcGl4ZWwgZGF0YSwgYW5kIGxlZnQgc2hpZnQgdG8gc2Nh
bGUgdGhlIGNvbG9yIHZhbHVlcworICAgICAgICAvLyB1cCBmb3IgZmllbGRzIHdpdGggbGVzcyB0
aGFuIDggYml0cyBvZiBwcmVjaXNpb24uICBTYWRseSwgd2UgY2FuJ3QKKyAgICAgICAgLy8ganVz
dCBjb21iaW5lIHRoZXNlIGludG8gb25lIHNoaWZ0IHZhbHVlIGJlY2F1c2UgdGhlIG5ldCBzaGlm
dCBhbW91bnQKKyAgICAgICAgLy8gY291bGQgZ28gZWl0aGVyIGRpcmVjdGlvbi4gIChJZiBvbmx5
ICI8PCAteCIgd2VyZSBlcXVpdmFsZW50IHRvCisgICAgICAgIC8vICI+PiB4Ii4uLikKICAgICAg
ICAgdWludDMyX3QgbV9iaXRNYXNrc1s0XTsKICAgICAgICAgaW50IG1fYml0U2hpZnRzUmlnaHRb
NF07CiAgICAgICAgIGludCBtX2JpdFNoaWZ0c0xlZnRbNF07CkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2ltYWdlLWRlY29kZXJzL2ljby9JQ09JbWFnZURlY29kZXIuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvaWNvL0lDT0ltYWdlRGVjb2Rlci5jcHAJ
KHJldmlzaW9uIDQ0ODMyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28v
SUNPSW1hZ2VEZWNvZGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzksNiArMzksMjUgQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogc3RhdGljIGNvbnN0IHNpemVfdCBzaXplT2ZEaXJlY3RvcnkgPSA2
Owogc3RhdGljIGNvbnN0IHNpemVfdCBzaXplT2ZEaXJFbnRyeSA9IDE2OwogCitJQ09JbWFnZURl
Y29kZXI6OklDT0ltYWdlRGVjb2Rlcihjb25zdCBJbnRTaXplJiBwcmVmZXJyZWRJY29uU2l6ZSkK
KyAgICA6IEJNUEltYWdlUmVhZGVyKCkKKyAgICAsIG1fcHJlZmVycmVkSWNvblNpemUocHJlZmVy
cmVkSWNvblNpemUpCisgICAgLCBtX2ltYWdlVHlwZShVbmtub3duKQoreworICAgIG1fYW5kTWFz
a1N0YXRlID0gTm90WWV0RGVjb2RlZDsKK30KKworYm9vbCBJQ09JbWFnZURlY29kZXI6OmlzU2l6
ZUF2YWlsYWJsZSgpCit7CisgICAgcmV0dXJuIChtX2ltYWdlVHlwZSA9PSBQTkcpID8KKyAgICAg
ICAgbV9wbmdEZWNvZGVyLmlzU2l6ZUF2YWlsYWJsZSgpIDogQk1QSW1hZ2VSZWFkZXI6OmlzU2l6
ZUF2YWlsYWJsZSgpOworfQorCitJbnRTaXplIElDT0ltYWdlRGVjb2Rlcjo6c2l6ZSgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIChtX2ltYWdlVHlwZSA9PSBQTkcpID8gbV9wbmdEZWNvZGVyLnNpemUo
KSA6IEJNUEltYWdlUmVhZGVyOjpzaXplKCk7Cit9CisKIHZvaWQgSUNPSW1hZ2VEZWNvZGVyOjpk
ZWNvZGVJbWFnZShTaGFyZWRCdWZmZXIqIGRhdGEpCiB7CiAgICAgLy8gUmVhZCBhbmQgcHJvY2Vz
cyBkaXJlY3RvcnkuCkBAIC00NiwxOCArNjUsMTQgQEAgdm9pZCBJQ09JbWFnZURlY29kZXI6OmRl
Y29kZUltYWdlKFNoYXJlZAogICAgICAgICByZXR1cm47CiAKICAgICAvLyBSZWFkIGFuZCBwcm9j
ZXNzIGRpcmVjdG9yeSBlbnRyaWVzLgotICAgIGlmICgobV9kZWNvZGVkT2Zmc2V0IDwgKHNpemVP
ZkRpcmVjdG9yeSArIChtX2RpcmVjdG9yeS5pZENvdW50ICogc2l6ZU9mRGlyRW50cnkpKSkKKyAg
ICBpZiAoKG1fZGVjb2RlZE9mZnNldCA8CisgICAgICAgICAgICAoc2l6ZU9mRGlyZWN0b3J5ICsg
KG1fZGlyZWN0b3J5LmlkQ291bnQgKiBzaXplT2ZEaXJFbnRyeSkpKQogICAgICAgICAmJiAhcHJv
Y2Vzc0RpcmVjdG9yeUVudHJpZXMoZGF0YSkpCiAgICAgICAgIHJldHVybjsKIAotICAgIC8vIENo
ZWNrIGlmIHRoaXMgZW50cnkgaXMgYSBQTkc7IHdlIG5lZWQgNCBieXRlcyB0byBjaGVjayB0aGUg
bWFnaWMgbnVtYmVyLgotICAgIGlmIChtX2ltYWdlVHlwZSA9PSBVbmtub3duKSB7Ci0gICAgICAg
IGlmIChkYXRhLT5zaXplKCkgPCAobV9kaXJFbnRyeS5kd0ltYWdlT2Zmc2V0ICsgNCkpCi0gICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIG1faW1hZ2VUeXBlID0KLSAgICAgICAgICAgIHN0cm5j
bXAoJmRhdGEtPmRhdGEoKVttX2RpckVudHJ5LmR3SW1hZ2VPZmZzZXRdLCAiXHg4OVBORyIsIDQp
ID8KLSAgICAgICAgICAgIEJNUCA6IFBORzsKLSAgICB9CisgICAgLy8gR2V0IHRoZSBpbWFnZSB0
eXBlLgorICAgIGlmICgobV9pbWFnZVR5cGUgPT0gVW5rbm93bikgJiYgIXByb2Nlc3NJbWFnZVR5
cGUoZGF0YSkpCisgICAgICAgIHJldHVybjsKIAogICAgIC8vIERlY29kZSBzZWxlY3RlZCBlbnRy
eS4KICAgICBpZiAobV9pbWFnZVR5cGUgPT0gUE5HKQpAQCAtODAsMTcgKzk1LDYgQEAgUkdCQTMy
QnVmZmVyKiBJQ09JbWFnZURlY29kZXI6OmZyYW1lQnVmZgogICAgICAgICBCTVBJbWFnZVJlYWRl
cjo6ZnJhbWVCdWZmZXJBdEluZGV4KDApOwogfQogCi1ib29sIElDT0ltYWdlRGVjb2Rlcjo6aXNT
aXplQXZhaWxhYmxlKCkKLXsKLSAgICByZXR1cm4gKG1faW1hZ2VUeXBlID09IFBORykgPyBtX3Bu
Z0RlY29kZXIuaXNTaXplQXZhaWxhYmxlKCkgOgotICAgICAgICBCTVBJbWFnZVJlYWRlcjo6aXNT
aXplQXZhaWxhYmxlKCk7Ci19Ci0KLUludFNpemUgSUNPSW1hZ2VEZWNvZGVyOjpzaXplKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gKG1faW1hZ2VUeXBlID09IFBORykgPyBtX3BuZ0RlY29kZXIuc2l6
ZSgpIDogQk1QSW1hZ2VSZWFkZXI6OnNpemUoKTsKLX0KLQogYm9vbCBJQ09JbWFnZURlY29kZXI6
OnByb2Nlc3NEaXJlY3RvcnkoU2hhcmVkQnVmZmVyKiBkYXRhKQogewogICAgIC8vIFJlYWQgZGly
ZWN0b3J5LgpAQCAtMTA5LDE3ICsxMTMsMTggQEAgYm9vbCBJQ09JbWFnZURlY29kZXI6OnByb2Nl
c3NEaXJlY3RvcnkoUwogICAgIH07CiAgICAgaWYgKCgoZmlsZVR5cGUgIT0gSUNPTikgJiYgKGZp
bGVUeXBlICE9IENVUlNPUikpIHx8CiAgICAgICAgICAgICAobV9kaXJlY3RvcnkuaWRDb3VudCA9
PSAwKSkKLSAgICAgICAgbV9mYWlsZWQgPSB0cnVlOworICAgICAgICBzZXRGYWlsZWQoKTsKIAot
ICAgIHJldHVybiAhbV9mYWlsZWQ7CisgICAgcmV0dXJuICFmYWlsZWQoKTsKIH0KIAogYm9vbCBJ
Q09JbWFnZURlY29kZXI6OnByb2Nlc3NEaXJlY3RvcnlFbnRyaWVzKFNoYXJlZEJ1ZmZlciogZGF0
YSkKIHsKICAgICAvLyBSZWFkIGRpcmVjdG9yeSBlbnRyaWVzLgogICAgIEFTU0VSVChtX2RlY29k
ZWRPZmZzZXQgPT0gc2l6ZU9mRGlyZWN0b3J5KTsKLSAgICBpZiAoKG1fZGVjb2RlZE9mZnNldCA+
IGRhdGEtPnNpemUoKSkgfHwgKGRhdGEtPnNpemUoKSAtIG1fZGVjb2RlZE9mZnNldCkgPAotICAg
ICAgICAgICAgKG1fZGlyZWN0b3J5LmlkQ291bnQgKiBzaXplT2ZEaXJFbnRyeSkpCisgICAgaWYg
KChtX2RlY29kZWRPZmZzZXQgPiBkYXRhLT5zaXplKCkpCisgICAgICAgIHx8ICgoZGF0YS0+c2l6
ZSgpIC0gbV9kZWNvZGVkT2Zmc2V0KSA8CisgICAgICAgICAgICAobV9kaXJlY3RvcnkuaWRDb3Vu
dCAqIHNpemVPZkRpckVudHJ5KSkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IG1fZGlyZWN0b3J5LmlkQ291bnQ7ICsraSkgewogICAgICAgICBjb25zdCBJ
Y29uRGlyZWN0b3J5RW50cnkgZGlyRW50cnkgPSByZWFkRGlyZWN0b3J5RW50cnkoZGF0YSk7CkBA
IC0xMzMsNyArMTM4LDcgQEAgYm9vbCBJQ09JbWFnZURlY29kZXI6OnByb2Nlc3NEaXJlY3RvcnlF
bgogICAgIC8vIGV4YW1pbmUgdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIGltYWdlIGRhdGEpLgog
ICAgIGlmICgobV9kaXJFbnRyeS5kd0ltYWdlT2Zmc2V0IDwgbV9kZWNvZGVkT2Zmc2V0KSB8fAog
ICAgICAgICAgICAgKChtX2RpckVudHJ5LmR3SW1hZ2VPZmZzZXQgKyA0KSA8IG1fZGlyRW50cnku
ZHdJbWFnZU9mZnNldCkpIHsKLSAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKKyAgICAgIHNldEZhaWxl
ZCgpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMTg5LDggKzE5NCw4IEBAIGJv
b2wgSUNPSW1hZ2VEZWNvZGVyOjppc0JldHRlckVudHJ5KGNvbnMKICAgICAgICAgLy8gVGhlIGlj
b24gY2xvc2VzdCB0byB0aGUgcHJlZmVycmVkIGFyZWEgd2l0aG91dCBiZWluZyBzbWFsbGVyIGlz
CiAgICAgICAgIC8vIGJldHRlci4KICAgICAgICAgaWYgKGVudHJ5QXJlYSAhPSBkaXJFbnRyeUFy
ZWEpIHsKLSAgICAgICAgICAgIHJldHVybiAoZW50cnlBcmVhIDwgZGlyRW50cnlBcmVhKQotICAg
ICAgICAgICAgICAgICYmIChlbnRyeUFyZWEgPj0gKG1fcHJlZmVycmVkSWNvblNpemUud2lkdGgo
KSAqIG1fcHJlZmVycmVkSWNvblNpemUuaGVpZ2h0KCkpKTsKKyAgICAgICAgICAgIHJldHVybiAo
ZW50cnlBcmVhIDwgZGlyRW50cnlBcmVhKSAmJiAoZW50cnlBcmVhID49CisgICAgICAgICAgICAg
ICAgKG1fcHJlZmVycmVkSWNvblNpemUud2lkdGgoKSAqIG1fcHJlZmVycmVkSWNvblNpemUuaGVp
Z2h0KCkpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjAyLDYgKzIwNywxOSBAQCBib29sIElD
T0ltYWdlRGVjb2Rlcjo6aXNCZXR0ZXJFbnRyeShjb25zCiAgICAgcmV0dXJuIChlbnRyeS53Qml0
Q291bnQgPiBtX2RpckVudHJ5LndCaXRDb3VudCk7CiB9CiAKK2Jvb2wgSUNPSW1hZ2VEZWNvZGVy
Ojpwcm9jZXNzSW1hZ2VUeXBlKFNoYXJlZEJ1ZmZlciogZGF0YSkKK3sKKyAgICAvLyBDaGVjayBp
ZiB0aGlzIGVudHJ5IGlzIGEgQk1QIG9yIGEgUE5HOyB3ZSBuZWVkIDQgYnl0ZXMgdG8gY2hlY2sg
dGhlIG1hZ2ljCisgICAgLy8gbnVtYmVyLgorICAgIEFTU0VSVChtX2RlY29kZWRPZmZzZXQgPT0g
bV9kaXJFbnRyeS5kd0ltYWdlT2Zmc2V0KTsKKyAgICBpZiAoKG1fZGVjb2RlZE9mZnNldCA+IGRh
dGEtPnNpemUoKSkKKyAgICAgICAgfHwgKChkYXRhLT5zaXplKCkgLSBtX2RlY29kZWRPZmZzZXQp
IDwgNCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBtX2ltYWdlVHlwZSA9CisgICAgICAg
IHN0cm5jbXAoJmRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXRdLCAiXHg4OVBORyIsIDQpID8g
Qk1QIDogUE5HOworICAgIHJldHVybiB0cnVlOworfQorCiB2b2lkIElDT0ltYWdlRGVjb2Rlcjo6
ZGVjb2RlUE5HKFNoYXJlZEJ1ZmZlciogZGF0YSkKIHsKICAgICAvLyBDb3B5IG91dCBQTkcgZGF0
YSB0byBhIHNlcGFyYXRlIHZlY3RvciBhbmQgaW5zdGFudGlhdGUgUE5HIGRlY29kZXIuCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2ljby9JQ09JbWFnZURlY29kZXIuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2ljby9JQ09JbWFn
ZURlY29kZXIuaAkocmV2aXNpb24gNDQ4MzIpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRl
Y29kZXJzL2ljby9JQ09JbWFnZURlY29kZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNDAsMjMgKzQw
LDE3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICBjbGFzcyBJQ09JbWFnZURlY29kZXIgOiBw
dWJsaWMgQk1QSW1hZ2VSZWFkZXIgewogICAgIHB1YmxpYzoKICAgICAgICAgLy8gU2VlIGNvbW1l
bnRzIG9uIHxtX3ByZWZlcnJlZEljb25TaXplfCBiZWxvdy4KLSAgICAgICAgSUNPSW1hZ2VEZWNv
ZGVyKGNvbnN0IEludFNpemUmIHByZWZlcnJlZEljb25TaXplKQotICAgICAgICAgICAgOiBtX3By
ZWZlcnJlZEljb25TaXplKHByZWZlcnJlZEljb25TaXplKQotICAgICAgICAgICAgLCBtX2ltYWdl
VHlwZShVbmtub3duKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX2FuZE1hc2tTdGF0ZSA9IE5v
dFlldERlY29kZWQ7Ci0gICAgICAgIH0KKyAgICAgICAgSUNPSW1hZ2VEZWNvZGVyKGNvbnN0IElu
dFNpemUmIHByZWZlcnJlZEljb25TaXplKTsKIAorICAgICAgICAvLyBJbWFnZURlY29kZXIKICAg
ICAgICAgdmlydHVhbCBTdHJpbmcgZmlsZW5hbWVFeHRlbnNpb24oKSBjb25zdCB7IHJldHVybiAi
aWNvIjsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTaXplQXZhaWxhYmxlKCk7CisgICAgICAg
IHZpcnR1YWwgSW50U2l6ZSBzaXplKCkgY29uc3Q7CiAKICAgICAgICAgLy8gQk1QSW1hZ2VSZWFk
ZXIKICAgICAgICAgdmlydHVhbCB2b2lkIGRlY29kZUltYWdlKFNoYXJlZEJ1ZmZlciogZGF0YSk7
CiAgICAgICAgIHZpcnR1YWwgUkdCQTMyQnVmZmVyKiBmcmFtZUJ1ZmZlckF0SW5kZXgoc2l6ZV90
IGluZGV4KTsKIAotICAgICAgICAvLyBJbWFnZURlY29kZXIKLSAgICAgICAgdmlydHVhbCBib29s
IGlzU2l6ZUF2YWlsYWJsZSgpOwotICAgICAgICB2aXJ0dWFsIEludFNpemUgc2l6ZSgpIGNvbnN0
OwotCiAgICAgcHJpdmF0ZToKICAgICAgICAgZW51bSBJbWFnZVR5cGUgewogICAgICAgICAgICAg
VW5rbm93biwKQEAgLTc2LDIyICs3MCwzNSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAg
ICAgICB1aW50MzJfdCBkd0ltYWdlT2Zmc2V0OwogICAgICAgICB9OwogCi0gICAgICAgIC8vIFBy
b2Nlc3NlcyB0aGUgSUNPTkRJUiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhLiAgUmV0dXJu
cyB0cnVlIGlmIHRoZQotICAgICAgICAvLyBkaXJlY3RvcnkgY291bGQgYmUgZGVjb2RlZC4KKyAg
ICAgICAgaW5saW5lIHVpbnQxNl90IHJlYWRVaW50MTYoU2hhcmVkQnVmZmVyKiBkYXRhLCBpbnQg
b2Zmc2V0KSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gcmVhZFVpbnQxNkhlbHBlcihkYXRh
LCBtX2RlY29kZWRPZmZzZXQgKyBvZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5l
IHVpbnQzMl90IHJlYWRVaW50MzIoU2hhcmVkQnVmZmVyKiBkYXRhLCBpbnQgb2Zmc2V0KSBjb25z
dCB7CisgICAgICAgICAgICByZXR1cm4gcmVhZFVpbnQzMkhlbHBlcihkYXRhLCBtX2RlY29kZWRP
ZmZzZXQgKyBvZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2Vzc2VzIHRoZSBJ
Q09ORElSIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEuICBSZXR1cm5zIHRydWUgaWYKKyAg
ICAgICAgLy8gdGhlIGRpcmVjdG9yeSBjb3VsZCBiZSBkZWNvZGVkLgogICAgICAgICBib29sIHBy
b2Nlc3NEaXJlY3RvcnkoU2hhcmVkQnVmZmVyKik7CiAKICAgICAgICAgLy8gUHJvY2Vzc2VzIHRo
ZSBJQ09ORElSRU5UUlkgcmVjb3JkcyBhZnRlciB0aGUgZGlyZWN0b3J5LiAgS2VlcHMgdGhlCi0g
ICAgICAgIC8vICJiZXN0IiBlbnRyeSBhcyB0aGUgb25lIHdlJ2xsIGRlY29kZS4gIFJldHVybnMg
dHJ1ZSBpZiB0aGUgZW50cmllcyBjb3VsZAotICAgICAgICAvLyBiZSBkZWNvZGVkLgorICAgICAg
ICAvLyAiYmVzdCIgZW50cnkgYXMgdGhlIG9uZSB3ZSdsbCBkZWNvZGUuICBSZXR1cm5zIHRydWUg
aWYgdGhlIGVudHJpZXMKKyAgICAgICAgLy8gY291bGQgYmUgZGVjb2RlZC4KICAgICAgICAgYm9v
bCBwcm9jZXNzRGlyZWN0b3J5RW50cmllcyhTaGFyZWRCdWZmZXIqKTsKIAotICAgICAgICAvLyBS
ZWFkcyBhbmQgcmV0dXJucyBhIGRpcmVjdG9yeSBlbnRyeSBmcm9tIHRoZSBjdXJyZW50IG9mZnNl
dCBpbnRvIHxkYXRhfC4KKyAgICAgICAgLy8gUmVhZHMgYW5kIHJldHVybnMgYSBkaXJlY3Rvcnkg
ZW50cnkgZnJvbSB0aGUgY3VycmVudCBvZmZzZXQgaW50bworICAgICAgICAvLyB8ZGF0YXwuCiAg
ICAgICAgIEljb25EaXJlY3RvcnlFbnRyeSByZWFkRGlyZWN0b3J5RW50cnkoU2hhcmVkQnVmZmVy
Kik7CiAKICAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHxlbnRyeXwgaXMgYSBwcmVmZXJhYmxl
IGljb24gZW50cnkgdG8gbV9kaXJFbnRyeS4KICAgICAgICAgLy8gTGFyZ2VyIHNpemVzLCBvciBn
cmVhdGVyIGJpdGRlcHRocyBhdCB0aGUgc2FtZSBzaXplLCBhcmUgcHJlZmVyYWJsZS4KICAgICAg
ICAgYm9vbCBpc0JldHRlckVudHJ5KGNvbnN0IEljb25EaXJlY3RvcnlFbnRyeSYpIGNvbnN0Owog
CisgICAgICAgIC8vIERldGVybWluZXMgd2hldGhlciB0aGUgZGVzaXJlZCBlbnRyeSBpcyBhIEJN
UCBvciBQTkcuICBSZXR1cm5zIHRydWUKKyAgICAgICAgLy8gaWYgdGhlIHR5cGUgY291bGQgYmUg
ZGV0ZXJtaW5lZC4KKyAgICAgICAgYm9vbCBwcm9jZXNzSW1hZ2VUeXBlKFNoYXJlZEJ1ZmZlciop
OworCiAgICAgICAgIC8vIENhbGxlZCB3aGVuIHRoZSBpbWFnZSB0byBiZSBkZWNvZGVkIGlzIGEg
UE5HIHJhdGhlciB0aGFuIGEgQk1QLgogICAgICAgICAvLyBJbnN0YW50aWF0ZXMgYSBQTkdJbWFn
ZURlY29kZXIsIGRlY29kZXMgdGhlIGltYWdlLCBhbmQgY29waWVzIHRoZQogICAgICAgICAvLyBy
ZXN1bHRzIGxvY2FsbHkuCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31526</attachid>
            <date>2009-06-18 18:37:39 -0700</date>
            <delta_ts>2009-06-19 14:49:52 -0700</delta_ts>
            <desc>part three (Landed r44874)</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>61847</size>
            <attacher name="Peter Kasting">pkasting</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDgzNikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjMgQEAKKzIwMDktMDYtMTggIFBldGVyIEthc3RpbmcgIDxwa2FzdGluZ0Bnb29n
bGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjQ2MCBwYXJ0IHRocmVl
CisgICAgICAgIE1ha2UgQk1QSW1hZ2VSZWFkZXIgYSBzdGFuZGFsb25lIGNsYXNzIHRoYXQgaXMg
dXNlZCBieSBJQ09JbWFnZURlY29kZXIKKyAgICAgICAgYW5kIEJNUEltYWdlRGVjb2RlciB0byBk
ZWNvZGUgaW5kaXZpZHVhbCBCTVBzIHdpdGhpbiBhIGZpbGUuICBUaGVzZQorICAgICAgICBkZWNv
ZGVycyBub3cgaW5oZXJpdCBkaXJlY3RseSBmcm9tIEltYWdlRGVjb2Rlci4KKyAgICAgICAgCisg
ICAgICAgIFRoaXMgYWxzbyBtYWtlcyB0aGVzZSBkZWNvZGVycyBkZWNvZGUgb24tZGVtYW5kIGlu
IGlzU2l6ZUF2YWlsYWJsZSgpIGFuZAorICAgICAgICBmcmFtZUJ1ZmZlckF0SW5kZXgoKSwgbGlr
ZSB0aGUgb3RoZXIgZGVjb2RlcnMsIGluc3RlYWQgb2Ygd2hlbiBzZXREYXRhKCkKKyAgICAgICAg
aXMgY2FsbGVkLCBsaWtlIGJlZm9yZS4gIFRoaXMgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZHVwIG9u
IHBhZ2VzCisgICAgICAgIGNvbnRhaW5pbmcgQk1QcyB0aGF0IGFyZW4ndCBpbW1lZGlhdGVseSBv
bnNjcmVlbi4KKworICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2JtcC9CTVBJbWFn
ZURlY29kZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VEZWNvZGVyOjpCTVBJbWFn
ZURlY29kZXIpOgorICAgICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VEZWNvZGVyOjpzZXREYXRhKToK
KyAgICAgICAgKFdlYkNvcmU6OkJNUEltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkJNUEltYWdlRGVjb2Rlcjo6ZnJhbWVCdWZmZXJBdEluZGV4KToKKyAg
ICAgICAgKFdlYkNvcmU6OkJNUEltYWdlRGVjb2Rlcjo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNv
cmU6OkJNUEltYWdlRGVjb2Rlcjo6ZGVjb2RlSGVscGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkJN
UEltYWdlRGVjb2Rlcjo6cHJvY2Vzc0ZpbGVIZWFkZXIpOgorICAgICAgICAqIHBsYXRmb3JtL2lt
YWdlLWRlY29kZXJzL2JtcC9CTVBJbWFnZURlY29kZXIuaDoKKyAgICAgICAgKFdlYkNvcmU6OkJN
UEltYWdlRGVjb2Rlcjo6cmVhZFVpbnQzMik6CisgICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVj
b2RlcnMvYm1wL0JNUEltYWdlUmVhZGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkJNUEltYWdl
UmVhZGVyOjpCTVBJbWFnZVJlYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpCTVBJbWFnZVJlYWRl
cjo6ZGVjb2RlQk1QKToKKyAgICAgICAgKFdlYkNvcmU6OkJNUEltYWdlUmVhZGVyOjpnZXRJbmZv
SGVhZGVyU2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc0lu
Zm9IZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VSZWFkZXI6OnJlYWRJbmZvSGVh
ZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkJNUEltYWdlUmVhZGVyOjpwcm9jZXNzQml0bWFza3Mp
OgorICAgICAgICAoV2ViQ29yZTo6Qk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NDb2xvclRhYmxlKToK
KyAgICAgICAgKFdlYkNvcmU6OkJNUEltYWdlUmVhZGVyOjpwcm9jZXNzUkxFRGF0YSk6CisgICAg
ICAgIChXZWJDb3JlOjpCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc05vblJMRURhdGEpOgorICAgICAg
ICAoV2ViQ29yZTo6Qk1QSW1hZ2VSZWFkZXI6OnNldEZhaWxlZCk6CisgICAgICAgICogcGxhdGZv
cm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlUmVhZGVyLmg6CisgICAgICAgIChXZWJDb3Jl
OjpCTVBJbWFnZVJlYWRlcjo6cmVhZFVpbnQxNik6CisgICAgICAgIChXZWJDb3JlOjpCTVBJbWFn
ZVJlYWRlcjo6cmVhZFVpbnQzMik6CisgICAgICAgIChXZWJDb3JlOjpCTVBJbWFnZVJlYWRlcjo6
c2V0QnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkJNUEltYWdlUmVhZGVyOjpzZXREYXRhKToK
KyAgICAgICAgKFdlYkNvcmU6OkJNUEltYWdlUmVhZGVyOjopOgorICAgICAgICAoV2ViQ29yZTo6
Qk1QSW1hZ2VSZWFkZXI6OnBhc3RFbmRPZkltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OkJNUElt
YWdlUmVhZGVyOjpyZWFkQ3VycmVudFBpeGVsKToKKyAgICAgICAgKFdlYkNvcmU6OkJNUEltYWdl
UmVhZGVyOjpzZXRSR0JBKToKKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28v
SUNPSW1hZ2VEZWNvZGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6
SUNPSW1hZ2VEZWNvZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6c2V0
RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJQ09JbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJs
ZSk6CisgICAgICAgIChXZWJDb3JlOjpJQ09JbWFnZURlY29kZXI6OnNpemUpOgorICAgICAgICAo
V2ViQ29yZTo6SUNPSW1hZ2VEZWNvZGVyOjpmcmFtZUJ1ZmZlckF0SW5kZXgpOgorICAgICAgICAo
V2ViQ29yZTo6SUNPSW1hZ2VEZWNvZGVyOjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6SUNP
SW1hZ2VEZWNvZGVyOjpkZWNvZGVIZWxwZXIpOgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1hZ2VE
ZWNvZGVyOjpwcm9jZXNzRGlyZWN0b3J5KToKKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVj
b2Rlcjo6cHJvY2Vzc0RpcmVjdG9yeUVudHJpZXMpOgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1h
Z2VEZWNvZGVyOjpyZWFkRGlyZWN0b3J5RW50cnkpOgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1h
Z2VEZWNvZGVyOjpwcm9jZXNzSW1hZ2VUeXBlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1k
ZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVyLmg6CisgICAgICAgIChXZWJDb3JlOjpJQ09JbWFn
ZURlY29kZXI6OnJlYWRVaW50MTYpOgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1hZ2VEZWNvZGVy
OjpyZWFkVWludDMyKToKKwogMjAwOS0wNi0xNyAgQnJlbnQgRnVsZ2hhbSAgPGJmdWxnaGFtQHdl
YmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGF2ZSBMZXZpbi4KSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlRGVjb2Rlci5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9ibXAvQk1QSW1hZ2VEZWNv
ZGVyLmNwcAkocmV2aXNpb24gNDQ4MzYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29k
ZXJzL2JtcC9CTVBJbWFnZURlY29kZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2ICszMSw4
IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiQk1QSW1hZ2VEZWNvZGVyLmgiCiAK
KyNpbmNsdWRlICJCTVBJbWFnZVJlYWRlci5oIgorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIC8v
IE51bWJlciBvZiBiaXRzIGluIC5CTVAgdXNlZCB0byBzdG9yZSB0aGUgZmlsZSBoZWFkZXIgKGRv
ZXNuJ3QgbWF0Y2gKQEAgLTM5LDMwICs0MSw4NyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBzdGF0
aWMgY29uc3Qgc2l6ZV90IHNpemVPZkZpbGVIZWFkZXIgPSAxNDsKIAogQk1QSW1hZ2VEZWNvZGVy
OjpCTVBJbWFnZURlY29kZXIoKQotICAgIDogQk1QSW1hZ2VSZWFkZXIoKQorICAgIDogSW1hZ2VE
ZWNvZGVyKCkKKyAgICAsIG1fYWxsRGF0YVJlY2VpdmVkKGZhbHNlKQorICAgICwgbV9kZWNvZGVk
T2Zmc2V0KDApCiB7CiB9CiAKLXZvaWQgQk1QSW1hZ2VEZWNvZGVyOjpkZWNvZGVJbWFnZShTaGFy
ZWRCdWZmZXIqIGRhdGEpCit2b2lkIEJNUEltYWdlRGVjb2Rlcjo6c2V0RGF0YShTaGFyZWRCdWZm
ZXIqIGRhdGEsIGJvb2wgYWxsRGF0YVJlY2VpdmVkKQogewotICAgIC8vIFJlYWQgYW5kIHByb2Nl
c3MgZmlsZSBoZWFkZXIuCi0gICAgaWYgKChtX2RlY29kZWRPZmZzZXQgPCBzaXplT2ZGaWxlSGVh
ZGVyKSAmJiAhcHJvY2Vzc0ZpbGVIZWFkZXIoZGF0YSkpCisgICAgaWYgKGZhaWxlZCgpKQogICAg
ICAgICByZXR1cm47CiAKLSAgICAvLyBEZWNvZGUgQk1QLgotICAgIGRlY29kZUJNUChkYXRhKTsK
KyAgICBJbWFnZURlY29kZXI6OnNldERhdGEoZGF0YSwgYWxsRGF0YVJlY2VpdmVkKTsKKyAgICBt
X2FsbERhdGFSZWNlaXZlZCA9IGFsbERhdGFSZWNlaXZlZDsKKyAgICBpZiAobV9yZWFkZXIpCisg
ICAgICAgIG1fcmVhZGVyLT5zZXREYXRhKGRhdGEpOwogfQogCi1ib29sIEJNUEltYWdlRGVjb2Rl
cjo6cHJvY2Vzc0ZpbGVIZWFkZXIoU2hhcmVkQnVmZmVyKiBkYXRhKQorYm9vbCBCTVBJbWFnZURl
Y29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpCiB7CisgICAgaWYgKCFJbWFnZURlY29kZXI6OmlzU2l6
ZUF2YWlsYWJsZSgpICYmICFmYWlsZWQoKSkKKyAgICAgICAgZGVjb2RlKHRydWUpOworCisgICAg
cmV0dXJuIEltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCk7Cit9CisKK1JHQkEzMkJ1ZmZl
ciogQk1QSW1hZ2VEZWNvZGVyOjpmcmFtZUJ1ZmZlckF0SW5kZXgoc2l6ZV90IGluZGV4KQorewor
ICAgIGlmIChpbmRleCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAobV9mcmFtZUJ1ZmZl
ckNhY2hlLmlzRW1wdHkoKSkKKyAgICAgICAgbV9mcmFtZUJ1ZmZlckNhY2hlLnJlc2l6ZSgxKTsK
KworICAgIFJHQkEzMkJ1ZmZlciogYnVmZmVyID0gJm1fZnJhbWVCdWZmZXJDYWNoZS5maXJzdCgp
OworICAgIGlmIChidWZmZXItPnN0YXR1cygpICE9IFJHQkEzMkJ1ZmZlcjo6RnJhbWVDb21wbGV0
ZSAmJiAhZmFpbGVkKCkpCisgICAgICAgIGRlY29kZShmYWxzZSk7CisgICAgcmV0dXJuIGJ1ZmZl
cjsKK30KKwordm9pZCBCTVBJbWFnZURlY29kZXI6OmRlY29kZShib29sIG9ubHlTaXplKQorewor
ICAgIGlmIChmYWlsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSWYgd2UgY291bGRu
J3QgZGVjb2RlIHRoZSBpbWFnZSBidXQgd2UndmUgcmVjZWl2ZWQgYWxsIHRoZSBkYXRhLCBkZWNv
ZGluZworICAgIC8vIGhhcyBmYWlsZWQuCisgICAgaWYgKCFkZWNvZGVIZWxwZXIob25seVNpemUp
ICYmIG1fYWxsRGF0YVJlY2VpdmVkKQorICAgICAgICBzZXRGYWlsZWQoKTsKK30KKworYm9vbCBC
TVBJbWFnZURlY29kZXI6OmRlY29kZUhlbHBlcihib29sIG9ubHlTaXplKQoreworICAgIHNpemVf
dCBpbWdEYXRhT2Zmc2V0ID0gMDsKKyAgICBpZiAoKG1fZGVjb2RlZE9mZnNldCA8IHNpemVPZkZp
bGVIZWFkZXIpCisgICAgICAgICYmICFwcm9jZXNzRmlsZUhlYWRlcigmaW1nRGF0YU9mZnNldCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghbV9yZWFkZXIpIHsKKyAgICAgICAg
bV9yZWFkZXIuc2V0KG5ldyBCTVBJbWFnZVJlYWRlcih0aGlzLCBtX2RlY29kZWRPZmZzZXQsIGlt
Z0RhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFs
c2UpKTsKKyAgICAgICAgbV9yZWFkZXItPnNldERhdGEobV9kYXRhLmdldCgpKTsKKyAgICB9CisK
KyAgICBpZiAoIW1fZnJhbWVCdWZmZXJDYWNoZS5pc0VtcHR5KCkpCisgICAgICAgIG1fcmVhZGVy
LT5zZXRCdWZmZXIoJm1fZnJhbWVCdWZmZXJDYWNoZS5maXJzdCgpKTsKKworICAgIHJldHVybiBt
X3JlYWRlci0+ZGVjb2RlQk1QKG9ubHlTaXplKTsKK30KKworYm9vbCBCTVBJbWFnZURlY29kZXI6
OnByb2Nlc3NGaWxlSGVhZGVyKHNpemVfdCogaW1nRGF0YU9mZnNldCkKK3sKKyAgICBBU1NFUlQo
aW1nRGF0YU9mZnNldCk7CisKICAgICAvLyBSZWFkIGZpbGUgaGVhZGVyLgogICAgIEFTU0VSVCgh
bV9kZWNvZGVkT2Zmc2V0KTsKLSAgICBpZiAoZGF0YS0+c2l6ZSgpIDwgc2l6ZU9mRmlsZUhlYWRl
cikKKyAgICBpZiAobV9kYXRhLT5zaXplKCkgPCBzaXplT2ZGaWxlSGVhZGVyKQogICAgICAgICBy
ZXR1cm4gZmFsc2U7CiAgICAgY29uc3QgdWludDE2X3QgZmlsZVR5cGUgPQotICAgICAgICAoZGF0
YS0+ZGF0YSgpWzBdIDw8IDgpIHwgc3RhdGljX2Nhc3Q8dWludDhfdD4oZGF0YS0+ZGF0YSgpWzFd
KTsKLSAgICBtX2ltZ0RhdGFPZmZzZXQgPSByZWFkVWludDMyKGRhdGEsIDEwKTsKLSAgICBtX2Rl
Y29kZWRPZmZzZXQgPSBtX2hlYWRlck9mZnNldCA9IHNpemVPZkZpbGVIZWFkZXI7CisgICAgICAg
IChtX2RhdGEtPmRhdGEoKVswXSA8PCA4KSB8IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG1fZGF0YS0+
ZGF0YSgpWzFdKTsKKyAgICAqaW1nRGF0YU9mZnNldCA9IHJlYWRVaW50MzIoMTApOworICAgIG1f
ZGVjb2RlZE9mZnNldCA9IHNpemVPZkZpbGVIZWFkZXI7CiAKICAgICAvLyBTZWUgaWYgdGhpcyBp
cyBhIGJpdG1hcCBmaWxldHlwZSB3ZSB1bmRlcnN0YW5kLgogICAgIGVudW0gewpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9ibXAvQk1QSW1hZ2VEZWNvZGVyLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9ibXAvQk1QSW1hZ2VEZWNv
ZGVyLmgJKHJldmlzaW9uIDQ0ODM2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVy
cy9ibXAvQk1QSW1hZ2VEZWNvZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTMyLDI4ICszMiw1MSBA
QAogI2RlZmluZSBCTVBJbWFnZURlY29kZXJfaAogCiAjaW5jbHVkZSAiQk1QSW1hZ2VSZWFkZXIu
aCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogICAg
IC8vIFRoaXMgY2xhc3MgZGVjb2RlcyB0aGUgQk1QIGltYWdlIGZvcm1hdC4KLSAgICBjbGFzcyBC
TVBJbWFnZURlY29kZXIgOiBwdWJsaWMgQk1QSW1hZ2VSZWFkZXIgeworICAgIGNsYXNzIEJNUElt
YWdlRGVjb2RlciA6IHB1YmxpYyBJbWFnZURlY29kZXIgewogICAgIHB1YmxpYzoKICAgICAgICAg
Qk1QSW1hZ2VEZWNvZGVyKCk7CiAKKyAgICAgICAgLy8gSW1hZ2VEZWNvZGVyCiAgICAgICAgIHZp
cnR1YWwgU3RyaW5nIGZpbGVuYW1lRXh0ZW5zaW9uKCkgY29uc3QgeyByZXR1cm4gImJtcCI7IH0K
LQotICAgICAgICAvLyBCTVBJbWFnZVJlYWRlcgotICAgICAgICB2aXJ0dWFsIHZvaWQgZGVjb2Rl
SW1hZ2UoU2hhcmVkQnVmZmVyKik7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXREYXRhKFNoYXJl
ZEJ1ZmZlciogZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpOworICAgICAgICB2aXJ0dWFsIGJv
b2wgaXNTaXplQXZhaWxhYmxlKCk7CisgICAgICAgIHZpcnR1YWwgUkdCQTMyQnVmZmVyKiBmcmFt
ZUJ1ZmZlckF0SW5kZXgoc2l6ZV90IGluZGV4KTsKIAogICAgIHByaXZhdGU6Ci0gICAgICAgIGlu
bGluZSB1aW50MzJfdCByZWFkVWludDMyKFNoYXJlZEJ1ZmZlciogZGF0YSwgaW50IG9mZnNldCkg
Y29uc3QKKyAgICAgICAgaW5saW5lIHVpbnQzMl90IHJlYWRVaW50MzIoaW50IG9mZnNldCkgY29u
c3QKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlYWRVaW50MzJIZWxwZXIoZGF0YSwg
bV9kZWNvZGVkT2Zmc2V0ICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIHJldHVybiBCTVBJbWFnZVJl
YWRlcjo6cmVhZFVpbnQzMihtX2RhdGEuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbV9kZWNvZGVkT2Zmc2V0ICsgb2Zmc2V0KTsKICAgICAgICAg
fQogCi0gICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZSBoZWFkZXIgYXQgdGhlIGJlZ2lubmlu
ZyBvZiB0aGUgZGF0YS4gIFJldHVybnMgdHJ1ZSBpZgotICAgICAgICAvLyB0aGUgZmlsZSBoZWFk
ZXIgY291bGQgYmUgZGVjb2RlZC4KLSAgICAgICAgYm9vbCBwcm9jZXNzRmlsZUhlYWRlcihTaGFy
ZWRCdWZmZXIqKTsKKyAgICAgICAgLy8gRGVjb2RlcyB0aGUgaW1hZ2UuICBJZiB8b25seVNpemV8
IGlzIHRydWUsIHN0b3BzIGRlY29kaW5nIGFmdGVyCisgICAgICAgIC8vIGNhbGN1bGF0aW5nIHRo
ZSBpbWFnZSBzaXplLgorICAgICAgICB2b2lkIGRlY29kZShib29sIG9ubHlTaXplKTsKKworICAg
ICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBhYm92ZSB0aGF0IGFjdHVhbGx5IGRvZXMg
dGhlIGRlY29kaW5nLgorICAgICAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZGVjb2Rpbmcgc3VjY2Vl
ZGVkLgorICAgICAgICBib29sIGRlY29kZUhlbHBlcihib29sIG9ubHlTaXplKTsKKworICAgICAg
ICAvLyBQcm9jZXNzZXMgdGhlIGZpbGUgaGVhZGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRh
dGEuICBTZXRzCisgICAgICAgIC8vIHwqaW1nRGF0YU9mZnNldHwgYmFzZWQgb24gdGhlIGhlYWRl
ciBjb250ZW50cy4gIFJldHVybnMgdHJ1ZSBpZiB0aGUKKyAgICAgICAgLy8gZmlsZSBoZWFkZXIg
Y291bGQgYmUgZGVjb2RlZC4KKyAgICAgICAgYm9vbCBwcm9jZXNzRmlsZUhlYWRlcihzaXplX3Qq
IGltZ0RhdGFPZmZzZXQpOworCisgICAgICAgIC8vIFRydWUgaWYgd2UndmUgc2VlbiBhbGwgdGhl
IGRhdGEuCisgICAgICAgIGJvb2wgbV9hbGxEYXRhUmVjZWl2ZWQ7CisKKyAgICAgICAgLy8gQW4g
aW5kZXggaW50byB8bV9kYXRhfCByZXByZXNlbnRpbmcgaG93IG11Y2ggd2UndmUgYWxyZWFkeSBk
ZWNvZGVkLgorICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBvbmx5IHRyYWNrcyBkYXRhIF90aGlz
XyBjbGFzcyBkZWNvZGVzOyBvbmNlIHRoZQorICAgICAgICAvLyBCTVBJbWFnZVJlYWRlciB0YWtl
cyBvdmVyIHRoaXMgd2lsbCBub3QgYmUgdXBkYXRlZCBmdXJ0aGVyLgorICAgICAgICBzaXplX3Qg
bV9kZWNvZGVkT2Zmc2V0OworCisgICAgICAgIC8vIFRoZSByZWFkZXIgdXNlZCB0byBkbyBtb3N0
IG9mIHRoZSBCTVAgZGVjb2RpbmcuCisgICAgICAgIE93blB0cjxCTVBJbWFnZVJlYWRlcj4gbV9y
ZWFkZXI7CiAgICAgfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9ibXAvQk1QSW1hZ2VSZWFkZXIuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlUmVhZGVyLmNw
cAkocmV2aXNpb24gNDQ4MzYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2Jt
cC9CTVBJbWFnZVJlYWRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDExICszMywxNiBAQAog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUJNUEltYWdlUmVhZGVyOjpCTVBJbWFnZVJlYWRlcigp
Ci0gICAgOiBtX2RlY29kZWRPZmZzZXQoMCkKLSAgICAsIG1faGVhZGVyT2Zmc2V0KDApCi0gICAg
LCBtX2ltZ0RhdGFPZmZzZXQoMCkKLSAgICAsIG1fYW5kTWFza1N0YXRlKE5vbmUpCitCTVBJbWFn
ZVJlYWRlcjo6Qk1QSW1hZ2VSZWFkZXIoSW1hZ2VEZWNvZGVyKiBwYXJlbnQsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRlY29kZWRBbmRIZWFkZXJPZmZzZXQsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGltZ0RhdGFPZmZzZXQsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VzQW5kTWFzaykKKyAgICA6IG1fcGFyZW50
KHBhcmVudCkKKyAgICAsIG1fYnVmZmVyKDApCisgICAgLCBtX2RlY29kZWRPZmZzZXQoZGVjb2Rl
ZEFuZEhlYWRlck9mZnNldCkKKyAgICAsIG1faGVhZGVyT2Zmc2V0KGRlY29kZWRBbmRIZWFkZXJP
ZmZzZXQpCisgICAgLCBtX2ltZ0RhdGFPZmZzZXQoaW1nRGF0YU9mZnNldCkKKyAgICAsIG1fYW5k
TWFza1N0YXRlKHVzZXNBbmRNYXNrID8gTm90WWV0RGVjb2RlZCA6IE5vbmUpCiAgICAgLCBtX2lz
T1MyMXgoZmFsc2UpCiAgICAgLCBtX2lzT1MyMngoZmFsc2UpCiAgICAgLCBtX2lzVG9wRG93bihm
YWxzZSkKQEAgLTQ3LDg5ICs1Miw1MCBAQCBCTVBJbWFnZVJlYWRlcjo6Qk1QSW1hZ2VSZWFkZXIo
KQogICAgICwgbV9zZWVuTm9uWmVyb0FscGhhUGl4ZWwoZmFsc2UpCiAgICAgLCBtX3NlZW5aZXJv
QWxwaGFQaXhlbChmYWxzZSkKIHsKLSAgICBtX2ZyYW1lQnVmZmVyQ2FjaGUucmVzaXplKDEpOwot
CiAgICAgLy8gQ2x1ZS1pbiBkZWNvZGVCTVAoKSB0aGF0IHdlIG5lZWQgdG8gZGV0ZWN0IHRoZSBj
b3JyZWN0IGluZm8gaGVhZGVyIHNpemUuCiAgICAgbWVtc2V0KCZtX2luZm9IZWFkZXIsIDAsIHNp
emVvZihtX2luZm9IZWFkZXIpKTsKIH0KIAotdm9pZCBCTVBJbWFnZVJlYWRlcjo6c2V0RGF0YShT
aGFyZWRCdWZmZXIqIGRhdGEsIGJvb2wgYWxsRGF0YVJlY2VpdmVkKQotewotICAgIEltYWdlRGVj
b2Rlcjo6c2V0RGF0YShkYXRhLCBhbGxEYXRhUmVjZWl2ZWQpOwotCi0gICAgLy8gTk9URTogVGhp
cyBmdW5jdGlvbiBpbnRlbnRpb25hbGx5IHVzZXMgZnJhbWVCdWZmZXJBdEluZGV4KCkgaW5zdGVh
ZCBvZgotICAgIC8vIGNoZWNraW5nIG1fZnJhbWVCdWZmZXJDYWNoZS5maXJzdCgpIGRpcmVjdGx5
LCBzbyB0aGF0IGl0IHdpbGwgZG8gdGhlCi0gICAgLy8gcmlnaHQgdGhpbmcgZm9yIElDT0ltYWdl
RGVjb2Rlciwgd2hpY2ggbmVlZHMgdG8gb3ZlcnJpZGUgdGhpcyBhY2Nlc3NvcgotICAgIC8vIHRv
IHN1cHBvcnQgSUNPcyB3aGljaCBjb250YWluIFBOR3MuCi0KLSAgICAvLyBSZXR1cm4gcXVpY2ts
eSB3aGVuIHdlIGNhbid0IGRvIGFueSBtb3JlIHdvcmsuCi0gICAgaWYgKG1fZmFpbGVkIHx8IGRh
dGEtPmlzRW1wdHkoKQotICAgICAgICB8fCAoZnJhbWVCdWZmZXJBdEluZGV4KDApLT5zdGF0dXMo
KSA9PSBSR0JBMzJCdWZmZXI6OkZyYW1lQ29tcGxldGUpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICAvLyBEZWNvZGUgYXMgbXVjaCBhcyB3ZSBjYW4uICBUaGlzIGFzc3VtZXMgfGRhdGF8IHN0YXJ0
cyBhdCB0aGUgYmVnaW5uaW5nCi0gICAgLy8gb2YgdGhlIGltYWdlIGRhdGEsIHJhdGhlciB0aGFu
IGNvbnRhaW5pbmcganVzdCB0aGUgbGF0ZXN0IGNodW5rLgotICAgIGRlY29kZUltYWdlKGRhdGEp
OwotICAgIGlmIChtX2ZhaWxlZCkgewotICAgICAgICAvLyBIYW5kbGUgZmFpbHVyZSBiZWZvcmUg
Z2V0dGluZyB0aGUgZnJhbWVidWZmZXIgYmVsb3cuCi0gICAgICAgIG1fY29sb3JUYWJsZS5jbGVh
cigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gSWYgd2UgZ290IGFsbCB0aGUg
ZGF0YSBidXQgY291bGRuJ3QgZmluaXNoIGRlY29kaW5nLCBmYWlsLgotICAgIGNvbnN0IGJvb2wg
ZmluaXNoZWQgPQotICAgICAgICAoZnJhbWVCdWZmZXJBdEluZGV4KDApLT5zdGF0dXMoKSA9PSBS
R0JBMzJCdWZmZXI6OkZyYW1lQ29tcGxldGUpOwotICAgIGlmIChhbGxEYXRhUmVjZWl2ZWQgJiYg
IWZpbmlzaGVkKQotICAgICAgICBtX2ZhaWxlZCA9IHRydWU7Ci0KLSAgICAvLyBSZWxlYXNlIHRo
ZSBjb2xvciB0YWJsZSB3aGVuIHdlIG5vIGxvbmdlciBuZWVkIGl0LgotICAgIGlmIChmaW5pc2hl
ZCB8fCBtX2ZhaWxlZCkKLSAgICAgICAgbV9jb2xvclRhYmxlLmNsZWFyKCk7Ci19Ci0KLVJHQkEz
MkJ1ZmZlciogQk1QSW1hZ2VSZWFkZXI6OmZyYW1lQnVmZmVyQXRJbmRleChzaXplX3QgaW5kZXgp
Ci17Ci0gICAgcmV0dXJuIGluZGV4ID8gMCA6ICZtX2ZyYW1lQnVmZmVyQ2FjaGUuZmlyc3QoKTsK
LX0KLQotYm9vbCBCTVBJbWFnZVJlYWRlcjo6ZGVjb2RlQk1QKFNoYXJlZEJ1ZmZlciogZGF0YSkK
K2Jvb2wgQk1QSW1hZ2VSZWFkZXI6OmRlY29kZUJNUChib29sIG9ubHlTaXplKQogewogICAgIC8v
IENhbGN1bGF0ZSBzaXplIG9mIGluZm8gaGVhZGVyLgotICAgIGlmICghbV9pbmZvSGVhZGVyLmJp
U2l6ZSAmJiAhZ2V0SW5mb0hlYWRlclNpemUoZGF0YSkpCisgICAgaWYgKCFtX2luZm9IZWFkZXIu
YmlTaXplICYmICFnZXRJbmZvSGVhZGVyU2l6ZSgpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAK
ICAgICAvLyBSZWFkIGFuZCBwcm9jZXNzIGluZm8gaGVhZGVyLgogICAgIGlmICgobV9kZWNvZGVk
T2Zmc2V0IDwgKG1faGVhZGVyT2Zmc2V0ICsgbV9pbmZvSGVhZGVyLmJpU2l6ZSkpCi0gICAgICAg
ICYmICFwcm9jZXNzSW5mb0hlYWRlcihkYXRhKSkKKyAgICAgICAgJiYgIXByb2Nlc3NJbmZvSGVh
ZGVyKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAorICAgIC8vIHByb2Nlc3NJbmZvSGVhZGVy
KCkgc2V0IHRoZSBzaXplLCBzbyBpZiB0aGF0J3MgYWxsIHdlIG5lZWRlZCwgd2UncmUgZG9uZS4K
KyAgICBpZiAob25seVNpemUpCisgICAgICAgIHJldHVybiB0cnVlOworCiAgICAgLy8gUmVhZCBh
bmQgcHJvY2VzcyB0aGUgYml0bWFza3MsIGlmIG5lZWRlZC4KLSAgICBpZiAobV9uZWVkVG9Qcm9j
ZXNzQml0bWFza3MgJiYgIXByb2Nlc3NCaXRtYXNrcyhkYXRhKSkKKyAgICBpZiAobV9uZWVkVG9Q
cm9jZXNzQml0bWFza3MgJiYgIXByb2Nlc3NCaXRtYXNrcygpKQogICAgICAgICByZXR1cm4gZmFs
c2U7CiAKICAgICAvLyBSZWFkIGFuZCBwcm9jZXNzIHRoZSBjb2xvciB0YWJsZSwgaWYgbmVlZGVk
LgotICAgIGlmIChtX25lZWRUb1Byb2Nlc3NDb2xvclRhYmxlICYmICFwcm9jZXNzQ29sb3JUYWJs
ZShkYXRhKSkKKyAgICBpZiAobV9uZWVkVG9Qcm9jZXNzQ29sb3JUYWJsZSAmJiAhcHJvY2Vzc0Nv
bG9yVGFibGUoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gSW5pdGlhbGl6ZSB0
aGUgZnJhbWVidWZmZXIgaWYgbmVlZGVkLgotICAgIFJHQkEzMkJ1ZmZlciogYnVmZmVyID0gJm1f
ZnJhbWVCdWZmZXJDYWNoZS5maXJzdCgpOwotICAgIGlmIChidWZmZXItPnN0YXR1cygpID09IFJH
QkEzMkJ1ZmZlcjo6RnJhbWVFbXB0eSkgewotICAgICAgICBpZiAoIWJ1ZmZlci0+c2V0U2l6ZShz
aXplKCkud2lkdGgoKSwgc2l6ZSgpLmhlaWdodCgpKSkgewotICAgICAgICAgICAgLy8gVW5hYmxl
IHRvIGFsbG9jYXRlLgotICAgICAgICAgICAgc2V0RmFpbGVkKCk7Ci0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmZmVyLT5zZXRTdGF0dXMoUkdCQTMyQnVm
ZmVyOjpGcmFtZVBhcnRpYWwpOworICAgIEFTU0VSVChtX2J1ZmZlcik7ICAvLyBQYXJlbnQgc2hv
dWxkIHNldCB0aGlzIGJlZm9yZSBhc2tpbmcgdXMgdG8gZGVjb2RlIQorICAgIGlmIChtX2J1ZmZl
ci0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUVtcHR5KSB7CisgICAgICAgIGlmICgh
bV9idWZmZXItPnNldFNpemUobV9wYXJlbnQtPnNpemUoKS53aWR0aCgpLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5zaXplKCkuaGVpZ2h0KCkpKQorICAgICAgICAg
ICAgcmV0dXJuIHNldEZhaWxlZCgpOyAgLy8gVW5hYmxlIHRvIGFsbG9jYXRlLgorICAgICAgICBt
X2J1ZmZlci0+c2V0U3RhdHVzKFJHQkEzMkJ1ZmZlcjo6RnJhbWVQYXJ0aWFsKTsKICAgICAgICAg
Ly8gc2V0U2l6ZSgpIGNhbGxzIGVyYXNlQVJHQigpLCB3aGljaCByZXNldHMgdGhlIGFscGhhIGZs
YWcsIHNvIHdlIGZvcmNlCiAgICAgICAgIC8vIGl0IGJhY2sgdG8gZmFsc2UgaGVyZS4gIFdlJ2xs
IHNldCBpdCB0cnVlIGJlbG93IGluIGFsbCBjYXNlcyB3aGVyZQogICAgICAgICAvLyB0aGVzZSAw
cyBjb3VsZCBhY3R1YWxseSBzaG93IHRocm91Z2guCi0gICAgICAgIGJ1ZmZlci0+c2V0SGFzQWxw
aGEoZmFsc2UpOworICAgICAgICBtX2J1ZmZlci0+c2V0SGFzQWxwaGEoZmFsc2UpOwogCiAgICAg
ICAgIC8vIEZvciBCTVBzLCB0aGUgZnJhbWUgYWx3YXlzIGZpbGxzIHRoZSBlbnRpcmUgaW1hZ2Uu
Ci0gICAgICAgIGJ1ZmZlci0+c2V0UmVjdChJbnRSZWN0KEludFBvaW50KCksIHNpemUoKSkpOwor
ICAgICAgICBtX2J1ZmZlci0+c2V0UmVjdChJbnRSZWN0KEludFBvaW50KCksIG1fcGFyZW50LT5z
aXplKCkpKTsKIAogICAgICAgICBpZiAoIW1faXNUb3BEb3duKQotICAgICAgICAgICAgbV9jb29y
ZC5zZXRZKHNpemUoKS5oZWlnaHQoKSAtIDEpOworICAgICAgICAgICAgbV9jb29yZC5zZXRZKG1f
cGFyZW50LT5zaXplKCkuaGVpZ2h0KCkgLSAxKTsKICAgICB9CiAKICAgICAvLyBEZWNvZGUgdGhl
IGRhdGEuCkBAIC0xMzcsNDAgKzEwMyw0MCBAQCBib29sIEJNUEltYWdlUmVhZGVyOjpkZWNvZGVC
TVAoU2hhcmVkQnVmCiAgICAgICAgIGlmICgobV9pbmZvSGVhZGVyLmJpQ29tcHJlc3Npb24gPT0g
UkxFNCkKICAgICAgICAgICAgIHx8IChtX2luZm9IZWFkZXIuYmlDb21wcmVzc2lvbiA9PSBSTEU4
KQogICAgICAgICAgICAgfHwgKG1faW5mb0hlYWRlci5iaUNvbXByZXNzaW9uID09IFJMRTI0KSkg
ewotICAgICAgICAgICAgaWYgKCFwcm9jZXNzUkxFRGF0YShkYXRhKSkKKyAgICAgICAgICAgIGlm
ICghcHJvY2Vzc1JMRURhdGEoKSkKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIH0gZWxzZSBpZiAoIXByb2Nlc3NOb25STEVEYXRhKGRhdGEsIGZhbHNlLCAwKSkKKyAgICAg
ICAgfSBlbHNlIGlmICghcHJvY2Vzc05vblJMRURhdGEoZmFsc2UsIDApKQogICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8vIElmIHRoZSBpbWFnZSBoYXMgYW4gQU5EIG1h
c2sgYW5kIHRoZXJlIHdhcyBubyBhbHBoYSBkYXRhLCBwcm9jZXNzIHRoZQogICAgIC8vIG1hc2su
Ci0gICAgaWYgKChtX2FuZE1hc2tTdGF0ZSA9PSBOb3RZZXREZWNvZGVkKSAmJiAhYnVmZmVyLT5o
YXNBbHBoYSgpKSB7CisgICAgaWYgKChtX2FuZE1hc2tTdGF0ZSA9PSBOb3RZZXREZWNvZGVkKSAm
JiAhbV9idWZmZXItPmhhc0FscGhhKCkpIHsKICAgICAgICAgLy8gUmVzZXQgZGVjb2RpbmcgY29v
cmRpbmF0ZXMgdG8gc3RhcnQgb2YgaW1hZ2UuCiAgICAgICAgIG1fY29vcmQuc2V0WCgwKTsKLSAg
ICAgICAgbV9jb29yZC5zZXRZKG1faXNUb3BEb3duID8gMCA6IChzaXplKCkuaGVpZ2h0KCkgLSAx
KSk7CisgICAgICAgIG1fY29vcmQuc2V0WShtX2lzVG9wRG93biA/IDAgOiAobV9wYXJlbnQtPnNp
emUoKS5oZWlnaHQoKSAtIDEpKTsKIAogICAgICAgICAvLyBUaGUgQU5EIG1hc2sgaXMgc3RvcmVk
IGFzIDEtYml0IGRhdGEuCiAgICAgICAgIG1faW5mb0hlYWRlci5iaUJpdENvdW50ID0gMTsKIAog
ICAgICAgICBtX2FuZE1hc2tTdGF0ZSA9IERlY29kaW5nOwogICAgIH0KLSAgICBpZiAoKG1fYW5k
TWFza1N0YXRlID09IERlY29kaW5nKSAmJiAhcHJvY2Vzc05vblJMRURhdGEoZGF0YSwgZmFsc2Us
IDApKQorICAgIGlmICgobV9hbmRNYXNrU3RhdGUgPT0gRGVjb2RpbmcpICYmICFwcm9jZXNzTm9u
UkxFRGF0YShmYWxzZSwgMCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIC8vIERvbmUh
Ci0gICAgYnVmZmVyLT5zZXRTdGF0dXMoUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRlKTsKKyAg
ICBtX2J1ZmZlci0+c2V0U3RhdHVzKFJHQkEzMkJ1ZmZlcjo6RnJhbWVDb21wbGV0ZSk7CiAgICAg
cmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQk1QSW1hZ2VSZWFkZXI6OmdldEluZm9IZWFkZXJTaXpl
KFNoYXJlZEJ1ZmZlciogZGF0YSkKK2Jvb2wgQk1QSW1hZ2VSZWFkZXI6OmdldEluZm9IZWFkZXJT
aXplKCkKIHsKICAgICAvLyBHZXQgc2l6ZSBvZiBpbmZvIGhlYWRlci4KICAgICBBU1NFUlQobV9k
ZWNvZGVkT2Zmc2V0ID09IG1faGVhZGVyT2Zmc2V0KTsKLSAgICBpZiAoKG1fZGVjb2RlZE9mZnNl
dCA+IGRhdGEtPnNpemUoKSkKLSAgICAgICAgfHwgKChkYXRhLT5zaXplKCkgLSBtX2RlY29kZWRP
ZmZzZXQpIDwgNCkpCisgICAgaWYgKChtX2RlY29kZWRPZmZzZXQgPiBtX2RhdGEtPnNpemUoKSkK
KyAgICAgICAgfHwgKChtX2RhdGEtPnNpemUoKSAtIG1fZGVjb2RlZE9mZnNldCkgPCA0KSkKICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIG1faW5mb0hlYWRlci5iaVNpemUgPSByZWFkVWludDMy
KGRhdGEsIDApOworICAgIG1faW5mb0hlYWRlci5iaVNpemUgPSByZWFkVWludDMyKDApOwogICAg
IC8vIERvbid0IGluY3JlbWVudCBtX2RlY29kZWRPZmZzZXQgaGVyZSwgaXQganVzdCBtYWtlcyB0
aGUgY29kZSBpbgogICAgIC8vIHByb2Nlc3NJbmZvSGVhZGVyKCkgbW9yZSBjb25mdXNpbmcuCiAK
QEAgLTE3OSwxMCArMTQ1LDggQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6Z2V0SW5mb0hlYWRlclNp
emUoUwogICAgIC8vIGltYWdlIGRhdGEuCiAgICAgaWYgKCgobV9oZWFkZXJPZmZzZXQgKyBtX2lu
Zm9IZWFkZXIuYmlTaXplKSA8IG1faGVhZGVyT2Zmc2V0KQogICAgICAgICB8fCAobV9pbWdEYXRh
T2Zmc2V0Ci0gICAgICAgICAgICAmJiAobV9pbWdEYXRhT2Zmc2V0IDwgKG1faGVhZGVyT2Zmc2V0
ICsgbV9pbmZvSGVhZGVyLmJpU2l6ZSkpKSkgewotICAgICAgICBzZXRGYWlsZWQoKTsKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICAgICAgICAgICYmIChtX2ltZ0RhdGFPZmZzZXQg
PCAobV9oZWFkZXJPZmZzZXQgKyBtX2luZm9IZWFkZXIuYmlTaXplKSkpKQorICAgICAgICByZXR1
cm4gc2V0RmFpbGVkKCk7CiAKICAgICAvLyBTZWUgaWYgdGhpcyBpcyBhIGhlYWRlciBzaXplIHdl
IHVuZGVyc3RhbmQ6CiAgICAgLy8gT1MvMiAxLng6IDEyCkBAIC0xOTYsMzUgKzE2MCwyOSBAQCBi
b29sIEJNUEltYWdlUmVhZGVyOjpnZXRJbmZvSGVhZGVyU2l6ZShTCiAgICAgICAgICAgICAgJiYg
KCgobV9pbmZvSGVhZGVyLmJpU2l6ZSAmIDMpID09IDApIHx8IChtX2luZm9IZWFkZXIuYmlTaXpl
ID09IDQyKQogICAgICAgICAgICAgICAgICB8fCAobV9pbmZvSGVhZGVyLmJpU2l6ZSA9PSA0Nikp
KQogICAgICAgICBtX2lzT1MyMnggPSB0cnVlOwotICAgIGVsc2UgewotICAgICAgICBzZXRGYWls
ZWQoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJl
dHVybiBzZXRGYWlsZWQoKTsKIAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIEJNUEltYWdl
UmVhZGVyOjpwcm9jZXNzSW5mb0hlYWRlcihTaGFyZWRCdWZmZXIqIGRhdGEpCitib29sIEJNUElt
YWdlUmVhZGVyOjpwcm9jZXNzSW5mb0hlYWRlcigpCiB7CiAgICAgLy8gUmVhZCBpbmZvIGhlYWRl
ci4KICAgICBBU1NFUlQobV9kZWNvZGVkT2Zmc2V0ID09IG1faGVhZGVyT2Zmc2V0KTsKLSAgICBp
ZiAoKG1fZGVjb2RlZE9mZnNldCA+IGRhdGEtPnNpemUoKSkKLSAgICAgICAgfHwgKChkYXRhLT5z
aXplKCkgLSBtX2RlY29kZWRPZmZzZXQpIDwgbV9pbmZvSGVhZGVyLmJpU2l6ZSkKLSAgICAgICAg
fHwgIXJlYWRJbmZvSGVhZGVyKGRhdGEpKQorICAgIGlmICgobV9kZWNvZGVkT2Zmc2V0ID4gbV9k
YXRhLT5zaXplKCkpCisgICAgICAgIHx8ICgobV9kYXRhLT5zaXplKCkgLSBtX2RlY29kZWRPZmZz
ZXQpIDwgbV9pbmZvSGVhZGVyLmJpU2l6ZSkKKyAgICAgICAgfHwgIXJlYWRJbmZvSGVhZGVyKCkp
CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBtX2RlY29kZWRPZmZzZXQgKz0gbV9pbmZvSGVh
ZGVyLmJpU2l6ZTsKIAogICAgIC8vIFNhbml0eS1jaGVjayBoZWFkZXIgdmFsdWVzLgotICAgIGlm
ICghaXNJbmZvSGVhZGVyVmFsaWQoKSkgewotICAgICAgICBzZXRGYWlsZWQoKTsKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICBpZiAoIWlzSW5mb0hlYWRlclZhbGlkKCkpCisgICAg
ICAgIHJldHVybiBzZXRGYWlsZWQoKTsKIAotICAgIC8vIE1ha2Ugb3VyIHNpemUgYXZhaWxhYmxl
IHRvIHRoZSBjYWxsZXIuCi0gICAgaWYgKCFzZXRTaXplKG1faW5mb0hlYWRlci5iaVdpZHRoLCBt
X2luZm9IZWFkZXIuYmlIZWlnaHQpKSB7Ci0gICAgICAgIHNldEZhaWxlZCgpOwotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgfQorICAgIC8vIFNldCBvdXIgc2l6ZS4KKyAgICBpZiAoIW1fcGFy
ZW50LT5zZXRTaXplKG1faW5mb0hlYWRlci5iaVdpZHRoLCBtX2luZm9IZWFkZXIuYmlIZWlnaHQp
KQorICAgICAgICByZXR1cm4gc2V0RmFpbGVkKCk7CiAKICAgICAvLyBGb3IgcGFsZXR0ZWQgaW1h
Z2VzLCBiaXRtYXBzIGNhbiBzZXQgYmlDbHJVc2VkIHRvIDAgdG8gbWVhbiAiYWxsCiAgICAgLy8g
Y29sb3JzIiwgc28gc2V0IGl0IHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2xvcnMgZm9yIHRo
aXMgYml0IGRlcHRoLgpAQCAtMjU0LDI5ICsyMTIsMjkgQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6
cHJvY2Vzc0luZm9IZWFkZXIoUwogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIEJNUEltYWdl
UmVhZGVyOjpyZWFkSW5mb0hlYWRlcihTaGFyZWRCdWZmZXIqIGRhdGEpCitib29sIEJNUEltYWdl
UmVhZGVyOjpyZWFkSW5mb0hlYWRlcigpCiB7CiAgICAgLy8gUHJlLWluaXRpYWxpemUgc29tZSBm
aWVsZHMgdGhhdCBub3QgYWxsIGhlYWRlcnMgc2V0LgogICAgIG1faW5mb0hlYWRlci5iaUNvbXBy
ZXNzaW9uID0gUkdCOwogICAgIG1faW5mb0hlYWRlci5iaUNsclVzZWQgPSAwOwogCiAgICAgaWYg
KG1faXNPUzIxeCkgewotICAgICAgICBtX2luZm9IZWFkZXIuYmlXaWR0aCA9IHJlYWRVaW50MTYo
ZGF0YSwgNCk7Ci0gICAgICAgIG1faW5mb0hlYWRlci5iaUhlaWdodCA9IHJlYWRVaW50MTYoZGF0
YSwgNik7CisgICAgICAgIG1faW5mb0hlYWRlci5iaVdpZHRoID0gcmVhZFVpbnQxNig0KTsKKyAg
ICAgICAgbV9pbmZvSGVhZGVyLmJpSGVpZ2h0ID0gcmVhZFVpbnQxNig2KTsKICAgICAgICAgQVNT
RVJUKG1fYW5kTWFza1N0YXRlID09IE5vbmUpOyAgLy8gSUNPIGlzIGEgV2luZG93cyBmb3JtYXQs
IG5vdCBPUy8yIQotICAgICAgICBtX2luZm9IZWFkZXIuYmlCaXRDb3VudCA9IHJlYWRVaW50MTYo
ZGF0YSwgMTApOworICAgICAgICBtX2luZm9IZWFkZXIuYmlCaXRDb3VudCA9IHJlYWRVaW50MTYo
MTApOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBtX2luZm9IZWFkZXIuYmlX
aWR0aCA9IHJlYWRVaW50MzIoZGF0YSwgNCk7Ci0gICAgbV9pbmZvSGVhZGVyLmJpSGVpZ2h0ID0g
cmVhZFVpbnQzMihkYXRhLCA4KTsKKyAgICBtX2luZm9IZWFkZXIuYmlXaWR0aCA9IHJlYWRVaW50
MzIoNCk7CisgICAgbV9pbmZvSGVhZGVyLmJpSGVpZ2h0ID0gcmVhZFVpbnQzMig4KTsKICAgICBp
ZiAobV9hbmRNYXNrU3RhdGUgIT0gTm9uZSkKICAgICAgICAgbV9pbmZvSGVhZGVyLmJpSGVpZ2h0
IC89IDI7Ci0gICAgbV9pbmZvSGVhZGVyLmJpQml0Q291bnQgPSByZWFkVWludDE2KGRhdGEsIDE0
KTsKKyAgICBtX2luZm9IZWFkZXIuYmlCaXRDb3VudCA9IHJlYWRVaW50MTYoMTQpOwogCiAgICAg
Ly8gUmVhZCBjb21wcmVzc2lvbiB0eXBlLCBpZiBwcmVzZW50LgogICAgIGlmIChtX2luZm9IZWFk
ZXIuYmlTaXplID49IDIwKSB7Ci0gICAgICAgIHVpbnQzMl90IGJpQ29tcHJlc3Npb24gPSByZWFk
VWludDMyKGRhdGEsIDE2KTsKKyAgICAgICAgdWludDMyX3QgYmlDb21wcmVzc2lvbiA9IHJlYWRV
aW50MzIoMTYpOwogCiAgICAgICAgIC8vIERldGVjdCBPUy8yIDIueC1zcGVjaWZpYyBjb21wcmVz
c2lvbiB0eXBlcy4KICAgICAgICAgaWYgKChiaUNvbXByZXNzaW9uID09IDMpICYmIChtX2luZm9I
ZWFkZXIuYmlCaXRDb3VudCA9PSAxKSkgewpAQCAtMjg1LDE4ICsyNDMsMTYgQEAgYm9vbCBCTVBJ
bWFnZVJlYWRlcjo6cmVhZEluZm9IZWFkZXIoU2hhcgogICAgICAgICB9IGVsc2UgaWYgKChiaUNv
bXByZXNzaW9uID09IDQpICYmIChtX2luZm9IZWFkZXIuYmlCaXRDb3VudCA9PSAyNCkpIHsKICAg
ICAgICAgICAgIG1faW5mb0hlYWRlci5iaUNvbXByZXNzaW9uID0gUkxFMjQ7CiAgICAgICAgICAg
ICBtX2lzT1MyMnggPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGJpQ29tcHJlc3Npb24gPiA1
KSB7Ci0gICAgICAgICAgICAvLyBTb21lIHR5cGUgd2UgZG9uJ3QgdW5kZXJzdGFuZC4KLSAgICAg
ICAgICAgIHNldEZhaWxlZCgpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9
IGVsc2UKKyAgICAgICAgfSBlbHNlIGlmIChiaUNvbXByZXNzaW9uID4gNSkKKyAgICAgICAgICAg
IHJldHVybiBzZXRGYWlsZWQoKTsgIC8vIFNvbWUgdHlwZSB3ZSBkb24ndCB1bmRlcnN0YW5kLgor
ICAgICAgICBlbHNlCiAgICAgICAgICAgICBtX2luZm9IZWFkZXIuYmlDb21wcmVzc2lvbiA9CiAg
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q29tcHJlc3Npb25UeXBlPihiaUNvbXByZXNzaW9u
KTsKICAgICB9CiAKICAgICAvLyBSZWFkIGNvbG9ycyB1c2VkLCBpZiBwcmVzZW50LgogICAgIGlm
IChtX2luZm9IZWFkZXIuYmlTaXplID49IDM2KQotICAgICAgICBtX2luZm9IZWFkZXIuYmlDbHJV
c2VkID0gcmVhZFVpbnQzMihkYXRhLCAzMik7CisgICAgICAgIG1faW5mb0hlYWRlci5iaUNsclVz
ZWQgPSByZWFkVWludDMyKDMyKTsKIAogICAgIC8vIFdpbmRvd3MgVjQrIGNhbiBzYWZlbHkgcmVh
ZCB0aGUgZm91ciBiaXRtYXNrcyBmcm9tIDQwLTU2IGJ5dGVzIGluLCBzbyBkbwogICAgIC8vIHRo
YXQgaGVyZS4gIElmIHRoZSBiaXQgZGVwdGggaXMgbGVzcyB0aGFuIDE2LCB0aGVzZSB2YWx1ZXMg
d2lsbCBiZQpAQCAtMzEzLDEwICsyNjksMTAgQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6cmVhZElu
Zm9IZWFkZXIoU2hhcgogICAgIC8vIHRvIHBheSBhdHRlbnRpb24gdG8gdGhlIGFscGhhIG1hc2sg
aGVyZSwgc28gdGhlcmUncyBhIHNwZWNpYWwgY2FzZSBpbgogICAgIC8vIHByb2Nlc3NCaXRtYXNr
cygpIHRoYXQgZG9lc24ndCBhbHdheXMgb3ZlcndyaXRlIHRoYXQgdmFsdWUuCiAgICAgaWYgKGlz
V2luZG93c1Y0UGx1cygpKSB7Ci0gICAgICAgIG1fYml0TWFza3NbMF0gPSByZWFkVWludDMyKGRh
dGEsIDQwKTsKLSAgICAgICAgbV9iaXRNYXNrc1sxXSA9IHJlYWRVaW50MzIoZGF0YSwgNDQpOwot
ICAgICAgICBtX2JpdE1hc2tzWzJdID0gcmVhZFVpbnQzMihkYXRhLCA0OCk7Ci0gICAgICAgIG1f
Yml0TWFza3NbM10gPSByZWFkVWludDMyKGRhdGEsIDUyKTsKKyAgICAgICAgbV9iaXRNYXNrc1sw
XSA9IHJlYWRVaW50MzIoNDApOworICAgICAgICBtX2JpdE1hc2tzWzFdID0gcmVhZFVpbnQzMig0
NCk7CisgICAgICAgIG1fYml0TWFza3NbMl0gPSByZWFkVWludDMyKDQ4KTsKKyAgICAgICAgbV9i
aXRNYXNrc1szXSA9IHJlYWRVaW50MzIoNTIpOwogICAgIH0KIAogICAgIC8vIERldGVjdCB0b3At
ZG93biBCTVBzLgpAQCAtNDQ2LDcgKzQwMiw3IEBAIGJvb2wgQk1QSW1hZ2VSZWFkZXI6OmlzSW5m
b0hlYWRlclZhbGlkKCkKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBCTVBJbWFnZVJlYWRl
cjo6cHJvY2Vzc0JpdG1hc2tzKFNoYXJlZEJ1ZmZlciogZGF0YSkKK2Jvb2wgQk1QSW1hZ2VSZWFk
ZXI6OnByb2Nlc3NCaXRtYXNrcygpCiB7CiAgICAgLy8gQ3JlYXRlIG1fYml0TWFza3NbXSB2YWx1
ZXMuCiAgICAgaWYgKG1faW5mb0hlYWRlci5iaUNvbXByZXNzaW9uICE9IEJJVEZJRUxEUykgewpA
QCAtNDc4LDE3ICs0MzQsMTUgQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc0JpdG1hc2tz
KFNoYQogICAgICAgICBpZiAoKChtX2hlYWRlck9mZnNldCArIG1faW5mb0hlYWRlci5iaVNpemUg
KyBTSVpFT0ZfQklUTUFTS1MpIDwKICAgICAgICAgICAgICAgICAobV9oZWFkZXJPZmZzZXQgKyBt
X2luZm9IZWFkZXIuYmlTaXplKSkKICAgICAgICAgICAgIHx8IChtX2ltZ0RhdGFPZmZzZXQgJiYg
KG1faW1nRGF0YU9mZnNldCA8Ci0gICAgICAgICAgICAgICAgKG1faGVhZGVyT2Zmc2V0ICsgbV9p
bmZvSGVhZGVyLmJpU2l6ZSArIFNJWkVPRl9CSVRNQVNLUykpKSkgewotICAgICAgICAgICAgc2V0
RmFpbGVkKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAobV9oZWFkZXJPZmZzZXQgKyBtX2luZm9IZWFkZXIuYmlTaXplICsgU0laRU9GX0JJ
VE1BU0tTKSkpKQorICAgICAgICAgICAgcmV0dXJuIHNldEZhaWxlZCgpOwogCiAgICAgICAgIC8v
IFJlYWQgYml0bWFza3MuCi0gICAgICAgIGlmICgoZGF0YS0+c2l6ZSgpIC0gbV9kZWNvZGVkT2Zm
c2V0KSA8IFNJWkVPRl9CSVRNQVNLUykKKyAgICAgICAgaWYgKChtX2RhdGEtPnNpemUoKSAtIG1f
ZGVjb2RlZE9mZnNldCkgPCBTSVpFT0ZfQklUTUFTS1MpCiAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgIG1fYml0TWFza3NbMF0gPSByZWFkVWludDMyKGRhdGEsIDApOwotICAgICAg
ICBtX2JpdE1hc2tzWzFdID0gcmVhZFVpbnQzMihkYXRhLCA0KTsKLSAgICAgICAgbV9iaXRNYXNr
c1syXSA9IHJlYWRVaW50MzIoZGF0YSwgOCk7CisgICAgICAgIG1fYml0TWFza3NbMF0gPSByZWFk
VWludDMyKDApOworICAgICAgICBtX2JpdE1hc2tzWzFdID0gcmVhZFVpbnQzMig0KTsKKyAgICAg
ICAgbV9iaXRNYXNrc1syXSA9IHJlYWRVaW50MzIoOCk7CiAgICAgICAgIC8vIE5vIGFscGhhIGlu
IGFueXRoaW5nIG90aGVyIHRoYW4gV2luZG93cyBWNCsuCiAgICAgICAgIG1fYml0TWFza3NbM10g
PSAwOwogCkBAIC01MjEsMTAgKzQ3NSw4IEBAIGJvb2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NC
aXRtYXNrcyhTaGEKIAogICAgICAgICAvLyBNYWtlIHN1cmUgYml0bWFzayBkb2VzIG5vdCBvdmVy
bGFwIGFueSBvdGhlciBiaXRtYXNrcy4KICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyAr
K2opIHsKLSAgICAgICAgICAgIGlmICh0ZW1wTWFzayAmIG1fYml0TWFza3Nbal0pIHsKLSAgICAg
ICAgICAgICAgICBzZXRGYWlsZWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGVtcE1hc2sgJiBtX2JpdE1hc2tzW2pdKQor
ICAgICAgICAgICAgICAgIHJldHVybiBzZXRGYWlsZWQoKTsKICAgICAgICAgfQogCiAgICAgICAg
IC8vIENvdW50IG9mZnNldCBpbnRvIHBpeGVsIGRhdGEuCkBAIC01MzYsMTAgKzQ4OCw4IEBAIGJv
b2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NCaXRtYXNrcyhTaGEKICAgICAgICAgICAgIC0tbV9i
aXRTaGlmdHNMZWZ0W2ldOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSBiaXRtYXNrIGlzIGNvbnRp
Z3VvdXMuCi0gICAgICAgIGlmICh0ZW1wTWFzaykgewotICAgICAgICAgICAgc2V0RmFpbGVkKCk7
Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKHRlbXBN
YXNrKQorICAgICAgICAgICAgcmV0dXJuIHNldEZhaWxlZCgpOwogCiAgICAgICAgIC8vIFNpbmNl
IFJHQkFCdWZmZXIgdG9wcyBvdXQgYXQgOCBiaXRzIHBlciBjaGFubmVsLCBhZGp1c3QgdGhlIHNo
aWZ0CiAgICAgICAgIC8vIGFtb3VudHMgdG8gdXNlIHRoZSBtb3N0IHNpZ25pZmljYW50IDggYml0
cyBvZiB0aGUgY2hhbm5lbC4KQEAgLTU1Miw3ICs1MDIsNyBAQCBib29sIEJNUEltYWdlUmVhZGVy
Ojpwcm9jZXNzQml0bWFza3MoU2hhCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQk1QSW1h
Z2VSZWFkZXI6OnByb2Nlc3NDb2xvclRhYmxlKFNoYXJlZEJ1ZmZlciogZGF0YSkKK2Jvb2wgQk1Q
SW1hZ2VSZWFkZXI6OnByb2Nlc3NDb2xvclRhYmxlKCkKIHsKICAgICBtX3RhYmxlU2l6ZUluQnl0
ZXMgPSBtX2luZm9IZWFkZXIuYmlDbHJVc2VkICogKG1faXNPUzIxeCA/IDMgOiA0KTsKIApAQCAt
NTYwLDIwICs1MTAsMTggQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc0NvbG9yVGFibGUo
UwogICAgIGlmICgoKG1faGVhZGVyT2Zmc2V0ICsgbV9pbmZvSGVhZGVyLmJpU2l6ZSArIG1fdGFi
bGVTaXplSW5CeXRlcykgPAogICAgICAgICAgICAgKG1faGVhZGVyT2Zmc2V0ICsgbV9pbmZvSGVh
ZGVyLmJpU2l6ZSkpCiAgICAgICAgIHx8IChtX2ltZ0RhdGFPZmZzZXQgJiYgKG1faW1nRGF0YU9m
ZnNldCA8Ci0gICAgICAgICAgICAobV9oZWFkZXJPZmZzZXQgKyBtX2luZm9IZWFkZXIuYmlTaXpl
ICsgbV90YWJsZVNpemVJbkJ5dGVzKSkpKSB7Ci0gICAgICAgIHNldEZhaWxlZCgpOwotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICAgICAgICAgICAgKG1faGVhZGVyT2Zmc2V0ICsgbV9p
bmZvSGVhZGVyLmJpU2l6ZSArIG1fdGFibGVTaXplSW5CeXRlcykpKSkKKyAgICAgICAgcmV0dXJu
IHNldEZhaWxlZCgpOwogCiAgICAgLy8gUmVhZCBjb2xvciB0YWJsZS4KLSAgICBpZiAoKG1fZGVj
b2RlZE9mZnNldCA+IGRhdGEtPnNpemUoKSkKLSAgICAgICAgfHwgKChkYXRhLT5zaXplKCkgLSBt
X2RlY29kZWRPZmZzZXQpIDwgbV90YWJsZVNpemVJbkJ5dGVzKSkKKyAgICBpZiAoKG1fZGVjb2Rl
ZE9mZnNldCA+IG1fZGF0YS0+c2l6ZSgpKQorICAgICAgICB8fCAoKG1fZGF0YS0+c2l6ZSgpIC0g
bV9kZWNvZGVkT2Zmc2V0KSA8IG1fdGFibGVTaXplSW5CeXRlcykpCiAgICAgICAgIHJldHVybiBm
YWxzZTsKICAgICBtX2NvbG9yVGFibGUucmVzaXplKG1faW5mb0hlYWRlci5iaUNsclVzZWQpOwog
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9pbmZvSGVhZGVyLmJpQ2xyVXNlZDsgKytpKSB7
Ci0gICAgICAgIG1fY29sb3JUYWJsZVtpXS5yZ2JCbHVlID0gZGF0YS0+ZGF0YSgpW21fZGVjb2Rl
ZE9mZnNldCsrXTsKLSAgICAgICAgbV9jb2xvclRhYmxlW2ldLnJnYkdyZWVuID0gZGF0YS0+ZGF0
YSgpW21fZGVjb2RlZE9mZnNldCsrXTsKLSAgICAgICAgbV9jb2xvclRhYmxlW2ldLnJnYlJlZCA9
IGRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQrK107CisgICAgICAgIG1fY29sb3JUYWJsZVtp
XS5yZ2JCbHVlID0gbV9kYXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0KytdOworICAgICAgICBt
X2NvbG9yVGFibGVbaV0ucmdiR3JlZW4gPSBtX2RhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQr
K107CisgICAgICAgIG1fY29sb3JUYWJsZVtpXS5yZ2JSZWQgPSBtX2RhdGEtPmRhdGEoKVttX2Rl
Y29kZWRPZmZzZXQrK107CiAgICAgICAgIC8vIFNraXAgcGFkZGluZyBieXRlIChub3QgcHJlc2Vu
dCBvbiBPUy8yIDEueCkuCiAgICAgICAgIGlmICghbV9pc09TMjF4KQogICAgICAgICAgICAgKytt
X2RlY29kZWRPZmZzZXQ7CkBAIC01ODgsOSArNTM2LDkgQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6
cHJvY2Vzc0NvbG9yVGFibGUoUwogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIEJNUEltYWdl
UmVhZGVyOjpwcm9jZXNzUkxFRGF0YShTaGFyZWRCdWZmZXIqIGRhdGEpCitib29sIEJNUEltYWdl
UmVhZGVyOjpwcm9jZXNzUkxFRGF0YSgpCiB7Ci0gICAgaWYgKG1fZGVjb2RlZE9mZnNldCA+IGRh
dGEtPnNpemUoKSkKKyAgICBpZiAobV9kZWNvZGVkT2Zmc2V0ID4gbV9kYXRhLT5zaXplKCkpCiAg
ICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIC8vIFJMRSBkZWNvZGluZyBpcyBwb29ybHkgc3Bl
Y2lmaWVkLiAgVHdvIG1haW4gcHJvYmxlbXM6CkBAIC02MTUsMjkgKzU2MywyNiBAQCBib29sIEJN
UEltYWdlUmVhZGVyOjpwcm9jZXNzUkxFRGF0YShTaGFyCiAKICAgICAvLyBJbXBvc3NpYmxlIHRv
IGRlY29kZSByb3ctYXQtYS10aW1lLCBzbyBqdXN0IGRvIHRoaW5ncyBhcyBhIHN0cmVhbSBvZgog
ICAgIC8vIGJ5dGVzLgotICAgIFJHQkEzMkJ1ZmZlciogYnVmZmVyID0gJm1fZnJhbWVCdWZmZXJD
YWNoZS5maXJzdCgpOwogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgIC8vIEV2ZXJ5IGVudHJ5
IHRha2VzIGF0IGxlYXN0IHR3byBieXRlczsgYmFpbCBpZiB0aGVyZSBpc24ndCBlbm91Z2gKICAg
ICAgICAgLy8gZGF0YS4KLSAgICAgICAgaWYgKChkYXRhLT5zaXplKCkgLSBtX2RlY29kZWRPZmZz
ZXQpIDwgMikKKyAgICAgICAgaWYgKChtX2RhdGEtPnNpemUoKSAtIG1fZGVjb2RlZE9mZnNldCkg
PCAyKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIC8vIEZvciBldmVyeSBl
bnRyeSBleGNlcHQgRU9GLCB3ZSdkIGJldHRlciBub3QgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YK
ICAgICAgICAgLy8gdGhlIGltYWdlLgotICAgICAgICBjb25zdCB1aW50OF90IGNvdW50ID0gZGF0
YS0+ZGF0YSgpW21fZGVjb2RlZE9mZnNldF07Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgY29kZSA9
IGRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQgKyAxXTsKLSAgICAgICAgaWYgKCgoY291bnQg
IT0gMCkgfHwgKGNvZGUgIT0gMSkpICYmIHBhc3RFbmRPZkltYWdlKDApKSB7Ci0gICAgICAgICAg
ICBzZXRGYWlsZWQoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAg
ICAgICBjb25zdCB1aW50OF90IGNvdW50ID0gbV9kYXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0
XTsKKyAgICAgICAgY29uc3QgdWludDhfdCBjb2RlID0gbV9kYXRhLT5kYXRhKClbbV9kZWNvZGVk
T2Zmc2V0ICsgMV07CisgICAgICAgIGlmICgoKGNvdW50ICE9IDApIHx8IChjb2RlICE9IDEpKSAm
JiBwYXN0RW5kT2ZJbWFnZSgwKSkKKyAgICAgICAgICAgIHJldHVybiBzZXRGYWlsZWQoKTsKIAog
ICAgICAgICAvLyBEZWNvZGUuCiAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CiAgICAgICAgICAg
ICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgICAgIGNhc2UgMDogIC8vIE1hZ2ljIHRva2VuOiBF
T0wKICAgICAgICAgICAgICAgICAvLyBTa2lwIGFueSByZW1haW5pbmcgcGl4ZWxzIGluIHRoaXMg
cm93LgotICAgICAgICAgICAgICAgIGlmIChtX2Nvb3JkLngoKSA8IHNpemUoKS53aWR0aCgpKQot
ICAgICAgICAgICAgICAgICAgICBidWZmZXItPnNldEhhc0FscGhhKHRydWUpOworICAgICAgICAg
ICAgICAgIGlmIChtX2Nvb3JkLngoKSA8IG1fcGFyZW50LT5zaXplKCkud2lkdGgoKSkKKyAgICAg
ICAgICAgICAgICAgICAgbV9idWZmZXItPnNldEhhc0FscGhhKHRydWUpOwogICAgICAgICAgICAg
ICAgIG1vdmVCdWZmZXJUb05leHRSb3coKTsKIAogICAgICAgICAgICAgICAgIG1fZGVjb2RlZE9m
ZnNldCArPSAyOwpAQCAtNjQ1LDMwICs1OTAsMjggQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6cHJv
Y2Vzc1JMRURhdGEoU2hhcgogCiAgICAgICAgICAgICBjYXNlIDE6ICAvLyBNYWdpYyB0b2tlbjog
RU9GCiAgICAgICAgICAgICAgICAgLy8gU2tpcCBhbnkgcmVtYWluaW5nIHBpeGVscyBpbiB0aGUg
aW1hZ2UuCi0gICAgICAgICAgICAgICAgaWYgKChtX2Nvb3JkLngoKSA8IHNpemUoKS53aWR0aCgp
KQorICAgICAgICAgICAgICAgIGlmICgobV9jb29yZC54KCkgPCBtX3BhcmVudC0+c2l6ZSgpLndp
ZHRoKCkpCiAgICAgICAgICAgICAgICAgICAgIHx8IChtX2lzVG9wRG93bgotICAgICAgICAgICAg
ICAgICAgICAgICAgPyAobV9jb29yZC55KCkgPCAoc2l6ZSgpLmhlaWdodCgpIC0gMSkpCisgICAg
ICAgICAgICAgICAgICAgICAgICA/IChtX2Nvb3JkLnkoKSA8IChtX3BhcmVudC0+c2l6ZSgpLmhl
aWdodCgpIC0gMSkpCiAgICAgICAgICAgICAgICAgICAgICAgICA6IChtX2Nvb3JkLnkoKSA+IDAp
KSkKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRIYXNBbHBoYSh0cnVlKTsKKyAgICAg
ICAgICAgICAgICAgICAgbV9idWZmZXItPnNldEhhc0FscGhhKHRydWUpOwogICAgICAgICAgICAg
ICAgIHJldHVybiB0cnVlOwogCiAgICAgICAgICAgICBjYXNlIDI6IHsgIC8vIE1hZ2ljIHRva2Vu
OiBEZWx0YQogICAgICAgICAgICAgICAgIC8vIFRoZSBuZXh0IHR3byBieXRlcyBzcGVjaWZ5IGR4
IGFuZCBkeS4gIEJhaWwgaWYgdGhlcmUgaXNuJ3QKICAgICAgICAgICAgICAgICAvLyBlbm91Z2gg
ZGF0YS4KLSAgICAgICAgICAgICAgICBpZiAoKGRhdGEtPnNpemUoKSAtIG1fZGVjb2RlZE9mZnNl
dCkgPCA0KQorICAgICAgICAgICAgICAgIGlmICgobV9kYXRhLT5zaXplKCkgLSBtX2RlY29kZWRP
ZmZzZXQpIDwgNCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAg
ICAgICAgICAgLy8gRmFpbCBpZiB0aGlzIHRha2VzIHVzIHBhc3QgdGhlIGVuZCBvZiB0aGUgZGVz
aXJlZCByb3cgb3IKICAgICAgICAgICAgICAgICAvLyBwYXN0IHRoZSBlbmQgb2YgdGhlIGltYWdl
LgotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgZHggPSBkYXRhLT5kYXRhKClbbV9kZWNv
ZGVkT2Zmc2V0ICsgMl07Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBkeSA9IGRhdGEt
PmRhdGEoKVttX2RlY29kZWRPZmZzZXQgKyAzXTsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50
OF90IGR4ID0gbV9kYXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0ICsgMl07CisgICAgICAgICAg
ICAgICAgY29uc3QgdWludDhfdCBkeSA9IG1fZGF0YS0+ZGF0YSgpW21fZGVjb2RlZE9mZnNldCAr
IDNdOwogICAgICAgICAgICAgICAgIGlmICgoZHggIT0gMCkgfHwgKGR5ICE9IDApKQotICAgICAg
ICAgICAgICAgICAgICBidWZmZXItPnNldEhhc0FscGhhKHRydWUpOwotICAgICAgICAgICAgICAg
IGlmICgoKG1fY29vcmQueCgpICsgZHgpID4gc2l6ZSgpLndpZHRoKCkpIHx8Ci0gICAgICAgICAg
ICAgICAgICAgIHBhc3RFbmRPZkltYWdlKGR5KSkgewotICAgICAgICAgICAgICAgICAgICBzZXRG
YWlsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbV9idWZmZXItPnNldEhhc0FscGhhKHRydWUpOwor
ICAgICAgICAgICAgICAgIGlmICgoKG1fY29vcmQueCgpICsgZHgpID4gbV9wYXJlbnQtPnNpemUo
KS53aWR0aCgpKSB8fAorICAgICAgICAgICAgICAgICAgICBwYXN0RW5kT2ZJbWFnZShkeSkpCisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRGYWlsZWQoKTsKIAogICAgICAgICAgICAgICAg
IC8vIFNraXAgaW50ZXJ2ZW5pbmcgcGl4ZWxzLgogICAgICAgICAgICAgICAgIG1fY29vcmQubW92
ZShkeCwgbV9pc1RvcERvd24gPyBkeSA6IC1keSk7CkBAIC02ODQsNyArNjI3LDcgQEAgYm9vbCBC
TVBJbWFnZVJlYWRlcjo6cHJvY2Vzc1JMRURhdGEoU2hhcgogICAgICAgICAgICAgICAgIC8vIHBv
aW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBpeGVsIGRhdGEsIGJ1bXAgaXQgcGFzdAogICAg
ICAgICAgICAgICAgIC8vIHRoZSBlc2NhcGUgYnl0ZXMgYW5kIHRoZW4gcmVzZXQgaWYgZGVjb2Rp
bmcgZmFpbGVkLgogICAgICAgICAgICAgICAgIG1fZGVjb2RlZE9mZnNldCArPSAyOwotICAgICAg
ICAgICAgICAgIGlmICghcHJvY2Vzc05vblJMRURhdGEoZGF0YSwgdHJ1ZSwgY29kZSkpIHsKKyAg
ICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NOb25STEVEYXRhKHRydWUsIGNvZGUpKSB7CiAgICAg
ICAgICAgICAgICAgICAgIG1fZGVjb2RlZE9mZnNldCAtPSAyOwogICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjk0LDE2ICs2MzcsMTcgQEAg
Ym9vbCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc1JMRURhdGEoU2hhcgogICAgICAgICAgICAgLy8g
VGhlIGZvbGxvd2luZyBjb2xvciBkYXRhIGlzIHJlcGVhdGVkIGZvciB8Y291bnR8IHRvdGFsIHBp
eGVscy4KICAgICAgICAgICAgIC8vIFN0cmFuZ2VseSwgc29tZSBCTVBzIHNlZW0gdG8gc3BlY2lm
eSBleGNlc3NpdmVseSBsYXJnZSBjb3VudHMKICAgICAgICAgICAgIC8vIGhlcmU7IGlnbm9yZSBw
aXhlbHMgcGFzdCB0aGUgZW5kIG9mIHRoZSByb3cuCi0gICAgICAgICAgICBjb25zdCBpbnQgZW5k
WCA9IHN0ZDo6bWluKG1fY29vcmQueCgpICsgY291bnQsIHNpemUoKS53aWR0aCgpKTsKKyAgICAg
ICAgICAgIGNvbnN0IGludCBlbmRYID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1pbihtX2Nvb3Jk
LngoKSArIGNvdW50LCBtX3BhcmVudC0+c2l6ZSgpLndpZHRoKCkpOwogCiAgICAgICAgICAgICBp
ZiAobV9pbmZvSGVhZGVyLmJpQ29tcHJlc3Npb24gPT0gUkxFMjQpIHsKICAgICAgICAgICAgICAg
ICAvLyBCYWlsIGlmIHRoZXJlIGlzbid0IGVub3VnaCBkYXRhLgotICAgICAgICAgICAgICAgIGlm
ICgoZGF0YS0+c2l6ZSgpIC0gbV9kZWNvZGVkT2Zmc2V0KSA8IDQpCisgICAgICAgICAgICAgICAg
aWYgKChtX2RhdGEtPnNpemUoKSAtIG1fZGVjb2RlZE9mZnNldCkgPCA0KQogICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgICAgICAgICAvLyBPbmUgQkdSIHRyaXBs
ZSB0aGF0IHdlIGNvcHkgfGNvdW50fCB0aW1lcy4KLSAgICAgICAgICAgICAgICBmaWxsUkdCQShl
bmRYLCBkYXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0ICsgM10sCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgZGF0YS0+ZGF0YSgpW21fZGVjb2RlZE9mZnNldCArIDJdLCBjb2RlLCAweGZmKTsK
KyAgICAgICAgICAgICAgICBmaWxsUkdCQShlbmRYLCBtX2RhdGEtPmRhdGEoKVttX2RlY29kZWRP
ZmZzZXQgKyAzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2RhdGEtPmRhdGEoKVttX2Rl
Y29kZWRPZmZzZXQgKyAyXSwgY29kZSwgMHhmZik7CiAgICAgICAgICAgICAgICAgbV9kZWNvZGVk
T2Zmc2V0ICs9IDQ7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIFJM
RTggaGFzIG9uZSBjb2xvciBpbmRleCB0aGF0IGdldHMgcmVwZWF0ZWQ7IFJMRTQgaGFzIHR3bwpA
QCAtNzE1LDEwICs2NTksOCBAQCBib29sIEJNUEltYWdlUmVhZGVyOjpwcm9jZXNzUkxFRGF0YShT
aGFyCiAgICAgICAgICAgICAgICAgICAgIGNvbG9ySW5kZXhlc1sxXSAmPSAweGY7CiAgICAgICAg
ICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICgoY29sb3JJbmRleGVzWzBdID49IG1faW5m
b0hlYWRlci5iaUNsclVzZWQpCi0gICAgICAgICAgICAgICAgICAgIHx8IChjb2xvckluZGV4ZXNb
MV0gPj0gbV9pbmZvSGVhZGVyLmJpQ2xyVXNlZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0
RmFpbGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgICAgIHx8IChjb2xvckluZGV4ZXNbMV0gPj0gbV9pbmZv
SGVhZGVyLmJpQ2xyVXNlZCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRGYWlsZWQo
KTsKICAgICAgICAgICAgICAgICBmb3IgKGludCB3aGljaCA9IDA7IG1fY29vcmQueCgpIDwgZW5k
WDsgKSB7CiAgICAgICAgICAgICAgICAgICAgIHNldEkoY29sb3JJbmRleGVzW3doaWNoXSk7CiAg
ICAgICAgICAgICAgICAgICAgIHdoaWNoID0gIXdoaWNoOwpAQCAtNzMwLDIwICs2NzIsMTggQEAg
Ym9vbCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc1JMRURhdGEoU2hhcgogICAgIH0KIH0KIAotYm9v
bCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc05vblJMRURhdGEoU2hhcmVkQnVmZmVyKiBkYXRhLCBi
b29sIGluUkxFLCBpbnQgbnVtUGl4ZWxzKQorYm9vbCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc05v
blJMRURhdGEoYm9vbCBpblJMRSwgaW50IG51bVBpeGVscykKIHsKLSAgICBpZiAobV9kZWNvZGVk
T2Zmc2V0ID4gZGF0YS0+c2l6ZSgpKQorICAgIGlmIChtX2RlY29kZWRPZmZzZXQgPiBtX2RhdGEt
PnNpemUoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKCFpblJMRSkKLSAgICAg
ICAgbnVtUGl4ZWxzID0gc2l6ZSgpLndpZHRoKCk7CisgICAgICAgIG51bVBpeGVscyA9IG1fcGFy
ZW50LT5zaXplKCkud2lkdGgoKTsKIAogICAgIC8vIEZhaWwgaWYgd2UncmUgYmVpbmcgYXNrZWQg
dG8gZGVjb2RlIG1vcmUgcGl4ZWxzIHRoYW4gcmVtYWluIGluIHRoZSByb3cuCiAgICAgY29uc3Qg
aW50IGVuZFggPSBtX2Nvb3JkLngoKSArIG51bVBpeGVsczsKLSAgICBpZiAoZW5kWCA+IHNpemUo
KS53aWR0aCgpKSB7Ci0gICAgICAgIHNldEZhaWxlZCgpOwotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgfQorICAgIGlmIChlbmRYID4gbV9wYXJlbnQtPnNpemUoKS53aWR0aCgpKQorICAgICAg
ICByZXR1cm4gc2V0RmFpbGVkKCk7CiAKICAgICAvLyBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMg
b2YgZGF0YSB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBwaXhlbHMKICAgICAvLyByZXF1aXJlcy4K
QEAgLTc1OSwxMCArNjk5LDkgQEAgYm9vbCBCTVBJbWFnZVJlYWRlcjo6cHJvY2Vzc05vblJMRURh
dGEoUwogCiAgICAgLy8gRGVjb2RlIGFzIG1hbnkgcm93cyBhcyB3ZSBjYW4uICAoRm9yIFJMRSwg
d2hlcmUgd2Ugb25seSB3YW50IHRvIGRlY29kZQogICAgIC8vIG9uZSByb3csIHdlJ3ZlIGFscmVh
ZHkgY2hlY2tlZCB0aGF0IHRoaXMgY29uZGl0aW9uIGlzIHRydWUuKQotICAgIFJHQkEzMkJ1ZmZl
ciogYnVmZmVyID0gJm1fZnJhbWVCdWZmZXJDYWNoZS5maXJzdCgpOwogICAgIHdoaWxlICghcGFz
dEVuZE9mSW1hZ2UoMCkpIHsKICAgICAgICAgLy8gQmFpbCBpZiB3ZSBkb24ndCBoYXZlIGVub3Vn
aCBkYXRhIGZvciB0aGUgZGVzaXJlZCBudW1iZXIgb2YgcGl4ZWxzLgotICAgICAgICBpZiAoKGRh
dGEtPnNpemUoKSAtIG1fZGVjb2RlZE9mZnNldCkgPCBwYWRkZWROdW1CeXRlcykKKyAgICAgICAg
aWYgKChtX2RhdGEtPnNpemUoKSAtIG1fZGVjb2RlZE9mZnNldCkgPCBwYWRkZWROdW1CeXRlcykK
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAobV9pbmZvSGVhZGVyLmJp
Qml0Q291bnQgPCAxNikgewpAQCAtNzcxLDcgKzcxMCw3IEBAIGJvb2wgQk1QSW1hZ2VSZWFkZXI6
OnByb2Nlc3NOb25STEVEYXRhKFMKICAgICAgICAgICAgIC8vIHRoZSBtb3N0IHNpZ25pZmljYW50
IGJpdHMgaW4gdGhlIGJ5dGUpLgogICAgICAgICAgICAgY29uc3QgdWludDhfdCBtYXNrID0gKDEg
PDwgbV9pbmZvSGVhZGVyLmJpQml0Q291bnQpIC0gMTsKICAgICAgICAgICAgIGZvciAoc2l6ZV90
IGJ5dGUgPSAwOyBieXRlIDwgdW5wYWRkZWROdW1CeXRlczsgKytieXRlKSB7Ci0gICAgICAgICAg
ICAgICAgdWludDhfdCBwaXhlbERhdGEgPSBkYXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0ICsg
Ynl0ZV07CisgICAgICAgICAgICAgICAgdWludDhfdCBwaXhlbERhdGEgPSBtX2RhdGEtPmRhdGEo
KVttX2RlY29kZWRPZmZzZXQgKyBieXRlXTsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBw
aXhlbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAocGl4ZWwgPCBwaXhlbHNQZXJCeXRlKSAm
JiAobV9jb29yZC54KCkgPCBlbmRYKTsgKytwaXhlbCkgewogICAgICAgICAgICAgICAgICAgICBj
b25zdCBzaXplX3QgY29sb3JJbmRleCA9CkBAIC03ODQsMTQgKzcyMywxMiBAQCBib29sIEJNUElt
YWdlUmVhZGVyOjpwcm9jZXNzTm9uUkxFRGF0YShTCiAgICAgICAgICAgICAgICAgICAgICAgICAv
LyB3ZWIgd2lsbCBub3QgYmUgZG9pbmcgYSBsb3Qgb2YgaW52ZXJ0aW5nLgogICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKGNvbG9ySW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzZXRSR0JBKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZl
ci0+c2V0SGFzQWxwaGEodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9idWZm
ZXItPnNldEhhc0FscGhhKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb29yZC5tb3ZlKDEsIDApOwogICAgICAgICAg
ICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9ySW5k
ZXggPj0gbV9pbmZvSGVhZGVyLmJpQ2xyVXNlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHNldEZhaWxlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlm
IChjb2xvckluZGV4ID49IG1faW5mb0hlYWRlci5iaUNsclVzZWQpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIHNldEZhaWxlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAg
c2V0SShjb2xvckluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg
ICAgICBwaXhlbERhdGEgPDw9IG1faW5mb0hlYWRlci5iaUJpdENvdW50OwpAQCAtODAwLDcgKzcz
Nyw3IEBAIGJvb2wgQk1QSW1hZ2VSZWFkZXI6OnByb2Nlc3NOb25STEVEYXRhKFMKICAgICAgICAg
fSBlbHNlIHsKICAgICAgICAgICAgIC8vIFJHQiBkYXRhLiAgRGVjb2RlIHBpeGVscyBvbmUgYXQg
YSB0aW1lLCBsZWZ0IHRvIHJpZ2h0LgogICAgICAgICAgICAgd2hpbGUgKG1fY29vcmQueCgpIDwg
ZW5kWCkgewotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBpeGVsID0gcmVhZEN1cnJl
bnRQaXhlbChkYXRhLCBieXRlc1BlclBpeGVsKTsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50
MzJfdCBwaXhlbCA9IHJlYWRDdXJyZW50UGl4ZWwoYnl0ZXNQZXJQaXhlbCk7CiAKICAgICAgICAg
ICAgICAgICAvLyBTb21lIEJNUHMgc3BlY2lmeSBhbiBhbHBoYSBjaGFubmVsIGJ1dCBkb24ndCBh
Y3R1YWxseSB1c2UgaXQKICAgICAgICAgICAgICAgICAvLyAoaXQgY29udGFpbnMgYWxsIDBzKS4g
IFRvIGF2b2lkIGRpc3BsYXlpbmcgdGhlc2UgaW1hZ2VzIGFzCkBAIC04MTgsMTAgKzc1NSwxMCBA
QCBib29sIEJNUEltYWdlUmVhZGVyOjpwcm9jZXNzTm9uUkxFRGF0YShTCiAgICAgICAgICAgICAg
ICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbV9zZWVuTm9uWmVyb0FscGhhUGl4ZWwg
PSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBpZiAobV9zZWVuWmVyb0FscGhhUGl4ZWwpIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+emVyb0ZpbGwoKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIG1fYnVmZmVyLT56ZXJvRmlsbCgpOwogICAgICAgICAgICAgICAgICAgICAg
ICAgbV9zZWVuWmVyb0FscGhhUGl4ZWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfSBl
bHNlIGlmIChhbHBoYSAhPSAyNTUpCi0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnNl
dEhhc0FscGhhKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9idWZmZXItPnNldEhh
c0FscGhhKHRydWUpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHNldFJH
QkEoZ2V0Q29tcG9uZW50KHBpeGVsLCAwKSwgZ2V0Q29tcG9uZW50KHBpeGVsLCAxKSwKQEAgLTg0
NSw0ICs3ODIsMTEgQEAgdm9pZCBCTVBJbWFnZVJlYWRlcjo6bW92ZUJ1ZmZlclRvTmV4dFJvdwog
ICAgIG1fY29vcmQubW92ZSgtbV9jb29yZC54KCksIG1faXNUb3BEb3duID8gMSA6IC0xKTsKIH0K
IAorYm9vbCBCTVBJbWFnZVJlYWRlcjo6c2V0RmFpbGVkKCkKK3sKKyAgICBtX3BhcmVudC0+c2V0
RmFpbGVkKCk7CisgICAgbV9jb2xvclRhYmxlLmNsZWFyKCk7CisgICAgcmV0dXJuIGZhbHNlOwor
fQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2ltYWdl
LWRlY29kZXJzL2JtcC9CTVBJbWFnZVJlYWRlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxh
dGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlUmVhZGVyLmgJKHJldmlzaW9uIDQ0ODM2
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9ibXAvQk1QSW1hZ2VSZWFkZXIu
aAkod29ya2luZyBjb3B5KQpAQCAtMzYsMjMgKzM2LDEzIEBACiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAotICAgIC8vIFRoaXMgY2xhc3MgZGVjb2RlcyBhIEJNUCBpbWFnZS4gIEl0IGlzIHVzZWQg
YXMgYSBiYXNlIGZvciB0aGUgQk1QIGFuZCBJQ08KLSAgICAvLyBkZWNvZGVycywgd2hpY2ggd3Jh
cCBpdCBpbiB0aGUgYXBwcm9wcmlhdGUgY29kZSB0byByZWFkIGZpbGUgaGVhZGVycywgZXRjLgot
ICAgIGNsYXNzIEJNUEltYWdlUmVhZGVyIDogcHVibGljIEltYWdlRGVjb2RlciB7CisgICAgLy8g
VGhpcyBjbGFzcyBkZWNvZGVzIGEgQk1QIGltYWdlLiAgSXQgaXMgdXNlZCBpbiB0aGUgQk1QIGFu
ZCBJQ08gZGVjb2RlcnMsCisgICAgLy8gd2hpY2ggd3JhcCBpdCBpbiB0aGUgYXBwcm9wcmlhdGUg
Y29kZSB0byByZWFkIGZpbGUgaGVhZGVycywgZXRjLgorICAgIGNsYXNzIEJNUEltYWdlUmVhZGVy
IHsKICAgICBwdWJsaWM6Ci0gICAgICAgIEJNUEltYWdlUmVhZGVyKCk7Ci0KLSAgICAgICAgLy8g
RG9lcyB0aGUgYWN0dWFsIGRlY29kaW5nLiAgfGRhdGF8IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5n
IG9mIHRoZSBmaWxlLAotICAgICAgICAvLyBidXQgbWF5IGJlIGluY29tcGxldGUuCi0gICAgICAg
IHZpcnR1YWwgdm9pZCBkZWNvZGVJbWFnZShTaGFyZWRCdWZmZXIqIGRhdGEpID0gMDsKLQotICAg
ICAgICAvLyBJbWFnZURlY29kZXIKLSAgICAgICAgdmlydHVhbCB2b2lkIHNldERhdGEoU2hhcmVk
QnVmZmVyKiBkYXRhLCBib29sIGFsbERhdGFSZWNlaXZlZCk7Ci0gICAgICAgIHZpcnR1YWwgUkdC
QTMyQnVmZmVyKiBmcmFtZUJ1ZmZlckF0SW5kZXgoc2l6ZV90IGluZGV4KTsKLQogICAgICAgICAv
LyBSZWFkIGEgdmFsdWUgZnJvbSB8ZGF0YVtvZmZzZXRdfCwgY29udmVydGluZyBmcm9tIGxpdHRs
ZSB0byBuYXRpdmUKICAgICAgICAgLy8gZW5kaWFubmVzcy4KLSAgICAgICAgc3RhdGljIGlubGlu
ZSB1aW50MTZfdCByZWFkVWludDE2SGVscGVyKFNoYXJlZEJ1ZmZlciogZGF0YSwgaW50IG9mZnNl
dCkKKyAgICAgICAgc3RhdGljIGlubGluZSB1aW50MTZfdCByZWFkVWludDE2KFNoYXJlZEJ1ZmZl
ciogZGF0YSwgaW50IG9mZnNldCkKICAgICAgICAgewogICAgICAgICAgICAgdWludDE2X3QgcmVz
dWx0OwogICAgICAgICAgICAgbWVtY3B5KCZyZXN1bHQsICZkYXRhLT5kYXRhKClbb2Zmc2V0XSwg
Mik7CkBAIC02Miw3ICs1Miw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgICAgIHJl
dHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICBzdGF0aWMgaW5saW5lIHVpbnQzMl90
IHJlYWRVaW50MzJIZWxwZXIoU2hhcmVkQnVmZmVyKiBkYXRhLCBpbnQgb2Zmc2V0KQorICAgICAg
ICBzdGF0aWMgaW5saW5lIHVpbnQzMl90IHJlYWRVaW50MzIoU2hhcmVkQnVmZmVyKiBkYXRhLCBp
bnQgb2Zmc2V0KQogICAgICAgICB7CiAgICAgICAgICAgICB1aW50MzJfdCByZXN1bHQ7CiAgICAg
ICAgICAgICBtZW1jcHkoJnJlc3VsdCwgJmRhdGEtPmRhdGEoKVtvZmZzZXRdLCA0KTsKQEAgLTcz
LDMzICs2MywyMiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgICAgICByZXR1cm4gcmVz
dWx0OwogICAgICAgICB9CiAKLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGVudW0gQW5kTWFza1N0
YXRlIHsKLSAgICAgICAgICAgIE5vbmUsCi0gICAgICAgICAgICBOb3RZZXREZWNvZGVkLAotICAg
ICAgICAgICAgRGVjb2RpbmcsCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gRG9lcyB0aGUgYWN0
dWFsIGRlY29kaW5nLiAgUmV0dXJucyB3aGV0aGVyIGRlY29kaW5nIHN1Y2NlZWRlZC4KLSAgICAg
ICAgYm9vbCBkZWNvZGVCTVAoU2hhcmVkQnVmZmVyKiBkYXRhKTsKLQotICAgICAgICAvLyBBbiBp
bmRleCBpbnRvIHxtX2RhdGF8IHJlcHJlc2VudGluZyBob3cgbXVjaCB3ZSd2ZSBhbHJlYWR5IGRl
Y29kZWQuCi0gICAgICAgIHNpemVfdCBtX2RlY29kZWRPZmZzZXQ7Ci0KLSAgICAgICAgLy8gVGhl
IGZpbGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBCTVAgaW5mbyBoZWFkZXIgc3RhcnRzLgotICAgICAg
ICBzaXplX3QgbV9oZWFkZXJPZmZzZXQ7Ci0KLSAgICAgICAgLy8gVGhlIGZpbGUgb2Zmc2V0IGF0
IHdoaWNoIHRoZSBhY3R1YWwgaW1hZ2UgYml0cyBzdGFydC4gIFdoZW4gZGVjb2RpbmcKLSAgICAg
ICAgLy8gSUNPIGZpbGVzLCB0aGlzIGlzIHNldCB0byAwLCBzaW5jZSBpdCdzIG5vdCBzdG9yZWQg
YW55d2hlcmUgaW4gYQotICAgICAgICAvLyBoZWFkZXI7IHRoZSByZWFkZXIgZnVuY3Rpb25zIGV4
cGVjdCB0aGUgaW1hZ2UgZGF0YSB0byBzdGFydAotICAgICAgICAvLyBpbW1lZGlhdGVseSBhZnRl
ciB0aGUgaGVhZGVyIGFuZCAoaWYgbmVjZXNzYXJ5KSBjb2xvciB0YWJsZS4KLSAgICAgICAgc2l6
ZV90IG1faW1nRGF0YU9mZnNldDsKLQotICAgICAgICAvLyBJQ09zIHN0b3JlIGEgMWJwcCAibWFz
ayIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG1haW4gYml0bWFwIGltYWdlIGRhdGEKLSAgICAgICAg
Ly8gKGFuZCwgY29uZnVzaW5nbHksIGFkZCBpdHMgaGVpZ2h0IHRvIHRoZSBiaUhlaWdodCB2YWx1
ZSBpbiB0aGUgaW5mbwotICAgICAgICAvLyBoZWFkZXIsIHRodXMgZG91YmxpbmcgaXQpLiAgVGhp
cyB2YXJpYWJsZSB0cmFja3Mgd2hldGhlciB3ZSBoYXZlIHN1Y2gKLSAgICAgICAgLy8gYSBtYXNr
IGFuZCBpZiB3ZSd2ZSBzdGFydGVkIGRlY29kaW5nIGl0IHlldC4KLSAgICAgICAgQW5kTWFza1N0
YXRlIG1fYW5kTWFza1N0YXRlOworICAgICAgICAvLyB8cGFyZW50fCBpcyB0aGUgZGVjb2RlciB0
aGF0IG93bnMgdXMuCisgICAgICAgIC8vIHxzdGFydE9mZnNldHwgcG9pbnRzIHRvIHRoZSBzdGFy
dCBvZiB0aGUgQk1QIHdpdGhpbiB0aGUgZmlsZS4KKyAgICAgICAgLy8gfGJ1ZmZlcnwgcG9pbnRz
IGF0IGFuIGVtcHR5IFJHQkEzMkJ1ZmZlciB0aGF0IHdlJ2xsIGluaXRpYWxpemUgYW5kCisgICAg
ICAgIC8vIGZpbGwgd2l0aCBkZWNvZGVkIGRhdGEuCisgICAgICAgIEJNUEltYWdlUmVhZGVyKElt
YWdlRGVjb2RlciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGVjb2Rl
ZEFuZEhlYWRlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGltZ0RhdGFP
ZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlc0FuZE1hc2spOworCisgICAg
ICAgIHZvaWQgc2V0QnVmZmVyKFJHQkEzMkJ1ZmZlciogYnVmZmVyKSB7IG1fYnVmZmVyID0gYnVm
ZmVyOyB9CisgICAgICAgIHZvaWQgc2V0RGF0YShTaGFyZWRCdWZmZXIqIGRhdGEpIHsgbV9kYXRh
ID0gZGF0YTsgfQorCisgICAgICAgIC8vIERvZXMgdGhlIGFjdHVhbCBkZWNvZGluZy4gIElmIHxv
bmx5U2l6ZXwgaXMgdHJ1ZSwgZGVjb2Rpbmcgb25seQorICAgICAgICAvLyBwcm9ncmVzc2VzIGFz
IGZhciBhcyBuZWNlc3NhcnkgdG8gZ2V0IHRoZSBpbWFnZSBzaXplLiAgUmV0dXJucworICAgICAg
ICAvLyB3aGV0aGVyIGRlY29kaW5nIHN1Y2NlZWRlZC4KKyAgICAgICAgYm9vbCBkZWNvZGVCTVAo
Ym9vbCBvbmx5U2l6ZSk7CiAKICAgICBwcml2YXRlOgogICAgICAgICAvLyBUaGUgdmFyaW91cyBC
TVAgY29tcHJlc3Npb24gdHlwZXMuICBXZSBkb24ndCBjdXJyZW50bHkgZGVjb2RlIGFsbApAQCAt
MTE3LDYgKzk2LDExIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgICAgIEhVRkZNQU4x
RCwgIC8vIFN0b3JlZCBpbiBmaWxlIGFzIDMKICAgICAgICAgICAgIFJMRTI0LCAgICAgIC8vIFN0
b3JlZCBpbiBmaWxlIGFzIDQKICAgICAgICAgfTsKKyAgICAgICAgZW51bSBBbmRNYXNrU3RhdGUg
eworICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgIE5vdFlldERlY29kZWQsCisgICAgICAg
ICAgICBEZWNvZGluZywKKyAgICAgICAgfTsKIAogICAgICAgICAvLyBUaGVzZSBhcmUgYmFzZWQg
b24gdGhlIFdpbmRvd3MgQklUTUFQSU5GT0hFQURFUiBhbmQgUkdCVFJJUExFCiAgICAgICAgIC8v
IHN0cnVjdHMsIGJ1dCB3aXRoIHVubmVjZXNzYXJ5IGVudHJpZXMgcmVtb3ZlZC4KQEAgLTEzNCwy
NyArMTE4LDI3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgICAgIHVpbnQ4X3Qgcmdi
UmVkOwogICAgICAgICB9OwogCi0gICAgICAgIGlubGluZSB1aW50MTZfdCByZWFkVWludDE2KFNo
YXJlZEJ1ZmZlciogZGF0YSwgaW50IG9mZnNldCkgY29uc3QKKyAgICAgICAgaW5saW5lIHVpbnQx
Nl90IHJlYWRVaW50MTYoaW50IG9mZnNldCkgY29uc3QKICAgICAgICAgewotICAgICAgICAgICAg
cmV0dXJuIHJlYWRVaW50MTZIZWxwZXIoZGF0YSwgbV9kZWNvZGVkT2Zmc2V0ICsgb2Zmc2V0KTsK
KyAgICAgICAgICAgIHJldHVybiByZWFkVWludDE2KG1fZGF0YS5nZXQoKSwgbV9kZWNvZGVkT2Zm
c2V0ICsgb2Zmc2V0KTsKICAgICAgICAgfQogCi0gICAgICAgIGlubGluZSB1aW50MzJfdCByZWFk
VWludDMyKFNoYXJlZEJ1ZmZlciogZGF0YSwgaW50IG9mZnNldCkgY29uc3QKKyAgICAgICAgaW5s
aW5lIHVpbnQzMl90IHJlYWRVaW50MzIoaW50IG9mZnNldCkgY29uc3QKICAgICAgICAgewotICAg
ICAgICAgICAgcmV0dXJuIHJlYWRVaW50MzJIZWxwZXIoZGF0YSwgbV9kZWNvZGVkT2Zmc2V0ICsg
b2Zmc2V0KTsKKyAgICAgICAgICAgIHJldHVybiByZWFkVWludDMyKG1fZGF0YS5nZXQoKSwgbV9k
ZWNvZGVkT2Zmc2V0ICsgb2Zmc2V0KTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIERldGVybWlu
ZXMgdGhlIHNpemUgb2YgdGhlIEJNUCBpbmZvIGhlYWRlci4gIFJldHVybnMgdHJ1ZSBpZiB0aGUg
c2l6ZQogICAgICAgICAvLyBpcyB2YWxpZC4KLSAgICAgICAgYm9vbCBnZXRJbmZvSGVhZGVyU2l6
ZShTaGFyZWRCdWZmZXIqIGRhdGEpOworICAgICAgICBib29sIGdldEluZm9IZWFkZXJTaXplKCk7
CiAKICAgICAgICAgLy8gUHJvY2Vzc2VzIHRoZSBCTVAgaW5mbyBoZWFkZXIuICBSZXR1cm5zIHRy
dWUgaWYgdGhlIGluZm8gaGVhZGVyIGNvdWxkCiAgICAgICAgIC8vIGJlIGRlY29kZWQuCi0gICAg
ICAgIGJvb2wgcHJvY2Vzc0luZm9IZWFkZXIoU2hhcmVkQnVmZmVyKiBkYXRhKTsKKyAgICAgICAg
Ym9vbCBwcm9jZXNzSW5mb0hlYWRlcigpOwogCiAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbiBm
b3IgcHJvY2Vzc0luZm9IZWFkZXIoKSB3aGljaCBkb2VzIHRoZSBhY3R1YWwgcmVhZGluZwogICAg
ICAgICAvLyBvZiBoZWFkZXIgdmFsdWVzIGZyb20gdGhlIGJ5dGUgc3RyZWFtLiAgUmV0dXJucyBm
YWxzZSBvbiBlcnJvci4KLSAgICAgICAgYm9vbCByZWFkSW5mb0hlYWRlcihTaGFyZWRCdWZmZXIq
IGRhdGEpOworICAgICAgICBib29sIHJlYWRJbmZvSGVhZGVyKCk7CiAKICAgICAgICAgLy8gUmV0
dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBXaW5kb3dzIFY0KyBCTVAuCiAgICAgICAgIGlubGluZSBi
b29sIGlzV2luZG93c1Y0UGx1cygpIGNvbnN0CkBAIC0xNjksMTUgKzE1MywxNSBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAgICAgICAgIC8vIEZvciBCSV9CSVRGSUVMRFMgaW1hZ2VzLCBpbml0aWFs
aXplcyB0aGUgbV9iaXRNYXNrc1tdIGFuZAogICAgICAgICAvLyBtX2JpdE9mZnNldHNbXSBhcnJh
eXMuICBwcm9jZXNzSW5mb0hlYWRlcigpIHdpbGwgaW5pdGlhbGl6ZSB0aGVzZSBmb3IKICAgICAg
ICAgLy8gb3RoZXIgY29tcHJlc3Npb24gdHlwZXMgd2hlcmUgbmVlZGVkLgotICAgICAgICBib29s
IHByb2Nlc3NCaXRtYXNrcyhTaGFyZWRCdWZmZXIqIGRhdGEpOworICAgICAgICBib29sIHByb2Nl
c3NCaXRtYXNrcygpOwogCiAgICAgICAgIC8vIEZvciBwYWxldHRlZCBpbWFnZXMsIGFsbG9jYXRl
cyBhbmQgaW5pdGlhbGl6ZXMgdGhlIG1fY29sb3JUYWJsZVtdCiAgICAgICAgIC8vIGFycmF5Lgot
ICAgICAgICBib29sIHByb2Nlc3NDb2xvclRhYmxlKFNoYXJlZEJ1ZmZlciogZGF0YSk7CisgICAg
ICAgIGJvb2wgcHJvY2Vzc0NvbG9yVGFibGUoKTsKIAogICAgICAgICAvLyBQcm9jZXNzZXMgYW4g
UkxFLWVuY29kZWQgaW1hZ2UuICBSZXR1cm5zIHRydWUgaWYgdGhlIGVudGlyZSBpbWFnZSB3YXMK
ICAgICAgICAgLy8gZGVjb2RlZC4KLSAgICAgICAgYm9vbCBwcm9jZXNzUkxFRGF0YShTaGFyZWRC
dWZmZXIqIGRhdGEpOworICAgICAgICBib29sIHByb2Nlc3NSTEVEYXRhKCk7CiAKICAgICAgICAg
Ly8gUHJvY2Vzc2VzIGEgc2V0IG9mIG5vbi1STEUtY29tcHJlc3NlZCBwaXhlbHMuICBUd28gY2Fz
ZXM6CiAgICAgICAgIC8vICAgKiBpblJMRSA9IHRydWU6IHRoZSBkYXRhIGlzIGluc2lkZSBhbiBS
TEUtZW5jb2RlZCBiaXRtYXAuICBUcmllcyB0bwpAQCAtMTg4LDcgKzE3Miw3IEBAIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKICAgICAgICAgLy8gICAgIGJlZ2lubmluZyBvZiB0aGUgbmV4dCByb3cgdG8g
YmUgZGVjb2RlZC4gIFRyaWVzIHRvIHByb2Nlc3MgYXMKICAgICAgICAgLy8gICAgIG1hbnkgY29t
cGxldGUgcm93cyBhcyBwb3NzaWJsZS4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2hvbGUgaW1hZ2UK
ICAgICAgICAgLy8gICAgIHdhcyBkZWNvZGVkLgotICAgICAgICBib29sIHByb2Nlc3NOb25STEVE
YXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwgYm9vbCBpblJMRSwgaW50IG51bVBpeGVscyk7CisgICAg
ICAgIGJvb2wgcHJvY2Vzc05vblJMRURhdGEoYm9vbCBpblJMRSwgaW50IG51bVBpeGVscyk7CiAK
ICAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHktY29vcmRpbmF0ZSBwbHVz
IHxudW1Sb3dzfCB3b3VsZCBiZSBwYXN0CiAgICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGltYWdl
LiAgSGVyZSAicGx1cyIgbWVhbnMgInRvd2FyZCB0aGUgZW5kIG9mIHRoZQpAQCAtMTk2LDcgKzE4
MCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgaW5saW5lIGJvb2wgcGFzdEVuZE9m
SW1hZ2UoaW50IG51bVJvd3MpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBtX2lzVG9w
RG93bgotICAgICAgICAgICAgICAgID8gKChtX2Nvb3JkLnkoKSArIG51bVJvd3MpID49IHNpemUo
KS5oZWlnaHQoKSkKKyAgICAgICAgICAgICAgICA/ICgobV9jb29yZC55KCkgKyBudW1Sb3dzKSA+
PSBtX3BhcmVudC0+c2l6ZSgpLmhlaWdodCgpKQogICAgICAgICAgICAgICAgIDogKChtX2Nvb3Jk
LnkoKSAtIG51bVJvd3MpIDwgMCk7CiAgICAgICAgIH0KIApAQCAtMjA1LDIwICsxODksMTkgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICAvLyByb3cuCiAgICAgICAgIC8vIE5PVEU6IE9u
bHkgYXMgbWFueSBieXRlcyBvZiB0aGUgcmV0dXJuIHZhbHVlIGFzIGFyZSBuZWVkZWQgdG8gaG9s
ZAogICAgICAgICAvLyB0aGUgcGl4ZWwgZGF0YSB3aWxsIGFjdHVhbGx5IGJlIHNldC4KLSAgICAg
ICAgaW5saW5lIHVpbnQzMl90IHJlYWRDdXJyZW50UGl4ZWwoU2hhcmVkQnVmZmVyKiBkYXRhLCBp
bnQgYnl0ZXNQZXJQaXhlbCkgY29uc3QKKyAgICAgICAgaW5saW5lIHVpbnQzMl90IHJlYWRDdXJy
ZW50UGl4ZWwoaW50IGJ5dGVzUGVyUGl4ZWwpIGNvbnN0CiAgICAgICAgIHsKLSAgICAgICAgICAg
IGNvbnN0IGludCBhZGRpdGlvbmFsT2Zmc2V0ID0gbV9jb29yZC54KCkgKiBieXRlc1BlclBpeGVs
OworICAgICAgICAgICAgY29uc3QgaW50IG9mZnNldCA9IG1fY29vcmQueCgpICogYnl0ZXNQZXJQ
aXhlbDsKICAgICAgICAgICAgIHN3aXRjaCAoYnl0ZXNQZXJQaXhlbCkgewogICAgICAgICAgICAg
Y2FzZSAyOgotICAgICAgICAgICAgICAgIHJldHVybiByZWFkVWludDE2KGRhdGEsIGFkZGl0aW9u
YWxPZmZzZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZWFkVWludDE2KG9mZnNldCk7CiAK
ICAgICAgICAgICAgIGNhc2UgMzogewogICAgICAgICAgICAgICAgIC8vIEl0IGRvZXNuJ3QgbWF0
dGVyIHRoYXQgd2UgbmV2ZXIgc2V0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUKICAgICAgICAg
ICAgICAgICAvLyBvZiB0aGUgcmV0dXJuIHZhbHVlIGhlcmUgaW4gbGl0dGxlLWVuZGlhbiBtb2Rl
LCB0aGUgY2FsbGVyCiAgICAgICAgICAgICAgICAgLy8gd29uJ3QgcmVhZCBpdC4KICAgICAgICAg
ICAgICAgICB1aW50MzJfdCBwaXhlbDsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJnBpeGVsLAot
ICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+ZGF0YSgpW21fZGVjb2RlZE9mZnNldCArIGFk
ZGl0aW9uYWxPZmZzZXRdLCAzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnBpeGVsLCAmbV9k
YXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0ICsgb2Zmc2V0XSwgMyk7CiAgICAgICAgICNpZiBQ
TEFURk9STShCSUdfRU5ESUFOKQogICAgICAgICAgICAgICAgIHBpeGVsID0gKChwaXhlbCAmIDB4
ZmYwMCkgPDwgOCkgfCAoKHBpeGVsICYgMHhmZjAwMDApID4+IDgpIHwKICAgICAgICAgICAgICAg
ICAgICAgKChwaXhlbCAmIDB4ZmYwMDAwMDApID4+IDI0KTsKQEAgLTIyNyw3ICsyMTAsNyBAQCBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNhc2UgNDoK
LSAgICAgICAgICAgICAgICByZXR1cm4gcmVhZFVpbnQzMihkYXRhLCBhZGRpdGlvbmFsT2Zmc2V0
KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZFVpbnQzMihvZmZzZXQpOwogCiAgICAgICAg
ICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwpAQCAt
MjY4LDcgKzI1MSw4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB1bnNpZ25lZCBibHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2ln
bmVkIGFscGhhKQogICAgICAgICB7Ci0gICAgICAgICAgICBtX2ZyYW1lQnVmZmVyQ2FjaGUuZmly
c3QoKS5zZXRSR0JBKG1fY29vcmQueCgpLCBtX2Nvb3JkLnkoKSwgcmVkLCBncmVlbiwgYmx1ZSwg
YWxwaGEpOworICAgICAgICAgICAgbV9idWZmZXItPnNldFJHQkEobV9jb29yZC54KCksIG1fY29v
cmQueSgpLCByZWQsIGdyZWVuLCBibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
YWxwaGEpOwogICAgICAgICAgICAgbV9jb29yZC5tb3ZlKDEsIDApOwogICAgICAgICB9CiAKQEAg
LTI5MSw2ICsyNzUsMzIgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICAvLyBkZXBlbmRp
bmcgb24gdGhlIHZhbHVlIG9mIHxtX2lzVG9wRG93bnwuCiAgICAgICAgIHZvaWQgbW92ZUJ1ZmZl
clRvTmV4dFJvdygpOwogCisgICAgICAgIC8vIFNldHMgdGhlICJkZWNvZGUgZmFpbHVyZSIgZmxh
ZyBhbmQgY2xlYXJzIGFueSBsb2NhbCBzdG9yYWdlLiAgRm9yCisgICAgICAgIC8vIGNhbGxlciBj
b252ZW5pZW5jZSAoc2luY2Ugc28gbWFueSBjYWxsZXJzIHdhbnQgdG8gcmV0dXJuIGZhbHNlIGFm
dGVyCisgICAgICAgIC8vIGNhbGxpbmcgdGhpcyksIHJldHVybnMgZmFsc2UgdG8gZW5hYmxlIGVh
c3kgdGFpbGNhbGxpbmcuCisgICAgICAgIGJvb2wgc2V0RmFpbGVkKCk7CisKKyAgICAgICAgLy8g
VGhlIGRlY29kZXIgdGhhdCBvd25zIHVzLgorICAgICAgICBJbWFnZURlY29kZXIqIG1fcGFyZW50
OworCisgICAgICAgIC8vIFRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIHBpeGVsIGRhdGEuCisgICAg
ICAgIFJHQkEzMkJ1ZmZlciogbV9idWZmZXI7CisKKyAgICAgICAgLy8gVGhlIGZpbGUgdG8gZGVj
b2RlLgorICAgICAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBtX2RhdGE7CisKKyAgICAgICAgLy8g
QW4gaW5kZXggaW50byB8bV9kYXRhfCByZXByZXNlbnRpbmcgaG93IG11Y2ggd2UndmUgYWxyZWFk
eSBkZWNvZGVkLgorICAgICAgICBzaXplX3QgbV9kZWNvZGVkT2Zmc2V0OworCisgICAgICAgIC8v
IFRoZSBmaWxlIG9mZnNldCBhdCB3aGljaCB0aGUgQk1QIGluZm8gaGVhZGVyIHN0YXJ0cy4KKyAg
ICAgICAgc2l6ZV90IG1faGVhZGVyT2Zmc2V0OworCisgICAgICAgIC8vIFRoZSBmaWxlIG9mZnNl
dCBhdCB3aGljaCB0aGUgYWN0dWFsIGltYWdlIGJpdHMgc3RhcnQuICBXaGVuIGRlY29kaW5nCisg
ICAgICAgIC8vIElDTyBmaWxlcywgdGhpcyBpcyBzZXQgdG8gMCwgc2luY2UgaXQncyBub3Qgc3Rv
cmVkIGFueXdoZXJlIGluIGEKKyAgICAgICAgLy8gaGVhZGVyOyB0aGUgcmVhZGVyIGZ1bmN0aW9u
cyBleHBlY3QgdGhlIGltYWdlIGRhdGEgdG8gc3RhcnQKKyAgICAgICAgLy8gaW1tZWRpYXRlbHkg
YWZ0ZXIgdGhlIGhlYWRlciBhbmQgKGlmIG5lY2Vzc2FyeSkgY29sb3IgdGFibGUuCisgICAgICAg
IHNpemVfdCBtX2ltZ0RhdGFPZmZzZXQ7CisKICAgICAgICAgLy8gVGhlIEJNUCBpbmZvIGhlYWRl
ci4KICAgICAgICAgQml0bWFwSW5mb0hlYWRlciBtX2luZm9IZWFkZXI7CiAKQEAgLTM0MSw2ICsz
NTEsMTIgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICAvLyB0aGVzZSBhcmUgdXNlZC4K
ICAgICAgICAgYm9vbCBtX3NlZW5Ob25aZXJvQWxwaGFQaXhlbDsKICAgICAgICAgYm9vbCBtX3Nl
ZW5aZXJvQWxwaGFQaXhlbDsKKworICAgICAgICAvLyBJQ09zIHN0b3JlIGEgMWJwcCAibWFzayIg
aW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG1haW4gYml0bWFwIGltYWdlIGRhdGEKKyAgICAgICAgLy8g
KGFuZCwgY29uZnVzaW5nbHksIGFkZCBpdHMgaGVpZ2h0IHRvIHRoZSBiaUhlaWdodCB2YWx1ZSBp
biB0aGUgaW5mbworICAgICAgICAvLyBoZWFkZXIsIHRodXMgZG91YmxpbmcgaXQpLiAgVGhpcyB2
YXJpYWJsZSB0cmFja3Mgd2hldGhlciB3ZSBoYXZlIHN1Y2gKKyAgICAgICAgLy8gYSBtYXNrIGFu
ZCBpZiB3ZSd2ZSBzdGFydGVkIGRlY29kaW5nIGl0IHlldC4KKyAgICAgICAgQW5kTWFza1N0YXRl
IG1fYW5kTWFza1N0YXRlOwogICAgIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvaWNvL0lDT0ltYWdlRGVjb2Rlci5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28vSUNPSW1h
Z2VEZWNvZGVyLmNwcAkocmV2aXNpb24gNDQ4MzYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2ltYWdl
LWRlY29kZXJzL2ljby9JQ09JbWFnZURlY29kZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2
ICszMSw5IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiSUNPSW1hZ2VEZWNvZGVy
LmgiCiAKKyNpbmNsdWRlICJCTVBJbWFnZVJlYWRlci5oIgorI2luY2x1ZGUgIlBOR0ltYWdlRGVj
b2Rlci5oIgorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIC8vIE51bWJlciBvZiBiaXRzIGluIC5J
Q08vLkNVUiB1c2VkIHRvIHN0b3JlIHRoZSBkaXJlY3RvcnkgYW5kIGl0cyBlbnRyaWVzLApAQCAt
NDAsNDQgKzQzLDEwNSBAQCBzdGF0aWMgY29uc3Qgc2l6ZV90IHNpemVPZkRpcmVjdG9yeSA9IDY7
CiBzdGF0aWMgY29uc3Qgc2l6ZV90IHNpemVPZkRpckVudHJ5ID0gMTY7CiAKIElDT0ltYWdlRGVj
b2Rlcjo6SUNPSW1hZ2VEZWNvZGVyKGNvbnN0IEludFNpemUmIHByZWZlcnJlZEljb25TaXplKQot
ICAgIDogQk1QSW1hZ2VSZWFkZXIoKQorICAgIDogSW1hZ2VEZWNvZGVyKCkKKyAgICAsIG1fYWxs
RGF0YVJlY2VpdmVkKGZhbHNlKQorICAgICwgbV9kZWNvZGVkT2Zmc2V0KDApCiAgICAgLCBtX3By
ZWZlcnJlZEljb25TaXplKHByZWZlcnJlZEljb25TaXplKQogICAgICwgbV9pbWFnZVR5cGUoVW5r
bm93bikKIHsKLSAgICBtX2FuZE1hc2tTdGF0ZSA9IE5vdFlldERlY29kZWQ7Cit9CisKK3ZvaWQg
SUNPSW1hZ2VEZWNvZGVyOjpzZXREYXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwgYm9vbCBhbGxEYXRh
UmVjZWl2ZWQpCit7CisgICAgaWYgKGZhaWxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBJ
bWFnZURlY29kZXI6OnNldERhdGEoZGF0YSwgYWxsRGF0YVJlY2VpdmVkKTsKKyAgICBtX2FsbERh
dGFSZWNlaXZlZCA9IGFsbERhdGFSZWNlaXZlZDsKKyAgICBpZiAobV9ibXBSZWFkZXIpCisgICAg
ICAgIG1fYm1wUmVhZGVyLT5zZXREYXRhKGRhdGEpOworICAgIGlmIChtX3BuZ0RlY29kZXIpIHsK
KyAgICAgICAgLy8gQ29weSBvdXQgUE5HIGRhdGEgdG8gYSBzZXBhcmF0ZSB2ZWN0b3IgYW5kIHNl
bmQgdG8gdGhlIFBORyBkZWNvZGVyLgorICAgICAgICAvLyBGSVhNRTogU2F2ZSB0aGlzIGNvcHkg
YnkgbWFraW5nIHRoZSBQTkcgZGVjb2RlciBhYmxlIHRvIHRha2UgYW4KKyAgICAgICAgLy8gb3B0
aW9uYWwgb2Zmc2V0LgorICAgICAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBwbmdEYXRhKAorICAg
ICAgICAgICAgU2hhcmVkQnVmZmVyOjpjcmVhdGUoJm1fZGF0YS0+ZGF0YSgpW21fZGlyRW50cnku
ZHdJbWFnZU9mZnNldF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RhdGEt
PnNpemUoKSAtIG1fZGlyRW50cnkuZHdJbWFnZU9mZnNldCkpOworICAgICAgICBtX3BuZ0RlY29k
ZXItPnNldERhdGEocG5nRGF0YS5nZXQoKSwgbV9hbGxEYXRhUmVjZWl2ZWQpOworICAgIH0KIH0K
IAogYm9vbCBJQ09JbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpCiB7CisgICAgaWYgKCFJ
bWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpICYmICFmYWlsZWQoKSkKKyAgICAgICAgZGVj
b2RlKHRydWUpOworCiAgICAgcmV0dXJuIChtX2ltYWdlVHlwZSA9PSBQTkcpID8KLSAgICAgICAg
bV9wbmdEZWNvZGVyLmlzU2l6ZUF2YWlsYWJsZSgpIDogQk1QSW1hZ2VSZWFkZXI6OmlzU2l6ZUF2
YWlsYWJsZSgpOworICAgICAgICBtX3BuZ0RlY29kZXItPmlzU2l6ZUF2YWlsYWJsZSgpIDogSW1h
Z2VEZWNvZGVyOjppc1NpemVBdmFpbGFibGUoKTsKIH0KIAogSW50U2l6ZSBJQ09JbWFnZURlY29k
ZXI6OnNpemUoKSBjb25zdAogewotICAgIHJldHVybiAobV9pbWFnZVR5cGUgPT0gUE5HKSA/IG1f
cG5nRGVjb2Rlci5zaXplKCkgOiBCTVBJbWFnZVJlYWRlcjo6c2l6ZSgpOworICAgIHJldHVybiAo
bV9pbWFnZVR5cGUgPT0gUE5HKSA/IG1fcG5nRGVjb2Rlci0+c2l6ZSgpIDogSW1hZ2VEZWNvZGVy
OjpzaXplKCk7CiB9CiAKLXZvaWQgSUNPSW1hZ2VEZWNvZGVyOjpkZWNvZGVJbWFnZShTaGFyZWRC
dWZmZXIqIGRhdGEpCitSR0JBMzJCdWZmZXIqIElDT0ltYWdlRGVjb2Rlcjo6ZnJhbWVCdWZmZXJB
dEluZGV4KHNpemVfdCBpbmRleCkKIHsKLSAgICAvLyBSZWFkIGFuZCBwcm9jZXNzIGRpcmVjdG9y
eS4KLSAgICBpZiAoKG1fZGVjb2RlZE9mZnNldCA8IHNpemVPZkRpcmVjdG9yeSkgJiYgIXByb2Nl
c3NEaXJlY3RvcnkoZGF0YSkpCisgICAgaWYgKGluZGV4KQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIGlmIChtX2ltYWdlVHlwZSA9PSBVbmtub3duKQorICAgICAgICBkZWNvZGUodHJ1ZSk7CisK
KyAgICBpZiAobV9pbWFnZVR5cGUgPT0gUE5HKSB7CisgICAgICAgIG1fZnJhbWVCdWZmZXJDYWNo
ZS5jbGVhcigpOworICAgICAgICByZXR1cm4gbV9wbmdEZWNvZGVyLT5mcmFtZUJ1ZmZlckF0SW5k
ZXgoaW5kZXgpOworICAgIH0KKworICAgIGlmIChtX2ZyYW1lQnVmZmVyQ2FjaGUuaXNFbXB0eSgp
KQorICAgICAgICBtX2ZyYW1lQnVmZmVyQ2FjaGUucmVzaXplKDEpOworCisgICAgUkdCQTMyQnVm
ZmVyKiBidWZmZXIgPSAmbV9mcmFtZUJ1ZmZlckNhY2hlLmZpcnN0KCk7CisgICAgaWYgKGJ1ZmZl
ci0+c3RhdHVzKCkgIT0gUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRlICYmIChtX2ltYWdlVHlw
ZSA9PSBCTVApCisgICAgICAgICYmICFmYWlsZWQoKSkKKyAgICAgICAgZGVjb2RlKGZhbHNlKTsK
KyAgICByZXR1cm4gYnVmZmVyOworfQorCit2b2lkIElDT0ltYWdlRGVjb2Rlcjo6ZGVjb2RlKGJv
b2wgb25seVNpemUpCit7CisgICAgaWYgKGZhaWxlZCgpKQogICAgICAgICByZXR1cm47CiAKKyAg
ICAvLyBJZiB3ZSBjb3VsZG4ndCBkZWNvZGUgdGhlIGltYWdlIGJ1dCB3ZSd2ZSByZWNlaXZlZCBh
bGwgdGhlIGRhdGEsIGRlY29kaW5nCisgICAgLy8gaGFzIGZhaWxlZC4KKyAgICBpZiAoIWRlY29k
ZUhlbHBlcihvbmx5U2l6ZSkgJiYgbV9hbGxEYXRhUmVjZWl2ZWQpCisgICAgICAgIHNldEZhaWxl
ZCgpOworfQorCitib29sIElDT0ltYWdlRGVjb2Rlcjo6ZGVjb2RlSGVscGVyKGJvb2wgb25seVNp
emUpCit7CisgICAgLy8gUmVhZCBhbmQgcHJvY2VzcyBkaXJlY3RvcnkuCisgICAgaWYgKChtX2Rl
Y29kZWRPZmZzZXQgPCBzaXplT2ZEaXJlY3RvcnkpICYmICFwcm9jZXNzRGlyZWN0b3J5KCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKwogICAgIC8vIFJlYWQgYW5kIHByb2Nlc3MgZGlyZWN0b3J5
IGVudHJpZXMuCiAgICAgaWYgKChtX2RlY29kZWRPZmZzZXQgPAogICAgICAgICAgICAgKHNpemVP
ZkRpcmVjdG9yeSArIChtX2RpcmVjdG9yeS5pZENvdW50ICogc2l6ZU9mRGlyRW50cnkpKSkKLSAg
ICAgICAgJiYgIXByb2Nlc3NEaXJlY3RvcnlFbnRyaWVzKGRhdGEpKQotICAgICAgICByZXR1cm47
CisgICAgICAgICYmICFwcm9jZXNzRGlyZWN0b3J5RW50cmllcygpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CiAKICAgICAvLyBHZXQgdGhlIGltYWdlIHR5cGUuCi0gICAgaWYgKChtX2ltYWdlVHlw
ZSA9PSBVbmtub3duKSAmJiAhcHJvY2Vzc0ltYWdlVHlwZShkYXRhKSkKLSAgICAgICAgcmV0dXJu
OworICAgIGlmICgobV9pbWFnZVR5cGUgPT0gVW5rbm93bikgJiYgIXByb2Nlc3NJbWFnZVR5cGUo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gQ3JlYXRlIHRoZSBhcHByb3ByaWF0
ZSBpbWFnZSBkZWNvZGVyIGlmIG5lZWQgYmUuCisgICAgaWYgKChtX2ltYWdlVHlwZSA9PSBQTkcp
ID8gIW1fcG5nRGVjb2RlciA6ICFtX2JtcFJlYWRlcikgeworICAgICAgICBpZiAobV9pbWFnZVR5
cGUgPT0gUE5HKQorICAgICAgICAgICAgbV9wbmdEZWNvZGVyLnNldChuZXcgUE5HSW1hZ2VEZWNv
ZGVyKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX2JtcFJlYWRlci5zZXQobmV3IEJN
UEltYWdlUmVhZGVyKHRoaXMsIG1fZGVjb2RlZE9mZnNldCwgMCwgdHJ1ZSkpOwogCi0gICAgLy8g
RGVjb2RlIHNlbGVjdGVkIGVudHJ5LgotICAgIGlmIChtX2ltYWdlVHlwZSA9PSBQTkcpCi0gICAg
ICAgIGRlY29kZVBORyhkYXRhKTsKLSAgICBlbHNlIHsKICAgICAgICAgLy8gTm90ZSB0aGF0IHdl
IGRvbid0IHRyeSB0byBsaW1pdCB0aGUgYnl0ZXMgd2UgZ2l2ZSB0byB0aGUgZGVjb2RlciB0bwog
ICAgICAgICAvLyBqdXN0IHRoZSBzaXplIHNwZWNpZmllZCBpbiB0aGUgaWNvbiBkaXJlY3Rvcnku
ICBJZiB0aGUgc2l6ZSBnaXZlbiBpbgogICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IGlzIGluc3Vm
ZmljaWVudCB0byBkZWNvZGUgdGhlIHdob2xlIGltYWdlLCB0aGUgaW1hZ2UgaXMKQEAgLTg1LDI0
ICsxNDksMjggQEAgdm9pZCBJQ09JbWFnZURlY29kZXI6OmRlY29kZUltYWdlKFNoYXJlZAogICAg
ICAgICAvLyAod2hpY2ggd2UgZG8gaGVyZSkgaXMgdG8gc2ltcGx5IGFnZ3Jlc3NpdmVseSBjb25z
dW1lIGJ5dGVzIHVudGlsIHdlCiAgICAgICAgIC8vIHJ1biBvdXQgb2YgYnl0ZXMsIGZpbmlzaCBk
ZWNvZGluZywgb3IgaGl0IGEgc2VxdWVuY2UgdGhhdCBtYWtlcyB0aGUKICAgICAgICAgLy8gZGVj
b2RlciBmYWlsLgotICAgICAgICBkZWNvZGVCTVAoZGF0YSk7CisgICAgICAgIHNldERhdGEobV9k
YXRhLmdldCgpLCBtX2FsbERhdGFSZWNlaXZlZCk7CiAgICAgfQotfQogCi1SR0JBMzJCdWZmZXIq
IElDT0ltYWdlRGVjb2Rlcjo6ZnJhbWVCdWZmZXJBdEluZGV4KHNpemVfdCBpbmRleCkKLXsKLSAg
ICByZXR1cm4gKG1faW1hZ2VUeXBlID09IFBORykgPyBtX3BuZ0RlY29kZXIuZnJhbWVCdWZmZXJB
dEluZGV4KDApIDoKLSAgICAgICAgQk1QSW1hZ2VSZWFkZXI6OmZyYW1lQnVmZmVyQXRJbmRleCgw
KTsKKyAgICAvLyBGb3IgUE5Hcywgd2UncmUgbm93IGRvbmU7IGZ1cnRoZXIgZGVjb2Rpbmcgd2ls
bCBoYXBwZW4gd2hlbiBjYWxsaW5nCisgICAgLy8gaXNTaXplQXZhaWxhYmxlKCkgb3IgZnJhbWVC
dWZmZXJBdEluZGV4KCkgb24gdGhlIFBORyBkZWNvZGVyLgorICAgIGlmIChtX2ltYWdlVHlwZSA9
PSBQTkcpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFtX2ZyYW1lQnVmZmVyQ2Fj
aGUuaXNFbXB0eSgpKQorICAgICAgICBtX2JtcFJlYWRlci0+c2V0QnVmZmVyKCZtX2ZyYW1lQnVm
ZmVyQ2FjaGUuZmlyc3QoKSk7CisKKyAgICByZXR1cm4gbV9ibXBSZWFkZXItPmRlY29kZUJNUChv
bmx5U2l6ZSk7CiB9CiAKLWJvb2wgSUNPSW1hZ2VEZWNvZGVyOjpwcm9jZXNzRGlyZWN0b3J5KFNo
YXJlZEJ1ZmZlciogZGF0YSkKK2Jvb2wgSUNPSW1hZ2VEZWNvZGVyOjpwcm9jZXNzRGlyZWN0b3J5
KCkKIHsKICAgICAvLyBSZWFkIGRpcmVjdG9yeS4KICAgICBBU1NFUlQoIW1fZGVjb2RlZE9mZnNl
dCk7Ci0gICAgaWYgKGRhdGEtPnNpemUoKSA8IHNpemVPZkRpcmVjdG9yeSkKKyAgICBpZiAobV9k
YXRhLT5zaXplKCkgPCBzaXplT2ZEaXJlY3RvcnkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICBjb25zdCB1aW50MTZfdCBmaWxlVHlwZSA9IHJlYWRVaW50MTYoZGF0YSwgMik7Ci0gICAgbV9k
aXJlY3RvcnkuaWRDb3VudCA9IHJlYWRVaW50MTYoZGF0YSwgNCk7CisgICAgY29uc3QgdWludDE2
X3QgZmlsZVR5cGUgPSByZWFkVWludDE2KDIpOworICAgIG1fZGlyZWN0b3J5LmlkQ291bnQgPSBy
ZWFkVWludDE2KDQpOwogICAgIG1fZGVjb2RlZE9mZnNldCA9IHNpemVPZkRpcmVjdG9yeTsKIAog
ICAgIC8vIFNlZSBpZiB0aGlzIGlzIGFuIGljb24gZmlsZXR5cGUgd2UgdW5kZXJzdGFuZCwgYW5k
IG1ha2Ugc3VyZSB3ZSBoYXZlIGF0CkBAIC0xMTgsMTYgKzE4NiwxNiBAQCBib29sIElDT0ltYWdl
RGVjb2Rlcjo6cHJvY2Vzc0RpcmVjdG9yeShTCiAgICAgcmV0dXJuICFmYWlsZWQoKTsKIH0KIAot
Ym9vbCBJQ09JbWFnZURlY29kZXI6OnByb2Nlc3NEaXJlY3RvcnlFbnRyaWVzKFNoYXJlZEJ1ZmZl
ciogZGF0YSkKK2Jvb2wgSUNPSW1hZ2VEZWNvZGVyOjpwcm9jZXNzRGlyZWN0b3J5RW50cmllcygp
CiB7CiAgICAgLy8gUmVhZCBkaXJlY3RvcnkgZW50cmllcy4KICAgICBBU1NFUlQobV9kZWNvZGVk
T2Zmc2V0ID09IHNpemVPZkRpcmVjdG9yeSk7Ci0gICAgaWYgKChtX2RlY29kZWRPZmZzZXQgPiBk
YXRhLT5zaXplKCkpCi0gICAgICAgIHx8ICgoZGF0YS0+c2l6ZSgpIC0gbV9kZWNvZGVkT2Zmc2V0
KSA8CisgICAgaWYgKChtX2RlY29kZWRPZmZzZXQgPiBtX2RhdGEtPnNpemUoKSkKKyAgICAgICAg
fHwgKChtX2RhdGEtPnNpemUoKSAtIG1fZGVjb2RlZE9mZnNldCkgPAogICAgICAgICAgICAgKG1f
ZGlyZWN0b3J5LmlkQ291bnQgKiBzaXplT2ZEaXJFbnRyeSkpKQogICAgICAgICByZXR1cm4gZmFs
c2U7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2RpcmVjdG9yeS5pZENvdW50OyArK2kpIHsK
LSAgICAgICAgY29uc3QgSWNvbkRpcmVjdG9yeUVudHJ5IGRpckVudHJ5ID0gcmVhZERpcmVjdG9y
eUVudHJ5KGRhdGEpOworICAgICAgICBjb25zdCBJY29uRGlyZWN0b3J5RW50cnkgZGlyRW50cnkg
PSByZWFkRGlyZWN0b3J5RW50cnkoKTsKICAgICAgICAgaWYgKChpID09IDApIHx8IGlzQmV0dGVy
RW50cnkoZGlyRW50cnkpKQogICAgICAgICAgICAgbV9kaXJFbnRyeSA9IGRpckVudHJ5OwogICAg
IH0KQEAgLTE0MywzMCArMjExLDI5IEBAIGJvb2wgSUNPSW1hZ2VEZWNvZGVyOjpwcm9jZXNzRGly
ZWN0b3J5RW4KICAgICB9CiAKICAgICAvLyBSZWFkeSB0byBkZWNvZGUgdGhlIGltYWdlIGF0IHRo
ZSBzcGVjaWZpZWQgb2Zmc2V0LgotICAgIG1fZGVjb2RlZE9mZnNldCA9IG1faGVhZGVyT2Zmc2V0
ID0gbV9kaXJFbnRyeS5kd0ltYWdlT2Zmc2V0OworICAgIG1fZGVjb2RlZE9mZnNldCA9IG1fZGly
RW50cnkuZHdJbWFnZU9mZnNldDsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotSUNPSW1hZ2VEZWNv
ZGVyOjpJY29uRGlyZWN0b3J5RW50cnkgSUNPSW1hZ2VEZWNvZGVyOjpyZWFkRGlyZWN0b3J5RW50
cnkoCi0gICAgU2hhcmVkQnVmZmVyKiBkYXRhKQorSUNPSW1hZ2VEZWNvZGVyOjpJY29uRGlyZWN0
b3J5RW50cnkgSUNPSW1hZ2VEZWNvZGVyOjpyZWFkRGlyZWN0b3J5RW50cnkoKQogewogICAgIC8v
IFJlYWQgaWNvbiBkYXRhLgogICAgIEljb25EaXJlY3RvcnlFbnRyeSBlbnRyeTsKLSAgICBlbnRy
eS5iV2lkdGggPSBzdGF0aWNfY2FzdDx1aW50OF90PihkYXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zm
c2V0XSk7CisgICAgZW50cnkuYldpZHRoID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obV9kYXRhLT5k
YXRhKClbbV9kZWNvZGVkT2Zmc2V0XSk7CiAgICAgaWYgKGVudHJ5LmJXaWR0aCA9PSAwKQogICAg
ICAgICBlbnRyeS5iV2lkdGggPSAyNTY7Ci0gICAgZW50cnkuYkhlaWdodCA9IHN0YXRpY19jYXN0
PHVpbnQ4X3Q+KGRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQgKyAxXSk7CisgICAgZW50cnku
YkhlaWdodCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG1fZGF0YS0+ZGF0YSgpW21fZGVjb2RlZE9m
ZnNldCArIDFdKTsKICAgICBpZiAoZW50cnkuYkhlaWdodCA9PSAwKQogICAgICAgICBlbnRyeS5i
SGVpZ2h0ID0gMjU2OwotICAgIGVudHJ5LndCaXRDb3VudCA9IHJlYWRVaW50MTYoZGF0YSwgNik7
Ci0gICAgZW50cnkuZHdJbWFnZU9mZnNldCA9IHJlYWRVaW50MzIoZGF0YSwgMTIpOworICAgIGVu
dHJ5LndCaXRDb3VudCA9IHJlYWRVaW50MTYoNik7CisgICAgZW50cnkuZHdJbWFnZU9mZnNldCA9
IHJlYWRVaW50MzIoMTIpOwogCiAgICAgLy8gU29tZSBpY29ucyBkb24ndCBoYXZlIGEgYml0IGRl
cHRoLCBvbmx5IGEgY29sb3IgY291bnQuICBDb252ZXJ0IHRoZQogICAgIC8vIGNvbG9yIGNvdW50
IHRvIHRoZSBtaW5pbXVtIG5lY2Vzc2FyeSBiaXQgZGVwdGguICBJdCBkb2Vzbid0IG1hdHRlciBp
ZgogICAgIC8vIHRoaXMgaXNuJ3QgcXVpdGUgd2hhdCB0aGUgYml0bWFwIGluZm8gaGVhZGVyIHNh
eXMgbGF0ZXIsIGFzIHdlIG9ubHkgdXNlCiAgICAgLy8gdGhpcyB2YWx1ZSB0byBkZXRlcm1pbmUg
d2hpY2ggaWNvbiBlbnRyeSBpcyBiZXN0LgogICAgIGlmICghZW50cnkud0JpdENvdW50KSB7Ci0g
ICAgICAgIHVpbnQ4X3QgY29sb3JDb3VudCA9IGRhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQg
KyAyXTsKKyAgICAgICAgdWludDhfdCBjb2xvckNvdW50ID0gbV9kYXRhLT5kYXRhKClbbV9kZWNv
ZGVkT2Zmc2V0ICsgMl07CiAgICAgICAgIGlmIChjb2xvckNvdW50KSB7CiAgICAgICAgICAgICBm
b3IgKC0tY29sb3JDb3VudDsgY29sb3JDb3VudDsgY29sb3JDb3VudCA+Pj0gMSkKICAgICAgICAg
ICAgICAgICArK2VudHJ5LndCaXRDb3VudDsKQEAgLTIwNyw0MiArMjc0LDE3IEBAIGJvb2wgSUNP
SW1hZ2VEZWNvZGVyOjppc0JldHRlckVudHJ5KGNvbnMKICAgICByZXR1cm4gKGVudHJ5LndCaXRD
b3VudCA+IG1fZGlyRW50cnkud0JpdENvdW50KTsKIH0KIAotYm9vbCBJQ09JbWFnZURlY29kZXI6
OnByb2Nlc3NJbWFnZVR5cGUoU2hhcmVkQnVmZmVyKiBkYXRhKQorYm9vbCBJQ09JbWFnZURlY29k
ZXI6OnByb2Nlc3NJbWFnZVR5cGUoKQogewogICAgIC8vIENoZWNrIGlmIHRoaXMgZW50cnkgaXMg
YSBCTVAgb3IgYSBQTkc7IHdlIG5lZWQgNCBieXRlcyB0byBjaGVjayB0aGUgbWFnaWMKICAgICAv
LyBudW1iZXIuCiAgICAgQVNTRVJUKG1fZGVjb2RlZE9mZnNldCA9PSBtX2RpckVudHJ5LmR3SW1h
Z2VPZmZzZXQpOwotICAgIGlmICgobV9kZWNvZGVkT2Zmc2V0ID4gZGF0YS0+c2l6ZSgpKQotICAg
ICAgICB8fCAoKGRhdGEtPnNpemUoKSAtIG1fZGVjb2RlZE9mZnNldCkgPCA0KSkKKyAgICBpZiAo
KG1fZGVjb2RlZE9mZnNldCA+IG1fZGF0YS0+c2l6ZSgpKQorICAgICAgICB8fCAoKG1fZGF0YS0+
c2l6ZSgpIC0gbV9kZWNvZGVkT2Zmc2V0KSA8IDQpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgbV9pbWFnZVR5cGUgPQotICAgICAgICBzdHJuY21wKCZkYXRhLT5kYXRhKClbbV9kZWNvZGVk
T2Zmc2V0XSwgIlx4ODlQTkciLCA0KSA/IEJNUCA6IFBORzsKKyAgICAgICAgc3RybmNtcCgmbV9k
YXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0XSwgIlx4ODlQTkciLCA0KSA/IEJNUCA6IFBORzsK
ICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBJQ09JbWFnZURlY29kZXI6OmRlY29kZVBORyhT
aGFyZWRCdWZmZXIqIGRhdGEpCi17Ci0gICAgLy8gQ29weSBvdXQgUE5HIGRhdGEgdG8gYSBzZXBh
cmF0ZSB2ZWN0b3IgYW5kIGluc3RhbnRpYXRlIFBORyBkZWNvZGVyLgotICAgIC8vIEl0IHdvdWxk
IGJlIG5pY2UgdG8gc2F2ZSB0aGlzIGNvcHksIGlmIEkgY291bGQgZmlndXJlIG91dCBob3cgdG8g
anVzdAotICAgIC8vIG9mZnNldCB0aGUgcGVyY2VpdmVkIHN0YXJ0IG9mIHxkYXRhfCBieSB8bV9k
aXJFbnRyeS5kd0ltYWdlT2Zmc2V0fCB3aGVuCi0gICAgLy8gcGFzc2luZyBpdCB0byBzZXREYXRh
KCkuLi4KLSAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBwbmdEYXRhKAotICAgICAgICBTaGFyZWRC
dWZmZXI6OmNyZWF0ZSgmZGF0YS0+ZGF0YSgpW21fZGlyRW50cnkuZHdJbWFnZU9mZnNldF0sCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNpemUoKSAtIG1fZGlyRW50cnkuZHdJ
bWFnZU9mZnNldCkpOwotICAgIG1fcG5nRGVjb2Rlci5zZXREYXRhKHBuZ0RhdGEuZ2V0KCksIHRy
dWUpOwotCi0gICAgLy8gRGVjb2RlIFBORyBhcyBhIHNpZGUgZWZmZWN0IG9mIGFza2luZyBmb3Ig
dGhlIGZyYW1lLiAgU3RyYW5nZWx5LCBpdCdzCi0gICAgLy8gc2VlbWluZ2x5IHVuc2FmZSB0byBj
YWxsIGRlY29kZSgpIG9yIGlzU2l6ZUF2YWlsYWJsZSgpIGJlZm9yZSBjYWxsaW5nCi0gICAgLy8g
dGhpcywgYXMgdGhpcyBpcyB0aGUgb25seSBmdW5jdGlvbiB0aGF0IGVubGFyZ2VzIHRoZSBmcmFt
ZWJ1ZmZlciB0bwotICAgIC8vIG5vbnplcm8gc2l6ZSwgYW5kIGJlZm9yZSB0aGlzIGhhcHBlbnMg
YW55IGRlY29kZWQgaW1hZ2UgZGF0YSBpcyBzaWxlbnRseQotICAgIC8vIHRocm93biBhd2F5IGFu
ZCBuZXZlciBkZWNvZGVkIGFnYWluICghKS4KLSAgICBtX3BuZ0RlY29kZXIuZnJhbWVCdWZmZXJB
dEluZGV4KDApOwotICAgIG1fZmFpbGVkID0gbV9wbmdEZWNvZGVyLmZhaWxlZCgpOwotCi0gICAg
Ly8gU2FuaXR5LWNoZWNrIHRoYXQgdGhlIHNpemUgaXMgd2hhdCB3ZSBleHBlY3RlZC4KLSAgICBp
ZiAoaXNTaXplQXZhaWxhYmxlKCkgJiYgKChzaXplKCkud2lkdGgoKSAhPSBtX2RpckVudHJ5LmJX
aWR0aCkgfHwKLSAgICAgICAgICAgIChzaXplKCkuaGVpZ2h0KCkgIT0gbV9kaXJFbnRyeS5iSGVp
Z2h0KSkpCi0gICAgICAgIG1fZmFpbGVkID0gdHJ1ZTsKLX0KLQogfQpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVyLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVyLmgJ
KHJldmlzaW9uIDQ0ODM2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28v
SUNPSW1hZ2VEZWNvZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTMyLDIzICszMiwyMiBAQAogI2Rl
ZmluZSBJQ09JbWFnZURlY29kZXJfaAogCiAjaW5jbHVkZSAiQk1QSW1hZ2VSZWFkZXIuaCIKLSNp
bmNsdWRlICJQTkdJbWFnZURlY29kZXIuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCisgICAg
Y2xhc3MgUE5HSW1hZ2VEZWNvZGVyOworCiAgICAgLy8gVGhpcyBjbGFzcyBkZWNvZGVzIHRoZSBJ
Q08gYW5kIENVUiBpbWFnZSBmb3JtYXRzLgotICAgIGNsYXNzIElDT0ltYWdlRGVjb2RlciA6IHB1
YmxpYyBCTVBJbWFnZVJlYWRlciB7CisgICAgY2xhc3MgSUNPSW1hZ2VEZWNvZGVyIDogcHVibGlj
IEltYWdlRGVjb2RlciB7CiAgICAgcHVibGljOgogICAgICAgICAvLyBTZWUgY29tbWVudHMgb24g
fG1fcHJlZmVycmVkSWNvblNpemV8IGJlbG93LgogICAgICAgICBJQ09JbWFnZURlY29kZXIoY29u
c3QgSW50U2l6ZSYgcHJlZmVycmVkSWNvblNpemUpOwogCiAgICAgICAgIC8vIEltYWdlRGVjb2Rl
cgogICAgICAgICB2aXJ0dWFsIFN0cmluZyBmaWxlbmFtZUV4dGVuc2lvbigpIGNvbnN0IHsgcmV0
dXJuICJpY28iOyB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXREYXRhKFNoYXJlZEJ1ZmZlciog
ZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpOwogICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTaXpl
QXZhaWxhYmxlKCk7CiAgICAgICAgIHZpcnR1YWwgSW50U2l6ZSBzaXplKCkgY29uc3Q7Ci0KLSAg
ICAgICAgLy8gQk1QSW1hZ2VSZWFkZXIKLSAgICAgICAgdmlydHVhbCB2b2lkIGRlY29kZUltYWdl
KFNoYXJlZEJ1ZmZlciogZGF0YSk7CiAgICAgICAgIHZpcnR1YWwgUkdCQTMyQnVmZmVyKiBmcmFt
ZUJ1ZmZlckF0SW5kZXgoc2l6ZV90IGluZGV4KTsKIAogICAgIHByaXZhdGU6CkBAIC03MCwyOCAr
NjksNDMgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICAgICAgdWludDMyX3QgZHdJbWFn
ZU9mZnNldDsKICAgICAgICAgfTsKIAotICAgICAgICBpbmxpbmUgdWludDE2X3QgcmVhZFVpbnQx
NihTaGFyZWRCdWZmZXIqIGRhdGEsIGludCBvZmZzZXQpIGNvbnN0CisgICAgICAgIGlubGluZSB1
aW50MTZfdCByZWFkVWludDE2KGludCBvZmZzZXQpIGNvbnN0CiAgICAgICAgIHsKLSAgICAgICAg
ICAgIHJldHVybiByZWFkVWludDE2SGVscGVyKGRhdGEsIG1fZGVjb2RlZE9mZnNldCArIG9mZnNl
dCk7CisgICAgICAgICAgICByZXR1cm4gQk1QSW1hZ2VSZWFkZXI6OnJlYWRVaW50MTYobV9kYXRh
LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1f
ZGVjb2RlZE9mZnNldCArIG9mZnNldCk7CiAgICAgICAgIH0KIAotICAgICAgICBpbmxpbmUgdWlu
dDMyX3QgcmVhZFVpbnQzMihTaGFyZWRCdWZmZXIqIGRhdGEsIGludCBvZmZzZXQpIGNvbnN0Cisg
ICAgICAgIGlubGluZSB1aW50MzJfdCByZWFkVWludDMyKGludCBvZmZzZXQpIGNvbnN0CiAgICAg
ICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZWFkVWludDMySGVscGVyKGRhdGEsIG1fZGVjb2Rl
ZE9mZnNldCArIG9mZnNldCk7CisgICAgICAgICAgICByZXR1cm4gQk1QSW1hZ2VSZWFkZXI6OnJl
YWRVaW50MzIobV9kYXRhLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1fZGVjb2RlZE9mZnNldCArIG9mZnNldCk7CiAgICAgICAgIH0KIAorICAg
ICAgICAvLyBEZWNvZGVzIHRoZSBpbWFnZS4gIElmIHxvbmx5U2l6ZXwgaXMgdHJ1ZSwgc3RvcHMg
ZGVjb2RpbmcgYWZ0ZXIKKyAgICAgICAgLy8gY2FsY3VsYXRpbmcgdGhlIGltYWdlIHNpemUuCisg
ICAgICAgIC8vCisgICAgICAgIC8vIE5PVEU6IElmIHRoZSBkZXNpcmVkIGVudHJ5IGlzIGEgUE5H
LCB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgdHJpZ2dlcgorICAgICAgICAvLyBkZWNvZGluZywgaXQg
bWVyZWx5IGVuc3VyZXMgdGhlIGRlY29kZXIgaXMgY3JlYXRlZCBhbmQgcmVhZHkgdG8KKyAgICAg
ICAgLy8gZGVjb2RlLiAgVGhlIGNhbGxlciB3aWxsIHRoZW4gY2FsbCBhIGZ1bmN0aW9uIG9uIHRo
ZSBQTkdJbWFnZURlY29kZXIKKyAgICAgICAgLy8gdGhhdCBhY3R1YWxseSB0cmlnZ2VycyBkZWNv
ZGluZy4KKyAgICAgICAgdm9pZCBkZWNvZGUoYm9vbCBvbmx5U2l6ZSk7CisKKyAgICAgICAgLy8g
SGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgYWJvdmUgdGhhdCBhY3R1YWxseSBkb2VzIHRoZSBkZWNv
ZGluZy4KKyAgICAgICAgLy8gUmV0dXJucyB3aGV0aGVyIGRlY29kaW5nIHN1Y2NlZWRlZC4KKyAg
ICAgICAgYm9vbCBkZWNvZGVIZWxwZXIoYm9vbCBvbmx5U2l6ZSk7CisKICAgICAgICAgLy8gUHJv
Y2Vzc2VzIHRoZSBJQ09ORElSIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEuICBSZXR1cm5z
IHRydWUgaWYKICAgICAgICAgLy8gdGhlIGRpcmVjdG9yeSBjb3VsZCBiZSBkZWNvZGVkLgotICAg
ICAgICBib29sIHByb2Nlc3NEaXJlY3RvcnkoU2hhcmVkQnVmZmVyKik7CisgICAgICAgIGJvb2wg
cHJvY2Vzc0RpcmVjdG9yeSgpOwogCiAgICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgSUNPTkRJUkVO
VFJZIHJlY29yZHMgYWZ0ZXIgdGhlIGRpcmVjdG9yeS4gIEtlZXBzIHRoZQogICAgICAgICAvLyAi
YmVzdCIgZW50cnkgYXMgdGhlIG9uZSB3ZSdsbCBkZWNvZGUuICBSZXR1cm5zIHRydWUgaWYgdGhl
IGVudHJpZXMKICAgICAgICAgLy8gY291bGQgYmUgZGVjb2RlZC4KLSAgICAgICAgYm9vbCBwcm9j
ZXNzRGlyZWN0b3J5RW50cmllcyhTaGFyZWRCdWZmZXIqKTsKKyAgICAgICAgYm9vbCBwcm9jZXNz
RGlyZWN0b3J5RW50cmllcygpOwogCiAgICAgICAgIC8vIFJlYWRzIGFuZCByZXR1cm5zIGEgZGly
ZWN0b3J5IGVudHJ5IGZyb20gdGhlIGN1cnJlbnQgb2Zmc2V0IGludG8KICAgICAgICAgLy8gfGRh
dGF8LgotICAgICAgICBJY29uRGlyZWN0b3J5RW50cnkgcmVhZERpcmVjdG9yeUVudHJ5KFNoYXJl
ZEJ1ZmZlciopOworICAgICAgICBJY29uRGlyZWN0b3J5RW50cnkgcmVhZERpcmVjdG9yeUVudHJ5
KCk7CiAKICAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHxlbnRyeXwgaXMgYSBwcmVmZXJhYmxl
IGljb24gZW50cnkgdG8gbV9kaXJFbnRyeS4KICAgICAgICAgLy8gTGFyZ2VyIHNpemVzLCBvciBn
cmVhdGVyIGJpdGRlcHRocyBhdCB0aGUgc2FtZSBzaXplLCBhcmUgcHJlZmVyYWJsZS4KQEAgLTk5
LDEyICsxMTMsMTUgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiAgICAgICAgIC8vIERldGVybWlu
ZXMgd2hldGhlciB0aGUgZGVzaXJlZCBlbnRyeSBpcyBhIEJNUCBvciBQTkcuICBSZXR1cm5zIHRy
dWUKICAgICAgICAgLy8gaWYgdGhlIHR5cGUgY291bGQgYmUgZGV0ZXJtaW5lZC4KLSAgICAgICAg
Ym9vbCBwcm9jZXNzSW1hZ2VUeXBlKFNoYXJlZEJ1ZmZlciopOworICAgICAgICBib29sIHByb2Nl
c3NJbWFnZVR5cGUoKTsKIAotICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgaW1hZ2UgdG8gYmUg
ZGVjb2RlZCBpcyBhIFBORyByYXRoZXIgdGhhbiBhIEJNUC4KLSAgICAgICAgLy8gSW5zdGFudGlh
dGVzIGEgUE5HSW1hZ2VEZWNvZGVyLCBkZWNvZGVzIHRoZSBpbWFnZSwgYW5kIGNvcGllcyB0aGUK
LSAgICAgICAgLy8gcmVzdWx0cyBsb2NhbGx5LgotICAgICAgICB2b2lkIGRlY29kZVBORyhTaGFy
ZWRCdWZmZXIqKTsKKyAgICAgICAgLy8gVHJ1ZSBpZiB3ZSd2ZSBzZWVuIGFsbCB0aGUgZGF0YS4K
KyAgICAgICAgYm9vbCBtX2FsbERhdGFSZWNlaXZlZDsKKworICAgICAgICAvLyBBbiBpbmRleCBp
bnRvIHxtX2RhdGF8IHJlcHJlc2VudGluZyBob3cgbXVjaCB3ZSd2ZSBhbHJlYWR5IGRlY29kZWQu
CisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG9ubHkgdHJhY2tzIGRhdGEgX3RoaXNfIGNsYXNz
IGRlY29kZXM7IG9uY2UgdGhlCisgICAgICAgIC8vIEJNUEltYWdlUmVhZGVyIHRha2VzIG92ZXIg
dGhpcyB3aWxsIG5vdCBiZSB1cGRhdGVkIGZ1cnRoZXIuCisgICAgICAgIHNpemVfdCBtX2RlY29k
ZWRPZmZzZXQ7CiAKICAgICAgICAgLy8gVGhlIGVudHJ5IHNpemUgd2Ugc2hvdWxkIHByZWZlci4g
IElmIHRoaXMgaXMgZW1wdHksIHdlIGNob29zZSB0aGUKICAgICAgICAgLy8gbGFyZ2VzdCBhdmFp
bGFibGUgc2l6ZS4gIElmIG5vIGVudHJpZXMgb2YgdGhlIGRlc2lyZWQgc2l6ZSBhcmUKQEAgLTEx
NSw4ICsxMzIsMTEgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBJY29uRGlyZWN0b3J5
IG1fZGlyZWN0b3J5OwogICAgICAgICBJY29uRGlyZWN0b3J5RW50cnkgbV9kaXJFbnRyeTsKIAor
ICAgICAgICAvLyBUaGUgQk1QIHJlYWRlciwgaWYgd2UgbmVlZCB0byB1c2Ugb25lLgorICAgICAg
ICBPd25QdHI8Qk1QSW1hZ2VSZWFkZXI+IG1fYm1wUmVhZGVyOworCiAgICAgICAgIC8vIFRoZSBQ
TkcgZGVjb2RlciwgaWYgd2UgbmVlZCB0byB1c2Ugb25lLgotICAgICAgICBQTkdJbWFnZURlY29k
ZXIgbV9wbmdEZWNvZGVyOworICAgICAgICBPd25QdHI8UE5HSW1hZ2VEZWNvZGVyPiBtX3BuZ0Rl
Y29kZXI7CiAKICAgICAgICAgLy8gV2hhdCBraW5kIG9mIGltYWdlIGRhdGEgaXMgc3RvcmVkIGF0
IHRoZSBlbnRyeSB3ZSdyZSBkZWNvZGluZy4KICAgICAgICAgSW1hZ2VUeXBlIG1faW1hZ2VUeXBl
Owo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33468</attachid>
            <date>2009-07-24 13:40:22 -0700</date>
            <delta_ts>2009-08-03 16:49:09 -0700</delta_ts>
            <desc>part four</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>14017</size>
            <attacher name="Peter Kasting">pkasting</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9DaGFuZ2VM
b2cJKHJldmlzaW9uIDQ2MzcxKQorKysgV2ViQ29yZS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkK
QEAgLTEsMyArMSw0MiBAQAorMjAwOS0wNy0yNCAgUGV0ZXIgS2FzdGluZyAgPHBrYXN0aW5nQGdv
b2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2NDYwCisgICAgICAg
IFBsdW1iaW5nIGFuZCBjbGVhbnVwIGluIGFkdmFuY2Ugb2YgcmV0dXJuaW5nIG11bHRpcGxlIGZy
YW1lcyBmcm9tIHRoZQorICAgICAgICBJQ09JbWFnZURlY29kZXI6CisgICAgICAgICogTWFrZSBJ
bWFnZURlY29kZXI6OmZyYW1lQ291bnQoKSByZXR1cm4gYSBzaXplX3QgbGlrZQorICAgICAgICAg
IEltYWdlU291cmNlOjpmcmFtZUNvdW50KCkgYW5kIEJpdG1hcEltYWdlOjpmcmFtZUNvdW50KCkg
YWxyZWFkeSBkby4KKyAgICAgICAgKiBBZGQgSW1hZ2VEZWNvZGVyOjpmcmFtZVNpemVBdEluZGV4
KCkgYWxvbmdzaWRlIHNpemUoKSwgdG8gcmVwb3J0IHRoZQorICAgICAgICAgIHNpemUgb2YgYSBw
YXJ0aWN1bGFyIGZyYW1lLiAgSG9vayBhbGwgdGhlCisgICAgICAgICAgSW1hZ2VTb3VyY2U6OmZy
YW1lU2l6ZUF0SW5kZXgoKSBpbXBsZW1lbnRhdGlvbnMgdG8gdGhpcy4gIE5vCisgICAgICAgICAg
SW1hZ2VEZWNvZGVyIGltcGxlbWVudHMgdGhpcyB5ZXQ7IHRoYXQgd2lsbCBjb21lIGluIG15IG5l
eHQgY2hhbmdlLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vSW1hZ2VTb3Vy
Y2VDYWlyby5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZVNvdXJjZTo6ZnJhbWVTaXplQXRJ
bmRleCk6IEhvb2sgdG8gSW1hZ2VEZWNvZGVyIGZ1bmN0aW9uLgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3F0L0ltYWdlRGVjb2RlclF0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkltYWdl
RGVjb2RlclF0OjpmcmFtZUNvdW50KTogcmV0dXJucyBzaXplX3QuCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvcXQvSW1hZ2VEZWNvZGVyUXQuaDogZnJhbWVDb3VudCgpIHJldHVybnMgc2l6
ZV90LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L0ltYWdlU291cmNlUXQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6SW1hZ2VTb3VyY2U6OmZyYW1lU2l6ZUF0SW5kZXgpOiBIb29rIHRv
IEltYWdlRGVjb2RlciBmdW5jdGlvbi4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lh
L0ltYWdlU291cmNlU2tpYS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZVNvdXJjZTo6ZnJh
bWVTaXplQXRJbmRleCk6IEhvb2sgdG8gSW1hZ2VEZWNvZGVyIGZ1bmN0aW9uLgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNHV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUpOiBmcmFtZUNvdW50KCkg
cmV0dXJucyBzaXplX3QuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ2Fp
cm9XaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNo
aW5nU291cmNlU2l6ZSk6IGZyYW1lQ291bnQoKSByZXR1cm5zIHNpemVfdC4KKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy93eC9JbWFnZVNvdXJjZVd4LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkltYWdlU291cmNlOjpmcmFtZVNpemVBdEluZGV4KTogSG9vayB0byBJbWFnZURlY29kZXIgZnVu
Y3Rpb24uCisgICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvSW1hZ2VEZWNvZGVyLmg6
CisgICAgICAgIChXZWJDb3JlOjpJbWFnZURlY29kZXI6OnNpemUpOiBDbGFyaWZ5IGNvbW1lbnQu
CisgICAgICAgIChXZWJDb3JlOjpJbWFnZURlY29kZXI6OmZyYW1lU2l6ZUF0SW5kZXgpOiBBZGQu
CisgICAgICAgIChXZWJDb3JlOjpJbWFnZURlY29kZXI6OmZyYW1lQ291bnQpOiByZXR1cm5zIHNp
emVfdC4KKyAgICAgICAgKFdlYkNvcmU6OkltYWdlRGVjb2Rlcjo6ZnJhbWVCdWZmZXJBdEluZGV4
KTogUmVtb3ZlIHVubmVlZGVkIHBhcmFtIG5hbWUuCisgICAgICAgICogcGxhdGZvcm0vaW1hZ2Ut
ZGVjb2RlcnMvZ2lmL0dJRkltYWdlRGVjb2Rlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHSUZJ
bWFnZURlY29kZXI6OmZyYW1lQ291bnQpOiByZXR1cm5zIHNpemVfdC4KKyAgICAgICAgKFdlYkNv
cmU6OkdJRkltYWdlRGVjb2Rlcjo6ZnJhbWVCdWZmZXJBdEluZGV4KTogZnJhbWVDb3VudCgpIHJl
dHVybnMgc2l6ZV90LgorICAgICAgICAqIHBsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJ
bWFnZURlY29kZXIuaDogZnJhbWVDb3VudCgpIHJldHVybnMgc2l6ZV90LgorCiAyMDA5LTA3LTI0
ICBEcmV3IFdpbHNvbiAgPGF0d2lsc29uQGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgQWRhbSBCYXJ0aC4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vSW1h
Z2VTb3VyY2VDYWlyby5jcHANCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2NhaXJvL0ltYWdlU291cmNlQ2Fpcm8uY3BwCShyZXZpc2lvbiA0NjA5NCkKKysrIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vSW1hZ2VTb3VyY2VDYWlyby5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTE1Myw5ICsxNTMsMTIgQEAgSW50U2l6ZSBJbWFnZVNvdXJjZTo6c2l6ZSgpIGNv
bnN0CiAgICAgcmV0dXJuIG1fZGVjb2Rlci0+c2l6ZSgpOwogfQogCi1JbnRTaXplIEltYWdlU291
cmNlOjpmcmFtZVNpemVBdEluZGV4KHNpemVfdCkgY29uc3QKK0ludFNpemUgSW1hZ2VTb3VyY2U6
OmZyYW1lU2l6ZUF0SW5kZXgoc2l6ZV90IGluZGV4KSBjb25zdAogewotICAgIHJldHVybiBzaXpl
KCk7CisgICAgaWYgKCFtX2RlY29kZXIpCisgICAgICAgIHJldHVybiBJbnRTaXplKCk7CisKKyAg
ICByZXR1cm4gbV9kZWNvZGVyLT5mcmFtZVNpemVBdEluZGV4KGluZGV4KTsKIH0KIAogaW50IElt
YWdlU291cmNlOjpyZXBldGl0aW9uQ291bnQoKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9xdC9JbWFnZURlY29kZXJRdC5jcHANCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3F0L0ltYWdlRGVjb2RlclF0LmNwcAkocmV2aXNpb24gNDYwOTQpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ltYWdlRGVjb2RlclF0LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMTE4LDcgKzExOCw3IEBAIEltYWdlRGVjb2RlclF0OjpSZWFkQ29udGV4dDo6UmVh
ZFJlc3VsdAogICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBjb25zdHJ1Y3QgYW4gZW1wdHkgaW1h
Z2Ugb2YgdGhlIG1hdGNoaW5nIHNpemUgYW5kIGZvcm1hdAogICAgICAgICAgICAgLy8gZm9yIGVm
ZmljaWVudCByZWFkaW5nCiAgICAgICAgICAgICBRSW1hZ2UgbmV3SW1hZ2UgPSBtX2RhdGFGb3Jt
YXQgIT0gUUltYWdlOjpGb3JtYXRfSW52YWxpZCAgPwotICAgICAgICAgICAgICAgICAgICAgICAg
ICBRSW1hZ2UobV9zaXplLG1fZGF0YUZvcm1hdCkgOiBRSW1hZ2UoKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgUUltYWdlKG1fc2l6ZSwgbV9kYXRhRm9ybWF0KSA6IFFJbWFnZSgpOwogICAg
ICAgICAgICAgbV90YXJnZXQucHVzaF9iYWNrKEltYWdlRGF0YShuZXdJbWFnZSkpOwogICAgICAg
ICB9CiAKQEAgLTE1OCw3ICsxNTgsNyBAQCBJbWFnZURlY29kZXJRdDo6UmVhZENvbnRleHQ6Oklu
Y3JlbWVudGFsCiAgICAgLy8gc2V0IHN0YXRlIHRvIHJlZmxlY3QgY29tcGxldGUgaGVhZGVyLCBl
dGMuCiAgICAgLy8gRm9yIG5vdywgd2UgcmVhZCB0aGUgd2hvbGUgaW1hZ2UuCiAKLSAgICBjb25z
dCBxaW50NjQgc3RhcnRQb3MgPSBtX2J1ZmZlci5wb3MgKCk7CisgICAgY29uc3QgcWludDY0IHN0
YXJ0UG9zID0gbV9idWZmZXIucG9zKCk7CiAgICAgLy8gT29wcywgZmFpbGVkLiBSZXdpbmQuCiAg
ICAgaWYgKCFtX3JlYWRlci5yZWFkKCZpbWFnZURhdGEubV9pbWFnZSkpIHsKICAgICAgICAgbV9i
dWZmZXIuc2VlayhzdGFydFBvcyk7CkBAIC0yMzYsNyArMjM2LDcgQEAgdm9pZCBJbWFnZURlY29k
ZXJRdDo6c2V0RGF0YShjb25zdCBJbmNvbQogICAgIGlmIChkZWJ1Z0ltYWdlRGVjb2RlclF0KQog
ICAgICAgICBxRGVidWcoKSAgPDwgIiByZWFkIHJldHVybnMgIiA8PCByZWFkUmVzdWx0OwogCi0g
ICAgc3dpdGNoICggcmVhZFJlc3VsdCkgICAgeworICAgIHN3aXRjaCAocmVhZFJlc3VsdCkgewog
ICAgIGNhc2UgUmVhZENvbnRleHQ6OlJlYWRGYWlsZWQ6CiAgICAgICAgIG1fZmFpbGVkID0gdHJ1
ZTsKICAgICAgICAgYnJlYWs7CkBAIC0yNjcsNyArMjY3LDcgQEAgYm9vbCBJbWFnZURlY29kZXJR
dDo6aXNTaXplQXZhaWxhYmxlKCkKICAgICByZXR1cm4gSW1hZ2VEZWNvZGVyOjppc1NpemVBdmFp
bGFibGUoKTsKIH0KIAotaW50IEltYWdlRGVjb2RlclF0OjpmcmFtZUNvdW50KCkgY29uc3QKK3Np
emVfdCBJbWFnZURlY29kZXJRdDo6ZnJhbWVDb3VudCgpIGNvbnN0CiB7CiAgICAgaWYgKGRlYnVn
SW1hZ2VEZWNvZGVyUXQpCiAgICAgICAgIHFEZWJ1ZygpIDw8ICIgSW1hZ2VEZWNvZGVyUXQ6OmZy
YW1lQ291bnQoKSByZXR1cm5zIiA8PCBtX2ltYWdlTGlzdC5zaXplKCk7CkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ltYWdlRGVjb2RlclF0LmgNCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ltYWdlRGVjb2RlclF0LmgJKHJldmlzaW9uIDQ2
MDk0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9JbWFnZURlY29kZXJRdC5oCSh3
b3JraW5nIGNvcHkpCkBAIC00Niw3ICs0Niw3IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9p
ZCBzZXREYXRhKGNvbnN0IEluY29taW5nRGF0YSYgZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQp
OwogICAgIHZpcnR1YWwgYm9vbCBpc1NpemVBdmFpbGFibGUoKTsKLSAgICB2aXJ0dWFsIGludCBm
cmFtZUNvdW50KCkgY29uc3Q7CisgICAgdmlydHVhbCBzaXplX3QgZnJhbWVDb3VudCgpIGNvbnN0
OwogICAgIHZpcnR1YWwgaW50IHJlcGV0aXRpb25Db3VudCgpIGNvbnN0OwogICAgIHZpcnR1YWwg
UkdCQTMyQnVmZmVyKiBmcmFtZUJ1ZmZlckF0SW5kZXgoc2l6ZV90IGluZGV4KTsKIApJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9JbWFnZVNvdXJjZVF0LmNwcA0KPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQ0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VTb3VyY2VRdC5jcHAJKHJl
dmlzaW9uIDQ2MDk0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9JbWFnZVNvdXJj
ZVF0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTEsOSArOTEsMTIgQEAgSW50U2l6ZSBJbWFnZVNv
dXJjZTo6c2l6ZSgpIGNvbnN0CiAgICAgcmV0dXJuIG1fZGVjb2Rlci0+c2l6ZSgpOwogfQogCi1J
bnRTaXplIEltYWdlU291cmNlOjpmcmFtZVNpemVBdEluZGV4KHNpemVfdCkgY29uc3QKK0ludFNp
emUgSW1hZ2VTb3VyY2U6OmZyYW1lU2l6ZUF0SW5kZXgoc2l6ZV90IGluZGV4KSBjb25zdAogewot
ICAgIHJldHVybiBzaXplKCk7CisgICAgaWYgKCFtX2RlY29kZXIpCisgICAgICAgIHJldHVybiBJ
bnRTaXplKCk7CisKKyAgICByZXR1cm4gbV9kZWNvZGVyLT5mcmFtZVNpemVBdEluZGV4KGluZGV4
KTsKIH0KIAogaW50IEltYWdlU291cmNlOjpyZXBldGl0aW9uQ291bnQoKQpAQCAtMTI0LDcgKzEy
Nyw3IEBAIGZsb2F0IEltYWdlU291cmNlOjpmcmFtZUR1cmF0aW9uQXRJbmRleCgKIHsKICAgICBp
ZiAoIW1fZGVjb2RlcikKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgCisKICAgICAvLyBNYW55IGFu
bm95aW5nIGFkcyBzcGVjaWZ5IGEgMCBkdXJhdGlvbiB0byBtYWtlIGFuIGltYWdlIGZsYXNoIGFz
IHF1aWNrbHkKICAgICAvLyBhcyBwb3NzaWJsZS4gIFdlIGZvbGxvdyBXaW5JRSdzIGJlaGF2aW9y
IGFuZCB1c2UgYSBkdXJhdGlvbiBvZiAxMDAgbXMKICAgICAvLyBmb3IgYW55IGZyYW1lcyB0aGF0
IHNwZWNpZnkgYSBkdXJhdGlvbiBvZiA8PSA1MCBtcy4gIFNlZQpAQCAtMTM4LDExICsxNDEsMTEg
QEAgYm9vbCBJbWFnZVNvdXJjZTo6ZnJhbWVIYXNBbHBoYUF0SW5kZXgocwogewogICAgIGlmICgh
bV9kZWNvZGVyIHx8ICFtX2RlY29kZXItPnN1cHBvcnRzQWxwaGEoKSkKICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIAotICAgIGNvbnN0IFFQaXhtYXAqIHNvdXJjZSA9IG1fZGVjb2Rlci0+aW1h
Z2VBdEluZGV4KCBpbmRleCk7CisKKyAgICBjb25zdCBRUGl4bWFwKiBzb3VyY2UgPSBtX2RlY29k
ZXItPmltYWdlQXRJbmRleChpbmRleCk7CiAgICAgaWYgKCFzb3VyY2UpCiAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAKKwogICAgIHJldHVybiBzb3VyY2UtPmhhc0FscGhhQ2hhbm5lbCgpOwog
fQogCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VTb3VyY2VTa2lh
LmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQ0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFn
ZVNvdXJjZVNraWEuY3BwCShyZXZpc2lvbiA0NjA5NCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9JbWFnZVNvdXJjZVNraWEuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTAsMTAg
KzE1MCwxMiBAQCBJbnRTaXplIEltYWdlU291cmNlOjpzaXplKCkgY29uc3QKICAgICByZXR1cm4g
bV9kZWNvZGVyLT5zaXplKCk7CiB9CiAKLUludFNpemUgSW1hZ2VTb3VyY2U6OmZyYW1lU2l6ZUF0
SW5kZXgoc2l6ZV90KSBjb25zdAorSW50U2l6ZSBJbWFnZVNvdXJjZTo6ZnJhbWVTaXplQXRJbmRl
eChzaXplX3QgaW5kZXgpIGNvbnN0CiB7Ci0gICAgLy8gVE9ETyhicmV0dHcpIGRvIHdlIG5lZWQg
YW55dGhpbmcgaGVyZT8KLSAgICByZXR1cm4gc2l6ZSgpOworICAgIGlmICghbV9kZWNvZGVyKQor
ICAgICAgICByZXR1cm4gSW50U2l6ZSgpOworCisgICAgcmV0dXJuIG1fZGVjb2Rlci0+ZnJhbWVT
aXplQXRJbmRleChpbmRleCk7CiB9CiAKIGludCBJbWFnZVNvdXJjZTo6cmVwZXRpdGlvbkNvdW50
KCkKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ0dXaW4uY3BwDQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09DQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VDR1dpbi5j
cHAJKHJldmlzaW9uIDQ2MDk0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1h
Z2VDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY1LDggKzY1LDggQEAgYm9vbCBCaXRtYXBJ
bWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTQogCiB2b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJh
bWVNYXRjaGluZ1NvdXJjZVNpemUoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJl
Y3QmIGRzdFJlY3QsIGNvbnN0IEludFNpemUmIHNyY1NpemUsIENvbXBvc2l0ZU9wZXJhdG9yIGNv
bXBvc2l0ZU9wKQogewotICAgIGludCBmcmFtZXMgPSBmcmFtZUNvdW50KCk7Ci0gICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworICAgIHNpemVfdCBmcmFtZXMgPSBmcmFtZUNv
dW50KCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgewogICAgICAg
ICBDR0ltYWdlUmVmIGltYWdlID0gZnJhbWVBdEluZGV4KGkpOwogICAgICAgICBpZiAoQ0dJbWFn
ZUdldEhlaWdodChpbWFnZSkgPT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzcmNTaXplLmhlaWdodCgp
KSAmJiBDR0ltYWdlR2V0V2lkdGgoaW1hZ2UpID09IHN0YXRpY19jYXN0PHNpemVfdD4oc3JjU2l6
ZS53aWR0aCgpKSkgewogICAgICAgICAgICAgc2l6ZV90IGN1cnJlbnRGcmFtZSA9IG1fY3VycmVu
dEZyYW1lOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VDYWlyb1dp
bi5jcHANCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFn
ZUNhaXJvV2luLmNwcAkocmV2aXNpb24gNDYwOTQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9JbWFnZUNhaXJvV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzMsOCArNzMsOCBA
QCBib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNCiAKIHZvaWQgQml0bWFw
SW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZShHcmFwaGljc0NvbnRleHQqIGN0eHQs
IGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50U2l6ZSYgc3JjU2l6ZSwgQ29tcG9z
aXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCiB7Ci0gICAgaW50IGZyYW1lcyA9IGZyYW1lQ291bnQo
KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7CisgICAgc2l6ZV90IGZy
YW1lcyA9IGZyYW1lQ291bnQoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZyYW1lczsg
KytpKSB7CiAgICAgICAgIGNhaXJvX3N1cmZhY2VfdCogaW1hZ2UgPSBmcmFtZUF0SW5kZXgoaSk7
CiAgICAgICAgIGlmIChjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9oZWlnaHQoaW1hZ2UpID09IHN0
YXRpY19jYXN0PHNpemVfdD4oc3JjU2l6ZS5oZWlnaHQoKSkgJiYgY2Fpcm9faW1hZ2Vfc3VyZmFj
ZV9nZXRfd2lkdGgoaW1hZ2UpID09IHN0YXRpY19jYXN0PHNpemVfdD4oc3JjU2l6ZS53aWR0aCgp
KSkgewogICAgICAgICAgICAgc2l6ZV90IGN1cnJlbnRGcmFtZSA9IG1fY3VycmVudEZyYW1lOwpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93eC9JbWFnZVNvdXJjZVd4LmNwcA0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQ0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvSW1hZ2VTb3VyY2VXeC5j
cHAJKHJldmlzaW9uIDQ2MDk0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93eC9JbWFn
ZVNvdXJjZVd4LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTM0LDkgKzEzNCwxMiBAQCBJbnRTaXpl
IEltYWdlU291cmNlOjpzaXplKCkgY29uc3QKICAgICByZXR1cm4gbV9kZWNvZGVyLT5zaXplKCk7
CiB9CiAKLUludFNpemUgSW1hZ2VTb3VyY2U6OmZyYW1lU2l6ZUF0SW5kZXgoc2l6ZV90KSBjb25z
dAorSW50U2l6ZSBJbWFnZVNvdXJjZTo6ZnJhbWVTaXplQXRJbmRleChzaXplX3QgaW5kZXgpIGNv
bnN0CiB7Ci0gICAgcmV0dXJuIHNpemUoKTsKKyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAg
cmV0dXJuIEludFNpemUoKTsKKworICAgIHJldHVybiBtX2RlY29kZXItPmZyYW1lU2l6ZUF0SW5k
ZXgoaW5kZXgpOwogfQogCiBpbnQgSW1hZ2VTb3VyY2U6OnJlcGV0aXRpb25Db3VudCgpCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL0ltYWdlRGVjb2Rlci5oDQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09DQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9JbWFnZURlY29kZXIuaAko
cmV2aXNpb24gNDYwOTQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL0ltYWdl
RGVjb2Rlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMDUsNyArMjA1LDcgQEAgbmFtZXNwYWNlIFdl
YkNvcmUgewogICAgICAgICAgICAgcmV0dXJuICFtX2ZhaWxlZCAmJiBtX3NpemVBdmFpbGFibGU7
IAogICAgICAgICB9CiAKLSAgICAgICAgLy8gUmVxdWVzdHMgdGhlIHNpemUuCisgICAgICAgIC8v
IFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGltYWdlLgogICAgICAgICB2aXJ0dWFsIEludFNpemUg
c2l6ZSgpIGNvbnN0CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIFJlcXVlc3RpbmcgdGhlIHNp
emUgb2YgYW4gaW52YWxpZCBiaXRtYXAgaXMgbWVhbmluZ2xlc3MuCkBAIC0yMTMsNiArMjEzLDE3
IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgICAgIHJldHVybiBtX3NpemU7CiAgICAg
ICAgIH0KIAorICAgICAgICAvLyBSZXR1cm5zIHRoZSBzaXplIG9mIGZyYW1lIHxpbmRleHwuICBU
aGlzIHdpbGwgb25seSBkaWZmZXIgZnJvbSBzaXplKCkKKyAgICAgICAgLy8gZm9yIGZvcm1hdHMg
d2hlcmUgZGlmZmVyZW50IGZyYW1lcyBhcmUgZGlmZmVyZW50IHNpemVzIChuYW1lbHkgSUNPLAor
ICAgICAgICAvLyB3aGVyZSBlYWNoIGZyYW1lIHJlcHJlc2VudHMgYSBkaWZmZXJlbnQgaWNvbiB3
aXRoaW4gdGhlIG1hc3RlciBmaWxlKS4KKyAgICAgICAgLy8gTm90YWJseSwgdGhpcyBkb2VzIG5v
dCByZXR1cm4gZGlmZmVyZW50IHNpemVzIGZvciBkaWZmZXJlbnQgR0lGCisgICAgICAgIC8vIGZy
YW1lcywgc2luY2Ugd2hpbGUgdGhlc2UgbWF5IGJlIHN0b3JlZCBhcyBzbWFsbGVyIHJlY3Rhbmds
ZXMsIGR1cmluZworICAgICAgICAvLyBkZWNvZGluZyB0aGV5IGFyZSBjb21wb3NpdGVkIHRvIGNy
ZWF0ZSBhIGZ1bGwtc2l6ZSBmcmFtZS4KKyAgICAgICAgdmlydHVhbCBJbnRTaXplIGZyYW1lU2l6
ZUF0SW5kZXgoc2l6ZV90KSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2l6
ZSgpOworICAgICAgICB9CisKICAgICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSBpbWFnZSBkZWNvZGVy
cyB0byBzZXQgdGhlaXIgZGVjb2RlZCBzaXplLCB0aGlzIGFsc28gY2hlY2sKICAgICAgICAgLy8g
dGhlIHNpemUgZm9yIHZhbGlkaXR5LiBJdCB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSBzaXplIHdh
cyBzZXQsIG9yIGZhbHNlCiAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLiBPbiBlcnJv
ciwgdGhlIG1fZmFpbGVkIGZsYWcgd2lsbCBiZSBzZXQgYW5kIHRoZQpAQCAtMjMxLDcgKzI0Miw3
IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgLy8gVGhlIHRvdGFsIG51bWJlciBvZiBm
cmFtZXMgZm9yIHRoZSBpbWFnZS4gIENsYXNzZXMgdGhhdCBzdXBwb3J0IG11bHRpcGxlIGZyYW1l
cwogICAgICAgICAvLyB3aWxsIHNjYW4gdGhlIGltYWdlIGRhdGEgZm9yIHRoZSBhbnN3ZXIgaWYg
dGhleSBuZWVkIHRvICh3aXRob3V0IG5lY2Vzc2FyaWx5CiAgICAgICAgIC8vIGRlY29kaW5nIGFs
bCBvZiB0aGUgaW5kaXZpZHVhbCBmcmFtZXMpLgotICAgICAgICB2aXJ0dWFsIGludCBmcmFtZUNv
dW50KCkgeyByZXR1cm4gMTsgfQorICAgICAgICB2aXJ0dWFsIHNpemVfdCBmcmFtZUNvdW50KCkg
eyByZXR1cm4gMTsgfQogCiAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgcmVwZXRpdGlvbnMgdG8g
cGVyZm9ybSBmb3IgYW4gYW5pbWF0aW9uIGxvb3AuCiAgICAgICAgIHZpcnR1YWwgaW50IHJlcGV0
aXRpb25Db3VudCgpIGNvbnN0IHsgcmV0dXJuIGNBbmltYXRpb25Ob25lOyB9CkBAIC0yMzksNyAr
MjUwLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICAvLyBDYWxsZWQgdG8gb2J0YWlu
IHRoZSBSR0JBMzJCdWZmZXIgZnVsbCBvZiBkZWNvZGVkIGRhdGEgZm9yIHJlbmRlcmluZy4gIFRo
ZQogICAgICAgICAvLyBkZWNvZGVyIHBsdWdpbiB3aWxsIGRlY29kZSBhcyBtdWNoIG9mIHRoZSBm
cmFtZSBhcyBpdCBjYW4gYmVmb3JlIGhhbmRpbmcKICAgICAgICAgLy8gYmFjayB0aGUgYnVmZmVy
LgotICAgICAgICB2aXJ0dWFsIFJHQkEzMkJ1ZmZlciogZnJhbWVCdWZmZXJBdEluZGV4KHNpemVf
dCBpbmRleCkgPSAwOworICAgICAgICB2aXJ0dWFsIFJHQkEzMkJ1ZmZlciogZnJhbWVCdWZmZXJB
dEluZGV4KHNpemVfdCkgPSAwOwogCiAgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHRoZSB1bmRl
cmx5aW5nIGltYWdlIGZvcm1hdCBldmVuIHN1cHBvcnRzIGFscGhhIHRyYW5zcGFyZW5jeS4KICAg
ICAgICAgdmlydHVhbCBib29sIHN1cHBvcnRzQWxwaGEoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJbWFnZURlY29k
ZXIuY3BwDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9n
aWYvR0lGSW1hZ2VEZWNvZGVyLmNwcAkocmV2aXNpb24gNDYwOTQpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2ltYWdlLWRlY29kZXJzL2dpZi9HSUZJbWFnZURlY29kZXIuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xMjMsNyArMTIzLDcgQEAgYm9vbCBHSUZJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJs
ZSgpCiAKIC8vIFRoZSB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIGZvciB0aGUgaW1hZ2UuICBXaWxs
IHNjYW4gdGhlIGltYWdlIGRhdGEgZm9yIHRoZSBhbnN3ZXIKIC8vICh3aXRob3V0IG5lY2Vzc2Fy
aWx5IGRlY29kaW5nIGFsbCBvZiB0aGUgaW5kaXZpZHVhbCBmcmFtZXMpLgotaW50IEdJRkltYWdl
RGVjb2Rlcjo6ZnJhbWVDb3VudCgpCitzaXplX3QgR0lGSW1hZ2VEZWNvZGVyOjpmcmFtZUNvdW50
KCkKIHsKICAgICAvLyBJZiB0aGUgZGVjb2RlciBoYWQgYW4gZWFybGllciBlcnJvciwgd2Ugd2ls
bCBqdXN0IHJldHVybiB3aGF0IHdlIGhhZCBkZWNvZGVkCiAgICAgLy8gc28gZmFyLgpAQCAtMTcw
LDcgKzE3MCw3IEBAIGludCBHSUZJbWFnZURlY29kZXI6OnJlcGV0aXRpb25Db3VudCgpIGMKIAog
UkdCQTMyQnVmZmVyKiBHSUZJbWFnZURlY29kZXI6OmZyYW1lQnVmZmVyQXRJbmRleChzaXplX3Qg
aW5kZXgpCiB7Ci0gICAgaWYgKGluZGV4ID49IHN0YXRpY19jYXN0PHNpemVfdD4oZnJhbWVDb3Vu
dCgpKSkKKyAgICBpZiAoaW5kZXggPj0gZnJhbWVDb3VudCgpKQogICAgICAgICByZXR1cm4gMDsK
IAogICAgIFJHQkEzMkJ1ZmZlciYgZnJhbWUgPSBtX2ZyYW1lQnVmZmVyQ2FjaGVbaW5kZXhdOwpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9naWYvR0lGSW1hZ2VEZWNvZGVy
LmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0NCi0tLSBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2dpZi9H
SUZJbWFnZURlY29kZXIuaAkocmV2aXNpb24gNDYwOTQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2lt
YWdlLWRlY29kZXJzL2dpZi9HSUZJbWFnZURlY29kZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNDgs
NyArNDgsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKICAgICAgICAgLy8gVGhlIHRvdGFsIG51
bWJlciBvZiBmcmFtZXMgZm9yIHRoZSBpbWFnZS4gIFdpbGwgc2NhbiB0aGUgaW1hZ2UgZGF0YSBm
b3IgdGhlIGFuc3dlcgogICAgICAgICAvLyAod2l0aG91dCBuZWNlc3NhcmlseSBkZWNvZGluZyBh
bGwgb2YgdGhlIGluZGl2aWR1YWwgZnJhbWVzKS4KLSAgICAgICAgdmlydHVhbCBpbnQgZnJhbWVD
b3VudCgpOworICAgICAgICB2aXJ0dWFsIHNpemVfdCBmcmFtZUNvdW50KCk7CiAKICAgICAgICAg
Ly8gVGhlIG51bWJlciBvZiByZXBldGl0aW9ucyB0byBwZXJmb3JtIGZvciBhbiBhbmltYXRpb24g
bG9vcC4KICAgICAgICAgdmlydHVhbCBpbnQgcmVwZXRpdGlvbkNvdW50KCkgY29uc3Q7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34031</attachid>
            <date>2009-08-03 17:43:23 -0700</date>
            <delta_ts>2009-08-05 11:34:43 -0700</delta_ts>
            <desc>Return multiple frames from ICO decoder</desc>
            <filename>patch3</filename>
            <type>text/plain</type>
            <size>32937</size>
            <attacher name="Peter Kasting">pkasting</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9DaGFuZ2VM
b2cJKHJldmlzaW9uIDQ2NzM4KQorKysgV2ViQ29yZS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkK
QEAgLTEsMyArMSw1MSBAQAorMjAwOS0wOC0wMyAgUGV0ZXIgS2FzdGluZyAgPHBrYXN0aW5nQGdv
b2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2NDYwCisgICAgICAg
IFJldHVybiBtdWx0aXBsZSBpY29uIGVudHJpZXMgZnJvbSB0aGUgSUNPIGRlY29kZXIgYXMgc2Vw
YXJhdGUgZnJhbWVzLAorICAgICAgICBzb3J0ZWQgYnkgZGVjcmVhc2luZyBxdWFsaXR5IChtdWNo
IGxpa2UgdGhlIENHIElDTyBkZWNvZGVyIGRvZXMpLgorCisgICAgICAgIEFzIGEgcmVzdWx0IG9m
IHRoaXMgY2hhbmdlLCB3ZSBjYW4gZWxpbWluYXRlIHRoZSBTa2lhLXNwZWNpZmljIHNldERhdGEo
KQorICAgICAgICBoYWNrIHRoYXQgdGhlIENocm9taXVtIHBvcnQgdXNlZCB0byBzZWxlY3QgdGhl
IGRlc2lyZWQgaWNvbiBzaXplIC0tIG5vdworICAgICAgICBjYWxsZXJzIGNhbiBqdXN0IGVudW1l
cmF0ZSB0aGUgZnJhbWVzIGFuZCBhc2sgZm9yIHRoZSBkYXRhIGZyb20gdGhlIG9uZQorICAgICAg
ICB0aGV5IGxpa2UuCisgICAgICAgIAorICAgICAgICBVbmRlciB0aGUgaG9vZCwgdGhlIElDTyBk
ZWNvZGVyIG5vdyBrZWVwcyB2ZWN0b3JzIGZvciBhIG51bWJlciBvZiB0aGluZ3MKKyAgICAgICAg
KGluY2x1ZGluZyBkaXJlY3RvcnkgZW50cmllcyBhbmQgaW1hZ2UgZGVjb2RlcnMpIHdoZXJlIGl0
IHVzZWQgdG8gaGF2ZQorICAgICAgICBzaW5nbGUgbWVtYmVycy4gIEhvd2V2ZXIsIGNhbGxlcnMg
KHRoYXQgSSBoYXZlIHNlZW4pIHdpbGwgb25seSByZXF1ZXN0CisgICAgICAgIG9uZSBmcmFtZSBm
cm9tIHRoZSBpY29uLCBzbyBwcmFjdGljYWxseSB0aGVyZSBhcmVuJ3QgZ29pbmcgdG8gYmUgbG90
cyBvZgorICAgICAgICBpbnN0YW50aWF0ZWQgaW1hZ2UgZGVjb2RlcnMuCisKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9JbWFnZVNvdXJjZS5oOiBNb3ZlIHxtX2RlY29kZXJ8IGJhY2sgdG8g
cHJpdmF0ZSBub3cgdGhhdCBTa2lhIG5vIGxvbmdlciBuZWVkcyB0byBhY2Nlc3MgaXQuCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vSW1hZ2VTb3VyY2VDYWlyby5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpjcmVhdGVEZWNvZGVyKTogUmVtb3ZlIHNpemUgYXJndW1lbnQgZnJvbSBJ
Q08gZGVjb2RlciBpbnN0YW50aWF0aW9uLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3Nr
aWEvSW1hZ2VTb3VyY2VTa2lhLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZURlY29kZXIp
OiBSZW1vdmUgc2l6ZSBhcmd1bWVudCBmcm9tIElDTyBkZWNvZGVyIGluc3RhbnRpYXRpb24uCisg
ICAgICAgIChXZWJDb3JlOjpJbWFnZVNvdXJjZTo6c2V0RGF0YSk6IFJlbW92ZSBmdW5jdGlvbiB0
byBhc2sgZm9yIGEgcGFydGljdWxhciBpY29uIHNpemUuCisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9JbWFnZVNvdXJjZVNraWEuaDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93eC9JbWFnZVNvdXJjZVd4LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0
ZURlY29kZXIpOiBSZW1vdmUgc2l6ZSBhcmd1bWVudCBmcm9tIElDTyBkZWNvZGVyIGluc3RhbnRp
YXRpb24uCisgICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvaWNvL0lDT0ltYWdlRGVj
b2Rlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJQ09JbWFnZURlY29kZXI6OklDT0ltYWdlRGVj
b2Rlcik6CisgICAgICAgIChXZWJDb3JlOjpJQ09JbWFnZURlY29kZXI6On5JQ09JbWFnZURlY29k
ZXIpOiBEZWxldGUgYWxsIGluc3RhbnRpYXRlZCBwZXItZnJhbWUgZGVjb2RlcnMuCisgICAgICAg
IChXZWJDb3JlOjpJQ09JbWFnZURlY29kZXI6OnNldERhdGEpOiBTZW5kIGRhdGEgdG8gYWxsIGlu
c3RhbnRpYXRlZCBwZXItZnJhbWUgZGVjb2RlcnMuCisgICAgICAgIChXZWJDb3JlOjpJQ09JbWFn
ZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSk6IFVzZSBzaXplIGZyb20gaWNvbiBkaXJlY3Rvcnkg
aW5zdGVhZCBvZiBQTkcgZGVjb2RlciAoaWYgYXBwbGljYWJsZSkgc28gd2UgY2FuIHJlcG9ydCBp
dCB3aXRob3V0IGRlY29kaW5nIHRoZSBQTkcgZnJhbWVzLgorICAgICAgICAoV2ViQ29yZTo6SUNP
SW1hZ2VEZWNvZGVyOjpzaXplKTogUmVwb3J0IGZyYW1lLXNwZWNpZmljIHNpemUgaWYgQk1QIGRl
Y29kZXIgaXMgY2FsbGluZy4gIE90aGVyd2lzZSwgdXNlIHNpemUgZnJvbSBpY29uIGRpcmVjdG9y
eSBpbnN0ZWFkIG9mIFBORyBkZWNvZGVyIChpZiBhcHBsaWNhYmxlKS4KKyAgICAgICAgKFdlYkNv
cmU6OklDT0ltYWdlRGVjb2Rlcjo6ZnJhbWVTaXplQXRJbmRleCk6IEltcGxlbWVudC4KKyAgICAg
ICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6c2V0U2l6ZSk6IFNhbml0eSBjaGVjayB2YWx1
ZSBpZiBCTVAgZGVjb2RlciBpcyBjYWxsaW5nLgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1hZ2VE
ZWNvZGVyOjpmcmFtZUNvdW50KTogSW1wbGVtZW50LgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1h
Z2VEZWNvZGVyOjpmcmFtZUJ1ZmZlckF0SW5kZXgpOiBTYW5pdHkgY2hlY2sgc2l6ZSBmb3IgUE5H
IGZyYW1lcy4KKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6Y29tcGFyZUVudHJp
ZXMpOiBBZGQgdXRpbGl0eSBmdW5jdGlvbiBmb3Igc29ydGluZyBlbnRyaWVzLgorICAgICAgICAo
V2ViQ29yZTo6SUNPSW1hZ2VEZWNvZGVyOjpzZXREYXRhRm9yUE5HRGVjb2RlckF0SW5kZXgpOiBG
YWN0b3Igb3V0IHV0aWxpdHkgZnVuY3Rpb24gZm9yIHBhc3NpbmcgY29ycmVjdCBkYXRhIGJsb2Ig
dG8gYSBQTkcgZGVjb2Rlci4KKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6ZGVj
b2RlV2l0aENoZWNrRm9yRGF0YUVuZGVkKTogU3BsaXQgZGVjb2RlKCkgaW50byB0d28gcGllY2Vz
LgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1hZ2VEZWNvZGVyOjpkZWNvZGVEaXJlY3RvcnkpOiBU
aGUgZmlyc3QgcGFydCBvZiB0aGUgb2xkIGRlY29kZSgpLgorICAgICAgICAoV2ViQ29yZTo6SUNP
SW1hZ2VEZWNvZGVyOjpkZWNvZGVBdEluZGV4KTogVGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBvbGQg
ZGVjb2RlKCksIHNwbGl0IG9mZiBzbyB3ZSBhdm9pZCBkZWNvZGluZyBhbiBlbnRyeSB1bnRpbCBp
dCdzIHJlcXVlc3RlZC4KKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6cHJvY2Vz
c0RpcmVjdG9yeSk6IEFkZCByZXNpemluZyBvZiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgYmFz
ZWQgb24gZGlyZWN0b3J5IGNvbnRlbnRzLgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1hZ2VEZWNv
ZGVyOjpwcm9jZXNzRGlyZWN0b3J5RW50cmllcyk6IFNvcnQgZW50cmllcyBieSBxdWFsaXR5Lgor
ICAgICAgICAoV2ViQ29yZTo6SUNPSW1hZ2VEZWNvZGVyOjppbWFnZVR5cGVBdEluZGV4KTogUmV0
dXJuIHR5cGUgdG8gY2FsbGVyIGluc3RlYWQgb2Ygc2V0dGluZyBhIG1lbWJlci4KKyAgICAgICAg
KiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVyLmg6CisKIDIwMDkt
MDctMjcgIFBldGVyIEthc3RpbmcgIDxwa2FzdGluZ0Bnb29nbGUuY29tPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IEVyaWMgU2VpZGVsLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9J
bWFnZVNvdXJjZS5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9J
bWFnZVNvdXJjZS5oCShyZXZpc2lvbiA0NjczOCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvSW1hZ2VTb3VyY2UuaAkod29ya2luZyBjb3B5KQpAQCAtMTQyLDkgKzE0Miw3IEBAIHB1Ymxp
YzoKICAgICBib29sIGZyYW1lSGFzQWxwaGFBdEluZGV4KHNpemVfdCk7IC8vIFdoZXRoZXIgb3Ig
bm90IHRoZSBmcmFtZSBhY3R1YWxseSB1c2VkIGFueSBhbHBoYS4KICAgICBib29sIGZyYW1lSXND
b21wbGV0ZUF0SW5kZXgoc2l6ZV90KTsgLy8gV2hldGhlciBvciBub3QgdGhlIGZyYW1lIGlzIGNv
bXBsZXRlbHkgZGVjb2RlZC4KIAotICAgIC8vIEZJWE1FOiBUaGlzIGlzIHByb3RlY3RlZCBvbmx5
IHRvIGFsbG93IEltYWdlU291cmNlU2tpYSB0byBzZXQgSUNPIGRlY29kZXIKLSAgICAvLyB3aXRo
IGEgcHJlZmVycmVkIHNpemUuIFNlZSBJbWFnZVNvdXJjZVNraWEuaCBmb3IgZGlzY3Vzc2lvbi4K
LXByb3RlY3RlZDoKK3ByaXZhdGU6CiAgICAgTmF0aXZlSW1hZ2VTb3VyY2VQdHIgbV9kZWNvZGVy
OwogfTsKIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9JbWFnZVNvdXJj
ZUNhaXJvLmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fp
cm8vSW1hZ2VTb3VyY2VDYWlyby5jcHAJKHJldmlzaW9uIDQ2NzM4KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jYWlyby9JbWFnZVNvdXJjZUNhaXJvLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNzUsNyArNzUsNyBAQCBJbWFnZURlY29kZXIqIGNyZWF0ZURlY29kZXIoY29uc3QgVmVjdG9y
CiAgICAgLy8gQ1VScyBiZWdpbiB3aXRoIDItYnl0ZSAwIGZvbGxvd2VkIGJ5IDItYnl0ZSAyLgog
ICAgIGlmICghbWVtY21wKGNvbnRlbnRzLCAiXDAwMFwwMDBcMDAxXDAwMCIsIDQpIHx8CiAgICAg
ICAgICFtZW1jbXAoY29udGVudHMsICJcMDAwXDAwMFwwMDJcMDAwIiwgNCkpCi0gICAgICAgIHJl
dHVybiBuZXcgSUNPSW1hZ2VEZWNvZGVyKEludFNpemUoKSk7CisgICAgICAgIHJldHVybiBuZXcg
SUNPSW1hZ2VEZWNvZGVyKCk7CiAKICAgICAvLyBYQk1zIHJlcXVpcmUgOCBieXRlcyBvZiBpbmZv
LgogICAgIGlmIChsZW5ndGggPj0gOCAmJiBzdHJuY21wKGNvbnRlbnRzLCAiI2RlZmluZSAiLCA4
KSA9PSAwKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU291cmNl
U2tpYS5jcHANCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEv
SW1hZ2VTb3VyY2VTa2lhLmNwcAkocmV2aXNpb24gNDY3MzgpCisrKyBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3NraWEvSW1hZ2VTb3VyY2VTa2lhLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAs
NyArMzAsNyBAQAogCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJJbWFnZVNvdXJj
ZVNraWEuaCIKKyNpbmNsdWRlICJJbWFnZVNvdXJjZS5oIgogI2luY2x1ZGUgIlNoYXJlZEJ1ZmZl
ci5oIgogCiAjaW5jbHVkZSAiR0lGSW1hZ2VEZWNvZGVyLmgiCkBAIC00NCw3ICs0NCw3IEBACiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotSW1hZ2VEZWNvZGVyKiBjcmVhdGVEZWNvZGVyKGNvbnN0
IFZlY3RvcjxjaGFyPiYgZGF0YSwgY29uc3QgSW50U2l6ZSYgcHJlZmVycmVkSWNvblNpemUpCitJ
bWFnZURlY29kZXIqIGNyZWF0ZURlY29kZXIoY29uc3QgVmVjdG9yPGNoYXI+JiBkYXRhKQogewog
ICAgIC8vIFdlIG5lZWQgYXQgbGVhc3QgNCBieXRlcyB0byBmaWd1cmUgb3V0IHdoYXQga2luZCBv
ZiBpbWFnZSB3ZSdyZSBkZWFsaW5nIHdpdGguCiAgICAgaW50IGxlbmd0aCA9IGRhdGEuc2l6ZSgp
OwpAQCAtNzksNyArNzksNyBAQCBJbWFnZURlY29kZXIqIGNyZWF0ZURlY29kZXIoY29uc3QgVmVj
dG9yCiAgICAgLy8gQ1VScyBiZWdpbiB3aXRoIDItYnl0ZSAwIGZvbGxvd2VkIGJ5IDItYnl0ZSAy
LgogICAgIGlmICghbWVtY21wKGNvbnRlbnRzLCAiXDAwMFwwMDBcMDAxXDAwMCIsIDQpIHx8CiAg
ICAgICAgICFtZW1jbXAoY29udGVudHMsICJcMDAwXDAwMFwwMDJcMDAwIiwgNCkpCi0gICAgICAg
IHJldHVybiBuZXcgSUNPSW1hZ2VEZWNvZGVyKHByZWZlcnJlZEljb25TaXplKTsKKyAgICAgICAg
cmV0dXJuIG5ldyBJQ09JbWFnZURlY29kZXIoKTsKICAgIAogICAgIC8vIFhCTXMgcmVxdWlyZSA4
IGJ5dGVzIG9mIGluZm8uCiAgICAgaWYgKGxlbmd0aCA+PSA4ICYmIHN0cm5jbXAoY29udGVudHMs
ICIjZGVmaW5lICIsIDgpID09IDApCkBAIC0xMjQsNyArMTI0LDcgQEAgdm9pZCBJbWFnZVNvdXJj
ZTo6c2V0RGF0YShTaGFyZWRCdWZmZXIqIAogICAgIC8vIElmIGluc3VmZmljaWVudCBieXRlcyBh
cmUgYXZhaWxhYmxlIHRvIGRldGVybWluZSB0aGUgaW1hZ2UgdHlwZSwgbm8gZGVjb2RlciBwbHVn
aW4gd2lsbCBiZQogICAgIC8vIG1hZGUuCiAgICAgaWYgKCFtX2RlY29kZXIpCi0gICAgICAgIG1f
ZGVjb2RlciA9IGNyZWF0ZURlY29kZXIoZGF0YS0+YnVmZmVyKCksIEludFNpemUoKSk7CisgICAg
ICAgIG1fZGVjb2RlciA9IGNyZWF0ZURlY29kZXIoZGF0YS0+YnVmZmVyKCkpOwogCiAgICAgLy8g
Q3JlYXRlRGVjb2RlciB3aWxsIHJldHVybiBOVUxMIGlmIHRoZSBkZWNvZGVyIGNvdWxkIG5vdCBi
ZSBjcmVhdGVkLiBQbHVzLAogICAgIC8vIHdlIHNob3VsZCBub3Qgc2VuZCBtb3JlIGRhdGEgdG8g
YSBkZWNvZGVyIHdoaWNoIGhhcyBhbHJlYWR5IGRlY2lkZWQgaXQKQEAgLTIzMCwxNiArMjMwLDYg
QEAgYm9vbCBJbWFnZVNvdXJjZTo6ZnJhbWVIYXNBbHBoYUF0SW5kZXgocwogICAgIHJldHVybiBi
dWZmZXItPmhhc0FscGhhKCk7CiB9CiAKLXZvaWQgSW1hZ2VTb3VyY2VTa2lhOjpzZXREYXRhKFNo
YXJlZEJ1ZmZlciogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxs
RGF0YVJlY2VpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50U2l6
ZSYgcHJlZmVycmVkSWNvblNpemUpCi17Ci0gICAgaWYgKCFtX2RlY29kZXIpCi0gICAgICAgIG1f
ZGVjb2RlciA9IGNyZWF0ZURlY29kZXIoZGF0YS0+YnVmZmVyKCksIHByZWZlcnJlZEljb25TaXpl
KTsKLQotICAgIEltYWdlU291cmNlOjpzZXREYXRhKGRhdGEsIGFsbERhdGFSZWNlaXZlZCk7Ci19
Ci0KIFN0cmluZyBJbWFnZVNvdXJjZTo6ZmlsZW5hbWVFeHRlbnNpb24oKSBjb25zdAogewogICAg
IHJldHVybiBtX2RlY29kZXIgPyBtX2RlY29kZXItPmZpbGVuYW1lRXh0ZW5zaW9uKCkgOiBTdHJp
bmcoKTsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZVNvdXJjZVNr
aWEuaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQ0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFn
ZVNvdXJjZVNraWEuaAkocmV2aXNpb24gNDY3MzgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3NraWEvSW1hZ2VTb3VyY2VTa2lhLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNjAgKzAsMCBA
QAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAK
LSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
LSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jaW5jbHVkZSAiSW1hZ2VTb3VyY2UuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1j
bGFzcyBJbWFnZVNvdXJjZVNraWEgOiBwdWJsaWMgSW1hZ2VTb3VyY2UgewotcHVibGljOgotICAg
IC8vIEZJWE1FOiBUaGlzIGNsYXNzIGlzIGEgaGFjayB0byBzdXBwb3J0IENocm9taXVtJ3MgSUNP
IGRlY29kZXIKLSAgICAvLyBDdXJyZW50bHkgb3VyIElDTyBkZWNvZGVyIGRlY29kZXMgYWxsIGRh
dGEgZHVyaW5nIHNldERhdGEoKSBpbnN0ZWFkIG9mCi0gICAgLy8gYmVpbmcgbGF6eS4gIEluIGFk
ZGl0aW9uLCBpdCBvbmx5IGRlY29kZXMgb25lIGZyYW1lIChjbG9zZXN0IHRvIHRoZSBzaXplCi0g
ICAgLy8gcGFzc2VkIHRvIHRoZSBkZWNvZGVyIGR1cmluZyBjcmVhdGVEZWNvZGVyLCBjYWxsZWQg
ZnJvbSBzZXREYXRhKSBhbmQKLSAgICAvLyBkaXNjYXJkcyBhbGwgb3RoZXIgZGF0YSBpbiB0aGUg
ZmlsZS4KLSAgICAvLwotICAgIC8vIFRvIGZpeCB0aGlzIHdpbGwgcmVxdWlyZSBmaXhpbmcgdGhl
IElDTyBkZWNvZGVyIHRvIGJlIGxhenksIG9yIHRvIGRlY29kZQotICAgIC8vIGFsbCBmcmFtZXMu
ICBBcHBsZSdzIGRlY29kZXJzIChJbWFnZUlPKSBkZWNvZGUgYWxsIGZyYW1lcywgYW5kIHJldHVy
bgotICAgIC8vIHRoZW0gYWxsIHNvcnRlZCBpbiBkZWNyZWFzaW5nIHNpemUuICBXZWJDb3JlIGFs
d2F5cyBkcmF3cyB0aGUgZmlyc3QgZnJhbWUuCi0gICAgLy8KLSAgICAvLyBUaGlzIGlzIGEgc3Bl
Y2lhbC1wdXJwb3NlIHJvdXRpbmUgZm9yIHRoZSBmYXZpY29uIGRlY29kZXIsIHdoaWNoIGlzIHVz
ZWQKLSAgICAvLyB0byBzcGVjaWZ5IGEgcGFydGljdWxhciBpY29uIHNpemUgZm9yIHRoZSBJQ09J
bWFnZURlY29kZXIgdG8gcHJlZmVyCi0gICAgLy8gZGVjb2RpbmcuICBOb3RlIHRoYXQgbm90IGFs
bCBmYXZpY29ucyBhcmUgSUNPcywgc28gdGhpcyB3b24ndAotICAgIC8vIG5lY2Vzc2FyaWx5IGRv
IGFueXRoaW5nIGRpZmZlcmVudGx5IHRoYW4gSW1hZ2VTb3VyY2U6OnNldERhdGEoKS4KLSAgICAv
LwotICAgIC8vIFBhc3NpbmcgYW4gZW1wdHkgSW50U2l6ZSBmb3IgfHByZWZlcnJlZEljb25TaXpl
fCBoZXJlIGlzIGV4YWN0bHkKLSAgICAvLyBlcXVpdmFsZW50IHRvIGp1c3QgY2FsbGluZyBJbWFn
ZVNvdXJjZTo6c2V0RGF0YSgpLiAgU2VlIGFsc28gY29tbWVudHMgaW4KLSAgICAvLyBJQ09JbWFn
ZURlY29kZXIuY3BwLgotICAgIHZvaWQgc2V0RGF0YShTaGFyZWRCdWZmZXIqIGRhdGEsCi0gICAg
ICAgICAgICAgICAgIGJvb2wgYWxsRGF0YVJlY2VpdmVkLAotICAgICAgICAgICAgICAgICBjb25z
dCBJbnRTaXplJiBwcmVmZXJyZWRJY29uU2l6ZSk7Ci19OwotCi19CkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3d4L0ltYWdlU291cmNlV3guY3BwDQo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93eC9JbWFnZVNvdXJjZVd4LmNwcAkocmV2aXNpb24gNDY3
MzgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4L0ltYWdlU291cmNlV3guY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC04MCw3ICs4MCw3IEBAIEltYWdlRGVjb2RlciogY3JlYXRlRGVjb2Rl
cihjb25zdCBTaGFyZWQKICAgICAvLyBDVVJzIGJlZ2luIHdpdGggMi1ieXRlIDAgZm9sbG93ZWQg
YnkgMi1ieXRlIDIuCiAgICAgaWYgKCFtZW1jbXAoY29udGVudHMsICJcMDAwXDAwMFwwMDFcMDAw
IiwgNCkgfHwKICAgICAgICAgIW1lbWNtcChjb250ZW50cywgIlwwMDBcMDAwXDAwMlwwMDAiLCA0
KSkKLSAgICAgICAgcmV0dXJuIG5ldyBJQ09JbWFnZURlY29kZXIoSW50U2l6ZSgpKTsKKyAgICAg
ICAgcmV0dXJuIG5ldyBJQ09JbWFnZURlY29kZXIoKTsKICAgIAogICAgIC8vIFhCTXMgcmVxdWly
ZSA4IGJ5dGVzIG9mIGluZm8uCiAgICAgaWYgKGxlbmd0aCA+PSA4ICYmIHN0cm5jbXAoY29udGVu
dHMsICIjZGVmaW5lICIsIDgpID09IDApCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRl
Y29kZXJzL2ljby9JQ09JbWFnZURlY29kZXIuY3BwDQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVyLmNwcAkocmV2aXNpb24g
NDY3MzgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2ljby9JQ09JbWFnZURl
Y29kZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2ICszMSw4IEBACiAjaW5jbHVkZSAiY29u
ZmlnLmgiCiAjaW5jbHVkZSAiSUNPSW1hZ2VEZWNvZGVyLmgiCiAKKyNpbmNsdWRlIDxhbGdvcml0
aG0+CisKICNpbmNsdWRlICJCTVBJbWFnZVJlYWRlci5oIgogI2luY2x1ZGUgIlBOR0ltYWdlRGVj
b2Rlci5oIgogCkBAIC00MiwxNSArNDQsMTkgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogc3RhdGlj
IGNvbnN0IHNpemVfdCBzaXplT2ZEaXJlY3RvcnkgPSA2Owogc3RhdGljIGNvbnN0IHNpemVfdCBz
aXplT2ZEaXJFbnRyeSA9IDE2OwogCi1JQ09JbWFnZURlY29kZXI6OklDT0ltYWdlRGVjb2Rlcihj
b25zdCBJbnRTaXplJiBwcmVmZXJyZWRJY29uU2l6ZSkKK0lDT0ltYWdlRGVjb2Rlcjo6SUNPSW1h
Z2VEZWNvZGVyKCkKICAgICA6IEltYWdlRGVjb2RlcigpCiAgICAgLCBtX2FsbERhdGFSZWNlaXZl
ZChmYWxzZSkKICAgICAsIG1fZGVjb2RlZE9mZnNldCgwKQotICAgICwgbV9wcmVmZXJyZWRJY29u
U2l6ZShwcmVmZXJyZWRJY29uU2l6ZSkKLSAgICAsIG1faW1hZ2VUeXBlKFVua25vd24pCiB7CiB9
CiAKK0lDT0ltYWdlRGVjb2Rlcjo6fklDT0ltYWdlRGVjb2RlcigpCit7CisgICAgV1RGOjpkZWxl
dGVBbGxWYWx1ZXMobV9CTVBSZWFkZXJzKTsKKyAgICBXVEY6OmRlbGV0ZUFsbFZhbHVlcyhtX1BO
R0RlY29kZXJzKTsKK30KKwogdm9pZCBJQ09JbWFnZURlY29kZXI6OnNldERhdGEoU2hhcmVkQnVm
ZmVyKiBkYXRhLCBib29sIGFsbERhdGFSZWNlaXZlZCkKIHsKICAgICBpZiAoZmFpbGVkKCkpCkBA
IC01OCwxMDkgKzY0LDE3NyBAQCB2b2lkIElDT0ltYWdlRGVjb2Rlcjo6c2V0RGF0YShTaGFyZWRC
dWZmCiAKICAgICBJbWFnZURlY29kZXI6OnNldERhdGEoZGF0YSwgYWxsRGF0YVJlY2VpdmVkKTsK
ICAgICBtX2FsbERhdGFSZWNlaXZlZCA9IGFsbERhdGFSZWNlaXZlZDsKLSAgICBpZiAobV9ibXBS
ZWFkZXIpCi0gICAgICAgIG1fYm1wUmVhZGVyLT5zZXREYXRhKGRhdGEpOwotICAgIGlmIChtX3Bu
Z0RlY29kZXIpIHsKLSAgICAgICAgLy8gQ29weSBvdXQgUE5HIGRhdGEgdG8gYSBzZXBhcmF0ZSB2
ZWN0b3IgYW5kIHNlbmQgdG8gdGhlIFBORyBkZWNvZGVyLgotICAgICAgICAvLyBGSVhNRTogU2F2
ZSB0aGlzIGNvcHkgYnkgbWFraW5nIHRoZSBQTkcgZGVjb2RlciBhYmxlIHRvIHRha2UgYW4KLSAg
ICAgICAgLy8gb3B0aW9uYWwgb2Zmc2V0LgotICAgICAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBw
bmdEYXRhKAotICAgICAgICAgICAgU2hhcmVkQnVmZmVyOjpjcmVhdGUoJm1fZGF0YS0+ZGF0YSgp
W21fZGlyRW50cnkuZHdJbWFnZU9mZnNldF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBtX2RhdGEtPnNpemUoKSAtIG1fZGlyRW50cnkuZHdJbWFnZU9mZnNldCkpOwotICAgICAg
ICBtX3BuZ0RlY29kZXItPnNldERhdGEocG5nRGF0YS5nZXQoKSwgbV9hbGxEYXRhUmVjZWl2ZWQp
OworCisgICAgZm9yIChCTVBSZWFkZXJzOjppdGVyYXRvciBpKG1fQk1QUmVhZGVycy5iZWdpbigp
KTsKKyAgICAgICAgIGkgIT0gbV9CTVBSZWFkZXJzLmVuZCgpOyArK2kpIHsKKyAgICAgICAgaWYg
KCppKQorICAgICAgICAgICAgKCppKS0+c2V0RGF0YShkYXRhKTsKICAgICB9CisgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBtX1BOR0RlY29kZXJzLnNpemUoKTsgKytpKQorICAgICAgICBzZXRE
YXRhRm9yUE5HRGVjb2RlckF0SW5kZXgoaSk7CiB9CiAKIGJvb2wgSUNPSW1hZ2VEZWNvZGVyOjpp
c1NpemVBdmFpbGFibGUoKQogewotICAgIGlmICghSW1hZ2VEZWNvZGVyOjppc1NpemVBdmFpbGFi
bGUoKSAmJiAhZmFpbGVkKCkpCi0gICAgICAgIGRlY29kZVdpdGhDaGVja0ZvckRhdGFFbmRlZCh0
cnVlKTsKKyAgICBpZiAoIUltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCkpCisgICAgICAg
IGRlY29kZVdpdGhDaGVja0ZvckRhdGFFbmRlZCgwLCB0cnVlKTsKIAotICAgIHJldHVybiAobV9p
bWFnZVR5cGUgPT0gUE5HKSA/Ci0gICAgICAgIG1fcG5nRGVjb2Rlci0+aXNTaXplQXZhaWxhYmxl
KCkgOiBJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpOworICAgIHJldHVybiBJbWFnZURl
Y29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpOwogfQogCiBJbnRTaXplIElDT0ltYWdlRGVjb2Rlcjo6
c2l6ZSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIChtX2ltYWdlVHlwZSA9PSBQTkcpID8gbV9wbmdE
ZWNvZGVyLT5zaXplKCkgOiBJbWFnZURlY29kZXI6OnNpemUoKTsKKyAgICByZXR1cm4gbV9mcmFt
ZVNpemUuaXNFbXB0eSgpID8gSW1hZ2VEZWNvZGVyOjpzaXplKCkgOiBtX2ZyYW1lU2l6ZTsKK30K
KworSW50U2l6ZSBJQ09JbWFnZURlY29kZXI6OmZyYW1lU2l6ZUF0SW5kZXgoc2l6ZV90IGluZGV4
KSBjb25zdAoreworICAgIGlmICghaW5kZXggfHwgKGluZGV4ID49IG1fZGlyRW50cmllcy5zaXpl
KCkpKQorICAgICAgICByZXR1cm4gc2l6ZSgpOworCisgICAgY29uc3QgSWNvbkRpcmVjdG9yeUVu
dHJ5IGRpckVudHJ5ID0gbV9kaXJFbnRyaWVzW2luZGV4XTsKKyAgICByZXR1cm4gSW50U2l6ZShk
aXJFbnRyeS5iV2lkdGgsIGRpckVudHJ5LmJIZWlnaHQpOworfQorCitib29sIElDT0ltYWdlRGVj
b2Rlcjo6c2V0U2l6ZSh1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0KQoreworICAgIGlm
IChtX2ZyYW1lU2l6ZS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBJbWFnZURlY29kZXI6OnNl
dFNpemUod2lkdGgsIGhlaWdodCk7CisKKyAgICAvLyBUaGUgc2l6ZSBjYWxjdWxhdGVkIGluc2lk
ZSB0aGUgQk1QSW1hZ2VSZWFkZXIgaGFkIGJldHRlciBtYXRjaCB0aGUgb25lIGluCisgICAgLy8g
dGhlIGljb24gZGlyZWN0b3J5LgorICAgIGlmICgod2lkdGggIT0gbV9mcmFtZVNpemUud2lkdGgo
KSkgfHwgKGhlaWdodCAhPSBtX2ZyYW1lU2l6ZS5oZWlnaHQoKSkpCisgICAgICAgIHNldEZhaWxl
ZCgpOworICAgIHJldHVybiAhZmFpbGVkKCk7Cit9CisKK3NpemVfdCBJQ09JbWFnZURlY29kZXI6
OmZyYW1lQ291bnQoKQoreworICAgIGRlY29kZVdpdGhDaGVja0ZvckRhdGFFbmRlZCgwLCB0cnVl
KTsKKyAgICBpZiAobV9mcmFtZUJ1ZmZlckNhY2hlLmlzRW1wdHkoKSkKKyAgICAgICAgbV9mcmFt
ZUJ1ZmZlckNhY2hlLnJlc2l6ZShtX2RpckVudHJpZXMuc2l6ZSgpKTsKKyAgICAvLyBDQVVUSU9O
OiBXZSBtdXN0IG5vdCByZXNpemUgbV9mcmFtZUJ1ZmZlckNhY2hlIGFnYWluIGFmdGVyIHRoaXMs
IGFzCisgICAgLy8gZGVjb2RlQXRJbmRleCgpIG1heSBnaXZlIGEgQk1QSW1hZ2VSZWFkZXIgYSBw
b2ludGVyIHRvIG9uZSBvZiB0aGUKKyAgICAvLyBlbnRyaWVzLgorICAgIHJldHVybiBtX2ZyYW1l
QnVmZmVyQ2FjaGUuc2l6ZSgpOwogfQogCiBSR0JBMzJCdWZmZXIqIElDT0ltYWdlRGVjb2Rlcjo6
ZnJhbWVCdWZmZXJBdEluZGV4KHNpemVfdCBpbmRleCkKIHsKLSAgICBpZiAoaW5kZXgpCisgICAg
Ly8gRW5zdXJlIHxpbmRleHwgaXMgdmFsaWQuCisgICAgaWYgKGluZGV4ID49IGZyYW1lQ291bnQo
KSkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBpZiAobV9pbWFnZVR5cGUgPT0gVW5rbm93bikK
LSAgICAgICAgZGVjb2RlV2l0aENoZWNrRm9yRGF0YUVuZGVkKHRydWUpOworICAgIC8vIERldGVy
bWluZSB0aGUgaW1hZ2UgdHlwZSwgYW5kIGlmIHRoaXMgaXMgYSBCTVAsIGRlY29kZS4KKyAgICBk
ZWNvZGVXaXRoQ2hlY2tGb3JEYXRhRW5kZWQoaW5kZXgsIGZhbHNlKTsKIAotICAgIGlmIChtX2lt
YWdlVHlwZSA9PSBQTkcpIHsKLSAgICAgICAgbV9mcmFtZUJ1ZmZlckNhY2hlLmNsZWFyKCk7Ci0g
ICAgICAgIHJldHVybiBtX3BuZ0RlY29kZXItPmZyYW1lQnVmZmVyQXRJbmRleChpbmRleCk7Cisg
ICAgLy8gUE5HcyBkZWNvZGUgaW50byB0aGVpciBvd24gZnJhbWVidWZmZXJzLgorICAgIGlmICht
X1BOR0RlY29kZXJzW2luZGV4XSkgeworICAgICAgICAvLyBUaGUgc2l6ZSBjYWxjdWxhdGVkIGlu
c2lkZSB0aGUgUE5HSW1hZ2VEZWNvZGVyIGhhZCBiZXR0ZXIgbWF0Y2ggdGhlCisgICAgICAgIC8v
IG9uZSBpbiB0aGUgaWNvbiBkaXJlY3RvcnkuCisgICAgICAgIGlmIChtX1BOR0RlY29kZXJzW2lu
ZGV4XS0+aXNTaXplQXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IEludFNpemUgcG5n
U2l6ZShtX1BOR0RlY29kZXJzW2luZGV4XS0+c2l6ZSgpKTsKKyAgICAgICAgICAgIGNvbnN0IElj
b25EaXJlY3RvcnlFbnRyeSYgZGlyRW50cnkgPSBtX2RpckVudHJpZXNbaW5kZXhdOworICAgICAg
ICAgICAgaWYgKChwbmdTaXplLndpZHRoKCkgIT0gZGlyRW50cnkuYldpZHRoKQorICAgICAgICAg
ICAgICAgIHx8IChwbmdTaXplLmhlaWdodCgpICE9IGRpckVudHJ5LmJIZWlnaHQpKSB7CisgICAg
ICAgICAgICAgICAgc2V0RmFpbGVkKCk7CisgICAgICAgICAgICAgICAgbV9QTkdEZWNvZGVyc1tp
bmRleF0tPnNldEZhaWxlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
cmV0dXJuIG1fUE5HRGVjb2RlcnNbaW5kZXhdLT5mcmFtZUJ1ZmZlckF0SW5kZXgoMCk7CiAgICAg
fQogCi0gICAgaWYgKG1fZnJhbWVCdWZmZXJDYWNoZS5pc0VtcHR5KCkpCi0gICAgICAgIG1fZnJh
bWVCdWZmZXJDYWNoZS5yZXNpemUoMSk7CisgICAgLy8gVGhpcyBpcyBhIEJNUCBvciBub3QgeWV0
IGtub3duLCBzbyB1c2Ugb3VyIGludGVybmFsIGZyYW1lYnVmZmVyIGNhY2hlLgorICAgIHJldHVy
biAmbV9mcmFtZUJ1ZmZlckNhY2hlW2luZGV4XTsKK30KIAotICAgIFJHQkEzMkJ1ZmZlciogYnVm
ZmVyID0gJm1fZnJhbWVCdWZmZXJDYWNoZS5maXJzdCgpOwotICAgIGlmIChidWZmZXItPnN0YXR1
cygpICE9IFJHQkEzMkJ1ZmZlcjo6RnJhbWVDb21wbGV0ZSAmJiAobV9pbWFnZVR5cGUgPT0gQk1Q
KQotICAgICAgICAmJiAhZmFpbGVkKCkpCi0gICAgICAgIGRlY29kZVdpdGhDaGVja0ZvckRhdGFF
bmRlZChmYWxzZSk7Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKKy8vIHN0YXRpYworYm9vbCBJQ09JbWFn
ZURlY29kZXI6OmNvbXBhcmVFbnRyaWVzKGNvbnN0IEljb25EaXJlY3RvcnlFbnRyeSYgYSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJY29uRGlyZWN0b3J5RW50
cnkmIGIpCit7CisgICAgLy8gTGFyZ2VyIGljb25zIGFyZSBiZXR0ZXIuCisgICAgY29uc3QgaW50
IGFFbnRyeUFyZWEgPSBhLmJXaWR0aCAqIGEuYkhlaWdodDsKKyAgICBjb25zdCBpbnQgYkVudHJ5
QXJlYSA9IGIuYldpZHRoICogYi5iSGVpZ2h0OworICAgIGlmIChhRW50cnlBcmVhICE9IGJFbnRy
eUFyZWEpCisgICAgICAgIHJldHVybiAoYUVudHJ5QXJlYSA+IGJFbnRyeUFyZWEpOworCisgICAg
Ly8gSGlnaGVyIGJpdC1kZXB0aCBpY29ucyBhcmUgYmV0dGVyLgorICAgIHJldHVybiAoYS53Qml0
Q291bnQgPiBiLndCaXRDb3VudCk7CiB9CiAKLXZvaWQgSUNPSW1hZ2VEZWNvZGVyOjpkZWNvZGVX
aXRoQ2hlY2tGb3JEYXRhRW5kZWQoYm9vbCBvbmx5U2l6ZSkKK3ZvaWQgSUNPSW1hZ2VEZWNvZGVy
OjpzZXREYXRhRm9yUE5HRGVjb2RlckF0SW5kZXgoc2l6ZV90IGluZGV4KQoreworICAgIGNvbnN0
IEljb25EaXJlY3RvcnlFbnRyeSYgZGlyRW50cnkgPSBtX2RpckVudHJpZXNbaW5kZXhdOworICAg
IGlmIChtX1BOR0RlY29kZXJzW2luZGV4XSkgeworICAgICAgICAvLyBDb3B5IG91dCBQTkcgZGF0
YSB0byBhIHNlcGFyYXRlIHZlY3RvciBhbmQgc2VuZCB0byB0aGUgUE5HIGRlY29kZXIuCisgICAg
ICAgIC8vIEZJWE1FOiBTYXZlIHRoaXMgY29weSBieSBtYWtpbmcgdGhlIFBORyBkZWNvZGVyIGFi
bGUgdG8gdGFrZSBhbgorICAgICAgICAvLyBvcHRpb25hbCBvZmZzZXQuCisgICAgICAgIFJlZlB0
cjxTaGFyZWRCdWZmZXI+IHBuZ0RhdGEoCisgICAgICAgICAgICBTaGFyZWRCdWZmZXI6OmNyZWF0
ZSgmbV9kYXRhLT5kYXRhKClbZGlyRW50cnkuZHdJbWFnZU9mZnNldF0sCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBtX2RhdGEtPnNpemUoKSAtIGRpckVudHJ5LmR3SW1hZ2VPZmZz
ZXQpKTsKKyAgICAgICAgbV9QTkdEZWNvZGVyc1tpbmRleF0tPnNldERhdGEocG5nRGF0YS5nZXQo
KSwgbV9hbGxEYXRhUmVjZWl2ZWQpOworICAgIH0KK30KKwordm9pZCBJQ09JbWFnZURlY29kZXI6
OmRlY29kZVdpdGhDaGVja0ZvckRhdGFFbmRlZChzaXplX3QgaW5kZXgsIGJvb2wgb25seVNpemUp
CiB7CiAgICAgaWYgKGZhaWxlZCgpKQogICAgICAgICByZXR1cm47CiAKICAgICAvLyBJZiB3ZSBj
b3VsZG4ndCBkZWNvZGUgdGhlIGltYWdlIGJ1dCB3ZSd2ZSByZWNlaXZlZCBhbGwgdGhlIGRhdGEs
IGRlY29kaW5nCiAgICAgLy8gaGFzIGZhaWxlZC4KLSAgICBpZiAoIWRlY29kZShvbmx5U2l6ZSkg
JiYgbV9hbGxEYXRhUmVjZWl2ZWQpCisgICAgaWYgKCghZGVjb2RlRGlyZWN0b3J5KCkgfHwgKCFv
bmx5U2l6ZSAmJiAhZGVjb2RlQXRJbmRleChpbmRleCkpKQorICAgICAgICAmJiBtX2FsbERhdGFS
ZWNlaXZlZCkKICAgICAgICAgc2V0RmFpbGVkKCk7CiB9CiAKLWJvb2wgSUNPSW1hZ2VEZWNvZGVy
OjpkZWNvZGUoYm9vbCBvbmx5U2l6ZSkKK2Jvb2wgSUNPSW1hZ2VEZWNvZGVyOjpkZWNvZGVEaXJl
Y3RvcnkoKQogewogICAgIC8vIFJlYWQgYW5kIHByb2Nlc3MgZGlyZWN0b3J5LgogICAgIGlmICgo
bV9kZWNvZGVkT2Zmc2V0IDwgc2l6ZU9mRGlyZWN0b3J5KSAmJiAhcHJvY2Vzc0RpcmVjdG9yeSgp
KQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAvLyBSZWFkIGFuZCBwcm9jZXNzIGRpcmVj
dG9yeSBlbnRyaWVzLgotICAgIGlmICgobV9kZWNvZGVkT2Zmc2V0IDwKLSAgICAgICAgICAgIChz
aXplT2ZEaXJlY3RvcnkgKyAobV9kaXJlY3RvcnkuaWRDb3VudCAqIHNpemVPZkRpckVudHJ5KSkp
Ci0gICAgICAgICYmICFwcm9jZXNzRGlyZWN0b3J5RW50cmllcygpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICAvLyBHZXQgdGhlIGltYWdlIHR5cGUuCi0gICAgaWYgKChtX2ltYWdlVHlw
ZSA9PSBVbmtub3duKSAmJiAhcHJvY2Vzc0ltYWdlVHlwZSgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgcmV0dXJuIChtX2RlY29kZWRPZmZzZXQgPj0KKyAgICAgICAgICAgIChzaXplT2ZE
aXJlY3RvcnkgKyAobV9kaXJFbnRyaWVzLnNpemUoKSAqIHNpemVPZkRpckVudHJ5KSkpCisgICAg
ICAgIHx8IHByb2Nlc3NEaXJlY3RvcnlFbnRyaWVzKCk7Cit9CisKK2Jvb2wgSUNPSW1hZ2VEZWNv
ZGVyOjpkZWNvZGVBdEluZGV4KHNpemVfdCBpbmRleCkKK3sKKyAgICBBU1NFUlQoaW5kZXggPCBt
X2RpckVudHJpZXMuc2l6ZSgpKTsKKyAgICBjb25zdCBJY29uRGlyZWN0b3J5RW50cnkmIGRpckVu
dHJ5ID0gbV9kaXJFbnRyaWVzW2luZGV4XTsKKyAgICBpZiAoIW1fQk1QUmVhZGVyc1tpbmRleF0g
JiYgIW1fUE5HRGVjb2RlcnNbaW5kZXhdKSB7CisgICAgICAgIC8vIEltYWdlIHR5cGUgdW5rbm93
bi4KKyAgICAgICAgY29uc3QgSW1hZ2VUeXBlIGltYWdlVHlwZSA9IGltYWdlVHlwZUF0SW5kZXgo
aW5kZXgpOworICAgICAgICBpZiAoaW1hZ2VUeXBlID09IEJNUCkgeworICAgICAgICAgICAgLy8g
V2UgbmVlZCB0byBoYXZlIGFscmVhZHkgc2l6ZWQgbV9mcmFtZUJ1ZmZlckNhY2hlIGJlZm9yZSB0
aGlzLCBhbmQKKyAgICAgICAgICAgIC8vIHdlIG11c3Qgbm90IHJlc2l6ZSBpdCBhZ2FpbiBsYXRl
ciAoc2VlIGNhdXRpb24gaW4gZnJhbWVDb3VudCgpKS4KKyAgICAgICAgICAgIEFTU0VSVChtX2Zy
YW1lQnVmZmVyQ2FjaGUuc2l6ZSgpID09IG1fZGlyRW50cmllcy5zaXplKCkpOworICAgICAgICAg
ICAgbV9CTVBSZWFkZXJzW2luZGV4XSA9CisgICAgICAgICAgICAgICAgbmV3IEJNUEltYWdlUmVh
ZGVyKHRoaXMsIGRpckVudHJ5LmR3SW1hZ2VPZmZzZXQsIDAsIHRydWUpOworICAgICAgICAgICAg
bV9CTVBSZWFkZXJzW2luZGV4XS0+c2V0RGF0YShtX2RhdGEuZ2V0KCkpOworICAgICAgICAgICAg
bV9CTVBSZWFkZXJzW2luZGV4XS0+c2V0QnVmZmVyKCZtX2ZyYW1lQnVmZmVyQ2FjaGVbaW5kZXhd
KTsKKyAgICAgICAgfSBlbHNlIGlmIChpbWFnZVR5cGUgPT0gUE5HKSB7CisgICAgICAgICAgICBt
X1BOR0RlY29kZXJzW2luZGV4XSA9IG5ldyBQTkdJbWFnZURlY29kZXIoKTsKKyAgICAgICAgICAg
IHNldERhdGFGb3JQTkdEZWNvZGVyQXRJbmRleChpbmRleCk7CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAvLyBOb3QgZW5vdWdoIGRhdGEgdG8gZGV0ZXJtaW5lIGltYWdlIHR5cGUgeWV0
LgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQogCi0gICAgLy8g
Q3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBpbWFnZSBkZWNvZGVyIGlmIG5lZWQgYmUuCi0gICAgaWYg
KChtX2ltYWdlVHlwZSA9PSBQTkcpID8gIW1fcG5nRGVjb2RlciA6ICFtX2JtcFJlYWRlcikgewot
ICAgICAgICBpZiAobV9pbWFnZVR5cGUgPT0gUE5HKQotICAgICAgICAgICAgbV9wbmdEZWNvZGVy
LnNldChuZXcgUE5HSW1hZ2VEZWNvZGVyKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBt
X2JtcFJlYWRlci5zZXQobmV3IEJNUEltYWdlUmVhZGVyKHRoaXMsIG1fZGVjb2RlZE9mZnNldCwg
MCwgdHJ1ZSkpOwotCi0gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCB0cnkgdG8gbGltaXQg
dGhlIGJ5dGVzIHdlIGdpdmUgdG8gdGhlIGRlY29kZXIgdG8KLSAgICAgICAgLy8ganVzdCB0aGUg
c2l6ZSBzcGVjaWZpZWQgaW4gdGhlIGljb24gZGlyZWN0b3J5LiAgSWYgdGhlIHNpemUgZ2l2ZW4g
aW4KLSAgICAgICAgLy8gdGhlIGRpcmVjdG9yeSBpcyBpbnN1ZmZpY2llbnQgdG8gZGVjb2RlIHRo
ZSB3aG9sZSBpbWFnZSwgdGhlIGltYWdlIGlzCi0gICAgICAgIC8vIGNvcnJ1cHQgYW55d2F5LCBz
byB3aGF0ZXZlciB3ZSBkbyBtYXkgYmUgd3JvbmcuICBUaGUgZWFzaWVzdCBjaG9pY2UKLSAgICAg
ICAgLy8gKHdoaWNoIHdlIGRvIGhlcmUpIGlzIHRvIHNpbXBseSBhZ2dyZXNzaXZlbHkgY29uc3Vt
ZSBieXRlcyB1bnRpbCB3ZQotICAgICAgICAvLyBydW4gb3V0IG9mIGJ5dGVzLCBmaW5pc2ggZGVj
b2RpbmcsIG9yIGhpdCBhIHNlcXVlbmNlIHRoYXQgbWFrZXMgdGhlCi0gICAgICAgIC8vIGRlY29k
ZXIgZmFpbC4KLSAgICAgICAgc2V0RGF0YShtX2RhdGEuZ2V0KCksIG1fYWxsRGF0YVJlY2VpdmVk
KTsKKyAgICBpZiAobV9CTVBSZWFkZXJzW2luZGV4XSkgeworICAgICAgICBtX2ZyYW1lU2l6ZSA9
IEludFNpemUoZGlyRW50cnkuYldpZHRoLCBkaXJFbnRyeS5iSGVpZ2h0KTsKKyAgICAgICAgYm9v
bCByZXN1bHQgPSBtX0JNUFJlYWRlcnNbaW5kZXhdLT5kZWNvZGVCTVAoZmFsc2UpOworICAgICAg
ICBtX2ZyYW1lU2l6ZSA9IEludFNpemUoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9
CiAKICAgICAvLyBGb3IgUE5Hcywgd2UncmUgbm93IGRvbmU7IGZ1cnRoZXIgZGVjb2Rpbmcgd2ls
bCBoYXBwZW4gd2hlbiBjYWxsaW5nCi0gICAgLy8gaXNTaXplQXZhaWxhYmxlKCkgb3IgZnJhbWVC
dWZmZXJBdEluZGV4KCkgb24gdGhlIFBORyBkZWNvZGVyLgotICAgIGlmIChtX2ltYWdlVHlwZSA9
PSBQTkcpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKCFtX2ZyYW1lQnVmZmVyQ2Fj
aGUuaXNFbXB0eSgpKQotICAgICAgICBtX2JtcFJlYWRlci0+c2V0QnVmZmVyKCZtX2ZyYW1lQnVm
ZmVyQ2FjaGUuZmlyc3QoKSk7Ci0KLSAgICByZXR1cm4gbV9ibXBSZWFkZXItPmRlY29kZUJNUChv
bmx5U2l6ZSk7CisgICAgLy8gZnJhbWVCdWZmZXJBdEluZGV4KCkgb24gdGhlIFBORyBkZWNvZGVy
LgorICAgIHJldHVybiB0cnVlOwogfQogCiBib29sIElDT0ltYWdlRGVjb2Rlcjo6cHJvY2Vzc0Rp
cmVjdG9yeSgpCkBAIC0xNzAsNyArMjQ0LDcgQEAgYm9vbCBJQ09JbWFnZURlY29kZXI6OnByb2Nl
c3NEaXJlY3RvcnkoKQogICAgIGlmIChtX2RhdGEtPnNpemUoKSA8IHNpemVPZkRpcmVjdG9yeSkK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGNvbnN0IHVpbnQxNl90IGZpbGVUeXBlID0gcmVh
ZFVpbnQxNigyKTsKLSAgICBtX2RpcmVjdG9yeS5pZENvdW50ID0gcmVhZFVpbnQxNig0KTsKKyAg
ICBjb25zdCB1aW50MTZfdCBpZENvdW50ID0gcmVhZFVpbnQxNig0KTsKICAgICBtX2RlY29kZWRP
ZmZzZXQgPSBzaXplT2ZEaXJlY3Rvcnk7CiAKICAgICAvLyBTZWUgaWYgdGhpcyBpcyBhbiBpY29u
IGZpbGV0eXBlIHdlIHVuZGVyc3RhbmQsIGFuZCBtYWtlIHN1cmUgd2UgaGF2ZSBhdApAQCAtMTc5
LDExICsyNTMsMjMgQEAgYm9vbCBJQ09JbWFnZURlY29kZXI6OnByb2Nlc3NEaXJlY3RvcnkoKQog
ICAgICAgICBJQ09OID0gMSwKICAgICAgICAgQ1VSU09SID0gMiwKICAgICB9OwotICAgIGlmICgo
KGZpbGVUeXBlICE9IElDT04pICYmIChmaWxlVHlwZSAhPSBDVVJTT1IpKSB8fAotICAgICAgICAg
ICAgKG1fZGlyZWN0b3J5LmlkQ291bnQgPT0gMCkpCisgICAgaWYgKCgoZmlsZVR5cGUgIT0gSUNP
TikgJiYgKGZpbGVUeXBlICE9IENVUlNPUikpIHx8IChpZENvdW50ID09IDApKSB7CiAgICAgICAg
IHNldEZhaWxlZCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0gICAgcmV0dXJu
ICFmYWlsZWQoKTsKKyAgICAvLyBFbmxhcmdlIG1lbWJlciB2ZWN0b3JzIHRvIGhvbGQgYWxsIHRo
ZSBlbnRyaWVzLiAgV2UgbXVzdCBpbml0aWFsaXplIHRoZQorICAgIC8vIEJNUCBhbmQgUE5HIGRl
Y29kaW5nIHZlY3RvcnMgdG8gMCBzbyB0aGF0IGFsbCBlbnRyaWVzIGNhbiBiZSBzYWZlbHkKKyAg
ICAvLyBkZWxldGVkIGluIG91ciBkZXN0cnVjdG9yLiAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhl
eSdsbCBjb250YWluIGdhcmJhZ2UKKyAgICAvLyB2YWx1ZXMsIGFuZCBkZWxldGluZyB0aG9zZSB3
aWxsIGNvcnJ1cHQgbWVtb3J5LgorICAgIG1fZGlyRW50cmllcy5yZXNpemUoaWRDb3VudCk7Cisg
ICAgbV9CTVBSZWFkZXJzLnJlc2l6ZShpZENvdW50KTsKKyAgICBXVEY6OlZlY3RvckluaXRpYWxp
emVyPHRydWUsIHRydWUsIEJNUEltYWdlUmVhZGVyKj46OmluaXRpYWxpemUoCisgICAgICAgIG1f
Qk1QUmVhZGVycy5iZWdpbigpLCBtX0JNUFJlYWRlcnMuZW5kKCkpOworICAgIG1fUE5HRGVjb2Rl
cnMucmVzaXplKGlkQ291bnQpOworICAgIFdURjo6VmVjdG9ySW5pdGlhbGl6ZXI8dHJ1ZSwgdHJ1
ZSwgUE5HSW1hZ2VEZWNvZGVyKj46OmluaXRpYWxpemUoCisgICAgICAgIG1fUE5HRGVjb2RlcnMu
YmVnaW4oKSwgbV9QTkdEZWNvZGVycy5lbmQoKSk7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIGJv
b2wgSUNPSW1hZ2VEZWNvZGVyOjpwcm9jZXNzRGlyZWN0b3J5RW50cmllcygpCkBAIC0xOTIsMjYg
KzI3OCwyOCBAQCBib29sIElDT0ltYWdlRGVjb2Rlcjo6cHJvY2Vzc0RpcmVjdG9yeUVuCiAgICAg
QVNTRVJUKG1fZGVjb2RlZE9mZnNldCA9PSBzaXplT2ZEaXJlY3RvcnkpOwogICAgIGlmICgobV9k
ZWNvZGVkT2Zmc2V0ID4gbV9kYXRhLT5zaXplKCkpCiAgICAgICAgIHx8ICgobV9kYXRhLT5zaXpl
KCkgLSBtX2RlY29kZWRPZmZzZXQpIDwKLSAgICAgICAgICAgIChtX2RpcmVjdG9yeS5pZENvdW50
ICogc2l6ZU9mRGlyRW50cnkpKSkKKyAgICAgICAgICAgIChtX2RpckVudHJpZXMuc2l6ZSgpICog
c2l6ZU9mRGlyRW50cnkpKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGZvciAoaW50IGkg
PSAwOyBpIDwgbV9kaXJlY3RvcnkuaWRDb3VudDsgKytpKSB7Ci0gICAgICAgIGNvbnN0IEljb25E
aXJlY3RvcnlFbnRyeSBkaXJFbnRyeSA9IHJlYWREaXJlY3RvcnlFbnRyeSgpOwotICAgICAgICBp
ZiAoKGkgPT0gMCkgfHwgaXNCZXR0ZXJFbnRyeShkaXJFbnRyeSkpCi0gICAgICAgICAgICBtX2Rp
ckVudHJ5ID0gZGlyRW50cnk7CisgICAgZm9yIChJY29uRGlyZWN0b3J5RW50cmllczo6aXRlcmF0
b3IgaShtX2RpckVudHJpZXMuYmVnaW4oKSk7CisgICAgICAgICBpICE9IG1fZGlyRW50cmllcy5l
bmQoKTsgKytpKQorICAgICAgICAqaSA9IHJlYWREaXJlY3RvcnlFbnRyeSgpOyAgLy8gVXBkYXRl
cyBtX2RlY29kZWRPZmZzZXQuCisKKyAgICAvLyBNYWtlIHN1cmUgdGhlIHNwZWNpZmllZCBpbWFn
ZSBvZmZzZXRzIGFyZSBwYXN0IHRoZSBlbmQgb2YgdGhlIGRpcmVjdG9yeQorICAgIC8vIGVudHJp
ZXMuCisgICAgZm9yIChJY29uRGlyZWN0b3J5RW50cmllczo6aXRlcmF0b3IgaShtX2RpckVudHJp
ZXMuYmVnaW4oKSk7CisgICAgICAgICBpICE9IG1fZGlyRW50cmllcy5lbmQoKTsgKytpKSB7Cisg
ICAgICAgIGlmIChpLT5kd0ltYWdlT2Zmc2V0IDwgbV9kZWNvZGVkT2Zmc2V0KSB7CisgICAgICAg
ICAgICBzZXRGYWlsZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQog
ICAgIH0KIAotICAgIC8vIE1ha2Ugc3VyZSB0aGUgc3BlY2lmaWVkIGltYWdlIG9mZnNldCBpcyBw
YXN0IHRoZSBlbmQgb2YgdGhlIGRpcmVjdG9yeQotICAgIC8vIGVudHJpZXMsIGFuZCB0aGF0IHRo
ZSBvZmZzZXQgaXNuJ3Qgc28gbGFyZ2UgdGhhdCBpdCBvdmVyZmxvd3Mgd2hlbiB3ZSBhZGQKLSAg
ICAvLyA0IGJ5dGVzIHRvIGl0ICh3aGljaCB3ZSBkbyBpbiBkZWNvZGVJbWFnZSgpIHdoaWxlIGVu
c3VyaW5nIGl0J3Mgc2FmZSB0bwotICAgIC8vIGV4YW1pbmUgdGhlIGZpcnN0IDQgYnl0ZXMgb2Yg
dGhlIGltYWdlIGRhdGEpLgotICAgIGlmICgobV9kaXJFbnRyeS5kd0ltYWdlT2Zmc2V0IDwgbV9k
ZWNvZGVkT2Zmc2V0KSB8fAotICAgICAgICAgICAgKChtX2RpckVudHJ5LmR3SW1hZ2VPZmZzZXQg
KyA0KSA8IG1fZGlyRW50cnkuZHdJbWFnZU9mZnNldCkpIHsKLSAgICAgIHNldEZhaWxlZCgpOwot
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICAvLyBBcnJhbmdlIGZyYW1lcyBpbiBkZWNy
ZWFzaW5nIHF1YWxpdHkgb3JkZXIuCisgICAgc3RkOjpzb3J0KG1fZGlyRW50cmllcy5iZWdpbigp
LCBtX2RpckVudHJpZXMuZW5kKCksIGNvbXBhcmVFbnRyaWVzKTsKIAotICAgIC8vIFJlYWR5IHRv
IGRlY29kZSB0aGUgaW1hZ2UgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuCi0gICAgbV9kZWNvZGVk
T2Zmc2V0ID0gbV9kaXJFbnRyeS5kd0ltYWdlT2Zmc2V0OworICAgIC8vIFRoZSBpbWFnZSBzaXpl
IGlzIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGVudHJ5LgorICAgIGNvbnN0IEljb25EaXJlY3Rv
cnlFbnRyeSYgZGlyRW50cnkgPSBtX2RpckVudHJpZXMuZmlyc3QoKTsKKyAgICBzZXRTaXplKGRp
ckVudHJ5LmJXaWR0aCwgZGlyRW50cnkuYkhlaWdodCk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAK
QEAgLTI0NCw0NyArMzMyLDE1IEBAIElDT0ltYWdlRGVjb2Rlcjo6SWNvbkRpcmVjdG9yeUVudHJ5
IElDT0kKICAgICByZXR1cm4gZW50cnk7CiB9CiAKLWJvb2wgSUNPSW1hZ2VEZWNvZGVyOjppc0Jl
dHRlckVudHJ5KGNvbnN0IEljb25EaXJlY3RvcnlFbnRyeSYgZW50cnkpIGNvbnN0Ci17Ci0gICAg
Y29uc3QgSW50U2l6ZSBlbnRyeVNpemUoZW50cnkuYldpZHRoLCBlbnRyeS5iSGVpZ2h0KTsKLSAg
ICBjb25zdCBJbnRTaXplIGRpckVudHJ5U2l6ZShtX2RpckVudHJ5LmJXaWR0aCwgbV9kaXJFbnRy
eS5iSGVpZ2h0KTsKLSAgICBjb25zdCBpbnQgZW50cnlBcmVhID0gZW50cnkuYldpZHRoICogZW50
cnkuYkhlaWdodDsKLSAgICBjb25zdCBpbnQgZGlyRW50cnlBcmVhID0gbV9kaXJFbnRyeS5iV2lk
dGggKiBtX2RpckVudHJ5LmJIZWlnaHQ7Ci0KLSAgICBpZiAoKGVudHJ5U2l6ZSAhPSBkaXJFbnRy
eVNpemUpICYmICFtX3ByZWZlcnJlZEljb25TaXplLmlzRW1wdHkoKSkgewotICAgICAgICAvLyBB
biBpY29uIG9mIGV4YWN0bHkgdGhlIHByZWZlcnJlZCBzaXplIGlzIGJlc3QuCi0gICAgICAgIGlm
IChlbnRyeVNpemUgPT0gbV9wcmVmZXJyZWRJY29uU2l6ZSkKLSAgICAgICAgICAgIHJldHVybiB0
cnVlOwotICAgICAgICBpZiAoZGlyRW50cnlTaXplID09IG1fcHJlZmVycmVkSWNvblNpemUpCi0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8gVGhlIGljb24gY2xvc2VzdCB0
byB0aGUgcHJlZmVycmVkIGFyZWEgd2l0aG91dCBiZWluZyBzbWFsbGVyIGlzCi0gICAgICAgIC8v
IGJldHRlci4KLSAgICAgICAgaWYgKGVudHJ5QXJlYSAhPSBkaXJFbnRyeUFyZWEpIHsKLSAgICAg
ICAgICAgIHJldHVybiAoZW50cnlBcmVhIDwgZGlyRW50cnlBcmVhKSAmJiAoZW50cnlBcmVhID49
Ci0gICAgICAgICAgICAgICAgKG1fcHJlZmVycmVkSWNvblNpemUud2lkdGgoKSAqIG1fcHJlZmVy
cmVkSWNvblNpemUuaGVpZ2h0KCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIExhcmdl
ciBpY29ucyBhcmUgYmV0dGVyLgotICAgIGlmIChlbnRyeUFyZWEgIT0gZGlyRW50cnlBcmVhKQot
ICAgICAgICByZXR1cm4gKGVudHJ5QXJlYSA+IGRpckVudHJ5QXJlYSk7Ci0KLSAgICAvLyBIaWdo
ZXIgYml0LWRlcHRoIGljb25zIGFyZSBiZXR0ZXIuCi0gICAgcmV0dXJuIChlbnRyeS53Qml0Q291
bnQgPiBtX2RpckVudHJ5LndCaXRDb3VudCk7Ci19Ci0KLWJvb2wgSUNPSW1hZ2VEZWNvZGVyOjpw
cm9jZXNzSW1hZ2VUeXBlKCkKK0lDT0ltYWdlRGVjb2Rlcjo6SW1hZ2VUeXBlIElDT0ltYWdlRGVj
b2Rlcjo6aW1hZ2VUeXBlQXRJbmRleChzaXplX3QgaW5kZXgpCiB7CiAgICAgLy8gQ2hlY2sgaWYg
dGhpcyBlbnRyeSBpcyBhIEJNUCBvciBhIFBORzsgd2UgbmVlZCA0IGJ5dGVzIHRvIGNoZWNrIHRo
ZSBtYWdpYwogICAgIC8vIG51bWJlci4KLSAgICBBU1NFUlQobV9kZWNvZGVkT2Zmc2V0ID09IG1f
ZGlyRW50cnkuZHdJbWFnZU9mZnNldCk7Ci0gICAgaWYgKChtX2RlY29kZWRPZmZzZXQgPiBtX2Rh
dGEtPnNpemUoKSkKLSAgICAgICAgfHwgKChtX2RhdGEtPnNpemUoKSAtIG1fZGVjb2RlZE9mZnNl
dCkgPCA0KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIG1faW1hZ2VUeXBlID0KLSAgICAg
ICAgc3RybmNtcCgmbV9kYXRhLT5kYXRhKClbbV9kZWNvZGVkT2Zmc2V0XSwgIlx4ODlQTkciLCA0
KSA/IEJNUCA6IFBORzsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBBU1NFUlQoaW5kZXggPCBtX2Rp
ckVudHJpZXMuc2l6ZSgpKTsKKyAgICBjb25zdCB1aW50MzJfdCBpbWFnZU9mZnNldCA9IG1fZGly
RW50cmllc1tpbmRleF0uZHdJbWFnZU9mZnNldDsKKyAgICBpZiAoKGltYWdlT2Zmc2V0ID4gbV9k
YXRhLT5zaXplKCkpIHx8ICgobV9kYXRhLT5zaXplKCkgLSBpbWFnZU9mZnNldCkgPCA0KSkKKyAg
ICAgICAgcmV0dXJuIFVua25vd247CisgICAgcmV0dXJuIHN0cm5jbXAoJm1fZGF0YS0+ZGF0YSgp
W2ltYWdlT2Zmc2V0XSwgIlx4ODlQTkciLCA0KSA/IEJNUCA6IFBORzsKIH0KIAogfQpJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVyLmgNCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0NCi0tLSBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2ljby9JQ09JbWFn
ZURlY29kZXIuaAkocmV2aXNpb24gNDY3MzgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRl
Y29kZXJzL2ljby9JQ09JbWFnZURlY29kZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNDAsMTUgKzQw
LDE4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAvLyBUaGlzIGNsYXNzIGRlY29kZXMgdGhl
IElDTyBhbmQgQ1VSIGltYWdlIGZvcm1hdHMuCiAgICAgY2xhc3MgSUNPSW1hZ2VEZWNvZGVyIDog
cHVibGljIEltYWdlRGVjb2RlciB7CiAgICAgcHVibGljOgotICAgICAgICAvLyBTZWUgY29tbWVu
dHMgb24gfG1fcHJlZmVycmVkSWNvblNpemV8IGJlbG93LgotICAgICAgICBJQ09JbWFnZURlY29k
ZXIoY29uc3QgSW50U2l6ZSYgcHJlZmVycmVkSWNvblNpemUpOworICAgICAgICBJQ09JbWFnZURl
Y29kZXIoKTsKKyAgICAgICAgfklDT0ltYWdlRGVjb2RlcigpOwogCiAgICAgICAgIC8vIEltYWdl
RGVjb2RlcgogICAgICAgICB2aXJ0dWFsIFN0cmluZyBmaWxlbmFtZUV4dGVuc2lvbigpIGNvbnN0
IHsgcmV0dXJuICJpY28iOyB9CiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXREYXRhKFNoYXJlZEJ1
ZmZlciosIGJvb2wgYWxsRGF0YVJlY2VpdmVkKTsKICAgICAgICAgdmlydHVhbCBib29sIGlzU2l6
ZUF2YWlsYWJsZSgpOwogICAgICAgICB2aXJ0dWFsIEludFNpemUgc2l6ZSgpIGNvbnN0OwotICAg
ICAgICB2aXJ0dWFsIFJHQkEzMkJ1ZmZlciogZnJhbWVCdWZmZXJBdEluZGV4KHNpemVfdCBpbmRl
eCk7CisgICAgICAgIHZpcnR1YWwgSW50U2l6ZSBmcmFtZVNpemVBdEluZGV4KHNpemVfdCkgY29u
c3Q7CisgICAgICAgIHZpcnR1YWwgYm9vbCBzZXRTaXplKHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25l
ZCBoZWlnaHQpOworICAgICAgICB2aXJ0dWFsIHNpemVfdCBmcmFtZUNvdW50KCk7CisgICAgICAg
IHZpcnR1YWwgUkdCQTMyQnVmZmVyKiBmcmFtZUJ1ZmZlckF0SW5kZXgoc2l6ZV90KTsKIAogICAg
IHByaXZhdGU6CiAgICAgICAgIGVudW0gSW1hZ2VUeXBlIHsKQEAgLTU3LDExICs2MCw4IEBAIG5h
bWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgICAgIFBORywKICAgICAgICAgfTsKIAotICAgICAg
ICAvLyBUaGVzZSBhcmUgYmFzZWQgb24gdGhlIFdpbmRvd3MgSUNPTkRJUiBhbmQgSUNPTkRJUkVO
VFJZIHN0cnVjdHMsIGJ1dAotICAgICAgICAvLyB3aXRoIHVubmVjZXNzYXJ5IGVudHJpZXMgcmVt
b3ZlZC4KLSAgICAgICAgc3RydWN0IEljb25EaXJlY3RvcnkgewotICAgICAgICAgICAgdWludDE2
X3QgaWRDb3VudDsKLSAgICAgICAgfTsKKyAgICAgICAgLy8gVGhpcyBpcyBiYXNlZCBvbiB0aGUg
V2luZG93cyBJQ09ORElSRU5UUlkgc3RydWN0LCBidXQgd2l0aAorICAgICAgICAvLyB1bm5lY2Vz
c2FyeSBlbnRyaWVzIHJlbW92ZWQuCiAgICAgICAgIHN0cnVjdCBJY29uRGlyZWN0b3J5RW50cnkg
ewogICAgICAgICAgICAgdWludDE2X3QgYldpZHRoOyAgIC8vIDE2IGJpdHMgc28gd2UgY2FuIHJl
cHJlc2VudCAyNTYgYXMgMjU2LCBub3QgMAogICAgICAgICAgICAgdWludDE2X3QgYkhlaWdodDsg
IC8vICIKQEAgLTY5LDYgKzY5LDExIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgICAg
IHVpbnQzMl90IGR3SW1hZ2VPZmZzZXQ7CiAgICAgICAgIH07CiAKKyAgICAgICAgLy8gUmV0dXJu
cyB0cnVlIGlmIHxhfCBpcyBhIHByZWZlcmFibGUgaWNvbiBlbnRyeSB0byB8YnwuCisgICAgICAg
IC8vIExhcmdlciBzaXplcywgb3IgZ3JlYXRlciBiaXRkZXB0aHMgYXQgdGhlIHNhbWUgc2l6ZSwg
YXJlIHByZWZlcmFibGUuCisgICAgICAgIHN0YXRpYyBib29sIGNvbXBhcmVFbnRyaWVzKGNvbnN0
IEljb25EaXJlY3RvcnlFbnRyeSYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgSWNvbkRpcmVjdG9yeUVudHJ5JiBiKTsKKwogICAgICAgICBpbmxpbmUgdWludDE2
X3QgcmVhZFVpbnQxNihpbnQgb2Zmc2V0KSBjb25zdAogICAgICAgICB7CiAgICAgICAgICAgICBy
ZXR1cm4gQk1QSW1hZ2VSZWFkZXI6OnJlYWRVaW50MTYobV9kYXRhLmdldCgpLApAQCAtODEsMjEg
Kzg2LDI2IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBtX2RlY29kZWRPZmZzZXQgKyBvZmZzZXQpOwogICAgICAgICB9
CiAKLSAgICAgICAgLy8gRGVjb2RlcyB0aGUgaW1hZ2UuICBJZiB8b25seVNpemV8IGlzIHRydWUs
IHN0b3BzIGRlY29kaW5nIGFmdGVyCi0gICAgICAgIC8vIGNhbGN1bGF0aW5nIHRoZSBpbWFnZSBz
aXplLiAgSWYgZGVjb2RpbmcgZmFpbHMgYnV0IHRoZXJlIGlzIG5vIG1vcmUKLSAgICAgICAgLy8g
ZGF0YSBjb21pbmcsIHNldHMgdGhlICJkZWNvZGUgZmFpbHVyZSIgZmxhZy4KKyAgICAgICAgLy8g
SWYgdGhlIGRlc2lyZWQgUE5HSW1hZ2VEZWNvZGVyIGV4aXN0cywgZ2l2ZXMgaXQgdGhlIGFwcHJv
cHJpYXRlIGRhdGEuCisgICAgICAgIHZvaWQgc2V0RGF0YUZvclBOR0RlY29kZXJBdEluZGV4KHNp
emVfdCk7CisKKyAgICAgICAgLy8gRGVjb2RlcyB0aGUgZW50cnkgYXQgfGluZGV4fC4gIElmIHxv
bmx5U2l6ZXwgaXMgdHJ1ZSwgc3RvcHMgZGVjb2RpbmcKKyAgICAgICAgLy8gYWZ0ZXIgY2FsY3Vs
YXRpbmcgdGhlIGltYWdlIHNpemUuICBJZiBkZWNvZGluZyBmYWlscyBidXQgdGhlcmUgaXMgbm8K
KyAgICAgICAgLy8gbW9yZSBkYXRhIGNvbWluZywgc2V0cyB0aGUgImRlY29kZSBmYWlsdXJlIiBm
bGFnLgogICAgICAgICAvLwogICAgICAgICAvLyBOT1RFOiBJZiB0aGUgZGVzaXJlZCBlbnRyeSBp
cyBhIFBORywgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IHRyaWdnZXIKICAgICAgICAgLy8gZGVjb2Rp
bmcsIGl0IG1lcmVseSBlbnN1cmVzIHRoZSBkZWNvZGVyIGlzIGNyZWF0ZWQgYW5kIHJlYWR5IHRv
CiAgICAgICAgIC8vIGRlY29kZS4gIFRoZSBjYWxsZXIgd2lsbCB0aGVuIGNhbGwgYSBmdW5jdGlv
biBvbiB0aGUgUE5HSW1hZ2VEZWNvZGVyCiAgICAgICAgIC8vIHRoYXQgYWN0dWFsbHkgdHJpZ2dl
cnMgZGVjb2RpbmcuCi0gICAgICAgIHZvaWQgZGVjb2RlV2l0aENoZWNrRm9yRGF0YUVuZGVkKGJv
b2wgb25seVNpemUpOworICAgICAgICB2b2lkIGRlY29kZVdpdGhDaGVja0ZvckRhdGFFbmRlZChz
aXplX3QgaW5kZXgsIGJvb2wgb25seVNpemUpOworCisgICAgICAgIC8vIERlY29kZXMgdGhlIGRp
cmVjdG9yeSBhbmQgZGlyZWN0b3J5IGVudHJpZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAg
ICAgICAgLy8gZGF0YSwgYW5kIGluaXRpYWxpemVzIG1lbWJlcnMuICBSZXR1cm5zIHRydWUgaWYg
YWxsIGRlY29kaW5nCisgICAgICAgIC8vIHN1Y2NlZWRlZC4gIE9uY2UgdGhpcyByZXR1cm5zIHRy
dWUsIGFsbCBlbnRyaWVzJyBzaXplcyBhcmUga25vd24uCisgICAgICAgIGJvb2wgZGVjb2RlRGly
ZWN0b3J5KCk7CiAKLSAgICAgICAgLy8gRGVjb2RlcyB0aGUgaW1hZ2UuICBJZiB8b25seVNpemV8
IGlzIHRydWUsIHN0b3BzIGRlY29kaW5nIGFmdGVyCi0gICAgICAgIC8vIGNhbGN1bGF0aW5nIHRo
ZSBpbWFnZSBzaXplLiAgUmV0dXJucyB3aGV0aGVyIGRlY29kaW5nIHN1Y2NlZWRlZC4KLSAgICAg
ICAgLy8gTk9URTogVXNlZCBpbnRlcm5hbGx5IGJ5IGRlY29kZVdpdGhDaGVja0ZvckRhdGFFbmRl
ZCgpLiAgT3RoZXIgcGVvcGxlCi0gICAgICAgIC8vIHNob3VsZCBub3QgY2FsbCB0aGlzLgotICAg
ICAgICBib29sIGRlY29kZShib29sIG9ubHlTaXplKTsKKyAgICAgICAgLy8gRGVjb2RlcyB0aGUg
c3BlY2lmaWVkIGVudHJ5LgorICAgICAgICBib29sIGRlY29kZUF0SW5kZXgoc2l6ZV90KTsKIAog
ICAgICAgICAvLyBQcm9jZXNzZXMgdGhlIElDT05ESVIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUg
ZGF0YS4gIFJldHVybnMgdHJ1ZSBpZgogICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IGNvdWxkIGJl
IGRlY29kZWQuCkBAIC0xMTAsMTMgKzEyMCw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAg
ICAgLy8gfGRhdGF8LgogICAgICAgICBJY29uRGlyZWN0b3J5RW50cnkgcmVhZERpcmVjdG9yeUVu
dHJ5KCk7CiAKLSAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHxlbnRyeXwgaXMgYSBwcmVmZXJh
YmxlIGljb24gZW50cnkgdG8gbV9kaXJFbnRyeS4KLSAgICAgICAgLy8gTGFyZ2VyIHNpemVzLCBv
ciBncmVhdGVyIGJpdGRlcHRocyBhdCB0aGUgc2FtZSBzaXplLCBhcmUgcHJlZmVyYWJsZS4KLSAg
ICAgICAgYm9vbCBpc0JldHRlckVudHJ5KGNvbnN0IEljb25EaXJlY3RvcnlFbnRyeSYpIGNvbnN0
OwotCiAgICAgICAgIC8vIERldGVybWluZXMgd2hldGhlciB0aGUgZGVzaXJlZCBlbnRyeSBpcyBh
IEJNUCBvciBQTkcuICBSZXR1cm5zIHRydWUKICAgICAgICAgLy8gaWYgdGhlIHR5cGUgY291bGQg
YmUgZGV0ZXJtaW5lZC4KLSAgICAgICAgYm9vbCBwcm9jZXNzSW1hZ2VUeXBlKCk7CisgICAgICAg
IEltYWdlVHlwZSBpbWFnZVR5cGVBdEluZGV4KHNpemVfdCk7CiAKICAgICAgICAgLy8gVHJ1ZSBp
ZiB3ZSd2ZSBzZWVuIGFsbCB0aGUgZGF0YS4KICAgICAgICAgYm9vbCBtX2FsbERhdGFSZWNlaXZl
ZDsKQEAgLTEyNiwyMyArMTMyLDE5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgLy8g
Qk1QSW1hZ2VSZWFkZXIgdGFrZXMgb3ZlciB0aGlzIHdpbGwgbm90IGJlIHVwZGF0ZWQgZnVydGhl
ci4KICAgICAgICAgc2l6ZV90IG1fZGVjb2RlZE9mZnNldDsKIAotICAgICAgICAvLyBUaGUgZW50
cnkgc2l6ZSB3ZSBzaG91bGQgcHJlZmVyLiAgSWYgdGhpcyBpcyBlbXB0eSwgd2UgY2hvb3NlIHRo
ZQotICAgICAgICAvLyBsYXJnZXN0IGF2YWlsYWJsZSBzaXplLiAgSWYgbm8gZW50cmllcyBvZiB0
aGUgZGVzaXJlZCBzaXplIGFyZQotICAgICAgICAvLyBhdmFpbGFibGUsIHdlIHBpY2sgdGhlIG5l
eHQgbGFyZ2VyIHNpemUuCi0gICAgICAgIEludFNpemUgbV9wcmVmZXJyZWRJY29uU2l6ZTsKLQog
ICAgICAgICAvLyBUaGUgaGVhZGVycyBmb3IgdGhlIElDTy4KLSAgICAgICAgSWNvbkRpcmVjdG9y
eSBtX2RpcmVjdG9yeTsKLSAgICAgICAgSWNvbkRpcmVjdG9yeUVudHJ5IG1fZGlyRW50cnk7Ci0K
LSAgICAgICAgLy8gVGhlIEJNUCByZWFkZXIsIGlmIHdlIG5lZWQgdG8gdXNlIG9uZS4KLSAgICAg
ICAgT3duUHRyPEJNUEltYWdlUmVhZGVyPiBtX2JtcFJlYWRlcjsKLQotICAgICAgICAvLyBUaGUg
UE5HIGRlY29kZXIsIGlmIHdlIG5lZWQgdG8gdXNlIG9uZS4KLSAgICAgICAgT3duUHRyPFBOR0lt
YWdlRGVjb2Rlcj4gbV9wbmdEZWNvZGVyOworICAgICAgICB0eXBlZGVmIFZlY3RvcjxJY29uRGly
ZWN0b3J5RW50cnk+IEljb25EaXJlY3RvcnlFbnRyaWVzOworICAgICAgICBJY29uRGlyZWN0b3J5
RW50cmllcyBtX2RpckVudHJpZXM7CiAKLSAgICAgICAgLy8gV2hhdCBraW5kIG9mIGltYWdlIGRh
dGEgaXMgc3RvcmVkIGF0IHRoZSBlbnRyeSB3ZSdyZSBkZWNvZGluZy4KLSAgICAgICAgSW1hZ2VU
eXBlIG1faW1hZ2VUeXBlOworICAgICAgICAvLyBUaGUgaW1hZ2UgZGVjb2RlcnMgZm9yIHRoZSB2
YXJpb3VzIGZyYW1lcy4KKyAgICAgICAgdHlwZWRlZiBWZWN0b3I8Qk1QSW1hZ2VSZWFkZXIqPiBC
TVBSZWFkZXJzOworICAgICAgICBCTVBSZWFkZXJzIG1fQk1QUmVhZGVyczsKKyAgICAgICAgdHlw
ZWRlZiBWZWN0b3I8UE5HSW1hZ2VEZWNvZGVyKj4gUE5HRGVjb2RlcnM7CisgICAgICAgIFBOR0Rl
Y29kZXJzIG1fUE5HRGVjb2RlcnM7CisKKyAgICAgICAgLy8gVmFsaWQgb25seSB3aGlsZSBhIEJN
UEltYWdlUmVhZGVyIGlzIGRlY29kaW5nLCB0aGlzIGhvbGRzIHRoZSBzaXplCisgICAgICAgIC8v
IGZvciB0aGUgcGFydGljdWxhciBlbnRyeSBiZWluZyBkZWNvZGVkLgorICAgICAgICBJbnRTaXpl
IG1fZnJhbWVTaXplOwogICAgIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>
<flag name="review"
          id="18193"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34155</attachid>
            <date>2009-08-05 11:34:43 -0700</date>
            <delta_ts>2009-08-05 12:17:59 -0700</delta_ts>
            <desc>Return multiple frames from ICO decoder, v2</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>1956</size>
            <attacher name="Peter Kasting">pkasting</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdExpYnJhcmllcy9DaGFuZ2VMb2cNCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJLaXRM
aWJyYXJpZXMvQ2hhbmdlTG9nCShyZXZpc2lvbiA0Njc4NSkKKysrIFdlYktpdExpYnJhcmllcy9D
aGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxMyBAQAorMjAwOS0wOC0wNCAgUGV0
ZXIgS2FzdGluZyAgPHBrYXN0aW5nQGdvb2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTI3MzIzCisgICAgICAgIFN0cmlwIGxpbmUgZW5kaW5ncyBhdCBhbGwgcG9pbnRz
IGF1dG8tdmVyc2lvbi5zaCByZWFkcyBkYXRhLCBub3QganVzdAorICAgICAgICB0aGUgb25lIEkg
aGFwcGVuZWQgdG8gcnVuIGludG8uCisKKyAgICAgICAgKiB3aW4vdG9vbHMvc2NyaXB0cy9hdXRv
LXZlcnNpb24uc2g6CisKIDIwMDktMDctMjcgIFBldGVyIEthc3RpbmcgIDxwa2FzdGluZ0Bnb29n
bGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0gUm9iZW4uCkluZGV4OiBXZWJLaXRM
aWJyYXJpZXMvd2luL3Rvb2xzL3NjcmlwdHMvYXV0by12ZXJzaW9uLnNoDQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot
LS0gV2ViS2l0TGlicmFyaWVzL3dpbi90b29scy9zY3JpcHRzL2F1dG8tdmVyc2lvbi5zaAkocmV2
aXNpb24gNDY3NDEpCisrKyBXZWJLaXRMaWJyYXJpZXMvd2luL3Rvb2xzL3NjcmlwdHMvYXV0by12
ZXJzaW9uLnNoCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw3ICsyOSw3IEBAIFZFUlNJT05QQVRIPSRW
RVJTSU9OUEFUSC9pbmNsdWRlCiBWRVJTSU9ORklMRT0kVkVSU0lPTlBBVEgvYXV0b3ZlcnNpb24u
aAogbWtkaXIgLXAgIiRWRVJTSU9OUEFUSCIKIAotUFJPRFVDVFZFUlNJT049YGNhdCAiJFNSQ1BB
VEgvUFJPRFVDVFZFUlNJT04iYAorUFJPRFVDVFZFUlNJT049YGNhdCAkU1JDUEFUSC9QUk9EVUNU
VkVSU0lPTiB8IHNlZCAtciAncy8oLipcUyspXHMqJC9cMS8nYAogTUFKT1JWRVJTSU9OPWBlY2hv
ICIkUFJPRFVDVFZFUlNJT04iIHwgc2VkICdzL1woW15cLl0qXClcLlwoW14uXSpcKVwoXC5cKFte
Ll0qXClcKVw/L1wxLydgCiBNSU5PUlZFUlNJT049YGVjaG8gIiRQUk9EVUNUVkVSU0lPTiIgfCBz
ZWQgJ3MvXChbXlwuXSpcKVwuXChbXi5dKlwpXChcLlwoW14uXSpcKVwpXD8vXDIvJ2AKIFRJTllW
RVJTSU9OPWBlY2hvICIkUFJPRFVDVFZFUlNJT04iIHwgc2VkICdzL1woW15cLl0qXClcLlwoW14u
XSpcKVwoXC5cKFteLl0qXClcKVw/L1w0LydgCkBAIC0zOCwxMCArMzgsMTEgQEAgaWYgWyAiJFRJ
TllWRVJTSU9OIiA9PSAiIiBdOyB0aGVuCiBmaQogCiBpZiBbICIkUkNfUFJPSkVDVFNPVVJDRVZF
UlNJT04iID09ICIiIF07IHRoZW4KLSAgICBQUk9QT1NFRFZFUlNJT049YGNhdCAkU1JDUEFUSC9W
RVJTSU9OIHwgc2VkIC1yICdzLyguKlxTKylccyokL1wxLydgCisgICAgUFJPUE9TRURWRVJTSU9O
PWBjYXQgJFNSQ1BBVEgvVkVSU0lPTmAKIGVsc2UKICAgICBQUk9QT1NFRFZFUlNJT049IiRSQ19Q
Uk9KRUNUU09VUkNFVkVSU0lPTiIKIGZpCitQUk9QT1NFRFZFUlNJT049YGVjaG8gIiRQUk9QT1NF
RFZFUlNJT04iIHwgc2VkIC1yICdzLyguKlxTKylccyokL1wxLydgCiAKIEJMRE1BSk9SVkVSU0lP
Tj1gZWNobyAiJFBST1BPU0VEVkVSU0lPTiIgfCBzZWQgJ3MvXChbXlwuXSpcKVwoXC5cKFteLl0q
XClcKFwuXChbXi5dKlwpXClcP1wpXD8vXDEvJ2AKIEJMRE1JTk9SVkVSU0lPTj1gZWNobyAiJFBS
T1BPU0VEVkVSU0lPTiIgfCBzZWQgJ3MvXChbXlwuXSpcKVwoXC5cKFteLl0qXClcKFwuXChbXi5d
KlwpXClcP1wpXD8vXDMvJ2AK
</data>
<flag name="review"
          id="18316"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34158</attachid>
            <date>2009-08-05 12:17:59 -0700</date>
            <delta_ts>2009-08-05 12:24:56 -0700</delta_ts>
            <desc>Return multiple frames from ICO decoder, v2 (for real)</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>33912</size>
            <attacher name="Peter Kasting">pkasting</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9DaGFuZ2VM
b2cJKHJldmlzaW9uIDQ2ODA0KQorKysgV2ViQ29yZS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkK
QEAgLTEsMyArMSw1MSBAQAorMjAwOS0wOC0wMyAgUGV0ZXIgS2FzdGluZyAgPHBrYXN0aW5nQGdv
b2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2NDYwCisgICAgICAg
IFJldHVybiBtdWx0aXBsZSBpY29uIGVudHJpZXMgZnJvbSB0aGUgSUNPIGRlY29kZXIgYXMgc2Vw
YXJhdGUgZnJhbWVzLAorICAgICAgICBzb3J0ZWQgYnkgZGVjcmVhc2luZyBxdWFsaXR5IChtdWNo
IGxpa2UgdGhlIENHIElDTyBkZWNvZGVyIGRvZXMpLgorCisgICAgICAgIEFzIGEgcmVzdWx0IG9m
IHRoaXMgY2hhbmdlLCB3ZSBjYW4gZWxpbWluYXRlIHRoZSBTa2lhLXNwZWNpZmljIHNldERhdGEo
KQorICAgICAgICBoYWNrIHRoYXQgdGhlIENocm9taXVtIHBvcnQgdXNlZCB0byBzZWxlY3QgdGhl
IGRlc2lyZWQgaWNvbiBzaXplIC0tIG5vdworICAgICAgICBjYWxsZXJzIGNhbiBqdXN0IGVudW1l
cmF0ZSB0aGUgZnJhbWVzIGFuZCBhc2sgZm9yIHRoZSBkYXRhIGZyb20gdGhlIG9uZQorICAgICAg
ICB0aGV5IGxpa2UuCisgICAgICAgIAorICAgICAgICBVbmRlciB0aGUgaG9vZCwgdGhlIElDTyBk
ZWNvZGVyIG5vdyBrZWVwcyB2ZWN0b3JzIGZvciBhIG51bWJlciBvZiB0aGluZ3MKKyAgICAgICAg
KGluY2x1ZGluZyBkaXJlY3RvcnkgZW50cmllcyBhbmQgaW1hZ2UgZGVjb2RlcnMpIHdoZXJlIGl0
IHVzZWQgdG8gaGF2ZQorICAgICAgICBzaW5nbGUgbWVtYmVycy4gIEhvd2V2ZXIsIGNhbGxlcnMg
KHRoYXQgSSBoYXZlIHNlZW4pIHdpbGwgb25seSByZXF1ZXN0CisgICAgICAgIG9uZSBmcmFtZSBm
cm9tIHRoZSBpY29uLCBzbyBwcmFjdGljYWxseSB0aGVyZSBhcmVuJ3QgZ29pbmcgdG8gYmUgbG90
cyBvZgorICAgICAgICBpbnN0YW50aWF0ZWQgaW1hZ2UgZGVjb2RlcnMuCisKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9JbWFnZVNvdXJjZS5oOiBNb3ZlIHxtX2RlY29kZXJ8IGJhY2sgdG8g
cHJpdmF0ZSBub3cgdGhhdCBTa2lhIG5vIGxvbmdlciBuZWVkcyB0byBhY2Nlc3MgaXQuCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vSW1hZ2VTb3VyY2VDYWlyby5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpjcmVhdGVEZWNvZGVyKTogUmVtb3ZlIHNpemUgYXJndW1lbnQgZnJvbSBJ
Q08gZGVjb2RlciBpbnN0YW50aWF0aW9uLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3Nr
aWEvSW1hZ2VTb3VyY2VTa2lhLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZURlY29kZXIp
OiBSZW1vdmUgc2l6ZSBhcmd1bWVudCBmcm9tIElDTyBkZWNvZGVyIGluc3RhbnRpYXRpb24uCisg
ICAgICAgIChXZWJDb3JlOjpJbWFnZVNvdXJjZTo6c2V0RGF0YSk6IFJlbW92ZSBmdW5jdGlvbiB0
byBhc2sgZm9yIGEgcGFydGljdWxhciBpY29uIHNpemUuCisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9JbWFnZVNvdXJjZVNraWEuaDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93eC9JbWFnZVNvdXJjZVd4LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0
ZURlY29kZXIpOiBSZW1vdmUgc2l6ZSBhcmd1bWVudCBmcm9tIElDTyBkZWNvZGVyIGluc3RhbnRp
YXRpb24uCisgICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvaWNvL0lDT0ltYWdlRGVj
b2Rlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJQ09JbWFnZURlY29kZXI6OklDT0ltYWdlRGVj
b2Rlcik6CisgICAgICAgIChXZWJDb3JlOjpJQ09JbWFnZURlY29kZXI6On5JQ09JbWFnZURlY29k
ZXIpOiBEZWxldGUgYWxsIGluc3RhbnRpYXRlZCBwZXItZnJhbWUgZGVjb2RlcnMuCisgICAgICAg
IChXZWJDb3JlOjpJQ09JbWFnZURlY29kZXI6OnNldERhdGEpOiBTZW5kIGRhdGEgdG8gYWxsIGlu
c3RhbnRpYXRlZCBwZXItZnJhbWUgZGVjb2RlcnMuCisgICAgICAgIChXZWJDb3JlOjpJQ09JbWFn
ZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSk6IFVzZSBzaXplIGZyb20gaWNvbiBkaXJlY3Rvcnkg
aW5zdGVhZCBvZiBQTkcgZGVjb2RlciAoaWYgYXBwbGljYWJsZSkgc28gd2UgY2FuIHJlcG9ydCBp
dCB3aXRob3V0IGRlY29kaW5nIHRoZSBQTkcgZnJhbWVzLgorICAgICAgICAoV2ViQ29yZTo6SUNP
SW1hZ2VEZWNvZGVyOjpzaXplKTogUmVwb3J0IGZyYW1lLXNwZWNpZmljIHNpemUgaWYgQk1QIGRl
Y29kZXIgaXMgY2FsbGluZy4gIE90aGVyd2lzZSwgdXNlIHNpemUgZnJvbSBpY29uIGRpcmVjdG9y
eSBpbnN0ZWFkIG9mIFBORyBkZWNvZGVyIChpZiBhcHBsaWNhYmxlKS4KKyAgICAgICAgKFdlYkNv
cmU6OklDT0ltYWdlRGVjb2Rlcjo6ZnJhbWVTaXplQXRJbmRleCk6IEltcGxlbWVudC4KKyAgICAg
ICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6c2V0U2l6ZSk6IFNhbml0eSBjaGVjayB2YWx1
ZSBpZiBCTVAgZGVjb2RlciBpcyBjYWxsaW5nLgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1hZ2VE
ZWNvZGVyOjpmcmFtZUNvdW50KTogSW1wbGVtZW50LgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1h
Z2VEZWNvZGVyOjpmcmFtZUJ1ZmZlckF0SW5kZXgpOiBTYW5pdHkgY2hlY2sgc2l6ZSBmb3IgUE5H
IGZyYW1lcy4KKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6Y29tcGFyZUVudHJp
ZXMpOiBBZGQgdXRpbGl0eSBmdW5jdGlvbiBmb3Igc29ydGluZyBlbnRyaWVzLgorICAgICAgICAo
V2ViQ29yZTo6SUNPSW1hZ2VEZWNvZGVyOjpzZXREYXRhRm9yUE5HRGVjb2RlckF0SW5kZXgpOiBG
YWN0b3Igb3V0IHV0aWxpdHkgZnVuY3Rpb24gZm9yIHBhc3NpbmcgY29ycmVjdCBkYXRhIGJsb2Ig
dG8gYSBQTkcgZGVjb2Rlci4KKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6ZGVj
b2RlV2l0aENoZWNrRm9yRGF0YUVuZGVkKTogU3BsaXQgZGVjb2RlKCkgaW50byB0d28gcGllY2Vz
LgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1hZ2VEZWNvZGVyOjpkZWNvZGVEaXJlY3RvcnkpOiBU
aGUgZmlyc3QgcGFydCBvZiB0aGUgb2xkIGRlY29kZSgpLgorICAgICAgICAoV2ViQ29yZTo6SUNP
SW1hZ2VEZWNvZGVyOjpkZWNvZGVBdEluZGV4KTogVGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBvbGQg
ZGVjb2RlKCksIHNwbGl0IG9mZiBzbyB3ZSBhdm9pZCBkZWNvZGluZyBhbiBlbnRyeSB1bnRpbCBp
dCdzIHJlcXVlc3RlZC4KKyAgICAgICAgKFdlYkNvcmU6OklDT0ltYWdlRGVjb2Rlcjo6cHJvY2Vz
c0RpcmVjdG9yeSk6IEFkZCByZXNpemluZyBvZiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgYmFz
ZWQgb24gZGlyZWN0b3J5IGNvbnRlbnRzLgorICAgICAgICAoV2ViQ29yZTo6SUNPSW1hZ2VEZWNv
ZGVyOjpwcm9jZXNzRGlyZWN0b3J5RW50cmllcyk6IFNvcnQgZW50cmllcyBieSBxdWFsaXR5Lgor
ICAgICAgICAoV2ViQ29yZTo6SUNPSW1hZ2VEZWNvZGVyOjppbWFnZVR5cGVBdEluZGV4KTogUmV0
dXJuIHR5cGUgdG8gY2FsbGVyIGluc3RlYWQgb2Ygc2V0dGluZyBhIG1lbWJlci4KKyAgICAgICAg
KiBwbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVyLmg6CisKIDIwMDkt
MDgtMDUgIEFuZHJhcyBCZWNzaSAgPGJlY3NpLmFuZHJhc0BzdHVkLnUtc3plZ2VkLmh1PgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IFNpbW9uIEhhdXNtYW5uLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9JbWFnZVNvdXJjZS5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9JbWFnZVNvdXJjZS5oCShyZXZpc2lvbiA0NjgwNCkKKysrIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvSW1hZ2VTb3VyY2UuaAkod29ya2luZyBjb3B5KQpAQCAtMTQyLDkgKzE0
Miw3IEBAIHB1YmxpYzoKICAgICBib29sIGZyYW1lSGFzQWxwaGFBdEluZGV4KHNpemVfdCk7IC8v
IFdoZXRoZXIgb3Igbm90IHRoZSBmcmFtZSBhY3R1YWxseSB1c2VkIGFueSBhbHBoYS4KICAgICBi
b29sIGZyYW1lSXNDb21wbGV0ZUF0SW5kZXgoc2l6ZV90KTsgLy8gV2hldGhlciBvciBub3QgdGhl
IGZyYW1lIGlzIGNvbXBsZXRlbHkgZGVjb2RlZC4KIAotICAgIC8vIEZJWE1FOiBUaGlzIGlzIHBy
b3RlY3RlZCBvbmx5IHRvIGFsbG93IEltYWdlU291cmNlU2tpYSB0byBzZXQgSUNPIGRlY29kZXIK
LSAgICAvLyB3aXRoIGEgcHJlZmVycmVkIHNpemUuIFNlZSBJbWFnZVNvdXJjZVNraWEuaCBmb3Ig
ZGlzY3Vzc2lvbi4KLXByb3RlY3RlZDoKK3ByaXZhdGU6CiAgICAgTmF0aXZlSW1hZ2VTb3VyY2VQ
dHIgbV9kZWNvZGVyOwogfTsKIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWly
by9JbWFnZVNvdXJjZUNhaXJvLmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2Fpcm8vSW1hZ2VTb3VyY2VDYWlyby5jcHAJKHJldmlzaW9uIDQ2ODA0KQorKysg
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9JbWFnZVNvdXJjZUNhaXJvLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNzUsNyArNzUsNyBAQCBJbWFnZURlY29kZXIqIGNyZWF0ZURlY29kZXIo
Y29uc3QgVmVjdG9yCiAgICAgLy8gQ1VScyBiZWdpbiB3aXRoIDItYnl0ZSAwIGZvbGxvd2VkIGJ5
IDItYnl0ZSAyLgogICAgIGlmICghbWVtY21wKGNvbnRlbnRzLCAiXDAwMFwwMDBcMDAxXDAwMCIs
IDQpIHx8CiAgICAgICAgICFtZW1jbXAoY29udGVudHMsICJcMDAwXDAwMFwwMDJcMDAwIiwgNCkp
Ci0gICAgICAgIHJldHVybiBuZXcgSUNPSW1hZ2VEZWNvZGVyKEludFNpemUoKSk7CisgICAgICAg
IHJldHVybiBuZXcgSUNPSW1hZ2VEZWNvZGVyKCk7CiAKICAgICAvLyBYQk1zIHJlcXVpcmUgOCBi
eXRlcyBvZiBpbmZvLgogICAgIGlmIChsZW5ndGggPj0gOCAmJiBzdHJuY21wKGNvbnRlbnRzLCAi
I2RlZmluZSAiLCA4KSA9PSAwKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lh
L0ltYWdlU291cmNlU2tpYS5jcHANCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3NraWEvSW1hZ2VTb3VyY2VTa2lhLmNwcAkocmV2aXNpb24gNDY4MDQpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VTb3VyY2VTa2lhLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzAsNyArMzAsNyBAQAogCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRl
ICJJbWFnZVNvdXJjZVNraWEuaCIKKyNpbmNsdWRlICJJbWFnZVNvdXJjZS5oIgogI2luY2x1ZGUg
IlNoYXJlZEJ1ZmZlci5oIgogCiAjaW5jbHVkZSAiR0lGSW1hZ2VEZWNvZGVyLmgiCkBAIC00NCw3
ICs0NCw3IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotSW1hZ2VEZWNvZGVyKiBjcmVhdGVE
ZWNvZGVyKGNvbnN0IFZlY3RvcjxjaGFyPiYgZGF0YSwgY29uc3QgSW50U2l6ZSYgcHJlZmVycmVk
SWNvblNpemUpCitJbWFnZURlY29kZXIqIGNyZWF0ZURlY29kZXIoY29uc3QgVmVjdG9yPGNoYXI+
JiBkYXRhKQogewogICAgIC8vIFdlIG5lZWQgYXQgbGVhc3QgNCBieXRlcyB0byBmaWd1cmUgb3V0
IHdoYXQga2luZCBvZiBpbWFnZSB3ZSdyZSBkZWFsaW5nIHdpdGguCiAgICAgaW50IGxlbmd0aCA9
IGRhdGEuc2l6ZSgpOwpAQCAtNzksNyArNzksNyBAQCBJbWFnZURlY29kZXIqIGNyZWF0ZURlY29k
ZXIoY29uc3QgVmVjdG9yCiAgICAgLy8gQ1VScyBiZWdpbiB3aXRoIDItYnl0ZSAwIGZvbGxvd2Vk
IGJ5IDItYnl0ZSAyLgogICAgIGlmICghbWVtY21wKGNvbnRlbnRzLCAiXDAwMFwwMDBcMDAxXDAw
MCIsIDQpIHx8CiAgICAgICAgICFtZW1jbXAoY29udGVudHMsICJcMDAwXDAwMFwwMDJcMDAwIiwg
NCkpCi0gICAgICAgIHJldHVybiBuZXcgSUNPSW1hZ2VEZWNvZGVyKHByZWZlcnJlZEljb25TaXpl
KTsKKyAgICAgICAgcmV0dXJuIG5ldyBJQ09JbWFnZURlY29kZXIoKTsKICAgIAogICAgIC8vIFhC
TXMgcmVxdWlyZSA4IGJ5dGVzIG9mIGluZm8uCiAgICAgaWYgKGxlbmd0aCA+PSA4ICYmIHN0cm5j
bXAoY29udGVudHMsICIjZGVmaW5lICIsIDgpID09IDApCkBAIC0xMjQsNyArMTI0LDcgQEAgdm9p
ZCBJbWFnZVNvdXJjZTo6c2V0RGF0YShTaGFyZWRCdWZmZXIqIAogICAgIC8vIElmIGluc3VmZmlj
aWVudCBieXRlcyBhcmUgYXZhaWxhYmxlIHRvIGRldGVybWluZSB0aGUgaW1hZ2UgdHlwZSwgbm8g
ZGVjb2RlciBwbHVnaW4gd2lsbCBiZQogICAgIC8vIG1hZGUuCiAgICAgaWYgKCFtX2RlY29kZXIp
Ci0gICAgICAgIG1fZGVjb2RlciA9IGNyZWF0ZURlY29kZXIoZGF0YS0+YnVmZmVyKCksIEludFNp
emUoKSk7CisgICAgICAgIG1fZGVjb2RlciA9IGNyZWF0ZURlY29kZXIoZGF0YS0+YnVmZmVyKCkp
OwogCiAgICAgLy8gQ3JlYXRlRGVjb2RlciB3aWxsIHJldHVybiBOVUxMIGlmIHRoZSBkZWNvZGVy
IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiBQbHVzLAogICAgIC8vIHdlIHNob3VsZCBub3Qgc2VuZCBt
b3JlIGRhdGEgdG8gYSBkZWNvZGVyIHdoaWNoIGhhcyBhbHJlYWR5IGRlY2lkZWQgaXQKQEAgLTIz
MCwxNiArMjMwLDYgQEAgYm9vbCBJbWFnZVNvdXJjZTo6ZnJhbWVIYXNBbHBoYUF0SW5kZXgocwog
ICAgIHJldHVybiBidWZmZXItPmhhc0FscGhhKCk7CiB9CiAKLXZvaWQgSW1hZ2VTb3VyY2VTa2lh
OjpzZXREYXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJvb2wgYWxsRGF0YVJlY2VpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgSW50U2l6ZSYgcHJlZmVycmVkSWNvblNpemUpCi17Ci0gICAgaWYgKCFtX2RlY29kZXIp
Ci0gICAgICAgIG1fZGVjb2RlciA9IGNyZWF0ZURlY29kZXIoZGF0YS0+YnVmZmVyKCksIHByZWZl
cnJlZEljb25TaXplKTsKLQotICAgIEltYWdlU291cmNlOjpzZXREYXRhKGRhdGEsIGFsbERhdGFS
ZWNlaXZlZCk7Ci19Ci0KIFN0cmluZyBJbWFnZVNvdXJjZTo6ZmlsZW5hbWVFeHRlbnNpb24oKSBj
b25zdAogewogICAgIHJldHVybiBtX2RlY29kZXIgPyBtX2RlY29kZXItPmZpbGVuYW1lRXh0ZW5z
aW9uKCkgOiBTdHJpbmcoKTsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9J
bWFnZVNvdXJjZVNraWEuaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvc2tpYS9JbWFnZVNvdXJjZVNraWEuaAkocmV2aXNpb24gNDY4MDQpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VTb3VyY2VTa2lhLmgJKHdvcmtpbmcgY29weSkKQEAg
LTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgR29vZ2xlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0g
KiBtZXQ6Ci0gKiAKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmln
aHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBu
YW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQot
ICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhP
TERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICog
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRI
RSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
Ci0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiSW1hZ2VTb3VyY2UuaCIKLQotbmFtZXNwYWNlIFdl
YkNvcmUgewotCi1jbGFzcyBJbWFnZVNvdXJjZVNraWEgOiBwdWJsaWMgSW1hZ2VTb3VyY2Ugewot
cHVibGljOgotICAgIC8vIEZJWE1FOiBUaGlzIGNsYXNzIGlzIGEgaGFjayB0byBzdXBwb3J0IENo
cm9taXVtJ3MgSUNPIGRlY29kZXIKLSAgICAvLyBDdXJyZW50bHkgb3VyIElDTyBkZWNvZGVyIGRl
Y29kZXMgYWxsIGRhdGEgZHVyaW5nIHNldERhdGEoKSBpbnN0ZWFkIG9mCi0gICAgLy8gYmVpbmcg
bGF6eS4gIEluIGFkZGl0aW9uLCBpdCBvbmx5IGRlY29kZXMgb25lIGZyYW1lIChjbG9zZXN0IHRv
IHRoZSBzaXplCi0gICAgLy8gcGFzc2VkIHRvIHRoZSBkZWNvZGVyIGR1cmluZyBjcmVhdGVEZWNv
ZGVyLCBjYWxsZWQgZnJvbSBzZXREYXRhKSBhbmQKLSAgICAvLyBkaXNjYXJkcyBhbGwgb3RoZXIg
ZGF0YSBpbiB0aGUgZmlsZS4KLSAgICAvLwotICAgIC8vIFRvIGZpeCB0aGlzIHdpbGwgcmVxdWly
ZSBmaXhpbmcgdGhlIElDTyBkZWNvZGVyIHRvIGJlIGxhenksIG9yIHRvIGRlY29kZQotICAgIC8v
IGFsbCBmcmFtZXMuICBBcHBsZSdzIGRlY29kZXJzIChJbWFnZUlPKSBkZWNvZGUgYWxsIGZyYW1l
cywgYW5kIHJldHVybgotICAgIC8vIHRoZW0gYWxsIHNvcnRlZCBpbiBkZWNyZWFzaW5nIHNpemUu
ICBXZWJDb3JlIGFsd2F5cyBkcmF3cyB0aGUgZmlyc3QgZnJhbWUuCi0gICAgLy8KLSAgICAvLyBU
aGlzIGlzIGEgc3BlY2lhbC1wdXJwb3NlIHJvdXRpbmUgZm9yIHRoZSBmYXZpY29uIGRlY29kZXIs
IHdoaWNoIGlzIHVzZWQKLSAgICAvLyB0byBzcGVjaWZ5IGEgcGFydGljdWxhciBpY29uIHNpemUg
Zm9yIHRoZSBJQ09JbWFnZURlY29kZXIgdG8gcHJlZmVyCi0gICAgLy8gZGVjb2RpbmcuICBOb3Rl
IHRoYXQgbm90IGFsbCBmYXZpY29ucyBhcmUgSUNPcywgc28gdGhpcyB3b24ndAotICAgIC8vIG5l
Y2Vzc2FyaWx5IGRvIGFueXRoaW5nIGRpZmZlcmVudGx5IHRoYW4gSW1hZ2VTb3VyY2U6OnNldERh
dGEoKS4KLSAgICAvLwotICAgIC8vIFBhc3NpbmcgYW4gZW1wdHkgSW50U2l6ZSBmb3IgfHByZWZl
cnJlZEljb25TaXplfCBoZXJlIGlzIGV4YWN0bHkKLSAgICAvLyBlcXVpdmFsZW50IHRvIGp1c3Qg
Y2FsbGluZyBJbWFnZVNvdXJjZTo6c2V0RGF0YSgpLiAgU2VlIGFsc28gY29tbWVudHMgaW4KLSAg
ICAvLyBJQ09JbWFnZURlY29kZXIuY3BwLgotICAgIHZvaWQgc2V0RGF0YShTaGFyZWRCdWZmZXIq
IGRhdGEsCi0gICAgICAgICAgICAgICAgIGJvb2wgYWxsRGF0YVJlY2VpdmVkLAotICAgICAgICAg
ICAgICAgICBjb25zdCBJbnRTaXplJiBwcmVmZXJyZWRJY29uU2l6ZSk7Ci19OwotCi19CkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4L0ltYWdlU291cmNlV3guY3BwDQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09DQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93eC9JbWFnZVNvdXJjZVd4LmNwcAko
cmV2aXNpb24gNDY4MDQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4L0ltYWdlU291
cmNlV3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04MCw3ICs4MCw3IEBAIEltYWdlRGVjb2Rlciog
Y3JlYXRlRGVjb2Rlcihjb25zdCBTaGFyZWQKICAgICAvLyBDVVJzIGJlZ2luIHdpdGggMi1ieXRl
IDAgZm9sbG93ZWQgYnkgMi1ieXRlIDIuCiAgICAgaWYgKCFtZW1jbXAoY29udGVudHMsICJcMDAw
XDAwMFwwMDFcMDAwIiwgNCkgfHwKICAgICAgICAgIW1lbWNtcChjb250ZW50cywgIlwwMDBcMDAw
XDAwMlwwMDAiLCA0KSkKLSAgICAgICAgcmV0dXJuIG5ldyBJQ09JbWFnZURlY29kZXIoSW50U2l6
ZSgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBJQ09JbWFnZURlY29kZXIoKTsKICAgIAogICAgIC8v
IFhCTXMgcmVxdWlyZSA4IGJ5dGVzIG9mIGluZm8uCiAgICAgaWYgKGxlbmd0aCA+PSA4ICYmIHN0
cm5jbXAoY29udGVudHMsICIjZGVmaW5lICIsIDgpID09IDApCkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2ltYWdlLWRlY29kZXJzL2ljby9JQ09JbWFnZURlY29kZXIuY3BwDQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9pY28vSUNPSW1hZ2VEZWNvZGVyLmNw
cAkocmV2aXNpb24gNDY4MDQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2lj
by9JQ09JbWFnZURlY29kZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2ICszMSw4IEBACiAj
aW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiSUNPSW1hZ2VEZWNvZGVyLmgiCiAKKyNpbmNs
dWRlIDxhbGdvcml0aG0+CisKICNpbmNsdWRlICJCTVBJbWFnZVJlYWRlci5oIgogI2luY2x1ZGUg
IlBOR0ltYWdlRGVjb2Rlci5oIgogCkBAIC00MiwxNSArNDQsMTkgQEAgbmFtZXNwYWNlIFdlYkNv
cmUgewogc3RhdGljIGNvbnN0IHNpemVfdCBzaXplT2ZEaXJlY3RvcnkgPSA2Owogc3RhdGljIGNv
bnN0IHNpemVfdCBzaXplT2ZEaXJFbnRyeSA9IDE2OwogCi1JQ09JbWFnZURlY29kZXI6OklDT0lt
YWdlRGVjb2Rlcihjb25zdCBJbnRTaXplJiBwcmVmZXJyZWRJY29uU2l6ZSkKK0lDT0ltYWdlRGVj
b2Rlcjo6SUNPSW1hZ2VEZWNvZGVyKCkKICAgICA6IEltYWdlRGVjb2RlcigpCiAgICAgLCBtX2Fs
bERhdGFSZWNlaXZlZChmYWxzZSkKICAgICAsIG1fZGVjb2RlZE9mZnNldCgwKQotICAgICwgbV9w
cmVmZXJyZWRJY29uU2l6ZShwcmVmZXJyZWRJY29uU2l6ZSkKLSAgICAsIG1faW1hZ2VUeXBlKFVu
a25vd24pCiB7CiB9CiAKK0lDT0ltYWdlRGVjb2Rlcjo6fklDT0ltYWdlRGVjb2RlcigpCit7Cisg
ICAgV1RGOjpkZWxldGVBbGxWYWx1ZXMobV9ibXBSZWFkZXJzKTsKKyAgICBXVEY6OmRlbGV0ZUFs
bFZhbHVlcyhtX3BuZ0RlY29kZXJzKTsKK30KKwogdm9pZCBJQ09JbWFnZURlY29kZXI6OnNldERh
dGEoU2hhcmVkQnVmZmVyKiBkYXRhLCBib29sIGFsbERhdGFSZWNlaXZlZCkKIHsKICAgICBpZiAo
ZmFpbGVkKCkpCkBAIC01OCwxMDkgKzY0LDE3MyBAQCB2b2lkIElDT0ltYWdlRGVjb2Rlcjo6c2V0
RGF0YShTaGFyZWRCdWZmCiAKICAgICBJbWFnZURlY29kZXI6OnNldERhdGEoZGF0YSwgYWxsRGF0
YVJlY2VpdmVkKTsKICAgICBtX2FsbERhdGFSZWNlaXZlZCA9IGFsbERhdGFSZWNlaXZlZDsKLSAg
ICBpZiAobV9ibXBSZWFkZXIpCi0gICAgICAgIG1fYm1wUmVhZGVyLT5zZXREYXRhKGRhdGEpOwot
ICAgIGlmIChtX3BuZ0RlY29kZXIpIHsKLSAgICAgICAgLy8gQ29weSBvdXQgUE5HIGRhdGEgdG8g
YSBzZXBhcmF0ZSB2ZWN0b3IgYW5kIHNlbmQgdG8gdGhlIFBORyBkZWNvZGVyLgotICAgICAgICAv
LyBGSVhNRTogU2F2ZSB0aGlzIGNvcHkgYnkgbWFraW5nIHRoZSBQTkcgZGVjb2RlciBhYmxlIHRv
IHRha2UgYW4KLSAgICAgICAgLy8gb3B0aW9uYWwgb2Zmc2V0LgotICAgICAgICBSZWZQdHI8U2hh
cmVkQnVmZmVyPiBwbmdEYXRhKAotICAgICAgICAgICAgU2hhcmVkQnVmZmVyOjpjcmVhdGUoJm1f
ZGF0YS0+ZGF0YSgpW21fZGlyRW50cnkuZHdJbWFnZU9mZnNldF0sCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBtX2RhdGEtPnNpemUoKSAtIG1fZGlyRW50cnkuZHdJbWFnZU9mZnNl
dCkpOwotICAgICAgICBtX3BuZ0RlY29kZXItPnNldERhdGEocG5nRGF0YS5nZXQoKSwgbV9hbGxE
YXRhUmVjZWl2ZWQpOworCisgICAgZm9yIChCTVBSZWFkZXJzOjppdGVyYXRvciBpKG1fYm1wUmVh
ZGVycy5iZWdpbigpKTsKKyAgICAgICAgIGkgIT0gbV9ibXBSZWFkZXJzLmVuZCgpOyArK2kpIHsK
KyAgICAgICAgaWYgKCppKQorICAgICAgICAgICAgKCppKS0+c2V0RGF0YShkYXRhKTsKICAgICB9
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3BuZ0RlY29kZXJzLnNpemUoKTsgKytpKQor
ICAgICAgICBzZXREYXRhRm9yUE5HRGVjb2RlckF0SW5kZXgoaSk7CiB9CiAKIGJvb2wgSUNPSW1h
Z2VEZWNvZGVyOjppc1NpemVBdmFpbGFibGUoKQogewotICAgIGlmICghSW1hZ2VEZWNvZGVyOjpp
c1NpemVBdmFpbGFibGUoKSAmJiAhZmFpbGVkKCkpCi0gICAgICAgIGRlY29kZVdpdGhDaGVja0Zv
ckRhdGFFbmRlZCh0cnVlKTsKKyAgICBpZiAoIUltYWdlRGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxl
KCkpCisgICAgICAgIGRlY29kZVdpdGhDaGVja0ZvckRhdGFFbmRlZCgwLCB0cnVlKTsKIAotICAg
IHJldHVybiAobV9pbWFnZVR5cGUgPT0gUE5HKSA/Ci0gICAgICAgIG1fcG5nRGVjb2Rlci0+aXNT
aXplQXZhaWxhYmxlKCkgOiBJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpOworICAgIHJl
dHVybiBJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpOwogfQogCiBJbnRTaXplIElDT0lt
YWdlRGVjb2Rlcjo6c2l6ZSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIChtX2ltYWdlVHlwZSA9PSBQ
TkcpID8gbV9wbmdEZWNvZGVyLT5zaXplKCkgOiBJbWFnZURlY29kZXI6OnNpemUoKTsKKyAgICBy
ZXR1cm4gbV9mcmFtZVNpemUuaXNFbXB0eSgpID8gSW1hZ2VEZWNvZGVyOjpzaXplKCkgOiBtX2Zy
YW1lU2l6ZTsKK30KKworSW50U2l6ZSBJQ09JbWFnZURlY29kZXI6OmZyYW1lU2l6ZUF0SW5kZXgo
c2l6ZV90IGluZGV4KSBjb25zdAoreworICAgIHJldHVybiAoaW5kZXggJiYgKGluZGV4IDwgbV9k
aXJFbnRyaWVzLnNpemUoKSkpID8KKyAgICAgICAgbV9kaXJFbnRyaWVzW2luZGV4XS5tX3NpemUg
OiBzaXplKCk7Cit9CisKK2Jvb2wgSUNPSW1hZ2VEZWNvZGVyOjpzZXRTaXplKHVuc2lnbmVkIHdp
ZHRoLCB1bnNpZ25lZCBoZWlnaHQpCit7CisgICAgaWYgKG1fZnJhbWVTaXplLmlzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuIEltYWdlRGVjb2Rlcjo6c2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwor
ICAgIC8vIFRoZSBzaXplIGNhbGN1bGF0ZWQgaW5zaWRlIHRoZSBCTVBJbWFnZVJlYWRlciBoYWQg
YmV0dGVyIG1hdGNoIHRoZSBvbmUgaW4KKyAgICAvLyB0aGUgaWNvbiBkaXJlY3RvcnkuCisgICAg
aWYgKCh3aWR0aCAhPSBtX2ZyYW1lU2l6ZS53aWR0aCgpKSB8fCAoaGVpZ2h0ICE9IG1fZnJhbWVT
aXplLmhlaWdodCgpKSkKKyAgICAgICAgc2V0RmFpbGVkKCk7CisgICAgcmV0dXJuICFmYWlsZWQo
KTsKK30KKworc2l6ZV90IElDT0ltYWdlRGVjb2Rlcjo6ZnJhbWVDb3VudCgpCit7CisgICAgZGVj
b2RlV2l0aENoZWNrRm9yRGF0YUVuZGVkKDAsIHRydWUpOworICAgIGlmIChtX2ZyYW1lQnVmZmVy
Q2FjaGUuaXNFbXB0eSgpKQorICAgICAgICBtX2ZyYW1lQnVmZmVyQ2FjaGUucmVzaXplKG1fZGly
RW50cmllcy5zaXplKCkpOworICAgIC8vIENBVVRJT046IFdlIG11c3Qgbm90IHJlc2l6ZSBtX2Zy
YW1lQnVmZmVyQ2FjaGUgYWdhaW4gYWZ0ZXIgdGhpcywgYXMKKyAgICAvLyBkZWNvZGVBdEluZGV4
KCkgbWF5IGdpdmUgYSBCTVBJbWFnZVJlYWRlciBhIHBvaW50ZXIgdG8gb25lIG9mIHRoZQorICAg
IC8vIGVudHJpZXMuCisgICAgcmV0dXJuIG1fZnJhbWVCdWZmZXJDYWNoZS5zaXplKCk7CiB9CiAK
IFJHQkEzMkJ1ZmZlciogSUNPSW1hZ2VEZWNvZGVyOjpmcmFtZUJ1ZmZlckF0SW5kZXgoc2l6ZV90
IGluZGV4KQogewotICAgIGlmIChpbmRleCkKKyAgICAvLyBFbnN1cmUgfGluZGV4fCBpcyB2YWxp
ZC4KKyAgICBpZiAoaW5kZXggPj0gZnJhbWVDb3VudCgpKQogICAgICAgICByZXR1cm4gMDsKIAot
ICAgIGlmIChtX2ltYWdlVHlwZSA9PSBVbmtub3duKQotICAgICAgICBkZWNvZGVXaXRoQ2hlY2tG
b3JEYXRhRW5kZWQodHJ1ZSk7CisgICAgLy8gRGV0ZXJtaW5lIHRoZSBpbWFnZSB0eXBlLCBhbmQg
aWYgdGhpcyBpcyBhIEJNUCwgZGVjb2RlLgorICAgIGRlY29kZVdpdGhDaGVja0ZvckRhdGFFbmRl
ZChpbmRleCwgZmFsc2UpOwogCi0gICAgaWYgKG1faW1hZ2VUeXBlID09IFBORykgewotICAgICAg
ICBtX2ZyYW1lQnVmZmVyQ2FjaGUuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIG1fcG5nRGVjb2Rl
ci0+ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKyAgICAvLyBQTkdzIGRlY29kZSBpbnRvIHRo
ZWlyIG93biBmcmFtZWJ1ZmZlcnMsIHNvIG9ubHkgdXNlIG91ciBpbnRlcm5hbCBjYWNoZQorICAg
IC8vIGZvciBub24tUE5HcyAoQk1QIG9yIHVua25vd24pLgorICAgIGlmICghbV9wbmdEZWNvZGVy
c1tpbmRleF0pCisgICAgICAgIHJldHVybiAmbV9mcmFtZUJ1ZmZlckNhY2hlW2luZGV4XTsKKwor
ICAgIC8vIEZhaWwgaWYgdGhlIHNpemUgdGhlIFBOR0ltYWdlRGVjb2RlciBjYWxjdWxhdGVkIGRv
ZXMgbm90IG1hdGNoIHRoZSBzaXplCisgICAgLy8gaW4gdGhlIGRpcmVjdG9yeS4KKyAgICBpZiAo
bV9wbmdEZWNvZGVyc1tpbmRleF0tPmlzU2l6ZUF2YWlsYWJsZSgpKSB7CisgICAgICAgIGNvbnN0
IEludFNpemUgcG5nU2l6ZShtX3BuZ0RlY29kZXJzW2luZGV4XS0+c2l6ZSgpKTsKKyAgICAgICAg
Y29uc3QgSWNvbkRpcmVjdG9yeUVudHJ5JiBkaXJFbnRyeSA9IG1fZGlyRW50cmllc1tpbmRleF07
CisgICAgICAgIGlmIChwbmdTaXplICE9IGRpckVudHJ5Lm1fc2l6ZSkgeworICAgICAgICAgICAg
c2V0RmFpbGVkKCk7CisgICAgICAgICAgICBtX3BuZ0RlY29kZXJzW2luZGV4XS0+c2V0RmFpbGVk
KCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobV9mcmFtZUJ1ZmZlckNhY2hlLmlzRW1w
dHkoKSkKLSAgICAgICAgbV9mcmFtZUJ1ZmZlckNhY2hlLnJlc2l6ZSgxKTsKKyAgICByZXR1cm4g
bV9wbmdEZWNvZGVyc1tpbmRleF0tPmZyYW1lQnVmZmVyQXRJbmRleCgwKTsKK30KKworLy8gc3Rh
dGljCitib29sIElDT0ltYWdlRGVjb2Rlcjo6Y29tcGFyZUVudHJpZXMoY29uc3QgSWNvbkRpcmVj
dG9yeUVudHJ5JiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IEljb25EaXJlY3RvcnlFbnRyeSYgYikKK3sKKyAgICAvLyBMYXJnZXIgaWNvbnMgYXJlIGJldHRl
ci4KKyAgICBjb25zdCBpbnQgYUVudHJ5QXJlYSA9IGEubV9zaXplLndpZHRoKCkgKiBhLm1fc2l6
ZS5oZWlnaHQoKTsKKyAgICBjb25zdCBpbnQgYkVudHJ5QXJlYSA9IGIubV9zaXplLndpZHRoKCkg
KiBiLm1fc2l6ZS5oZWlnaHQoKTsKKyAgICBpZiAoYUVudHJ5QXJlYSAhPSBiRW50cnlBcmVhKQor
ICAgICAgICByZXR1cm4gKGFFbnRyeUFyZWEgPiBiRW50cnlBcmVhKTsKKworICAgIC8vIEhpZ2hl
ciBiaXQtZGVwdGggaWNvbnMgYXJlIGJldHRlci4KKyAgICByZXR1cm4gKGEubV9iaXRDb3VudCA+
IGIubV9iaXRDb3VudCk7Cit9CisKK3ZvaWQgSUNPSW1hZ2VEZWNvZGVyOjpzZXREYXRhRm9yUE5H
RGVjb2RlckF0SW5kZXgoc2l6ZV90IGluZGV4KQoreworICAgIGlmICghbV9wbmdEZWNvZGVyc1tp
bmRleF0pCisgICAgICAgIHJldHVybjsKIAotICAgIFJHQkEzMkJ1ZmZlciogYnVmZmVyID0gJm1f
ZnJhbWVCdWZmZXJDYWNoZS5maXJzdCgpOwotICAgIGlmIChidWZmZXItPnN0YXR1cygpICE9IFJH
QkEzMkJ1ZmZlcjo6RnJhbWVDb21wbGV0ZSAmJiAobV9pbWFnZVR5cGUgPT0gQk1QKQotICAgICAg
ICAmJiAhZmFpbGVkKCkpCi0gICAgICAgIGRlY29kZVdpdGhDaGVja0ZvckRhdGFFbmRlZChmYWxz
ZSk7Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICBjb25zdCBJY29uRGlyZWN0b3J5RW50cnkmIGRp
ckVudHJ5ID0gbV9kaXJFbnRyaWVzW2luZGV4XTsKKyAgICAvLyBDb3B5IG91dCBQTkcgZGF0YSB0
byBhIHNlcGFyYXRlIHZlY3RvciBhbmQgc2VuZCB0byB0aGUgUE5HIGRlY29kZXIuCisgICAgLy8g
RklYTUU6IFNhdmUgdGhpcyBjb3B5IGJ5IG1ha2luZyB0aGUgUE5HIGRlY29kZXIgYWJsZSB0byB0
YWtlIGFuCisgICAgLy8gb3B0aW9uYWwgb2Zmc2V0LgorICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+
IHBuZ0RhdGEoCisgICAgICAgIFNoYXJlZEJ1ZmZlcjo6Y3JlYXRlKCZtX2RhdGEtPmRhdGEoKVtk
aXJFbnRyeS5tX2ltYWdlT2Zmc2V0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9k
YXRhLT5zaXplKCkgLSBkaXJFbnRyeS5tX2ltYWdlT2Zmc2V0KSk7CisgICAgbV9wbmdEZWNvZGVy
c1tpbmRleF0tPnNldERhdGEocG5nRGF0YS5nZXQoKSwgbV9hbGxEYXRhUmVjZWl2ZWQpOwogfQog
Ci12b2lkIElDT0ltYWdlRGVjb2Rlcjo6ZGVjb2RlV2l0aENoZWNrRm9yRGF0YUVuZGVkKGJvb2wg
b25seVNpemUpCit2b2lkIElDT0ltYWdlRGVjb2Rlcjo6ZGVjb2RlV2l0aENoZWNrRm9yRGF0YUVu
ZGVkKHNpemVfdCBpbmRleCwgYm9vbCBvbmx5U2l6ZSkKIHsKICAgICBpZiAoZmFpbGVkKCkpCiAg
ICAgICAgIHJldHVybjsKIAogICAgIC8vIElmIHdlIGNvdWxkbid0IGRlY29kZSB0aGUgaW1hZ2Ug
YnV0IHdlJ3ZlIHJlY2VpdmVkIGFsbCB0aGUgZGF0YSwgZGVjb2RpbmcKICAgICAvLyBoYXMgZmFp
bGVkLgotICAgIGlmICghZGVjb2RlKG9ubHlTaXplKSAmJiBtX2FsbERhdGFSZWNlaXZlZCkKKyAg
ICBpZiAoKCFkZWNvZGVEaXJlY3RvcnkoKSB8fCAoIW9ubHlTaXplICYmICFkZWNvZGVBdEluZGV4
KGluZGV4KSkpCisgICAgICAgICYmIG1fYWxsRGF0YVJlY2VpdmVkKQogICAgICAgICBzZXRGYWls
ZWQoKTsKIH0KIAotYm9vbCBJQ09JbWFnZURlY29kZXI6OmRlY29kZShib29sIG9ubHlTaXplKQor
Ym9vbCBJQ09JbWFnZURlY29kZXI6OmRlY29kZURpcmVjdG9yeSgpCiB7CiAgICAgLy8gUmVhZCBh
bmQgcHJvY2VzcyBkaXJlY3RvcnkuCiAgICAgaWYgKChtX2RlY29kZWRPZmZzZXQgPCBzaXplT2ZE
aXJlY3RvcnkpICYmICFwcm9jZXNzRGlyZWN0b3J5KCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsK
IAogICAgIC8vIFJlYWQgYW5kIHByb2Nlc3MgZGlyZWN0b3J5IGVudHJpZXMuCi0gICAgaWYgKCht
X2RlY29kZWRPZmZzZXQgPAotICAgICAgICAgICAgKHNpemVPZkRpcmVjdG9yeSArIChtX2RpcmVj
dG9yeS5pZENvdW50ICogc2l6ZU9mRGlyRW50cnkpKSkKLSAgICAgICAgJiYgIXByb2Nlc3NEaXJl
Y3RvcnlFbnRyaWVzKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIEdldCB0aGUg
aW1hZ2UgdHlwZS4KLSAgICBpZiAoKG1faW1hZ2VUeXBlID09IFVua25vd24pICYmICFwcm9jZXNz
SW1hZ2VUeXBlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gKG1fZGVjb2Rl
ZE9mZnNldCA+PQorICAgICAgICAgICAgKHNpemVPZkRpcmVjdG9yeSArIChtX2RpckVudHJpZXMu
c2l6ZSgpICogc2l6ZU9mRGlyRW50cnkpKSkKKyAgICAgICAgfHwgcHJvY2Vzc0RpcmVjdG9yeUVu
dHJpZXMoKTsKK30KKworYm9vbCBJQ09JbWFnZURlY29kZXI6OmRlY29kZUF0SW5kZXgoc2l6ZV90
IGluZGV4KQoreworICAgIEFTU0VSVChpbmRleCA8IG1fZGlyRW50cmllcy5zaXplKCkpOworICAg
IGNvbnN0IEljb25EaXJlY3RvcnlFbnRyeSYgZGlyRW50cnkgPSBtX2RpckVudHJpZXNbaW5kZXhd
OworICAgIGlmICghbV9ibXBSZWFkZXJzW2luZGV4XSAmJiAhbV9wbmdEZWNvZGVyc1tpbmRleF0p
IHsKKyAgICAgICAgLy8gSW1hZ2UgdHlwZSB1bmtub3duLgorICAgICAgICBjb25zdCBJbWFnZVR5
cGUgaW1hZ2VUeXBlID0gaW1hZ2VUeXBlQXRJbmRleChpbmRleCk7CisgICAgICAgIGlmIChpbWFn
ZVR5cGUgPT0gQk1QKSB7CisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGhhdmUgYWxyZWFkeSBz
aXplZCBtX2ZyYW1lQnVmZmVyQ2FjaGUgYmVmb3JlIHRoaXMsIGFuZAorICAgICAgICAgICAgLy8g
d2UgbXVzdCBub3QgcmVzaXplIGl0IGFnYWluIGxhdGVyIChzZWUgY2F1dGlvbiBpbiBmcmFtZUNv
dW50KCkpLgorICAgICAgICAgICAgQVNTRVJUKG1fZnJhbWVCdWZmZXJDYWNoZS5zaXplKCkgPT0g
bV9kaXJFbnRyaWVzLnNpemUoKSk7CisgICAgICAgICAgICBtX2JtcFJlYWRlcnNbaW5kZXhdID0K
KyAgICAgICAgICAgICAgICBuZXcgQk1QSW1hZ2VSZWFkZXIodGhpcywgZGlyRW50cnkubV9pbWFn
ZU9mZnNldCwgMCwgdHJ1ZSk7CisgICAgICAgICAgICBtX2JtcFJlYWRlcnNbaW5kZXhdLT5zZXRE
YXRhKG1fZGF0YS5nZXQoKSk7CisgICAgICAgICAgICBtX2JtcFJlYWRlcnNbaW5kZXhdLT5zZXRC
dWZmZXIoJm1fZnJhbWVCdWZmZXJDYWNoZVtpbmRleF0pOworICAgICAgICB9IGVsc2UgaWYgKGlt
YWdlVHlwZSA9PSBQTkcpIHsKKyAgICAgICAgICAgIG1fcG5nRGVjb2RlcnNbaW5kZXhdID0gbmV3
IFBOR0ltYWdlRGVjb2RlcigpOworICAgICAgICAgICAgc2V0RGF0YUZvclBOR0RlY29kZXJBdElu
ZGV4KGluZGV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vdCBlbm91Z2gg
ZGF0YSB0byBkZXRlcm1pbmUgaW1hZ2UgdHlwZSB5ZXQuCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAvLyBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGlt
YWdlIGRlY29kZXIgaWYgbmVlZCBiZS4KLSAgICBpZiAoKG1faW1hZ2VUeXBlID09IFBORykgPyAh
bV9wbmdEZWNvZGVyIDogIW1fYm1wUmVhZGVyKSB7Ci0gICAgICAgIGlmIChtX2ltYWdlVHlwZSA9
PSBQTkcpCi0gICAgICAgICAgICBtX3BuZ0RlY29kZXIuc2V0KG5ldyBQTkdJbWFnZURlY29kZXIo
KSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1fYm1wUmVhZGVyLnNldChuZXcgQk1QSW1h
Z2VSZWFkZXIodGhpcywgbV9kZWNvZGVkT2Zmc2V0LCAwLCB0cnVlKSk7Ci0KLSAgICAgICAgLy8g
Tm90ZSB0aGF0IHdlIGRvbid0IHRyeSB0byBsaW1pdCB0aGUgYnl0ZXMgd2UgZ2l2ZSB0byB0aGUg
ZGVjb2RlciB0bwotICAgICAgICAvLyBqdXN0IHRoZSBzaXplIHNwZWNpZmllZCBpbiB0aGUgaWNv
biBkaXJlY3RvcnkuICBJZiB0aGUgc2l6ZSBnaXZlbiBpbgotICAgICAgICAvLyB0aGUgZGlyZWN0
b3J5IGlzIGluc3VmZmljaWVudCB0byBkZWNvZGUgdGhlIHdob2xlIGltYWdlLCB0aGUgaW1hZ2Ug
aXMKLSAgICAgICAgLy8gY29ycnVwdCBhbnl3YXksIHNvIHdoYXRldmVyIHdlIGRvIG1heSBiZSB3
cm9uZy4gIFRoZSBlYXNpZXN0IGNob2ljZQotICAgICAgICAvLyAod2hpY2ggd2UgZG8gaGVyZSkg
aXMgdG8gc2ltcGx5IGFnZ3Jlc3NpdmVseSBjb25zdW1lIGJ5dGVzIHVudGlsIHdlCi0gICAgICAg
IC8vIHJ1biBvdXQgb2YgYnl0ZXMsIGZpbmlzaCBkZWNvZGluZywgb3IgaGl0IGEgc2VxdWVuY2Ug
dGhhdCBtYWtlcyB0aGUKLSAgICAgICAgLy8gZGVjb2RlciBmYWlsLgotICAgICAgICBzZXREYXRh
KG1fZGF0YS5nZXQoKSwgbV9hbGxEYXRhUmVjZWl2ZWQpOworICAgIGlmIChtX2JtcFJlYWRlcnNb
aW5kZXhdKSB7CisgICAgICAgIG1fZnJhbWVTaXplID0gZGlyRW50cnkubV9zaXplOworICAgICAg
ICBib29sIHJlc3VsdCA9IG1fYm1wUmVhZGVyc1tpbmRleF0tPmRlY29kZUJNUChmYWxzZSk7Cisg
ICAgICAgIG1fZnJhbWVTaXplID0gSW50U2l6ZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0Owog
ICAgIH0KIAogICAgIC8vIEZvciBQTkdzLCB3ZSdyZSBub3cgZG9uZTsgZnVydGhlciBkZWNvZGlu
ZyB3aWxsIGhhcHBlbiB3aGVuIGNhbGxpbmcKLSAgICAvLyBpc1NpemVBdmFpbGFibGUoKSBvciBm
cmFtZUJ1ZmZlckF0SW5kZXgoKSBvbiB0aGUgUE5HIGRlY29kZXIuCi0gICAgaWYgKG1faW1hZ2VU
eXBlID09IFBORykKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAoIW1fZnJhbWVCdWZm
ZXJDYWNoZS5pc0VtcHR5KCkpCi0gICAgICAgIG1fYm1wUmVhZGVyLT5zZXRCdWZmZXIoJm1fZnJh
bWVCdWZmZXJDYWNoZS5maXJzdCgpKTsKLQotICAgIHJldHVybiBtX2JtcFJlYWRlci0+ZGVjb2Rl
Qk1QKG9ubHlTaXplKTsKKyAgICAvLyBmcmFtZUJ1ZmZlckF0SW5kZXgoKSBvbiB0aGUgUE5HIGRl
Y29kZXIuCisgICAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgSUNPSW1hZ2VEZWNvZGVyOjpwcm9j
ZXNzRGlyZWN0b3J5KCkKQEAgLTE3MCw3ICsyNDAsNyBAQCBib29sIElDT0ltYWdlRGVjb2Rlcjo6
cHJvY2Vzc0RpcmVjdG9yeSgpCiAgICAgaWYgKG1fZGF0YS0+c2l6ZSgpIDwgc2l6ZU9mRGlyZWN0
b3J5KQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgY29uc3QgdWludDE2X3QgZmlsZVR5cGUg
PSByZWFkVWludDE2KDIpOwotICAgIG1fZGlyZWN0b3J5LmlkQ291bnQgPSByZWFkVWludDE2KDQp
OworICAgIGNvbnN0IHVpbnQxNl90IGlkQ291bnQgPSByZWFkVWludDE2KDQpOwogICAgIG1fZGVj
b2RlZE9mZnNldCA9IHNpemVPZkRpcmVjdG9yeTsKIAogICAgIC8vIFNlZSBpZiB0aGlzIGlzIGFu
IGljb24gZmlsZXR5cGUgd2UgdW5kZXJzdGFuZCwgYW5kIG1ha2Ugc3VyZSB3ZSBoYXZlIGF0CkBA
IC0xNzksMTEgKzI0OSwxOSBAQCBib29sIElDT0ltYWdlRGVjb2Rlcjo6cHJvY2Vzc0RpcmVjdG9y
eSgpCiAgICAgICAgIElDT04gPSAxLAogICAgICAgICBDVVJTT1IgPSAyLAogICAgIH07Ci0gICAg
aWYgKCgoZmlsZVR5cGUgIT0gSUNPTikgJiYgKGZpbGVUeXBlICE9IENVUlNPUikpIHx8Ci0gICAg
ICAgICAgICAobV9kaXJlY3RvcnkuaWRDb3VudCA9PSAwKSkKKyAgICBpZiAoKChmaWxlVHlwZSAh
PSBJQ09OKSAmJiAoZmlsZVR5cGUgIT0gQ1VSU09SKSkgfHwgKGlkQ291bnQgPT0gMCkpIHsKICAg
ICAgICAgc2V0RmFpbGVkKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLSAgICBy
ZXR1cm4gIWZhaWxlZCgpOworICAgIC8vIEVubGFyZ2UgbWVtYmVyIHZlY3RvcnMgdG8gaG9sZCBh
bGwgdGhlIGVudHJpZXMuICBXZSBtdXN0IGluaXRpYWxpemUgdGhlCisgICAgLy8gQk1QIGFuZCBQ
TkcgZGVjb2RpbmcgdmVjdG9ycyB0byAwIHNvIHRoYXQgYWxsIGVudHJpZXMgY2FuIGJlIHNhZmVs
eQorICAgIC8vIGRlbGV0ZWQgaW4gb3VyIGRlc3RydWN0b3IuICBJZiB3ZSBkb24ndCBkbyB0aGlz
LCB0aGV5J2xsIGNvbnRhaW4gZ2FyYmFnZQorICAgIC8vIHZhbHVlcywgYW5kIGRlbGV0aW5nIHRo
b3NlIHdpbGwgY29ycnVwdCBtZW1vcnkuCisgICAgbV9kaXJFbnRyaWVzLnJlc2l6ZShpZENvdW50
KTsKKyAgICBtX2JtcFJlYWRlcnMuZmlsbChOVUxMLCBpZENvdW50KTsKKyAgICBtX3BuZ0RlY29k
ZXJzLmZpbGwoTlVMTCwgaWRDb3VudCk7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgSUNP
SW1hZ2VEZWNvZGVyOjpwcm9jZXNzRGlyZWN0b3J5RW50cmllcygpCkBAIC0xOTIsMjYgKzI3MCwy
OCBAQCBib29sIElDT0ltYWdlRGVjb2Rlcjo6cHJvY2Vzc0RpcmVjdG9yeUVuCiAgICAgQVNTRVJU
KG1fZGVjb2RlZE9mZnNldCA9PSBzaXplT2ZEaXJlY3RvcnkpOwogICAgIGlmICgobV9kZWNvZGVk
T2Zmc2V0ID4gbV9kYXRhLT5zaXplKCkpCiAgICAgICAgIHx8ICgobV9kYXRhLT5zaXplKCkgLSBt
X2RlY29kZWRPZmZzZXQpIDwKLSAgICAgICAgICAgIChtX2RpcmVjdG9yeS5pZENvdW50ICogc2l6
ZU9mRGlyRW50cnkpKSkKKyAgICAgICAgICAgIChtX2RpckVudHJpZXMuc2l6ZSgpICogc2l6ZU9m
RGlyRW50cnkpKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgbV9kaXJlY3RvcnkuaWRDb3VudDsgKytpKSB7Ci0gICAgICAgIGNvbnN0IEljb25EaXJlY3Rv
cnlFbnRyeSBkaXJFbnRyeSA9IHJlYWREaXJlY3RvcnlFbnRyeSgpOwotICAgICAgICBpZiAoKGkg
PT0gMCkgfHwgaXNCZXR0ZXJFbnRyeShkaXJFbnRyeSkpCi0gICAgICAgICAgICBtX2RpckVudHJ5
ID0gZGlyRW50cnk7CisgICAgZm9yIChJY29uRGlyZWN0b3J5RW50cmllczo6aXRlcmF0b3IgaSht
X2RpckVudHJpZXMuYmVnaW4oKSk7CisgICAgICAgICBpICE9IG1fZGlyRW50cmllcy5lbmQoKTsg
KytpKQorICAgICAgICAqaSA9IHJlYWREaXJlY3RvcnlFbnRyeSgpOyAgLy8gVXBkYXRlcyBtX2Rl
Y29kZWRPZmZzZXQuCisKKyAgICAvLyBNYWtlIHN1cmUgdGhlIHNwZWNpZmllZCBpbWFnZSBvZmZz
ZXRzIGFyZSBwYXN0IHRoZSBlbmQgb2YgdGhlIGRpcmVjdG9yeQorICAgIC8vIGVudHJpZXMuCisg
ICAgZm9yIChJY29uRGlyZWN0b3J5RW50cmllczo6aXRlcmF0b3IgaShtX2RpckVudHJpZXMuYmVn
aW4oKSk7CisgICAgICAgICBpICE9IG1fZGlyRW50cmllcy5lbmQoKTsgKytpKSB7CisgICAgICAg
IGlmIChpLT5tX2ltYWdlT2Zmc2V0IDwgbV9kZWNvZGVkT2Zmc2V0KSB7CisgICAgICAgICAgICBz
ZXRGYWlsZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgIH0K
IAotICAgIC8vIE1ha2Ugc3VyZSB0aGUgc3BlY2lmaWVkIGltYWdlIG9mZnNldCBpcyBwYXN0IHRo
ZSBlbmQgb2YgdGhlIGRpcmVjdG9yeQotICAgIC8vIGVudHJpZXMsIGFuZCB0aGF0IHRoZSBvZmZz
ZXQgaXNuJ3Qgc28gbGFyZ2UgdGhhdCBpdCBvdmVyZmxvd3Mgd2hlbiB3ZSBhZGQKLSAgICAvLyA0
IGJ5dGVzIHRvIGl0ICh3aGljaCB3ZSBkbyBpbiBkZWNvZGVJbWFnZSgpIHdoaWxlIGVuc3VyaW5n
IGl0J3Mgc2FmZSB0bwotICAgIC8vIGV4YW1pbmUgdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIGlt
YWdlIGRhdGEpLgotICAgIGlmICgobV9kaXJFbnRyeS5kd0ltYWdlT2Zmc2V0IDwgbV9kZWNvZGVk
T2Zmc2V0KSB8fAotICAgICAgICAgICAgKChtX2RpckVudHJ5LmR3SW1hZ2VPZmZzZXQgKyA0KSA8
IG1fZGlyRW50cnkuZHdJbWFnZU9mZnNldCkpIHsKLSAgICAgIHNldEZhaWxlZCgpOwotICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICAvLyBBcnJhbmdlIGZyYW1lcyBpbiBkZWNyZWFzaW5n
IHF1YWxpdHkgb3JkZXIuCisgICAgc3RkOjpzb3J0KG1fZGlyRW50cmllcy5iZWdpbigpLCBtX2Rp
ckVudHJpZXMuZW5kKCksIGNvbXBhcmVFbnRyaWVzKTsKIAotICAgIC8vIFJlYWR5IHRvIGRlY29k
ZSB0aGUgaW1hZ2UgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuCi0gICAgbV9kZWNvZGVkT2Zmc2V0
ID0gbV9kaXJFbnRyeS5kd0ltYWdlT2Zmc2V0OworICAgIC8vIFRoZSBpbWFnZSBzaXplIGlzIHRo
ZSBzaXplIG9mIHRoZSBsYXJnZXN0IGVudHJ5LgorICAgIGNvbnN0IEljb25EaXJlY3RvcnlFbnRy
eSYgZGlyRW50cnkgPSBtX2RpckVudHJpZXMuZmlyc3QoKTsKKyAgICBzZXRTaXplKGRpckVudHJ5
Lm1fc2l6ZS53aWR0aCgpLCBkaXJFbnRyeS5tX3NpemUuaGVpZ2h0KCkpOwogICAgIHJldHVybiB0
cnVlOwogfQogCkBAIC0yMTksMjQgKzI5OSwyNSBAQCBJQ09JbWFnZURlY29kZXI6Okljb25EaXJl
Y3RvcnlFbnRyeSBJQ09JCiB7CiAgICAgLy8gUmVhZCBpY29uIGRhdGEuCiAgICAgSWNvbkRpcmVj
dG9yeUVudHJ5IGVudHJ5OwotICAgIGVudHJ5LmJXaWR0aCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+
KG1fZGF0YS0+ZGF0YSgpW21fZGVjb2RlZE9mZnNldF0pOwotICAgIGlmIChlbnRyeS5iV2lkdGgg
PT0gMCkKLSAgICAgICAgZW50cnkuYldpZHRoID0gMjU2OwotICAgIGVudHJ5LmJIZWlnaHQgPSBz
dGF0aWNfY2FzdDx1aW50OF90PihtX2RhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXQgKyAxXSk7
Ci0gICAgaWYgKGVudHJ5LmJIZWlnaHQgPT0gMCkKLSAgICAgICAgZW50cnkuYkhlaWdodCA9IDI1
NjsKLSAgICBlbnRyeS53Qml0Q291bnQgPSByZWFkVWludDE2KDYpOwotICAgIGVudHJ5LmR3SW1h
Z2VPZmZzZXQgPSByZWFkVWludDMyKDEyKTsKKyAgICBpbnQgd2lkdGggPSBzdGF0aWNfY2FzdDx1
aW50OF90PihtX2RhdGEtPmRhdGEoKVttX2RlY29kZWRPZmZzZXRdKTsKKyAgICBpZiAod2lkdGgg
PT0gMCkKKyAgICAgICAgd2lkdGggPSAyNTY7CisgICAgaW50IGhlaWdodCA9IHN0YXRpY19jYXN0
PHVpbnQ4X3Q+KG1fZGF0YS0+ZGF0YSgpW21fZGVjb2RlZE9mZnNldCArIDFdKTsKKyAgICBpZiAo
aGVpZ2h0ID09IDApCisgICAgICAgIGhlaWdodCA9IDI1NjsKKyAgICBlbnRyeS5tX3NpemUgPSBJ
bnRTaXplKHdpZHRoLCBoZWlnaHQpOworICAgIGVudHJ5Lm1fYml0Q291bnQgPSByZWFkVWludDE2
KDYpOworICAgIGVudHJ5Lm1faW1hZ2VPZmZzZXQgPSByZWFkVWludDMyKDEyKTsKIAogICAgIC8v
IFNvbWUgaWNvbnMgZG9uJ3QgaGF2ZSBhIGJpdCBkZXB0aCwgb25seSBhIGNvbG9yIGNvdW50LiAg
Q29udmVydCB0aGUKICAgICAvLyBjb2xvciBjb3VudCB0byB0aGUgbWluaW11bSBuZWNlc3Nhcnkg
Yml0IGRlcHRoLiAgSXQgZG9lc24ndCBtYXR0ZXIgaWYKICAgICAvLyB0aGlzIGlzbid0IHF1aXRl
IHdoYXQgdGhlIGJpdG1hcCBpbmZvIGhlYWRlciBzYXlzIGxhdGVyLCBhcyB3ZSBvbmx5IHVzZQog
ICAgIC8vIHRoaXMgdmFsdWUgdG8gZGV0ZXJtaW5lIHdoaWNoIGljb24gZW50cnkgaXMgYmVzdC4K
LSAgICBpZiAoIWVudHJ5LndCaXRDb3VudCkgeworICAgIGlmICghZW50cnkubV9iaXRDb3VudCkg
ewogICAgICAgICB1aW50OF90IGNvbG9yQ291bnQgPSBtX2RhdGEtPmRhdGEoKVttX2RlY29kZWRP
ZmZzZXQgKyAyXTsKICAgICAgICAgaWYgKGNvbG9yQ291bnQpIHsKICAgICAgICAgICAgIGZvciAo
LS1jb2xvckNvdW50OyBjb2xvckNvdW50OyBjb2xvckNvdW50ID4+PSAxKQotICAgICAgICAgICAg
ICAgICsrZW50cnkud0JpdENvdW50OworICAgICAgICAgICAgICAgICsrZW50cnkubV9iaXRDb3Vu
dDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjQ0LDQ3ICszMjUsMTUgQEAgSUNPSW1hZ2VEZWNv
ZGVyOjpJY29uRGlyZWN0b3J5RW50cnkgSUNPSQogICAgIHJldHVybiBlbnRyeTsKIH0KIAotYm9v
bCBJQ09JbWFnZURlY29kZXI6OmlzQmV0dGVyRW50cnkoY29uc3QgSWNvbkRpcmVjdG9yeUVudHJ5
JiBlbnRyeSkgY29uc3QKLXsKLSAgICBjb25zdCBJbnRTaXplIGVudHJ5U2l6ZShlbnRyeS5iV2lk
dGgsIGVudHJ5LmJIZWlnaHQpOwotICAgIGNvbnN0IEludFNpemUgZGlyRW50cnlTaXplKG1fZGly
RW50cnkuYldpZHRoLCBtX2RpckVudHJ5LmJIZWlnaHQpOwotICAgIGNvbnN0IGludCBlbnRyeUFy
ZWEgPSBlbnRyeS5iV2lkdGggKiBlbnRyeS5iSGVpZ2h0OwotICAgIGNvbnN0IGludCBkaXJFbnRy
eUFyZWEgPSBtX2RpckVudHJ5LmJXaWR0aCAqIG1fZGlyRW50cnkuYkhlaWdodDsKLQotICAgIGlm
ICgoZW50cnlTaXplICE9IGRpckVudHJ5U2l6ZSkgJiYgIW1fcHJlZmVycmVkSWNvblNpemUuaXNF
bXB0eSgpKSB7Ci0gICAgICAgIC8vIEFuIGljb24gb2YgZXhhY3RseSB0aGUgcHJlZmVycmVkIHNp
emUgaXMgYmVzdC4KLSAgICAgICAgaWYgKGVudHJ5U2l6ZSA9PSBtX3ByZWZlcnJlZEljb25TaXpl
KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChkaXJFbnRyeVNpemUgPT0g
bV9wcmVmZXJyZWRJY29uU2l6ZSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAg
ICAvLyBUaGUgaWNvbiBjbG9zZXN0IHRvIHRoZSBwcmVmZXJyZWQgYXJlYSB3aXRob3V0IGJlaW5n
IHNtYWxsZXIgaXMKLSAgICAgICAgLy8gYmV0dGVyLgotICAgICAgICBpZiAoZW50cnlBcmVhICE9
IGRpckVudHJ5QXJlYSkgewotICAgICAgICAgICAgcmV0dXJuIChlbnRyeUFyZWEgPCBkaXJFbnRy
eUFyZWEpICYmIChlbnRyeUFyZWEgPj0KLSAgICAgICAgICAgICAgICAobV9wcmVmZXJyZWRJY29u
U2l6ZS53aWR0aCgpICogbV9wcmVmZXJyZWRJY29uU2l6ZS5oZWlnaHQoKSkpOwotICAgICAgICB9
Ci0gICAgfQotCi0gICAgLy8gTGFyZ2VyIGljb25zIGFyZSBiZXR0ZXIuCi0gICAgaWYgKGVudHJ5
QXJlYSAhPSBkaXJFbnRyeUFyZWEpCi0gICAgICAgIHJldHVybiAoZW50cnlBcmVhID4gZGlyRW50
cnlBcmVhKTsKLQotICAgIC8vIEhpZ2hlciBiaXQtZGVwdGggaWNvbnMgYXJlIGJldHRlci4KLSAg
ICByZXR1cm4gKGVudHJ5LndCaXRDb3VudCA+IG1fZGlyRW50cnkud0JpdENvdW50KTsKLX0KLQot
Ym9vbCBJQ09JbWFnZURlY29kZXI6OnByb2Nlc3NJbWFnZVR5cGUoKQorSUNPSW1hZ2VEZWNvZGVy
OjpJbWFnZVR5cGUgSUNPSW1hZ2VEZWNvZGVyOjppbWFnZVR5cGVBdEluZGV4KHNpemVfdCBpbmRl
eCkKIHsKICAgICAvLyBDaGVjayBpZiB0aGlzIGVudHJ5IGlzIGEgQk1QIG9yIGEgUE5HOyB3ZSBu
ZWVkIDQgYnl0ZXMgdG8gY2hlY2sgdGhlIG1hZ2ljCiAgICAgLy8gbnVtYmVyLgotICAgIEFTU0VS
VChtX2RlY29kZWRPZmZzZXQgPT0gbV9kaXJFbnRyeS5kd0ltYWdlT2Zmc2V0KTsKLSAgICBpZiAo
KG1fZGVjb2RlZE9mZnNldCA+IG1fZGF0YS0+c2l6ZSgpKQotICAgICAgICB8fCAoKG1fZGF0YS0+
c2l6ZSgpIC0gbV9kZWNvZGVkT2Zmc2V0KSA8IDQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgbV9pbWFnZVR5cGUgPQotICAgICAgICBzdHJuY21wKCZtX2RhdGEtPmRhdGEoKVttX2RlY29k
ZWRPZmZzZXRdLCAiXHg4OVBORyIsIDQpID8gQk1QIDogUE5HOwotICAgIHJldHVybiB0cnVlOwor
ICAgIEFTU0VSVChpbmRleCA8IG1fZGlyRW50cmllcy5zaXplKCkpOworICAgIGNvbnN0IHVpbnQz
Ml90IGltYWdlT2Zmc2V0ID0gbV9kaXJFbnRyaWVzW2luZGV4XS5tX2ltYWdlT2Zmc2V0OworICAg
IGlmICgoaW1hZ2VPZmZzZXQgPiBtX2RhdGEtPnNpemUoKSkgfHwgKChtX2RhdGEtPnNpemUoKSAt
IGltYWdlT2Zmc2V0KSA8IDQpKQorICAgICAgICByZXR1cm4gVW5rbm93bjsKKyAgICByZXR1cm4g
c3RybmNtcCgmbV9kYXRhLT5kYXRhKClbaW1hZ2VPZmZzZXRdLCAiXHg4OVBORyIsIDQpID8gQk1Q
IDogUE5HOwogfQogCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2lj
by9JQ09JbWFnZURlY29kZXIuaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vaW1h
Z2UtZGVjb2RlcnMvaWNvL0lDT0ltYWdlRGVjb2Rlci5oCShyZXZpc2lvbiA0NjgwNCkKKysrIFdl
YkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvaWNvL0lDT0ltYWdlRGVjb2Rlci5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC00MCwxNSArNDAsMTggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIC8v
IFRoaXMgY2xhc3MgZGVjb2RlcyB0aGUgSUNPIGFuZCBDVVIgaW1hZ2UgZm9ybWF0cy4KICAgICBj
bGFzcyBJQ09JbWFnZURlY29kZXIgOiBwdWJsaWMgSW1hZ2VEZWNvZGVyIHsKICAgICBwdWJsaWM6
Ci0gICAgICAgIC8vIFNlZSBjb21tZW50cyBvbiB8bV9wcmVmZXJyZWRJY29uU2l6ZXwgYmVsb3cu
Ci0gICAgICAgIElDT0ltYWdlRGVjb2Rlcihjb25zdCBJbnRTaXplJiBwcmVmZXJyZWRJY29uU2l6
ZSk7CisgICAgICAgIElDT0ltYWdlRGVjb2RlcigpOworICAgICAgICB+SUNPSW1hZ2VEZWNvZGVy
KCk7CiAKICAgICAgICAgLy8gSW1hZ2VEZWNvZGVyCiAgICAgICAgIHZpcnR1YWwgU3RyaW5nIGZp
bGVuYW1lRXh0ZW5zaW9uKCkgY29uc3QgeyByZXR1cm4gImljbyI7IH0KICAgICAgICAgdmlydHVh
bCB2b2lkIHNldERhdGEoU2hhcmVkQnVmZmVyKiwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpOwogICAg
ICAgICB2aXJ0dWFsIGJvb2wgaXNTaXplQXZhaWxhYmxlKCk7CiAgICAgICAgIHZpcnR1YWwgSW50
U2l6ZSBzaXplKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgUkdCQTMyQnVmZmVyKiBmcmFtZUJ1
ZmZlckF0SW5kZXgoc2l6ZV90IGluZGV4KTsKKyAgICAgICAgdmlydHVhbCBJbnRTaXplIGZyYW1l
U2l6ZUF0SW5kZXgoc2l6ZV90KSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBib29sIHNldFNpemUo
dW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCk7CisgICAgICAgIHZpcnR1YWwgc2l6ZV90
IGZyYW1lQ291bnQoKTsKKyAgICAgICAgdmlydHVhbCBSR0JBMzJCdWZmZXIqIGZyYW1lQnVmZmVy
QXRJbmRleChzaXplX3QpOwogCiAgICAgcHJpdmF0ZToKICAgICAgICAgZW51bSBJbWFnZVR5cGUg
ewpAQCAtNTcsMTggKzYwLDE3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgICAgIFBO
RywKICAgICAgICAgfTsKIAotICAgICAgICAvLyBUaGVzZSBhcmUgYmFzZWQgb24gdGhlIFdpbmRv
d3MgSUNPTkRJUiBhbmQgSUNPTkRJUkVOVFJZIHN0cnVjdHMsIGJ1dAotICAgICAgICAvLyB3aXRo
IHVubmVjZXNzYXJ5IGVudHJpZXMgcmVtb3ZlZC4KLSAgICAgICAgc3RydWN0IEljb25EaXJlY3Rv
cnkgewotICAgICAgICAgICAgdWludDE2X3QgaWRDb3VudDsKLSAgICAgICAgfTsKICAgICAgICAg
c3RydWN0IEljb25EaXJlY3RvcnlFbnRyeSB7Ci0gICAgICAgICAgICB1aW50MTZfdCBiV2lkdGg7
ICAgLy8gMTYgYml0cyBzbyB3ZSBjYW4gcmVwcmVzZW50IDI1NiBhcyAyNTYsIG5vdCAwCi0gICAg
ICAgICAgICB1aW50MTZfdCBiSGVpZ2h0OyAgLy8gIgotICAgICAgICAgICAgdWludDE2X3Qgd0Jp
dENvdW50OwotICAgICAgICAgICAgdWludDMyX3QgZHdJbWFnZU9mZnNldDsKKyAgICAgICAgICAg
IEludFNpemUgbV9zaXplOworICAgICAgICAgICAgdWludDE2X3QgbV9iaXRDb3VudDsKKyAgICAg
ICAgICAgIHVpbnQzMl90IG1faW1hZ2VPZmZzZXQ7CiAgICAgICAgIH07CiAKKyAgICAgICAgLy8g
UmV0dXJucyB0cnVlIGlmIHxhfCBpcyBhIHByZWZlcmFibGUgaWNvbiBlbnRyeSB0byB8YnwuCisg
ICAgICAgIC8vIExhcmdlciBzaXplcywgb3IgZ3JlYXRlciBiaXRkZXB0aHMgYXQgdGhlIHNhbWUg
c2l6ZSwgYXJlIHByZWZlcmFibGUuCisgICAgICAgIHN0YXRpYyBib29sIGNvbXBhcmVFbnRyaWVz
KGNvbnN0IEljb25EaXJlY3RvcnlFbnRyeSYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgSWNvbkRpcmVjdG9yeUVudHJ5JiBiKTsKKwogICAgICAgICBpbmxpbmUg
dWludDE2X3QgcmVhZFVpbnQxNihpbnQgb2Zmc2V0KSBjb25zdAogICAgICAgICB7CiAgICAgICAg
ICAgICByZXR1cm4gQk1QSW1hZ2VSZWFkZXI6OnJlYWRVaW50MTYobV9kYXRhLmdldCgpLApAQCAt
ODEsMjEgKzgzLDI2IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RlY29kZWRPZmZzZXQgKyBvZmZzZXQpOwogICAg
ICAgICB9CiAKLSAgICAgICAgLy8gRGVjb2RlcyB0aGUgaW1hZ2UuICBJZiB8b25seVNpemV8IGlz
IHRydWUsIHN0b3BzIGRlY29kaW5nIGFmdGVyCi0gICAgICAgIC8vIGNhbGN1bGF0aW5nIHRoZSBp
bWFnZSBzaXplLiAgSWYgZGVjb2RpbmcgZmFpbHMgYnV0IHRoZXJlIGlzIG5vIG1vcmUKLSAgICAg
ICAgLy8gZGF0YSBjb21pbmcsIHNldHMgdGhlICJkZWNvZGUgZmFpbHVyZSIgZmxhZy4KKyAgICAg
ICAgLy8gSWYgdGhlIGRlc2lyZWQgUE5HSW1hZ2VEZWNvZGVyIGV4aXN0cywgZ2l2ZXMgaXQgdGhl
IGFwcHJvcHJpYXRlIGRhdGEuCisgICAgICAgIHZvaWQgc2V0RGF0YUZvclBOR0RlY29kZXJBdElu
ZGV4KHNpemVfdCk7CisKKyAgICAgICAgLy8gRGVjb2RlcyB0aGUgZW50cnkgYXQgfGluZGV4fC4g
IElmIHxvbmx5U2l6ZXwgaXMgdHJ1ZSwgc3RvcHMgZGVjb2RpbmcKKyAgICAgICAgLy8gYWZ0ZXIg
Y2FsY3VsYXRpbmcgdGhlIGltYWdlIHNpemUuICBJZiBkZWNvZGluZyBmYWlscyBidXQgdGhlcmUg
aXMgbm8KKyAgICAgICAgLy8gbW9yZSBkYXRhIGNvbWluZywgc2V0cyB0aGUgImRlY29kZSBmYWls
dXJlIiBmbGFnLgogICAgICAgICAvLwogICAgICAgICAvLyBOT1RFOiBJZiB0aGUgZGVzaXJlZCBl
bnRyeSBpcyBhIFBORywgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IHRyaWdnZXIKICAgICAgICAgLy8g
ZGVjb2RpbmcsIGl0IG1lcmVseSBlbnN1cmVzIHRoZSBkZWNvZGVyIGlzIGNyZWF0ZWQgYW5kIHJl
YWR5IHRvCiAgICAgICAgIC8vIGRlY29kZS4gIFRoZSBjYWxsZXIgd2lsbCB0aGVuIGNhbGwgYSBm
dW5jdGlvbiBvbiB0aGUgUE5HSW1hZ2VEZWNvZGVyCiAgICAgICAgIC8vIHRoYXQgYWN0dWFsbHkg
dHJpZ2dlcnMgZGVjb2RpbmcuCi0gICAgICAgIHZvaWQgZGVjb2RlV2l0aENoZWNrRm9yRGF0YUVu
ZGVkKGJvb2wgb25seVNpemUpOworICAgICAgICB2b2lkIGRlY29kZVdpdGhDaGVja0ZvckRhdGFF
bmRlZChzaXplX3QgaW5kZXgsIGJvb2wgb25seVNpemUpOworCisgICAgICAgIC8vIERlY29kZXMg
dGhlIGRpcmVjdG9yeSBhbmQgZGlyZWN0b3J5IGVudHJpZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0
aGUKKyAgICAgICAgLy8gZGF0YSwgYW5kIGluaXRpYWxpemVzIG1lbWJlcnMuICBSZXR1cm5zIHRy
dWUgaWYgYWxsIGRlY29kaW5nCisgICAgICAgIC8vIHN1Y2NlZWRlZC4gIE9uY2UgdGhpcyByZXR1
cm5zIHRydWUsIGFsbCBlbnRyaWVzJyBzaXplcyBhcmUga25vd24uCisgICAgICAgIGJvb2wgZGVj
b2RlRGlyZWN0b3J5KCk7CiAKLSAgICAgICAgLy8gRGVjb2RlcyB0aGUgaW1hZ2UuICBJZiB8b25s
eVNpemV8IGlzIHRydWUsIHN0b3BzIGRlY29kaW5nIGFmdGVyCi0gICAgICAgIC8vIGNhbGN1bGF0
aW5nIHRoZSBpbWFnZSBzaXplLiAgUmV0dXJucyB3aGV0aGVyIGRlY29kaW5nIHN1Y2NlZWRlZC4K
LSAgICAgICAgLy8gTk9URTogVXNlZCBpbnRlcm5hbGx5IGJ5IGRlY29kZVdpdGhDaGVja0ZvckRh
dGFFbmRlZCgpLiAgT3RoZXIgcGVvcGxlCi0gICAgICAgIC8vIHNob3VsZCBub3QgY2FsbCB0aGlz
LgotICAgICAgICBib29sIGRlY29kZShib29sIG9ubHlTaXplKTsKKyAgICAgICAgLy8gRGVjb2Rl
cyB0aGUgc3BlY2lmaWVkIGVudHJ5LgorICAgICAgICBib29sIGRlY29kZUF0SW5kZXgoc2l6ZV90
KTsKIAogICAgICAgICAvLyBQcm9jZXNzZXMgdGhlIElDT05ESVIgYXQgdGhlIGJlZ2lubmluZyBv
ZiB0aGUgZGF0YS4gIFJldHVybnMgdHJ1ZSBpZgogICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IGNv
dWxkIGJlIGRlY29kZWQuCkBAIC0xMTAsMTMgKzExNyw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsK
ICAgICAgICAgLy8gfGRhdGF8LgogICAgICAgICBJY29uRGlyZWN0b3J5RW50cnkgcmVhZERpcmVj
dG9yeUVudHJ5KCk7CiAKLSAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHxlbnRyeXwgaXMgYSBw
cmVmZXJhYmxlIGljb24gZW50cnkgdG8gbV9kaXJFbnRyeS4KLSAgICAgICAgLy8gTGFyZ2VyIHNp
emVzLCBvciBncmVhdGVyIGJpdGRlcHRocyBhdCB0aGUgc2FtZSBzaXplLCBhcmUgcHJlZmVyYWJs
ZS4KLSAgICAgICAgYm9vbCBpc0JldHRlckVudHJ5KGNvbnN0IEljb25EaXJlY3RvcnlFbnRyeSYp
IGNvbnN0OwotCiAgICAgICAgIC8vIERldGVybWluZXMgd2hldGhlciB0aGUgZGVzaXJlZCBlbnRy
eSBpcyBhIEJNUCBvciBQTkcuICBSZXR1cm5zIHRydWUKICAgICAgICAgLy8gaWYgdGhlIHR5cGUg
Y291bGQgYmUgZGV0ZXJtaW5lZC4KLSAgICAgICAgYm9vbCBwcm9jZXNzSW1hZ2VUeXBlKCk7Cisg
ICAgICAgIEltYWdlVHlwZSBpbWFnZVR5cGVBdEluZGV4KHNpemVfdCk7CiAKICAgICAgICAgLy8g
VHJ1ZSBpZiB3ZSd2ZSBzZWVuIGFsbCB0aGUgZGF0YS4KICAgICAgICAgYm9vbCBtX2FsbERhdGFS
ZWNlaXZlZDsKQEAgLTEyNiwyMyArMTI5LDE5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAg
ICAgLy8gQk1QSW1hZ2VSZWFkZXIgdGFrZXMgb3ZlciB0aGlzIHdpbGwgbm90IGJlIHVwZGF0ZWQg
ZnVydGhlci4KICAgICAgICAgc2l6ZV90IG1fZGVjb2RlZE9mZnNldDsKIAotICAgICAgICAvLyBU
aGUgZW50cnkgc2l6ZSB3ZSBzaG91bGQgcHJlZmVyLiAgSWYgdGhpcyBpcyBlbXB0eSwgd2UgY2hv
b3NlIHRoZQotICAgICAgICAvLyBsYXJnZXN0IGF2YWlsYWJsZSBzaXplLiAgSWYgbm8gZW50cmll
cyBvZiB0aGUgZGVzaXJlZCBzaXplIGFyZQotICAgICAgICAvLyBhdmFpbGFibGUsIHdlIHBpY2sg
dGhlIG5leHQgbGFyZ2VyIHNpemUuCi0gICAgICAgIEludFNpemUgbV9wcmVmZXJyZWRJY29uU2l6
ZTsKLQogICAgICAgICAvLyBUaGUgaGVhZGVycyBmb3IgdGhlIElDTy4KLSAgICAgICAgSWNvbkRp
cmVjdG9yeSBtX2RpcmVjdG9yeTsKLSAgICAgICAgSWNvbkRpcmVjdG9yeUVudHJ5IG1fZGlyRW50
cnk7Ci0KLSAgICAgICAgLy8gVGhlIEJNUCByZWFkZXIsIGlmIHdlIG5lZWQgdG8gdXNlIG9uZS4K
LSAgICAgICAgT3duUHRyPEJNUEltYWdlUmVhZGVyPiBtX2JtcFJlYWRlcjsKLQotICAgICAgICAv
LyBUaGUgUE5HIGRlY29kZXIsIGlmIHdlIG5lZWQgdG8gdXNlIG9uZS4KLSAgICAgICAgT3duUHRy
PFBOR0ltYWdlRGVjb2Rlcj4gbV9wbmdEZWNvZGVyOworICAgICAgICB0eXBlZGVmIFZlY3RvcjxJ
Y29uRGlyZWN0b3J5RW50cnk+IEljb25EaXJlY3RvcnlFbnRyaWVzOworICAgICAgICBJY29uRGly
ZWN0b3J5RW50cmllcyBtX2RpckVudHJpZXM7CiAKLSAgICAgICAgLy8gV2hhdCBraW5kIG9mIGlt
YWdlIGRhdGEgaXMgc3RvcmVkIGF0IHRoZSBlbnRyeSB3ZSdyZSBkZWNvZGluZy4KLSAgICAgICAg
SW1hZ2VUeXBlIG1faW1hZ2VUeXBlOworICAgICAgICAvLyBUaGUgaW1hZ2UgZGVjb2RlcnMgZm9y
IHRoZSB2YXJpb3VzIGZyYW1lcy4KKyAgICAgICAgdHlwZWRlZiBWZWN0b3I8Qk1QSW1hZ2VSZWFk
ZXIqPiBCTVBSZWFkZXJzOworICAgICAgICBCTVBSZWFkZXJzIG1fYm1wUmVhZGVyczsKKyAgICAg
ICAgdHlwZWRlZiBWZWN0b3I8UE5HSW1hZ2VEZWNvZGVyKj4gUE5HRGVjb2RlcnM7CisgICAgICAg
IFBOR0RlY29kZXJzIG1fcG5nRGVjb2RlcnM7CisKKyAgICAgICAgLy8gVmFsaWQgb25seSB3aGls
ZSBhIEJNUEltYWdlUmVhZGVyIGlzIGRlY29kaW5nLCB0aGlzIGhvbGRzIHRoZSBzaXplCisgICAg
ICAgIC8vIGZvciB0aGUgcGFydGljdWxhciBlbnRyeSBiZWluZyBkZWNvZGVkLgorICAgICAgICBJ
bnRTaXplIG1fZnJhbWVTaXplOwogICAgIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>
<flag name="review"
          id="18321"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>