<?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>32831</bug_id>
          
          <creation_ts>2009-12-21 11:14:44 -0800</creation_ts>
          <short_desc>Replace UString::Rep implementation, following introduction of ropes to JSC.</short_desc>
          <delta_ts>2010-01-13 17:21: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>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Gavin Barraclough">barraclough</reporter>
          <assigned_to name="Gavin Barraclough">barraclough</assigned_to>
          <cc>darin</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yong.li.webkit</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>174013</commentid>
    <comment_count>0</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2009-12-21 11:14:44 -0800</bug_when>
    <thetext>Remove redundant overcapacity mechanisms, reduce memory cost of Rep&apos;s, and add a inline storage mechanism akin to that in WebCore&apos;s StringImpl.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174015</commentid>
    <comment_count>1</comment_count>
      <attachid>45339</attachid>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2009-12-21 11:19:24 -0800</bug_when>
    <thetext>Created attachment 45339
The patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174016</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2009-12-21 11:20:23 -0800</bug_when>
    <thetext>Attachment 45339 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
JavaScriptCore/runtime/UStringImpl.cpp:25:  You should add a blank line after implementation file&apos;s own header.  [build/include_order] [4]
JavaScriptCore/runtime/UStringImpl.cpp:124:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
JavaScriptCore/runtime/UStringImpl.cpp:170:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
JavaScriptCore/runtime/UStringImpl.h:276:  #endif line should be &quot;#endif // UStringImpl_h&quot;  [build/header_guard] [5]
JavaScriptCore/runtime/UStringImpl.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
JavaScriptCore/runtime/UStringImpl.h:55:  Missing spaces around &amp;=  [whitespace/operators] [3]
JavaScriptCore/runtime/UStringImpl.h:61:  Missing spaces around |=  [whitespace/operators] [3]
JavaScriptCore/runtime/UStringImpl.h:130:  More than one command on the same line  [whitespace/newline] [4]
JavaScriptCore/runtime/UStringImpl.h:130:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
JavaScriptCore/runtime/UStringImpl.h:131:  More than one command on the same line  [whitespace/newline] [4]
JavaScriptCore/runtime/UStringImpl.h:132:  More than one command on the same line  [whitespace/newline] [4]
JavaScriptCore/runtime/UStringImpl.h:134:  More than one command on the same line  [whitespace/newline] [4]
JavaScriptCore/runtime/UStringImpl.h:136:  More than one command on the same line  [whitespace/newline] [4]
JavaScriptCore/runtime/UStringImpl.h:136:  Missing spaces around +=  [whitespace/operators] [3]
JavaScriptCore/runtime/UStringImpl.h:137:  Missing spaces around -=  [whitespace/operators] [3]
JavaScriptCore/runtime/UStringImpl.h:137:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WebCore/ForwardingHeaders/runtime/UStringImpl.h:1:  #ifndef header guard has wrong style, please use: UStringImpl_h  [build/header_guard] [5]
WebCore/ForwardingHeaders/runtime/UStringImpl.h:4:  #endif line should be &quot;#endif // UStringImpl_h&quot;  [build/header_guard] [5]
JavaScriptCore/runtime/UString.cpp:242:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Total errors found: 19</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174026</commentid>
    <comment_count>3</comment_count>
      <attachid>45339</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-12-21 11:51:16 -0800</bug_when>
    <thetext>Comment on attachment 45339
The patch

It would have been nice to have smaller patches. For example, one patch could have removed all the unneeded stuff without changing anything that was left behind.

&gt; +    UString::Rep m_base;

Can we start calling these UStringImpl in code we&apos;re modifying, instead of using the typedef? I think a later patch should just eliminate &quot;Rep&quot; entirely.

&gt;      // make sure UString doesn&apos;t try to reuse the buffer by pretending we have one more character in it

This comment should go. You removed all the code that went with it.

&gt; +UStringImpl* UStringImpl::nullUStringImpl;
&gt; +UStringImpl* UStringImpl::emptyUStringImpl;

Can we give these names that don&apos;t repeat the class name? If you are using the &quot;s_&quot; naming, s_null and s_empty would seem to do.

&gt; +        // UString constructors passed char*s assume 7-bit ASCII enciding; for UTF8 use &apos;createFromUTF8&apos;, belwo.

Typo: &quot;enciding&quot;.
Typo: &quot;belwo&quot;.

The functions zero-extend the characters, so they don&apos;t assume ASCII encoding. They do ISO Latin-1, not UTF-8. I think the comment could be worded more precisely.

If the function assumed ASCII encoding then it would be illegal to pass a non-ASCII character and we would assert that it was not done. Maybe we should switch to that.

&gt; -        // Constructor for null-terminated ASCII string.
&gt;          UString(const char*);

A shame to lose the &quot;null-terminated&quot; aspect of this comment.

&gt; Index: JavaScriptCore/runtime/UStringImpl.cpp
&gt; ===================================================================
&gt; --- JavaScriptCore/runtime/UStringImpl.cpp	(revision 0)
&gt; +++ JavaScriptCore/runtime/UStringImpl.cpp	(revision 0)
&gt; @@ -0,0 +1,176 @@
&gt; +/*
&gt; + *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
&gt; + *  Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
&gt; + *  Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca)
&gt; + *  Copyright (C) 2009 Google Inc. All rights reserved.

There may be too much copyright here.

It would be best, if this file is really a copied piece of UString.cpp, to do this by using &quot;svn copy&quot; so we see the deletion of the non-moved part of the file, and then the changes to the moved bit. The way you did it here, the code all looks new and has no history. But yet the copyright indicates you think it does have history. If the only part you kept was the hash function then I don&apos;t think you need non-Apple copyrights. Maciej and I wrote the hash function.

&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;UStringImpl.h&quot;
&gt; +#include &quot;Identifier.h&quot;
&gt; +#include &quot;UString.h&quot;
&gt; +#include &quot;UTF8.h&quot;

The UStringImpl.h include should be in a separate paragraph by itself.

&gt; +using namespace WTF;

This should not be needed. If it is, then the WTF headers are done wrong, I believe.

&gt; +COMPILE_ASSERT(sizeof(UChar) == 2, uchar_is_2_bytes);

What code below assumes this?

&gt; +    ASSERT((bufferOwnership() == BufferShared) || ((bufferOwnership() == BufferOwned) &amp;&amp; !m_dataBuffer.asPtr&lt;void*&gt;()));

I find it hard to read this assertion. Maybe too many parentheses?

&gt; Index: JavaScriptCore/runtime/UStringImpl.h
&gt; ===================================================================
&gt; --- JavaScriptCore/runtime/UStringImpl.h	(revision 0)
&gt; +++ JavaScriptCore/runtime/UStringImpl.h	(revision 0)
&gt; @@ -0,0 +1,276 @@
&gt; +/*
&gt; + *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
&gt; + *  Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
&gt; + *  Copyright (C) 2009 Google Inc. All rights reserved.

Same comments about copyright and &quot;svn copy&quot;. Lets keep the appropriate amount of history.

&gt; +#include &lt;stdint.h&gt;

Why? Are these really used in the header?

&gt; +#include &lt;wtf/FastMalloc.h&gt;

Not needed. We use Noncopyable and if we include that header, then FastMalloc.h is already taken care of.

&gt; +#include &lt;limits.h&gt;

Why? Don&apos;t we get everything we need from the C++ &lt;limits&gt;?

&gt; +    UntypedPtrAndBitfield() {}

Uninitialized? Really? Maybe it should be zeroed instead? Or perhaps we don&apos;t need it at all?

Does this code come from WebCore::StringImpl? If so, could we svn copy from there?

&gt; +    unsigned hash() const { if (m_hash == 0) m_hash = computeHash(data(), m_length); return m_hash; }

Our coding style would be !m_hash.

&gt; +    void setHash(unsigned hash) { ASSERT(hash == computeHash(data(), m_length)); m_hash = hash; } // fast path for Identifiers

Do we really need a public function for this?

&gt; +    UStringImpl* ref() { m_refCount+=2; return this; }
&gt; +    ALWAYS_INLINE void deref() { if ((m_refCount-=2) == 0) destroy(); }

We normally put spaces around operators like &quot;+=&quot; and &quot;-=&quot;.

You need a comment right here explaining why we bump the reference count by 2 instead of one.

Why does ref return UStringImpl* instead of void?

&gt; +        if (length &gt; (std::numeric_limits&lt;size_t&gt;::max() / sizeof(UChar)))

Extra parentheses here make it harder for me to read.

&gt; +#ifdef NDEBUG
&gt; +    void checkConsistency() const {}
&gt; +#else
&gt; +    void checkConsistency() const
&gt; +    {
&gt; +        // There is no recursion of substrings.
&gt; +        ASSERT(bufferOwnerString()-&gt;bufferOwnership() != BufferSubstring);
&gt; +        // Static strings cannot be put in identifier tables, because they are globally shared.
&gt; +        ASSERT(!isStatic() || !identifierTable());
&gt; +    }
&gt; +#endif

Normally I prefer to write such ifdefs so there is only one declaration even if there are two definitions. In fact, I suggest putting the debug version into the cpp file since we normally don&apos;t inline in debug builds anyway. We&apos;d just do this:

    #ifdef NDEBUG
    inline UStringImpl::checkConsistency() const
    {
    }
    #endif

And keep the class definition tidy with no ifdefs in it at all.

&gt; +    enum BufferOwnership {
&gt; +        BufferInternal = 0,
&gt; +        BufferOwned = 1,
&gt; +        BufferSubstring = 2,
&gt; +        BufferShared = 3,
&gt; +    };

Is there a reason to specify the numbers for each of these?

&gt; +    // For SmallStringStorage which allocates an array, and uses an in-place new.

There should be a comma before the word which. And no comma before the word and.

&gt; +    // Used to construct normal strings with an internal or external buffer.
&gt; +    UStringImpl(UChar* data, int length, BufferOwnership ownership)

I&apos;d expect an assertion that matches the comment.

&gt; +    // Used to construct static strings with an special refCount of 1 - since refCount
&gt; +    // is incremented/decremented by 2, this can never hit zero.  This means that the
&gt; +    // static string will never be destroyed.  This is important because static strings
&gt; +    // will be shared across threads &amp; ref-counted in a non-threadsafe manner.

We use one space after a period, not two. I suggest a named constant for the special reference count of 1 so you don&apos;t have to put a comment on the line where you use it.

&gt; +#ifndef NDEBUG
&gt; +    bool isStatic() const { return m_refCount &amp; 1; }
&gt; +#endif

Since this is already private, maybe it doesn&apos;t have to be debug only.

&gt; +    int m_refCount;

Since the code relies on overflow semantics for the special reference count, this should be unsigned, which has defined behavior on overflow, rather than int, which does not.

I&apos;ll say review-, but this looks really good. You can probably land after making a few fixes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174072</commentid>
    <comment_count>4</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2009-12-21 13:37:37 -0800</bug_when>
    <thetext>&gt; &gt; +    UString::Rep m_base;
&gt; 
&gt; Can we start calling these UStringImpl in code we&apos;re modifying, instead of
&gt; using the typedef? I think a later patch should just eliminate &quot;Rep&quot; entirely.

Absolutely agreed.  I think it might make sense to look at further bringing UStringImpl and StringImpl closer together before doing so, but I definitely see this as the way forwards.

&gt; &gt; +    UntypedPtrAndBitfield() {}
&gt; 
&gt; Uninitialized? Really? Maybe it should be zeroed instead? Or perhaps we don&apos;t
&gt; need it at all?

This constructor is used by the non argument UStringImpl constructor (which also leaves the object completely uninitialized), which is used by SmallStrings (In declaring an array of UStringImpls).  This behaviour replicated that of the previous UString::Rep implementation.

&gt; Does this code come from WebCore::StringImpl? If so, could we svn copy from
&gt; there?

No, I think this is all now fresh code (originally copied from UString::Rep, but everything has been replaced).

&gt; &gt; +    void setHash(unsigned hash) { ASSERT(hash == computeHash(data(), m_length)); m_hash = hash; } // fast path for Identifiers
&gt; 
&gt; Do we really need a public function for this?

Short answer is yes – this is provided from the identifier map.  I think we only do this during construction, so this could possibly be replaced with a fifth constructor (which just adds a lot of lines to solve a small problem), or we could friend Identifier (which didn&apos;t seem ideal from an encapsulation perspective.).

&gt; Why does ref return UStringImpl* instead of void?

Again this is replicating the behaviour of the previous implementation of UString::Rep.  This is used in various other parts of the code base, which assign a UString::Rep* to a variable and reference it in a single line.  

&gt; &gt; +#ifdef NDEBUG
&gt; &gt; +    void checkConsistency() const {}
&gt; &gt; +#else
&gt; &gt; +    void checkConsistency() const
&gt; &gt; +    {
&gt; &gt; +        // There is no recursion of substrings.
&gt; &gt; +        ASSERT(bufferOwnerString()-&gt;bufferOwnership() != BufferSubstring);
&gt; &gt; +        // Static strings cannot be put in identifier tables, because they are globally shared.
&gt; &gt; +        ASSERT(!isStatic() || !identifierTable());
&gt; &gt; +    }
&gt; &gt; +#endif
&gt; 
&gt; Normally I prefer to write such ifdefs so there is only one declaration even if
&gt; there are two definitions. In fact, I suggest putting the debug version into
&gt; the cpp file since we normally don&apos;t inline in debug builds anyway. We&apos;d just
&gt; do this:

Moving the function into the cpp is difficult since it is called from the header, from methods that are used from WebCore.  This means that an entry in the .exp would be required in debug builds, but no implementation of the method would exist in release builds.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174074</commentid>
    <comment_count>5</comment_count>
      <attachid>45347</attachid>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2009-12-21 13:38:35 -0800</bug_when>
    <thetext>Created attachment 45347
Review comment fixage</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174079</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2009-12-21 13:43:56 -0800</bug_when>
    <thetext>Attachment 45347 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
JavaScriptCore/runtime/UStringImpl.cpp:125:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
JavaScriptCore/runtime/UStringImpl.cpp:171:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
JavaScriptCore/runtime/UStringImpl.h:274:  #endif line should be &quot;#endif // UStringImpl_h&quot;  [build/header_guard] [5]
JavaScriptCore/runtime/UStringImpl.h:33:  Alphabetical sorting problem.  [build/include_order] [4]
JavaScriptCore/runtime/UStringImpl.h:55:  Missing spaces around &amp;=  [whitespace/operators] [3]
JavaScriptCore/runtime/UStringImpl.h:61:  Missing spaces around |=  [whitespace/operators] [3]
JavaScriptCore/runtime/UStringImpl.h:130:  More than one command on the same line  [whitespace/newline] [4]
JavaScriptCore/runtime/UStringImpl.h:131:  More than one command on the same line  [whitespace/newline] [4]
JavaScriptCore/runtime/UStringImpl.h:132:  More than one command on the same line  [whitespace/newline] [4]
JavaScriptCore/runtime/UStringImpl.h:134:  More than one command on the same line  [whitespace/newline] [4]
JavaScriptCore/runtime/UStringImpl.h:136:  More than one command on the same line  [whitespace/newline] [4]
WebCore/ForwardingHeaders/runtime/UStringImpl.h:1:  #ifndef header guard has wrong style, please use: UStringImpl_h  [build/header_guard] [5]
WebCore/ForwardingHeaders/runtime/UStringImpl.h:4:  #endif line should be &quot;#endif // UStringImpl_h&quot;  [build/header_guard] [5]
JavaScriptCore/runtime/UString.cpp:242:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Total errors found: 14</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174084</commentid>
    <comment_count>7</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-12-21 13:51:52 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; &gt; &gt; +#ifdef NDEBUG
&gt; &gt; &gt; +    void checkConsistency() const {}
&gt; &gt; &gt; +#else
&gt; &gt; &gt; +    void checkConsistency() const
&gt; &gt; &gt; +    {
&gt; &gt; &gt; +        // There is no recursion of substrings.
&gt; &gt; &gt; +        ASSERT(bufferOwnerString()-&gt;bufferOwnership() != BufferSubstring);
&gt; &gt; &gt; +        // Static strings cannot be put in identifier tables, because they are globally shared.
&gt; &gt; &gt; +        ASSERT(!isStatic() || !identifierTable());
&gt; &gt; &gt; +    }
&gt; &gt; &gt; +#endif
&gt; &gt; 
&gt; &gt; Normally I prefer to write such ifdefs so there is only one declaration even if
&gt; &gt; there are two definitions. In fact, I suggest putting the debug version into
&gt; &gt; the cpp file since we normally don&apos;t inline in debug builds anyway. We&apos;d just
&gt; &gt; do this:
&gt; 
&gt; Moving the function into the cpp is difficult since it is called from the
&gt; header, from methods that are used from WebCore.  This means that an entry in
&gt; the .exp would be required in debug builds, but no implementation of the method
&gt; would exist in release builds.

OK. Well we could still do the ifdef&apos;ing in the header. I&apos;d put the ifdef in the body of the function then. And probably put the definition outside the class to avoid having that whole mess up in the class definition.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174085</commentid>
    <comment_count>8</comment_count>
      <attachid>45347</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-12-21 13:53:45 -0800</bug_when>
    <thetext>Comment on attachment 45347
Review comment fixage

&gt; +        bool isEmpty() const { return (!m_rep-&gt;size()); }

Those parens! Yuck.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174140</commentid>
    <comment_count>9</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2009-12-21 16:41:32 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #4)
&gt; &gt; &gt; &gt; +#ifdef NDEBUG
&gt; &gt; &gt; &gt; +    void checkConsistency() const {}
&gt; &gt; &gt; &gt; +#else
&gt; &gt; &gt; &gt; +    void checkConsistency() const
&gt; &gt; &gt; &gt; +    {
&gt; &gt; &gt; &gt; +        // There is no recursion of substrings.
&gt; &gt; &gt; &gt; +        ASSERT(bufferOwnerString()-&gt;bufferOwnership() != BufferSubstring);
&gt; &gt; &gt; &gt; +        // Static strings cannot be put in identifier tables, because they are globally shared.
&gt; &gt; &gt; &gt; +        ASSERT(!isStatic() || !identifierTable());
&gt; &gt; &gt; &gt; +    }
&gt; &gt; &gt; &gt; +#endif
&gt; OK. Well we could still do the ifdef&apos;ing in the header. I&apos;d put the ifdef in
&gt; the body of the function then. And probably put the definition outside the
&gt; class to avoid having that whole mess up in the class definition.

I realized that since the function only contains ASSERTs (and since these compile to nothing in release builds) we can remove the #ifdef here altogether!

Also removed a couple of spare sets of parens, as per comment #8.

Transmitting file data ..............
Committed revision 52463.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>179841</commentid>
    <comment_count>10</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2010-01-12 08:26:36 -0800</bug_when>
    <thetext>&gt;    void* operator new(size_t size) { return fastMalloc(size); }
&gt;    void* operator new(size_t, void* inPlace) { return inPlace; }

Hi, Gavin, why is above code necessary? and why are delete operators not defined?

Thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>179896</commentid>
    <comment_count>11</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2010-01-12 11:12:22 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; &gt;    void* operator new(size_t size) { return fastMalloc(size); }
&gt; &gt;    void* operator new(size_t, void* inPlace) { return inPlace; }
&gt; 
&gt; Hi, Gavin, why is above code necessary? and why are delete operators not
&gt; defined?

The in-place new is used in the SmallStringsStorage to declare an array on UStringImpls (these are never deleted).  Since a new operator has been defined the C++ compiler won&apos;t provide a default new(size_t, so one must be explicitly declared.

A delete wasn&apos;t defined because this appeared to be redundant, on mac at leaset – is there a reason we need one on another platform?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>179897</commentid>
    <comment_count>12</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-01-12 11:14:05 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; A delete wasn&apos;t defined because this appeared to be redundant, on mac at leaset
&gt; – is there a reason we need one on another platform?

I suggest implementing a matching delete or deriving from FastAllocBase.

We are planning on removing the global operator new and delete eventually on Mac OS X. To be more specific, we plan on replacing them with ASSERT_NOT_REACHED, because we don’t want to accidentally rely on them, nor accidentally use the non-FastMalloc version of malloc within the framework.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>180211</commentid>
    <comment_count>13</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2010-01-13 07:39:58 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; (In reply to comment #10)
&gt; &gt; &gt;    void* operator new(size_t size) { return fastMalloc(size); }
&gt; &gt; &gt;    void* operator new(size_t, void* inPlace) { return inPlace; }
&gt; &gt; 
&gt; &gt; Hi, Gavin, why is above code necessary? and why are delete operators not
&gt; &gt; defined?
&gt; 
&gt; The in-place new is used in the SmallStringsStorage to declare an array on
&gt; UStringImpls (these are never deleted).  Since a new operator has been defined
&gt; the C++ compiler won&apos;t provide a default new(size_t, so one must be explicitly
&gt; declared.
&gt; 
&gt; A delete wasn&apos;t defined because this appeared to be redundant, on mac at leaset
&gt; – is there a reason we need one on another platform?

then the first one is not necessary because I remember even Noncopyable is derived from FastAllocBase. 

I just worry about this case: you implement operator new with fastMalloc, but if FastAllocBase::new does it in different way. then when you call delete, FastAllocBase::delete will be called and then will crash...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>180217</commentid>
    <comment_count>14</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2010-01-13 07:44:59 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; (In reply to comment #11)
&gt; &gt; A delete wasn&apos;t defined because this appeared to be redundant, on mac at leaset
&gt; &gt; – is there a reason we need one on another platform?
&gt; 
&gt; I suggest implementing a matching delete or deriving from FastAllocBase.
&gt; 
&gt; We are planning on removing the global operator new and delete eventually on
&gt; Mac OS X. To be more specific, we plan on replacing them with
&gt; ASSERT_NOT_REACHED, because we don’t want to accidentally rely on them, nor
&gt; accidentally use the non-FastMalloc version of malloc within the framework.

&quot;removing the global operator new and delete&quot;: why? then what if STL call global new/delete operators? and  &quot;new int[10]&quot;? Personally, I prefer global new/delete operators than FastAllocBase.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>180250</commentid>
    <comment_count>15</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-01-13 09:00:07 -0800</bug_when>
    <thetext>(In reply to comment #13)
&gt; I just worry about this case: you implement operator new with fastMalloc, but
&gt; if FastAllocBase::new does it in different way. then when you call delete,
&gt; FastAllocBase::delete will be called and then will crash...

Yes, I am also worried about that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>180484</commentid>
    <comment_count>16</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2010-01-13 17:21:39 -0800</bug_when>
    <thetext>operator new replaced with a &apos;using&apos; to import the parent Class&apos;s new operator in r53221.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>45339</attachid>
            <date>2009-12-21 11:19:24 -0800</date>
            <delta_ts>2009-12-21 13:38:35 -0800</delta_ts>
            <desc>The patch</desc>
            <filename>patch.UStringImpl.txt</filename>
            <type>text/plain</type>
            <size>87951</size>
            <attacher name="Gavin Barraclough">barraclough</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDUyNDQ4KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzQgQEAKKzIwMDktMTItMjEgIEdhdmluIEJh
cnJhY2xvdWdoICA8YmFycmFjbG91Z2hAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0zMjgzMQorICAgICAgICBSZXBsYWNlIFVTdHJpbmc6OlJlcCBpbXBsZW1lbnRh
dGlvbiwgZm9sbG93aW5nIGludHJvZHVjdGlvbiBvZiByb3BlcyB0byBKU0MuCisKKyAgICAgICAg
ICAgICogUmVtb3ZlIHJlZHVuZGFudCBvdmVyY2FwYWNpdHkgbWVjaGFuaXNtcy4KKyAgICAgICAg
ICAgICogUmVkdWNlIG1lbW9yeSBjb3N0IG9mIFJlcCdzLgorICAgICAgICAgICAgKiBBZGQgYW4g
aW5saW5lIHN0b3JhZ2UgbWVjaGFuaXNtIGFraW4gdG8gdGhhdCBpbiBXZWJDb3JlJ3MgU3RyaW5n
SW1wbC4KKworICAgICAgICB+MSUgU3Vuc3BpZGVyIHByb2dyZXNzaW9uLgorCisgICAgICAgICog
SmF2YVNjcmlwdENvcmUuZXhwOgorICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2o6CisgICAgICAgICogcnVudGltZS9KU1N0cmluZy5jcHA6CisgICAgICAg
IChKU0M6OkpTU3RyaW5nOjpyZXNvbHZlUm9wZSk6CisgICAgICAgICogcnVudGltZS9TbWFsbFN0
cmluZ3MuY3BwOgorICAgICAgICAoSlNDOjpTbWFsbFN0cmluZ3NTdG9yYWdlOjpTbWFsbFN0cmlu
Z3NTdG9yYWdlKToKKyAgICAgICAgKiBydW50aW1lL1VTdHJpbmcuY3BwOgorICAgICAgICAoSlND
Ojppbml0aWFsaXplVVN0cmluZyk6CisgICAgICAgIChKU0M6OmNyZWF0ZVJlcCk6CisgICAgICAg
IChKU0M6OlVTdHJpbmc6OmNyZWF0ZUZyb21VVEY4KToKKyAgICAgICAgKEpTQzo6VVN0cmluZzo6
Y3JlYXRlVW5pbml0aWFsaXplZCk6CisgICAgICAgIChKU0M6OlVTdHJpbmc6OnNwbGljZVN1YnN0
cmluZ3NXaXRoU2VwYXJhdG9ycyk6CisgICAgICAgIChKU0M6OlVTdHJpbmc6OnJlcGxhY2VSYW5n
ZSk6CisgICAgICAgIChKU0M6OlVTdHJpbmc6OmFzY2lpKToKKyAgICAgICAgKEpTQzo6VVN0cmlu
Zzo6b3BlcmF0b3I9KToKKyAgICAgICAgKEpTQzo6VVN0cmluZzo6dG9TdHJpY3RVSW50MzIpOgor
ICAgICAgICAoSlNDOjplcXVhbCk6CisgICAgICAgICogcnVudGltZS9VU3RyaW5nLmg6CisgICAg
ICAgIChKU0M6OlVTdHJpbmc6OmlzRW1wdHkpOgorICAgICAgICAoSlNDOjpVU3RyaW5nOjpjb3N0
KToKKyAgICAgICAgKEpTQzo6bWFrZVN0cmluZyk6CisgICAgICAgICogcnVudGltZS9VU3RyaW5n
SW1wbC5jcHA6IEFkZGVkLgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6YmFzZVNoYXJlZEJ1
ZmZlcik6CisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBsOjpzaGFyZWRCdWZmZXIpOgorICAgICAg
ICAoSlNDOjpVU3RyaW5nSW1wbDo6ZGVzdHJveSk6CisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBs
Ojpjb21wdXRlSGFzaCk6CisgICAgICAgICogcnVudGltZS9VU3RyaW5nSW1wbC5oOiBBZGRlZC4K
KyAgICAgICAgKEpTQzo6VW50eXBlZFB0ckFuZEJpdGZpZWxkOjpVbnR5cGVkUHRyQW5kQml0Zmll
bGQpOgorICAgICAgICAoSlNDOjpVbnR5cGVkUHRyQW5kQml0ZmllbGQ6OmFzUHRyKToKKyAgICAg
ICAgKEpTQzo6VW50eXBlZFB0ckFuZEJpdGZpZWxkOjpvcGVyYXRvciY9KToKKyAgICAgICAgKEpT
Qzo6VW50eXBlZFB0ckFuZEJpdGZpZWxkOjpvcGVyYXRvcnw9KToKKyAgICAgICAgKEpTQzo6VW50
eXBlZFB0ckFuZEJpdGZpZWxkOjpvcGVyYXRvciYpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1w
bDo6Y3JlYXRlKToKKyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6OmNyZWF0ZUNvcHlpbmcpOgor
ICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6Y3JlYXRlVW5pbml0aWFsaXplZCk6CisgICAgICAg
IChKU0M6OlVTdHJpbmdJbXBsOjpkYXRhKToKKyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6OnNp
emUpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6Y29zdCk6CisgICAgICAgIChKU0M6OlVT
dHJpbmdJbXBsOjpoYXNoKToKKyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6OmNvbXB1dGVkSGFz
aCk6CisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBsOjpzZXRIYXNoKToKKyAgICAgICAgKEpTQzo6
VVN0cmluZ0ltcGw6OmlkZW50aWZpZXJUYWJsZSk6CisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBs
OjpzZXRJZGVudGlmaWVyVGFibGUpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6cmVmKToK
KyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6OmRlcmVmKToKKyAgICAgICAgKEpTQzo6VVN0cmlu
Z0ltcGw6OmFsbG9jQ2hhcnMpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6Y29weUNoYXJz
KToKKyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6OmNvbXB1dGVIYXNoKToKKyAgICAgICAgKEpT
Qzo6VVN0cmluZ0ltcGw6Om51bGwpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6ZW1wdHkp
OgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6Y2hlY2tDb25zaXN0ZW5jeSk6CisgICAgICAg
IChKU0M6OlVTdHJpbmdJbXBsOjopOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6VVN0cmlu
Z0ltcGwpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6b3BlcmF0b3IgbmV3KToKKyAgICAg
ICAgKEpTQzo6VVN0cmluZ0ltcGw6OmJ1ZmZlck93bmVyU3RyaW5nKToKKyAgICAgICAgKEpTQzo6
VVN0cmluZ0ltcGw6OmJ1ZmZlck93bmVyc2hpcCk6CisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBs
Ojppc1N0YXRpYyk6CisKIDIwMDktMTItMTggIExhc3psbyBHb21ib3MgIDxsYXN6bG8uMS5nb21i
b3NAbm9raWEuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEtlbm5ldGggUm9oZGUgQ2hyaXN0
aWFuc2VuLgpJbmRleDogSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUuZXhwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmV4cAkocmV2aXNpb24gNTIzNDYp
CisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5leHAJKHdvcmtpbmcgY29weSkKQEAg
LTkwLDEyICs5MCwxMiBAQCBfX1oxMmpzUmVnRXhwRnJlZVA4SlNSZWdFeHAKIF9fWjE1anNSZWdF
eHBDb21waWxlUEt0aTI0SlNSZWdFeHBJZ25vcmVDYXNlT3B0aW9uMjNKU1JlZ0V4cE11bHRpbGlu
ZU9wdGlvblBqUFBLYwogX19aMTVqc1JlZ0V4cEV4ZWN1dGVQSzhKU1JlZ0V4cFBLdGlpUGlpCiBf
X1pOMTRPcGFxdWVKU1N0cmluZzZjcmVhdGVFUktOM0pTQzdVU3RyaW5nRQotX19aTjNKU0MxMElk
ZW50aWZpZXIxMWFkZFNsb3dDYXNlRVBOU18xMkpTR2xvYmFsRGF0YUVQTlNfN1VTdHJpbmczUmVw
RQotX19aTjNKU0MxMElkZW50aWZpZXIxMWFkZFNsb3dDYXNlRVBOU185RXhlY1N0YXRlRVBOU183
VVN0cmluZzNSZXBFCi1fX1pOM0pTQzEwSWRlbnRpZmllcjI0Y2hlY2tTYW1lSWRlbnRpZmllclRh
YmxlRVBOU18xMkpTR2xvYmFsRGF0YUVQTlNfN1VTdHJpbmczUmVwRSAKLV9fWk4zSlNDMTBJZGVu
dGlmaWVyMjRjaGVja1NhbWVJZGVudGlmaWVyVGFibGVFUE5TXzlFeGVjU3RhdGVFUE5TXzdVU3Ry
aW5nM1JlcEUgCitfX1pOM0pTQzEwSWRlbnRpZmllcjExYWRkU2xvd0Nhc2VFUE5TXzEySlNHbG9i
YWxEYXRhRVBOU18xMVVTdHJpbmdJbXBsRQorX19aTjNKU0MxMElkZW50aWZpZXIxMWFkZFNsb3dD
YXNlRVBOU185RXhlY1N0YXRlRVBOU18xMVVTdHJpbmdJbXBsRQorX19aTjNKU0MxMElkZW50aWZp
ZXIyNGNoZWNrU2FtZUlkZW50aWZpZXJUYWJsZUVQTlNfMTJKU0dsb2JhbERhdGFFUE5TXzExVVN0
cmluZ0ltcGxFCitfX1pOM0pTQzEwSWRlbnRpZmllcjI0Y2hlY2tTYW1lSWRlbnRpZmllclRhYmxl
RVBOU185RXhlY1N0YXRlRVBOU18xMVVTdHJpbmdJbXBsRQogX19aTjNKU0MxMElkZW50aWZpZXIz
YWRkRVBOU185RXhlY1N0YXRlRVBLYwotX19aTjNKU0MxMElkZW50aWZpZXI1ZXF1YWxFUEtOU183
VVN0cmluZzNSZXBFUEtjCitfX1pOM0pTQzEwSWRlbnRpZmllcjVlcXVhbEVQS05TXzExVVN0cmlu
Z0ltcGxFUEtjCiBfX1pOM0pTQzEwSlNGdW5jdGlvbkMxRVBOU185RXhlY1N0YXRlRU4zV1RGMTdO
b25OdWxsUGFzc1JlZlB0cklOU185U3RydWN0dXJlRUVFaVJLTlNfMTBJZGVudGlmaWVyRVBGTlNf
N0pTVmFsdWVFUzJfUE5TXzhKU09iamVjdEVTQV9SS05TXzdBcmdMaXN0RUUKIF9fWk4zSlNDMTB0
aHJvd0Vycm9yRVBOU185RXhlY1N0YXRlRU5TXzlFcnJvclR5cGVFCiBfX1pOM0pTQzEwdGhyb3dF
cnJvckVQTlNfOUV4ZWNTdGF0ZUVOU185RXJyb3JUeXBlRVBLYwpAQCAtMTAzLDYgKzEwMywxMSBA
QCBfX1pOM0pTQzEwdGhyb3dFcnJvckVQTlNfOUV4ZWNTdGF0ZUVOU185CiBfX1pOM0pTQzExSlNC
eXRlQXJyYXkxNWNyZWF0ZVN0cnVjdHVyZUVOU183SlNWYWx1ZUUKIF9fWk4zSlNDMTFKU0J5dGVB
cnJheUMxRVBOU185RXhlY1N0YXRlRU4zV1RGMTdOb25OdWxsUGFzc1JlZlB0cklOU185U3RydWN0
dXJlRUVFUE5TM185Qnl0ZUFycmF5RVBLTlNfOUNsYXNzSW5mb0UKIF9fWk4zSlNDMTFQYXJzZXJB
cmVuYTVyZXNldEV2CitfX1pOM0pTQzExVVN0cmluZ0ltcGwxMWNvbXB1dGVIYXNoRVBLY2kKK19f
Wk4zSlNDMTFVU3RyaW5nSW1wbDExY29tcHV0ZUhhc2hFUEt0aQorX19aTjNKU0MxMVVTdHJpbmdJ
bXBsMTJzaGFyZWRCdWZmZXJFdgorX19aTjNKU0MxMVVTdHJpbmdJbXBsMTVudWxsVVN0cmluZ0lt
cGxFCitfX1pOM0pTQzExVVN0cmluZ0ltcGw3ZGVzdHJveUV2CiBfX1pOM0pTQzExY2hlY2tTeW50
YXhFUE5TXzlFeGVjU3RhdGVFUktOU18xMFNvdXJjZUNvZGVFCiBfX1pOM0pTQzEyRGF0ZUluc3Rh
bmNlNGluZm9FCiBfX1pOM0pTQzEyRGF0ZUluc3RhbmNlQzFFUE5TXzlFeGVjU3RhdGVFZApAQCAt
MTU3LDcgKzE2Miw3IEBAIF9fWk4zSlNDMTZKU1ZhcmlhYmxlT2JqZWN0MTRzeW1ib2xUYWJsZUcK
IF9fWk4zSlNDMTZKU1ZhcmlhYmxlT2JqZWN0MTlnZXRPd25Qcm9wZXJ0eU5hbWVzRVBOU185RXhl
Y1N0YXRlRVJOU18xN1Byb3BlcnR5TmFtZUFycmF5RQogX19aTjNKU0MxNnRvVUludDMyU2xvd0Nh
c2VFZFJiCiBfX1pOM0pTQzE3Qnl0ZWNvZGVHZW5lcmF0b3IyMXNldER1bXBzR2VuZXJhdGVkQ29k
ZUViCi1fX1pOM0pTQzE3UHJvcGVydHlOYW1lQXJyYXkzYWRkRVBOU183VVN0cmluZzNSZXBFCitf
X1pOM0pTQzE3UHJvcGVydHlOYW1lQXJyYXkzYWRkRVBOU18xMVVTdHJpbmdJbXBsRQogX19aTjNK
U0MxN1Byb3RvdHlwZUZ1bmN0aW9uQzFFUE5TXzlFeGVjU3RhdGVFTjNXVEYxN05vbk51bGxQYXNz
UmVmUHRySU5TXzlTdHJ1Y3R1cmVFRUVpUktOU18xMElkZW50aWZpZXJFUEZOU183SlNWYWx1ZUVT
Ml9QTlNfOEpTT2JqZWN0RVNBX1JLTlNfN0FyZ0xpc3RFRQogX19aTjNKU0MxN1Byb3RvdHlwZUZ1
bmN0aW9uQzFFUE5TXzlFeGVjU3RhdGVFaVJLTlNfMTBJZGVudGlmaWVyRVBGTlNfN0pTVmFsdWVF
UzJfUE5TXzhKU09iamVjdEVTNl9SS05TXzdBcmdMaXN0RUUKIF9fWk4zSlNDMTdjb25zdHJ1Y3RG
dW5jdGlvbkVQTlNfOUV4ZWNTdGF0ZUVSS05TXzdBcmdMaXN0RVJLTlNfMTBJZGVudGlmaWVyRVJL
TlNfN1VTdHJpbmdFaQpAQCAtMTk0LDcgKzE5OSw3IEBAIF9fWk4zSlNDNEhlYXA3cHJvdGVjdEVO
U183SlNWYWx1ZUUKIF9fWk4zSlNDNEhlYXA4YWxsb2NhdGVFbQogX19aTjNKU0M0SGVhcDl1bnBy
b3RlY3RFTlNfN0pTVmFsdWVFCiBfX1pOM0pTQzRjYWxsRVBOU185RXhlY1N0YXRlRU5TXzdKU1Zh
bHVlRU5TXzhDYWxsVHlwZUVSS05TXzhDYWxsRGF0YUVTMl9SS05TXzdBcmdMaXN0RQotX19aTjNK
U0M1ZXF1YWxFUEtOU183VVN0cmluZzNSZXBFUzNfCitfX1pOM0pTQzVlcXVhbEVQS05TXzExVVN0
cmluZ0ltcGxFUzJfCiBfX1pOM0pTQzZKU0NlbGwxMWdldENhbGxEYXRhRVJOU184Q2FsbERhdGFF
CiBfX1pOM0pTQzZKU0NlbGwxMWdldEpTTnVtYmVyRXYKIF9fWk4zSlNDNkpTQ2VsbDE0ZGVsZXRl
UHJvcGVydHlFUE5TXzlFeGVjU3RhdGVFUktOU18xMElkZW50aWZpZXJFCkBAIC0yMjYsMTMgKzIz
MSw2IEBAIF9fWk4zSlNDN1Byb2ZpbGU1Zm9jdXNFUEtOU18xMVByb2ZpbGVOb2QKIF9fWk4zSlND
N1Byb2ZpbGU3ZXhjbHVkZUVQS05TXzExUHJvZmlsZU5vZGVFCiBfX1pOM0pTQzdQcm9maWxlN2Zv
ckVhY2hFTU5TXzExUHJvZmlsZU5vZGVFRnZ2RQogX19aTjNKU0M3VVN0cmluZzE2Y3JlYXRlTm9u
Q29weWluZ0VQdGkKLV9fWk4zSlNDN1VTdHJpbmczUmVwMTFjb21wdXRlSGFzaEVQS2NpCi1fX1pO
M0pTQzdVU3RyaW5nM1JlcDExY29tcHV0ZUhhc2hFUEt0aQotX19aTjNKU0M3VVN0cmluZzNSZXAx
MnNoYXJlZEJ1ZmZlckV2Ci1fX1pOM0pTQzdVU3RyaW5nM1JlcDE0Y3JlYXRlRnJvbVVURjhFUEtj
Ci1fX1pOM0pTQzdVU3RyaW5nM1JlcDE0bnVsbEJhc2VTdHJpbmdFCi1fX1pOM0pTQzdVU3RyaW5n
M1JlcDZjcmVhdGVFUHRpTjNXVEYxMFBhc3NSZWZQdHJJTlMzXzIxQ3Jvc3NUaHJlYWRSZWZDb3Vu
dGVkSU5TM18xNk93bkZhc3RNYWxsb2NQdHJJdEVFRUVFRQotX19aTjNKU0M3VVN0cmluZzNSZXA3
ZGVzdHJveUV2CiBfX1pOM0pTQzdVU3RyaW5nNGZyb21FZAogX19aTjNKU0M3VVN0cmluZzRmcm9t
RWkKIF9fWk4zSlNDN1VTdHJpbmc0ZnJvbUVqCkBAIC0yODAsNyArMjc4LDcgQEAgX19aTjNKU0M5
TWFya1N0YWNrMTBzX3BhZ2VTaXplRQogX19aTjNKU0M5TWFya1N0YWNrMTJyZWxlYXNlU3RhY2tF
UHZtCiBfX1pOM0pTQzlNYXJrU3RhY2sxM2FsbG9jYXRlU3RhY2tFbQogX19aTjNKU0M5TWFya1N0
YWNrMThpbml0aWFsaXplUGFnZXNpemVFdgotX19aTjNKU0M5U3RydWN0dXJlMTNoYXNUcmFuc2l0
aW9uRVBOU183VVN0cmluZzNSZXBFagorX19aTjNKU0M5U3RydWN0dXJlMTNoYXNUcmFuc2l0aW9u
RVBOU18xMVVTdHJpbmdJbXBsRWoKIF9fWk4zSlNDOVN0cnVjdHVyZTE3c3RvcElnbm9yaW5nTGVh
a3NFdgogX19aTjNKU0M5U3RydWN0dXJlMThzdGFydElnbm9yaW5nTGVha3NFdgogX19aTjNKU0M5
U3RydWN0dXJlMjFhZGRQcm9wZXJ0eVRyYW5zaXRpb25FUFMwX1JLTlNfMTBJZGVudGlmaWVyRWpQ
TlNfNkpTQ2VsbEVSbQpAQCAtMjkwLDcgKzI4OCw3IEBAIF9fWk4zSlNDOVN0cnVjdHVyZTI3YWRk
QW5vbnltb3VzU2xvdHNUcmEKIF9fWk4zSlNDOVN0cnVjdHVyZTI3ZGVzcGVjaWZ5RGljdGlvbmFy
eUZ1bmN0aW9uRVJLTlNfMTBJZGVudGlmaWVyRQogX19aTjNKU0M5U3RydWN0dXJlMjdkZXNwZWNp
ZnlGdW5jdGlvblRyYW5zaXRpb25FUFMwX1JLTlNfMTBJZGVudGlmaWVyRQogX19aTjNKU0M5U3Ry
dWN0dXJlMjhhZGRQcm9wZXJ0eVdpdGhvdXRUcmFuc2l0aW9uRVJLTlNfMTBJZGVudGlmaWVyRWpQ
TlNfNkpTQ2VsbEUKLV9fWk4zSlNDOVN0cnVjdHVyZTNnZXRFUEtOU183VVN0cmluZzNSZXBFUmpS
UE5TXzZKU0NlbGxFCitfX1pOM0pTQzlTdHJ1Y3R1cmUzZ2V0RVBLTlNfMTFVU3RyaW5nSW1wbEVS
alJQTlNfNkpTQ2VsbEUKIF9fWk4zSlNDOVN0cnVjdHVyZTQwYWRkUHJvcGVydHlUcmFuc2l0aW9u
VG9FeGlzdGluZ1N0cnVjdHVyZUVQUzBfUktOU18xMElkZW50aWZpZXJFalBOU182SlNDZWxsRVJt
CiBfX1pOM0pTQzlTdHJ1Y3R1cmVDMUVOU183SlNWYWx1ZUVSS05TXzhUeXBlSW5mb0UKIF9fWk4z
SlNDOVN0cnVjdHVyZUQxRXYKQEAgLTM0OCw3ICszNDYsNyBAQCBfX1pOM1dURjhmYXN0RnJlZUVQ
dgogX19aTjNXVEY5Qnl0ZUFycmF5NmNyZWF0ZUVtCiBfX1pOSzNKU0MxMEpTRnVuY3Rpb24yM2lz
SG9zdEZ1bmN0aW9uTm9uSW5saW5lRXYKIF9fWk5LM0pTQzExSW50ZXJwcmV0ZXIxNHJldHJpZXZl
Q2FsbGVyRVBOU185RXhlY1N0YXRlRVBOU18xNkludGVybmFsRnVuY3Rpb25FCi1fX1pOSzNKU0Mx
MUludGVycHJldGVyMThyZXRyaWV2ZUxhc3RDYWxsZXJFUE5TXzlFeGVjU3RhdGVFUmlSbFJOU183
VVN0cmluZ0VSTlNfN0pTVmFsdWVFICAKK19fWk5LM0pTQzExSW50ZXJwcmV0ZXIxOHJldHJpZXZl
TGFzdENhbGxlckVQTlNfOUV4ZWNTdGF0ZUVSaVJsUk5TXzdVU3RyaW5nRVJOU183SlNWYWx1ZUUK
IF9fWk5LM0pTQzE0SlNHbG9iYWxPYmplY3QxNGlzRHluYW1pY1Njb3BlRXYKIF9fWk5LM0pTQzE2
SW50ZXJuYWxGdW5jdGlvbjljbGFzc0luZm9FdgogX19aTkszSlNDMTZKU1ZhcmlhYmxlT2JqZWN0
MTZpc1ZhcmlhYmxlT2JqZWN0RXYKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUv
SmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gNTIzNDYp
CisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qCSh3b3JraW5nIGNvcHkpCkBAIC0yMDcsNiArMjA3LDggQEAKIAkJODY5MDgzMTUwRTY1MThE
NzAwMEQzNkVEIC8qIFdSRUMuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gODY5MDgzMTMwRTY1MThENzAwMEQzNkVEIC8qIFdSRUMuY3BwICovOyB9Owog
CQk4NjkwODMxNjBFNjUxOEQ3MDAwRDM2RUQgLyogV1JFQy5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODY5MDgzMTQwRTY1MThENzAwMEQzNkVEIC8qIFdS
RUMuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQk4
Njk4Qjg2OTEwRDQ0RDk0MDBEOEQwMUIgLyogU3RyaW5nQnVpbGRlci5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODY5OEI4NjgxMEQ0NEQ5NDAwRDhEMDFC
IC8qIFN0cmluZ0J1aWxkZXIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRl
LCApOyB9OyB9OworCQk4Njk4QkIzOTEwRDg2QkFGMDBEOEQwMUIgLyogVVN0cmluZ0ltcGwuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDg2OThCQjM3MTBE
ODZCQUYwMEQ4RDAxQiAvKiBVU3RyaW5nSW1wbC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVT
ID0gKFByaXZhdGUsICk7IH07IH07CisJCTg2OThCQjNBMTBEODZCQUYwMEQ4RDAxQiAvKiBVU3Ry
aW5nSW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSA4Njk4QkIzODEwRDg2QkFGMDBEOEQwMUIgLyogVVN0cmluZ0ltcGwuY3BwICovOyB9OwogCQk4
NjlFQkNCNzBFOEM2RDRBMDA4NzIyQ0MgLyogUmVzdWx0VHlwZS5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODY5RUJDQjYwRThDNkQ0QTAwODcyMkNDIC8q
IFJlc3VsdFR5cGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9
OyB9OwogCQk4NkE5MEVEMDBFRTdENTFGMDBBQjM1MEQgLyogSklUQXJpdGhtZXRpYy5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4NkE5MEVDRjBFRTdE
NTFGMDBBQjM1MEQgLyogSklUQXJpdGhtZXRpYy5jcHAgKi87IH07CiAJCTg2QUREMTQ1MEZEREVB
OTgwMDA2RUVDMiAvKiBBUk12N0Fzc2VtYmxlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gODZBREQxNDMwRkRERUE5ODAwMDZFRUMyIC8qIEFSTXY3QXNz
ZW1ibGVyLmggKi87IH07CkBAIC03MzQsNiArNzM2LDggQEAKIAkJODY5MDgzMTMwRTY1MThENzAw
MEQzNkVEIC8qIFdSRUMuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
V1JFQy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTg2OTA4MzE0MEU2NTE4RDcw
MDBEMzZFRCAvKiBXUkVDLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFdSRUMu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODY5OEI4NjgxMEQ0NEQ5NDAwRDhEMDFC
IC8qIFN0cmluZ0J1aWxkZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU3Ry
aW5nQnVpbGRlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4Njk4QkIzNzEwRDg2
QkFGMDBEOEQwMUIgLyogVVN0cmluZ0ltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gVVN0cmluZ0ltcGwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJODY5OEJC
MzgxMEQ4NkJBRjAwRDhEMDFCIC8qIFVTdHJpbmdJbXBsLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgcGF0aCA9IFVTdHJpbmdJbXBsLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJODY5RUJDQjYwRThDNkQ0QTAwODcyMkNDIC8qIFJlc3VsdFR5cGUuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVzdWx0VHlwZS5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQk4NkE5MEVDRjBFRTdENTFGMDBBQjM1MEQgLyogSklUQXJpdGhtZXRpYy5j
cHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKSVRBcml0aG1ldGljLmNw
cDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODZBREQxNDMwRkRERUE5ODAwMDZFRUMy
IC8qIEFSTXY3QXNzZW1ibGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFS
TXY3QXNzZW1ibGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xNjEwLDYgKzE2
MTQsOCBAQAogCQkJCTVENTM3MjZFMEUxQzU0ODgwMDIxRTU0OSAvKiBUcmFjaW5nLmggKi8sCiAJ
CQkJRjY5MkE4ODUwMjU1NTk3RDAxRkY2MEY3IC8qIFVTdHJpbmcuY3BwICovLAogCQkJCUY2OTJB
ODg2MDI1NTU5N0QwMUZGNjBGNyAvKiBVU3RyaW5nLmggKi8sCisJCQkJODY5OEJCMzgxMEQ4NkJB
RjAwRDhEMDFCIC8qIFVTdHJpbmdJbXBsLmNwcCAqLywKKwkJCQk4Njk4QkIzNzEwRDg2QkFGMDBE
OEQwMUIgLyogVVN0cmluZ0ltcGwuaCAqLywKIAkJCQkxNEJGQ0U2ODEwQ0RCMUZDMDAzNjRDQ0Ug
LyogV2Vha0dDTWFwLmggKi8sCiAJCQkJMTQwMzVEQjAxMERCRkIyQTAwRkZGRkU3IC8qIFdlYWtH
Q1B0ci5oICovLAogCQkJCTE0MjBCRTdBMTBBQTZEREIwMEY0NTVEMiAvKiBXZWFrUmFuZG9tLmgg
Ki8sCkBAIC0yMDI3LDYgKzIwMzMsNyBAQAogCQkJCTE0QTE1NjMyMTA5NjYzNjUwMDZGQTI2MCAv
KiBEYXRlSW5zdGFuY2VDYWNoZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMTQyMEJFN0IxMEFBNkRE
QjAwRjQ1NUQyIC8qIFdlYWtSYW5kb20uaCBpbiBIZWFkZXJzICovLAogCQkJCTg2OThCODY5MTBE
NDREOTQwMEQ4RDAxQiAvKiBTdHJpbmdCdWlsZGVyLmggaW4gSGVhZGVycyAqLywKKwkJCQk4Njk4
QkIzOTEwRDg2QkFGMDBEOEQwMUIgLyogVVN0cmluZ0ltcGwuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTE0MDM1REIxMTBEQkZCMkEwMEZGRkZFNyAvKiBXZWFrR0NQdHIuaCBpbiBIZWFkZXJzICovLAog
CQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwpAQCAtMjQ3
Miw2ICsyNDc5LDcgQEAKIAkJCQkxNDI5REFDMDBFRDI2M0U3MDBCODk2MTkgLyogV1JFQ1BhcnNl
ci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBN0MyMjE3ODEwQzc0Nzk0MDBGOTc5MTMgLyogSlNa
b21iaWUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNjU1RUIyOUIxMENFMjU4MTAwMUE5OTBFIC8q
IE5vZGVzQ29kZWdlbi5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk4Njk4QkIzQTEwRDg2QkFGMDBE
OEQwMUIgLyogVVN0cmluZ0ltcGwuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25s
eUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBKYXZhU2NyaXB0
Q29yZS9ydW50aW1lL0pTU3RyaW5nLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9y
dW50aW1lL0pTU3RyaW5nLmNwcAkocmV2aXNpb24gNTIzNDYpCisrKyBKYXZhU2NyaXB0Q29yZS9y
dW50aW1lL0pTU3RyaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTYsMTMgKzk2LDEzIEBAIHZv
aWQgSlNTdHJpbmc6OnJlc29sdmVSb3BlKEV4ZWNTdGF0ZSogZXgKIAogICAgIC8vIEFsbG9jYXRl
IHRoZSBidWZmZXIgdG8gaG9sZCB0aGUgZmluYWwgc3RyaW5nLCBwb3NpdGlvbiBpbml0aWFsbHkg
cG9pbnRzIHRvIHRoZSBlbmQuCiAgICAgVUNoYXIqIGJ1ZmZlcjsKLSAgICBpZiAoIXRyeUZhc3RN
YWxsb2MobV9zdHJpbmdMZW5ndGggKiBzaXplb2YoVUNoYXIpKS5nZXRWYWx1ZShidWZmZXIpKSB7
CisgICAgbV92YWx1ZSA9IFVTdHJpbmc6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQobV9zdHJpbmdMZW5n
dGgsIGJ1ZmZlcik7CisgICAgaWYgKCFidWZmZXIpIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IG1fcm9wZUxlbmd0aDsgKytpKQogICAgICAgICAgICAgbV9maWJlcnNbaV0uZGVy
ZWYoKTsKICAgICAgICAgbV9yb3BlTGVuZ3RoID0gMDsKICAgICAgICAgQVNTRVJUKCFpc1JvcGUo
KSk7CiAgICAgICAgIEFTU0VSVChtX3ZhbHVlID09IFVTdHJpbmcoKSk7Ci0KICAgICAgICAgdGhy
b3dPdXRPZk1lbW9yeUVycm9yKGV4ZWMpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTMz
LDcgKzEzMyw2IEBAIHZvaWQgSlNTdHJpbmc6OnJlc29sdmVSb3BlKEV4ZWNTdGF0ZSogZXgKICAg
ICAgICAgICAgIGlmICh3b3JrUXVldWUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgLy8g
Q3JlYXRlIGEgc3RyaW5nIGZyb20gdGhlIFVDaGFyIGJ1ZmZlciwgY2xlYXIgdGhlIHJvcGUgUmVm
UHRyLgogICAgICAgICAgICAgICAgIEFTU0VSVChidWZmZXIgPT0gcG9zaXRpb24pOwotICAgICAg
ICAgICAgICAgIG1fdmFsdWUgPSBVU3RyaW5nOjpSZXA6OmNyZWF0ZShidWZmZXIsIG1fc3RyaW5n
TGVuZ3RoKTsKICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9yb3Bl
TGVuZ3RoOyArK2kpCiAgICAgICAgICAgICAgICAgICAgIG1fZmliZXJzW2ldLmRlcmVmKCk7CiAg
ICAgICAgICAgICAgICAgbV9yb3BlTGVuZ3RoID0gMDsKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3J1
bnRpbWUvU21hbGxTdHJpbmdzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ydW50
aW1lL1NtYWxsU3RyaW5ncy5jcHAJKHJldmlzaW9uIDUyMzQ2KQorKysgSmF2YVNjcmlwdENvcmUv
cnVudGltZS9TbWFsbFN0cmluZ3MuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MiwzMCArNDIsMjIg
QEAgcHVibGljOgogCiBwcml2YXRlOgogICAgIFVDaGFyIG1fY2hhcmFjdGVyc1tudW1DaGFyYWN0
ZXJzVG9TdG9yZV07Ci0gICAgVVN0cmluZzo6QmFzZVN0cmluZyBtX2Jhc2U7CisgICAgVVN0cmlu
Zzo6UmVwIG1fYmFzZTsKICAgICBVU3RyaW5nOjpSZXAgbV9yZXBzW251bUNoYXJhY3RlcnNUb1N0
b3JlXTsKIH07CiAKIFNtYWxsU3RyaW5nc1N0b3JhZ2U6OlNtYWxsU3RyaW5nc1N0b3JhZ2UoKQot
ICAgIDogbV9iYXNlKG1fY2hhcmFjdGVycywgbnVtQ2hhcmFjdGVyc1RvU3RvcmUpCisgICAgOiBt
X2Jhc2UobV9jaGFyYWN0ZXJzLCBudW1DaGFyYWN0ZXJzVG9TdG9yZSwgVVN0cmluZ0ltcGw6OkNv
bnN0cnVjdFN0YXRpY1N0cmluZykKIHsKLSAgICBtX2Jhc2UucmMgPSBudW1DaGFyYWN0ZXJzVG9T
dG9yZSArIDE7CiAgICAgLy8gbWFrZSBzdXJlIFVTdHJpbmcgZG9lc24ndCB0cnkgdG8gcmV1c2Ug
dGhlIGJ1ZmZlciBieSBwcmV0ZW5kaW5nIHdlIGhhdmUgb25lIG1vcmUgY2hhcmFjdGVyIGluIGl0
Ci0gICAgbV9iYXNlLnVzZWRDYXBhY2l0eSA9IG51bUNoYXJhY3RlcnNUb1N0b3JlICsgMTsKLSAg
ICBtX2Jhc2UuY2FwYWNpdHkgPSBudW1DaGFyYWN0ZXJzVG9TdG9yZSArIDE7CiAgICAgbV9iYXNl
LmNoZWNrQ29uc2lzdGVuY3koKTsKIAogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1D
aGFyYWN0ZXJzVG9TdG9yZTsgKytpKQogICAgICAgICBtX2NoYXJhY3RlcnNbaV0gPSBpOwogCiAg
ICAgbWVtc2V0KCZtX3JlcHMsIDAsIHNpemVvZihtX3JlcHMpKTsKLSAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgbnVtQ2hhcmFjdGVyc1RvU3RvcmU7ICsraSkgewotICAgICAgICBtX3JlcHNb
aV0ub2Zmc2V0ID0gaTsKLSAgICAgICAgbV9yZXBzW2ldLmxlbiA9IDE7Ci0gICAgICAgIG1fcmVw
c1tpXS5yYyA9IDE7Ci0gICAgICAgIG1fcmVwc1tpXS5zZXRCYXNlU3RyaW5nKCZtX2Jhc2UpOwot
ICAgICAgICBtX3JlcHNbaV0uY2hlY2tDb25zaXN0ZW5jeSgpOwotICAgIH0KKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgbnVtQ2hhcmFjdGVyc1RvU3RvcmU7ICsraSkKKyAgICAgICAgbmV3
ICgmbV9yZXBzW2ldKSBVU3RyaW5nOjpSZXAobV9iYXNlLmRhdGEoKSArIGksIDEsICZtX2Jhc2Up
OwogfQogCiBTbWFsbFN0cmluZ3M6OlNtYWxsU3RyaW5ncygpCkluZGV4OiBKYXZhU2NyaXB0Q29y
ZS9ydW50aW1lL1VTdHJpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3J1bnRp
bWUvVVN0cmluZy5jcHAJKHJldmlzaW9uIDUyMzQ2KQorKysgSmF2YVNjcmlwdENvcmUvcnVudGlt
ZS9VU3RyaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTIsNTIgKzUyLDExIEBAIHVzaW5nIG5h
bWVzcGFjZSBXVEY7CiB1c2luZyBuYW1lc3BhY2UgV1RGOjpVbmljb2RlOwogdXNpbmcgbmFtZXNw
YWNlIHN0ZDsKIAotLy8gVGhpcyBjYW4gYmUgdHVuZWQgZGlmZmVyZW50bHkgcGVyIHBsYXRmb3Jt
IGJ5IHB1dHRpbmcgcGxhdGZvcm0gI2lmcyByaWdodCBoZXJlLgotLy8gSWYgeW91IGRvbid0IGRl
ZmluZSB0aGlzIG1hY3JvIGF0IGFsbCwgdGhlbiBjb3B5Q2hhcnMgd2lsbCBqdXN0IGNhbGwgZGly
ZWN0bHkKLS8vIHRvIG1lbWNweS4KLSNkZWZpbmUgVVNUUklOR19DT1BZX0NIQVJTX0lOTElORV9D
VVRPRkYgMjAKLQogbmFtZXNwYWNlIEpTQyB7CiAgCiBleHRlcm4gY29uc3QgZG91YmxlIE5hTjsK
IGV4dGVybiBjb25zdCBkb3VibGUgSW5mOwogCi0vLyBUaGlzIG51bWJlciBtdXN0IGJlIGF0IGxl
YXN0IDIgdG8gYXZvaWQgc2hhcmluZyBlbXB0eSwgbnVsbCBhcyB3ZWxsIGFzIDEgY2hhcmFjdGVy
IHN0cmluZ3MgZnJvbSBTbWFsbFN0cmluZ3MuCi1zdGF0aWMgY29uc3QgaW50IG1pbkxlbmd0aFRv
U2hhcmUgPSAxMDsKLQotc3RhdGljIGlubGluZSBzaXplX3Qgb3ZlcmZsb3dJbmRpY2F0b3IoKSB7
IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpOyB9Ci1zdGF0aWMgaW5s
aW5lIHNpemVfdCBtYXhVQ2hhcnMoKSB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVf
dD46Om1heCgpIC8gc2l6ZW9mKFVDaGFyKTsgfQotCi1zdGF0aWMgaW5saW5lIFBvc3NpYmx5TnVs
bDxVQ2hhcio+IGFsbG9jQ2hhcnMoc2l6ZV90IGxlbmd0aCkKLXsKLSAgICBBU1NFUlQobGVuZ3Ro
KTsKLSAgICBpZiAobGVuZ3RoID4gbWF4VUNoYXJzKCkpCi0gICAgICAgIHJldHVybiAwOwotICAg
IHJldHVybiB0cnlGYXN0TWFsbG9jKHNpemVvZihVQ2hhcikgKiBsZW5ndGgpOwotfQotCi1zdGF0
aWMgaW5saW5lIFBvc3NpYmx5TnVsbDxVQ2hhcio+IHJlYWxsb2NDaGFycyhVQ2hhciogYnVmZmVy
LCBzaXplX3QgbGVuZ3RoKQotewotICAgIEFTU0VSVChsZW5ndGgpOwotICAgIGlmIChsZW5ndGgg
PiBtYXhVQ2hhcnMoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHRyeUZhc3RSZWFs
bG9jKGJ1ZmZlciwgc2l6ZW9mKFVDaGFyKSAqIGxlbmd0aCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUg
dm9pZCBjb3B5Q2hhcnMoVUNoYXIqIGRlc3RpbmF0aW9uLCBjb25zdCBVQ2hhciogc291cmNlLCB1
bnNpZ25lZCBudW1DaGFyYWN0ZXJzKQotewotI2lmZGVmIFVTVFJJTkdfQ09QWV9DSEFSU19JTkxJ
TkVfQ1VUT0ZGCi0gICAgaWYgKG51bUNoYXJhY3RlcnMgPD0gVVNUUklOR19DT1BZX0NIQVJTX0lO
TElORV9DVVRPRkYpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUNoYXJh
Y3RlcnM7ICsraSkKLSAgICAgICAgICAgIGRlc3RpbmF0aW9uW2ldID0gc291cmNlW2ldOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gICAgbWVtY3B5KGRlc3RpbmF0aW9uLCBzb3Vy
Y2UsIG51bUNoYXJhY3RlcnMgKiBzaXplb2YoVUNoYXIpKTsKLX0KLQotQ09NUElMRV9BU1NFUlQo
c2l6ZW9mKFVDaGFyKSA9PSAyLCB1Y2hhcl9pc18yX2J5dGVzKTsKLQogQ1N0cmluZzo6Q1N0cmlu
Zyhjb25zdCBjaGFyKiBjKQogICAgIDogbV9sZW5ndGgoc3RybGVuKGMpKQogICAgICwgbV9kYXRh
KG5ldyBjaGFyW21fbGVuZ3RoICsgMV0pCkBAIC0xOTAsMzcxICsxNDksMTcgQEAgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IENTdHJpbmcmIGMxLCBjb25zdAogLy8gVGhlc2Ugc3RhdGljIHN0cmluZ3Mg
YXJlIGltbXV0YWJsZSwgZXhjZXB0IGZvciByYywgd2hvc2UgaW5pdGlhbCB2YWx1ZSBpcyBjaG9z
ZW4gdG8gCiAvLyByZWR1Y2UgdGhlIHBvc3NpYmlsaXR5IG9mIGl0IGJlY29taW5nIHplcm8gZHVl
IHRvIHJlZi9kZXJlZiBub3QgYmVpbmcgdGhyZWFkLXNhZmUuCiBzdGF0aWMgVUNoYXIgc2hhcmVk
RW1wdHlDaGFyOwotVVN0cmluZzo6QmFzZVN0cmluZyogVVN0cmluZzo6UmVwOjpudWxsQmFzZVN0
cmluZzsKLVVTdHJpbmc6OkJhc2VTdHJpbmcqIFVTdHJpbmc6OlJlcDo6ZW1wdHlCYXNlU3RyaW5n
OworVVN0cmluZ0ltcGwqIFVTdHJpbmdJbXBsOjpudWxsVVN0cmluZ0ltcGw7CitVU3RyaW5nSW1w
bCogVVN0cmluZ0ltcGw6OmVtcHR5VVN0cmluZ0ltcGw7CiBVU3RyaW5nKiBVU3RyaW5nOjpudWxs
VVN0cmluZzsKIAotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZVN0YXRpY0Jhc2VTdHJpbmcoVVN0cmlu
Zzo6QmFzZVN0cmluZyYgYmFzZSkKLXsKLSAgICBiYXNlLnJjID0gSU5UX01BWCAvIDI7Ci0gICAg
YmFzZS5tX2lkZW50aWZpZXJUYWJsZUFuZEZsYWdzLnNldEZsYWcoVVN0cmluZzo6UmVwOjpTdGF0
aWNGbGFnKTsKLSAgICBiYXNlLmNoZWNrQ29uc2lzdGVuY3koKTsKLX0KLQogdm9pZCBpbml0aWFs
aXplVVN0cmluZygpCiB7Ci0gICAgVVN0cmluZzo6UmVwOjpudWxsQmFzZVN0cmluZyA9IG5ldyBV
U3RyaW5nOjpCYXNlU3RyaW5nKDAsIDApOwotICAgIGluaXRpYWxpemVTdGF0aWNCYXNlU3RyaW5n
KCpVU3RyaW5nOjpSZXA6Om51bGxCYXNlU3RyaW5nKTsKLQotICAgIFVTdHJpbmc6OlJlcDo6ZW1w
dHlCYXNlU3RyaW5nID0gbmV3IFVTdHJpbmc6OkJhc2VTdHJpbmcoJnNoYXJlZEVtcHR5Q2hhciwg
MCk7Ci0gICAgaW5pdGlhbGl6ZVN0YXRpY0Jhc2VTdHJpbmcoKlVTdHJpbmc6OlJlcDo6ZW1wdHlC
YXNlU3RyaW5nKTsKLQorICAgIFVTdHJpbmdJbXBsOjpudWxsVVN0cmluZ0ltcGwgPSBuZXcgVVN0
cmluZ0ltcGwoMCwgMCwgVVN0cmluZ0ltcGw6OkNvbnN0cnVjdFN0YXRpY1N0cmluZyk7CisgICAg
VVN0cmluZ0ltcGw6OmVtcHR5VVN0cmluZ0ltcGwgPSBuZXcgVVN0cmluZ0ltcGwoJnNoYXJlZEVt
cHR5Q2hhciwgMCwgVVN0cmluZ0ltcGw6OkNvbnN0cnVjdFN0YXRpY1N0cmluZyk7CiAgICAgVVN0
cmluZzo6bnVsbFVTdHJpbmcgPSBuZXcgVVN0cmluZzsKIH0KIAotc3RhdGljIGNoYXIqIHN0YXRC
dWZmZXIgPSAwOyAvLyBPbmx5IHVzZWQgZm9yIGRlYnVnZ2luZyB2aWEgVVN0cmluZzo6YXNjaWko
KS4KLQotUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IFVTdHJpbmc6OlJlcDo6Y3JlYXRlQ29weWlu
Zyhjb25zdCBVQ2hhciogZCwgaW50IGwpCi17Ci0gICAgVUNoYXIqIGNvcHlEID0gc3RhdGljX2Nh
c3Q8VUNoYXIqPihmYXN0TWFsbG9jKGwgKiBzaXplb2YoVUNoYXIpKSk7Ci0gICAgY29weUNoYXJz
KGNvcHlELCBkLCBsKTsKLSAgICByZXR1cm4gY3JlYXRlKGNvcHlELCBsKTsKLX0KLQotUGFzc1Jl
ZlB0cjxVU3RyaW5nOjpSZXA+IFVTdHJpbmc6OlJlcDo6Y3JlYXRlRnJvbVVURjgoY29uc3QgY2hh
ciogc3RyaW5nKQotewotICAgIGlmICghc3RyaW5nKQotICAgICAgICByZXR1cm4gJlVTdHJpbmc6
OlJlcDo6bnVsbCgpOwotCi0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihzdHJpbmcpOwotICAg
IFZlY3RvcjxVQ2hhciwgMTAyND4gYnVmZmVyKGxlbmd0aCk7Ci0gICAgVUNoYXIqIHAgPSBidWZm
ZXIuZGF0YSgpOwotICAgIGlmIChjb252ZXJzaW9uT0sgIT0gY29udmVydFVURjhUb1VURjE2KCZz
dHJpbmcsIHN0cmluZyArIGxlbmd0aCwgJnAsIHAgKyBsZW5ndGgpKQotICAgICAgICByZXR1cm4g
JlVTdHJpbmc6OlJlcDo6bnVsbCgpOwotCi0gICAgcmV0dXJuIFVTdHJpbmc6OlJlcDo6Y3JlYXRl
Q29weWluZyhidWZmZXIuZGF0YSgpLCBwIC0gYnVmZmVyLmRhdGEoKSk7Ci19Ci0KLVBhc3NSZWZQ
dHI8VVN0cmluZzo6UmVwPiBVU3RyaW5nOjpSZXA6OmNyZWF0ZShVQ2hhciogc3RyaW5nLCBpbnQg
bGVuZ3RoLCBQYXNzUmVmUHRyPFVTdHJpbmc6OlNoYXJlZFVDaGFyPiBzaGFyZWRCdWZmZXIpCi17
Ci0gICAgUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IHJlcCA9IGNyZWF0ZShzdHJpbmcsIGxlbmd0
aCk7Ci0gICAgcmVwLT5iYXNlU3RyaW5nKCktPnNldFNoYXJlZEJ1ZmZlcihzaGFyZWRCdWZmZXIp
OwotICAgIHJlcC0+Y2hlY2tDb25zaXN0ZW5jeSgpOwotICAgIHJldHVybiByZXA7Ci19Ci0KLVVT
dHJpbmc6OlNoYXJlZFVDaGFyKiBVU3RyaW5nOjpSZXA6OnNoYXJlZEJ1ZmZlcigpCi17Ci0gICAg
VVN0cmluZzo6QmFzZVN0cmluZyogYmFzZSA9IGJhc2VTdHJpbmcoKTsKLSAgICBpZiAobGVuIDwg
bWluTGVuZ3RoVG9TaGFyZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gYmFzZS0+
c2hhcmVkQnVmZmVyKCk7Ci19Ci0KLXZvaWQgVVN0cmluZzo6UmVwOjpkZXN0cm95KCkKLXsKLSAg
ICBjaGVja0NvbnNpc3RlbmN5KCk7Ci0KLSAgICAvLyBTdGF0aWMgbnVsbCBhbmQgZW1wdHkgc3Ry
aW5ncyBjYW4gbmV2ZXIgYmUgZGVzdHJveWVkLCBidXQgd2UgY2Fubm90IHJlbHkgb24gCi0gICAg
Ly8gcmVmZXJlbmNlIGNvdW50aW5nLCBiZWNhdXNlIHJlZi9kZXJlZiBhcmUgbm90IHRocmVhZC1z
YWZlLgotICAgIGlmICghaXNTdGF0aWMoKSkgewotICAgICAgICBpZiAoaWRlbnRpZmllclRhYmxl
KCkpCi0gICAgICAgICAgICBJZGVudGlmaWVyOjpyZW1vdmUodGhpcyk7Ci0KLSAgICAgICAgVVN0
cmluZzo6QmFzZVN0cmluZyogYmFzZSA9IGJhc2VTdHJpbmcoKTsKLSAgICAgICAgaWYgKGJhc2Ug
PT0gdGhpcykgewotICAgICAgICAgICAgaWYgKG1fc2hhcmVkQnVmZmVyKQotICAgICAgICAgICAg
ICAgIG1fc2hhcmVkQnVmZmVyLT5kZXJlZigpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAg
ICAgICAgIGZhc3RGcmVlKGJhc2UtPmJ1Zik7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAg
YmFzZS0+ZGVyZWYoKTsKLQotICAgICAgICBkZWxldGUgdGhpczsKLSAgICB9Ci19Ci0KLS8vIEdv
bGRlbiByYXRpbyAtIGFyYml0cmFyeSBzdGFydCB2YWx1ZSB0byBhdm9pZCBtYXBwaW5nIGFsbCAw
J3MgdG8gYWxsIDAncwotLy8gb3IgYW55dGhpbmcgbGlrZSB0aGF0LgotY29uc3QgdW5zaWduZWQg
UEhJID0gMHg5ZTM3NzliOVU7Ci0KLS8vIFBhdWwgSHNpZWgncyBTdXBlckZhc3RIYXNoCi0vLyBo
dHRwOi8vd3d3LmF6aWxsaW9ubW9ua2V5cy5jb20vcWVkL2hhc2guaHRtbAotdW5zaWduZWQgVVN0
cmluZzo6UmVwOjpjb21wdXRlSGFzaChjb25zdCBVQ2hhciogcywgaW50IGxlbikKLXsKLSAgICB1
bnNpZ25lZCBsID0gbGVuOwotICAgIHVpbnQzMl90IGhhc2ggPSBQSEk7Ci0gICAgdWludDMyX3Qg
dG1wOwotCi0gICAgaW50IHJlbSA9IGwgJiAxOwotICAgIGwgPj49IDE7Ci0KLSAgICAvLyBNYWlu
IGxvb3AKLSAgICBmb3IgKDsgbCA+IDA7IGwtLSkgewotICAgICAgICBoYXNoICs9IHNbMF07Ci0g
ICAgICAgIHRtcCA9IChzWzFdIDw8IDExKSBeIGhhc2g7Ci0gICAgICAgIGhhc2ggPSAoaGFzaCA8
PCAxNikgXiB0bXA7Ci0gICAgICAgIHMgKz0gMjsKLSAgICAgICAgaGFzaCArPSBoYXNoID4+IDEx
OwotICAgIH0KLQotICAgIC8vIEhhbmRsZSBlbmQgY2FzZQotICAgIGlmIChyZW0pIHsKLSAgICAg
ICAgaGFzaCArPSBzWzBdOwotICAgICAgICBoYXNoIF49IGhhc2ggPDwgMTE7Ci0gICAgICAgIGhh
c2ggKz0gaGFzaCA+PiAxNzsKLSAgICB9Ci0KLSAgICAvLyBGb3JjZSAiYXZhbGFuY2hpbmciIG9m
IGZpbmFsIDEyNyBiaXRzCi0gICAgaGFzaCBePSBoYXNoIDw8IDM7Ci0gICAgaGFzaCArPSBoYXNo
ID4+IDU7Ci0gICAgaGFzaCBePSBoYXNoIDw8IDI7Ci0gICAgaGFzaCArPSBoYXNoID4+IDE1Owot
ICAgIGhhc2ggXj0gaGFzaCA8PCAxMDsKLQotICAgIC8vIHRoaXMgYXZvaWRzIGV2ZXIgcmV0dXJu
aW5nIGEgaGFzaCBjb2RlIG9mIDAsIHNpbmNlIHRoYXQgaXMgdXNlZCB0bwotICAgIC8vIHNpZ25h
bCAiaGFzaCBub3QgY29tcHV0ZWQgeWV0IiwgdXNpbmcgYSB2YWx1ZSB0aGF0IGlzIGxpa2VseSB0
byBiZQotICAgIC8vIGVmZmVjdGl2ZWx5IHRoZSBzYW1lIGFzIDAgd2hlbiB0aGUgbG93IGJpdHMg
YXJlIG1hc2tlZAotICAgIGlmIChoYXNoID09IDApCi0gICAgICAgIGhhc2ggPSAweDgwMDAwMDAw
OwotCi0gICAgcmV0dXJuIGhhc2g7Ci19Ci0KLS8vIFBhdWwgSHNpZWgncyBTdXBlckZhc3RIYXNo
Ci0vLyBodHRwOi8vd3d3LmF6aWxsaW9ubW9ua2V5cy5jb20vcWVkL2hhc2guaHRtbAotdW5zaWdu
ZWQgVVN0cmluZzo6UmVwOjpjb21wdXRlSGFzaChjb25zdCBjaGFyKiBzLCBpbnQgbCkKLXsKLSAg
ICAvLyBUaGlzIGhhc2ggaXMgZGVzaWduZWQgdG8gd29yayBvbiAxNi1iaXQgY2h1bmtzIGF0IGEg
dGltZS4gQnV0IHNpbmNlIHRoZSBub3JtYWwgY2FzZQotICAgIC8vIChhYm92ZSkgaXMgdG8gaGFz
aCBVVEYtMTYgY2hhcmFjdGVycywgd2UganVzdCB0cmVhdCB0aGUgOC1iaXQgY2hhcnMgYXMgaWYg
dGhleQotICAgIC8vIHdlcmUgMTYtYml0IGNodW5rcywgd2hpY2ggc2hvdWxkIGdpdmUgbWF0Y2hp
bmcgcmVzdWx0cwotCi0gICAgdWludDMyX3QgaGFzaCA9IFBISTsKLSAgICB1aW50MzJfdCB0bXA7
Ci0KLSAgICBzaXplX3QgcmVtID0gbCAmIDE7Ci0gICAgbCA+Pj0gMTsKLQotICAgIC8vIE1haW4g
bG9vcAotICAgIGZvciAoOyBsID4gMDsgbC0tKSB7Ci0gICAgICAgIGhhc2ggKz0gc3RhdGljX2Nh
c3Q8dW5zaWduZWQgY2hhcj4oc1swXSk7Ci0gICAgICAgIHRtcCA9IChzdGF0aWNfY2FzdDx1bnNp
Z25lZCBjaGFyPihzWzFdKSA8PCAxMSkgXiBoYXNoOwotICAgICAgICBoYXNoID0gKGhhc2ggPDwg
MTYpIF4gdG1wOwotICAgICAgICBzICs9IDI7Ci0gICAgICAgIGhhc2ggKz0gaGFzaCA+PiAxMTsK
LSAgICB9Ci0KLSAgICAvLyBIYW5kbGUgZW5kIGNhc2UKLSAgICBpZiAocmVtKSB7Ci0gICAgICAg
IGhhc2ggKz0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc1swXSk7Ci0gICAgICAgIGhhc2gg
Xj0gaGFzaCA8PCAxMTsKLSAgICAgICAgaGFzaCArPSBoYXNoID4+IDE3OwotICAgIH0KLQotICAg
IC8vIEZvcmNlICJhdmFsYW5jaGluZyIgb2YgZmluYWwgMTI3IGJpdHMKLSAgICBoYXNoIF49IGhh
c2ggPDwgMzsKLSAgICBoYXNoICs9IGhhc2ggPj4gNTsKLSAgICBoYXNoIF49IGhhc2ggPDwgMjsK
LSAgICBoYXNoICs9IGhhc2ggPj4gMTU7Ci0gICAgaGFzaCBePSBoYXNoIDw8IDEwOwotCi0gICAg
Ly8gdGhpcyBhdm9pZHMgZXZlciByZXR1cm5pbmcgYSBoYXNoIGNvZGUgb2YgMCwgc2luY2UgdGhh
dCBpcyB1c2VkIHRvCi0gICAgLy8gc2lnbmFsICJoYXNoIG5vdCBjb21wdXRlZCB5ZXQiLCB1c2lu
ZyBhIHZhbHVlIHRoYXQgaXMgbGlrZWx5IHRvIGJlCi0gICAgLy8gZWZmZWN0aXZlbHkgdGhlIHNh
bWUgYXMgMCB3aGVuIHRoZSBsb3cgYml0cyBhcmUgbWFza2VkCi0gICAgaWYgKGhhc2ggPT0gMCkK
LSAgICAgICAgaGFzaCA9IDB4ODAwMDAwMDA7Ci0KLSAgICByZXR1cm4gaGFzaDsKLX0KLQotI2lm
bmRlZiBOREVCVUcKLXZvaWQgVVN0cmluZzo6UmVwOjpjaGVja0NvbnNpc3RlbmN5KCkgY29uc3QK
LXsKLSAgICBjb25zdCBVU3RyaW5nOjpCYXNlU3RyaW5nKiBiYXNlID0gYmFzZVN0cmluZygpOwot
Ci0gICAgLy8gVGhlcmUgaXMgbm8gcmVjdXJzaW9uIGZvciBiYXNlIHN0cmluZ3MuCi0gICAgQVNT
RVJUKGJhc2UgPT0gYmFzZS0+YmFzZVN0cmluZygpKTsKLQotICAgIGlmIChpc1N0YXRpYygpKSB7
Ci0gICAgICAgIC8vIFRoZXJlIGFyZSBvbmx5IHR3byBzdGF0aWMgc3RyaW5nczogbnVsbCBhbmQg
ZW1wdHkuCi0gICAgICAgIEFTU0VSVCghbGVuKTsKLQotICAgICAgICAvLyBTdGF0aWMgc3RyaW5n
cyBjYW5ub3QgZ2V0IGluIGlkZW50aWZpZXIgdGFibGVzLCBiZWNhdXNlIHRoZXkgYXJlIGdsb2Jh
bGx5IHNoYXJlZC4KLSAgICAgICAgQVNTRVJUKCFpZGVudGlmaWVyVGFibGUoKSk7Ci0gICAgfQot
Ci0gICAgLy8gVGhlIHN0cmluZyBmaXRzIGluIGJ1ZmZlci4KLSAgICBBU1NFUlQoYmFzZS0+dXNl
ZFByZUNhcGFjaXR5IDw9IGJhc2UtPnByZUNhcGFjaXR5KTsKLSAgICBBU1NFUlQoYmFzZS0+dXNl
ZENhcGFjaXR5IDw9IGJhc2UtPmNhcGFjaXR5KTsKLSAgICBBU1NFUlQoLW9mZnNldCA8PSBiYXNl
LT51c2VkUHJlQ2FwYWNpdHkpOwotICAgIEFTU0VSVChvZmZzZXQgKyBsZW4gPD0gYmFzZS0+dXNl
ZENhcGFjaXR5KTsKLX0KLSNlbmRpZgotCi1VU3RyaW5nOjpTaGFyZWRVQ2hhciogVVN0cmluZzo6
QmFzZVN0cmluZzo6c2hhcmVkQnVmZmVyKCkKLXsKLSAgICBpZiAoIW1fc2hhcmVkQnVmZmVyKQot
ICAgICAgICBzZXRTaGFyZWRCdWZmZXIoU2hhcmVkVUNoYXI6OmNyZWF0ZShuZXcgT3duRmFzdE1h
bGxvY1B0cjxVQ2hhcj4oYnVmKSkpOwotICAgIHJldHVybiBtX3NoYXJlZEJ1ZmZlcjsKLX0KLQot
dm9pZCBVU3RyaW5nOjpCYXNlU3RyaW5nOjpzZXRTaGFyZWRCdWZmZXIoUGFzc1JlZlB0cjxVU3Ry
aW5nOjpTaGFyZWRVQ2hhcj4gc2hhcmVkQnVmZmVyKQotewotICAgIC8vIFRoZSBtYW51YWwgc3Rl
cHMgYmVsb3cgYXJlIGJlY2F1c2UgbV9zaGFyZWRCdWZmZXIgY2FuJ3QgYmUgYSBSZWZQdHIuIG1f
c2hhcmVkQnVmZmVyCi0gICAgLy8gaXMgaW4gYSB1bmlvbiB3aXRoIGFub3RoZXIgdmFyaWFibGUg
dG8gYXZvaWQgbWFraW5nIEJhc2VTdHJpbmcgYW55IGxhcmdlci4KLSAgICBpZiAobV9zaGFyZWRC
dWZmZXIpCi0gICAgICAgIG1fc2hhcmVkQnVmZmVyLT5kZXJlZigpOwotICAgIG1fc2hhcmVkQnVm
ZmVyID0gc2hhcmVkQnVmZmVyLnJlbGVhc2VSZWYoKTsKLX0KLQotYm9vbCBVU3RyaW5nOjpCYXNl
U3RyaW5nOjpzbG93SXNCdWZmZXJSZWFkT25seSgpCi17Ci0gICAgLy8gVGhlIGJ1ZmZlciBtYXkg
bm90IGJlIG1vZGlmaWVkIGFzIHNvb24gYXMgdGhlIHVuZGVybHlpbmcgZGF0YSBoYXMgYmVlbiBz
aGFyZWQgd2l0aCBhbm90aGVyIGNsYXNzLgotICAgIGlmIChtX3NoYXJlZEJ1ZmZlci0+aXNTaGFy
ZWQoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBr
bm93IGl0IHRoYXQgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlzbid0IHNoYXJlZCBvdXRzaWRlIG9m
IHRoaXMgYmFzZSBjbGFzcywKLSAgICAvLyBzbyBnZXQgcmlkIG9mIG1fc2hhcmVkQnVmZmVyLgot
ICAgIE93blB0cjxPd25GYXN0TWFsbG9jUHRyPFVDaGFyPiA+IG1hbGxvY1B0cihtX3NoYXJlZEJ1
ZmZlci0+cmVsZWFzZSgpKTsKLSAgICBVQ2hhciogdW5zaGFyZWRCdWYgPSBjb25zdF9jYXN0PFVD
aGFyKj4obWFsbG9jUHRyLT5yZWxlYXNlKCkpOwotICAgIHNldFNoYXJlZEJ1ZmZlcigwKTsKLSAg
ICBwcmVDYXBhY2l0eSArPSAoYnVmIC0gdW5zaGFyZWRCdWYpOwotICAgIGJ1ZiA9IHVuc2hhcmVk
QnVmOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gUHV0IHRoZXNlIGVhcmx5IHNvIHRoZXkg
Y2FuIGJlIGlubGluZWQuCi1zdGF0aWMgaW5saW5lIHNpemVfdCBleHBhbmRlZFNpemUoc2l6ZV90
IGNhcGFjaXR5U2l6ZSwgc2l6ZV90IHByZWNhcGFjaXR5U2l6ZSkKLXsKLSAgICAvLyBDb21iaW5l
IGNhcGFjaXR5U2l6ZSAmIHByZWNhcGFjaXR5U2l6ZSB0byBwcm9kdWNlIGEgc2luZ2xlIHNpemUg
dG8gYWxsb2NhdGUsCi0gICAgLy8gY2hlY2sgdGhhdCBkb2luZyBzbyBkb2VzIG5vdCByZXN1bHQg
aW4gb3ZlcmZsb3cuCi0gICAgc2l6ZV90IHNpemUgPSBjYXBhY2l0eVNpemUgKyBwcmVjYXBhY2l0
eVNpemU7Ci0gICAgaWYgKHNpemUgPCBjYXBhY2l0eVNpemUpCi0gICAgICAgIHJldHVybiBvdmVy
Zmxvd0luZGljYXRvcigpOwotCi0gICAgLy8gU21hbGwgU3RyaW5ncyAodXAgdG8gNCBwYWdlcyk6
Ci0gICAgLy8gRXhwYW5kIHRoZSBhbGxvY2F0aW9uIHNpemUgdG8gMTEyLjUlIG9mIHRoZSBhbW91
bnQgcmVxdWVzdGVkLiAgVGhpcyBpcyBsYXJnZWx5IHNpY2tpbmcKLSAgICAvLyB0byBvdXIgcHJl
dmlvdXMgcG9saWN5LCBob3dldmVyIDExMi41JSBpcyBjaGVhcGVyIHRvIGNhbGN1bGF0ZS4KLSAg
ICBpZiAoc2l6ZSA8IDB4NDAwMCkgewotICAgICAgICBzaXplX3QgZXhwYW5kZWRTaXplID0gKChz
aXplICsgKHNpemUgPj4gMykpIHwgMTUpICsgMTsKLSAgICAgICAgLy8gR2l2ZW4gdGhlIGxpbWl0
ZWQgcmFuZ2Ugd2l0aGluIHdoaWNoIHdlIGNhbGN1bGF0ZSB0aGUgZXhwYW5zaW9uIGluIHRoaXMK
LSAgICAgICAgLy8gZmFzaGlvbiB0aGUgYWJvdmUgY2FsY3VsYXRpb24gc2hvdWxkIG5ldmVyIG92
ZXJmbG93LgotICAgICAgICBBU1NFUlQoZXhwYW5kZWRTaXplID49IHNpemUpOwotICAgICAgICBB
U1NFUlQoZXhwYW5kZWRTaXplIDwgbWF4VUNoYXJzKCkpOwotICAgICAgICByZXR1cm4gZXhwYW5k
ZWRTaXplOwotICAgIH0KLQotICAgIC8vIE1lZGl1bSBTdHJpbmdzICh1cCB0byAxMjggcGFnZXMp
OgotICAgIC8vIEZvciBwYWdlcyBjb3ZlcmluZyBtdWx0aXBsZSBwYWdlcyBvdmVyLWFsbG9jYXRp
b24gaXMgbGVzcyBvZiBhIGNvbmNlcm4gLSBhbnkgdW51c2VkCi0gICAgLy8gc3BhY2Ugd2lsbCBu
b3QgYmUgcGFnZWQgaW4gaWYgaXQgaXMgbm90IHVzZWQsIHNvIHRoaXMgaXMgcHVyZWx5IGEgVk0g
b3ZlcmhlYWQuICBGb3IKLSAgICAvLyB0aGVzZSBzdHJpbmdzIGFsbG9jYXRlIDJ4IHRoZSByZXF1
ZXN0ZWQgc2l6ZS4KLSAgICBpZiAoc2l6ZSA8IDB4ODAwMDApIHsKLSAgICAgICAgc2l6ZV90IGV4
cGFuZGVkU2l6ZSA9ICgoc2l6ZSArIHNpemUpIHwgMHhmZmYpICsgMTsKLSAgICAgICAgLy8gR2l2
ZW4gdGhlIGxpbWl0ZWQgcmFuZ2Ugd2l0aGluIHdoaWNoIHdlIGNhbGN1bGF0ZSB0aGUgZXhwYW5z
aW9uIGluIHRoaXMKLSAgICAgICAgLy8gZmFzaGlvbiB0aGUgYWJvdmUgY2FsY3VsYXRpb24gc2hv
dWxkIG5ldmVyIG92ZXJmbG93LgotICAgICAgICBBU1NFUlQoZXhwYW5kZWRTaXplID49IHNpemUp
OwotICAgICAgICBBU1NFUlQoZXhwYW5kZWRTaXplIDwgbWF4VUNoYXJzKCkpOwotICAgICAgICBy
ZXR1cm4gZXhwYW5kZWRTaXplOwotICAgIH0KLQotICAgIC8vIExhcmdlIFN0cmluZ3MgKHRvIGlu
ZmluaXR5IGFuZCBiZXlvbmQhKToKLSAgICAvLyBSZXZlcnQgdG8gb3VyIDExMi41JSBwb2xpY3kg
LSBwcm9iYWJseSBiZXN0IHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgdW51c2VkIFZNIHdlIGFsbG93
Ci0gICAgLy8gYW55IGluZGl2aWR1YWwgc3RyaW5nIGJlIHJlc3BvbnNpYmxlIGZvci4KLSAgICBz
aXplX3QgZXhwYW5kZWRTaXplID0gKChzaXplICsgKHNpemUgPj4gMykpIHwgMHhmZmYpICsgMTsK
LQotICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdyAtIGFueSByZXN1bHQgdGhhdCBpcyBhdCBsZWFz
dCBhcyBsYXJnZSBhcyByZXF1ZXN0ZWQgKGJ1dAotICAgIC8vIHN0aWxsIGJlbG93IHRoZSBsaW1p
dCkgaXMgb2theS4KLSAgICBpZiAoKGV4cGFuZGVkU2l6ZSA+PSBzaXplKSAmJiAoZXhwYW5kZWRT
aXplIDwgbWF4VUNoYXJzKCkpKQotICAgICAgICByZXR1cm4gZXhwYW5kZWRTaXplOwotICAgIHJl
dHVybiBvdmVyZmxvd0luZGljYXRvcigpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgZXhwYW5k
Q2FwYWNpdHkoVVN0cmluZzo6UmVwKiByZXAsIGludCByZXF1aXJlZExlbmd0aCkKLXsKLSAgICBy
ZXAtPmNoZWNrQ29uc2lzdGVuY3koKTsKLSAgICBBU1NFUlQoIXJlcC0+YmFzZVN0cmluZygpLT5p
c0J1ZmZlclJlYWRPbmx5KCkpOwotCi0gICAgVVN0cmluZzo6QmFzZVN0cmluZyogYmFzZSA9IHJl
cC0+YmFzZVN0cmluZygpOwotCi0gICAgaWYgKHJlcXVpcmVkTGVuZ3RoID4gYmFzZS0+Y2FwYWNp
dHkpIHsKLSAgICAgICAgc2l6ZV90IG5ld0NhcGFjaXR5ID0gZXhwYW5kZWRTaXplKHJlcXVpcmVk
TGVuZ3RoLCBiYXNlLT5wcmVDYXBhY2l0eSk7Ci0gICAgICAgIFVDaGFyKiBvbGRCdWYgPSBiYXNl
LT5idWY7Ci0gICAgICAgIGlmICghcmVhbGxvY0NoYXJzKGJhc2UtPmJ1ZiwgbmV3Q2FwYWNpdHkp
LmdldFZhbHVlKGJhc2UtPmJ1ZikpIHsKLSAgICAgICAgICAgIGJhc2UtPmJ1ZiA9IG9sZEJ1ZjsK
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBiYXNlLT5jYXBh
Y2l0eSA9IG5ld0NhcGFjaXR5IC0gYmFzZS0+cHJlQ2FwYWNpdHk7Ci0gICAgfQotICAgIGlmIChy
ZXF1aXJlZExlbmd0aCA+IGJhc2UtPnVzZWRDYXBhY2l0eSkKLSAgICAgICAgYmFzZS0+dXNlZENh
cGFjaXR5ID0gcmVxdWlyZWRMZW5ndGg7Ci0KLSAgICByZXAtPmNoZWNrQ29uc2lzdGVuY3koKTsK
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBVU3RyaW5nOjpSZXA6OnJlc2VydmVDYXBhY2l0
eShpbnQgY2FwYWNpdHkpCi17Ci0gICAgLy8gSWYgdGhpcyBpcyBhbiBlbXB0eSBzdHJpbmcgdGhl
cmUgaXMgbm8gcG9pbnQgJ2dyb3dpbmcnIGl0IC0ganVzdCBhbGxvY2F0ZSBhIG5ldyBvbmUuCi0g
ICAgLy8gSWYgdGhlIEJhc2VTdHJpbmcgaXMgc2hhcmVkIHdpdGggYW5vdGhlciBzdHJpbmcgdGhh
dCBpcyB1c2luZyBtb3JlIGNhcGFjaXR5IHRoYW4gdGhpcwotICAgIC8vIHN0cmluZyBpcywgdGhl
biBncm93aW5nIHRoZSBidWZmZXIgd29uJ3QgaGVscC4KLSAgICAvLyBJZiB0aGUgQmFzZVN0cmlu
ZydzIGJ1ZmZlciBpcyByZWFkb25seSwgdGhlbiBpdCBpc24ndCBhbGxvd2VkIHRvIGdyb3cuCi0g
ICAgVVN0cmluZzo6QmFzZVN0cmluZyogYmFzZSA9IGJhc2VTdHJpbmcoKTsKLSAgICBpZiAoIWJh
c2UtPmJ1ZiB8fCAhYmFzZS0+Y2FwYWNpdHkgfHwgKG9mZnNldCArIGxlbikgIT0gYmFzZS0+dXNl
ZENhcGFjaXR5IHx8IGJhc2UtPmlzQnVmZmVyUmVhZE9ubHkoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIAotICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgc3VmZmljaWVudCBjYXBhY2l0
eSwgbm8gbmVlZCB0byBncm93IQotICAgIGlmIChjYXBhY2l0eSA8PSBiYXNlLT5jYXBhY2l0eSkK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjaGVja0NvbnNpc3RlbmN5KCk7Ci0KLSAgICBz
aXplX3QgbmV3Q2FwYWNpdHkgPSBleHBhbmRlZFNpemUoY2FwYWNpdHksIGJhc2UtPnByZUNhcGFj
aXR5KTsKLSAgICBVQ2hhciogb2xkQnVmID0gYmFzZS0+YnVmOwotICAgIGlmICghcmVhbGxvY0No
YXJzKGJhc2UtPmJ1ZiwgbmV3Q2FwYWNpdHkpLmdldFZhbHVlKGJhc2UtPmJ1ZikpIHsKLSAgICAg
ICAgYmFzZS0+YnVmID0gb2xkQnVmOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAg
IGJhc2UtPmNhcGFjaXR5ID0gbmV3Q2FwYWNpdHkgLSBiYXNlLT5wcmVDYXBhY2l0eTsKLQotICAg
IGNoZWNrQ29uc2lzdGVuY3koKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBVU3RyaW5n
OjpleHBhbmRDYXBhY2l0eShpbnQgcmVxdWlyZWRMZW5ndGgpCi17Ci0gICAgaWYgKCFKU0M6OmV4
cGFuZENhcGFjaXR5KG1fcmVwLmdldCgpLCByZXF1aXJlZExlbmd0aCkpCi0gICAgICAgIG1ha2VO
dWxsKCk7Ci19Ci0KLXZvaWQgVVN0cmluZzo6ZXhwYW5kUHJlQ2FwYWNpdHkoaW50IHJlcXVpcmVk
UHJlQ2FwKQotewotICAgIG1fcmVwLT5jaGVja0NvbnNpc3RlbmN5KCk7Ci0gICAgQVNTRVJUKCFt
X3JlcC0+YmFzZVN0cmluZygpLT5pc0J1ZmZlclJlYWRPbmx5KCkpOwotCi0gICAgQmFzZVN0cmlu
ZyogYmFzZSA9IG1fcmVwLT5iYXNlU3RyaW5nKCk7Ci0KLSAgICBpZiAocmVxdWlyZWRQcmVDYXAg
PiBiYXNlLT5wcmVDYXBhY2l0eSkgewotICAgICAgICBzaXplX3QgbmV3Q2FwYWNpdHkgPSBleHBh
bmRlZFNpemUocmVxdWlyZWRQcmVDYXAsIGJhc2UtPmNhcGFjaXR5KTsKLSAgICAgICAgaW50IGRl
bHRhID0gbmV3Q2FwYWNpdHkgLSBiYXNlLT5jYXBhY2l0eSAtIGJhc2UtPnByZUNhcGFjaXR5Owot
Ci0gICAgICAgIFVDaGFyKiBuZXdCdWY7Ci0gICAgICAgIGlmICghYWxsb2NDaGFycyhuZXdDYXBh
Y2l0eSkuZ2V0VmFsdWUobmV3QnVmKSkgewotICAgICAgICAgICAgbWFrZU51bGwoKTsKLSAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb3B5Q2hhcnMobmV3QnVmICsgZGVs
dGEsIGJhc2UtPmJ1ZiwgYmFzZS0+Y2FwYWNpdHkgKyBiYXNlLT5wcmVDYXBhY2l0eSk7Ci0gICAg
ICAgIGZhc3RGcmVlKGJhc2UtPmJ1Zik7Ci0gICAgICAgIGJhc2UtPmJ1ZiA9IG5ld0J1ZjsKLQot
ICAgICAgICBiYXNlLT5wcmVDYXBhY2l0eSA9IG5ld0NhcGFjaXR5IC0gYmFzZS0+Y2FwYWNpdHk7
Ci0gICAgfQotICAgIGlmIChyZXF1aXJlZFByZUNhcCA+IGJhc2UtPnVzZWRQcmVDYXBhY2l0eSkK
LSAgICAgICAgYmFzZS0+dXNlZFByZUNhcGFjaXR5ID0gcmVxdWlyZWRQcmVDYXA7Ci0KLSAgICBt
X3JlcC0+Y2hlY2tDb25zaXN0ZW5jeSgpOwotfQotCiBzdGF0aWMgUGFzc1JlZlB0cjxVU3RyaW5n
OjpSZXA+IGNyZWF0ZVJlcChjb25zdCBjaGFyKiBjKQogewogICAgIGlmICghYykKQEAgLTU2NSwx
NCArMTcwLDEzIEBAIHN0YXRpYyBQYXNzUmVmUHRyPFVTdHJpbmc6OlJlcD4gY3JlYXRlUmUKIAog
ICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oYyk7CiAgICAgVUNoYXIqIGQ7Ci0gICAgaWYgKCFh
bGxvY0NoYXJzKGxlbmd0aCkuZ2V0VmFsdWUoZCkpCisgICAgUGFzc1JlZlB0cjxVU3RyaW5nSW1w
bD4gcmVzdWx0ID0gVVN0cmluZ0ltcGw6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVuZ3RoLCBkKTsK
KyAgICBpZiAoIXJlc3VsdCkKICAgICAgICAgcmV0dXJuICZVU3RyaW5nOjpSZXA6Om51bGwoKTsK
LSAgICBlbHNlIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykK
LSAgICAgICAgICAgIGRbaV0gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjW2ldKTsgLy8g
dXNlIHVuc2lnbmVkIGNoYXIgdG8gemVyby1leHRlbmQgaW5zdGVhZCBvZiBzaWduLWV4dGVuZAot
ICAgICAgICByZXR1cm4gVVN0cmluZzo6UmVwOjpjcmVhdGUoZCwgc3RhdGljX2Nhc3Q8aW50Pihs
ZW5ndGgpKTsKLSAgICB9CiAKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbmd0aDsgaSsr
KQorICAgICAgICBkW2ldID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY1tpXSk7IC8vIHVz
ZSB1bnNpZ25lZCBjaGFyIHRvIHplcm8tZXh0ZW5kIGluc3RlYWQgb2Ygc2lnbi1leHRlbmQKKyAg
ICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW5saW5lIFBhc3NSZWZQdHI8VVN0cmluZzo6
UmVwPiBjcmVhdGVSZXAoY29uc3QgY2hhciogYywgaW50IGxlbmd0aCkKQEAgLTU4NCwxMiArMTg4
LDEzIEBAIHN0YXRpYyBpbmxpbmUgUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IGMKICAgICAgICAg
cmV0dXJuICZVU3RyaW5nOjpSZXA6OmVtcHR5KCk7CiAKICAgICBVQ2hhciogZDsKLSAgICBpZiAo
IWFsbG9jQ2hhcnMobGVuZ3RoKS5nZXRWYWx1ZShkKSkKKyAgICBQYXNzUmVmUHRyPFVTdHJpbmdJ
bXBsPiByZXN1bHQgPSBVU3RyaW5nSW1wbDo6Y3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGQp
OworICAgIGlmICghcmVzdWx0KQogICAgICAgICByZXR1cm4gJlVTdHJpbmc6OlJlcDo6bnVsbCgp
OwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKICAgICAgICAgZFtpXSA9
IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNbaV0pOyAvLyB1c2UgdW5zaWduZWQgY2hhciB0
byB6ZXJvLWV4dGVuZCBpbnN0ZWFkIG9mIHNpZ24tZXh0ZW5kCi0gICAgcmV0dXJuIFVTdHJpbmc6
OlJlcDo6Y3JlYXRlKGQsIGxlbmd0aCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogVVN0cmlu
Zzo6VVN0cmluZyhjb25zdCBjaGFyKiBjKQpAQCAtNjEwLDE0ICsyMTUsNiBAQCBVU3RyaW5nOjpV
U3RyaW5nKGNvbnN0IFVDaGFyKiBjLCBpbnQgbGVuCiAgICAgICAgIG1fcmVwID0gUmVwOjpjcmVh
dGVDb3B5aW5nKGMsIGxlbmd0aCk7CiB9CiAKLVVTdHJpbmc6OlVTdHJpbmcoY29uc3QgVmVjdG9y
PFVDaGFyPiYgYnVmZmVyKQotewotICAgIGlmICghYnVmZmVyLnNpemUoKSkKLSAgICAgICAgbV9y
ZXAgPSAmUmVwOjplbXB0eSgpOwotICAgIGVsc2UKLSAgICAgICAgbV9yZXAgPSBSZXA6OmNyZWF0
ZUNvcHlpbmcoYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7Ci19Ci0KIFVTdHJpbmcgVVN0
cmluZzo6Y3JlYXRlTm9uQ29weWluZyhVQ2hhciogYywgaW50IGxlbmd0aCkKIHsKICAgICBpZiAo
bGVuZ3RoID09IDApCkBAIC02MjgsMzEyICsyMjUsMjkgQEAgVVN0cmluZyBVU3RyaW5nOjpjcmVh
dGVOb25Db3B5aW5nKFVDaGFyKgogCiBVU3RyaW5nIFVTdHJpbmc6OmNyZWF0ZUZyb21VVEY4KGNv
bnN0IGNoYXIqIHN0cmluZykKIHsKLSAgICByZXR1cm4gUmVwOjpjcmVhdGVGcm9tVVRGOChzdHJp
bmcpOwotfQotCi1zdGF0aWMgQUxXQVlTX0lOTElORSBpbnQgbmV3Q2FwYWNpdHlXaXRoT3ZlcmZs
b3dDaGVjayhjb25zdCBpbnQgY3VycmVudENhcGFjaXR5LCBjb25zdCBpbnQgZXh0ZW5kTGVuZ3Ro
LCBjb25zdCBib29sIHBsdXNPbmUgPSBmYWxzZSkKLXsKLSAgICBBU1NFUlRfV0lUSF9NRVNTQUdF
KGV4dGVuZExlbmd0aCA+PSAwLCAiZXh0ZW5kZWRMZW5ndGggPSAlZCIsIGV4dGVuZExlbmd0aCk7
Ci0KLSAgICBjb25zdCBpbnQgcGx1c0xlbmd0aCA9IHBsdXNPbmUgPyAxIDogMDsKLSAgICBpZiAo
Y3VycmVudENhcGFjaXR5ID4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSAtIGV4dGVu
ZExlbmd0aCAtIHBsdXNMZW5ndGgpCi0gICAgICAgIENSQVNIKCk7Ci0KLSAgICByZXR1cm4gY3Vy
cmVudENhcGFjaXR5ICsgZXh0ZW5kTGVuZ3RoICsgcGx1c0xlbmd0aDsKLX0KLQotc3RhdGljIEFM
V0FZU19JTkxJTkUgUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IGNvbmNhdGVuYXRlKFBhc3NSZWZQ
dHI8VVN0cmluZzo6UmVwPiByLCBjb25zdCBVQ2hhciogdERhdGEsIGludCB0U2l6ZSkKLXsKLSAg
ICBSZWZQdHI8VVN0cmluZzo6UmVwPiByZXAgPSByOwotCi0gICAgcmVwLT5jaGVja0NvbnNpc3Rl
bmN5KCk7Ci0KLSAgICBpbnQgdGhpc1NpemUgPSByZXAtPnNpemUoKTsKLSAgICBpbnQgdGhpc09m
ZnNldCA9IHJlcC0+b2Zmc2V0OwotICAgIGludCBsZW5ndGggPSB0aGlzU2l6ZSArIHRTaXplOwot
ICAgIFVTdHJpbmc6OkJhc2VTdHJpbmcqIGJhc2UgPSByZXAtPmJhc2VTdHJpbmcoKTsKLQotICAg
IC8vIHBvc3NpYmxlIGNhc2VzOgotICAgIGlmICh0U2l6ZSA9PSAwKSB7Ci0gICAgICAgIC8vIHQg
aXMgZW1wdHkKLSAgICB9IGVsc2UgaWYgKHRoaXNTaXplID09IDApIHsKLSAgICAgICAgLy8gdGhp
cyBpcyBlbXB0eQotICAgICAgICByZXAgPSBVU3RyaW5nOjpSZXA6OmNyZWF0ZUNvcHlpbmcodERh
dGEsIHRTaXplKTsKLSAgICB9IGVsc2UgaWYgKHJlcCA9PSBiYXNlICYmICFiYXNlLT5pc1NoYXJl
ZCgpKSB7Ci0gICAgICAgIC8vIHRoaXMgaXMgZGlyZWN0IGFuZCBoYXMgcmVmY291bnQgb2YgMSAo
c28gd2UgY2FuIGp1c3QgYWx0ZXIgaXQgZGlyZWN0bHkpCi0gICAgICAgIGlmICghZXhwYW5kQ2Fw
YWNpdHkocmVwLmdldCgpLCBuZXdDYXBhY2l0eVdpdGhPdmVyZmxvd0NoZWNrKHRoaXNPZmZzZXQs
IGxlbmd0aCkpKQotICAgICAgICAgICAgcmVwID0gJlVTdHJpbmc6OlJlcDo6bnVsbCgpOwotICAg
ICAgICBpZiAocmVwLT5kYXRhKCkpIHsKLSAgICAgICAgICAgIGNvcHlDaGFycyhyZXAtPmRhdGEo
KSArIHRoaXNTaXplLCB0RGF0YSwgdFNpemUpOwotICAgICAgICAgICAgcmVwLT5sZW4gPSBsZW5n
dGg7Ci0gICAgICAgICAgICByZXAtPl9oYXNoID0gMDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBp
ZiAodGhpc09mZnNldCArIHRoaXNTaXplID09IGJhc2UtPnVzZWRDYXBhY2l0eSAmJiB0aGlzU2l6
ZSA+PSBtaW5TaGFyZVNpemUgJiYgIWJhc2UtPmlzQnVmZmVyUmVhZE9ubHkoKSkgewotICAgICAg
ICAvLyB0aGlzIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIC0gZXh0ZW5kIGl0IGlmIGl0
J3MgbG9uZyBlbm91Z2ggdG8gYXBwZW5kIHRvCi0gICAgICAgIGlmICghZXhwYW5kQ2FwYWNpdHko
cmVwLmdldCgpLCBuZXdDYXBhY2l0eVdpdGhPdmVyZmxvd0NoZWNrKHRoaXNPZmZzZXQsIGxlbmd0
aCkpKQotICAgICAgICAgICAgcmVwID0gJlVTdHJpbmc6OlJlcDo6bnVsbCgpOwotICAgICAgICBp
ZiAocmVwLT5kYXRhKCkpIHsKLSAgICAgICAgICAgIGNvcHlDaGFycyhyZXAtPmRhdGEoKSArIHRo
aXNTaXplLCB0RGF0YSwgdFNpemUpOwotICAgICAgICAgICAgcmVwID0gVVN0cmluZzo6UmVwOjpj
cmVhdGUocmVwLCAwLCBsZW5ndGgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAg
Ly8gVGhpcyBpcyBzaGFyZWQgaW4gc29tZSB3YXkgdGhhdCBwcmV2ZW50cyB1cyBmcm9tIG1vZGlm
eWluZyBiYXNlLCBzbyB3ZSBtdXN0IG1ha2UgYSB3aG9sZSBuZXcgc3RyaW5nLgotICAgICAgICBz
aXplX3QgbmV3Q2FwYWNpdHkgPSBleHBhbmRlZFNpemUobGVuZ3RoLCAwKTsKLSAgICAgICAgVUNo
YXIqIGQ7Ci0gICAgICAgIGlmICghYWxsb2NDaGFycyhuZXdDYXBhY2l0eSkuZ2V0VmFsdWUoZCkp
Ci0gICAgICAgICAgICByZXAgPSAmVVN0cmluZzo6UmVwOjpudWxsKCk7Ci0gICAgICAgIGVsc2Ug
ewotICAgICAgICAgICAgY29weUNoYXJzKGQsIHJlcC0+ZGF0YSgpLCB0aGlzU2l6ZSk7Ci0gICAg
ICAgICAgICBjb3B5Q2hhcnMoZCArIHRoaXNTaXplLCB0RGF0YSwgdFNpemUpOwotICAgICAgICAg
ICAgcmVwID0gVVN0cmluZzo6UmVwOjpjcmVhdGUoZCwgbGVuZ3RoKTsKLSAgICAgICAgICAgIHJl
cC0+YmFzZVN0cmluZygpLT5jYXBhY2l0eSA9IG5ld0NhcGFjaXR5OwotICAgICAgICB9Ci0gICAg
fQotCi0gICAgcmVwLT5jaGVja0NvbnNpc3RlbmN5KCk7Ci0KLSAgICByZXR1cm4gcmVwLnJlbGVh
c2UoKTsKLX0KLQotc3RhdGljIEFMV0FZU19JTkxJTkUgUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+
IGNvbmNhdGVuYXRlKFBhc3NSZWZQdHI8VVN0cmluZzo6UmVwPiByLCBjb25zdCBjaGFyKiB0KQot
ewotICAgIFJlZlB0cjxVU3RyaW5nOjpSZXA+IHJlcCA9IHI7Ci0KLSAgICByZXAtPmNoZWNrQ29u
c2lzdGVuY3koKTsKLQotICAgIGludCB0aGlzU2l6ZSA9IHJlcC0+c2l6ZSgpOwotICAgIGludCB0
aGlzT2Zmc2V0ID0gcmVwLT5vZmZzZXQ7Ci0gICAgaW50IHRTaXplID0gc3RhdGljX2Nhc3Q8aW50
PihzdHJsZW4odCkpOwotICAgIGludCBsZW5ndGggPSB0aGlzU2l6ZSArIHRTaXplOwotICAgIFVT
dHJpbmc6OkJhc2VTdHJpbmcqIGJhc2UgPSByZXAtPmJhc2VTdHJpbmcoKTsKLQotICAgIC8vIHBv
c3NpYmxlIGNhc2VzOgotICAgIGlmICh0aGlzU2l6ZSA9PSAwKSB7Ci0gICAgICAgIC8vIHRoaXMg
aXMgZW1wdHkKLSAgICAgICAgcmVwID0gY3JlYXRlUmVwKHQpOwotICAgIH0gZWxzZSBpZiAodFNp
emUgPT0gMCkgewotICAgICAgICAvLyB0IGlzIGVtcHR5LCB3ZSdsbCBqdXN0IHJldHVybiAqdGhp
cyBiZWxvdy4KLSAgICB9IGVsc2UgaWYgKHJlcCA9PSBiYXNlICYmICFiYXNlLT5pc1NoYXJlZCgp
KSB7Ci0gICAgICAgIC8vIHRoaXMgaXMgZGlyZWN0IGFuZCBoYXMgcmVmY291bnQgb2YgMSAoc28g
d2UgY2FuIGp1c3QgYWx0ZXIgaXQgZGlyZWN0bHkpCi0gICAgICAgIGV4cGFuZENhcGFjaXR5KHJl
cC5nZXQoKSwgbmV3Q2FwYWNpdHlXaXRoT3ZlcmZsb3dDaGVjayh0aGlzT2Zmc2V0LCBsZW5ndGgp
KTsKLSAgICAgICAgVUNoYXIqIGQgPSByZXAtPmRhdGEoKTsKLSAgICAgICAgaWYgKGQpIHsKLSAg
ICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdFNpemU7ICsraSkKLSAgICAgICAgICAgICAg
ICBkW3RoaXNTaXplICsgaV0gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPih0W2ldKTsgLy8g
dXNlIHVuc2lnbmVkIGNoYXIgdG8gemVyby1leHRlbmQgaW5zdGVhZCBvZiBzaWduLWV4dGVuZAot
ICAgICAgICAgICAgcmVwLT5sZW4gPSBsZW5ndGg7Ci0gICAgICAgICAgICByZXAtPl9oYXNoID0g
MDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAodGhpc09mZnNldCArIHRoaXNTaXplID09IGJh
c2UtPnVzZWRDYXBhY2l0eSAmJiB0aGlzU2l6ZSA+PSBtaW5TaGFyZVNpemUgJiYgIWJhc2UtPmlz
QnVmZmVyUmVhZE9ubHkoKSkgewotICAgICAgICAvLyB0aGlzIHN0cmluZyByZWFjaGVzIHRoZSBl
bmQgb2YgdGhlIGJ1ZmZlciAtIGV4dGVuZCBpdAotICAgICAgICBleHBhbmRDYXBhY2l0eShyZXAu
Z2V0KCksIG5ld0NhcGFjaXR5V2l0aE92ZXJmbG93Q2hlY2sodGhpc09mZnNldCwgbGVuZ3RoKSk7
Ci0gICAgICAgIFVDaGFyKiBkID0gcmVwLT5kYXRhKCk7Ci0gICAgICAgIGlmIChkKSB7Ci0gICAg
ICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRTaXplOyArK2kpCi0gICAgICAgICAgICAgICAg
ZFt0aGlzU2l6ZSArIGldID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4odFtpXSk7IC8vIHVz
ZSB1bnNpZ25lZCBjaGFyIHRvIHplcm8tZXh0ZW5kIGluc3RlYWQgb2Ygc2lnbi1leHRlbmQKLSAg
ICAgICAgICAgIHJlcCA9IFVTdHJpbmc6OlJlcDo6Y3JlYXRlKHJlcCwgMCwgbGVuZ3RoKTsKLSAg
ICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgc2hhcmVkIGluIHNvbWUg
d2F5IHRoYXQgcHJldmVudHMgdXMgZnJvbSBtb2RpZnlpbmcgYmFzZSwgc28gd2UgbXVzdCBtYWtl
IGEgd2hvbGUgbmV3IHN0cmluZy4KLSAgICAgICAgc2l6ZV90IG5ld0NhcGFjaXR5ID0gZXhwYW5k
ZWRTaXplKGxlbmd0aCwgMCk7Ci0gICAgICAgIFVDaGFyKiBkOwotICAgICAgICBpZiAoIWFsbG9j
Q2hhcnMobmV3Q2FwYWNpdHkpLmdldFZhbHVlKGQpKQotICAgICAgICAgICAgcmVwID0gJlVTdHJp
bmc6OlJlcDo6bnVsbCgpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNvcHlDaGFycyhk
LCByZXAtPmRhdGEoKSwgdGhpc1NpemUpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkg
PCB0U2l6ZTsgKytpKQotICAgICAgICAgICAgICAgIGRbdGhpc1NpemUgKyBpXSA9IHN0YXRpY19j
YXN0PHVuc2lnbmVkIGNoYXI+KHRbaV0pOyAvLyB1c2UgdW5zaWduZWQgY2hhciB0byB6ZXJvLWV4
dGVuZCBpbnN0ZWFkIG9mIHNpZ24tZXh0ZW5kCi0gICAgICAgICAgICByZXAgPSBVU3RyaW5nOjpS
ZXA6OmNyZWF0ZShkLCBsZW5ndGgpOwotICAgICAgICAgICAgcmVwLT5iYXNlU3RyaW5nKCktPmNh
cGFjaXR5ID0gbmV3Q2FwYWNpdHk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgaWYgKCFzdHJpbmcp
CisgICAgICAgIHJldHVybiBudWxsKCk7CiAKLSAgICByZXAtPmNoZWNrQ29uc2lzdGVuY3koKTsK
KyAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHN0cmluZyk7CisgICAgVmVjdG9yPFVDaGFyLCAx
MDI0PiBidWZmZXIobGVuZ3RoKTsKKyAgICBVQ2hhciogcCA9IGJ1ZmZlci5kYXRhKCk7CisgICAg
aWYgKGNvbnZlcnNpb25PSyAhPSBjb252ZXJ0VVRGOFRvVVRGMTYoJnN0cmluZywgc3RyaW5nICsg
bGVuZ3RoLCAmcCwgcCArIGxlbmd0aCkpCisgICAgICAgIHJldHVybiBudWxsKCk7CiAKLSAgICBy
ZXR1cm4gcmVwLnJlbGVhc2UoKTsKKyAgICByZXR1cm4gVVN0cmluZyhidWZmZXIuZGF0YSgpLCBw
IC0gYnVmZmVyLmRhdGEoKSk7CiB9CiAKLVBhc3NSZWZQdHI8VVN0cmluZzo6UmVwPiBjb25jYXRl
bmF0ZShVU3RyaW5nOjpSZXAqIGEsIFVTdHJpbmc6OlJlcCogYikKK1VTdHJpbmcgVVN0cmluZzo6
Y3JlYXRlVW5pbml0aWFsaXplZCh1bnNpZ25lZCBsZW5ndGgsIFVDaGFyKiYgb3V0cHV0KQogewot
ICAgIGEtPmNoZWNrQ29uc2lzdGVuY3koKTsKLSAgICBiLT5jaGVja0NvbnNpc3RlbmN5KCk7Ci0K
LSAgICBpbnQgYVNpemUgPSBhLT5zaXplKCk7Ci0gICAgaW50IGJTaXplID0gYi0+c2l6ZSgpOwot
ICAgIGludCBhT2Zmc2V0ID0gYS0+b2Zmc2V0OwotCi0gICAgLy8gcG9zc2libGUgY2FzZXM6Ci0K
LSAgICBVU3RyaW5nOjpCYXNlU3RyaW5nKiBhQmFzZSA9IGEtPmJhc2VTdHJpbmcoKTsKLSAgICBp
ZiAoYlNpemUgPT0gMSAmJiBhT2Zmc2V0ICsgYVNpemUgPT0gYUJhc2UtPnVzZWRDYXBhY2l0eSAm
JiBhT2Zmc2V0ICsgYVNpemUgPCBhQmFzZS0+Y2FwYWNpdHkgJiYgIWFCYXNlLT5pc0J1ZmZlclJl
YWRPbmx5KCkpIHsKLSAgICAgICAgLy8gYiBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgKGNvbW1vbiBm
YXN0IGNhc2UpCi0gICAgICAgICsrYUJhc2UtPnVzZWRDYXBhY2l0eTsKLSAgICAgICAgYS0+ZGF0
YSgpW2FTaXplXSA9IGItPmRhdGEoKVswXTsKLSAgICAgICAgcmV0dXJuIFVTdHJpbmc6OlJlcDo6
Y3JlYXRlKGEsIDAsIGFTaXplICsgMSk7Ci0gICAgfQotCi0gICAgLy8gYSBpcyBlbXB0eQotICAg
IGlmIChhU2l6ZSA9PSAwKQotICAgICAgICByZXR1cm4gYjsKLSAgICAvLyBiIGlzIGVtcHR5Ci0g
ICAgaWYgKGJTaXplID09IDApCi0gICAgICAgIHJldHVybiBhOwotCi0gICAgaW50IGJPZmZzZXQg
PSBiLT5vZmZzZXQ7Ci0gICAgaW50IGxlbmd0aCA9IGFTaXplICsgYlNpemU7Ci0KLSAgICBVU3Ry
aW5nOjpCYXNlU3RyaW5nKiBiQmFzZSA9IGItPmJhc2VTdHJpbmcoKTsKLSAgICBpZiAoYU9mZnNl
dCArIGFTaXplID09IGFCYXNlLT51c2VkQ2FwYWNpdHkgJiYgYVNpemUgPj0gbWluU2hhcmVTaXpl
ICYmIDQgKiBhU2l6ZSA+PSBiU2l6ZQotICAgICAgICAmJiAoLWJPZmZzZXQgIT0gYkJhc2UtPnVz
ZWRQcmVDYXBhY2l0eSB8fCBhU2l6ZSA+PSBiU2l6ZSkgJiYgIWFCYXNlLT5pc0J1ZmZlclJlYWRP
bmx5KCkpIHsKLSAgICAgICAgLy8gLSBhIHJlYWNoZXMgdGhlIGVuZCBvZiBpdHMgYnVmZmVyIHNv
IGl0IHF1YWxpZmllcyBmb3Igc2hhcmVkIGFwcGVuZAotICAgICAgICAvLyAtIGFsc28sIGl0J3Mg
YXQgbGVhc3QgYSBxdWFydGVyIHRoZSBsZW5ndGggb2YgYiAtIGFwcGVuZGluZyB0byBhIG11Y2gg
c2hvcnRlcgotICAgICAgICAvLyAgIHN0cmluZyBkb2VzIG1vcmUgaGFybSB0aGFuIGdvb2QKLSAg
ICAgICAgLy8gLSBob3dldmVyLCBpZiBiIHF1YWxpZmllcyBmb3IgcHJlcGVuZCBhbmQgaXMgbG9u
Z2VyIHRoYW4gYSwgd2UnZCByYXRoZXIgcHJlcGVuZAotICAgICAgICAKLSAgICAgICAgVVN0cmlu
ZyB4KGEpOwotICAgICAgICB4LmV4cGFuZENhcGFjaXR5KG5ld0NhcGFjaXR5V2l0aE92ZXJmbG93
Q2hlY2soYU9mZnNldCwgbGVuZ3RoKSk7Ci0gICAgICAgIGlmICghYS0+ZGF0YSgpIHx8ICF4LmRh
dGEoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBjb3B5Q2hhcnMoYS0+ZGF0YSgp
ICsgYVNpemUsIGItPmRhdGEoKSwgYlNpemUpOwotICAgICAgICBQYXNzUmVmUHRyPFVTdHJpbmc6
OlJlcD4gcmVzdWx0ID0gVVN0cmluZzo6UmVwOjpjcmVhdGUoYSwgMCwgbGVuZ3RoKTsKLQotICAg
ICAgICBhLT5jaGVja0NvbnNpc3RlbmN5KCk7Ci0gICAgICAgIGItPmNoZWNrQ29uc2lzdGVuY3ko
KTsKLSAgICAgICAgcmVzdWx0LT5jaGVja0NvbnNpc3RlbmN5KCk7Ci0KLSAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgb3V0cHV0ID0gJnNoYXJl
ZEVtcHR5Q2hhcjsKKyAgICAgICAgcmV0dXJuIFVTdHJpbmcoJlJlcDo6ZW1wdHkoKSk7CiAgICAg
fQogCi0gICAgaWYgKC1iT2Zmc2V0ID09IGJCYXNlLT51c2VkUHJlQ2FwYWNpdHkgJiYgYlNpemUg
Pj0gbWluU2hhcmVTaXplICYmIDQgKiBiU2l6ZSA+PSBhU2l6ZSAmJiAhYkJhc2UtPmlzQnVmZmVy
UmVhZE9ubHkoKSkgewotICAgICAgICAvLyAtIGIgcmVhY2hlcyB0aGUgYmVnaW5uaW5nIG9mIGl0
cyBidWZmZXIgc28gaXQgcXVhbGlmaWVzIGZvciBzaGFyZWQgcHJlcGVuZAotICAgICAgICAvLyAt
IGFsc28sIGl0J3MgYXQgbGVhc3QgYSBxdWFydGVyIHRoZSBsZW5ndGggb2YgYSAtIHByZXBlbmRp
bmcgdG8gYSBtdWNoIHNob3J0ZXIKLSAgICAgICAgLy8gICBzdHJpbmcgZG9lcyBtb3JlIGhhcm0g
dGhhbiBnb29kCi0gICAgICAgIFVTdHJpbmcgeShiKTsKLSAgICAgICAgeS5leHBhbmRQcmVDYXBh
Y2l0eSgtYk9mZnNldCArIGFTaXplKTsKLSAgICAgICAgaWYgKCFiLT5kYXRhKCkgfHwgIXkuZGF0
YSgpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGNvcHlDaGFycyhiLT5kYXRhKCkg
LSBhU2l6ZSwgYS0+ZGF0YSgpLCBhU2l6ZSk7Ci0gICAgICAgIFBhc3NSZWZQdHI8VVN0cmluZzo6
UmVwPiByZXN1bHQgPSBVU3RyaW5nOjpSZXA6OmNyZWF0ZShiLCAtYVNpemUsIGxlbmd0aCk7Ci0K
LSAgICAgICAgYS0+Y2hlY2tDb25zaXN0ZW5jeSgpOwotICAgICAgICBiLT5jaGVja0NvbnNpc3Rl
bmN5KCk7Ci0gICAgICAgIHJlc3VsdC0+Y2hlY2tDb25zaXN0ZW5jeSgpOwotCisgICAgaWYgKFBh
c3NSZWZQdHI8VVN0cmluZ0ltcGw+IHJlc3VsdCA9IFVTdHJpbmdJbXBsOjpjcmVhdGVVbmluaXRp
YWxpemVkKGxlbmd0aCwgb3V0cHV0KSkKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0K
LSAgICAvLyBhIGRvZXMgbm90IHF1YWxpZnkgZm9yIGFwcGVuZCwgYW5kIGIgZG9lcyBub3QgcXVh
bGlmeSBmb3IgcHJlcGVuZCwgZ290dGEgbWFrZSBhIHdob2xlIG5ldyBzdHJpbmcKLSAgICBzaXpl
X3QgbmV3Q2FwYWNpdHkgPSBleHBhbmRlZFNpemUobGVuZ3RoLCAwKTsKLSAgICBVQ2hhciogZDsK
LSAgICBpZiAoIWFsbG9jQ2hhcnMobmV3Q2FwYWNpdHkpLmdldFZhbHVlKGQpKQotICAgICAgICBy
ZXR1cm4gMDsKLSAgICBjb3B5Q2hhcnMoZCwgYS0+ZGF0YSgpLCBhU2l6ZSk7Ci0gICAgY29weUNo
YXJzKGQgKyBhU2l6ZSwgYi0+ZGF0YSgpLCBiU2l6ZSk7Ci0gICAgUGFzc1JlZlB0cjxVU3RyaW5n
OjpSZXA+IHJlc3VsdCA9IFVTdHJpbmc6OlJlcDo6Y3JlYXRlKGQsIGxlbmd0aCk7Ci0gICAgcmVz
dWx0LT5iYXNlU3RyaW5nKCktPmNhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7Ci0KLSAgICBhLT5jaGVj
a0NvbnNpc3RlbmN5KCk7Ci0gICAgYi0+Y2hlY2tDb25zaXN0ZW5jeSgpOwotICAgIHJlc3VsdC0+
Y2hlY2tDb25zaXN0ZW5jeSgpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotUGFzc1JlZlB0
cjxVU3RyaW5nOjpSZXA+IGNvbmNhdGVuYXRlKFVTdHJpbmc6OlJlcCogcmVwLCBpbnQgaSkKLXsK
LSAgICBVQ2hhciBidWZbMSArIHNpemVvZihpKSAqIDNdOwotICAgIFVDaGFyKiBlbmQgPSBidWYg
KyBzaXplb2YoYnVmKSAvIHNpemVvZihVQ2hhcik7Ci0gICAgVUNoYXIqIHAgPSBlbmQ7Ci0gIAot
ICAgIGlmIChpID09IDApCi0gICAgICAgICotLXAgPSAnMCc7Ci0gICAgZWxzZSBpZiAoaSA9PSBJ
TlRfTUlOKSB7Ci0gICAgICAgIGNoYXIgbWluQnVmWzEgKyBzaXplb2YoaSkgKiAzXTsKLSAgICAg
ICAgc3ByaW50ZihtaW5CdWYsICIlZCIsIElOVF9NSU4pOwotICAgICAgICByZXR1cm4gY29uY2F0
ZW5hdGUocmVwLCBtaW5CdWYpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJvb2wgbmVnYXRpdmUg
PSBmYWxzZTsKLSAgICAgICAgaWYgKGkgPCAwKSB7Ci0gICAgICAgICAgICBuZWdhdGl2ZSA9IHRy
dWU7Ci0gICAgICAgICAgICBpID0gLWk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGkpIHsK
LSAgICAgICAgICAgICotLXAgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oKGkgJSAxMCkg
KyAnMCcpOwotICAgICAgICAgICAgaSAvPSAxMDsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVn
YXRpdmUpCi0gICAgICAgICAgICAqLS1wID0gJy0nOwotICAgIH0KLQotICAgIHJldHVybiBjb25j
YXRlbmF0ZShyZXAsIHAsIHN0YXRpY19jYXN0PGludD4oZW5kIC0gcCkpOwotCi19Ci0KLVBhc3NS
ZWZQdHI8VVN0cmluZzo6UmVwPiBjb25jYXRlbmF0ZShVU3RyaW5nOjpSZXAqIHJlcCwgZG91Ymxl
IGQpCi17Ci0gICAgLy8gYXZvaWQgZXZlciBwcmludGluZyAtTmFOLCBpbiBKUyBjb25jZXB0dWFs
bHkgdGhlcmUgaXMgb25seSBvbmUgTmFOIHZhbHVlCi0gICAgaWYgKGlzbmFuKGQpKQotICAgICAg
ICByZXR1cm4gY29uY2F0ZW5hdGUocmVwLCAiTmFOIik7Ci0KLSAgICBpZiAoZCA9PSAwLjApIC8v
IHN0cmluZ2lmeSAtMCBhcyAwCi0gICAgICAgIGQgPSAwLjA7Ci0KLSAgICBjaGFyIGJ1Zls4MF07
Ci0gICAgaW50IGRlY2ltYWxQb2ludDsKLSAgICBpbnQgc2lnbjsKLQotICAgIGNoYXIgcmVzdWx0
WzgwXTsKLSAgICBXVEY6OmR0b2EocmVzdWx0LCBkLCAwLCAmZGVjaW1hbFBvaW50LCAmc2lnbiwg
TlVMTCk7Ci0gICAgaW50IGxlbmd0aCA9IHN0YXRpY19jYXN0PGludD4oc3RybGVuKHJlc3VsdCkp
OwotICAKLSAgICBpbnQgaSA9IDA7Ci0gICAgaWYgKHNpZ24pCi0gICAgICAgIGJ1ZltpKytdID0g
Jy0nOwotICAKLSAgICBpZiAoZGVjaW1hbFBvaW50IDw9IDAgJiYgZGVjaW1hbFBvaW50ID4gLTYp
IHsKLSAgICAgICAgYnVmW2krK10gPSAnMCc7Ci0gICAgICAgIGJ1ZltpKytdID0gJy4nOwotICAg
ICAgICBmb3IgKGludCBqID0gZGVjaW1hbFBvaW50OyBqIDwgMDsgaisrKQotICAgICAgICAgICAg
YnVmW2krK10gPSAnMCc7Ci0gICAgICAgIHN0cmNweShidWYgKyBpLCByZXN1bHQpOwotICAgIH0g
ZWxzZSBpZiAoZGVjaW1hbFBvaW50IDw9IDIxICYmIGRlY2ltYWxQb2ludCA+IDApIHsKLSAgICAg
ICAgaWYgKGxlbmd0aCA8PSBkZWNpbWFsUG9pbnQpIHsKLSAgICAgICAgICAgIHN0cmNweShidWYg
KyBpLCByZXN1bHQpOwotICAgICAgICAgICAgaSArPSBsZW5ndGg7Ci0gICAgICAgICAgICBmb3Ig
KGludCBqID0gMDsgaiA8IGRlY2ltYWxQb2ludCAtIGxlbmd0aDsgaisrKQotICAgICAgICAgICAg
ICAgIGJ1ZltpKytdID0gJzAnOwotICAgICAgICAgICAgYnVmW2ldID0gJ1wwJzsKLSAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgIHN0cm5jcHkoYnVmICsgaSwgcmVzdWx0LCBkZWNpbWFsUG9p
bnQpOwotICAgICAgICAgICAgaSArPSBkZWNpbWFsUG9pbnQ7Ci0gICAgICAgICAgICBidWZbaSsr
XSA9ICcuJzsKLSAgICAgICAgICAgIHN0cmNweShidWYgKyBpLCByZXN1bHQgKyBkZWNpbWFsUG9p
bnQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChyZXN1bHRbMF0gPCAnMCcgfHwgcmVzdWx0
WzBdID4gJzknKQotICAgICAgICBzdHJjcHkoYnVmICsgaSwgcmVzdWx0KTsKLSAgICBlbHNlIHsK
LSAgICAgICAgYnVmW2krK10gPSByZXN1bHRbMF07Ci0gICAgICAgIGlmIChsZW5ndGggPiAxKSB7
Ci0gICAgICAgICAgICBidWZbaSsrXSA9ICcuJzsKLSAgICAgICAgICAgIHN0cmNweShidWYgKyBp
LCByZXN1bHQgKyAxKTsKLSAgICAgICAgICAgIGkgKz0gbGVuZ3RoIC0gMTsKLSAgICAgICAgfQot
ICAgICAgICAKLSAgICAgICAgYnVmW2krK10gPSAnZSc7Ci0gICAgICAgIGJ1ZltpKytdID0gKGRl
Y2ltYWxQb2ludCA+PSAwKSA/ICcrJyA6ICctJzsKLSAgICAgICAgLy8gZGVjaW1hbFBvaW50IGNh
bid0IGJlIG1vcmUgdGhhbiAzIGRpZ2l0cyBkZWNpbWFsIGdpdmVuIHRoZQotICAgICAgICAvLyBu
YXR1cmUgb2YgZmxvYXQgcmVwcmVzZW50YXRpb24KLSAgICAgICAgaW50IGV4cG9uZW50aWFsID0g
ZGVjaW1hbFBvaW50IC0gMTsKLSAgICAgICAgaWYgKGV4cG9uZW50aWFsIDwgMCkKLSAgICAgICAg
ICAgIGV4cG9uZW50aWFsID0gLWV4cG9uZW50aWFsOwotICAgICAgICBpZiAoZXhwb25lbnRpYWwg
Pj0gMTAwKQotICAgICAgICAgICAgYnVmW2krK10gPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyBl
eHBvbmVudGlhbCAvIDEwMCk7Ci0gICAgICAgIGlmIChleHBvbmVudGlhbCA+PSAxMCkKLSAgICAg
ICAgICAgIGJ1ZltpKytdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oJzAnICsgKGV4cG9uZW50aWFsICUg
MTAwKSAvIDEwKTsKLSAgICAgICAgYnVmW2krK10gPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyBl
eHBvbmVudGlhbCAlIDEwKTsKLSAgICAgICAgYnVmW2krK10gPSAnXDAnOwotICAgIH0KLSAgICAK
LSAgICByZXR1cm4gY29uY2F0ZW5hdGUocmVwLCBidWYpOworICAgIG91dHB1dCA9IDA7CisgICAg
cmV0dXJuIFVTdHJpbmcoKTsKIH0KIAogVVN0cmluZyBVU3RyaW5nOjpmcm9tKGludCBpKQpAQCAt
MTA3NiwxOCArMzkwLDE4IEBAIFVTdHJpbmcgVVN0cmluZzo6c3BsaWNlU3Vic3RyaW5nc1dpdGhT
ZXAKICAgICAgICAgcmV0dXJuICIiOwogCiAgICAgVUNoYXIqIGJ1ZmZlcjsKLSAgICBpZiAoIWFs
bG9jQ2hhcnModG90YWxMZW5ndGgpLmdldFZhbHVlKGJ1ZmZlcikpCisgICAgaWYgKCFVU3RyaW5n
SW1wbDo6YWxsb2NDaGFycyh0b3RhbExlbmd0aCkuZ2V0VmFsdWUoYnVmZmVyKSkKICAgICAgICAg
cmV0dXJuIG51bGwoKTsKIAogICAgIGludCBtYXhDb3VudCA9IG1heChyYW5nZUNvdW50LCBzZXBh
cmF0b3JDb3VudCk7CiAgICAgaW50IGJ1ZmZlclBvcyA9IDA7CiAgICAgZm9yIChpbnQgaSA9IDA7
IGkgPCBtYXhDb3VudDsgaSsrKSB7CiAgICAgICAgIGlmIChpIDwgcmFuZ2VDb3VudCkgewotICAg
ICAgICAgICAgY29weUNoYXJzKGJ1ZmZlciArIGJ1ZmZlclBvcywgZGF0YSgpICsgc3Vic3RyaW5n
UmFuZ2VzW2ldLnBvc2l0aW9uLCBzdWJzdHJpbmdSYW5nZXNbaV0ubGVuZ3RoKTsKKyAgICAgICAg
ICAgIFVTdHJpbmdJbXBsOjpjb3B5Q2hhcnMoYnVmZmVyICsgYnVmZmVyUG9zLCBkYXRhKCkgKyBz
dWJzdHJpbmdSYW5nZXNbaV0ucG9zaXRpb24sIHN1YnN0cmluZ1Jhbmdlc1tpXS5sZW5ndGgpOwog
ICAgICAgICAgICAgYnVmZmVyUG9zICs9IHN1YnN0cmluZ1Jhbmdlc1tpXS5sZW5ndGg7CiAgICAg
ICAgIH0KICAgICAgICAgaWYgKGkgPCBzZXBhcmF0b3JDb3VudCkgewotICAgICAgICAgICAgY29w
eUNoYXJzKGJ1ZmZlciArIGJ1ZmZlclBvcywgc2VwYXJhdG9yc1tpXS5kYXRhKCksIHNlcGFyYXRv
cnNbaV0uc2l6ZSgpKTsKKyAgICAgICAgICAgIFVTdHJpbmdJbXBsOjpjb3B5Q2hhcnMoYnVmZmVy
ICsgYnVmZmVyUG9zLCBzZXBhcmF0b3JzW2ldLmRhdGEoKSwgc2VwYXJhdG9yc1tpXS5zaXplKCkp
OwogICAgICAgICAgICAgYnVmZmVyUG9zICs9IHNlcGFyYXRvcnNbaV0uc2l6ZSgpOwogICAgICAg
ICB9CiAgICAgfQpAQCAtMTEwNSwxMzggKzQxOSwxNyBAQCBVU3RyaW5nIFVTdHJpbmc6OnJlcGxh
Y2VSYW5nZShpbnQgcmFuZ2VTCiAgICAgICAgIHJldHVybiAiIjsKIAogICAgIFVDaGFyKiBidWZm
ZXI7Ci0gICAgaWYgKCFhbGxvY0NoYXJzKHRvdGFsTGVuZ3RoKS5nZXRWYWx1ZShidWZmZXIpKQor
ICAgIGlmICghVVN0cmluZ0ltcGw6OmFsbG9jQ2hhcnModG90YWxMZW5ndGgpLmdldFZhbHVlKGJ1
ZmZlcikpCiAgICAgICAgIHJldHVybiBudWxsKCk7CiAKLSAgICBjb3B5Q2hhcnMoYnVmZmVyLCBk
YXRhKCksIHJhbmdlU3RhcnQpOwotICAgIGNvcHlDaGFycyhidWZmZXIgKyByYW5nZVN0YXJ0LCBy
ZXBsYWNlbWVudC5kYXRhKCksIHJlcGxhY2VtZW50TGVuZ3RoKTsKKyAgICBVU3RyaW5nSW1wbDo6
Y29weUNoYXJzKGJ1ZmZlciwgZGF0YSgpLCByYW5nZVN0YXJ0KTsKKyAgICBVU3RyaW5nSW1wbDo6
Y29weUNoYXJzKGJ1ZmZlciArIHJhbmdlU3RhcnQsIHJlcGxhY2VtZW50LmRhdGEoKSwgcmVwbGFj
ZW1lbnRMZW5ndGgpOwogICAgIGludCByYW5nZUVuZCA9IHJhbmdlU3RhcnQgKyByYW5nZUxlbmd0
aDsKLSAgICBjb3B5Q2hhcnMoYnVmZmVyICsgcmFuZ2VTdGFydCArIHJlcGxhY2VtZW50TGVuZ3Ro
LCBkYXRhKCkgKyByYW5nZUVuZCwgc2l6ZSgpIC0gcmFuZ2VFbmQpOworICAgIFVTdHJpbmdJbXBs
Ojpjb3B5Q2hhcnMoYnVmZmVyICsgcmFuZ2VTdGFydCArIHJlcGxhY2VtZW50TGVuZ3RoLCBkYXRh
KCkgKyByYW5nZUVuZCwgc2l6ZSgpIC0gcmFuZ2VFbmQpOwogCiAgICAgcmV0dXJuIFVTdHJpbmc6
OlJlcDo6Y3JlYXRlKGJ1ZmZlciwgdG90YWxMZW5ndGgpOwogfQogCi0KLVVTdHJpbmcmIFVTdHJp
bmc6OmFwcGVuZChjb25zdCBVU3RyaW5nICZ0KQotewotICAgIG1fcmVwLT5jaGVja0NvbnNpc3Rl
bmN5KCk7Ci0gICAgdC5yZXAoKS0+Y2hlY2tDb25zaXN0ZW5jeSgpOwotCi0gICAgaW50IHRoaXNT
aXplID0gc2l6ZSgpOwotICAgIGludCB0aGlzT2Zmc2V0ID0gbV9yZXAtPm9mZnNldDsKLSAgICBp
bnQgdFNpemUgPSB0LnNpemUoKTsKLSAgICBpbnQgbGVuZ3RoID0gdGhpc1NpemUgKyB0U2l6ZTsK
LSAgICBCYXNlU3RyaW5nKiBiYXNlID0gbV9yZXAtPmJhc2VTdHJpbmcoKTsKLQotICAgIC8vIHBv
c3NpYmxlIGNhc2VzOgotICAgIGlmICh0aGlzU2l6ZSA9PSAwKSB7Ci0gICAgICAgIC8vIHRoaXMg
aXMgZW1wdHkKLSAgICAgICAgKnRoaXMgPSB0OwotICAgIH0gZWxzZSBpZiAodFNpemUgPT0gMCkg
ewotICAgICAgICAvLyB0IGlzIGVtcHR5Ci0gICAgfSBlbHNlIGlmIChtX3JlcCA9PSBiYXNlICYm
ICFiYXNlLT5pc1NoYXJlZCgpKSB7Ci0gICAgICAgIC8vIHRoaXMgaXMgZGlyZWN0IGFuZCBoYXMg
cmVmY291bnQgb2YgMSAoc28gd2UgY2FuIGp1c3QgYWx0ZXIgaXQgZGlyZWN0bHkpCi0gICAgICAg
IGV4cGFuZENhcGFjaXR5KG5ld0NhcGFjaXR5V2l0aE92ZXJmbG93Q2hlY2sodGhpc09mZnNldCwg
bGVuZ3RoKSk7Ci0gICAgICAgIGlmIChkYXRhKCkpIHsKLSAgICAgICAgICAgIGNvcHlDaGFycyht
X3JlcC0+ZGF0YSgpICsgdGhpc1NpemUsIHQuZGF0YSgpLCB0U2l6ZSk7Ci0gICAgICAgICAgICBt
X3JlcC0+bGVuID0gbGVuZ3RoOwotICAgICAgICAgICAgbV9yZXAtPl9oYXNoID0gMDsKLSAgICAg
ICAgfQotICAgIH0gZWxzZSBpZiAodGhpc09mZnNldCArIHRoaXNTaXplID09IGJhc2UtPnVzZWRD
YXBhY2l0eSAmJiB0aGlzU2l6ZSA+PSBtaW5TaGFyZVNpemUgJiYgIWJhc2UtPmlzQnVmZmVyUmVh
ZE9ubHkoKSkgewotICAgICAgICAvLyB0aGlzIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgYnVmZmVy
IC0gZXh0ZW5kIGl0IGlmIGl0J3MgbG9uZyBlbm91Z2ggdG8gYXBwZW5kIHRvCi0gICAgICAgIGV4
cGFuZENhcGFjaXR5KG5ld0NhcGFjaXR5V2l0aE92ZXJmbG93Q2hlY2sodGhpc09mZnNldCwgbGVu
Z3RoKSk7Ci0gICAgICAgIGlmIChkYXRhKCkpIHsKLSAgICAgICAgICAgIGNvcHlDaGFycyhtX3Jl
cC0+ZGF0YSgpICsgdGhpc1NpemUsIHQuZGF0YSgpLCB0U2l6ZSk7Ci0gICAgICAgICAgICBtX3Jl
cCA9IFJlcDo6Y3JlYXRlKG1fcmVwLCAwLCBsZW5ndGgpOwotICAgICAgICB9Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgLy8gVGhpcyBpcyBzaGFyZWQgaW4gc29tZSB3YXkgdGhhdCBwcmV2ZW50cyB1
cyBmcm9tIG1vZGlmeWluZyBiYXNlLCBzbyB3ZSBtdXN0IG1ha2UgYSB3aG9sZSBuZXcgc3RyaW5n
LgotICAgICAgICBzaXplX3QgbmV3Q2FwYWNpdHkgPSBleHBhbmRlZFNpemUobGVuZ3RoLCAwKTsK
LSAgICAgICAgVUNoYXIqIGQ7Ci0gICAgICAgIGlmICghYWxsb2NDaGFycyhuZXdDYXBhY2l0eSku
Z2V0VmFsdWUoZCkpCi0gICAgICAgICAgICBtYWtlTnVsbCgpOwotICAgICAgICBlbHNlIHsKLSAg
ICAgICAgICAgIGNvcHlDaGFycyhkLCBkYXRhKCksIHRoaXNTaXplKTsKLSAgICAgICAgICAgIGNv
cHlDaGFycyhkICsgdGhpc1NpemUsIHQuZGF0YSgpLCB0U2l6ZSk7Ci0gICAgICAgICAgICBtX3Jl
cCA9IFJlcDo6Y3JlYXRlKGQsIGxlbmd0aCk7Ci0gICAgICAgICAgICBtX3JlcC0+YmFzZVN0cmlu
ZygpLT5jYXBhY2l0eSA9IG5ld0NhcGFjaXR5OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbV9y
ZXAtPmNoZWNrQ29uc2lzdGVuY3koKTsKLSAgICB0LnJlcCgpLT5jaGVja0NvbnNpc3RlbmN5KCk7
Ci0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLVVTdHJpbmcmIFVTdHJpbmc6OmFwcGVuZChjb25z
dCBVQ2hhciogdERhdGEsIGludCB0U2l6ZSkKLXsKLSAgICBtX3JlcCA9IGNvbmNhdGVuYXRlKG1f
cmVwLnJlbGVhc2UoKSwgdERhdGEsIHRTaXplKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLVVT
dHJpbmcmIFVTdHJpbmc6OmFwcGVuZChjb25zdCBjaGFyKiB0KQotewotICAgIG1fcmVwID0gY29u
Y2F0ZW5hdGUobV9yZXAucmVsZWFzZSgpLCB0KTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLVVT
dHJpbmcmIFVTdHJpbmc6OmFwcGVuZChVQ2hhciBjKQotewotICAgIG1fcmVwLT5jaGVja0NvbnNp
c3RlbmN5KCk7Ci0KLSAgICBpbnQgdGhpc09mZnNldCA9IG1fcmVwLT5vZmZzZXQ7Ci0gICAgaW50
IGxlbmd0aCA9IHNpemUoKTsKLSAgICBCYXNlU3RyaW5nKiBiYXNlID0gbV9yZXAtPmJhc2VTdHJp
bmcoKTsKLQotICAgIC8vIHBvc3NpYmxlIGNhc2VzOgotICAgIGlmIChsZW5ndGggPT0gMCkgewot
ICAgICAgICAvLyB0aGlzIGlzIGVtcHR5IC0gbXVzdCBtYWtlIGEgbmV3IG1fcmVwIGJlY2F1c2Ug
d2UgZG9uJ3Qgd2FudCB0byBwb2xsdXRlIHRoZSBzaGFyZWQgZW1wdHkgb25lIAotICAgICAgICBz
aXplX3QgbmV3Q2FwYWNpdHkgPSBleHBhbmRlZFNpemUoMSwgMCk7Ci0gICAgICAgIFVDaGFyKiBk
OwotICAgICAgICBpZiAoIWFsbG9jQ2hhcnMobmV3Q2FwYWNpdHkpLmdldFZhbHVlKGQpKQotICAg
ICAgICAgICAgbWFrZU51bGwoKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBkWzBdID0g
YzsKLSAgICAgICAgICAgIG1fcmVwID0gUmVwOjpjcmVhdGUoZCwgMSk7Ci0gICAgICAgICAgICBt
X3JlcC0+YmFzZVN0cmluZygpLT5jYXBhY2l0eSA9IG5ld0NhcGFjaXR5OwotICAgICAgICB9Ci0g
ICAgfSBlbHNlIGlmIChtX3JlcCA9PSBiYXNlICYmICFiYXNlLT5pc1NoYXJlZCgpKSB7Ci0gICAg
ICAgIC8vIHRoaXMgaXMgZGlyZWN0IGFuZCBoYXMgcmVmY291bnQgb2YgMSAoc28gd2UgY2FuIGp1
c3QgYWx0ZXIgaXQgZGlyZWN0bHkpCi0gICAgICAgIGV4cGFuZENhcGFjaXR5KG5ld0NhcGFjaXR5
V2l0aE92ZXJmbG93Q2hlY2sodGhpc09mZnNldCwgbGVuZ3RoLCB0cnVlKSk7Ci0gICAgICAgIFVD
aGFyKiBkID0gbV9yZXAtPmRhdGEoKTsKLSAgICAgICAgaWYgKGQpIHsKLSAgICAgICAgICAgIGRb
bGVuZ3RoXSA9IGM7Ci0gICAgICAgICAgICBtX3JlcC0+bGVuID0gbGVuZ3RoICsgMTsKLSAgICAg
ICAgICAgIG1fcmVwLT5faGFzaCA9IDA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHRoaXNP
ZmZzZXQgKyBsZW5ndGggPT0gYmFzZS0+dXNlZENhcGFjaXR5ICYmIGxlbmd0aCA+PSBtaW5TaGFy
ZVNpemUgJiYgIWJhc2UtPmlzQnVmZmVyUmVhZE9ubHkoKSkgewotICAgICAgICAvLyB0aGlzIHJl
YWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIC0gZXh0ZW5kIGl0IGFuZCBzaGFyZQotICAgICAg
ICBleHBhbmRDYXBhY2l0eShuZXdDYXBhY2l0eVdpdGhPdmVyZmxvd0NoZWNrKHRoaXNPZmZzZXQs
IGxlbmd0aCwgdHJ1ZSkpOwotICAgICAgICBVQ2hhciogZCA9IG1fcmVwLT5kYXRhKCk7Ci0gICAg
ICAgIGlmIChkKSB7Ci0gICAgICAgICAgICBkW2xlbmd0aF0gPSBjOwotICAgICAgICAgICAgbV9y
ZXAgPSBSZXA6OmNyZWF0ZShtX3JlcCwgMCwgbGVuZ3RoICsgMSk7Ci0gICAgICAgIH0KLSAgICB9
IGVsc2UgewotICAgICAgICAvLyBUaGlzIGlzIHNoYXJlZCBpbiBzb21lIHdheSB0aGF0IHByZXZl
bnRzIHVzIGZyb20gbW9kaWZ5aW5nIGJhc2UsIHNvIHdlIG11c3QgbWFrZSBhIHdob2xlIG5ldyBz
dHJpbmcuCi0gICAgICAgIHNpemVfdCBuZXdDYXBhY2l0eSA9IGV4cGFuZGVkU2l6ZShsZW5ndGgg
KyAxLCAwKTsKLSAgICAgICAgVUNoYXIqIGQ7Ci0gICAgICAgIGlmICghYWxsb2NDaGFycyhuZXdD
YXBhY2l0eSkuZ2V0VmFsdWUoZCkpCi0gICAgICAgICAgICBtYWtlTnVsbCgpOwotICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgIGNvcHlDaGFycyhkLCBkYXRhKCksIGxlbmd0aCk7Ci0gICAgICAg
ICAgICBkW2xlbmd0aF0gPSBjOwotICAgICAgICAgICAgbV9yZXAgPSBSZXA6OmNyZWF0ZShkLCBs
ZW5ndGggKyAxKTsKLSAgICAgICAgICAgIG1fcmVwLT5iYXNlU3RyaW5nKCktPmNhcGFjaXR5ID0g
bmV3Q2FwYWNpdHk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtX3JlcC0+Y2hlY2tDb25zaXN0
ZW5jeSgpOwotCi0gICAgcmV0dXJuICp0aGlzOwotfQotCiBib29sIFVTdHJpbmc6OmdldENTdHJp
bmcoQ1N0cmluZ0J1ZmZlciYgYnVmZmVyKSBjb25zdAogewogICAgIGludCBsZW5ndGggPSBzaXpl
KCk7CkBAIC0xMjYyLDEzICs0NTUsMTUgQEAgYm9vbCBVU3RyaW5nOjpnZXRDU3RyaW5nKENTdHJp
bmdCdWZmZXImIAogCiBjaGFyKiBVU3RyaW5nOjphc2NpaSgpIGNvbnN0CiB7CisgICAgc3RhdGlj
IGNoYXIqIGFzY2lpQnVmZmVyID0gMDsKKwogICAgIGludCBsZW5ndGggPSBzaXplKCk7CiAgICAg
aW50IG5lZWRlZFNpemUgPSBsZW5ndGggKyAxOwotICAgIGRlbGV0ZVtdIHN0YXRCdWZmZXI7Ci0g
ICAgc3RhdEJ1ZmZlciA9IG5ldyBjaGFyW25lZWRlZFNpemVdOworICAgIGRlbGV0ZVtdIGFzY2lp
QnVmZmVyOworICAgIGFzY2lpQnVmZmVyID0gbmV3IGNoYXJbbmVlZGVkU2l6ZV07CiAKICAgICBj
b25zdCBVQ2hhciogcCA9IGRhdGEoKTsKLSAgICBjaGFyKiBxID0gc3RhdEJ1ZmZlcjsKKyAgICBj
aGFyKiBxID0gYXNjaWlCdWZmZXI7CiAgICAgY29uc3QgVUNoYXIqIGxpbWl0ID0gcCArIGxlbmd0
aDsKICAgICB3aGlsZSAocCAhPSBsaW1pdCkgewogICAgICAgICAqcSA9IHN0YXRpY19jYXN0PGNo
YXI+KHBbMF0pOwpAQCAtMTI3Nyw3ICs0NzIsNyBAQCBjaGFyKiBVU3RyaW5nOjphc2NpaSgpIGNv
bnN0CiAgICAgfQogICAgICpxID0gJ1wwJzsKIAotICAgIHJldHVybiBzdGF0QnVmZmVyOworICAg
IHJldHVybiBhc2NpaUJ1ZmZlcjsKIH0KIAogVVN0cmluZyYgVVN0cmluZzo6b3BlcmF0b3I9KGNv
bnN0IGNoYXIqIGMpCkBAIC0xMjk0LDIwICs0ODksMTMgQEAgVVN0cmluZyYgVVN0cmluZzo6b3Bl
cmF0b3I9KGNvbnN0IGNoYXIqIAogCiAgICAgaW50IGwgPSBzdGF0aWNfY2FzdDxpbnQ+KHN0cmxl
bihjKSk7CiAgICAgVUNoYXIqIGQ7Ci0gICAgQmFzZVN0cmluZyogYmFzZSA9IG1fcmVwLT5iYXNl
U3RyaW5nKCk7Ci0gICAgaWYgKCFiYXNlLT5pc1NoYXJlZCgpICYmIGwgPD0gYmFzZS0+Y2FwYWNp
dHkgJiYgbV9yZXAgPT0gYmFzZSAmJiBtX3JlcC0+b2Zmc2V0ID09IDAgJiYgYmFzZS0+cHJlQ2Fw
YWNpdHkgPT0gMCkgewotICAgICAgICBkID0gYmFzZS0+YnVmOwotICAgICAgICBtX3JlcC0+X2hh
c2ggPSAwOwotICAgICAgICBtX3JlcC0+bGVuID0gbDsKLSAgICB9IGVsc2UgewotICAgICAgICBp
ZiAoIWFsbG9jQ2hhcnMobCkuZ2V0VmFsdWUoZCkpIHsKLSAgICAgICAgICAgIG1ha2VOdWxsKCk7
Ci0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgbV9yZXAgPSBS
ZXA6OmNyZWF0ZShkLCBsKTsKKyAgICBpZiAoIVVTdHJpbmdJbXBsOjphbGxvY0NoYXJzKGwpLmdl
dFZhbHVlKGQpKSB7CisgICAgICAgIG1ha2VOdWxsKCk7CisgICAgICAgIHJldHVybiAqdGhpczsK
ICAgICB9CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsOyBpKyspCiAgICAgICAgIGRbaV0gPSBz
dGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjW2ldKTsgLy8gdXNlIHVuc2lnbmVkIGNoYXIgdG8g
emVyby1leHRlbmQgaW5zdGVhZCBvZiBzaWduLWV4dGVuZAorICAgIG1fcmVwID0gUmVwOjpjcmVh
dGUoZCwgbCk7CiAKICAgICByZXR1cm4gKnRoaXM7CiB9CkBAIC0xNDY1LDcgKzY1Myw3IEBAIHVp
bnQzMl90IFVTdHJpbmc6OnRvU3RyaWN0VUludDMyKGJvb2wqIG8KICAgICAgICAgKm9rID0gZmFs
c2U7CiAKICAgICAvLyBFbXB0eSBzdHJpbmcgaXMgbm90IE9LLgotICAgIGludCBsZW4gPSBtX3Jl
cC0+bGVuOworICAgIGludCBsZW4gPSBtX3JlcC0+c2l6ZSgpOwogICAgIGlmIChsZW4gPT0gMCkK
ICAgICAgICAgcmV0dXJuIDA7CiAgICAgY29uc3QgVUNoYXIqIHAgPSBtX3JlcC0+ZGF0YSgpOwpA
QCAtMTY5Miw4ICs4ODAsOCBAQCBpbnQgY29tcGFyZShjb25zdCBVU3RyaW5nJiBzMSwgY29uc3Qg
VVN0CiAKIGJvb2wgZXF1YWwoY29uc3QgVVN0cmluZzo6UmVwKiByLCBjb25zdCBVU3RyaW5nOjpS
ZXAqIGIpCiB7Ci0gICAgaW50IGxlbmd0aCA9IHItPmxlbjsKLSAgICBpZiAobGVuZ3RoICE9IGIt
PmxlbikKKyAgICBpbnQgbGVuZ3RoID0gci0+c2l6ZSgpOworICAgIGlmIChsZW5ndGggIT0gYi0+
c2l6ZSgpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgY29uc3QgVUNoYXIqIGQgPSByLT5k
YXRhKCk7CiAgICAgY29uc3QgVUNoYXIqIHMgPSBiLT5kYXRhKCk7CkluZGV4OiBKYXZhU2NyaXB0
Q29yZS9ydW50aW1lL1VTdHJpbmcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ydW50
aW1lL1VTdHJpbmcuaAkocmV2aXNpb24gNTIzNDYpCisrKyBKYXZhU2NyaXB0Q29yZS9ydW50aW1l
L1VTdHJpbmcuaAkod29ya2luZyBjb3B5KQpAQCAtMjQsNiArMjQsNyBAQAogI2RlZmluZSBVU3Ry
aW5nX2gKIAogI2luY2x1ZGUgIkNvbGxlY3Rvci5oIgorI2luY2x1ZGUgIlVTdHJpbmdJbXBsLmgi
CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8d3Rm
L0Fzc2VydGlvbnMuaD4KQEAgLTQwLDggKzQxLDYgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgdXNp
bmcgV1RGOjpQbGFjZW1lbnROZXdBZG9wdFR5cGU7CiAgICAgdXNpbmcgV1RGOjpQbGFjZW1lbnRO
ZXdBZG9wdDsKIAotICAgIGNsYXNzIElkZW50aWZpZXJUYWJsZTsKLSAgCiAgICAgY2xhc3MgQ1N0
cmluZyB7CiAgICAgcHVibGljOgogICAgICAgICBDU3RyaW5nKCkKQEAgLTcxLDE3NCArNzAsMjAg
QEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgIGNoYXIqIG1fZGF0YTsKICAgICB9OwogCisgICAg
Ym9vbCBvcGVyYXRvcj09KGNvbnN0IENTdHJpbmcmLCBjb25zdCBDU3RyaW5nJik7CisKICAgICB0
eXBlZGVmIFZlY3RvcjxjaGFyLCAzMj4gQ1N0cmluZ0J1ZmZlcjsKIAogICAgIGNsYXNzIFVTdHJp
bmcgewogICAgICAgICBmcmllbmQgY2xhc3MgSklUOwogCiAgICAgcHVibGljOgotICAgICAgICB0
eXBlZGVmIENyb3NzVGhyZWFkUmVmQ291bnRlZDxPd25GYXN0TWFsbG9jUHRyPFVDaGFyPiA+IFNo
YXJlZFVDaGFyOwotICAgICAgICBzdHJ1Y3QgQmFzZVN0cmluZzsKLSAgICAgICAgc3RydWN0IFJl
cCA6IE5vbmNvcHlhYmxlIHsKLSAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBKSVQ7Ci0KLSAgICAg
ICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJlcD4gY3JlYXRlKFVDaGFyKiBidWZmZXIsIGludCBs
ZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5l
dyBCYXNlU3RyaW5nKGJ1ZmZlciwgbGVuZ3RoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJlcD4gY3JlYXRlRW1wdHlCdWZmZXIoc2l6ZV90IHNpemUp
Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBpbnRlZ2Vy
IG92ZXJmbG93Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUgPCAoc3RkOjpudW1lcmljX2xpbWl0
czxzaXplX3Q+OjptYXgoKSAvIHNpemVvZihVQ2hhcikpKSB7Ci0gICAgICAgICAgICAgICAgICAg
IHZvaWQqIGJ1ZiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cnlGYXN0TWFsbG9jKHNp
emUgKiBzaXplb2YoVUNoYXIpKS5nZXRWYWx1ZShidWYpKQotICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBCYXNlU3RyaW5nKHN0YXRpY19jYXN0PFVDaGFyKj4oYnVm
KSwgMCwgc2l6ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4g
YWRvcHRSZWYobmV3IEJhc2VTdHJpbmcoMCwgMCwgMCkpOwotICAgICAgICAgICAgfQotCi0gICAg
ICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxSZXA+IGNyZWF0ZUNvcHlpbmcoY29uc3QgVUNoYXIq
LCBpbnQpOwotICAgICAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVwPiBjcmVhdGUoUGFzc1Jl
ZlB0cjxSZXA+IGJhc2UsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOwotCi0gICAgICAgICAgICAv
LyBDb25zdHJ1Y3RzIGEgc3RyaW5nIGZyb20gYSBVVEYtOCBzdHJpbmcsIHVzaW5nIHN0cmljdCBj
b252ZXJzaW9uIChzZWUgY29tbWVudHMgaW4gVVRGOC5oKS4KLSAgICAgICAgICAgIC8vIFJldHVy
bnMgVVN0cmluZzo6UmVwOjpudWxsIGZvciBudWxsIGlucHV0IG9yIGNvbnZlcnNpb24gZmFpbHVy
ZS4KLSAgICAgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJlcD4gY3JlYXRlRnJvbVVURjgoY29u
c3QgY2hhciopOwotCi0gICAgICAgICAgICAvLyBVc2VzIFNoYXJlZFVDaGFyIHRvIGhhdmUgam9p
bnQgb3duZXJzaGlwIG92ZXIgdGhlIFVDaGFyKi4KLSAgICAgICAgICAgIHN0YXRpYyBQYXNzUmVm
UHRyPFJlcD4gY3JlYXRlKFVDaGFyKiwgaW50LCBQYXNzUmVmUHRyPFNoYXJlZFVDaGFyPik7Ci0K
LSAgICAgICAgICAgIFNoYXJlZFVDaGFyKiBzaGFyZWRCdWZmZXIoKTsKLSAgICAgICAgICAgIHZv
aWQgZGVzdHJveSgpOwotCi0gICAgICAgICAgICBib29sIGJhc2VJc1NlbGYoKSBjb25zdCB7IHJl
dHVybiBtX2lkZW50aWZpZXJUYWJsZUFuZEZsYWdzLmlzRmxhZ1NldChCYXNlU3RyaW5nRmxhZyk7
IH0KLSAgICAgICAgICAgIFVDaGFyKiBkYXRhKCkgY29uc3Q7Ci0gICAgICAgICAgICBpbnQgc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIGxlbjsgfQotCi0gICAgICAgICAgICB1bnNpZ25lZCBoYXNoKCkg
Y29uc3QgeyBpZiAoX2hhc2ggPT0gMCkgX2hhc2ggPSBjb21wdXRlSGFzaChkYXRhKCksIGxlbik7
IHJldHVybiBfaGFzaDsgfQotICAgICAgICAgICAgdW5zaWduZWQgY29tcHV0ZWRIYXNoKCkgY29u
c3QgeyBBU1NFUlQoX2hhc2gpOyByZXR1cm4gX2hhc2g7IH0gLy8gZmFzdCBwYXRoIGZvciBJZGVu
dGlmaWVycwotICAgICAgICAgICAgdm9pZCBzZXRIYXNoKHVuc2lnbmVkIGhhc2gpIHsgQVNTRVJU
KGhhc2ggPT0gY29tcHV0ZUhhc2goZGF0YSgpLCBsZW4pKTsgX2hhc2ggPSBoYXNoOyB9IC8vIGZh
c3QgcGF0aCBmb3IgSWRlbnRpZmllcnMKLQotICAgICAgICAgICAgc3RhdGljIHVuc2lnbmVkIGNv
bXB1dGVIYXNoKGNvbnN0IFVDaGFyKiwgaW50IGxlbmd0aCk7Ci0gICAgICAgICAgICBzdGF0aWMg
dW5zaWduZWQgY29tcHV0ZUhhc2goY29uc3QgY2hhciosIGludCBsZW5ndGgpOwotICAgICAgICAg
ICAgc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVIYXNoKGNvbnN0IGNoYXIqIHMpIHsgcmV0dXJuIGNv
bXB1dGVIYXNoKHMsIHN0cmxlbihzKSk7IH0KLQotICAgICAgICAgICAgSWRlbnRpZmllclRhYmxl
KiBpZGVudGlmaWVyVGFibGUoKSBjb25zdCB7IHJldHVybiBtX2lkZW50aWZpZXJUYWJsZUFuZEZs
YWdzLmdldCgpOyB9Ci0gICAgICAgICAgICB2b2lkIHNldElkZW50aWZpZXJUYWJsZShJZGVudGlm
aWVyVGFibGUqIHRhYmxlKSB7IEFTU0VSVCghaXNTdGF0aWMoKSk7IG1faWRlbnRpZmllclRhYmxl
QW5kRmxhZ3Muc2V0KHRhYmxlKTsgfQotCi0gICAgICAgICAgICBib29sIGlzU3RhdGljKCkgY29u
c3QgeyByZXR1cm4gbV9pZGVudGlmaWVyVGFibGVBbmRGbGFncy5pc0ZsYWdTZXQoU3RhdGljRmxh
Zyk7IH0KLSAgICAgICAgICAgIHZvaWQgc2V0U3RhdGljKGJvb2wpOwotICAgICAgICAgICAgdm9p
ZCBzZXRCYXNlU3RyaW5nKFBhc3NSZWZQdHI8QmFzZVN0cmluZz4pOwotICAgICAgICAgICAgQmFz
ZVN0cmluZyogYmFzZVN0cmluZygpOwotICAgICAgICAgICAgY29uc3QgQmFzZVN0cmluZyogYmFz
ZVN0cmluZygpIGNvbnN0OwotCi0gICAgICAgICAgICBSZXAqIHJlZigpIHsgKytyYzsgcmV0dXJu
IHRoaXM7IH0KLSAgICAgICAgICAgIEFMV0FZU19JTkxJTkUgdm9pZCBkZXJlZigpIHsgaWYgKC0t
cmMgPT0gMCkgZGVzdHJveSgpOyB9Ci0KLSAgICAgICAgICAgIHZvaWQgY2hlY2tDb25zaXN0ZW5j
eSgpIGNvbnN0OwotICAgICAgICAgICAgZW51bSBVU3RyaW5nRmxhZ3MgewotICAgICAgICAgICAg
ICAgIFN0YXRpY0ZsYWcsCi0gICAgICAgICAgICAgICAgQmFzZVN0cmluZ0ZsYWcKLSAgICAgICAg
ICAgIH07Ci0KLSAgICAgICAgICAgIC8vIHVuc2hhcmVkIGRhdGEKLSAgICAgICAgICAgIGludCBv
ZmZzZXQ7Ci0gICAgICAgICAgICBpbnQgbGVuOwotICAgICAgICAgICAgaW50IHJjOyAvLyBGb3Ig
bnVsbCBhbmQgZW1wdHkgc3RhdGljIHN0cmluZ3MsIHRoaXMgZmllbGQgZG9lcyBub3QgcmVmbGVj
dCBhIGNvcnJlY3QgY291bnQsIGJlY2F1c2UgcmVmL2RlcmVmIGFyZSBub3QgdGhyZWFkLXNhZmUu
IEEgc3BlY2lhbCBjYXNlIGluIGRlc3Ryb3koKSBndWFyYW50ZWVzIHRoYXQgdGhlc2UgZG8gbm90
IGdldCBkZWxldGVkLgotICAgICAgICAgICAgbXV0YWJsZSB1bnNpZ25lZCBfaGFzaDsKLSAgICAg
ICAgICAgIFB0ckFuZEZsYWdzPElkZW50aWZpZXJUYWJsZSwgVVN0cmluZ0ZsYWdzPiBtX2lkZW50
aWZpZXJUYWJsZUFuZEZsYWdzOwotCi0gICAgICAgICAgICBzdGF0aWMgQmFzZVN0cmluZyYgbnVs
bCgpIHsgcmV0dXJuICpudWxsQmFzZVN0cmluZzsgfQotICAgICAgICAgICAgc3RhdGljIEJhc2VT
dHJpbmcmIGVtcHR5KCkgeyByZXR1cm4gKmVtcHR5QmFzZVN0cmluZzsgfQotCi0gICAgICAgICAg
ICBib29sIHJlc2VydmVDYXBhY2l0eShpbnQgY2FwYWNpdHkpOwotCi0gICAgICAgIHByb3RlY3Rl
ZDoKLSAgICAgICAgICAgIC8vIENvbnN0cnVjdG9yIGZvciB1c2UgYnkgQmFzZVN0cmluZyBzdWJj
bGFzczsgdGhleSB1c2UgdGhlIHVuaW9uIHdpdGggbV9iYXNlU3RyaW5nIGZvciBhbm90aGVyIHB1
cnBvc2UuCi0gICAgICAgICAgICBSZXAoaW50IGxlbmd0aCkKLSAgICAgICAgICAgICAgICA6IG9m
ZnNldCgwKQotICAgICAgICAgICAgICAgICwgbGVuKGxlbmd0aCkKLSAgICAgICAgICAgICAgICAs
IHJjKDEpCi0gICAgICAgICAgICAgICAgLCBfaGFzaCgwKQotICAgICAgICAgICAgICAgICwgbV9i
YXNlU3RyaW5nKDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
IFJlcChQYXNzUmVmUHRyPEJhc2VTdHJpbmc+IGJhc2UsIGludCBvZmZzZXRJbkJhc2UsIGludCBs
ZW5ndGgpCi0gICAgICAgICAgICAgICAgOiBvZmZzZXQob2Zmc2V0SW5CYXNlKQotICAgICAgICAg
ICAgICAgICwgbGVuKGxlbmd0aCkKLSAgICAgICAgICAgICAgICAsIHJjKDEpCi0gICAgICAgICAg
ICAgICAgLCBfaGFzaCgwKQotICAgICAgICAgICAgICAgICwgbV9iYXNlU3RyaW5nKGJhc2UucmVs
ZWFzZVJlZigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoZWNrQ29uc2lzdGVu
Y3koKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdW5pb24gewotICAgICAgICAgICAg
ICAgIC8vIElmICFiYXNlSXNTZWxmKCkKLSAgICAgICAgICAgICAgICBCYXNlU3RyaW5nKiBtX2Jh
c2VTdHJpbmc7Ci0gICAgICAgICAgICAgICAgLy8gSWYgYmFzZUlzU2VsZigpCi0gICAgICAgICAg
ICAgICAgU2hhcmVkVUNoYXIqIG1fc2hhcmVkQnVmZmVyOwotICAgICAgICAgICAgfTsKLQotICAg
ICAgICBwcml2YXRlOgotICAgICAgICAgICAgLy8gRm9yIFNtYWxsU3RyaW5nU3RvcmFnZSB3aGlj
aCBhbGxvY2F0ZXMgYW4gYXJyYXkgYW5kIGRvZXMgaW5pdGlhbGl6YXRpb24gbWFudWFsbHkuCi0g
ICAgICAgICAgICBSZXAoKSB7IH0KLQotICAgICAgICAgICAgZnJpZW5kIGNsYXNzIFNtYWxsU3Ry
aW5nc1N0b3JhZ2U7Ci0gICAgICAgICAgICBmcmllbmQgdm9pZCBpbml0aWFsaXplVVN0cmluZygp
OwotICAgICAgICAgICAgSlNfRVhQT1JUREFUQSBzdGF0aWMgQmFzZVN0cmluZyogbnVsbEJhc2VT
dHJpbmc7Ci0gICAgICAgICAgICBKU19FWFBPUlREQVRBIHN0YXRpYyBCYXNlU3RyaW5nKiBlbXB0
eUJhc2VTdHJpbmc7Ci0gICAgICAgIH07Ci0KLQotICAgICAgICBzdHJ1Y3QgQmFzZVN0cmluZyA6
IHB1YmxpYyBSZXAgewotICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCgpIHsgcmV0dXJuIHJjICE9
IDEgfHwgaXNCdWZmZXJSZWFkT25seSgpOyB9Ci0gICAgICAgICAgICB2b2lkIHNldFNoYXJlZEJ1
ZmZlcihQYXNzUmVmUHRyPFNoYXJlZFVDaGFyPik7Ci0KLSAgICAgICAgICAgIGJvb2wgaXNCdWZm
ZXJSZWFkT25seSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX3NoYXJl
ZEJ1ZmZlcikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAg
ICAgIHJldHVybiBzbG93SXNCdWZmZXJSZWFkT25seSgpOwotICAgICAgICAgICAgfQotCi0gICAg
ICAgICAgICAvLyBwb3RlbnRpYWxseSBzaGFyZWQgZGF0YS4KLSAgICAgICAgICAgIFVDaGFyKiBi
dWY7Ci0gICAgICAgICAgICBpbnQgcHJlQ2FwYWNpdHk7Ci0gICAgICAgICAgICBpbnQgdXNlZFBy
ZUNhcGFjaXR5OwotICAgICAgICAgICAgaW50IGNhcGFjaXR5OwotICAgICAgICAgICAgaW50IHVz
ZWRDYXBhY2l0eTsKLQotICAgICAgICAgICAgc2l6ZV90IHJlcG9ydGVkQ29zdDsKLQotICAgICAg
ICBwcml2YXRlOgotICAgICAgICAgICAgQmFzZVN0cmluZyhVQ2hhciogYnVmZmVyLCBpbnQgbGVu
Z3RoLCBpbnQgYWRkaXRpb25hbENhcGFjaXR5ID0gMCkKLSAgICAgICAgICAgICAgICA6IFJlcChs
ZW5ndGgpCi0gICAgICAgICAgICAgICAgLCBidWYoYnVmZmVyKQotICAgICAgICAgICAgICAgICwg
cHJlQ2FwYWNpdHkoMCkKLSAgICAgICAgICAgICAgICAsIHVzZWRQcmVDYXBhY2l0eSgwKQotICAg
ICAgICAgICAgICAgICwgY2FwYWNpdHkobGVuZ3RoICsgYWRkaXRpb25hbENhcGFjaXR5KQotICAg
ICAgICAgICAgICAgICwgdXNlZENhcGFjaXR5KGxlbmd0aCkKLSAgICAgICAgICAgICAgICAsIHJl
cG9ydGVkQ29zdCgwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1faWRlbnRpZmll
clRhYmxlQW5kRmxhZ3Muc2V0RmxhZyhCYXNlU3RyaW5nRmxhZyk7Ci0gICAgICAgICAgICAgICAg
Y2hlY2tDb25zaXN0ZW5jeSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTaGFyZWRV
Q2hhciogc2hhcmVkQnVmZmVyKCk7Ci0gICAgICAgICAgICBib29sIHNsb3dJc0J1ZmZlclJlYWRP
bmx5KCk7Ci0KLSAgICAgICAgICAgIGZyaWVuZCBzdHJ1Y3QgUmVwOwotICAgICAgICAgICAgZnJp
ZW5kIGNsYXNzIFNtYWxsU3RyaW5nc1N0b3JhZ2U7Ci0gICAgICAgICAgICBmcmllbmQgdm9pZCBp
bml0aWFsaXplVVN0cmluZygpOwotICAgICAgICB9OwotCisgICAgICAgIHR5cGVkZWYgVVN0cmlu
Z0ltcGwgUmVwOworICAgIAogICAgIHB1YmxpYzoKKyAgICAgICAgLy8gVVN0cmluZyBjb25zdHJ1
Y3RvcnMgcGFzc2VkIGNoYXIqcyBhc3N1bWUgNy1iaXQgQVNDSUkgZW5jaWRpbmc7IGZvciBVVEY4
IHVzZSAnY3JlYXRlRnJvbVVURjgnLCBiZWx3by4KICAgICAgICAgVVN0cmluZygpOwotICAgICAg
ICAvLyBDb25zdHJ1Y3RvciBmb3IgbnVsbC10ZXJtaW5hdGVkIEFTQ0lJIHN0cmluZy4KICAgICAg
ICAgVVN0cmluZyhjb25zdCBjaGFyKik7Ci0gICAgICAgIC8vIENvbnN0cnVjdG9yIGZvciBub24t
bnVsbC10ZXJtaW5hdGVkIEFTQ0lJIHN0cmluZy4KICAgICAgICAgVVN0cmluZyhjb25zdCBjaGFy
KiwgaW50IGxlbmd0aCk7CiAgICAgICAgIFVTdHJpbmcoY29uc3QgVUNoYXIqLCBpbnQgbGVuZ3Ro
KTsKICAgICAgICAgVVN0cmluZyhjb25zdCBWZWN0b3I8VUNoYXI+JiBidWZmZXIpOwpAQCAtMjYw
LDYgKzEwNSw3IEBAIG5hbWVzcGFjZSBKU0MgewogCiAgICAgICAgIHN0YXRpYyBVU3RyaW5nIGNy
ZWF0ZU5vbkNvcHlpbmcoVUNoYXIqIGMsIGludCBsZW5ndGgpOwogICAgICAgICBzdGF0aWMgVVN0
cmluZyBjcmVhdGVGcm9tVVRGOChjb25zdCBjaGFyKik7CisgICAgICAgIHN0YXRpYyBVU3RyaW5n
IGNyZWF0ZVVuaW5pdGlhbGl6ZWQodW5zaWduZWQgbGVuZ3RoLCBVQ2hhciomIG91dHB1dCk7CiAK
ICAgICAgICAgc3RhdGljIFVTdHJpbmcgZnJvbShpbnQpOwogICAgICAgICBzdGF0aWMgVVN0cmlu
ZyBmcm9tKGxvbmcgbG9uZyk7CkBAIC0yODcsMTIgKzEzMyw2IEBAIG5hbWVzcGFjZSBKU0Mgewog
CiAgICAgICAgIFVTdHJpbmcgcmVwbGFjZVJhbmdlKGludCByYW5nZVN0YXJ0LCBpbnQgUmFuZ2VF
bmQsIGNvbnN0IFVTdHJpbmcmIHJlcGxhY2VtZW50KSBjb25zdDsKIAotICAgICAgICBVU3RyaW5n
JiBhcHBlbmQoY29uc3QgVVN0cmluZyYpOwotICAgICAgICBVU3RyaW5nJiBhcHBlbmQoY29uc3Qg
Y2hhciopOwotICAgICAgICBVU3RyaW5nJiBhcHBlbmQoVUNoYXIpOwotICAgICAgICBVU3RyaW5n
JiBhcHBlbmQoY2hhciBjKSB7IHJldHVybiBhcHBlbmQoc3RhdGljX2Nhc3Q8VUNoYXI+KHN0YXRp
Y19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpKSk7IH0KLSAgICAgICAgVVN0cmluZyYgYXBwZW5kKGNv
bnN0IFVDaGFyKiwgaW50IHNpemUpOwotCiAgICAgICAgIGJvb2wgZ2V0Q1N0cmluZyhDU3RyaW5n
QnVmZmVyJikgY29uc3Q7CiAKICAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2Qgc2hvdWxkIG9u
bHkgYmUgdXNlZCBmb3IgKmRlYnVnZ2luZyogcHVycG9zZXMgYXMgaXQKQEAgLTMxMSwxMyArMTUx
LDEwIEBAIG5hbWVzcGFjZSBKU0MgewogCiAgICAgICAgIFVTdHJpbmcmIG9wZXJhdG9yPShjb25z
dCBjaGFyKmMpOwogCi0gICAgICAgIFVTdHJpbmcmIG9wZXJhdG9yKz0oY29uc3QgVVN0cmluZyYg
cykgeyByZXR1cm4gYXBwZW5kKHMpOyB9Ci0gICAgICAgIFVTdHJpbmcmIG9wZXJhdG9yKz0oY29u
c3QgY2hhciogcykgeyByZXR1cm4gYXBwZW5kKHMpOyB9Ci0KICAgICAgICAgY29uc3QgVUNoYXIq
IGRhdGEoKSBjb25zdCB7IHJldHVybiBtX3JlcC0+ZGF0YSgpOyB9CiAKICAgICAgICAgYm9vbCBp
c051bGwoKSBjb25zdCB7IHJldHVybiAobV9yZXAgPT0gJlJlcDo6bnVsbCgpKTsgfQotICAgICAg
ICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAoIW1fcmVwLT5sZW4pOyB9CisgICAgICAg
IGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICghbV9yZXAtPnNpemUoKSk7IH0KIAogICAg
ICAgICBib29sIGlzOEJpdCgpIGNvbnN0OwogCkBAIC0zNTMsMjIgKzE5MCw5IEBAIG5hbWVzcGFj
ZSBKU0MgewogICAgICAgICAgICAgQVNTRVJUKG1fcmVwKTsKICAgICAgICAgfQogCi0gICAgICAg
IHNpemVfdCBjb3N0KCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gQXR0ZW1wdCB0byBncm93IHRoaXMg
c3RyaW5nIHN1Y2ggdGhhdCBpdCBjYW4gZ3JvdyB0byBhIHRvdGFsIGxlbmd0aCBvZiAnY2FwYWNp
dHknCi0gICAgICAgIC8vIHdpdGhvdXQgcmVhbGxvY2F0aW9uLiAgVGhpcyBtYXkgZmFpbCBhIG51
bWJlciBvZiByZWFzb25zIC0gaWYgdGhlIEJhc2ljU3RyaW5nIGlzCi0gICAgICAgIC8vIHNoYXJl
ZCBhbmQgYW5vdGhlciBzdHJpbmcgaXMgdXNpbmcgcGFydCBvZiB0aGUgY2FwYWNpdHkgYmV5b25k
IG91ciBlbmQgcG9pbnQsIGlmCi0gICAgICAgIC8vIHRoZSByZWFsbG9jIGZhaWxzLCBvciBpZiB0
aGlzIHN0cmluZyBpcyBlbXB0eSBhbmQgaGFzIG5vIHN0b3JhZ2UuCi0gICAgICAgIC8vCi0gICAg
ICAgIC8vIFRoaXMgbWV0aG9kIHJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4K
LSAgICAgICAgYm9vbCByZXNlcnZlQ2FwYWNpdHkoaW50IGNhcGFjaXR5KQotICAgICAgICB7Ci0g
ICAgICAgICAgICByZXR1cm4gbV9yZXAtPnJlc2VydmVDYXBhY2l0eShjYXBhY2l0eSk7Ci0gICAg
ICAgIH0KKyAgICAgICAgc2l6ZV90IGNvc3QoKSBjb25zdCB7IHJldHVybiBtX3JlcC0+Y29zdCgp
OyB9CiAKICAgICBwcml2YXRlOgotICAgICAgICB2b2lkIGV4cGFuZENhcGFjaXR5KGludCByZXF1
aXJlZExlbmd0aCk7Ci0gICAgICAgIHZvaWQgZXhwYW5kUHJlQ2FwYWNpdHkoaW50IHJlcXVpcmVk
UHJlQ2FwKTsKICAgICAgICAgdm9pZCBtYWtlTnVsbCgpOwogCiAgICAgICAgIFJlZlB0cjxSZXA+
IG1fcmVwOwpAQCAtMzc2LDExICsyMDAsNyBAQCBuYW1lc3BhY2UgSlNDIHsKIAogICAgICAgICBm
cmllbmQgdm9pZCBpbml0aWFsaXplVVN0cmluZygpOwogICAgICAgICBmcmllbmQgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IFVTdHJpbmcmLCBjb25zdCBVU3RyaW5nJik7Ci0gICAgICAgIGZyaWVuZCBQ
YXNzUmVmUHRyPFJlcD4gY29uY2F0ZW5hdGUoUmVwKiwgUmVwKik7IC8vIHJldHVybnMgMCBpZiBv
dXQgb2YgbWVtb3J5CiAgICAgfTsKLSAgICBQYXNzUmVmUHRyPFVTdHJpbmc6OlJlcD4gY29uY2F0
ZW5hdGUoVVN0cmluZzo6UmVwKiwgVVN0cmluZzo6UmVwKik7Ci0gICAgUGFzc1JlZlB0cjxVU3Ry
aW5nOjpSZXA+IGNvbmNhdGVuYXRlKFVTdHJpbmc6OlJlcCosIGludCk7Ci0gICAgUGFzc1JlZlB0
cjxVU3RyaW5nOjpSZXA+IGNvbmNhdGVuYXRlKFVTdHJpbmc6OlJlcCosIGRvdWJsZSk7CiAKICAg
ICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVTdHJpbmcmIHMxLCBjb25zdCBVU3RyaW5n
JiBzMikKICAgICB7CkBAIC00MjgsNzIgKzI0OCw4IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAg
ICByZXR1cm4gIUpTQzo6b3BlcmF0b3I9PShzMSwgczIpOwogICAgIH0KIAotICAgIGJvb2wgb3Bl
cmF0b3I9PShjb25zdCBDU3RyaW5nJiwgY29uc3QgQ1N0cmluZyYpOwotCi0gICAgaW5saW5lIFVT
dHJpbmcgb3BlcmF0b3IrKGNvbnN0IFVTdHJpbmcmIHMxLCBjb25zdCBVU3RyaW5nJiBzMikKLSAg
ICB7Ci0gICAgICAgIFJlZlB0cjxVU3RyaW5nOjpSZXA+IHJlc3VsdCA9IGNvbmNhdGVuYXRlKHMx
LnJlcCgpLCBzMi5yZXAoKSk7Ci0gICAgICAgIHJldHVybiBVU3RyaW5nKHJlc3VsdCA/IHJlc3Vs
dC5yZWxlYXNlKCkgOiBVU3RyaW5nOjpudWxsUmVwKCkpOwotICAgIH0KLQogICAgIGludCBjb21w
YXJlKGNvbnN0IFVTdHJpbmcmLCBjb25zdCBVU3RyaW5nJik7CiAKLSAgICBib29sIGVxdWFsKGNv
bnN0IFVTdHJpbmc6OlJlcCosIGNvbnN0IFVTdHJpbmc6OlJlcCopOwotCi0gICAgaW5saW5lIFBh
c3NSZWZQdHI8VVN0cmluZzo6UmVwPiBVU3RyaW5nOjpSZXA6OmNyZWF0ZShQYXNzUmVmUHRyPFVT
dHJpbmc6OlJlcD4gcmVwLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotICAgIHsKLSAgICAgICAg
QVNTRVJUKHJlcCk7Ci0gICAgICAgIHJlcC0+Y2hlY2tDb25zaXN0ZW5jeSgpOwotCi0gICAgICAg
IGludCByZXBPZmZzZXQgPSByZXAtPm9mZnNldDsKLQotICAgICAgICBQYXNzUmVmUHRyPEJhc2VT
dHJpbmc+IGJhc2UgPSByZXAtPmJhc2VTdHJpbmcoKTsKLQotICAgICAgICBBU1NFUlQoLShvZmZz
ZXQgKyByZXBPZmZzZXQpIDw9IGJhc2UtPnVzZWRQcmVDYXBhY2l0eSk7Ci0gICAgICAgIEFTU0VS
VChvZmZzZXQgKyByZXBPZmZzZXQgKyBsZW5ndGggPD0gYmFzZS0+dXNlZENhcGFjaXR5KTsKLQot
ICAgICAgICAvLyBTdGVhbCB0aGUgc2luZ2xlIHJlZmVyZW5jZSB0aGlzIFJlcCB3YXMgY3JlYXRl
ZCB3aXRoLgotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFJlcChiYXNlLCByZXBPZmZzZXQg
KyBvZmZzZXQsIGxlbmd0aCkpOwotICAgIH0KLQotICAgIGlubGluZSBVQ2hhciogVVN0cmluZzo6
UmVwOjpkYXRhKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGNvbnN0IEJhc2VTdHJpbmcqIGJhc2Ug
PSBiYXNlU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBiYXNlLT5idWYgKyBiYXNlLT5wcmVDYXBh
Y2l0eSArIG9mZnNldDsKLSAgICB9Ci0KLSAgICBpbmxpbmUgdm9pZCBVU3RyaW5nOjpSZXA6OnNl
dFN0YXRpYyhib29sIHYpCi0gICAgewotICAgICAgICBBU1NFUlQoIWlkZW50aWZpZXJUYWJsZSgp
KTsKLSAgICAgICAgaWYgKHYpCi0gICAgICAgICAgICBtX2lkZW50aWZpZXJUYWJsZUFuZEZsYWdz
LnNldEZsYWcoU3RhdGljRmxhZyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1faWRlbnRp
ZmllclRhYmxlQW5kRmxhZ3MuY2xlYXJGbGFnKFN0YXRpY0ZsYWcpOwotICAgIH0KLQotICAgIGlu
bGluZSB2b2lkIFVTdHJpbmc6OlJlcDo6c2V0QmFzZVN0cmluZyhQYXNzUmVmUHRyPEJhc2VTdHJp
bmc+IGJhc2UpCi0gICAgewotICAgICAgICBBU1NFUlQoYmFzZSAhPSB0aGlzKTsKLSAgICAgICAg
QVNTRVJUKCFiYXNlSXNTZWxmKCkpOwotICAgICAgICBtX2Jhc2VTdHJpbmcgPSBiYXNlLnJlbGVh
c2VSZWYoKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgVVN0cmluZzo6QmFzZVN0cmluZyogVVN0cmlu
Zzo6UmVwOjpiYXNlU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAhYmFzZUlzU2VsZigp
ID8gbV9iYXNlU3RyaW5nIDogcmVpbnRlcnByZXRfY2FzdDxCYXNlU3RyaW5nKj4odGhpcykgOwot
ICAgIH0KLQotICAgIGlubGluZSBjb25zdCBVU3RyaW5nOjpCYXNlU3RyaW5nKiBVU3RyaW5nOjpS
ZXA6OmJhc2VTdHJpbmcoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8
UmVwKj4odGhpcyktPmJhc2VTdHJpbmcoKTsKLSAgICB9Ci0KLSNpZmRlZiBOREVCVUcKLSAgICBp
bmxpbmUgdm9pZCBVU3RyaW5nOjpSZXA6OmNoZWNrQ29uc2lzdGVuY3koKSBjb25zdAotICAgIHsK
LSAgICB9Ci0jZW5kaWYKLQogICAgIGlubGluZSBVU3RyaW5nOjpVU3RyaW5nKCkKICAgICAgICAg
OiBtX3JlcCgmUmVwOjpudWxsKCkpCiAgICAgewpAQCAtNTE2LDIzICsyNzIsNiBAQCBuYW1lc3Bh
Y2UgSlNDIHsKICAgICAvLyBmaXggVVN0cmluZyBzaXplcyB0byBiZSBzaXplX3QgaW5zdGVhZCBv
ZiBpbnQKICAgICBzdGF0aWMgY29uc3QgaW50IG1pblNoYXJlU2l6ZSA9IEhlYXA6Om1pbkV4dHJh
Q29zdCAvIHNpemVvZihVQ2hhcik7CiAKLSAgICBpbmxpbmUgc2l6ZV90IFVTdHJpbmc6OmNvc3Qo
KSBjb25zdAotICAgIHsKLSAgICAgICAgQmFzZVN0cmluZyogYmFzZSA9IG1fcmVwLT5iYXNlU3Ry
aW5nKCk7Ci0gICAgICAgIHNpemVfdCBjYXBhY2l0eSA9IChiYXNlLT5jYXBhY2l0eSArIGJhc2Ut
PnByZUNhcGFjaXR5KSAqIHNpemVvZihVQ2hhcik7Ci0gICAgICAgIHNpemVfdCByZXBvcnRlZENv
c3QgPSBiYXNlLT5yZXBvcnRlZENvc3Q7Ci0gICAgICAgIEFTU0VSVChjYXBhY2l0eSA+PSByZXBv
cnRlZENvc3QpOwotCi0gICAgICAgIHNpemVfdCBjYXBhY2l0eURlbHRhID0gY2FwYWNpdHkgLSBy
ZXBvcnRlZENvc3Q7Ci0KLSAgICAgICAgaWYgKGNhcGFjaXR5RGVsdGEgPCBzdGF0aWNfY2FzdDxz
aXplX3Q+KG1pblNoYXJlU2l6ZSkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBi
YXNlLT5yZXBvcnRlZENvc3QgPSBjYXBhY2l0eTsKLQotICAgICAgICByZXR1cm4gY2FwYWNpdHlE
ZWx0YTsKLSAgICB9Ci0KICAgICBzdHJ1Y3QgSWRlbnRpZmllclJlcEhhc2ggOiBQdHJIYXNoPFJl
ZlB0cjxKU0M6OlVTdHJpbmc6OlJlcD4gPiB7CiAgICAgICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNo
KGNvbnN0IFJlZlB0cjxKU0M6OlVTdHJpbmc6OlJlcD4mIGtleSkgeyByZXR1cm4ga2V5LT5jb21w
dXRlZEhhc2goKTsgfQogICAgICAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChKU0M6OlVTdHJpbmc6
OlJlcCoga2V5KSB7IHJldHVybiBrZXktPmNvbXB1dGVkSGFzaCgpOyB9CkBAIC02MTgsNyArMzU3
LDggQEAgbmFtZXNwYWNlIEpTQyB7CiAKICAgICAgICAgVUNoYXIqIGJ1ZmZlcjsKICAgICAgICAg
dW5zaWduZWQgbGVuZ3RoID0gYWRhcHRlcjEubGVuZ3RoKCkgKyBhZGFwdGVyMi5sZW5ndGgoKTsK
LSAgICAgICAgaWYgKCF0cnlGYXN0TWFsbG9jKGxlbmd0aCAqIHNpemVvZihVQ2hhcikpLmdldFZh
bHVlKGJ1ZmZlcikpCisgICAgICAgIFVTdHJpbmcgcmVzdWx0U3RyaW5nID0gVVN0cmluZzo6Y3Jl
YXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGJ1ZmZlcik7CisgICAgICAgIGlmICghYnVmZmVyKQog
ICAgICAgICAgICAgcmV0dXJuIFVTdHJpbmcoKTsKIAogICAgICAgICBVQ2hhciogcmVzdWx0ID0g
YnVmZmVyOwpAQCAtNjI2LDcgKzM2Niw3IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICByZXN1
bHQgKz0gYWRhcHRlcjEubGVuZ3RoKCk7CiAgICAgICAgIGFkYXB0ZXIyLndyaXRlVG8ocmVzdWx0
KTsKIAotICAgICAgICByZXR1cm4gVVN0cmluZzo6Y3JlYXRlTm9uQ29weWluZyhidWZmZXIsIGxl
bmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHRTdHJpbmc7CiAgICAgfQogCiAgICAgdGVtcGxh
dGU8dHlwZW5hbWUgU3RyaW5nVHlwZTEsIHR5cGVuYW1lIFN0cmluZ1R5cGUyLCB0eXBlbmFtZSBT
dHJpbmdUeXBlMz4KQEAgLTYzOCw3ICszNzgsOCBAQCBuYW1lc3BhY2UgSlNDIHsKIAogICAgICAg
ICBVQ2hhciogYnVmZmVyOwogICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSBhZGFwdGVyMS5sZW5n
dGgoKSArIGFkYXB0ZXIyLmxlbmd0aCgpICsgYWRhcHRlcjMubGVuZ3RoKCk7Ci0gICAgICAgIGlm
ICghdHJ5RmFzdE1hbGxvYyhsZW5ndGggKiBzaXplb2YoVUNoYXIpKS5nZXRWYWx1ZShidWZmZXIp
KQorICAgICAgICBVU3RyaW5nIHJlc3VsdFN0cmluZyA9IFVTdHJpbmc6OmNyZWF0ZVVuaW5pdGlh
bGl6ZWQobGVuZ3RoLCBidWZmZXIpOworICAgICAgICBpZiAoIWJ1ZmZlcikKICAgICAgICAgICAg
IHJldHVybiBVU3RyaW5nKCk7CiAKICAgICAgICAgVUNoYXIqIHJlc3VsdCA9IGJ1ZmZlcjsKQEAg
LTY0OCw3ICszODksNyBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgcmVzdWx0ICs9IGFkYXB0
ZXIyLmxlbmd0aCgpOwogICAgICAgICBhZGFwdGVyMy53cml0ZVRvKHJlc3VsdCk7CiAKLSAgICAg
ICAgcmV0dXJuIFVTdHJpbmc6OmNyZWF0ZU5vbkNvcHlpbmcoYnVmZmVyLCBsZW5ndGgpOworICAg
ICAgICByZXR1cm4gcmVzdWx0U3RyaW5nOwogICAgIH0KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1l
IFN0cmluZ1R5cGUxLCB0eXBlbmFtZSBTdHJpbmdUeXBlMiwgdHlwZW5hbWUgU3RyaW5nVHlwZTMs
IHR5cGVuYW1lIFN0cmluZ1R5cGU0PgpAQCAtNjYxLDcgKzQwMiw4IEBAIG5hbWVzcGFjZSBKU0Mg
ewogCiAgICAgICAgIFVDaGFyKiBidWZmZXI7CiAgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9IGFk
YXB0ZXIxLmxlbmd0aCgpICsgYWRhcHRlcjIubGVuZ3RoKCkgKyBhZGFwdGVyMy5sZW5ndGgoKSAr
IGFkYXB0ZXI0Lmxlbmd0aCgpOwotICAgICAgICBpZiAoIXRyeUZhc3RNYWxsb2MobGVuZ3RoICog
c2l6ZW9mKFVDaGFyKSkuZ2V0VmFsdWUoYnVmZmVyKSkKKyAgICAgICAgVVN0cmluZyByZXN1bHRT
dHJpbmcgPSBVU3RyaW5nOjpjcmVhdGVVbmluaXRpYWxpemVkKGxlbmd0aCwgYnVmZmVyKTsKKyAg
ICAgICAgaWYgKCFidWZmZXIpCiAgICAgICAgICAgICByZXR1cm4gVVN0cmluZygpOwogCiAgICAg
ICAgIFVDaGFyKiByZXN1bHQgPSBidWZmZXI7CkBAIC02NzMsNyArNDE1LDcgQEAgbmFtZXNwYWNl
IEpTQyB7CiAgICAgICAgIHJlc3VsdCArPSBhZGFwdGVyMy5sZW5ndGgoKTsKICAgICAgICAgYWRh
cHRlcjQud3JpdGVUbyhyZXN1bHQpOwogCi0gICAgICAgIHJldHVybiBVU3RyaW5nOjpjcmVhdGVO
b25Db3B5aW5nKGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdFN0cmluZzsK
ICAgICB9CiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpbmdUeXBlMSwgdHlwZW5hbWUgU3Ry
aW5nVHlwZTIsIHR5cGVuYW1lIFN0cmluZ1R5cGUzLCB0eXBlbmFtZSBTdHJpbmdUeXBlNCwgdHlw
ZW5hbWUgU3RyaW5nVHlwZTU+CkBAIC02ODcsNyArNDI5LDggQEAgbmFtZXNwYWNlIEpTQyB7CiAK
ICAgICAgICAgVUNoYXIqIGJ1ZmZlcjsKICAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gYWRhcHRl
cjEubGVuZ3RoKCkgKyBhZGFwdGVyMi5sZW5ndGgoKSArIGFkYXB0ZXIzLmxlbmd0aCgpICsgYWRh
cHRlcjQubGVuZ3RoKCkgKyBhZGFwdGVyNS5sZW5ndGgoKTsKLSAgICAgICAgaWYgKCF0cnlGYXN0
TWFsbG9jKGxlbmd0aCAqIHNpemVvZihVQ2hhcikpLmdldFZhbHVlKGJ1ZmZlcikpCisgICAgICAg
IFVTdHJpbmcgcmVzdWx0U3RyaW5nID0gVVN0cmluZzo6Y3JlYXRlVW5pbml0aWFsaXplZChsZW5n
dGgsIGJ1ZmZlcik7CisgICAgICAgIGlmICghYnVmZmVyKQogICAgICAgICAgICAgcmV0dXJuIFVT
dHJpbmcoKTsKIAogICAgICAgICBVQ2hhciogcmVzdWx0ID0gYnVmZmVyOwpAQCAtNzAxLDcgKzQ0
NCw3IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICByZXN1bHQgKz0gYWRhcHRlcjQubGVuZ3Ro
KCk7CiAgICAgICAgIGFkYXB0ZXI1LndyaXRlVG8ocmVzdWx0KTsKIAotICAgICAgICByZXR1cm4g
VVN0cmluZzo6Y3JlYXRlTm9uQ29weWluZyhidWZmZXIsIGxlbmd0aCk7CisgICAgICAgIHJldHVy
biByZXN1bHRTdHJpbmc7CiAgICAgfQogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgU3RyaW5nVHlw
ZTEsIHR5cGVuYW1lIFN0cmluZ1R5cGUyLCB0eXBlbmFtZSBTdHJpbmdUeXBlMywgdHlwZW5hbWUg
U3RyaW5nVHlwZTQsIHR5cGVuYW1lIFN0cmluZ1R5cGU1LCB0eXBlbmFtZSBTdHJpbmdUeXBlNj4K
QEAgLTcxNiw3ICs0NTksOCBAQCBuYW1lc3BhY2UgSlNDIHsKIAogICAgICAgICBVQ2hhciogYnVm
ZmVyOwogICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSBhZGFwdGVyMS5sZW5ndGgoKSArIGFkYXB0
ZXIyLmxlbmd0aCgpICsgYWRhcHRlcjMubGVuZ3RoKCkgKyBhZGFwdGVyNC5sZW5ndGgoKSArIGFk
YXB0ZXI1Lmxlbmd0aCgpICsgYWRhcHRlcjYubGVuZ3RoKCk7Ci0gICAgICAgIGlmICghdHJ5RmFz
dE1hbGxvYyhsZW5ndGggKiBzaXplb2YoVUNoYXIpKS5nZXRWYWx1ZShidWZmZXIpKQorICAgICAg
ICBVU3RyaW5nIHJlc3VsdFN0cmluZyA9IFVTdHJpbmc6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVu
Z3RoLCBidWZmZXIpOworICAgICAgICBpZiAoIWJ1ZmZlcikKICAgICAgICAgICAgIHJldHVybiBV
U3RyaW5nKCk7CiAKICAgICAgICAgVUNoYXIqIHJlc3VsdCA9IGJ1ZmZlcjsKQEAgLTczMiw3ICs0
NzYsNyBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgcmVzdWx0ICs9IGFkYXB0ZXI1Lmxlbmd0
aCgpOwogICAgICAgICBhZGFwdGVyNi53cml0ZVRvKHJlc3VsdCk7CiAKLSAgICAgICAgcmV0dXJu
IFVTdHJpbmc6OmNyZWF0ZU5vbkNvcHlpbmcoYnVmZmVyLCBsZW5ndGgpOworICAgICAgICByZXR1
cm4gcmVzdWx0U3RyaW5nOwogICAgIH0KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmluZ1R5
cGUxLCB0eXBlbmFtZSBTdHJpbmdUeXBlMiwgdHlwZW5hbWUgU3RyaW5nVHlwZTMsIHR5cGVuYW1l
IFN0cmluZ1R5cGU0LCB0eXBlbmFtZSBTdHJpbmdUeXBlNSwgdHlwZW5hbWUgU3RyaW5nVHlwZTYs
IHR5cGVuYW1lIFN0cmluZ1R5cGU3PgpAQCAtNzQ4LDcgKzQ5Miw4IEBAIG5hbWVzcGFjZSBKU0Mg
ewogCiAgICAgICAgIFVDaGFyKiBidWZmZXI7CiAgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9IGFk
YXB0ZXIxLmxlbmd0aCgpICsgYWRhcHRlcjIubGVuZ3RoKCkgKyBhZGFwdGVyMy5sZW5ndGgoKSAr
IGFkYXB0ZXI0Lmxlbmd0aCgpICsgYWRhcHRlcjUubGVuZ3RoKCkgKyBhZGFwdGVyNi5sZW5ndGgo
KSArIGFkYXB0ZXI3Lmxlbmd0aCgpOwotICAgICAgICBpZiAoIXRyeUZhc3RNYWxsb2MobGVuZ3Ro
ICogc2l6ZW9mKFVDaGFyKSkuZ2V0VmFsdWUoYnVmZmVyKSkKKyAgICAgICAgVVN0cmluZyByZXN1
bHRTdHJpbmcgPSBVU3RyaW5nOjpjcmVhdGVVbmluaXRpYWxpemVkKGxlbmd0aCwgYnVmZmVyKTsK
KyAgICAgICAgaWYgKCFidWZmZXIpCiAgICAgICAgICAgICByZXR1cm4gVVN0cmluZygpOwogCiAg
ICAgICAgIFVDaGFyKiByZXN1bHQgPSBidWZmZXI7CkBAIC03NjYsNyArNTExLDcgQEAgbmFtZXNw
YWNlIEpTQyB7CiAgICAgICAgIHJlc3VsdCArPSBhZGFwdGVyNi5sZW5ndGgoKTsKICAgICAgICAg
YWRhcHRlcjcud3JpdGVUbyhyZXN1bHQpOwogCi0gICAgICAgIHJldHVybiBVU3RyaW5nOjpjcmVh
dGVOb25Db3B5aW5nKGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdFN0cmlu
ZzsKICAgICB9CiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpbmdUeXBlMSwgdHlwZW5hbWUg
U3RyaW5nVHlwZTIsIHR5cGVuYW1lIFN0cmluZ1R5cGUzLCB0eXBlbmFtZSBTdHJpbmdUeXBlNCwg
dHlwZW5hbWUgU3RyaW5nVHlwZTUsIHR5cGVuYW1lIFN0cmluZ1R5cGU2LCB0eXBlbmFtZSBTdHJp
bmdUeXBlNywgdHlwZW5hbWUgU3RyaW5nVHlwZTg+CkBAIC03ODMsNyArNTI4LDggQEAgbmFtZXNw
YWNlIEpTQyB7CiAKICAgICAgICAgVUNoYXIqIGJ1ZmZlcjsKICAgICAgICAgdW5zaWduZWQgbGVu
Z3RoID0gYWRhcHRlcjEubGVuZ3RoKCkgKyBhZGFwdGVyMi5sZW5ndGgoKSArIGFkYXB0ZXIzLmxl
bmd0aCgpICsgYWRhcHRlcjQubGVuZ3RoKCkgKyBhZGFwdGVyNS5sZW5ndGgoKSArIGFkYXB0ZXI2
Lmxlbmd0aCgpICsgYWRhcHRlcjcubGVuZ3RoKCkgKyBhZGFwdGVyOC5sZW5ndGgoKTsKLSAgICAg
ICAgaWYgKCF0cnlGYXN0TWFsbG9jKGxlbmd0aCAqIHNpemVvZihVQ2hhcikpLmdldFZhbHVlKGJ1
ZmZlcikpCisgICAgICAgIFVTdHJpbmcgcmVzdWx0U3RyaW5nID0gVVN0cmluZzo6Y3JlYXRlVW5p
bml0aWFsaXplZChsZW5ndGgsIGJ1ZmZlcik7CisgICAgICAgIGlmICghYnVmZmVyKQogICAgICAg
ICAgICAgcmV0dXJuIFVTdHJpbmcoKTsKIAogICAgICAgICBVQ2hhciogcmVzdWx0ID0gYnVmZmVy
OwpAQCAtODAzLDcgKzU0OSw3IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICByZXN1bHQgKz0g
YWRhcHRlcjcubGVuZ3RoKCk7CiAgICAgICAgIGFkYXB0ZXI4LndyaXRlVG8ocmVzdWx0KTsKIAot
ICAgICAgICByZXR1cm4gVVN0cmluZzo6Y3JlYXRlTm9uQ29weWluZyhidWZmZXIsIGxlbmd0aCk7
CisgICAgICAgIHJldHVybiByZXN1bHRTdHJpbmc7CiAgICAgfQogCiB9IC8vIG5hbWVzcGFjZSBK
U0MKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvVVN0cmluZ0ltcGwuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvVVN0cmluZ0ltcGwuY3BwCShyZXZpc2lvbiAw
KQorKysgSmF2YVNjcmlwdENvcmUvcnVudGltZS9VU3RyaW5nSW1wbC5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5OS0yMDAwIEhhcnJp
IFBvcnRlbiAocG9ydGVuQGtkZS5vcmcpCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAy
MDA2LCAyMDA3LCAyMDA4LCAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
ICBDb3B5cmlnaHQgKEMpIDIwMDcgQ2FtZXJvbiBad2FyaWNoIChjd3p3YXJpY2hAdXdhdGVybG9v
LmNhKQorICogIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlVTdHJp
bmdJbXBsLmgiCisjaW5jbHVkZSAiSWRlbnRpZmllci5oIgorI2luY2x1ZGUgIlVTdHJpbmcuaCIK
KyNpbmNsdWRlICJVVEY4LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBXVEY7Cit1c2luZyBuYW1lc3Bh
Y2UgV1RGOjpVbmljb2RlOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIEpTQyB7
CisgCitDT01QSUxFX0FTU0VSVChzaXplb2YoVUNoYXIpID09IDIsIHVjaGFyX2lzXzJfYnl0ZXMp
OworCitTaGFyZWRVQ2hhciogVVN0cmluZ0ltcGw6OmJhc2VTaGFyZWRCdWZmZXIoKQoreworICAg
IEFTU0VSVCgoYnVmZmVyT3duZXJzaGlwKCkgPT0gQnVmZmVyU2hhcmVkKSB8fCAoKGJ1ZmZlck93
bmVyc2hpcCgpID09IEJ1ZmZlck93bmVkKSAmJiAhbV9kYXRhQnVmZmVyLmFzUHRyPHZvaWQqPigp
KSk7CisKKyAgICBpZiAoYnVmZmVyT3duZXJzaGlwKCkgIT0gQnVmZmVyU2hhcmVkKQorICAgICAg
ICBtX2RhdGFCdWZmZXIgPSBVbnR5cGVkUHRyQW5kQml0ZmllbGQoU2hhcmVkVUNoYXI6OmNyZWF0
ZShuZXcgT3duRmFzdE1hbGxvY1B0cjxVQ2hhcj4obV9kYXRhKSkucmVsZWFzZVJlZigpLCBCdWZm
ZXJTaGFyZWQpOworCisgICAgcmV0dXJuIG1fZGF0YUJ1ZmZlci5hc1B0cjxTaGFyZWRVQ2hhcio+
KCk7Cit9CisKK1NoYXJlZFVDaGFyKiBVU3RyaW5nSW1wbDo6c2hhcmVkQnVmZmVyKCkKK3sKKyAg
ICBpZiAobV9sZW5ndGggPCBzX21pbkxlbmd0aFRvU2hhcmUpCisgICAgICAgIHJldHVybiAwOwor
ICAgIEFTU0VSVCghaXNTdGF0aWMoKSk7CisKKyAgICBVU3RyaW5nSW1wbCogb3duZXIgPSBidWZm
ZXJPd25lclN0cmluZygpOworICAgIGlmIChvd25lci0+YnVmZmVyT3duZXJzaGlwKCkgPT0gQnVm
ZmVySW50ZXJuYWwpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIG93bmVyLT5iYXNl
U2hhcmVkQnVmZmVyKCk7Cit9CisKK3ZvaWQgVVN0cmluZ0ltcGw6OmRlc3Ryb3koKQoreworICAg
IEFTU0VSVCghaXNTdGF0aWMoKSk7CisgICAgY2hlY2tDb25zaXN0ZW5jeSgpOworCisgICAgaWYg
KGlkZW50aWZpZXJUYWJsZSgpKQorICAgICAgICBJZGVudGlmaWVyOjpyZW1vdmUodGhpcyk7CisK
KyAgICBpZiAoYnVmZmVyT3duZXJzaGlwKCkgIT0gQnVmZmVySW50ZXJuYWwpIHsKKyAgICAgICAg
aWYgKGJ1ZmZlck93bmVyc2hpcCgpID09IEJ1ZmZlck93bmVkKQorICAgICAgICAgICAgZmFzdEZy
ZWUobV9kYXRhKTsKKyAgICAgICAgZWxzZSBpZiAoYnVmZmVyT3duZXJzaGlwKCkgPT0gQnVmZmVy
U3Vic3RyaW5nKQorICAgICAgICAgICAgbV9kYXRhQnVmZmVyLmFzUHRyPFVTdHJpbmdJbXBsKj4o
KS0+ZGVyZWYoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBU1NFUlQoYnVmZmVyT3du
ZXJzaGlwKCkgPT0gQnVmZmVyU2hhcmVkKTsKKyAgICAgICAgICAgIG1fZGF0YUJ1ZmZlci5hc1B0
cjxTaGFyZWRVQ2hhcio+KCktPmRlcmVmKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxl
dGUgdGhpczsKK30KKworLy8gR29sZGVuIHJhdGlvIC0gYXJiaXRyYXJ5IHN0YXJ0IHZhbHVlIHRv
IGF2b2lkIG1hcHBpbmcgYWxsIDAncyB0byBhbGwgMCdzCisvLyBvciBhbnl0aGluZyBsaWtlIHRo
YXQuCitjb25zdCB1bnNpZ25lZCBQSEkgPSAweDllMzc3OWI5VTsKKworLy8gUGF1bCBIc2llaCdz
IFN1cGVyRmFzdEhhc2gKKy8vIGh0dHA6Ly93d3cuYXppbGxpb25tb25rZXlzLmNvbS9xZWQvaGFz
aC5odG1sCit1bnNpZ25lZCBVU3RyaW5nSW1wbDo6Y29tcHV0ZUhhc2goY29uc3QgVUNoYXIqIHMs
IGludCBsZW4pCit7CisgICAgdW5zaWduZWQgbCA9IGxlbjsKKyAgICB1aW50MzJfdCBoYXNoID0g
UEhJOworICAgIHVpbnQzMl90IHRtcDsKKworICAgIGludCByZW0gPSBsICYgMTsKKyAgICBsID4+
PSAxOworCisgICAgLy8gTWFpbiBsb29wCisgICAgZm9yICg7IGwgPiAwOyBsLS0pIHsKKyAgICAg
ICAgaGFzaCArPSBzWzBdOworICAgICAgICB0bXAgPSAoc1sxXSA8PCAxMSkgXiBoYXNoOworICAg
ICAgICBoYXNoID0gKGhhc2ggPDwgMTYpIF4gdG1wOworICAgICAgICBzICs9IDI7CisgICAgICAg
IGhhc2ggKz0gaGFzaCA+PiAxMTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgZW5kIGNhc2UKKyAg
ICBpZiAocmVtKSB7CisgICAgICAgIGhhc2ggKz0gc1swXTsKKyAgICAgICAgaGFzaCBePSBoYXNo
IDw8IDExOworICAgICAgICBoYXNoICs9IGhhc2ggPj4gMTc7CisgICAgfQorCisgICAgLy8gRm9y
Y2UgImF2YWxhbmNoaW5nIiBvZiBmaW5hbCAxMjcgYml0cworICAgIGhhc2ggXj0gaGFzaCA8PCAz
OworICAgIGhhc2ggKz0gaGFzaCA+PiA1OworICAgIGhhc2ggXj0gaGFzaCA8PCAyOworICAgIGhh
c2ggKz0gaGFzaCA+PiAxNTsKKyAgICBoYXNoIF49IGhhc2ggPDwgMTA7CisKKyAgICAvLyB0aGlz
IGF2b2lkcyBldmVyIHJldHVybmluZyBhIGhhc2ggY29kZSBvZiAwLCBzaW5jZSB0aGF0IGlzIHVz
ZWQgdG8KKyAgICAvLyBzaWduYWwgImhhc2ggbm90IGNvbXB1dGVkIHlldCIsIHVzaW5nIGEgdmFs
dWUgdGhhdCBpcyBsaWtlbHkgdG8gYmUKKyAgICAvLyBlZmZlY3RpdmVseSB0aGUgc2FtZSBhcyAw
IHdoZW4gdGhlIGxvdyBiaXRzIGFyZSBtYXNrZWQKKyAgICBpZiAoaGFzaCA9PSAwKQorICAgICAg
ICBoYXNoID0gMHg4MDAwMDAwMDsKKworICAgIHJldHVybiBoYXNoOworfQorCisvLyBQYXVsIEhz
aWVoJ3MgU3VwZXJGYXN0SGFzaAorLy8gaHR0cDovL3d3dy5hemlsbGlvbm1vbmtleXMuY29tL3Fl
ZC9oYXNoLmh0bWwKK3Vuc2lnbmVkIFVTdHJpbmdJbXBsOjpjb21wdXRlSGFzaChjb25zdCBjaGFy
KiBzLCBpbnQgbCkKK3sKKyAgICAvLyBUaGlzIGhhc2ggaXMgZGVzaWduZWQgdG8gd29yayBvbiAx
Ni1iaXQgY2h1bmtzIGF0IGEgdGltZS4gQnV0IHNpbmNlIHRoZSBub3JtYWwgY2FzZQorICAgIC8v
IChhYm92ZSkgaXMgdG8gaGFzaCBVVEYtMTYgY2hhcmFjdGVycywgd2UganVzdCB0cmVhdCB0aGUg
OC1iaXQgY2hhcnMgYXMgaWYgdGhleQorICAgIC8vIHdlcmUgMTYtYml0IGNodW5rcywgd2hpY2gg
c2hvdWxkIGdpdmUgbWF0Y2hpbmcgcmVzdWx0cworCisgICAgdWludDMyX3QgaGFzaCA9IFBISTsK
KyAgICB1aW50MzJfdCB0bXA7CisKKyAgICBzaXplX3QgcmVtID0gbCAmIDE7CisgICAgbCA+Pj0g
MTsKKworICAgIC8vIE1haW4gbG9vcAorICAgIGZvciAoOyBsID4gMDsgbC0tKSB7CisgICAgICAg
IGhhc2ggKz0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc1swXSk7CisgICAgICAgIHRtcCA9
IChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihzWzFdKSA8PCAxMSkgXiBoYXNoOworICAgICAg
ICBoYXNoID0gKGhhc2ggPDwgMTYpIF4gdG1wOworICAgICAgICBzICs9IDI7CisgICAgICAgIGhh
c2ggKz0gaGFzaCA+PiAxMTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgZW5kIGNhc2UKKyAgICBp
ZiAocmVtKSB7CisgICAgICAgIGhhc2ggKz0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc1sw
XSk7CisgICAgICAgIGhhc2ggXj0gaGFzaCA8PCAxMTsKKyAgICAgICAgaGFzaCArPSBoYXNoID4+
IDE3OworICAgIH0KKworICAgIC8vIEZvcmNlICJhdmFsYW5jaGluZyIgb2YgZmluYWwgMTI3IGJp
dHMKKyAgICBoYXNoIF49IGhhc2ggPDwgMzsKKyAgICBoYXNoICs9IGhhc2ggPj4gNTsKKyAgICBo
YXNoIF49IGhhc2ggPDwgMjsKKyAgICBoYXNoICs9IGhhc2ggPj4gMTU7CisgICAgaGFzaCBePSBo
YXNoIDw8IDEwOworCisgICAgLy8gdGhpcyBhdm9pZHMgZXZlciByZXR1cm5pbmcgYSBoYXNoIGNv
ZGUgb2YgMCwgc2luY2UgdGhhdCBpcyB1c2VkIHRvCisgICAgLy8gc2lnbmFsICJoYXNoIG5vdCBj
b21wdXRlZCB5ZXQiLCB1c2luZyBhIHZhbHVlIHRoYXQgaXMgbGlrZWx5IHRvIGJlCisgICAgLy8g
ZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgMCB3aGVuIHRoZSBsb3cgYml0cyBhcmUgbWFza2VkCisg
ICAgaWYgKGhhc2ggPT0gMCkKKyAgICAgICAgaGFzaCA9IDB4ODAwMDAwMDA7CisKKyAgICByZXR1
cm4gaGFzaDsKK30KKworfQpJbmRleDogSmF2YVNjcmlwdENvcmUvcnVudGltZS9VU3RyaW5nSW1w
bC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvVVN0cmluZ0ltcGwuaAko
cmV2aXNpb24gMCkKKysrIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvVVN0cmluZ0ltcGwuaAkocmV2
aXNpb24gMCkKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LTIw
MDAgSGFycmkgUG9ydGVuIChwb3J0ZW5Aa2RlLm9yZykKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQs
IDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBVU3RyaW5nSW1wbF9oCisjZGVmaW5lIFVTdHJp
bmdJbXBsX2gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHd0Zi9Dcm9zc1RocmVh
ZFJlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1ZGUgPHd0
Zi9Pd25GYXN0TWFsbG9jUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bvc3NpYmx5TnVsbC5oPgorI2lu
Y2x1ZGUgPHd0Zi91bmljb2RlL1VuaWNvZGUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNs
dWRlIDxsaW1pdHM+CisKK25hbWVzcGFjZSBKU0MgeworCitjbGFzcyBJZGVudGlmaWVyVGFibGU7
CisgIAordHlwZWRlZiBDcm9zc1RocmVhZFJlZkNvdW50ZWQ8T3duRmFzdE1hbGxvY1B0cjxVQ2hh
cj4gPiBTaGFyZWRVQ2hhcjsKKworY2xhc3MgVW50eXBlZFB0ckFuZEJpdGZpZWxkIHsKK3B1Ymxp
YzoKKyAgICBVbnR5cGVkUHRyQW5kQml0ZmllbGQoKSB7fQorCisgICAgVW50eXBlZFB0ckFuZEJp
dGZpZWxkKHZvaWQqIHB0clZhbHVlLCB1aW50cHRyX3QgYml0VmFsdWUpCisgICAgICAgIDogbV92
YWx1ZShyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocHRyVmFsdWUpIHwgYml0VmFsdWUpCisg
ICAgeworICAgICAgICBBU1NFUlQocHRyVmFsdWUgPT0gYXNQdHI8dm9pZCo+KCkpOworICAgICAg
ICBBU1NFUlQoKCp0aGlzICYgfnNfYWxpZ25tZW50TWFzaykgPT0gYml0VmFsdWUpOworICAgIH0K
KworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVCBhc1B0cigpIGNvbnN0IHsgcmV0dXJu
IHJlaW50ZXJwcmV0X2Nhc3Q8VD4obV92YWx1ZSAmIHNfYWxpZ25tZW50TWFzayk7IH0KKworICAg
IFVudHlwZWRQdHJBbmRCaXRmaWVsZCYgb3BlcmF0b3ImPSh1aW50cHRyX3QgYml0cykKKyAgICB7
CisgICAgICAgIG1fdmFsdWUgJj0gYml0cyB8IHNfYWxpZ25tZW50TWFzazsKKyAgICAgICAgcmV0
dXJuICp0aGlzOworICAgIH0KKworICAgIFVudHlwZWRQdHJBbmRCaXRmaWVsZCYgb3BlcmF0b3J8
PSh1aW50cHRyX3QgYml0cykKKyAgICB7CisgICAgICAgIG1fdmFsdWUgfD0gYml0cyAmIH5zX2Fs
aWdubWVudE1hc2s7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB1aW50cHRy
X3Qgb3BlcmF0b3ImKHVpbnRwdHJfdCBtYXNrKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IG1fdmFsdWUgJiBtYXNrICYgfnNfYWxpZ25tZW50TWFzazsKKyAgICB9CisKK3ByaXZhdGU6Cisg
ICAgc3RhdGljIGNvbnN0IHVpbnRwdHJfdCBzX2FsaWdubWVudE1hc2sgPSB+MHg3OworICAgIHVp
bnRwdHJfdCBtX3ZhbHVlOworfTsKKworY2xhc3MgVVN0cmluZ0ltcGwgOiBOb25jb3B5YWJsZSB7
CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8VVN0cmluZ0ltcGw+IGNyZWF0ZShVQ2hh
ciogYnVmZmVyLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5l
dyBVU3RyaW5nSW1wbChidWZmZXIsIGxlbmd0aCwgQnVmZmVyT3duZWQpKTsKKyAgICB9CisKKyAg
ICBzdGF0aWMgUGFzc1JlZlB0cjxVU3RyaW5nSW1wbD4gY3JlYXRlQ29weWluZyhjb25zdCBVQ2hh
ciogYnVmZmVyLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgVUNoYXIqIG5ld0J1ZmZlcjsK
KyAgICAgICAgaWYgKCFVU3RyaW5nSW1wbDo6YWxsb2NDaGFycyhsZW5ndGgpLmdldFZhbHVlKG5l
d0J1ZmZlcikpCisgICAgICAgICAgICByZXR1cm4gJm51bGwoKTsKKyAgICAgICAgY29weUNoYXJz
KG5ld0J1ZmZlciwgYnVmZmVyLCBsZW5ndGgpOworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3
IFVTdHJpbmdJbXBsKG5ld0J1ZmZlciwgbGVuZ3RoLCBCdWZmZXJPd25lZCkpOworICAgIH0KKwor
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPFVTdHJpbmdJbXBsPiBjcmVhdGUoUGFzc1JlZlB0cjxVU3Ry
aW5nSW1wbD4gcmVwLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgQVNT
RVJUKHJlcCk7CisgICAgICAgIHJlcC0+Y2hlY2tDb25zaXN0ZW5jeSgpOworICAgICAgICByZXR1
cm4gYWRvcHRSZWYobmV3IFVTdHJpbmdJbXBsKHJlcC0+bV9kYXRhICsgb2Zmc2V0LCBsZW5ndGgs
IHJlcC0+YnVmZmVyT3duZXJTdHJpbmcoKSkpOworICAgIH0KKworICAgIHN0YXRpYyBQYXNzUmVm
UHRyPFVTdHJpbmdJbXBsPiBjcmVhdGUoUGFzc1JlZlB0cjxTaGFyZWRVQ2hhcj4gc2hhcmVkQnVm
ZmVyLCBVQ2hhciogYnVmZmVyLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFk
b3B0UmVmKG5ldyBVU3RyaW5nSW1wbChidWZmZXIsIGxlbmd0aCwgc2hhcmVkQnVmZmVyKSk7Cisg
ICAgfQorCisgICAgc3RhdGljIFBhc3NSZWZQdHI8VVN0cmluZ0ltcGw+IGNyZWF0ZVVuaW5pdGlh
bGl6ZWQodW5zaWduZWQgbGVuZ3RoLCBVQ2hhciomIG91dHB1dCkKKyAgICB7CisgICAgICAgIEFT
U0VSVChsZW5ndGgpOworICAgICAgICBpZiAobGVuZ3RoID4gKChzdGQ6Om51bWVyaWNfbGltaXRz
PHNpemVfdD46Om1heCgpIC0gc2l6ZW9mKFVTdHJpbmdJbXBsKSkgLyBzaXplb2YoVUNoYXIpKSkK
KyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIFVTdHJpbmdJbXBsKiByZXN1bHRJbXBs
OworICAgICAgICBpZiAoIXRyeUZhc3RNYWxsb2Moc2l6ZW9mKFVDaGFyKSAqIGxlbmd0aCArIHNp
emVvZihVU3RyaW5nSW1wbCkpLmdldFZhbHVlKHJlc3VsdEltcGwpKQorICAgICAgICAgICAgcmV0
dXJuIDA7CisKKyAgICAgICAgb3V0cHV0ID0gcmVpbnRlcnByZXRfY2FzdDxVQ2hhcio+KHJlc3Vs
dEltcGwgKyAxKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyhyZXN1bHRJbXBsKSBVU3Ry
aW5nSW1wbChvdXRwdXQsIGxlbmd0aCwgQnVmZmVySW50ZXJuYWwpKTsKKyAgICB9CisKKyAgICBT
aGFyZWRVQ2hhciogc2hhcmVkQnVmZmVyKCk7CisgICAgVUNoYXIqIGRhdGEoKSBjb25zdCB7IHJl
dHVybiBtX2RhdGE7IH0KKyAgICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbGVuZ3RoOyB9
CisgICAgc2l6ZV90IGNvc3QoKQorICAgIHsKKyAgICAgICAgVVN0cmluZ0ltcGwqIGJhc2UgPSBi
dWZmZXJPd25lclN0cmluZygpOworICAgICAgICBpZiAobV9kYXRhQnVmZmVyICYgc19yZXBvcnRl
ZENvc3RCaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbV9kYXRhQnVmZmVyIHw9
IHNfcmVwb3J0ZWRDb3N0Qml0OworICAgICAgICByZXR1cm4gYmFzZS0+bV9sZW5ndGg7CisgICAg
fQorICAgIHVuc2lnbmVkIGhhc2goKSBjb25zdCB7IGlmIChtX2hhc2ggPT0gMCkgbV9oYXNoID0g
Y29tcHV0ZUhhc2goZGF0YSgpLCBtX2xlbmd0aCk7IHJldHVybiBtX2hhc2g7IH0KKyAgICB1bnNp
Z25lZCBjb21wdXRlZEhhc2goKSBjb25zdCB7IEFTU0VSVChtX2hhc2gpOyByZXR1cm4gbV9oYXNo
OyB9IC8vIGZhc3QgcGF0aCBmb3IgSWRlbnRpZmllcnMKKyAgICB2b2lkIHNldEhhc2godW5zaWdu
ZWQgaGFzaCkgeyBBU1NFUlQoaGFzaCA9PSBjb21wdXRlSGFzaChkYXRhKCksIG1fbGVuZ3RoKSk7
IG1faGFzaCA9IGhhc2g7IH0gLy8gZmFzdCBwYXRoIGZvciBJZGVudGlmaWVycworICAgIElkZW50
aWZpZXJUYWJsZSogaWRlbnRpZmllclRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV9pZGVudGlmaWVy
VGFibGU7IH0KKyAgICB2b2lkIHNldElkZW50aWZpZXJUYWJsZShJZGVudGlmaWVyVGFibGUqIHRh
YmxlKSB7IEFTU0VSVCghaXNTdGF0aWMoKSk7IG1faWRlbnRpZmllclRhYmxlID0gdGFibGU7IH0K
KworICAgIFVTdHJpbmdJbXBsKiByZWYoKSB7IG1fcmVmQ291bnQrPTI7IHJldHVybiB0aGlzOyB9
CisgICAgQUxXQVlTX0lOTElORSB2b2lkIGRlcmVmKCkgeyBpZiAoKG1fcmVmQ291bnQtPTIpID09
IDApIGRlc3Ryb3koKTsgfQorCisgICAgc3RhdGljIFdURjo6UG9zc2libHlOdWxsPFVDaGFyKj4g
YWxsb2NDaGFycyhzaXplX3QgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGxlbmd0aCk7
CisgICAgICAgIGlmIChsZW5ndGggPiAoc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgo
KSAvIHNpemVvZihVQ2hhcikpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVy
biB0cnlGYXN0TWFsbG9jKHNpemVvZihVQ2hhcikgKiBsZW5ndGgpOworICAgIH0KKworICAgIHN0
YXRpYyB2b2lkIGNvcHlDaGFycyhVQ2hhciogZGVzdGluYXRpb24sIGNvbnN0IFVDaGFyKiBzb3Vy
Y2UsIHVuc2lnbmVkIG51bUNoYXJhY3RlcnMpCisgICAgeworICAgICAgICBpZiAobnVtQ2hhcmFj
dGVycyA8PSBzX2NvcHlDaGFyc0lubGluZUN1dE9mZikgeworICAgICAgICAgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IG51bUNoYXJhY3RlcnM7ICsraSkKKyAgICAgICAgICAgICAgICBkZXN0
aW5hdGlvbltpXSA9IHNvdXJjZVtpXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtZW1j
cHkoZGVzdGluYXRpb24sIHNvdXJjZSwgbnVtQ2hhcmFjdGVycyAqIHNpemVvZihVQ2hhcikpOwor
ICAgIH0KKworICAgIHN0YXRpYyB1bnNpZ25lZCBjb21wdXRlSGFzaChjb25zdCBVQ2hhciosIGlu
dCBsZW5ndGgpOworICAgIHN0YXRpYyB1bnNpZ25lZCBjb21wdXRlSGFzaChjb25zdCBjaGFyKiwg
aW50IGxlbmd0aCk7CisgICAgc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVIYXNoKGNvbnN0IGNoYXIq
IHMpIHsgcmV0dXJuIGNvbXB1dGVIYXNoKHMsIHN0cmxlbihzKSk7IH0KKworICAgIHN0YXRpYyBV
U3RyaW5nSW1wbCYgbnVsbCgpIHsgcmV0dXJuICpudWxsVVN0cmluZ0ltcGw7IH0KKyAgICBzdGF0
aWMgVVN0cmluZ0ltcGwmIGVtcHR5KCkgeyByZXR1cm4gKmVtcHR5VVN0cmluZ0ltcGw7IH0KKwor
I2lmZGVmIE5ERUJVRworICAgIHZvaWQgY2hlY2tDb25zaXN0ZW5jeSgpIGNvbnN0IHt9CisjZWxz
ZQorICAgIHZvaWQgY2hlY2tDb25zaXN0ZW5jeSgpIGNvbnN0CisgICAgeworICAgICAgICAvLyBU
aGVyZSBpcyBubyByZWN1cnNpb24gb2Ygc3Vic3RyaW5ncy4KKyAgICAgICAgQVNTRVJUKGJ1ZmZl
ck93bmVyU3RyaW5nKCktPmJ1ZmZlck93bmVyc2hpcCgpICE9IEJ1ZmZlclN1YnN0cmluZyk7Cisg
ICAgICAgIC8vIFN0YXRpYyBzdHJpbmdzIGNhbm5vdCBiZSBwdXQgaW4gaWRlbnRpZmllciB0YWJs
ZXMsIGJlY2F1c2UgdGhleSBhcmUgZ2xvYmFsbHkgc2hhcmVkLgorICAgICAgICBBU1NFUlQoIWlz
U3RhdGljKCkgfHwgIWlkZW50aWZpZXJUYWJsZSgpKTsKKyAgICB9CisjZW5kaWYKKworcHJpdmF0
ZToKKyAgICBlbnVtIEJ1ZmZlck93bmVyc2hpcCB7CisgICAgICAgIEJ1ZmZlckludGVybmFsID0g
MCwKKyAgICAgICAgQnVmZmVyT3duZWQgPSAxLAorICAgICAgICBCdWZmZXJTdWJzdHJpbmcgPSAy
LAorICAgICAgICBCdWZmZXJTaGFyZWQgPSAzLAorICAgIH07CisKKyAgICAvLyBGb3IgU21hbGxT
dHJpbmdTdG9yYWdlIHdoaWNoIGFsbG9jYXRlcyBhbiBhcnJheSwgYW5kIHVzZXMgYW4gaW4tcGxh
Y2UgbmV3LgorICAgIFVTdHJpbmdJbXBsKCkgeyB9CisKKyAgICAvLyBVc2VkIHRvIGNvbnN0cnVj
dCBub3JtYWwgc3RyaW5ncyB3aXRoIGFuIGludGVybmFsIG9yIGV4dGVybmFsIGJ1ZmZlci4KKyAg
ICBVU3RyaW5nSW1wbChVQ2hhciogZGF0YSwgaW50IGxlbmd0aCwgQnVmZmVyT3duZXJzaGlwIG93
bmVyc2hpcCkKKyAgICAgICAgOiBtX2RhdGEoZGF0YSkKKyAgICAgICAgLCBtX2xlbmd0aChsZW5n
dGgpCisgICAgICAgICwgbV9yZWZDb3VudCgyKQorICAgICAgICAsIG1faGFzaCgwKQorICAgICAg
ICAsIG1faWRlbnRpZmllclRhYmxlKDApCisgICAgICAgICwgbV9kYXRhQnVmZmVyKDAsIG93bmVy
c2hpcCkKKyAgICB7CisgICAgICAgIGNoZWNrQ29uc2lzdGVuY3koKTsKKyAgICB9CisKKyAgICAv
LyBVc2VkIHRvIGNvbnN0cnVjdCBzdGF0aWMgc3RyaW5ncyB3aXRoIGFuIHNwZWNpYWwgcmVmQ291
bnQgb2YgMSAtIHNpbmNlIHJlZkNvdW50CisgICAgLy8gaXMgaW5jcmVtZW50ZWQvZGVjcmVtZW50
ZWQgYnkgMiwgdGhpcyBjYW4gbmV2ZXIgaGl0IHplcm8uICBUaGlzIG1lYW5zIHRoYXQgdGhlCisg
ICAgLy8gc3RhdGljIHN0cmluZyB3aWxsIG5ldmVyIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgaW1w
b3J0YW50IGJlY2F1c2Ugc3RhdGljIHN0cmluZ3MKKyAgICAvLyB3aWxsIGJlIHNoYXJlZCBhY3Jv
c3MgdGhyZWFkcyAmIHJlZi1jb3VudGVkIGluIGEgbm9uLXRocmVhZHNhZmUgbWFubmVyLgorICAg
IGVudW0gU3RhdGljU3RyaW5nQ29uc3RydWN0VHlwZSB7IENvbnN0cnVjdFN0YXRpY1N0cmluZyB9
OworICAgIFVTdHJpbmdJbXBsKFVDaGFyKiBkYXRhLCBpbnQgbGVuZ3RoLCBTdGF0aWNTdHJpbmdD
b25zdHJ1Y3RUeXBlKQorICAgICAgICA6IG1fZGF0YShkYXRhKQorICAgICAgICAsIG1fbGVuZ3Ro
KGxlbmd0aCkKKyAgICAgICAgLCBtX3JlZkNvdW50KDEpIC8vIFNwZWNpYWwgcmVmQ291bnQgb2Yg
b25lIQorICAgICAgICAsIG1faGFzaCgwKQorICAgICAgICAsIG1faWRlbnRpZmllclRhYmxlKDAp
CisgICAgICAgICwgbV9kYXRhQnVmZmVyKDAsIEJ1ZmZlck93bmVkKQorICAgIHsKKyAgICAgICAg
Y2hlY2tDb25zaXN0ZW5jeSgpOworICAgIH0KKworICAgIC8vIFVzZWQgdG8gY3JlYXRlIG5ldyBz
dHJpbmdzIHRoYXQgYXJlIGEgc3Vic3RyaW5nIG9mIGFuIGV4aXN0aW5nIHN0cmluZy4KKyAgICBV
U3RyaW5nSW1wbChVQ2hhciogZGF0YSwgaW50IGxlbmd0aCwgUGFzc1JlZlB0cjxVU3RyaW5nSW1w
bD4gYmFzZSkKKyAgICAgICAgOiBtX2RhdGEoZGF0YSkKKyAgICAgICAgLCBtX2xlbmd0aChsZW5n
dGgpCisgICAgICAgICwgbV9yZWZDb3VudCgyKQorICAgICAgICAsIG1faGFzaCgwKQorICAgICAg
ICAsIG1faWRlbnRpZmllclRhYmxlKDApCisgICAgICAgICwgbV9kYXRhQnVmZmVyKGJhc2UucmVs
ZWFzZVJlZigpLCBCdWZmZXJTdWJzdHJpbmcpCisgICAgeworICAgICAgICBjaGVja0NvbnNpc3Rl
bmN5KCk7CisgICAgfQorCisgICAgLy8gVXNlZCB0byBjb25zdHJ1Y3QgbmV3IHN0cmluZ3Mgc2hh
cmluZyBhbiBleGlzdGluZyBzaGFyZWQgYnVmZmVyLgorICAgIFVTdHJpbmdJbXBsKFVDaGFyKiBk
YXRhLCBpbnQgbGVuZ3RoLCBQYXNzUmVmUHRyPFNoYXJlZFVDaGFyPiBzaGFyZWRCdWZmZXIpCisg
ICAgICAgIDogbV9kYXRhKGRhdGEpCisgICAgICAgICwgbV9sZW5ndGgobGVuZ3RoKQorICAgICAg
ICAsIG1fcmVmQ291bnQoMikKKyAgICAgICAgLCBtX2hhc2goMCkKKyAgICAgICAgLCBtX2lkZW50
aWZpZXJUYWJsZSgwKQorICAgICAgICAsIG1fZGF0YUJ1ZmZlcihzaGFyZWRCdWZmZXIucmVsZWFz
ZVJlZigpLCBCdWZmZXJTaGFyZWQpCisgICAgeworICAgICAgICBjaGVja0NvbnNpc3RlbmN5KCk7
CisgICAgfQorCisgICAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplKSB7IHJldHVybiBm
YXN0TWFsbG9jKHNpemUpOyB9CisgICAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCwgdm9pZCog
aW5QbGFjZSkgeyByZXR1cm4gaW5QbGFjZTsgfQorCisgICAgLy8gVGhpcyBudW1iZXIgbXVzdCBi
ZSBhdCBsZWFzdCAyIHRvIGF2b2lkIHNoYXJpbmcgZW1wdHksIG51bGwgYXMgd2VsbCBhcyAxIGNo
YXJhY3RlciBzdHJpbmdzIGZyb20gU21hbGxTdHJpbmdzLgorICAgIHN0YXRpYyBjb25zdCBpbnQg
c19taW5MZW5ndGhUb1NoYXJlID0gMTA7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNfY29w
eUNoYXJzSW5saW5lQ3V0T2ZmID0gMjA7CisgICAgc3RhdGljIGNvbnN0IHVpbnRwdHJfdCBzX2J1
ZmZlck93bmVyc2hpcE1hc2sgPSAzOworICAgIHN0YXRpYyBjb25zdCB1aW50cHRyX3Qgc19yZXBv
cnRlZENvc3RCaXQgPSA0OworCisgICAgdm9pZCBkZXN0cm95KCk7CisgICAgVVN0cmluZ0ltcGwq
IGJ1ZmZlck93bmVyU3RyaW5nKCkgeyByZXR1cm4gKGJ1ZmZlck93bmVyc2hpcCgpID09IEJ1ZmZl
clN1YnN0cmluZykgPyBtX2RhdGFCdWZmZXIuYXNQdHI8VVN0cmluZ0ltcGwqPigpIDogIHRoaXM7
IH0KKyAgICBjb25zdCBVU3RyaW5nSW1wbCogYnVmZmVyT3duZXJTdHJpbmcoKSBjb25zdCB7IHJl
dHVybiAoYnVmZmVyT3duZXJzaGlwKCkgPT0gQnVmZmVyU3Vic3RyaW5nKSA/IG1fZGF0YUJ1ZmZl
ci5hc1B0cjxVU3RyaW5nSW1wbCo+KCkgOiAgdGhpczsgfQorICAgIFNoYXJlZFVDaGFyKiBiYXNl
U2hhcmVkQnVmZmVyKCk7CisgICAgdW5zaWduZWQgYnVmZmVyT3duZXJzaGlwKCkgY29uc3QgeyBy
ZXR1cm4gbV9kYXRhQnVmZmVyICYgc19idWZmZXJPd25lcnNoaXBNYXNrOyB9CisjaWZuZGVmIE5E
RUJVRworICAgIGJvb2wgaXNTdGF0aWMoKSBjb25zdCB7IHJldHVybiBtX3JlZkNvdW50ICYgMTsg
fQorI2VuZGlmCisKKyAgICAvLyB1bnNoYXJlZCBkYXRhCisgICAgVUNoYXIqIG1fZGF0YTsKKyAg
ICBpbnQgbV9sZW5ndGg7CisgICAgaW50IG1fcmVmQ291bnQ7CisgICAgbXV0YWJsZSB1bnNpZ25l
ZCBtX2hhc2g7CisgICAgSWRlbnRpZmllclRhYmxlKiBtX2lkZW50aWZpZXJUYWJsZTsKKyAgICBV
bnR5cGVkUHRyQW5kQml0ZmllbGQgbV9kYXRhQnVmZmVyOworCisgICAgSlNfRVhQT1JUREFUQSBz
dGF0aWMgVVN0cmluZ0ltcGwqIG51bGxVU3RyaW5nSW1wbDsKKyAgICBKU19FWFBPUlREQVRBIHN0
YXRpYyBVU3RyaW5nSW1wbCogZW1wdHlVU3RyaW5nSW1wbDsKKworICAgIGZyaWVuZCBjbGFzcyBK
SVQ7CisgICAgZnJpZW5kIGNsYXNzIFNtYWxsU3RyaW5nc1N0b3JhZ2U7CisgICAgZnJpZW5kIHZv
aWQgaW5pdGlhbGl6ZVVTdHJpbmcoKTsKK307CisKK2Jvb2wgZXF1YWwoY29uc3QgVVN0cmluZ0lt
cGwqLCBjb25zdCBVU3RyaW5nSW1wbCopOworCit9CisKKyNlbmRpZgpJbmRleDogSmF2YVNjcmlw
dEdsdWUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRHbHVlL0NoYW5nZUxvZwko
cmV2aXNpb24gNTI0NDgpCisrKyBKYXZhU2NyaXB0R2x1ZS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29w
eSkKQEAgLTEsMyArMSwxMyBAQAorMjAwOS0xMi0yMSAgR2F2aW4gQmFycmFjbG91Z2ggIDxiYXJy
YWNsb3VnaEBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMyODMx
CisgICAgICAgIFJlcGxhY2UgVVN0cmluZzo6UmVwIGltcGxlbWVudGF0aW9uLCBmb2xsb3dpbmcg
aW50cm9kdWN0aW9uIG9mIHJvcGVzIHRvIEpTQy4KKworICAgICAgICAqIEZvcndhcmRpbmdIZWFk
ZXJzL3d0Zi9Qb3NzaWJseU51bGwuaDogQWRkZWQuCisgICAgICAgICAgICAtIGFkZCBmb3J3YXJk
aW5nIGhlYWRlci4KKwogMjAwOS0xMi0xNiAgTWFyayBSb3dlICA8bXJvd2VAYXBwbGUuY29tPgog
CiAgICAgICAgIEJ1aWxkIGZpeC4gIERpc2FibGUgZGVidWcgdmFyaWFudHMgb2YgV2ViS2l0IGZy
YW1ld29ya3MuCkluZGV4OiBKYXZhU2NyaXB0R2x1ZS9Gb3J3YXJkaW5nSGVhZGVycy93dGYvUG9z
c2libHlOdWxsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdEdsdWUvRm9yd2FyZGluZ0hlYWRl
cnMvd3RmL1Bvc3NpYmx5TnVsbC5oCShyZXZpc2lvbiAwKQorKysgSmF2YVNjcmlwdEdsdWUvRm9y
d2FyZGluZ0hlYWRlcnMvd3RmL1Bvc3NpYmx5TnVsbC5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
IEBACisjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvUG9zc2libHlOdWxsLmg+CkluZGV4OiBXZWJD
b3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24g
NTI0NDgpCisrKyBXZWJDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE3
IEBACisyMDA5LTEyLTIxICBHYXZpbiBCYXJyYWNsb3VnaCAgPGJhcnJhY2xvdWdoQGFwcGxlLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzI4MzEKKyAgICAgICAgUmVwbGFj
ZSBVU3RyaW5nOjpSZXAgaW1wbGVtZW50YXRpb24sIGZvbGxvd2luZyBpbnRyb2R1Y3Rpb24gb2Yg
cm9wZXMgdG8gSlNDLgorCisgICAgICAgICogRm9yd2FyZGluZ0hlYWRlcnMvcnVudGltZS9VU3Ry
aW5nSW1wbC5oOiBBZGRlZC4KKyAgICAgICAgICAgIC0gYWRkIGZvcndhcmRpbmcgaGVhZGVyLgor
CisgICAgICAgICogcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OlN0cmluZ0ltcGw6OnVzdHJpbmcpOgorICAgICAgICAgICAgLSBvcmRlciBvZiBhcmd1bWVu
dHMgdG8gVVN0cmluZzo6UmVwIGNvbnN0cnVjdG9yIGZvciBzaGFyZWQgc3RyaW5ncyBjaGFuZ2Vk
LgorCiAyMDA5LTEyLTIxICBBbmRyZWFzIEtsaW5nICA8YW5kcmVhcy5rbGluZ0Bub2tpYS5jb20+
CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4OiBXZWJDb3JlL0Zvcndh
cmRpbmdIZWFkZXJzL3J1bnRpbWUvVVN0cmluZ0ltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L0ZvcndhcmRpbmdIZWFkZXJzL3J1bnRpbWUvVVN0cmluZ0ltcGwuaAkocmV2aXNpb24gMCkKKysr
IFdlYkNvcmUvRm9yd2FyZGluZ0hlYWRlcnMvcnVudGltZS9VU3RyaW5nSW1wbC5oCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgV2ViQ29yZV9GV0RfVVN0cmluZ0ltcGxfaAor
I2RlZmluZSBXZWJDb3JlX0ZXRF9VU3RyaW5nSW1wbF9oCisjaW5jbHVkZSA8SmF2YVNjcmlwdENv
cmUvVVN0cmluZ0ltcGwuaD4KKyNlbmRpZgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0
cmluZ0ltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJ
bXBsLmNwcAkocmV2aXNpb24gNTIzNDYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5n
SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTk4MCw3ICs5ODAsNyBAQCBKU0M6OlVTdHJpbmcg
U3RyaW5nSW1wbDo6dXN0cmluZygpCiB7CiAgICAgU2hhcmVkVUNoYXIqIHNoYXJlZEJ1ZmZlciA9
IHRoaXMtPnNoYXJlZEJ1ZmZlcigpOwogICAgIGlmIChzaGFyZWRCdWZmZXIpCi0gICAgICAgIHJl
dHVybiBKU0M6OlVTdHJpbmc6OlJlcDo6Y3JlYXRlKGNvbnN0X2Nhc3Q8VUNoYXIqPihtX2RhdGEp
LCBtX2xlbmd0aCwgc2hhcmVkQnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIEpTQzo6VVN0cmluZzo6
UmVwOjpjcmVhdGUoc2hhcmVkQnVmZmVyLCBjb25zdF9jYXN0PFVDaGFyKj4obV9kYXRhKSwgbV9s
ZW5ndGgpOwogCiAgICAgcmV0dXJuIEpTQzo6VVN0cmluZyhtX2RhdGEsIG1fbGVuZ3RoKTsKIH0K
</data>
<flag name="review"
          id="27356"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>45347</attachid>
            <date>2009-12-21 13:38:35 -0800</date>
            <delta_ts>2009-12-21 13:53:45 -0800</delta_ts>
            <desc>Review comment fixage</desc>
            <filename>patch.UStringImpl.2.txt</filename>
            <type>text/plain</type>
            <size>88763</size>
            <attacher name="Gavin Barraclough">barraclough</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDUyNDQ4KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzQgQEAKKzIwMDktMTItMjEgIEdhdmluIEJh
cnJhY2xvdWdoICA8YmFycmFjbG91Z2hAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0zMjgzMQorICAgICAgICBSZXBsYWNlIFVTdHJpbmc6OlJlcCBpbXBsZW1lbnRh
dGlvbiwgZm9sbG93aW5nIGludHJvZHVjdGlvbiBvZiByb3BlcyB0byBKU0MuCisKKyAgICAgICAg
ICAgICogUmVtb3ZlIHJlZHVuZGFudCBvdmVyY2FwYWNpdHkgbWVjaGFuaXNtcy4KKyAgICAgICAg
ICAgICogUmVkdWNlIG1lbW9yeSBjb3N0IG9mIFJlcCdzLgorICAgICAgICAgICAgKiBBZGQgYW4g
aW5saW5lIHN0b3JhZ2UgbWVjaGFuaXNtIGFraW4gdG8gdGhhdCBpbiBXZWJDb3JlJ3MgU3RyaW5n
SW1wbC4KKworICAgICAgICB+MSUgU3Vuc3BpZGVyIHByb2dyZXNzaW9uLgorCisgICAgICAgICog
SmF2YVNjcmlwdENvcmUuZXhwOgorICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2o6CisgICAgICAgICogcnVudGltZS9KU1N0cmluZy5jcHA6CisgICAgICAg
IChKU0M6OkpTU3RyaW5nOjpyZXNvbHZlUm9wZSk6CisgICAgICAgICogcnVudGltZS9TbWFsbFN0
cmluZ3MuY3BwOgorICAgICAgICAoSlNDOjpTbWFsbFN0cmluZ3NTdG9yYWdlOjpTbWFsbFN0cmlu
Z3NTdG9yYWdlKToKKyAgICAgICAgKiBydW50aW1lL1VTdHJpbmcuY3BwOgorICAgICAgICAoSlND
Ojppbml0aWFsaXplVVN0cmluZyk6CisgICAgICAgIChKU0M6OmNyZWF0ZVJlcCk6CisgICAgICAg
IChKU0M6OlVTdHJpbmc6OmNyZWF0ZUZyb21VVEY4KToKKyAgICAgICAgKEpTQzo6VVN0cmluZzo6
Y3JlYXRlVW5pbml0aWFsaXplZCk6CisgICAgICAgIChKU0M6OlVTdHJpbmc6OnNwbGljZVN1YnN0
cmluZ3NXaXRoU2VwYXJhdG9ycyk6CisgICAgICAgIChKU0M6OlVTdHJpbmc6OnJlcGxhY2VSYW5n
ZSk6CisgICAgICAgIChKU0M6OlVTdHJpbmc6OmFzY2lpKToKKyAgICAgICAgKEpTQzo6VVN0cmlu
Zzo6b3BlcmF0b3I9KToKKyAgICAgICAgKEpTQzo6VVN0cmluZzo6dG9TdHJpY3RVSW50MzIpOgor
ICAgICAgICAoSlNDOjplcXVhbCk6CisgICAgICAgICogcnVudGltZS9VU3RyaW5nLmg6CisgICAg
ICAgIChKU0M6OlVTdHJpbmc6OmlzRW1wdHkpOgorICAgICAgICAoSlNDOjpVU3RyaW5nOjpjb3N0
KToKKyAgICAgICAgKEpTQzo6bWFrZVN0cmluZyk6CisgICAgICAgICogcnVudGltZS9VU3RyaW5n
SW1wbC5jcHA6IEFkZGVkLgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6YmFzZVNoYXJlZEJ1
ZmZlcik6CisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBsOjpzaGFyZWRCdWZmZXIpOgorICAgICAg
ICAoSlNDOjpVU3RyaW5nSW1wbDo6ZGVzdHJveSk6CisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBs
Ojpjb21wdXRlSGFzaCk6CisgICAgICAgICogcnVudGltZS9VU3RyaW5nSW1wbC5oOiBBZGRlZC4K
KyAgICAgICAgKEpTQzo6VW50eXBlZFB0ckFuZEJpdGZpZWxkOjpVbnR5cGVkUHRyQW5kQml0Zmll
bGQpOgorICAgICAgICAoSlNDOjpVbnR5cGVkUHRyQW5kQml0ZmllbGQ6OmFzUHRyKToKKyAgICAg
ICAgKEpTQzo6VW50eXBlZFB0ckFuZEJpdGZpZWxkOjpvcGVyYXRvciY9KToKKyAgICAgICAgKEpT
Qzo6VW50eXBlZFB0ckFuZEJpdGZpZWxkOjpvcGVyYXRvcnw9KToKKyAgICAgICAgKEpTQzo6VW50
eXBlZFB0ckFuZEJpdGZpZWxkOjpvcGVyYXRvciYpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1w
bDo6Y3JlYXRlKToKKyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6OmNyZWF0ZUNvcHlpbmcpOgor
ICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6Y3JlYXRlVW5pbml0aWFsaXplZCk6CisgICAgICAg
IChKU0M6OlVTdHJpbmdJbXBsOjpkYXRhKToKKyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6OnNp
emUpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6Y29zdCk6CisgICAgICAgIChKU0M6OlVT
dHJpbmdJbXBsOjpoYXNoKToKKyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6OmNvbXB1dGVkSGFz
aCk6CisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBsOjpzZXRIYXNoKToKKyAgICAgICAgKEpTQzo6
VVN0cmluZ0ltcGw6OmlkZW50aWZpZXJUYWJsZSk6CisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBs
OjpzZXRJZGVudGlmaWVyVGFibGUpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6cmVmKToK
KyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6OmRlcmVmKToKKyAgICAgICAgKEpTQzo6VVN0cmlu
Z0ltcGw6OmFsbG9jQ2hhcnMpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6Y29weUNoYXJz
KToKKyAgICAgICAgKEpTQzo6VVN0cmluZ0ltcGw6OmNvbXB1dGVIYXNoKToKKyAgICAgICAgKEpT
Qzo6VVN0cmluZ0ltcGw6Om51bGwpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6ZW1wdHkp
OgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6Y2hlY2tDb25zaXN0ZW5jeSk6CisgICAgICAg
IChKU0M6OlVTdHJpbmdJbXBsOjopOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6VVN0cmlu
Z0ltcGwpOgorICAgICAgICAoSlNDOjpVU3RyaW5nSW1wbDo6b3BlcmF0b3IgbmV3KToKKyAgICAg
ICAgKEpTQzo6VVN0cmluZ0ltcGw6OmJ1ZmZlck93bmVyU3RyaW5nKToKKyAgICAgICAgKEpTQzo6
VVN0cmluZ0ltcGw6OmJ1ZmZlck93bmVyc2hpcCk6CisgICAgICAgIChKU0M6OlVTdHJpbmdJbXBs
Ojppc1N0YXRpYyk6CisKIDIwMDktMTItMTggIExhc3psbyBHb21ib3MgIDxsYXN6bG8uMS5nb21i
b3NAbm9raWEuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEtlbm5ldGggUm9oZGUgQ2hyaXN0
aWFuc2VuLgpJbmRleDogSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUuZXhwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmV4cAkocmV2aXNpb24gNTIzNDYp
CisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5leHAJKHdvcmtpbmcgY29weSkKQEAg
LTkwLDEyICs5MCwxMiBAQCBfX1oxMmpzUmVnRXhwRnJlZVA4SlNSZWdFeHAKIF9fWjE1anNSZWdF
eHBDb21waWxlUEt0aTI0SlNSZWdFeHBJZ25vcmVDYXNlT3B0aW9uMjNKU1JlZ0V4cE11bHRpbGlu
ZU9wdGlvblBqUFBLYwogX19aMTVqc1JlZ0V4cEV4ZWN1dGVQSzhKU1JlZ0V4cFBLdGlpUGlpCiBf
X1pOMTRPcGFxdWVKU1N0cmluZzZjcmVhdGVFUktOM0pTQzdVU3RyaW5nRQotX19aTjNKU0MxMElk
ZW50aWZpZXIxMWFkZFNsb3dDYXNlRVBOU18xMkpTR2xvYmFsRGF0YUVQTlNfN1VTdHJpbmczUmVw
RQotX19aTjNKU0MxMElkZW50aWZpZXIxMWFkZFNsb3dDYXNlRVBOU185RXhlY1N0YXRlRVBOU183
VVN0cmluZzNSZXBFCi1fX1pOM0pTQzEwSWRlbnRpZmllcjI0Y2hlY2tTYW1lSWRlbnRpZmllclRh
YmxlRVBOU18xMkpTR2xvYmFsRGF0YUVQTlNfN1VTdHJpbmczUmVwRSAKLV9fWk4zSlNDMTBJZGVu
dGlmaWVyMjRjaGVja1NhbWVJZGVudGlmaWVyVGFibGVFUE5TXzlFeGVjU3RhdGVFUE5TXzdVU3Ry
aW5nM1JlcEUgCitfX1pOM0pTQzEwSWRlbnRpZmllcjExYWRkU2xvd0Nhc2VFUE5TXzEySlNHbG9i
YWxEYXRhRVBOU18xMVVTdHJpbmdJbXBsRQorX19aTjNKU0MxMElkZW50aWZpZXIxMWFkZFNsb3dD
YXNlRVBOU185RXhlY1N0YXRlRVBOU18xMVVTdHJpbmdJbXBsRQorX19aTjNKU0MxMElkZW50aWZp
ZXIyNGNoZWNrU2FtZUlkZW50aWZpZXJUYWJsZUVQTlNfMTJKU0dsb2JhbERhdGFFUE5TXzExVVN0
cmluZ0ltcGxFCitfX1pOM0pTQzEwSWRlbnRpZmllcjI0Y2hlY2tTYW1lSWRlbnRpZmllclRhYmxl
RVBOU185RXhlY1N0YXRlRVBOU18xMVVTdHJpbmdJbXBsRQogX19aTjNKU0MxMElkZW50aWZpZXIz
YWRkRVBOU185RXhlY1N0YXRlRVBLYwotX19aTjNKU0MxMElkZW50aWZpZXI1ZXF1YWxFUEtOU183
VVN0cmluZzNSZXBFUEtjCitfX1pOM0pTQzEwSWRlbnRpZmllcjVlcXVhbEVQS05TXzExVVN0cmlu
Z0ltcGxFUEtjCiBfX1pOM0pTQzEwSlNGdW5jdGlvbkMxRVBOU185RXhlY1N0YXRlRU4zV1RGMTdO
b25OdWxsUGFzc1JlZlB0cklOU185U3RydWN0dXJlRUVFaVJLTlNfMTBJZGVudGlmaWVyRVBGTlNf
N0pTVmFsdWVFUzJfUE5TXzhKU09iamVjdEVTQV9SS05TXzdBcmdMaXN0RUUKIF9fWk4zSlNDMTB0
aHJvd0Vycm9yRVBOU185RXhlY1N0YXRlRU5TXzlFcnJvclR5cGVFCiBfX1pOM0pTQzEwdGhyb3dF
cnJvckVQTlNfOUV4ZWNTdGF0ZUVOU185RXJyb3JUeXBlRVBLYwpAQCAtMTAzLDYgKzEwMywxMSBA
QCBfX1pOM0pTQzEwdGhyb3dFcnJvckVQTlNfOUV4ZWNTdGF0ZUVOU185CiBfX1pOM0pTQzExSlNC
eXRlQXJyYXkxNWNyZWF0ZVN0cnVjdHVyZUVOU183SlNWYWx1ZUUKIF9fWk4zSlNDMTFKU0J5dGVB
cnJheUMxRVBOU185RXhlY1N0YXRlRU4zV1RGMTdOb25OdWxsUGFzc1JlZlB0cklOU185U3RydWN0
dXJlRUVFUE5TM185Qnl0ZUFycmF5RVBLTlNfOUNsYXNzSW5mb0UKIF9fWk4zSlNDMTFQYXJzZXJB
cmVuYTVyZXNldEV2CitfX1pOM0pTQzExVVN0cmluZ0ltcGwxMWNvbXB1dGVIYXNoRVBLY2kKK19f
Wk4zSlNDMTFVU3RyaW5nSW1wbDExY29tcHV0ZUhhc2hFUEt0aQorX19aTjNKU0MxMVVTdHJpbmdJ
bXBsMTJzaGFyZWRCdWZmZXJFdgorX19aTjNKU0MxMVVTdHJpbmdJbXBsNnNfbnVsbEUKK19fWk4z
SlNDMTFVU3RyaW5nSW1wbDdkZXN0cm95RXYKIF9fWk4zSlNDMTFjaGVja1N5bnRheEVQTlNfOUV4
ZWNTdGF0ZUVSS05TXzEwU291cmNlQ29kZUUKIF9fWk4zSlNDMTJEYXRlSW5zdGFuY2U0aW5mb0UK
IF9fWk4zSlNDMTJEYXRlSW5zdGFuY2VDMUVQTlNfOUV4ZWNTdGF0ZUVkCkBAIC0xNTcsNyArMTYy
LDcgQEAgX19aTjNKU0MxNkpTVmFyaWFibGVPYmplY3QxNHN5bWJvbFRhYmxlRwogX19aTjNKU0Mx
NkpTVmFyaWFibGVPYmplY3QxOWdldE93blByb3BlcnR5TmFtZXNFUE5TXzlFeGVjU3RhdGVFUk5T
XzE3UHJvcGVydHlOYW1lQXJyYXlFCiBfX1pOM0pTQzE2dG9VSW50MzJTbG93Q2FzZUVkUmIKIF9f
Wk4zSlNDMTdCeXRlY29kZUdlbmVyYXRvcjIxc2V0RHVtcHNHZW5lcmF0ZWRDb2RlRWIKLV9fWk4z
SlNDMTdQcm9wZXJ0eU5hbWVBcnJheTNhZGRFUE5TXzdVU3RyaW5nM1JlcEUKK19fWk4zSlNDMTdQ
cm9wZXJ0eU5hbWVBcnJheTNhZGRFUE5TXzExVVN0cmluZ0ltcGxFCiBfX1pOM0pTQzE3UHJvdG90
eXBlRnVuY3Rpb25DMUVQTlNfOUV4ZWNTdGF0ZUVOM1dURjE3Tm9uTnVsbFBhc3NSZWZQdHJJTlNf
OVN0cnVjdHVyZUVFRWlSS05TXzEwSWRlbnRpZmllckVQRk5TXzdKU1ZhbHVlRVMyX1BOU184SlNP
YmplY3RFU0FfUktOU183QXJnTGlzdEVFCiBfX1pOM0pTQzE3UHJvdG90eXBlRnVuY3Rpb25DMUVQ
TlNfOUV4ZWNTdGF0ZUVpUktOU18xMElkZW50aWZpZXJFUEZOU183SlNWYWx1ZUVTMl9QTlNfOEpT
T2JqZWN0RVM2X1JLTlNfN0FyZ0xpc3RFRQogX19aTjNKU0MxN2NvbnN0cnVjdEZ1bmN0aW9uRVBO
U185RXhlY1N0YXRlRVJLTlNfN0FyZ0xpc3RFUktOU18xMElkZW50aWZpZXJFUktOU183VVN0cmlu
Z0VpCkBAIC0xOTQsNyArMTk5LDcgQEAgX19aTjNKU0M0SGVhcDdwcm90ZWN0RU5TXzdKU1ZhbHVl
RQogX19aTjNKU0M0SGVhcDhhbGxvY2F0ZUVtCiBfX1pOM0pTQzRIZWFwOXVucHJvdGVjdEVOU183
SlNWYWx1ZUUKIF9fWk4zSlNDNGNhbGxFUE5TXzlFeGVjU3RhdGVFTlNfN0pTVmFsdWVFTlNfOENh
bGxUeXBlRVJLTlNfOENhbGxEYXRhRVMyX1JLTlNfN0FyZ0xpc3RFCi1fX1pOM0pTQzVlcXVhbEVQ
S05TXzdVU3RyaW5nM1JlcEVTM18KK19fWk4zSlNDNWVxdWFsRVBLTlNfMTFVU3RyaW5nSW1wbEVT
Ml8KIF9fWk4zSlNDNkpTQ2VsbDExZ2V0Q2FsbERhdGFFUk5TXzhDYWxsRGF0YUUKIF9fWk4zSlND
NkpTQ2VsbDExZ2V0SlNOdW1iZXJFdgogX19aTjNKU0M2SlNDZWxsMTRkZWxldGVQcm9wZXJ0eUVQ
TlNfOUV4ZWNTdGF0ZUVSS05TXzEwSWRlbnRpZmllckUKQEAgLTIyNiwxMyArMjMxLDYgQEAgX19a
TjNKU0M3UHJvZmlsZTVmb2N1c0VQS05TXzExUHJvZmlsZU5vZAogX19aTjNKU0M3UHJvZmlsZTdl
eGNsdWRlRVBLTlNfMTFQcm9maWxlTm9kZUUKIF9fWk4zSlNDN1Byb2ZpbGU3Zm9yRWFjaEVNTlNf
MTFQcm9maWxlTm9kZUVGdnZFCiBfX1pOM0pTQzdVU3RyaW5nMTZjcmVhdGVOb25Db3B5aW5nRVB0
aQotX19aTjNKU0M3VVN0cmluZzNSZXAxMWNvbXB1dGVIYXNoRVBLY2kKLV9fWk4zSlNDN1VTdHJp
bmczUmVwMTFjb21wdXRlSGFzaEVQS3RpCi1fX1pOM0pTQzdVU3RyaW5nM1JlcDEyc2hhcmVkQnVm
ZmVyRXYKLV9fWk4zSlNDN1VTdHJpbmczUmVwMTRjcmVhdGVGcm9tVVRGOEVQS2MKLV9fWk4zSlND
N1VTdHJpbmczUmVwMTRudWxsQmFzZVN0cmluZ0UKLV9fWk4zSlNDN1VTdHJpbmczUmVwNmNyZWF0
ZUVQdGlOM1dURjEwUGFzc1JlZlB0cklOUzNfMjFDcm9zc1RocmVhZFJlZkNvdW50ZWRJTlMzXzE2
T3duRmFzdE1hbGxvY1B0ckl0RUVFRUVFCi1fX1pOM0pTQzdVU3RyaW5nM1JlcDdkZXN0cm95RXYK
IF9fWk4zSlNDN1VTdHJpbmc0ZnJvbUVkCiBfX1pOM0pTQzdVU3RyaW5nNGZyb21FaQogX19aTjNK
U0M3VVN0cmluZzRmcm9tRWoKQEAgLTI4MCw3ICsyNzgsNyBAQCBfX1pOM0pTQzlNYXJrU3RhY2sx
MHNfcGFnZVNpemVFCiBfX1pOM0pTQzlNYXJrU3RhY2sxMnJlbGVhc2VTdGFja0VQdm0KIF9fWk4z
SlNDOU1hcmtTdGFjazEzYWxsb2NhdGVTdGFja0VtCiBfX1pOM0pTQzlNYXJrU3RhY2sxOGluaXRp
YWxpemVQYWdlc2l6ZUV2Ci1fX1pOM0pTQzlTdHJ1Y3R1cmUxM2hhc1RyYW5zaXRpb25FUE5TXzdV
U3RyaW5nM1JlcEVqCitfX1pOM0pTQzlTdHJ1Y3R1cmUxM2hhc1RyYW5zaXRpb25FUE5TXzExVVN0
cmluZ0ltcGxFagogX19aTjNKU0M5U3RydWN0dXJlMTdzdG9wSWdub3JpbmdMZWFrc0V2CiBfX1pO
M0pTQzlTdHJ1Y3R1cmUxOHN0YXJ0SWdub3JpbmdMZWFrc0V2CiBfX1pOM0pTQzlTdHJ1Y3R1cmUy
MWFkZFByb3BlcnR5VHJhbnNpdGlvbkVQUzBfUktOU18xMElkZW50aWZpZXJFalBOU182SlNDZWxs
RVJtCkBAIC0yOTAsNyArMjg4LDcgQEAgX19aTjNKU0M5U3RydWN0dXJlMjdhZGRBbm9ueW1vdXNT
bG90c1RyYQogX19aTjNKU0M5U3RydWN0dXJlMjdkZXNwZWNpZnlEaWN0aW9uYXJ5RnVuY3Rpb25F
UktOU18xMElkZW50aWZpZXJFCiBfX1pOM0pTQzlTdHJ1Y3R1cmUyN2Rlc3BlY2lmeUZ1bmN0aW9u
VHJhbnNpdGlvbkVQUzBfUktOU18xMElkZW50aWZpZXJFCiBfX1pOM0pTQzlTdHJ1Y3R1cmUyOGFk
ZFByb3BlcnR5V2l0aG91dFRyYW5zaXRpb25FUktOU18xMElkZW50aWZpZXJFalBOU182SlNDZWxs
RQotX19aTjNKU0M5U3RydWN0dXJlM2dldEVQS05TXzdVU3RyaW5nM1JlcEVSalJQTlNfNkpTQ2Vs
bEUKK19fWk4zSlNDOVN0cnVjdHVyZTNnZXRFUEtOU18xMVVTdHJpbmdJbXBsRVJqUlBOU182SlND
ZWxsRQogX19aTjNKU0M5U3RydWN0dXJlNDBhZGRQcm9wZXJ0eVRyYW5zaXRpb25Ub0V4aXN0aW5n
U3RydWN0dXJlRVBTMF9SS05TXzEwSWRlbnRpZmllckVqUE5TXzZKU0NlbGxFUm0KIF9fWk4zSlND
OVN0cnVjdHVyZUMxRU5TXzdKU1ZhbHVlRVJLTlNfOFR5cGVJbmZvRQogX19aTjNKU0M5U3RydWN0
dXJlRDFFdgpAQCAtMzQ4LDcgKzM0Niw3IEBAIF9fWk4zV1RGOGZhc3RGcmVlRVB2CiBfX1pOM1dU
RjlCeXRlQXJyYXk2Y3JlYXRlRW0KIF9fWk5LM0pTQzEwSlNGdW5jdGlvbjIzaXNIb3N0RnVuY3Rp
b25Ob25JbmxpbmVFdgogX19aTkszSlNDMTFJbnRlcnByZXRlcjE0cmV0cmlldmVDYWxsZXJFUE5T
XzlFeGVjU3RhdGVFUE5TXzE2SW50ZXJuYWxGdW5jdGlvbkUKLV9fWk5LM0pTQzExSW50ZXJwcmV0
ZXIxOHJldHJpZXZlTGFzdENhbGxlckVQTlNfOUV4ZWNTdGF0ZUVSaVJsUk5TXzdVU3RyaW5nRVJO
U183SlNWYWx1ZUUgIAorX19aTkszSlNDMTFJbnRlcnByZXRlcjE4cmV0cmlldmVMYXN0Q2FsbGVy
RVBOU185RXhlY1N0YXRlRVJpUmxSTlNfN1VTdHJpbmdFUk5TXzdKU1ZhbHVlRQogX19aTkszSlND
MTRKU0dsb2JhbE9iamVjdDE0aXNEeW5hbWljU2NvcGVFdgogX19aTkszSlNDMTZJbnRlcm5hbEZ1
bmN0aW9uOWNsYXNzSW5mb0V2CiBfX1pOSzNKU0MxNkpTVmFyaWFibGVPYmplY3QxNmlzVmFyaWFi
bGVPYmplY3RFdgpJbmRleDogSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiA1MjM0NikKKysrIEphdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtp
bmcgY29weSkKQEAgLTIwNyw2ICsyMDcsOCBAQAogCQk4NjkwODMxNTBFNjUxOEQ3MDAwRDM2RUQg
LyogV1JFQy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSA4NjkwODMxMzBFNjUxOEQ3MDAwRDM2RUQgLyogV1JFQy5jcHAgKi87IH07CiAJCTg2OTA4MzE2
MEU2NTE4RDcwMDBEMzZFRCAvKiBXUkVDLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA4NjkwODMxNDBFNjUxOEQ3MDAwRDM2RUQgLyogV1JFQy5oICovOyBz
ZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTg2OThCODY5MTBE
NDREOTQwMEQ4RDAxQiAvKiBTdHJpbmdCdWlsZGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4Njk4Qjg2ODEwRDQ0RDk0MDBEOEQwMUIgLyogU3RyaW5n
QnVpbGRlci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07
CisJCTg2OThCQjM5MTBEODZCQUYwMEQ4RDAxQiAvKiBVU3RyaW5nSW1wbC5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODY5OEJCMzcxMEQ4NkJBRjAwRDhE
MDFCIC8qIFVTdHJpbmdJbXBsLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0
ZSwgKTsgfTsgfTsKKwkJODY5OEJCM0ExMEQ4NkJBRjAwRDhEMDFCIC8qIFVTdHJpbmdJbXBsLmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDg2OThCQjM4
MTBEODZCQUYwMEQ4RDAxQiAvKiBVU3RyaW5nSW1wbC5jcHAgKi87IH07CiAJCTg2OUVCQ0I3MEU4
QzZENEEwMDg3MjJDQyAvKiBSZXN1bHRUeXBlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSA4NjlFQkNCNjBFOEM2RDRBMDA4NzIyQ0MgLyogUmVzdWx0VHlw
ZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTg2
QTkwRUQwMEVFN0Q1MUYwMEFCMzUwRCAvKiBKSVRBcml0aG1ldGljLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDg2QTkwRUNGMEVFN0Q1MUYwMEFCMzUw
RCAvKiBKSVRBcml0aG1ldGljLmNwcCAqLzsgfTsKIAkJODZBREQxNDUwRkRERUE5ODAwMDZFRUMy
IC8qIEFSTXY3QXNzZW1ibGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSA4NkFERDE0MzBGRERFQTk4MDAwNkVFQzIgLyogQVJNdjdBc3NlbWJsZXIuaCAq
LzsgfTsKQEAgLTczNCw2ICs3MzYsOCBAQAogCQk4NjkwODMxMzBFNjUxOEQ3MDAwRDM2RUQgLyog
V1JFQy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXUkVDLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODY5MDgzMTQwRTY1MThENzAwMEQzNkVEIC8q
IFdSRUMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV1JFQy5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQk4Njk4Qjg2ODEwRDQ0RDk0MDBEOEQwMUIgLyogU3RyaW5n
QnVpbGRlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTdHJpbmdCdWlsZGVy
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTg2OThCQjM3MTBEODZCQUYwMEQ4RDAx
QiAvKiBVU3RyaW5nSW1wbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBVU3Ry
aW5nSW1wbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4Njk4QkIzODEwRDg2QkFG
MDBEOEQwMUIgLyogVVN0cmluZ0ltcGwuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3Bw
OyBwYXRoID0gVVN0cmluZ0ltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4
NjlFQkNCNjBFOEM2RDRBMDA4NzIyQ0MgLyogUmVzdWx0VHlwZS5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBSZXN1bHRUeXBlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCTg2QTkwRUNGMEVFN0Q1MUYwMEFCMzUwRCAvKiBKSVRBcml0aG1ldGljLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpJVEFyaXRobWV0aWMuY3BwOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQk4NkFERDE0MzBGRERFQTk4MDAwNkVFQzIgLyogQVJNdjdB
c3NlbWJsZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQVJNdjdBc3NlbWJs
ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE2MTAsNiArMTYxNCw4IEBACiAJ
CQkJNUQ1MzcyNkUwRTFDNTQ4ODAwMjFFNTQ5IC8qIFRyYWNpbmcuaCAqLywKIAkJCQlGNjkyQTg4
NTAyNTU1OTdEMDFGRjYwRjcgLyogVVN0cmluZy5jcHAgKi8sCiAJCQkJRjY5MkE4ODYwMjU1NTk3
RDAxRkY2MEY3IC8qIFVTdHJpbmcuaCAqLywKKwkJCQk4Njk4QkIzODEwRDg2QkFGMDBEOEQwMUIg
LyogVVN0cmluZ0ltcGwuY3BwICovLAorCQkJCTg2OThCQjM3MTBEODZCQUYwMEQ4RDAxQiAvKiBV
U3RyaW5nSW1wbC5oICovLAogCQkJCTE0QkZDRTY4MTBDREIxRkMwMDM2NENDRSAvKiBXZWFrR0NN
YXAuaCAqLywKIAkJCQkxNDAzNURCMDEwREJGQjJBMDBGRkZGRTcgLyogV2Vha0dDUHRyLmggKi8s
CiAJCQkJMTQyMEJFN0ExMEFBNkREQjAwRjQ1NUQyIC8qIFdlYWtSYW5kb20uaCAqLywKQEAgLTIw
MjcsNiArMjAzMyw3IEBACiAJCQkJMTRBMTU2MzIxMDk2NjM2NTAwNkZBMjYwIC8qIERhdGVJbnN0
YW5jZUNhY2hlLmggaW4gSGVhZGVycyAqLywKIAkJCQkxNDIwQkU3QjEwQUE2RERCMDBGNDU1RDIg
LyogV2Vha1JhbmRvbS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJODY5OEI4NjkxMEQ0NEQ5NDAwRDhE
MDFCIC8qIFN0cmluZ0J1aWxkZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCTg2OThCQjM5MTBEODZC
QUYwMEQ4RDAxQiAvKiBVU3RyaW5nSW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMTQwMzVEQjEx
MERCRkIyQTAwRkZGRkU3IC8qIFdlYWtHQ1B0ci5oIGluIEhlYWRlcnMgKi8sCiAJCQkpOwogCQkJ
cnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CkBAIC0yNDcyLDYgKzI0Nzks
NyBAQAogCQkJCTE0MjlEQUMwMEVEMjYzRTcwMEI4OTYxOSAvKiBXUkVDUGFyc2VyLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCUE3QzIyMTc4MTBDNzQ3OTQwMEY5NzkxMyAvKiBKU1pvbWJpZS5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQk2NTVFQjI5QjEwQ0UyNTgxMDAxQTk5MEUgLyogTm9kZXNDb2Rl
Z2VuLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTg2OThCQjNBMTBEODZCQUYwMEQ4RDAxQiAvKiBV
U3RyaW5nSW1wbC5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95
bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3J1bnRp
bWUvSlNTdHJpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNT
dHJpbmcuY3BwCShyZXZpc2lvbiA1MjM0NikKKysrIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNT
dHJpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05NiwxMyArOTYsMTMgQEAgdm9pZCBKU1N0cmlu
Zzo6cmVzb2x2ZVJvcGUoRXhlY1N0YXRlKiBleAogCiAgICAgLy8gQWxsb2NhdGUgdGhlIGJ1ZmZl
ciB0byBob2xkIHRoZSBmaW5hbCBzdHJpbmcsIHBvc2l0aW9uIGluaXRpYWxseSBwb2ludHMgdG8g
dGhlIGVuZC4KICAgICBVQ2hhciogYnVmZmVyOwotICAgIGlmICghdHJ5RmFzdE1hbGxvYyhtX3N0
cmluZ0xlbmd0aCAqIHNpemVvZihVQ2hhcikpLmdldFZhbHVlKGJ1ZmZlcikpIHsKKyAgICBtX3Zh
bHVlID0gVVN0cmluZzo6Y3JlYXRlVW5pbml0aWFsaXplZChtX3N0cmluZ0xlbmd0aCwgYnVmZmVy
KTsKKyAgICBpZiAoIWJ1ZmZlcikgewogICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bV9yb3BlTGVuZ3RoOyArK2kpCiAgICAgICAgICAgICBtX2ZpYmVyc1tpXS5kZXJlZigpOwogICAg
ICAgICBtX3JvcGVMZW5ndGggPSAwOwogICAgICAgICBBU1NFUlQoIWlzUm9wZSgpKTsKICAgICAg
ICAgQVNTRVJUKG1fdmFsdWUgPT0gVVN0cmluZygpKTsKLQogICAgICAgICB0aHJvd091dE9mTWVt
b3J5RXJyb3IoZXhlYyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMzMsNyArMTMzLDYg
QEAgdm9pZCBKU1N0cmluZzo6cmVzb2x2ZVJvcGUoRXhlY1N0YXRlKiBleAogICAgICAgICAgICAg
aWYgKHdvcmtRdWV1ZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBz
dHJpbmcgZnJvbSB0aGUgVUNoYXIgYnVmZmVyLCBjbGVhciB0aGUgcm9wZSBSZWZQdHIuCiAgICAg
ICAgICAgICAgICAgQVNTRVJUKGJ1ZmZlciA9PSBwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAg
bV92YWx1ZSA9IFVTdHJpbmc6OlJlcDo6Y3JlYXRlKGJ1ZmZlciwgbV9zdHJpbmdMZW5ndGgpOwog
ICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX3JvcGVMZW5ndGg7ICsr
aSkKICAgICAgICAgICAgICAgICAgICAgbV9maWJlcnNbaV0uZGVyZWYoKTsKICAgICAgICAgICAg
ICAgICBtX3JvcGVMZW5ndGggPSAwOwpJbmRleDogSmF2YVNjcmlwdENvcmUvcnVudGltZS9TbWFs
bFN0cmluZ3MuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvU21hbGxT
dHJpbmdzLmNwcAkocmV2aXNpb24gNTIzNDYpCisrKyBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL1Nt
YWxsU3RyaW5ncy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDMwICs0MiwyMSBAQCBwdWJsaWM6
CiAKIHByaXZhdGU6CiAgICAgVUNoYXIgbV9jaGFyYWN0ZXJzW251bUNoYXJhY3RlcnNUb1N0b3Jl
XTsKLSAgICBVU3RyaW5nOjpCYXNlU3RyaW5nIG1fYmFzZTsKKyAgICBVU3RyaW5nOjpSZXAgbV9i
YXNlOwogICAgIFVTdHJpbmc6OlJlcCBtX3JlcHNbbnVtQ2hhcmFjdGVyc1RvU3RvcmVdOwogfTsK
IAogU21hbGxTdHJpbmdzU3RvcmFnZTo6U21hbGxTdHJpbmdzU3RvcmFnZSgpCi0gICAgOiBtX2Jh
c2UobV9jaGFyYWN0ZXJzLCBudW1DaGFyYWN0ZXJzVG9TdG9yZSkKKyAgICA6IG1fYmFzZShtX2No
YXJhY3RlcnMsIG51bUNoYXJhY3RlcnNUb1N0b3JlLCBVU3RyaW5nSW1wbDo6Q29uc3RydWN0U3Rh
dGljU3RyaW5nKQogewotICAgIG1fYmFzZS5yYyA9IG51bUNoYXJhY3RlcnNUb1N0b3JlICsgMTsK
LSAgICAvLyBtYWtlIHN1cmUgVVN0cmluZyBkb2Vzbid0IHRyeSB0byByZXVzZSB0aGUgYnVmZmVy
IGJ5IHByZXRlbmRpbmcgd2UgaGF2ZSBvbmUgbW9yZSBjaGFyYWN0ZXIgaW4gaXQKLSAgICBtX2Jh
c2UudXNlZENhcGFjaXR5ID0gbnVtQ2hhcmFjdGVyc1RvU3RvcmUgKyAxOwotICAgIG1fYmFzZS5j
YXBhY2l0eSA9IG51bUNoYXJhY3RlcnNUb1N0b3JlICsgMTsKICAgICBtX2Jhc2UuY2hlY2tDb25z
aXN0ZW5jeSgpOwogCiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUNoYXJhY3RlcnNU
b1N0b3JlOyArK2kpCiAgICAgICAgIG1fY2hhcmFjdGVyc1tpXSA9IGk7CiAKICAgICBtZW1zZXQo
Jm1fcmVwcywgMCwgc2l6ZW9mKG1fcmVwcykpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBudW1DaGFyYWN0ZXJzVG9TdG9yZTsgKytpKSB7Ci0gICAgICAgIG1fcmVwc1tpXS5vZmZzZXQg
PSBpOwotICAgICAgICBtX3JlcHNbaV0ubGVuID0gMTsKLSAgICAgICAgbV9yZXBzW2ldLnJjID0g
MTsKLSAgICAgICAgbV9yZXBzW2ldLnNldEJhc2VTdHJpbmcoJm1fYmFzZSk7Ci0gICAgICAgIG1f
cmVwc1tpXS5jaGVja0NvbnNpc3RlbmN5KCk7Ci0gICAgfQorICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBudW1DaGFyYWN0ZXJzVG9TdG9yZTsgKytpKQorICAgICAgICBuZXcgKCZtX3JlcHNb
aV0pIFVTdHJpbmc6OlJlcChtX2Jhc2UuZGF0YSgpICsgaSwgMSwgJm1fYmFzZSk7CiB9CiAKIFNt
YWxsU3RyaW5nczo6U21hbGxTdHJpbmdzKCkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3J1bnRpbWUv
VVN0cmluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvcnVudGltZS9VU3RyaW5n
LmNwcAkocmV2aXNpb24gNTIzNDYpCisrKyBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL1VTdHJpbmcu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC01Miw1MiArNTIsMTEgQEAgdXNpbmcgbmFtZXNwYWNlIFdU
RjsKIHVzaW5nIG5hbWVzcGFjZSBXVEY6OlVuaWNvZGU7CiB1c2luZyBuYW1lc3BhY2Ugc3RkOwog
Ci0vLyBUaGlzIGNhbiBiZSB0dW5lZCBkaWZmZXJlbnRseSBwZXIgcGxhdGZvcm0gYnkgcHV0dGlu
ZyBwbGF0Zm9ybSAjaWZzIHJpZ2h0IGhlcmUuCi0vLyBJZiB5b3UgZG9uJ3QgZGVmaW5lIHRoaXMg
bWFjcm8gYXQgYWxsLCB0aGVuIGNvcHlDaGFycyB3aWxsIGp1c3QgY2FsbCBkaXJlY3RseQotLy8g
dG8gbWVtY3B5LgotI2RlZmluZSBVU1RSSU5HX0NPUFlfQ0hBUlNfSU5MSU5FX0NVVE9GRiAyMAot
CiBuYW1lc3BhY2UgSlNDIHsKICAKIGV4dGVybiBjb25zdCBkb3VibGUgTmFOOwogZXh0ZXJuIGNv
bnN0IGRvdWJsZSBJbmY7CiAKLS8vIFRoaXMgbnVtYmVyIG11c3QgYmUgYXQgbGVhc3QgMiB0byBh
dm9pZCBzaGFyaW5nIGVtcHR5LCBudWxsIGFzIHdlbGwgYXMgMSBjaGFyYWN0ZXIgc3RyaW5ncyBm
cm9tIFNtYWxsU3RyaW5ncy4KLXN0YXRpYyBjb25zdCBpbnQgbWluTGVuZ3RoVG9TaGFyZSA9IDEw
OwotCi1zdGF0aWMgaW5saW5lIHNpemVfdCBvdmVyZmxvd0luZGljYXRvcigpIHsgcmV0dXJuIHN0
ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCk7IH0KLXN0YXRpYyBpbmxpbmUgc2l6ZV90
IG1heFVDaGFycygpIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkg
LyBzaXplb2YoVUNoYXIpOyB9Ci0KLXN0YXRpYyBpbmxpbmUgUG9zc2libHlOdWxsPFVDaGFyKj4g
YWxsb2NDaGFycyhzaXplX3QgbGVuZ3RoKQotewotICAgIEFTU0VSVChsZW5ndGgpOwotICAgIGlm
IChsZW5ndGggPiBtYXhVQ2hhcnMoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHRy
eUZhc3RNYWxsb2Moc2l6ZW9mKFVDaGFyKSAqIGxlbmd0aCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUg
UG9zc2libHlOdWxsPFVDaGFyKj4gcmVhbGxvY0NoYXJzKFVDaGFyKiBidWZmZXIsIHNpemVfdCBs
ZW5ndGgpCi17Ci0gICAgQVNTRVJUKGxlbmd0aCk7Ci0gICAgaWYgKGxlbmd0aCA+IG1heFVDaGFy
cygpKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gdHJ5RmFzdFJlYWxsb2MoYnVmZmVy
LCBzaXplb2YoVUNoYXIpICogbGVuZ3RoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNvcHlD
aGFycyhVQ2hhciogZGVzdGluYXRpb24sIGNvbnN0IFVDaGFyKiBzb3VyY2UsIHVuc2lnbmVkIG51
bUNoYXJhY3RlcnMpCi17Ci0jaWZkZWYgVVNUUklOR19DT1BZX0NIQVJTX0lOTElORV9DVVRPRkYK
LSAgICBpZiAobnVtQ2hhcmFjdGVycyA8PSBVU1RSSU5HX0NPUFlfQ0hBUlNfSU5MSU5FX0NVVE9G
RikgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtQ2hhcmFjdGVyczsgKytp
KQotICAgICAgICAgICAgZGVzdGluYXRpb25baV0gPSBzb3VyY2VbaV07Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0jZW5kaWYKLSAgICBtZW1jcHkoZGVzdGluYXRpb24sIHNvdXJjZSwgbnVtQ2hh
cmFjdGVycyAqIHNpemVvZihVQ2hhcikpOwotfQotCi1DT01QSUxFX0FTU0VSVChzaXplb2YoVUNo
YXIpID09IDIsIHVjaGFyX2lzXzJfYnl0ZXMpOwotCiBDU3RyaW5nOjpDU3RyaW5nKGNvbnN0IGNo
YXIqIGMpCiAgICAgOiBtX2xlbmd0aChzdHJsZW4oYykpCiAgICAgLCBtX2RhdGEobmV3IGNoYXJb
bV9sZW5ndGggKyAxXSkKQEAgLTE5MCwzNzEgKzE0OSwxNyBAQCBib29sIG9wZXJhdG9yPT0oY29u
c3QgQ1N0cmluZyYgYzEsIGNvbnN0CiAvLyBUaGVzZSBzdGF0aWMgc3RyaW5ncyBhcmUgaW1tdXRh
YmxlLCBleGNlcHQgZm9yIHJjLCB3aG9zZSBpbml0aWFsIHZhbHVlIGlzIGNob3NlbiB0byAKIC8v
IHJlZHVjZSB0aGUgcG9zc2liaWxpdHkgb2YgaXQgYmVjb21pbmcgemVybyBkdWUgdG8gcmVmL2Rl
cmVmIG5vdCBiZWluZyB0aHJlYWQtc2FmZS4KIHN0YXRpYyBVQ2hhciBzaGFyZWRFbXB0eUNoYXI7
Ci1VU3RyaW5nOjpCYXNlU3RyaW5nKiBVU3RyaW5nOjpSZXA6Om51bGxCYXNlU3RyaW5nOwotVVN0
cmluZzo6QmFzZVN0cmluZyogVVN0cmluZzo6UmVwOjplbXB0eUJhc2VTdHJpbmc7CitVU3RyaW5n
SW1wbCogVVN0cmluZ0ltcGw6OnNfbnVsbDsKK1VTdHJpbmdJbXBsKiBVU3RyaW5nSW1wbDo6c19l
bXB0eTsKIFVTdHJpbmcqIFVTdHJpbmc6Om51bGxVU3RyaW5nOwogCi1zdGF0aWMgdm9pZCBpbml0
aWFsaXplU3RhdGljQmFzZVN0cmluZyhVU3RyaW5nOjpCYXNlU3RyaW5nJiBiYXNlKQotewotICAg
IGJhc2UucmMgPSBJTlRfTUFYIC8gMjsKLSAgICBiYXNlLm1faWRlbnRpZmllclRhYmxlQW5kRmxh
Z3Muc2V0RmxhZyhVU3RyaW5nOjpSZXA6OlN0YXRpY0ZsYWcpOwotICAgIGJhc2UuY2hlY2tDb25z
aXN0ZW5jeSgpOwotfQotCiB2b2lkIGluaXRpYWxpemVVU3RyaW5nKCkKIHsKLSAgICBVU3RyaW5n
OjpSZXA6Om51bGxCYXNlU3RyaW5nID0gbmV3IFVTdHJpbmc6OkJhc2VTdHJpbmcoMCwgMCk7Ci0g
ICAgaW5pdGlhbGl6ZVN0YXRpY0Jhc2VTdHJpbmcoKlVTdHJpbmc6OlJlcDo6bnVsbEJhc2VTdHJp
bmcpOwotCi0gICAgVVN0cmluZzo6UmVwOjplbXB0eUJhc2VTdHJpbmcgPSBuZXcgVVN0cmluZzo6
QmFzZVN0cmluZygmc2hhcmVkRW1wdHlDaGFyLCAwKTsKLSAgICBpbml0aWFsaXplU3RhdGljQmFz
ZVN0cmluZygqVVN0cmluZzo6UmVwOjplbXB0eUJhc2VTdHJpbmcpOwotCisgICAgVVN0cmluZ0lt
cGw6OnNfbnVsbCA9IG5ldyBVU3RyaW5nSW1wbCgwLCAwLCBVU3RyaW5nSW1wbDo6Q29uc3RydWN0
U3RhdGljU3RyaW5nKTsKKyAgICBVU3RyaW5nSW1wbDo6c19lbXB0eSA9IG5ldyBVU3RyaW5nSW1w
bCgmc2hhcmVkRW1wdHlDaGFyLCAwLCBVU3RyaW5nSW1wbDo6Q29uc3RydWN0U3RhdGljU3RyaW5n
KTsKICAgICBVU3RyaW5nOjpudWxsVVN0cmluZyA9IG5ldyBVU3RyaW5nOwogfQogCi1zdGF0aWMg
Y2hhciogc3RhdEJ1ZmZlciA9IDA7IC8vIE9ubHkgdXNlZCBmb3IgZGVidWdnaW5nIHZpYSBVU3Ry
aW5nOjphc2NpaSgpLgotCi1QYXNzUmVmUHRyPFVTdHJpbmc6OlJlcD4gVVN0cmluZzo6UmVwOjpj
cmVhdGVDb3B5aW5nKGNvbnN0IFVDaGFyKiBkLCBpbnQgbCkKLXsKLSAgICBVQ2hhciogY29weUQg
PSBzdGF0aWNfY2FzdDxVQ2hhcio+KGZhc3RNYWxsb2MobCAqIHNpemVvZihVQ2hhcikpKTsKLSAg
ICBjb3B5Q2hhcnMoY29weUQsIGQsIGwpOwotICAgIHJldHVybiBjcmVhdGUoY29weUQsIGwpOwot
fQotCi1QYXNzUmVmUHRyPFVTdHJpbmc6OlJlcD4gVVN0cmluZzo6UmVwOjpjcmVhdGVGcm9tVVRG
OChjb25zdCBjaGFyKiBzdHJpbmcpCi17Ci0gICAgaWYgKCFzdHJpbmcpCi0gICAgICAgIHJldHVy
biAmVVN0cmluZzo6UmVwOjpudWxsKCk7Ci0KLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHN0
cmluZyk7Ci0gICAgVmVjdG9yPFVDaGFyLCAxMDI0PiBidWZmZXIobGVuZ3RoKTsKLSAgICBVQ2hh
ciogcCA9IGJ1ZmZlci5kYXRhKCk7Ci0gICAgaWYgKGNvbnZlcnNpb25PSyAhPSBjb252ZXJ0VVRG
OFRvVVRGMTYoJnN0cmluZywgc3RyaW5nICsgbGVuZ3RoLCAmcCwgcCArIGxlbmd0aCkpCi0gICAg
ICAgIHJldHVybiAmVVN0cmluZzo6UmVwOjpudWxsKCk7Ci0KLSAgICByZXR1cm4gVVN0cmluZzo6
UmVwOjpjcmVhdGVDb3B5aW5nKGJ1ZmZlci5kYXRhKCksIHAgLSBidWZmZXIuZGF0YSgpKTsKLX0K
LQotUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IFVTdHJpbmc6OlJlcDo6Y3JlYXRlKFVDaGFyKiBz
dHJpbmcsIGludCBsZW5ndGgsIFBhc3NSZWZQdHI8VVN0cmluZzo6U2hhcmVkVUNoYXI+IHNoYXJl
ZEJ1ZmZlcikKLXsKLSAgICBQYXNzUmVmUHRyPFVTdHJpbmc6OlJlcD4gcmVwID0gY3JlYXRlKHN0
cmluZywgbGVuZ3RoKTsKLSAgICByZXAtPmJhc2VTdHJpbmcoKS0+c2V0U2hhcmVkQnVmZmVyKHNo
YXJlZEJ1ZmZlcik7Ci0gICAgcmVwLT5jaGVja0NvbnNpc3RlbmN5KCk7Ci0gICAgcmV0dXJuIHJl
cDsKLX0KLQotVVN0cmluZzo6U2hhcmVkVUNoYXIqIFVTdHJpbmc6OlJlcDo6c2hhcmVkQnVmZmVy
KCkKLXsKLSAgICBVU3RyaW5nOjpCYXNlU3RyaW5nKiBiYXNlID0gYmFzZVN0cmluZygpOwotICAg
IGlmIChsZW4gPCBtaW5MZW5ndGhUb1NoYXJlKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJl
dHVybiBiYXNlLT5zaGFyZWRCdWZmZXIoKTsKLX0KLQotdm9pZCBVU3RyaW5nOjpSZXA6OmRlc3Ry
b3koKQotewotICAgIGNoZWNrQ29uc2lzdGVuY3koKTsKLQotICAgIC8vIFN0YXRpYyBudWxsIGFu
ZCBlbXB0eSBzdHJpbmdzIGNhbiBuZXZlciBiZSBkZXN0cm95ZWQsIGJ1dCB3ZSBjYW5ub3QgcmVs
eSBvbiAKLSAgICAvLyByZWZlcmVuY2UgY291bnRpbmcsIGJlY2F1c2UgcmVmL2RlcmVmIGFyZSBu
b3QgdGhyZWFkLXNhZmUuCi0gICAgaWYgKCFpc1N0YXRpYygpKSB7Ci0gICAgICAgIGlmIChpZGVu
dGlmaWVyVGFibGUoKSkKLSAgICAgICAgICAgIElkZW50aWZpZXI6OnJlbW92ZSh0aGlzKTsKLQot
ICAgICAgICBVU3RyaW5nOjpCYXNlU3RyaW5nKiBiYXNlID0gYmFzZVN0cmluZygpOwotICAgICAg
ICBpZiAoYmFzZSA9PSB0aGlzKSB7Ci0gICAgICAgICAgICBpZiAobV9zaGFyZWRCdWZmZXIpCi0g
ICAgICAgICAgICAgICAgbV9zaGFyZWRCdWZmZXItPmRlcmVmKCk7Ci0gICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgZmFzdEZyZWUoYmFzZS0+YnVmKTsKLSAgICAgICAgfSBlbHNlCi0g
ICAgICAgICAgICBiYXNlLT5kZXJlZigpOwotCi0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgIH0K
LX0KLQotLy8gR29sZGVuIHJhdGlvIC0gYXJiaXRyYXJ5IHN0YXJ0IHZhbHVlIHRvIGF2b2lkIG1h
cHBpbmcgYWxsIDAncyB0byBhbGwgMCdzCi0vLyBvciBhbnl0aGluZyBsaWtlIHRoYXQuCi1jb25z
dCB1bnNpZ25lZCBQSEkgPSAweDllMzc3OWI5VTsKLQotLy8gUGF1bCBIc2llaCdzIFN1cGVyRmFz
dEhhc2gKLS8vIGh0dHA6Ly93d3cuYXppbGxpb25tb25rZXlzLmNvbS9xZWQvaGFzaC5odG1sCi11
bnNpZ25lZCBVU3RyaW5nOjpSZXA6OmNvbXB1dGVIYXNoKGNvbnN0IFVDaGFyKiBzLCBpbnQgbGVu
KQotewotICAgIHVuc2lnbmVkIGwgPSBsZW47Ci0gICAgdWludDMyX3QgaGFzaCA9IFBISTsKLSAg
ICB1aW50MzJfdCB0bXA7Ci0KLSAgICBpbnQgcmVtID0gbCAmIDE7Ci0gICAgbCA+Pj0gMTsKLQot
ICAgIC8vIE1haW4gbG9vcAotICAgIGZvciAoOyBsID4gMDsgbC0tKSB7Ci0gICAgICAgIGhhc2gg
Kz0gc1swXTsKLSAgICAgICAgdG1wID0gKHNbMV0gPDwgMTEpIF4gaGFzaDsKLSAgICAgICAgaGFz
aCA9IChoYXNoIDw8IDE2KSBeIHRtcDsKLSAgICAgICAgcyArPSAyOwotICAgICAgICBoYXNoICs9
IGhhc2ggPj4gMTE7Ci0gICAgfQotCi0gICAgLy8gSGFuZGxlIGVuZCBjYXNlCi0gICAgaWYgKHJl
bSkgewotICAgICAgICBoYXNoICs9IHNbMF07Ci0gICAgICAgIGhhc2ggXj0gaGFzaCA8PCAxMTsK
LSAgICAgICAgaGFzaCArPSBoYXNoID4+IDE3OwotICAgIH0KLQotICAgIC8vIEZvcmNlICJhdmFs
YW5jaGluZyIgb2YgZmluYWwgMTI3IGJpdHMKLSAgICBoYXNoIF49IGhhc2ggPDwgMzsKLSAgICBo
YXNoICs9IGhhc2ggPj4gNTsKLSAgICBoYXNoIF49IGhhc2ggPDwgMjsKLSAgICBoYXNoICs9IGhh
c2ggPj4gMTU7Ci0gICAgaGFzaCBePSBoYXNoIDw8IDEwOwotCi0gICAgLy8gdGhpcyBhdm9pZHMg
ZXZlciByZXR1cm5pbmcgYSBoYXNoIGNvZGUgb2YgMCwgc2luY2UgdGhhdCBpcyB1c2VkIHRvCi0g
ICAgLy8gc2lnbmFsICJoYXNoIG5vdCBjb21wdXRlZCB5ZXQiLCB1c2luZyBhIHZhbHVlIHRoYXQg
aXMgbGlrZWx5IHRvIGJlCi0gICAgLy8gZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgMCB3aGVuIHRo
ZSBsb3cgYml0cyBhcmUgbWFza2VkCi0gICAgaWYgKGhhc2ggPT0gMCkKLSAgICAgICAgaGFzaCA9
IDB4ODAwMDAwMDA7Ci0KLSAgICByZXR1cm4gaGFzaDsKLX0KLQotLy8gUGF1bCBIc2llaCdzIFN1
cGVyRmFzdEhhc2gKLS8vIGh0dHA6Ly93d3cuYXppbGxpb25tb25rZXlzLmNvbS9xZWQvaGFzaC5o
dG1sCi11bnNpZ25lZCBVU3RyaW5nOjpSZXA6OmNvbXB1dGVIYXNoKGNvbnN0IGNoYXIqIHMsIGlu
dCBsKQotewotICAgIC8vIFRoaXMgaGFzaCBpcyBkZXNpZ25lZCB0byB3b3JrIG9uIDE2LWJpdCBj
aHVua3MgYXQgYSB0aW1lLiBCdXQgc2luY2UgdGhlIG5vcm1hbCBjYXNlCi0gICAgLy8gKGFib3Zl
KSBpcyB0byBoYXNoIFVURi0xNiBjaGFyYWN0ZXJzLCB3ZSBqdXN0IHRyZWF0IHRoZSA4LWJpdCBj
aGFycyBhcyBpZiB0aGV5Ci0gICAgLy8gd2VyZSAxNi1iaXQgY2h1bmtzLCB3aGljaCBzaG91bGQg
Z2l2ZSBtYXRjaGluZyByZXN1bHRzCi0KLSAgICB1aW50MzJfdCBoYXNoID0gUEhJOwotICAgIHVp
bnQzMl90IHRtcDsKLQotICAgIHNpemVfdCByZW0gPSBsICYgMTsKLSAgICBsID4+PSAxOwotCi0g
ICAgLy8gTWFpbiBsb29wCi0gICAgZm9yICg7IGwgPiAwOyBsLS0pIHsKLSAgICAgICAgaGFzaCAr
PSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihzWzBdKTsKLSAgICAgICAgdG1wID0gKHN0YXRp
Y19jYXN0PHVuc2lnbmVkIGNoYXI+KHNbMV0pIDw8IDExKSBeIGhhc2g7Ci0gICAgICAgIGhhc2gg
PSAoaGFzaCA8PCAxNikgXiB0bXA7Ci0gICAgICAgIHMgKz0gMjsKLSAgICAgICAgaGFzaCArPSBo
YXNoID4+IDExOwotICAgIH0KLQotICAgIC8vIEhhbmRsZSBlbmQgY2FzZQotICAgIGlmIChyZW0p
IHsKLSAgICAgICAgaGFzaCArPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihzWzBdKTsKLSAg
ICAgICAgaGFzaCBePSBoYXNoIDw8IDExOwotICAgICAgICBoYXNoICs9IGhhc2ggPj4gMTc7Ci0g
ICAgfQotCi0gICAgLy8gRm9yY2UgImF2YWxhbmNoaW5nIiBvZiBmaW5hbCAxMjcgYml0cwotICAg
IGhhc2ggXj0gaGFzaCA8PCAzOwotICAgIGhhc2ggKz0gaGFzaCA+PiA1OwotICAgIGhhc2ggXj0g
aGFzaCA8PCAyOwotICAgIGhhc2ggKz0gaGFzaCA+PiAxNTsKLSAgICBoYXNoIF49IGhhc2ggPDwg
MTA7Ci0KLSAgICAvLyB0aGlzIGF2b2lkcyBldmVyIHJldHVybmluZyBhIGhhc2ggY29kZSBvZiAw
LCBzaW5jZSB0aGF0IGlzIHVzZWQgdG8KLSAgICAvLyBzaWduYWwgImhhc2ggbm90IGNvbXB1dGVk
IHlldCIsIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyBsaWtlbHkgdG8gYmUKLSAgICAvLyBlZmZlY3Rp
dmVseSB0aGUgc2FtZSBhcyAwIHdoZW4gdGhlIGxvdyBiaXRzIGFyZSBtYXNrZWQKLSAgICBpZiAo
aGFzaCA9PSAwKQotICAgICAgICBoYXNoID0gMHg4MDAwMDAwMDsKLQotICAgIHJldHVybiBoYXNo
OwotfQotCi0jaWZuZGVmIE5ERUJVRwotdm9pZCBVU3RyaW5nOjpSZXA6OmNoZWNrQ29uc2lzdGVu
Y3koKSBjb25zdAotewotICAgIGNvbnN0IFVTdHJpbmc6OkJhc2VTdHJpbmcqIGJhc2UgPSBiYXNl
U3RyaW5nKCk7Ci0KLSAgICAvLyBUaGVyZSBpcyBubyByZWN1cnNpb24gZm9yIGJhc2Ugc3RyaW5n
cy4KLSAgICBBU1NFUlQoYmFzZSA9PSBiYXNlLT5iYXNlU3RyaW5nKCkpOwotCi0gICAgaWYgKGlz
U3RhdGljKCkpIHsKLSAgICAgICAgLy8gVGhlcmUgYXJlIG9ubHkgdHdvIHN0YXRpYyBzdHJpbmdz
OiBudWxsIGFuZCBlbXB0eS4KLSAgICAgICAgQVNTRVJUKCFsZW4pOwotCi0gICAgICAgIC8vIFN0
YXRpYyBzdHJpbmdzIGNhbm5vdCBnZXQgaW4gaWRlbnRpZmllciB0YWJsZXMsIGJlY2F1c2UgdGhl
eSBhcmUgZ2xvYmFsbHkgc2hhcmVkLgotICAgICAgICBBU1NFUlQoIWlkZW50aWZpZXJUYWJsZSgp
KTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgc3RyaW5nIGZpdHMgaW4gYnVmZmVyLgotICAgIEFTU0VS
VChiYXNlLT51c2VkUHJlQ2FwYWNpdHkgPD0gYmFzZS0+cHJlQ2FwYWNpdHkpOwotICAgIEFTU0VS
VChiYXNlLT51c2VkQ2FwYWNpdHkgPD0gYmFzZS0+Y2FwYWNpdHkpOwotICAgIEFTU0VSVCgtb2Zm
c2V0IDw9IGJhc2UtPnVzZWRQcmVDYXBhY2l0eSk7Ci0gICAgQVNTRVJUKG9mZnNldCArIGxlbiA8
PSBiYXNlLT51c2VkQ2FwYWNpdHkpOwotfQotI2VuZGlmCi0KLVVTdHJpbmc6OlNoYXJlZFVDaGFy
KiBVU3RyaW5nOjpCYXNlU3RyaW5nOjpzaGFyZWRCdWZmZXIoKQotewotICAgIGlmICghbV9zaGFy
ZWRCdWZmZXIpCi0gICAgICAgIHNldFNoYXJlZEJ1ZmZlcihTaGFyZWRVQ2hhcjo6Y3JlYXRlKG5l
dyBPd25GYXN0TWFsbG9jUHRyPFVDaGFyPihidWYpKSk7Ci0gICAgcmV0dXJuIG1fc2hhcmVkQnVm
ZmVyOwotfQotCi12b2lkIFVTdHJpbmc6OkJhc2VTdHJpbmc6OnNldFNoYXJlZEJ1ZmZlcihQYXNz
UmVmUHRyPFVTdHJpbmc6OlNoYXJlZFVDaGFyPiBzaGFyZWRCdWZmZXIpCi17Ci0gICAgLy8gVGhl
IG1hbnVhbCBzdGVwcyBiZWxvdyBhcmUgYmVjYXVzZSBtX3NoYXJlZEJ1ZmZlciBjYW4ndCBiZSBh
IFJlZlB0ci4gbV9zaGFyZWRCdWZmZXIKLSAgICAvLyBpcyBpbiBhIHVuaW9uIHdpdGggYW5vdGhl
ciB2YXJpYWJsZSB0byBhdm9pZCBtYWtpbmcgQmFzZVN0cmluZyBhbnkgbGFyZ2VyLgotICAgIGlm
IChtX3NoYXJlZEJ1ZmZlcikKLSAgICAgICAgbV9zaGFyZWRCdWZmZXItPmRlcmVmKCk7Ci0gICAg
bV9zaGFyZWRCdWZmZXIgPSBzaGFyZWRCdWZmZXIucmVsZWFzZVJlZigpOwotfQotCi1ib29sIFVT
dHJpbmc6OkJhc2VTdHJpbmc6OnNsb3dJc0J1ZmZlclJlYWRPbmx5KCkKLXsKLSAgICAvLyBUaGUg
YnVmZmVyIG1heSBub3QgYmUgbW9kaWZpZWQgYXMgc29vbiBhcyB0aGUgdW5kZXJseWluZyBkYXRh
IGhhcyBiZWVuIHNoYXJlZCB3aXRoIGFub3RoZXIgY2xhc3MuCi0gICAgaWYgKG1fc2hhcmVkQnVm
ZmVyLT5pc1NoYXJlZCgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIEF0IHRoaXMg
cG9pbnQsIHdlIGtub3cgaXQgdGhhdCB0aGUgdW5kZXJseWluZyBidWZmZXIgaXNuJ3Qgc2hhcmVk
IG91dHNpZGUgb2YgdGhpcyBiYXNlIGNsYXNzLAotICAgIC8vIHNvIGdldCByaWQgb2YgbV9zaGFy
ZWRCdWZmZXIuCi0gICAgT3duUHRyPE93bkZhc3RNYWxsb2NQdHI8VUNoYXI+ID4gbWFsbG9jUHRy
KG1fc2hhcmVkQnVmZmVyLT5yZWxlYXNlKCkpOwotICAgIFVDaGFyKiB1bnNoYXJlZEJ1ZiA9IGNv
bnN0X2Nhc3Q8VUNoYXIqPihtYWxsb2NQdHItPnJlbGVhc2UoKSk7Ci0gICAgc2V0U2hhcmVkQnVm
ZmVyKDApOwotICAgIHByZUNhcGFjaXR5ICs9IChidWYgLSB1bnNoYXJlZEJ1Zik7Ci0gICAgYnVm
ID0gdW5zaGFyZWRCdWY7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBQdXQgdGhlc2UgZWFy
bHkgc28gdGhleSBjYW4gYmUgaW5saW5lZC4KLXN0YXRpYyBpbmxpbmUgc2l6ZV90IGV4cGFuZGVk
U2l6ZShzaXplX3QgY2FwYWNpdHlTaXplLCBzaXplX3QgcHJlY2FwYWNpdHlTaXplKQotewotICAg
IC8vIENvbWJpbmUgY2FwYWNpdHlTaXplICYgcHJlY2FwYWNpdHlTaXplIHRvIHByb2R1Y2UgYSBz
aW5nbGUgc2l6ZSB0byBhbGxvY2F0ZSwKLSAgICAvLyBjaGVjayB0aGF0IGRvaW5nIHNvIGRvZXMg
bm90IHJlc3VsdCBpbiBvdmVyZmxvdy4KLSAgICBzaXplX3Qgc2l6ZSA9IGNhcGFjaXR5U2l6ZSAr
IHByZWNhcGFjaXR5U2l6ZTsKLSAgICBpZiAoc2l6ZSA8IGNhcGFjaXR5U2l6ZSkKLSAgICAgICAg
cmV0dXJuIG92ZXJmbG93SW5kaWNhdG9yKCk7Ci0KLSAgICAvLyBTbWFsbCBTdHJpbmdzICh1cCB0
byA0IHBhZ2VzKToKLSAgICAvLyBFeHBhbmQgdGhlIGFsbG9jYXRpb24gc2l6ZSB0byAxMTIuNSUg
b2YgdGhlIGFtb3VudCByZXF1ZXN0ZWQuICBUaGlzIGlzIGxhcmdlbHkgc2lja2luZwotICAgIC8v
IHRvIG91ciBwcmV2aW91cyBwb2xpY3ksIGhvd2V2ZXIgMTEyLjUlIGlzIGNoZWFwZXIgdG8gY2Fs
Y3VsYXRlLgotICAgIGlmIChzaXplIDwgMHg0MDAwKSB7Ci0gICAgICAgIHNpemVfdCBleHBhbmRl
ZFNpemUgPSAoKHNpemUgKyAoc2l6ZSA+PiAzKSkgfCAxNSkgKyAxOwotICAgICAgICAvLyBHaXZl
biB0aGUgbGltaXRlZCByYW5nZSB3aXRoaW4gd2hpY2ggd2UgY2FsY3VsYXRlIHRoZSBleHBhbnNp
b24gaW4gdGhpcwotICAgICAgICAvLyBmYXNoaW9uIHRoZSBhYm92ZSBjYWxjdWxhdGlvbiBzaG91
bGQgbmV2ZXIgb3ZlcmZsb3cuCi0gICAgICAgIEFTU0VSVChleHBhbmRlZFNpemUgPj0gc2l6ZSk7
Ci0gICAgICAgIEFTU0VSVChleHBhbmRlZFNpemUgPCBtYXhVQ2hhcnMoKSk7Ci0gICAgICAgIHJl
dHVybiBleHBhbmRlZFNpemU7Ci0gICAgfQotCi0gICAgLy8gTWVkaXVtIFN0cmluZ3MgKHVwIHRv
IDEyOCBwYWdlcyk6Ci0gICAgLy8gRm9yIHBhZ2VzIGNvdmVyaW5nIG11bHRpcGxlIHBhZ2VzIG92
ZXItYWxsb2NhdGlvbiBpcyBsZXNzIG9mIGEgY29uY2VybiAtIGFueSB1bnVzZWQKLSAgICAvLyBz
cGFjZSB3aWxsIG5vdCBiZSBwYWdlZCBpbiBpZiBpdCBpcyBub3QgdXNlZCwgc28gdGhpcyBpcyBw
dXJlbHkgYSBWTSBvdmVyaGVhZC4gIEZvcgotICAgIC8vIHRoZXNlIHN0cmluZ3MgYWxsb2NhdGUg
MnggdGhlIHJlcXVlc3RlZCBzaXplLgotICAgIGlmIChzaXplIDwgMHg4MDAwMCkgewotICAgICAg
ICBzaXplX3QgZXhwYW5kZWRTaXplID0gKChzaXplICsgc2l6ZSkgfCAweGZmZikgKyAxOwotICAg
ICAgICAvLyBHaXZlbiB0aGUgbGltaXRlZCByYW5nZSB3aXRoaW4gd2hpY2ggd2UgY2FsY3VsYXRl
IHRoZSBleHBhbnNpb24gaW4gdGhpcwotICAgICAgICAvLyBmYXNoaW9uIHRoZSBhYm92ZSBjYWxj
dWxhdGlvbiBzaG91bGQgbmV2ZXIgb3ZlcmZsb3cuCi0gICAgICAgIEFTU0VSVChleHBhbmRlZFNp
emUgPj0gc2l6ZSk7Ci0gICAgICAgIEFTU0VSVChleHBhbmRlZFNpemUgPCBtYXhVQ2hhcnMoKSk7
Ci0gICAgICAgIHJldHVybiBleHBhbmRlZFNpemU7Ci0gICAgfQotCi0gICAgLy8gTGFyZ2UgU3Ry
aW5ncyAodG8gaW5maW5pdHkgYW5kIGJleW9uZCEpOgotICAgIC8vIFJldmVydCB0byBvdXIgMTEy
LjUlIHBvbGljeSAtIHByb2JhYmx5IGJlc3QgdG8gbGltaXQgdGhlIGFtb3VudCBvZiB1bnVzZWQg
Vk0gd2UgYWxsb3cKLSAgICAvLyBhbnkgaW5kaXZpZHVhbCBzdHJpbmcgYmUgcmVzcG9uc2libGUg
Zm9yLgotICAgIHNpemVfdCBleHBhbmRlZFNpemUgPSAoKHNpemUgKyAoc2l6ZSA+PiAzKSkgfCAw
eGZmZikgKyAxOwotCi0gICAgLy8gQ2hlY2sgZm9yIG92ZXJmbG93IC0gYW55IHJlc3VsdCB0aGF0
IGlzIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHJlcXVlc3RlZCAoYnV0Ci0gICAgLy8gc3RpbGwgYmVs
b3cgdGhlIGxpbWl0KSBpcyBva2F5LgotICAgIGlmICgoZXhwYW5kZWRTaXplID49IHNpemUpICYm
IChleHBhbmRlZFNpemUgPCBtYXhVQ2hhcnMoKSkpCi0gICAgICAgIHJldHVybiBleHBhbmRlZFNp
emU7Ci0gICAgcmV0dXJuIG92ZXJmbG93SW5kaWNhdG9yKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUg
Ym9vbCBleHBhbmRDYXBhY2l0eShVU3RyaW5nOjpSZXAqIHJlcCwgaW50IHJlcXVpcmVkTGVuZ3Ro
KQotewotICAgIHJlcC0+Y2hlY2tDb25zaXN0ZW5jeSgpOwotICAgIEFTU0VSVCghcmVwLT5iYXNl
U3RyaW5nKCktPmlzQnVmZmVyUmVhZE9ubHkoKSk7Ci0KLSAgICBVU3RyaW5nOjpCYXNlU3RyaW5n
KiBiYXNlID0gcmVwLT5iYXNlU3RyaW5nKCk7Ci0KLSAgICBpZiAocmVxdWlyZWRMZW5ndGggPiBi
YXNlLT5jYXBhY2l0eSkgewotICAgICAgICBzaXplX3QgbmV3Q2FwYWNpdHkgPSBleHBhbmRlZFNp
emUocmVxdWlyZWRMZW5ndGgsIGJhc2UtPnByZUNhcGFjaXR5KTsKLSAgICAgICAgVUNoYXIqIG9s
ZEJ1ZiA9IGJhc2UtPmJ1ZjsKLSAgICAgICAgaWYgKCFyZWFsbG9jQ2hhcnMoYmFzZS0+YnVmLCBu
ZXdDYXBhY2l0eSkuZ2V0VmFsdWUoYmFzZS0+YnVmKSkgewotICAgICAgICAgICAgYmFzZS0+YnVm
ID0gb2xkQnVmOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAg
IGJhc2UtPmNhcGFjaXR5ID0gbmV3Q2FwYWNpdHkgLSBiYXNlLT5wcmVDYXBhY2l0eTsKLSAgICB9
Ci0gICAgaWYgKHJlcXVpcmVkTGVuZ3RoID4gYmFzZS0+dXNlZENhcGFjaXR5KQotICAgICAgICBi
YXNlLT51c2VkQ2FwYWNpdHkgPSByZXF1aXJlZExlbmd0aDsKLQotICAgIHJlcC0+Y2hlY2tDb25z
aXN0ZW5jeSgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFVTdHJpbmc6OlJlcDo6cmVz
ZXJ2ZUNhcGFjaXR5KGludCBjYXBhY2l0eSkKLXsKLSAgICAvLyBJZiB0aGlzIGlzIGFuIGVtcHR5
IHN0cmluZyB0aGVyZSBpcyBubyBwb2ludCAnZ3Jvd2luZycgaXQgLSBqdXN0IGFsbG9jYXRlIGEg
bmV3IG9uZS4KLSAgICAvLyBJZiB0aGUgQmFzZVN0cmluZyBpcyBzaGFyZWQgd2l0aCBhbm90aGVy
IHN0cmluZyB0aGF0IGlzIHVzaW5nIG1vcmUgY2FwYWNpdHkgdGhhbiB0aGlzCi0gICAgLy8gc3Ry
aW5nIGlzLCB0aGVuIGdyb3dpbmcgdGhlIGJ1ZmZlciB3b24ndCBoZWxwLgotICAgIC8vIElmIHRo
ZSBCYXNlU3RyaW5nJ3MgYnVmZmVyIGlzIHJlYWRvbmx5LCB0aGVuIGl0IGlzbid0IGFsbG93ZWQg
dG8gZ3Jvdy4KLSAgICBVU3RyaW5nOjpCYXNlU3RyaW5nKiBiYXNlID0gYmFzZVN0cmluZygpOwot
ICAgIGlmICghYmFzZS0+YnVmIHx8ICFiYXNlLT5jYXBhY2l0eSB8fCAob2Zmc2V0ICsgbGVuKSAh
PSBiYXNlLT51c2VkQ2FwYWNpdHkgfHwgYmFzZS0+aXNCdWZmZXJSZWFkT25seSgpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBzdWZmaWNp
ZW50IGNhcGFjaXR5LCBubyBuZWVkIHRvIGdyb3chCi0gICAgaWYgKGNhcGFjaXR5IDw9IGJhc2Ut
PmNhcGFjaXR5KQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNoZWNrQ29uc2lzdGVuY3ko
KTsKLQotICAgIHNpemVfdCBuZXdDYXBhY2l0eSA9IGV4cGFuZGVkU2l6ZShjYXBhY2l0eSwgYmFz
ZS0+cHJlQ2FwYWNpdHkpOwotICAgIFVDaGFyKiBvbGRCdWYgPSBiYXNlLT5idWY7Ci0gICAgaWYg
KCFyZWFsbG9jQ2hhcnMoYmFzZS0+YnVmLCBuZXdDYXBhY2l0eSkuZ2V0VmFsdWUoYmFzZS0+YnVm
KSkgewotICAgICAgICBiYXNlLT5idWYgPSBvbGRCdWY7Ci0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICB9Ci0gICAgYmFzZS0+Y2FwYWNpdHkgPSBuZXdDYXBhY2l0eSAtIGJhc2UtPnByZUNhcGFj
aXR5OwotCi0gICAgY2hlY2tDb25zaXN0ZW5jeSgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12
b2lkIFVTdHJpbmc6OmV4cGFuZENhcGFjaXR5KGludCByZXF1aXJlZExlbmd0aCkKLXsKLSAgICBp
ZiAoIUpTQzo6ZXhwYW5kQ2FwYWNpdHkobV9yZXAuZ2V0KCksIHJlcXVpcmVkTGVuZ3RoKSkKLSAg
ICAgICAgbWFrZU51bGwoKTsKLX0KLQotdm9pZCBVU3RyaW5nOjpleHBhbmRQcmVDYXBhY2l0eShp
bnQgcmVxdWlyZWRQcmVDYXApCi17Ci0gICAgbV9yZXAtPmNoZWNrQ29uc2lzdGVuY3koKTsKLSAg
ICBBU1NFUlQoIW1fcmVwLT5iYXNlU3RyaW5nKCktPmlzQnVmZmVyUmVhZE9ubHkoKSk7Ci0KLSAg
ICBCYXNlU3RyaW5nKiBiYXNlID0gbV9yZXAtPmJhc2VTdHJpbmcoKTsKLQotICAgIGlmIChyZXF1
aXJlZFByZUNhcCA+IGJhc2UtPnByZUNhcGFjaXR5KSB7Ci0gICAgICAgIHNpemVfdCBuZXdDYXBh
Y2l0eSA9IGV4cGFuZGVkU2l6ZShyZXF1aXJlZFByZUNhcCwgYmFzZS0+Y2FwYWNpdHkpOwotICAg
ICAgICBpbnQgZGVsdGEgPSBuZXdDYXBhY2l0eSAtIGJhc2UtPmNhcGFjaXR5IC0gYmFzZS0+cHJl
Q2FwYWNpdHk7Ci0KLSAgICAgICAgVUNoYXIqIG5ld0J1ZjsKLSAgICAgICAgaWYgKCFhbGxvY0No
YXJzKG5ld0NhcGFjaXR5KS5nZXRWYWx1ZShuZXdCdWYpKSB7Ci0gICAgICAgICAgICBtYWtlTnVs
bCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvcHlDaGFycyhu
ZXdCdWYgKyBkZWx0YSwgYmFzZS0+YnVmLCBiYXNlLT5jYXBhY2l0eSArIGJhc2UtPnByZUNhcGFj
aXR5KTsKLSAgICAgICAgZmFzdEZyZWUoYmFzZS0+YnVmKTsKLSAgICAgICAgYmFzZS0+YnVmID0g
bmV3QnVmOwotCi0gICAgICAgIGJhc2UtPnByZUNhcGFjaXR5ID0gbmV3Q2FwYWNpdHkgLSBiYXNl
LT5jYXBhY2l0eTsKLSAgICB9Ci0gICAgaWYgKHJlcXVpcmVkUHJlQ2FwID4gYmFzZS0+dXNlZFBy
ZUNhcGFjaXR5KQotICAgICAgICBiYXNlLT51c2VkUHJlQ2FwYWNpdHkgPSByZXF1aXJlZFByZUNh
cDsKLQotICAgIG1fcmVwLT5jaGVja0NvbnNpc3RlbmN5KCk7Ci19Ci0KIHN0YXRpYyBQYXNzUmVm
UHRyPFVTdHJpbmc6OlJlcD4gY3JlYXRlUmVwKGNvbnN0IGNoYXIqIGMpCiB7CiAgICAgaWYgKCFj
KQpAQCAtNTY1LDE0ICsxNzAsMTMgQEAgc3RhdGljIFBhc3NSZWZQdHI8VVN0cmluZzo6UmVwPiBj
cmVhdGVSZQogCiAgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihjKTsKICAgICBVQ2hhciogZDsK
LSAgICBpZiAoIWFsbG9jQ2hhcnMobGVuZ3RoKS5nZXRWYWx1ZShkKSkKKyAgICBQYXNzUmVmUHRy
PFVTdHJpbmdJbXBsPiByZXN1bHQgPSBVU3RyaW5nSW1wbDo6Y3JlYXRlVW5pbml0aWFsaXplZChs
ZW5ndGgsIGQpOworICAgIGlmICghcmVzdWx0KQogICAgICAgICByZXR1cm4gJlVTdHJpbmc6OlJl
cDo6bnVsbCgpOwotICAgIGVsc2UgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxl
bmd0aDsgaSsrKQotICAgICAgICAgICAgZFtpXSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+
KGNbaV0pOyAvLyB1c2UgdW5zaWduZWQgY2hhciB0byB6ZXJvLWV4dGVuZCBpbnN0ZWFkIG9mIHNp
Z24tZXh0ZW5kCi0gICAgICAgIHJldHVybiBVU3RyaW5nOjpSZXA6OmNyZWF0ZShkLCBzdGF0aWNf
Y2FzdDxpbnQ+KGxlbmd0aCkpOwotICAgIH0KIAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
bGVuZ3RoOyBpKyspCisgICAgICAgIGRbaV0gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihj
W2ldKTsgLy8gdXNlIHVuc2lnbmVkIGNoYXIgdG8gemVyby1leHRlbmQgaW5zdGVhZCBvZiBzaWdu
LWV4dGVuZAorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgUGFzc1JlZlB0
cjxVU3RyaW5nOjpSZXA+IGNyZWF0ZVJlcChjb25zdCBjaGFyKiBjLCBpbnQgbGVuZ3RoKQpAQCAt
NTg0LDEyICsxODgsMTMgQEAgc3RhdGljIGlubGluZSBQYXNzUmVmUHRyPFVTdHJpbmc6OlJlcD4g
YwogICAgICAgICByZXR1cm4gJlVTdHJpbmc6OlJlcDo6ZW1wdHkoKTsKIAogICAgIFVDaGFyKiBk
OwotICAgIGlmICghYWxsb2NDaGFycyhsZW5ndGgpLmdldFZhbHVlKGQpKQorICAgIFBhc3NSZWZQ
dHI8VVN0cmluZ0ltcGw+IHJlc3VsdCA9IFVTdHJpbmdJbXBsOjpjcmVhdGVVbmluaXRpYWxpemVk
KGxlbmd0aCwgZCk7CisgICAgaWYgKCFyZXN1bHQpCiAgICAgICAgIHJldHVybiAmVVN0cmluZzo6
UmVwOjpudWxsKCk7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQogICAg
ICAgICBkW2ldID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY1tpXSk7IC8vIHVzZSB1bnNp
Z25lZCBjaGFyIHRvIHplcm8tZXh0ZW5kIGluc3RlYWQgb2Ygc2lnbi1leHRlbmQKLSAgICByZXR1
cm4gVVN0cmluZzo6UmVwOjpjcmVhdGUoZCwgbGVuZ3RoKTsKKyAgICByZXR1cm4gcmVzdWx0Owog
fQogCiBVU3RyaW5nOjpVU3RyaW5nKGNvbnN0IGNoYXIqIGMpCkBAIC02MTAsMTQgKzIxNSw2IEBA
IFVTdHJpbmc6OlVTdHJpbmcoY29uc3QgVUNoYXIqIGMsIGludCBsZW4KICAgICAgICAgbV9yZXAg
PSBSZXA6OmNyZWF0ZUNvcHlpbmcoYywgbGVuZ3RoKTsKIH0KIAotVVN0cmluZzo6VVN0cmluZyhj
b25zdCBWZWN0b3I8VUNoYXI+JiBidWZmZXIpCi17Ci0gICAgaWYgKCFidWZmZXIuc2l6ZSgpKQot
ICAgICAgICBtX3JlcCA9ICZSZXA6OmVtcHR5KCk7Ci0gICAgZWxzZQotICAgICAgICBtX3JlcCA9
IFJlcDo6Y3JlYXRlQ29weWluZyhidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKTsKLX0KLQog
VVN0cmluZyBVU3RyaW5nOjpjcmVhdGVOb25Db3B5aW5nKFVDaGFyKiBjLCBpbnQgbGVuZ3RoKQog
ewogICAgIGlmIChsZW5ndGggPT0gMCkKQEAgLTYyOCwzMTIgKzIyNSwyOSBAQCBVU3RyaW5nIFVT
dHJpbmc6OmNyZWF0ZU5vbkNvcHlpbmcoVUNoYXIqCiAKIFVTdHJpbmcgVVN0cmluZzo6Y3JlYXRl
RnJvbVVURjgoY29uc3QgY2hhciogc3RyaW5nKQogewotICAgIHJldHVybiBSZXA6OmNyZWF0ZUZy
b21VVEY4KHN0cmluZyk7Ci19Ci0KLXN0YXRpYyBBTFdBWVNfSU5MSU5FIGludCBuZXdDYXBhY2l0
eVdpdGhPdmVyZmxvd0NoZWNrKGNvbnN0IGludCBjdXJyZW50Q2FwYWNpdHksIGNvbnN0IGludCBl
eHRlbmRMZW5ndGgsIGNvbnN0IGJvb2wgcGx1c09uZSA9IGZhbHNlKQotewotICAgIEFTU0VSVF9X
SVRIX01FU1NBR0UoZXh0ZW5kTGVuZ3RoID49IDAsICJleHRlbmRlZExlbmd0aCA9ICVkIiwgZXh0
ZW5kTGVuZ3RoKTsKLQotICAgIGNvbnN0IGludCBwbHVzTGVuZ3RoID0gcGx1c09uZSA/IDEgOiAw
OwotICAgIGlmIChjdXJyZW50Q2FwYWNpdHkgPiBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1h
eCgpIC0gZXh0ZW5kTGVuZ3RoIC0gcGx1c0xlbmd0aCkKLSAgICAgICAgQ1JBU0goKTsKLQotICAg
IHJldHVybiBjdXJyZW50Q2FwYWNpdHkgKyBleHRlbmRMZW5ndGggKyBwbHVzTGVuZ3RoOwotfQot
Ci1zdGF0aWMgQUxXQVlTX0lOTElORSBQYXNzUmVmUHRyPFVTdHJpbmc6OlJlcD4gY29uY2F0ZW5h
dGUoUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IHIsIGNvbnN0IFVDaGFyKiB0RGF0YSwgaW50IHRT
aXplKQotewotICAgIFJlZlB0cjxVU3RyaW5nOjpSZXA+IHJlcCA9IHI7Ci0KLSAgICByZXAtPmNo
ZWNrQ29uc2lzdGVuY3koKTsKLQotICAgIGludCB0aGlzU2l6ZSA9IHJlcC0+c2l6ZSgpOwotICAg
IGludCB0aGlzT2Zmc2V0ID0gcmVwLT5vZmZzZXQ7Ci0gICAgaW50IGxlbmd0aCA9IHRoaXNTaXpl
ICsgdFNpemU7Ci0gICAgVVN0cmluZzo6QmFzZVN0cmluZyogYmFzZSA9IHJlcC0+YmFzZVN0cmlu
ZygpOwotCi0gICAgLy8gcG9zc2libGUgY2FzZXM6Ci0gICAgaWYgKHRTaXplID09IDApIHsKLSAg
ICAgICAgLy8gdCBpcyBlbXB0eQotICAgIH0gZWxzZSBpZiAodGhpc1NpemUgPT0gMCkgewotICAg
ICAgICAvLyB0aGlzIGlzIGVtcHR5Ci0gICAgICAgIHJlcCA9IFVTdHJpbmc6OlJlcDo6Y3JlYXRl
Q29weWluZyh0RGF0YSwgdFNpemUpOwotICAgIH0gZWxzZSBpZiAocmVwID09IGJhc2UgJiYgIWJh
c2UtPmlzU2hhcmVkKCkpIHsKLSAgICAgICAgLy8gdGhpcyBpcyBkaXJlY3QgYW5kIGhhcyByZWZj
b3VudCBvZiAxIChzbyB3ZSBjYW4ganVzdCBhbHRlciBpdCBkaXJlY3RseSkKLSAgICAgICAgaWYg
KCFleHBhbmRDYXBhY2l0eShyZXAuZ2V0KCksIG5ld0NhcGFjaXR5V2l0aE92ZXJmbG93Q2hlY2so
dGhpc09mZnNldCwgbGVuZ3RoKSkpCi0gICAgICAgICAgICByZXAgPSAmVVN0cmluZzo6UmVwOjpu
dWxsKCk7Ci0gICAgICAgIGlmIChyZXAtPmRhdGEoKSkgewotICAgICAgICAgICAgY29weUNoYXJz
KHJlcC0+ZGF0YSgpICsgdGhpc1NpemUsIHREYXRhLCB0U2l6ZSk7Ci0gICAgICAgICAgICByZXAt
PmxlbiA9IGxlbmd0aDsKLSAgICAgICAgICAgIHJlcC0+X2hhc2ggPSAwOwotICAgICAgICB9Ci0g
ICAgfSBlbHNlIGlmICh0aGlzT2Zmc2V0ICsgdGhpc1NpemUgPT0gYmFzZS0+dXNlZENhcGFjaXR5
ICYmIHRoaXNTaXplID49IG1pblNoYXJlU2l6ZSAmJiAhYmFzZS0+aXNCdWZmZXJSZWFkT25seSgp
KSB7Ci0gICAgICAgIC8vIHRoaXMgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBidWZmZXIgLSBleHRl
bmQgaXQgaWYgaXQncyBsb25nIGVub3VnaCB0byBhcHBlbmQgdG8KLSAgICAgICAgaWYgKCFleHBh
bmRDYXBhY2l0eShyZXAuZ2V0KCksIG5ld0NhcGFjaXR5V2l0aE92ZXJmbG93Q2hlY2sodGhpc09m
ZnNldCwgbGVuZ3RoKSkpCi0gICAgICAgICAgICByZXAgPSAmVVN0cmluZzo6UmVwOjpudWxsKCk7
Ci0gICAgICAgIGlmIChyZXAtPmRhdGEoKSkgewotICAgICAgICAgICAgY29weUNoYXJzKHJlcC0+
ZGF0YSgpICsgdGhpc1NpemUsIHREYXRhLCB0U2l6ZSk7Ci0gICAgICAgICAgICByZXAgPSBVU3Ry
aW5nOjpSZXA6OmNyZWF0ZShyZXAsIDAsIGxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2Ug
ewotICAgICAgICAvLyBUaGlzIGlzIHNoYXJlZCBpbiBzb21lIHdheSB0aGF0IHByZXZlbnRzIHVz
IGZyb20gbW9kaWZ5aW5nIGJhc2UsIHNvIHdlIG11c3QgbWFrZSBhIHdob2xlIG5ldyBzdHJpbmcu
Ci0gICAgICAgIHNpemVfdCBuZXdDYXBhY2l0eSA9IGV4cGFuZGVkU2l6ZShsZW5ndGgsIDApOwot
ICAgICAgICBVQ2hhciogZDsKLSAgICAgICAgaWYgKCFhbGxvY0NoYXJzKG5ld0NhcGFjaXR5KS5n
ZXRWYWx1ZShkKSkKLSAgICAgICAgICAgIHJlcCA9ICZVU3RyaW5nOjpSZXA6Om51bGwoKTsKLSAg
ICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb3B5Q2hhcnMoZCwgcmVwLT5kYXRhKCksIHRoaXNT
aXplKTsKLSAgICAgICAgICAgIGNvcHlDaGFycyhkICsgdGhpc1NpemUsIHREYXRhLCB0U2l6ZSk7
Ci0gICAgICAgICAgICByZXAgPSBVU3RyaW5nOjpSZXA6OmNyZWF0ZShkLCBsZW5ndGgpOwotICAg
ICAgICAgICAgcmVwLT5iYXNlU3RyaW5nKCktPmNhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICByZXAtPmNoZWNrQ29uc2lzdGVuY3koKTsKLQotICAgIHJldHVy
biByZXAucmVsZWFzZSgpOwotfQotCi1zdGF0aWMgQUxXQVlTX0lOTElORSBQYXNzUmVmUHRyPFVT
dHJpbmc6OlJlcD4gY29uY2F0ZW5hdGUoUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IHIsIGNvbnN0
IGNoYXIqIHQpCi17Ci0gICAgUmVmUHRyPFVTdHJpbmc6OlJlcD4gcmVwID0gcjsKLQotICAgIHJl
cC0+Y2hlY2tDb25zaXN0ZW5jeSgpOwotCi0gICAgaW50IHRoaXNTaXplID0gcmVwLT5zaXplKCk7
Ci0gICAgaW50IHRoaXNPZmZzZXQgPSByZXAtPm9mZnNldDsKLSAgICBpbnQgdFNpemUgPSBzdGF0
aWNfY2FzdDxpbnQ+KHN0cmxlbih0KSk7Ci0gICAgaW50IGxlbmd0aCA9IHRoaXNTaXplICsgdFNp
emU7Ci0gICAgVVN0cmluZzo6QmFzZVN0cmluZyogYmFzZSA9IHJlcC0+YmFzZVN0cmluZygpOwot
Ci0gICAgLy8gcG9zc2libGUgY2FzZXM6Ci0gICAgaWYgKHRoaXNTaXplID09IDApIHsKLSAgICAg
ICAgLy8gdGhpcyBpcyBlbXB0eQotICAgICAgICByZXAgPSBjcmVhdGVSZXAodCk7Ci0gICAgfSBl
bHNlIGlmICh0U2l6ZSA9PSAwKSB7Ci0gICAgICAgIC8vIHQgaXMgZW1wdHksIHdlJ2xsIGp1c3Qg
cmV0dXJuICp0aGlzIGJlbG93LgotICAgIH0gZWxzZSBpZiAocmVwID09IGJhc2UgJiYgIWJhc2Ut
PmlzU2hhcmVkKCkpIHsKLSAgICAgICAgLy8gdGhpcyBpcyBkaXJlY3QgYW5kIGhhcyByZWZjb3Vu
dCBvZiAxIChzbyB3ZSBjYW4ganVzdCBhbHRlciBpdCBkaXJlY3RseSkKLSAgICAgICAgZXhwYW5k
Q2FwYWNpdHkocmVwLmdldCgpLCBuZXdDYXBhY2l0eVdpdGhPdmVyZmxvd0NoZWNrKHRoaXNPZmZz
ZXQsIGxlbmd0aCkpOwotICAgICAgICBVQ2hhciogZCA9IHJlcC0+ZGF0YSgpOwotICAgICAgICBp
ZiAoZCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0U2l6ZTsgKytpKQotICAg
ICAgICAgICAgICAgIGRbdGhpc1NpemUgKyBpXSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+
KHRbaV0pOyAvLyB1c2UgdW5zaWduZWQgY2hhciB0byB6ZXJvLWV4dGVuZCBpbnN0ZWFkIG9mIHNp
Z24tZXh0ZW5kCi0gICAgICAgICAgICByZXAtPmxlbiA9IGxlbmd0aDsKLSAgICAgICAgICAgIHJl
cC0+X2hhc2ggPSAwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICh0aGlzT2Zmc2V0ICsgdGhp
c1NpemUgPT0gYmFzZS0+dXNlZENhcGFjaXR5ICYmIHRoaXNTaXplID49IG1pblNoYXJlU2l6ZSAm
JiAhYmFzZS0+aXNCdWZmZXJSZWFkT25seSgpKSB7Ci0gICAgICAgIC8vIHRoaXMgc3RyaW5nIHJl
YWNoZXMgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIC0gZXh0ZW5kIGl0Ci0gICAgICAgIGV4cGFuZENh
cGFjaXR5KHJlcC5nZXQoKSwgbmV3Q2FwYWNpdHlXaXRoT3ZlcmZsb3dDaGVjayh0aGlzT2Zmc2V0
LCBsZW5ndGgpKTsKLSAgICAgICAgVUNoYXIqIGQgPSByZXAtPmRhdGEoKTsKLSAgICAgICAgaWYg
KGQpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdFNpemU7ICsraSkKLSAgICAg
ICAgICAgICAgICBkW3RoaXNTaXplICsgaV0gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPih0
W2ldKTsgLy8gdXNlIHVuc2lnbmVkIGNoYXIgdG8gemVyby1leHRlbmQgaW5zdGVhZCBvZiBzaWdu
LWV4dGVuZAotICAgICAgICAgICAgcmVwID0gVVN0cmluZzo6UmVwOjpjcmVhdGUocmVwLCAwLCBs
ZW5ndGgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhpcyBpcyBzaGFy
ZWQgaW4gc29tZSB3YXkgdGhhdCBwcmV2ZW50cyB1cyBmcm9tIG1vZGlmeWluZyBiYXNlLCBzbyB3
ZSBtdXN0IG1ha2UgYSB3aG9sZSBuZXcgc3RyaW5nLgotICAgICAgICBzaXplX3QgbmV3Q2FwYWNp
dHkgPSBleHBhbmRlZFNpemUobGVuZ3RoLCAwKTsKLSAgICAgICAgVUNoYXIqIGQ7Ci0gICAgICAg
IGlmICghYWxsb2NDaGFycyhuZXdDYXBhY2l0eSkuZ2V0VmFsdWUoZCkpCi0gICAgICAgICAgICBy
ZXAgPSAmVVN0cmluZzo6UmVwOjpudWxsKCk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAg
Y29weUNoYXJzKGQsIHJlcC0+ZGF0YSgpLCB0aGlzU2l6ZSk7Ci0gICAgICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IHRTaXplOyArK2kpCi0gICAgICAgICAgICAgICAgZFt0aGlzU2l6ZSArIGld
ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4odFtpXSk7IC8vIHVzZSB1bnNpZ25lZCBjaGFy
IHRvIHplcm8tZXh0ZW5kIGluc3RlYWQgb2Ygc2lnbi1leHRlbmQKLSAgICAgICAgICAgIHJlcCA9
IFVTdHJpbmc6OlJlcDo6Y3JlYXRlKGQsIGxlbmd0aCk7Ci0gICAgICAgICAgICByZXAtPmJhc2VT
dHJpbmcoKS0+Y2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKLSAgICAgICAgfQotICAgIH0KKyAgICBp
ZiAoIXN0cmluZykKKyAgICAgICAgcmV0dXJuIG51bGwoKTsKIAotICAgIHJlcC0+Y2hlY2tDb25z
aXN0ZW5jeSgpOworICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oc3RyaW5nKTsKKyAgICBWZWN0
b3I8VUNoYXIsIDEwMjQ+IGJ1ZmZlcihsZW5ndGgpOworICAgIFVDaGFyKiBwID0gYnVmZmVyLmRh
dGEoKTsKKyAgICBpZiAoY29udmVyc2lvbk9LICE9IGNvbnZlcnRVVEY4VG9VVEYxNigmc3RyaW5n
LCBzdHJpbmcgKyBsZW5ndGgsICZwLCBwICsgbGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuIG51bGwo
KTsKIAotICAgIHJldHVybiByZXAucmVsZWFzZSgpOworICAgIHJldHVybiBVU3RyaW5nKGJ1ZmZl
ci5kYXRhKCksIHAgLSBidWZmZXIuZGF0YSgpKTsKIH0KIAotUGFzc1JlZlB0cjxVU3RyaW5nOjpS
ZXA+IGNvbmNhdGVuYXRlKFVTdHJpbmc6OlJlcCogYSwgVVN0cmluZzo6UmVwKiBiKQorVVN0cmlu
ZyBVU3RyaW5nOjpjcmVhdGVVbmluaXRpYWxpemVkKHVuc2lnbmVkIGxlbmd0aCwgVUNoYXIqJiBv
dXRwdXQpCiB7Ci0gICAgYS0+Y2hlY2tDb25zaXN0ZW5jeSgpOwotICAgIGItPmNoZWNrQ29uc2lz
dGVuY3koKTsKLQotICAgIGludCBhU2l6ZSA9IGEtPnNpemUoKTsKLSAgICBpbnQgYlNpemUgPSBi
LT5zaXplKCk7Ci0gICAgaW50IGFPZmZzZXQgPSBhLT5vZmZzZXQ7Ci0KLSAgICAvLyBwb3NzaWJs
ZSBjYXNlczoKLQotICAgIFVTdHJpbmc6OkJhc2VTdHJpbmcqIGFCYXNlID0gYS0+YmFzZVN0cmlu
ZygpOwotICAgIGlmIChiU2l6ZSA9PSAxICYmIGFPZmZzZXQgKyBhU2l6ZSA9PSBhQmFzZS0+dXNl
ZENhcGFjaXR5ICYmIGFPZmZzZXQgKyBhU2l6ZSA8IGFCYXNlLT5jYXBhY2l0eSAmJiAhYUJhc2Ut
PmlzQnVmZmVyUmVhZE9ubHkoKSkgewotICAgICAgICAvLyBiIGlzIGEgc2luZ2xlIGNoYXJhY3Rl
ciAoY29tbW9uIGZhc3QgY2FzZSkKLSAgICAgICAgKythQmFzZS0+dXNlZENhcGFjaXR5OwotICAg
ICAgICBhLT5kYXRhKClbYVNpemVdID0gYi0+ZGF0YSgpWzBdOwotICAgICAgICByZXR1cm4gVVN0
cmluZzo6UmVwOjpjcmVhdGUoYSwgMCwgYVNpemUgKyAxKTsKLSAgICB9Ci0KLSAgICAvLyBhIGlz
IGVtcHR5Ci0gICAgaWYgKGFTaXplID09IDApCi0gICAgICAgIHJldHVybiBiOwotICAgIC8vIGIg
aXMgZW1wdHkKLSAgICBpZiAoYlNpemUgPT0gMCkKLSAgICAgICAgcmV0dXJuIGE7Ci0KLSAgICBp
bnQgYk9mZnNldCA9IGItPm9mZnNldDsKLSAgICBpbnQgbGVuZ3RoID0gYVNpemUgKyBiU2l6ZTsK
LQotICAgIFVTdHJpbmc6OkJhc2VTdHJpbmcqIGJCYXNlID0gYi0+YmFzZVN0cmluZygpOwotICAg
IGlmIChhT2Zmc2V0ICsgYVNpemUgPT0gYUJhc2UtPnVzZWRDYXBhY2l0eSAmJiBhU2l6ZSA+PSBt
aW5TaGFyZVNpemUgJiYgNCAqIGFTaXplID49IGJTaXplCi0gICAgICAgICYmICgtYk9mZnNldCAh
PSBiQmFzZS0+dXNlZFByZUNhcGFjaXR5IHx8IGFTaXplID49IGJTaXplKSAmJiAhYUJhc2UtPmlz
QnVmZmVyUmVhZE9ubHkoKSkgewotICAgICAgICAvLyAtIGEgcmVhY2hlcyB0aGUgZW5kIG9mIGl0
cyBidWZmZXIgc28gaXQgcXVhbGlmaWVzIGZvciBzaGFyZWQgYXBwZW5kCi0gICAgICAgIC8vIC0g
YWxzbywgaXQncyBhdCBsZWFzdCBhIHF1YXJ0ZXIgdGhlIGxlbmd0aCBvZiBiIC0gYXBwZW5kaW5n
IHRvIGEgbXVjaCBzaG9ydGVyCi0gICAgICAgIC8vICAgc3RyaW5nIGRvZXMgbW9yZSBoYXJtIHRo
YW4gZ29vZAotICAgICAgICAvLyAtIGhvd2V2ZXIsIGlmIGIgcXVhbGlmaWVzIGZvciBwcmVwZW5k
IGFuZCBpcyBsb25nZXIgdGhhbiBhLCB3ZSdkIHJhdGhlciBwcmVwZW5kCi0gICAgICAgIAotICAg
ICAgICBVU3RyaW5nIHgoYSk7Ci0gICAgICAgIHguZXhwYW5kQ2FwYWNpdHkobmV3Q2FwYWNpdHlX
aXRoT3ZlcmZsb3dDaGVjayhhT2Zmc2V0LCBsZW5ndGgpKTsKLSAgICAgICAgaWYgKCFhLT5kYXRh
KCkgfHwgIXguZGF0YSgpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGNvcHlDaGFy
cyhhLT5kYXRhKCkgKyBhU2l6ZSwgYi0+ZGF0YSgpLCBiU2l6ZSk7Ci0gICAgICAgIFBhc3NSZWZQ
dHI8VVN0cmluZzo6UmVwPiByZXN1bHQgPSBVU3RyaW5nOjpSZXA6OmNyZWF0ZShhLCAwLCBsZW5n
dGgpOwotCi0gICAgICAgIGEtPmNoZWNrQ29uc2lzdGVuY3koKTsKLSAgICAgICAgYi0+Y2hlY2tD
b25zaXN0ZW5jeSgpOwotICAgICAgICByZXN1bHQtPmNoZWNrQ29uc2lzdGVuY3koKTsKLQotICAg
ICAgICByZXR1cm4gcmVzdWx0OworICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgICBvdXRw
dXQgPSAmc2hhcmVkRW1wdHlDaGFyOworICAgICAgICByZXR1cm4gVVN0cmluZygmUmVwOjplbXB0
eSgpKTsKICAgICB9CiAKLSAgICBpZiAoLWJPZmZzZXQgPT0gYkJhc2UtPnVzZWRQcmVDYXBhY2l0
eSAmJiBiU2l6ZSA+PSBtaW5TaGFyZVNpemUgJiYgNCAqIGJTaXplID49IGFTaXplICYmICFiQmFz
ZS0+aXNCdWZmZXJSZWFkT25seSgpKSB7Ci0gICAgICAgIC8vIC0gYiByZWFjaGVzIHRoZSBiZWdp
bm5pbmcgb2YgaXRzIGJ1ZmZlciBzbyBpdCBxdWFsaWZpZXMgZm9yIHNoYXJlZCBwcmVwZW5kCi0g
ICAgICAgIC8vIC0gYWxzbywgaXQncyBhdCBsZWFzdCBhIHF1YXJ0ZXIgdGhlIGxlbmd0aCBvZiBh
IC0gcHJlcGVuZGluZyB0byBhIG11Y2ggc2hvcnRlcgotICAgICAgICAvLyAgIHN0cmluZyBkb2Vz
IG1vcmUgaGFybSB0aGFuIGdvb2QKLSAgICAgICAgVVN0cmluZyB5KGIpOwotICAgICAgICB5LmV4
cGFuZFByZUNhcGFjaXR5KC1iT2Zmc2V0ICsgYVNpemUpOwotICAgICAgICBpZiAoIWItPmRhdGEo
KSB8fCAheS5kYXRhKCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgY29weUNoYXJz
KGItPmRhdGEoKSAtIGFTaXplLCBhLT5kYXRhKCksIGFTaXplKTsKLSAgICAgICAgUGFzc1JlZlB0
cjxVU3RyaW5nOjpSZXA+IHJlc3VsdCA9IFVTdHJpbmc6OlJlcDo6Y3JlYXRlKGIsIC1hU2l6ZSwg
bGVuZ3RoKTsKLQotICAgICAgICBhLT5jaGVja0NvbnNpc3RlbmN5KCk7Ci0gICAgICAgIGItPmNo
ZWNrQ29uc2lzdGVuY3koKTsKLSAgICAgICAgcmVzdWx0LT5jaGVja0NvbnNpc3RlbmN5KCk7Ci0K
KyAgICBpZiAoUGFzc1JlZlB0cjxVU3RyaW5nSW1wbD4gcmVzdWx0ID0gVVN0cmluZ0ltcGw6OmNy
ZWF0ZVVuaW5pdGlhbGl6ZWQobGVuZ3RoLCBvdXRwdXQpKQogICAgICAgICByZXR1cm4gcmVzdWx0
OwotICAgIH0KLQotICAgIC8vIGEgZG9lcyBub3QgcXVhbGlmeSBmb3IgYXBwZW5kLCBhbmQgYiBk
b2VzIG5vdCBxdWFsaWZ5IGZvciBwcmVwZW5kLCBnb3R0YSBtYWtlIGEgd2hvbGUgbmV3IHN0cmlu
ZwotICAgIHNpemVfdCBuZXdDYXBhY2l0eSA9IGV4cGFuZGVkU2l6ZShsZW5ndGgsIDApOwotICAg
IFVDaGFyKiBkOwotICAgIGlmICghYWxsb2NDaGFycyhuZXdDYXBhY2l0eSkuZ2V0VmFsdWUoZCkp
Ci0gICAgICAgIHJldHVybiAwOwotICAgIGNvcHlDaGFycyhkLCBhLT5kYXRhKCksIGFTaXplKTsK
LSAgICBjb3B5Q2hhcnMoZCArIGFTaXplLCBiLT5kYXRhKCksIGJTaXplKTsKLSAgICBQYXNzUmVm
UHRyPFVTdHJpbmc6OlJlcD4gcmVzdWx0ID0gVVN0cmluZzo6UmVwOjpjcmVhdGUoZCwgbGVuZ3Ro
KTsKLSAgICByZXN1bHQtPmJhc2VTdHJpbmcoKS0+Y2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKLQot
ICAgIGEtPmNoZWNrQ29uc2lzdGVuY3koKTsKLSAgICBiLT5jaGVja0NvbnNpc3RlbmN5KCk7Ci0g
ICAgcmVzdWx0LT5jaGVja0NvbnNpc3RlbmN5KCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQot
Ci1QYXNzUmVmUHRyPFVTdHJpbmc6OlJlcD4gY29uY2F0ZW5hdGUoVVN0cmluZzo6UmVwKiByZXAs
IGludCBpKQotewotICAgIFVDaGFyIGJ1ZlsxICsgc2l6ZW9mKGkpICogM107Ci0gICAgVUNoYXIq
IGVuZCA9IGJ1ZiArIHNpemVvZihidWYpIC8gc2l6ZW9mKFVDaGFyKTsKLSAgICBVQ2hhciogcCA9
IGVuZDsKLSAgCi0gICAgaWYgKGkgPT0gMCkKLSAgICAgICAgKi0tcCA9ICcwJzsKLSAgICBlbHNl
IGlmIChpID09IElOVF9NSU4pIHsKLSAgICAgICAgY2hhciBtaW5CdWZbMSArIHNpemVvZihpKSAq
IDNdOwotICAgICAgICBzcHJpbnRmKG1pbkJ1ZiwgIiVkIiwgSU5UX01JTik7Ci0gICAgICAgIHJl
dHVybiBjb25jYXRlbmF0ZShyZXAsIG1pbkJ1Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYm9v
bCBuZWdhdGl2ZSA9IGZhbHNlOwotICAgICAgICBpZiAoaSA8IDApIHsKLSAgICAgICAgICAgIG5l
Z2F0aXZlID0gdHJ1ZTsKLSAgICAgICAgICAgIGkgPSAtaTsKLSAgICAgICAgfQotICAgICAgICB3
aGlsZSAoaSkgewotICAgICAgICAgICAgKi0tcCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0
PigoaSAlIDEwKSArICcwJyk7Ci0gICAgICAgICAgICBpIC89IDEwOwotICAgICAgICB9Ci0gICAg
ICAgIGlmIChuZWdhdGl2ZSkKLSAgICAgICAgICAgICotLXAgPSAnLSc7Ci0gICAgfQotCi0gICAg
cmV0dXJuIGNvbmNhdGVuYXRlKHJlcCwgcCwgc3RhdGljX2Nhc3Q8aW50PihlbmQgLSBwKSk7Ci0K
LX0KLQotUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IGNvbmNhdGVuYXRlKFVTdHJpbmc6OlJlcCog
cmVwLCBkb3VibGUgZCkKLXsKLSAgICAvLyBhdm9pZCBldmVyIHByaW50aW5nIC1OYU4sIGluIEpT
IGNvbmNlcHR1YWxseSB0aGVyZSBpcyBvbmx5IG9uZSBOYU4gdmFsdWUKLSAgICBpZiAoaXNuYW4o
ZCkpCi0gICAgICAgIHJldHVybiBjb25jYXRlbmF0ZShyZXAsICJOYU4iKTsKLQotICAgIGlmIChk
ID09IDAuMCkgLy8gc3RyaW5naWZ5IC0wIGFzIDAKLSAgICAgICAgZCA9IDAuMDsKLQotICAgIGNo
YXIgYnVmWzgwXTsKLSAgICBpbnQgZGVjaW1hbFBvaW50OwotICAgIGludCBzaWduOwotCi0gICAg
Y2hhciByZXN1bHRbODBdOwotICAgIFdURjo6ZHRvYShyZXN1bHQsIGQsIDAsICZkZWNpbWFsUG9p
bnQsICZzaWduLCBOVUxMKTsKLSAgICBpbnQgbGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50PihzdHJs
ZW4ocmVzdWx0KSk7Ci0gIAotICAgIGludCBpID0gMDsKLSAgICBpZiAoc2lnbikKLSAgICAgICAg
YnVmW2krK10gPSAnLSc7Ci0gIAotICAgIGlmIChkZWNpbWFsUG9pbnQgPD0gMCAmJiBkZWNpbWFs
UG9pbnQgPiAtNikgewotICAgICAgICBidWZbaSsrXSA9ICcwJzsKLSAgICAgICAgYnVmW2krK10g
PSAnLic7Ci0gICAgICAgIGZvciAoaW50IGogPSBkZWNpbWFsUG9pbnQ7IGogPCAwOyBqKyspCi0g
ICAgICAgICAgICBidWZbaSsrXSA9ICcwJzsKLSAgICAgICAgc3RyY3B5KGJ1ZiArIGksIHJlc3Vs
dCk7Ci0gICAgfSBlbHNlIGlmIChkZWNpbWFsUG9pbnQgPD0gMjEgJiYgZGVjaW1hbFBvaW50ID4g
MCkgewotICAgICAgICBpZiAobGVuZ3RoIDw9IGRlY2ltYWxQb2ludCkgewotICAgICAgICAgICAg
c3RyY3B5KGJ1ZiArIGksIHJlc3VsdCk7Ci0gICAgICAgICAgICBpICs9IGxlbmd0aDsKLSAgICAg
ICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGVjaW1hbFBvaW50IC0gbGVuZ3RoOyBqKyspCi0g
ICAgICAgICAgICAgICAgYnVmW2krK10gPSAnMCc7Ci0gICAgICAgICAgICBidWZbaV0gPSAnXDAn
OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RybmNweShidWYgKyBpLCByZXN1bHQs
IGRlY2ltYWxQb2ludCk7Ci0gICAgICAgICAgICBpICs9IGRlY2ltYWxQb2ludDsKLSAgICAgICAg
ICAgIGJ1ZltpKytdID0gJy4nOwotICAgICAgICAgICAgc3RyY3B5KGJ1ZiArIGksIHJlc3VsdCAr
IGRlY2ltYWxQb2ludCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHJlc3VsdFswXSA8ICcw
JyB8fCByZXN1bHRbMF0gPiAnOScpCi0gICAgICAgIHN0cmNweShidWYgKyBpLCByZXN1bHQpOwot
ICAgIGVsc2UgewotICAgICAgICBidWZbaSsrXSA9IHJlc3VsdFswXTsKLSAgICAgICAgaWYgKGxl
bmd0aCA+IDEpIHsKLSAgICAgICAgICAgIGJ1ZltpKytdID0gJy4nOwotICAgICAgICAgICAgc3Ry
Y3B5KGJ1ZiArIGksIHJlc3VsdCArIDEpOwotICAgICAgICAgICAgaSArPSBsZW5ndGggLSAxOwot
ICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBidWZbaSsrXSA9ICdlJzsKLSAgICAgICAgYnVm
W2krK10gPSAoZGVjaW1hbFBvaW50ID49IDApID8gJysnIDogJy0nOwotICAgICAgICAvLyBkZWNp
bWFsUG9pbnQgY2FuJ3QgYmUgbW9yZSB0aGFuIDMgZGlnaXRzIGRlY2ltYWwgZ2l2ZW4gdGhlCi0g
ICAgICAgIC8vIG5hdHVyZSBvZiBmbG9hdCByZXByZXNlbnRhdGlvbgotICAgICAgICBpbnQgZXhw
b25lbnRpYWwgPSBkZWNpbWFsUG9pbnQgLSAxOwotICAgICAgICBpZiAoZXhwb25lbnRpYWwgPCAw
KQotICAgICAgICAgICAgZXhwb25lbnRpYWwgPSAtZXhwb25lbnRpYWw7Ci0gICAgICAgIGlmIChl
eHBvbmVudGlhbCA+PSAxMDApCi0gICAgICAgICAgICBidWZbaSsrXSA9IHN0YXRpY19jYXN0PGNo
YXI+KCcwJyArIGV4cG9uZW50aWFsIC8gMTAwKTsKLSAgICAgICAgaWYgKGV4cG9uZW50aWFsID49
IDEwKQotICAgICAgICAgICAgYnVmW2krK10gPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyAoZXhw
b25lbnRpYWwgJSAxMDApIC8gMTApOwotICAgICAgICBidWZbaSsrXSA9IHN0YXRpY19jYXN0PGNo
YXI+KCcwJyArIGV4cG9uZW50aWFsICUgMTApOwotICAgICAgICBidWZbaSsrXSA9ICdcMCc7Ci0g
ICAgfQotICAgIAotICAgIHJldHVybiBjb25jYXRlbmF0ZShyZXAsIGJ1Zik7CisgICAgb3V0cHV0
ID0gMDsKKyAgICByZXR1cm4gVVN0cmluZygpOwogfQogCiBVU3RyaW5nIFVTdHJpbmc6OmZyb20o
aW50IGkpCkBAIC0xMDc2LDE4ICszOTAsMTggQEAgVVN0cmluZyBVU3RyaW5nOjpzcGxpY2VTdWJz
dHJpbmdzV2l0aFNlcAogICAgICAgICByZXR1cm4gIiI7CiAKICAgICBVQ2hhciogYnVmZmVyOwot
ICAgIGlmICghYWxsb2NDaGFycyh0b3RhbExlbmd0aCkuZ2V0VmFsdWUoYnVmZmVyKSkKKyAgICBp
ZiAoIVVTdHJpbmdJbXBsOjphbGxvY0NoYXJzKHRvdGFsTGVuZ3RoKS5nZXRWYWx1ZShidWZmZXIp
KQogICAgICAgICByZXR1cm4gbnVsbCgpOwogCiAgICAgaW50IG1heENvdW50ID0gbWF4KHJhbmdl
Q291bnQsIHNlcGFyYXRvckNvdW50KTsKICAgICBpbnQgYnVmZmVyUG9zID0gMDsKICAgICBmb3Ig
KGludCBpID0gMDsgaSA8IG1heENvdW50OyBpKyspIHsKICAgICAgICAgaWYgKGkgPCByYW5nZUNv
dW50KSB7Ci0gICAgICAgICAgICBjb3B5Q2hhcnMoYnVmZmVyICsgYnVmZmVyUG9zLCBkYXRhKCkg
KyBzdWJzdHJpbmdSYW5nZXNbaV0ucG9zaXRpb24sIHN1YnN0cmluZ1Jhbmdlc1tpXS5sZW5ndGgp
OworICAgICAgICAgICAgVVN0cmluZ0ltcGw6OmNvcHlDaGFycyhidWZmZXIgKyBidWZmZXJQb3Ms
IGRhdGEoKSArIHN1YnN0cmluZ1Jhbmdlc1tpXS5wb3NpdGlvbiwgc3Vic3RyaW5nUmFuZ2VzW2ld
Lmxlbmd0aCk7CiAgICAgICAgICAgICBidWZmZXJQb3MgKz0gc3Vic3RyaW5nUmFuZ2VzW2ldLmxl
bmd0aDsKICAgICAgICAgfQogICAgICAgICBpZiAoaSA8IHNlcGFyYXRvckNvdW50KSB7Ci0gICAg
ICAgICAgICBjb3B5Q2hhcnMoYnVmZmVyICsgYnVmZmVyUG9zLCBzZXBhcmF0b3JzW2ldLmRhdGEo
KSwgc2VwYXJhdG9yc1tpXS5zaXplKCkpOworICAgICAgICAgICAgVVN0cmluZ0ltcGw6OmNvcHlD
aGFycyhidWZmZXIgKyBidWZmZXJQb3MsIHNlcGFyYXRvcnNbaV0uZGF0YSgpLCBzZXBhcmF0b3Jz
W2ldLnNpemUoKSk7CiAgICAgICAgICAgICBidWZmZXJQb3MgKz0gc2VwYXJhdG9yc1tpXS5zaXpl
KCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTA1LDEzOCArNDE5LDE3IEBAIFVTdHJpbmcgVVN0
cmluZzo6cmVwbGFjZVJhbmdlKGludCByYW5nZVMKICAgICAgICAgcmV0dXJuICIiOwogCiAgICAg
VUNoYXIqIGJ1ZmZlcjsKLSAgICBpZiAoIWFsbG9jQ2hhcnModG90YWxMZW5ndGgpLmdldFZhbHVl
KGJ1ZmZlcikpCisgICAgaWYgKCFVU3RyaW5nSW1wbDo6YWxsb2NDaGFycyh0b3RhbExlbmd0aCku
Z2V0VmFsdWUoYnVmZmVyKSkKICAgICAgICAgcmV0dXJuIG51bGwoKTsKIAotICAgIGNvcHlDaGFy
cyhidWZmZXIsIGRhdGEoKSwgcmFuZ2VTdGFydCk7Ci0gICAgY29weUNoYXJzKGJ1ZmZlciArIHJh
bmdlU3RhcnQsIHJlcGxhY2VtZW50LmRhdGEoKSwgcmVwbGFjZW1lbnRMZW5ndGgpOworICAgIFVT
dHJpbmdJbXBsOjpjb3B5Q2hhcnMoYnVmZmVyLCBkYXRhKCksIHJhbmdlU3RhcnQpOworICAgIFVT
dHJpbmdJbXBsOjpjb3B5Q2hhcnMoYnVmZmVyICsgcmFuZ2VTdGFydCwgcmVwbGFjZW1lbnQuZGF0
YSgpLCByZXBsYWNlbWVudExlbmd0aCk7CiAgICAgaW50IHJhbmdlRW5kID0gcmFuZ2VTdGFydCAr
IHJhbmdlTGVuZ3RoOwotICAgIGNvcHlDaGFycyhidWZmZXIgKyByYW5nZVN0YXJ0ICsgcmVwbGFj
ZW1lbnRMZW5ndGgsIGRhdGEoKSArIHJhbmdlRW5kLCBzaXplKCkgLSByYW5nZUVuZCk7CisgICAg
VVN0cmluZ0ltcGw6OmNvcHlDaGFycyhidWZmZXIgKyByYW5nZVN0YXJ0ICsgcmVwbGFjZW1lbnRM
ZW5ndGgsIGRhdGEoKSArIHJhbmdlRW5kLCBzaXplKCkgLSByYW5nZUVuZCk7CiAKICAgICByZXR1
cm4gVVN0cmluZzo6UmVwOjpjcmVhdGUoYnVmZmVyLCB0b3RhbExlbmd0aCk7CiB9CiAKLQotVVN0
cmluZyYgVVN0cmluZzo6YXBwZW5kKGNvbnN0IFVTdHJpbmcgJnQpCi17Ci0gICAgbV9yZXAtPmNo
ZWNrQ29uc2lzdGVuY3koKTsKLSAgICB0LnJlcCgpLT5jaGVja0NvbnNpc3RlbmN5KCk7Ci0KLSAg
ICBpbnQgdGhpc1NpemUgPSBzaXplKCk7Ci0gICAgaW50IHRoaXNPZmZzZXQgPSBtX3JlcC0+b2Zm
c2V0OwotICAgIGludCB0U2l6ZSA9IHQuc2l6ZSgpOwotICAgIGludCBsZW5ndGggPSB0aGlzU2l6
ZSArIHRTaXplOwotICAgIEJhc2VTdHJpbmcqIGJhc2UgPSBtX3JlcC0+YmFzZVN0cmluZygpOwot
Ci0gICAgLy8gcG9zc2libGUgY2FzZXM6Ci0gICAgaWYgKHRoaXNTaXplID09IDApIHsKLSAgICAg
ICAgLy8gdGhpcyBpcyBlbXB0eQotICAgICAgICAqdGhpcyA9IHQ7Ci0gICAgfSBlbHNlIGlmICh0
U2l6ZSA9PSAwKSB7Ci0gICAgICAgIC8vIHQgaXMgZW1wdHkKLSAgICB9IGVsc2UgaWYgKG1fcmVw
ID09IGJhc2UgJiYgIWJhc2UtPmlzU2hhcmVkKCkpIHsKLSAgICAgICAgLy8gdGhpcyBpcyBkaXJl
Y3QgYW5kIGhhcyByZWZjb3VudCBvZiAxIChzbyB3ZSBjYW4ganVzdCBhbHRlciBpdCBkaXJlY3Rs
eSkKLSAgICAgICAgZXhwYW5kQ2FwYWNpdHkobmV3Q2FwYWNpdHlXaXRoT3ZlcmZsb3dDaGVjayh0
aGlzT2Zmc2V0LCBsZW5ndGgpKTsKLSAgICAgICAgaWYgKGRhdGEoKSkgewotICAgICAgICAgICAg
Y29weUNoYXJzKG1fcmVwLT5kYXRhKCkgKyB0aGlzU2l6ZSwgdC5kYXRhKCksIHRTaXplKTsKLSAg
ICAgICAgICAgIG1fcmVwLT5sZW4gPSBsZW5ndGg7Ci0gICAgICAgICAgICBtX3JlcC0+X2hhc2gg
PSAwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICh0aGlzT2Zmc2V0ICsgdGhpc1NpemUgPT0g
YmFzZS0+dXNlZENhcGFjaXR5ICYmIHRoaXNTaXplID49IG1pblNoYXJlU2l6ZSAmJiAhYmFzZS0+
aXNCdWZmZXJSZWFkT25seSgpKSB7Ci0gICAgICAgIC8vIHRoaXMgcmVhY2hlcyB0aGUgZW5kIG9m
IHRoZSBidWZmZXIgLSBleHRlbmQgaXQgaWYgaXQncyBsb25nIGVub3VnaCB0byBhcHBlbmQgdG8K
LSAgICAgICAgZXhwYW5kQ2FwYWNpdHkobmV3Q2FwYWNpdHlXaXRoT3ZlcmZsb3dDaGVjayh0aGlz
T2Zmc2V0LCBsZW5ndGgpKTsKLSAgICAgICAgaWYgKGRhdGEoKSkgewotICAgICAgICAgICAgY29w
eUNoYXJzKG1fcmVwLT5kYXRhKCkgKyB0aGlzU2l6ZSwgdC5kYXRhKCksIHRTaXplKTsKLSAgICAg
ICAgICAgIG1fcmVwID0gUmVwOjpjcmVhdGUobV9yZXAsIDAsIGxlbmd0aCk7Ci0gICAgICAgIH0K
LSAgICB9IGVsc2UgewotICAgICAgICAvLyBUaGlzIGlzIHNoYXJlZCBpbiBzb21lIHdheSB0aGF0
IHByZXZlbnRzIHVzIGZyb20gbW9kaWZ5aW5nIGJhc2UsIHNvIHdlIG11c3QgbWFrZSBhIHdob2xl
IG5ldyBzdHJpbmcuCi0gICAgICAgIHNpemVfdCBuZXdDYXBhY2l0eSA9IGV4cGFuZGVkU2l6ZShs
ZW5ndGgsIDApOwotICAgICAgICBVQ2hhciogZDsKLSAgICAgICAgaWYgKCFhbGxvY0NoYXJzKG5l
d0NhcGFjaXR5KS5nZXRWYWx1ZShkKSkKLSAgICAgICAgICAgIG1ha2VOdWxsKCk7Ci0gICAgICAg
IGVsc2UgewotICAgICAgICAgICAgY29weUNoYXJzKGQsIGRhdGEoKSwgdGhpc1NpemUpOwotICAg
ICAgICAgICAgY29weUNoYXJzKGQgKyB0aGlzU2l6ZSwgdC5kYXRhKCksIHRTaXplKTsKLSAgICAg
ICAgICAgIG1fcmVwID0gUmVwOjpjcmVhdGUoZCwgbGVuZ3RoKTsKLSAgICAgICAgICAgIG1fcmVw
LT5iYXNlU3RyaW5nKCktPmNhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICBtX3JlcC0+Y2hlY2tDb25zaXN0ZW5jeSgpOwotICAgIHQucmVwKCktPmNoZWNrQ29u
c2lzdGVuY3koKTsKLQotICAgIHJldHVybiAqdGhpczsKLX0KLQotVVN0cmluZyYgVVN0cmluZzo6
YXBwZW5kKGNvbnN0IFVDaGFyKiB0RGF0YSwgaW50IHRTaXplKQotewotICAgIG1fcmVwID0gY29u
Y2F0ZW5hdGUobV9yZXAucmVsZWFzZSgpLCB0RGF0YSwgdFNpemUpOwotICAgIHJldHVybiAqdGhp
czsKLX0KLQotVVN0cmluZyYgVVN0cmluZzo6YXBwZW5kKGNvbnN0IGNoYXIqIHQpCi17Ci0gICAg
bV9yZXAgPSBjb25jYXRlbmF0ZShtX3JlcC5yZWxlYXNlKCksIHQpOwotICAgIHJldHVybiAqdGhp
czsKLX0KLQotVVN0cmluZyYgVVN0cmluZzo6YXBwZW5kKFVDaGFyIGMpCi17Ci0gICAgbV9yZXAt
PmNoZWNrQ29uc2lzdGVuY3koKTsKLQotICAgIGludCB0aGlzT2Zmc2V0ID0gbV9yZXAtPm9mZnNl
dDsKLSAgICBpbnQgbGVuZ3RoID0gc2l6ZSgpOwotICAgIEJhc2VTdHJpbmcqIGJhc2UgPSBtX3Jl
cC0+YmFzZVN0cmluZygpOwotCi0gICAgLy8gcG9zc2libGUgY2FzZXM6Ci0gICAgaWYgKGxlbmd0
aCA9PSAwKSB7Ci0gICAgICAgIC8vIHRoaXMgaXMgZW1wdHkgLSBtdXN0IG1ha2UgYSBuZXcgbV9y
ZXAgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHBvbGx1dGUgdGhlIHNoYXJlZCBlbXB0eSBvbmUg
Ci0gICAgICAgIHNpemVfdCBuZXdDYXBhY2l0eSA9IGV4cGFuZGVkU2l6ZSgxLCAwKTsKLSAgICAg
ICAgVUNoYXIqIGQ7Ci0gICAgICAgIGlmICghYWxsb2NDaGFycyhuZXdDYXBhY2l0eSkuZ2V0VmFs
dWUoZCkpCi0gICAgICAgICAgICBtYWtlTnVsbCgpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAg
ICAgIGRbMF0gPSBjOwotICAgICAgICAgICAgbV9yZXAgPSBSZXA6OmNyZWF0ZShkLCAxKTsKLSAg
ICAgICAgICAgIG1fcmVwLT5iYXNlU3RyaW5nKCktPmNhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7Ci0g
ICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fcmVwID09IGJhc2UgJiYgIWJhc2UtPmlzU2hhcmVk
KCkpIHsKLSAgICAgICAgLy8gdGhpcyBpcyBkaXJlY3QgYW5kIGhhcyByZWZjb3VudCBvZiAxIChz
byB3ZSBjYW4ganVzdCBhbHRlciBpdCBkaXJlY3RseSkKLSAgICAgICAgZXhwYW5kQ2FwYWNpdHko
bmV3Q2FwYWNpdHlXaXRoT3ZlcmZsb3dDaGVjayh0aGlzT2Zmc2V0LCBsZW5ndGgsIHRydWUpKTsK
LSAgICAgICAgVUNoYXIqIGQgPSBtX3JlcC0+ZGF0YSgpOwotICAgICAgICBpZiAoZCkgewotICAg
ICAgICAgICAgZFtsZW5ndGhdID0gYzsKLSAgICAgICAgICAgIG1fcmVwLT5sZW4gPSBsZW5ndGgg
KyAxOwotICAgICAgICAgICAgbV9yZXAtPl9oYXNoID0gMDsKLSAgICAgICAgfQotICAgIH0gZWxz
ZSBpZiAodGhpc09mZnNldCArIGxlbmd0aCA9PSBiYXNlLT51c2VkQ2FwYWNpdHkgJiYgbGVuZ3Ro
ID49IG1pblNoYXJlU2l6ZSAmJiAhYmFzZS0+aXNCdWZmZXJSZWFkT25seSgpKSB7Ci0gICAgICAg
IC8vIHRoaXMgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgLSBleHRlbmQgaXQgYW5kIHNo
YXJlCi0gICAgICAgIGV4cGFuZENhcGFjaXR5KG5ld0NhcGFjaXR5V2l0aE92ZXJmbG93Q2hlY2so
dGhpc09mZnNldCwgbGVuZ3RoLCB0cnVlKSk7Ci0gICAgICAgIFVDaGFyKiBkID0gbV9yZXAtPmRh
dGEoKTsKLSAgICAgICAgaWYgKGQpIHsKLSAgICAgICAgICAgIGRbbGVuZ3RoXSA9IGM7Ci0gICAg
ICAgICAgICBtX3JlcCA9IFJlcDo6Y3JlYXRlKG1fcmVwLCAwLCBsZW5ndGggKyAxKTsKLSAgICAg
ICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgc2hhcmVkIGluIHNvbWUgd2F5
IHRoYXQgcHJldmVudHMgdXMgZnJvbSBtb2RpZnlpbmcgYmFzZSwgc28gd2UgbXVzdCBtYWtlIGEg
d2hvbGUgbmV3IHN0cmluZy4KLSAgICAgICAgc2l6ZV90IG5ld0NhcGFjaXR5ID0gZXhwYW5kZWRT
aXplKGxlbmd0aCArIDEsIDApOwotICAgICAgICBVQ2hhciogZDsKLSAgICAgICAgaWYgKCFhbGxv
Y0NoYXJzKG5ld0NhcGFjaXR5KS5nZXRWYWx1ZShkKSkKLSAgICAgICAgICAgIG1ha2VOdWxsKCk7
Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29weUNoYXJzKGQsIGRhdGEoKSwgbGVuZ3Ro
KTsKLSAgICAgICAgICAgIGRbbGVuZ3RoXSA9IGM7Ci0gICAgICAgICAgICBtX3JlcCA9IFJlcDo6
Y3JlYXRlKGQsIGxlbmd0aCArIDEpOwotICAgICAgICAgICAgbV9yZXAtPmJhc2VTdHJpbmcoKS0+
Y2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1fcmVwLT5j
aGVja0NvbnNpc3RlbmN5KCk7Ci0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KIGJvb2wgVVN0cmlu
Zzo6Z2V0Q1N0cmluZyhDU3RyaW5nQnVmZmVyJiBidWZmZXIpIGNvbnN0CiB7CiAgICAgaW50IGxl
bmd0aCA9IHNpemUoKTsKQEAgLTEyNjIsMTMgKzQ1NSwxNSBAQCBib29sIFVTdHJpbmc6OmdldENT
dHJpbmcoQ1N0cmluZ0J1ZmZlciYgCiAKIGNoYXIqIFVTdHJpbmc6OmFzY2lpKCkgY29uc3QKIHsK
KyAgICBzdGF0aWMgY2hhciogYXNjaWlCdWZmZXIgPSAwOworCiAgICAgaW50IGxlbmd0aCA9IHNp
emUoKTsKICAgICBpbnQgbmVlZGVkU2l6ZSA9IGxlbmd0aCArIDE7Ci0gICAgZGVsZXRlW10gc3Rh
dEJ1ZmZlcjsKLSAgICBzdGF0QnVmZmVyID0gbmV3IGNoYXJbbmVlZGVkU2l6ZV07CisgICAgZGVs
ZXRlW10gYXNjaWlCdWZmZXI7CisgICAgYXNjaWlCdWZmZXIgPSBuZXcgY2hhcltuZWVkZWRTaXpl
XTsKIAogICAgIGNvbnN0IFVDaGFyKiBwID0gZGF0YSgpOwotICAgIGNoYXIqIHEgPSBzdGF0QnVm
ZmVyOworICAgIGNoYXIqIHEgPSBhc2NpaUJ1ZmZlcjsKICAgICBjb25zdCBVQ2hhciogbGltaXQg
PSBwICsgbGVuZ3RoOwogICAgIHdoaWxlIChwICE9IGxpbWl0KSB7CiAgICAgICAgICpxID0gc3Rh
dGljX2Nhc3Q8Y2hhcj4ocFswXSk7CkBAIC0xMjc3LDcgKzQ3Miw3IEBAIGNoYXIqIFVTdHJpbmc6
OmFzY2lpKCkgY29uc3QKICAgICB9CiAgICAgKnEgPSAnXDAnOwogCi0gICAgcmV0dXJuIHN0YXRC
dWZmZXI7CisgICAgcmV0dXJuIGFzY2lpQnVmZmVyOwogfQogCiBVU3RyaW5nJiBVU3RyaW5nOjpv
cGVyYXRvcj0oY29uc3QgY2hhciogYykKQEAgLTEyOTQsMjAgKzQ4OSwxMyBAQCBVU3RyaW5nJiBV
U3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgY2hhciogCiAKICAgICBpbnQgbCA9IHN0YXRpY19jYXN0
PGludD4oc3RybGVuKGMpKTsKICAgICBVQ2hhciogZDsKLSAgICBCYXNlU3RyaW5nKiBiYXNlID0g
bV9yZXAtPmJhc2VTdHJpbmcoKTsKLSAgICBpZiAoIWJhc2UtPmlzU2hhcmVkKCkgJiYgbCA8PSBi
YXNlLT5jYXBhY2l0eSAmJiBtX3JlcCA9PSBiYXNlICYmIG1fcmVwLT5vZmZzZXQgPT0gMCAmJiBi
YXNlLT5wcmVDYXBhY2l0eSA9PSAwKSB7Ci0gICAgICAgIGQgPSBiYXNlLT5idWY7Ci0gICAgICAg
IG1fcmVwLT5faGFzaCA9IDA7Ci0gICAgICAgIG1fcmVwLT5sZW4gPSBsOwotICAgIH0gZWxzZSB7
Ci0gICAgICAgIGlmICghYWxsb2NDaGFycyhsKS5nZXRWYWx1ZShkKSkgewotICAgICAgICAgICAg
bWFrZU51bGwoKTsKLSAgICAgICAgICAgIHJldHVybiAqdGhpczsKLSAgICAgICAgfQotICAgICAg
ICBtX3JlcCA9IFJlcDo6Y3JlYXRlKGQsIGwpOworICAgIGlmICghVVN0cmluZ0ltcGw6OmFsbG9j
Q2hhcnMobCkuZ2V0VmFsdWUoZCkpIHsKKyAgICAgICAgbWFrZU51bGwoKTsKKyAgICAgICAgcmV0
dXJuICp0aGlzOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IGw7IGkrKykKICAgICAg
ICAgZFtpXSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNbaV0pOyAvLyB1c2UgdW5zaWdu
ZWQgY2hhciB0byB6ZXJvLWV4dGVuZCBpbnN0ZWFkIG9mIHNpZ24tZXh0ZW5kCisgICAgbV9yZXAg
PSBSZXA6OmNyZWF0ZShkLCBsKTsKIAogICAgIHJldHVybiAqdGhpczsKIH0KQEAgLTE0NjUsNyAr
NjUzLDcgQEAgdWludDMyX3QgVVN0cmluZzo6dG9TdHJpY3RVSW50MzIoYm9vbCogbwogICAgICAg
ICAqb2sgPSBmYWxzZTsKIAogICAgIC8vIEVtcHR5IHN0cmluZyBpcyBub3QgT0suCi0gICAgaW50
IGxlbiA9IG1fcmVwLT5sZW47CisgICAgaW50IGxlbiA9IG1fcmVwLT5zaXplKCk7CiAgICAgaWYg
KGxlbiA9PSAwKQogICAgICAgICByZXR1cm4gMDsKICAgICBjb25zdCBVQ2hhciogcCA9IG1fcmVw
LT5kYXRhKCk7CkBAIC0xNjkyLDggKzg4MCw4IEBAIGludCBjb21wYXJlKGNvbnN0IFVTdHJpbmcm
IHMxLCBjb25zdCBVU3QKIAogYm9vbCBlcXVhbChjb25zdCBVU3RyaW5nOjpSZXAqIHIsIGNvbnN0
IFVTdHJpbmc6OlJlcCogYikKIHsKLSAgICBpbnQgbGVuZ3RoID0gci0+bGVuOwotICAgIGlmIChs
ZW5ndGggIT0gYi0+bGVuKQorICAgIGludCBsZW5ndGggPSByLT5zaXplKCk7CisgICAgaWYgKGxl
bmd0aCAhPSBiLT5zaXplKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBjb25zdCBVQ2hh
ciogZCA9IHItPmRhdGEoKTsKICAgICBjb25zdCBVQ2hhciogcyA9IGItPmRhdGEoKTsKSW5kZXg6
IEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvVVN0cmluZy5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvVVN0cmluZy5oCShyZXZpc2lvbiA1MjM0NikKKysrIEphdmFTY3JpcHRD
b3JlL3J1bnRpbWUvVVN0cmluZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw2ICsyNCw3IEBACiAj
ZGVmaW5lIFVTdHJpbmdfaAogCiAjaW5jbHVkZSAiQ29sbGVjdG9yLmgiCisjaW5jbHVkZSAiVVN0
cmluZ0ltcGwuaCIKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNp
bmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgpAQCAtNDAsOCArNDEsNiBAQCBuYW1lc3BhY2UgSlND
IHsKICAgICB1c2luZyBXVEY6OlBsYWNlbWVudE5ld0Fkb3B0VHlwZTsKICAgICB1c2luZyBXVEY6
OlBsYWNlbWVudE5ld0Fkb3B0OwogCi0gICAgY2xhc3MgSWRlbnRpZmllclRhYmxlOwotICAKICAg
ICBjbGFzcyBDU3RyaW5nIHsKICAgICBwdWJsaWM6CiAgICAgICAgIENTdHJpbmcoKQpAQCAtNzEs
MTc0ICs3MCwyMCBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgY2hhciogbV9kYXRhOwogICAg
IH07CiAKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ1N0cmluZyYsIGNvbnN0IENTdHJpbmcm
KTsKKwogICAgIHR5cGVkZWYgVmVjdG9yPGNoYXIsIDMyPiBDU3RyaW5nQnVmZmVyOwogCiAgICAg
Y2xhc3MgVVN0cmluZyB7CiAgICAgICAgIGZyaWVuZCBjbGFzcyBKSVQ7CiAKICAgICBwdWJsaWM6
Ci0gICAgICAgIHR5cGVkZWYgQ3Jvc3NUaHJlYWRSZWZDb3VudGVkPE93bkZhc3RNYWxsb2NQdHI8
VUNoYXI+ID4gU2hhcmVkVUNoYXI7Ci0gICAgICAgIHN0cnVjdCBCYXNlU3RyaW5nOwotICAgICAg
ICBzdHJ1Y3QgUmVwIDogTm9uY29weWFibGUgewotICAgICAgICAgICAgZnJpZW5kIGNsYXNzIEpJ
VDsKLQotICAgICAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVwPiBjcmVhdGUoVUNoYXIqIGJ1
ZmZlciwgaW50IGxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4g
YWRvcHRSZWYobmV3IEJhc2VTdHJpbmcoYnVmZmVyLCBsZW5ndGgpKTsKLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVwPiBjcmVhdGVFbXB0eUJ1ZmZlcihz
aXplX3Qgc2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2Fp
bnN0IGludGVnZXIgb3ZlcmZsb3cKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IChzdGQ6Om51
bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC8gc2l6ZW9mKFVDaGFyKSkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgdm9pZCogYnVmID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyeUZh
c3RNYWxsb2Moc2l6ZSAqIHNpemVvZihVQ2hhcikpLmdldFZhbHVlKGJ1ZikpCi0gICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IEJhc2VTdHJpbmcoc3RhdGljX2Nhc3Q8
VUNoYXIqPihidWYpLCAwLCBzaXplKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIHJldHVybiBhZG9wdFJlZihuZXcgQmFzZVN0cmluZygwLCAwLCAwKSk7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJlcD4gY3JlYXRlQ29weWluZyhj
b25zdCBVQ2hhciosIGludCk7Ci0gICAgICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxSZXA+IGNy
ZWF0ZShQYXNzUmVmUHRyPFJlcD4gYmFzZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLSAg
ICAgICAgICAgIC8vIENvbnN0cnVjdHMgYSBzdHJpbmcgZnJvbSBhIFVURi04IHN0cmluZywgdXNp
bmcgc3RyaWN0IGNvbnZlcnNpb24gKHNlZSBjb21tZW50cyBpbiBVVEY4LmgpLgotICAgICAgICAg
ICAgLy8gUmV0dXJucyBVU3RyaW5nOjpSZXA6Om51bGwgZm9yIG51bGwgaW5wdXQgb3IgY29udmVy
c2lvbiBmYWlsdXJlLgotICAgICAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVwPiBjcmVhdGVG
cm9tVVRGOChjb25zdCBjaGFyKik7Ci0KLSAgICAgICAgICAgIC8vIFVzZXMgU2hhcmVkVUNoYXIg
dG8gaGF2ZSBqb2ludCBvd25lcnNoaXAgb3ZlciB0aGUgVUNoYXIqLgotICAgICAgICAgICAgc3Rh
dGljIFBhc3NSZWZQdHI8UmVwPiBjcmVhdGUoVUNoYXIqLCBpbnQsIFBhc3NSZWZQdHI8U2hhcmVk
VUNoYXI+KTsKLQotICAgICAgICAgICAgU2hhcmVkVUNoYXIqIHNoYXJlZEJ1ZmZlcigpOwotICAg
ICAgICAgICAgdm9pZCBkZXN0cm95KCk7Ci0KLSAgICAgICAgICAgIGJvb2wgYmFzZUlzU2VsZigp
IGNvbnN0IHsgcmV0dXJuIG1faWRlbnRpZmllclRhYmxlQW5kRmxhZ3MuaXNGbGFnU2V0KEJhc2VT
dHJpbmdGbGFnKTsgfQotICAgICAgICAgICAgVUNoYXIqIGRhdGEoKSBjb25zdDsKLSAgICAgICAg
ICAgIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gbGVuOyB9Ci0KLSAgICAgICAgICAgIHVuc2ln
bmVkIGhhc2goKSBjb25zdCB7IGlmIChfaGFzaCA9PSAwKSBfaGFzaCA9IGNvbXB1dGVIYXNoKGRh
dGEoKSwgbGVuKTsgcmV0dXJuIF9oYXNoOyB9Ci0gICAgICAgICAgICB1bnNpZ25lZCBjb21wdXRl
ZEhhc2goKSBjb25zdCB7IEFTU0VSVChfaGFzaCk7IHJldHVybiBfaGFzaDsgfSAvLyBmYXN0IHBh
dGggZm9yIElkZW50aWZpZXJzCi0gICAgICAgICAgICB2b2lkIHNldEhhc2godW5zaWduZWQgaGFz
aCkgeyBBU1NFUlQoaGFzaCA9PSBjb21wdXRlSGFzaChkYXRhKCksIGxlbikpOyBfaGFzaCA9IGhh
c2g7IH0gLy8gZmFzdCBwYXRoIGZvciBJZGVudGlmaWVycwotCi0gICAgICAgICAgICBzdGF0aWMg
dW5zaWduZWQgY29tcHV0ZUhhc2goY29uc3QgVUNoYXIqLCBpbnQgbGVuZ3RoKTsKLSAgICAgICAg
ICAgIHN0YXRpYyB1bnNpZ25lZCBjb21wdXRlSGFzaChjb25zdCBjaGFyKiwgaW50IGxlbmd0aCk7
Ci0gICAgICAgICAgICBzdGF0aWMgdW5zaWduZWQgY29tcHV0ZUhhc2goY29uc3QgY2hhciogcykg
eyByZXR1cm4gY29tcHV0ZUhhc2gocywgc3RybGVuKHMpKTsgfQotCi0gICAgICAgICAgICBJZGVu
dGlmaWVyVGFibGUqIGlkZW50aWZpZXJUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1faWRlbnRpZmll
clRhYmxlQW5kRmxhZ3MuZ2V0KCk7IH0KLSAgICAgICAgICAgIHZvaWQgc2V0SWRlbnRpZmllclRh
YmxlKElkZW50aWZpZXJUYWJsZSogdGFibGUpIHsgQVNTRVJUKCFpc1N0YXRpYygpKTsgbV9pZGVu
dGlmaWVyVGFibGVBbmRGbGFncy5zZXQodGFibGUpOyB9Ci0KLSAgICAgICAgICAgIGJvb2wgaXNT
dGF0aWMoKSBjb25zdCB7IHJldHVybiBtX2lkZW50aWZpZXJUYWJsZUFuZEZsYWdzLmlzRmxhZ1Nl
dChTdGF0aWNGbGFnKTsgfQotICAgICAgICAgICAgdm9pZCBzZXRTdGF0aWMoYm9vbCk7Ci0gICAg
ICAgICAgICB2b2lkIHNldEJhc2VTdHJpbmcoUGFzc1JlZlB0cjxCYXNlU3RyaW5nPik7Ci0gICAg
ICAgICAgICBCYXNlU3RyaW5nKiBiYXNlU3RyaW5nKCk7Ci0gICAgICAgICAgICBjb25zdCBCYXNl
U3RyaW5nKiBiYXNlU3RyaW5nKCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIFJlcCogcmVmKCkgeyAr
K3JjOyByZXR1cm4gdGhpczsgfQotICAgICAgICAgICAgQUxXQVlTX0lOTElORSB2b2lkIGRlcmVm
KCkgeyBpZiAoLS1yYyA9PSAwKSBkZXN0cm95KCk7IH0KLQotICAgICAgICAgICAgdm9pZCBjaGVj
a0NvbnNpc3RlbmN5KCkgY29uc3Q7Ci0gICAgICAgICAgICBlbnVtIFVTdHJpbmdGbGFncyB7Ci0g
ICAgICAgICAgICAgICAgU3RhdGljRmxhZywKLSAgICAgICAgICAgICAgICBCYXNlU3RyaW5nRmxh
ZwotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgLy8gdW5zaGFyZWQgZGF0YQotICAgICAg
ICAgICAgaW50IG9mZnNldDsKLSAgICAgICAgICAgIGludCBsZW47Ci0gICAgICAgICAgICBpbnQg
cmM7IC8vIEZvciBudWxsIGFuZCBlbXB0eSBzdGF0aWMgc3RyaW5ncywgdGhpcyBmaWVsZCBkb2Vz
IG5vdCByZWZsZWN0IGEgY29ycmVjdCBjb3VudCwgYmVjYXVzZSByZWYvZGVyZWYgYXJlIG5vdCB0
aHJlYWQtc2FmZS4gQSBzcGVjaWFsIGNhc2UgaW4gZGVzdHJveSgpIGd1YXJhbnRlZXMgdGhhdCB0
aGVzZSBkbyBub3QgZ2V0IGRlbGV0ZWQuCi0gICAgICAgICAgICBtdXRhYmxlIHVuc2lnbmVkIF9o
YXNoOwotICAgICAgICAgICAgUHRyQW5kRmxhZ3M8SWRlbnRpZmllclRhYmxlLCBVU3RyaW5nRmxh
Z3M+IG1faWRlbnRpZmllclRhYmxlQW5kRmxhZ3M7Ci0KLSAgICAgICAgICAgIHN0YXRpYyBCYXNl
U3RyaW5nJiBudWxsKCkgeyByZXR1cm4gKm51bGxCYXNlU3RyaW5nOyB9Ci0gICAgICAgICAgICBz
dGF0aWMgQmFzZVN0cmluZyYgZW1wdHkoKSB7IHJldHVybiAqZW1wdHlCYXNlU3RyaW5nOyB9Ci0K
LSAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZUNhcGFjaXR5KGludCBjYXBhY2l0eSk7Ci0KLSAgICAg
ICAgcHJvdGVjdGVkOgotICAgICAgICAgICAgLy8gQ29uc3RydWN0b3IgZm9yIHVzZSBieSBCYXNl
U3RyaW5nIHN1YmNsYXNzOyB0aGV5IHVzZSB0aGUgdW5pb24gd2l0aCBtX2Jhc2VTdHJpbmcgZm9y
IGFub3RoZXIgcHVycG9zZS4KLSAgICAgICAgICAgIFJlcChpbnQgbGVuZ3RoKQotICAgICAgICAg
ICAgICAgIDogb2Zmc2V0KDApCi0gICAgICAgICAgICAgICAgLCBsZW4obGVuZ3RoKQotICAgICAg
ICAgICAgICAgICwgcmMoMSkKLSAgICAgICAgICAgICAgICAsIF9oYXNoKDApCi0gICAgICAgICAg
ICAgICAgLCBtX2Jhc2VTdHJpbmcoMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgUmVwKFBhc3NSZWZQdHI8QmFzZVN0cmluZz4gYmFzZSwgaW50IG9mZnNldElu
QmFzZSwgaW50IGxlbmd0aCkKLSAgICAgICAgICAgICAgICA6IG9mZnNldChvZmZzZXRJbkJhc2Up
Ci0gICAgICAgICAgICAgICAgLCBsZW4obGVuZ3RoKQotICAgICAgICAgICAgICAgICwgcmMoMSkK
LSAgICAgICAgICAgICAgICAsIF9oYXNoKDApCi0gICAgICAgICAgICAgICAgLCBtX2Jhc2VTdHJp
bmcoYmFzZS5yZWxlYXNlUmVmKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hl
Y2tDb25zaXN0ZW5jeSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1bmlvbiB7Ci0g
ICAgICAgICAgICAgICAgLy8gSWYgIWJhc2VJc1NlbGYoKQotICAgICAgICAgICAgICAgIEJhc2VT
dHJpbmcqIG1fYmFzZVN0cmluZzsKLSAgICAgICAgICAgICAgICAvLyBJZiBiYXNlSXNTZWxmKCkK
LSAgICAgICAgICAgICAgICBTaGFyZWRVQ2hhciogbV9zaGFyZWRCdWZmZXI7Ci0gICAgICAgICAg
ICB9OwotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICAvLyBGb3IgU21hbGxTdHJpbmdT
dG9yYWdlIHdoaWNoIGFsbG9jYXRlcyBhbiBhcnJheSBhbmQgZG9lcyBpbml0aWFsaXphdGlvbiBt
YW51YWxseS4KLSAgICAgICAgICAgIFJlcCgpIHsgfQotCi0gICAgICAgICAgICBmcmllbmQgY2xh
c3MgU21hbGxTdHJpbmdzU3RvcmFnZTsKLSAgICAgICAgICAgIGZyaWVuZCB2b2lkIGluaXRpYWxp
emVVU3RyaW5nKCk7Ci0gICAgICAgICAgICBKU19FWFBPUlREQVRBIHN0YXRpYyBCYXNlU3RyaW5n
KiBudWxsQmFzZVN0cmluZzsKLSAgICAgICAgICAgIEpTX0VYUE9SVERBVEEgc3RhdGljIEJhc2VT
dHJpbmcqIGVtcHR5QmFzZVN0cmluZzsKLSAgICAgICAgfTsKLQotCi0gICAgICAgIHN0cnVjdCBC
YXNlU3RyaW5nIDogcHVibGljIFJlcCB7Ci0gICAgICAgICAgICBib29sIGlzU2hhcmVkKCkgeyBy
ZXR1cm4gcmMgIT0gMSB8fCBpc0J1ZmZlclJlYWRPbmx5KCk7IH0KLSAgICAgICAgICAgIHZvaWQg
c2V0U2hhcmVkQnVmZmVyKFBhc3NSZWZQdHI8U2hhcmVkVUNoYXI+KTsKLQotICAgICAgICAgICAg
Ym9vbCBpc0J1ZmZlclJlYWRPbmx5KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBp
ZiAoIW1fc2hhcmVkQnVmZmVyKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dJc0J1ZmZlclJlYWRPbmx5KCk7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIC8vIHBvdGVudGlhbGx5IHNoYXJlZCBkYXRhLgotICAgICAgICAg
ICAgVUNoYXIqIGJ1ZjsKLSAgICAgICAgICAgIGludCBwcmVDYXBhY2l0eTsKLSAgICAgICAgICAg
IGludCB1c2VkUHJlQ2FwYWNpdHk7Ci0gICAgICAgICAgICBpbnQgY2FwYWNpdHk7Ci0gICAgICAg
ICAgICBpbnQgdXNlZENhcGFjaXR5OwotCi0gICAgICAgICAgICBzaXplX3QgcmVwb3J0ZWRDb3N0
OwotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICBCYXNlU3RyaW5nKFVDaGFyKiBidWZm
ZXIsIGludCBsZW5ndGgsIGludCBhZGRpdGlvbmFsQ2FwYWNpdHkgPSAwKQotICAgICAgICAgICAg
ICAgIDogUmVwKGxlbmd0aCkKLSAgICAgICAgICAgICAgICAsIGJ1ZihidWZmZXIpCi0gICAgICAg
ICAgICAgICAgLCBwcmVDYXBhY2l0eSgwKQotICAgICAgICAgICAgICAgICwgdXNlZFByZUNhcGFj
aXR5KDApCi0gICAgICAgICAgICAgICAgLCBjYXBhY2l0eShsZW5ndGggKyBhZGRpdGlvbmFsQ2Fw
YWNpdHkpCi0gICAgICAgICAgICAgICAgLCB1c2VkQ2FwYWNpdHkobGVuZ3RoKQotICAgICAgICAg
ICAgICAgICwgcmVwb3J0ZWRDb3N0KDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAg
bV9pZGVudGlmaWVyVGFibGVBbmRGbGFncy5zZXRGbGFnKEJhc2VTdHJpbmdGbGFnKTsKLSAgICAg
ICAgICAgICAgICBjaGVja0NvbnNpc3RlbmN5KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIFNoYXJlZFVDaGFyKiBzaGFyZWRCdWZmZXIoKTsKLSAgICAgICAgICAgIGJvb2wgc2xvd0lz
QnVmZmVyUmVhZE9ubHkoKTsKLQotICAgICAgICAgICAgZnJpZW5kIHN0cnVjdCBSZXA7Ci0gICAg
ICAgICAgICBmcmllbmQgY2xhc3MgU21hbGxTdHJpbmdzU3RvcmFnZTsKLSAgICAgICAgICAgIGZy
aWVuZCB2b2lkIGluaXRpYWxpemVVU3RyaW5nKCk7Ci0gICAgICAgIH07Ci0KKyAgICAgICAgdHlw
ZWRlZiBVU3RyaW5nSW1wbCBSZXA7CisgICAgCiAgICAgcHVibGljOgorICAgICAgICAvLyBVU3Ry
aW5nIGNvbnN0cnVjdG9ycyBwYXNzZWQgY2hhcipzIGFzc3VtZSBJU08gTGF0aW4tMSBlbmNvZGlu
ZzsgZm9yIFVURjggdXNlICdjcmVhdGVGcm9tVVRGOCcsIGJlbG93LgogICAgICAgICBVU3RyaW5n
KCk7Ci0gICAgICAgIC8vIENvbnN0cnVjdG9yIGZvciBudWxsLXRlcm1pbmF0ZWQgQVNDSUkgc3Ry
aW5nLgotICAgICAgICBVU3RyaW5nKGNvbnN0IGNoYXIqKTsKLSAgICAgICAgLy8gQ29uc3RydWN0
b3IgZm9yIG5vbi1udWxsLXRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5nLgorICAgICAgICBVU3RyaW5n
KGNvbnN0IGNoYXIqKTsgLy8gQ29uc3RydWN0b3IgZm9yIG51bGwtdGVybWluYXRlZCBzdHJpbmcu
CiAgICAgICAgIFVTdHJpbmcoY29uc3QgY2hhciosIGludCBsZW5ndGgpOwogICAgICAgICBVU3Ry
aW5nKGNvbnN0IFVDaGFyKiwgaW50IGxlbmd0aCk7CiAgICAgICAgIFVTdHJpbmcoY29uc3QgVmVj
dG9yPFVDaGFyPiYgYnVmZmVyKTsKQEAgLTI2MCw2ICsxMDUsNyBAQCBuYW1lc3BhY2UgSlNDIHsK
IAogICAgICAgICBzdGF0aWMgVVN0cmluZyBjcmVhdGVOb25Db3B5aW5nKFVDaGFyKiBjLCBpbnQg
bGVuZ3RoKTsKICAgICAgICAgc3RhdGljIFVTdHJpbmcgY3JlYXRlRnJvbVVURjgoY29uc3QgY2hh
ciopOworICAgICAgICBzdGF0aWMgVVN0cmluZyBjcmVhdGVVbmluaXRpYWxpemVkKHVuc2lnbmVk
IGxlbmd0aCwgVUNoYXIqJiBvdXRwdXQpOwogCiAgICAgICAgIHN0YXRpYyBVU3RyaW5nIGZyb20o
aW50KTsKICAgICAgICAgc3RhdGljIFVTdHJpbmcgZnJvbShsb25nIGxvbmcpOwpAQCAtMjg3LDEy
ICsxMzMsNiBAQCBuYW1lc3BhY2UgSlNDIHsKIAogICAgICAgICBVU3RyaW5nIHJlcGxhY2VSYW5n
ZShpbnQgcmFuZ2VTdGFydCwgaW50IFJhbmdlRW5kLCBjb25zdCBVU3RyaW5nJiByZXBsYWNlbWVu
dCkgY29uc3Q7CiAKLSAgICAgICAgVVN0cmluZyYgYXBwZW5kKGNvbnN0IFVTdHJpbmcmKTsKLSAg
ICAgICAgVVN0cmluZyYgYXBwZW5kKGNvbnN0IGNoYXIqKTsKLSAgICAgICAgVVN0cmluZyYgYXBw
ZW5kKFVDaGFyKTsKLSAgICAgICAgVVN0cmluZyYgYXBwZW5kKGNoYXIgYykgeyByZXR1cm4gYXBw
ZW5kKHN0YXRpY19jYXN0PFVDaGFyPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSkpOyB9
Ci0gICAgICAgIFVTdHJpbmcmIGFwcGVuZChjb25zdCBVQ2hhciosIGludCBzaXplKTsKLQogICAg
ICAgICBib29sIGdldENTdHJpbmcoQ1N0cmluZ0J1ZmZlciYpIGNvbnN0OwogCiAgICAgICAgIC8v
IE5PVEU6IFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yICpkZWJ1Z2dpbmcqIHB1
cnBvc2VzIGFzIGl0CkBAIC0zMTEsMTMgKzE1MSwxMCBAQCBuYW1lc3BhY2UgSlNDIHsKIAogICAg
ICAgICBVU3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgY2hhcipjKTsKIAotICAgICAgICBVU3RyaW5n
JiBvcGVyYXRvcis9KGNvbnN0IFVTdHJpbmcmIHMpIHsgcmV0dXJuIGFwcGVuZChzKTsgfQotICAg
ICAgICBVU3RyaW5nJiBvcGVyYXRvcis9KGNvbnN0IGNoYXIqIHMpIHsgcmV0dXJuIGFwcGVuZChz
KTsgfQotCiAgICAgICAgIGNvbnN0IFVDaGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9yZXAt
PmRhdGEoKTsgfQogCiAgICAgICAgIGJvb2wgaXNOdWxsKCkgY29uc3QgeyByZXR1cm4gKG1fcmVw
ID09ICZSZXA6Om51bGwoKSk7IH0KLSAgICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1
cm4gKCFtX3JlcC0+bGVuKTsgfQorICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVy
biAoIW1fcmVwLT5zaXplKCkpOyB9CiAKICAgICAgICAgYm9vbCBpczhCaXQoKSBjb25zdDsKIApA
QCAtMzUzLDIyICsxOTAsOSBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgICAgIEFTU0VSVCht
X3JlcCk7CiAgICAgICAgIH0KIAotICAgICAgICBzaXplX3QgY29zdCgpIGNvbnN0OwotCi0gICAg
ICAgIC8vIEF0dGVtcHQgdG8gZ3JvdyB0aGlzIHN0cmluZyBzdWNoIHRoYXQgaXQgY2FuIGdyb3cg
dG8gYSB0b3RhbCBsZW5ndGggb2YgJ2NhcGFjaXR5JwotICAgICAgICAvLyB3aXRob3V0IHJlYWxs
b2NhdGlvbi4gIFRoaXMgbWF5IGZhaWwgYSBudW1iZXIgb2YgcmVhc29ucyAtIGlmIHRoZSBCYXNp
Y1N0cmluZyBpcwotICAgICAgICAvLyBzaGFyZWQgYW5kIGFub3RoZXIgc3RyaW5nIGlzIHVzaW5n
IHBhcnQgb2YgdGhlIGNhcGFjaXR5IGJleW9uZCBvdXIgZW5kIHBvaW50LCBpZgotICAgICAgICAv
LyB0aGUgcmVhbGxvYyBmYWlscywgb3IgaWYgdGhpcyBzdHJpbmcgaXMgZW1wdHkgYW5kIGhhcyBu
byBzdG9yYWdlLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGlzIG1ldGhvZCByZXR1cm5zIGEg
Ym9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MuCi0gICAgICAgIGJvb2wgcmVzZXJ2ZUNhcGFjaXR5
KGludCBjYXBhY2l0eSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1fcmVwLT5yZXNl
cnZlQ2FwYWNpdHkoY2FwYWNpdHkpOwotICAgICAgICB9CisgICAgICAgIHNpemVfdCBjb3N0KCkg
Y29uc3QgeyByZXR1cm4gbV9yZXAtPmNvc3QoKTsgfQogCiAgICAgcHJpdmF0ZToKLSAgICAgICAg
dm9pZCBleHBhbmRDYXBhY2l0eShpbnQgcmVxdWlyZWRMZW5ndGgpOwotICAgICAgICB2b2lkIGV4
cGFuZFByZUNhcGFjaXR5KGludCByZXF1aXJlZFByZUNhcCk7CiAgICAgICAgIHZvaWQgbWFrZU51
bGwoKTsKIAogICAgICAgICBSZWZQdHI8UmVwPiBtX3JlcDsKQEAgLTM3NiwxMSArMjAwLDcgQEAg
bmFtZXNwYWNlIEpTQyB7CiAKICAgICAgICAgZnJpZW5kIHZvaWQgaW5pdGlhbGl6ZVVTdHJpbmco
KTsKICAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBVU3RyaW5nJiwgY29uc3Qg
VVN0cmluZyYpOwotICAgICAgICBmcmllbmQgUGFzc1JlZlB0cjxSZXA+IGNvbmNhdGVuYXRlKFJl
cCosIFJlcCopOyAvLyByZXR1cm5zIDAgaWYgb3V0IG9mIG1lbW9yeQogICAgIH07Ci0gICAgUGFz
c1JlZlB0cjxVU3RyaW5nOjpSZXA+IGNvbmNhdGVuYXRlKFVTdHJpbmc6OlJlcCosIFVTdHJpbmc6
OlJlcCopOwotICAgIFBhc3NSZWZQdHI8VVN0cmluZzo6UmVwPiBjb25jYXRlbmF0ZShVU3RyaW5n
OjpSZXAqLCBpbnQpOwotICAgIFBhc3NSZWZQdHI8VVN0cmluZzo6UmVwPiBjb25jYXRlbmF0ZShV
U3RyaW5nOjpSZXAqLCBkb3VibGUpOwogCiAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25z
dCBVU3RyaW5nJiBzMSwgY29uc3QgVVN0cmluZyYgczIpCiAgICAgewpAQCAtNDI4LDcyICsyNDgs
OCBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgcmV0dXJuICFKU0M6Om9wZXJhdG9yPT0oczEs
IHMyKTsKICAgICB9CiAKLSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ1N0cmluZyYsIGNvbnN0
IENTdHJpbmcmKTsKLQotICAgIGlubGluZSBVU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBVU3RyaW5n
JiBzMSwgY29uc3QgVVN0cmluZyYgczIpCi0gICAgewotICAgICAgICBSZWZQdHI8VVN0cmluZzo6
UmVwPiByZXN1bHQgPSBjb25jYXRlbmF0ZShzMS5yZXAoKSwgczIucmVwKCkpOwotICAgICAgICBy
ZXR1cm4gVVN0cmluZyhyZXN1bHQgPyByZXN1bHQucmVsZWFzZSgpIDogVVN0cmluZzo6bnVsbFJl
cCgpKTsKLSAgICB9Ci0KICAgICBpbnQgY29tcGFyZShjb25zdCBVU3RyaW5nJiwgY29uc3QgVVN0
cmluZyYpOwogCi0gICAgYm9vbCBlcXVhbChjb25zdCBVU3RyaW5nOjpSZXAqLCBjb25zdCBVU3Ry
aW5nOjpSZXAqKTsKLQotICAgIGlubGluZSBQYXNzUmVmUHRyPFVTdHJpbmc6OlJlcD4gVVN0cmlu
Zzo6UmVwOjpjcmVhdGUoUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IHJlcCwgaW50IG9mZnNldCwg
aW50IGxlbmd0aCkKLSAgICB7Ci0gICAgICAgIEFTU0VSVChyZXApOwotICAgICAgICByZXAtPmNo
ZWNrQ29uc2lzdGVuY3koKTsKLQotICAgICAgICBpbnQgcmVwT2Zmc2V0ID0gcmVwLT5vZmZzZXQ7
Ci0KLSAgICAgICAgUGFzc1JlZlB0cjxCYXNlU3RyaW5nPiBiYXNlID0gcmVwLT5iYXNlU3RyaW5n
KCk7Ci0KLSAgICAgICAgQVNTRVJUKC0ob2Zmc2V0ICsgcmVwT2Zmc2V0KSA8PSBiYXNlLT51c2Vk
UHJlQ2FwYWNpdHkpOwotICAgICAgICBBU1NFUlQob2Zmc2V0ICsgcmVwT2Zmc2V0ICsgbGVuZ3Ro
IDw9IGJhc2UtPnVzZWRDYXBhY2l0eSk7Ci0KLSAgICAgICAgLy8gU3RlYWwgdGhlIHNpbmdsZSBy
ZWZlcmVuY2UgdGhpcyBSZXAgd2FzIGNyZWF0ZWQgd2l0aC4KLSAgICAgICAgcmV0dXJuIGFkb3B0
UmVmKG5ldyBSZXAoYmFzZSwgcmVwT2Zmc2V0ICsgb2Zmc2V0LCBsZW5ndGgpKTsKLSAgICB9Ci0K
LSAgICBpbmxpbmUgVUNoYXIqIFVTdHJpbmc6OlJlcDo6ZGF0YSgpIGNvbnN0Ci0gICAgewotICAg
ICAgICBjb25zdCBCYXNlU3RyaW5nKiBiYXNlID0gYmFzZVN0cmluZygpOwotICAgICAgICByZXR1
cm4gYmFzZS0+YnVmICsgYmFzZS0+cHJlQ2FwYWNpdHkgKyBvZmZzZXQ7Ci0gICAgfQotCi0gICAg
aW5saW5lIHZvaWQgVVN0cmluZzo6UmVwOjpzZXRTdGF0aWMoYm9vbCB2KQotICAgIHsKLSAgICAg
ICAgQVNTRVJUKCFpZGVudGlmaWVyVGFibGUoKSk7Ci0gICAgICAgIGlmICh2KQotICAgICAgICAg
ICAgbV9pZGVudGlmaWVyVGFibGVBbmRGbGFncy5zZXRGbGFnKFN0YXRpY0ZsYWcpOwotICAgICAg
ICBlbHNlCi0gICAgICAgICAgICBtX2lkZW50aWZpZXJUYWJsZUFuZEZsYWdzLmNsZWFyRmxhZyhT
dGF0aWNGbGFnKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgdm9pZCBVU3RyaW5nOjpSZXA6OnNldEJh
c2VTdHJpbmcoUGFzc1JlZlB0cjxCYXNlU3RyaW5nPiBiYXNlKQotICAgIHsKLSAgICAgICAgQVNT
RVJUKGJhc2UgIT0gdGhpcyk7Ci0gICAgICAgIEFTU0VSVCghYmFzZUlzU2VsZigpKTsKLSAgICAg
ICAgbV9iYXNlU3RyaW5nID0gYmFzZS5yZWxlYXNlUmVmKCk7Ci0gICAgfQotCi0gICAgaW5saW5l
IFVTdHJpbmc6OkJhc2VTdHJpbmcqIFVTdHJpbmc6OlJlcDo6YmFzZVN0cmluZygpCi0gICAgewot
ICAgICAgICByZXR1cm4gIWJhc2VJc1NlbGYoKSA/IG1fYmFzZVN0cmluZyA6IHJlaW50ZXJwcmV0
X2Nhc3Q8QmFzZVN0cmluZyo+KHRoaXMpIDsKLSAgICB9Ci0KLSAgICBpbmxpbmUgY29uc3QgVVN0
cmluZzo6QmFzZVN0cmluZyogVVN0cmluZzo6UmVwOjpiYXNlU3RyaW5nKCkgY29uc3QKLSAgICB7
Ci0gICAgICAgIHJldHVybiBjb25zdF9jYXN0PFJlcCo+KHRoaXMpLT5iYXNlU3RyaW5nKCk7Ci0g
ICAgfQotCi0jaWZkZWYgTkRFQlVHCi0gICAgaW5saW5lIHZvaWQgVVN0cmluZzo6UmVwOjpjaGVj
a0NvbnNpc3RlbmN5KCkgY29uc3QKLSAgICB7Ci0gICAgfQotI2VuZGlmCi0KICAgICBpbmxpbmUg
VVN0cmluZzo6VVN0cmluZygpCiAgICAgICAgIDogbV9yZXAoJlJlcDo6bnVsbCgpKQogICAgIHsK
QEAgLTUxNiwyMyArMjcyLDYgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgLy8gZml4IFVTdHJpbmcg
c2l6ZXMgdG8gYmUgc2l6ZV90IGluc3RlYWQgb2YgaW50CiAgICAgc3RhdGljIGNvbnN0IGludCBt
aW5TaGFyZVNpemUgPSBIZWFwOjptaW5FeHRyYUNvc3QgLyBzaXplb2YoVUNoYXIpOwogCi0gICAg
aW5saW5lIHNpemVfdCBVU3RyaW5nOjpjb3N0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEJhc2VT
dHJpbmcqIGJhc2UgPSBtX3JlcC0+YmFzZVN0cmluZygpOwotICAgICAgICBzaXplX3QgY2FwYWNp
dHkgPSAoYmFzZS0+Y2FwYWNpdHkgKyBiYXNlLT5wcmVDYXBhY2l0eSkgKiBzaXplb2YoVUNoYXIp
OwotICAgICAgICBzaXplX3QgcmVwb3J0ZWRDb3N0ID0gYmFzZS0+cmVwb3J0ZWRDb3N0OwotICAg
ICAgICBBU1NFUlQoY2FwYWNpdHkgPj0gcmVwb3J0ZWRDb3N0KTsKLQotICAgICAgICBzaXplX3Qg
Y2FwYWNpdHlEZWx0YSA9IGNhcGFjaXR5IC0gcmVwb3J0ZWRDb3N0OwotCi0gICAgICAgIGlmIChj
YXBhY2l0eURlbHRhIDwgc3RhdGljX2Nhc3Q8c2l6ZV90PihtaW5TaGFyZVNpemUpKQotICAgICAg
ICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgYmFzZS0+cmVwb3J0ZWRDb3N0ID0gY2FwYWNpdHk7
Ci0KLSAgICAgICAgcmV0dXJuIGNhcGFjaXR5RGVsdGE7Ci0gICAgfQotCiAgICAgc3RydWN0IElk
ZW50aWZpZXJSZXBIYXNoIDogUHRySGFzaDxSZWZQdHI8SlNDOjpVU3RyaW5nOjpSZXA+ID4gewog
ICAgICAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBSZWZQdHI8SlNDOjpVU3RyaW5nOjpS
ZXA+JiBrZXkpIHsgcmV0dXJuIGtleS0+Y29tcHV0ZWRIYXNoKCk7IH0KICAgICAgICAgc3RhdGlj
IHVuc2lnbmVkIGhhc2goSlNDOjpVU3RyaW5nOjpSZXAqIGtleSkgeyByZXR1cm4ga2V5LT5jb21w
dXRlZEhhc2goKTsgfQpAQCAtNjE4LDcgKzM1Nyw4IEBAIG5hbWVzcGFjZSBKU0MgewogCiAgICAg
ICAgIFVDaGFyKiBidWZmZXI7CiAgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9IGFkYXB0ZXIxLmxl
bmd0aCgpICsgYWRhcHRlcjIubGVuZ3RoKCk7Ci0gICAgICAgIGlmICghdHJ5RmFzdE1hbGxvYyhs
ZW5ndGggKiBzaXplb2YoVUNoYXIpKS5nZXRWYWx1ZShidWZmZXIpKQorICAgICAgICBVU3RyaW5n
IHJlc3VsdFN0cmluZyA9IFVTdHJpbmc6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVuZ3RoLCBidWZm
ZXIpOworICAgICAgICBpZiAoIWJ1ZmZlcikKICAgICAgICAgICAgIHJldHVybiBVU3RyaW5nKCk7
CiAKICAgICAgICAgVUNoYXIqIHJlc3VsdCA9IGJ1ZmZlcjsKQEAgLTYyNiw3ICszNjYsNyBAQCBu
YW1lc3BhY2UgSlNDIHsKICAgICAgICAgcmVzdWx0ICs9IGFkYXB0ZXIxLmxlbmd0aCgpOwogICAg
ICAgICBhZGFwdGVyMi53cml0ZVRvKHJlc3VsdCk7CiAKLSAgICAgICAgcmV0dXJuIFVTdHJpbmc6
OmNyZWF0ZU5vbkNvcHlpbmcoYnVmZmVyLCBsZW5ndGgpOworICAgICAgICByZXR1cm4gcmVzdWx0
U3RyaW5nOwogICAgIH0KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmluZ1R5cGUxLCB0eXBl
bmFtZSBTdHJpbmdUeXBlMiwgdHlwZW5hbWUgU3RyaW5nVHlwZTM+CkBAIC02MzgsNyArMzc4LDgg
QEAgbmFtZXNwYWNlIEpTQyB7CiAKICAgICAgICAgVUNoYXIqIGJ1ZmZlcjsKICAgICAgICAgdW5z
aWduZWQgbGVuZ3RoID0gYWRhcHRlcjEubGVuZ3RoKCkgKyBhZGFwdGVyMi5sZW5ndGgoKSArIGFk
YXB0ZXIzLmxlbmd0aCgpOwotICAgICAgICBpZiAoIXRyeUZhc3RNYWxsb2MobGVuZ3RoICogc2l6
ZW9mKFVDaGFyKSkuZ2V0VmFsdWUoYnVmZmVyKSkKKyAgICAgICAgVVN0cmluZyByZXN1bHRTdHJp
bmcgPSBVU3RyaW5nOjpjcmVhdGVVbmluaXRpYWxpemVkKGxlbmd0aCwgYnVmZmVyKTsKKyAgICAg
ICAgaWYgKCFidWZmZXIpCiAgICAgICAgICAgICByZXR1cm4gVVN0cmluZygpOwogCiAgICAgICAg
IFVDaGFyKiByZXN1bHQgPSBidWZmZXI7CkBAIC02NDgsNyArMzg5LDcgQEAgbmFtZXNwYWNlIEpT
QyB7CiAgICAgICAgIHJlc3VsdCArPSBhZGFwdGVyMi5sZW5ndGgoKTsKICAgICAgICAgYWRhcHRl
cjMud3JpdGVUbyhyZXN1bHQpOwogCi0gICAgICAgIHJldHVybiBVU3RyaW5nOjpjcmVhdGVOb25D
b3B5aW5nKGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdFN0cmluZzsKICAg
ICB9CiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpbmdUeXBlMSwgdHlwZW5hbWUgU3RyaW5n
VHlwZTIsIHR5cGVuYW1lIFN0cmluZ1R5cGUzLCB0eXBlbmFtZSBTdHJpbmdUeXBlND4KQEAgLTY2
MSw3ICs0MDIsOCBAQCBuYW1lc3BhY2UgSlNDIHsKIAogICAgICAgICBVQ2hhciogYnVmZmVyOwog
ICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSBhZGFwdGVyMS5sZW5ndGgoKSArIGFkYXB0ZXIyLmxl
bmd0aCgpICsgYWRhcHRlcjMubGVuZ3RoKCkgKyBhZGFwdGVyNC5sZW5ndGgoKTsKLSAgICAgICAg
aWYgKCF0cnlGYXN0TWFsbG9jKGxlbmd0aCAqIHNpemVvZihVQ2hhcikpLmdldFZhbHVlKGJ1ZmZl
cikpCisgICAgICAgIFVTdHJpbmcgcmVzdWx0U3RyaW5nID0gVVN0cmluZzo6Y3JlYXRlVW5pbml0
aWFsaXplZChsZW5ndGgsIGJ1ZmZlcik7CisgICAgICAgIGlmICghYnVmZmVyKQogICAgICAgICAg
ICAgcmV0dXJuIFVTdHJpbmcoKTsKIAogICAgICAgICBVQ2hhciogcmVzdWx0ID0gYnVmZmVyOwpA
QCAtNjczLDcgKzQxNSw3IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICByZXN1bHQgKz0gYWRh
cHRlcjMubGVuZ3RoKCk7CiAgICAgICAgIGFkYXB0ZXI0LndyaXRlVG8ocmVzdWx0KTsKIAotICAg
ICAgICByZXR1cm4gVVN0cmluZzo6Y3JlYXRlTm9uQ29weWluZyhidWZmZXIsIGxlbmd0aCk7Cisg
ICAgICAgIHJldHVybiByZXN1bHRTdHJpbmc7CiAgICAgfQogCiAgICAgdGVtcGxhdGU8dHlwZW5h
bWUgU3RyaW5nVHlwZTEsIHR5cGVuYW1lIFN0cmluZ1R5cGUyLCB0eXBlbmFtZSBTdHJpbmdUeXBl
MywgdHlwZW5hbWUgU3RyaW5nVHlwZTQsIHR5cGVuYW1lIFN0cmluZ1R5cGU1PgpAQCAtNjg3LDcg
KzQyOSw4IEBAIG5hbWVzcGFjZSBKU0MgewogCiAgICAgICAgIFVDaGFyKiBidWZmZXI7CiAgICAg
ICAgIHVuc2lnbmVkIGxlbmd0aCA9IGFkYXB0ZXIxLmxlbmd0aCgpICsgYWRhcHRlcjIubGVuZ3Ro
KCkgKyBhZGFwdGVyMy5sZW5ndGgoKSArIGFkYXB0ZXI0Lmxlbmd0aCgpICsgYWRhcHRlcjUubGVu
Z3RoKCk7Ci0gICAgICAgIGlmICghdHJ5RmFzdE1hbGxvYyhsZW5ndGggKiBzaXplb2YoVUNoYXIp
KS5nZXRWYWx1ZShidWZmZXIpKQorICAgICAgICBVU3RyaW5nIHJlc3VsdFN0cmluZyA9IFVTdHJp
bmc6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVuZ3RoLCBidWZmZXIpOworICAgICAgICBpZiAoIWJ1
ZmZlcikKICAgICAgICAgICAgIHJldHVybiBVU3RyaW5nKCk7CiAKICAgICAgICAgVUNoYXIqIHJl
c3VsdCA9IGJ1ZmZlcjsKQEAgLTcwMSw3ICs0NDQsNyBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAg
ICAgcmVzdWx0ICs9IGFkYXB0ZXI0Lmxlbmd0aCgpOwogICAgICAgICBhZGFwdGVyNS53cml0ZVRv
KHJlc3VsdCk7CiAKLSAgICAgICAgcmV0dXJuIFVTdHJpbmc6OmNyZWF0ZU5vbkNvcHlpbmcoYnVm
ZmVyLCBsZW5ndGgpOworICAgICAgICByZXR1cm4gcmVzdWx0U3RyaW5nOwogICAgIH0KIAogICAg
IHRlbXBsYXRlPHR5cGVuYW1lIFN0cmluZ1R5cGUxLCB0eXBlbmFtZSBTdHJpbmdUeXBlMiwgdHlw
ZW5hbWUgU3RyaW5nVHlwZTMsIHR5cGVuYW1lIFN0cmluZ1R5cGU0LCB0eXBlbmFtZSBTdHJpbmdU
eXBlNSwgdHlwZW5hbWUgU3RyaW5nVHlwZTY+CkBAIC03MTYsNyArNDU5LDggQEAgbmFtZXNwYWNl
IEpTQyB7CiAKICAgICAgICAgVUNoYXIqIGJ1ZmZlcjsKICAgICAgICAgdW5zaWduZWQgbGVuZ3Ro
ID0gYWRhcHRlcjEubGVuZ3RoKCkgKyBhZGFwdGVyMi5sZW5ndGgoKSArIGFkYXB0ZXIzLmxlbmd0
aCgpICsgYWRhcHRlcjQubGVuZ3RoKCkgKyBhZGFwdGVyNS5sZW5ndGgoKSArIGFkYXB0ZXI2Lmxl
bmd0aCgpOwotICAgICAgICBpZiAoIXRyeUZhc3RNYWxsb2MobGVuZ3RoICogc2l6ZW9mKFVDaGFy
KSkuZ2V0VmFsdWUoYnVmZmVyKSkKKyAgICAgICAgVVN0cmluZyByZXN1bHRTdHJpbmcgPSBVU3Ry
aW5nOjpjcmVhdGVVbmluaXRpYWxpemVkKGxlbmd0aCwgYnVmZmVyKTsKKyAgICAgICAgaWYgKCFi
dWZmZXIpCiAgICAgICAgICAgICByZXR1cm4gVVN0cmluZygpOwogCiAgICAgICAgIFVDaGFyKiBy
ZXN1bHQgPSBidWZmZXI7CkBAIC03MzIsNyArNDc2LDcgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAg
ICAgIHJlc3VsdCArPSBhZGFwdGVyNS5sZW5ndGgoKTsKICAgICAgICAgYWRhcHRlcjYud3JpdGVU
byhyZXN1bHQpOwogCi0gICAgICAgIHJldHVybiBVU3RyaW5nOjpjcmVhdGVOb25Db3B5aW5nKGJ1
ZmZlciwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdFN0cmluZzsKICAgICB9CiAKICAg
ICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpbmdUeXBlMSwgdHlwZW5hbWUgU3RyaW5nVHlwZTIsIHR5
cGVuYW1lIFN0cmluZ1R5cGUzLCB0eXBlbmFtZSBTdHJpbmdUeXBlNCwgdHlwZW5hbWUgU3RyaW5n
VHlwZTUsIHR5cGVuYW1lIFN0cmluZ1R5cGU2LCB0eXBlbmFtZSBTdHJpbmdUeXBlNz4KQEAgLTc0
OCw3ICs0OTIsOCBAQCBuYW1lc3BhY2UgSlNDIHsKIAogICAgICAgICBVQ2hhciogYnVmZmVyOwog
ICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSBhZGFwdGVyMS5sZW5ndGgoKSArIGFkYXB0ZXIyLmxl
bmd0aCgpICsgYWRhcHRlcjMubGVuZ3RoKCkgKyBhZGFwdGVyNC5sZW5ndGgoKSArIGFkYXB0ZXI1
Lmxlbmd0aCgpICsgYWRhcHRlcjYubGVuZ3RoKCkgKyBhZGFwdGVyNy5sZW5ndGgoKTsKLSAgICAg
ICAgaWYgKCF0cnlGYXN0TWFsbG9jKGxlbmd0aCAqIHNpemVvZihVQ2hhcikpLmdldFZhbHVlKGJ1
ZmZlcikpCisgICAgICAgIFVTdHJpbmcgcmVzdWx0U3RyaW5nID0gVVN0cmluZzo6Y3JlYXRlVW5p
bml0aWFsaXplZChsZW5ndGgsIGJ1ZmZlcik7CisgICAgICAgIGlmICghYnVmZmVyKQogICAgICAg
ICAgICAgcmV0dXJuIFVTdHJpbmcoKTsKIAogICAgICAgICBVQ2hhciogcmVzdWx0ID0gYnVmZmVy
OwpAQCAtNzY2LDcgKzUxMSw3IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICByZXN1bHQgKz0g
YWRhcHRlcjYubGVuZ3RoKCk7CiAgICAgICAgIGFkYXB0ZXI3LndyaXRlVG8ocmVzdWx0KTsKIAot
ICAgICAgICByZXR1cm4gVVN0cmluZzo6Y3JlYXRlTm9uQ29weWluZyhidWZmZXIsIGxlbmd0aCk7
CisgICAgICAgIHJldHVybiByZXN1bHRTdHJpbmc7CiAgICAgfQogCiAgICAgdGVtcGxhdGU8dHlw
ZW5hbWUgU3RyaW5nVHlwZTEsIHR5cGVuYW1lIFN0cmluZ1R5cGUyLCB0eXBlbmFtZSBTdHJpbmdU
eXBlMywgdHlwZW5hbWUgU3RyaW5nVHlwZTQsIHR5cGVuYW1lIFN0cmluZ1R5cGU1LCB0eXBlbmFt
ZSBTdHJpbmdUeXBlNiwgdHlwZW5hbWUgU3RyaW5nVHlwZTcsIHR5cGVuYW1lIFN0cmluZ1R5cGU4
PgpAQCAtNzgzLDcgKzUyOCw4IEBAIG5hbWVzcGFjZSBKU0MgewogCiAgICAgICAgIFVDaGFyKiBi
dWZmZXI7CiAgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9IGFkYXB0ZXIxLmxlbmd0aCgpICsgYWRh
cHRlcjIubGVuZ3RoKCkgKyBhZGFwdGVyMy5sZW5ndGgoKSArIGFkYXB0ZXI0Lmxlbmd0aCgpICsg
YWRhcHRlcjUubGVuZ3RoKCkgKyBhZGFwdGVyNi5sZW5ndGgoKSArIGFkYXB0ZXI3Lmxlbmd0aCgp
ICsgYWRhcHRlcjgubGVuZ3RoKCk7Ci0gICAgICAgIGlmICghdHJ5RmFzdE1hbGxvYyhsZW5ndGgg
KiBzaXplb2YoVUNoYXIpKS5nZXRWYWx1ZShidWZmZXIpKQorICAgICAgICBVU3RyaW5nIHJlc3Vs
dFN0cmluZyA9IFVTdHJpbmc6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVuZ3RoLCBidWZmZXIpOwor
ICAgICAgICBpZiAoIWJ1ZmZlcikKICAgICAgICAgICAgIHJldHVybiBVU3RyaW5nKCk7CiAKICAg
ICAgICAgVUNoYXIqIHJlc3VsdCA9IGJ1ZmZlcjsKQEAgLTgwMyw3ICs1NDksNyBAQCBuYW1lc3Bh
Y2UgSlNDIHsKICAgICAgICAgcmVzdWx0ICs9IGFkYXB0ZXI3Lmxlbmd0aCgpOwogICAgICAgICBh
ZGFwdGVyOC53cml0ZVRvKHJlc3VsdCk7CiAKLSAgICAgICAgcmV0dXJuIFVTdHJpbmc6OmNyZWF0
ZU5vbkNvcHlpbmcoYnVmZmVyLCBsZW5ndGgpOworICAgICAgICByZXR1cm4gcmVzdWx0U3RyaW5n
OwogICAgIH0KIAogfSAvLyBuYW1lc3BhY2UgSlNDCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ydW50
aW1lL1VTdHJpbmdJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ydW50aW1l
L1VTdHJpbmdJbXBsLmNwcAkocmV2aXNpb24gMCkKKysrIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUv
VVN0cmluZ0ltcGwuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiVVN0cmluZ0ltcGwuaCIKKworI2luY2x1ZGUgIklkZW50aWZpZXIuaCIKKyNp
bmNsdWRlICJVU3RyaW5nLmgiCisjaW5jbHVkZSAiVVRGOC5oIgorCit1c2luZyBuYW1lc3BhY2Ug
V1RGOjpVbmljb2RlOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIEpTQyB7Cisg
CitTaGFyZWRVQ2hhciogVVN0cmluZ0ltcGw6OmJhc2VTaGFyZWRCdWZmZXIoKQoreworICAgIEFT
U0VSVCgoYnVmZmVyT3duZXJzaGlwKCkgPT0gQnVmZmVyU2hhcmVkKQorICAgICAgICB8fCAoKGJ1
ZmZlck93bmVyc2hpcCgpID09IEJ1ZmZlck93bmVkKSAmJiAhbV9kYXRhQnVmZmVyLmFzUHRyPHZv
aWQqPigpKSk7CisKKyAgICBpZiAoYnVmZmVyT3duZXJzaGlwKCkgIT0gQnVmZmVyU2hhcmVkKQor
ICAgICAgICBtX2RhdGFCdWZmZXIgPSBVbnR5cGVkUHRyQW5kQml0ZmllbGQoU2hhcmVkVUNoYXI6
OmNyZWF0ZShuZXcgT3duRmFzdE1hbGxvY1B0cjxVQ2hhcj4obV9kYXRhKSkucmVsZWFzZVJlZigp
LCBCdWZmZXJTaGFyZWQpOworCisgICAgcmV0dXJuIG1fZGF0YUJ1ZmZlci5hc1B0cjxTaGFyZWRV
Q2hhcio+KCk7Cit9CisKK1NoYXJlZFVDaGFyKiBVU3RyaW5nSW1wbDo6c2hhcmVkQnVmZmVyKCkK
K3sKKyAgICBpZiAobV9sZW5ndGggPCBzX21pbkxlbmd0aFRvU2hhcmUpCisgICAgICAgIHJldHVy
biAwOworICAgIEFTU0VSVCghaXNTdGF0aWMoKSk7CisKKyAgICBVU3RyaW5nSW1wbCogb3duZXIg
PSBidWZmZXJPd25lclN0cmluZygpOworICAgIGlmIChvd25lci0+YnVmZmVyT3duZXJzaGlwKCkg
PT0gQnVmZmVySW50ZXJuYWwpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIG93bmVy
LT5iYXNlU2hhcmVkQnVmZmVyKCk7Cit9CisKK3ZvaWQgVVN0cmluZ0ltcGw6OmRlc3Ryb3koKQor
eworICAgIEFTU0VSVCghaXNTdGF0aWMoKSk7CisgICAgY2hlY2tDb25zaXN0ZW5jeSgpOworCisg
ICAgaWYgKGlkZW50aWZpZXJUYWJsZSgpKQorICAgICAgICBJZGVudGlmaWVyOjpyZW1vdmUodGhp
cyk7CisKKyAgICBpZiAoYnVmZmVyT3duZXJzaGlwKCkgIT0gQnVmZmVySW50ZXJuYWwpIHsKKyAg
ICAgICAgaWYgKGJ1ZmZlck93bmVyc2hpcCgpID09IEJ1ZmZlck93bmVkKQorICAgICAgICAgICAg
ZmFzdEZyZWUobV9kYXRhKTsKKyAgICAgICAgZWxzZSBpZiAoYnVmZmVyT3duZXJzaGlwKCkgPT0g
QnVmZmVyU3Vic3RyaW5nKQorICAgICAgICAgICAgbV9kYXRhQnVmZmVyLmFzUHRyPFVTdHJpbmdJ
bXBsKj4oKS0+ZGVyZWYoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBU1NFUlQoYnVm
ZmVyT3duZXJzaGlwKCkgPT0gQnVmZmVyU2hhcmVkKTsKKyAgICAgICAgICAgIG1fZGF0YUJ1ZmZl
ci5hc1B0cjxTaGFyZWRVQ2hhcio+KCktPmRlcmVmKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBkZWxldGUgdGhpczsKK30KKworLy8gR29sZGVuIHJhdGlvIC0gYXJiaXRyYXJ5IHN0YXJ0IHZh
bHVlIHRvIGF2b2lkIG1hcHBpbmcgYWxsIDAncyB0byBhbGwgMCdzCisvLyBvciBhbnl0aGluZyBs
aWtlIHRoYXQuCitjb25zdCB1bnNpZ25lZCBQSEkgPSAweDllMzc3OWI5VTsKKworLy8gUGF1bCBI
c2llaCdzIFN1cGVyRmFzdEhhc2gKKy8vIGh0dHA6Ly93d3cuYXppbGxpb25tb25rZXlzLmNvbS9x
ZWQvaGFzaC5odG1sCit1bnNpZ25lZCBVU3RyaW5nSW1wbDo6Y29tcHV0ZUhhc2goY29uc3QgVUNo
YXIqIHMsIGludCBsZW4pCit7CisgICAgdW5zaWduZWQgbCA9IGxlbjsKKyAgICB1aW50MzJfdCBo
YXNoID0gUEhJOworICAgIHVpbnQzMl90IHRtcDsKKworICAgIGludCByZW0gPSBsICYgMTsKKyAg
ICBsID4+PSAxOworCisgICAgLy8gTWFpbiBsb29wCisgICAgZm9yICg7IGwgPiAwOyBsLS0pIHsK
KyAgICAgICAgaGFzaCArPSBzWzBdOworICAgICAgICB0bXAgPSAoc1sxXSA8PCAxMSkgXiBoYXNo
OworICAgICAgICBoYXNoID0gKGhhc2ggPDwgMTYpIF4gdG1wOworICAgICAgICBzICs9IDI7Cisg
ICAgICAgIGhhc2ggKz0gaGFzaCA+PiAxMTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgZW5kIGNh
c2UKKyAgICBpZiAocmVtKSB7CisgICAgICAgIGhhc2ggKz0gc1swXTsKKyAgICAgICAgaGFzaCBe
PSBoYXNoIDw8IDExOworICAgICAgICBoYXNoICs9IGhhc2ggPj4gMTc7CisgICAgfQorCisgICAg
Ly8gRm9yY2UgImF2YWxhbmNoaW5nIiBvZiBmaW5hbCAxMjcgYml0cworICAgIGhhc2ggXj0gaGFz
aCA8PCAzOworICAgIGhhc2ggKz0gaGFzaCA+PiA1OworICAgIGhhc2ggXj0gaGFzaCA8PCAyOwor
ICAgIGhhc2ggKz0gaGFzaCA+PiAxNTsKKyAgICBoYXNoIF49IGhhc2ggPDwgMTA7CisKKyAgICAv
LyB0aGlzIGF2b2lkcyBldmVyIHJldHVybmluZyBhIGhhc2ggY29kZSBvZiAwLCBzaW5jZSB0aGF0
IGlzIHVzZWQgdG8KKyAgICAvLyBzaWduYWwgImhhc2ggbm90IGNvbXB1dGVkIHlldCIsIHVzaW5n
IGEgdmFsdWUgdGhhdCBpcyBsaWtlbHkgdG8gYmUKKyAgICAvLyBlZmZlY3RpdmVseSB0aGUgc2Ft
ZSBhcyAwIHdoZW4gdGhlIGxvdyBiaXRzIGFyZSBtYXNrZWQKKyAgICBpZiAoaGFzaCA9PSAwKQor
ICAgICAgICBoYXNoID0gMHg4MDAwMDAwMDsKKworICAgIHJldHVybiBoYXNoOworfQorCisvLyBQ
YXVsIEhzaWVoJ3MgU3VwZXJGYXN0SGFzaAorLy8gaHR0cDovL3d3dy5hemlsbGlvbm1vbmtleXMu
Y29tL3FlZC9oYXNoLmh0bWwKK3Vuc2lnbmVkIFVTdHJpbmdJbXBsOjpjb21wdXRlSGFzaChjb25z
dCBjaGFyKiBzLCBpbnQgbCkKK3sKKyAgICAvLyBUaGlzIGhhc2ggaXMgZGVzaWduZWQgdG8gd29y
ayBvbiAxNi1iaXQgY2h1bmtzIGF0IGEgdGltZS4gQnV0IHNpbmNlIHRoZSBub3JtYWwgY2FzZQor
ICAgIC8vIChhYm92ZSkgaXMgdG8gaGFzaCBVVEYtMTYgY2hhcmFjdGVycywgd2UganVzdCB0cmVh
dCB0aGUgOC1iaXQgY2hhcnMgYXMgaWYgdGhleQorICAgIC8vIHdlcmUgMTYtYml0IGNodW5rcywg
d2hpY2ggc2hvdWxkIGdpdmUgbWF0Y2hpbmcgcmVzdWx0cworCisgICAgdWludDMyX3QgaGFzaCA9
IFBISTsKKyAgICB1aW50MzJfdCB0bXA7CisKKyAgICBzaXplX3QgcmVtID0gbCAmIDE7CisgICAg
bCA+Pj0gMTsKKworICAgIC8vIE1haW4gbG9vcAorICAgIGZvciAoOyBsID4gMDsgbC0tKSB7Cisg
ICAgICAgIGhhc2ggKz0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc1swXSk7CisgICAgICAg
IHRtcCA9IChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihzWzFdKSA8PCAxMSkgXiBoYXNoOwor
ICAgICAgICBoYXNoID0gKGhhc2ggPDwgMTYpIF4gdG1wOworICAgICAgICBzICs9IDI7CisgICAg
ICAgIGhhc2ggKz0gaGFzaCA+PiAxMTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgZW5kIGNhc2UK
KyAgICBpZiAocmVtKSB7CisgICAgICAgIGhhc2ggKz0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hh
cj4oc1swXSk7CisgICAgICAgIGhhc2ggXj0gaGFzaCA8PCAxMTsKKyAgICAgICAgaGFzaCArPSBo
YXNoID4+IDE3OworICAgIH0KKworICAgIC8vIEZvcmNlICJhdmFsYW5jaGluZyIgb2YgZmluYWwg
MTI3IGJpdHMKKyAgICBoYXNoIF49IGhhc2ggPDwgMzsKKyAgICBoYXNoICs9IGhhc2ggPj4gNTsK
KyAgICBoYXNoIF49IGhhc2ggPDwgMjsKKyAgICBoYXNoICs9IGhhc2ggPj4gMTU7CisgICAgaGFz
aCBePSBoYXNoIDw8IDEwOworCisgICAgLy8gdGhpcyBhdm9pZHMgZXZlciByZXR1cm5pbmcgYSBo
YXNoIGNvZGUgb2YgMCwgc2luY2UgdGhhdCBpcyB1c2VkIHRvCisgICAgLy8gc2lnbmFsICJoYXNo
IG5vdCBjb21wdXRlZCB5ZXQiLCB1c2luZyBhIHZhbHVlIHRoYXQgaXMgbGlrZWx5IHRvIGJlCisg
ICAgLy8gZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgMCB3aGVuIHRoZSBsb3cgYml0cyBhcmUgbWFz
a2VkCisgICAgaWYgKGhhc2ggPT0gMCkKKyAgICAgICAgaGFzaCA9IDB4ODAwMDAwMDA7CisKKyAg
ICByZXR1cm4gaGFzaDsKK30KKworfQpJbmRleDogSmF2YVNjcmlwdENvcmUvcnVudGltZS9VU3Ry
aW5nSW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvVVN0cmluZ0lt
cGwuaAkocmV2aXNpb24gMCkKKysrIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvVVN0cmluZ0ltcGwu
aAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBVU3RyaW5nSW1wbF9oCisjZGVmaW5lIFVT
dHJpbmdJbXBsX2gKKworI2luY2x1ZGUgPHd0Zi9Dcm9zc1RocmVhZFJlZkNvdW50ZWQuaD4KKyNp
bmNsdWRlIDx3dGYvT3duRmFzdE1hbGxvY1B0ci5oPgorI2luY2x1ZGUgPHd0Zi9Qb3NzaWJseU51
bGwuaD4KKyNpbmNsdWRlIDx3dGYvdW5pY29kZS9Vbmljb2RlLmg+CisjaW5jbHVkZSA8bGltaXRz
PgorCituYW1lc3BhY2UgSlNDIHsKKworY2xhc3MgSWRlbnRpZmllclRhYmxlOworICAKK3R5cGVk
ZWYgQ3Jvc3NUaHJlYWRSZWZDb3VudGVkPE93bkZhc3RNYWxsb2NQdHI8VUNoYXI+ID4gU2hhcmVk
VUNoYXI7CisKK2NsYXNzIFVudHlwZWRQdHJBbmRCaXRmaWVsZCB7CitwdWJsaWM6CisgICAgVW50
eXBlZFB0ckFuZEJpdGZpZWxkKCkge30KKworICAgIFVudHlwZWRQdHJBbmRCaXRmaWVsZCh2b2lk
KiBwdHJWYWx1ZSwgdWludHB0cl90IGJpdFZhbHVlKQorICAgICAgICA6IG1fdmFsdWUocmVpbnRl
cnByZXRfY2FzdDx1aW50cHRyX3Q+KHB0clZhbHVlKSB8IGJpdFZhbHVlKQorICAgIHsKKyAgICAg
ICAgQVNTRVJUKHB0clZhbHVlID09IGFzUHRyPHZvaWQqPigpKTsKKyAgICAgICAgQVNTRVJUKCgq
dGhpcyAmIH5zX2FsaWdubWVudE1hc2spID09IGJpdFZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1w
bGF0ZTx0eXBlbmFtZSBUPgorICAgIFQgYXNQdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJl
dF9jYXN0PFQ+KG1fdmFsdWUgJiBzX2FsaWdubWVudE1hc2spOyB9CisKKyAgICBVbnR5cGVkUHRy
QW5kQml0ZmllbGQmIG9wZXJhdG9yJj0odWludHB0cl90IGJpdHMpCisgICAgeworICAgICAgICBt
X3ZhbHVlICY9IGJpdHMgfCBzX2FsaWdubWVudE1hc2s7CisgICAgICAgIHJldHVybiAqdGhpczsK
KyAgICB9CisKKyAgICBVbnR5cGVkUHRyQW5kQml0ZmllbGQmIG9wZXJhdG9yfD0odWludHB0cl90
IGJpdHMpCisgICAgeworICAgICAgICBtX3ZhbHVlIHw9IGJpdHMgJiB+c19hbGlnbm1lbnRNYXNr
OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdWludHB0cl90IG9wZXJhdG9y
Jih1aW50cHRyX3QgbWFzaykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3ZhbHVlICYg
bWFzayAmIH5zX2FsaWdubWVudE1hc2s7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0YXRpYyBj
b25zdCB1aW50cHRyX3Qgc19hbGlnbm1lbnRNYXNrID0gfjB4NzsKKyAgICB1aW50cHRyX3QgbV92
YWx1ZTsKK307CisKK2NsYXNzIFVTdHJpbmdJbXBsIDogTm9uY29weWFibGUgeworcHVibGljOgor
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPFVTdHJpbmdJbXBsPiBjcmVhdGUoVUNoYXIqIGJ1ZmZlciwg
aW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgVVN0cmluZ0lt
cGwoYnVmZmVyLCBsZW5ndGgsIEJ1ZmZlck93bmVkKSk7CisgICAgfQorCisgICAgc3RhdGljIFBh
c3NSZWZQdHI8VVN0cmluZ0ltcGw+IGNyZWF0ZUNvcHlpbmcoY29uc3QgVUNoYXIqIGJ1ZmZlciwg
aW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIFVDaGFyKiBuZXdCdWZmZXI7CisgICAgICAgIGlm
ICghVVN0cmluZ0ltcGw6OmFsbG9jQ2hhcnMobGVuZ3RoKS5nZXRWYWx1ZShuZXdCdWZmZXIpKQor
ICAgICAgICAgICAgcmV0dXJuICZudWxsKCk7CisgICAgICAgIGNvcHlDaGFycyhuZXdCdWZmZXIs
IGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBVU3RyaW5nSW1w
bChuZXdCdWZmZXIsIGxlbmd0aCwgQnVmZmVyT3duZWQpKTsKKyAgICB9CisKKyAgICBzdGF0aWMg
UGFzc1JlZlB0cjxVU3RyaW5nSW1wbD4gY3JlYXRlKFBhc3NSZWZQdHI8VVN0cmluZ0ltcGw+IHJl
cCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIEFTU0VSVChyZXApOwor
ICAgICAgICByZXAtPmNoZWNrQ29uc2lzdGVuY3koKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVm
KG5ldyBVU3RyaW5nSW1wbChyZXAtPm1fZGF0YSArIG9mZnNldCwgbGVuZ3RoLCByZXAtPmJ1ZmZl
ck93bmVyU3RyaW5nKCkpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxVU3RyaW5n
SW1wbD4gY3JlYXRlKFBhc3NSZWZQdHI8U2hhcmVkVUNoYXI+IHNoYXJlZEJ1ZmZlciwgVUNoYXIq
IGJ1ZmZlciwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcg
VVN0cmluZ0ltcGwoYnVmZmVyLCBsZW5ndGgsIHNoYXJlZEJ1ZmZlcikpOworICAgIH0KKworICAg
IHN0YXRpYyBQYXNzUmVmUHRyPFVTdHJpbmdJbXBsPiBjcmVhdGVVbmluaXRpYWxpemVkKHVuc2ln
bmVkIGxlbmd0aCwgVUNoYXIqJiBvdXRwdXQpCisgICAgeworICAgICAgICBBU1NFUlQobGVuZ3Ro
KTsKKyAgICAgICAgaWYgKGxlbmd0aCA+ICgoc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+Ojpt
YXgoKSAtIHNpemVvZihVU3RyaW5nSW1wbCkpIC8gc2l6ZW9mKFVDaGFyKSkpCisgICAgICAgICAg
ICByZXR1cm4gMDsKKworICAgICAgICBVU3RyaW5nSW1wbCogcmVzdWx0SW1wbDsKKyAgICAgICAg
aWYgKCF0cnlGYXN0TWFsbG9jKHNpemVvZihVQ2hhcikgKiBsZW5ndGggKyBzaXplb2YoVVN0cmlu
Z0ltcGwpKS5nZXRWYWx1ZShyZXN1bHRJbXBsKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisg
ICAgICAgIG91dHB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VUNoYXIqPihyZXN1bHRJbXBsICsgMSk7
CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcocmVzdWx0SW1wbCkgVVN0cmluZ0ltcGwob3V0
cHV0LCBsZW5ndGgsIEJ1ZmZlckludGVybmFsKSk7CisgICAgfQorCisgICAgU2hhcmVkVUNoYXIq
IHNoYXJlZEJ1ZmZlcigpOworICAgIFVDaGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRh
OyB9CisgICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX2xlbmd0aDsgfQorICAgIHNpemVf
dCBjb3N0KCkKKyAgICB7CisgICAgICAgIFVTdHJpbmdJbXBsKiBiYXNlID0gYnVmZmVyT3duZXJT
dHJpbmcoKTsKKyAgICAgICAgaWYgKG1fZGF0YUJ1ZmZlciAmIHNfcmVwb3J0ZWRDb3N0Qml0KQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG1fZGF0YUJ1ZmZlciB8PSBzX3JlcG9ydGVk
Q29zdEJpdDsKKyAgICAgICAgcmV0dXJuIGJhc2UtPm1fbGVuZ3RoOworICAgIH0KKyAgICB1bnNp
Z25lZCBoYXNoKCkgY29uc3QgeyBpZiAoIW1faGFzaCkgbV9oYXNoID0gY29tcHV0ZUhhc2goZGF0
YSgpLCBtX2xlbmd0aCk7IHJldHVybiBtX2hhc2g7IH0KKyAgICB1bnNpZ25lZCBjb21wdXRlZEhh
c2goKSBjb25zdCB7IEFTU0VSVChtX2hhc2gpOyByZXR1cm4gbV9oYXNoOyB9IC8vIGZhc3QgcGF0
aCBmb3IgSWRlbnRpZmllcnMKKyAgICB2b2lkIHNldEhhc2godW5zaWduZWQgaGFzaCkgeyBBU1NF
UlQoaGFzaCA9PSBjb21wdXRlSGFzaChkYXRhKCksIG1fbGVuZ3RoKSk7IG1faGFzaCA9IGhhc2g7
IH0gLy8gZmFzdCBwYXRoIGZvciBJZGVudGlmaWVycworICAgIElkZW50aWZpZXJUYWJsZSogaWRl
bnRpZmllclRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV9pZGVudGlmaWVyVGFibGU7IH0KKyAgICB2
b2lkIHNldElkZW50aWZpZXJUYWJsZShJZGVudGlmaWVyVGFibGUqIHRhYmxlKSB7IEFTU0VSVCgh
aXNTdGF0aWMoKSk7IG1faWRlbnRpZmllclRhYmxlID0gdGFibGU7IH0KKworICAgIFVTdHJpbmdJ
bXBsKiByZWYoKSB7IG1fcmVmQ291bnQgKz0gc19yZWZDb3VudEluY3JlbWVudDsgcmV0dXJuIHRo
aXM7IH0KKyAgICBBTFdBWVNfSU5MSU5FIHZvaWQgZGVyZWYoKSB7IGlmICghKG1fcmVmQ291bnQg
LT0gc19yZWZDb3VudEluY3JlbWVudCkpIGRlc3Ryb3koKTsgfQorCisgICAgc3RhdGljIFdURjo6
UG9zc2libHlOdWxsPFVDaGFyKj4gYWxsb2NDaGFycyhzaXplX3QgbGVuZ3RoKQorICAgIHsKKyAg
ICAgICAgQVNTRVJUKGxlbmd0aCk7CisgICAgICAgIGlmIChsZW5ndGggPiBzdGQ6Om51bWVyaWNf
bGltaXRzPHNpemVfdD46Om1heCgpIC8gc2l6ZW9mKFVDaGFyKSkKKyAgICAgICAgICAgIHJldHVy
biAwOworICAgICAgICByZXR1cm4gdHJ5RmFzdE1hbGxvYyhzaXplb2YoVUNoYXIpICogbGVuZ3Ro
KTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBjb3B5Q2hhcnMoVUNoYXIqIGRlc3RpbmF0aW9u
LCBjb25zdCBVQ2hhciogc291cmNlLCB1bnNpZ25lZCBudW1DaGFyYWN0ZXJzKQorICAgIHsKKyAg
ICAgICAgaWYgKG51bUNoYXJhY3RlcnMgPD0gc19jb3B5Q2hhcnNJbmxpbmVDdXRPZmYpIHsKKyAg
ICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1DaGFyYWN0ZXJzOyArK2kpCisg
ICAgICAgICAgICAgICAgZGVzdGluYXRpb25baV0gPSBzb3VyY2VbaV07CisgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uLCBzb3VyY2UsIG51bUNoYXJhY3RlcnMg
KiBzaXplb2YoVUNoYXIpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdW5zaWduZWQgY29tcHV0ZUhh
c2goY29uc3QgVUNoYXIqLCBpbnQgbGVuZ3RoKTsKKyAgICBzdGF0aWMgdW5zaWduZWQgY29tcHV0
ZUhhc2goY29uc3QgY2hhciosIGludCBsZW5ndGgpOworICAgIHN0YXRpYyB1bnNpZ25lZCBjb21w
dXRlSGFzaChjb25zdCBjaGFyKiBzKSB7IHJldHVybiBjb21wdXRlSGFzaChzLCBzdHJsZW4ocykp
OyB9CisKKyAgICBzdGF0aWMgVVN0cmluZ0ltcGwmIG51bGwoKSB7IHJldHVybiAqc19udWxsOyB9
CisgICAgc3RhdGljIFVTdHJpbmdJbXBsJiBlbXB0eSgpIHsgcmV0dXJuICpzX2VtcHR5OyB9CisK
KyAgICBBTFdBWVNfSU5MSU5FIHZvaWQgY2hlY2tDb25zaXN0ZW5jeSgpIGNvbnN0CisgICAgewor
ICAgICAgICAvLyBUaGVyZSBpcyBubyByZWN1cnNpb24gb2Ygc3Vic3RyaW5ncy4KKyAgICAgICAg
QVNTRVJUKGJ1ZmZlck93bmVyU3RyaW5nKCktPmJ1ZmZlck93bmVyc2hpcCgpICE9IEJ1ZmZlclN1
YnN0cmluZyk7CisgICAgICAgIC8vIFN0YXRpYyBzdHJpbmdzIGNhbm5vdCBiZSBwdXQgaW4gaWRl
bnRpZmllciB0YWJsZXMsIGJlY2F1c2UgdGhleSBhcmUgZ2xvYmFsbHkgc2hhcmVkLgorICAgICAg
ICBBU1NFUlQoIWlzU3RhdGljKCkgfHwgIWlkZW50aWZpZXJUYWJsZSgpKTsKKyAgICB9CisKK3By
aXZhdGU6CisgICAgZW51bSBCdWZmZXJPd25lcnNoaXAgeworICAgICAgICBCdWZmZXJJbnRlcm5h
bCwKKyAgICAgICAgQnVmZmVyT3duZWQsCisgICAgICAgIEJ1ZmZlclN1YnN0cmluZywKKyAgICAg
ICAgQnVmZmVyU2hhcmVkLAorICAgIH07CisKKyAgICAvLyBGb3IgU21hbGxTdHJpbmdTdG9yYWdl
LCB3aGljaCBhbGxvY2F0ZXMgYW4gYXJyYXkgYW5kIHVzZXMgYW4gaW4tcGxhY2UgbmV3LgorICAg
IFVTdHJpbmdJbXBsKCkgeyB9CisKKyAgICAvLyBVc2VkIHRvIGNvbnN0cnVjdCBub3JtYWwgc3Ry
aW5ncyB3aXRoIGFuIGludGVybmFsIG9yIGV4dGVybmFsIGJ1ZmZlci4KKyAgICBVU3RyaW5nSW1w
bChVQ2hhciogZGF0YSwgaW50IGxlbmd0aCwgQnVmZmVyT3duZXJzaGlwIG93bmVyc2hpcCkKKyAg
ICAgICAgOiBtX2RhdGEoZGF0YSkKKyAgICAgICAgLCBtX2xlbmd0aChsZW5ndGgpCisgICAgICAg
ICwgbV9yZWZDb3VudChzX3JlZkNvdW50SW5jcmVtZW50KQorICAgICAgICAsIG1faGFzaCgwKQor
ICAgICAgICAsIG1faWRlbnRpZmllclRhYmxlKDApCisgICAgICAgICwgbV9kYXRhQnVmZmVyKDAs
IG93bmVyc2hpcCkKKyAgICB7CisgICAgICAgIEFTU0VSVCgob3duZXJzaGlwID09IEJ1ZmZlcklu
dGVybmFsKSB8fCAob3duZXJzaGlwID09IEJ1ZmZlck93bmVkKSk7CisgICAgICAgIGNoZWNrQ29u
c2lzdGVuY3koKTsKKyAgICB9CisKKyAgICAvLyBVc2VkIHRvIGNvbnN0cnVjdCBzdGF0aWMgc3Ry
aW5ncywgd2hpY2ggaGF2ZSBhbiBzcGVjaWFsIHJlZkNvdW50IHRoYXQgY2FuIG5ldmVyIGhpdCB6
ZXJvLgorICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgc3RhdGljIHN0cmluZyB3aWxsIG5ldmVy
IGJlIGRlc3Ryb3llZCwgd2hpY2ggaXMgaW1wb3J0YW50IGJlY2F1c2UKKyAgICAvLyBzdGF0aWMg
c3RyaW5ncyB3aWxsIGJlIHNoYXJlZCBhY3Jvc3MgdGhyZWFkcyAmIHJlZi1jb3VudGVkIGluIGEg
bm9uLXRocmVhZHNhZmUgbWFubmVyLgorICAgIGVudW0gU3RhdGljU3RyaW5nQ29uc3RydWN0VHlw
ZSB7IENvbnN0cnVjdFN0YXRpY1N0cmluZyB9OworICAgIFVTdHJpbmdJbXBsKFVDaGFyKiBkYXRh
LCBpbnQgbGVuZ3RoLCBTdGF0aWNTdHJpbmdDb25zdHJ1Y3RUeXBlKQorICAgICAgICA6IG1fZGF0
YShkYXRhKQorICAgICAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKKyAgICAgICAgLCBtX3JlZkNvdW50
KHNfc3RhdGljUmVmQ291bnRJbml0aWFsVmFsdWUpCisgICAgICAgICwgbV9oYXNoKDApCisgICAg
ICAgICwgbV9pZGVudGlmaWVyVGFibGUoMCkKKyAgICAgICAgLCBtX2RhdGFCdWZmZXIoMCwgQnVm
ZmVyT3duZWQpCisgICAgeworICAgICAgICBjaGVja0NvbnNpc3RlbmN5KCk7CisgICAgfQorCisg
ICAgLy8gVXNlZCB0byBjcmVhdGUgbmV3IHN0cmluZ3MgdGhhdCBhcmUgYSBzdWJzdHJpbmcgb2Yg
YW4gZXhpc3Rpbmcgc3RyaW5nLgorICAgIFVTdHJpbmdJbXBsKFVDaGFyKiBkYXRhLCBpbnQgbGVu
Z3RoLCBQYXNzUmVmUHRyPFVTdHJpbmdJbXBsPiBiYXNlKQorICAgICAgICA6IG1fZGF0YShkYXRh
KQorICAgICAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKKyAgICAgICAgLCBtX3JlZkNvdW50KHNfcmVm
Q291bnRJbmNyZW1lbnQpCisgICAgICAgICwgbV9oYXNoKDApCisgICAgICAgICwgbV9pZGVudGlm
aWVyVGFibGUoMCkKKyAgICAgICAgLCBtX2RhdGFCdWZmZXIoYmFzZS5yZWxlYXNlUmVmKCksIEJ1
ZmZlclN1YnN0cmluZykKKyAgICB7CisgICAgICAgIGNoZWNrQ29uc2lzdGVuY3koKTsKKyAgICB9
CisKKyAgICAvLyBVc2VkIHRvIGNvbnN0cnVjdCBuZXcgc3RyaW5ncyBzaGFyaW5nIGFuIGV4aXN0
aW5nIHNoYXJlZCBidWZmZXIuCisgICAgVVN0cmluZ0ltcGwoVUNoYXIqIGRhdGEsIGludCBsZW5n
dGgsIFBhc3NSZWZQdHI8U2hhcmVkVUNoYXI+IHNoYXJlZEJ1ZmZlcikKKyAgICAgICAgOiBtX2Rh
dGEoZGF0YSkKKyAgICAgICAgLCBtX2xlbmd0aChsZW5ndGgpCisgICAgICAgICwgbV9yZWZDb3Vu
dChzX3JlZkNvdW50SW5jcmVtZW50KQorICAgICAgICAsIG1faGFzaCgwKQorICAgICAgICAsIG1f
aWRlbnRpZmllclRhYmxlKDApCisgICAgICAgICwgbV9kYXRhQnVmZmVyKHNoYXJlZEJ1ZmZlci5y
ZWxlYXNlUmVmKCksIEJ1ZmZlclNoYXJlZCkKKyAgICB7CisgICAgICAgIGNoZWNrQ29uc2lzdGVu
Y3koKTsKKyAgICB9CisKKyAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpIHsgcmV0
dXJuIGZhc3RNYWxsb2Moc2l6ZSk7IH0KKyAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90LCB2
b2lkKiBpblBsYWNlKSB7IHJldHVybiBpblBsYWNlOyB9CisKKyAgICAvLyBUaGlzIG51bWJlciBt
dXN0IGJlIGF0IGxlYXN0IDIgdG8gYXZvaWQgc2hhcmluZyBlbXB0eSwgbnVsbCBhcyB3ZWxsIGFz
IDEgY2hhcmFjdGVyIHN0cmluZ3MgZnJvbSBTbWFsbFN0cmluZ3MuCisgICAgc3RhdGljIGNvbnN0
IGludCBzX21pbkxlbmd0aFRvU2hhcmUgPSAxMDsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQg
c19jb3B5Q2hhcnNJbmxpbmVDdXRPZmYgPSAyMDsKKyAgICBzdGF0aWMgY29uc3QgdWludHB0cl90
IHNfYnVmZmVyT3duZXJzaGlwTWFzayA9IDM7CisgICAgc3RhdGljIGNvbnN0IHVpbnRwdHJfdCBz
X3JlcG9ydGVkQ29zdEJpdCA9IDQ7CisgICAgLy8gV2UgaW5pdGlhbGl6ZSBhbmQgaW5jcmVtZW50
L2RlY3JlbWVudCB0aGUgcmVmQ291bnQgZm9yIGFsbCBub3JtYWwgKG5vbi1zdGF0aWMpIHN0cmlu
Z3MgYnkgdGhlIHZhbHVlIDIuCisgICAgLy8gV2UgaW5pdGlhbGl6ZSBzdGF0aWMgc3RyaW5ncyB3
aXRoIGFuIG9kZCBudW1iZXIgKHNwZWNpZmljYWxseSwgMSksIHN1Y2ggdGhhdCB0aGUgcmVmQ291
bnQgY2Fubm90IHJlYWNoIHplcm8uCisgICAgc3RhdGljIGNvbnN0IGludCBzX3JlZkNvdW50SW5j
cmVtZW50ID0gMjsKKyAgICBzdGF0aWMgY29uc3QgaW50IHNfc3RhdGljUmVmQ291bnRJbml0aWFs
VmFsdWUgPSAxOworCisgICAgdm9pZCBkZXN0cm95KCk7CisgICAgVVN0cmluZ0ltcGwqIGJ1ZmZl
ck93bmVyU3RyaW5nKCkgeyByZXR1cm4gKGJ1ZmZlck93bmVyc2hpcCgpID09IEJ1ZmZlclN1YnN0
cmluZykgPyBtX2RhdGFCdWZmZXIuYXNQdHI8VVN0cmluZ0ltcGwqPigpIDogIHRoaXM7IH0KKyAg
ICBjb25zdCBVU3RyaW5nSW1wbCogYnVmZmVyT3duZXJTdHJpbmcoKSBjb25zdCB7IHJldHVybiAo
YnVmZmVyT3duZXJzaGlwKCkgPT0gQnVmZmVyU3Vic3RyaW5nKSA/IG1fZGF0YUJ1ZmZlci5hc1B0
cjxVU3RyaW5nSW1wbCo+KCkgOiAgdGhpczsgfQorICAgIFNoYXJlZFVDaGFyKiBiYXNlU2hhcmVk
QnVmZmVyKCk7CisgICAgdW5zaWduZWQgYnVmZmVyT3duZXJzaGlwKCkgY29uc3QgeyByZXR1cm4g
bV9kYXRhQnVmZmVyICYgc19idWZmZXJPd25lcnNoaXBNYXNrOyB9CisgICAgYm9vbCBpc1N0YXRp
YygpIGNvbnN0IHsgcmV0dXJuIG1fcmVmQ291bnQgJiAxOyB9CisKKyAgICAvLyB1bnNoYXJlZCBk
YXRhCisgICAgVUNoYXIqIG1fZGF0YTsKKyAgICBpbnQgbV9sZW5ndGg7CisgICAgdW5zaWduZWQg
bV9yZWZDb3VudDsKKyAgICBtdXRhYmxlIHVuc2lnbmVkIG1faGFzaDsKKyAgICBJZGVudGlmaWVy
VGFibGUqIG1faWRlbnRpZmllclRhYmxlOworICAgIFVudHlwZWRQdHJBbmRCaXRmaWVsZCBtX2Rh
dGFCdWZmZXI7CisKKyAgICBKU19FWFBPUlREQVRBIHN0YXRpYyBVU3RyaW5nSW1wbCogc19udWxs
OworICAgIEpTX0VYUE9SVERBVEEgc3RhdGljIFVTdHJpbmdJbXBsKiBzX2VtcHR5OworCisgICAg
ZnJpZW5kIGNsYXNzIEpJVDsKKyAgICBmcmllbmQgY2xhc3MgU21hbGxTdHJpbmdzU3RvcmFnZTsK
KyAgICBmcmllbmQgdm9pZCBpbml0aWFsaXplVVN0cmluZygpOworfTsKKworYm9vbCBlcXVhbChj
b25zdCBVU3RyaW5nSW1wbCosIGNvbnN0IFVTdHJpbmdJbXBsKik7CisKK30KKworI2VuZGlmCklu
ZGV4OiBKYXZhU2NyaXB0R2x1ZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdEds
dWUvQ2hhbmdlTG9nCShyZXZpc2lvbiA1MjQ0OCkKKysrIEphdmFTY3JpcHRHbHVlL0NoYW5nZUxv
Zwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzIEBACisyMDA5LTEyLTIxICBHYXZpbiBCYXJy
YWNsb3VnaCAgPGJhcnJhY2xvdWdoQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MzI4MzEKKyAgICAgICAgUmVwbGFjZSBVU3RyaW5nOjpSZXAgaW1wbGVtZW50YXRp
b24sIGZvbGxvd2luZyBpbnRyb2R1Y3Rpb24gb2Ygcm9wZXMgdG8gSlNDLgorCisgICAgICAgICog
Rm9yd2FyZGluZ0hlYWRlcnMvd3RmL1Bvc3NpYmx5TnVsbC5oOiBBZGRlZC4KKyAgICAgICAgICAg
IC0gYWRkIGZvcndhcmRpbmcgaGVhZGVyLgorCiAyMDA5LTEyLTE2ICBNYXJrIFJvd2UgIDxtcm93
ZUBhcHBsZS5jb20+CiAKICAgICAgICAgQnVpbGQgZml4LiAgRGlzYWJsZSBkZWJ1ZyB2YXJpYW50
cyBvZiBXZWJLaXQgZnJhbWV3b3Jrcy4KSW5kZXg6IEphdmFTY3JpcHRHbHVlL0ZvcndhcmRpbmdI
ZWFkZXJzL3d0Zi9Qb3NzaWJseU51bGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0R2x1ZS9G
b3J3YXJkaW5nSGVhZGVycy93dGYvUG9zc2libHlOdWxsLmgJKHJldmlzaW9uIDApCisrKyBKYXZh
U2NyaXB0R2x1ZS9Gb3J3YXJkaW5nSGVhZGVycy93dGYvUG9zc2libHlOdWxsLmgJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9Qb3NzaWJseU51bGwu
aD4KSW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdl
TG9nCShyZXZpc2lvbiA1MjQ0OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDMgKzEsMTcgQEAKKzIwMDktMTItMjEgIEdhdmluIEJhcnJhY2xvdWdoICA8YmFycmFj
bG91Z2hAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMjgzMQor
ICAgICAgICBSZXBsYWNlIFVTdHJpbmc6OlJlcCBpbXBsZW1lbnRhdGlvbiwgZm9sbG93aW5nIGlu
dHJvZHVjdGlvbiBvZiByb3BlcyB0byBKU0MuCisKKyAgICAgICAgKiBGb3J3YXJkaW5nSGVhZGVy
cy9ydW50aW1lL1VTdHJpbmdJbXBsLmg6IEFkZGVkLgorICAgICAgICAgICAgLSBhZGQgZm9yd2Fy
ZGluZyBoZWFkZXIuCisKKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6U3RyaW5nSW1wbDo6dXN0cmluZyk6CisgICAgICAgICAgICAtIG9y
ZGVyIG9mIGFyZ3VtZW50cyB0byBVU3RyaW5nOjpSZXAgY29uc3RydWN0b3IgZm9yIHNoYXJlZCBz
dHJpbmdzIGNoYW5nZWQuCisKIDIwMDktMTItMjEgIEFuZHJlYXMgS2xpbmcgIDxhbmRyZWFzLmts
aW5nQG5va2lhLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KSW5kZXg6
IFdlYkNvcmUvRm9yd2FyZGluZ0hlYWRlcnMvcnVudGltZS9VU3RyaW5nSW1wbC5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvRm9yd2FyZGluZ0hlYWRlcnMvcnVudGltZS9VU3RyaW5nSW1wbC5oCShy
ZXZpc2lvbiAwKQorKysgV2ViQ29yZS9Gb3J3YXJkaW5nSGVhZGVycy9ydW50aW1lL1VTdHJpbmdJ
bXBsLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBXZWJDb3JlX0ZXRF9V
U3RyaW5nSW1wbF9oCisjZGVmaW5lIFdlYkNvcmVfRldEX1VTdHJpbmdJbXBsX2gKKyNpbmNsdWRl
IDxKYXZhU2NyaXB0Q29yZS9VU3RyaW5nSW1wbC5oPgorI2VuZGlmCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL3RleHQvU3RyaW5nSW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS90ZXh0L1N0cmluZ0ltcGwuY3BwCShyZXZpc2lvbiA1MjM0NikKKysrIFdlYkNvcmUvcGxhdGZv
cm0vdGV4dC9TdHJpbmdJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTgwLDcgKzk4MCw3IEBA
IEpTQzo6VVN0cmluZyBTdHJpbmdJbXBsOjp1c3RyaW5nKCkKIHsKICAgICBTaGFyZWRVQ2hhciog
c2hhcmVkQnVmZmVyID0gdGhpcy0+c2hhcmVkQnVmZmVyKCk7CiAgICAgaWYgKHNoYXJlZEJ1ZmZl
cikKLSAgICAgICAgcmV0dXJuIEpTQzo6VVN0cmluZzo6UmVwOjpjcmVhdGUoY29uc3RfY2FzdDxV
Q2hhcio+KG1fZGF0YSksIG1fbGVuZ3RoLCBzaGFyZWRCdWZmZXIpOworICAgICAgICByZXR1cm4g
SlNDOjpVU3RyaW5nOjpSZXA6OmNyZWF0ZShzaGFyZWRCdWZmZXIsIGNvbnN0X2Nhc3Q8VUNoYXIq
PihtX2RhdGEpLCBtX2xlbmd0aCk7CiAKICAgICByZXR1cm4gSlNDOjpVU3RyaW5nKG1fZGF0YSwg
bV9sZW5ndGgpOwogfQo=
</data>
<flag name="review"
          id="27364"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>