<?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>51128</bug_id>
          
          <creation_ts>2010-12-15 12:56:42 -0800</creation_ts>
          <short_desc>[Symbian] OSAllocator implementation</short_desc>
          <delta_ts>2011-02-19 10:05:39 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Template Framework</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>S60 Hardware</rep_platform>
          <op_sys>S60 3rd edition</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Qt</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>54263</dependson>
          <blocked>50251</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Siddharth Mathur">s.mathur</reporter>
          <assigned_to name="Siddharth Mathur">s.mathur</assigned_to>
          <cc>barraclough</cc>
    
    <cc>commit-queue</cc>
    
    <cc>eric</cc>
    
    <cc>ggaren</cc>
    
    <cc>laszlo.gombos</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>322765</commentid>
    <comment_count>0</comment_count>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2010-12-15 12:56:42 -0800</bug_when>
    <thetext>OSAllocatorSymbian.cpp needs to implement Symbian specific allocation (malloc style) as well as virtual memory management code (RChunk&apos;s commit() and decommit(). 
As far as specialized needs to JSC Heap go, ggaren suggests on IRC that we should strive to maximize use of the AlignedMemoryAllocator code, which already keeps track of bitmaps and commit/decommit of fixed sized blocks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>322771</commentid>
    <comment_count>1</comment_count>
      <attachid>76682</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2010-12-15 13:00:52 -0800</bug_when>
    <thetext>Created attachment 76682
*Half done* implementation for OSAllocatorSymbian.cpp. Also contains changes to remove Symbian-specific c&apos;tors for PageReservation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>328967</commentid>
    <comment_count>2</comment_count>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2011-01-04 05:34:00 -0800</bug_when>
    <thetext>This patch should also reevaluate the following section in JavaScriptCore.pri:

symbian: {
    LIBS += -lhal
    # For hal.h
    INCLUDEPATH *= $$MW_LAYER_SYSTEMINCLUDE
}

If hal.h is no longer needed we should remove this section from JavaScriptCore.pri. If this section is still needed, we should move it to wtf.pri (where hal.h is used).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337383</commentid>
    <comment_count>3</comment_count>
      <attachid>79609</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2011-01-20 09:09:12 -0800</bug_when>
    <thetext>Created attachment 79609
Symbian implementation for OSAllocator

Some notes about the patch: 
- Most of the meat is in OSAllocatorSymbian.cpp
- Unlike Unix and Windows, we need context (in the form of an RChunk object) to do reserve() and commit(). Therefore, given the static nature of interfaces in OSAllocator.h and its consumer classes, I have used static variables for the chunk handles. 
- Based on the Usage enum and on the bytes requested, the commit or reserve request is routed to the appropriate backing chunk (via getBackingChunk() helper), or to the process&apos; malloc/User::Alloc implementation (regular heap allocator) 
- I have tested that V8 benchmark test (version 5) runs to completion using QtTestBrowser on an N8 device.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337385</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-01-20 09:11:16 -0800</bug_when>
    <thetext>Attachment 79609 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/JavaScriptCore/ChangeLog&apos;, u&apos;Source...&quot; exit_code: 1

Source/JavaScriptCore/wtf/OSAllocatorSymbian.cpp:32:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 1 in 7 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337513</commentid>
    <comment_count>5</comment_count>
      <attachid>79635</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2011-01-20 12:34:31 -0800</bug_when>
    <thetext>Created attachment 79635
Fixed style issue, and updated Changelog to indicate that JSC JIT is currently not working and will be fixed in a later patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337577</commentid>
    <comment_count>6</comment_count>
      <attachid>79646</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2011-01-20 13:48:07 -0800</bug_when>
    <thetext>Created attachment 79646
remove StackBounds.cpp from this patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337622</commentid>
    <comment_count>7</comment_count>
      <attachid>79646</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-01-20 14:50:46 -0800</bug_when>
    <thetext>Comment on attachment 79646
remove StackBounds.cpp from this patch 

View in context: https://bugs.webkit.org/attachment.cgi?id=79646&amp;action=review

I think these comments are worth addressing.

I didn&apos;t review the Symbian allocation half of this patch.

&gt; Source/JavaScriptCore/wtf/OSAllocatorSymbian.cpp:41
&gt; +#define SYMBIAN_PAGESIZE(x)                         (HAL::Get(HALData::EMemoryPageSize, x));
&gt; +#define SYMBIAN_ROUNDUPTOMULTIPLE(x, multipleof)    ((x + multipleof - 1) &amp; ~(multipleof - 1))
&gt; +// macro for checking if a given address is backed by the given (already initialized) chunk
&gt; +#define IS_ADDRESS_FOR_CHUNK(address, chunk)  ((reinterpret_cast&lt;TUint8*&gt;(address) &gt;= chunk-&gt;Base()) &amp;&amp; \
&gt; +        (reinterpret_cast&lt;TUint8*&gt;(address) &lt; chunk-&gt;Base() + chunk-&gt;MaxSize())) 

These should be static inline functions, for type safety and debugging ease.

&gt; Source/JavaScriptCore/wtf/OSAllocatorSymbian.h:30
&gt; +#ifndef OSAllocatorSymbian_h
&gt; +#define OSAllocatorSymbian_h

This file should be named WrappedChunk.h. WebKit naming guidelines name the file after the class.

&gt; Source/JavaScriptCore/wtf/PageAllocationAligned.cpp:56
&gt; +    size_t alignmentDelta(0);
&gt; +#if !OS(SYMBIAN)    
&gt; +    alignmentDelta = alignment - pageSize();
&gt; +#endif

This seems wrong. How do you know that Symbian allocations will satisfy any arbitrary alignment requirement?

&gt; Source/JavaScriptCore/wtf/VMTags.h:86
&gt; +#define VM_TAG_FOR_TCMALLOC_MEMORY 1
&gt; +#define VM_TAG_FOR_COLLECTOR_MEMORY 2
&gt; +#define VM_TAG_FOR_EXECUTABLEALLOCATOR_MEMORY 3
&gt; +#define VM_TAG_FOR_REGISTERFILE_MEMORY 4
&gt; +#define VM_TAG_FOR_WEBCORE_PURGEABLE_MEMORY 5

It&apos;s a little weak for the Symbian allocator to be hard-wired for these specific kinds of allocations. I guess if we add more kinds of allocations in the future, Symbian will secretly inherit poor performance.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337980</commentid>
    <comment_count>8</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-21 03:15:29 -0800</bug_when>
    <thetext>This seems like a bug gavin would like. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338240</commentid>
    <comment_count>9</comment_count>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2011-01-21 12:05:53 -0800</bug_when>
    <thetext>(In reply to comment #7)

Geoffrey, first thanks for your review. Yes, this is a pretty awkward implementation, so I will try my best to explain...
&gt; 
&gt; &gt; Source/JavaScriptCore/wtf/PageAllocationAligned.cpp:56
&gt; &gt; +    size_t alignmentDelta(0);
&gt; &gt; +#if !OS(SYMBIAN)    
&gt; &gt; +    alignmentDelta = alignment - pageSize();
&gt; &gt; +#endif
&gt; 
&gt; This seems wrong. How do you know that Symbian allocations will satisfy any arbitrary alignment requirement?

I make an assumption here that PageAllocationAligned will always be used with allocation size == alignment requirement. The WrappedChunk class in OSAllocatorSymbian.cpp is written to meet this need very efficiently. Both collector blocks and the handle pool use case of PageAllocationAligned currently behave as such. Not future proof for sure, an ASSERT is surely required at a bare minimum. 
The main issue with Symbian OS is that I have to piggyback multiple commits (and 1 big reserve) on 1 RChunk object (bad karma to create chunks by the thousands in a process), the amount of housekeeping code that I would need to support arbitrarily sized blocks (even if pageSize multiples) would be a fair amount of effort, I think :) . Also there will be &quot;holes&quot; in the virtual address range which would be in uncommitted state (like in GC blocks use case) which then requires a search-next-available-region-of-size-X logic to be implemented. 

I could conceivably have created a new RChunk/WrappedChunk for each new &apos;size&apos;  seen for usage type OSAllocator::JSGCHeapPages, and appended them to a dynamic array. That would make it keep working when something more than GC blocks and handle pool are added to the WebKit feature set. But, the downside is that I would have to a priori guesstimate what the max reservation size needs (see CreateDisconnectedLocal()&apos;s third argument) to be for that new chunk. I can&apos;t create do a 1-1 mapping between an incoming reserve request and a (new) chunk. 

Any better ideas or clarifications are sincerely appreciated. 

&gt; 
&gt; &gt; Source/JavaScriptCore/wtf/VMTags.h:86
&gt; &gt; +#define VM_TAG_FOR_TCMALLOC_MEMORY 1
&gt; &gt; +#define VM_TAG_FOR_COLLECTOR_MEMORY 2
&gt; &gt; +#define VM_TAG_FOR_EXECUTABLEALLOCATOR_MEMORY 3
&gt; &gt; +#define VM_TAG_FOR_REGISTERFILE_MEMORY 4
&gt; &gt; +#define VM_TAG_FOR_WEBCORE_PURGEABLE_MEMORY 5
&gt; 
&gt; It&apos;s a little weak for the Symbian allocator to be hard-wired for these specific kinds of allocations. I guess if we add more kinds of allocations in the future, Symbian will secretly inherit poor performance.

I fixed these defines because they were initializing the Usage enum which I use extensively. I completely agree that my supporting only a few types of these enums efficiently is not sustainable from a performance perspective as WebKit evolves . But I will appreciate any suggestion on how to make is better. I will of course be maintaining and improving this implementation over time. 

PS: 
Types of chunks in Symbian OS: http://tinyurl.com/49l3ao9
RChunk API doc: http://tinyurl.com/463aweb
UserHeap for helping with alignment (efficient only for small alignment values) : http://tinyurl.com/4hetjbz</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339014</commentid>
    <comment_count>10</comment_count>
      <attachid>79924</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2011-01-24 07:51:06 -0800</bug_when>
    <thetext>Created attachment 79924
Converted macros into static inline functions and renamed new .h to WrappedChunkSymbian.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339079</commentid>
    <comment_count>11</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-01-24 10:12:01 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; I make an assumption here that PageAllocationAligned will always be used with allocation size == alignment requirement.

OK, that assumption is not valid. The reason I added the PageAllocationAligned was to support allocations where size and alignment may not be equal.

Darwin&apos;s allocator can match any alignment requirement, which is why it has a special code path. If you want to give Symbian a special code path that takes advantage of the minimum alignment guaranteed by the underlying allocator, that&apos;s fine. But clients should be able to change the sizes and alignments they request without having to write special code to work around Symbian ASSERTs or crashes.

&gt; the amount of housekeeping code that I would need to support arbitrarily sized blocks (even if pageSize multiples) would be a fair amount of effort, I think :) .

OK, but the point of PageAllocation is to support arbitrarily sized blocks, so it sounds like you have some work to do :).

&gt; I fixed these defines because they were initializing the Usage enum which I use extensively. I completely agree that my supporting only a few types of these enums efficiently is not sustainable from a performance perspective as WebKit evolves.

I think a better solution overall would build a slab allocator on top of large RChunk blocks. However, it&apos;s OK by me if the Symbian allocator performs poorly in a subtle way, as long as it doesn&apos;t interfere with general WebKit development.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>339975</commentid>
    <comment_count>12</comment_count>
      <attachid>79924</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2011-01-25 15:36:41 -0800</bug_when>
    <thetext>Comment on attachment 79924
Converted macros into static inline functions and renamed new .h to WrappedChunkSymbian.h 

Evaluating another algorithm, so canceling review for now ;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340359</commentid>
    <comment_count>13</comment_count>
      <attachid>80211</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2011-01-26 11:26:13 -0800</bug_when>
    <thetext>Created attachment 80211
New algorithm

Substantially redone implementation that doesn&apos;t care for Usage type and can flexibly handle any future uses of the OSAllocator interface</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340366</commentid>
    <comment_count>14</comment_count>
      <attachid>80213</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2011-01-26 11:49:44 -0800</bug_when>
    <thetext>Created attachment 80213
New algo take 2

The PageSizedAllocatorSymbian class handles the job of using one Symbian OS chunk (with a large up-front address space reservation) and a bitmap (one bit per page-sized block of the address space) to handle all of OSAllocator needs in a flexible manner. 
Comments starting Line 126 of OSAllocatorSymbian.cpp explain the logic in more detail. 
(Look ma, no OSAllocator::Usage!)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>341732</commentid>
    <comment_count>15</comment_count>
      <attachid>80213</attachid>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2011-01-28 14:19:01 -0800</bug_when>
    <thetext>Comment on attachment 80213
New algo take 2

View in context: https://bugs.webkit.org/attachment.cgi?id=80213&amp;action=review

Overall the algorithm looks good to me but I think this needs an other rounds of reviews.

&gt; Source/JavaScriptCore/wtf/OSAllocator.h:81
&gt; +    // These OSes prefer an explicit decommit before a release

I find this comment confusing here. The reason to take this code path seems to be different on WINCE and on Symbian. I would suggest to have different explanation for WINCE and SYMBIAN. For Symbian it seems that taking this code path makes the allocator implementation more convenient.

&gt; Source/JavaScriptCore/wtf/OSAllocatorSymbian.cpp:1
&gt; - * Copyright (C) 2010 Apple Inc. All rights reserved

I the Apple Copyright should stay.

&gt; Source/JavaScriptCore/wtf/OSAllocatorSymbian.cpp:44
&gt; +static void* makeNewCodeChunk(size_t bytes) 

I would use allocateCodeChunk here as a function name.

&gt; Source/JavaScriptCore/wtf/OSAllocatorSymbian.cpp:56
&gt; +static bool freeExistingCodeChunk(void *address) 

I would use deallocateCodeChunk here as the function name. Also it should be &quot;void* address&quot; instead - this coding style guideline is violated several times in the patch.

&gt; Source/JavaScriptCore/wtf/OSAllocatorSymbian.cpp:131
&gt; +// - The entire reservation reserve is logically divided into pageSized blocks (4K on Symbian) 

Let&apos;s be consistent about the pageSize - make it a const 4Kb (and do not use HAL) or do not state definitely that the pageSize size is 4 Kb (and use HAL).

&gt; Source/JavaScriptCore/wtf/OSAllocatorSymbian.cpp:142
&gt; +    // Initialize chunk .. 

Seems a useless comment.

&gt; Source/JavaScriptCore/wtf/OSAllocatorSymbian.cpp:143
&gt; +    RChunk c; 

Spell c out to chunk.

&gt; Source/JavaScriptCore/wtf/OSAllocatorSymbian.cpp:154
&gt; +    const TUint32 bitsPerWord = 8*sizeof(TUint32); 

Missing spaces - should be &quot; * &quot;

&gt; Source/JavaScriptCore/wtf/OSAllocatorSymbian.cpp:205
&gt; +    __ASSERT_ALWAYS(m_map.get(idx+nPages-1), User::Panic(_L(&quot;OSAllocator3&quot;), idx+nPages-1));

If you intend to keep these debug messages here than you should have more meaningful log entries.

&gt; Source/JavaScriptCore/wtf/PageSizedAllocatorSymbian.h:33
&gt; +#include &lt;hal.h&gt;

Perhaps it is enough to include hal.h in OSAllocatorSymbian.cpp and we do not need it in the header file.

&gt; Source/JavaScriptCore/wtf/PageSizedAllocatorSymbian.h:74
&gt; +    void destroy() 

Do we really need this function ? Seems it is only called from the destructor.

&gt; Source/JavaScriptCore/wtf/PageSizedAllocatorSymbian.h:83
&gt; +class PageSizedAllocatorSymbian {

I would prefer PageAllocatorSymbian.

&gt; Source/JavaScriptCore/wtf/PageSizedAllocatorSymbian.h:89
&gt; +    void *parkNextAvailableBlock(size_t bytes);

I think we should find a better verb here instead of park - can we just stick to reserve ?

&gt; Source/JavaScriptCore/wtf/PageSizedAllocatorSymbian.h:94
&gt; +    bool ownsAddress(const void* address) const; 

contains() sounds better and inline with for example PageBlock.h.

&gt; Source/JavaScriptCore/wtf/PageSizedAllocatorSymbian.h:100
&gt; +    struct {

Can we share some code with WTF::Bitmap here (and use less Symbian specific code) ?

&gt; Source/JavaScriptCore/wtf/PageSizedAllocatorSymbian.h:101
&gt; +        TUint32 *bits; // array of bit flags 

I think we should keep this on the stack and not on the heap - e.g. WTF::Bitmap&lt;bitmapSize&gt; m_bitmap;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350025</commentid>
    <comment_count>16</comment_count>
      <attachid>82175</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2011-02-11 14:17:51 -0800</bug_when>
    <thetext>Created attachment 82175
Updatd patch with review comments incorporated

This round has issues fixed from previous review, and utilizes Bitmap in wtf/Bitmap.h rather than rolling my own. 
I think the overall algorithm is quite sound, and I have done multiple runs on Sunspider and V8 with the JSC interpreter (not JIT), and things look solid. 

Known issues: 
- JIT seems to have pre-existing issues on Symbian (will fix as seperate bug), so all tests done  with interpreter. 
- No thread safety just yet because it&apos;s not important for Symbian port at the moment. 
- The implementation of Bitmap::findRunOfZeros() could be made faster/smarter.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>353775</commentid>
    <comment_count>17</comment_count>
      <attachid>82999</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2011-02-18 13:01:04 -0800</bug_when>
    <thetext>Created attachment 82999
Rebaselined patch against ToT.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>353840</commentid>
    <comment_count>18</comment_count>
      <attachid>83011</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2011-02-18 14:42:30 -0800</bug_when>
    <thetext>Created attachment 83011
Fixed comments, better class and member names, minor indent fix</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>353852</commentid>
    <comment_count>19</comment_count>
      <attachid>83016</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2011-02-18 14:52:19 -0800</bug_when>
    <thetext>Created attachment 83016
Indent fix (funny that style-checker doesn&apos;t catch it)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>354169</commentid>
    <comment_count>20</comment_count>
      <attachid>83016</attachid>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2011-02-19 08:11:08 -0800</bug_when>
    <thetext>Comment on attachment 83016
Indent fix (funny that style-checker doesn&apos;t catch it) 

r=me.

As a follow-up Bitmap&lt;size&gt;::findRunOfZeros() can be optimized.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>354188</commentid>
    <comment_count>21</comment_count>
      <attachid>83016</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2011-02-19 10:05:32 -0800</bug_when>
    <thetext>Comment on attachment 83016
Indent fix (funny that style-checker doesn&apos;t catch it) 

Clearing flags on attachment: 83016

Committed r79126: &lt;http://trac.webkit.org/changeset/79126&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>354189</commentid>
    <comment_count>22</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2011-02-19 10:05:39 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76682</attachid>
            <date>2010-12-15 13:00:52 -0800</date>
            <delta_ts>2011-01-20 09:09:12 -0800</delta_ts>
            <desc>*Half done* implementation for OSAllocatorSymbian.cpp. Also contains changes to remove Symbian-specific c&apos;tors for PageReservation. </desc>
            <filename>osallocatorsymbian_crude.patch</filename>
            <type>text/plain</type>
            <size>6866</size>
            <attacher name="Siddharth Mathur">s.mathur</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvTWFya1N0YWNrLmggYi9KYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL01hcmtTdGFjay5oCmluZGV4IGJlNDdmYWQuLmExNzg4YzkgMTAwNjQ0
Ci0tLSBhL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvTWFya1N0YWNrLmgKKysrIGIvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9NYXJrU3RhY2suaApAQCAtODcsNyArODcsNyBAQCBuYW1lc3BhY2UgSlND
IHsKICAgICAgICAgICAgIE1hcmtTZXRQcm9wZXJ0aWVzIG1fcHJvcGVydGllczsKICAgICAgICAg
fTsKIAotICAgICAgICBzdGF0aWMgdm9pZCogYWxsb2NhdGVTdGFjayhzaXplX3Qgc2l6ZSkgeyBy
ZXR1cm4gT1NBbGxvY2F0b3I6OnJlc2VydmVBbmRDb21taXQoc2l6ZSk7IH0KKyAgICAgICAgc3Rh
dGljIHZvaWQqIGFsbG9jYXRlU3RhY2soc2l6ZV90IHNpemUpIHsgcmV0dXJuIE9TQWxsb2NhdG9y
OjpyZXNlcnZlQW5kQ29tbWl0KHNpemUsIE9TQWxsb2NhdG9yOjpKU1ZNU3RhY2tQYWdlcywgdHJ1
ZSwgZmFsc2UpOyB9CiAgICAgICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VTdGFjayh2b2lkKiBhZGRy
LCBzaXplX3Qgc2l6ZSkgeyBPU0FsbG9jYXRvcjo6cmVsZWFzZShhZGRyLCBzaXplKTsgfQogCiAg
ICAgICAgIHN0YXRpYyB2b2lkIGluaXRpYWxpemVQYWdlc2l6ZSgpOwpkaWZmIC0tZ2l0IGEvSmF2
YVNjcmlwdENvcmUvd3RmL09TQWxsb2NhdG9yLmggYi9KYXZhU2NyaXB0Q29yZS93dGYvT1NBbGxv
Y2F0b3IuaAppbmRleCAzYzgxNzNiLi4xNDliZTk5IDEwMDY0NAotLS0gYS9KYXZhU2NyaXB0Q29y
ZS93dGYvT1NBbGxvY2F0b3IuaAorKysgYi9KYXZhU2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3Iu
aApAQCAtMzAsNiArMzAsNyBAQAogCiBuYW1lc3BhY2UgV1RGIHsKIAorCiBjbGFzcyBPU0FsbG9j
YXRvciB7CiBwdWJsaWM6CiAgICAgZW51bSBVc2FnZSB7CmRpZmYgLS1naXQgYS9KYXZhU2NyaXB0
Q29yZS93dGYvT1NBbGxvY2F0b3JTeW1iaWFuLmNwcCBiL0phdmFTY3JpcHRDb3JlL3d0Zi9PU0Fs
bG9jYXRvclN5bWJpYW4uY3BwCmluZGV4IDYzMjk4NTAuLjI4MGYxMzggMTAwNjQ0Ci0tLSBhL0ph
dmFTY3JpcHRDb3JlL3d0Zi9PU0FsbG9jYXRvclN5bWJpYW4uY3BwCisrKyBiL0phdmFTY3JpcHRD
b3JlL3d0Zi9PU0FsbG9jYXRvclN5bWJpYW4uY3BwCkBAIC0yNSwzMCArMjUsOTAgQEAKIAogI2lu
Y2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIk9TQWxsb2NhdG9yLmgiCi0KKyNpbmNsdWRlICJB
bGlnbmVkTWVtb3J5QWxsb2NhdG9yLmgiIC8vIGZvciBBbGlnbmVkTWVtb3J5QWxsb2NhdG9yQ29u
c3RhbnRzCisjaW5jbHVkZSAiQ29sbGVjdG9yLmgiIC8vIGZvciBCTE9DS19TSVpFCisjaW5jbHVk
ZSAiUmVnaXN0ZXJGaWxlLmgiIC8vIGZvciBKU0M6OlJlZ2lzdGVyRmlsZTo6ZGVmYXVsdENhcGFj
aXR5CiAjaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNpbmNsdWRlIDxlMzJzdGQuaD4KKyNp
bmNsdWRlIDxxZGVidWcuaD4KKwogCiBuYW1lc3BhY2UgV1RGIHsKIAotdm9pZCogT1NBbGxvY2F0
b3I6OnJlc2VydmUoc2l6ZV90LCBVc2FnZSwgYm9vbCwgYm9vbCkKK3N0YXRpYyBSQ2h1bmsgZ2V0
RGF0YUNodW5rKCkgeyAKKyAgICBzdGF0aWMgUkNodW5rIGNodW5rOworICAgIHN0YXRpYyBib29s
IGlzQ3JlYXRlZChmYWxzZSk7ICAgIAorICAgIAorICAgIGlmICghaXNDcmVhdGVkKSB7IAorICAg
ICAgICAvLyBJZiB3ZSB1c2UgdGhpcyBjaHVuayBmb3IgYm90aCBDb2xsZWN0b3IgYW5kIFJlZ2lz
dGVyRmlsZSwgd2Ugc2hvdWxkIGFkZCB0aGVpciBtYXggYnVkZ2V0cyB0b2dldGhlciAKKyAgICAg
ICAgVEludCBlcnJvciA9IGNodW5rLkNyZWF0ZURpc2Nvbm5lY3RlZExvY2FsKDAsIDAsIEpTQzo6
UmVnaXN0ZXJGaWxlOjpkZWZhdWx0Q2FwYWNpdHkgKyBKU0M6OkFsaWduZWRNZW1vcnlBbGxvY2F0
b3JDb25zdGFudHM6OnZpcnR1YWxNZW1vcnlSZXNlcnZhdGlvbik7CisgICAgICAgIGlzQ3JlYXRl
ZCA9IHRydWU7IAorICAgIH0KKyAgICByZXR1cm4gY2h1bms7Cit9CisKK3N0YXRpYyBSQ2h1bmsg
Z2V0Q29kZUNodW5rKCkgeyAKKyAgICBzdGF0aWMgUkNodW5rIGNodW5rOworICAgIHN0YXRpYyBi
b29sIGlzQ3JlYXRlZChmYWxzZSk7ICAgIAorICAgIAorICAgIGlmICghaXNDcmVhdGVkKSB7IAor
ICAgICAgICAvLyBGSVhNRTogV2hhdCdzIHRoZSBtYXggc2l6ZSBmb3IgYW4gZXhlY3V0YWJsZSBj
b2RlIGFyZWE/IAorICAgICAgICBUSW50IGVycm9yID0gY2h1bmsuQ3JlYXRlTG9jYWxDb2RlKDAs
IDApOworICAgICAgICBpc0NyZWF0ZWQgPSB0cnVlOyAKKyAgICB9CisgICAgcmV0dXJuIGNodW5r
OworfQorCisKKy8qIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IHdoZW4gb25lLXRpbWUgcmVz
ZXJ2YXRpb25zIG9mIGFkZHJlc3MgcmFuZ2VzIGFyZSBuZWVkZWQgCisgKiBUaGVyZWZvcmUgcGlj
ayB0aGUgZmlyc3QgY2FsbCBpbnRvIGl0LCBhbmQgdXNlIHRoYXQgYXMgdGhlIG1heFNpemUKKyAq
ICovCit2b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZShzaXplX3QgYnl0ZXMsIFVzYWdlIHVzYWdl
LCBib29sIHdyaXRhYmxlLCBib29sIGV4ZWN1dGFibGUpCiB7Ci0gICAgcmV0dXJuIGZhc3RNYWxs
b2MoYnl0ZXMpOworICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IChhKSBjaHVuayBpcyBpbml0aWFs
aXplZCBhbmQgKGIpIGEgcmVzZXJ2YXRpb24gaXMgZG9uZQorICAgIFJDaHVuayBjaHVuayA9IGdl
dERhdGFDaHVuaygpOyAKKyAgICAKKyAgICByZXR1cm4gUkVJTlRFUlBSRVRfQ0FTVCh2b2lkKixj
aHVuay5CYXNlKCkpOwogfQogCi12b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZUFuZENvbW1pdChz
aXplX3QgYnl0ZXMsIFVzYWdlLCBib29sLCBib29sKQorLyogV2UgY3VycmVudGx5IGNvdW50IG9u
IG5vIG9uZSBjYWxsaW5nIHRoaXMgZm9yIHRoZSBTeW1iaWFuIHBvcnQgKi8KK3ZvaWQqIE9TQWxs
b2NhdG9yOjpyZXNlcnZlQW5kQ29tbWl0KHNpemVfdCBieXRlcywgVXNhZ2UgdXNhZ2UsIGJvb2wg
d3JpdGFibGUsIGJvb2wgZXhlY3V0YWJsZSkKIHsKLSAgICByZXR1cm4gcmVzZXJ2ZShieXRlcyk7
CisgICAgaWYgKCFleGVjdXRhYmxlKSB7IAorICAgICAgICByZXR1cm4gVXNlcjo6QWxsb2MoYnl0
ZXMpOworICAgIH0gZWxzZSB7IAorICAgICAgICByZXR1cm4gMDsgCisgICAgfQogfQogCi12b2lk
IE9TQWxsb2NhdG9yOjpjb21taXQodm9pZCosIHNpemVfdCwgVXNhZ2UsIGJvb2wsIGJvb2wpCisv
KiBUaGlzIG5lZWQgT05MWSBzdXBwb3J0IGRhdGEgY2h1bmtzLCBub3QgYXBwbGljYWJsZSBmb3Ig
Y29kZSAqLwordm9pZCBPU0FsbG9jYXRvcjo6Y29tbWl0KHZvaWQqIGFkZHJlc3MsIHNpemVfdCBi
eXRlcywgYm9vbCwgYm9vbCkKIHsKKyAgICAgaWYgKCBieXRlcyA+PSBKU0M6OkJMT0NLX1NJWkUg
KSAgeyAKKyAgICAgICAgIFRJbnQgZXJyb3IgPSBnZXREYXRhQ2h1bmsoKS5Db21taXQoKFRJbnQp
YWRkcmVzcywgYnl0ZXMpOworICAgICAgICAgaWYgKGVycm9yICE9IEtFcnJOb25lKSB7IAorICAg
ICAgICAgICAgIHFEZWJ1ZygpIDw8ICIgT1NBbGxvY2F0b3I6OmNvbW1pdCBmYWlsZWQgd2l0aCBl
cnJvciAiIDw8IChxaW50MzIpZXJyb3I7CisgICAgICAgICB9CisgICAgIH0gZWxzZSB7IAorICAg
ICAgICAgcURlYnVnKCkgPDwgIiBPU0FsbG9jYXRvcjo6Y29tbWl0IDogVU5IQU5ETEVEIiA7Cisg
ICAgIH0KIH0KIAotdm9pZCBPU0FsbG9jYXRvcjo6ZGVjb21taXQodm9pZCosIHNpemVfdCkKKy8q
IFRoaXMgbmVlZCBPTkxZIHN1cHBvcnQgZGF0YSBjaHVua3MsIG5vdCBhcHBsaWNhYmxlIGZvciBj
b2RlICovCit2b2lkIE9TQWxsb2NhdG9yOjpkZWNvbW1pdCh2b2lkKiBhZGRyZXNzLCBzaXplX3Qg
Ynl0ZXMpCiB7CisgICAgaWYgKCBieXRlcyA+PSBKU0M6OkJMT0NLX1NJWkUgKSAgeyAKKyAgICAg
ICAgVEludCBlcnJvciA9IGdldERhdGFDaHVuaygpLkRlY29tbWl0KChUSW50KWFkZHJlc3MsIGJ5
dGVzKTsKKyAgICAgICAgaWYgKGVycm9yICE9IEtFcnJOb25lKSB7IAorICAgICAgICAgICAgcURl
YnVnKCkgPDwgIiBPU0FsbG9jYXRvcjo6ZGVjb21taXQgZmFpbGVkIHdpdGggZXJyb3IgIiA8PCAo
cWludDMyKWVycm9yOworICAgICAgICB9CisgICAgfSBlbHNlIHsgCisgICAgICAgIHFEZWJ1Zygp
IDw8ICIgT1NBbGxvY2F0b3I6OmNvbW1pdCA6IFVOSEFORExFRCIgOworICAgIH0KKyAgICAgICAg
IAogfQogCi12b2lkIE9TQWxsb2NhdG9yOjpyZWxlYXNlKHZvaWQqIGFkZHJlc3MsIHNpemVfdCkK
K3ZvaWQgT1NBbGxvY2F0b3I6OnJlbGVhc2Uodm9pZCogYWRkcmVzcywgc2l6ZV90IGJ5dGVzKQog
ewogICAgIGZhc3RGcmVlKGFkZHJlc3MpOwogfQpkaWZmIC0tZ2l0IGEvSmF2YVNjcmlwdENvcmUv
d3RmL1BhZ2VBbGxvY2F0aW9uLmggYi9KYXZhU2NyaXB0Q29yZS93dGYvUGFnZUFsbG9jYXRpb24u
aAppbmRleCAzNTg1YjMzLi5mZDcyMjQxIDEwMDY0NAotLS0gYS9KYXZhU2NyaXB0Q29yZS93dGYv
UGFnZUFsbG9jYXRpb24uaAorKysgYi9KYXZhU2NyaXB0Q29yZS93dGYvUGFnZUFsbG9jYXRpb24u
aApAQCAtODYsOSArODYsNiBAQCBwdWJsaWM6CiAgICAgUGFnZUFsbG9jYXRpb24oKQogICAgICAg
ICA6IG1fYmFzZSgwKQogICAgICAgICAsIG1fc2l6ZSgwKQotI2lmIE9TKFNZTUJJQU4pCi0gICAg
ICAgICwgbV9jaHVuaygwKQotI2VuZGlmCiAgICAgewogICAgIH0KIApAQCAtMTM0LDIwICsxMzEs
MTEgQEAgcHVibGljOgogI2VuZGlmCiAKIHByb3RlY3RlZDoKLSNpZiBPUyhTWU1CSUFOKQotICAg
IFBhZ2VBbGxvY2F0aW9uKHZvaWQqIGJhc2UsIHNpemVfdCBzaXplLCBSQ2h1bmsqIGNodW5rKQot
ICAgICAgICA6IG1fYmFzZShiYXNlKQotICAgICAgICAsIG1fc2l6ZShzaXplKQotICAgICAgICAs
IG1fY2h1bmsoY2h1bmspCi0gICAgewotICAgIH0KLSNlbHNlCiAgICAgUGFnZUFsbG9jYXRpb24o
dm9pZCogYmFzZSwgc2l6ZV90IHNpemUpCiAgICAgICAgIDogbV9iYXNlKGJhc2UpCiAgICAgICAg
ICwgbV9zaXplKHNpemUpCiAgICAgewogICAgIH0KLSNlbmRpZgogCiAjaWYgSEFWRShQQUdFX0FM
TE9DQVRFX0FMSUdORUQpCiAgICAgc3RhdGljIFBhZ2VBbGxvY2F0aW9uIHN5c3RlbUFsbG9jYXRl
QWxpZ25lZChzaXplX3QsIE9TQWxsb2NhdG9yOjpVc2FnZSk7CkBAIC0xNTYsOSArMTQ0LDYgQEAg
cHJvdGVjdGVkOgogCiAgICAgdm9pZCogbV9iYXNlOwogICAgIHNpemVfdCBtX3NpemU7Ci0jaWYg
T1MoU1lNQklBTikKLSAgICBSQ2h1bmsqIG1fY2h1bms7Ci0jZW5kaWYKIAogICAgIHN0YXRpYyBK
U19FWFBPUlREQVRBIHNpemVfdCBzX3BhZ2VTaXplOwogfTsKQEAgLTI0Nyw4ICsyMzIsOCBAQCBp
bmxpbmUgc2l6ZV90IFBhZ2VBbGxvY2F0aW9uOjpzeXN0ZW1QYWdlU2l6ZSgpCiAKIGlubGluZSBz
aXplX3QgUGFnZUFsbG9jYXRpb246OnN5c3RlbVBhZ2VTaXplKCkKIHsKLSAgICBzdGF0aWMgVElu
dCBwYWdlX3NpemUgPSAwOwotICAgIFVzZXJIYWw6OlBhZ2VTaXplSW5CeXRlcyhwYWdlX3NpemUp
OworICAgIC8vIFRoaXMgbmV2ZXIgY2hhbmdlcyBvbiBTeW1iaWFuCisgICAgY29uc3Qgc2l6ZV90
IHBhZ2Vfc2l6ZSA9IDQwOTY7IAogICAgIHJldHVybiBwYWdlX3NpemU7CiB9CiAKZGlmZiAtLWdp
dCBhL0phdmFTY3JpcHRDb3JlL3d0Zi9QYWdlUmVzZXJ2YXRpb24uaCBiL0phdmFTY3JpcHRDb3Jl
L3d0Zi9QYWdlUmVzZXJ2YXRpb24uaAppbmRleCBhZTA2ZWZjLi4zMTBiOWEyIDEwMDY0NAotLS0g
YS9KYXZhU2NyaXB0Q29yZS93dGYvUGFnZVJlc2VydmF0aW9uLmgKKysrIGIvSmF2YVNjcmlwdENv
cmUvd3RmL1BhZ2VSZXNlcnZhdGlvbi5oCkBAIC0xMDAsMTMgKzEwMCw4IEBAIHB1YmxpYzoKICAg
ICB9CiAKIHByaXZhdGU6Ci0jaWYgT1MoU1lNQklBTikKLSAgICBQYWdlUmVzZXJ2YXRpb24odm9p
ZCogYmFzZSwgc2l6ZV90IHNpemUsIFJDaHVuayogY2h1bmspCi0gICAgICAgIDogUGFnZUFsbG9j
YXRpb24oYmFzZSwgc2l6ZSwgY2h1bmspCi0jZWxzZQogICAgIFBhZ2VSZXNlcnZhdGlvbih2b2lk
KiBiYXNlLCBzaXplX3Qgc2l6ZSwgYm9vbCB3cml0YWJsZSwgYm9vbCBleGVjdXRhYmxlKQogICAg
ICAgICA6IFBhZ2VBbGxvY2F0aW9uKGJhc2UsIHNpemUpCi0jZW5kaWYKICNpZm5kZWYgTkRFQlVH
CiAgICAgICAgICwgbV9jb21taXR0ZWQoMCkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvSmF2YVNjcmlw
dENvcmUvd3RmL1ZNVGFncy5oIGIvSmF2YVNjcmlwdENvcmUvd3RmL1ZNVGFncy5oCmluZGV4IDY2
MDAwNTAuLmQ4NmE2MzQgMTAwNjQ0Ci0tLSBhL0phdmFTY3JpcHRDb3JlL3d0Zi9WTVRhZ3MuaAor
KysgYi9KYXZhU2NyaXB0Q29yZS93dGYvVk1UYWdzLmgKQEAgLTc5LDExICs3OSwxMSBAQAogCiAj
ZWxzZSAvLyBPUyhEQVJXSU4pCiAKLSNkZWZpbmUgVk1fVEFHX0ZPUl9UQ01BTExPQ19NRU1PUlkg
LTEKLSNkZWZpbmUgVk1fVEFHX0ZPUl9DT0xMRUNUT1JfTUVNT1JZIC0xCi0jZGVmaW5lIFZNX1RB
R19GT1JfRVhFQ1VUQUJMRUFMTE9DQVRPUl9NRU1PUlkgLTEKLSNkZWZpbmUgVk1fVEFHX0ZPUl9S
RUdJU1RFUkZJTEVfTUVNT1JZIC0xCi0jZGVmaW5lIFZNX1RBR19GT1JfV0VCQ09SRV9QVVJHRUFC
TEVfTUVNT1JZIC0xCisjZGVmaW5lIFZNX1RBR19GT1JfVENNQUxMT0NfTUVNT1JZIDAKKyNkZWZp
bmUgVk1fVEFHX0ZPUl9DT0xMRUNUT1JfTUVNT1JZIDEKKyNkZWZpbmUgVk1fVEFHX0ZPUl9FWEVD
VVRBQkxFQUxMT0NBVE9SX01FTU9SWSAyCisjZGVmaW5lIFZNX1RBR19GT1JfUkVHSVNURVJGSUxF
X01FTU9SWSAzCisjZGVmaW5lIFZNX1RBR19GT1JfV0VCQ09SRV9QVVJHRUFCTEVfTUVNT1JZIDQK
IAogI2VuZGlmIC8vIE9TKERBUldJTikKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>79609</attachid>
            <date>2011-01-20 09:09:12 -0800</date>
            <delta_ts>2011-01-20 12:34:31 -0800</delta_ts>
            <desc>Symbian implementation for OSAllocator</desc>
            <filename>51128_v2.patch</filename>
            <type>text/plain</type>
            <size>20825</size>
            <attacher name="Siddharth Mathur">s.mathur</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNzYyNDgpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzYgQEAK
KzIwMTEtMDEtMjAgIFNpZGRoYXJ0aCBNYXRodXIgIDxzaWRkaGFydGgubWF0aHVyQG5va2lhLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbU3lt
Ymlhbl0gT1NBbGxvY2F0b3IgaW1wbGVtZW50YXRpb24KKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUxMTI4CisKKyAgICAgICAgSW1wbGVtZW50IFJDaHVu
ayBwb3dlcmVkIHJlc2VydmUgYW5kIGNvbW1pdCBvcGVyYXRpb25zIGZyb20gT1NBbGxvY2F0b3Iu
aAorICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnByaTogbW92ZSBvdXQgSEFMIGxpbmthZ2UgYmxv
Y2sgdG8gd3RmLnByaQorCisgICAgICAgICogd3RmL09TQWxsb2NhdG9yLmg6CisgICAgICAgIChX
VEY6Ok9TQWxsb2NhdG9yOjpkZWNvbW1pdEFuZFJlbGVhc2UpOiAgYWRkIGV4cGxpY2l0IGRlY29t
bWl0IGxpa2UgV2luQ0UKKyAgICAgICAgKiB3dGYvT1NBbGxvY2F0b3JTeW1iaWFuLmNwcDogaW1w
bGVtZW50YXRpb24gb2YgT1NBbGxvY3RvciBpbnRlcmZhY2UgCisgICAgICAgIChXVEY6OmdldEJh
Y2tpbmdDaHVuayk6IGhlbHBlciBmdW5jdGlvbiB0byBnZXQgY29ycmVjdCBiYWNraW5nIGNodW5r
CisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpyZXNlcnZlVW5jb21taXR0ZWQpOgorICAgICAg
ICAoV1RGOjpPU0FsbG9jYXRvcjo6Y29tbWl0KToKKyAgICAgICAgKFdURjo6T1NBbGxvY2F0b3I6
OnJlbGVhc2VEZWNvbW1pdHRlZCk6CisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpkZWNvbW1p
dCk6CisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpyZXNlcnZlQW5kQ29tbWl0KToKKyAgICAg
ICAgKFdURjo6V3JhcHBlZENodW5rOjpXcmFwcGVkQ2h1bmspOiBIZWxwZXIgY2xhc3MgZm9yIGFs
aWduZWQgYmxvY2tzCisgICAgICAgIChXVEY6OldyYXBwZWRDaHVuazo6fldyYXBwZWRDaHVuayk6
CisgICAgICAgIChXVEY6OldyYXBwZWRDaHVuazo6cGFya05leHRBdmFpbGFibGVCbG9jayk6Cisg
ICAgICAgIChXVEY6OldyYXBwZWRDaHVuazo6Y29tbWl0KToKKyAgICAgICAgKFdURjo6V3JhcHBl
ZENodW5rOjpkZWNvbW1pdCk6CisgICAgICAgIChXVEY6OldyYXBwZWRDaHVuazo6QmFzZSk6Cisg
ICAgICAgIChXVEY6OldyYXBwZWRDaHVuazo6U2l6ZSk6CisgICAgICAgIChXVEY6OldyYXBwZWRD
aHVuazo6TWF4U2l6ZSk6CisgICAgICAgICogd3RmL09TQWxsb2NhdG9yU3ltYmlhbi5oOiBBZGRl
ZC4gRGVjbGFyYXRpb24gb2YgV3JhcHBlZENodW5rIAorICAgICAgICAqIHd0Zi9QYWdlQWxsb2Nh
dGlvbkFsaWduZWQuY3BwOgorICAgICAgICAoV1RGOjpQYWdlQWxsb2NhdGlvbkFsaWduZWQ6OmFs
bG9jYXRlKTogYWxpZ25tZW50IGZvciBTeW1iaWFuIGlzIGhhbmRsZWQgZG93bnN0cmVhbQorICAg
ICAgICAqIHd0Zi9WTVRhZ3MuaDogY29ycmVjdCBlbnVtIGludGVnZXIgdmFsdWVzIHNvIHRoYXQg
dGhleSBhcmUgZGlmZmVyZW50aWFibGUKKyAgICAgICAgKiB3dGYvd3RmLnByaTogbmV3IGhvbWUg
Zm9yIEhBTCBsaW5rYWdlIGJsb2NrCisKIDIwMTEtMDEtMjAgIFpvbHRhbiBIb3J2YXRoICA8em9s
dGFuQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQ3NhYmEgT3N6dHJvZ29uw6Fj
LgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnByaQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJpCShyZXZpc2lv
biA3NjI0NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcmkJKHdv
cmtpbmcgY29weSkKQEAgLTQ4LDEyICs0OCw2IEBAIHN5bWJpYW4gewogICAgIElOQ0xVREVQQVRI
ID0gJCRKQVZBU0NSSVBUQ09SRV9JTkNMVURFUEFUSCAkJElOQ0xVREVQQVRICiB9CiAKLXN5bWJp
YW46IHsKLSAgICBMSUJTICs9IC1saGFsCi0gICAgIyBGb3IgaGFsLmgKLSAgICBJTkNMVURFUEFU
SCAqPSAkJE1XX0xBWUVSX1NZU1RFTUlOQ0xVREUKLX0KLQogd2luMzItKjogREVGSU5FUyArPSBf
SEFTX1RSMT0wCiAKIERFRklORVMgKz0gQlVJTERJTkdfSmF2YVNjcmlwdENvcmUgQlVJTERJTkdf
V1RGCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL09TQWxsb2NhdG9yLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9PU0FsbG9jYXRvci5oCShyZXZpc2lv
biA3NjI0NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3IuaAkod29y
a2luZyBjb3B5KQpAQCAtNzcsOSArNzcsOCBAQCBpbmxpbmUgdm9pZCogT1NBbGxvY2F0b3I6OnJl
c2VydmVBbmRDb21tCiBpbmxpbmUgdm9pZCBPU0FsbG9jYXRvcjo6ZGVjb21taXRBbmRSZWxlYXNl
KHZvaWQqIHJlbGVhc2VCYXNlLCBzaXplX3QgcmVsZWFzZVNpemUsIHZvaWQqIGRlY29tbWl0QmFz
ZSwgc2l6ZV90IGRlY29tbWl0U2l6ZSkKIHsKICAgICBBU1NFUlQoZGVjb21taXRCYXNlID49IHJl
bGVhc2VCYXNlICYmIChzdGF0aWNfY2FzdDxjaGFyKj4oZGVjb21taXRCYXNlKSArIGRlY29tbWl0
U2l6ZSkgPD0gKHN0YXRpY19jYXN0PGNoYXIqPihyZWxlYXNlQmFzZSkgKyByZWxlYXNlU2l6ZSkp
OwotI2lmIE9TKFdJTkNFKQotICAgIC8vIE9uIG1vc3QgcGxhdGZvcm1zIHdlIGNhbiBhY3R1YWxs
eSBza2lwIHRoaXMgZmluYWwgZGVjb21taXQ7IHJlbGVhc2luZyB0aGUgVk0gd2lsbAotICAgIC8v
IGltcGxpY2l0bHkgZGVjb21taXQgYW55IHBoeXNpY2FsIG1lbW9yeSBpbiB0aGUgcmVnaW9uLiBU
aGlzIGlzIG5vdCB0cnVlIG9uIFdJTkNFLgorI2lmIE9TKFdJTkNFKSB8fCBPUyhTWU1CSUFOKQor
ICAgIC8vIFRoZXNlIE9TZXMgcHJlZmVyIGFuIGV4cGxpY2l0IGRlY29tbWl0IGJlZm9yZSBhIHJl
bGVhc2UKICAgICBkZWNvbW1pdChkZWNvbW1pdEJhc2UsIGRlY29tbWl0U2l6ZSk7CiAjZWxzZQog
ICAgIFVOVVNFRF9QQVJBTShkZWNvbW1pdEJhc2UpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL3d0Zi9PU0FsbG9jYXRvclN5bWJpYW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3JTeW1iaWFuLmNwcAkocmV2aXNpb24gNzYyNDcpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL09TQWxsb2NhdG9yU3ltYmlhbi5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDEwIEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBOb2tpYSBD
b3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI0LDMzICsyNSwyODIgQEAK
ICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiT1NBbGxvY2F0b3JTeW1iaWFu
LmgiCisKKyNpbmNsdWRlICJDb2xsZWN0b3IuaCIgLy8gRm9yIEpTQzo6QkxPQ0tfU0laRQorI2lu
Y2x1ZGUgPGUzMnN0ZC5oPgorI2luY2x1ZGUgIkdDSGFuZGxlLmgiIC8vIEZvciBXZWFrR0NIYW5k
bGVQb29sOjpQb29sc2l6ZQorI2luY2x1ZGUgPGhhbC5oPgogI2luY2x1ZGUgIk9TQWxsb2NhdG9y
LmgiCiAKLSNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorLy8gbWFjcm9zIGZvciBvYnRhaW5p
bmcgcGFnZXNpemUgYW5kIHJvdW5kaW5nIHVwCisjZGVmaW5lIFNZTUJJQU5fUEFHRVNJWkUoeCkg
ICAgICAgICAgICAgICAgICAgICAgICAgKEhBTDo6R2V0KEhBTERhdGE6OkVNZW1vcnlQYWdlU2l6
ZSwgeCkpOworI2RlZmluZSBTWU1CSUFOX1JPVU5EVVBUT01VTFRJUExFKHgsIG11bHRpcGxlb2Yp
ICAgICgoeCArIG11bHRpcGxlb2YgLSAxKSAmIH4obXVsdGlwbGVvZiAtIDEpKQorLy8gbWFjcm8g
Zm9yIGNoZWNraW5nIGlmIGEgZ2l2ZW4gYWRkcmVzcyBpcyBiYWNrZWQgYnkgdGhlIGdpdmVuIChh
bHJlYWR5IGluaXRpYWxpemVkKSBjaHVuaworI2RlZmluZSBJU19BRERSRVNTX0ZPUl9DSFVOSyhh
ZGRyZXNzLCBjaHVuaykgICgocmVpbnRlcnByZXRfY2FzdDxUVWludDgqPihhZGRyZXNzKSA+PSBj
aHVuay0+QmFzZSgpKSAmJiBcCisgICAgICAgIChyZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFk
ZHJlc3MpIDwgY2h1bmstPkJhc2UoKSArIGNodW5rLT5NYXhTaXplKCkpKSAKIAogbmFtZXNwYWNl
IFdURiB7CiAKLXZvaWQqIE9TQWxsb2NhdG9yOjpyZXNlcnZlVW5jb21taXR0ZWQoc2l6ZV90IGJ5
dGVzLCBVc2FnZSwgYm9vbCwgYm9vbCkKK3N0YXRpYyBjb25zdCBUSW50IG1heFJlc2VydmF0aW9u
SlNDQ29sbGVjdG9ySGVhcCA9IDEyOCAqIDEwMjQgKiAxMDI0OyAvLyAxMjggTUIKK3N0YXRpYyBj
b25zdCBUSW50IG1heFJlc2VydmF0aW9uSlNDR0NIYW5kbGVQb29sICA9IDEgKiAxMDI0ICogMTAy
NDsgLy8gMSBNQgorCitzdGF0aWMgV3JhcHBlZENodW5rKiBjaHVua0dDQmxvY2tzKDApOworc3Rh
dGljIFdyYXBwZWRDaHVuayogY2h1bmtHQ0hhbmRsZVBvb2woMCk7CitzdGF0aWMgUkNodW5rKiBj
aHVua0pJVENvZGUoMCk7CitzdGF0aWMgUkNodW5rKiBjaHVua1ZNU3RhY2soMCk7CisKKy8vIFJl
dHVybiB0aGUgY29ycmVjdCBiYWNraW5nIGNodW5rIG9iamVjdCBiYXNlZCBvbiByZXF1ZXN0IHR5
cGUgYW5kIHNpemUsIGxhemlseSBjb25maWd1cmluZyBpdCBmb3IgdXNlCitzdGF0aWMgdm9pZCog
Z2V0QmFja2luZ0NodW5rKHNpemVfdCBieXRlcywgT1NBbGxvY2F0b3I6OlVzYWdlIHVzYWdlLCBi
b29sIGV4ZWN1dGFibGUpIAoreworCisgICAgLy8gMS4gQ2h1bmtzIGZvciBKU0MgQ29sbGVjdG9y
IGhlYXAgYmxvY2tzIGFuZCBHQyBIYW5kbGUgUG9vbCAKKyAgICAvLyAgICBJbml0aWFsaXplZCBo
ZXJlIE9OQ0Ugd2l0aCBhIGNvbXBpbGUtdGltZSBtYXggcmVzZXJ2YXRpb24gc2l6ZSAKKyAgICBp
ZiAodXNhZ2UgPT0gT1NBbGxvY2F0b3I6OkpTR0NIZWFwUGFnZXMpIHsKKworICAgICAgICBpZiAo
Ynl0ZXMgPT0gSlNDOjpCTE9DS19TSVpFKSB7ICAKKyAgICAgICAgICAgIGlmICghY2h1bmtHQ0Js
b2NrcykKKyAgICAgICAgICAgICAgICBjaHVua0dDQmxvY2tzID0gbmV3IFdyYXBwZWRDaHVuayht
YXhSZXNlcnZhdGlvbkpTQ0NvbGxlY3RvckhlYXAsIEpTQzo6QkxPQ0tfU0laRSk7CisgICAgICAg
ICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dm9pZCo+KGNodW5rR0NCbG9ja3MpOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKGJ5dGVzID09IEpTQzo6V2Vha0dDSGFuZGxlUG9vbDo6cG9vbFNpemUp
IHsgIAorICAgICAgICAgICAgaWYgKCFjaHVua0dDSGFuZGxlUG9vbCkgCisgICAgICAgICAgICAg
ICAgY2h1bmtHQ0hhbmRsZVBvb2wgPSBuZXcgV3JhcHBlZENodW5rKG1heFJlc2VydmF0aW9uSlND
R0NIYW5kbGVQb29sLCBKU0M6OldlYWtHQ0hhbmRsZVBvb2w6OnBvb2xTaXplKTsKKyAgICAgICAg
ICAgIHJldHVybiBzdGF0aWNfY2FzdDx2b2lkKj4oY2h1bmtHQ0hhbmRsZVBvb2wpOworICAgICAg
ICB9CisKKyAgICAgICAgVXNlcjo6UGFuaWMoX0woIk9TQWxsb2NhdG9yMSIpLCBLRXJyTm90U3Vw
cG9ydGVkKTsKKyAgICB9CisKKyAgICAvLyAyLiBDaHVuayBmb3IgUmVnaXN0ZXJGaWxlL1ZNIHN0
YWNrCisgICAgLy8gLSBJbml0aWFsaXplZCBPTkNFIHVzaW5nIGFyZ3VtZW50cyBmcm9tIHRoZSBm
aXJzdCBjYWxsZXIgb2YgdGhpcyBjaHVuayB0eXBlIAorICAgIC8vIC0gQXNzdW1lcyB0aGF0IG9u
bHkgMSBzdWNoIGNodW5rIGlzIGV2ZXIgbmVlZGVkIGdpdmVuIEpTQydzIGN1cnJlbnQgZGVzaWdu
CisgICAgaWYgKHVzYWdlID09IE9TQWxsb2NhdG9yOjpKU1ZNU3RhY2tQYWdlcykgeworICAgICAg
ICBpZiAoIWNodW5rVk1TdGFjaykgeworICAgICAgICAgICAgY2h1bmtWTVN0YWNrID0gbmV3IFJD
aHVuaygpOworICAgICAgICAgICAgVEludCBlcnJvciA9IGNodW5rVk1TdGFjay0+Q3JlYXRlRGlz
Y29ubmVjdGVkTG9jYWwoMCwgMCwgYnl0ZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBz
dGF0aWNfY2FzdDx2b2lkKj4oY2h1bmtWTVN0YWNrKTsKKyAgICB9CisKKyAgICAvLyAzLiBDaHVu
ayBmb3IgSklUIGNvZGUKKyAgICAvLyAtIEluaXRpYWxpemVkIE9OQ0UgdXNpbmcgYXJndW1lbnRz
IGZyb20gdGhlIGZpcnN0IGNhbGxlciBvZiB0aGlzIGNodW5rIHR5cGUuCisgICAgLy8gLSBBc3N1
bWVzIHRoYXQgb25seSAxIHN1Y2ggZXhlY3V0YWJsZSByZWdpb24gZm9yIEpJVCBjb2RlIGlzIG5l
ZWRlZCBnaXZlbiBKU0MncyBjdXJyZW50IGRlc2lnbgorICAgIGlmIChleGVjdXRhYmxlICYmIHVz
YWdlID09IE9TQWxsb2NhdG9yOjpKU0pJVENvZGVQYWdlcykgeyAKKyAgICAgICAgaWYgKCFjaHVu
a0pJVENvZGUpIHsKKyAgICAgICAgICAgIGNodW5rSklUQ29kZSA9IG5ldyBSQ2h1bmsoKTsKKyAg
ICAgICAgICAgIFRJbnQgZXJyb3IgPSBjaHVua0pJVENvZGUtPkNyZWF0ZUxvY2FsQ29kZShieXRl
cywgYnl0ZXMpOyAvLyByZXNlcnZlIEFORCBjb21taXQKKyAgICAgICAgfQorICAgICAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8dm9pZCo+KGNodW5rSklUQ29kZSk7IAorICAgIH0KKworICAgIHJldHVy
biAwOworfQorCisvLyBSZXNlcnZlIG1lbW9yeSBhbmQgcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3Mg
b2YgdGhlIHJlZ2lvbgordm9pZCogT1NBbGxvY2F0b3I6OnJlc2VydmVVbmNvbW1pdHRlZChzaXpl
X3QgcmVzZXJ2YXRpb25TaXplLCBVc2FnZSB1c2FnZSwgYm9vbCAsIGJvb2wgZXhlY3V0YWJsZSkK
K3sKKyAgICB2b2lkKiBjaHVuayA9IGdldEJhY2tpbmdDaHVuayhyZXNlcnZhdGlvblNpemUsIHVz
YWdlLCBleGVjdXRhYmxlKTsKKworICAgIGlmICh1c2FnZSA9PSBPU0FsbG9jYXRvcjo6SlNHQ0hl
YXBQYWdlcyAmJiBjaHVuaykgeworICAgICAgICAvLyBXZSBkb24ndCBhY3R1YWxseSBkbyBhIHJl
c2VydmF0aW9uIGZvciB0aGlzIGNhc2UsIGJlY2F1c2UgYSBsYXJnZQorICAgICAgICAvLyBvbmUg
aGFzIGFscmVhZHkgYmVlbiBkb25lIGluIHRoZSBXcmFwcGVkQ2h1bmsgYyd0b3IgKGFib3ZlKS4g
CisgICAgICAgIC8vIFdlIHNpbXBseSAicGFyayIgYSBibG9jayBpbnRlcm5hbGx5IGJ5IHNldHRp
bmcgYSBiaXQgaW4gb3VyIGJpdCBtYXAKKyAgICAgICAgLy8gdG8gaW5kaWNhdGUgaW50ZW50aW9u
IHRvIHVzZS4gIAorICAgICAgICBXcmFwcGVkQ2h1bmsqIHdjID0gc3RhdGljX2Nhc3Q8V3JhcHBl
ZENodW5rKj4oY2h1bmspOworICAgICAgICByZXR1cm4gd2MtPnBhcmtOZXh0QXZhaWxhYmxlQmxv
Y2soKTsKKyAgICB9CisKKyAgICBpZiAodXNhZ2UgPT0gT1NBbGxvY2F0b3I6OkpTVk1TdGFja1Bh
Z2VzICYmIGNodW5rKSAKKyAgICAgICAgcmV0dXJuIChzdGF0aWNfY2FzdDxSQ2h1bmsqPihjaHVu
aykpLT5CYXNlKCk7CisgICAgCisgICAgaWYgKHVzYWdlID09IE9TQWxsb2NhdG9yOjpKU0pJVENv
ZGVQYWdlcyAmJiBjaHVuaykKKyAgICAgICAgcmV0dXJuIChzdGF0aWNfY2FzdDxSQ2h1bmsqPihj
aHVuaykpLT5CYXNlKCk7CisKKyAgICAvLyBEaXJlY3RseSBoZWFwIGFsbG9jYXRlIGFueXRoaW5n
IHRoYXQgaXNuJ3QgYmFja2VkIGJ5IGEgY2h1bmsKKyAgICByZXR1cm4gVXNlcjo6QWxsb2MocmVz
ZXJ2YXRpb25TaXplKTsgIAorfQorCisvLyBBY3R1YWxseSBjb21taXQgbWVtb3J5IGZyb20gT1Ms
IHdoaWNoIHdhcyBwcmV2aW91c2x5IHJlc2VydmVkIHZpYSByZXNlcnZlVW5jb21taXR0ZWQoKQor
dm9pZCBPU0FsbG9jYXRvcjo6Y29tbWl0KHZvaWQqIGFkZHJlc3MsIHNpemVfdCBieXRlcywgYm9v
bCwgYm9vbCBleGVjdXRhYmxlKQoreworICAgIGlmIChjaHVua0dDQmxvY2tzICYmIElTX0FERFJF
U1NfRk9SX0NIVU5LKGFkZHJlc3MsIGNodW5rR0NCbG9ja3MpKSB7IAorICAgICAgICBib29sIG9r
ID0gY2h1bmtHQ0Jsb2Nrcy0+Y29tbWl0KGFkZHJlc3MpOyAKKyAgICAgICAgcmV0dXJuOyAKKyAg
ICB9CisKKyAgICBpZiAoY2h1bmtHQ0hhbmRsZVBvb2wgJiYgSVNfQUREUkVTU19GT1JfQ0hVTkso
YWRkcmVzcywgY2h1bmtHQ0hhbmRsZVBvb2wpKSB7IAorICAgICAgICBib29sIG9rID0gY2h1bmtH
Q0hhbmRsZVBvb2wtPmNvbW1pdChhZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuOyAKKyAgICB9CisK
KyAgICBpZiAoY2h1bmtWTVN0YWNrICYmIElTX0FERFJFU1NfRk9SX0NIVU5LKGFkZHJlc3MsIGNo
dW5rVk1TdGFjaykpIHsKKyAgICAgICAgVEludCBvZmZzZXQgPSByZWludGVycHJldF9jYXN0PFRV
aW50OCo+KGFkZHJlc3MpIC0gY2h1bmtWTVN0YWNrLT5CYXNlKCk7IAorICAgICAgICBUSW50IGVy
cm9yID0gY2h1bmtWTVN0YWNrLT5Db21taXQob2Zmc2V0LCBieXRlcyk7CisgICAgICAgIHJldHVy
bjsgCisgICAgfQorCisgICAgaWYgKGNodW5rSklUQ29kZSAmJiBJU19BRERSRVNTX0ZPUl9DSFVO
SyhhZGRyZXNzLCBjaHVua0pJVENvZGUpKSB7IAorICAgICAgICAvLyBubyBjb21taXQgaGVyZSwg
c2luY2UgU3ltYmlhbiBPUyBmb3JjZXMgY29kZSBjaHVua3MgdG8gY29tbWl0IGltbWVkaWF0ZWx5
CisgICAgICAgIC8vIHVwb24gY3JlYXRpb24uIAorICAgICAgICByZXR1cm47IAorICAgIH0KKwor
ICAgIC8vIEZhbGwgdGhyb3VnaCBmb3IgaGVhcCBiYXNlZCBhbGxvY2F0aW9ucworCit9CisKKy8v
IFJlbGVhc2UgcmVzZXJ2ZWQgKGJ1dCBub3QgY29tbWl0dGVkKSByZWdpb24KK3ZvaWQgT1NBbGxv
Y2F0b3I6OnJlbGVhc2VEZWNvbW1pdHRlZCh2b2lkKiAsIHNpemVfdCkKIHsKLSAgICByZXR1cm4g
ZmFzdE1hbGxvYyhieXRlcyk7CisKKyAgICAvLyBXZSBkbyBub3RoaW5nIGZvciB0aGUgR0MgQ29s
bGVjdG9yIGFuZCBIYW5kbGUgcG9vbAorICAgIC8vIGNodW5rcyBhcyB3ZSBvbmx5IGRvIDEgKGxh
cmdlKSB1cC1mcm9udCByZXNlcnZhdGlvbgorCisgICAgLy8gSWYgdGhlIFJlZ2lzdGVyRmlsZSBj
aHVuayBkb2Vzbid0IGhhdmUgYW55dGhpbmcKKyAgICAvLyBpbiBjb21taXR0ZWQgc3RhdGUgYW55
bW9yZSwgZGVsZXRlIGl0IHRvCisgICAgLy8gcmVsZWFzaW5nIHZpcnR1YWwgYWRkcmVzcyB0byB0
aGUgT1MgCisgICAgaWYgKGNodW5rVk1TdGFjayAmJiAhY2h1bmtWTVN0YWNrLT5TaXplKCkpIHsg
CisgICAgICAgIGRlbGV0ZSBjaHVua1ZNU3RhY2s7IAorICAgICAgICBjaHVua1ZNU3RhY2sgPSAw
OyAKKyAgICAgICAgcmV0dXJuOyAKKyAgICB9CisKKyAgICAvLyBEaXR0byBmb3IgY2h1bmtKSVRD
b2RlCisgICAgaWYgKGNodW5rSklUQ29kZSAmJiAhY2h1bmtKSVRDb2RlLT5TaXplKCkpIHsgCisg
ICAgICAgIGRlbGV0ZSBjaHVua0pJVENvZGU7IAorICAgICAgICBjaHVua0pJVENvZGUgPSAwOwor
ICAgICAgICByZXR1cm47IAorICAgIH0KKwogfQogCi12b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2
ZUFuZENvbW1pdChzaXplX3QgYnl0ZXMsIFVzYWdlLCBib29sLCBib29sKQordm9pZCBPU0FsbG9j
YXRvcjo6ZGVjb21taXQodm9pZCogYWRkcmVzcywgc2l6ZV90IGJ5dGVzKQogewotICAgIHJldHVy
biBmYXN0TWFsbG9jKGJ5dGVzKTsKKyAgICBpZiAoY2h1bmtHQ0Jsb2NrcyAmJiBJU19BRERSRVNT
X0ZPUl9DSFVOSyhhZGRyZXNzLCBjaHVua0dDQmxvY2tzKSkgeyAKKyAgICAgICAgYm9vbCBvayA9
IGNodW5rR0NCbG9ja3MtPmRlY29tbWl0KGFkZHJlc3MpOworICAgICAgICByZXR1cm47IAorICAg
IH0KKworICAgIGlmIChjaHVua0dDSGFuZGxlUG9vbCAmJiBJU19BRERSRVNTX0ZPUl9DSFVOSyhh
ZGRyZXNzLCBjaHVua0dDSGFuZGxlUG9vbCkpIHsgCisgICAgICAgIGJvb2wgb2sgPSBjaHVua0dD
SGFuZGxlUG9vbC0+ZGVjb21taXQoYWRkcmVzcyk7CisgICAgICAgIHJldHVybjsgCisgICAgfQor
CisgICAgaWYgKGNodW5rVk1TdGFjayAmJiBJU19BRERSRVNTX0ZPUl9DSFVOSyhhZGRyZXNzLCBj
aHVua1ZNU3RhY2spKSB7IAorICAgICAgICBUSW50IG9mZnNldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8
VFVpbnQ4Kj4oYWRkcmVzcykgLSBjaHVua1ZNU3RhY2stPkJhc2UoKTsgCisgICAgICAgIFRJbnQg
ZXJyb3IgPSBjaHVua1ZNU3RhY2stPkRlY29tbWl0KG9mZnNldCwgYnl0ZXMpOyAKKyAgICAgICAg
cmV0dXJuOyAKKyAgICB9CisKKyAgICBpZiAoY2h1bmtKSVRDb2RlICYmIElTX0FERFJFU1NfRk9S
X0NIVU5LKGFkZHJlc3MsIGNodW5rSklUQ29kZSkpIHsKKyAgICAgICAgVEludCBvZmZzZXQgPSBy
ZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIC0gY2h1bmtKSVRDb2RlLT5CYXNlKCk7
CisgICAgICAgIFRJbnQgZXJyb3IgPSBjaHVua0pJVENvZGUtPkRlY29tbWl0KG9mZnNldCwgYnl0
ZXMpOworICAgICAgICByZXR1cm47IAorICAgIH0KKworICAgIC8vIERpcmVjdGx5IGZyZWUoKSBh
bnkgbm9uLWNodW5rIGFsbG9jYXRpb25zIAorICAgIGlmIChhZGRyZXNzKSAKKyAgICAgICAgVXNl
cjo6RnJlZShhZGRyZXNzKTsKKworfQorCit2b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZUFuZENv
bW1pdChzaXplX3QgYnl0ZXMsIFVzYWdlIHVzYWdlLCBib29sIHdyaXRhYmxlLCBib29sIGV4ZWN1
dGFibGUpCit7IAorICAgIHZvaWQqIGJhc2UgPSByZXNlcnZlVW5jb21taXR0ZWQoYnl0ZXMsIHVz
YWdlLCB3cml0YWJsZSwgZXhlY3V0YWJsZSk7CisgICAgY29tbWl0KGJhc2UsIGJ5dGVzLCB3cml0
YWJsZSwgZXhlY3V0YWJsZSk7CisgICAgcmV0dXJuIGJhc2U7CiB9CiAKLXZvaWQgT1NBbGxvY2F0
b3I6OmNvbW1pdCh2b2lkKiwgc2l6ZV90LCBib29sLCBib29sKQorLy8gSGVscGVyIGNsYXNzIHRo
YXQgbWFwcyBjb21taXR0ZWQvZGVjb21taXRlZCBzdGF0ZSBvZiBtYW55IGJsb2NrU2l6ZS1zaXpl
ZCBibG9ja3MsCisvLyBlYWNoIGJsb2NrU2l6ZSBhbGlnbmVkLCB0byBhIHNpbmdsZSBSQ2h1bmsn
cyAodmVyeSBsYXJnZSkgcmVzZXJ2YXRpb24uCisvLyBUaGUgY2h1bmsgaGFuZGxlIGlzIGtlcHQg
YXMgY29udGV4dC4gCitXcmFwcGVkQ2h1bms6OldyYXBwZWRDaHVuayhUSW50IG1heFJlc2VydmF0
aW9uU2l6ZSwgY29uc3QgVEludCBibG9ja1NpemUpIAorICAgIDogbV9ibG9ja1NpemUoYmxvY2tT
aXplKQogeworICAgIC8vIEdldCBzeXN0ZW0ncyBwYWdlIHNpemUuCisgICAgU1lNQklBTl9QQUdF
U0laRShtX3BhZ2VTaXplKTsgCisKKyAgICAvLyBPbmx5IGFjY2VwdCBtdWx0aXBsZXMgb2Ygc3lz
dGVtIHBhZ2Ugc2l6ZSBmb3IgYm90aCBpbml0aWFsIHJlc2VydmF0aW9uIGFuZCB0aGUgYWxpZ25t
ZW50L2Jsb2NrIHNpemUKKyAgICBtYXhSZXNlcnZhdGlvblNpemUgPSBTWU1CSUFOX1JPVU5EVVBU
T01VTFRJUExFKG1heFJlc2VydmF0aW9uU2l6ZSwgbV9wYWdlU2l6ZSk7CisgICAgX19BU1NFUlRf
QUxXQVlTKFNZTUJJQU5fUk9VTkRVUFRPTVVMVElQTEUobV9ibG9ja1NpemUsIG1fcGFnZVNpemUp
LCBVc2VyOjpQYW5pYyhfTCgiT1NBbGxvY2F0b3IyIiksIEtFcnJBcmd1bWVudCkpOworCisgICAg
Ly8gQ2FsY3VsYXRlIG1heC4gYml0IGZsYWdzIHdlIG5lZWQgdG8gY2FydmUgYSByZXNlcnZhdGlv
blNpemUgcmFuZ2UgaW50byBibG9ja1NpemUtc2l6ZWQgYmxvY2tzCisgICAgbV9tYXAubnVtQml0
cyA9IG1heFJlc2VydmF0aW9uU2l6ZSAvIG1fYmxvY2tTaXplOyAgIAorICAgIGNvbnN0IFRVaW50
MzIgYml0c1BlcldvcmQgPSA4KnNpemVvZihUVWludDMyKTsgCisgICAgY29uc3QgVFVpbnQzMiBu
dW1Xb3JkcyA9IChtX21hcC5udW1CaXRzICsgYml0c1BlcldvcmQgLTEpIC8gYml0c1BlcldvcmQ7
IAorCisgICAgbV9tYXAuYml0cyA9IG5ldyBUVWludDMyW251bVdvcmRzXTsKKyAgICBtX21hcC5j
bGVhckFsbCgpOworCisgICAgLy8gUmVzZXJ2ZSByZXF1ZXN0ZWQgdmlydHVhbCBhZGRyZXNzIHJh
bmdlLCBub3RoaW5nIGNvbW1pdHRlZCBqdXN0IHlldAorICAgIFRJbnQgcmV0ID0gbV9jaHVuay5D
cmVhdGVEaXNjb25uZWN0ZWRMb2NhbCgwICwgMCwgbWF4UmVzZXJ2YXRpb25TaXplKTsgIAorCisg
ICAgLy8gVGhpcyBpcyB0aGUgb2Zmc2V0IHRvIG1fY2h1bmsuQmFzZSgpIHJlcXVpcmVkIHRvIGdl
dCBhIG1fYmxvY2tTaXplLWFsaWduZWQgYWRkcmVzcworICAgIG1fb2Zmc2V0ID0gU1lNQklBTl9S
T1VORFVQVE9NVUxUSVBMRShUVWludDMyKG1fY2h1bmsuQmFzZSgpKSwgbV9ibG9ja1NpemUpIC0g
VFVpbnQobV9jaHVuay5CYXNlKCkpOyAKKwogfQogCi12b2lkIE9TQWxsb2NhdG9yOjpkZWNvbW1p
dCh2b2lkKiwgc2l6ZV90KQorV3JhcHBlZENodW5rOjp+V3JhcHBlZENodW5rKCkgCiB7CisgICAg
ZGVsZXRlIG1fbWFwLmJpdHM7CisgICAgbV9tYXAuYml0cyA9IDA7IAorICAgIG1fY2h1bmsuRGVj
b21taXQoMCwgbV9jaHVuay5NYXhTaXplKCkpOworICAgIG1fY2h1bmsuQ2xvc2UoKTsKIH0KIAot
dm9pZCBPU0FsbG9jYXRvcjo6cmVsZWFzZURlY29tbWl0dGVkKHZvaWQqIGFkZHJlc3MsIHNpemVf
dCkKKy8vIFNlYXJjaGVzIGZvciB0aGUgbmV4dCBhdmFpbGFibGUgYmxvY2ssICJwYXJrcyIgaXQg
aW50ZXJuYWxseQorLy8gaW4gdGhlIGJpdG1hcCBhbmQgYW5kIHJldHVybnMgaXRzIChiYXNlKSBh
ZGRyZXNzCisvLyBNVVNUIHByZWNlZGUgYSBjYWxsIHRvIGNvbW1pdCh2b2lkICphZGRyZXNzKQor
dm9pZCogV3JhcHBlZENodW5rOjpwYXJrTmV4dEF2YWlsYWJsZUJsb2NrKCkgCit7IAorICAgIC8v
IExvb2sgdXAgZmlyc3QgZnJlZSBzbG90IGluIGJpdCBtYXAKKyAgICBjb25zdCBUSW50IGZyZWVJ
ZHggPSBtX21hcC5maW5kRnJlZSgpOworCisgICAgLy8gUHNldWRvIE9PTTogV2UgYXRlIHVwIHRo
ZSBhZGRyZXNzIHNwYWNlIHdlIHJlc2VydmVkLi4KKyAgICAvLyAuLmV2ZW4gdGhvdWdoIHRoZSBk
ZXZpY2UgbWF5IGhhdmUgZnJlZSBSQU0gbGVmdAorICAgIGlmIChmcmVlSWR4IDwgMCkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICAvLyBVcGRhdGVkIGJpdCB0byBtYXJrIHJlZ2lvbiBhcyBpbiB1
c2UgKCJwYXJrZWQiLCBub3QgY29tbWl0dGVkIGZyb20gdGhlIE9TIHBvaW50IG9mIHZpZXcpIC4g
CisgICAgbV9tYXAuc2V0KGZyZWVJZHgpOyAKKworICAgIC8vIENhbGN1bGF0ZSBhYnNvbHV0ZSBh
ZGRyZXNzIG9mIHNvb24tdG8tYmUtY29tbWl0dGVkIHJlZ2lvbiAoYmxvY2spCisgICAgcmV0dXJu
IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCBtX2NodW5rLkJhc2UoKSArIG1fb2Zmc2V0ICsgKFRV
aW50KShtX2Jsb2NrU2l6ZSAqIGZyZWVJZHgpICk7IAorfQorCisvLyBNVVNUIGJlIG1hdGNoZWQg
d2l0aCBhIHByZXZpb3VzIHBhcmtOZXh0QXZhaWxhYmxlQmxvY2soKSBjYWxsCitib29sIFdyYXBw
ZWRDaHVuazo6Y29tbWl0KHZvaWQgKmFkZHJlc3MpIAoreyAKKyAgICBib29sIG9rID0gZmFsc2U7
IAorCisgICAgLy8gQ2FsY3VsYXRlIGluZGV4IG9mIGJsb2NrCisgICAgVEludCBpZHggPSBUVWlu
dChyZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIC0gbV9jaHVuay5CYXNlKCkgLSBt
X29mZnNldCkgLyBtX2Jsb2NrU2l6ZTsKKyAgICAvLyBUaGlzIGJpdCBzaG91bGQgcHJldmlvdXNs
eSBoYXZlIGJlZW4gc2V0IHZpYSBwYXJrTmV4dEF2YWlsYWJsZUJsb2NrKCkKKyAgICBfX0FTU0VS
VF9BTFdBWVMobV9tYXAuZ2V0KGlkeCksIFVzZXI6OlBhbmljKF9MKCJPU0FsbG9jYXRvcjMiKSwg
S0VyckFyZ3VtZW50KSk7CisgICAgCisgICAgVEludCByZXQgPSBtX2NodW5rLkNvbW1pdChyZWlu
dGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIC0gbV9jaHVuay5CYXNlKCksIG1fYmxvY2tT
aXplKTsKKyAgICBpZiAocmV0ID09IEtFcnJOb25lKSB7IAorICAgICAgICBtX21hcC5zZXQoaWR4
KTsgCisgICAgICAgIG9rID0gdHJ1ZTsgCisgICAgfQorICAgIHJldHVybiBvazsKK30KKworYm9v
bCBXcmFwcGVkQ2h1bms6OmRlY29tbWl0KHZvaWQgKmFkZHJlc3MpIAogewotICAgIGZhc3RGcmVl
KGFkZHJlc3MpOworICAgIC8vIENhbGN1bGF0ZSBvZmZzZXQgZnJvbSBjaHVuayBiYXNlIGFuZCBk
ZWNvbW1pdAorICAgIFRJbnQgcmV0ID0gbV9jaHVuay5EZWNvbW1pdChyZWludGVycHJldF9jYXN0
PFRVaW50OCo+KGFkZHJlc3MpIC0gbV9jaHVuay5CYXNlKCksIG1fYmxvY2tTaXplKTsKKyAgICAv
LyBDYWxjdWxhdGUgaW5kZXggaW4gbWFwCisgICAgVEludCBpZHggPSBUVWludChyZWludGVycHJl
dF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIC0gbV9jaHVuay5CYXNlKCkgLSBtX29mZnNldCkgLyBt
X2Jsb2NrU2l6ZTsKKyAgICBtX21hcC5jbGVhcihpZHgpOyAgCisgICAgcmV0dXJuIChyZXQgPT0g
S0Vyck5vbmUgPyB0cnVlIDogZmFsc2UpOwogfQogCitUVWludDgqIFdyYXBwZWRDaHVuazo6QmFz
ZSgpIHsgcmV0dXJuIG1fY2h1bmsuQmFzZSgpOyB9CitUSW50IFdyYXBwZWRDaHVuazo6U2l6ZSgp
IHsgcmV0dXJuIG1fY2h1bmsuU2l6ZSgpOyB9CitUSW50IFdyYXBwZWRDaHVuazo6TWF4U2l6ZSgp
IHsgcmV0dXJuIG1fY2h1bmsuTWF4U2l6ZSgpOyB9CisKKwogfSAvLyBuYW1lc3BhY2UgV1RGCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL09TQWxsb2NhdG9yU3ltYmlhbi5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3JTeW1iaWFuLmgJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL09TQWxsb2NhdG9yU3lt
Ymlhbi5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDExIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRl
ciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAq
ICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
Zm5kZWYgT1NBbGxvY2F0b3JTeW1iaWFuX2gKKyNkZWZpbmUgT1NBbGxvY2F0b3JTeW1iaWFuX2gK
KworbmFtZXNwYWNlIFdURiB7IAorLy8gSGVscGVyIGNsYXNzIHRoYXQgbWFwcyBjb21taXR0ZWQv
ZGVjb21taXRlZCBzdGF0ZSBvZiBtYW55IGJsb2NrU2l6ZS1zaXplZCBibG9ja3MsCisvLyBlYWNo
IGJsb2NrU2l6ZSBhbGlnbmVkLCB0byBhIHNpbmdsZSBSQ2h1bmsncyAodmVyeSBsYXJnZSkgcmVz
ZXJ2YXRpb24uCisvLyBUaGUgY2h1bmsgaGFuZGxlIGlzIGtlcHQgYXMgY29udGV4dCBhY3Jvc3Mg
dGhlIGxpZmVjeWNsZSBvZiB0aGUgcHJvY2Vzcy4KKy8vIFVzZWQgZm9yIENvbGxlY3RvciBibG9j
a3MgYW5kIEdDIGhhbmRsZSBwb29sIGF0IHRoaXMgdGltZS4KK2NsYXNzIFdyYXBwZWRDaHVuayB7
CisgICAgCitwdWJsaWM6ICAgICAKKyAgICBXcmFwcGVkQ2h1bmsoVEludCBtYXhSZXNlcnZhdGlv
blNpemUsIGNvbnN0IFRJbnQgYmxvY2tTaXplKTsKKyAgICB+V3JhcHBlZENodW5rKCk7CisgICAg
CisgICAgdm9pZCAqcGFya05leHRBdmFpbGFibGVCbG9jaygpOworICAgIGJvb2wgY29tbWl0KHZv
aWQgKmFkZHJlc3MpOworICAgIGJvb2wgZGVjb21taXQodm9pZCAqYWRkcmVzcyk7CisgICAgCisg
ICAgVFVpbnQ4KiBCYXNlKCk7CisgICAgVEludCBTaXplKCk7CisgICAgVEludCBNYXhTaXplKCk7
CisgICAgCitwcml2YXRlOiAgICAgCisgICAgVFVpbnQgbV9vZmZzZXQ7IC8vIG9mZnNldCBmcm9t
IGNodW5rJ3MgYmFzZSBuZWVkZWQgdG8gZ2V0IGJsb2NrU2l6ZSBhbGlnbmVkIGJsb2NrCisgICAg
VEludCBtX3BhZ2VTaXplOyAKKyAgICBUSW50IG1fYmxvY2tTaXplOworICAgIFJDaHVuayBtX2No
dW5rOworICAgIAorICAgIHN0cnVjdCB7CisgICAgICAgIFRVaW50MzIgKmJpdHM7IC8vIGFycmF5
IG9mIGJpdCBmbGFncyAKKyAgICAgICAgVFVpbnQzMiBudW1CaXRzOyAvLyBudW1iZXIgb2YgcmVn
aW9ucyB0byBrZWVwIHRyYWNrIG9mCisKKyAgICAgICAgYm9vbCBnZXQoVFVpbnQzMiBuKSBjb25z
dCAKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEhKGJpdHNbbiA+PiA1XSAmICgxIDw8
IChuICYgMHgxRikpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0KFRVaW50MzIgbikg
CisgICAgICAgIHsKKyAgICAgICAgICAgIGJpdHNbbiA+PiA1XSB8PSAoMSA8PCAobiAmIDB4MUYp
KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY2xlYXIoVFVpbnQzMiBuKQorICAgICAgICB7
CisgICAgICAgICAgICBiaXRzW24gPj4gNV0gJj0gfigxIDw8IChuICYgMHgxRikpOworICAgICAg
ICB9CisKKyAgICAgICAgdm9pZCBjbGVhckFsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZv
ciAoVFVpbnQzMiBpID0gMDsgaSA8IG51bUJpdHM7IGkrKykKKyAgICAgICAgICAgICAgICBjbGVh
cihpKTsKKyAgICAgICAgfQorCisgICAgICAgIFRJbnQgZmluZEZyZWUoKSBjb25zdAorICAgICAg
ICB7CisgICAgICAgICAgICBmb3IgKFRVaW50MzIgaSA9IDA7IGkgPCBudW1CaXRzOyBpKyspIHsK
KyAgICAgICAgICAgICAgICBpZiAoIWdldChpKSkgCisgICAgICAgICAgICAgICAgICAgIHJldHVy
biBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisK
KyAgICB9IG1fbWFwOworICAgIAorfTsKKworfSAvLyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZiAv
LyBPU0FsbG9jYXRvclN5bWJpYW5faAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3Rm
L1BhZ2VBbGxvY2F0aW9uQWxpZ25lZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL3d0Zi9QYWdlQWxsb2NhdGlvbkFsaWduZWQuY3BwCShyZXZpc2lvbiA3NTM3NSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvUGFnZUFsbG9jYXRpb25BbGlnbmVkLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNTAsOCArNTAsMTEgQEAgUGFnZUFsbG9jYXRpb25BbGlnbmVkIFBhZ2VB
bGxvY2F0aW9uQWxpZwogICAgIHZtX21hcChjdXJyZW50X3Rhc2soKSwgJmFkZHJlc3MsIHNpemUs
IGFsaWdubWVudE1hc2ssIGZsYWdzLCBNRU1PUllfT0JKRUNUX05VTEwsIDAsIEZBTFNFLCBwcm90
ZWN0aW9uLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLCBWTV9JTkhFUklUX0RF
RkFVTFQpOwogICAgIHJldHVybiBQYWdlQWxsb2NhdGlvbkFsaWduZWQocmVpbnRlcnByZXRfY2Fz
dDx2b2lkKj4oYWRkcmVzcyksIHNpemUpOwogI2Vsc2UKLSAgICBzaXplX3QgYWxpZ25tZW50RGVs
dGEgPSBhbGlnbm1lbnQgLSBwYWdlU2l6ZSgpOwotCisgICAgc2l6ZV90IGFsaWdubWVudERlbHRh
KDApOworI2lmICFPUyhTWU1CSUFOKSAgICAKKyAgICBhbGlnbm1lbnREZWx0YSA9IGFsaWdubWVu
dCAtIHBhZ2VTaXplKCk7CisjZW5kaWYKKyAgICAKICAgICAvLyBSZXNlcmVydmUgd2l0aCBzdWZm
Y2llbnQgYWRkaXRpb25hbCBWTSB0byBjb3JyZWN0bHkgYWxpZ24uCiAgICAgc2l6ZV90IHJlc2Vy
dmF0aW9uU2l6ZSA9IHNpemUgKyBhbGlnbm1lbnREZWx0YTsKICAgICB2b2lkKiByZXNlcnZhdGlv
bkJhc2UgPSBPU0FsbG9jYXRvcjo6cmVzZXJ2ZVVuY29tbWl0dGVkKHJlc2VydmF0aW9uU2l6ZSwg
dXNhZ2UsIHdyaXRhYmxlLCBleGVjdXRhYmxlKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS93dGYvVk1UYWdzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9W
TVRhZ3MuaAkocmV2aXNpb24gNzYyNDcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL1ZN
VGFncy5oCSh3b3JraW5nIGNvcHkpCkBAIC03OSwxMSArNzksMTEgQEAKIAogI2Vsc2UgLy8gT1Mo
REFSV0lOKQogCi0jZGVmaW5lIFZNX1RBR19GT1JfVENNQUxMT0NfTUVNT1JZIC0xCi0jZGVmaW5l
IFZNX1RBR19GT1JfQ09MTEVDVE9SX01FTU9SWSAtMQotI2RlZmluZSBWTV9UQUdfRk9SX0VYRUNV
VEFCTEVBTExPQ0FUT1JfTUVNT1JZIC0xCi0jZGVmaW5lIFZNX1RBR19GT1JfUkVHSVNURVJGSUxF
X01FTU9SWSAtMQotI2RlZmluZSBWTV9UQUdfRk9SX1dFQkNPUkVfUFVSR0VBQkxFX01FTU9SWSAt
MQorI2RlZmluZSBWTV9UQUdfRk9SX1RDTUFMTE9DX01FTU9SWSAxCisjZGVmaW5lIFZNX1RBR19G
T1JfQ09MTEVDVE9SX01FTU9SWSAyCisjZGVmaW5lIFZNX1RBR19GT1JfRVhFQ1VUQUJMRUFMTE9D
QVRPUl9NRU1PUlkgMworI2RlZmluZSBWTV9UQUdfRk9SX1JFR0lTVEVSRklMRV9NRU1PUlkgNAor
I2RlZmluZSBWTV9UQUdfRk9SX1dFQkNPUkVfUFVSR0VBQkxFX01FTU9SWSA1CiAKICNlbmRpZiAv
LyBPUyhEQVJXSU4pCiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvd3RmLnByaQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL3d0Zi5wcmkJKHJldmlzaW9u
IDc2MjQ3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi93dGYucHJpCSh3b3JraW5nIGNv
cHkpCkBAIC00OSwzICs0OSw5IEBAIGNvbnRhaW5zKERFRklORVMsIFVTRV9HU1RSRUFNRVI9MSkg
ewogdW5peDohc3ltYmlhbjogU09VUkNFUyArPSB3dGYvT1NBbGxvY2F0b3JQb3NpeC5jcHAKIHN5
bWJpYW46IFNPVVJDRVMgKz0gd3RmL09TQWxsb2NhdG9yU3ltYmlhbi5jcHAKIHdpbip8d2luY2Uq
OiBTT1VSQ0VTICs9IHd0Zi9PU0FsbG9jYXRvcldpbi5jcHAKKworc3ltYmlhbjogeworICAgIExJ
QlMgKz0gLWxoYWwKKyAgICAjIEZvciBoYWwuaAorICAgIElOQ0xVREVQQVRIICo9ICQkTVdfTEFZ
RVJfU1lTVEVNSU5DTFVERQorfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>79635</attachid>
            <date>2011-01-20 12:34:31 -0800</date>
            <delta_ts>2011-01-20 13:48:07 -0800</delta_ts>
            <desc>Fixed style issue, and updated Changelog to indicate that JSC JIT is currently not working and will be fixed in a later patch</desc>
            <filename>51128_v3.patch</filename>
            <type>text/plain</type>
            <size>22768</size>
            <attacher name="Siddharth Mathur">s.mathur</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNzYyNDgpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzggQEAK
KzIwMTEtMDEtMjAgIFNpZGRoYXJ0aCBNYXRodXIgIDxzaWRkaGFydGgubWF0aHVyQG5va2lhLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbU3lt
Ymlhbl0gT1NBbGxvY2F0b3IgaW1wbGVtZW50YXRpb24KKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUxMTI4CisKKyAgICAgICAgSW1wbGVtZW50IFJDaHVu
ayBwb3dlcmVkIHJlc2VydmUgYW5kIGNvbW1pdCBvcGVyYXRpb25zIGZyb20gT1NBbGxvY2F0b3Iu
aAorICAgICAgICBKU0MgSklUIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLCBhbmQgd2lsbCBi
ZSBmaXhlZCAgaW4gYSBsYXRlciBwYXRjaC4KKworICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnBy
aTogbW92ZSBvdXQgSEFMIGxpbmthZ2UgYmxvY2sgdG8gd3RmLnByaQorCisgICAgICAgICogd3Rm
L09TQWxsb2NhdG9yLmg6CisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpkZWNvbW1pdEFuZFJl
bGVhc2UpOiAgYWRkIGV4cGxpY2l0IGRlY29tbWl0IGxpa2UgV2luQ0UKKyAgICAgICAgKiB3dGYv
T1NBbGxvY2F0b3JTeW1iaWFuLmNwcDogaW1wbGVtZW50YXRpb24gb2YgT1NBbGxvY3RvciBpbnRl
cmZhY2UgCisgICAgICAgIChXVEY6OmdldEJhY2tpbmdDaHVuayk6IGhlbHBlciBmdW5jdGlvbiB0
byBnZXQgY29ycmVjdCBiYWNraW5nIGNodW5rCisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpy
ZXNlcnZlVW5jb21taXR0ZWQpOgorICAgICAgICAoV1RGOjpPU0FsbG9jYXRvcjo6Y29tbWl0KToK
KyAgICAgICAgKFdURjo6T1NBbGxvY2F0b3I6OnJlbGVhc2VEZWNvbW1pdHRlZCk6CisgICAgICAg
IChXVEY6Ok9TQWxsb2NhdG9yOjpkZWNvbW1pdCk6CisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9y
OjpyZXNlcnZlQW5kQ29tbWl0KToKKyAgICAgICAgKFdURjo6V3JhcHBlZENodW5rOjpXcmFwcGVk
Q2h1bmspOiBIZWxwZXIgY2xhc3MgZm9yIGFsaWduZWQgYmxvY2tzCisgICAgICAgIChXVEY6Oldy
YXBwZWRDaHVuazo6fldyYXBwZWRDaHVuayk6CisgICAgICAgIChXVEY6OldyYXBwZWRDaHVuazo6
cGFya05leHRBdmFpbGFibGVCbG9jayk6CisgICAgICAgIChXVEY6OldyYXBwZWRDaHVuazo6Y29t
bWl0KToKKyAgICAgICAgKFdURjo6V3JhcHBlZENodW5rOjpkZWNvbW1pdCk6CisgICAgICAgIChX
VEY6OldyYXBwZWRDaHVuazo6QmFzZSk6CisgICAgICAgIChXVEY6OldyYXBwZWRDaHVuazo6U2l6
ZSk6CisgICAgICAgIChXVEY6OldyYXBwZWRDaHVuazo6TWF4U2l6ZSk6CisgICAgICAgICogd3Rm
L09TQWxsb2NhdG9yU3ltYmlhbi5oOiBBZGRlZC4gRGVjbGFyYXRpb24gb2YgV3JhcHBlZENodW5r
IAorICAgICAgICAqIHd0Zi9QYWdlQWxsb2NhdGlvbkFsaWduZWQuY3BwOgorICAgICAgICAoV1RG
OjpQYWdlQWxsb2NhdGlvbkFsaWduZWQ6OmFsbG9jYXRlKTogYWxpZ25tZW50IGZvciBTeW1iaWFu
IGlzIGhhbmRsZWQgZG93bnN0cmVhbQorICAgICAgICAqIHd0Zi9WTVRhZ3MuaDogY29ycmVjdCBl
bnVtIGludGVnZXIgdmFsdWVzIHNvIHRoYXQgdGhleSBhcmUgZGlmZmVyZW50aWFibGUKKyAgICAg
ICAgKiB3dGYvd3RmLnByaTogbmV3IGhvbWUgZm9yIEhBTCBsaW5rYWdlIGJsb2NrCisKIDIwMTEt
MDEtMjAgIFpvbHRhbiBIb3J2YXRoICA8em9sdGFuQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgQ3NhYmEgT3N6dHJvZ29uw6FjLgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L0phdmFTY3JpcHRDb3JlLnByaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
SmF2YVNjcmlwdENvcmUucHJpCShyZXZpc2lvbiA3NjI0NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9KYXZhU2NyaXB0Q29yZS5wcmkJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDEyICs0OCw2IEBA
IHN5bWJpYW4gewogICAgIElOQ0xVREVQQVRIID0gJCRKQVZBU0NSSVBUQ09SRV9JTkNMVURFUEFU
SCAkJElOQ0xVREVQQVRICiB9CiAKLXN5bWJpYW46IHsKLSAgICBMSUJTICs9IC1saGFsCi0gICAg
IyBGb3IgaGFsLmgKLSAgICBJTkNMVURFUEFUSCAqPSAkJE1XX0xBWUVSX1NZU1RFTUlOQ0xVREUK
LX0KLQogd2luMzItKjogREVGSU5FUyArPSBfSEFTX1RSMT0wCiAKIERFRklORVMgKz0gQlVJTERJ
TkdfSmF2YVNjcmlwdENvcmUgQlVJTERJTkdfV1RGCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd3RmL09TQWxsb2NhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L3d0Zi9PU0FsbG9jYXRvci5oCShyZXZpc2lvbiA3NjI0NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS93dGYvT1NBbGxvY2F0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtNzcsOSArNzcsOCBAQCBp
bmxpbmUgdm9pZCogT1NBbGxvY2F0b3I6OnJlc2VydmVBbmRDb21tCiBpbmxpbmUgdm9pZCBPU0Fs
bG9jYXRvcjo6ZGVjb21taXRBbmRSZWxlYXNlKHZvaWQqIHJlbGVhc2VCYXNlLCBzaXplX3QgcmVs
ZWFzZVNpemUsIHZvaWQqIGRlY29tbWl0QmFzZSwgc2l6ZV90IGRlY29tbWl0U2l6ZSkKIHsKICAg
ICBBU1NFUlQoZGVjb21taXRCYXNlID49IHJlbGVhc2VCYXNlICYmIChzdGF0aWNfY2FzdDxjaGFy
Kj4oZGVjb21taXRCYXNlKSArIGRlY29tbWl0U2l6ZSkgPD0gKHN0YXRpY19jYXN0PGNoYXIqPihy
ZWxlYXNlQmFzZSkgKyByZWxlYXNlU2l6ZSkpOwotI2lmIE9TKFdJTkNFKQotICAgIC8vIE9uIG1v
c3QgcGxhdGZvcm1zIHdlIGNhbiBhY3R1YWxseSBza2lwIHRoaXMgZmluYWwgZGVjb21taXQ7IHJl
bGVhc2luZyB0aGUgVk0gd2lsbAotICAgIC8vIGltcGxpY2l0bHkgZGVjb21taXQgYW55IHBoeXNp
Y2FsIG1lbW9yeSBpbiB0aGUgcmVnaW9uLiBUaGlzIGlzIG5vdCB0cnVlIG9uIFdJTkNFLgorI2lm
IE9TKFdJTkNFKSB8fCBPUyhTWU1CSUFOKQorICAgIC8vIFRoZXNlIE9TZXMgcHJlZmVyIGFuIGV4
cGxpY2l0IGRlY29tbWl0IGJlZm9yZSBhIHJlbGVhc2UKICAgICBkZWNvbW1pdChkZWNvbW1pdEJh
c2UsIGRlY29tbWl0U2l6ZSk7CiAjZWxzZQogICAgIFVOVVNFRF9QQVJBTShkZWNvbW1pdEJhc2Up
OwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9PU0FsbG9jYXRvclN5bWJpYW4uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3JTeW1i
aWFuLmNwcAkocmV2aXNpb24gNzYyNDcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL09T
QWxsb2NhdG9yU3ltYmlhbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKgog
ICogQ29weXJpZ2h0IChDKSAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
IENvcHlyaWdodCAoQykgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlh
cnkoLWllcykuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKQEAgLTI0LDMzICsyNSwyODIgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiT1NBbGxvY2F0b3JTeW1iaWFuLmgiCisKKyNpbmNsdWRlICJDb2xsZWN0b3IuaCIg
Ly8gRm9yIEpTQzo6QkxPQ0tfU0laRQorI2luY2x1ZGUgIkdDSGFuZGxlLmgiIC8vIEZvciBXZWFr
R0NIYW5kbGVQb29sOjpQb29sc2l6ZQogI2luY2x1ZGUgIk9TQWxsb2NhdG9yLmgiCisjaW5jbHVk
ZSA8ZTMyc3RkLmg+CisjaW5jbHVkZSA8aGFsLmg+CiAKLSNpbmNsdWRlIDx3dGYvRmFzdE1hbGxv
Yy5oPgorLy8gbWFjcm9zIGZvciBvYnRhaW5pbmcgcGFnZXNpemUgYW5kIHJvdW5kaW5nIHVwCisj
ZGVmaW5lIFNZTUJJQU5fUEFHRVNJWkUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKEhBTDo6
R2V0KEhBTERhdGE6OkVNZW1vcnlQYWdlU2l6ZSwgeCkpOworI2RlZmluZSBTWU1CSUFOX1JPVU5E
VVBUT01VTFRJUExFKHgsIG11bHRpcGxlb2YpICAgICgoeCArIG11bHRpcGxlb2YgLSAxKSAmIH4o
bXVsdGlwbGVvZiAtIDEpKQorLy8gbWFjcm8gZm9yIGNoZWNraW5nIGlmIGEgZ2l2ZW4gYWRkcmVz
cyBpcyBiYWNrZWQgYnkgdGhlIGdpdmVuIChhbHJlYWR5IGluaXRpYWxpemVkKSBjaHVuaworI2Rl
ZmluZSBJU19BRERSRVNTX0ZPUl9DSFVOSyhhZGRyZXNzLCBjaHVuaykgICgocmVpbnRlcnByZXRf
Y2FzdDxUVWludDgqPihhZGRyZXNzKSA+PSBjaHVuay0+QmFzZSgpKSAmJiBcCisgICAgICAgIChy
ZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIDwgY2h1bmstPkJhc2UoKSArIGNodW5r
LT5NYXhTaXplKCkpKSAKIAogbmFtZXNwYWNlIFdURiB7CiAKLXZvaWQqIE9TQWxsb2NhdG9yOjpy
ZXNlcnZlVW5jb21taXR0ZWQoc2l6ZV90IGJ5dGVzLCBVc2FnZSwgYm9vbCwgYm9vbCkKK3N0YXRp
YyBjb25zdCBUSW50IG1heFJlc2VydmF0aW9uSlNDQ29sbGVjdG9ySGVhcCA9IDEyOCAqIDEwMjQg
KiAxMDI0OyAvLyAxMjggTUIKK3N0YXRpYyBjb25zdCBUSW50IG1heFJlc2VydmF0aW9uSlNDR0NI
YW5kbGVQb29sICA9IDEgKiAxMDI0ICogMTAyNDsgLy8gMSBNQgorCitzdGF0aWMgV3JhcHBlZENo
dW5rKiBjaHVua0dDQmxvY2tzKDApOworc3RhdGljIFdyYXBwZWRDaHVuayogY2h1bmtHQ0hhbmRs
ZVBvb2woMCk7CitzdGF0aWMgUkNodW5rKiBjaHVua0pJVENvZGUoMCk7CitzdGF0aWMgUkNodW5r
KiBjaHVua1ZNU3RhY2soMCk7CisKKy8vIFJldHVybiB0aGUgY29ycmVjdCBiYWNraW5nIGNodW5r
IG9iamVjdCBiYXNlZCBvbiByZXF1ZXN0IHR5cGUgYW5kIHNpemUsIGxhemlseSBjb25maWd1cmlu
ZyBpdCBmb3IgdXNlCitzdGF0aWMgdm9pZCogZ2V0QmFja2luZ0NodW5rKHNpemVfdCBieXRlcywg
T1NBbGxvY2F0b3I6OlVzYWdlIHVzYWdlLCBib29sIGV4ZWN1dGFibGUpIAoreworCisgICAgLy8g
MS4gQ2h1bmtzIGZvciBKU0MgQ29sbGVjdG9yIGhlYXAgYmxvY2tzIGFuZCBHQyBIYW5kbGUgUG9v
bCAKKyAgICAvLyAgICBJbml0aWFsaXplZCBoZXJlIE9OQ0Ugd2l0aCBhIGNvbXBpbGUtdGltZSBt
YXggcmVzZXJ2YXRpb24gc2l6ZSAKKyAgICBpZiAodXNhZ2UgPT0gT1NBbGxvY2F0b3I6OkpTR0NI
ZWFwUGFnZXMpIHsKKworICAgICAgICBpZiAoYnl0ZXMgPT0gSlNDOjpCTE9DS19TSVpFKSB7ICAK
KyAgICAgICAgICAgIGlmICghY2h1bmtHQ0Jsb2NrcykKKyAgICAgICAgICAgICAgICBjaHVua0dD
QmxvY2tzID0gbmV3IFdyYXBwZWRDaHVuayhtYXhSZXNlcnZhdGlvbkpTQ0NvbGxlY3RvckhlYXAs
IEpTQzo6QkxPQ0tfU0laRSk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dm9pZCo+
KGNodW5rR0NCbG9ja3MpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ5dGVzID09IEpTQzo6
V2Vha0dDSGFuZGxlUG9vbDo6cG9vbFNpemUpIHsgIAorICAgICAgICAgICAgaWYgKCFjaHVua0dD
SGFuZGxlUG9vbCkgCisgICAgICAgICAgICAgICAgY2h1bmtHQ0hhbmRsZVBvb2wgPSBuZXcgV3Jh
cHBlZENodW5rKG1heFJlc2VydmF0aW9uSlNDR0NIYW5kbGVQb29sLCBKU0M6OldlYWtHQ0hhbmRs
ZVBvb2w6OnBvb2xTaXplKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx2b2lkKj4o
Y2h1bmtHQ0hhbmRsZVBvb2wpOworICAgICAgICB9CisKKyAgICAgICAgVXNlcjo6UGFuaWMoX0wo
Ik9TQWxsb2NhdG9yMSIpLCBLRXJyTm90U3VwcG9ydGVkKTsKKyAgICB9CisKKyAgICAvLyAyLiBD
aHVuayBmb3IgUmVnaXN0ZXJGaWxlL1ZNIHN0YWNrCisgICAgLy8gLSBJbml0aWFsaXplZCBPTkNF
IHVzaW5nIGFyZ3VtZW50cyBmcm9tIHRoZSBmaXJzdCBjYWxsZXIgb2YgdGhpcyBjaHVuayB0eXBl
IAorICAgIC8vIC0gQXNzdW1lcyB0aGF0IG9ubHkgMSBzdWNoIGNodW5rIGlzIGV2ZXIgbmVlZGVk
IGdpdmVuIEpTQydzIGN1cnJlbnQgZGVzaWduCisgICAgaWYgKHVzYWdlID09IE9TQWxsb2NhdG9y
OjpKU1ZNU3RhY2tQYWdlcykgeworICAgICAgICBpZiAoIWNodW5rVk1TdGFjaykgeworICAgICAg
ICAgICAgY2h1bmtWTVN0YWNrID0gbmV3IFJDaHVuaygpOworICAgICAgICAgICAgVEludCBlcnJv
ciA9IGNodW5rVk1TdGFjay0+Q3JlYXRlRGlzY29ubmVjdGVkTG9jYWwoMCwgMCwgYnl0ZXMpOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx2b2lkKj4oY2h1bmtWTVN0YWNr
KTsKKyAgICB9CisKKyAgICAvLyAzLiBDaHVuayBmb3IgSklUIGNvZGUKKyAgICAvLyAtIEluaXRp
YWxpemVkIE9OQ0UgdXNpbmcgYXJndW1lbnRzIGZyb20gdGhlIGZpcnN0IGNhbGxlciBvZiB0aGlz
IGNodW5rIHR5cGUuCisgICAgLy8gLSBBc3N1bWVzIHRoYXQgb25seSAxIHN1Y2ggZXhlY3V0YWJs
ZSByZWdpb24gZm9yIEpJVCBjb2RlIGlzIG5lZWRlZCBnaXZlbiBKU0MncyBjdXJyZW50IGRlc2ln
bgorICAgIGlmIChleGVjdXRhYmxlICYmIHVzYWdlID09IE9TQWxsb2NhdG9yOjpKU0pJVENvZGVQ
YWdlcykgeyAKKyAgICAgICAgaWYgKCFjaHVua0pJVENvZGUpIHsKKyAgICAgICAgICAgIGNodW5r
SklUQ29kZSA9IG5ldyBSQ2h1bmsoKTsKKyAgICAgICAgICAgIFRJbnQgZXJyb3IgPSBjaHVua0pJ
VENvZGUtPkNyZWF0ZUxvY2FsQ29kZShieXRlcywgYnl0ZXMpOyAvLyByZXNlcnZlIEFORCBjb21t
aXQKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dm9pZCo+KGNodW5rSklU
Q29kZSk7IAorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvLyBSZXNlcnZlIG1lbW9yeSBh
bmQgcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgordm9pZCogT1NBbGxvY2F0
b3I6OnJlc2VydmVVbmNvbW1pdHRlZChzaXplX3QgcmVzZXJ2YXRpb25TaXplLCBVc2FnZSB1c2Fn
ZSwgYm9vbCAsIGJvb2wgZXhlY3V0YWJsZSkKK3sKKyAgICB2b2lkKiBjaHVuayA9IGdldEJhY2tp
bmdDaHVuayhyZXNlcnZhdGlvblNpemUsIHVzYWdlLCBleGVjdXRhYmxlKTsKKworICAgIGlmICh1
c2FnZSA9PSBPU0FsbG9jYXRvcjo6SlNHQ0hlYXBQYWdlcyAmJiBjaHVuaykgeworICAgICAgICAv
LyBXZSBkb24ndCBhY3R1YWxseSBkbyBhIHJlc2VydmF0aW9uIGZvciB0aGlzIGNhc2UsIGJlY2F1
c2UgYSBsYXJnZQorICAgICAgICAvLyBvbmUgaGFzIGFscmVhZHkgYmVlbiBkb25lIGluIHRoZSBX
cmFwcGVkQ2h1bmsgYyd0b3IgKGFib3ZlKS4gCisgICAgICAgIC8vIFdlIHNpbXBseSAicGFyayIg
YSBibG9jayBpbnRlcm5hbGx5IGJ5IHNldHRpbmcgYSBiaXQgaW4gb3VyIGJpdCBtYXAKKyAgICAg
ICAgLy8gdG8gaW5kaWNhdGUgaW50ZW50aW9uIHRvIHVzZS4gIAorICAgICAgICBXcmFwcGVkQ2h1
bmsqIHdjID0gc3RhdGljX2Nhc3Q8V3JhcHBlZENodW5rKj4oY2h1bmspOworICAgICAgICByZXR1
cm4gd2MtPnBhcmtOZXh0QXZhaWxhYmxlQmxvY2soKTsKKyAgICB9CisKKyAgICBpZiAodXNhZ2Ug
PT0gT1NBbGxvY2F0b3I6OkpTVk1TdGFja1BhZ2VzICYmIGNodW5rKSAKKyAgICAgICAgcmV0dXJu
IChzdGF0aWNfY2FzdDxSQ2h1bmsqPihjaHVuaykpLT5CYXNlKCk7CisgICAgCisgICAgaWYgKHVz
YWdlID09IE9TQWxsb2NhdG9yOjpKU0pJVENvZGVQYWdlcyAmJiBjaHVuaykKKyAgICAgICAgcmV0
dXJuIChzdGF0aWNfY2FzdDxSQ2h1bmsqPihjaHVuaykpLT5CYXNlKCk7CisKKyAgICAvLyBEaXJl
Y3RseSBoZWFwIGFsbG9jYXRlIGFueXRoaW5nIHRoYXQgaXNuJ3QgYmFja2VkIGJ5IGEgY2h1bmsK
KyAgICByZXR1cm4gVXNlcjo6QWxsb2MocmVzZXJ2YXRpb25TaXplKTsgIAorfQorCisvLyBBY3R1
YWxseSBjb21taXQgbWVtb3J5IGZyb20gT1MsIHdoaWNoIHdhcyBwcmV2aW91c2x5IHJlc2VydmVk
IHZpYSByZXNlcnZlVW5jb21taXR0ZWQoKQordm9pZCBPU0FsbG9jYXRvcjo6Y29tbWl0KHZvaWQq
IGFkZHJlc3MsIHNpemVfdCBieXRlcywgYm9vbCwgYm9vbCBleGVjdXRhYmxlKQoreworICAgIGlm
IChjaHVua0dDQmxvY2tzICYmIElTX0FERFJFU1NfRk9SX0NIVU5LKGFkZHJlc3MsIGNodW5rR0NC
bG9ja3MpKSB7IAorICAgICAgICBib29sIG9rID0gY2h1bmtHQ0Jsb2Nrcy0+Y29tbWl0KGFkZHJl
c3MpOyAKKyAgICAgICAgcmV0dXJuOyAKKyAgICB9CisKKyAgICBpZiAoY2h1bmtHQ0hhbmRsZVBv
b2wgJiYgSVNfQUREUkVTU19GT1JfQ0hVTksoYWRkcmVzcywgY2h1bmtHQ0hhbmRsZVBvb2wpKSB7
IAorICAgICAgICBib29sIG9rID0gY2h1bmtHQ0hhbmRsZVBvb2wtPmNvbW1pdChhZGRyZXNzKTsK
KyAgICAgICAgcmV0dXJuOyAKKyAgICB9CisKKyAgICBpZiAoY2h1bmtWTVN0YWNrICYmIElTX0FE
RFJFU1NfRk9SX0NIVU5LKGFkZHJlc3MsIGNodW5rVk1TdGFjaykpIHsKKyAgICAgICAgVEludCBv
ZmZzZXQgPSByZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIC0gY2h1bmtWTVN0YWNr
LT5CYXNlKCk7IAorICAgICAgICBUSW50IGVycm9yID0gY2h1bmtWTVN0YWNrLT5Db21taXQob2Zm
c2V0LCBieXRlcyk7CisgICAgICAgIHJldHVybjsgCisgICAgfQorCisgICAgaWYgKGNodW5rSklU
Q29kZSAmJiBJU19BRERSRVNTX0ZPUl9DSFVOSyhhZGRyZXNzLCBjaHVua0pJVENvZGUpKSB7IAor
ICAgICAgICAvLyBubyBjb21taXQgaGVyZSwgc2luY2UgU3ltYmlhbiBPUyBmb3JjZXMgY29kZSBj
aHVua3MgdG8gY29tbWl0IGltbWVkaWF0ZWx5CisgICAgICAgIC8vIHVwb24gY3JlYXRpb24uIAor
ICAgICAgICByZXR1cm47IAorICAgIH0KKworICAgIC8vIEZhbGwgdGhyb3VnaCBmb3IgaGVhcCBi
YXNlZCBhbGxvY2F0aW9ucworCit9CisKKy8vIFJlbGVhc2UgcmVzZXJ2ZWQgKGJ1dCBub3QgY29t
bWl0dGVkKSByZWdpb24KK3ZvaWQgT1NBbGxvY2F0b3I6OnJlbGVhc2VEZWNvbW1pdHRlZCh2b2lk
KiAsIHNpemVfdCkKIHsKLSAgICByZXR1cm4gZmFzdE1hbGxvYyhieXRlcyk7CisKKyAgICAvLyBX
ZSBkbyBub3RoaW5nIGZvciB0aGUgR0MgQ29sbGVjdG9yIGFuZCBIYW5kbGUgcG9vbAorICAgIC8v
IGNodW5rcyBhcyB3ZSBvbmx5IGRvIDEgKGxhcmdlKSB1cC1mcm9udCByZXNlcnZhdGlvbgorCisg
ICAgLy8gSWYgdGhlIFJlZ2lzdGVyRmlsZSBjaHVuayBkb2Vzbid0IGhhdmUgYW55dGhpbmcKKyAg
ICAvLyBpbiBjb21taXR0ZWQgc3RhdGUgYW55bW9yZSwgZGVsZXRlIGl0IHRvCisgICAgLy8gcmVs
ZWFzaW5nIHZpcnR1YWwgYWRkcmVzcyB0byB0aGUgT1MgCisgICAgaWYgKGNodW5rVk1TdGFjayAm
JiAhY2h1bmtWTVN0YWNrLT5TaXplKCkpIHsgCisgICAgICAgIGRlbGV0ZSBjaHVua1ZNU3RhY2s7
IAorICAgICAgICBjaHVua1ZNU3RhY2sgPSAwOyAKKyAgICAgICAgcmV0dXJuOyAKKyAgICB9CisK
KyAgICAvLyBEaXR0byBmb3IgY2h1bmtKSVRDb2RlCisgICAgaWYgKGNodW5rSklUQ29kZSAmJiAh
Y2h1bmtKSVRDb2RlLT5TaXplKCkpIHsgCisgICAgICAgIGRlbGV0ZSBjaHVua0pJVENvZGU7IAor
ICAgICAgICBjaHVua0pJVENvZGUgPSAwOworICAgICAgICByZXR1cm47IAorICAgIH0KKwogfQog
Ci12b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZUFuZENvbW1pdChzaXplX3QgYnl0ZXMsIFVzYWdl
LCBib29sLCBib29sKQordm9pZCBPU0FsbG9jYXRvcjo6ZGVjb21taXQodm9pZCogYWRkcmVzcywg
c2l6ZV90IGJ5dGVzKQogewotICAgIHJldHVybiBmYXN0TWFsbG9jKGJ5dGVzKTsKKyAgICBpZiAo
Y2h1bmtHQ0Jsb2NrcyAmJiBJU19BRERSRVNTX0ZPUl9DSFVOSyhhZGRyZXNzLCBjaHVua0dDQmxv
Y2tzKSkgeyAKKyAgICAgICAgYm9vbCBvayA9IGNodW5rR0NCbG9ja3MtPmRlY29tbWl0KGFkZHJl
c3MpOworICAgICAgICByZXR1cm47IAorICAgIH0KKworICAgIGlmIChjaHVua0dDSGFuZGxlUG9v
bCAmJiBJU19BRERSRVNTX0ZPUl9DSFVOSyhhZGRyZXNzLCBjaHVua0dDSGFuZGxlUG9vbCkpIHsg
CisgICAgICAgIGJvb2wgb2sgPSBjaHVua0dDSGFuZGxlUG9vbC0+ZGVjb21taXQoYWRkcmVzcyk7
CisgICAgICAgIHJldHVybjsgCisgICAgfQorCisgICAgaWYgKGNodW5rVk1TdGFjayAmJiBJU19B
RERSRVNTX0ZPUl9DSFVOSyhhZGRyZXNzLCBjaHVua1ZNU3RhY2spKSB7IAorICAgICAgICBUSW50
IG9mZnNldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VFVpbnQ4Kj4oYWRkcmVzcykgLSBjaHVua1ZNU3Rh
Y2stPkJhc2UoKTsgCisgICAgICAgIFRJbnQgZXJyb3IgPSBjaHVua1ZNU3RhY2stPkRlY29tbWl0
KG9mZnNldCwgYnl0ZXMpOyAKKyAgICAgICAgcmV0dXJuOyAKKyAgICB9CisKKyAgICBpZiAoY2h1
bmtKSVRDb2RlICYmIElTX0FERFJFU1NfRk9SX0NIVU5LKGFkZHJlc3MsIGNodW5rSklUQ29kZSkp
IHsKKyAgICAgICAgVEludCBvZmZzZXQgPSByZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJl
c3MpIC0gY2h1bmtKSVRDb2RlLT5CYXNlKCk7CisgICAgICAgIFRJbnQgZXJyb3IgPSBjaHVua0pJ
VENvZGUtPkRlY29tbWl0KG9mZnNldCwgYnl0ZXMpOworICAgICAgICByZXR1cm47IAorICAgIH0K
KworICAgIC8vIERpcmVjdGx5IGZyZWUoKSBhbnkgbm9uLWNodW5rIGFsbG9jYXRpb25zIAorICAg
IGlmIChhZGRyZXNzKSAKKyAgICAgICAgVXNlcjo6RnJlZShhZGRyZXNzKTsKKworfQorCit2b2lk
KiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZUFuZENvbW1pdChzaXplX3QgYnl0ZXMsIFVzYWdlIHVzYWdl
LCBib29sIHdyaXRhYmxlLCBib29sIGV4ZWN1dGFibGUpCit7IAorICAgIHZvaWQqIGJhc2UgPSBy
ZXNlcnZlVW5jb21taXR0ZWQoYnl0ZXMsIHVzYWdlLCB3cml0YWJsZSwgZXhlY3V0YWJsZSk7Cisg
ICAgY29tbWl0KGJhc2UsIGJ5dGVzLCB3cml0YWJsZSwgZXhlY3V0YWJsZSk7CisgICAgcmV0dXJu
IGJhc2U7CiB9CiAKLXZvaWQgT1NBbGxvY2F0b3I6OmNvbW1pdCh2b2lkKiwgc2l6ZV90LCBib29s
LCBib29sKQorLy8gSGVscGVyIGNsYXNzIHRoYXQgbWFwcyBjb21taXR0ZWQvZGVjb21taXRlZCBz
dGF0ZSBvZiBtYW55IGJsb2NrU2l6ZS1zaXplZCBibG9ja3MsCisvLyBlYWNoIGJsb2NrU2l6ZSBh
bGlnbmVkLCB0byBhIHNpbmdsZSBSQ2h1bmsncyAodmVyeSBsYXJnZSkgcmVzZXJ2YXRpb24uCisv
LyBUaGUgY2h1bmsgaGFuZGxlIGlzIGtlcHQgYXMgY29udGV4dC4gCitXcmFwcGVkQ2h1bms6Oldy
YXBwZWRDaHVuayhUSW50IG1heFJlc2VydmF0aW9uU2l6ZSwgY29uc3QgVEludCBibG9ja1NpemUp
IAorICAgIDogbV9ibG9ja1NpemUoYmxvY2tTaXplKQogeworICAgIC8vIEdldCBzeXN0ZW0ncyBw
YWdlIHNpemUuCisgICAgU1lNQklBTl9QQUdFU0laRShtX3BhZ2VTaXplKTsgCisKKyAgICAvLyBP
bmx5IGFjY2VwdCBtdWx0aXBsZXMgb2Ygc3lzdGVtIHBhZ2Ugc2l6ZSBmb3IgYm90aCBpbml0aWFs
IHJlc2VydmF0aW9uIGFuZCB0aGUgYWxpZ25tZW50L2Jsb2NrIHNpemUKKyAgICBtYXhSZXNlcnZh
dGlvblNpemUgPSBTWU1CSUFOX1JPVU5EVVBUT01VTFRJUExFKG1heFJlc2VydmF0aW9uU2l6ZSwg
bV9wYWdlU2l6ZSk7CisgICAgX19BU1NFUlRfQUxXQVlTKFNZTUJJQU5fUk9VTkRVUFRPTVVMVElQ
TEUobV9ibG9ja1NpemUsIG1fcGFnZVNpemUpLCBVc2VyOjpQYW5pYyhfTCgiT1NBbGxvY2F0b3Iy
IiksIEtFcnJBcmd1bWVudCkpOworCisgICAgLy8gQ2FsY3VsYXRlIG1heC4gYml0IGZsYWdzIHdl
IG5lZWQgdG8gY2FydmUgYSByZXNlcnZhdGlvblNpemUgcmFuZ2UgaW50byBibG9ja1NpemUtc2l6
ZWQgYmxvY2tzCisgICAgbV9tYXAubnVtQml0cyA9IG1heFJlc2VydmF0aW9uU2l6ZSAvIG1fYmxv
Y2tTaXplOyAgIAorICAgIGNvbnN0IFRVaW50MzIgYml0c1BlcldvcmQgPSA4KnNpemVvZihUVWlu
dDMyKTsgCisgICAgY29uc3QgVFVpbnQzMiBudW1Xb3JkcyA9IChtX21hcC5udW1CaXRzICsgYml0
c1BlcldvcmQgLTEpIC8gYml0c1BlcldvcmQ7IAorCisgICAgbV9tYXAuYml0cyA9IG5ldyBUVWlu
dDMyW251bVdvcmRzXTsKKyAgICBtX21hcC5jbGVhckFsbCgpOworCisgICAgLy8gUmVzZXJ2ZSBy
ZXF1ZXN0ZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLCBub3RoaW5nIGNvbW1pdHRlZCBqdXN0IHll
dAorICAgIFRJbnQgcmV0ID0gbV9jaHVuay5DcmVhdGVEaXNjb25uZWN0ZWRMb2NhbCgwICwgMCwg
bWF4UmVzZXJ2YXRpb25TaXplKTsgIAorCisgICAgLy8gVGhpcyBpcyB0aGUgb2Zmc2V0IHRvIG1f
Y2h1bmsuQmFzZSgpIHJlcXVpcmVkIHRvIGdldCBhIG1fYmxvY2tTaXplLWFsaWduZWQgYWRkcmVz
cworICAgIG1fb2Zmc2V0ID0gU1lNQklBTl9ST1VORFVQVE9NVUxUSVBMRShUVWludDMyKG1fY2h1
bmsuQmFzZSgpKSwgbV9ibG9ja1NpemUpIC0gVFVpbnQobV9jaHVuay5CYXNlKCkpOyAKKwogfQog
Ci12b2lkIE9TQWxsb2NhdG9yOjpkZWNvbW1pdCh2b2lkKiwgc2l6ZV90KQorV3JhcHBlZENodW5r
Ojp+V3JhcHBlZENodW5rKCkgCiB7CisgICAgZGVsZXRlIG1fbWFwLmJpdHM7CisgICAgbV9tYXAu
Yml0cyA9IDA7IAorICAgIG1fY2h1bmsuRGVjb21taXQoMCwgbV9jaHVuay5NYXhTaXplKCkpOwor
ICAgIG1fY2h1bmsuQ2xvc2UoKTsKIH0KIAotdm9pZCBPU0FsbG9jYXRvcjo6cmVsZWFzZURlY29t
bWl0dGVkKHZvaWQqIGFkZHJlc3MsIHNpemVfdCkKKy8vIFNlYXJjaGVzIGZvciB0aGUgbmV4dCBh
dmFpbGFibGUgYmxvY2ssICJwYXJrcyIgaXQgaW50ZXJuYWxseQorLy8gaW4gdGhlIGJpdG1hcCBh
bmQgYW5kIHJldHVybnMgaXRzIChiYXNlKSBhZGRyZXNzCisvLyBNVVNUIHByZWNlZGUgYSBjYWxs
IHRvIGNvbW1pdCh2b2lkICphZGRyZXNzKQordm9pZCogV3JhcHBlZENodW5rOjpwYXJrTmV4dEF2
YWlsYWJsZUJsb2NrKCkgCit7IAorICAgIC8vIExvb2sgdXAgZmlyc3QgZnJlZSBzbG90IGluIGJp
dCBtYXAKKyAgICBjb25zdCBUSW50IGZyZWVJZHggPSBtX21hcC5maW5kRnJlZSgpOworCisgICAg
Ly8gUHNldWRvIE9PTTogV2UgYXRlIHVwIHRoZSBhZGRyZXNzIHNwYWNlIHdlIHJlc2VydmVkLi4K
KyAgICAvLyAuLmV2ZW4gdGhvdWdoIHRoZSBkZXZpY2UgbWF5IGhhdmUgZnJlZSBSQU0gbGVmdAor
ICAgIGlmIChmcmVlSWR4IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBVcGRhdGVk
IGJpdCB0byBtYXJrIHJlZ2lvbiBhcyBpbiB1c2UgKCJwYXJrZWQiLCBub3QgY29tbWl0dGVkIGZy
b20gdGhlIE9TIHBvaW50IG9mIHZpZXcpIC4gCisgICAgbV9tYXAuc2V0KGZyZWVJZHgpOyAKKwor
ICAgIC8vIENhbGN1bGF0ZSBhYnNvbHV0ZSBhZGRyZXNzIG9mIHNvb24tdG8tYmUtY29tbWl0dGVk
IHJlZ2lvbiAoYmxvY2spCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCBtX2No
dW5rLkJhc2UoKSArIG1fb2Zmc2V0ICsgKFRVaW50KShtX2Jsb2NrU2l6ZSAqIGZyZWVJZHgpICk7
IAorfQorCisvLyBNVVNUIGJlIG1hdGNoZWQgd2l0aCBhIHByZXZpb3VzIHBhcmtOZXh0QXZhaWxh
YmxlQmxvY2soKSBjYWxsCitib29sIFdyYXBwZWRDaHVuazo6Y29tbWl0KHZvaWQgKmFkZHJlc3Mp
IAoreyAKKyAgICBib29sIG9rID0gZmFsc2U7IAorCisgICAgLy8gQ2FsY3VsYXRlIGluZGV4IG9m
IGJsb2NrCisgICAgVEludCBpZHggPSBUVWludChyZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFk
ZHJlc3MpIC0gbV9jaHVuay5CYXNlKCkgLSBtX29mZnNldCkgLyBtX2Jsb2NrU2l6ZTsKKyAgICAv
LyBUaGlzIGJpdCBzaG91bGQgcHJldmlvdXNseSBoYXZlIGJlZW4gc2V0IHZpYSBwYXJrTmV4dEF2
YWlsYWJsZUJsb2NrKCkKKyAgICBfX0FTU0VSVF9BTFdBWVMobV9tYXAuZ2V0KGlkeCksIFVzZXI6
OlBhbmljKF9MKCJPU0FsbG9jYXRvcjMiKSwgS0VyckFyZ3VtZW50KSk7CisgICAgCisgICAgVElu
dCByZXQgPSBtX2NodW5rLkNvbW1pdChyZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3Mp
IC0gbV9jaHVuay5CYXNlKCksIG1fYmxvY2tTaXplKTsKKyAgICBpZiAocmV0ID09IEtFcnJOb25l
KSB7IAorICAgICAgICBtX21hcC5zZXQoaWR4KTsgCisgICAgICAgIG9rID0gdHJ1ZTsgCisgICAg
fQorICAgIHJldHVybiBvazsKK30KKworYm9vbCBXcmFwcGVkQ2h1bms6OmRlY29tbWl0KHZvaWQg
KmFkZHJlc3MpIAogewotICAgIGZhc3RGcmVlKGFkZHJlc3MpOworICAgIC8vIENhbGN1bGF0ZSBv
ZmZzZXQgZnJvbSBjaHVuayBiYXNlIGFuZCBkZWNvbW1pdAorICAgIFRJbnQgcmV0ID0gbV9jaHVu
ay5EZWNvbW1pdChyZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIC0gbV9jaHVuay5C
YXNlKCksIG1fYmxvY2tTaXplKTsKKyAgICAvLyBDYWxjdWxhdGUgaW5kZXggaW4gbWFwCisgICAg
VEludCBpZHggPSBUVWludChyZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIC0gbV9j
aHVuay5CYXNlKCkgLSBtX29mZnNldCkgLyBtX2Jsb2NrU2l6ZTsKKyAgICBtX21hcC5jbGVhcihp
ZHgpOyAgCisgICAgcmV0dXJuIChyZXQgPT0gS0Vyck5vbmUgPyB0cnVlIDogZmFsc2UpOwogfQog
CitUVWludDgqIFdyYXBwZWRDaHVuazo6QmFzZSgpIHsgcmV0dXJuIG1fY2h1bmsuQmFzZSgpOyB9
CitUSW50IFdyYXBwZWRDaHVuazo6U2l6ZSgpIHsgcmV0dXJuIG1fY2h1bmsuU2l6ZSgpOyB9CitU
SW50IFdyYXBwZWRDaHVuazo6TWF4U2l6ZSgpIHsgcmV0dXJuIG1fY2h1bmsuTWF4U2l6ZSgpOyB9
CisKKwogfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3Rm
L09TQWxsb2NhdG9yU3ltYmlhbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS93dGYvT1NBbGxvY2F0b3JTeW1iaWFuLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd3RmL09TQWxsb2NhdG9yU3ltYmlhbi5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIE5va2lhIENvcnBvcmF0aW9uIGFuZC9v
ciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhl
ciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1l
cyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICog
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgT1NBbGxvY2F0b3JTeW1iaWFuX2gKKyNk
ZWZpbmUgT1NBbGxvY2F0b3JTeW1iaWFuX2gKKworbmFtZXNwYWNlIFdURiB7IAorLy8gSGVscGVy
IGNsYXNzIHRoYXQgbWFwcyBjb21taXR0ZWQvZGVjb21taXRlZCBzdGF0ZSBvZiBtYW55IGJsb2Nr
U2l6ZS1zaXplZCBibG9ja3MsCisvLyBlYWNoIGJsb2NrU2l6ZSBhbGlnbmVkLCB0byBhIHNpbmds
ZSBSQ2h1bmsncyAodmVyeSBsYXJnZSkgcmVzZXJ2YXRpb24uCisvLyBUaGUgY2h1bmsgaGFuZGxl
IGlzIGtlcHQgYXMgY29udGV4dCBhY3Jvc3MgdGhlIGxpZmVjeWNsZSBvZiB0aGUgcHJvY2Vzcy4K
Ky8vIFVzZWQgZm9yIENvbGxlY3RvciBibG9ja3MgYW5kIEdDIGhhbmRsZSBwb29sIGF0IHRoaXMg
dGltZS4KK2NsYXNzIFdyYXBwZWRDaHVuayB7CisgICAgCitwdWJsaWM6ICAgICAKKyAgICBXcmFw
cGVkQ2h1bmsoVEludCBtYXhSZXNlcnZhdGlvblNpemUsIGNvbnN0IFRJbnQgYmxvY2tTaXplKTsK
KyAgICB+V3JhcHBlZENodW5rKCk7CisgICAgCisgICAgdm9pZCAqcGFya05leHRBdmFpbGFibGVC
bG9jaygpOworICAgIGJvb2wgY29tbWl0KHZvaWQgKmFkZHJlc3MpOworICAgIGJvb2wgZGVjb21t
aXQodm9pZCAqYWRkcmVzcyk7CisgICAgCisgICAgVFVpbnQ4KiBCYXNlKCk7CisgICAgVEludCBT
aXplKCk7CisgICAgVEludCBNYXhTaXplKCk7CisgICAgCitwcml2YXRlOiAgICAgCisgICAgVFVp
bnQgbV9vZmZzZXQ7IC8vIG9mZnNldCBmcm9tIGNodW5rJ3MgYmFzZSBuZWVkZWQgdG8gZ2V0IGJs
b2NrU2l6ZSBhbGlnbmVkIGJsb2NrCisgICAgVEludCBtX3BhZ2VTaXplOyAKKyAgICBUSW50IG1f
YmxvY2tTaXplOworICAgIFJDaHVuayBtX2NodW5rOworICAgIAorICAgIHN0cnVjdCB7CisgICAg
ICAgIFRVaW50MzIgKmJpdHM7IC8vIGFycmF5IG9mIGJpdCBmbGFncyAKKyAgICAgICAgVFVpbnQz
MiBudW1CaXRzOyAvLyBudW1iZXIgb2YgcmVnaW9ucyB0byBrZWVwIHRyYWNrIG9mCisKKyAgICAg
ICAgYm9vbCBnZXQoVFVpbnQzMiBuKSBjb25zdCAKKyAgICAgICAgeworICAgICAgICAgICAgcmV0
dXJuICEhKGJpdHNbbiA+PiA1XSAmICgxIDw8IChuICYgMHgxRikpKTsKKyAgICAgICAgfQorCisg
ICAgICAgIHZvaWQgc2V0KFRVaW50MzIgbikgCisgICAgICAgIHsKKyAgICAgICAgICAgIGJpdHNb
biA+PiA1XSB8PSAoMSA8PCAobiAmIDB4MUYpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQg
Y2xlYXIoVFVpbnQzMiBuKQorICAgICAgICB7CisgICAgICAgICAgICBiaXRzW24gPj4gNV0gJj0g
figxIDw8IChuICYgMHgxRikpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjbGVhckFsbCgp
CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoVFVpbnQzMiBpID0gMDsgaSA8IG51bUJpdHM7
IGkrKykKKyAgICAgICAgICAgICAgICBjbGVhcihpKTsKKyAgICAgICAgfQorCisgICAgICAgIFRJ
bnQgZmluZEZyZWUoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKFRVaW50MzIg
aSA9IDA7IGkgPCBudW1CaXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldChpKSkg
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICB9IG1fbWFwOworICAgIAorfTsKKworfSAv
LyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBPU0FsbG9jYXRvclN5bWJpYW5faAorCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL1BhZ2VBbGxvY2F0aW9uQWxpZ25lZC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9QYWdlQWxsb2NhdGlvbkFsaWdu
ZWQuY3BwCShyZXZpc2lvbiA3NTM3NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvUGFn
ZUFsbG9jYXRpb25BbGlnbmVkLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTAsOCArNTAsMTEgQEAg
UGFnZUFsbG9jYXRpb25BbGlnbmVkIFBhZ2VBbGxvY2F0aW9uQWxpZwogICAgIHZtX21hcChjdXJy
ZW50X3Rhc2soKSwgJmFkZHJlc3MsIHNpemUsIGFsaWdubWVudE1hc2ssIGZsYWdzLCBNRU1PUllf
T0JKRUNUX05VTEwsIDAsIEZBTFNFLCBwcm90ZWN0aW9uLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRF
IHwgUFJPVF9FWEVDLCBWTV9JTkhFUklUX0RFRkFVTFQpOwogICAgIHJldHVybiBQYWdlQWxsb2Nh
dGlvbkFsaWduZWQocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYWRkcmVzcyksIHNpemUpOwogI2Vs
c2UKLSAgICBzaXplX3QgYWxpZ25tZW50RGVsdGEgPSBhbGlnbm1lbnQgLSBwYWdlU2l6ZSgpOwot
CisgICAgc2l6ZV90IGFsaWdubWVudERlbHRhKDApOworI2lmICFPUyhTWU1CSUFOKSAgICAKKyAg
ICBhbGlnbm1lbnREZWx0YSA9IGFsaWdubWVudCAtIHBhZ2VTaXplKCk7CisjZW5kaWYKKyAgICAK
ICAgICAvLyBSZXNlcmVydmUgd2l0aCBzdWZmY2llbnQgYWRkaXRpb25hbCBWTSB0byBjb3JyZWN0
bHkgYWxpZ24uCiAgICAgc2l6ZV90IHJlc2VydmF0aW9uU2l6ZSA9IHNpemUgKyBhbGlnbm1lbnRE
ZWx0YTsKICAgICB2b2lkKiByZXNlcnZhdGlvbkJhc2UgPSBPU0FsbG9jYXRvcjo6cmVzZXJ2ZVVu
Y29tbWl0dGVkKHJlc2VydmF0aW9uU2l6ZSwgdXNhZ2UsIHdyaXRhYmxlLCBleGVjdXRhYmxlKTsK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvUGxhdGZvcm0uaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL1BsYXRmb3JtLmgJKHJldmlzaW9uIDc1NzI3KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCSh3b3JraW5nIGNvcHkpCkBA
IC05NzEsNyArOTcxLDcgQEAKICAgICAmJiAoQ1BVKFg4NikgfHwgQ1BVKFg4Nl82NCkgfHwgQ1BV
KEFSTSkgfHwgQ1BVKE1JUFMpKSBcCiAgICAgJiYgKE9TKERBUldJTikgfHwgIUNPTVBJTEVSKEdD
QykgfHwgR0NDX1ZFUlNJT05fQVRfTEVBU1QoNCwgMSwgMCkpIFwKICAgICAmJiAhT1MoV0lOQ0Up
Ci0jZGVmaW5lIEVOQUJMRV9KSVQgMQorI2RlZmluZSBFTkFCTEVfSklUIDAKICNlbmRpZgogCiAv
KiBFbnN1cmUgdGhhdCBlaXRoZXIgdGhlIEpJVCBvciB0aGUgaW50ZXJwcmV0ZXIgaGFzIGJlZW4g
ZW5hYmxlZC4gKi8KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvU3RhY2tCb3VuZHMu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvU3RhY2tCb3VuZHMu
Y3BwCShyZXZpc2lvbiA3NTM3NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvU3RhY2tC
b3VuZHMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MCwxMiArNjAsMTIgQEAgbmFtZXNwYWNlIFdU
RiB7CiAvLyBCdWcgMjYyNzYgLSBOZWVkIGEgbWVjaGFuaXNtIHRvIGRldGVybWluZSBzdGFjayBl
eHRlbnQKIC8vCiAvLyBUaGVzZSBwbGF0Zm9ybXMgc2hvdWxkIG5vdyBiZSB3b3JraW5nIGNvcnJl
Y3RseToKLS8vICAgICBEQVJXSU4sIFdJTkRPV1MtQ1BVKFg4NiksIFFOWCwgVU5JWCwgV0lOQ0UK
Ky8vICAgICBEQVJXSU4sIFdJTkRPV1MtQ1BVKFg4NiksIFFOWCwgVU5JWCwgV0lOQ0UsIFNZTUJJ
QU4KIC8vIFRoZXNlIHBsYXRmb3JtcyBhcmUgbm90OgotLy8gICAgIFdJTkRPV1MtQ1BVKFg4Nl82
NCksIFNPTEFSSVMsIE9QRU5CU0QsIFNZTUJJQU4sIEhBSUtVCisvLyAgICAgV0lORE9XUy1DUFUo
WDg2XzY0KSwgU09MQVJJUywgT1BFTkJTRCwgSEFJS1UKIC8vCiAvLyBGSVhNRTogcmVtb3ZlIHRo
aXMhIC0gdGhpcyBjb2RlIHVuc2FmZWx5IGd1ZXNzZXMgYXQgc3RhY2sgc2l6ZXMhCi0jaWYgKE9T
KFdJTkRPV1MpICYmIENQVShYODZfNjQpKSB8fCBPUyhTT0xBUklTKSB8fCBPUyhPUEVOQlNEKSB8
fCBPUyhTWU1CSUFOKSB8fCBPUyhIQUlLVSkKKyNpZiAoT1MoV0lORE9XUykgJiYgQ1BVKFg4Nl82
NCkpIHx8IE9TKFNPTEFSSVMpIHx8IE9TKE9QRU5CU0QpIHx8IE9TKEhBSUtVKQogLy8gQmFzZWQg
b24gdGhlIGN1cnJlbnQgbGltaXQgdXNlZCBieSB0aGUgSlNDIHBhcnNlciwgZ3Vlc3MgdGhlIHN0
YWNrIHNpemUuCiBzdGF0aWMgY29uc3QgcHRyZGlmZl90IGVzdGltYXRlZFN0YWNrU2l6ZSA9IDEy
OCAqIHNpemVvZih2b2lkKikgKiAxMDI0OwogLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGUgc3Rh
Y2sgaXMgZ3Jvd2luZyBkb3dud2FyZHMuCkBAIC0xMzksNyArMTM5LDcgQEAgdm9pZCBTdGFja0Jv
dW5kczo6aW5pdGlhbGl6ZSgpCiAgICAgUlRocmVhZCB0aHJlYWQ7CiAgICAgdGhyZWFkLlN0YWNr
SW5mbyhpbmZvKTsKICAgICBtX29yaWdpbiA9ICh2b2lkKilpbmZvLmlCYXNlOwotICAgIG1fYm91
bmQgPSBlc3RpbWF0ZVN0YWNrQm91bmQobV9vcmlnaW4pOworICAgIG1fYm91bmQgPSAodm9pZCop
aW5mby5pTGltaXQ7CiB9CiAKICNlbGlmIE9TKEhBSUtVKQpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL3d0Zi9WTVRhZ3MuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
d3RmL1ZNVGFncy5oCShyZXZpc2lvbiA3NjI0NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93
dGYvVk1UYWdzLmgJKHdvcmtpbmcgY29weSkKQEAgLTc5LDExICs3OSwxMSBAQAogCiAjZWxzZSAv
LyBPUyhEQVJXSU4pCiAKLSNkZWZpbmUgVk1fVEFHX0ZPUl9UQ01BTExPQ19NRU1PUlkgLTEKLSNk
ZWZpbmUgVk1fVEFHX0ZPUl9DT0xMRUNUT1JfTUVNT1JZIC0xCi0jZGVmaW5lIFZNX1RBR19GT1Jf
RVhFQ1VUQUJMRUFMTE9DQVRPUl9NRU1PUlkgLTEKLSNkZWZpbmUgVk1fVEFHX0ZPUl9SRUdJU1RF
UkZJTEVfTUVNT1JZIC0xCi0jZGVmaW5lIFZNX1RBR19GT1JfV0VCQ09SRV9QVVJHRUFCTEVfTUVN
T1JZIC0xCisjZGVmaW5lIFZNX1RBR19GT1JfVENNQUxMT0NfTUVNT1JZIDEKKyNkZWZpbmUgVk1f
VEFHX0ZPUl9DT0xMRUNUT1JfTUVNT1JZIDIKKyNkZWZpbmUgVk1fVEFHX0ZPUl9FWEVDVVRBQkxF
QUxMT0NBVE9SX01FTU9SWSAzCisjZGVmaW5lIFZNX1RBR19GT1JfUkVHSVNURVJGSUxFX01FTU9S
WSA0CisjZGVmaW5lIFZNX1RBR19GT1JfV0VCQ09SRV9QVVJHRUFCTEVfTUVNT1JZIDUKIAogI2Vu
ZGlmIC8vIE9TKERBUldJTikKIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi93dGYu
cHJpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvd3RmLnByaQkocmV2
aXNpb24gNzYyNDcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL3d0Zi5wcmkJKHdvcmtp
bmcgY29weSkKQEAgLTQ5LDMgKzQ5LDkgQEAgY29udGFpbnMoREVGSU5FUywgVVNFX0dTVFJFQU1F
Uj0xKSB7CiB1bml4OiFzeW1iaWFuOiBTT1VSQ0VTICs9IHd0Zi9PU0FsbG9jYXRvclBvc2l4LmNw
cAogc3ltYmlhbjogU09VUkNFUyArPSB3dGYvT1NBbGxvY2F0b3JTeW1iaWFuLmNwcAogd2luKnx3
aW5jZSo6IFNPVVJDRVMgKz0gd3RmL09TQWxsb2NhdG9yV2luLmNwcAorCitzeW1iaWFuOiB7Cisg
ICAgTElCUyArPSAtbGhhbAorICAgICMgRm9yIGhhbC5oCisgICAgSU5DTFVERVBBVEggKj0gJCRN
V19MQVlFUl9TWVNURU1JTkNMVURFCit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>79646</attachid>
            <date>2011-01-20 13:48:07 -0800</date>
            <delta_ts>2011-01-24 07:51:06 -0800</delta_ts>
            <desc>remove StackBounds.cpp from this patch </desc>
            <filename>51128_v4.patch</filename>
            <type>text/plain</type>
            <size>20909</size>
            <attacher name="Siddharth Mathur">s.mathur</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNzYyNDgpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzggQEAK
KzIwMTEtMDEtMjAgIFNpZGRoYXJ0aCBNYXRodXIgIDxzaWRkaGFydGgubWF0aHVyQG5va2lhLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbU3lt
Ymlhbl0gT1NBbGxvY2F0b3IgaW1wbGVtZW50YXRpb24KKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUxMTI4CisKKyAgICAgICAgSW1wbGVtZW50IFJDaHVu
ayBwb3dlcmVkIHJlc2VydmUgYW5kIGNvbW1pdCBvcGVyYXRpb25zIGZyb20gT1NBbGxvY2F0b3Iu
aAorICAgICAgICBKU0MgSklUIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLCBhbmQgd2lsbCBi
ZSBmaXhlZCAgaW4gYSBsYXRlciBwYXRjaC4KKworICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnBy
aTogbW92ZSBvdXQgSEFMIGxpbmthZ2UgYmxvY2sgdG8gd3RmLnByaQorCisgICAgICAgICogd3Rm
L09TQWxsb2NhdG9yLmg6CisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpkZWNvbW1pdEFuZFJl
bGVhc2UpOiAgYWRkIGV4cGxpY2l0IGRlY29tbWl0IGxpa2UgV2luQ0UKKyAgICAgICAgKiB3dGYv
T1NBbGxvY2F0b3JTeW1iaWFuLmNwcDogaW1wbGVtZW50YXRpb24gb2YgT1NBbGxvY3RvciBpbnRl
cmZhY2UgCisgICAgICAgIChXVEY6OmdldEJhY2tpbmdDaHVuayk6IGhlbHBlciBmdW5jdGlvbiB0
byBnZXQgY29ycmVjdCBiYWNraW5nIGNodW5rCisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpy
ZXNlcnZlVW5jb21taXR0ZWQpOgorICAgICAgICAoV1RGOjpPU0FsbG9jYXRvcjo6Y29tbWl0KToK
KyAgICAgICAgKFdURjo6T1NBbGxvY2F0b3I6OnJlbGVhc2VEZWNvbW1pdHRlZCk6CisgICAgICAg
IChXVEY6Ok9TQWxsb2NhdG9yOjpkZWNvbW1pdCk6CisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9y
OjpyZXNlcnZlQW5kQ29tbWl0KToKKyAgICAgICAgKFdURjo6V3JhcHBlZENodW5rOjpXcmFwcGVk
Q2h1bmspOiBIZWxwZXIgY2xhc3MgZm9yIGFsaWduZWQgYmxvY2tzCisgICAgICAgIChXVEY6Oldy
YXBwZWRDaHVuazo6fldyYXBwZWRDaHVuayk6CisgICAgICAgIChXVEY6OldyYXBwZWRDaHVuazo6
cGFya05leHRBdmFpbGFibGVCbG9jayk6CisgICAgICAgIChXVEY6OldyYXBwZWRDaHVuazo6Y29t
bWl0KToKKyAgICAgICAgKFdURjo6V3JhcHBlZENodW5rOjpkZWNvbW1pdCk6CisgICAgICAgIChX
VEY6OldyYXBwZWRDaHVuazo6QmFzZSk6CisgICAgICAgIChXVEY6OldyYXBwZWRDaHVuazo6U2l6
ZSk6CisgICAgICAgIChXVEY6OldyYXBwZWRDaHVuazo6TWF4U2l6ZSk6CisgICAgICAgICogd3Rm
L09TQWxsb2NhdG9yU3ltYmlhbi5oOiBBZGRlZC4gRGVjbGFyYXRpb24gb2YgV3JhcHBlZENodW5r
IAorICAgICAgICAqIHd0Zi9QYWdlQWxsb2NhdGlvbkFsaWduZWQuY3BwOgorICAgICAgICAoV1RG
OjpQYWdlQWxsb2NhdGlvbkFsaWduZWQ6OmFsbG9jYXRlKTogYWxpZ25tZW50IGZvciBTeW1iaWFu
IGlzIGhhbmRsZWQgZG93bnN0cmVhbQorICAgICAgICAqIHd0Zi9WTVRhZ3MuaDogY29ycmVjdCBl
bnVtIGludGVnZXIgdmFsdWVzIHNvIHRoYXQgdGhleSBhcmUgZGlmZmVyZW50aWFibGUKKyAgICAg
ICAgKiB3dGYvd3RmLnByaTogbmV3IGhvbWUgZm9yIEhBTCBsaW5rYWdlIGJsb2NrCisKIDIwMTEt
MDEtMjAgIFpvbHRhbiBIb3J2YXRoICA8em9sdGFuQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgQ3NhYmEgT3N6dHJvZ29uw6FjLgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L0phdmFTY3JpcHRDb3JlLnByaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
SmF2YVNjcmlwdENvcmUucHJpCShyZXZpc2lvbiA3NjI0NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9KYXZhU2NyaXB0Q29yZS5wcmkJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDEyICs0OCw2IEBA
IHN5bWJpYW4gewogICAgIElOQ0xVREVQQVRIID0gJCRKQVZBU0NSSVBUQ09SRV9JTkNMVURFUEFU
SCAkJElOQ0xVREVQQVRICiB9CiAKLXN5bWJpYW46IHsKLSAgICBMSUJTICs9IC1saGFsCi0gICAg
IyBGb3IgaGFsLmgKLSAgICBJTkNMVURFUEFUSCAqPSAkJE1XX0xBWUVSX1NZU1RFTUlOQ0xVREUK
LX0KLQogd2luMzItKjogREVGSU5FUyArPSBfSEFTX1RSMT0wCiAKIERFRklORVMgKz0gQlVJTERJ
TkdfSmF2YVNjcmlwdENvcmUgQlVJTERJTkdfV1RGCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd3RmL09TQWxsb2NhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L3d0Zi9PU0FsbG9jYXRvci5oCShyZXZpc2lvbiA3NjI0NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS93dGYvT1NBbGxvY2F0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtNzcsOSArNzcsOCBAQCBp
bmxpbmUgdm9pZCogT1NBbGxvY2F0b3I6OnJlc2VydmVBbmRDb21tCiBpbmxpbmUgdm9pZCBPU0Fs
bG9jYXRvcjo6ZGVjb21taXRBbmRSZWxlYXNlKHZvaWQqIHJlbGVhc2VCYXNlLCBzaXplX3QgcmVs
ZWFzZVNpemUsIHZvaWQqIGRlY29tbWl0QmFzZSwgc2l6ZV90IGRlY29tbWl0U2l6ZSkKIHsKICAg
ICBBU1NFUlQoZGVjb21taXRCYXNlID49IHJlbGVhc2VCYXNlICYmIChzdGF0aWNfY2FzdDxjaGFy
Kj4oZGVjb21taXRCYXNlKSArIGRlY29tbWl0U2l6ZSkgPD0gKHN0YXRpY19jYXN0PGNoYXIqPihy
ZWxlYXNlQmFzZSkgKyByZWxlYXNlU2l6ZSkpOwotI2lmIE9TKFdJTkNFKQotICAgIC8vIE9uIG1v
c3QgcGxhdGZvcm1zIHdlIGNhbiBhY3R1YWxseSBza2lwIHRoaXMgZmluYWwgZGVjb21taXQ7IHJl
bGVhc2luZyB0aGUgVk0gd2lsbAotICAgIC8vIGltcGxpY2l0bHkgZGVjb21taXQgYW55IHBoeXNp
Y2FsIG1lbW9yeSBpbiB0aGUgcmVnaW9uLiBUaGlzIGlzIG5vdCB0cnVlIG9uIFdJTkNFLgorI2lm
IE9TKFdJTkNFKSB8fCBPUyhTWU1CSUFOKQorICAgIC8vIFRoZXNlIE9TZXMgcHJlZmVyIGFuIGV4
cGxpY2l0IGRlY29tbWl0IGJlZm9yZSBhIHJlbGVhc2UKICAgICBkZWNvbW1pdChkZWNvbW1pdEJh
c2UsIGRlY29tbWl0U2l6ZSk7CiAjZWxzZQogICAgIFVOVVNFRF9QQVJBTShkZWNvbW1pdEJhc2Up
OwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9PU0FsbG9jYXRvclN5bWJpYW4uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3JTeW1i
aWFuLmNwcAkocmV2aXNpb24gNzYyNDcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL09T
QWxsb2NhdG9yU3ltYmlhbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKgog
ICogQ29weXJpZ2h0IChDKSAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
IENvcHlyaWdodCAoQykgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlh
cnkoLWllcykuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKQEAgLTI0LDMzICsyNSwyODIgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiT1NBbGxvY2F0b3JTeW1iaWFuLmgiCisKKyNpbmNsdWRlICJDb2xsZWN0b3IuaCIg
Ly8gRm9yIEpTQzo6QkxPQ0tfU0laRQorI2luY2x1ZGUgIkdDSGFuZGxlLmgiIC8vIEZvciBXZWFr
R0NIYW5kbGVQb29sOjpQb29sc2l6ZQogI2luY2x1ZGUgIk9TQWxsb2NhdG9yLmgiCisjaW5jbHVk
ZSA8ZTMyc3RkLmg+CisjaW5jbHVkZSA8aGFsLmg+CiAKLSNpbmNsdWRlIDx3dGYvRmFzdE1hbGxv
Yy5oPgorLy8gbWFjcm9zIGZvciBvYnRhaW5pbmcgcGFnZXNpemUgYW5kIHJvdW5kaW5nIHVwCisj
ZGVmaW5lIFNZTUJJQU5fUEFHRVNJWkUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKEhBTDo6
R2V0KEhBTERhdGE6OkVNZW1vcnlQYWdlU2l6ZSwgeCkpOworI2RlZmluZSBTWU1CSUFOX1JPVU5E
VVBUT01VTFRJUExFKHgsIG11bHRpcGxlb2YpICAgICgoeCArIG11bHRpcGxlb2YgLSAxKSAmIH4o
bXVsdGlwbGVvZiAtIDEpKQorLy8gbWFjcm8gZm9yIGNoZWNraW5nIGlmIGEgZ2l2ZW4gYWRkcmVz
cyBpcyBiYWNrZWQgYnkgdGhlIGdpdmVuIChhbHJlYWR5IGluaXRpYWxpemVkKSBjaHVuaworI2Rl
ZmluZSBJU19BRERSRVNTX0ZPUl9DSFVOSyhhZGRyZXNzLCBjaHVuaykgICgocmVpbnRlcnByZXRf
Y2FzdDxUVWludDgqPihhZGRyZXNzKSA+PSBjaHVuay0+QmFzZSgpKSAmJiBcCisgICAgICAgIChy
ZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIDwgY2h1bmstPkJhc2UoKSArIGNodW5r
LT5NYXhTaXplKCkpKSAKIAogbmFtZXNwYWNlIFdURiB7CiAKLXZvaWQqIE9TQWxsb2NhdG9yOjpy
ZXNlcnZlVW5jb21taXR0ZWQoc2l6ZV90IGJ5dGVzLCBVc2FnZSwgYm9vbCwgYm9vbCkKK3N0YXRp
YyBjb25zdCBUSW50IG1heFJlc2VydmF0aW9uSlNDQ29sbGVjdG9ySGVhcCA9IDEyOCAqIDEwMjQg
KiAxMDI0OyAvLyAxMjggTUIKK3N0YXRpYyBjb25zdCBUSW50IG1heFJlc2VydmF0aW9uSlNDR0NI
YW5kbGVQb29sICA9IDEgKiAxMDI0ICogMTAyNDsgLy8gMSBNQgorCitzdGF0aWMgV3JhcHBlZENo
dW5rKiBjaHVua0dDQmxvY2tzKDApOworc3RhdGljIFdyYXBwZWRDaHVuayogY2h1bmtHQ0hhbmRs
ZVBvb2woMCk7CitzdGF0aWMgUkNodW5rKiBjaHVua0pJVENvZGUoMCk7CitzdGF0aWMgUkNodW5r
KiBjaHVua1ZNU3RhY2soMCk7CisKKy8vIFJldHVybiB0aGUgY29ycmVjdCBiYWNraW5nIGNodW5r
IG9iamVjdCBiYXNlZCBvbiByZXF1ZXN0IHR5cGUgYW5kIHNpemUsIGxhemlseSBjb25maWd1cmlu
ZyBpdCBmb3IgdXNlCitzdGF0aWMgdm9pZCogZ2V0QmFja2luZ0NodW5rKHNpemVfdCBieXRlcywg
T1NBbGxvY2F0b3I6OlVzYWdlIHVzYWdlLCBib29sIGV4ZWN1dGFibGUpIAoreworCisgICAgLy8g
MS4gQ2h1bmtzIGZvciBKU0MgQ29sbGVjdG9yIGhlYXAgYmxvY2tzIGFuZCBHQyBIYW5kbGUgUG9v
bCAKKyAgICAvLyAgICBJbml0aWFsaXplZCBoZXJlIE9OQ0Ugd2l0aCBhIGNvbXBpbGUtdGltZSBt
YXggcmVzZXJ2YXRpb24gc2l6ZSAKKyAgICBpZiAodXNhZ2UgPT0gT1NBbGxvY2F0b3I6OkpTR0NI
ZWFwUGFnZXMpIHsKKworICAgICAgICBpZiAoYnl0ZXMgPT0gSlNDOjpCTE9DS19TSVpFKSB7ICAK
KyAgICAgICAgICAgIGlmICghY2h1bmtHQ0Jsb2NrcykKKyAgICAgICAgICAgICAgICBjaHVua0dD
QmxvY2tzID0gbmV3IFdyYXBwZWRDaHVuayhtYXhSZXNlcnZhdGlvbkpTQ0NvbGxlY3RvckhlYXAs
IEpTQzo6QkxPQ0tfU0laRSk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dm9pZCo+
KGNodW5rR0NCbG9ja3MpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ5dGVzID09IEpTQzo6
V2Vha0dDSGFuZGxlUG9vbDo6cG9vbFNpemUpIHsgIAorICAgICAgICAgICAgaWYgKCFjaHVua0dD
SGFuZGxlUG9vbCkgCisgICAgICAgICAgICAgICAgY2h1bmtHQ0hhbmRsZVBvb2wgPSBuZXcgV3Jh
cHBlZENodW5rKG1heFJlc2VydmF0aW9uSlNDR0NIYW5kbGVQb29sLCBKU0M6OldlYWtHQ0hhbmRs
ZVBvb2w6OnBvb2xTaXplKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx2b2lkKj4o
Y2h1bmtHQ0hhbmRsZVBvb2wpOworICAgICAgICB9CisKKyAgICAgICAgVXNlcjo6UGFuaWMoX0wo
Ik9TQWxsb2NhdG9yMSIpLCBLRXJyTm90U3VwcG9ydGVkKTsKKyAgICB9CisKKyAgICAvLyAyLiBD
aHVuayBmb3IgUmVnaXN0ZXJGaWxlL1ZNIHN0YWNrCisgICAgLy8gLSBJbml0aWFsaXplZCBPTkNF
IHVzaW5nIGFyZ3VtZW50cyBmcm9tIHRoZSBmaXJzdCBjYWxsZXIgb2YgdGhpcyBjaHVuayB0eXBl
IAorICAgIC8vIC0gQXNzdW1lcyB0aGF0IG9ubHkgMSBzdWNoIGNodW5rIGlzIGV2ZXIgbmVlZGVk
IGdpdmVuIEpTQydzIGN1cnJlbnQgZGVzaWduCisgICAgaWYgKHVzYWdlID09IE9TQWxsb2NhdG9y
OjpKU1ZNU3RhY2tQYWdlcykgeworICAgICAgICBpZiAoIWNodW5rVk1TdGFjaykgeworICAgICAg
ICAgICAgY2h1bmtWTVN0YWNrID0gbmV3IFJDaHVuaygpOworICAgICAgICAgICAgVEludCBlcnJv
ciA9IGNodW5rVk1TdGFjay0+Q3JlYXRlRGlzY29ubmVjdGVkTG9jYWwoMCwgMCwgYnl0ZXMpOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx2b2lkKj4oY2h1bmtWTVN0YWNr
KTsKKyAgICB9CisKKyAgICAvLyAzLiBDaHVuayBmb3IgSklUIGNvZGUKKyAgICAvLyAtIEluaXRp
YWxpemVkIE9OQ0UgdXNpbmcgYXJndW1lbnRzIGZyb20gdGhlIGZpcnN0IGNhbGxlciBvZiB0aGlz
IGNodW5rIHR5cGUuCisgICAgLy8gLSBBc3N1bWVzIHRoYXQgb25seSAxIHN1Y2ggZXhlY3V0YWJs
ZSByZWdpb24gZm9yIEpJVCBjb2RlIGlzIG5lZWRlZCBnaXZlbiBKU0MncyBjdXJyZW50IGRlc2ln
bgorICAgIGlmIChleGVjdXRhYmxlICYmIHVzYWdlID09IE9TQWxsb2NhdG9yOjpKU0pJVENvZGVQ
YWdlcykgeyAKKyAgICAgICAgaWYgKCFjaHVua0pJVENvZGUpIHsKKyAgICAgICAgICAgIGNodW5r
SklUQ29kZSA9IG5ldyBSQ2h1bmsoKTsKKyAgICAgICAgICAgIFRJbnQgZXJyb3IgPSBjaHVua0pJ
VENvZGUtPkNyZWF0ZUxvY2FsQ29kZShieXRlcywgYnl0ZXMpOyAvLyByZXNlcnZlIEFORCBjb21t
aXQKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dm9pZCo+KGNodW5rSklU
Q29kZSk7IAorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvLyBSZXNlcnZlIG1lbW9yeSBh
bmQgcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgordm9pZCogT1NBbGxvY2F0
b3I6OnJlc2VydmVVbmNvbW1pdHRlZChzaXplX3QgcmVzZXJ2YXRpb25TaXplLCBVc2FnZSB1c2Fn
ZSwgYm9vbCAsIGJvb2wgZXhlY3V0YWJsZSkKK3sKKyAgICB2b2lkKiBjaHVuayA9IGdldEJhY2tp
bmdDaHVuayhyZXNlcnZhdGlvblNpemUsIHVzYWdlLCBleGVjdXRhYmxlKTsKKworICAgIGlmICh1
c2FnZSA9PSBPU0FsbG9jYXRvcjo6SlNHQ0hlYXBQYWdlcyAmJiBjaHVuaykgeworICAgICAgICAv
LyBXZSBkb24ndCBhY3R1YWxseSBkbyBhIHJlc2VydmF0aW9uIGZvciB0aGlzIGNhc2UsIGJlY2F1
c2UgYSBsYXJnZQorICAgICAgICAvLyBvbmUgaGFzIGFscmVhZHkgYmVlbiBkb25lIGluIHRoZSBX
cmFwcGVkQ2h1bmsgYyd0b3IgKGFib3ZlKS4gCisgICAgICAgIC8vIFdlIHNpbXBseSAicGFyayIg
YSBibG9jayBpbnRlcm5hbGx5IGJ5IHNldHRpbmcgYSBiaXQgaW4gb3VyIGJpdCBtYXAKKyAgICAg
ICAgLy8gdG8gaW5kaWNhdGUgaW50ZW50aW9uIHRvIHVzZS4gIAorICAgICAgICBXcmFwcGVkQ2h1
bmsqIHdjID0gc3RhdGljX2Nhc3Q8V3JhcHBlZENodW5rKj4oY2h1bmspOworICAgICAgICByZXR1
cm4gd2MtPnBhcmtOZXh0QXZhaWxhYmxlQmxvY2soKTsKKyAgICB9CisKKyAgICBpZiAodXNhZ2Ug
PT0gT1NBbGxvY2F0b3I6OkpTVk1TdGFja1BhZ2VzICYmIGNodW5rKSAKKyAgICAgICAgcmV0dXJu
IChzdGF0aWNfY2FzdDxSQ2h1bmsqPihjaHVuaykpLT5CYXNlKCk7CisgICAgCisgICAgaWYgKHVz
YWdlID09IE9TQWxsb2NhdG9yOjpKU0pJVENvZGVQYWdlcyAmJiBjaHVuaykKKyAgICAgICAgcmV0
dXJuIChzdGF0aWNfY2FzdDxSQ2h1bmsqPihjaHVuaykpLT5CYXNlKCk7CisKKyAgICAvLyBEaXJl
Y3RseSBoZWFwIGFsbG9jYXRlIGFueXRoaW5nIHRoYXQgaXNuJ3QgYmFja2VkIGJ5IGEgY2h1bmsK
KyAgICByZXR1cm4gVXNlcjo6QWxsb2MocmVzZXJ2YXRpb25TaXplKTsgIAorfQorCisvLyBBY3R1
YWxseSBjb21taXQgbWVtb3J5IGZyb20gT1MsIHdoaWNoIHdhcyBwcmV2aW91c2x5IHJlc2VydmVk
IHZpYSByZXNlcnZlVW5jb21taXR0ZWQoKQordm9pZCBPU0FsbG9jYXRvcjo6Y29tbWl0KHZvaWQq
IGFkZHJlc3MsIHNpemVfdCBieXRlcywgYm9vbCwgYm9vbCBleGVjdXRhYmxlKQoreworICAgIGlm
IChjaHVua0dDQmxvY2tzICYmIElTX0FERFJFU1NfRk9SX0NIVU5LKGFkZHJlc3MsIGNodW5rR0NC
bG9ja3MpKSB7IAorICAgICAgICBib29sIG9rID0gY2h1bmtHQ0Jsb2Nrcy0+Y29tbWl0KGFkZHJl
c3MpOyAKKyAgICAgICAgcmV0dXJuOyAKKyAgICB9CisKKyAgICBpZiAoY2h1bmtHQ0hhbmRsZVBv
b2wgJiYgSVNfQUREUkVTU19GT1JfQ0hVTksoYWRkcmVzcywgY2h1bmtHQ0hhbmRsZVBvb2wpKSB7
IAorICAgICAgICBib29sIG9rID0gY2h1bmtHQ0hhbmRsZVBvb2wtPmNvbW1pdChhZGRyZXNzKTsK
KyAgICAgICAgcmV0dXJuOyAKKyAgICB9CisKKyAgICBpZiAoY2h1bmtWTVN0YWNrICYmIElTX0FE
RFJFU1NfRk9SX0NIVU5LKGFkZHJlc3MsIGNodW5rVk1TdGFjaykpIHsKKyAgICAgICAgVEludCBv
ZmZzZXQgPSByZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIC0gY2h1bmtWTVN0YWNr
LT5CYXNlKCk7IAorICAgICAgICBUSW50IGVycm9yID0gY2h1bmtWTVN0YWNrLT5Db21taXQob2Zm
c2V0LCBieXRlcyk7CisgICAgICAgIHJldHVybjsgCisgICAgfQorCisgICAgaWYgKGNodW5rSklU
Q29kZSAmJiBJU19BRERSRVNTX0ZPUl9DSFVOSyhhZGRyZXNzLCBjaHVua0pJVENvZGUpKSB7IAor
ICAgICAgICAvLyBubyBjb21taXQgaGVyZSwgc2luY2UgU3ltYmlhbiBPUyBmb3JjZXMgY29kZSBj
aHVua3MgdG8gY29tbWl0IGltbWVkaWF0ZWx5CisgICAgICAgIC8vIHVwb24gY3JlYXRpb24uIAor
ICAgICAgICByZXR1cm47IAorICAgIH0KKworICAgIC8vIEZhbGwgdGhyb3VnaCBmb3IgaGVhcCBi
YXNlZCBhbGxvY2F0aW9ucworCit9CisKKy8vIFJlbGVhc2UgcmVzZXJ2ZWQgKGJ1dCBub3QgY29t
bWl0dGVkKSByZWdpb24KK3ZvaWQgT1NBbGxvY2F0b3I6OnJlbGVhc2VEZWNvbW1pdHRlZCh2b2lk
KiAsIHNpemVfdCkKIHsKLSAgICByZXR1cm4gZmFzdE1hbGxvYyhieXRlcyk7CisKKyAgICAvLyBX
ZSBkbyBub3RoaW5nIGZvciB0aGUgR0MgQ29sbGVjdG9yIGFuZCBIYW5kbGUgcG9vbAorICAgIC8v
IGNodW5rcyBhcyB3ZSBvbmx5IGRvIDEgKGxhcmdlKSB1cC1mcm9udCByZXNlcnZhdGlvbgorCisg
ICAgLy8gSWYgdGhlIFJlZ2lzdGVyRmlsZSBjaHVuayBkb2Vzbid0IGhhdmUgYW55dGhpbmcKKyAg
ICAvLyBpbiBjb21taXR0ZWQgc3RhdGUgYW55bW9yZSwgZGVsZXRlIGl0IHRvCisgICAgLy8gcmVs
ZWFzaW5nIHZpcnR1YWwgYWRkcmVzcyB0byB0aGUgT1MgCisgICAgaWYgKGNodW5rVk1TdGFjayAm
JiAhY2h1bmtWTVN0YWNrLT5TaXplKCkpIHsgCisgICAgICAgIGRlbGV0ZSBjaHVua1ZNU3RhY2s7
IAorICAgICAgICBjaHVua1ZNU3RhY2sgPSAwOyAKKyAgICAgICAgcmV0dXJuOyAKKyAgICB9CisK
KyAgICAvLyBEaXR0byBmb3IgY2h1bmtKSVRDb2RlCisgICAgaWYgKGNodW5rSklUQ29kZSAmJiAh
Y2h1bmtKSVRDb2RlLT5TaXplKCkpIHsgCisgICAgICAgIGRlbGV0ZSBjaHVua0pJVENvZGU7IAor
ICAgICAgICBjaHVua0pJVENvZGUgPSAwOworICAgICAgICByZXR1cm47IAorICAgIH0KKwogfQog
Ci12b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZUFuZENvbW1pdChzaXplX3QgYnl0ZXMsIFVzYWdl
LCBib29sLCBib29sKQordm9pZCBPU0FsbG9jYXRvcjo6ZGVjb21taXQodm9pZCogYWRkcmVzcywg
c2l6ZV90IGJ5dGVzKQogewotICAgIHJldHVybiBmYXN0TWFsbG9jKGJ5dGVzKTsKKyAgICBpZiAo
Y2h1bmtHQ0Jsb2NrcyAmJiBJU19BRERSRVNTX0ZPUl9DSFVOSyhhZGRyZXNzLCBjaHVua0dDQmxv
Y2tzKSkgeyAKKyAgICAgICAgYm9vbCBvayA9IGNodW5rR0NCbG9ja3MtPmRlY29tbWl0KGFkZHJl
c3MpOworICAgICAgICByZXR1cm47IAorICAgIH0KKworICAgIGlmIChjaHVua0dDSGFuZGxlUG9v
bCAmJiBJU19BRERSRVNTX0ZPUl9DSFVOSyhhZGRyZXNzLCBjaHVua0dDSGFuZGxlUG9vbCkpIHsg
CisgICAgICAgIGJvb2wgb2sgPSBjaHVua0dDSGFuZGxlUG9vbC0+ZGVjb21taXQoYWRkcmVzcyk7
CisgICAgICAgIHJldHVybjsgCisgICAgfQorCisgICAgaWYgKGNodW5rVk1TdGFjayAmJiBJU19B
RERSRVNTX0ZPUl9DSFVOSyhhZGRyZXNzLCBjaHVua1ZNU3RhY2spKSB7IAorICAgICAgICBUSW50
IG9mZnNldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VFVpbnQ4Kj4oYWRkcmVzcykgLSBjaHVua1ZNU3Rh
Y2stPkJhc2UoKTsgCisgICAgICAgIFRJbnQgZXJyb3IgPSBjaHVua1ZNU3RhY2stPkRlY29tbWl0
KG9mZnNldCwgYnl0ZXMpOyAKKyAgICAgICAgcmV0dXJuOyAKKyAgICB9CisKKyAgICBpZiAoY2h1
bmtKSVRDb2RlICYmIElTX0FERFJFU1NfRk9SX0NIVU5LKGFkZHJlc3MsIGNodW5rSklUQ29kZSkp
IHsKKyAgICAgICAgVEludCBvZmZzZXQgPSByZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJl
c3MpIC0gY2h1bmtKSVRDb2RlLT5CYXNlKCk7CisgICAgICAgIFRJbnQgZXJyb3IgPSBjaHVua0pJ
VENvZGUtPkRlY29tbWl0KG9mZnNldCwgYnl0ZXMpOworICAgICAgICByZXR1cm47IAorICAgIH0K
KworICAgIC8vIERpcmVjdGx5IGZyZWUoKSBhbnkgbm9uLWNodW5rIGFsbG9jYXRpb25zIAorICAg
IGlmIChhZGRyZXNzKSAKKyAgICAgICAgVXNlcjo6RnJlZShhZGRyZXNzKTsKKworfQorCit2b2lk
KiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZUFuZENvbW1pdChzaXplX3QgYnl0ZXMsIFVzYWdlIHVzYWdl
LCBib29sIHdyaXRhYmxlLCBib29sIGV4ZWN1dGFibGUpCit7IAorICAgIHZvaWQqIGJhc2UgPSBy
ZXNlcnZlVW5jb21taXR0ZWQoYnl0ZXMsIHVzYWdlLCB3cml0YWJsZSwgZXhlY3V0YWJsZSk7Cisg
ICAgY29tbWl0KGJhc2UsIGJ5dGVzLCB3cml0YWJsZSwgZXhlY3V0YWJsZSk7CisgICAgcmV0dXJu
IGJhc2U7CiB9CiAKLXZvaWQgT1NBbGxvY2F0b3I6OmNvbW1pdCh2b2lkKiwgc2l6ZV90LCBib29s
LCBib29sKQorLy8gSGVscGVyIGNsYXNzIHRoYXQgbWFwcyBjb21taXR0ZWQvZGVjb21taXRlZCBz
dGF0ZSBvZiBtYW55IGJsb2NrU2l6ZS1zaXplZCBibG9ja3MsCisvLyBlYWNoIGJsb2NrU2l6ZSBh
bGlnbmVkLCB0byBhIHNpbmdsZSBSQ2h1bmsncyAodmVyeSBsYXJnZSkgcmVzZXJ2YXRpb24uCisv
LyBUaGUgY2h1bmsgaGFuZGxlIGlzIGtlcHQgYXMgY29udGV4dC4gCitXcmFwcGVkQ2h1bms6Oldy
YXBwZWRDaHVuayhUSW50IG1heFJlc2VydmF0aW9uU2l6ZSwgY29uc3QgVEludCBibG9ja1NpemUp
IAorICAgIDogbV9ibG9ja1NpemUoYmxvY2tTaXplKQogeworICAgIC8vIEdldCBzeXN0ZW0ncyBw
YWdlIHNpemUuCisgICAgU1lNQklBTl9QQUdFU0laRShtX3BhZ2VTaXplKTsgCisKKyAgICAvLyBP
bmx5IGFjY2VwdCBtdWx0aXBsZXMgb2Ygc3lzdGVtIHBhZ2Ugc2l6ZSBmb3IgYm90aCBpbml0aWFs
IHJlc2VydmF0aW9uIGFuZCB0aGUgYWxpZ25tZW50L2Jsb2NrIHNpemUKKyAgICBtYXhSZXNlcnZh
dGlvblNpemUgPSBTWU1CSUFOX1JPVU5EVVBUT01VTFRJUExFKG1heFJlc2VydmF0aW9uU2l6ZSwg
bV9wYWdlU2l6ZSk7CisgICAgX19BU1NFUlRfQUxXQVlTKFNZTUJJQU5fUk9VTkRVUFRPTVVMVElQ
TEUobV9ibG9ja1NpemUsIG1fcGFnZVNpemUpLCBVc2VyOjpQYW5pYyhfTCgiT1NBbGxvY2F0b3Iy
IiksIEtFcnJBcmd1bWVudCkpOworCisgICAgLy8gQ2FsY3VsYXRlIG1heC4gYml0IGZsYWdzIHdl
IG5lZWQgdG8gY2FydmUgYSByZXNlcnZhdGlvblNpemUgcmFuZ2UgaW50byBibG9ja1NpemUtc2l6
ZWQgYmxvY2tzCisgICAgbV9tYXAubnVtQml0cyA9IG1heFJlc2VydmF0aW9uU2l6ZSAvIG1fYmxv
Y2tTaXplOyAgIAorICAgIGNvbnN0IFRVaW50MzIgYml0c1BlcldvcmQgPSA4KnNpemVvZihUVWlu
dDMyKTsgCisgICAgY29uc3QgVFVpbnQzMiBudW1Xb3JkcyA9IChtX21hcC5udW1CaXRzICsgYml0
c1BlcldvcmQgLTEpIC8gYml0c1BlcldvcmQ7IAorCisgICAgbV9tYXAuYml0cyA9IG5ldyBUVWlu
dDMyW251bVdvcmRzXTsKKyAgICBtX21hcC5jbGVhckFsbCgpOworCisgICAgLy8gUmVzZXJ2ZSBy
ZXF1ZXN0ZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLCBub3RoaW5nIGNvbW1pdHRlZCBqdXN0IHll
dAorICAgIFRJbnQgcmV0ID0gbV9jaHVuay5DcmVhdGVEaXNjb25uZWN0ZWRMb2NhbCgwICwgMCwg
bWF4UmVzZXJ2YXRpb25TaXplKTsgIAorCisgICAgLy8gVGhpcyBpcyB0aGUgb2Zmc2V0IHRvIG1f
Y2h1bmsuQmFzZSgpIHJlcXVpcmVkIHRvIGdldCBhIG1fYmxvY2tTaXplLWFsaWduZWQgYWRkcmVz
cworICAgIG1fb2Zmc2V0ID0gU1lNQklBTl9ST1VORFVQVE9NVUxUSVBMRShUVWludDMyKG1fY2h1
bmsuQmFzZSgpKSwgbV9ibG9ja1NpemUpIC0gVFVpbnQobV9jaHVuay5CYXNlKCkpOyAKKwogfQog
Ci12b2lkIE9TQWxsb2NhdG9yOjpkZWNvbW1pdCh2b2lkKiwgc2l6ZV90KQorV3JhcHBlZENodW5r
Ojp+V3JhcHBlZENodW5rKCkgCiB7CisgICAgZGVsZXRlIG1fbWFwLmJpdHM7CisgICAgbV9tYXAu
Yml0cyA9IDA7IAorICAgIG1fY2h1bmsuRGVjb21taXQoMCwgbV9jaHVuay5NYXhTaXplKCkpOwor
ICAgIG1fY2h1bmsuQ2xvc2UoKTsKIH0KIAotdm9pZCBPU0FsbG9jYXRvcjo6cmVsZWFzZURlY29t
bWl0dGVkKHZvaWQqIGFkZHJlc3MsIHNpemVfdCkKKy8vIFNlYXJjaGVzIGZvciB0aGUgbmV4dCBh
dmFpbGFibGUgYmxvY2ssICJwYXJrcyIgaXQgaW50ZXJuYWxseQorLy8gaW4gdGhlIGJpdG1hcCBh
bmQgYW5kIHJldHVybnMgaXRzIChiYXNlKSBhZGRyZXNzCisvLyBNVVNUIHByZWNlZGUgYSBjYWxs
IHRvIGNvbW1pdCh2b2lkICphZGRyZXNzKQordm9pZCogV3JhcHBlZENodW5rOjpwYXJrTmV4dEF2
YWlsYWJsZUJsb2NrKCkgCit7IAorICAgIC8vIExvb2sgdXAgZmlyc3QgZnJlZSBzbG90IGluIGJp
dCBtYXAKKyAgICBjb25zdCBUSW50IGZyZWVJZHggPSBtX21hcC5maW5kRnJlZSgpOworCisgICAg
Ly8gUHNldWRvIE9PTTogV2UgYXRlIHVwIHRoZSBhZGRyZXNzIHNwYWNlIHdlIHJlc2VydmVkLi4K
KyAgICAvLyAuLmV2ZW4gdGhvdWdoIHRoZSBkZXZpY2UgbWF5IGhhdmUgZnJlZSBSQU0gbGVmdAor
ICAgIGlmIChmcmVlSWR4IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBVcGRhdGVk
IGJpdCB0byBtYXJrIHJlZ2lvbiBhcyBpbiB1c2UgKCJwYXJrZWQiLCBub3QgY29tbWl0dGVkIGZy
b20gdGhlIE9TIHBvaW50IG9mIHZpZXcpIC4gCisgICAgbV9tYXAuc2V0KGZyZWVJZHgpOyAKKwor
ICAgIC8vIENhbGN1bGF0ZSBhYnNvbHV0ZSBhZGRyZXNzIG9mIHNvb24tdG8tYmUtY29tbWl0dGVk
IHJlZ2lvbiAoYmxvY2spCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCBtX2No
dW5rLkJhc2UoKSArIG1fb2Zmc2V0ICsgKFRVaW50KShtX2Jsb2NrU2l6ZSAqIGZyZWVJZHgpICk7
IAorfQorCisvLyBNVVNUIGJlIG1hdGNoZWQgd2l0aCBhIHByZXZpb3VzIHBhcmtOZXh0QXZhaWxh
YmxlQmxvY2soKSBjYWxsCitib29sIFdyYXBwZWRDaHVuazo6Y29tbWl0KHZvaWQgKmFkZHJlc3Mp
IAoreyAKKyAgICBib29sIG9rID0gZmFsc2U7IAorCisgICAgLy8gQ2FsY3VsYXRlIGluZGV4IG9m
IGJsb2NrCisgICAgVEludCBpZHggPSBUVWludChyZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFk
ZHJlc3MpIC0gbV9jaHVuay5CYXNlKCkgLSBtX29mZnNldCkgLyBtX2Jsb2NrU2l6ZTsKKyAgICAv
LyBUaGlzIGJpdCBzaG91bGQgcHJldmlvdXNseSBoYXZlIGJlZW4gc2V0IHZpYSBwYXJrTmV4dEF2
YWlsYWJsZUJsb2NrKCkKKyAgICBfX0FTU0VSVF9BTFdBWVMobV9tYXAuZ2V0KGlkeCksIFVzZXI6
OlBhbmljKF9MKCJPU0FsbG9jYXRvcjMiKSwgS0VyckFyZ3VtZW50KSk7CisgICAgCisgICAgVElu
dCByZXQgPSBtX2NodW5rLkNvbW1pdChyZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3Mp
IC0gbV9jaHVuay5CYXNlKCksIG1fYmxvY2tTaXplKTsKKyAgICBpZiAocmV0ID09IEtFcnJOb25l
KSB7IAorICAgICAgICBtX21hcC5zZXQoaWR4KTsgCisgICAgICAgIG9rID0gdHJ1ZTsgCisgICAg
fQorICAgIHJldHVybiBvazsKK30KKworYm9vbCBXcmFwcGVkQ2h1bms6OmRlY29tbWl0KHZvaWQg
KmFkZHJlc3MpIAogewotICAgIGZhc3RGcmVlKGFkZHJlc3MpOworICAgIC8vIENhbGN1bGF0ZSBv
ZmZzZXQgZnJvbSBjaHVuayBiYXNlIGFuZCBkZWNvbW1pdAorICAgIFRJbnQgcmV0ID0gbV9jaHVu
ay5EZWNvbW1pdChyZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIC0gbV9jaHVuay5C
YXNlKCksIG1fYmxvY2tTaXplKTsKKyAgICAvLyBDYWxjdWxhdGUgaW5kZXggaW4gbWFwCisgICAg
VEludCBpZHggPSBUVWludChyZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIC0gbV9j
aHVuay5CYXNlKCkgLSBtX29mZnNldCkgLyBtX2Jsb2NrU2l6ZTsKKyAgICBtX21hcC5jbGVhcihp
ZHgpOyAgCisgICAgcmV0dXJuIChyZXQgPT0gS0Vyck5vbmUgPyB0cnVlIDogZmFsc2UpOwogfQog
CitUVWludDgqIFdyYXBwZWRDaHVuazo6QmFzZSgpIHsgcmV0dXJuIG1fY2h1bmsuQmFzZSgpOyB9
CitUSW50IFdyYXBwZWRDaHVuazo6U2l6ZSgpIHsgcmV0dXJuIG1fY2h1bmsuU2l6ZSgpOyB9CitU
SW50IFdyYXBwZWRDaHVuazo6TWF4U2l6ZSgpIHsgcmV0dXJuIG1fY2h1bmsuTWF4U2l6ZSgpOyB9
CisKKwogfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3Rm
L09TQWxsb2NhdG9yU3ltYmlhbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS93dGYvT1NBbGxvY2F0b3JTeW1iaWFuLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd3RmL09TQWxsb2NhdG9yU3ltYmlhbi5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIE5va2lhIENvcnBvcmF0aW9uIGFuZC9v
ciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhl
ciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1l
cyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICog
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgT1NBbGxvY2F0b3JTeW1iaWFuX2gKKyNk
ZWZpbmUgT1NBbGxvY2F0b3JTeW1iaWFuX2gKKworbmFtZXNwYWNlIFdURiB7IAorLy8gSGVscGVy
IGNsYXNzIHRoYXQgbWFwcyBjb21taXR0ZWQvZGVjb21taXRlZCBzdGF0ZSBvZiBtYW55IGJsb2Nr
U2l6ZS1zaXplZCBibG9ja3MsCisvLyBlYWNoIGJsb2NrU2l6ZSBhbGlnbmVkLCB0byBhIHNpbmds
ZSBSQ2h1bmsncyAodmVyeSBsYXJnZSkgcmVzZXJ2YXRpb24uCisvLyBUaGUgY2h1bmsgaGFuZGxl
IGlzIGtlcHQgYXMgY29udGV4dCBhY3Jvc3MgdGhlIGxpZmVjeWNsZSBvZiB0aGUgcHJvY2Vzcy4K
Ky8vIFVzZWQgZm9yIENvbGxlY3RvciBibG9ja3MgYW5kIEdDIGhhbmRsZSBwb29sIGF0IHRoaXMg
dGltZS4KK2NsYXNzIFdyYXBwZWRDaHVuayB7CisgICAgCitwdWJsaWM6ICAgICAKKyAgICBXcmFw
cGVkQ2h1bmsoVEludCBtYXhSZXNlcnZhdGlvblNpemUsIGNvbnN0IFRJbnQgYmxvY2tTaXplKTsK
KyAgICB+V3JhcHBlZENodW5rKCk7CisgICAgCisgICAgdm9pZCAqcGFya05leHRBdmFpbGFibGVC
bG9jaygpOworICAgIGJvb2wgY29tbWl0KHZvaWQgKmFkZHJlc3MpOworICAgIGJvb2wgZGVjb21t
aXQodm9pZCAqYWRkcmVzcyk7CisgICAgCisgICAgVFVpbnQ4KiBCYXNlKCk7CisgICAgVEludCBT
aXplKCk7CisgICAgVEludCBNYXhTaXplKCk7CisgICAgCitwcml2YXRlOiAgICAgCisgICAgVFVp
bnQgbV9vZmZzZXQ7IC8vIG9mZnNldCBmcm9tIGNodW5rJ3MgYmFzZSBuZWVkZWQgdG8gZ2V0IGJs
b2NrU2l6ZSBhbGlnbmVkIGJsb2NrCisgICAgVEludCBtX3BhZ2VTaXplOyAKKyAgICBUSW50IG1f
YmxvY2tTaXplOworICAgIFJDaHVuayBtX2NodW5rOworICAgIAorICAgIHN0cnVjdCB7CisgICAg
ICAgIFRVaW50MzIgKmJpdHM7IC8vIGFycmF5IG9mIGJpdCBmbGFncyAKKyAgICAgICAgVFVpbnQz
MiBudW1CaXRzOyAvLyBudW1iZXIgb2YgcmVnaW9ucyB0byBrZWVwIHRyYWNrIG9mCisKKyAgICAg
ICAgYm9vbCBnZXQoVFVpbnQzMiBuKSBjb25zdCAKKyAgICAgICAgeworICAgICAgICAgICAgcmV0
dXJuICEhKGJpdHNbbiA+PiA1XSAmICgxIDw8IChuICYgMHgxRikpKTsKKyAgICAgICAgfQorCisg
ICAgICAgIHZvaWQgc2V0KFRVaW50MzIgbikgCisgICAgICAgIHsKKyAgICAgICAgICAgIGJpdHNb
biA+PiA1XSB8PSAoMSA8PCAobiAmIDB4MUYpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQg
Y2xlYXIoVFVpbnQzMiBuKQorICAgICAgICB7CisgICAgICAgICAgICBiaXRzW24gPj4gNV0gJj0g
figxIDw8IChuICYgMHgxRikpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjbGVhckFsbCgp
CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoVFVpbnQzMiBpID0gMDsgaSA8IG51bUJpdHM7
IGkrKykKKyAgICAgICAgICAgICAgICBjbGVhcihpKTsKKyAgICAgICAgfQorCisgICAgICAgIFRJ
bnQgZmluZEZyZWUoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKFRVaW50MzIg
aSA9IDA7IGkgPCBudW1CaXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldChpKSkg
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICB9IG1fbWFwOworICAgIAorfTsKKworfSAv
LyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBPU0FsbG9jYXRvclN5bWJpYW5faAorCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL1BhZ2VBbGxvY2F0aW9uQWxpZ25lZC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9QYWdlQWxsb2NhdGlvbkFsaWdu
ZWQuY3BwCShyZXZpc2lvbiA3NTM3NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvUGFn
ZUFsbG9jYXRpb25BbGlnbmVkLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTAsOCArNTAsMTEgQEAg
UGFnZUFsbG9jYXRpb25BbGlnbmVkIFBhZ2VBbGxvY2F0aW9uQWxpZwogICAgIHZtX21hcChjdXJy
ZW50X3Rhc2soKSwgJmFkZHJlc3MsIHNpemUsIGFsaWdubWVudE1hc2ssIGZsYWdzLCBNRU1PUllf
T0JKRUNUX05VTEwsIDAsIEZBTFNFLCBwcm90ZWN0aW9uLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRF
IHwgUFJPVF9FWEVDLCBWTV9JTkhFUklUX0RFRkFVTFQpOwogICAgIHJldHVybiBQYWdlQWxsb2Nh
dGlvbkFsaWduZWQocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYWRkcmVzcyksIHNpemUpOwogI2Vs
c2UKLSAgICBzaXplX3QgYWxpZ25tZW50RGVsdGEgPSBhbGlnbm1lbnQgLSBwYWdlU2l6ZSgpOwot
CisgICAgc2l6ZV90IGFsaWdubWVudERlbHRhKDApOworI2lmICFPUyhTWU1CSUFOKSAgICAKKyAg
ICBhbGlnbm1lbnREZWx0YSA9IGFsaWdubWVudCAtIHBhZ2VTaXplKCk7CisjZW5kaWYKKyAgICAK
ICAgICAvLyBSZXNlcmVydmUgd2l0aCBzdWZmY2llbnQgYWRkaXRpb25hbCBWTSB0byBjb3JyZWN0
bHkgYWxpZ24uCiAgICAgc2l6ZV90IHJlc2VydmF0aW9uU2l6ZSA9IHNpemUgKyBhbGlnbm1lbnRE
ZWx0YTsKICAgICB2b2lkKiByZXNlcnZhdGlvbkJhc2UgPSBPU0FsbG9jYXRvcjo6cmVzZXJ2ZVVu
Y29tbWl0dGVkKHJlc2VydmF0aW9uU2l6ZSwgdXNhZ2UsIHdyaXRhYmxlLCBleGVjdXRhYmxlKTsK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvVk1UYWdzLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9WTVRhZ3MuaAkocmV2aXNpb24gNzYyNDcpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL1ZNVGFncy5oCSh3b3JraW5nIGNvcHkpCkBAIC03OSwx
MSArNzksMTEgQEAKIAogI2Vsc2UgLy8gT1MoREFSV0lOKQogCi0jZGVmaW5lIFZNX1RBR19GT1Jf
VENNQUxMT0NfTUVNT1JZIC0xCi0jZGVmaW5lIFZNX1RBR19GT1JfQ09MTEVDVE9SX01FTU9SWSAt
MQotI2RlZmluZSBWTV9UQUdfRk9SX0VYRUNVVEFCTEVBTExPQ0FUT1JfTUVNT1JZIC0xCi0jZGVm
aW5lIFZNX1RBR19GT1JfUkVHSVNURVJGSUxFX01FTU9SWSAtMQotI2RlZmluZSBWTV9UQUdfRk9S
X1dFQkNPUkVfUFVSR0VBQkxFX01FTU9SWSAtMQorI2RlZmluZSBWTV9UQUdfRk9SX1RDTUFMTE9D
X01FTU9SWSAxCisjZGVmaW5lIFZNX1RBR19GT1JfQ09MTEVDVE9SX01FTU9SWSAyCisjZGVmaW5l
IFZNX1RBR19GT1JfRVhFQ1VUQUJMRUFMTE9DQVRPUl9NRU1PUlkgMworI2RlZmluZSBWTV9UQUdf
Rk9SX1JFR0lTVEVSRklMRV9NRU1PUlkgNAorI2RlZmluZSBWTV9UQUdfRk9SX1dFQkNPUkVfUFVS
R0VBQkxFX01FTU9SWSA1CiAKICNlbmRpZiAvLyBPUyhEQVJXSU4pCiAKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS93dGYvd3RmLnByaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd3RmL3d0Zi5wcmkJKHJldmlzaW9uIDc2MjQ3KQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL3d0Zi93dGYucHJpCSh3b3JraW5nIGNvcHkpCkBAIC00OSwzICs0OSw5IEBAIGNvbnRhaW5z
KERFRklORVMsIFVTRV9HU1RSRUFNRVI9MSkgewogdW5peDohc3ltYmlhbjogU09VUkNFUyArPSB3
dGYvT1NBbGxvY2F0b3JQb3NpeC5jcHAKIHN5bWJpYW46IFNPVVJDRVMgKz0gd3RmL09TQWxsb2Nh
dG9yU3ltYmlhbi5jcHAKIHdpbip8d2luY2UqOiBTT1VSQ0VTICs9IHd0Zi9PU0FsbG9jYXRvcldp
bi5jcHAKKworc3ltYmlhbjogeworICAgIExJQlMgKz0gLWxoYWwKKyAgICAjIEZvciBoYWwuaAor
ICAgIElOQ0xVREVQQVRIICo9ICQkTVdfTEFZRVJfU1lTVEVNSU5DTFVERQorfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>79924</attachid>
            <date>2011-01-24 07:51:06 -0800</date>
            <delta_ts>2011-01-26 11:26:13 -0800</delta_ts>
            <desc>Converted macros into static inline functions and renamed new .h to WrappedChunkSymbian.h </desc>
            <filename>51128_v5.patch</filename>
            <type>text/plain</type>
            <size>21344</size>
            <attacher name="Siddharth Mathur">s.mathur</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNzY1MTkpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDMgQEAK
KzIwMTEtMDEtMjQgIFNpZGRoYXJ0aCBNYXRodXIgIDxzaWRkaGFydGgubWF0aHVyQG5va2lhLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbU3lt
Ymlhbl0gT1NBbGxvY2F0b3IgaW1wbGVtZW50YXRpb24KKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUxMTI4CisKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29y
ZS5wcmk6IG1vdmUgb3V0IEhBTCBsaW5rYWdlIGJsb2NrIHRvIHd0Zi5wcmkKKyAgICAgICAgCisg
ICAgICAgICogd3RmL09TQWxsb2NhdG9yLmg6CisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpk
ZWNvbW1pdEFuZFJlbGVhc2UpOiBhZGQgZXhwbGljaXQgZGVjb21taXQgbGlrZSBXaW5DRQorICAg
ICAgICAKKyAgICAgICAgKiB3dGYvT1NBbGxvY2F0b3JTeW1iaWFuLmNwcDogaW1wbGVtZW50YXRp
b24gZm9yIFN5bWJpYW4KKyAgICAgICAgKFdURjo6cm91bmRVcFRvTXVsdGlwbGUpOgorICAgICAg
ICAoV1RGOjppc0FkZHJlc3NGcm9tQ2h1bmspOgorICAgICAgICAoV1RGOjpnZXRCYWNraW5nQ2h1
bmspOgorICAgICAgICAoV1RGOjpPU0FsbG9jYXRvcjo6cmVzZXJ2ZVVuY29tbWl0dGVkKToKKyAg
ICAgICAgKFdURjo6T1NBbGxvY2F0b3I6OmNvbW1pdCk6CisgICAgICAgIChXVEY6Ok9TQWxsb2Nh
dG9yOjpyZWxlYXNlRGVjb21taXR0ZWQpOgorICAgICAgICAoV1RGOjpPU0FsbG9jYXRvcjo6ZGVj
b21taXQpOgorICAgICAgICAoV1RGOjpPU0FsbG9jYXRvcjo6cmVzZXJ2ZUFuZENvbW1pdCk6ICAg
ICAgIAorICAgICAgICAoV1RGOjpXcmFwcGVkQ2h1bmtTeW1iaWFuOjpXcmFwcGVkQ2h1bmtTeW1i
aWFuKTogSGVscGVyIGNsYXNzIGZvciBhbGlnbmVkIGJsb2NrcworICAgICAgICAoV1RGOjpXcmFw
cGVkQ2h1bmtTeW1iaWFuOjp+V3JhcHBlZENodW5rU3ltYmlhbik6CisgICAgICAgIChXVEY6Oldy
YXBwZWRDaHVua1N5bWJpYW46OnBhcmtOZXh0QXZhaWxhYmxlQmxvY2spOgorICAgICAgICAoV1RG
OjpXcmFwcGVkQ2h1bmtTeW1iaWFuOjpjb21taXQpOgorICAgICAgICAoV1RGOjpXcmFwcGVkQ2h1
bmtTeW1iaWFuOjpkZWNvbW1pdCk6CisgICAgICAgIChXVEY6OldyYXBwZWRDaHVua1N5bWJpYW46
OkJhc2UpOgorICAgICAgICAoV1RGOjpXcmFwcGVkQ2h1bmtTeW1iaWFuOjpTaXplKToKKyAgICAg
ICAgKFdURjo6V3JhcHBlZENodW5rU3ltYmlhbjo6TWF4U2l6ZSk6CisgICAgICAgIChXVEY6Oldy
YXBwZWRDaHVua1N5bWJpYW46OnJhd0NodW5rKToKKworICAgICAgICAqIHd0Zi9XcmFwcGVkQ2h1
bmtTeW1iaWFuLmg6IEFkZGVkLiBIZWFkZXIgZm9yIFdyYXBwZWRDaHVua1N5bWJpYW4KKyAgICAg
ICAgCisgICAgICAgICogd3RmL1BhZ2VBbGxvY2F0aW9uQWxpZ25lZC5jcHA6CisgICAgICAgIChX
VEY6OlBhZ2VBbGxvY2F0aW9uQWxpZ25lZDo6YWxsb2NhdGUpOiBhbGlnbm1lbnQgZm9yIFN5bWJp
YW4gaXMgaGFuZGxlZCBkb3duc3RyZWFtCisgICAgICAgIAorICAgICAgICAqIHd0Zi9WTVRhZ3Mu
aDogY29ycmVjdCBlbnVtIGludGVnZXIgdmFsdWVzIHNvIHRoYXQgdGhleSBhcmUgZGlmZmVyZW50
aWFibGUKKworICAgICAgICAqIHd0Zi93dGYucHJpOiBuZXcgaG9tZSBmb3IgSEFMIGxpbmthZ2Ug
YmxvY2sKKwogMjAxMS0wMS0yNCAgUGV0ZXIgVmFyZ2EgIDxwdmFyZ2FAd2Via2l0Lm9yZz4KIAog
ICAgICAgICBSZXZpZXdlZCBieSBPbGl2ZXIgSHVudC4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9KYXZhU2NyaXB0Q29yZS5wcmkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL0phdmFTY3JpcHRDb3JlLnByaQkocmV2aXNpb24gNzYyNDcpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJpCSh3b3JraW5nIGNvcHkpCkBAIC00OCwxMiArNDgs
NiBAQCBzeW1iaWFuIHsKICAgICBJTkNMVURFUEFUSCA9ICQkSkFWQVNDUklQVENPUkVfSU5DTFVE
RVBBVEggJCRJTkNMVURFUEFUSAogfQogCi1zeW1iaWFuOiB7Ci0gICAgTElCUyArPSAtbGhhbAot
ICAgICMgRm9yIGhhbC5oCi0gICAgSU5DTFVERVBBVEggKj0gJCRNV19MQVlFUl9TWVNURU1JTkNM
VURFCi19Ci0KIHdpbjMyLSo6IERFRklORVMgKz0gX0hBU19UUjE9MAogCiBERUZJTkVTICs9IEJV
SUxESU5HX0phdmFTY3JpcHRDb3JlIEJVSUxESU5HX1dURgpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL3d0Zi9PU0FsbG9jYXRvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS93dGYvT1NBbGxvY2F0b3IuaAkocmV2aXNpb24gNzYyNDcpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd3RmL09TQWxsb2NhdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTc3LDkgKzc3LDgg
QEAgaW5saW5lIHZvaWQqIE9TQWxsb2NhdG9yOjpyZXNlcnZlQW5kQ29tbQogaW5saW5lIHZvaWQg
T1NBbGxvY2F0b3I6OmRlY29tbWl0QW5kUmVsZWFzZSh2b2lkKiByZWxlYXNlQmFzZSwgc2l6ZV90
IHJlbGVhc2VTaXplLCB2b2lkKiBkZWNvbW1pdEJhc2UsIHNpemVfdCBkZWNvbW1pdFNpemUpCiB7
CiAgICAgQVNTRVJUKGRlY29tbWl0QmFzZSA+PSByZWxlYXNlQmFzZSAmJiAoc3RhdGljX2Nhc3Q8
Y2hhcio+KGRlY29tbWl0QmFzZSkgKyBkZWNvbW1pdFNpemUpIDw9IChzdGF0aWNfY2FzdDxjaGFy
Kj4ocmVsZWFzZUJhc2UpICsgcmVsZWFzZVNpemUpKTsKLSNpZiBPUyhXSU5DRSkKLSAgICAvLyBP
biBtb3N0IHBsYXRmb3JtcyB3ZSBjYW4gYWN0dWFsbHkgc2tpcCB0aGlzIGZpbmFsIGRlY29tbWl0
OyByZWxlYXNpbmcgdGhlIFZNIHdpbGwKLSAgICAvLyBpbXBsaWNpdGx5IGRlY29tbWl0IGFueSBw
aHlzaWNhbCBtZW1vcnkgaW4gdGhlIHJlZ2lvbi4gVGhpcyBpcyBub3QgdHJ1ZSBvbiBXSU5DRS4K
KyNpZiBPUyhXSU5DRSkgfHwgT1MoU1lNQklBTikKKyAgICAvLyBUaGVzZSBPU2VzIHByZWZlciBh
biBleHBsaWNpdCBkZWNvbW1pdCBiZWZvcmUgYSByZWxlYXNlCiAgICAgZGVjb21taXQoZGVjb21t
aXRCYXNlLCBkZWNvbW1pdFNpemUpOwogI2Vsc2UKICAgICBVTlVTRURfUEFSQU0oZGVjb21taXRC
YXNlKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3JTeW1iaWFu
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL09TQWxsb2NhdG9y
U3ltYmlhbi5jcHAJKHJldmlzaW9uIDc2MjQ3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3d0
Zi9PU0FsbG9jYXRvclN5bWJpYW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBAQAog
LyoKICAqIENvcHlyaWdodCAoQykgMjAxMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJz
aWRpYXJ5KC1pZXMpLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCkBAIC0yNiwzMSArMjcsMjg2IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5j
bHVkZSAiT1NBbGxvY2F0b3IuaCIKIAotI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9jLmg+Ci0KKyNp
bmNsdWRlICJDb2xsZWN0b3IuaCIgLy8gRm9yIEpTQzo6QkxPQ0tfU0laRQorI2luY2x1ZGUgIkdD
SGFuZGxlLmgiIC8vIEZvciBXZWFrR0NIYW5kbGVQb29sOjpQb29sc2l6ZQorI2luY2x1ZGUgIldy
YXBwZWRDaHVua1N5bWJpYW4uaCIKKyNpbmNsdWRlIDxlMzJzdGQuaD4KKyNpbmNsdWRlIDxoYWwu
aD4KKyAgICAKIG5hbWVzcGFjZSBXVEYgewogCi12b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZVVu
Y29tbWl0dGVkKHNpemVfdCBieXRlcywgVXNhZ2UsIGJvb2wsIGJvb2wpCitzdGF0aWMgY29uc3Qg
VEludCBtYXhSZXNlcnZhdGlvbkpTQ0NvbGxlY3RvckhlYXAgPSAxMjggKiAxMDI0ICogMTAyNDsg
Ly8gMTI4IE1CCitzdGF0aWMgY29uc3QgVEludCBtYXhSZXNlcnZhdGlvbkpTQ0dDSGFuZGxlUG9v
bCAgPSAxICogMTAyNCAqIDEwMjQ7IC8vIDEgTUIKKworc3RhdGljIFdyYXBwZWRDaHVua1N5bWJp
YW4qIGNodW5rR0NCbG9ja3MoMCk7CitzdGF0aWMgV3JhcHBlZENodW5rU3ltYmlhbiogY2h1bmtH
Q0hhbmRsZVBvb2woMCk7CitzdGF0aWMgUkNodW5rKiBjaHVua0pJVENvZGUoMCk7CitzdGF0aWMg
UkNodW5rKiBjaHVua1ZNU3RhY2soMCk7CisKKy8vIFJvdW5kcyB1cCB4IHRvIGEgbXV0aXBsZSBv
ZiBtdWx0aXBsZU9mCitzdGF0aWMgQUxXQVlTX0lOTElORSBzaXplX3Qgcm91bmRVcFRvTXVsdGlw
bGUoc2l6ZV90IHgsIHNpemVfdCBtdWx0aXBsZU9mKSAKK3sgCisgICAgcmV0dXJuICgoeCArIG11
bHRpcGxlT2YgLSAxKSAmIH4obXVsdGlwbGVPZiAtIDEpKTsKK30KKworLy8gQ2hlY2tzIGlmIGEg
Z2l2ZW4gYWRkcmVzcyBpcyBiYWNrZWQgYnkgdGhlIGdpdmVuIChhbHJlYWR5IGluaXRpYWxpemVk
KSBjaHVuaworc3RhdGljIEFMV0FZU19JTkxJTkUgYm9vbCBpc0FkZHJlc3NGcm9tQ2h1bmsoY29u
c3Qgdm9pZCogY29uc3QgYWRkcmVzcywgY29uc3QgUkNodW5rKiBjb25zdCBjaHVuaykgCit7IAor
ICAgIHJldHVybiAoKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFVpbnQ4Kj4oYWRkcmVzcykgPj0g
Y2h1bmstPkJhc2UoKSkgJiYgXAorICAgICAgICAgICAgKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
VFVpbnQ4Kj4oYWRkcmVzcykgPCBjaHVuay0+QmFzZSgpICsgY2h1bmstPk1heFNpemUoKSkpOyAg
Cit9CisKKy8vIFJldHVybiB0aGUgY29ycmVjdCBiYWNraW5nIGNodW5rIG9iamVjdCBiYXNlZCBv
biByZXF1ZXN0IHR5cGUgYW5kIHNpemUsIGxhemlseSBjb25maWd1cmluZyBpdCBmb3IgdXNlCitz
dGF0aWMgdm9pZCogZ2V0QmFja2luZ0NodW5rKHNpemVfdCBieXRlcywgT1NBbGxvY2F0b3I6OlVz
YWdlIHVzYWdlLCBib29sIGV4ZWN1dGFibGUpIAogewotICAgIHJldHVybiBmYXN0TWFsbG9jKGJ5
dGVzKTsKKworICAgIC8vIDEuIENodW5rcyBmb3IgSlNDIENvbGxlY3RvciBoZWFwIGJsb2NrcyBh
bmQgR0MgSGFuZGxlIFBvb2wgCisgICAgLy8gICAgSW5pdGlhbGl6ZWQgaGVyZSBPTkNFIHdpdGgg
YSBjb21waWxlLXRpbWUgbWF4IHJlc2VydmF0aW9uIHNpemUgCisgICAgaWYgKHVzYWdlID09IE9T
QWxsb2NhdG9yOjpKU0dDSGVhcFBhZ2VzKSB7CisKKyAgICAgICAgaWYgKGJ5dGVzID09IEpTQzo6
QkxPQ0tfU0laRSkgeyAgCisgICAgICAgICAgICBpZiAoIWNodW5rR0NCbG9ja3MpCisgICAgICAg
ICAgICAgICAgY2h1bmtHQ0Jsb2NrcyA9IG5ldyBXcmFwcGVkQ2h1bmtTeW1iaWFuKG1heFJlc2Vy
dmF0aW9uSlNDQ29sbGVjdG9ySGVhcCwgSlNDOjpCTE9DS19TSVpFKTsKKyAgICAgICAgICAgIHJl
dHVybiBzdGF0aWNfY2FzdDx2b2lkKj4oY2h1bmtHQ0Jsb2Nrcyk7CisgICAgICAgIH0KKworICAg
ICAgICBpZiAoYnl0ZXMgPT0gSlNDOjpXZWFrR0NIYW5kbGVQb29sOjpwb29sU2l6ZSkgeyAgCisg
ICAgICAgICAgICBpZiAoIWNodW5rR0NIYW5kbGVQb29sKSAKKyAgICAgICAgICAgICAgICBjaHVu
a0dDSGFuZGxlUG9vbCA9IG5ldyBXcmFwcGVkQ2h1bmtTeW1iaWFuKG1heFJlc2VydmF0aW9uSlND
R0NIYW5kbGVQb29sLCBKU0M6OldlYWtHQ0hhbmRsZVBvb2w6OnBvb2xTaXplKTsKKyAgICAgICAg
ICAgIHJldHVybiBzdGF0aWNfY2FzdDx2b2lkKj4oY2h1bmtHQ0hhbmRsZVBvb2wpOworICAgICAg
ICB9CisKKyAgICAgICAgVXNlcjo6UGFuaWMoX0woIk9TQWxsb2NhdG9yMSIpLCBLRXJyTm90U3Vw
cG9ydGVkKTsKKyAgICB9CisKKyAgICAvLyAyLiBDaHVuayBmb3IgUmVnaXN0ZXJGaWxlL1ZNIHN0
YWNrCisgICAgLy8gLSBJbml0aWFsaXplZCBPTkNFIHVzaW5nIGFyZ3VtZW50cyBmcm9tIHRoZSBm
aXJzdCBjYWxsZXIgb2YgdGhpcyBjaHVuayB0eXBlIAorICAgIC8vIC0gQXNzdW1lcyB0aGF0IG9u
bHkgMSBzdWNoIGNodW5rIGlzIGV2ZXIgbmVlZGVkIGdpdmVuIEpTQydzIGN1cnJlbnQgZGVzaWdu
CisgICAgaWYgKHVzYWdlID09IE9TQWxsb2NhdG9yOjpKU1ZNU3RhY2tQYWdlcykgeworICAgICAg
ICBpZiAoIWNodW5rVk1TdGFjaykgeworICAgICAgICAgICAgY2h1bmtWTVN0YWNrID0gbmV3IFJD
aHVuaygpOworICAgICAgICAgICAgVEludCBlcnJvciA9IGNodW5rVk1TdGFjay0+Q3JlYXRlRGlz
Y29ubmVjdGVkTG9jYWwoMCwgMCwgYnl0ZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBz
dGF0aWNfY2FzdDx2b2lkKj4oY2h1bmtWTVN0YWNrKTsKKyAgICB9CisKKyAgICAvLyAzLiBDaHVu
ayBmb3IgSklUIGNvZGUKKyAgICAvLyAtIEluaXRpYWxpemVkIE9OQ0UgdXNpbmcgYXJndW1lbnRz
IGZyb20gdGhlIGZpcnN0IGNhbGxlciBvZiB0aGlzIGNodW5rIHR5cGUuCisgICAgLy8gLSBBc3N1
bWVzIHRoYXQgb25seSAxIHN1Y2ggZXhlY3V0YWJsZSByZWdpb24gZm9yIEpJVCBjb2RlIGlzIG5l
ZWRlZCBnaXZlbiBKU0MncyBjdXJyZW50IGRlc2lnbgorICAgIGlmIChleGVjdXRhYmxlICYmIHVz
YWdlID09IE9TQWxsb2NhdG9yOjpKU0pJVENvZGVQYWdlcykgeyAKKyAgICAgICAgaWYgKCFjaHVu
a0pJVENvZGUpIHsKKyAgICAgICAgICAgIGNodW5rSklUQ29kZSA9IG5ldyBSQ2h1bmsoKTsKKyAg
ICAgICAgICAgIFRJbnQgZXJyb3IgPSBjaHVua0pJVENvZGUtPkNyZWF0ZUxvY2FsQ29kZShieXRl
cywgYnl0ZXMpOyAvLyByZXNlcnZlIEFORCBjb21taXQKKyAgICAgICAgfQorICAgICAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8dm9pZCo+KGNodW5rSklUQ29kZSk7IAorICAgIH0KKworICAgIHJldHVy
biAwOwogfQogCi12b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZUFuZENvbW1pdChzaXplX3QgYnl0
ZXMsIFVzYWdlLCBib29sLCBib29sKQorLy8gUmVzZXJ2ZSBtZW1vcnkgYW5kIHJldHVybiB0aGUg
YmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KK3ZvaWQqIE9TQWxsb2NhdG9yOjpyZXNlcnZlVW5j
b21taXR0ZWQoc2l6ZV90IHJlc2VydmF0aW9uU2l6ZSwgVXNhZ2UgdXNhZ2UsIGJvb2wgLCBib29s
IGV4ZWN1dGFibGUpCiB7Ci0gICAgcmV0dXJuIGZhc3RNYWxsb2MoYnl0ZXMpOworICAgIHZvaWQq
IGNodW5rID0gZ2V0QmFja2luZ0NodW5rKHJlc2VydmF0aW9uU2l6ZSwgdXNhZ2UsIGV4ZWN1dGFi
bGUpOworCisgICAgaWYgKHVzYWdlID09IE9TQWxsb2NhdG9yOjpKU0dDSGVhcFBhZ2VzICYmIGNo
dW5rKSB7CisgICAgICAgIC8vIFdlIGRvbid0IGFjdHVhbGx5IGRvIGEgcmVzZXJ2YXRpb24gZm9y
IHRoaXMgY2FzZSwgYmVjYXVzZSBhIGxhcmdlCisgICAgICAgIC8vIG9uZSBoYXMgYWxyZWFkeSBi
ZWVuIGRvbmUgaW4gdGhlIFdyYXBwZWRDaHVua1N5bWJpYW4gYyd0b3IgKGFib3ZlKS4gCisgICAg
ICAgIC8vIFdlIHNpbXBseSAicGFyayIgYSBibG9jayBpbnRlcm5hbGx5IGJ5IHNldHRpbmcgYSBi
aXQgaW4gb3VyIGJpdCBtYXAKKyAgICAgICAgLy8gdG8gaW5kaWNhdGUgaW50ZW50aW9uIHRvIHVz
ZS4gIAorICAgICAgICBXcmFwcGVkQ2h1bmtTeW1iaWFuKiB3YyA9IHN0YXRpY19jYXN0PFdyYXBw
ZWRDaHVua1N5bWJpYW4qPihjaHVuayk7CisgICAgICAgIHJldHVybiB3Yy0+cGFya05leHRBdmFp
bGFibGVCbG9jaygpOworICAgIH0KKworICAgIGlmICh1c2FnZSA9PSBPU0FsbG9jYXRvcjo6SlNW
TVN0YWNrUGFnZXMgJiYgY2h1bmspIAorICAgICAgICByZXR1cm4gKHN0YXRpY19jYXN0PFJDaHVu
ayo+KGNodW5rKSktPkJhc2UoKTsKKyAgICAKKyAgICBpZiAodXNhZ2UgPT0gT1NBbGxvY2F0b3I6
OkpTSklUQ29kZVBhZ2VzICYmIGNodW5rKQorICAgICAgICByZXR1cm4gKHN0YXRpY19jYXN0PFJD
aHVuayo+KGNodW5rKSktPkJhc2UoKTsKKworICAgIC8vIERpcmVjdGx5IGhlYXAgYWxsb2NhdGUg
YW55dGhpbmcgdGhhdCBpc24ndCBiYWNrZWQgYnkgYSBjaHVuaworICAgIHJldHVybiBVc2VyOjpB
bGxvYyhyZXNlcnZhdGlvblNpemUpOyAgCiB9CiAKLXZvaWQgT1NBbGxvY2F0b3I6OmNvbW1pdCh2
b2lkKiwgc2l6ZV90LCBib29sLCBib29sKQorLy8gQWN0dWFsbHkgY29tbWl0IG1lbW9yeSBmcm9t
IE9TLCB3aGljaCB3YXMgcHJldmlvdXNseSByZXNlcnZlZCB2aWEgcmVzZXJ2ZVVuY29tbWl0dGVk
KCkKK3ZvaWQgT1NBbGxvY2F0b3I6OmNvbW1pdCh2b2lkKiBhZGRyZXNzLCBzaXplX3QgYnl0ZXMs
IGJvb2wsIGJvb2wgZXhlY3V0YWJsZSkKIHsKKyAgICBpZiAoY2h1bmtHQ0Jsb2NrcyAmJiBpc0Fk
ZHJlc3NGcm9tQ2h1bmsoYWRkcmVzcywgY2h1bmtHQ0Jsb2Nrcy0+cmF3Q2h1bmsoKSkpIHsgCisg
ICAgICAgIGJvb2wgb2sgPSBjaHVua0dDQmxvY2tzLT5jb21taXQoYWRkcmVzcyk7IAorICAgICAg
ICByZXR1cm47IAorICAgIH0KKworICAgIGlmIChjaHVua0dDSGFuZGxlUG9vbCAmJiBpc0FkZHJl
c3NGcm9tQ2h1bmsoYWRkcmVzcywgY2h1bmtHQ0hhbmRsZVBvb2wtPnJhd0NodW5rKCkpKSB7IAor
ICAgICAgICBib29sIG9rID0gY2h1bmtHQ0hhbmRsZVBvb2wtPmNvbW1pdChhZGRyZXNzKTsKKyAg
ICAgICAgcmV0dXJuOyAKKyAgICB9CisKKyAgICBpZiAoY2h1bmtWTVN0YWNrICYmIGlzQWRkcmVz
c0Zyb21DaHVuayhhZGRyZXNzLCBjaHVua1ZNU3RhY2spKSB7CisgICAgICAgIFRJbnQgb2Zmc2V0
ID0gcmVpbnRlcnByZXRfY2FzdDxUVWludDgqPihhZGRyZXNzKSAtIGNodW5rVk1TdGFjay0+QmFz
ZSgpOyAKKyAgICAgICAgVEludCBlcnJvciA9IGNodW5rVk1TdGFjay0+Q29tbWl0KG9mZnNldCwg
Ynl0ZXMpOworICAgICAgICByZXR1cm47IAorICAgIH0KKworICAgIGlmIChjaHVua0pJVENvZGUg
JiYgaXNBZGRyZXNzRnJvbUNodW5rKGFkZHJlc3MsIGNodW5rSklUQ29kZSkpIHsgCisgICAgICAg
IC8vIG5vIGNvbW1pdCBoZXJlLCBzaW5jZSBTeW1iaWFuIE9TIGZvcmNlcyBjb2RlIGNodW5rcyB0
byBjb21taXQgaW1tZWRpYXRlbHkKKyAgICAgICAgLy8gdXBvbiBjcmVhdGlvbi4gCisgICAgICAg
IHJldHVybjsgCisgICAgfQorCisgICAgLy8gRmFsbCB0aHJvdWdoIGZvciBoZWFwIGJhc2VkIGFs
bG9jYXRpb25zCisKIH0KIAotdm9pZCBPU0FsbG9jYXRvcjo6ZGVjb21taXQodm9pZCosIHNpemVf
dCkKKy8vIFJlbGVhc2UgcmVzZXJ2ZWQgKGJ1dCBub3QgY29tbWl0dGVkKSByZWdpb24KK3ZvaWQg
T1NBbGxvY2F0b3I6OnJlbGVhc2VEZWNvbW1pdHRlZCh2b2lkKiAsIHNpemVfdCkKIHsKKworICAg
IC8vIFdlIGRvIG5vdGhpbmcgZm9yIHRoZSBHQyBDb2xsZWN0b3IgYW5kIEhhbmRsZSBwb29sCisg
ICAgLy8gY2h1bmtzIGFzIHdlIG9ubHkgZG8gMSAobGFyZ2UpIHVwLWZyb250IHJlc2VydmF0aW9u
CisKKyAgICAvLyBJZiB0aGUgUmVnaXN0ZXJGaWxlIGNodW5rIGRvZXNuJ3QgaGF2ZSBhbnl0aGlu
ZworICAgIC8vIGluIGNvbW1pdHRlZCBzdGF0ZSBhbnltb3JlLCBkZWxldGUgaXQgdG8KKyAgICAv
LyByZWxlYXNpbmcgdmlydHVhbCBhZGRyZXNzIHRvIHRoZSBPUyAKKyAgICBpZiAoY2h1bmtWTVN0
YWNrICYmICFjaHVua1ZNU3RhY2stPlNpemUoKSkgeyAKKyAgICAgICAgZGVsZXRlIGNodW5rVk1T
dGFjazsgCisgICAgICAgIGNodW5rVk1TdGFjayA9IDA7IAorICAgICAgICByZXR1cm47IAorICAg
IH0KKworICAgIC8vIERpdHRvIGZvciBjaHVua0pJVENvZGUKKyAgICBpZiAoY2h1bmtKSVRDb2Rl
ICYmICFjaHVua0pJVENvZGUtPlNpemUoKSkgeyAKKyAgICAgICAgZGVsZXRlIGNodW5rSklUQ29k
ZTsgCisgICAgICAgIGNodW5rSklUQ29kZSA9IDA7CisgICAgICAgIHJldHVybjsgCisgICAgfQor
CiB9CiAKLXZvaWQgT1NBbGxvY2F0b3I6OnJlbGVhc2VEZWNvbW1pdHRlZCh2b2lkKiBhZGRyZXNz
LCBzaXplX3QpCit2b2lkIE9TQWxsb2NhdG9yOjpkZWNvbW1pdCh2b2lkKiBhZGRyZXNzLCBzaXpl
X3QgYnl0ZXMpCiB7Ci0gICAgZmFzdEZyZWUoYWRkcmVzcyk7CisgICAgaWYgKGNodW5rR0NCbG9j
a3MgJiYgaXNBZGRyZXNzRnJvbUNodW5rKGFkZHJlc3MsIGNodW5rR0NCbG9ja3MtPnJhd0NodW5r
KCkpKSB7IAorICAgICAgICBib29sIG9rID0gY2h1bmtHQ0Jsb2Nrcy0+ZGVjb21taXQoYWRkcmVz
cyk7CisgICAgICAgIHJldHVybjsgCisgICAgfQorCisgICAgaWYgKGNodW5rR0NIYW5kbGVQb29s
ICYmIGlzQWRkcmVzc0Zyb21DaHVuayhhZGRyZXNzLCBjaHVua0dDSGFuZGxlUG9vbC0+cmF3Q2h1
bmsoKSkpIHsgCisgICAgICAgIGJvb2wgb2sgPSBjaHVua0dDSGFuZGxlUG9vbC0+ZGVjb21taXQo
YWRkcmVzcyk7CisgICAgICAgIHJldHVybjsgCisgICAgfQorCisgICAgaWYgKGNodW5rVk1TdGFj
ayAmJiBpc0FkZHJlc3NGcm9tQ2h1bmsoYWRkcmVzcywgY2h1bmtWTVN0YWNrKSkgeyAKKyAgICAg
ICAgVEludCBvZmZzZXQgPSByZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIC0gY2h1
bmtWTVN0YWNrLT5CYXNlKCk7IAorICAgICAgICBUSW50IGVycm9yID0gY2h1bmtWTVN0YWNrLT5E
ZWNvbW1pdChvZmZzZXQsIGJ5dGVzKTsgCisgICAgICAgIHJldHVybjsgCisgICAgfQorCisgICAg
aWYgKGNodW5rSklUQ29kZSAmJiBpc0FkZHJlc3NGcm9tQ2h1bmsoYWRkcmVzcywgY2h1bmtKSVRD
b2RlKSkgeworICAgICAgICBUSW50IG9mZnNldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VFVpbnQ4Kj4o
YWRkcmVzcykgLSBjaHVua0pJVENvZGUtPkJhc2UoKTsKKyAgICAgICAgVEludCBlcnJvciA9IGNo
dW5rSklUQ29kZS0+RGVjb21taXQob2Zmc2V0LCBieXRlcyk7CisgICAgICAgIHJldHVybjsgCisg
ICAgfQorCisgICAgLy8gRGlyZWN0bHkgZnJlZSgpIGFueSBub24tY2h1bmsgYWxsb2NhdGlvbnMg
CisgICAgaWYgKGFkZHJlc3MpIAorICAgICAgICBVc2VyOjpGcmVlKGFkZHJlc3MpOworCit9CisK
K3ZvaWQqIE9TQWxsb2NhdG9yOjpyZXNlcnZlQW5kQ29tbWl0KHNpemVfdCBieXRlcywgVXNhZ2Ug
dXNhZ2UsIGJvb2wgd3JpdGFibGUsIGJvb2wgZXhlY3V0YWJsZSkKK3sgCisgICAgdm9pZCogYmFz
ZSA9IHJlc2VydmVVbmNvbW1pdHRlZChieXRlcywgdXNhZ2UsIHdyaXRhYmxlLCBleGVjdXRhYmxl
KTsKKyAgICBjb21taXQoYmFzZSwgYnl0ZXMsIHdyaXRhYmxlLCBleGVjdXRhYmxlKTsKKyAgICBy
ZXR1cm4gYmFzZTsKK30KKworLy8gSGVscGVyIGNsYXNzIHRoYXQgbWFwcyBjb21taXR0ZWQvZGVj
b21taXRlZCBzdGF0ZSBvZiBtYW55IGJsb2NrU2l6ZS1zaXplZCBibG9ja3MsCisvLyBlYWNoIGJs
b2NrU2l6ZSBhbGlnbmVkLCB0byBhIHNpbmdsZSBSQ2h1bmsncyAodmVyeSBsYXJnZSkgcmVzZXJ2
YXRpb24uCisvLyBUaGUgY2h1bmsgaGFuZGxlIGlzIGtlcHQgYXMgY29udGV4dC4gCitXcmFwcGVk
Q2h1bmtTeW1iaWFuOjpXcmFwcGVkQ2h1bmtTeW1iaWFuKFRJbnQgbWF4UmVzZXJ2YXRpb25TaXpl
LCBjb25zdCBUSW50IGJsb2NrU2l6ZSkgCisgICAgOiBtX2Jsb2NrU2l6ZShibG9ja1NpemUpCit7
CisgICAgLy8gR2V0IHN5c3RlbSdzIHBhZ2Ugc2l6ZS4KKyAgICBtX3BhZ2VTaXplID0gV1RGOjpw
YWdlU2l6ZSgpOworCisgICAgLy8gT25seSBhY2NlcHQgbXVsdGlwbGVzIG9mIHN5c3RlbSBwYWdl
IHNpemUgZm9yIGJvdGggaW5pdGlhbCByZXNlcnZhdGlvbiBhbmQgdGhlIGFsaWdubWVudC9ibG9j
ayBzaXplCisgICAgbWF4UmVzZXJ2YXRpb25TaXplID0gcm91bmRVcFRvTXVsdGlwbGUobWF4UmVz
ZXJ2YXRpb25TaXplLCBtX3BhZ2VTaXplKTsKKyAgICBfX0FTU0VSVF9BTFdBWVMocm91bmRVcFRv
TXVsdGlwbGUobV9ibG9ja1NpemUsIG1fcGFnZVNpemUpLCBVc2VyOjpQYW5pYyhfTCgiT1NBbGxv
Y2F0b3IyIiksIEtFcnJBcmd1bWVudCkpOworCisgICAgLy8gQ2FsY3VsYXRlIG1heC4gYml0IGZs
YWdzIHdlIG5lZWQgdG8gY2FydmUgYSByZXNlcnZhdGlvblNpemUgcmFuZ2UgaW50byBibG9ja1Np
emUtc2l6ZWQgYmxvY2tzCisgICAgbV9tYXAubnVtQml0cyA9IG1heFJlc2VydmF0aW9uU2l6ZSAv
IG1fYmxvY2tTaXplOyAgIAorICAgIGNvbnN0IFRVaW50MzIgYml0c1BlcldvcmQgPSA4KnNpemVv
ZihUVWludDMyKTsgCisgICAgY29uc3QgVFVpbnQzMiBudW1Xb3JkcyA9IChtX21hcC5udW1CaXRz
ICsgYml0c1BlcldvcmQgLTEpIC8gYml0c1BlcldvcmQ7IAorCisgICAgbV9tYXAuYml0cyA9IG5l
dyBUVWludDMyW251bVdvcmRzXTsKKyAgICBtX21hcC5jbGVhckFsbCgpOworCisgICAgLy8gUmVz
ZXJ2ZSByZXF1ZXN0ZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLCBub3RoaW5nIGNvbW1pdHRlZCBq
dXN0IHlldAorICAgIFRJbnQgcmV0ID0gbV9jaHVuay5DcmVhdGVEaXNjb25uZWN0ZWRMb2NhbCgw
ICwgMCwgbWF4UmVzZXJ2YXRpb25TaXplKTsgIAorCisgICAgLy8gVGhpcyBpcyB0aGUgb2Zmc2V0
IHRvIG1fY2h1bmsuQmFzZSgpIHJlcXVpcmVkIHRvIGdldCBhIG1fYmxvY2tTaXplLWFsaWduZWQg
YWRkcmVzcworICAgIG1fb2Zmc2V0ID0gcm91bmRVcFRvTXVsdGlwbGUoVFVpbnQzMihtX2NodW5r
LkJhc2UoKSksIG1fYmxvY2tTaXplKSAtIFRVaW50KG1fY2h1bmsuQmFzZSgpKTsgCisKK30KKwor
V3JhcHBlZENodW5rU3ltYmlhbjo6fldyYXBwZWRDaHVua1N5bWJpYW4oKSAKK3sKKyAgICBkZWxl
dGUgbV9tYXAuYml0czsKKyAgICBtX21hcC5iaXRzID0gMDsgCisgICAgbV9jaHVuay5EZWNvbW1p
dCgwLCBtX2NodW5rLk1heFNpemUoKSk7CisgICAgbV9jaHVuay5DbG9zZSgpOworfQorCisvLyBT
ZWFyY2hlcyBmb3IgdGhlIG5leHQgYXZhaWxhYmxlIGJsb2NrLCAicGFya3MiIGl0IGludGVybmFs
bHkKKy8vIGluIHRoZSBiaXRtYXAgYW5kIGFuZCByZXR1cm5zIGl0cyAoYmFzZSkgYWRkcmVzcwor
Ly8gTVVTVCBwcmVjZWRlIGEgY2FsbCB0byBjb21taXQodm9pZCAqYWRkcmVzcykKK3ZvaWQqIFdy
YXBwZWRDaHVua1N5bWJpYW46OnBhcmtOZXh0QXZhaWxhYmxlQmxvY2soKSAKK3sgCisgICAgLy8g
TG9vayB1cCBmaXJzdCBmcmVlIHNsb3QgaW4gYml0IG1hcAorICAgIGNvbnN0IFRJbnQgZnJlZUlk
eCA9IG1fbWFwLmZpbmRGcmVlKCk7CisKKyAgICAvLyBQc2V1ZG8gT09NOiBXZSBhdGUgdXAgdGhl
IGFkZHJlc3Mgc3BhY2Ugd2UgcmVzZXJ2ZWQuLgorICAgIC8vIC4uZXZlbiB0aG91Z2ggdGhlIGRl
dmljZSBtYXkgaGF2ZSBmcmVlIFJBTSBsZWZ0CisgICAgaWYgKGZyZWVJZHggPCAwKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIC8vIFVwZGF0ZWQgYml0IHRvIG1hcmsgcmVnaW9uIGFzIGluIHVz
ZSAoInBhcmtlZCIsIG5vdCBjb21taXR0ZWQgZnJvbSB0aGUgT1MgcG9pbnQgb2YgdmlldykgLiAK
KyAgICBtX21hcC5zZXQoZnJlZUlkeCk7IAorCisgICAgLy8gQ2FsY3VsYXRlIGFic29sdXRlIGFk
ZHJlc3Mgb2Ygc29vbi10by1iZS1jb21taXR0ZWQgcmVnaW9uIChibG9jaykKKyAgICByZXR1cm4g
cmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oIG1fY2h1bmsuQmFzZSgpICsgbV9vZmZzZXQgKyAoVFVp
bnQpKG1fYmxvY2tTaXplICogZnJlZUlkeCkgKTsgCiB9CiAKKy8vIE1VU1QgYmUgbWF0Y2hlZCB3
aXRoIGEgcHJldmlvdXMgcGFya05leHRBdmFpbGFibGVCbG9jaygpIGNhbGwKK2Jvb2wgV3JhcHBl
ZENodW5rU3ltYmlhbjo6Y29tbWl0KHZvaWQgKmFkZHJlc3MpIAoreyAKKyAgICBib29sIG9rID0g
ZmFsc2U7IAorCisgICAgLy8gQ2FsY3VsYXRlIGluZGV4IG9mIGJsb2NrCisgICAgVEludCBpZHgg
PSBUVWludChyZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIC0gbV9jaHVuay5CYXNl
KCkgLSBtX29mZnNldCkgLyBtX2Jsb2NrU2l6ZTsKKyAgICAvLyBUaGlzIGJpdCBzaG91bGQgcHJl
dmlvdXNseSBoYXZlIGJlZW4gc2V0IHZpYSBwYXJrTmV4dEF2YWlsYWJsZUJsb2NrKCkKKyAgICBf
X0FTU0VSVF9BTFdBWVMobV9tYXAuZ2V0KGlkeCksIFVzZXI6OlBhbmljKF9MKCJPU0FsbG9jYXRv
cjMiKSwgS0VyckFyZ3VtZW50KSk7CisgICAgCisgICAgVEludCByZXQgPSBtX2NodW5rLkNvbW1p
dChyZWludGVycHJldF9jYXN0PFRVaW50OCo+KGFkZHJlc3MpIC0gbV9jaHVuay5CYXNlKCksIG1f
YmxvY2tTaXplKTsKKyAgICBpZiAocmV0ID09IEtFcnJOb25lKSB7IAorICAgICAgICBtX21hcC5z
ZXQoaWR4KTsgCisgICAgICAgIG9rID0gdHJ1ZTsgCisgICAgfQorICAgIHJldHVybiBvazsKK30K
KworYm9vbCBXcmFwcGVkQ2h1bmtTeW1iaWFuOjpkZWNvbW1pdCh2b2lkICphZGRyZXNzKSAKK3sK
KyAgICAvLyBDYWxjdWxhdGUgb2Zmc2V0IGZyb20gY2h1bmsgYmFzZSBhbmQgZGVjb21taXQKKyAg
ICBUSW50IHJldCA9IG1fY2h1bmsuRGVjb21taXQocmVpbnRlcnByZXRfY2FzdDxUVWludDgqPihh
ZGRyZXNzKSAtIG1fY2h1bmsuQmFzZSgpLCBtX2Jsb2NrU2l6ZSk7CisgICAgLy8gQ2FsY3VsYXRl
IGluZGV4IGluIG1hcAorICAgIFRJbnQgaWR4ID0gVFVpbnQocmVpbnRlcnByZXRfY2FzdDxUVWlu
dDgqPihhZGRyZXNzKSAtIG1fY2h1bmsuQmFzZSgpIC0gbV9vZmZzZXQpIC8gbV9ibG9ja1NpemU7
CisgICAgbV9tYXAuY2xlYXIoaWR4KTsgIAorICAgIHJldHVybiAocmV0ID09IEtFcnJOb25lID8g
dHJ1ZSA6IGZhbHNlKTsKK30KKworVFVpbnQ4KiBXcmFwcGVkQ2h1bmtTeW1iaWFuOjpCYXNlKCkg
eyByZXR1cm4gbV9jaHVuay5CYXNlKCk7IH0KK1RJbnQgV3JhcHBlZENodW5rU3ltYmlhbjo6U2l6
ZSgpIHsgcmV0dXJuIG1fY2h1bmsuU2l6ZSgpOyB9CitUSW50IFdyYXBwZWRDaHVua1N5bWJpYW46
Ok1heFNpemUoKSB7IHJldHVybiBtX2NodW5rLk1heFNpemUoKTsgfQorUkNodW5rKiBXcmFwcGVk
Q2h1bmtTeW1iaWFuOjpyYXdDaHVuaygpIHsgcmV0dXJuICZtX2NodW5rOyB9CisKIH0gLy8gbmFt
ZXNwYWNlIFdURgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9QYWdlQWxsb2NhdGlv
bkFsaWduZWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvUGFn
ZUFsbG9jYXRpb25BbGlnbmVkLmNwcAkocmV2aXNpb24gNzUzNzUpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd3RmL1BhZ2VBbGxvY2F0aW9uQWxpZ25lZC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTUwLDggKzUwLDExIEBAIFBhZ2VBbGxvY2F0aW9uQWxpZ25lZCBQYWdlQWxsb2NhdGlvbkFsaWcK
ICAgICB2bV9tYXAoY3VycmVudF90YXNrKCksICZhZGRyZXNzLCBzaXplLCBhbGlnbm1lbnRNYXNr
LCBmbGFncywgTUVNT1JZX09CSkVDVF9OVUxMLCAwLCBGQUxTRSwgcHJvdGVjdGlvbiwgUFJPVF9S
RUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywgVk1fSU5IRVJJVF9ERUZBVUxUKTsKICAgICBy
ZXR1cm4gUGFnZUFsbG9jYXRpb25BbGlnbmVkKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFkZHJl
c3MpLCBzaXplKTsKICNlbHNlCi0gICAgc2l6ZV90IGFsaWdubWVudERlbHRhID0gYWxpZ25tZW50
IC0gcGFnZVNpemUoKTsKLQorICAgIHNpemVfdCBhbGlnbm1lbnREZWx0YSgwKTsKKyNpZiAhT1Mo
U1lNQklBTikgICAgCisgICAgYWxpZ25tZW50RGVsdGEgPSBhbGlnbm1lbnQgLSBwYWdlU2l6ZSgp
OworI2VuZGlmCisgICAgCiAgICAgLy8gUmVzZXJlcnZlIHdpdGggc3VmZmNpZW50IGFkZGl0aW9u
YWwgVk0gdG8gY29ycmVjdGx5IGFsaWduLgogICAgIHNpemVfdCByZXNlcnZhdGlvblNpemUgPSBz
aXplICsgYWxpZ25tZW50RGVsdGE7CiAgICAgdm9pZCogcmVzZXJ2YXRpb25CYXNlID0gT1NBbGxv
Y2F0b3I6OnJlc2VydmVVbmNvbW1pdHRlZChyZXNlcnZhdGlvblNpemUsIHVzYWdlLCB3cml0YWJs
ZSwgZXhlY3V0YWJsZSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL1ZNVGFncy5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvVk1UYWdzLmgJKHJldmlz
aW9uIDc2MjQ3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9WTVRhZ3MuaAkod29ya2lu
ZyBjb3B5KQpAQCAtNzksMTEgKzc5LDExIEBACiAKICNlbHNlIC8vIE9TKERBUldJTikKIAotI2Rl
ZmluZSBWTV9UQUdfRk9SX1RDTUFMTE9DX01FTU9SWSAtMQotI2RlZmluZSBWTV9UQUdfRk9SX0NP
TExFQ1RPUl9NRU1PUlkgLTEKLSNkZWZpbmUgVk1fVEFHX0ZPUl9FWEVDVVRBQkxFQUxMT0NBVE9S
X01FTU9SWSAtMQotI2RlZmluZSBWTV9UQUdfRk9SX1JFR0lTVEVSRklMRV9NRU1PUlkgLTEKLSNk
ZWZpbmUgVk1fVEFHX0ZPUl9XRUJDT1JFX1BVUkdFQUJMRV9NRU1PUlkgLTEKKyNkZWZpbmUgVk1f
VEFHX0ZPUl9UQ01BTExPQ19NRU1PUlkgMQorI2RlZmluZSBWTV9UQUdfRk9SX0NPTExFQ1RPUl9N
RU1PUlkgMgorI2RlZmluZSBWTV9UQUdfRk9SX0VYRUNVVEFCTEVBTExPQ0FUT1JfTUVNT1JZIDMK
KyNkZWZpbmUgVk1fVEFHX0ZPUl9SRUdJU1RFUkZJTEVfTUVNT1JZIDQKKyNkZWZpbmUgVk1fVEFH
X0ZPUl9XRUJDT1JFX1BVUkdFQUJMRV9NRU1PUlkgNQogCiAjZW5kaWYgLy8gT1MoREFSV0lOKQog
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL1dyYXBwZWRDaHVua1N5bWJpYW4uaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL1dyYXBwZWRDaHVua1N5bWJp
YW4uaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvV3JhcHBlZENo
dW5rU3ltYmlhbi5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDExIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVz
KQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBD
b21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250
cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2
ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0
dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisg
KiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpZm5kZWYgV3JhcHBlZENodW5rU3ltYmlhbl9oCisjZGVmaW5lIFdyYXBwZWRDaHVua1N5
bWJpYW5faAorCituYW1lc3BhY2UgV1RGIHsgCisvLyBIZWxwZXIgY2xhc3MgdGhhdCBtYXBzIGNv
bW1pdHRlZC9kZWNvbW1pdGVkIHN0YXRlIG9mIG1hbnkgYmxvY2tTaXplLXNpemVkIGJsb2NrcywK
Ky8vIGVhY2ggYmxvY2tTaXplIGFsaWduZWQsIHRvIGEgc2luZ2xlIFJDaHVuaydzICh2ZXJ5IGxh
cmdlKSByZXNlcnZhdGlvbi4KKy8vIFRoZSBjaHVuayBoYW5kbGUgaXMga2VwdCBhcyBjb250ZXh0
IGFjcm9zcyB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9jZXNzLgorLy8gVXNlZCBmb3IgQ29sbGVj
dG9yIGJsb2NrcyBhbmQgR0MgaGFuZGxlIHBvb2wgYXQgdGhpcyB0aW1lLgorY2xhc3MgV3JhcHBl
ZENodW5rU3ltYmlhbiB7CisgICAgCitwdWJsaWM6ICAgICAKKyAgICBXcmFwcGVkQ2h1bmtTeW1i
aWFuKFRJbnQgbWF4UmVzZXJ2YXRpb25TaXplLCBjb25zdCBUSW50IGJsb2NrU2l6ZSk7CisgICAg
fldyYXBwZWRDaHVua1N5bWJpYW4oKTsKKyAgICAKKyAgICB2b2lkICpwYXJrTmV4dEF2YWlsYWJs
ZUJsb2NrKCk7CisgICAgYm9vbCBjb21taXQodm9pZCAqYWRkcmVzcyk7CisgICAgYm9vbCBkZWNv
bW1pdCh2b2lkICphZGRyZXNzKTsKKyAgICAKKyAgICBUVWludDgqIEJhc2UoKTsKKyAgICBUSW50
IFNpemUoKTsKKyAgICBUSW50IE1heFNpemUoKTsKKyAgICBSQ2h1bmsqIHJhd0NodW5rKCk7IAor
ICAgIAorcHJpdmF0ZTogICAgIAorICAgIFRVaW50IG1fb2Zmc2V0OyAvLyBvZmZzZXQgZnJvbSBj
aHVuaydzIGJhc2UgbmVlZGVkIHRvIGdldCBibG9ja1NpemUgYWxpZ25lZCBibG9jaworICAgIFRJ
bnQgbV9wYWdlU2l6ZTsgCisgICAgVEludCBtX2Jsb2NrU2l6ZTsKKyAgICBSQ2h1bmsgbV9jaHVu
azsKKyAgICAKKyAgICBzdHJ1Y3QgeworICAgICAgICBUVWludDMyICpiaXRzOyAvLyBhcnJheSBv
ZiBiaXQgZmxhZ3MgCisgICAgICAgIFRVaW50MzIgbnVtQml0czsgLy8gbnVtYmVyIG9mIHJlZ2lv
bnMgdG8ga2VlcCB0cmFjayBvZgorCisgICAgICAgIGJvb2wgZ2V0KFRVaW50MzIgbikgY29uc3Qg
CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhIShiaXRzW24gPj4gNV0gJiAoMSA8PCAo
biAmIDB4MUYpKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldChUVWludDMyIG4pIAor
ICAgICAgICB7CisgICAgICAgICAgICBiaXRzW24gPj4gNV0gfD0gKDEgPDwgKG4gJiAweDFGKSk7
CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGNsZWFyKFRVaW50MzIgbikKKyAgICAgICAgewor
ICAgICAgICAgICAgYml0c1tuID4+IDVdICY9IH4oMSA8PCAobiAmIDB4MUYpKTsKKyAgICAgICAg
fQorCisgICAgICAgIHZvaWQgY2xlYXJBbGwoKQorICAgICAgICB7CisgICAgICAgICAgICBmb3Ig
KFRVaW50MzIgaSA9IDA7IGkgPCBudW1CaXRzOyBpKyspCisgICAgICAgICAgICAgICAgY2xlYXIo
aSk7CisgICAgICAgIH0KKworICAgICAgICBUSW50IGZpbmRGcmVlKCkgY29uc3QKKyAgICAgICAg
eworICAgICAgICAgICAgZm9yIChUVWludDMyIGkgPSAwOyBpIDwgbnVtQml0czsgaSsrKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKCFnZXQoaSkpIAorICAgICAgICAgICAgICAgICAgICByZXR1cm4g
aTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisg
ICAgfSBtX21hcDsKKyAgICAKK307CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8g
V3JhcHBlZENodW5rU3ltYmlhbl9oCisKClByb3BlcnR5IGNoYW5nZXMgb246IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93dGYvV3JhcHBlZENodW5rU3ltYmlhbi5oCl9fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2
bjpleGVjdXRhYmxlCiAgICsgKgoKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvd3Rm
LnByaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL3d0Zi5wcmkJKHJl
dmlzaW9uIDc2MjQ3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi93dGYucHJpCSh3b3Jr
aW5nIGNvcHkpCkBAIC00OSwzICs0OSw5IEBAIGNvbnRhaW5zKERFRklORVMsIFVTRV9HU1RSRUFN
RVI9MSkgewogdW5peDohc3ltYmlhbjogU09VUkNFUyArPSB3dGYvT1NBbGxvY2F0b3JQb3NpeC5j
cHAKIHN5bWJpYW46IFNPVVJDRVMgKz0gd3RmL09TQWxsb2NhdG9yU3ltYmlhbi5jcHAKIHdpbip8
d2luY2UqOiBTT1VSQ0VTICs9IHd0Zi9PU0FsbG9jYXRvcldpbi5jcHAKKworc3ltYmlhbjogewor
ICAgIExJQlMgKz0gLWxoYWwKKyAgICAjIEZvciBoYWwuaAorICAgIElOQ0xVREVQQVRIICo9ICQk
TVdfTEFZRVJfU1lTVEVNSU5DTFVERQorfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>80211</attachid>
            <date>2011-01-26 11:26:13 -0800</date>
            <delta_ts>2011-01-26 11:49:44 -0800</delta_ts>
            <desc>New algorithm</desc>
            <filename>51128_algo2.patch</filename>
            <type>text/plain</type>
            <size>18804</size>
            <attacher name="Siddharth Mathur">s.mathur</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNzY3MDEpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDAgQEAK
KzIwMTEtMDEtMjYgIFNpZGRoYXJ0aCBNYXRodXIgIDxzaWRkaGFydGgubWF0aHVyQG5va2lhLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbU3lt
Ymlhbl0gT1NBbGxvY2F0b3IgaW1wbGVtZW50YXRpb24KKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUxMTI4CisKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29y
ZS5wcmk6IG1vdmUgb3V0IEhBTCBsaW5rYWdlIGJsb2NrIHRvIHd0Zi5wcmkKKyAgICAgICAgCisg
ICAgICAgICogd3RmL09TQWxsb2NhdG9yLmg6CisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpk
ZWNvbW1pdEFuZFJlbGVhc2UpOiBhZGQgZXhwbGljaXQgZGVjb21taXQgbGlrZSBXaW5DRQorICAg
ICAgICAKKyAgICAgICAgKiB3dGYvT1NBbGxvY2F0b3JTeW1iaWFuLmNwcDogCisgICAgICAgIChX
VEY6Om1ha2VOZXdDb2RlQ2h1bmspOiBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uIGZvciBjb2RlIChK
SVQpIHJlZ2lvbnMKKyAgICAgICAgKFdURjo6ZnJlZUV4aXN0aW5nQ29kZUNodW5rKTogc3RhdGlj
IGhlbHBlciBmdW5jdGlvbiBmb3IgY29kZSAoSklUKSByZWdpb25zCisgICAgICAgIChXVEY6OmRh
dGFBbGxvY2F0b3JJbnN0YW5jZSk6IHN0YXRpYyBoZWxwZXIgZnVuY3Rpb24gdG8gZmV0Y2ggZGF0
YSBhbGxvY2F0b3IKKyAgICAgICAgKFdURjo6T1NBbGxvY2F0b3I6OnJlc2VydmVVbmNvbW1pdHRl
ZCk6IGltcGxlbWVudGF0aW9uIG9mIE9TQWxsb2NhdG9yIGludGVyZmFjZQorICAgICAgICAoV1RG
OjpPU0FsbG9jYXRvcjo6cmVsZWFzZURlY29tbWl0dGVkKTogZGl0dG8KKyAgICAgICAgKFdURjo6
T1NBbGxvY2F0b3I6OmNvbW1pdCk6IGRpdHRvCisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpk
ZWNvbW1pdCk6IGRpdHRvCisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpyZXNlcnZlQW5kQ29t
bWl0KTogZGl0dG8KKyAgICAgICAgKFdURjo6UGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbjo6UGFn
ZVNpemVkQWxsb2NhdG9yU3ltYmlhbik6IEFsbG9jYXRvciB0byByZXNlcnZlL2NvbW1pdC9yZWxl
YXNlIHBhZ2Utc2l6ZWQgdW5pdHMKKyAgICAgICAgKFdURjo6UGFnZVNpemVkQWxsb2NhdG9yU3lt
Ymlhbjo6flBhZ2VTaXplZEFsbG9jYXRvclN5bWJpYW4pOgorICAgICAgICAoV1RGOjpQYWdlU2l6
ZWRBbGxvY2F0b3JTeW1iaWFuOjpwYXJrTmV4dEF2YWlsYWJsZUJsb2NrKToKKyAgICAgICAgKFdU
Rjo6UGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbjo6dW5wYXJrKToKKyAgICAgICAgKFdURjo6UGFn
ZVNpemVkQWxsb2NhdG9yU3ltYmlhbjo6Y29tbWl0KToKKyAgICAgICAgKFdURjo6UGFnZVNpemVk
QWxsb2NhdG9yU3ltYmlhbjo6ZGVjb21taXQpOgorICAgICAgICAoV1RGOjpQYWdlU2l6ZWRBbGxv
Y2F0b3JTeW1iaWFuOjpvd25zQWRkcmVzcyk6CisgICAgICAgIAorICAgICAgICAqIHd0Zi9QYWdl
U2l6ZWRBbGxvY2F0b3JTeW1iaWFuLmg6IEFkZGVkLiBJbnRlcmZhY2VzCisgICAgICAgIChXVEY6
OkNodW5rV2l0aE1ldGFkYXRhOjpDaHVua1dpdGhNZXRhZGF0YSk6IFRoaW4gd3JhcHBlciBhcm91
bmQgU3ltYmlhbiBSQ2h1bmsKKyAgICAgICAgKFdURjo6Q2h1bmtXaXRoTWV0YWRhdGE6On5DaHVu
a1dpdGhNZXRhZGF0YSk6CisgICAgICAgIChXVEY6OkNodW5rV2l0aE1ldGFkYXRhOjpvd25zQWRk
cmVzcyk6CisgICAgICAgIChXVEY6OkNodW5rV2l0aE1ldGFkYXRhOjpkZXN0cm95KToKKyAgICAg
ICAgCisgICAgICAgICogd3RmL3d0Zi5wcmk6IE5ldyBob21lIGZvciB0aGUgSEFMIGxpbmthZ2Ug
YmxvY2sKKwogMjAxMS0wMS0yNiAgUGF0cmljayBHYW5zdGVyZXIgIDxwYXJvZ2FAd2Via2l0Lm9y
Zz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBbmRyZWFzIEtsaW5nLgpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnByaQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJpCShyZXZpc2lvbiA3NjcwMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcmkJKHdvcmtpbmcgY29weSkKQEAgLTQ4
LDEyICs0OCw2IEBAIHN5bWJpYW4gewogICAgIElOQ0xVREVQQVRIID0gJCRKQVZBU0NSSVBUQ09S
RV9JTkNMVURFUEFUSCAkJElOQ0xVREVQQVRICiB9CiAKLXN5bWJpYW46IHsKLSAgICBMSUJTICs9
IC1saGFsCi0gICAgIyBGb3IgaGFsLmgKLSAgICBJTkNMVURFUEFUSCAqPSAkJE1XX0xBWUVSX1NZ
U1RFTUlOQ0xVREUKLX0KLQogd2luMzItKjogREVGSU5FUyArPSBfSEFTX1RSMT0wCiAKIERFRklO
RVMgKz0gQlVJTERJTkdfSmF2YVNjcmlwdENvcmUgQlVJTERJTkdfV1RGCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvd3RmL09TQWxsb2NhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL3d0Zi9PU0FsbG9jYXRvci5oCShyZXZpc2lvbiA3NjcwMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtNzcs
OSArNzcsOCBAQCBpbmxpbmUgdm9pZCogT1NBbGxvY2F0b3I6OnJlc2VydmVBbmRDb21tCiBpbmxp
bmUgdm9pZCBPU0FsbG9jYXRvcjo6ZGVjb21taXRBbmRSZWxlYXNlKHZvaWQqIHJlbGVhc2VCYXNl
LCBzaXplX3QgcmVsZWFzZVNpemUsIHZvaWQqIGRlY29tbWl0QmFzZSwgc2l6ZV90IGRlY29tbWl0
U2l6ZSkKIHsKICAgICBBU1NFUlQoZGVjb21taXRCYXNlID49IHJlbGVhc2VCYXNlICYmIChzdGF0
aWNfY2FzdDxjaGFyKj4oZGVjb21taXRCYXNlKSArIGRlY29tbWl0U2l6ZSkgPD0gKHN0YXRpY19j
YXN0PGNoYXIqPihyZWxlYXNlQmFzZSkgKyByZWxlYXNlU2l6ZSkpOwotI2lmIE9TKFdJTkNFKQot
ICAgIC8vIE9uIG1vc3QgcGxhdGZvcm1zIHdlIGNhbiBhY3R1YWxseSBza2lwIHRoaXMgZmluYWwg
ZGVjb21taXQ7IHJlbGVhc2luZyB0aGUgVk0gd2lsbAotICAgIC8vIGltcGxpY2l0bHkgZGVjb21t
aXQgYW55IHBoeXNpY2FsIG1lbW9yeSBpbiB0aGUgcmVnaW9uLiBUaGlzIGlzIG5vdCB0cnVlIG9u
IFdJTkNFLgorI2lmIE9TKFdJTkNFKSB8fCBPUyhTWU1CSUFOKQorICAgIC8vIFRoZXNlIE9TZXMg
cHJlZmVyIGFuIGV4cGxpY2l0IGRlY29tbWl0IGJlZm9yZSBhIHJlbGVhc2UKICAgICBkZWNvbW1p
dChkZWNvbW1pdEJhc2UsIGRlY29tbWl0U2l6ZSk7CiAjZWxzZQogICAgIFVOVVNFRF9QQVJBTShk
ZWNvbW1pdEJhc2UpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9PU0FsbG9jYXRv
clN5bWJpYW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvT1NB
bGxvY2F0b3JTeW1iaWFuLmNwcAkocmV2aXNpb24gNzY3MDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd3RmL09TQWxsb2NhdG9yU3ltYmlhbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSAr
MSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3Ig
aXRzIHN1YnNpZGlhcnkoLWllcykuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKQEAgLTI2LDMxICsyNiwyMDQgQEAKICNpbmNsdWRlICJjb25maWcu
aCIKICNpbmNsdWRlICJPU0FsbG9jYXRvci5oIgogCi0jaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2Mu
aD4KKyNpbmNsdWRlICJQYWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFuLmgiCiAKIG5hbWVzcGFjZSBX
VEYgewogCi12b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZVVuY29tbWl0dGVkKHNpemVfdCBieXRl
cywgVXNhZ2UsIGJvb2wsIGJvb2wpCisvLyBBcnJheSB0byBzdG9yZSBjb2RlIGNodW5rcyB1c2Vk
IGJ5IEpJVCBlbmdpbmUocykKK3N0YXRpYyBSUG9pbnRlckFycmF5PENodW5rV2l0aE1ldGFkYXRh
PiBjb2RlQ2h1bmtzQ29udGFpbmVyOworCisvLyBQb2ludGVyIHRvIHRoZSBkYXRhIChub24gY29k
ZSkgYWxsb2NhdG9yCitzdGF0aWMgUGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbiogc21hbGxTaXpl
ZEFsbG9jYXRvciA9IDA7IAorCisvLyBMYXJnZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgdG8gYmUg
cmVzZXJ2ZWQgdXBmcm9udAorc3RhdGljIGNvbnN0IHNpemVfdCByZXNlcnZhdGlvblNpemVEYXRh
Q2h1bmsgPSBKU0NWTURBVEFDSFVOS19SRVNFUlZBVElPTlNJWkU7IAorCisKKy8vIE1ha2VzIGEg
bmV3IGNvZGUgY2h1bmsgZm9yIGEgSklUIGVuZ2luZSB3aXRoIGV2ZXJ5dGhpbmcgaW4gY29tbWl0
dGVkIHN0YXRlCitzdGF0aWMgdm9pZCogbWFrZU5ld0NvZGVDaHVuayhzaXplX3QgYnl0ZXMpIAor
eworICAgIFJDaHVuayBjOyAKKyAgICBUSW50IGVycm9yID0gYy5DcmVhdGVMb2NhbENvZGUoYnl0
ZXMsIGJ5dGVzKTsKKyAgICBfX0FTU0VSVF9BTFdBWVMoZXJyb3IgPT0gS0Vyck5vbmUsIFVzZXI6
OlBhbmljKF9MKCJPU0FsbG9jYXRvcjEiKSwgZXJyb3IpKTsKKyAgIAorICAgIC8vIGFwcGVuZCB0
byBhcnJheQorICAgIGNvZGVDaHVua3NDb250YWluZXIuQXBwZW5kKG5ldyBDaHVua1dpdGhNZXRh
ZGF0YShjLkhhbmRsZSgpLCB0cnVlKSk7IAorICAgIHJldHVybiBzdGF0aWNfY2FzdDx2b2lkKj4o
Yy5CYXNlKCkpOyAKK30KKyAgIAorLy8gRnJlZXMgdGhlIF9lbnRpcmVfIGNvZGUgY2h1bmsgaW4g
d2hpY2ggdGhpcyBhZGRyZXNzIHJlc2lkZXMuIAorc3RhdGljIGJvb2wgZnJlZUV4aXN0aW5nQ29k
ZUNodW5rKHZvaWQgKmFkZHJlc3MpIAoreyAgICAgCisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOyAK
KyAgICBmb3IgKFRJbnQgaSA9IDA7IGkgPCBjb2RlQ2h1bmtzQ29udGFpbmVyLkNvdW50KCk7IGkr
KykgeyAKKyAgICAgICAgQ2h1bmtXaXRoTWV0YWRhdGEqIHAgPSBjb2RlQ2h1bmtzQ29udGFpbmVy
W2ldOworICAgICAgICBpZiAocCAmJiBwLT5vd25zQWRkcmVzcyhhZGRyZXNzKSkgeyAKKyAgICAg
ICAgICAgIGNvZGVDaHVua3NDb250YWluZXIuUmVtb3ZlKGkpOworICAgICAgICAgICAgZGVsZXRl
IHA7IC8vIHVuZGVybHlpbmcgY2h1bmsgaXMgY2xvc2VkIGhlcmUKKyAgICAgICAgICAgIGZvdW5k
ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZm91bmQ7IAorfQorCisvLyBS
ZXR1cm4gdGhlIGJhY2tpbmcgY2h1bmsgZm9yIGFsbCBub24tY29kZSBhbGxvY2F0aW9ucworc3Rh
dGljIFBhZ2VTaXplZEFsbG9jYXRvclN5bWJpYW4qIGRhdGFBbGxvY2F0b3JJbnN0YW5jZSgpIAor
eworICAgIGlmICghc21hbGxTaXplZEFsbG9jYXRvcikgCisgICAgICAgIHNtYWxsU2l6ZWRBbGxv
Y2F0b3IgPSBuZXcgUGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbihyZXNlcnZhdGlvblNpemVEYXRh
Q2h1bmspOworCisgICAgcmV0dXJuIHNtYWxsU2l6ZWRBbGxvY2F0b3I7IAorfQorCisKKy8vIFJl
c2VydmUgbWVtb3J5IGFuZCByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCit2
b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZVVuY29tbWl0dGVkKHNpemVfdCByZXNlcnZhdGlvblNp
emUsIFVzYWdlIHVzYWdlLCBib29sICwgYm9vbCBleGVjdXRhYmxlKSAKK3sKKyAgICB2b2lkKiBi
YXNlID0gMDsgCisgICAgaWYgKGV4ZWN1dGFibGUpIAorICAgICAgICBiYXNlID0gbWFrZU5ld0Nv
ZGVDaHVuayhyZXNlcnZhdGlvblNpemUpOworICAgIGVsc2UKKyAgICAgICAgYmFzZSA9IGRhdGFB
bGxvY2F0b3JJbnN0YW5jZSgpLT5wYXJrTmV4dEF2YWlsYWJsZUJsb2NrKHJlc2VydmF0aW9uU2l6
ZSk7CisgICAgcmV0dXJuIGJhc2U7IAorfQorCisvLyBUaGlzIGlzIHRoZSBpbnZlcnNlIG9wZXJh
dGlvbiBvZiByZXNlcnZlVW5jb21taXR0ZWQoKQordm9pZCBPU0FsbG9jYXRvcjo6cmVsZWFzZURl
Y29tbWl0dGVkKHZvaWQqIHBhcmtlZEJhc2UsIHNpemVfdCBieXRlcykgCiB7Ci0gICAgcmV0dXJu
IGZhc3RNYWxsb2MoYnl0ZXMpOworICAgIC8vIEZyZWUgYml0cyBpbiBvdXIgYml0bWFwIHdoaWNo
IHJlcHJlc2VudCAicGFya2VkIiBiaXRzCisgICAgaWYgKGRhdGFBbGxvY2F0b3JJbnN0YW5jZSgp
LT5vd25zQWRkcmVzcyhwYXJrZWRCYXNlKSkgCisgICAgICAgIGRhdGFBbGxvY2F0b3JJbnN0YW5j
ZSgpLT51bnBhcmsocGFya2VkQmFzZSwgYnl0ZXMpOworCisgICAgLy8gTk9PUCBmb3IgY29kZSBj
aHVua3MgKEpJVCkgYmVjYXVzZSB3ZSByZWxlYXNlZCB0aGVtIGluIGRlY29tbWl0KCkKK30KKwor
Ly8gQ29tbWl0IHdoYXQgd2FzIHByZXZpb3VzbHkgcmVzZXJ2ZWQgdmlhIHJlc2VydmVVbmNvbW1p
dHRlZCgpCit2b2lkIE9TQWxsb2NhdG9yOjpjb21taXQodm9pZCogYWRkcmVzcywgc2l6ZV90IGJ5
dGVzLCBib29sLCBib29sIGV4ZWN1dGFibGUpIAoreworICAgIC8vIEZvciBjb2RlIGNodW5rcywg
d2UgY29tbWl0IChlYXJseSkgaW4gcmVzZXJ2ZVVuY29tbWl0dGVkKCksIHNvIE5PT1AKKyAgICAv
LyBGb3IgZGF0YSByZWdpb25zLCBkbyByZWFsIHdvcmsKKyAgICBpZiAoIWV4ZWN1dGFibGUpIAor
ICAgICAgICBkYXRhQWxsb2NhdG9ySW5zdGFuY2UoKS0+Y29tbWl0KGFkZHJlc3MsIGJ5dGVzKTsK
K30KKwordm9pZCBPU0FsbG9jYXRvcjo6ZGVjb21taXQodm9pZCogYWRkcmVzcywgc2l6ZV90IGJ5
dGVzKSAKK3sgCisgICAgaWYgKGRhdGFBbGxvY2F0b3JJbnN0YW5jZSgpLT5vd25zQWRkcmVzcyhh
ZGRyZXNzKSkKKyAgICAgICAgZGF0YUFsbG9jYXRvckluc3RhbmNlKCktPmRlY29tbWl0KGFkZHJl
c3MsIGJ5dGVzKTsKKyAgICBlbHNlCisgICAgICAgIGZyZWVFeGlzdGluZ0NvZGVDaHVuayhhZGRy
ZXNzKTsgLy8gZm9yIGNvZGUgY2h1bmssIGRlY29tbWl0IEFORCByZWxlYXNlICAgIAorfQorICAg
IAordm9pZCogT1NBbGxvY2F0b3I6OnJlc2VydmVBbmRDb21taXQoc2l6ZV90IGJ5dGVzLCBVc2Fn
ZSB1c2FnZSwgYm9vbCB3cml0YWJsZSwgYm9vbCBleGVjdXRhYmxlKQoreyAKKyAgICB2b2lkKiBi
YXNlID0gcmVzZXJ2ZVVuY29tbWl0dGVkKGJ5dGVzLCB1c2FnZSwgd3JpdGFibGUsIGV4ZWN1dGFi
bGUpOworICAgIGNvbW1pdChiYXNlLCBieXRlcywgd3JpdGFibGUsIGV4ZWN1dGFibGUpOworICAg
IHJldHVybiBiYXNlOworfQorCisKKy8vIFRoZSBQYWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFuIGNs
YXNzIGhlbHBzIG1hcCBPU0FsbG9jYXRvciBjYWxscyBmb3IgcmVzZXJ2ZS9jb21taXQvZGVjb21t
aXQKKy8vIHRvIGEgc2luZ2xlIGxhcmdlIFN5bWJpYW4gY2h1bmsuIE9ubHkgd29ya3Mgd2l0aCBt
dWx0aXBsZXMgb2YgcGFnZSBzaXplLCBhbmQgYXMgYSBjb3JvbGxhcnkgCisvLyBhbGwgYWRkcmVz
c2VzIGFjY2VwdGVkIG9yIHJldHVybmVkIGJ5IGl0IGFyZSBhbHNvIHBhZ2Utc2l6ZWQgYWxpZ25l
ZC4gCisvLyBEZXNpZ24gbm90ZXM6IAorLy8gLSBXZSBpbml0aWFsaXplIGEgY2h1bmsgdXAtZnJv
bnQgd2l0aCBhIGxhcmdlIHJlc2VydmF0aW9uIHNpemUKKy8vIC0gVGhlIGVudGlyZSByZXNlcnZh
dGlvbiByZXNlcnZlIGlzIGxvZ2ljYWxseSBkaXZpZGVkIGludG8gcGFnZVNpemVkIGJsb2NrcyAo
NEsgb24gU3ltYmlhbikgCisvLyAtIFRoZSBtYXAgbV9tYXAgbWFpbnRhaW5zIDEgYml0IGZvciBl
YWNoIG9mIHRoZSA0Sy1zaXplZCByZWdpb24gaW4gb3VyIGFkZHJlc3Mgc3BhY2UKKy8vIC0gT1NB
bGxvY2F0b3I6OnJlc2VydmVVbmNvbW1pdHRlZCgpIHJlcXVlc3RzIGxlYWQgdG8gMSBvciBtb3Jl
IGJpdHMgYmVpbmcgc2V0IGluIG1fbWFwIAorLy8gICB0byBpbmRpY2F0ZSAicGFya2VkIiBzdGF0
ZS4gVGhlIFZNIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgYml0IGlzIHJldHVy
bmVkLiAKKy8vIC0gT1NBbGxvY2F0b3I6OmNvbW1pdCgpIGFjdHVhbGx5IGNhbGxzIFJDaHVuay5j
b21taXQoKSBhbmQgY29tbWl0cyAqYWxsIG9yIHBhcnQqIG9mIHRoZSByZWdpb24gCisvLyAgIHJl
c2VydmVkIHZpYSByZXNlcnZlVW5jb21taXR0ZWQoKSBwcmV2aW91c2x5LiAKKy8vIC0gT1NBbGxv
Y2F0b3I6OmRlY29tbWl0KCkgY2FsbHMgUkNodW5rLmRlY29tbWl0KCkgYW5kIHVuc2V0cyB0aGUg
Yml0IGl0IGNhbiBjYWxjdWxhdGUgZnJvbSBpdHMgYXJncworLy8gLSBPU0FsbG9jYXRvcjo6cmVs
ZWFzZURlY29tbWl0dGVkKCkgdW5wYXJrcyBhbGwgdGhlIGJpdHMgaW4gbV9tYXAsIGJ1dCB0cnVz
dHMgdGhhdCBhIHByZXZpb3VzbHkKKy8vICAgY2FsbCB0byBkZWNvbW1pdCgpIHdvdWxkIGhhdmUg
cmV0dXJuZWQgdGhlIG1lbW9yeSB0byB0aGUgT1MgCitQYWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFu
OjpQYWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFuKHNpemVfdCBsYXJnZVJlc2VydmF0aW9uU2l6ZSkK
K3sgICAgICAgCisgICAgLy8gSW5pdGlhbGl6ZSBjaHVuayAuLiAKKyAgICBSQ2h1bmsgYzsgCisg
ICAgVEludCBlcnJvciA9IGMuQ3JlYXRlRGlzY29ubmVjdGVkTG9jYWwoMCwgMCwgbGFyZ2VSZXNl
cnZhdGlvblNpemUpOworICAgIF9fQVNTRVJUX0FMV0FZUyhlcnJvciA9PSBLRXJyTm9uZSwgVXNl
cjo6UGFuaWMoX0woIk9TQWxsb2NhdG9yMSIpLCBlcnJvcikpOworICAgIC8vIC4uIGFuZCB0aGUg
Y29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgaXQKKyAgICBtX2NodW5rV2l0aE1ldGEgPSBuZXcg
Q2h1bmtXaXRoTWV0YWRhdGEoYy5IYW5kbGUoKSwgZmFsc2UpOworICAgIAorICAgIC8vIEdldCBz
eXN0ZW0ncyBwYWdlIHNpemUuCisgICAgSEFMOjpHZXQoSEFMRGF0YTo6RU1lbW9yeVBhZ2VTaXpl
LCBtX3BhZ2VTaXplKTsKKworICAgIC8vIENhbGN1bGF0ZSBiaXQgZmxhZ3MgbmVlZGVkIHRvIGNh
cnZlIGEgbGFyZ2VSZXNlcnZhdGlvblNpemUgcmFuZ2UgaW50byBwYWdlU2l6ZS1zaXplZCBibG9j
a3MKKyAgICBtX21hcC5udW1CaXRzID0gYy5NYXhTaXplKCkgLyBtX3BhZ2VTaXplOyAgIAorICAg
IGNvbnN0IFRVaW50MzIgYml0c1BlcldvcmQgPSA4KnNpemVvZihUVWludDMyKTsgCisgICAgY29u
c3QgVFVpbnQzMiBudW1Xb3JkcyA9IChtX21hcC5udW1CaXRzICsgYml0c1BlcldvcmQgLTEpIC8g
Yml0c1BlcldvcmQ7IAorCisgICAgbV9tYXAuYml0cyA9IG5ldyBUVWludDMyW251bVdvcmRzXTsK
KyAgICBtX21hcC5jbGVhckFsbCgpOworCiB9CiAKLXZvaWQqIE9TQWxsb2NhdG9yOjpyZXNlcnZl
QW5kQ29tbWl0KHNpemVfdCBieXRlcywgVXNhZ2UsIGJvb2wsIGJvb2wpCitQYWdlU2l6ZWRBbGxv
Y2F0b3JTeW1iaWFuOjp+UGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbigpIAogewotICAgIHJldHVy
biBmYXN0TWFsbG9jKGJ5dGVzKTsKKyAgICBkZWxldGUgbV9jaHVua1dpdGhNZXRhOyAvLyBkZWNv
bW1pdHMgYW5kIGRlc3Ryb3lzIGNodW5rIHRvbyEKKyAgICBkZWxldGUgbV9tYXAuYml0czsgICAg
CiB9CiAKLXZvaWQgT1NBbGxvY2F0b3I6OmNvbW1pdCh2b2lkKiwgc2l6ZV90LCBib29sLCBib29s
KQorLy8gU2VhcmNoZXMgZm9yIHRoZSBuZXh0IGF2YWlsYWJsZSByZWdpb24gb2Ygc2l6ZSAnYnl0
ZXMnIAorLy8gYW5kICJwYXJrcyIgaXQgaW50ZXJuYWxseSBpbiB0aGUgYml0IG1hcCAKK3ZvaWQq
IFBhZ2VTaXplZEFsbG9jYXRvclN5bWJpYW46OnBhcmtOZXh0QXZhaWxhYmxlQmxvY2soc2l6ZV90
IGJ5dGVzKSAKK3sgCisgICAgLy8gTG9vayB1cCBmaXJzdCByZWdpb24gaW4gYml0IG1hcCBvZiBz
aXplIGJ5dGVzCisgICAgY29uc3Qgc2l6ZV90IG5QYWdlcyA9IGJ5dGVzIC8gbV9wYWdlU2l6ZTsK
KyAgICBjb25zdCBUSW50IHN0YXJ0SWR4ID0gbV9tYXAuZmluZEZyZWVDb25zZWN1dGl2ZVBhZ2Vz
KG5QYWdlcyk7CisKKyAgICAvLyBQc2V1ZG8gT09NOiBXZSBhdGUgdXAgdGhlIGFkZHJlc3Mgc3Bh
Y2Ugd2UgcmVzZXJ2ZWQuLgorICAgIC8vIC4uZXZlbiB0aG91Z2ggdGhlIGRldmljZSBtYXkgaGF2
ZSBmcmVlIFJBTSBsZWZ0CisgICAgaWYgKHN0YXJ0SWR4IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICAvLyBVcGRhdGVkIGJpdHMgdG8gbWFyayByZWdpb24gYXMgaW4gdXNlICgicGFya2Vk
Iiwgbm90IGNvbW1pdHRlZCBmcm9tIHRoZSBPUyBwb2ludCBvZiB2aWV3KSAuIAorICAgIG1fbWFw
LnNldChzdGFydElkeCwgblBhZ2VzKTsgCisgICAgCisgICAgLy8gQ2FsY3VsYXRlIHZpcnR1YWwg
YWRkcmVzcworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPiggbV9jaHVua1dpdGhN
ZXRhLT5tX2Jhc2UgKyAoVFVpbnQpKG1fcGFnZVNpemUgKiBzdGFydElkeCkgKTsgCit9CisKKy8v
IFJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIGEgcGFya05leHRBdmFpbGFibGVCbG9jaygpIGNhbGwK
K3ZvaWQgUGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbjo6dW5wYXJrKHZvaWQqIGFkZHJlc3MsIHNp
emVfdCBieXRlcykKIHsKKyAgICBjb25zdCBUSW50IGlkeCA9IFRVaW50KHJlaW50ZXJwcmV0X2Nh
c3Q8VFVpbnQ4Kj4oYWRkcmVzcykgLSBtX2NodW5rV2l0aE1ldGEtPm1fYmFzZSkgLyBtX3BhZ2VT
aXplOworICAgIGNvbnN0IHNpemVfdCBuUGFnZXMgPSBieXRlcyAvIG1fcGFnZVNpemU7CisgICAg
bV9tYXAuY2xlYXIoaWR4LCBuUGFnZXMpOworfQorCisvLyBBY3R1YWxseSBjb21taXQgbWVtb3J5
IGZyb20gdGhlIE9TLCBhZnRlciBhIHByZXZpb3VzIGNhbGwgdG8gcGFya05leHRBdmFpbGFibGVC
bG9jaygpCitib29sIFBhZ2VTaXplZEFsbG9jYXRvclN5bWJpYW46OmNvbW1pdCh2b2lkICphZGRy
ZXNzLCBzaXplX3QgYnl0ZXMpIAoreyAKKyAgICAvLyBDYWxjdWxhdGUgc3RhcnQgaW5kZXggYW5k
IG51bWJlciBvZiBiaXRzIGluIG1hcAorICAgIGNvbnN0IFRJbnQgaWR4ID0gVFVpbnQocmVpbnRl
cnByZXRfY2FzdDxUVWludDgqPihhZGRyZXNzKSAtIG1fY2h1bmtXaXRoTWV0YS0+bV9iYXNlKSAv
IG1fcGFnZVNpemU7CisgICAgY29uc3Qgc2l6ZV90IG5QYWdlcyA9IGJ5dGVzIC8gbV9wYWdlU2l6
ZTsKKyAgICAKKyAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgZmlyc3QgYW5kIGxhc3QgYml0cyBvZiB0
aGUgcmVnaW9uIHdlcmUgcHJldmlvdXNseSBzZXQgdmlhIHBhcmtOZXh0QXZhaWxhYmxlQmxvY2so
KQorICAgIF9fQVNTRVJUX0FMV0FZUyhtX21hcC5nZXQoaWR4KSwgVXNlcjo6UGFuaWMoX0woIk9T
QWxsb2NhdG9yMiIpLCBpZHgpKTsKKyAgICBfX0FTU0VSVF9BTFdBWVMobV9tYXAuZ2V0KGlkeCtu
UGFnZXMtMSksIFVzZXI6OlBhbmljKF9MKCJPU0FsbG9jYXRvcjMiKSwgaWR4K25QYWdlcy0xKSk7
CisgICAgCisgICAgLy8gQ2FsY3VsYXRlIG9mZnNldCBmcm9tIGNodW5rIGJhc2UgYW5kIGNvbW1p
dAorICAgIFRJbnQgcmV0ID0gbV9jaHVua1dpdGhNZXRhLT5Db21taXQocmVpbnRlcnByZXRfY2Fz
dDxUVWludDgqPihhZGRyZXNzKSAtIG1fY2h1bmtXaXRoTWV0YS0+bV9iYXNlLCBieXRlcyk7Cisg
ICAgcmV0dXJuIChyZXQgPT0gS0Vyck5vbmUpOwogfQogCi12b2lkIE9TQWxsb2NhdG9yOjpkZWNv
bW1pdCh2b2lkKiwgc2l6ZV90KQorYm9vbCBQYWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFuOjpkZWNv
bW1pdCh2b2lkICphZGRyZXNzLCBzaXplX3QgYnl0ZXMpIAogeworICAgIC8vIENhbGN1bGF0ZSBz
dGFydCBpbmRleCBhbmQgbnVtYmVyIG9mIGJpdHMgaW4gbWFwIGFuZCBjbGVhciAKKyAgICBjb25z
dCBUSW50IGlkeCA9IFRVaW50KHJlaW50ZXJwcmV0X2Nhc3Q8VFVpbnQ4Kj4oYWRkcmVzcykgLSBt
X2NodW5rV2l0aE1ldGEtPm1fYmFzZSkgLyBtX3BhZ2VTaXplOworICAgIGNvbnN0IFRVaW50MzIg
blBhZ2VzID0gYnl0ZXMgLyBtX3BhZ2VTaXplOworICAgIG1fbWFwLmNsZWFyKGlkeCwgblBhZ2Vz
KTsKKyAgICAKKyAgICAvLyBDYWxjdWxhdGUgb2Zmc2V0IGZyb20gY2h1bmsgYmFzZSBhbmQgZGVj
b21taXQKKyAgICBUSW50IHJldCA9IG1fY2h1bmtXaXRoTWV0YS0+RGVjb21taXQocmVpbnRlcnBy
ZXRfY2FzdDxUVWludDgqPihhZGRyZXNzKSAtIG1fY2h1bmtXaXRoTWV0YS0+bV9iYXNlLCBieXRl
cyk7CisgICAgcmV0dXJuIChyZXQgPT0gS0Vyck5vbmUpOyAKIH0KIAotdm9pZCBPU0FsbG9jYXRv
cjo6cmVsZWFzZURlY29tbWl0dGVkKHZvaWQqIGFkZHJlc3MsIHNpemVfdCkKK2Jvb2wgUGFnZVNp
emVkQWxsb2NhdG9yU3ltYmlhbjo6b3duc0FkZHJlc3MoY29uc3Qgdm9pZCogYWRkcmVzcykgY29u
c3QKIHsKLSAgICBmYXN0RnJlZShhZGRyZXNzKTsKKyAgICByZXR1cm4gbV9jaHVua1dpdGhNZXRh
LT5vd25zQWRkcmVzcyhhZGRyZXNzKTsgICAgIAogfQogCiB9IC8vIG5hbWVzcGFjZSBXVEYKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvUGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbi5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvUGFnZVNpemVkQWxsb2Nh
dG9yU3ltYmlhbi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9Q
YWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFuLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTYzIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMg
c3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUg
bmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgor
ICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisg
KiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbl9oCisj
ZGVmaW5lIFBhZ2VTaXplZEFsbG9jYXRvclN5bWJpYW5faAorCisjaW5jbHVkZSA8ZTMyc3RkLmg+
CisjaW5jbHVkZSA8aGFsLmg+CisKKyNpZm5kZWYgSlNDVk1EQVRBQ0hVTktfUkVTRVJWQVRJT05T
SVpFCisjaWYgZGVmaW5lZChfX1dJTlNfXykgCisvLyBFbXVsYXRvciBoYXMgbGltaXRlZCB2aXJ0
dWFsIGFkZHJlc3Mgc3BhY2UKKyNkZWZpbmUgSlNDVk1EQVRBQ0hVTktfUkVTRVJWQVRJT05TSVpF
ICg5NioxMDI0KjEwMjQpCisjZWxzZQorLy8gSFcgaGFzIHBsZW50eSBvZiB2aXJ0dWFsIGFkZHJl
c3NlcworI2RlZmluZSBKU0NWTURBVEFDSFVOS19SRVNFUlZBVElPTlNJWkUgKDI1NioxMDI0KjEw
MjQpCisjZW5kaWYKKyNlbmRpZgorCituYW1lc3BhY2UgV1RGIHsgCisKKy8vIENvbnZlbmllbmNl
IHdyYXBwZXIgYXJvdW5kIGFuIFJDaHVuaworY2xhc3MgQ2h1bmtXaXRoTWV0YWRhdGEgOiBwdWJs
aWMgUkNodW5rIHsKKyAgIAorcHVibGljOiAgIAorICAgIENodW5rV2l0aE1ldGFkYXRhKFRJbnQg
aGFuZGxlLCBib29sIGlzQ29kZSkgCisgICAgeworICAgICAgICBTZXRIYW5kbGUoaGFuZGxlKTsK
KyAgICAgICAgLy8gcHJldmVudCBrZXJuZWwgY2FsbHMgYnkgY2FjaGluZyB0aGVzZQorICAgICAg
ICBtX2Jhc2UgPSBCYXNlKCk7IAorICAgICAgICBtX21heFNpemUgPSBNYXhTaXplKCk7CisgICAg
ICAgIG1faXNDb2RlID0gaXNDb2RlOyAKKyAgICB9CisgICAgCisgICAgfkNodW5rV2l0aE1ldGFk
YXRhKCkgeyBkZXN0cm95KCk7IH0KKyAgICAgCisgICAgLy8gY2hlY2tzIGlmIGFkZHJlc3MgaXMg
aW4gY2h1bmsncyB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UKKyAgICBib29sIG93bnNBZGRyZXNzKGNv
bnN0IHZvaWQqIGFkZHJlc3MpIGNvbnN0IAorICAgIHsKKyAgICAgICAgcmV0dXJuIChzdGF0aWNf
Y2FzdDxjb25zdCBUVWludDgqPihhZGRyZXNzKSA+PSBtX2Jhc2UgJiYgc3RhdGljX2Nhc3Q8Y29u
c3QgVFVpbnQ4Kj4oYWRkcmVzcykgPCAobV9iYXNlICsgbV9tYXhTaXplKSk7ICAKKyAgICB9Cisg
ICAgCisgICAgVFVpbnQ4KiBtX2Jhc2U7IAorICAgIFRJbnQgbV9tYXhTaXplOyAKKyAgICBib29s
IG1faXNDb2RlOworICAgIAorcHJpdmF0ZTogICAgCisgICAgLy8gZGlzcG9zZSBvZmYgdW5kZXJs
eWluZyBjaHVuaworICAgIHZvaWQgZGVzdHJveSgpIAorICAgIHsKKyAgICAgICAgRGVjb21taXQo
MCwgbV9tYXhTaXplKTsKKyAgICAgICAgQ2xvc2UoKTsKKyAgICB9CisKK307CisKKy8vIEhlbHBz
IG1hcCBPU0FsbG9jYXRvciBjYWxscyBmb3IgcmVzZXJ2ZS9jb21taXQvZGVjb21taXQgdG8gYSBz
aW5nbGUgbGFyZ2UgU3ltYmlhbiBjaHVuaworY2xhc3MgUGFnZVNpemVkQWxsb2NhdG9yU3ltYmlh
biB7CisgICAgCitwdWJsaWM6ICAgICAKKyAgICBQYWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFuKHNp
emVfdCBtYXhSZXNlcnZhdGlvblNpemUpOworICAgIH5QYWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFu
KCk7CisgICAgCisgICAgdm9pZCAqcGFya05leHRBdmFpbGFibGVCbG9jayhzaXplX3QgYnl0ZXMp
OworICAgIHZvaWQgdW5wYXJrKHZvaWQqIGFkZHJlc3MsIHNpemVfdCBieXRlcyk7CisgICAgYm9v
bCBjb21taXQodm9pZCAqYWRkcmVzcywgc2l6ZV90IGJ5dGVzKTsKKyAgICBib29sIGRlY29tbWl0
KHZvaWQgKmFkZHJlc3MsIHNpemVfdCBieXRlcyk7CisgICAgCisgICAgYm9vbCBvd25zQWRkcmVz
cyhjb25zdCB2b2lkKiBhZGRyZXNzKSBjb25zdDsgCisgICAgCitwcml2YXRlOiAgICAgCisgICAg
VEludCBtX3BhZ2VTaXplOyAKKyAgICBDaHVua1dpdGhNZXRhZGF0YSogbV9jaHVua1dpdGhNZXRh
OyAKKyAgICAKKyAgICBzdHJ1Y3QgeworICAgICAgICBUVWludDMyICpiaXRzOyAvLyBhcnJheSBv
ZiBiaXQgZmxhZ3MgCisgICAgICAgIFRVaW50MzIgbnVtQml0czsgLy8gbnVtYmVyIG9mIHJlZ2lv
bnMgdG8ga2VlcCB0cmFjayBvZgorCisgICAgICAgIGJvb2wgZ2V0KFRVaW50MzIgbikgY29uc3Qg
CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhIShiaXRzW24gPj4gNV0gJiAoMSA8PCAo
biAmIDB4MUYpKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldChUVWludDMyIG4pIAor
ICAgICAgICB7CisgICAgICAgICAgICBiaXRzW24gPj4gNV0gfD0gKDEgPDwgKG4gJiAweDFGKSk7
CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldChUVWludDMyIG4sIFRVaW50MzIgY291bnQp
IAorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKFRVaW50IGkgPSBuOyBpIDwgbiArIGNvdW50
IDsgaSsrKQorICAgICAgICAgICAgICAgIHNldChpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAg
ICAgICAgdm9pZCBjbGVhcihUVWludDMyIG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJpdHNb
biA+PiA1XSAmPSB+KDEgPDwgKG4gJiAweDFGKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lk
IGNsZWFyKFRVaW50MzIgbiwgVFVpbnQzMiBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAg
Zm9yIChUVWludDMyIGkgPSBuOyBpIDwgbiArIGNvdW50IDsgaSsrKQorICAgICAgICAgICAgICAg
IGNsZWFyKGkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lkIGNsZWFyQWxsKCkK
KyAgICAgICAgeworICAgICAgICAgICAgZm9yIChUVWludDMyIGkgPSAwOyBpIDwgbnVtQml0czsg
aSsrKQorICAgICAgICAgICAgICAgIGNsZWFyKGkpOworICAgICAgICB9CisKKyAgICAgICAgVElu
dCBmaW5kRnJlZUNvbnNlY3V0aXZlUGFnZXMoVFVpbnQzMiBydW5MZW5ndGgpIGNvbnN0CisgICAg
ICAgIHsKKyAgICAgICAgICAgIC8vIEV4YW1wbGU6IGlmIG51bUJpdHMgPSA4IGFuZCB3ZSB3YW50
IHRvIGxvY2F0ZSB0aGUgZmlyc3QKKyAgICAgICAgICAgIC8vIHJ1biBvZiBydW5MZW5ndGggPSAy
IG51bWJlciBvZiB6ZXJvZXMgaW4gdGhlIG1hcCBbMSAxIDAgMSAxIDAgMCAxXSwgCisgICAgICAg
ICAgICAvLyB0aGVuIHRoZSBkZXNpcmVkIHNvbHV0aW9uIGlzIGluZGV4ID0gNQorICAgICAgICAg
ICAgZm9yIChUVWludDMyIGkgPSAwOyBpIDw9IChudW1CaXRzIC0gcnVuTGVuZ3RoKSA7IGkrKykg
eworICAgICAgICAgICAgICAgIGJvb2wgZm91bmQodHJ1ZSk7CisgICAgICAgICAgICAgICAgZm9y
IChUVWludDMyIGogPSBpOyBqIDw9IChpICsgcnVuTGVuZ3RoIC0gMSkgOyBqKyspIHsgCisgICAg
ICAgICAgICAgICAgICAgIGlmIChnZXQoaikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZv
dW5kID0gZmFsc2U7IAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZvdW5k
KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsgLy8gdGhlIGZpcnN0IGluZGV4IGZvciB0
aGUgYmxvY2sgb2YgemVyb2VzCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7
CisgICAgICAgIH0KKworICAgIH0gbV9tYXA7CisgICAgCit9OworCit9IC8vIG5hbWVzcGFjZSBX
VEYKKworI2VuZGlmIC8vIFBhZ2VTaXplZEFsbG9jYXRvclN5bWJpYW5faAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvd3RmL3d0Zi5wcmkKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL3d0Zi93dGYucHJpCShyZXZpc2lvbiA3NjY5OSkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS93dGYvd3RmLnByaQkod29ya2luZyBjb3B5KQpAQCAtNDksMyArNDksOSBAQCBjb250
YWlucyhERUZJTkVTLCBVU0VfR1NUUkVBTUVSPTEpIHsKIHVuaXg6IXN5bWJpYW46IFNPVVJDRVMg
Kz0gd3RmL09TQWxsb2NhdG9yUG9zaXguY3BwCiBzeW1iaWFuOiBTT1VSQ0VTICs9IHd0Zi9PU0Fs
bG9jYXRvclN5bWJpYW4uY3BwCiB3aW4qfHdpbmNlKjogU09VUkNFUyArPSB3dGYvT1NBbGxvY2F0
b3JXaW4uY3BwCisKK3N5bWJpYW46IHsKKyAgICBMSUJTICs9IC1saGFsCisgICAgIyBGb3IgaGFs
LmgKKyAgICBJTkNMVURFUEFUSCAqPSAkJE1XX0xBWUVSX1NZU1RFTUlOQ0xVREUKK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>80213</attachid>
            <date>2011-01-26 11:49:44 -0800</date>
            <delta_ts>2011-02-11 14:17:51 -0800</delta_ts>
            <desc>New algo take 2</desc>
            <filename>51128_algo2_v2.patch</filename>
            <type>text/plain</type>
            <size>18804</size>
            <attacher name="Siddharth Mathur">s.mathur</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNzY3MDEpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDAgQEAK
KzIwMTEtMDEtMjYgIFNpZGRoYXJ0aCBNYXRodXIgIDxzaWRkaGFydGgubWF0aHVyQG5va2lhLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbU3lt
Ymlhbl0gT1NBbGxvY2F0b3IgaW1wbGVtZW50YXRpb24KKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUxMTI4CisKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29y
ZS5wcmk6IG1vdmUgb3V0IEhBTCBsaW5rYWdlIGJsb2NrIHRvIHd0Zi5wcmkKKyAgICAgICAgCisg
ICAgICAgICogd3RmL09TQWxsb2NhdG9yLmg6CisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpk
ZWNvbW1pdEFuZFJlbGVhc2UpOiBhZGQgZXhwbGljaXQgZGVjb21taXQgbGlrZSBXaW5DRQorICAg
ICAgICAKKyAgICAgICAgKiB3dGYvT1NBbGxvY2F0b3JTeW1iaWFuLmNwcDogCisgICAgICAgIChX
VEY6Om1ha2VOZXdDb2RlQ2h1bmspOiBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uIGZvciBjb2RlIChK
SVQpIHJlZ2lvbnMKKyAgICAgICAgKFdURjo6ZnJlZUV4aXN0aW5nQ29kZUNodW5rKTogc3RhdGlj
IGhlbHBlciBmdW5jdGlvbiBmb3IgY29kZSAoSklUKSByZWdpb25zCisgICAgICAgIChXVEY6OmRh
dGFBbGxvY2F0b3JJbnN0YW5jZSk6IHN0YXRpYyBoZWxwZXIgZnVuY3Rpb24gdG8gZmV0Y2ggZGF0
YSBhbGxvY2F0b3IKKyAgICAgICAgKFdURjo6T1NBbGxvY2F0b3I6OnJlc2VydmVVbmNvbW1pdHRl
ZCk6IGltcGxlbWVudGF0aW9uIG9mIE9TQWxsb2NhdG9yIGludGVyZmFjZQorICAgICAgICAoV1RG
OjpPU0FsbG9jYXRvcjo6cmVsZWFzZURlY29tbWl0dGVkKTogZGl0dG8KKyAgICAgICAgKFdURjo6
T1NBbGxvY2F0b3I6OmNvbW1pdCk6IGRpdHRvCisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpk
ZWNvbW1pdCk6IGRpdHRvCisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpyZXNlcnZlQW5kQ29t
bWl0KTogZGl0dG8KKyAgICAgICAgKFdURjo6UGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbjo6UGFn
ZVNpemVkQWxsb2NhdG9yU3ltYmlhbik6IEFsbG9jYXRvciB0byByZXNlcnZlL2NvbW1pdC9yZWxl
YXNlIHBhZ2Utc2l6ZWQgdW5pdHMKKyAgICAgICAgKFdURjo6UGFnZVNpemVkQWxsb2NhdG9yU3lt
Ymlhbjo6flBhZ2VTaXplZEFsbG9jYXRvclN5bWJpYW4pOgorICAgICAgICAoV1RGOjpQYWdlU2l6
ZWRBbGxvY2F0b3JTeW1iaWFuOjpwYXJrTmV4dEF2YWlsYWJsZUJsb2NrKToKKyAgICAgICAgKFdU
Rjo6UGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbjo6dW5wYXJrKToKKyAgICAgICAgKFdURjo6UGFn
ZVNpemVkQWxsb2NhdG9yU3ltYmlhbjo6Y29tbWl0KToKKyAgICAgICAgKFdURjo6UGFnZVNpemVk
QWxsb2NhdG9yU3ltYmlhbjo6ZGVjb21taXQpOgorICAgICAgICAoV1RGOjpQYWdlU2l6ZWRBbGxv
Y2F0b3JTeW1iaWFuOjpvd25zQWRkcmVzcyk6CisgICAgICAgIAorICAgICAgICAqIHd0Zi9QYWdl
U2l6ZWRBbGxvY2F0b3JTeW1iaWFuLmg6IEFkZGVkLiBJbnRlcmZhY2VzCisgICAgICAgIChXVEY6
OkNodW5rV2l0aE1ldGFkYXRhOjpDaHVua1dpdGhNZXRhZGF0YSk6IFRoaW4gd3JhcHBlciBhcm91
bmQgU3ltYmlhbiBSQ2h1bmsKKyAgICAgICAgKFdURjo6Q2h1bmtXaXRoTWV0YWRhdGE6On5DaHVu
a1dpdGhNZXRhZGF0YSk6CisgICAgICAgIChXVEY6OkNodW5rV2l0aE1ldGFkYXRhOjpvd25zQWRk
cmVzcyk6CisgICAgICAgIChXVEY6OkNodW5rV2l0aE1ldGFkYXRhOjpkZXN0cm95KToKKyAgICAg
ICAgCisgICAgICAgICogd3RmL3d0Zi5wcmk6IE5ldyBob21lIGZvciB0aGUgSEFMIGxpbmthZ2Ug
YmxvY2sKKwogMjAxMS0wMS0yNiAgUGF0cmljayBHYW5zdGVyZXIgIDxwYXJvZ2FAd2Via2l0Lm9y
Zz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBbmRyZWFzIEtsaW5nLgpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnByaQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJpCShyZXZpc2lvbiA3NjcwMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcmkJKHdvcmtpbmcgY29weSkKQEAgLTQ4
LDEyICs0OCw2IEBAIHN5bWJpYW4gewogICAgIElOQ0xVREVQQVRIID0gJCRKQVZBU0NSSVBUQ09S
RV9JTkNMVURFUEFUSCAkJElOQ0xVREVQQVRICiB9CiAKLXN5bWJpYW46IHsKLSAgICBMSUJTICs9
IC1saGFsCi0gICAgIyBGb3IgaGFsLmgKLSAgICBJTkNMVURFUEFUSCAqPSAkJE1XX0xBWUVSX1NZ
U1RFTUlOQ0xVREUKLX0KLQogd2luMzItKjogREVGSU5FUyArPSBfSEFTX1RSMT0wCiAKIERFRklO
RVMgKz0gQlVJTERJTkdfSmF2YVNjcmlwdENvcmUgQlVJTERJTkdfV1RGCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvd3RmL09TQWxsb2NhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL3d0Zi9PU0FsbG9jYXRvci5oCShyZXZpc2lvbiA3NjcwMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtNzcs
OSArNzcsOCBAQCBpbmxpbmUgdm9pZCogT1NBbGxvY2F0b3I6OnJlc2VydmVBbmRDb21tCiBpbmxp
bmUgdm9pZCBPU0FsbG9jYXRvcjo6ZGVjb21taXRBbmRSZWxlYXNlKHZvaWQqIHJlbGVhc2VCYXNl
LCBzaXplX3QgcmVsZWFzZVNpemUsIHZvaWQqIGRlY29tbWl0QmFzZSwgc2l6ZV90IGRlY29tbWl0
U2l6ZSkKIHsKICAgICBBU1NFUlQoZGVjb21taXRCYXNlID49IHJlbGVhc2VCYXNlICYmIChzdGF0
aWNfY2FzdDxjaGFyKj4oZGVjb21taXRCYXNlKSArIGRlY29tbWl0U2l6ZSkgPD0gKHN0YXRpY19j
YXN0PGNoYXIqPihyZWxlYXNlQmFzZSkgKyByZWxlYXNlU2l6ZSkpOwotI2lmIE9TKFdJTkNFKQot
ICAgIC8vIE9uIG1vc3QgcGxhdGZvcm1zIHdlIGNhbiBhY3R1YWxseSBza2lwIHRoaXMgZmluYWwg
ZGVjb21taXQ7IHJlbGVhc2luZyB0aGUgVk0gd2lsbAotICAgIC8vIGltcGxpY2l0bHkgZGVjb21t
aXQgYW55IHBoeXNpY2FsIG1lbW9yeSBpbiB0aGUgcmVnaW9uLiBUaGlzIGlzIG5vdCB0cnVlIG9u
IFdJTkNFLgorI2lmIE9TKFdJTkNFKSB8fCBPUyhTWU1CSUFOKQorICAgIC8vIFRoZXNlIE9TZXMg
cHJlZmVyIGFuIGV4cGxpY2l0IGRlY29tbWl0IGJlZm9yZSBhIHJlbGVhc2UKICAgICBkZWNvbW1p
dChkZWNvbW1pdEJhc2UsIGRlY29tbWl0U2l6ZSk7CiAjZWxzZQogICAgIFVOVVNFRF9QQVJBTShk
ZWNvbW1pdEJhc2UpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9PU0FsbG9jYXRv
clN5bWJpYW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvT1NB
bGxvY2F0b3JTeW1iaWFuLmNwcAkocmV2aXNpb24gNzY3MDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd3RmL09TQWxsb2NhdG9yU3ltYmlhbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSAr
MSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3Ig
aXRzIHN1YnNpZGlhcnkoLWllcykuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKQEAgLTI2LDMxICsyNiwyMDQgQEAKICNpbmNsdWRlICJjb25maWcu
aCIKICNpbmNsdWRlICJPU0FsbG9jYXRvci5oIgogCi0jaW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2Mu
aD4KKyNpbmNsdWRlICJQYWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFuLmgiCiAKIG5hbWVzcGFjZSBX
VEYgewogCi12b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZVVuY29tbWl0dGVkKHNpemVfdCBieXRl
cywgVXNhZ2UsIGJvb2wsIGJvb2wpCisvLyBBcnJheSB0byBzdG9yZSBjb2RlIGNodW5rcyB1c2Vk
IGJ5IEpJVCBlbmdpbmUocykKK3N0YXRpYyBSUG9pbnRlckFycmF5PENodW5rV2l0aE1ldGFkYXRh
PiBjb2RlQ2h1bmtzQ29udGFpbmVyOworCisvLyBQb2ludGVyIHRvIHRoZSBkYXRhIChub24gY29k
ZSkgYWxsb2NhdG9yCitzdGF0aWMgUGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbiogYWxsb2NhdG9y
ID0gMDsgCisKKy8vIExhcmdlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSB0byBiZSByZXNlcnZlZCB1
cGZyb250CitzdGF0aWMgY29uc3Qgc2l6ZV90IHJlc2VydmF0aW9uU2l6ZURhdGFDaHVuayA9IEpT
Q1ZNREFUQUNIVU5LX1JFU0VSVkFUSU9OU0laRTsgCisKKworLy8gTWFrZXMgYSBuZXcgY29kZSBj
aHVuayBmb3IgYSBKSVQgZW5naW5lIHdpdGggZXZlcnl0aGluZyBpbiBjb21taXR0ZWQgc3RhdGUK
K3N0YXRpYyB2b2lkKiBtYWtlTmV3Q29kZUNodW5rKHNpemVfdCBieXRlcykgCit7CisgICAgUkNo
dW5rIGM7IAorICAgIFRJbnQgZXJyb3IgPSBjLkNyZWF0ZUxvY2FsQ29kZShieXRlcywgYnl0ZXMp
OworICAgIF9fQVNTRVJUX0FMV0FZUyhlcnJvciA9PSBLRXJyTm9uZSwgVXNlcjo6UGFuaWMoX0wo
Ik9TQWxsb2NhdG9yMSIpLCBlcnJvcikpOworICAgCisgICAgLy8gYXBwZW5kIHRvIGFycmF5IGFu
ZCByZXR1cm4gYmFzZSBhZGRyZXNzCisgICAgY29kZUNodW5rc0NvbnRhaW5lci5BcHBlbmQobmV3
IENodW5rV2l0aE1ldGFkYXRhKGMuSGFuZGxlKCksIHRydWUpKTsgCisgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PHZvaWQqPihjLkJhc2UoKSk7IAorfQorICAgCisvLyBGcmVlcyB0aGUgX2VudGlyZV8g
Y29kZSBjaHVuayBpbiB3aGljaCB0aGlzIGFkZHJlc3MgcmVzaWRlcy4gCitzdGF0aWMgYm9vbCBm
cmVlRXhpc3RpbmdDb2RlQ2h1bmsodm9pZCAqYWRkcmVzcykgCit7ICAgICAKKyAgICBib29sIGZv
dW5kID0gZmFsc2U7IAorICAgIGZvciAoVEludCBpID0gMDsgaSA8IGNvZGVDaHVua3NDb250YWlu
ZXIuQ291bnQoKTsgaSsrKSB7IAorICAgICAgICBDaHVua1dpdGhNZXRhZGF0YSogcCA9IGNvZGVD
aHVua3NDb250YWluZXJbaV07CisgICAgICAgIGlmIChwICYmIHAtPm93bnNBZGRyZXNzKGFkZHJl
c3MpKSB7IAorICAgICAgICAgICAgY29kZUNodW5rc0NvbnRhaW5lci5SZW1vdmUoaSk7CisgICAg
ICAgICAgICBkZWxldGUgcDsgLy8gdW5kZXJseWluZyBjaHVuayBpcyBjbG9zZWQgaGVyZQorICAg
ICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmb3Vu
ZDsgCit9CisKKy8vIFJldHVybiB0aGUgKHNpbmdsZXRvbikgb2JqZWN0IHRoYXQgbWFuYWdlcyBh
bGwgbm9uLWNvZGUgVk0gb3BlcmF0aW9ucworc3RhdGljIFBhZ2VTaXplZEFsbG9jYXRvclN5bWJp
YW4qIGRhdGFBbGxvY2F0b3JJbnN0YW5jZSgpIAoreworICAgIGlmICghYWxsb2NhdG9yKSAKKyAg
ICAgICAgYWxsb2NhdG9yID0gbmV3IFBhZ2VTaXplZEFsbG9jYXRvclN5bWJpYW4ocmVzZXJ2YXRp
b25TaXplRGF0YUNodW5rKTsKKworICAgIHJldHVybiBhbGxvY2F0b3I7IAorfQorCisKKy8vIFJl
c2VydmUgbWVtb3J5IGFuZCByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCit2
b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZVVuY29tbWl0dGVkKHNpemVfdCByZXNlcnZhdGlvblNp
emUsIFVzYWdlIHVzYWdlLCBib29sICwgYm9vbCBleGVjdXRhYmxlKSAKK3sKKyAgICB2b2lkKiBi
YXNlID0gMDsgCisgICAgaWYgKGV4ZWN1dGFibGUpIAorICAgICAgICBiYXNlID0gbWFrZU5ld0Nv
ZGVDaHVuayhyZXNlcnZhdGlvblNpemUpOworICAgIGVsc2UKKyAgICAgICAgYmFzZSA9IGRhdGFB
bGxvY2F0b3JJbnN0YW5jZSgpLT5wYXJrTmV4dEF2YWlsYWJsZUJsb2NrKHJlc2VydmF0aW9uU2l6
ZSk7CisgICAgcmV0dXJuIGJhc2U7IAorfQorCisvLyBUaGlzIGlzIHRoZSBpbnZlcnNlIG9wZXJh
dGlvbiBvZiByZXNlcnZlVW5jb21taXR0ZWQoKQordm9pZCBPU0FsbG9jYXRvcjo6cmVsZWFzZURl
Y29tbWl0dGVkKHZvaWQqIHBhcmtlZEJhc2UsIHNpemVfdCBieXRlcykgCiB7Ci0gICAgcmV0dXJu
IGZhc3RNYWxsb2MoYnl0ZXMpOworICAgIC8vIEZyZWUgYml0cyBpbiBvdXIgYml0bWFwIHdoaWNo
IHJlcHJlc2VudCAicGFya2VkIiBiaXRzCisgICAgaWYgKGRhdGFBbGxvY2F0b3JJbnN0YW5jZSgp
LT5vd25zQWRkcmVzcyhwYXJrZWRCYXNlKSkgCisgICAgICAgIGRhdGFBbGxvY2F0b3JJbnN0YW5j
ZSgpLT51bnBhcmsocGFya2VkQmFzZSwgYnl0ZXMpOworCisgICAgLy8gTk9PUCBmb3IgY29kZSBj
aHVua3MgKEpJVCkgYmVjYXVzZSB3ZSByZWxlYXNlZCB0aGVtIGluIGRlY29tbWl0KCkKK30KKwor
Ly8gQ29tbWl0IHdoYXQgd2FzIHByZXZpb3VzbHkgcmVzZXJ2ZWQgdmlhIHJlc2VydmVVbmNvbW1p
dHRlZCgpCit2b2lkIE9TQWxsb2NhdG9yOjpjb21taXQodm9pZCogYWRkcmVzcywgc2l6ZV90IGJ5
dGVzLCBib29sLCBib29sIGV4ZWN1dGFibGUpIAoreworICAgIC8vIEZvciBjb2RlIGNodW5rcywg
d2UgY29tbWl0IChlYXJseSkgaW4gcmVzZXJ2ZVVuY29tbWl0dGVkKCksIHNvIE5PT1AKKyAgICAv
LyBGb3IgZGF0YSByZWdpb25zLCBkbyByZWFsIHdvcmsKKyAgICBpZiAoIWV4ZWN1dGFibGUpIAor
ICAgICAgICBkYXRhQWxsb2NhdG9ySW5zdGFuY2UoKS0+Y29tbWl0KGFkZHJlc3MsIGJ5dGVzKTsK
K30KKwordm9pZCBPU0FsbG9jYXRvcjo6ZGVjb21taXQodm9pZCogYWRkcmVzcywgc2l6ZV90IGJ5
dGVzKSAKK3sgCisgICAgaWYgKGRhdGFBbGxvY2F0b3JJbnN0YW5jZSgpLT5vd25zQWRkcmVzcyhh
ZGRyZXNzKSkKKyAgICAgICAgZGF0YUFsbG9jYXRvckluc3RhbmNlKCktPmRlY29tbWl0KGFkZHJl
c3MsIGJ5dGVzKTsKKyAgICBlbHNlCisgICAgICAgIGZyZWVFeGlzdGluZ0NvZGVDaHVuayhhZGRy
ZXNzKTsgLy8gZm9yIGNvZGUgY2h1bmssIGRlY29tbWl0IEFORCByZWxlYXNlICAgIAorfQorICAg
IAordm9pZCogT1NBbGxvY2F0b3I6OnJlc2VydmVBbmRDb21taXQoc2l6ZV90IGJ5dGVzLCBVc2Fn
ZSB1c2FnZSwgYm9vbCB3cml0YWJsZSwgYm9vbCBleGVjdXRhYmxlKQoreyAKKyAgICB2b2lkKiBi
YXNlID0gcmVzZXJ2ZVVuY29tbWl0dGVkKGJ5dGVzLCB1c2FnZSwgd3JpdGFibGUsIGV4ZWN1dGFi
bGUpOworICAgIGNvbW1pdChiYXNlLCBieXRlcywgd3JpdGFibGUsIGV4ZWN1dGFibGUpOworICAg
IHJldHVybiBiYXNlOworfQorCisKKy8vIFRoZSBQYWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFuIGNs
YXNzIGhlbHBzIG1hcCBPU0FsbG9jYXRvciBjYWxscyBmb3IgcmVzZXJ2ZS9jb21taXQvZGVjb21t
aXQKKy8vIHRvIGEgc2luZ2xlIGxhcmdlIFN5bWJpYW4gY2h1bmsuIE9ubHkgd29ya3Mgd2l0aCBt
dWx0aXBsZXMgb2YgcGFnZSBzaXplLCBhbmQgYXMgYSBjb3JvbGxhcnkgCisvLyBhbGwgYWRkcmVz
c2VzIGFjY2VwdGVkIG9yIHJldHVybmVkIGJ5IGl0IGFyZSBhbHNvIHBhZ2Utc2l6ZWQgYWxpZ25l
ZC4gCisvLyBEZXNpZ24gbm90ZXM6IAorLy8gLSBXZSBpbml0aWFsaXplIGEgY2h1bmsgdXAtZnJv
bnQgd2l0aCBhIGxhcmdlIHJlc2VydmF0aW9uIHNpemUKKy8vIC0gVGhlIGVudGlyZSByZXNlcnZh
dGlvbiByZXNlcnZlIGlzIGxvZ2ljYWxseSBkaXZpZGVkIGludG8gcGFnZVNpemVkIGJsb2NrcyAo
NEsgb24gU3ltYmlhbikgCisvLyAtIFRoZSBtYXAgbV9tYXAgbWFpbnRhaW5zIDEgYml0IGZvciBl
YWNoIG9mIHRoZSA0Sy1zaXplZCByZWdpb24gaW4gb3VyIGFkZHJlc3Mgc3BhY2UKKy8vIC0gT1NB
bGxvY2F0b3I6OnJlc2VydmVVbmNvbW1pdHRlZCgpIHJlcXVlc3RzIGxlYWQgdG8gMSBvciBtb3Jl
IGJpdHMgYmVpbmcgc2V0IGluIG1fbWFwIAorLy8gICB0byBpbmRpY2F0ZSAicGFya2VkIiBzdGF0
ZS4gVGhlIFZNIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgYml0IGlzIHJldHVy
bmVkLiAKKy8vIC0gT1NBbGxvY2F0b3I6OmNvbW1pdCgpIGFjdHVhbGx5IGNhbGxzIFJDaHVuay5j
b21taXQoKSBhbmQgY29tbWl0cyAqYWxsIG9yIHBhcnQqIG9mIHRoZSByZWdpb24gCisvLyAgIHJl
c2VydmVkIHZpYSByZXNlcnZlVW5jb21taXR0ZWQoKSBwcmV2aW91c2x5LiAKKy8vIC0gT1NBbGxv
Y2F0b3I6OmRlY29tbWl0KCkgY2FsbHMgUkNodW5rLmRlY29tbWl0KCkgYW5kIHVuc2V0cyB0aGUg
Yml0IGl0IGNhbiBjYWxjdWxhdGUgZnJvbSBpdHMgYXJncworLy8gLSBPU0FsbG9jYXRvcjo6cmVs
ZWFzZURlY29tbWl0dGVkKCkgdW5wYXJrcyBhbGwgdGhlIGJpdHMgaW4gbV9tYXAsIGJ1dCB0cnVz
dHMgdGhhdCBhIHByZXZpb3VzbHkKKy8vICAgY2FsbCB0byBkZWNvbW1pdCgpIHdvdWxkIGhhdmUg
cmV0dXJuZWQgdGhlIG1lbW9yeSB0byB0aGUgT1MgCitQYWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFu
OjpQYWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFuKHNpemVfdCBsYXJnZVJlc2VydmF0aW9uU2l6ZSkK
K3sgICAgICAgCisgICAgLy8gSW5pdGlhbGl6ZSBjaHVuayAuLiAKKyAgICBSQ2h1bmsgYzsgCisg
ICAgVEludCBlcnJvciA9IGMuQ3JlYXRlRGlzY29ubmVjdGVkTG9jYWwoMCwgMCwgbGFyZ2VSZXNl
cnZhdGlvblNpemUpOworICAgIF9fQVNTRVJUX0FMV0FZUyhlcnJvciA9PSBLRXJyTm9uZSwgVXNl
cjo6UGFuaWMoX0woIk9TQWxsb2NhdG9yMSIpLCBlcnJvcikpOworICAgIC8vIC4uIGFuZCB0aGUg
Y29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgaXQKKyAgICBtX2NodW5rV2l0aE1ldGEgPSBuZXcg
Q2h1bmtXaXRoTWV0YWRhdGEoYy5IYW5kbGUoKSwgZmFsc2UpOworICAgIAorICAgIC8vIEdldCBz
eXN0ZW0ncyBwYWdlIHNpemUuCisgICAgSEFMOjpHZXQoSEFMRGF0YTo6RU1lbW9yeVBhZ2VTaXpl
LCBtX3BhZ2VTaXplKTsKKworICAgIC8vIENhbGN1bGF0ZSBiaXQgZmxhZ3MgbmVlZGVkIHRvIGNh
cnZlIGEgbGFyZ2VSZXNlcnZhdGlvblNpemUgcmFuZ2UgaW50byBwYWdlU2l6ZS1zaXplZCBibG9j
a3MKKyAgICBtX21hcC5udW1CaXRzID0gYy5NYXhTaXplKCkgLyBtX3BhZ2VTaXplOyAgIAorICAg
IGNvbnN0IFRVaW50MzIgYml0c1BlcldvcmQgPSA4KnNpemVvZihUVWludDMyKTsgCisgICAgY29u
c3QgVFVpbnQzMiBudW1Xb3JkcyA9IChtX21hcC5udW1CaXRzICsgYml0c1BlcldvcmQgLTEpIC8g
Yml0c1BlcldvcmQ7IAorCisgICAgbV9tYXAuYml0cyA9IG5ldyBUVWludDMyW251bVdvcmRzXTsK
KyAgICBtX21hcC5jbGVhckFsbCgpOworCiB9CiAKLXZvaWQqIE9TQWxsb2NhdG9yOjpyZXNlcnZl
QW5kQ29tbWl0KHNpemVfdCBieXRlcywgVXNhZ2UsIGJvb2wsIGJvb2wpCitQYWdlU2l6ZWRBbGxv
Y2F0b3JTeW1iaWFuOjp+UGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbigpIAogewotICAgIHJldHVy
biBmYXN0TWFsbG9jKGJ5dGVzKTsKKyAgICBkZWxldGUgbV9jaHVua1dpdGhNZXRhOyAvLyBkZWNv
bW1pdHMgYW5kIGRlc3Ryb3lzIGNodW5rIHRvbyEKKyAgICBkZWxldGUgbV9tYXAuYml0czsgICAg
CiB9CiAKLXZvaWQgT1NBbGxvY2F0b3I6OmNvbW1pdCh2b2lkKiwgc2l6ZV90LCBib29sLCBib29s
KQorLy8gU2VhcmNoZXMgZm9yIHRoZSBuZXh0IGF2YWlsYWJsZSByZWdpb24gb2Ygc2l6ZSAnYnl0
ZXMnIAorLy8gYW5kICJwYXJrcyIgaXQgaW50ZXJuYWxseSBpbiB0aGUgYml0IG1hcCAKK3ZvaWQq
IFBhZ2VTaXplZEFsbG9jYXRvclN5bWJpYW46OnBhcmtOZXh0QXZhaWxhYmxlQmxvY2soc2l6ZV90
IGJ5dGVzKSAKK3sgCisgICAgLy8gTG9vayB1cCBmaXJzdCByZWdpb24gaW4gYml0IG1hcCBvZiBz
aXplIGJ5dGVzCisgICAgY29uc3Qgc2l6ZV90IG5QYWdlcyA9IGJ5dGVzIC8gbV9wYWdlU2l6ZTsK
KyAgICBjb25zdCBUSW50IHN0YXJ0SWR4ID0gbV9tYXAuZmluZEZyZWVDb25zZWN1dGl2ZVBhZ2Vz
KG5QYWdlcyk7CisKKyAgICAvLyBQc2V1ZG8gT09NOiBXZSBhdGUgdXAgdGhlIGFkZHJlc3Mgc3Bh
Y2Ugd2UgcmVzZXJ2ZWQuLgorICAgIC8vIC4uZXZlbiB0aG91Z2ggdGhlIGRldmljZSBtYXkgaGF2
ZSBmcmVlIFJBTSBsZWZ0CisgICAgaWYgKHN0YXJ0SWR4IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICAvLyBVcGRhdGVkIGJpdHMgdG8gbWFyayByZWdpb24gYXMgaW4gdXNlICgicGFya2Vk
Iiwgbm90IGNvbW1pdHRlZCBmcm9tIHRoZSBPUyBwb2ludCBvZiB2aWV3KSAuIAorICAgIG1fbWFw
LnNldChzdGFydElkeCwgblBhZ2VzKTsgCisgICAgCisgICAgLy8gQ2FsY3VsYXRlIHZpcnR1YWwg
YWRkcmVzcworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPiggbV9jaHVua1dpdGhN
ZXRhLT5tX2Jhc2UgKyAoVFVpbnQpKG1fcGFnZVNpemUgKiBzdGFydElkeCkgKTsgCit9CisKKy8v
IFJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIGEgcGFya05leHRBdmFpbGFibGVCbG9jaygpIGNhbGwK
K3ZvaWQgUGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbjo6dW5wYXJrKHZvaWQqIGFkZHJlc3MsIHNp
emVfdCBieXRlcykKIHsKKyAgICBjb25zdCBUSW50IGlkeCA9IFRVaW50KHJlaW50ZXJwcmV0X2Nh
c3Q8VFVpbnQ4Kj4oYWRkcmVzcykgLSBtX2NodW5rV2l0aE1ldGEtPm1fYmFzZSkgLyBtX3BhZ2VT
aXplOworICAgIGNvbnN0IHNpemVfdCBuUGFnZXMgPSBieXRlcyAvIG1fcGFnZVNpemU7CisgICAg
bV9tYXAuY2xlYXIoaWR4LCBuUGFnZXMpOworfQorCisvLyBBY3R1YWxseSBjb21taXQgbWVtb3J5
IGZyb20gdGhlIE9TLCBhZnRlciBhIHByZXZpb3VzIGNhbGwgdG8gcGFya05leHRBdmFpbGFibGVC
bG9jaygpCitib29sIFBhZ2VTaXplZEFsbG9jYXRvclN5bWJpYW46OmNvbW1pdCh2b2lkICphZGRy
ZXNzLCBzaXplX3QgYnl0ZXMpIAoreyAKKyAgICAvLyBDYWxjdWxhdGUgc3RhcnQgaW5kZXggYW5k
IG51bWJlciBvZiBiaXRzIGluIG1hcAorICAgIGNvbnN0IFRJbnQgaWR4ID0gVFVpbnQocmVpbnRl
cnByZXRfY2FzdDxUVWludDgqPihhZGRyZXNzKSAtIG1fY2h1bmtXaXRoTWV0YS0+bV9iYXNlKSAv
IG1fcGFnZVNpemU7CisgICAgY29uc3Qgc2l6ZV90IG5QYWdlcyA9IGJ5dGVzIC8gbV9wYWdlU2l6
ZTsKKyAgICAKKyAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgZmlyc3QgYW5kIGxhc3QgYml0cyBvZiB0
aGUgcmVnaW9uIHdlcmUgcHJldmlvdXNseSBzZXQgdmlhIHBhcmtOZXh0QXZhaWxhYmxlQmxvY2so
KQorICAgIF9fQVNTRVJUX0FMV0FZUyhtX21hcC5nZXQoaWR4KSwgVXNlcjo6UGFuaWMoX0woIk9T
QWxsb2NhdG9yMiIpLCBpZHgpKTsKKyAgICBfX0FTU0VSVF9BTFdBWVMobV9tYXAuZ2V0KGlkeCtu
UGFnZXMtMSksIFVzZXI6OlBhbmljKF9MKCJPU0FsbG9jYXRvcjMiKSwgaWR4K25QYWdlcy0xKSk7
CisgICAgCisgICAgLy8gQ2FsY3VsYXRlIG9mZnNldCBmcm9tIGNodW5rIGJhc2UgYW5kIGNvbW1p
dAorICAgIFRJbnQgcmV0ID0gbV9jaHVua1dpdGhNZXRhLT5Db21taXQocmVpbnRlcnByZXRfY2Fz
dDxUVWludDgqPihhZGRyZXNzKSAtIG1fY2h1bmtXaXRoTWV0YS0+bV9iYXNlLCBieXRlcyk7Cisg
ICAgcmV0dXJuIChyZXQgPT0gS0Vyck5vbmUpOwogfQogCi12b2lkIE9TQWxsb2NhdG9yOjpkZWNv
bW1pdCh2b2lkKiwgc2l6ZV90KQorYm9vbCBQYWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFuOjpkZWNv
bW1pdCh2b2lkICphZGRyZXNzLCBzaXplX3QgYnl0ZXMpIAogeworICAgIC8vIENhbGN1bGF0ZSBz
dGFydCBpbmRleCBhbmQgbnVtYmVyIG9mIGJpdHMgaW4gbWFwIGFuZCBjbGVhciAKKyAgICBjb25z
dCBUSW50IGlkeCA9IFRVaW50KHJlaW50ZXJwcmV0X2Nhc3Q8VFVpbnQ4Kj4oYWRkcmVzcykgLSBt
X2NodW5rV2l0aE1ldGEtPm1fYmFzZSkgLyBtX3BhZ2VTaXplOworICAgIGNvbnN0IFRVaW50MzIg
blBhZ2VzID0gYnl0ZXMgLyBtX3BhZ2VTaXplOworICAgIG1fbWFwLmNsZWFyKGlkeCwgblBhZ2Vz
KTsKKyAgICAKKyAgICAvLyBDYWxjdWxhdGUgb2Zmc2V0IGZyb20gY2h1bmsgYmFzZSBhbmQgZGVj
b21taXQKKyAgICBUSW50IHJldCA9IG1fY2h1bmtXaXRoTWV0YS0+RGVjb21taXQocmVpbnRlcnBy
ZXRfY2FzdDxUVWludDgqPihhZGRyZXNzKSAtIG1fY2h1bmtXaXRoTWV0YS0+bV9iYXNlLCBieXRl
cyk7CisgICAgcmV0dXJuIChyZXQgPT0gS0Vyck5vbmUpOyAKIH0KIAotdm9pZCBPU0FsbG9jYXRv
cjo6cmVsZWFzZURlY29tbWl0dGVkKHZvaWQqIGFkZHJlc3MsIHNpemVfdCkKK2Jvb2wgUGFnZVNp
emVkQWxsb2NhdG9yU3ltYmlhbjo6b3duc0FkZHJlc3MoY29uc3Qgdm9pZCogYWRkcmVzcykgY29u
c3QKIHsKLSAgICBmYXN0RnJlZShhZGRyZXNzKTsKKyAgICByZXR1cm4gbV9jaHVua1dpdGhNZXRh
LT5vd25zQWRkcmVzcyhhZGRyZXNzKTsgICAgIAogfQogCiB9IC8vIG5hbWVzcGFjZSBXVEYKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvUGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbi5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvUGFnZVNpemVkQWxsb2Nh
dG9yU3ltYmlhbi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9Q
YWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFuLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTYzIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMg
c3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUg
bmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgor
ICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisg
KiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUGFnZVNpemVkQWxsb2NhdG9yU3ltYmlhbl9oCisj
ZGVmaW5lIFBhZ2VTaXplZEFsbG9jYXRvclN5bWJpYW5faAorCisjaW5jbHVkZSA8ZTMyc3RkLmg+
CisjaW5jbHVkZSA8aGFsLmg+CisKKyNpZm5kZWYgSlNDVk1EQVRBQ0hVTktfUkVTRVJWQVRJT05T
SVpFCisjaWYgZGVmaW5lZChfX1dJTlNfXykgCisvLyBFbXVsYXRvciBoYXMgbGltaXRlZCB2aXJ0
dWFsIGFkZHJlc3Mgc3BhY2UKKyNkZWZpbmUgSlNDVk1EQVRBQ0hVTktfUkVTRVJWQVRJT05TSVpF
ICg5NioxMDI0KjEwMjQpCisjZWxzZQorLy8gSFcgaGFzIHBsZW50eSBvZiB2aXJ0dWFsIGFkZHJl
c3NlcworI2RlZmluZSBKU0NWTURBVEFDSFVOS19SRVNFUlZBVElPTlNJWkUgKDI1NioxMDI0KjEw
MjQpCisjZW5kaWYKKyNlbmRpZgorCituYW1lc3BhY2UgV1RGIHsgCisKKy8vIENvbnZlbmllbmNl
IHdyYXBwZXIgYXJvdW5kIGFuIFJDaHVuaworY2xhc3MgQ2h1bmtXaXRoTWV0YWRhdGEgOiBwdWJs
aWMgUkNodW5rIHsKKyAgIAorcHVibGljOiAgIAorICAgIENodW5rV2l0aE1ldGFkYXRhKFRJbnQg
aGFuZGxlLCBib29sIGlzQ29kZSkgCisgICAgeworICAgICAgICBTZXRIYW5kbGUoaGFuZGxlKTsK
KyAgICAgICAgLy8gcHJldmVudCBrZXJuZWwgY2FsbHMgYnkgY2FjaGluZyB0aGVzZQorICAgICAg
ICBtX2Jhc2UgPSBCYXNlKCk7IAorICAgICAgICBtX21heFNpemUgPSBNYXhTaXplKCk7CisgICAg
ICAgIG1faXNDb2RlID0gaXNDb2RlOyAKKyAgICB9CisgICAgCisgICAgfkNodW5rV2l0aE1ldGFk
YXRhKCkgeyBkZXN0cm95KCk7IH0KKyAgICAgCisgICAgLy8gY2hlY2tzIGlmIGFkZHJlc3MgaXMg
aW4gY2h1bmsncyB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UKKyAgICBib29sIG93bnNBZGRyZXNzKGNv
bnN0IHZvaWQqIGFkZHJlc3MpIGNvbnN0IAorICAgIHsKKyAgICAgICAgcmV0dXJuIChzdGF0aWNf
Y2FzdDxjb25zdCBUVWludDgqPihhZGRyZXNzKSA+PSBtX2Jhc2UgJiYgc3RhdGljX2Nhc3Q8Y29u
c3QgVFVpbnQ4Kj4oYWRkcmVzcykgPCAobV9iYXNlICsgbV9tYXhTaXplKSk7ICAKKyAgICB9Cisg
ICAgCisgICAgVFVpbnQ4KiBtX2Jhc2U7IAorICAgIFRJbnQgbV9tYXhTaXplOyAKKyAgICBib29s
IG1faXNDb2RlOworICAgIAorcHJpdmF0ZTogICAgCisgICAgLy8gZGlzcG9zZSBvZmYgdW5kZXJs
eWluZyBjaHVuaworICAgIHZvaWQgZGVzdHJveSgpIAorICAgIHsKKyAgICAgICAgRGVjb21taXQo
MCwgbV9tYXhTaXplKTsKKyAgICAgICAgQ2xvc2UoKTsKKyAgICB9CisKK307CisKKy8vIEhlbHBz
IG1hcCBPU0FsbG9jYXRvciBjYWxscyBmb3IgcmVzZXJ2ZS9jb21taXQvZGVjb21taXQgdG8gYSBz
aW5nbGUgbGFyZ2UgU3ltYmlhbiBjaHVuaworY2xhc3MgUGFnZVNpemVkQWxsb2NhdG9yU3ltYmlh
biB7CisgICAgCitwdWJsaWM6ICAgICAKKyAgICBQYWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFuKHNp
emVfdCBtYXhSZXNlcnZhdGlvblNpemUpOworICAgIH5QYWdlU2l6ZWRBbGxvY2F0b3JTeW1iaWFu
KCk7CisgICAgCisgICAgdm9pZCAqcGFya05leHRBdmFpbGFibGVCbG9jayhzaXplX3QgYnl0ZXMp
OworICAgIHZvaWQgdW5wYXJrKHZvaWQqIGFkZHJlc3MsIHNpemVfdCBieXRlcyk7CisgICAgYm9v
bCBjb21taXQodm9pZCAqYWRkcmVzcywgc2l6ZV90IGJ5dGVzKTsKKyAgICBib29sIGRlY29tbWl0
KHZvaWQgKmFkZHJlc3MsIHNpemVfdCBieXRlcyk7CisgICAgCisgICAgYm9vbCBvd25zQWRkcmVz
cyhjb25zdCB2b2lkKiBhZGRyZXNzKSBjb25zdDsgCisgICAgCitwcml2YXRlOiAgICAgCisgICAg
VEludCBtX3BhZ2VTaXplOyAKKyAgICBDaHVua1dpdGhNZXRhZGF0YSogbV9jaHVua1dpdGhNZXRh
OyAKKyAgICAKKyAgICBzdHJ1Y3QgeworICAgICAgICBUVWludDMyICpiaXRzOyAvLyBhcnJheSBv
ZiBiaXQgZmxhZ3MgCisgICAgICAgIFRVaW50MzIgbnVtQml0czsgLy8gbnVtYmVyIG9mIHJlZ2lv
bnMgdG8ga2VlcCB0cmFjayBvZgorCisgICAgICAgIGJvb2wgZ2V0KFRVaW50MzIgbikgY29uc3Qg
CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhIShiaXRzW24gPj4gNV0gJiAoMSA8PCAo
biAmIDB4MUYpKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldChUVWludDMyIG4pIAor
ICAgICAgICB7CisgICAgICAgICAgICBiaXRzW24gPj4gNV0gfD0gKDEgPDwgKG4gJiAweDFGKSk7
CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldChUVWludDMyIG4sIFRVaW50MzIgY291bnQp
IAorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKFRVaW50IGkgPSBuOyBpIDwgbiArIGNvdW50
IDsgaSsrKQorICAgICAgICAgICAgICAgIHNldChpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAg
ICAgICAgdm9pZCBjbGVhcihUVWludDMyIG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJpdHNb
biA+PiA1XSAmPSB+KDEgPDwgKG4gJiAweDFGKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lk
IGNsZWFyKFRVaW50MzIgbiwgVFVpbnQzMiBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAg
Zm9yIChUVWludDMyIGkgPSBuOyBpIDwgbiArIGNvdW50IDsgaSsrKQorICAgICAgICAgICAgICAg
IGNsZWFyKGkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lkIGNsZWFyQWxsKCkK
KyAgICAgICAgeworICAgICAgICAgICAgZm9yIChUVWludDMyIGkgPSAwOyBpIDwgbnVtQml0czsg
aSsrKQorICAgICAgICAgICAgICAgIGNsZWFyKGkpOworICAgICAgICB9CisKKyAgICAgICAgVElu
dCBmaW5kRnJlZUNvbnNlY3V0aXZlUGFnZXMoVFVpbnQzMiBydW5MZW5ndGgpIGNvbnN0CisgICAg
ICAgIHsKKyAgICAgICAgICAgIC8vIEV4YW1wbGU6IGlmIG51bUJpdHMgPSA4IGFuZCB3ZSB3YW50
IHRvIGxvY2F0ZSB0aGUgZmlyc3QKKyAgICAgICAgICAgIC8vIHJ1biBvZiBydW5MZW5ndGggPSAy
IG51bWJlciBvZiB6ZXJvZXMgaW4gdGhlIG1hcCBbMSAxIDAgMSAxIDAgMCAxXSwgCisgICAgICAg
ICAgICAvLyB0aGVuIHRoZSBkZXNpcmVkIHNvbHV0aW9uIGlzIGluZGV4ID0gNQorICAgICAgICAg
ICAgZm9yIChUVWludDMyIGkgPSAwOyBpIDw9IChudW1CaXRzIC0gcnVuTGVuZ3RoKSA7IGkrKykg
eworICAgICAgICAgICAgICAgIGJvb2wgZm91bmQodHJ1ZSk7CisgICAgICAgICAgICAgICAgZm9y
IChUVWludDMyIGogPSBpOyBqIDw9IChpICsgcnVuTGVuZ3RoIC0gMSkgOyBqKyspIHsgCisgICAg
ICAgICAgICAgICAgICAgIGlmIChnZXQoaikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZv
dW5kID0gZmFsc2U7IAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZvdW5k
KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsgLy8gdGhlIGZpcnN0IGluZGV4IGZvciB0
aGUgYmxvY2sgb2YgemVyb2VzCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7
CisgICAgICAgIH0KKworICAgIH0gbV9tYXA7CisgICAgCit9OworCit9IC8vIG5hbWVzcGFjZSBX
VEYKKworI2VuZGlmIC8vIFBhZ2VTaXplZEFsbG9jYXRvclN5bWJpYW5faAorCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvd3RmL3d0Zi5wcmkKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL3d0Zi93dGYucHJpCShyZXZpc2lvbiA3NjY5OSkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS93dGYvd3RmLnByaQkod29ya2luZyBjb3B5KQpAQCAtNDksMyArNDksOSBAQCBjb250
YWlucyhERUZJTkVTLCBVU0VfR1NUUkVBTUVSPTEpIHsKIHVuaXg6IXN5bWJpYW46IFNPVVJDRVMg
Kz0gd3RmL09TQWxsb2NhdG9yUG9zaXguY3BwCiBzeW1iaWFuOiBTT1VSQ0VTICs9IHd0Zi9PU0Fs
bG9jYXRvclN5bWJpYW4uY3BwCiB3aW4qfHdpbmNlKjogU09VUkNFUyArPSB3dGYvT1NBbGxvY2F0
b3JXaW4uY3BwCisKK3N5bWJpYW46IHsKKyAgICBMSUJTICs9IC1saGFsCisgICAgIyBGb3IgaGFs
LmgKKyAgICBJTkNMVURFUEFUSCAqPSAkJE1XX0xBWUVSX1NZU1RFTUlOQ0xVREUKK30K
</data>
<flag name="review"
          id="71679"
          type_id="1"
          status="-"
          setter="laszlo.gombos"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>82175</attachid>
            <date>2011-02-11 14:17:51 -0800</date>
            <delta_ts>2011-02-18 13:01:04 -0800</delta_ts>
            <desc>Updatd patch with review comments incorporated</desc>
            <filename>51128_algo2_v3.patch</filename>
            <type>text/plain</type>
            <size>15970</size>
            <attacher name="Siddharth Mathur">s.mathur</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNzgzNjUpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzggQEAK
KzIwMTEtMDItMTEgIFNpZGRoYXJ0aCBNYXRodXIgIDxzaWRkaGFydGgubWF0aHVyQG5va2lhLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbU3lt
Ymlhbl0gT1NBbGxvY2F0b3IgaW1wbGVtZW50YXRpb24gZm9yIFN5bWJpYW4gT1MuIAorICAgICAg
ICBNYW5hZ2VzIGJvdGggZGF0YSBhbmQgY29kZSByZWdpb24gcmVxdWVzdHMuIFY4IGFuZCBTdW5z
cGlkZXIgd29yayBuaWNlbHkgd2l0aCBKU0MgaW50ZXJwcmV0ZXIuCisgICAgICAgIE5vdCB0ZXN0
ZWQgd2l0aCBKU0MgSklUIHlldCBhcyBpdCBoYXMgdW5yZWxhdGVkIGZhaWx1cmVzLiBBbHNvIG5v
IHRocmVhZCBzYWZldHkgeWV0LiAgIAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NTExMjgKKworICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnByaTogcmVt
b3ZlZCBIQUwgbGlua2FnZQorICAgICAgICAqIHd0Zi9CaXRtYXAuaDoKKyAgICAgICAgKFdURjo6
OjpmaW5kUnVuT2ZaZXJvcyk6IGZpbmQgcnVuIG9mIHplcm9zIGluIGEgYml0bWFwLiBxdWljayBu
IGRpcnR5CisgICAgICAgICogd3RmL09TQWxsb2NhdG9yLmg6CisgICAgICAgIChXVEY6Ok9TQWxs
b2NhdG9yOjpkZWNvbW1pdEFuZFJlbGVhc2UpOiBkZWNvbW1pdCBleHBsaWNpdGx5IAorICAgICAg
ICAqIHd0Zi9PU0FsbG9jYXRvclN5bWJpYW4uY3BwOiBJbXBsLiBvZiBPU0FsbG9jYXRvciBpbnRl
cmZhY2UgCisgICAgICAgIChXVEY6OmFsbG9jYXRlQ29kZUNodW5rKTogdXRpbGl0eSBmb3IgY29k
ZSBjaHVua3MKKyAgICAgICAgKFdURjo6ZGVhbGxvY2F0ZUNvZGVDaHVuayk6IHV0aWxpdHkgZm9y
IGNvZGUgY2h1bmtzCisgICAgICAgIChXVEY6OmRhdGFBbGxvY2F0b3JJbnN0YW5jZSk6IGdldHRl
ciBmb3IgZGF0YSBhbGxvY2F0b3IgaW5zdGFuY2UKKyAgICAgICAgKFdURjo6T1NBbGxvY2F0b3I6
OnJlc2VydmVVbmNvbW1pdHRlZCk6CisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpyZWxlYXNl
RGVjb21taXR0ZWQpOgorICAgICAgICAoV1RGOjpPU0FsbG9jYXRvcjo6Y29tbWl0KToKKyAgICAg
ICAgKFdURjo6T1NBbGxvY2F0b3I6OmRlY29tbWl0KToKKyAgICAgICAgKFdURjo6T1NBbGxvY2F0
b3I6OnJlc2VydmVBbmRDb21taXQpOgorICAgICAgICAoV1RGOjpQYWdlQWxsb2NhdG9yU3ltYmlh
bjo6UGFnZUFsbG9jYXRvclN5bWJpYW4pOiBwaWdneWJhY2tzIG11bHRpcGxlIHJlcXVlc3RzIG9u
IDEgU3ltYmlhbiBjaHVuaworICAgICAgICAoV1RGOjpQYWdlQWxsb2NhdG9yU3ltYmlhbjo6flBh
Z2VBbGxvY2F0b3JTeW1iaWFuKToKKyAgICAgICAgKFdURjo6UGFnZUFsbG9jYXRvclN5bWJpYW46
OnJlc2VydmUpOgorICAgICAgICAoV1RGOjpQYWdlQWxsb2NhdG9yU3ltYmlhbjo6cmVsZWFzZSk6
CisgICAgICAgIChXVEY6OlBhZ2VBbGxvY2F0b3JTeW1iaWFuOjpjb21taXQpOgorICAgICAgICAo
V1RGOjpQYWdlQWxsb2NhdG9yU3ltYmlhbjo6ZGVjb21taXQpOgorICAgICAgICAoV1RGOjpQYWdl
QWxsb2NhdG9yU3ltYmlhbjo6Y29udGFpbnMpOgorICAgICAgICAqIHd0Zi9QYWdlQWxsb2NhdG9y
U3ltYmlhbi5oOiBBZGRlZC4KKyAgICAgICAgKFdURjo6Q2h1bmtXaXRoTWV0YWRhdGE6OkNodW5r
V2l0aE1ldGFkYXRhKTogd3JhcHBlciBhcm91bmQgUkNodW5rICAKKyAgICAgICAgKFdURjo6Q2h1
bmtXaXRoTWV0YWRhdGE6On5DaHVua1dpdGhNZXRhZGF0YSk6CisgICAgICAgIChXVEY6OkNodW5r
V2l0aE1ldGFkYXRhOjpjb250YWlucyk6CisKIDIwMTEtMDItMTEgIEFkYW0gQmFydGggIDxhYmFy
dGhAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBbmRyZWFzIEtsaW5nLgpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnByaQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJpCShyZXZpc2lvbiA3ODI5
OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcmkJKHdvcmtpbmcg
Y29weSkKQEAgLTQ4LDEyICs0OCw2IEBAIHN5bWJpYW4gewogICAgIElOQ0xVREVQQVRIID0gJCRK
QVZBU0NSSVBUQ09SRV9JTkNMVURFUEFUSCAkJElOQ0xVREVQQVRICiB9CiAKLXN5bWJpYW46IHsK
LSAgICBMSUJTICs9IC1saGFsCi0gICAgIyBGb3IgaGFsLmgKLSAgICBJTkNMVURFUEFUSCAqPSAk
JE1XX0xBWUVSX1NZU1RFTUlOQ0xVREUKLX0KLQogd2luMzItKjogREVGSU5FUyArPSBfSEFTX1RS
MT0wCiAKIERFRklORVMgKz0gQlVJTERJTkdfSmF2YVNjcmlwdENvcmUgQlVJTERJTkdfV1RGCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL0JpdG1hcC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvQml0bWFwLmgJKHJldmlzaW9uIDc1Mzc1KQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9CaXRtYXAuaAkod29ya2luZyBjb3B5KQpAQCAtMzksNiAr
MzksNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBjbGVhcihzaXplX3QpOwogICAgIHZvaWQgY2xlYXJB
bGwoKTsKICAgICB2b2lkIGFkdmFuY2VUb05leHRGcmVlQml0KHNpemVfdCYpIGNvbnN0OworICAg
IGludDY0X3QgZmluZFJ1bk9mWmVyb3Moc2l6ZV90KSBjb25zdDsKICAgICBzaXplX3QgY291bnQo
c2l6ZV90ID0gMCkgY29uc3Q7CiAgICAgc2l6ZV90IGlzRW1wdHkoKSBjb25zdDsKICAgICBzaXpl
X3QgaXNGdWxsKCkgY29uc3Q7CkBAIC05Nyw2ICs5OCwyNiBAQCBpbmxpbmUgdm9pZCBCaXRtYXA8
c2l6ZT46OmFkdmFuY2VUb05leHRGCiB9CiAKIHRlbXBsYXRlPHNpemVfdCBzaXplPgoraW5saW5l
IGludDY0X3QgQml0bWFwPHNpemU+OjpmaW5kUnVuT2ZaZXJvcyhzaXplX3QgcnVuTGVuZ3RoKSBj
b25zdAoreworICAgIGlmICghcnVuTGVuZ3RoKSAKKyAgICAgICAgICAgIHJ1bkxlbmd0aCA9IDE7
IAorICAgICAKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8PSAoc2l6ZSAtIHJ1bkxlbmd0aCkg
OyBpKyspIHsKKyAgICAgICAgYm9vbCBmb3VuZCA9IHRydWU7IAorICAgICAgICBmb3IgKHNpemVf
dCBqID0gaTsgaiA8PSAoaSArIHJ1bkxlbmd0aCAtIDEpIDsgaisrKSB7IAorICAgICAgICAgICAg
aWYgKGdldChqKSkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7IAorICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmb3Vu
ZCkgIAorICAgICAgICAgICAgcmV0dXJuIGk7IAorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisK
K3RlbXBsYXRlPHNpemVfdCBzaXplPgogaW5saW5lIHNpemVfdCBCaXRtYXA8c2l6ZT46OmNvdW50
KHNpemVfdCBzdGFydCkgY29uc3QKIHsKICAgICBzaXplX3QgcmVzdWx0ID0gMDsKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3IuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvd3RmL09TQWxsb2NhdG9yLmgJKHJldmlzaW9uIDc4MTI5KQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9PU0FsbG9jYXRvci5oCSh3b3JraW5nIGNvcHkpCkBA
IC03Nyw5ICs3Nyw3IEBAIGlubGluZSB2b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZUFuZENvbW0K
IGlubGluZSB2b2lkIE9TQWxsb2NhdG9yOjpkZWNvbW1pdEFuZFJlbGVhc2Uodm9pZCogcmVsZWFz
ZUJhc2UsIHNpemVfdCByZWxlYXNlU2l6ZSwgdm9pZCogZGVjb21taXRCYXNlLCBzaXplX3QgZGVj
b21taXRTaXplKQogewogICAgIEFTU0VSVChkZWNvbW1pdEJhc2UgPj0gcmVsZWFzZUJhc2UgJiYg
KHN0YXRpY19jYXN0PGNoYXIqPihkZWNvbW1pdEJhc2UpICsgZGVjb21taXRTaXplKSA8PSAoc3Rh
dGljX2Nhc3Q8Y2hhcio+KHJlbGVhc2VCYXNlKSArIHJlbGVhc2VTaXplKSk7Ci0jaWYgT1MoV0lO
Q0UpCi0gICAgLy8gT24gbW9zdCBwbGF0Zm9ybXMgd2UgY2FuIGFjdHVhbGx5IHNraXAgdGhpcyBm
aW5hbCBkZWNvbW1pdDsgcmVsZWFzaW5nIHRoZSBWTSB3aWxsCi0gICAgLy8gaW1wbGljaXRseSBk
ZWNvbW1pdCBhbnkgcGh5c2ljYWwgbWVtb3J5IGluIHRoZSByZWdpb24uIFRoaXMgaXMgbm90IHRy
dWUgb24gV0lOQ0UuCisjaWYgT1MoV0lOQ0UpIHx8IE9TKFNZTUJJQU4pCiAgICAgZGVjb21taXQo
ZGVjb21taXRCYXNlLCBkZWNvbW1pdFNpemUpOwogI2Vsc2UKICAgICBVTlVTRURfUEFSQU0oZGVj
b21taXRCYXNlKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3JT
eW1iaWFuLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL09TQWxs
b2NhdG9yU3ltYmlhbi5jcHAJKHJldmlzaW9uIDc4MTI5KQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL3d0Zi9PU0FsbG9jYXRvclN5bWJpYW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEs
NiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAxMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0
cyBzdWJzaWRpYXJ5KC1pZXMpLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCkBAIC0yNiwzMSArMjcsMTc5IEBACiAjaW5jbHVkZSAiY29uZmlnLmgi
CiAjaW5jbHVkZSAiT1NBbGxvY2F0b3IuaCIKIAotI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9jLmg+
CisjaW5jbHVkZSAiUGFnZUFsbG9jYXRvclN5bWJpYW4uaCIKIAogbmFtZXNwYWNlIFdURiB7CiAK
LXZvaWQqIE9TQWxsb2NhdG9yOjpyZXNlcnZlVW5jb21taXR0ZWQoc2l6ZV90IGJ5dGVzLCBVc2Fn
ZSwgYm9vbCwgYm9vbCkKKy8vIEFycmF5IHRvIHN0b3JlIGNvZGUgY2h1bmtzIHVzZWQgYnkgSklU
IGVuZ2luZShzKQorc3RhdGljIFJQb2ludGVyQXJyYXk8Q2h1bmtXaXRoTWV0YWRhdGE+IGNvZGVD
aHVua3NDb250YWluZXI7CisKKy8vIFBvaW50ZXIgdG8gdGhlIGRhdGEgKG5vbiBjb2RlKSBhbGxv
Y2F0b3IKK3N0YXRpYyBQYWdlQWxsb2NhdG9yU3ltYmlhbiogYWxsb2NhdG9yID0gMDsgCisKK19M
SVQoS0Vycm9yU3RyaW5nSW50ZXJuYWxDb25zaXN0ZW5jeSwgIk9TQWxsb2NhdG9yOkNvbnNpc3Rl
bmN5RXJyb3IiKTsKK19MSVQoS0Vycm9yU3RyaW5nQ2h1bmtDcmVhdGlvbiwgIk9TQWxsb2NhdG9y
OkNodW5rSW5pdEVycm9yIik7CitfTElUKEtFcnJvclN0cmluZ1BhZ2VTaXplLCAiT1NBbGxvY2F0
b3I6V3JvbmdQYWdlU2l6ZSIpOworCisvLyBNYWtlcyBhIG5ldyBjb2RlIGNodW5rIGZvciBhIEpJ
VCBlbmdpbmUgd2l0aCBldmVyeXRoaW5nIGluIGNvbW1pdHRlZCBzdGF0ZQorc3RhdGljIHZvaWQq
IGFsbG9jYXRlQ29kZUNodW5rKHNpemVfdCBieXRlcykgCit7CisgICAgUkNodW5rIGM7IAorICAg
IFRJbnQgZXJyb3IgPSBjLkNyZWF0ZUxvY2FsQ29kZShieXRlcywgYnl0ZXMpOworICAgIF9fQVNT
RVJUX0FMV0FZUyhlcnJvciA9PSBLRXJyTm9uZSwgVXNlcjo6UGFuaWMoS0Vycm9yU3RyaW5nQ2h1
bmtDcmVhdGlvbiwgZXJyb3IpKTsKKyAgIAorICAgIGNvZGVDaHVua3NDb250YWluZXIuQXBwZW5k
KG5ldyBDaHVua1dpdGhNZXRhZGF0YShjLkhhbmRsZSgpKSk7IAorICAgIHJldHVybiBzdGF0aWNf
Y2FzdDx2b2lkKj4oYy5CYXNlKCkpOyAKK30KKyAgIAorLy8gRnJlZXMgdGhlIF9lbnRpcmVfIGNv
ZGUgY2h1bmsgaW4gd2hpY2ggdGhpcyBhZGRyZXNzIHJlc2lkZXMuIAorc3RhdGljIGJvb2wgZGVh
bGxvY2F0ZUNvZGVDaHVuayh2b2lkKiBhZGRyZXNzKSAKK3sgICAgIAorICAgIGJvb2wgZm91bmQg
PSBmYWxzZTsgCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2RlQ2h1bmtzQ29udGFpbmVyLkNv
dW50KCk7IGkrKykgeyAKKyAgICAgICAgQ2h1bmtXaXRoTWV0YWRhdGEqIHAgPSBjb2RlQ2h1bmtz
Q29udGFpbmVyW2ldOworICAgICAgICBpZiAocCAmJiBwLT5jb250YWlucyhhZGRyZXNzKSkgeyAK
KyAgICAgICAgICAgIGNvZGVDaHVua3NDb250YWluZXIuUmVtb3ZlKGkpOworICAgICAgICAgICAg
ZGVsZXRlIHA7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgcmV0dXJuIGZvdW5kOyAKK30KKworLy8gUmV0dXJuIHRoZSAoc2luZ2xldG9uKSBvYmplY3Qg
dGhhdCBtYW5hZ2VzIGFsbCBub24tY29kZSBWTSBvcGVyYXRpb25zCitzdGF0aWMgUGFnZUFsbG9j
YXRvclN5bWJpYW4qIGRhdGFBbGxvY2F0b3JJbnN0YW5jZSgpIAogewotICAgIHJldHVybiBmYXN0
TWFsbG9jKGJ5dGVzKTsKKyAgICBpZiAoIWFsbG9jYXRvcikgCisgICAgICAgIGFsbG9jYXRvciA9
IG5ldyBQYWdlQWxsb2NhdG9yU3ltYmlhbigpOworCisgICAgcmV0dXJuIGFsbG9jYXRvcjsgCiB9
CiAKLXZvaWQqIE9TQWxsb2NhdG9yOjpyZXNlcnZlQW5kQ29tbWl0KHNpemVfdCBieXRlcywgVXNh
Z2UsIGJvb2wsIGJvb2wpCisvLyBSZXNlcnZlIG1lbW9yeSBhbmQgcmV0dXJuIHRoZSBiYXNlIGFk
ZHJlc3Mgb2YgdGhlIHJlZ2lvbgordm9pZCogT1NBbGxvY2F0b3I6OnJlc2VydmVVbmNvbW1pdHRl
ZChzaXplX3QgcmVzZXJ2YXRpb25TaXplLCBVc2FnZSB1c2FnZSwgYm9vbCAsIGJvb2wgZXhlY3V0
YWJsZSkgCiB7Ci0gICAgcmV0dXJuIGZhc3RNYWxsb2MoYnl0ZXMpOworICAgIHZvaWQqIGJhc2Ug
PSAwOyAKKyAgICBpZiAoZXhlY3V0YWJsZSkgCisgICAgICAgIGJhc2UgPSBhbGxvY2F0ZUNvZGVD
aHVuayhyZXNlcnZhdGlvblNpemUpOworICAgIGVsc2UKKyAgICAgICAgYmFzZSA9IGRhdGFBbGxv
Y2F0b3JJbnN0YW5jZSgpLT5yZXNlcnZlKHJlc2VydmF0aW9uU2l6ZSk7CisgICAgcmV0dXJuIGJh
c2U7IAogfQogCi12b2lkIE9TQWxsb2NhdG9yOjpjb21taXQodm9pZCosIHNpemVfdCwgYm9vbCwg
Ym9vbCkKKy8vIEludmVyc2Ugb3BlcmF0aW9uIG9mIHJlc2VydmVVbmNvbW1pdHRlZCgpCit2b2lk
IE9TQWxsb2NhdG9yOjpyZWxlYXNlRGVjb21taXR0ZWQodm9pZCogcGFya2VkQmFzZSwgc2l6ZV90
IGJ5dGVzKSAKIHsKKyAgICBpZiAoZGF0YUFsbG9jYXRvckluc3RhbmNlKCktPmNvbnRhaW5zKHBh
cmtlZEJhc2UpKSAKKyAgICAgICAgZGF0YUFsbG9jYXRvckluc3RhbmNlKCktPnJlbGVhc2UocGFy
a2VkQmFzZSwgYnl0ZXMpOworCisgICAgLy8gTk9PUCBmb3IgY29kZSBjaHVua3MgKEpJVCkgYmVj
YXVzZSB3ZSByZWxlYXNlZCB0aGVtIGluIGRlY29tbWl0KCkKIH0KIAotdm9pZCBPU0FsbG9jYXRv
cjo6ZGVjb21taXQodm9pZCosIHNpemVfdCkKKy8vIENvbW1pdCB3aGF0IHdhcyBwcmV2aW91c2x5
IHJlc2VydmVkIHZpYSByZXNlcnZlVW5jb21taXR0ZWQoKQordm9pZCBPU0FsbG9jYXRvcjo6Y29t
bWl0KHZvaWQqIGFkZHJlc3MsIHNpemVfdCBieXRlcywgYm9vbCwgYm9vbCBleGVjdXRhYmxlKSAK
IHsKKyAgICAvLyBGb3IgY29kZSBjaHVua3MsIHdlIGNvbW1pdCAoZWFybHkpIGluIHJlc2VydmVV
bmNvbW1pdHRlZCgpLCBzbyBOT09QCisgICAgLy8gRm9yIGRhdGEgcmVnaW9ucywgZG8gcmVhbCB3
b3JrCisgICAgaWYgKCFleGVjdXRhYmxlKSAKKyAgICAgICAgZGF0YUFsbG9jYXRvckluc3RhbmNl
KCktPmNvbW1pdChhZGRyZXNzLCBieXRlcyk7Cit9CisKK3ZvaWQgT1NBbGxvY2F0b3I6OmRlY29t
bWl0KHZvaWQqIGFkZHJlc3MsIHNpemVfdCBieXRlcykgCit7IAorICAgIGlmIChkYXRhQWxsb2Nh
dG9ySW5zdGFuY2UoKS0+Y29udGFpbnMoYWRkcmVzcykpCisgICAgICAgIGRhdGFBbGxvY2F0b3JJ
bnN0YW5jZSgpLT5kZWNvbW1pdChhZGRyZXNzLCBieXRlcyk7CisgICAgZWxzZQorICAgICAgICBk
ZWFsbG9jYXRlQ29kZUNodW5rKGFkZHJlc3MpOyAvLyBmb3IgY29kZSBjaHVuaywgZGVjb21taXQg
QU5EIHJlbGVhc2UgICAgCit9CisgICAgCit2b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZUFuZENv
bW1pdChzaXplX3QgYnl0ZXMsIFVzYWdlIHVzYWdlLCBib29sIHdyaXRhYmxlLCBib29sIGV4ZWN1
dGFibGUpCit7IAorICAgIHZvaWQqIGJhc2UgPSByZXNlcnZlVW5jb21taXR0ZWQoYnl0ZXMsIHVz
YWdlLCB3cml0YWJsZSwgZXhlY3V0YWJsZSk7CisgICAgY29tbWl0KGJhc2UsIGJ5dGVzLCB3cml0
YWJsZSwgZXhlY3V0YWJsZSk7CisgICAgcmV0dXJuIGJhc2U7Cit9CisKKworLy8gVGhlIFBhZ2VB
bGxvY2F0b3JTeW1iaWFuIGNsYXNzIGhlbHBzIG1hcCBPU0FsbG9jYXRvciBjYWxscyBmb3IgcmVz
ZXJ2ZS9jb21taXQvZGVjb21taXQKKy8vIHRvIGEgc2luZ2xlIGxhcmdlIFN5bWJpYW4gY2h1bmsu
IE9ubHkgd29ya3Mgd2l0aCBtdWx0aXBsZXMgb2YgcGFnZSBzaXplLCBhbmQgYXMgYSBjb3JvbGxh
cnkgCisvLyBhbGwgYWRkcmVzc2VzIGFjY2VwdGVkIG9yIHJldHVybmVkIGJ5IGl0IGFyZSBhbHNv
IHBhZ2Utc2l6ZWQgYWxpZ25lZC4gCisvLyBEZXNpZ24gbm90ZXM6IAorLy8gLSBXZSBpbml0aWFs
aXplIGEgY2h1bmsgdXAtZnJvbnQgd2l0aCBhIGxhcmdlIHJlc2VydmF0aW9uIHNpemUKKy8vIC0g
VGhlIGVudGlyZSByZXNlcnZhdGlvbiByZXNlcnZlIGlzIGxvZ2ljYWxseSBkaXZpZGVkIGludG8g
cGFnZVNpemVkIGJsb2NrcyAoNEsgb24gU3ltYmlhbikgCisvLyAtIFRoZSBtYXAgbWFpbnRhaW5z
IDEgYml0IGZvciBlYWNoIG9mIHRoZSA0Sy1zaXplZCByZWdpb24gaW4gb3VyIGFkZHJlc3Mgc3Bh
Y2UKKy8vIC0gT1NBbGxvY2F0b3I6OnJlc2VydmVVbmNvbW1pdHRlZCgpIHJlcXVlc3RzIGxlYWQg
dG8gMSBvciBtb3JlIGJpdHMgYmVpbmcgc2V0IGluIG1hcCAKKy8vICAgdG8gaW5kaWNhdGUgaW50
ZXJuYWxseSByZXNlcnZlZCBzdGF0ZS4gVGhlIFZNIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB0
aGUgZmlyc3QgYml0IGlzIHJldHVybmVkLiAKKy8vIC0gT1NBbGxvY2F0b3I6OmNvbW1pdCgpIGFj
dHVhbGx5IGNhbGxzIFJDaHVuay5jb21taXQoKSBhbmQgY29tbWl0cyAqYWxsIG9yIHBhcnQqIG9m
IHRoZSByZWdpb24gCisvLyAgIHJlc2VydmVkIHZpYSByZXNlcnZlVW5jb21taXR0ZWQoKSBwcmV2
aW91c2x5LiAKKy8vIC0gT1NBbGxvY2F0b3I6OmRlY29tbWl0KCkgY2FsbHMgUkNodW5rLmRlY29t
bWl0KCkgCisvLyAtIE9TQWxsb2NhdG9yOjpyZWxlYXNlRGVjb21taXR0ZWQoKSB1bnBhcmtzIGFs
bCB0aGUgYml0cyBpbiB0aGUgbWFwLCBidXQgdHJ1c3RzIHRoYXQgYSBwcmV2aW91c2x5CisvLyAg
IGNhbGwgdG8gZGVjb21taXQoKSB3b3VsZCBoYXZlIHJldHVybmVkIHRoZSBtZW1vcnkgdG8gdGhl
IE9TIAorUGFnZUFsbG9jYXRvclN5bWJpYW46OlBhZ2VBbGxvY2F0b3JTeW1iaWFuKCkKK3sgICAg
ICAgIAorICAgIF9fQVNTRVJUX0FMV0FZUyhtX3BhZ2VTaXplID09IFdURjo6cGFnZVNpemUoKSwg
VXNlcjo6UGFuaWMoS0Vycm9yU3RyaW5nUGFnZVNpemUsIG1fcGFnZVNpemUpKTsKKyAgICAKKyAg
ICBSQ2h1bmsgY2h1bms7CisgICAgVEludCBlcnJvciA9IGNodW5rLkNyZWF0ZURpc2Nvbm5lY3Rl
ZExvY2FsKDAsIDAsIFRJbnQobGFyZ2VSZXNlcnZhdGlvblNpemUpKTsKKyAgICBfX0FTU0VSVF9B
TFdBWVMoZXJyb3IgPT0gS0Vyck5vbmUsIFVzZXI6OlBhbmljKEtFcnJvclN0cmluZ0NodW5rQ3Jl
YXRpb24sIGVycm9yKSk7CisgICAgCisgICAgbV9jaHVua1dpdGhNZXRhID0gbmV3IENodW5rV2l0
aE1ldGFkYXRhKGNodW5rLkhhbmRsZSgpKTsgLy8gdGFrZXMgb3duZXJzaGlwIG9mIGNodW5rCit9
CisKK1BhZ2VBbGxvY2F0b3JTeW1iaWFuOjp+UGFnZUFsbG9jYXRvclN5bWJpYW4oKSAKK3sKKyAg
ICBkZWxldGUgbV9jaHVua1dpdGhNZXRhOworfQorCisvLyBSZXNlcnZlcyBhIHJlZ2lvbiBpbnRl
cm5hbGx5IGluIHRoZSBiaXRtYXAKK3ZvaWQqIFBhZ2VBbGxvY2F0b3JTeW1iaWFuOjpyZXNlcnZl
KHNpemVfdCBieXRlcykgCit7IAorICAgIC8vIEZpbmQgZmlyc3QgYXZhaWxhYmxlIHJlZ2lvbgor
ICAgIGNvbnN0IHNpemVfdCBuUGFnZXMgPSBieXRlcyAvIG1fcGFnZVNpemU7CisgICAgY29uc3Qg
aW50NjRfdCBzdGFydElkeCA9IG1fbWFwLmZpbmRSdW5PZlplcm9zKG5QYWdlcyk7CisKKyAgICAv
LyBQc2V1ZG8gT09NCisgICAgaWYgKHN0YXJ0SWR4IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgCisgICAgZm9yIChzaXplX3QgaSA9IHN0YXJ0SWR4OyBpIDwgc3RhcnRJZHggKyBuUGFnZXMg
OyBpKyspCisgICAgICAgIG1fbWFwLnNldChpKTsKKyAgICAKKyAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8dm9pZCo+KCBtX2NodW5rV2l0aE1ldGEtPm1fYmFzZSArIChUVWludCkobV9wYWdlU2l6ZSAq
IHN0YXJ0SWR4KSApOyAKK30KKworLy8gUmV2ZXJzZXMgdGhlIGVmZmVjdHMgb2YgYSByZXNlcnZl
KCkgY2FsbAordm9pZCBQYWdlQWxsb2NhdG9yU3ltYmlhbjo6cmVsZWFzZSh2b2lkKiBhZGRyZXNz
LCBzaXplX3QgYnl0ZXMpCit7CisgICAgY29uc3Qgc2l6ZV90IHN0YXJ0SWR4ID0gKHN0YXRpY19j
YXN0PGNoYXIqPihhZGRyZXNzKSAtIG1fY2h1bmtXaXRoTWV0YS0+bV9iYXNlKSAvIG1fcGFnZVNp
emU7CisgICAgY29uc3Qgc2l6ZV90IG5QYWdlcyA9IGJ5dGVzIC8gbV9wYWdlU2l6ZTsKKyAgICBm
b3IgKHNpemVfdCBpID0gc3RhcnRJZHg7IGkgPCBzdGFydElkeCArIG5QYWdlcyA7IGkrKykKKyAg
ICAgICAgbV9tYXAuY2xlYXIoaSk7Cit9CisKKy8vIEFjdHVhbGx5IGNvbW1pdCBtZW1vcnkgZnJv
bSB0aGUgT1MsIGFmdGVyIGEgcHJldmlvdXMgY2FsbCB0byByZXNlcnZlKCkKK2Jvb2wgUGFnZUFs
bG9jYXRvclN5bWJpYW46OmNvbW1pdCh2b2lkKiBhZGRyZXNzLCBzaXplX3QgYnl0ZXMpIAoreyAK
KyAgICAvLyBzYW5pdHkgY2hlY2sgdGhhdCBiaXRzIHdlcmUgcHJldmlvdXNseSBzZXQKKyAgICBj
b25zdCBzaXplX3QgaWR4ID0gKHN0YXRpY19jYXN0PGNoYXIqPihhZGRyZXNzKSAtIG1fY2h1bmtX
aXRoTWV0YS0+bV9iYXNlKSAvIG1fcGFnZVNpemU7CisgICAgY29uc3Qgc2l6ZV90IG5QYWdlcyA9
IGJ5dGVzIC8gbV9wYWdlU2l6ZTsKKyAgICBfX0FTU0VSVF9BTFdBWVMobV9tYXAuZ2V0KGlkeCks
IFVzZXI6OlBhbmljKEtFcnJvclN0cmluZ0ludGVybmFsQ29uc2lzdGVuY3ksIGlkeCkpOworICAg
IF9fQVNTRVJUX0FMV0FZUyhtX21hcC5nZXQoaWR4K25QYWdlcy0xKSwgVXNlcjo6UGFuaWMoS0Vy
cm9yU3RyaW5nSW50ZXJuYWxDb25zaXN0ZW5jeSwgaWR4K25QYWdlcy0xKSk7CisgICAgCisgICAg
VEludCBlcnJvciA9IG1fY2h1bmtXaXRoTWV0YS0+Q29tbWl0KHN0YXRpY19jYXN0PGNoYXIqPihh
ZGRyZXNzKSAtIG1fY2h1bmtXaXRoTWV0YS0+bV9iYXNlLCBieXRlcyk7CisgICAgcmV0dXJuIChl
cnJvciA9PSBLRXJyTm9uZSk7Cit9CisKKy8vIEludmVyc2Ugb3BlcmF0aW9uIG9mIGNvbW1pdCgp
LCBhIHJlbGVhc2UoKSBzaG91bGQgZm9sbG93IGxhdGVyCitib29sIFBhZ2VBbGxvY2F0b3JTeW1i
aWFuOjpkZWNvbW1pdCh2b2lkKiBhZGRyZXNzLCBzaXplX3QgYnl0ZXMpIAoreyAKKyAgICBUSW50
IGVycm9yID0gbV9jaHVua1dpdGhNZXRhLT5EZWNvbW1pdChzdGF0aWNfY2FzdDxjaGFyKj4oYWRk
cmVzcykgLSBtX2NodW5rV2l0aE1ldGEtPm1fYmFzZSwgYnl0ZXMpOworICAgIHJldHVybiAoZXJy
b3IgPT0gS0Vyck5vbmUpOyAKIH0KIAotdm9pZCBPU0FsbG9jYXRvcjo6cmVsZWFzZURlY29tbWl0
dGVkKHZvaWQqIGFkZHJlc3MsIHNpemVfdCkKK2Jvb2wgUGFnZUFsbG9jYXRvclN5bWJpYW46OmNv
bnRhaW5zKGNvbnN0IHZvaWQqIGFkZHJlc3MpIGNvbnN0CiB7Ci0gICAgZmFzdEZyZWUoYWRkcmVz
cyk7CisgICAgcmV0dXJuIG1fY2h1bmtXaXRoTWV0YS0+Y29udGFpbnMoYWRkcmVzcyk7ICAgICAK
IH0KIAogfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3Rm
L1BhZ2VBbGxvY2F0b3JTeW1iaWFuLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL3d0Zi9QYWdlQWxsb2NhdG9yU3ltYmlhbi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL3d0Zi9QYWdlQWxsb2NhdG9yU3ltYmlhbi5oCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBOb2tpYSBDb3Jwb3JhdGlv
biBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4g
IE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0
aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFBhZ2VBbGxvY2F0b3JTeW1i
aWFuX2gKKyNkZWZpbmUgUGFnZUFsbG9jYXRvclN5bWJpYW5faAorCisjaW5jbHVkZSA8ZTMyc3Rk
Lmg+CisjaW5jbHVkZSA8d3RmL0JpdE1hcC5oPgorCituYW1lc3BhY2UgV1RGIHsgCisKK3NpemVf
dCBwYWdlU2l6ZSgpOworCisvLyBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBhbiBSQ2h1bmsK
K2NsYXNzIENodW5rV2l0aE1ldGFkYXRhIDogcHVibGljIFJDaHVuayB7CisgICAKK3B1YmxpYzog
ICAKKyAgICBDaHVua1dpdGhNZXRhZGF0YShUSW50IGhhbmRsZSkgCisgICAgeworICAgICAgICBT
ZXRIYW5kbGUoaGFuZGxlKTsKKyAgICAgICAgLy8gcHJldmVudCBrZXJuZWwgY2FsbHMgYnkgY2Fj
aGluZyB0aGVzZQorICAgICAgICAKKyAgICAgICAgbV9iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxj
aGFyKj4oQmFzZSgpKTsgCisgICAgICAgIG1fbWF4U2l6ZSA9IE1heFNpemUoKTsKKyAgICB9Cisg
ICAgCisgICAgfkNodW5rV2l0aE1ldGFkYXRhKCkgCisgICAgeyAKKyAgICAgICAgRGVjb21taXQo
MCwgbV9tYXhTaXplKTsKKyAgICAgICAgQ2xvc2UoKTsKKyAgICB9CisgICAgIAorICAgIC8vIGNo
ZWNrcyBpZiBhZGRyZXNzIGlzIGluIGNodW5rJ3MgdmlydHVhbCBhZGRyZXNzIHNwYWNlCisgICAg
Ym9vbCBjb250YWlucyhjb25zdCB2b2lkKiBhZGRyZXNzKSBjb25zdCAKKyAgICB7CisgICAgICAg
IHJldHVybiAoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGFkZHJlc3MpID49IG1fYmFzZSAmJiBz
dGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oYWRkcmVzcykgPCAobV9iYXNlICsgbV9tYXhTaXplKSk7
ICAKKyAgICB9CisgICAgCisgICAgY2hhciogbV9iYXNlOyAKKyAgICBzaXplX3QgbV9tYXhTaXpl
OyAKKyAgICAKK307CisKKy8vIFNpemUgb2YgdGhlIGxhcmdlIHVwLWZyb250IHJlc2VydmF0aW9u
CisjaWYgZGVmaW5lZChfX1dJTlNfXykgCisvLyBFbXVsYXRvciBoYXMgbGltaXRlZCB2aXJ0dWFs
IGFkZHJlc3Mgc3BhY2UKK2NvbnN0IHNpemVfdCBsYXJnZVJlc2VydmF0aW9uU2l6ZSA9IDk2KjEw
MjQqMTAyNDsKKyNlbHNlCisvLyBIVyBoYXMgcGxlbnR5IG9mIHZpcnR1YWwgYWRkcmVzc2VzCitj
b25zdCBzaXplX3QgbGFyZ2VSZXNlcnZhdGlvblNpemUgPSAyNTYqMTAyNCoxMDI0OworI2VuZGlm
CisKK2NsYXNzIFBhZ2VBbGxvY2F0b3JTeW1iaWFuIHsgCisKK3B1YmxpYzogICAgIAorICAgIFBh
Z2VBbGxvY2F0b3JTeW1iaWFuKCk7CisgICAgflBhZ2VBbGxvY2F0b3JTeW1iaWFuKCk7CisgICAg
CisgICAgdm9pZCogcmVzZXJ2ZShzaXplX3QpOworICAgIHZvaWQgcmVsZWFzZSh2b2lkKiwgc2l6
ZV90KTsKKyAgICBib29sIGNvbW1pdCh2b2lkKiwgc2l6ZV90KTsKKyAgICBib29sIGRlY29tbWl0
KHZvaWQqLCBzaXplX3QpOworICAgIAorICAgIGJvb2wgY29udGFpbnMoY29uc3Qgdm9pZCopIGNv
bnN0OyAKKyAgICAKK3ByaXZhdGU6ICAgICAKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1fcGFn
ZVNpemUgPSA0MDk2OyAKKyAgICBDaHVua1dpdGhNZXRhZGF0YSogbV9jaHVua1dpdGhNZXRhOyAK
KyAgICBCaXRtYXA8bGFyZ2VSZXNlcnZhdGlvblNpemUgLyBtX3BhZ2VTaXplPiBtX21hcDsKKyAg
ICAKK307CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gUGFnZUFsbG9jYXRvclN5
bWJpYW5faAorCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>82999</attachid>
            <date>2011-02-18 13:01:04 -0800</date>
            <delta_ts>2011-02-18 14:42:30 -0800</delta_ts>
            <desc>Rebaselined patch against ToT. </desc>
            <filename>51128_algo2_v6.patch</filename>
            <type>text/plain</type>
            <size>15899</size>
            <attacher name="Siddharth Mathur">s.mathur</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNzg5MTUpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzggQEAK
KzIwMTEtMDItMTggIFNpZGRoYXJ0aCBNYXRodXIgIDxzaWRkaGFydGgubWF0aHVyQG5va2lhLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbU3lt
Ymlhbl0gT1NBbGxvY2F0b3IgaW1wbGVtZW50YXRpb24gZm9yIFN5bWJpYW4gT1MuIAorICAgICAg
ICBNYW5hZ2VzIGJvdGggZGF0YSBhbmQgY29kZSByZWdpb24gcmVxdWVzdHMuIFY4IGFuZCBTdW5z
cGlkZXIgd29yayBuaWNlbHkgd2l0aCBKU0MgaW50ZXJwcmV0ZXIuCisgICAgICAgIE5vdCB0ZXN0
ZWQgd2l0aCBKU0MgSklUIHlldCBhcyBpdCBoYXMgdW5yZWxhdGVkIGZhaWx1cmVzLiBBbHNvIG5v
IHRocmVhZCBzYWZldHkgeWV0LiAgIAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NTExMjgKKworICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnByaTogcmVt
b3ZlZCBIQUwgbGlua2FnZQorICAgICAgICAqIHd0Zi9CaXRtYXAuaDoKKyAgICAgICAgKFdURjo6
OjpmaW5kUnVuT2ZaZXJvcyk6IGZpbmQgcnVuIG9mIHplcm9zIGluIGEgYml0bWFwLiBxdWljayBu
IGRpcnR5CisgICAgICAgICogd3RmL09TQWxsb2NhdG9yLmg6CisgICAgICAgIChXVEY6Ok9TQWxs
b2NhdG9yOjpkZWNvbW1pdEFuZFJlbGVhc2UpOiBkZWNvbW1pdCBleHBsaWNpdGx5IAorICAgICAg
ICAqIHd0Zi9PU0FsbG9jYXRvclN5bWJpYW4uY3BwOiBJbXBsLiBvZiBPU0FsbG9jYXRvciBpbnRl
cmZhY2UgCisgICAgICAgIChXVEY6OmFsbG9jYXRlQ29kZUNodW5rKTogdXRpbGl0eSBmb3IgY29k
ZSBjaHVua3MKKyAgICAgICAgKFdURjo6ZGVhbGxvY2F0ZUNvZGVDaHVuayk6IHV0aWxpdHkgZm9y
IGNvZGUgY2h1bmtzCisgICAgICAgIChXVEY6OmRhdGFBbGxvY2F0b3JJbnN0YW5jZSk6IGdldHRl
ciBmb3IgZGF0YSBhbGxvY2F0b3IgaW5zdGFuY2UKKyAgICAgICAgKFdURjo6T1NBbGxvY2F0b3I6
OnJlc2VydmVVbmNvbW1pdHRlZCk6CisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpyZWxlYXNl
RGVjb21taXR0ZWQpOgorICAgICAgICAoV1RGOjpPU0FsbG9jYXRvcjo6Y29tbWl0KToKKyAgICAg
ICAgKFdURjo6T1NBbGxvY2F0b3I6OmRlY29tbWl0KToKKyAgICAgICAgKFdURjo6T1NBbGxvY2F0
b3I6OnJlc2VydmVBbmRDb21taXQpOgorICAgICAgICAoV1RGOjpQYWdlQWxsb2NhdG9yU3ltYmlh
bjo6UGFnZUFsbG9jYXRvclN5bWJpYW4pOiBwaWdneWJhY2tzIG11bHRpcGxlIHJlcXVlc3RzIG9u
IDEgU3ltYmlhbiBjaHVuaworICAgICAgICAoV1RGOjpQYWdlQWxsb2NhdG9yU3ltYmlhbjo6flBh
Z2VBbGxvY2F0b3JTeW1iaWFuKToKKyAgICAgICAgKFdURjo6UGFnZUFsbG9jYXRvclN5bWJpYW46
OnJlc2VydmUpOgorICAgICAgICAoV1RGOjpQYWdlQWxsb2NhdG9yU3ltYmlhbjo6cmVsZWFzZSk6
CisgICAgICAgIChXVEY6OlBhZ2VBbGxvY2F0b3JTeW1iaWFuOjpjb21taXQpOgorICAgICAgICAo
V1RGOjpQYWdlQWxsb2NhdG9yU3ltYmlhbjo6ZGVjb21taXQpOgorICAgICAgICAoV1RGOjpQYWdl
QWxsb2NhdG9yU3ltYmlhbjo6Y29udGFpbnMpOgorICAgICAgICAqIHd0Zi9QYWdlQWxsb2NhdG9y
U3ltYmlhbi5oOiBBZGRlZC4KKyAgICAgICAgKFdURjo6Q2h1bmtXaXRoTWV0YWRhdGE6OkNodW5r
V2l0aE1ldGFkYXRhKTogd3JhcHBlciBhcm91bmQgUkNodW5rICAKKyAgICAgICAgKFdURjo6Q2h1
bmtXaXRoTWV0YWRhdGE6On5DaHVua1dpdGhNZXRhZGF0YSk6CisgICAgICAgIChXVEY6OkNodW5r
V2l0aE1ldGFkYXRhOjpjb250YWlucyk6CisgICAgICAgIAogMjAxMS0wMi0xNyAgT2xpdmVyIEh1
bnQgIDxvbGl2ZXJAYXBwbGUuY29tPgogCiAgICAgICAgIEF0dGVtcHQgdG8gZml4IHdpbmRvd3Mg
YnVpbGQKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcmkKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnByaQkocmV2
aXNpb24gNzkwMjApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJp
CSh3b3JraW5nIGNvcHkpCkBAIC00OSwxMiArNDksNiBAQCBzeW1iaWFuIHsKICAgICBJTkNMVURF
UEFUSCA9ICQkSkFWQVNDUklQVENPUkVfSU5DTFVERVBBVEggJCRJTkNMVURFUEFUSAogfQogCi1z
eW1iaWFuOiB7Ci0gICAgTElCUyArPSAtbGhhbAotICAgICMgRm9yIGhhbC5oCi0gICAgSU5DTFVE
RVBBVEggKj0gJCRNV19MQVlFUl9TWVNURU1JTkNMVURFCi19Ci0KIHdpbjMyLSo6IERFRklORVMg
Kz0gX0hBU19UUjE9MAogCiBERUZJTkVTICs9IEJVSUxESU5HX0phdmFTY3JpcHRDb3JlIEJVSUxE
SU5HX1dURgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9CaXRtYXAuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL0JpdG1hcC5oCShyZXZpc2lvbiA3ODkx
NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvQml0bWFwLmgJKHdvcmtpbmcgY29weSkK
QEAgLTQwLDYgKzQwLDcgQEAgcHVibGljOgogICAgIHNpemVfdCBuZXh0UG9zc2libHlVbnNldChz
aXplX3QpIGNvbnN0OwogICAgIHZvaWQgY2xlYXIoc2l6ZV90KTsKICAgICB2b2lkIGNsZWFyQWxs
KCk7CisgICAgaW50NjRfdCBmaW5kUnVuT2ZaZXJvcyhzaXplX3QpIGNvbnN0OwogICAgIHNpemVf
dCBjb3VudChzaXplX3QgPSAwKSBjb25zdDsKICAgICBzaXplX3QgaXNFbXB0eSgpIGNvbnN0Owog
ICAgIHNpemVfdCBpc0Z1bGwoKSBjb25zdDsKQEAgLTEwNyw2ICsxMDgsMjYgQEAgaW5saW5lIHNp
emVfdCBCaXRtYXA8c2l6ZT46Om5leHRQb3NzaWJseQogfQogCiB0ZW1wbGF0ZTxzaXplX3Qgc2l6
ZT4KK2lubGluZSBpbnQ2NF90IEJpdG1hcDxzaXplPjo6ZmluZFJ1bk9mWmVyb3Moc2l6ZV90IHJ1
bkxlbmd0aCkgY29uc3QKK3sKKyAgICBpZiAoIXJ1bkxlbmd0aCkgCisgICAgICAgICAgICBydW5M
ZW5ndGggPSAxOyAKKyAgICAgCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gKHNpemUgLSBy
dW5MZW5ndGgpIDsgaSsrKSB7CisgICAgICAgIGJvb2wgZm91bmQgPSB0cnVlOyAKKyAgICAgICAg
Zm9yIChzaXplX3QgaiA9IGk7IGogPD0gKGkgKyBydW5MZW5ndGggLSAxKSA7IGorKykgeyAKKyAg
ICAgICAgICAgIGlmIChnZXQoaikpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlOyAK
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAg
ICBpZiAoZm91bmQpICAKKyAgICAgICAgICAgIHJldHVybiBpOyAKKyAgICB9CisgICAgcmV0dXJu
IC0xOworfQorCit0ZW1wbGF0ZTxzaXplX3Qgc2l6ZT4KIGlubGluZSBzaXplX3QgQml0bWFwPHNp
emU+Ojpjb3VudChzaXplX3Qgc3RhcnQpIGNvbnN0CiB7CiAgICAgc2l6ZV90IHJlc3VsdCA9IDA7
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL09TQWxsb2NhdG9yLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9PU0FsbG9jYXRvci5oCShyZXZpc2lvbiA3
ODkxNSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3IuaAkod29ya2lu
ZyBjb3B5KQpAQCAtNzcsOSArNzcsNyBAQCBpbmxpbmUgdm9pZCogT1NBbGxvY2F0b3I6OnJlc2Vy
dmVBbmRDb21tCiBpbmxpbmUgdm9pZCBPU0FsbG9jYXRvcjo6ZGVjb21taXRBbmRSZWxlYXNlKHZv
aWQqIHJlbGVhc2VCYXNlLCBzaXplX3QgcmVsZWFzZVNpemUsIHZvaWQqIGRlY29tbWl0QmFzZSwg
c2l6ZV90IGRlY29tbWl0U2l6ZSkKIHsKICAgICBBU1NFUlQoZGVjb21taXRCYXNlID49IHJlbGVh
c2VCYXNlICYmIChzdGF0aWNfY2FzdDxjaGFyKj4oZGVjb21taXRCYXNlKSArIGRlY29tbWl0U2l6
ZSkgPD0gKHN0YXRpY19jYXN0PGNoYXIqPihyZWxlYXNlQmFzZSkgKyByZWxlYXNlU2l6ZSkpOwot
I2lmIE9TKFdJTkNFKQotICAgIC8vIE9uIG1vc3QgcGxhdGZvcm1zIHdlIGNhbiBhY3R1YWxseSBz
a2lwIHRoaXMgZmluYWwgZGVjb21taXQ7IHJlbGVhc2luZyB0aGUgVk0gd2lsbAotICAgIC8vIGlt
cGxpY2l0bHkgZGVjb21taXQgYW55IHBoeXNpY2FsIG1lbW9yeSBpbiB0aGUgcmVnaW9uLiBUaGlz
IGlzIG5vdCB0cnVlIG9uIFdJTkNFLgorI2lmIE9TKFdJTkNFKSB8fCBPUyhTWU1CSUFOKQogICAg
IGRlY29tbWl0KGRlY29tbWl0QmFzZSwgZGVjb21taXRTaXplKTsKICNlbHNlCiAgICAgVU5VU0VE
X1BBUkFNKGRlY29tbWl0QmFzZSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL09T
QWxsb2NhdG9yU3ltYmlhbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L3d0Zi9PU0FsbG9jYXRvclN5bWJpYW4uY3BwCShyZXZpc2lvbiA3ODkxNikKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3JTeW1iaWFuLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDExIE5va2lhIENvcnBvcmF0aW9u
IGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjYsMzEgKzI3LDE3NiBAQAogI2luY2x1ZGUg
ImNvbmZpZy5oIgogI2luY2x1ZGUgIk9TQWxsb2NhdG9yLmgiCiAKLSNpbmNsdWRlIDx3dGYvRmFz
dE1hbGxvYy5oPgorI2luY2x1ZGUgIlBhZ2VBbGxvY2F0b3JTeW1iaWFuLmgiCiAKIG5hbWVzcGFj
ZSBXVEYgewogCi12b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZVVuY29tbWl0dGVkKHNpemVfdCBi
eXRlcywgVXNhZ2UsIGJvb2wsIGJvb2wpCisvLyBBcnJheSB0byBzdG9yZSBjb2RlIGNodW5rcyB1
c2VkIGJ5IEpJVCBlbmdpbmUocykKK3N0YXRpYyBSUG9pbnRlckFycmF5PENodW5rV2l0aE1ldGFk
YXRhPiBjb2RlQ2h1bmtzQ29udGFpbmVyOworCisvLyBUaGUgc2luZ2xldG9uIGRhdGEgYWxsb2Nh
dG9yIChub24gY29kZSkKK3N0YXRpYyBQYWdlQWxsb2NhdG9yU3ltYmlhbiBkYXRhQWxsb2NhdG9y
OworCitfTElUKEtFcnJvclN0cmluZ0ludGVybmFsQ29uc2lzdGVuY3ksICJPU0FsbG9jYXRvcjpD
b25zaXN0ZW5jeUVycm9yIik7CitfTElUKEtFcnJvclN0cmluZ0NodW5rQ3JlYXRpb24sICJPU0Fs
bG9jYXRvcjpDaHVua0luaXRFcnJvciIpOworX0xJVChLRXJyb3JTdHJpbmdQYWdlU2l6ZSwgIk9T
QWxsb2NhdG9yOldyb25nUGFnZVNpemUiKTsKKworLy8gTWFrZXMgYSBuZXcgY29kZSBjaHVuayBm
b3IgYSBKSVQgZW5naW5lIHdpdGggZXZlcnl0aGluZyBpbiBjb21taXR0ZWQgc3RhdGUKK3N0YXRp
YyB2b2lkKiBhbGxvY2F0ZUNvZGVDaHVuayhzaXplX3QgYnl0ZXMpIAoreworICAgIFJDaHVuayBj
OyAKKyAgICBUSW50IGVycm9yID0gYy5DcmVhdGVMb2NhbENvZGUoYnl0ZXMsIGJ5dGVzKTsKKyAg
ICBfX0FTU0VSVF9BTFdBWVMoZXJyb3IgPT0gS0Vyck5vbmUsIFVzZXI6OlBhbmljKEtFcnJvclN0
cmluZ0NodW5rQ3JlYXRpb24sIGVycm9yKSk7CisgICAKKyAgICBjb2RlQ2h1bmtzQ29udGFpbmVy
LkFwcGVuZChuZXcgQ2h1bmtXaXRoTWV0YWRhdGEoYy5IYW5kbGUoKSkpOyAKKyAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8dm9pZCo+KGMuQmFzZSgpKTsgCit9CisgICAKKy8vIEZyZWVzIHRoZSBfZW50
aXJlXyBjb2RlIGNodW5rIGluIHdoaWNoIHRoaXMgYWRkcmVzcyByZXNpZGVzLiAKK3N0YXRpYyBi
b29sIGRlYWxsb2NhdGVDb2RlQ2h1bmsodm9pZCogYWRkcmVzcykgCit7ICAgICAKKyAgICBib29s
IGZvdW5kID0gZmFsc2U7IAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29kZUNodW5rc0NvbnRh
aW5lci5Db3VudCgpOyBpKyspIHsgCisgICAgICAgIENodW5rV2l0aE1ldGFkYXRhKiBwID0gY29k
ZUNodW5rc0NvbnRhaW5lcltpXTsKKyAgICAgICAgaWYgKHAgJiYgcC0+Y29udGFpbnMoYWRkcmVz
cykpIHsgCisgICAgICAgICAgICBjb2RlQ2h1bmtzQ29udGFpbmVyLlJlbW92ZShpKTsKKyAgICAg
ICAgICAgIGRlbGV0ZSBwOworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICB9Cisg
ICAgfQorICAgIHJldHVybiBmb3VuZDsgCit9CisKKy8vIFJldHVybiB0aGUgKHNpbmdsZXRvbikg
b2JqZWN0IHRoYXQgbWFuYWdlcyBhbGwgbm9uLWNvZGUgVk0gb3BlcmF0aW9ucworc3RhdGljIFBh
Z2VBbGxvY2F0b3JTeW1iaWFuKiBkYXRhQWxsb2NhdG9ySW5zdGFuY2UoKSAKK3sKKyAgICByZXR1
cm4gJmRhdGFBbGxvY2F0b3I7IAorfQorCisvLyBSZXNlcnZlIG1lbW9yeSBhbmQgcmV0dXJuIHRo
ZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgordm9pZCogT1NBbGxvY2F0b3I6OnJlc2VydmVV
bmNvbW1pdHRlZChzaXplX3QgcmVzZXJ2YXRpb25TaXplLCBVc2FnZSB1c2FnZSwgYm9vbCAsIGJv
b2wgZXhlY3V0YWJsZSkgCit7CisgICAgdm9pZCogYmFzZSA9IDA7IAorICAgIGlmIChleGVjdXRh
YmxlKSAKKyAgICAgICAgYmFzZSA9IGFsbG9jYXRlQ29kZUNodW5rKHJlc2VydmF0aW9uU2l6ZSk7
CisgICAgZWxzZQorICAgICAgICBiYXNlID0gZGF0YUFsbG9jYXRvckluc3RhbmNlKCktPnJlc2Vy
dmUocmVzZXJ2YXRpb25TaXplKTsKKyAgICByZXR1cm4gYmFzZTsgCit9CisKKy8vIEludmVyc2Ug
b3BlcmF0aW9uIG9mIHJlc2VydmVVbmNvbW1pdHRlZCgpCit2b2lkIE9TQWxsb2NhdG9yOjpyZWxl
YXNlRGVjb21taXR0ZWQodm9pZCogcGFya2VkQmFzZSwgc2l6ZV90IGJ5dGVzKSAKIHsKLSAgICBy
ZXR1cm4gZmFzdE1hbGxvYyhieXRlcyk7CisgICAgaWYgKGRhdGFBbGxvY2F0b3JJbnN0YW5jZSgp
LT5jb250YWlucyhwYXJrZWRCYXNlKSkgCisgICAgICAgIGRhdGFBbGxvY2F0b3JJbnN0YW5jZSgp
LT5yZWxlYXNlKHBhcmtlZEJhc2UsIGJ5dGVzKTsKKworICAgIC8vIE5PT1AgZm9yIGNvZGUgY2h1
bmtzIChKSVQpIGJlY2F1c2Ugd2UgcmVsZWFzZWQgdGhlbSBpbiBkZWNvbW1pdCgpCiB9CiAKLXZv
aWQqIE9TQWxsb2NhdG9yOjpyZXNlcnZlQW5kQ29tbWl0KHNpemVfdCBieXRlcywgVXNhZ2UsIGJv
b2wsIGJvb2wpCisvLyBDb21taXQgd2hhdCB3YXMgcHJldmlvdXNseSByZXNlcnZlZCB2aWEgcmVz
ZXJ2ZVVuY29tbWl0dGVkKCkKK3ZvaWQgT1NBbGxvY2F0b3I6OmNvbW1pdCh2b2lkKiBhZGRyZXNz
LCBzaXplX3QgYnl0ZXMsIGJvb2wsIGJvb2wgZXhlY3V0YWJsZSkgCiB7Ci0gICAgcmV0dXJuIGZh
c3RNYWxsb2MoYnl0ZXMpOworICAgIC8vIEZvciBjb2RlIGNodW5rcywgd2UgY29tbWl0IChlYXJs
eSkgaW4gcmVzZXJ2ZVVuY29tbWl0dGVkKCksIHNvIE5PT1AKKyAgICAvLyBGb3IgZGF0YSByZWdp
b25zLCBkbyByZWFsIHdvcmsKKyAgICBpZiAoIWV4ZWN1dGFibGUpIAorICAgICAgICBkYXRhQWxs
b2NhdG9ySW5zdGFuY2UoKS0+Y29tbWl0KGFkZHJlc3MsIGJ5dGVzKTsKK30KKwordm9pZCBPU0Fs
bG9jYXRvcjo6ZGVjb21taXQodm9pZCogYWRkcmVzcywgc2l6ZV90IGJ5dGVzKSAKK3sgCisgICAg
aWYgKGRhdGFBbGxvY2F0b3JJbnN0YW5jZSgpLT5jb250YWlucyhhZGRyZXNzKSkKKyAgICAgICAg
ZGF0YUFsbG9jYXRvckluc3RhbmNlKCktPmRlY29tbWl0KGFkZHJlc3MsIGJ5dGVzKTsKKyAgICBl
bHNlCisgICAgICAgIGRlYWxsb2NhdGVDb2RlQ2h1bmsoYWRkcmVzcyk7IC8vIGZvciBjb2RlIGNo
dW5rLCBkZWNvbW1pdCBBTkQgcmVsZWFzZSAgICAKK30KKyAgICAKK3ZvaWQqIE9TQWxsb2NhdG9y
OjpyZXNlcnZlQW5kQ29tbWl0KHNpemVfdCBieXRlcywgVXNhZ2UgdXNhZ2UsIGJvb2wgd3JpdGFi
bGUsIGJvb2wgZXhlY3V0YWJsZSkKK3sgCisgICAgdm9pZCogYmFzZSA9IHJlc2VydmVVbmNvbW1p
dHRlZChieXRlcywgdXNhZ2UsIHdyaXRhYmxlLCBleGVjdXRhYmxlKTsKKyAgICBjb21taXQoYmFz
ZSwgYnl0ZXMsIHdyaXRhYmxlLCBleGVjdXRhYmxlKTsKKyAgICByZXR1cm4gYmFzZTsKK30KKwor
CisvLyBUaGUgUGFnZUFsbG9jYXRvclN5bWJpYW4gY2xhc3MgaGVscHMgbWFwIE9TQWxsb2NhdG9y
IGNhbGxzIGZvciByZXNlcnZlL2NvbW1pdC9kZWNvbW1pdAorLy8gdG8gYSBzaW5nbGUgbGFyZ2Ug
U3ltYmlhbiBjaHVuay4gT25seSB3b3JrcyB3aXRoIG11bHRpcGxlcyBvZiBwYWdlIHNpemUsIGFu
ZCBhcyBhIGNvcm9sbGFyeSAKKy8vIGFsbCBhZGRyZXNzZXMgYWNjZXB0ZWQgb3IgcmV0dXJuZWQg
YnkgaXQgYXJlIGFsc28gcGFnZS1zaXplZCBhbGlnbmVkLiAKKy8vIERlc2lnbiBub3RlczogCisv
LyAtIFdlIGluaXRpYWxpemUgYSBjaHVuayB1cC1mcm9udCB3aXRoIGEgbGFyZ2UgcmVzZXJ2YXRp
b24gc2l6ZQorLy8gLSBUaGUgZW50aXJlIHJlc2VydmF0aW9uIHJlc2VydmUgaXMgbG9naWNhbGx5
IGRpdmlkZWQgaW50byBwYWdlU2l6ZWQgYmxvY2tzICg0SyBvbiBTeW1iaWFuKSAKKy8vIC0gVGhl
IG1hcCBtYWludGFpbnMgMSBiaXQgZm9yIGVhY2ggb2YgdGhlIDRLLXNpemVkIHJlZ2lvbiBpbiBv
dXIgYWRkcmVzcyBzcGFjZQorLy8gLSBPU0FsbG9jYXRvcjo6cmVzZXJ2ZVVuY29tbWl0dGVkKCkg
cmVxdWVzdHMgbGVhZCB0byAxIG9yIG1vcmUgYml0cyBiZWluZyBzZXQgaW4gbWFwIAorLy8gICB0
byBpbmRpY2F0ZSBpbnRlcm5hbGx5IHJlc2VydmVkIHN0YXRlLiBUaGUgVk0gYWRkcmVzcyBjb3Jy
ZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBiaXQgaXMgcmV0dXJuZWQuIAorLy8gLSBPU0FsbG9jYXRv
cjo6Y29tbWl0KCkgYWN0dWFsbHkgY2FsbHMgUkNodW5rLmNvbW1pdCgpIGFuZCBjb21taXRzICph
bGwgb3IgcGFydCogb2YgdGhlIHJlZ2lvbiAKKy8vICAgcmVzZXJ2ZWQgdmlhIHJlc2VydmVVbmNv
bW1pdHRlZCgpIHByZXZpb3VzbHkuIAorLy8gLSBPU0FsbG9jYXRvcjo6ZGVjb21taXQoKSBjYWxs
cyBSQ2h1bmsuZGVjb21taXQoKSAKKy8vIC0gT1NBbGxvY2F0b3I6OnJlbGVhc2VEZWNvbW1pdHRl
ZCgpIHVucGFya3MgYWxsIHRoZSBiaXRzIGluIHRoZSBtYXAsIGJ1dCB0cnVzdHMgdGhhdCBhIHBy
ZXZpb3VzbHkKKy8vICAgY2FsbCB0byBkZWNvbW1pdCgpIHdvdWxkIGhhdmUgcmV0dXJuZWQgdGhl
IG1lbW9yeSB0byB0aGUgT1MgCitQYWdlQWxsb2NhdG9yU3ltYmlhbjo6UGFnZUFsbG9jYXRvclN5
bWJpYW4oKQoreyAgICAgICAgCisgICAgX19BU1NFUlRfQUxXQVlTKG1fcGFnZVNpemUgPT0gV1RG
OjpwYWdlU2l6ZSgpLCBVc2VyOjpQYW5pYyhLRXJyb3JTdHJpbmdQYWdlU2l6ZSwgbV9wYWdlU2l6
ZSkpOworICAgIAorICAgIFJDaHVuayBjaHVuazsKKyAgICBUSW50IGVycm9yID0gY2h1bmsuQ3Jl
YXRlRGlzY29ubmVjdGVkTG9jYWwoMCwgMCwgVEludChsYXJnZVJlc2VydmF0aW9uU2l6ZSkpOwor
ICAgIF9fQVNTRVJUX0FMV0FZUyhlcnJvciA9PSBLRXJyTm9uZSwgVXNlcjo6UGFuaWMoS0Vycm9y
U3RyaW5nQ2h1bmtDcmVhdGlvbiwgZXJyb3IpKTsKKyAgICAKKyAgICBtX2NodW5rV2l0aE1ldGEg
PSBuZXcgQ2h1bmtXaXRoTWV0YWRhdGEoY2h1bmsuSGFuZGxlKCkpOyAvLyB0YWtlcyBvd25lcnNo
aXAgb2YgY2h1bmsKIH0KIAotdm9pZCBPU0FsbG9jYXRvcjo6Y29tbWl0KHZvaWQqLCBzaXplX3Qs
IGJvb2wsIGJvb2wpCitQYWdlQWxsb2NhdG9yU3ltYmlhbjo6flBhZ2VBbGxvY2F0b3JTeW1iaWFu
KCkgCiB7CisgICAgZGVsZXRlIG1fY2h1bmtXaXRoTWV0YTsKIH0KIAotdm9pZCBPU0FsbG9jYXRv
cjo6ZGVjb21taXQodm9pZCosIHNpemVfdCkKKy8vIFJlc2VydmVzIGEgcmVnaW9uIGludGVybmFs
bHkgaW4gdGhlIGJpdG1hcAordm9pZCogUGFnZUFsbG9jYXRvclN5bWJpYW46OnJlc2VydmUoc2l6
ZV90IGJ5dGVzKSAKK3sgCisgICAgLy8gRmluZCBmaXJzdCBhdmFpbGFibGUgcmVnaW9uCisgICAg
Y29uc3Qgc2l6ZV90IG5QYWdlcyA9IGJ5dGVzIC8gbV9wYWdlU2l6ZTsKKyAgICBjb25zdCBpbnQ2
NF90IHN0YXJ0SWR4ID0gbV9tYXAuZmluZFJ1bk9mWmVyb3MoblBhZ2VzKTsKKworICAgIC8vIFBz
ZXVkbyBPT00KKyAgICBpZiAoc3RhcnRJZHggPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICAK
KyAgICBmb3IgKHNpemVfdCBpID0gc3RhcnRJZHg7IGkgPCBzdGFydElkeCArIG5QYWdlcyA7IGkr
KykKKyAgICAgICAgbV9tYXAuc2V0KGkpOworICAgIAorICAgIHJldHVybiBzdGF0aWNfY2FzdDx2
b2lkKj4oIG1fY2h1bmtXaXRoTWV0YS0+bV9iYXNlICsgKFRVaW50KShtX3BhZ2VTaXplICogc3Rh
cnRJZHgpICk7IAorfQorCisvLyBSZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiBhIHJlc2VydmUoKSBj
YWxsCit2b2lkIFBhZ2VBbGxvY2F0b3JTeW1iaWFuOjpyZWxlYXNlKHZvaWQqIGFkZHJlc3MsIHNp
emVfdCBieXRlcykKIHsKKyAgICBjb25zdCBzaXplX3Qgc3RhcnRJZHggPSAoc3RhdGljX2Nhc3Q8
Y2hhcio+KGFkZHJlc3MpIC0gbV9jaHVua1dpdGhNZXRhLT5tX2Jhc2UpIC8gbV9wYWdlU2l6ZTsK
KyAgICBjb25zdCBzaXplX3QgblBhZ2VzID0gYnl0ZXMgLyBtX3BhZ2VTaXplOworICAgIGZvciAo
c2l6ZV90IGkgPSBzdGFydElkeDsgaSA8IHN0YXJ0SWR4ICsgblBhZ2VzIDsgaSsrKQorICAgICAg
ICBtX21hcC5jbGVhcihpKTsKK30KKworLy8gQWN0dWFsbHkgY29tbWl0IG1lbW9yeSBmcm9tIHRo
ZSBPUywgYWZ0ZXIgYSBwcmV2aW91cyBjYWxsIHRvIHJlc2VydmUoKQorYm9vbCBQYWdlQWxsb2Nh
dG9yU3ltYmlhbjo6Y29tbWl0KHZvaWQqIGFkZHJlc3MsIHNpemVfdCBieXRlcykgCit7IAorICAg
IC8vIHNhbml0eSBjaGVjayB0aGF0IGJpdHMgd2VyZSBwcmV2aW91c2x5IHNldAorICAgIGNvbnN0
IHNpemVfdCBpZHggPSAoc3RhdGljX2Nhc3Q8Y2hhcio+KGFkZHJlc3MpIC0gbV9jaHVua1dpdGhN
ZXRhLT5tX2Jhc2UpIC8gbV9wYWdlU2l6ZTsKKyAgICBjb25zdCBzaXplX3QgblBhZ2VzID0gYnl0
ZXMgLyBtX3BhZ2VTaXplOworICAgIF9fQVNTRVJUX0FMV0FZUyhtX21hcC5nZXQoaWR4KSwgVXNl
cjo6UGFuaWMoS0Vycm9yU3RyaW5nSW50ZXJuYWxDb25zaXN0ZW5jeSwgaWR4KSk7CisgICAgX19B
U1NFUlRfQUxXQVlTKG1fbWFwLmdldChpZHgrblBhZ2VzLTEpLCBVc2VyOjpQYW5pYyhLRXJyb3JT
dHJpbmdJbnRlcm5hbENvbnNpc3RlbmN5LCBpZHgrblBhZ2VzLTEpKTsKKyAgICAKKyAgICBUSW50
IGVycm9yID0gbV9jaHVua1dpdGhNZXRhLT5Db21taXQoc3RhdGljX2Nhc3Q8Y2hhcio+KGFkZHJl
c3MpIC0gbV9jaHVua1dpdGhNZXRhLT5tX2Jhc2UsIGJ5dGVzKTsKKyAgICByZXR1cm4gKGVycm9y
ID09IEtFcnJOb25lKTsKK30KKworLy8gSW52ZXJzZSBvcGVyYXRpb24gb2YgY29tbWl0KCksIGEg
cmVsZWFzZSgpIHNob3VsZCBmb2xsb3cgbGF0ZXIKK2Jvb2wgUGFnZUFsbG9jYXRvclN5bWJpYW46
OmRlY29tbWl0KHZvaWQqIGFkZHJlc3MsIHNpemVfdCBieXRlcykgCit7IAorICAgIFRJbnQgZXJy
b3IgPSBtX2NodW5rV2l0aE1ldGEtPkRlY29tbWl0KHN0YXRpY19jYXN0PGNoYXIqPihhZGRyZXNz
KSAtIG1fY2h1bmtXaXRoTWV0YS0+bV9iYXNlLCBieXRlcyk7CisgICAgcmV0dXJuIChlcnJvciA9
PSBLRXJyTm9uZSk7IAogfQogCi12b2lkIE9TQWxsb2NhdG9yOjpyZWxlYXNlRGVjb21taXR0ZWQo
dm9pZCogYWRkcmVzcywgc2l6ZV90KQorYm9vbCBQYWdlQWxsb2NhdG9yU3ltYmlhbjo6Y29udGFp
bnMoY29uc3Qgdm9pZCogYWRkcmVzcykgY29uc3QKIHsKLSAgICBmYXN0RnJlZShhZGRyZXNzKTsK
KyAgICByZXR1cm4gbV9jaHVua1dpdGhNZXRhLT5jb250YWlucyhhZGRyZXNzKTsgICAgIAogfQog
CiB9IC8vIG5hbWVzcGFjZSBXVEYKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvUGFn
ZUFsbG9jYXRvclN5bWJpYW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
d3RmL1BhZ2VBbGxvY2F0b3JTeW1iaWFuLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd3RmL1BhZ2VBbGxvY2F0b3JTeW1iaWFuLmgJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIE5va2lhIENvcnBvcmF0aW9uIGFu
ZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVp
dGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBu
YW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0
aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwor
ICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUGFnZUFsbG9jYXRvclN5bWJpYW5f
aAorI2RlZmluZSBQYWdlQWxsb2NhdG9yU3ltYmlhbl9oCisKKyNpbmNsdWRlIDxlMzJzdGQuaD4K
KyNpbmNsdWRlIDx3dGYvQml0TWFwLmg+CisKK25hbWVzcGFjZSBXVEYgeyAKKworc2l6ZV90IHBh
Z2VTaXplKCk7CisKKy8vIENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIGFuIFJDaHVuaworY2xh
c3MgQ2h1bmtXaXRoTWV0YWRhdGEgOiBwdWJsaWMgUkNodW5rIHsKKyAgIAorcHVibGljOiAgIAor
ICAgIENodW5rV2l0aE1ldGFkYXRhKFRJbnQgaGFuZGxlKSAKKyAgICB7CisgICAgICAgIFNldEhh
bmRsZShoYW5kbGUpOworICAgICAgICAvLyBwcmV2ZW50IGtlcm5lbCBjYWxscyBieSBjYWNoaW5n
IHRoZXNlCisgICAgICAgIG1fYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KEJhc2UoKSk7
IAorICAgICAgICBtX21heFNpemUgPSBNYXhTaXplKCk7CisgICAgfQorICAgIAorICAgIH5DaHVu
a1dpdGhNZXRhZGF0YSgpIAorICAgIHsgCisgICAgICAgIERlY29tbWl0KDAsIG1fbWF4U2l6ZSk7
CisgICAgICAgIENsb3NlKCk7CisgICAgfQorICAgICAKKyAgICAvLyBjaGVja3MgaWYgYWRkcmVz
cyBpcyBpbiBjaHVuaydzIHZpcnR1YWwgYWRkcmVzcyBzcGFjZQorICAgIGJvb2wgY29udGFpbnMo
Y29uc3Qgdm9pZCogYWRkcmVzcykgY29uc3QgCisgICAgeworICAgICAgICByZXR1cm4gKHN0YXRp
Y19jYXN0PGNvbnN0IGNoYXIqPihhZGRyZXNzKSA+PSBtX2Jhc2UgJiYgc3RhdGljX2Nhc3Q8Y29u
c3QgY2hhcio+KGFkZHJlc3MpIDwgKG1fYmFzZSArIG1fbWF4U2l6ZSkpOyAgCisgICAgfQorICAg
IAorICAgIGNoYXIqIG1fYmFzZTsgCisgICAgc2l6ZV90IG1fbWF4U2l6ZTsgCisgICAgCit9Owor
CisvLyBTaXplIG9mIHRoZSBsYXJnZSB1cC1mcm9udCByZXNlcnZhdGlvbgorI2lmIGRlZmluZWQo
X19XSU5TX18pIAorLy8gRW11bGF0b3IgaGFzIGxpbWl0ZWQgdmlydHVhbCBhZGRyZXNzIHNwYWNl
Citjb25zdCBzaXplX3QgbGFyZ2VSZXNlcnZhdGlvblNpemUgPSA5NioxMDI0KjEwMjQ7CisjZWxz
ZQorLy8gSFcgaGFzIHBsZW50eSBvZiB2aXJ0dWFsIGFkZHJlc3NlcworY29uc3Qgc2l6ZV90IGxh
cmdlUmVzZXJ2YXRpb25TaXplID0gMjU2KjEwMjQqMTAyNDsKKyNlbmRpZgorCitjbGFzcyBQYWdl
QWxsb2NhdG9yU3ltYmlhbiB7IAorCitwdWJsaWM6ICAgICAKKyAgICBQYWdlQWxsb2NhdG9yU3lt
YmlhbigpOworICAgIH5QYWdlQWxsb2NhdG9yU3ltYmlhbigpOworICAgIAorICAgIHZvaWQqIHJl
c2VydmUoc2l6ZV90KTsKKyAgICB2b2lkIHJlbGVhc2Uodm9pZCosIHNpemVfdCk7CisgICAgYm9v
bCBjb21taXQodm9pZCosIHNpemVfdCk7CisgICAgYm9vbCBkZWNvbW1pdCh2b2lkKiwgc2l6ZV90
KTsKKyAgICAKKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IHZvaWQqKSBjb25zdDsgCisgICAgCitw
cml2YXRlOiAgICAgCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBtX3BhZ2VTaXplID0gNDA5Njsg
CisgICAgQ2h1bmtXaXRoTWV0YWRhdGEqIG1fY2h1bmtXaXRoTWV0YTsgCisgICAgQml0bWFwPGxh
cmdlUmVzZXJ2YXRpb25TaXplIC8gbV9wYWdlU2l6ZT4gbV9tYXA7CisgICAgCit9OworCit9IC8v
IG5hbWVzcGFjZSBXVEYKKworI2VuZGlmIC8vIFBhZ2VBbGxvY2F0b3JTeW1iaWFuX2gKKwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>83011</attachid>
            <date>2011-02-18 14:42:30 -0800</date>
            <delta_ts>2011-02-18 14:52:19 -0800</delta_ts>
            <desc>Fixed comments, better class and member names, minor indent fix</desc>
            <filename>51128_algo2_v7.patch</filename>
            <type>text/plain</type>
            <size>15848</size>
            <attacher name="Siddharth Mathur">s.mathur</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNzkwMzQpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDAgQEAK
KzIwMTEtMDItMTggIFNpZGRoYXJ0aCBNYXRodXIgIDxzaWRkaGFydGgubWF0aHVyQG5va2lhLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbU3lt
Ymlhbl0gT1NBbGxvY2F0b3IgaW1wbGVtZW50YXRpb24gZm9yIFN5bWJpYW4gT1MuIAorICAgICAg
ICBNYW5hZ2VzIGJvdGggZGF0YSBhbmQgY29kZSByZWdpb24gcmVxdWVzdHMuIFY4IGFuZCBTdW5z
cGlkZXIgdGVzdGVkCisgICAgICAgIE9LIHdpdGggaW50ZXJwcmV0ZXIuIE5vdCB0ZXN0ZWQgd2l0
aCBKU0MgSklUIHlldCBhcyBpdCBoYXMgdW5yZWxhdGVkCisgICAgICAgIGZhaWx1cmVzLiBBbHNv
IG5vIHRocmVhZCBzYWZldHkgeWV0LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NTExMjgKKworICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnByaTogcmVt
b3ZlZCBIQUwgbGlua2FnZQorICAgICAgICAqIHd0Zi9CaXRtYXAuaDoKKyAgICAgICAgKFdURjo6
OjpmaW5kUnVuT2ZaZXJvcyk6IGZpbmQgcnVuIG9mIHplcm9zIGluIGEgYml0bWFwLiBxdWljayBu
IGRpcnR5CisgICAgICAgICogd3RmL09TQWxsb2NhdG9yLmg6CisgICAgICAgIChXVEY6Ok9TQWxs
b2NhdG9yOjpkZWNvbW1pdEFuZFJlbGVhc2UpOiBkZWNvbW1pdCBleHBsaWNpdGx5IAorICAgICAg
ICAqIHd0Zi9PU0FsbG9jYXRvclN5bWJpYW4uY3BwOiBJbXBsLiBvZiBPU0FsbG9jYXRvciBpbnRl
cmZhY2UgCisgICAgICAgIChXVEY6OmFsbG9jYXRlQ29kZUNodW5rKTogdXRpbGl0eSBmb3IgY29k
ZSBjaHVua3MKKyAgICAgICAgKFdURjo6ZGVhbGxvY2F0ZUNvZGVDaHVuayk6IHV0aWxpdHkgZm9y
IGNvZGUgY2h1bmtzCisgICAgICAgIChXVEY6OmRhdGFBbGxvY2F0b3JJbnN0YW5jZSk6IGdldHRl
ciBmb3IgZGF0YSBhbGxvY2F0b3IgaW5zdGFuY2UKKyAgICAgICAgKFdURjo6T1NBbGxvY2F0b3I6
OnJlc2VydmVVbmNvbW1pdHRlZCk6CisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpyZWxlYXNl
RGVjb21taXR0ZWQpOgorICAgICAgICAoV1RGOjpPU0FsbG9jYXRvcjo6Y29tbWl0KToKKyAgICAg
ICAgKFdURjo6T1NBbGxvY2F0b3I6OmRlY29tbWl0KToKKyAgICAgICAgKFdURjo6T1NBbGxvY2F0
b3I6OnJlc2VydmVBbmRDb21taXQpOgorICAgICAgICAoV1RGOjpQYWdlQWxsb2NhdG9yU3ltYmlh
bjo6UGFnZUFsbG9jYXRvclN5bWJpYW4pOiBtYXBzIHJlcXVlc3RzIAorICAgICAgICB0byBvbmUg
dW5kZXJseWluZyBTeW1iaWFuIGNodW5rCisgICAgICAgIChXVEY6OlBhZ2VBbGxvY2F0b3JTeW1i
aWFuOjp+UGFnZUFsbG9jYXRvclN5bWJpYW4pOgorICAgICAgICAoV1RGOjpQYWdlQWxsb2NhdG9y
U3ltYmlhbjo6cmVzZXJ2ZSk6CisgICAgICAgIChXVEY6OlBhZ2VBbGxvY2F0b3JTeW1iaWFuOjpy
ZWxlYXNlKToKKyAgICAgICAgKFdURjo6UGFnZUFsbG9jYXRvclN5bWJpYW46OmNvbW1pdCk6Cisg
ICAgICAgIChXVEY6OlBhZ2VBbGxvY2F0b3JTeW1iaWFuOjpkZWNvbW1pdCk6CisgICAgICAgIChX
VEY6OlBhZ2VBbGxvY2F0b3JTeW1iaWFuOjpjb250YWlucyk6CisgICAgICAgICogd3RmL1BhZ2VB
bGxvY2F0b3JTeW1iaWFuLmg6IEFkZGVkLgorICAgICAgICAoV1RGOjpTeW1iaWFuQ2h1bms6OlN5
bWJpYW5DaHVuayk6IHdyYXBwZXIgYXJvdW5kIFJDaHVuayAgCisgICAgICAgIChXVEY6OlN5bWJp
YW5DaHVuazo6flN5bWJpYW5DaHVuayk6CisgICAgICAgIChXVEY6OlN5bWJpYW5DaHVuazo6Y29u
dGFpbnMpOgorICAgICAgICAKIDIwMTEtMDItMTggIFlhZWwgQWhhcm9uICA8eWFlbC5haGFyb25A
bm9raWEuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhdmUgSHlhdHQuCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJpCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcmkJKHJldmlzaW9uIDc5MDI5KQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnByaQkod29ya2luZyBjb3B5KQpA
QCAtNDksMTIgKzQ5LDYgQEAgc3ltYmlhbiB7CiAgICAgSU5DTFVERVBBVEggPSAkJEpBVkFTQ1JJ
UFRDT1JFX0lOQ0xVREVQQVRIICQkSU5DTFVERVBBVEgKIH0KIAotc3ltYmlhbjogewotICAgIExJ
QlMgKz0gLWxoYWwKLSAgICAjIEZvciBoYWwuaAotICAgIElOQ0xVREVQQVRIICo9ICQkTVdfTEFZ
RVJfU1lTVEVNSU5DTFVERQotfQotCiB3aW4zMi0qOiBERUZJTkVTICs9IF9IQVNfVFIxPTAKIAog
REVGSU5FUyArPSBCVUlMRElOR19KYXZhU2NyaXB0Q29yZSBCVUlMRElOR19XVEYKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvQml0bWFwLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL3d0Zi9CaXRtYXAuaAkocmV2aXNpb24gNzkwMjkpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd3RmL0JpdG1hcC5oCSh3b3JraW5nIGNvcHkpCkBAIC00MCw2ICs0MCw3IEBA
IHB1YmxpYzoKICAgICBzaXplX3QgbmV4dFBvc3NpYmx5VW5zZXQoc2l6ZV90KSBjb25zdDsKICAg
ICB2b2lkIGNsZWFyKHNpemVfdCk7CiAgICAgdm9pZCBjbGVhckFsbCgpOworICAgIGludDY0X3Qg
ZmluZFJ1bk9mWmVyb3Moc2l6ZV90KSBjb25zdDsKICAgICBzaXplX3QgY291bnQoc2l6ZV90ID0g
MCkgY29uc3Q7CiAgICAgc2l6ZV90IGlzRW1wdHkoKSBjb25zdDsKICAgICBzaXplX3QgaXNGdWxs
KCkgY29uc3Q7CkBAIC0xMDcsNiArMTA4LDI2IEBAIGlubGluZSBzaXplX3QgQml0bWFwPHNpemU+
OjpuZXh0UG9zc2libHkKIH0KIAogdGVtcGxhdGU8c2l6ZV90IHNpemU+CitpbmxpbmUgaW50NjRf
dCBCaXRtYXA8c2l6ZT46OmZpbmRSdW5PZlplcm9zKHNpemVfdCBydW5MZW5ndGgpIGNvbnN0Cit7
CisgICAgaWYgKCFydW5MZW5ndGgpIAorICAgICAgICAgICAgcnVuTGVuZ3RoID0gMTsgCisgICAg
IAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDw9IChzaXplIC0gcnVuTGVuZ3RoKSA7IGkrKykg
eworICAgICAgICBib29sIGZvdW5kID0gdHJ1ZTsgCisgICAgICAgIGZvciAoc2l6ZV90IGogPSBp
OyBqIDw9IChpICsgcnVuTGVuZ3RoIC0gMSkgOyBqKyspIHsgCisgICAgICAgICAgICBpZiAoZ2V0
KGopKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsgCisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kKSAgCisg
ICAgICAgICAgICByZXR1cm4gaTsgCisgICAgfQorICAgIHJldHVybiAtMTsKK30KKwordGVtcGxh
dGU8c2l6ZV90IHNpemU+CiBpbmxpbmUgc2l6ZV90IEJpdG1hcDxzaXplPjo6Y291bnQoc2l6ZV90
IHN0YXJ0KSBjb25zdAogewogICAgIHNpemVfdCByZXN1bHQgPSAwOwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL3d0Zi9PU0FsbG9jYXRvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3IuaAkocmV2aXNpb24gNzkwMjkpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvd3RmL09TQWxsb2NhdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTc3LDkg
Kzc3LDEwIEBAIGlubGluZSB2b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZUFuZENvbW0KIGlubGlu
ZSB2b2lkIE9TQWxsb2NhdG9yOjpkZWNvbW1pdEFuZFJlbGVhc2Uodm9pZCogcmVsZWFzZUJhc2Us
IHNpemVfdCByZWxlYXNlU2l6ZSwgdm9pZCogZGVjb21taXRCYXNlLCBzaXplX3QgZGVjb21taXRT
aXplKQogewogICAgIEFTU0VSVChkZWNvbW1pdEJhc2UgPj0gcmVsZWFzZUJhc2UgJiYgKHN0YXRp
Y19jYXN0PGNoYXIqPihkZWNvbW1pdEJhc2UpICsgZGVjb21taXRTaXplKSA8PSAoc3RhdGljX2Nh
c3Q8Y2hhcio+KHJlbGVhc2VCYXNlKSArIHJlbGVhc2VTaXplKSk7Ci0jaWYgT1MoV0lOQ0UpCisj
aWYgT1MoV0lOQ0UpIHx8IE9TKFNZTUJJQU4pCiAgICAgLy8gT24gbW9zdCBwbGF0Zm9ybXMgd2Ug
Y2FuIGFjdHVhbGx5IHNraXAgdGhpcyBmaW5hbCBkZWNvbW1pdDsgcmVsZWFzaW5nIHRoZSBWTSB3
aWxsCiAgICAgLy8gaW1wbGljaXRseSBkZWNvbW1pdCBhbnkgcGh5c2ljYWwgbWVtb3J5IGluIHRo
ZSByZWdpb24uIFRoaXMgaXMgbm90IHRydWUgb24gV0lOQ0UuCisgICAgLy8gT24gU3ltYmlhbiwg
dGhpcyBtYWtlcyBpbXBsZW1lbnRhdGlvbiBzaW1wbGVyIGFuZCBiZXR0ZXIgYWxpZ25lZCB3aXRo
IHRoZSBSQ2h1bmsgQVBJCiAgICAgZGVjb21taXQoZGVjb21taXRCYXNlLCBkZWNvbW1pdFNpemUp
OwogI2Vsc2UKICAgICBVTlVTRURfUEFSQU0oZGVjb21taXRCYXNlKTsKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3JTeW1iaWFuLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL09TQWxsb2NhdG9yU3ltYmlhbi5jcHAJKHJldmlzaW9u
IDc5MDI5KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9PU0FsbG9jYXRvclN5bWJpYW4u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykg
MjAxMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTEgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLiBBbGwgcmln
aHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yNiwzMSAr
MjcsMTc2IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiT1NBbGxvY2F0b3IuaCIK
IAotI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9jLmg+CisjaW5jbHVkZSAiUGFnZUFsbG9jYXRvclN5
bWJpYW4uaCIKIAogbmFtZXNwYWNlIFdURiB7CiAKLXZvaWQqIE9TQWxsb2NhdG9yOjpyZXNlcnZl
VW5jb21taXR0ZWQoc2l6ZV90IGJ5dGVzLCBVc2FnZSwgYm9vbCwgYm9vbCkKKy8vIEFycmF5IHRv
IHN0b3JlIGNvZGUgY2h1bmtzIHVzZWQgYnkgSklUIGVuZ2luZShzKQorc3RhdGljIFJQb2ludGVy
QXJyYXk8U3ltYmlhbkNodW5rPiBjb2RlQ2h1bmtzQ29udGFpbmVyOworCisvLyBUaGUgc2luZ2xl
dG9uIGRhdGEgYWxsb2NhdG9yIChub24gY29kZSkKK3N0YXRpYyBQYWdlQWxsb2NhdG9yU3ltYmlh
biBkYXRhQWxsb2NhdG9yOworCitfTElUKEtFcnJvclN0cmluZ0ludGVybmFsQ29uc2lzdGVuY3ks
ICJPU0FsbG9jYXRvcjpDb25zaXN0ZW5jeUVycm9yIik7CitfTElUKEtFcnJvclN0cmluZ0NodW5r
Q3JlYXRpb24sICJPU0FsbG9jYXRvcjpDaHVua0luaXRFcnJvciIpOworX0xJVChLRXJyb3JTdHJp
bmdQYWdlU2l6ZSwgIk9TQWxsb2NhdG9yOldyb25nUGFnZVNpemUiKTsKKworLy8gTWFrZXMgYSBu
ZXcgY29kZSBjaHVuayBmb3IgYSBKSVQgZW5naW5lIHdpdGggZXZlcnl0aGluZyBpbiBjb21taXR0
ZWQgc3RhdGUKK3N0YXRpYyB2b2lkKiBhbGxvY2F0ZUNvZGVDaHVuayhzaXplX3QgYnl0ZXMpIAor
eworICAgIFJDaHVuayBjOyAKKyAgICBUSW50IGVycm9yID0gYy5DcmVhdGVMb2NhbENvZGUoYnl0
ZXMsIGJ5dGVzKTsKKyAgICBfX0FTU0VSVF9BTFdBWVMoZXJyb3IgPT0gS0Vyck5vbmUsIFVzZXI6
OlBhbmljKEtFcnJvclN0cmluZ0NodW5rQ3JlYXRpb24sIGVycm9yKSk7CisgICAKKyAgICBjb2Rl
Q2h1bmtzQ29udGFpbmVyLkFwcGVuZChuZXcgU3ltYmlhbkNodW5rKGMuSGFuZGxlKCkpKTsgCisg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PHZvaWQqPihjLkJhc2UoKSk7IAorfQorICAgCisvLyBGcmVl
cyB0aGUgX2VudGlyZV8gY29kZSBjaHVuayBpbiB3aGljaCB0aGlzIGFkZHJlc3MgcmVzaWRlcy4g
CitzdGF0aWMgYm9vbCBkZWFsbG9jYXRlQ29kZUNodW5rKHZvaWQqIGFkZHJlc3MpIAoreyAgICAg
CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOyAKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvZGVD
aHVua3NDb250YWluZXIuQ291bnQoKTsgaSsrKSB7IAorICAgICAgICBTeW1iaWFuQ2h1bmsqIHAg
PSBjb2RlQ2h1bmtzQ29udGFpbmVyW2ldOworICAgICAgICBpZiAocCAmJiBwLT5jb250YWlucyhh
ZGRyZXNzKSkgeyAKKyAgICAgICAgICAgIGNvZGVDaHVua3NDb250YWluZXIuUmVtb3ZlKGkpOwor
ICAgICAgICAgICAgZGVsZXRlIHA7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAg
IH0KKyAgICB9CisgICAgcmV0dXJuIGZvdW5kOyAKK30KKworLy8gUmV0dXJuIHRoZSAoc2luZ2xl
dG9uKSBvYmplY3QgdGhhdCBtYW5hZ2VzIGFsbCBub24tY29kZSBWTSBvcGVyYXRpb25zCitzdGF0
aWMgUGFnZUFsbG9jYXRvclN5bWJpYW4qIGRhdGFBbGxvY2F0b3JJbnN0YW5jZSgpIAoreworICAg
IHJldHVybiAmZGF0YUFsbG9jYXRvcjsgCit9CisKKy8vIFJlc2VydmUgbWVtb3J5IGFuZCByZXR1
cm4gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCit2b2lkKiBPU0FsbG9jYXRvcjo6cmVz
ZXJ2ZVVuY29tbWl0dGVkKHNpemVfdCByZXNlcnZhdGlvblNpemUsIFVzYWdlIHVzYWdlLCBib29s
ICwgYm9vbCBleGVjdXRhYmxlKSAKK3sKKyAgICB2b2lkKiBiYXNlID0gMDsgCisgICAgaWYgKGV4
ZWN1dGFibGUpIAorICAgICAgICBiYXNlID0gYWxsb2NhdGVDb2RlQ2h1bmsocmVzZXJ2YXRpb25T
aXplKTsKKyAgICBlbHNlCisgICAgICAgIGJhc2UgPSBkYXRhQWxsb2NhdG9ySW5zdGFuY2UoKS0+
cmVzZXJ2ZShyZXNlcnZhdGlvblNpemUpOworICAgIHJldHVybiBiYXNlOyAKK30KKworLy8gSW52
ZXJzZSBvcGVyYXRpb24gb2YgcmVzZXJ2ZVVuY29tbWl0dGVkKCkKK3ZvaWQgT1NBbGxvY2F0b3I6
OnJlbGVhc2VEZWNvbW1pdHRlZCh2b2lkKiBwYXJrZWRCYXNlLCBzaXplX3QgYnl0ZXMpIAogewot
ICAgIHJldHVybiBmYXN0TWFsbG9jKGJ5dGVzKTsKKyAgICBpZiAoZGF0YUFsbG9jYXRvckluc3Rh
bmNlKCktPmNvbnRhaW5zKHBhcmtlZEJhc2UpKSAKKyAgICAgICAgZGF0YUFsbG9jYXRvckluc3Rh
bmNlKCktPnJlbGVhc2UocGFya2VkQmFzZSwgYnl0ZXMpOworCisgICAgLy8gTk9PUCBmb3IgY29k
ZSBjaHVua3MgKEpJVCkgYmVjYXVzZSB3ZSByZWxlYXNlZCB0aGVtIGluIGRlY29tbWl0KCkKIH0K
IAotdm9pZCogT1NBbGxvY2F0b3I6OnJlc2VydmVBbmRDb21taXQoc2l6ZV90IGJ5dGVzLCBVc2Fn
ZSwgYm9vbCwgYm9vbCkKKy8vIENvbW1pdCB3aGF0IHdhcyBwcmV2aW91c2x5IHJlc2VydmVkIHZp
YSByZXNlcnZlVW5jb21taXR0ZWQoKQordm9pZCBPU0FsbG9jYXRvcjo6Y29tbWl0KHZvaWQqIGFk
ZHJlc3MsIHNpemVfdCBieXRlcywgYm9vbCwgYm9vbCBleGVjdXRhYmxlKSAKIHsKLSAgICByZXR1
cm4gZmFzdE1hbGxvYyhieXRlcyk7CisgICAgLy8gRm9yIGNvZGUgY2h1bmtzLCB3ZSBjb21taXQg
KGVhcmx5KSBpbiByZXNlcnZlVW5jb21taXR0ZWQoKSwgc28gTk9PUAorICAgIC8vIEZvciBkYXRh
IHJlZ2lvbnMsIGRvIHJlYWwgd29yaworICAgIGlmICghZXhlY3V0YWJsZSkgCisgICAgICAgIGRh
dGFBbGxvY2F0b3JJbnN0YW5jZSgpLT5jb21taXQoYWRkcmVzcywgYnl0ZXMpOworfQorCit2b2lk
IE9TQWxsb2NhdG9yOjpkZWNvbW1pdCh2b2lkKiBhZGRyZXNzLCBzaXplX3QgYnl0ZXMpIAoreyAK
KyAgICBpZiAoZGF0YUFsbG9jYXRvckluc3RhbmNlKCktPmNvbnRhaW5zKGFkZHJlc3MpKQorICAg
ICAgICBkYXRhQWxsb2NhdG9ySW5zdGFuY2UoKS0+ZGVjb21taXQoYWRkcmVzcywgYnl0ZXMpOwor
ICAgIGVsc2UKKyAgICAgICAgZGVhbGxvY2F0ZUNvZGVDaHVuayhhZGRyZXNzKTsgLy8gZm9yIGNv
ZGUgY2h1bmssIGRlY29tbWl0IEFORCByZWxlYXNlICAgIAorfQorICAgIAordm9pZCogT1NBbGxv
Y2F0b3I6OnJlc2VydmVBbmRDb21taXQoc2l6ZV90IGJ5dGVzLCBVc2FnZSB1c2FnZSwgYm9vbCB3
cml0YWJsZSwgYm9vbCBleGVjdXRhYmxlKQoreyAKKyAgICB2b2lkKiBiYXNlID0gcmVzZXJ2ZVVu
Y29tbWl0dGVkKGJ5dGVzLCB1c2FnZSwgd3JpdGFibGUsIGV4ZWN1dGFibGUpOworICAgIGNvbW1p
dChiYXNlLCBieXRlcywgd3JpdGFibGUsIGV4ZWN1dGFibGUpOworICAgIHJldHVybiBiYXNlOwor
fQorCisKKy8vIFRoZSBQYWdlQWxsb2NhdG9yU3ltYmlhbiBjbGFzcyBoZWxwcyBtYXAgT1NBbGxv
Y2F0b3IgY2FsbHMgZm9yIHJlc2VydmUvY29tbWl0L2RlY29tbWl0CisvLyB0byBhIHNpbmdsZSBs
YXJnZSBTeW1iaWFuIGNodW5rLiBPbmx5IHdvcmtzIHdpdGggbXVsdGlwbGVzIG9mIHBhZ2Ugc2l6
ZSwgYW5kIGFzIGEgY29yb2xsYXJ5IAorLy8gYWxsIGFkZHJlc3NlcyBhY2NlcHRlZCBvciByZXR1
cm5lZCBieSBpdCBhcmUgYWxzbyBwYWdlLXNpemVkIGFsaWduZWQuIAorLy8gRGVzaWduIG5vdGVz
OiAKKy8vIC0gV2UgaW5pdGlhbGl6ZSBhIGNodW5rIHVwLWZyb250IHdpdGggYSBsYXJnZSByZXNl
cnZhdGlvbiBzaXplCisvLyAtIFRoZSBlbnRpcmUgcmVzZXJ2YXRpb24gcmVzZXJ2ZSBpcyBsb2dp
Y2FsbHkgZGl2aWRlZCBpbnRvIHBhZ2VTaXplZCBibG9ja3MgKDRLIG9uIFN5bWJpYW4pIAorLy8g
LSBUaGUgbWFwIG1haW50YWlucyAxIGJpdCBmb3IgZWFjaCBvZiB0aGUgNEstc2l6ZWQgcmVnaW9u
IGluIG91ciBhZGRyZXNzIHNwYWNlCisvLyAtIE9TQWxsb2NhdG9yOjpyZXNlcnZlVW5jb21taXR0
ZWQoKSByZXF1ZXN0cyBsZWFkIHRvIDEgb3IgbW9yZSBiaXRzIGJlaW5nIHNldCBpbiBtYXAgCisv
LyAgIHRvIGluZGljYXRlIGludGVybmFsbHkgcmVzZXJ2ZWQgc3RhdGUuIFRoZSBWTSBhZGRyZXNz
IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGJpdCBpcyByZXR1cm5lZC4gCisvLyAtIE9TQWxs
b2NhdG9yOjpjb21taXQoKSBhY3R1YWxseSBjYWxscyBSQ2h1bmsuY29tbWl0KCkgYW5kIGNvbW1p
dHMgKmFsbCBvciBwYXJ0KiBvZiB0aGUgcmVnaW9uIAorLy8gICByZXNlcnZlZCB2aWEgcmVzZXJ2
ZVVuY29tbWl0dGVkKCkgcHJldmlvdXNseS4gCisvLyAtIE9TQWxsb2NhdG9yOjpkZWNvbW1pdCgp
IGNhbGxzIFJDaHVuay5kZWNvbW1pdCgpIAorLy8gLSBPU0FsbG9jYXRvcjo6cmVsZWFzZURlY29t
bWl0dGVkKCkgdW5wYXJrcyBhbGwgdGhlIGJpdHMgaW4gdGhlIG1hcCwgYnV0IHRydXN0cyB0aGF0
IGEgcHJldmlvdXNseQorLy8gICBjYWxsIHRvIGRlY29tbWl0KCkgd291bGQgaGF2ZSByZXR1cm5l
ZCB0aGUgbWVtb3J5IHRvIHRoZSBPUyAKK1BhZ2VBbGxvY2F0b3JTeW1iaWFuOjpQYWdlQWxsb2Nh
dG9yU3ltYmlhbigpCit7ICAgICAgICAKKyAgICBfX0FTU0VSVF9BTFdBWVMobV9wYWdlU2l6ZSA9
PSBXVEY6OnBhZ2VTaXplKCksIFVzZXI6OlBhbmljKEtFcnJvclN0cmluZ1BhZ2VTaXplLCBtX3Bh
Z2VTaXplKSk7CisgICAgCisgICAgUkNodW5rIGNodW5rOworICAgIFRJbnQgZXJyb3IgPSBjaHVu
ay5DcmVhdGVEaXNjb25uZWN0ZWRMb2NhbCgwLCAwLCBUSW50KGxhcmdlUmVzZXJ2YXRpb25TaXpl
KSk7CisgICAgX19BU1NFUlRfQUxXQVlTKGVycm9yID09IEtFcnJOb25lLCBVc2VyOjpQYW5pYyhL
RXJyb3JTdHJpbmdDaHVua0NyZWF0aW9uLCBlcnJvcikpOworICAgIAorICAgIG1fY2h1bmsgPSBu
ZXcgU3ltYmlhbkNodW5rKGNodW5rLkhhbmRsZSgpKTsgLy8gdGFrZXMgb3duZXJzaGlwIG9mIGNo
dW5rCiB9CiAKLXZvaWQgT1NBbGxvY2F0b3I6OmNvbW1pdCh2b2lkKiwgc2l6ZV90LCBib29sLCBi
b29sKQorUGFnZUFsbG9jYXRvclN5bWJpYW46On5QYWdlQWxsb2NhdG9yU3ltYmlhbigpIAogewor
ICAgIGRlbGV0ZSBtX2NodW5rOwogfQogCi12b2lkIE9TQWxsb2NhdG9yOjpkZWNvbW1pdCh2b2lk
Kiwgc2l6ZV90KQorLy8gUmVzZXJ2ZXMgYSByZWdpb24gaW50ZXJuYWxseSBpbiB0aGUgYml0bWFw
Cit2b2lkKiBQYWdlQWxsb2NhdG9yU3ltYmlhbjo6cmVzZXJ2ZShzaXplX3QgYnl0ZXMpIAoreyAK
KyAgICAvLyBGaW5kIGZpcnN0IGF2YWlsYWJsZSByZWdpb24KKyAgICBjb25zdCBzaXplX3QgblBh
Z2VzID0gYnl0ZXMgLyBtX3BhZ2VTaXplOworICAgIGNvbnN0IGludDY0X3Qgc3RhcnRJZHggPSBt
X21hcC5maW5kUnVuT2ZaZXJvcyhuUGFnZXMpOworCisgICAgLy8gUHNldWRvIE9PTQorICAgIGlm
IChzdGFydElkeCA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIGZvciAoc2l6ZV90
IGkgPSBzdGFydElkeDsgaSA8IHN0YXJ0SWR4ICsgblBhZ2VzIDsgaSsrKQorICAgICAgICBtX21h
cC5zZXQoaSk7CisgICAgCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHZvaWQqPiggbV9jaHVuay0+
bV9iYXNlICsgKFRVaW50KShtX3BhZ2VTaXplICogc3RhcnRJZHgpICk7IAorfQorCisvLyBSZXZl
cnNlcyB0aGUgZWZmZWN0cyBvZiBhIHJlc2VydmUoKSBjYWxsCit2b2lkIFBhZ2VBbGxvY2F0b3JT
eW1iaWFuOjpyZWxlYXNlKHZvaWQqIGFkZHJlc3MsIHNpemVfdCBieXRlcykKIHsKKyAgICBjb25z
dCBzaXplX3Qgc3RhcnRJZHggPSAoc3RhdGljX2Nhc3Q8Y2hhcio+KGFkZHJlc3MpIC0gbV9jaHVu
ay0+bV9iYXNlKSAvIG1fcGFnZVNpemU7CisgICAgY29uc3Qgc2l6ZV90IG5QYWdlcyA9IGJ5dGVz
IC8gbV9wYWdlU2l6ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gc3RhcnRJZHg7IGkgPCBzdGFydElk
eCArIG5QYWdlcyA7IGkrKykKKyAgICAgICAgbV9tYXAuY2xlYXIoaSk7Cit9CisKKy8vIEFjdHVh
bGx5IGNvbW1pdCBtZW1vcnkgZnJvbSB0aGUgT1MsIGFmdGVyIGEgcHJldmlvdXMgY2FsbCB0byBy
ZXNlcnZlKCkKK2Jvb2wgUGFnZUFsbG9jYXRvclN5bWJpYW46OmNvbW1pdCh2b2lkKiBhZGRyZXNz
LCBzaXplX3QgYnl0ZXMpIAoreyAKKyAgICAvLyBzYW5pdHkgY2hlY2sgdGhhdCBiaXRzIHdlcmUg
cHJldmlvdXNseSBzZXQKKyAgICBjb25zdCBzaXplX3QgaWR4ID0gKHN0YXRpY19jYXN0PGNoYXIq
PihhZGRyZXNzKSAtIG1fY2h1bmstPm1fYmFzZSkgLyBtX3BhZ2VTaXplOworICAgIGNvbnN0IHNp
emVfdCBuUGFnZXMgPSBieXRlcyAvIG1fcGFnZVNpemU7CisgICAgX19BU1NFUlRfQUxXQVlTKG1f
bWFwLmdldChpZHgpLCBVc2VyOjpQYW5pYyhLRXJyb3JTdHJpbmdJbnRlcm5hbENvbnNpc3RlbmN5
LCBpZHgpKTsKKyAgICBfX0FTU0VSVF9BTFdBWVMobV9tYXAuZ2V0KGlkeCtuUGFnZXMtMSksIFVz
ZXI6OlBhbmljKEtFcnJvclN0cmluZ0ludGVybmFsQ29uc2lzdGVuY3ksIGlkeCtuUGFnZXMtMSkp
OworICAgIAorICAgIFRJbnQgZXJyb3IgPSBtX2NodW5rLT5Db21taXQoc3RhdGljX2Nhc3Q8Y2hh
cio+KGFkZHJlc3MpIC0gbV9jaHVuay0+bV9iYXNlLCBieXRlcyk7CisgICAgcmV0dXJuIChlcnJv
ciA9PSBLRXJyTm9uZSk7Cit9CisKKy8vIEludmVyc2Ugb3BlcmF0aW9uIG9mIGNvbW1pdCgpLCBh
IHJlbGVhc2UoKSBzaG91bGQgZm9sbG93IGxhdGVyCitib29sIFBhZ2VBbGxvY2F0b3JTeW1iaWFu
OjpkZWNvbW1pdCh2b2lkKiBhZGRyZXNzLCBzaXplX3QgYnl0ZXMpIAoreyAKKyAgICBUSW50IGVy
cm9yID0gbV9jaHVuay0+RGVjb21taXQoc3RhdGljX2Nhc3Q8Y2hhcio+KGFkZHJlc3MpIC0gbV9j
aHVuay0+bV9iYXNlLCBieXRlcyk7CisgICAgcmV0dXJuIChlcnJvciA9PSBLRXJyTm9uZSk7IAog
fQogCi12b2lkIE9TQWxsb2NhdG9yOjpyZWxlYXNlRGVjb21taXR0ZWQodm9pZCogYWRkcmVzcywg
c2l6ZV90KQorYm9vbCBQYWdlQWxsb2NhdG9yU3ltYmlhbjo6Y29udGFpbnMoY29uc3Qgdm9pZCog
YWRkcmVzcykgY29uc3QKIHsKLSAgICBmYXN0RnJlZShhZGRyZXNzKTsKKyAgICByZXR1cm4gbV9j
aHVuay0+Y29udGFpbnMoYWRkcmVzcyk7ICAgICAKIH0KIAogfSAvLyBuYW1lc3BhY2UgV1RGCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL1BhZ2VBbGxvY2F0b3JTeW1iaWFuLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9QYWdlQWxsb2NhdG9yU3ltYmlh
bi5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9QYWdlQWxsb2Nh
dG9yU3ltYmlhbi5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWll
cykKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAx
LiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUg
Q29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29u
dHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJp
dmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAor
ICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaWZuZGVmIFBhZ2VBbGxvY2F0b3JTeW1iaWFuX2gKKyNkZWZpbmUgUGFnZUFsbG9jYXRv
clN5bWJpYW5faAorCisjaW5jbHVkZSA8ZTMyc3RkLmg+CisjaW5jbHVkZSA8d3RmL0JpdE1hcC5o
PgorCituYW1lc3BhY2UgV1RGIHsgCisKK3NpemVfdCBwYWdlU2l6ZSgpOworCisvLyBDb252ZW5p
ZW5jZSB3cmFwcGVyIGFyb3VuZCBhbiBSQ2h1bmsKK2NsYXNzIFN5bWJpYW5DaHVuayA6IHB1Ymxp
YyBSQ2h1bmsgeworICAgCitwdWJsaWM6ICAgCisgICAgU3ltYmlhbkNodW5rKFRJbnQgaGFuZGxl
KSAKKyAgICB7CisgICAgICAgIFNldEhhbmRsZShoYW5kbGUpOworICAgICAgICAvLyBwcmV2ZW50
IGtlcm5lbCBjYWxscyBieSBjYWNoaW5nIHRoZXNlCisgICAgICAgIG1fYmFzZSA9IHJlaW50ZXJw
cmV0X2Nhc3Q8Y2hhcio+KEJhc2UoKSk7IAorICAgICAgICBtX21heFNpemUgPSBNYXhTaXplKCk7
CisgICAgfQorICAgIAorICAgIH5TeW1iaWFuQ2h1bmsoKSAKKyAgICB7IAorICAgICAgICBEZWNv
bW1pdCgwLCBtX21heFNpemUpOworICAgICAgICBDbG9zZSgpOworICAgIH0KKyAgICAgCisgICAg
Ly8gY2hlY2tzIGlmIGFkZHJlc3MgaXMgaW4gY2h1bmsncyB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UK
KyAgICBib29sIGNvbnRhaW5zKGNvbnN0IHZvaWQqIGFkZHJlc3MpIGNvbnN0IAorICAgIHsKKyAg
ICAgICAgcmV0dXJuIChzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oYWRkcmVzcykgPj0gbV9iYXNl
ICYmIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihhZGRyZXNzKSA8IChtX2Jhc2UgKyBtX21heFNp
emUpKTsgIAorICAgIH0KKyAgICAKKyAgICBjaGFyKiBtX2Jhc2U7IAorICAgIHNpemVfdCBtX21h
eFNpemU7IAorICAgIAorfTsKKworLy8gU2l6ZSBvZiB0aGUgbGFyZ2UgdXAtZnJvbnQgcmVzZXJ2
YXRpb24KKyNpZiBkZWZpbmVkKF9fV0lOU19fKSAKKy8vIEVtdWxhdG9yIGhhcyBsaW1pdGVkIHZp
cnR1YWwgYWRkcmVzcyBzcGFjZQorY29uc3Qgc2l6ZV90IGxhcmdlUmVzZXJ2YXRpb25TaXplID0g
OTYqMTAyNCoxMDI0OworI2Vsc2UKKy8vIEhXIGhhcyBwbGVudHkgb2YgdmlydHVhbCBhZGRyZXNz
ZXMKK2NvbnN0IHNpemVfdCBsYXJnZVJlc2VydmF0aW9uU2l6ZSA9IDI1NioxMDI0KjEwMjQ7Cisj
ZW5kaWYKKworY2xhc3MgUGFnZUFsbG9jYXRvclN5bWJpYW4geyAKKworcHVibGljOiAgICAgCisg
ICAgUGFnZUFsbG9jYXRvclN5bWJpYW4oKTsKKyAgICB+UGFnZUFsbG9jYXRvclN5bWJpYW4oKTsK
KyAgICAKKyAgICB2b2lkKiByZXNlcnZlKHNpemVfdCk7CisgICAgdm9pZCByZWxlYXNlKHZvaWQq
LCBzaXplX3QpOworICAgIGJvb2wgY29tbWl0KHZvaWQqLCBzaXplX3QpOworICAgIGJvb2wgZGVj
b21taXQodm9pZCosIHNpemVfdCk7CisgICAgCisgICAgYm9vbCBjb250YWlucyhjb25zdCB2b2lk
KikgY29uc3Q7IAorICAgIAorcHJpdmF0ZTogICAgIAorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qg
bV9wYWdlU2l6ZSA9IDQwOTY7IAorICAgIFN5bWJpYW5DaHVuayogbV9jaHVuazsgCisgICAgQml0
bWFwPGxhcmdlUmVzZXJ2YXRpb25TaXplIC8gbV9wYWdlU2l6ZT4gbV9tYXA7CisgICAgCit9Owor
Cit9IC8vIG5hbWVzcGFjZSBXVEYKKworI2VuZGlmIC8vIFBhZ2VBbGxvY2F0b3JTeW1iaWFuX2gK
Kwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>83016</attachid>
            <date>2011-02-18 14:52:19 -0800</date>
            <delta_ts>2011-02-19 10:05:32 -0800</delta_ts>
            <desc>Indent fix (funny that style-checker doesn&apos;t catch it) </desc>
            <filename>51128_algo2_v8.patch</filename>
            <type>text/plain</type>
            <size>15844</size>
            <attacher name="Siddharth Mathur">s.mathur</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNzkwMzQpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDAgQEAK
KzIwMTEtMDItMTggIFNpZGRoYXJ0aCBNYXRodXIgIDxzaWRkaGFydGgubWF0aHVyQG5va2lhLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbU3lt
Ymlhbl0gT1NBbGxvY2F0b3IgaW1wbGVtZW50YXRpb24gZm9yIFN5bWJpYW4gT1MuIAorICAgICAg
ICBNYW5hZ2VzIGJvdGggZGF0YSBhbmQgY29kZSByZWdpb24gcmVxdWVzdHMuIFY4IGFuZCBTdW5z
cGlkZXIgdGVzdGVkCisgICAgICAgIE9LIHdpdGggaW50ZXJwcmV0ZXIuIE5vdCB0ZXN0ZWQgd2l0
aCBKU0MgSklUIHlldCBhcyBpdCBoYXMgdW5yZWxhdGVkCisgICAgICAgIGZhaWx1cmVzLiBBbHNv
IG5vIHRocmVhZCBzYWZldHkgeWV0LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NTExMjgKKworICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnByaTogcmVt
b3ZlZCBIQUwgbGlua2FnZQorICAgICAgICAqIHd0Zi9CaXRtYXAuaDoKKyAgICAgICAgKFdURjo6
OjpmaW5kUnVuT2ZaZXJvcyk6IGZpbmQgcnVuIG9mIHplcm9zIGluIGEgYml0bWFwLiBxdWljayBu
IGRpcnR5CisgICAgICAgICogd3RmL09TQWxsb2NhdG9yLmg6CisgICAgICAgIChXVEY6Ok9TQWxs
b2NhdG9yOjpkZWNvbW1pdEFuZFJlbGVhc2UpOiBkZWNvbW1pdCBleHBsaWNpdGx5IAorICAgICAg
ICAqIHd0Zi9PU0FsbG9jYXRvclN5bWJpYW4uY3BwOiBJbXBsLiBvZiBPU0FsbG9jYXRvciBpbnRl
cmZhY2UgCisgICAgICAgIChXVEY6OmFsbG9jYXRlQ29kZUNodW5rKTogdXRpbGl0eSBmb3IgY29k
ZSBjaHVua3MKKyAgICAgICAgKFdURjo6ZGVhbGxvY2F0ZUNvZGVDaHVuayk6IHV0aWxpdHkgZm9y
IGNvZGUgY2h1bmtzCisgICAgICAgIChXVEY6OmRhdGFBbGxvY2F0b3JJbnN0YW5jZSk6IGdldHRl
ciBmb3IgZGF0YSBhbGxvY2F0b3IgaW5zdGFuY2UKKyAgICAgICAgKFdURjo6T1NBbGxvY2F0b3I6
OnJlc2VydmVVbmNvbW1pdHRlZCk6CisgICAgICAgIChXVEY6Ok9TQWxsb2NhdG9yOjpyZWxlYXNl
RGVjb21taXR0ZWQpOgorICAgICAgICAoV1RGOjpPU0FsbG9jYXRvcjo6Y29tbWl0KToKKyAgICAg
ICAgKFdURjo6T1NBbGxvY2F0b3I6OmRlY29tbWl0KToKKyAgICAgICAgKFdURjo6T1NBbGxvY2F0
b3I6OnJlc2VydmVBbmRDb21taXQpOgorICAgICAgICAoV1RGOjpQYWdlQWxsb2NhdG9yU3ltYmlh
bjo6UGFnZUFsbG9jYXRvclN5bWJpYW4pOiBtYXBzIHJlcXVlc3RzIAorICAgICAgICB0byBvbmUg
dW5kZXJseWluZyBTeW1iaWFuIGNodW5rCisgICAgICAgIChXVEY6OlBhZ2VBbGxvY2F0b3JTeW1i
aWFuOjp+UGFnZUFsbG9jYXRvclN5bWJpYW4pOgorICAgICAgICAoV1RGOjpQYWdlQWxsb2NhdG9y
U3ltYmlhbjo6cmVzZXJ2ZSk6CisgICAgICAgIChXVEY6OlBhZ2VBbGxvY2F0b3JTeW1iaWFuOjpy
ZWxlYXNlKToKKyAgICAgICAgKFdURjo6UGFnZUFsbG9jYXRvclN5bWJpYW46OmNvbW1pdCk6Cisg
ICAgICAgIChXVEY6OlBhZ2VBbGxvY2F0b3JTeW1iaWFuOjpkZWNvbW1pdCk6CisgICAgICAgIChX
VEY6OlBhZ2VBbGxvY2F0b3JTeW1iaWFuOjpjb250YWlucyk6CisgICAgICAgICogd3RmL1BhZ2VB
bGxvY2F0b3JTeW1iaWFuLmg6IEFkZGVkLgorICAgICAgICAoV1RGOjpTeW1iaWFuQ2h1bms6OlN5
bWJpYW5DaHVuayk6IHdyYXBwZXIgYXJvdW5kIFJDaHVuayAgCisgICAgICAgIChXVEY6OlN5bWJp
YW5DaHVuazo6flN5bWJpYW5DaHVuayk6CisgICAgICAgIChXVEY6OlN5bWJpYW5DaHVuazo6Y29u
dGFpbnMpOgorICAgICAgICAKIDIwMTEtMDItMTggIFlhZWwgQWhhcm9uICA8eWFlbC5haGFyb25A
bm9raWEuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhdmUgSHlhdHQuCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJpCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcmkJKHJldmlzaW9uIDc5MDI5KQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnByaQkod29ya2luZyBjb3B5KQpA
QCAtNDksMTIgKzQ5LDYgQEAgc3ltYmlhbiB7CiAgICAgSU5DTFVERVBBVEggPSAkJEpBVkFTQ1JJ
UFRDT1JFX0lOQ0xVREVQQVRIICQkSU5DTFVERVBBVEgKIH0KIAotc3ltYmlhbjogewotICAgIExJ
QlMgKz0gLWxoYWwKLSAgICAjIEZvciBoYWwuaAotICAgIElOQ0xVREVQQVRIICo9ICQkTVdfTEFZ
RVJfU1lTVEVNSU5DTFVERQotfQotCiB3aW4zMi0qOiBERUZJTkVTICs9IF9IQVNfVFIxPTAKIAog
REVGSU5FUyArPSBCVUlMRElOR19KYXZhU2NyaXB0Q29yZSBCVUlMRElOR19XVEYKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvQml0bWFwLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL3d0Zi9CaXRtYXAuaAkocmV2aXNpb24gNzkwMjkpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd3RmL0JpdG1hcC5oCSh3b3JraW5nIGNvcHkpCkBAIC00MCw2ICs0MCw3IEBA
IHB1YmxpYzoKICAgICBzaXplX3QgbmV4dFBvc3NpYmx5VW5zZXQoc2l6ZV90KSBjb25zdDsKICAg
ICB2b2lkIGNsZWFyKHNpemVfdCk7CiAgICAgdm9pZCBjbGVhckFsbCgpOworICAgIGludDY0X3Qg
ZmluZFJ1bk9mWmVyb3Moc2l6ZV90KSBjb25zdDsKICAgICBzaXplX3QgY291bnQoc2l6ZV90ID0g
MCkgY29uc3Q7CiAgICAgc2l6ZV90IGlzRW1wdHkoKSBjb25zdDsKICAgICBzaXplX3QgaXNGdWxs
KCkgY29uc3Q7CkBAIC0xMDcsNiArMTA4LDI2IEBAIGlubGluZSBzaXplX3QgQml0bWFwPHNpemU+
OjpuZXh0UG9zc2libHkKIH0KIAogdGVtcGxhdGU8c2l6ZV90IHNpemU+CitpbmxpbmUgaW50NjRf
dCBCaXRtYXA8c2l6ZT46OmZpbmRSdW5PZlplcm9zKHNpemVfdCBydW5MZW5ndGgpIGNvbnN0Cit7
CisgICAgaWYgKCFydW5MZW5ndGgpIAorICAgICAgICBydW5MZW5ndGggPSAxOyAKKyAgICAgCisg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gKHNpemUgLSBydW5MZW5ndGgpIDsgaSsrKSB7Cisg
ICAgICAgIGJvb2wgZm91bmQgPSB0cnVlOyAKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IGk7IGog
PD0gKGkgKyBydW5MZW5ndGggLSAxKSA7IGorKykgeyAKKyAgICAgICAgICAgIGlmIChnZXQoaikp
IHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlOyAKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZm91bmQpICAKKyAgICAg
ICAgICAgIHJldHVybiBpOyAKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCit0ZW1wbGF0ZTxz
aXplX3Qgc2l6ZT4KIGlubGluZSBzaXplX3QgQml0bWFwPHNpemU+Ojpjb3VudChzaXplX3Qgc3Rh
cnQpIGNvbnN0CiB7CiAgICAgc2l6ZV90IHJlc3VsdCA9IDA7CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd3RmL09TQWxsb2NhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL3d0Zi9PU0FsbG9jYXRvci5oCShyZXZpc2lvbiA3OTAyOSkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtNzcsOSArNzcs
MTAgQEAgaW5saW5lIHZvaWQqIE9TQWxsb2NhdG9yOjpyZXNlcnZlQW5kQ29tbQogaW5saW5lIHZv
aWQgT1NBbGxvY2F0b3I6OmRlY29tbWl0QW5kUmVsZWFzZSh2b2lkKiByZWxlYXNlQmFzZSwgc2l6
ZV90IHJlbGVhc2VTaXplLCB2b2lkKiBkZWNvbW1pdEJhc2UsIHNpemVfdCBkZWNvbW1pdFNpemUp
CiB7CiAgICAgQVNTRVJUKGRlY29tbWl0QmFzZSA+PSByZWxlYXNlQmFzZSAmJiAoc3RhdGljX2Nh
c3Q8Y2hhcio+KGRlY29tbWl0QmFzZSkgKyBkZWNvbW1pdFNpemUpIDw9IChzdGF0aWNfY2FzdDxj
aGFyKj4ocmVsZWFzZUJhc2UpICsgcmVsZWFzZVNpemUpKTsKLSNpZiBPUyhXSU5DRSkKKyNpZiBP
UyhXSU5DRSkgfHwgT1MoU1lNQklBTikKICAgICAvLyBPbiBtb3N0IHBsYXRmb3JtcyB3ZSBjYW4g
YWN0dWFsbHkgc2tpcCB0aGlzIGZpbmFsIGRlY29tbWl0OyByZWxlYXNpbmcgdGhlIFZNIHdpbGwK
ICAgICAvLyBpbXBsaWNpdGx5IGRlY29tbWl0IGFueSBwaHlzaWNhbCBtZW1vcnkgaW4gdGhlIHJl
Z2lvbi4gVGhpcyBpcyBub3QgdHJ1ZSBvbiBXSU5DRS4KKyAgICAvLyBPbiBTeW1iaWFuLCB0aGlz
IG1ha2VzIGltcGxlbWVudGF0aW9uIHNpbXBsZXIgYW5kIGJldHRlciBhbGlnbmVkIHdpdGggdGhl
IFJDaHVuayBBUEkKICAgICBkZWNvbW1pdChkZWNvbW1pdEJhc2UsIGRlY29tbWl0U2l6ZSk7CiAj
ZWxzZQogICAgIFVOVVNFRF9QQVJBTShkZWNvbW1pdEJhc2UpOwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL3d0Zi9PU0FsbG9jYXRvclN5bWJpYW4uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS93dGYvT1NBbGxvY2F0b3JTeW1iaWFuLmNwcAkocmV2aXNpb24gNzkw
MjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL09TQWxsb2NhdG9yU3ltYmlhbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDEw
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBO
b2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI2LDMxICsyNywx
NzYgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJPU0FsbG9jYXRvci5oIgogCi0j
aW5jbHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKyNpbmNsdWRlICJQYWdlQWxsb2NhdG9yU3ltYmlh
bi5oIgogCiBuYW1lc3BhY2UgV1RGIHsKIAotdm9pZCogT1NBbGxvY2F0b3I6OnJlc2VydmVVbmNv
bW1pdHRlZChzaXplX3QgYnl0ZXMsIFVzYWdlLCBib29sLCBib29sKQorLy8gQXJyYXkgdG8gc3Rv
cmUgY29kZSBjaHVua3MgdXNlZCBieSBKSVQgZW5naW5lKHMpCitzdGF0aWMgUlBvaW50ZXJBcnJh
eTxTeW1iaWFuQ2h1bms+IGNvZGVDaHVua3NDb250YWluZXI7CisKKy8vIFRoZSBzaW5nbGV0b24g
ZGF0YSBhbGxvY2F0b3IgKG5vbiBjb2RlKQorc3RhdGljIFBhZ2VBbGxvY2F0b3JTeW1iaWFuIGRh
dGFBbGxvY2F0b3I7CisKK19MSVQoS0Vycm9yU3RyaW5nSW50ZXJuYWxDb25zaXN0ZW5jeSwgIk9T
QWxsb2NhdG9yOkNvbnNpc3RlbmN5RXJyb3IiKTsKK19MSVQoS0Vycm9yU3RyaW5nQ2h1bmtDcmVh
dGlvbiwgIk9TQWxsb2NhdG9yOkNodW5rSW5pdEVycm9yIik7CitfTElUKEtFcnJvclN0cmluZ1Bh
Z2VTaXplLCAiT1NBbGxvY2F0b3I6V3JvbmdQYWdlU2l6ZSIpOworCisvLyBNYWtlcyBhIG5ldyBj
b2RlIGNodW5rIGZvciBhIEpJVCBlbmdpbmUgd2l0aCBldmVyeXRoaW5nIGluIGNvbW1pdHRlZCBz
dGF0ZQorc3RhdGljIHZvaWQqIGFsbG9jYXRlQ29kZUNodW5rKHNpemVfdCBieXRlcykgCit7Cisg
ICAgUkNodW5rIGM7IAorICAgIFRJbnQgZXJyb3IgPSBjLkNyZWF0ZUxvY2FsQ29kZShieXRlcywg
Ynl0ZXMpOworICAgIF9fQVNTRVJUX0FMV0FZUyhlcnJvciA9PSBLRXJyTm9uZSwgVXNlcjo6UGFu
aWMoS0Vycm9yU3RyaW5nQ2h1bmtDcmVhdGlvbiwgZXJyb3IpKTsKKyAgIAorICAgIGNvZGVDaHVu
a3NDb250YWluZXIuQXBwZW5kKG5ldyBTeW1iaWFuQ2h1bmsoYy5IYW5kbGUoKSkpOyAKKyAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8dm9pZCo+KGMuQmFzZSgpKTsgCit9CisgICAKKy8vIEZyZWVzIHRo
ZSBfZW50aXJlXyBjb2RlIGNodW5rIGluIHdoaWNoIHRoaXMgYWRkcmVzcyByZXNpZGVzLiAKK3N0
YXRpYyBib29sIGRlYWxsb2NhdGVDb2RlQ2h1bmsodm9pZCogYWRkcmVzcykgCit7ICAgICAKKyAg
ICBib29sIGZvdW5kID0gZmFsc2U7IAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29kZUNodW5r
c0NvbnRhaW5lci5Db3VudCgpOyBpKyspIHsgCisgICAgICAgIFN5bWJpYW5DaHVuayogcCA9IGNv
ZGVDaHVua3NDb250YWluZXJbaV07CisgICAgICAgIGlmIChwICYmIHAtPmNvbnRhaW5zKGFkZHJl
c3MpKSB7IAorICAgICAgICAgICAgY29kZUNodW5rc0NvbnRhaW5lci5SZW1vdmUoaSk7CisgICAg
ICAgICAgICBkZWxldGUgcDsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQor
ICAgIH0KKyAgICByZXR1cm4gZm91bmQ7IAorfQorCisvLyBSZXR1cm4gdGhlIChzaW5nbGV0b24p
IG9iamVjdCB0aGF0IG1hbmFnZXMgYWxsIG5vbi1jb2RlIFZNIG9wZXJhdGlvbnMKK3N0YXRpYyBQ
YWdlQWxsb2NhdG9yU3ltYmlhbiogZGF0YUFsbG9jYXRvckluc3RhbmNlKCkgCit7CisgICAgcmV0
dXJuICZkYXRhQWxsb2NhdG9yOyAKK30KKworLy8gUmVzZXJ2ZSBtZW1vcnkgYW5kIHJldHVybiB0
aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KK3ZvaWQqIE9TQWxsb2NhdG9yOjpyZXNlcnZl
VW5jb21taXR0ZWQoc2l6ZV90IHJlc2VydmF0aW9uU2l6ZSwgVXNhZ2UgdXNhZ2UsIGJvb2wgLCBi
b29sIGV4ZWN1dGFibGUpIAoreworICAgIHZvaWQqIGJhc2UgPSAwOyAKKyAgICBpZiAoZXhlY3V0
YWJsZSkgCisgICAgICAgIGJhc2UgPSBhbGxvY2F0ZUNvZGVDaHVuayhyZXNlcnZhdGlvblNpemUp
OworICAgIGVsc2UKKyAgICAgICAgYmFzZSA9IGRhdGFBbGxvY2F0b3JJbnN0YW5jZSgpLT5yZXNl
cnZlKHJlc2VydmF0aW9uU2l6ZSk7CisgICAgcmV0dXJuIGJhc2U7IAorfQorCisvLyBJbnZlcnNl
IG9wZXJhdGlvbiBvZiByZXNlcnZlVW5jb21taXR0ZWQoKQordm9pZCBPU0FsbG9jYXRvcjo6cmVs
ZWFzZURlY29tbWl0dGVkKHZvaWQqIHBhcmtlZEJhc2UsIHNpemVfdCBieXRlcykgCiB7Ci0gICAg
cmV0dXJuIGZhc3RNYWxsb2MoYnl0ZXMpOworICAgIGlmIChkYXRhQWxsb2NhdG9ySW5zdGFuY2Uo
KS0+Y29udGFpbnMocGFya2VkQmFzZSkpIAorICAgICAgICBkYXRhQWxsb2NhdG9ySW5zdGFuY2Uo
KS0+cmVsZWFzZShwYXJrZWRCYXNlLCBieXRlcyk7CisKKyAgICAvLyBOT09QIGZvciBjb2RlIGNo
dW5rcyAoSklUKSBiZWNhdXNlIHdlIHJlbGVhc2VkIHRoZW0gaW4gZGVjb21taXQoKQogfQogCi12
b2lkKiBPU0FsbG9jYXRvcjo6cmVzZXJ2ZUFuZENvbW1pdChzaXplX3QgYnl0ZXMsIFVzYWdlLCBi
b29sLCBib29sKQorLy8gQ29tbWl0IHdoYXQgd2FzIHByZXZpb3VzbHkgcmVzZXJ2ZWQgdmlhIHJl
c2VydmVVbmNvbW1pdHRlZCgpCit2b2lkIE9TQWxsb2NhdG9yOjpjb21taXQodm9pZCogYWRkcmVz
cywgc2l6ZV90IGJ5dGVzLCBib29sLCBib29sIGV4ZWN1dGFibGUpIAogewotICAgIHJldHVybiBm
YXN0TWFsbG9jKGJ5dGVzKTsKKyAgICAvLyBGb3IgY29kZSBjaHVua3MsIHdlIGNvbW1pdCAoZWFy
bHkpIGluIHJlc2VydmVVbmNvbW1pdHRlZCgpLCBzbyBOT09QCisgICAgLy8gRm9yIGRhdGEgcmVn
aW9ucywgZG8gcmVhbCB3b3JrCisgICAgaWYgKCFleGVjdXRhYmxlKSAKKyAgICAgICAgZGF0YUFs
bG9jYXRvckluc3RhbmNlKCktPmNvbW1pdChhZGRyZXNzLCBieXRlcyk7Cit9CisKK3ZvaWQgT1NB
bGxvY2F0b3I6OmRlY29tbWl0KHZvaWQqIGFkZHJlc3MsIHNpemVfdCBieXRlcykgCit7IAorICAg
IGlmIChkYXRhQWxsb2NhdG9ySW5zdGFuY2UoKS0+Y29udGFpbnMoYWRkcmVzcykpCisgICAgICAg
IGRhdGFBbGxvY2F0b3JJbnN0YW5jZSgpLT5kZWNvbW1pdChhZGRyZXNzLCBieXRlcyk7CisgICAg
ZWxzZQorICAgICAgICBkZWFsbG9jYXRlQ29kZUNodW5rKGFkZHJlc3MpOyAvLyBmb3IgY29kZSBj
aHVuaywgZGVjb21taXQgQU5EIHJlbGVhc2UgICAgCit9CisgICAgCit2b2lkKiBPU0FsbG9jYXRv
cjo6cmVzZXJ2ZUFuZENvbW1pdChzaXplX3QgYnl0ZXMsIFVzYWdlIHVzYWdlLCBib29sIHdyaXRh
YmxlLCBib29sIGV4ZWN1dGFibGUpCit7IAorICAgIHZvaWQqIGJhc2UgPSByZXNlcnZlVW5jb21t
aXR0ZWQoYnl0ZXMsIHVzYWdlLCB3cml0YWJsZSwgZXhlY3V0YWJsZSk7CisgICAgY29tbWl0KGJh
c2UsIGJ5dGVzLCB3cml0YWJsZSwgZXhlY3V0YWJsZSk7CisgICAgcmV0dXJuIGJhc2U7Cit9CisK
KworLy8gVGhlIFBhZ2VBbGxvY2F0b3JTeW1iaWFuIGNsYXNzIGhlbHBzIG1hcCBPU0FsbG9jYXRv
ciBjYWxscyBmb3IgcmVzZXJ2ZS9jb21taXQvZGVjb21taXQKKy8vIHRvIGEgc2luZ2xlIGxhcmdl
IFN5bWJpYW4gY2h1bmsuIE9ubHkgd29ya3Mgd2l0aCBtdWx0aXBsZXMgb2YgcGFnZSBzaXplLCBh
bmQgYXMgYSBjb3JvbGxhcnkgCisvLyBhbGwgYWRkcmVzc2VzIGFjY2VwdGVkIG9yIHJldHVybmVk
IGJ5IGl0IGFyZSBhbHNvIHBhZ2Utc2l6ZWQgYWxpZ25lZC4gCisvLyBEZXNpZ24gbm90ZXM6IAor
Ly8gLSBXZSBpbml0aWFsaXplIGEgY2h1bmsgdXAtZnJvbnQgd2l0aCBhIGxhcmdlIHJlc2VydmF0
aW9uIHNpemUKKy8vIC0gVGhlIGVudGlyZSByZXNlcnZhdGlvbiByZXNlcnZlIGlzIGxvZ2ljYWxs
eSBkaXZpZGVkIGludG8gcGFnZVNpemVkIGJsb2NrcyAoNEsgb24gU3ltYmlhbikgCisvLyAtIFRo
ZSBtYXAgbWFpbnRhaW5zIDEgYml0IGZvciBlYWNoIG9mIHRoZSA0Sy1zaXplZCByZWdpb24gaW4g
b3VyIGFkZHJlc3Mgc3BhY2UKKy8vIC0gT1NBbGxvY2F0b3I6OnJlc2VydmVVbmNvbW1pdHRlZCgp
IHJlcXVlc3RzIGxlYWQgdG8gMSBvciBtb3JlIGJpdHMgYmVpbmcgc2V0IGluIG1hcCAKKy8vICAg
dG8gaW5kaWNhdGUgaW50ZXJuYWxseSByZXNlcnZlZCBzdGF0ZS4gVGhlIFZNIGFkZHJlc3MgY29y
cmVzcG9uZGluZyB0byB0aGUgZmlyc3QgYml0IGlzIHJldHVybmVkLiAKKy8vIC0gT1NBbGxvY2F0
b3I6OmNvbW1pdCgpIGFjdHVhbGx5IGNhbGxzIFJDaHVuay5jb21taXQoKSBhbmQgY29tbWl0cyAq
YWxsIG9yIHBhcnQqIG9mIHRoZSByZWdpb24gCisvLyAgIHJlc2VydmVkIHZpYSByZXNlcnZlVW5j
b21taXR0ZWQoKSBwcmV2aW91c2x5LiAKKy8vIC0gT1NBbGxvY2F0b3I6OmRlY29tbWl0KCkgY2Fs
bHMgUkNodW5rLmRlY29tbWl0KCkgCisvLyAtIE9TQWxsb2NhdG9yOjpyZWxlYXNlRGVjb21taXR0
ZWQoKSB1bnBhcmtzIGFsbCB0aGUgYml0cyBpbiB0aGUgbWFwLCBidXQgdHJ1c3RzIHRoYXQgYSBw
cmV2aW91c2x5CisvLyAgIGNhbGwgdG8gZGVjb21taXQoKSB3b3VsZCBoYXZlIHJldHVybmVkIHRo
ZSBtZW1vcnkgdG8gdGhlIE9TIAorUGFnZUFsbG9jYXRvclN5bWJpYW46OlBhZ2VBbGxvY2F0b3JT
eW1iaWFuKCkKK3sgICAgICAgIAorICAgIF9fQVNTRVJUX0FMV0FZUyhtX3BhZ2VTaXplID09IFdU
Rjo6cGFnZVNpemUoKSwgVXNlcjo6UGFuaWMoS0Vycm9yU3RyaW5nUGFnZVNpemUsIG1fcGFnZVNp
emUpKTsKKyAgICAKKyAgICBSQ2h1bmsgY2h1bms7CisgICAgVEludCBlcnJvciA9IGNodW5rLkNy
ZWF0ZURpc2Nvbm5lY3RlZExvY2FsKDAsIDAsIFRJbnQobGFyZ2VSZXNlcnZhdGlvblNpemUpKTsK
KyAgICBfX0FTU0VSVF9BTFdBWVMoZXJyb3IgPT0gS0Vyck5vbmUsIFVzZXI6OlBhbmljKEtFcnJv
clN0cmluZ0NodW5rQ3JlYXRpb24sIGVycm9yKSk7CisgICAgCisgICAgbV9jaHVuayA9IG5ldyBT
eW1iaWFuQ2h1bmsoY2h1bmsuSGFuZGxlKCkpOyAvLyB0YWtlcyBvd25lcnNoaXAgb2YgY2h1bmsK
IH0KIAotdm9pZCBPU0FsbG9jYXRvcjo6Y29tbWl0KHZvaWQqLCBzaXplX3QsIGJvb2wsIGJvb2wp
CitQYWdlQWxsb2NhdG9yU3ltYmlhbjo6flBhZ2VBbGxvY2F0b3JTeW1iaWFuKCkgCiB7CisgICAg
ZGVsZXRlIG1fY2h1bms7CiB9CiAKLXZvaWQgT1NBbGxvY2F0b3I6OmRlY29tbWl0KHZvaWQqLCBz
aXplX3QpCisvLyBSZXNlcnZlcyBhIHJlZ2lvbiBpbnRlcm5hbGx5IGluIHRoZSBiaXRtYXAKK3Zv
aWQqIFBhZ2VBbGxvY2F0b3JTeW1iaWFuOjpyZXNlcnZlKHNpemVfdCBieXRlcykgCit7IAorICAg
IC8vIEZpbmQgZmlyc3QgYXZhaWxhYmxlIHJlZ2lvbgorICAgIGNvbnN0IHNpemVfdCBuUGFnZXMg
PSBieXRlcyAvIG1fcGFnZVNpemU7CisgICAgY29uc3QgaW50NjRfdCBzdGFydElkeCA9IG1fbWFw
LmZpbmRSdW5PZlplcm9zKG5QYWdlcyk7CisKKyAgICAvLyBQc2V1ZG8gT09NCisgICAgaWYgKHN0
YXJ0SWR4IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgZm9yIChzaXplX3QgaSA9
IHN0YXJ0SWR4OyBpIDwgc3RhcnRJZHggKyBuUGFnZXMgOyBpKyspCisgICAgICAgIG1fbWFwLnNl
dChpKTsKKyAgICAKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dm9pZCo+KCBtX2NodW5rLT5tX2Jh
c2UgKyAoVFVpbnQpKG1fcGFnZVNpemUgKiBzdGFydElkeCkgKTsgCit9CisKKy8vIFJldmVyc2Vz
IHRoZSBlZmZlY3RzIG9mIGEgcmVzZXJ2ZSgpIGNhbGwKK3ZvaWQgUGFnZUFsbG9jYXRvclN5bWJp
YW46OnJlbGVhc2Uodm9pZCogYWRkcmVzcywgc2l6ZV90IGJ5dGVzKQogeworICAgIGNvbnN0IHNp
emVfdCBzdGFydElkeCA9IChzdGF0aWNfY2FzdDxjaGFyKj4oYWRkcmVzcykgLSBtX2NodW5rLT5t
X2Jhc2UpIC8gbV9wYWdlU2l6ZTsKKyAgICBjb25zdCBzaXplX3QgblBhZ2VzID0gYnl0ZXMgLyBt
X3BhZ2VTaXplOworICAgIGZvciAoc2l6ZV90IGkgPSBzdGFydElkeDsgaSA8IHN0YXJ0SWR4ICsg
blBhZ2VzIDsgaSsrKQorICAgICAgICBtX21hcC5jbGVhcihpKTsKK30KKworLy8gQWN0dWFsbHkg
Y29tbWl0IG1lbW9yeSBmcm9tIHRoZSBPUywgYWZ0ZXIgYSBwcmV2aW91cyBjYWxsIHRvIHJlc2Vy
dmUoKQorYm9vbCBQYWdlQWxsb2NhdG9yU3ltYmlhbjo6Y29tbWl0KHZvaWQqIGFkZHJlc3MsIHNp
emVfdCBieXRlcykgCit7IAorICAgIC8vIHNhbml0eSBjaGVjayB0aGF0IGJpdHMgd2VyZSBwcmV2
aW91c2x5IHNldAorICAgIGNvbnN0IHNpemVfdCBpZHggPSAoc3RhdGljX2Nhc3Q8Y2hhcio+KGFk
ZHJlc3MpIC0gbV9jaHVuay0+bV9iYXNlKSAvIG1fcGFnZVNpemU7CisgICAgY29uc3Qgc2l6ZV90
IG5QYWdlcyA9IGJ5dGVzIC8gbV9wYWdlU2l6ZTsKKyAgICBfX0FTU0VSVF9BTFdBWVMobV9tYXAu
Z2V0KGlkeCksIFVzZXI6OlBhbmljKEtFcnJvclN0cmluZ0ludGVybmFsQ29uc2lzdGVuY3ksIGlk
eCkpOworICAgIF9fQVNTRVJUX0FMV0FZUyhtX21hcC5nZXQoaWR4K25QYWdlcy0xKSwgVXNlcjo6
UGFuaWMoS0Vycm9yU3RyaW5nSW50ZXJuYWxDb25zaXN0ZW5jeSwgaWR4K25QYWdlcy0xKSk7Cisg
ICAgCisgICAgVEludCBlcnJvciA9IG1fY2h1bmstPkNvbW1pdChzdGF0aWNfY2FzdDxjaGFyKj4o
YWRkcmVzcykgLSBtX2NodW5rLT5tX2Jhc2UsIGJ5dGVzKTsKKyAgICByZXR1cm4gKGVycm9yID09
IEtFcnJOb25lKTsKK30KKworLy8gSW52ZXJzZSBvcGVyYXRpb24gb2YgY29tbWl0KCksIGEgcmVs
ZWFzZSgpIHNob3VsZCBmb2xsb3cgbGF0ZXIKK2Jvb2wgUGFnZUFsbG9jYXRvclN5bWJpYW46OmRl
Y29tbWl0KHZvaWQqIGFkZHJlc3MsIHNpemVfdCBieXRlcykgCit7IAorICAgIFRJbnQgZXJyb3Ig
PSBtX2NodW5rLT5EZWNvbW1pdChzdGF0aWNfY2FzdDxjaGFyKj4oYWRkcmVzcykgLSBtX2NodW5r
LT5tX2Jhc2UsIGJ5dGVzKTsKKyAgICByZXR1cm4gKGVycm9yID09IEtFcnJOb25lKTsgCiB9CiAK
LXZvaWQgT1NBbGxvY2F0b3I6OnJlbGVhc2VEZWNvbW1pdHRlZCh2b2lkKiBhZGRyZXNzLCBzaXpl
X3QpCitib29sIFBhZ2VBbGxvY2F0b3JTeW1iaWFuOjpjb250YWlucyhjb25zdCB2b2lkKiBhZGRy
ZXNzKSBjb25zdAogewotICAgIGZhc3RGcmVlKGFkZHJlc3MpOworICAgIHJldHVybiBtX2NodW5r
LT5jb250YWlucyhhZGRyZXNzKTsgICAgIAogfQogCiB9IC8vIG5hbWVzcGFjZSBXVEYKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvUGFnZUFsbG9jYXRvclN5bWJpYW4uaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL1BhZ2VBbGxvY2F0b3JTeW1iaWFuLmgJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL1BhZ2VBbGxvY2F0b3JT
eW1iaWFuLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDExIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21w
dXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQK
KyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVu
IHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpZm5kZWYgUGFnZUFsbG9jYXRvclN5bWJpYW5faAorI2RlZmluZSBQYWdlQWxsb2NhdG9yU3lt
Ymlhbl9oCisKKyNpbmNsdWRlIDxlMzJzdGQuaD4KKyNpbmNsdWRlIDx3dGYvQml0TWFwLmg+CisK
K25hbWVzcGFjZSBXVEYgeyAKKworc2l6ZV90IHBhZ2VTaXplKCk7CisKKy8vIENvbnZlbmllbmNl
IHdyYXBwZXIgYXJvdW5kIGFuIFJDaHVuaworY2xhc3MgU3ltYmlhbkNodW5rIDogcHVibGljIFJD
aHVuayB7CisgICAKK3B1YmxpYzogICAKKyAgICBTeW1iaWFuQ2h1bmsoVEludCBoYW5kbGUpIAor
ICAgIHsKKyAgICAgICAgU2V0SGFuZGxlKGhhbmRsZSk7CisgICAgICAgIC8vIHByZXZlbnQga2Vy
bmVsIGNhbGxzIGJ5IGNhY2hpbmcgdGhlc2UKKyAgICAgICAgbV9iYXNlID0gcmVpbnRlcnByZXRf
Y2FzdDxjaGFyKj4oQmFzZSgpKTsgCisgICAgICAgIG1fbWF4U2l6ZSA9IE1heFNpemUoKTsKKyAg
ICB9CisgICAgCisgICAgflN5bWJpYW5DaHVuaygpIAorICAgIHsgCisgICAgICAgIERlY29tbWl0
KDAsIG1fbWF4U2l6ZSk7CisgICAgICAgIENsb3NlKCk7CisgICAgfQorICAgICAKKyAgICAvLyBj
aGVja3MgaWYgYWRkcmVzcyBpcyBpbiBjaHVuaydzIHZpcnR1YWwgYWRkcmVzcyBzcGFjZQorICAg
IGJvb2wgY29udGFpbnMoY29uc3Qgdm9pZCogYWRkcmVzcykgY29uc3QgCisgICAgeworICAgICAg
ICByZXR1cm4gKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihhZGRyZXNzKSA+PSBtX2Jhc2UgJiYg
c3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGFkZHJlc3MpIDwgKG1fYmFzZSArIG1fbWF4U2l6ZSkp
OyAgCisgICAgfQorICAgIAorICAgIGNoYXIqIG1fYmFzZTsgCisgICAgc2l6ZV90IG1fbWF4U2l6
ZTsgCisgICAgCit9OworCisvLyBTaXplIG9mIHRoZSBsYXJnZSB1cC1mcm9udCByZXNlcnZhdGlv
bgorI2lmIGRlZmluZWQoX19XSU5TX18pIAorLy8gRW11bGF0b3IgaGFzIGxpbWl0ZWQgdmlydHVh
bCBhZGRyZXNzIHNwYWNlCitjb25zdCBzaXplX3QgbGFyZ2VSZXNlcnZhdGlvblNpemUgPSA5Niox
MDI0KjEwMjQ7CisjZWxzZQorLy8gSFcgaGFzIHBsZW50eSBvZiB2aXJ0dWFsIGFkZHJlc3Nlcwor
Y29uc3Qgc2l6ZV90IGxhcmdlUmVzZXJ2YXRpb25TaXplID0gMjU2KjEwMjQqMTAyNDsKKyNlbmRp
ZgorCitjbGFzcyBQYWdlQWxsb2NhdG9yU3ltYmlhbiB7IAorCitwdWJsaWM6ICAgICAKKyAgICBQ
YWdlQWxsb2NhdG9yU3ltYmlhbigpOworICAgIH5QYWdlQWxsb2NhdG9yU3ltYmlhbigpOworICAg
IAorICAgIHZvaWQqIHJlc2VydmUoc2l6ZV90KTsKKyAgICB2b2lkIHJlbGVhc2Uodm9pZCosIHNp
emVfdCk7CisgICAgYm9vbCBjb21taXQodm9pZCosIHNpemVfdCk7CisgICAgYm9vbCBkZWNvbW1p
dCh2b2lkKiwgc2l6ZV90KTsKKyAgICAKKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IHZvaWQqKSBj
b25zdDsgCisgICAgCitwcml2YXRlOiAgICAgCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBtX3Bh
Z2VTaXplID0gNDA5NjsgCisgICAgU3ltYmlhbkNodW5rKiBtX2NodW5rOyAKKyAgICBCaXRtYXA8
bGFyZ2VSZXNlcnZhdGlvblNpemUgLyBtX3BhZ2VTaXplPiBtX21hcDsKKyAgICAKK307CisKK30g
Ly8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gUGFnZUFsbG9jYXRvclN5bWJpYW5faAorCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>