<?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>32920</bug_id>
          
          <creation_ts>2009-12-24 10:50:57 -0800</creation_ts>
          <short_desc>[V8] Support SerializedScriptValue</short_desc>
          <delta_ts>2010-01-20 17:36:15 -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>WebCore JavaScript</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>32554</blocked>
    
    <blocked>33592</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Vitaly Repeshko">vitalyr</reporter>
          <assigned_to name="Vitaly Repeshko">vitalyr</assigned_to>
          <cc>abarth</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>fishd</cc>
    
    <cc>levin</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>174786</commentid>
    <comment_count>0</comment_count>
    <who name="Vitaly Repeshko">vitalyr</who>
    <bug_when>2009-12-24 10:50:57 -0800</bug_when>
    <thetext>[V8] Support SerializedScriptValue</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174787</commentid>
    <comment_count>1</comment_count>
      <attachid>45468</attachid>
    <who name="Vitaly Repeshko">vitalyr</who>
    <bug_when>2009-12-24 10:58:50 -0800</bug_when>
    <thetext>Created attachment 45468
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174788</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2009-12-24 11:01:24 -0800</bug_when>
    <thetext>Attachment 45468 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
Last 3072 characters of output:
ll/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WebCore/bindings/v8/SerializedScriptValue.cpp:90:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:92:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:100:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:102:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:142:  number_bytes is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:155:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:166:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WebCore/bindings/v8/SerializedScriptValue.cpp:187:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:195:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WebCore/bindings/v8/SerializedScriptValue.cpp:331:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:339:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WebCore/bindings/v8/SerializedScriptValue.cpp:353:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WebCore/bindings/v8/SerializedScriptValue.cpp:455:  raw_length is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:508:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:516:  raw_value is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:527:  number_bytes is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:530:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:600:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:606:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:649:  One line control clauses should not use braces.  [whitespace/braces] [4]
Total errors found: 22</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174793</commentid>
    <comment_count>3</comment_count>
      <attachid>45468</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-12-24 11:44:20 -0800</bug_when>
    <thetext>Comment on attachment 45468
patch

Since this is all new code, seems we should match the WebKit style guidelines.  r-</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174804</commentid>
    <comment_count>4</comment_count>
      <attachid>45473</attachid>
    <who name="Vitaly Repeshko">vitalyr</who>
    <bug_when>2009-12-24 12:13:07 -0800</bug_when>
    <thetext>Created attachment 45473
patch: fixed most style violations</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174805</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2009-12-24 12:17:52 -0800</bug_when>
    <thetext>Attachment 45473 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebCore/bindings/v8/SerializedScriptValue.cpp:74:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
WebCore/bindings/v8/SerializedScriptValue.cpp:75:  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: 2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174811</commentid>
    <comment_count>6</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-12-24 14:29:04 -0800</bug_when>
    <thetext>&gt; patch: fixed most style violations

Why not fix all of them?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174812</commentid>
    <comment_count>7</comment_count>
      <attachid>45475</attachid>
    <who name="Vitaly Repeshko">vitalyr</who>
    <bug_when>2009-12-24 14:40:41 -0800</bug_when>
    <thetext>Created attachment 45475
patch: fixed all style violations</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174846</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2009-12-25 00:56:56 -0800</bug_when>
    <thetext>style-queue ran check-webkit-style on attachment 45475 without any errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174847</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-12-25 01:09:38 -0800</bug_when>
    <thetext>I&apos;m a bit unclear what SerializedScriptValue is or why it&apos;s valuable.  I&apos;m not trying to be hostile, I just don&apos;t know, which makes it hard to review the patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>175584</commentid>
    <comment_count>10</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-12-29 09:11:13 -0800</bug_when>
    <thetext>I think David Levin should review this. He was interested in this neck of the woods. I agree with Adam that ChangeLog needs a bit more info mentioning structured cloning, purpose, etc.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>176963</commentid>
    <comment_count>11</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2010-01-04 17:34:40 -0800</bug_when>
    <thetext>Looking at it tomorrow (Jan 5).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178762</commentid>
    <comment_count>12</comment_count>
      <attachid>45475</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-01-08 13:29:09 -0800</bug_when>
    <thetext>Comment on attachment 45475
patch: fixed all style violations

Overall, nicely done. 

There a few details to address below and then this can get in.

General notes:

* Use FIXME: instead of TODO(name): in WebKit.
* Copyrights should get 2010 in them.


&gt; diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
&gt; +2009-12-24  Vitaly Repeshko  &lt;vitalyr@chromium.org&gt;

&gt; +        * WebCore.gypi: Added SerializedScriptValue.cpp.
&gt; +        * bindings/scripts/CodeGeneratorV8.pm: Removed conversion to string before using SerializedScriptValue.
&gt; +        * bindings/v8/SerializedScriptValue.cpp: Added.
&gt; +        (WebCore::):
&gt; +        (WebCore::ZigZag::Writer::Writer):

The changelog is incorrect in listing ZigZag before all items.

As noted in other comments the changelog is too minimal.

&gt; +        Updated clients:

What does &quot;updated clients&quot; mean?

&gt; +        * bindings/v8/custom/V8DOMWindowCustom.cpp:
&gt; +        (WebCore::V8DOMWindow::postMessageCallback):

&gt; diff --git a/WebCore/bindings/v8/SerializedScriptValue.cpp b/WebCore/bindings/v8/SerializedScriptValue.cpp

&gt; +namespace WebCore {
&gt; +
&gt; +#define DO(Action) if (!Action) return false

This define should be removed. It adds little value and it hides control flow changes.

&gt; +// Helpers to do verbose handle casts.
&gt; +
&gt; +template &lt;typename T, typename U&gt;
&gt; +static v8::Handle&lt;T&gt; handleCast(v8::Handle&lt;U&gt; handle) { return v8::Handle&lt;T&gt;::Cast(handle); }

&gt; +
&gt; +template &lt;typename T, typename U&gt;
&gt; +static v8::Local&lt;T&gt; handleCast(v8::Local&lt;U&gt; handle) { return v8::Local&lt;T&gt;::Cast(handle); }

Your use of the verb handle along with the type name Handle is confusing.
I&apos;ve seen WebKit use to* for casting types of functions. toHandle? and toLocal?

&gt; +static bool isPowerOfTwo(int x)

The function name isn&apos;t really correct as it will return true for 0 and MININT (and it really isn&apos;t worth it to fix this). You could name it based on how you are using it: shouldCheckForCycles ?

&gt; +// VarInt encoding constants.
&gt; +static const int kVarIntShift = 7;
&gt; +static const int kVarIntMask = (1 &lt;&lt; kVarIntShift) - 1;

Constants should be named just like a variable and have no special prefix in WebKit code, so s/kVarIntShift/varIntShift/
Also var is an abbreviation which should be avoided in WebKit code.

&gt; +
&gt; +// ZigZag encoding to help VarInt encoding stay small for negative

/to help/helps/

&gt; +// Writer is responsible for serializing primitive types and storing
&gt; +// information used to reconstruct composite types.
&gt; +class Writer : Noncopyable {
&gt; +  public:
&gt; +    Writer() : m_pos(0) { }
&gt; +
&gt; +    // Write functions for primitive types.
&gt; +
&gt; +    void writeUndefined() { append(UndefinedTag); }

It seems fragile that this relies on the fact that the oonly overload of append() that matches is append(char). It would be nice to add append(SerializationTag tag) which could simply do append(static_cast&lt;char&gt;(tag));

&gt; +    void writeNumber(double number)
&gt; +    {
&gt; +        append(NumberTag);
&gt; +        char* numberBytes = reinterpret_cast&lt;char*&gt;(&amp;number);

There is no need for a local variable here and the name is confusing right now away (numberBytes sounds like it is the number of bytes for something as opposed to char pointer to the stat of a double.

&gt; +        append(numberBytes, sizeof(number));
&gt; +    }


&gt; +    void ensureSpace(int extra)
&gt; +    {
&gt; +        m_buffer.grow((m_pos + extra + 1) / 2);

/ 2 due to sizeof(UChar) right?

Consider
        m_buffer.grow((m_pos + extra + 1) / sizeof(m_buffer::ValueType));
which removes the magic &quot;2&quot;

Why is the + 1 there?


&gt; +    }
&gt; +
&gt; +    void fillHole()
&gt; +    {
&gt; +        // If the writer is at odd position in the buffer then one of

s/buffer then/buffer, then/

&gt; +        // the bytes in the last UChar is not initialized.
&gt; +        if (m_pos % 2)
&gt; +            *charAt(m_pos) = PaddingTag;

Also this relies on the vector type being of size 2

Why not do this?

// Ensure that every byte in the vector is set to a known value.
while (m_pos % m_buffer::ValueType)
    append(PaddingTag);

&gt; +    }
&gt; +
&gt; +    char* charAt(int pos) { return reinterpret_cast&lt;char*&gt;(m_buffer.data()) + pos; }

Avoid abbreviations &quot;pos&quot; (same for m_pos).

&gt; +class Serializer {
&gt; +  public:
&gt; +    explicit Serializer(Writer* writer)
&gt; +            : m_writer(writer)

Only indent 4 spaces. (There are several other instances of this but I&apos;ll only leave this comment for this first case.)

&gt; +            , m_state(0)
&gt; +            , m_depth(0)
&gt; +    {}

In this case just put the braces on separate lines. (There are several other instances of this but I&apos;ll only leave this comment for this first case.)

&gt;
&gt; +  private:
&gt; +    class StateBase : public Noncopyable {
&gt; +      public:
&gt; +        virtual ~StateBase() {}

WebKit code typically puts a space between braces in this case. (There are several other instances of this but I&apos;ll only leave this comment for this first case.)


&gt; +    class ArrayState : public State&lt;v8::Array, ArrayTag&gt; {
&gt; +        virtual bool done(int* length)

isDone would be a better name here.

&gt; +    bool doSerialize(v8::Handle&lt;v8::Value&gt; value)
&gt; +    {
&gt; +        if (value-&gt;IsUndefined()) {
&gt; +            m_writer-&gt;writeUndefined();
&gt; +        } else if (value-&gt;IsNull()) {
&gt; +            m_writer-&gt;writeNull();
&gt; +        } else if (value-&gt;IsTrue()) {
&gt; +            m_writer-&gt;writeTrue();
&gt; +        } else if (value-&gt;IsFalse()) {
&gt; +            m_writer-&gt;writeFalse();
&gt; +        } else if (value-&gt;IsString()) {
&gt; +            v8::String::Utf8Value stringValue(value);
&gt; +            m_writer-&gt;writeString(*stringValue, stringValue.length());
&gt; +        } else if (value-&gt;IsInt32()) {
&gt; +            m_writer-&gt;writeInt32(value-&gt;Int32Value());
&gt; +        } else if (value-&gt;IsNumber()) {
&gt; +            m_writer-&gt;writeNumber(handleCast&lt;v8::Number&gt;(value)-&gt;Value());
&gt; +        } else if (value-&gt;IsArray()) {
&gt; +            DO(checkComposite(value));
&gt; +            push(new ArrayState(handleCast&lt;v8::Array&gt;(value)));
&gt; +        } else if (value-&gt;IsObject()) {
&gt; +            DO(checkComposite(value));
&gt; +            push(new ObjectState(handleCast&lt;v8::Object&gt;(value)));
&gt; +            // TODO(vitalyr):
&gt; +            // - check not a wrapper
&gt; +            // - support File, ImageData, etc.

What happens if this is checked in before doing these things?

&gt; +        }

Sorry, single line clauses aren&apos;t suppose to have braces around them even in this case (so far).


&gt; +    bool checkComposite(v8::Handle&lt;v8::Value&gt; composite)
&gt; +    {
&gt; +        if (m_depth &gt; 20000)
&gt; +            return false;
&gt; +        // Since we are not required to spot the cycle as soon as it
&gt; +        // happens we can check for cycles only when the current depth
&gt; +        // is a power of two.

Nice.

&gt; +        if (!isPowerOfTwo(m_depth))
&gt; +            return true;
&gt; +        for (StateBase* state = top(); state; state = state-&gt;nextState()) {
&gt; +            if (state-&gt;composite() == composite)
&gt; +                return false;
&gt; +        }
&gt; +        return true;
&gt; +    }
&gt; +
&gt; +    Writer* m_writer;
&gt; +    StateBase* m_state;
&gt; +    int m_depth;
&gt; +};


&gt; +class Reader {

&gt; +    bool readString(v8::Handle&lt;v8::Value&gt;* value)
&gt; +    {
&gt; +        uint32_t length;
&gt; +        DO(doReadUint32(&amp;length));
&gt; +        if (m_pos + length &gt; m_length)
&gt; +            return false;

How is this possible?  Shouldn&apos;t this just be a CRASH() (from wtf/Assertions.h)?

&gt; +        char* data = new char[length];

Use OwnArrayPtr (from wtf/OwnArrayPtr.h) and get rid of the delete below.

&gt; +        for (int i = 0; i &lt; length; ++i)
&gt; +            data[i] = m_buffer[m_pos++];
&gt; +        *value = v8::String::New(data, length);

Why can&apos;t this use m_buffer directly? 
    *value = v8::String::New(m_buffer, length);
    m_pos += length;

&gt; +        delete[] data;
&gt; +        return true;
&gt; +    }
&gt; +
&gt; +    bool readInt32(v8::Handle&lt;v8::Value&gt;* value)
&gt; +    {
&gt; +        uint32_t rawValue;
&gt; +        DO(doReadUint32(&amp;rawValue));
&gt; +        *value = v8::Integer::New(static_cast&lt;int32_t&gt;(ZigZag::decode(rawValue)));
&gt; +        return true;
&gt; +    }
&gt; +
&gt; +    bool readNumber(v8::Handle&lt;v8::Value&gt;* value)
&gt; +    {
&gt; +        if (m_pos + sizeof(double) &gt; m_length)
&gt; +            return false;

How is this possible?  Shouldn&apos;t this just be a CRASH() (from wtf/Assertions.h)?

&gt; +        double number;
&gt; +        char* numberBytes = reinterpret_cast&lt;char*&gt;(&amp;number);

The variable name numberBytes is confusing. You could just get rid of the local variable.

&gt; +        for (int i = 0; i &lt; sizeof(double); ++i)
&gt; +            numberBytes[i] = m_buffer[m_pos++];
&gt; +        *value = v8::Number::New(number);
&gt; +        return true;
&gt; +    }
&gt; +
&gt; +    bool doReadUint32(uint32_t* value)
&gt; +    {
&gt; +        *value = 0;
&gt; +        char b;

Avoid variables like &quot;b&quot;. What about currentByte?

&gt; +        int shift = 0;
&gt; +        do {
&gt; +            if (m_pos &gt;= m_length)
&gt; +                return false;

How is this possible?  Shouldn&apos;t this just be a CRASH() (from wtf/Assertions.h)?

&gt; +            b = m_buffer[m_pos++];

&gt; +            *value |= ((b &amp; kVarIntMask) &lt;&lt; shift);
&gt; +            shift += 7;

Shouldn&apos;t 7 really be kVarIntShift?

&gt; +        } while (b &amp; (1 &lt;&lt; kVarIntShift));
&gt; +        return true;
&gt; +    }
&gt; +
&gt; +    const char* m_buffer;
&gt; +    const int m_length;
&gt; +    int m_pos;
&gt; +};
&gt; +
&gt; +class Deserializer {
&gt; +  public:
&gt; +    explicit Deserializer(Reader* reader) : m_reader(reader) {}

Since reader can never be 0, it would be better (in WebKit) to pass it in as Reader&amp;.

&gt; +
&gt; +    v8::Local&lt;v8::Value&gt; deserialize()
&gt; +    {
&gt; +        v8::HandleScope scope;
&gt; +        while (!m_reader-&gt;isEof()) {
&gt; +            if (!doDeserialize())
&gt; +                return v8::Local&lt;v8::Value&gt;();
&gt; +        }
&gt; +        if (stackDepth() != 1)
&gt; +            return v8::Local&lt;v8::Value&gt;();

Shouldn&apos;t this just be a CRASH() (from wtf/Assertions.h)? (because you never call this function if m_reader-&gt;isEof()).

&gt; +        return scope.Close(element(0));
&gt; +    }
&gt; +
&gt; +  private:
&gt; +    bool doDeserialize()

doDeserialization

&gt; +    {
&gt; +        SerializationTag tag;
&gt; +        v8::Local&lt;v8::Value&gt; value;
&gt; +        int length;
&gt; +        DO(m_reader-&gt;read(&amp;tag, &amp;value, &amp;length));

Shouldn&apos;t this just be a CRASH() (from wtf/Assertions.h)? (because you never call this function if m_reader-&gt;isEof()).

&gt; +        if (!value.IsEmpty()) {
&gt; +            push(value);
&gt; +        } else if (tag == ObjectTag) {
&gt; +            if (length &gt; stackDepth())

Shouldn&apos;t this just be a CRASH() (from wtf/Assertions.h)?

&gt; +                return false;
&gt; +            v8::Local&lt;v8::Object&gt; object = v8::Object::New();
&gt; +            for (int i = stackDepth() - length; i &lt; stackDepth(); i += 2) {
&gt; +                v8::Local&lt;v8::Value&gt; propertyName = element(i);
&gt; +                v8::Local&lt;v8::Value&gt; propertyValue = element(i + 1);
&gt; +                object-&gt;Set(propertyName, propertyValue);
&gt; +            }
&gt; +            pop(length);
&gt; +            push(object);
&gt; +        } else if (tag == ArrayTag) {
&gt; +            if (length &gt; stackDepth())

Shouldn&apos;t this just be a CRASH() (from wtf/Assertions.h)?

&gt; +                return false;
&gt; +            v8::Local&lt;v8::Array&gt; array = v8::Array::New(length);
&gt; +            const int depth = stackDepth() - length;
&gt; +            {
&gt; +                v8::HandleScope scope;
&gt; +                for (int i = 0; i &lt; length; ++i)

Why not do the for loop like you did above?

                   for (int i = stackDepth() - length; i &lt; stackDepth(); i++) {

&gt; +                    array-&gt;Set(v8::Integer::New(i), element(depth + i));

&gt; +            }
&gt; +            pop(length);
&gt; +            push(array);
&gt; +        } else if (tag != PaddingTag)
&gt; +            return false;
&gt; +        return true;
&gt; +    }


&gt; +SerializedScriptValue::SerializedScriptValue(String data, bool wire)

Use an enum instead of a bool here so that it is clear in the calling sites what is being done (instead of just passing in true/false).


&gt; diff --git a/WebCore/bindings/v8/custom/V8WorkerCustom.cpp b/WebCore/bindings/v8/custom/V8WorkerCustom.cpp

&gt; +    RefPtr&lt;SerializedScriptValue&gt; message = SerializedScriptValue::create(args[0]);
&gt; +    fprintf(stderr, &quot;SerializedScriptValue created in V8Worker::postMessageCallback\n&quot;);

It looks like you left some of your debugging code around &quot;fprintf&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>180932</commentid>
    <comment_count>13</comment_count>
      <attachid>46607</attachid>
    <who name="Vitaly Repeshko">vitalyr</who>
    <bug_when>2010-01-14 14:41:50 -0800</bug_when>
    <thetext>Created attachment 46607
patch v2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>180937</commentid>
    <comment_count>14</comment_count>
    <who name="Vitaly Repeshko">vitalyr</who>
    <bug_when>2010-01-14 14:46:16 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; (From update of attachment 45475 [details])
&gt; Overall, nicely done. 
&gt; 
&gt; There a few details to address below and then this can get in.

Thanks for thorough review. Please take another look.

&gt; General notes:
&gt; 
&gt; * Use FIXME: instead of TODO(name): in WebKit.
&gt; * Copyrights should get 2010 in them.

Done.

&gt; &gt; diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
&gt; &gt; +2009-12-24  Vitaly Repeshko  &lt;vitalyr@chromium.org&gt;
&gt; 
&gt; &gt; +        * WebCore.gypi: Added SerializedScriptValue.cpp.
&gt; &gt; +        * bindings/scripts/CodeGeneratorV8.pm: Removed conversion to string before using SerializedScriptValue.
&gt; &gt; +        * bindings/v8/SerializedScriptValue.cpp: Added.
&gt; &gt; +        (WebCore::):
&gt; &gt; +        (WebCore::ZigZag::Writer::Writer):
&gt; 
&gt; The changelog is incorrect in listing ZigZag before all items.

Updated.

&gt; As noted in other comments the changelog is too minimal.

Done. Since we&apos;re catching up with JSC bindings here I didn&apos;t expect extra explanation is needed.

&gt; &gt; +        Updated clients:
&gt; 
&gt; What does &quot;updated clients&quot; mean?

Now explained in the ChangeLog.

&gt; &gt; +        * bindings/v8/custom/V8DOMWindowCustom.cpp:
&gt; &gt; +        (WebCore::V8DOMWindow::postMessageCallback):
&gt; 
&gt; &gt; diff --git a/WebCore/bindings/v8/SerializedScriptValue.cpp b/WebCore/bindings/v8/SerializedScriptValue.cpp
&gt; 
&gt; &gt; +namespace WebCore {
&gt; &gt; +
&gt; &gt; +#define DO(Action) if (!Action) return false
&gt; 
&gt; This define should be removed. It adds little value and it hides control flow
&gt; changes.

Removed. I expected this to be useful if we need to propagate more than just a boolean, but it should be easy to bring back.
 
&gt; &gt; +// Helpers to do verbose handle casts.
&gt; &gt; +
&gt; &gt; +template &lt;typename T, typename U&gt;
&gt; &gt; +static v8::Handle&lt;T&gt; handleCast(v8::Handle&lt;U&gt; handle) { return v8::Handle&lt;T&gt;::Cast(handle); }
&gt; 
&gt; &gt; +
&gt; &gt; +template &lt;typename T, typename U&gt;
&gt; &gt; +static v8::Local&lt;T&gt; handleCast(v8::Local&lt;U&gt; handle) { return v8::Local&lt;T&gt;::Cast(handle); }
&gt; 
&gt; Your use of the verb handle along with the type name Handle is confusing.
&gt; I&apos;ve seen WebKit use to* for casting types of functions. toHandle? and toLocal?

&quot;toHandle&quot; and &quot;toLocal&quot; won&apos;t work because we already have Handle or Local types. I&apos;d love to have this named handle_cast and be consistent with static_cast, etc., but WebKit style doesn&apos;t allow me to do this.

&gt; &gt; +static bool isPowerOfTwo(int x)
&gt; 
&gt; The function name isn&apos;t really correct as it will return true for 0 and MININT
&gt; (and it really isn&apos;t worth it to fix this). You could name it based on how you
&gt; are using it: shouldCheckForCycles ?

Done.
 
&gt; &gt; +// VarInt encoding constants.
&gt; &gt; +static const int kVarIntShift = 7;
&gt; &gt; +static const int kVarIntMask = (1 &lt;&lt; kVarIntShift) - 1;
&gt; 
&gt; Constants should be named just like a variable and have no special prefix in
&gt; WebKit code, so s/kVarIntShift/varIntShift/
&gt; Also var is an abbreviation which should be avoided in WebKit code.

Renamed. &quot;VarInt&quot; is pretty common abbreviation so it should be allowed.

&gt; &gt; +
&gt; &gt; +// ZigZag encoding to help VarInt encoding stay small for negative
&gt; 
&gt; /to help/helps/

Done.
 
&gt; &gt; +// Writer is responsible for serializing primitive types and storing
&gt; &gt; +// information used to reconstruct composite types.
&gt; &gt; +class Writer : Noncopyable {
&gt; &gt; +  public:
&gt; &gt; +    Writer() : m_pos(0) { }
&gt; &gt; +
&gt; &gt; +    // Write functions for primitive types.
&gt; &gt; +
&gt; &gt; +    void writeUndefined() { append(UndefinedTag); }
&gt; 
&gt; It seems fragile that this relies on the fact that the oonly overload of
&gt; append() that matches is append(char). It would be nice to add
&gt; append(SerializationTag tag) which could simply do
&gt; append(static_cast&lt;char&gt;(tag));

Done.
 
&gt; &gt; +    void writeNumber(double number)
&gt; &gt; +    {
&gt; &gt; +        append(NumberTag);
&gt; &gt; +        char* numberBytes = reinterpret_cast&lt;char*&gt;(&amp;number);
&gt; 
&gt; There is no need for a local variable here and the name is confusing right now
&gt; away (numberBytes sounds like it is the number of bytes for something as
&gt; opposed to char pointer to the stat of a double.

Done.
 
&gt; &gt; +        append(numberBytes, sizeof(number));
&gt; &gt; +    }
&gt; 
&gt; 
&gt; &gt; +    void ensureSpace(int extra)
&gt; &gt; +    {
&gt; &gt; +        m_buffer.grow((m_pos + extra + 1) / 2);
&gt; 
&gt; / 2 due to sizeof(UChar) right?
&gt; 
&gt; Consider
&gt;         m_buffer.grow((m_pos + extra + 1) / sizeof(m_buffer::ValueType));
&gt; which removes the magic &quot;2&quot;
&gt; 
&gt; Why is the + 1 there?

Added an assert instead (see below). Also added a comment about &quot;+ 1&quot;.

&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    void fillHole()
&gt; &gt; +    {
&gt; &gt; +        // If the writer is at odd position in the buffer then one of
&gt; 
&gt; s/buffer then/buffer, then/
&gt; 
&gt; &gt; +        // the bytes in the last UChar is not initialized.
&gt; &gt; +        if (m_pos % 2)
&gt; &gt; +            *charAt(m_pos) = PaddingTag;
&gt; 
&gt; Also this relies on the vector type being of size 2
&gt; 
&gt; Why not do this?
&gt; 
&gt; // Ensure that every byte in the vector is set to a known value.
&gt; while (m_pos % m_buffer::ValueType)
&gt;     append(PaddingTag);

Because the number of padding bytes also depends on the size.
That&apos;s why I added an assert.
 
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    char* charAt(int pos) { return reinterpret_cast&lt;char*&gt;(m_buffer.data()) + pos; }
&gt; 
&gt; Avoid abbreviations &quot;pos&quot; (same for m_pos).

Some String (from PlatformString.h) methods use &quot;pos&quot;. I don&apos;t think it&apos;s ambiguous in this context.

&gt; &gt; +class Serializer {
&gt; &gt; +  public:
&gt; &gt; +    explicit Serializer(Writer* writer)
&gt; &gt; +            : m_writer(writer)
&gt; 
&gt; Only indent 4 spaces. (There are several other instances of this but I&apos;ll only
&gt; leave this comment for this first case.)

Done.
 
&gt; &gt; +            , m_state(0)
&gt; &gt; +            , m_depth(0)
&gt; &gt; +    {}
&gt; 
&gt; In this case just put the braces on separate lines. (There are several other
&gt; instances of this but I&apos;ll only leave this comment for this first case.)

Done.

&gt; &gt;
&gt; &gt; +  private:
&gt; &gt; +    class StateBase : public Noncopyable {
&gt; &gt; +      public:
&gt; &gt; +        virtual ~StateBase() {}
&gt; 
&gt; WebKit code typically puts a space between braces in this case. (There are
&gt; several other instances of this but I&apos;ll only leave this comment for this first
&gt; case.)

Done. 
 
&gt; &gt; +    class ArrayState : public State&lt;v8::Array, ArrayTag&gt; {
&gt; &gt; +        virtual bool done(int* length)
&gt; 
&gt; isDone would be a better name here.

Done.

&gt; &gt; +    bool doSerialize(v8::Handle&lt;v8::Value&gt; value)
&gt; &gt; +    {
&gt; &gt; +        if (value-&gt;IsUndefined()) {
&gt; &gt; +            m_writer-&gt;writeUndefined();
&gt; &gt; +        } else if (value-&gt;IsNull()) {
&gt; &gt; +            m_writer-&gt;writeNull();
&gt; &gt; +        } else if (value-&gt;IsTrue()) {
&gt; &gt; +            m_writer-&gt;writeTrue();
&gt; &gt; +        } else if (value-&gt;IsFalse()) {
&gt; &gt; +            m_writer-&gt;writeFalse();
&gt; &gt; +        } else if (value-&gt;IsString()) {
&gt; &gt; +            v8::String::Utf8Value stringValue(value);
&gt; &gt; +            m_writer-&gt;writeString(*stringValue, stringValue.length());
&gt; &gt; +        } else if (value-&gt;IsInt32()) {
&gt; &gt; +            m_writer-&gt;writeInt32(value-&gt;Int32Value());
&gt; &gt; +        } else if (value-&gt;IsNumber()) {
&gt; &gt; +            m_writer-&gt;writeNumber(handleCast&lt;v8::Number&gt;(value)-&gt;Value());
&gt; &gt; +        } else if (value-&gt;IsArray()) {
&gt; &gt; +            DO(checkComposite(value));
&gt; &gt; +            push(new ArrayState(handleCast&lt;v8::Array&gt;(value)));
&gt; &gt; +        } else if (value-&gt;IsObject()) {
&gt; &gt; +            DO(checkComposite(value));
&gt; &gt; +            push(new ObjectState(handleCast&lt;v8::Object&gt;(value)));
&gt; &gt; +            // TODO(vitalyr):
&gt; &gt; +            // - check not a wrapper
&gt; &gt; +            // - support File, ImageData, etc.
&gt; 
&gt; What happens if this is checked in before doing these things?

Layout tests will fail (as they&apos;re doing now). This code doesn&apos;t support these inputs properly but it won&apos;t crash.
 
&gt; &gt; +        }
&gt; 
&gt; Sorry, single line clauses aren&apos;t suppose to have braces around them even in
&gt; this case (so far).

Misaligned &quot;else if&quot;-s are totally unreadable. Let&apos;s leave it as it is given that check style doesn&apos;t complain.

&gt; &gt; +    bool checkComposite(v8::Handle&lt;v8::Value&gt; composite)
&gt; &gt; +    {
&gt; &gt; +        if (m_depth &gt; 20000)
&gt; &gt; +            return false;
&gt; &gt; +        // Since we are not required to spot the cycle as soon as it
&gt; &gt; +        // happens we can check for cycles only when the current depth
&gt; &gt; +        // is a power of two.
&gt; 
&gt; Nice.
&gt; 
&gt; &gt; +        if (!isPowerOfTwo(m_depth))
&gt; &gt; +            return true;
&gt; &gt; +        for (StateBase* state = top(); state; state = state-&gt;nextState()) {
&gt; &gt; +            if (state-&gt;composite() == composite)
&gt; &gt; +                return false;
&gt; &gt; +        }
&gt; &gt; +        return true;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    Writer* m_writer;
&gt; &gt; +    StateBase* m_state;
&gt; &gt; +    int m_depth;
&gt; &gt; +};
&gt; 
&gt; 
&gt; &gt; +class Reader {
&gt; 
&gt; &gt; +    bool readString(v8::Handle&lt;v8::Value&gt;* value)
&gt; &gt; +    {
&gt; &gt; +        uint32_t length;
&gt; &gt; +        DO(doReadUint32(&amp;length));
&gt; &gt; +        if (m_pos + length &gt; m_length)
&gt; &gt; +            return false;
&gt; 
&gt; How is this possible?  Shouldn&apos;t this just be a CRASH() (from
&gt; wtf/Assertions.h)?

This is possible in case the input gets corrupted. I understand that this can be too forgiving (can hide a bug in serialization code) and will return to this when we add proper error reporting. Added a FIXME to the file&apos;s comment.
 
&gt; &gt; +        char* data = new char[length];
&gt; 
&gt; Use OwnArrayPtr (from wtf/OwnArrayPtr.h) and get rid of the delete below.
&gt; 
&gt; &gt; +        for (int i = 0; i &lt; length; ++i)
&gt; &gt; +            data[i] = m_buffer[m_pos++];
&gt; &gt; +        *value = v8::String::New(data, length);
&gt; 
&gt; Why can&apos;t this use m_buffer directly? 
&gt;     *value = v8::String::New(m_buffer, length);
&gt;     m_pos += length;

Good catch. Left over from when I used buffer with different element type.

&gt; &gt; +        delete[] data;
&gt; &gt; +        return true;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    bool readInt32(v8::Handle&lt;v8::Value&gt;* value)
&gt; &gt; +    {
&gt; &gt; +        uint32_t rawValue;
&gt; &gt; +        DO(doReadUint32(&amp;rawValue));
&gt; &gt; +        *value = v8::Integer::New(static_cast&lt;int32_t&gt;(ZigZag::decode(rawValue)));
&gt; &gt; +        return true;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    bool readNumber(v8::Handle&lt;v8::Value&gt;* value)
&gt; &gt; +    {
&gt; &gt; +        if (m_pos + sizeof(double) &gt; m_length)
&gt; &gt; +            return false;
&gt; 
&gt; How is this possible?  Shouldn&apos;t this just be a CRASH() (from
&gt; wtf/Assertions.h)?
&gt; 
&gt; &gt; +        double number;
&gt; &gt; +        char* numberBytes = reinterpret_cast&lt;char*&gt;(&amp;number);
&gt; 
&gt; The variable name numberBytes is confusing. You could just get rid of the local
&gt; variable.

&quot;reinterpret_cast&lt;char*&gt;(&amp;number)[i]&quot; is ugly and hard to read. I renamed the variable.
 
&gt; &gt; +        for (int i = 0; i &lt; sizeof(double); ++i)
&gt; &gt; +            numberBytes[i] = m_buffer[m_pos++];
&gt; &gt; +        *value = v8::Number::New(number);
&gt; &gt; +        return true;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    bool doReadUint32(uint32_t* value)
&gt; &gt; +    {
&gt; &gt; +        *value = 0;
&gt; &gt; +        char b;
&gt; 
&gt; Avoid variables like &quot;b&quot;. What about currentByte?

Okay.
 
&gt; &gt; +        int shift = 0;
&gt; &gt; +        do {
&gt; &gt; +            if (m_pos &gt;= m_length)
&gt; &gt; +                return false;
&gt; 
&gt; How is this possible?  Shouldn&apos;t this just be a CRASH() (from
&gt; wtf/Assertions.h)?
&gt; 
&gt; &gt; +            b = m_buffer[m_pos++];
&gt; 
&gt; &gt; +            *value |= ((b &amp; kVarIntMask) &lt;&lt; shift);
&gt; &gt; +            shift += 7;
&gt; 
&gt; Shouldn&apos;t 7 really be kVarIntShift?

Oops, done.
 
&gt; &gt; +        } while (b &amp; (1 &lt;&lt; kVarIntShift));
&gt; &gt; +        return true;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    const char* m_buffer;
&gt; &gt; +    const int m_length;
&gt; &gt; +    int m_pos;
&gt; &gt; +};
&gt; &gt; +
&gt; &gt; +class Deserializer {
&gt; &gt; +  public:
&gt; &gt; +    explicit Deserializer(Reader* reader) : m_reader(reader) {}
&gt; 
&gt; Since reader can never be 0, it would be better (in WebKit) to pass it in as
&gt; Reader&amp;.

Done. (And for Writer too.)
 
&gt; &gt; +
&gt; &gt; +    v8::Local&lt;v8::Value&gt; deserialize()
&gt; &gt; +    {
&gt; &gt; +        v8::HandleScope scope;
&gt; &gt; +        while (!m_reader-&gt;isEof()) {
&gt; &gt; +            if (!doDeserialize())
&gt; &gt; +                return v8::Local&lt;v8::Value&gt;();
&gt; &gt; +        }
&gt; &gt; +        if (stackDepth() != 1)
&gt; &gt; +            return v8::Local&lt;v8::Value&gt;();
&gt; 
&gt; Shouldn&apos;t this just be a CRASH() (from wtf/Assertions.h)? (because you never
&gt; call this function if m_reader-&gt;isEof()).
&gt; 
&gt; &gt; +        return scope.Close(element(0));
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +  private:
&gt; &gt; +    bool doDeserialize()
&gt; 
&gt; doDeserialization
&gt; 
&gt; &gt; +    {
&gt; &gt; +        SerializationTag tag;
&gt; &gt; +        v8::Local&lt;v8::Value&gt; value;
&gt; &gt; +        int length;
&gt; &gt; +        DO(m_reader-&gt;read(&amp;tag, &amp;value, &amp;length));
&gt; 
&gt; Shouldn&apos;t this just be a CRASH() (from wtf/Assertions.h)? (because you never
&gt; call this function if m_reader-&gt;isEof()).
&gt; 
&gt; &gt; +        if (!value.IsEmpty()) {
&gt; &gt; +            push(value);
&gt; &gt; +        } else if (tag == ObjectTag) {
&gt; &gt; +            if (length &gt; stackDepth())
&gt; 
&gt; Shouldn&apos;t this just be a CRASH() (from wtf/Assertions.h)?
&gt; 
&gt; &gt; +                return false;
&gt; &gt; +            v8::Local&lt;v8::Object&gt; object = v8::Object::New();
&gt; &gt; +            for (int i = stackDepth() - length; i &lt; stackDepth(); i += 2) {
&gt; &gt; +                v8::Local&lt;v8::Value&gt; propertyName = element(i);
&gt; &gt; +                v8::Local&lt;v8::Value&gt; propertyValue = element(i + 1);
&gt; &gt; +                object-&gt;Set(propertyName, propertyValue);
&gt; &gt; +            }
&gt; &gt; +            pop(length);
&gt; &gt; +            push(object);
&gt; &gt; +        } else if (tag == ArrayTag) {
&gt; &gt; +            if (length &gt; stackDepth())
&gt; 
&gt; Shouldn&apos;t this just be a CRASH() (from wtf/Assertions.h)?
&gt; 
&gt; &gt; +                return false;
&gt; &gt; +            v8::Local&lt;v8::Array&gt; array = v8::Array::New(length);
&gt; &gt; +            const int depth = stackDepth() - length;
&gt; &gt; +            {
&gt; &gt; +                v8::HandleScope scope;
&gt; &gt; +                for (int i = 0; i &lt; length; ++i)
&gt; 
&gt; Why not do the for loop like you did above?
&gt; 
&gt;                    for (int i = stackDepth() - length; i &lt; stackDepth(); i++) {
&gt; 
&gt; &gt; +                    array-&gt;Set(v8::Integer::New(i), element(depth + i));

Because I need to set array elements staring from 0 and not from stackDepth() - length.

&gt; &gt; +            }
&gt; &gt; +            pop(length);
&gt; &gt; +            push(array);
&gt; &gt; +        } else if (tag != PaddingTag)
&gt; &gt; +            return false;
&gt; &gt; +        return true;
&gt; &gt; +    }
&gt; 
&gt; 
&gt; &gt; +SerializedScriptValue::SerializedScriptValue(String data, bool wire)
&gt; 
&gt; Use an enum instead of a bool here so that it is clear in the calling sites
&gt; what is being done (instead of just passing in true/false).

I agree that using enums is preferred in general but since it&apos;s not a part of the public interface here I don&apos;t think it matters.

&gt; &gt; diff --git a/WebCore/bindings/v8/custom/V8WorkerCustom.cpp b/WebCore/bindings/v8/custom/V8WorkerCustom.cpp
&gt; 
&gt; &gt; +    RefPtr&lt;SerializedScriptValue&gt; message = SerializedScriptValue::create(args[0]);
&gt; &gt; +    fprintf(stderr, &quot;SerializedScriptValue created in V8Worker::postMessageCallback\n&quot;);
&gt; 
&gt; It looks like you left some of your debugging code around &quot;fprintf&quot;.

Oops, removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>180964</commentid>
    <comment_count>15</comment_count>
      <attachid>46607</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-01-14 15:25:51 -0800</bug_when>
    <thetext>Comment on attachment 46607
patch v2

Just a few last comments.

&gt; diff --git a/WebCore/bindings/v8/SerializedScriptValue.cpp b/WebCore/bindings/v8/SerializedScriptValue.cpp


&gt; +// Writer is responsible for serializing primitive types and storing
&gt; +// information used to reconstruct composite types.
&gt; +class Writer : Noncopyable {
&gt; +  public:

public:, protected:, private: shouldn&apos;t be indented.

&gt; +    void ensureSpace(int extra)
&gt; +    {
&gt; +        ASSERT(sizeof(UChar) == 2);

Use COMPILE_ASSERT from wtf/Assertions.h and ideally use m_buffer::ValueType instead of UChar (if possible, I didn&apos;t check to see if that compiles).


&gt; +    void fillHole()
&gt; +    {
&gt; +        ASSERT(sizeof(UChar) == 2);
Use COMPILE_ASSERT


&gt; +    char* charAt(int pos) { return reinterpret_cast&lt;char*&gt;(m_buffer.data()) + pos; }

&gt; &gt; Avoid abbreviations &quot;pos&quot; (same for m_pos).

&gt; Some String (from PlatformString.h) methods use &quot;pos&quot;. I don&apos;t think it&apos;s
&gt; ambiguous in this context.

StringImpl.h is not a good example of WebKit style in several areas. From the WebKit style guide &quot;Use full words, except in the rare case where an abbreviation would be more canonical and easier to understand.&quot;



&gt; +    bool doSerialize(v8::Handle&lt;v8::Value&gt; value)
&gt; +    {
&gt; +        if (value-&gt;IsUndefined()) {
&gt; +            m_writer.writeUndefined();
&gt; +        } else if (value-&gt;IsNull()) {
&gt; +            m_writer.writeNull();
&gt; +        } else if (value-&gt;IsTrue()) {
&gt; +            m_writer.writeTrue();
&gt; +        } else if (value-&gt;IsFalse()) {
&gt; +            m_writer.writeFalse();
&gt; +        } else if (value-&gt;IsString()) {
&gt; +            v8::String::Utf8Value stringValue(value);
&gt; +            m_writer.writeString(*stringValue, stringValue.length());
&gt; +        } else if (value-&gt;IsInt32()) {
&gt; +            m_writer.writeInt32(value-&gt;Int32Value());
&gt; +        } else if (value-&gt;IsNumber()) {
&gt; +            m_writer.writeNumber(handleCast&lt;v8::Number&gt;(value)-&gt;Value());
&gt; +        } else if (value-&gt;IsArray()) {
&gt; +            if (!checkComposite(value))
&gt; +                return false;
&gt; +            push(new ArrayState(handleCast&lt;v8::Array&gt;(value)));
&gt; +        } else if (value-&gt;IsObject()) {
&gt; +            if (!checkComposite(value))
&gt; +                return false;
&gt; +            push(new ObjectState(handleCast&lt;v8::Object&gt;(value)));
&gt; +            // FIXME:
&gt; +            // - check not a wrapper
&gt; +            // - support File, ImageData, etc.
&gt; +        }

&gt; &gt; Sorry, single line clauses aren&apos;t suppose to have braces around them even in
&gt; &gt; this case (so far).

&gt; Misaligned &quot;else if&quot;-s are totally unreadable. Let&apos;s leave it as it is given
&gt; that check style doesn&apos;t complain.

Check style isn&apos;t comprehensive for everything (including this). This is ugly, but it is the current style as stated. This exact issue came up before on webkit-dev and didn&apos;t get resolved completely. Perhaps you&apos;d like to drive this style issue to completion?



&gt; +    bool readString(v8::Handle&lt;v8::Value&gt;* value)
&gt; +    {
&gt; +        uint32_t length;
&gt; +        if (!doReadUint32(&amp;length))
&gt; +            return false;

&gt; &gt; How is this possible?  Shouldn&apos;t this just be a CRASH() (from
&gt; &gt; wtf/Assertions.h)?

&gt; This is possible in case the input gets corrupted. I understand that this can
&gt; be too forgiving (can hide a bug in serialization code) and will return to this
&gt; when we add proper error reporting. Added a FIXME to the file&apos;s comment.

It can hide bugs in serialization, hide bugs elsewhere, hide security issues.....
 
This seem to be the only cases for the corruption happening. In all of these cases, I&apos;d rather the code crash rather than try to hide the issue and continue -- who knows what else has been corrupted.

&gt; +
&gt; +v8::Local&lt;v8::Value&gt; SerializedScriptValue::deserialize()
&gt; +{
&gt; +    if (!m_data.impl())
&gt; +        return v8::Local&lt;v8::Value&gt;();
&gt; +    Reader reader(reinterpret_cast&lt;const char*&gt;(m_data.impl()-&gt;characters()), 2 * m_data.length());

 It would be best to get rid of the magic number &quot;2&quot; and replace it with sizeof(m_data::ValueType).

&gt; diff --git a/WebCore/bindings/v8/SerializedScriptValue.h b/WebCore/bindings/v8/SerializedScriptValue.h
&gt; @@ -1,5 +1,5 @@
&gt;  /*
&gt; - * Copyright (C) 2009 Google Inc. All rights reserved.
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.

The 2009 should remain since this code already existed (was checked in) with that copyright. (It should be &quot;Copyright (C) 2009, 2010 Google Inc. All rights reserved.&quot;


&gt; +    explicit SerializedScriptValue(v8::Handle&lt;v8::Value&gt; value);

The param name value shouldn&apos;t be here because it doesn&apos;t add any information.

&gt; +
&gt; +    SerializedScriptValue(String data, bool wire);

As mentioned before, this bool should be an enum. See http://marc.info/?l=webkit-dev&amp;m=125199261526357&amp;w=2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181222</commentid>
    <comment_count>16</comment_count>
      <attachid>46678</attachid>
    <who name="Vitaly Repeshko">vitalyr</who>
    <bug_when>2010-01-15 07:15:53 -0800</bug_when>
    <thetext>Created attachment 46678
patch v3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181223</commentid>
    <comment_count>17</comment_count>
    <who name="Vitaly Repeshko">vitalyr</who>
    <bug_when>2010-01-15 07:17:01 -0800</bug_when>
    <thetext>(In reply to comment #15)
&gt; (From update of attachment 46607 [details])
&gt; Just a few last comments.
&gt; 
&gt; &gt; diff --git a/WebCore/bindings/v8/SerializedScriptValue.cpp b/WebCore/bindings/v8/SerializedScriptValue.cpp
&gt; 
&gt; 
&gt; &gt; +// Writer is responsible for serializing primitive types and storing
&gt; &gt; +// information used to reconstruct composite types.
&gt; &gt; +class Writer : Noncopyable {
&gt; &gt; +  public:
&gt; 
&gt; public:, protected:, private: shouldn&apos;t be indented.

Done (in other places too).
 
&gt; &gt; +    void ensureSpace(int extra)
&gt; &gt; +    {
&gt; &gt; +        ASSERT(sizeof(UChar) == 2);
&gt; 
&gt; Use COMPILE_ASSERT from wtf/Assertions.h and ideally use m_buffer::ValueType
&gt; instead of UChar (if possible, I didn&apos;t check to see if that compiles).

Unfortunately it won&apos;t compile. I added a typedef for UChar and used it everywhere in this file. Also switched to COMPILE_ASSERT.

&gt; &gt; +    void fillHole()
&gt; &gt; +    {
&gt; &gt; +        ASSERT(sizeof(UChar) == 2);
&gt; Use COMPILE_ASSERT

Done.

&gt; &gt; +    char* charAt(int pos) { return reinterpret_cast&lt;char*&gt;(m_buffer.data()) + pos; }
&gt; 
&gt; &gt; &gt; Avoid abbreviations &quot;pos&quot; (same for m_pos).
&gt; 
&gt; &gt; Some String (from PlatformString.h) methods use &quot;pos&quot;. I don&apos;t think it&apos;s
&gt; &gt; ambiguous in this context.
&gt; 
&gt; StringImpl.h is not a good example of WebKit style in several areas. From the
&gt; WebKit style guide &quot;Use full words, except in the rare case where an
&gt; abbreviation would be more canonical and easier to understand.&quot;

There are 100+ source files in WebCore using &quot;pos&quot; (whole word), but &quot;position&quot; is more common, and &quot;m_pos&quot; is rare. Switched to &quot;position&quot;.

&gt; &gt; +    bool doSerialize(v8::Handle&lt;v8::Value&gt; value)
&gt; &gt; +    {
&gt; &gt; +        if (value-&gt;IsUndefined()) {
&gt; &gt; +            m_writer.writeUndefined();
&gt; &gt; +        } else if (value-&gt;IsNull()) {
&gt; &gt; +            m_writer.writeNull();
&gt; &gt; +        } else if (value-&gt;IsTrue()) {
&gt; &gt; +            m_writer.writeTrue();
&gt; &gt; +        } else if (value-&gt;IsFalse()) {
&gt; &gt; +            m_writer.writeFalse();
&gt; &gt; +        } else if (value-&gt;IsString()) {
&gt; &gt; +            v8::String::Utf8Value stringValue(value);
&gt; &gt; +            m_writer.writeString(*stringValue, stringValue.length());
&gt; &gt; +        } else if (value-&gt;IsInt32()) {
&gt; &gt; +            m_writer.writeInt32(value-&gt;Int32Value());
&gt; &gt; +        } else if (value-&gt;IsNumber()) {
&gt; &gt; +            m_writer.writeNumber(handleCast&lt;v8::Number&gt;(value)-&gt;Value());
&gt; &gt; +        } else if (value-&gt;IsArray()) {
&gt; &gt; +            if (!checkComposite(value))
&gt; &gt; +                return false;
&gt; &gt; +            push(new ArrayState(handleCast&lt;v8::Array&gt;(value)));
&gt; &gt; +        } else if (value-&gt;IsObject()) {
&gt; &gt; +            if (!checkComposite(value))
&gt; &gt; +                return false;
&gt; &gt; +            push(new ObjectState(handleCast&lt;v8::Object&gt;(value)));
&gt; &gt; +            // FIXME:
&gt; &gt; +            // - check not a wrapper
&gt; &gt; +            // - support File, ImageData, etc.
&gt; &gt; +        }
&gt; 
&gt; &gt; &gt; Sorry, single line clauses aren&apos;t suppose to have braces around them even in
&gt; &gt; &gt; this case (so far).
&gt; 
&gt; &gt; Misaligned &quot;else if&quot;-s are totally unreadable. Let&apos;s leave it as it is given
&gt; &gt; that check style doesn&apos;t complain.
&gt; 
&gt; Check style isn&apos;t comprehensive for everything (including this). This is ugly,
&gt; but it is the current style as stated. This exact issue came up before on
&gt; webkit-dev and didn&apos;t get resolved completely. Perhaps you&apos;d like to drive this
&gt; style issue to completion?

Not now. I reordered these a bit to make braceless &quot;else if&quot;-s go first. This way I can almost read it.

&gt; &gt; +    bool readString(v8::Handle&lt;v8::Value&gt;* value)
&gt; &gt; +    {
&gt; &gt; +        uint32_t length;
&gt; &gt; +        if (!doReadUint32(&amp;length))
&gt; &gt; +            return false;
&gt; 
&gt; &gt; &gt; How is this possible?  Shouldn&apos;t this just be a CRASH() (from
&gt; &gt; &gt; wtf/Assertions.h)?
&gt; 
&gt; &gt; This is possible in case the input gets corrupted. I understand that this can
&gt; &gt; be too forgiving (can hide a bug in serialization code) and will return to this
&gt; &gt; when we add proper error reporting. Added a FIXME to the file&apos;s comment.
&gt; 
&gt; It can hide bugs in serialization, hide bugs elsewhere, hide security
&gt; issues.....
&gt; 
&gt; This seem to be the only cases for the corruption happening. In all of these
&gt; cases, I&apos;d rather the code crash rather than try to hide the issue and continue
&gt; -- who knows what else has been corrupted.

As I said I&apos;m not entirely happy with the way it&apos;s now (that&apos;s why there is a FIXME above). Yet I think it should only crash in debug mode. The plan is to return some status enum instead of simply true/false in all methods. Then we can crash when a stream corruption is found in debug mode and return deserialization failure in release mode.

&gt; &gt; +
&gt; &gt; +v8::Local&lt;v8::Value&gt; SerializedScriptValue::deserialize()
&gt; &gt; +{
&gt; &gt; +    if (!m_data.impl())
&gt; &gt; +        return v8::Local&lt;v8::Value&gt;();
&gt; &gt; +    Reader reader(reinterpret_cast&lt;const char*&gt;(m_data.impl()-&gt;characters()), 2 * m_data.length());
&gt; 
&gt;  It would be best to get rid of the magic number &quot;2&quot; and replace it with
&gt; sizeof(m_data::ValueType).

Done.
 
&gt; &gt; diff --git a/WebCore/bindings/v8/SerializedScriptValue.h b/WebCore/bindings/v8/SerializedScriptValue.h
&gt; &gt; @@ -1,5 +1,5 @@
&gt; &gt;  /*
&gt; &gt; - * Copyright (C) 2009 Google Inc. All rights reserved.
&gt; &gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; 
&gt; The 2009 should remain since this code already existed (was checked in) with
&gt; that copyright. (It should be &quot;Copyright (C) 2009, 2010 Google Inc. All rights
&gt; reserved.&quot;
&gt; 
&gt; 
&gt; &gt; +    explicit SerializedScriptValue(v8::Handle&lt;v8::Value&gt; value);
&gt; 
&gt; The param name value shouldn&apos;t be here because it doesn&apos;t add any information.

Removed.
 
&gt; &gt; +
&gt; &gt; +    SerializedScriptValue(String data, bool wire);
&gt; 
&gt; As mentioned before, this bool should be an enum. See
&gt; http://marc.info/?l=webkit-dev&amp;m=125199261526357&amp;w=2

Done. Yet it&apos;s not really nice that there are some hard rules that are not part of the official style guide.


Thanks and please take yet another look.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181225</commentid>
    <comment_count>18</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-15 07:17:29 -0800</bug_when>
    <thetext>Attachment 46678 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebCore/bindings/v8/SerializedScriptValue.cpp:204:  One space before end of line comments  [whitespace/comments] [5]
Total errors found: 1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181226</commentid>
    <comment_count>19</comment_count>
      <attachid>46679</attachid>
    <who name="Vitaly Repeshko">vitalyr</who>
    <bug_when>2010-01-15 07:19:11 -0800</bug_when>
    <thetext>Created attachment 46679
patch v3.1: fix style issue</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181238</commentid>
    <comment_count>20</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2010-01-15 08:31:24 -0800</bug_when>
    <thetext>Thanks! It is awesome to have this.

(In reply to comment #17)
&gt; &gt; &gt; +    bool readString(v8::Handle&lt;v8::Value&gt;* value)
&gt; &gt; &gt; +    {
&gt; &gt; &gt; +        uint32_t length;
&gt; &gt; &gt; +        if (!doReadUint32(&amp;length))
&gt; &gt; &gt; +            return false;
&gt; &gt; 
&gt; &gt; &gt; &gt; How is this possible?  Shouldn&apos;t this just be a CRASH() (from
&gt; &gt; &gt; &gt; wtf/Assertions.h)?
&gt; &gt; 
&gt; &gt; &gt; This is possible in case the input gets corrupted. I understand that this can
&gt; &gt; &gt; be too forgiving (can hide a bug in serialization code) and will return to this
&gt; &gt; &gt; when we add proper error reporting. Added a FIXME to the file&apos;s comment.
&gt; &gt; 
&gt; &gt; It can hide bugs in serialization, hide bugs elsewhere, hide security
&gt; &gt; issues.....
&gt; &gt; 
&gt; &gt; This seem to be the only cases for the corruption happening. In all of these
&gt; &gt; cases, I&apos;d rather the code crash rather than try to hide the issue and continue
&gt; &gt; -- who knows what else has been corrupted.
&gt; 
&gt; As I said I&apos;m not entirely happy with the way it&apos;s now (that&apos;s why there is a
&gt; FIXME above). Yet I think it should only crash in debug mode. The plan is to
&gt; return some status enum instead of simply true/false in all methods. Then we
&gt; can crash when a stream corruption is found in debug mode and return
&gt; deserialization failure in release mode.

Ok for now. But consider crashing in both cases. It sounds attractive to hide the issue in release mode but in actuality how often will it happen and for what reason. Is it better to hide it or know about it from crash reports.


&gt; Done. Yet it&apos;s not really nice that there are some hard rules that are not part
&gt; of the official style guide.

You&apos;re right. I&apos;m working on it. I have a patch to put in some of them and will try to finish adding the other ones shortly. (It just has been low in my priority list for too long.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181354</commentid>
    <comment_count>21</comment_count>
      <attachid>46679</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-01-15 13:28:58 -0800</bug_when>
    <thetext>Comment on attachment 46679
patch v3.1: fix style issue

Clearing flags on attachment: 46679

Committed r53344: &lt;http://trac.webkit.org/changeset/53344&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181355</commentid>
    <comment_count>22</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-01-15 13:29:08 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181385</commentid>
    <comment_count>23</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-01-15 14:13:41 -0800</bug_when>
    <thetext>This broke the Chromium Mac build:
Ld /Users/cltbld/Desktop/BuildSlaveData/WebKit-BuildSlave/chromium-mac-release/build/WebKit/chromium/./xcodebuild/Debug/webkit_unit_tests normal i386
Undefined symbols:
  &quot;WebCore::SerializedScriptValue::deserialize()&quot;, referenced from:
      WebCore::MessageEventInternal::dataAttrGetter(v8::Local&lt;v8::String&gt;, v8::AccessorInfo const&amp;)      in libwebcore_bindings.a(DerivedSourcesAllInOne.o)
  &quot;WebCore::SerializedScriptValue::SerializedScriptValue(WebCore::String, WebCore::SerializedScriptValue::StringDataMode)&quot;, referenced from:
      WebCore::SerializedScriptValue::createFromWire(WebCore::String) in libwebkit.a(PlatformMessagePortChannel.o)
      WebCore::SerializedScriptValue::createFromWire(WebCore::String) in libwebkit.a(WebWorkerClientImpl.o)
ld: symbol(s) not found

If I don&apos;t hear otherwise soon, I&apos;ll start a rollout.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181387</commentid>
    <comment_count>24</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-01-15 14:14:03 -0800</bug_when>
    <thetext>Full log:
http://build.webkit.org/builders/Chromium%20Mac%20Release/builds/1823/steps/compile-webkit/logs/stdio</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181395</commentid>
    <comment_count>25</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-01-15 14:23:38 -0800</bug_when>
    <thetext>Starting a rollout.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181406</commentid>
    <comment_count>26</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-01-15 14:38:20 -0800</bug_when>
    <thetext>Reverted r53344 for reason:

Broke the Chromium Mac builder.

Committed r53347: &lt;http://trac.webkit.org/changeset/53347&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182462</commentid>
    <comment_count>27</comment_count>
      <attachid>46954</attachid>
    <who name="Vitaly Repeshko">vitalyr</who>
    <bug_when>2010-01-19 14:34:21 -0800</bug_when>
    <thetext>Created attachment 46954
patch v3.2: fix unsigned-signed comparison issues</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182477</commentid>
    <comment_count>28</comment_count>
      <attachid>46954</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-01-19 14:51:23 -0800</bug_when>
    <thetext>Comment on attachment 46954
patch v3.2: fix unsigned-signed comparison issues

Rejecting patch 46954 from commit-queue.

vitalyr@chromium.org does not have committer permissions according to http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/committers.py.

- If you do not have committer rights please read http://webkit.org/coding/contributing.html for instructions on how to use bugzilla flags.

- If you have committer rights please correct the error in WebKitTools/Scripts/webkitpy/committers.py by adding yourself to the file (no review needed).  Due to bug 30084 the commit-queue will require a restart after your change.  Please contact eseidel@chromium.org to request a commit-queue restart.  After restart the commit-queue will correctly respect your committer rights.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182699</commentid>
    <comment_count>29</comment_count>
      <attachid>47001</attachid>
    <who name="Vitaly Repeshko">vitalyr</who>
    <bug_when>2010-01-20 03:19:35 -0800</bug_when>
    <thetext>Created attachment 47001
patch v3.3

Apparently another patch is needed to make cq+ work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182730</commentid>
    <comment_count>30</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-01-20 03:51:30 -0800</bug_when>
    <thetext>I&apos;m confused why we have a patch attached which has r+/cq+ and is obsolete.  Sadly obsolete patches still show up in http://webkit.org/pending-commit so we should either clear the flags, or un-obsolete the patch if it is to be landed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182993</commentid>
    <comment_count>31</comment_count>
      <attachid>47001</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-01-20 17:36:03 -0800</bug_when>
    <thetext>Comment on attachment 47001
patch v3.3

Clearing flags on attachment: 47001

Committed r53586: &lt;http://trac.webkit.org/changeset/53586&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182994</commentid>
    <comment_count>32</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-01-20 17:36:15 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>45468</attachid>
            <date>2009-12-24 10:58:50 -0800</date>
            <delta_ts>2009-12-24 12:13:07 -0800</delta_ts>
            <desc>patch</desc>
            <filename>serialize.patch</filename>
            <type>text/plain</type>
            <size>38921</size>
            <attacher name="Vitaly Repeshko">vitalyr</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MzkzMDVlZC4uM2YxOGVkMyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw5NCBAQAorMjAwOS0xMi0yNCAgVml0YWx5IFJlcGVz
aGtvICA8dml0YWx5ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgW1Y4XSBTdXBwb3J0IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMyOTIwCisg
ICAgICAgIGh0dHA6Ly9jcmJ1Zy5jb20vMzA2MjAKKworICAgICAgICBJbml0aWFsIGltcGxlbWVu
dGF0aW9uIG9mIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4KKworICAgICAgICAqIFdlYkNvcmUuZ3lw
aTogQWRkZWQgU2VyaWFsaXplZFNjcmlwdFZhbHVlLmNwcC4KKyAgICAgICAgKiBiaW5kaW5ncy9z
Y3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5wbTogUmVtb3ZlZCBjb252ZXJzaW9uIHRvIHN0cmluZyBi
ZWZvcmUgdXNpbmcgU2VyaWFsaXplZFNjcmlwdFZhbHVlLgorICAgICAgICAqIGJpbmRpbmdzL3Y4
L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6KToK
KyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6V3JpdGVyOjpXcml0ZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6WmlnWmFnOjpXcml0ZXI6OndyaXRlVW5kZWZpbmVkKToKKyAgICAgICAgKFdlYkNvcmU6
OlppZ1phZzo6V3JpdGVyOjp3cml0ZU51bGwpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpX
cml0ZXI6OndyaXRlVHJ1ZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OldyaXRlcjo6d3Jp
dGVGYWxzZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OldyaXRlcjo6d3JpdGVTdHJpbmcp
OgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OndyaXRlSW50MzIpOgorICAgICAg
ICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OndyaXRlTnVtYmVyKToKKyAgICAgICAgKFdlYkNv
cmU6OlppZ1phZzo6V3JpdGVyOjplbmRDb21wb3NpdGUpOgorICAgICAgICAoV2ViQ29yZTo6Wmln
WmFnOjpXcml0ZXI6OmRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OmRv
V3JpdGVVaW50MzIpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OmFwcGVuZCk6
CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OldyaXRlcjo6ZW5zdXJlU3BhY2UpOgorICAgICAg
ICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OmZpbGxIb2xlKToKKyAgICAgICAgKFdlYkNvcmU6
OlppZ1phZzo6V3JpdGVyOjpjaGFyQXQpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJp
YWxpemVyOjpTZXJpYWxpemVyKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXpl
cjo6c2VyaWFsaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6U3Rh
dGVCYXNlOjp+U3RhdGVCYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXpl
cjo6U3RhdGVCYXNlOjpuZXh0U3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJp
YWxpemVyOjpTdGF0ZUJhc2U6OnNldE5leHRTdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWda
YWc6OlNlcmlhbGl6ZXI6OlN0YXRlQmFzZTo6Y29tcG9zaXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OlppZ1phZzo6U2VyaWFsaXplcjo6U3RhdGVCYXNlOjpTdGF0ZUJhc2UpOgorICAgICAgICAoV2Vi
Q29yZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpTdGF0ZTo6Y29tcG9zaXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6U3RhdGU6OnRhZyk6CisgICAgICAgIChXZWJDb3Jl
OjpaaWdaYWc6OlNlcmlhbGl6ZXI6OlN0YXRlOjpTdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpa
aWdaYWc6OlNlcmlhbGl6ZXI6OlN0YWNrQ2xlYW5lcjo6U3RhY2tDbGVhbmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6U3RhY2tDbGVhbmVyOjp+U3RhY2tDbGVhbmVy
KToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6QXJyYXlTdGF0ZTo6QXJy
YXlTdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OlNlcmlhbGl6ZXI6OkFycmF5U3Rh
dGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpBcnJheVN0
YXRlOjphZHZhbmNlKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6T2Jq
ZWN0U3RhdGU6Ok9iamVjdFN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFs
aXplcjo6T2JqZWN0U3RhdGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJp
YWxpemVyOjpPYmplY3RTdGF0ZTo6YWR2YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6
OlNlcmlhbGl6ZXI6Ok9iamVjdFN0YXRlOjpuZXh0UHJvcGVydHkpOgorICAgICAgICAoV2ViQ29y
ZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpkb1NlcmlhbGl6ZSk6CisgICAgICAgIChXZWJDb3JlOjpa
aWdaYWc6OlNlcmlhbGl6ZXI6OnB1c2gpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJp
YWxpemVyOjp0b3ApOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpwb3Ap
OgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpjaGVja0NvbXBvc2l0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OlJlYWRlcjo6UmVhZGVyKToKKyAgICAgICAgKFdl
YkNvcmU6OlppZ1phZzo6UmVhZGVyOjppc0VvZik6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6
OlJlYWRlcjo6cmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OlJlYWRlcjo6cmVhZFRh
Zyk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OlJlYWRlcjo6cmVhZFN0cmluZyk6CisgICAg
ICAgIChXZWJDb3JlOjpaaWdaYWc6OlJlYWRlcjo6cmVhZEludDMyKToKKyAgICAgICAgKFdlYkNv
cmU6OlppZ1phZzo6UmVhZGVyOjpyZWFkTnVtYmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1ph
Zzo6UmVhZGVyOjpkb1JlYWRVaW50MzIpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpEZXNl
cmlhbGl6ZXI6OkRlc2VyaWFsaXplcik6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OkRlc2Vy
aWFsaXplcjo6ZGVzZXJpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpEZXNlcmlh
bGl6ZXI6OmRvRGVzZXJpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpEZXNlcmlh
bGl6ZXI6OnB1c2gpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpEZXNlcmlhbGl6ZXI6OnBv
cCk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OkRlc2VyaWFsaXplcjo6c3RhY2tEZXB0aCk6
CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OkRlc2VyaWFsaXplcjo6ZWxlbWVudCk6CisgICAg
ICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmRlc2VyaWFsaXpl
KToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlRnJvbVdpcmUpOgorICAgICAgICAo
V2ViQ29yZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpyZWxlYXNlKToKKyAgICAgICAgKFdlYkNv
cmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6dG9XaXJlU3RyaW5nKToKKworICAgICAgICBVcGRh
dGVkIGNsaWVudHM6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4RE9NV2luZG93Q3Vz
dG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4RE9NV2luZG93Ojpwb3N0TWVzc2FnZUNhbGxi
YWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhEZWRpY2F0ZWRXb3JrZXJDb250
ZXh0Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4RGVkaWNhdGVkV29ya2VyQ29udGV4
dDo6cG9zdE1lc3NhZ2VDYWxsYmFjayk6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4
SGlzdG9yeUN1c3RvbS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWOEhpc3Rvcnk6OnB1c2hTdGF0
ZUNhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlY4SGlzdG9yeTo6cmVwbGFjZVN0YXRlQ2Fs
bGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VFdmVudEN1c3Rv
bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWOE1lc3NhZ2VFdmVudDo6aW5pdE1lc3NhZ2VFdmVu
dENhbGxiYWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdlUG9ydEN1
c3RvbS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWOE1lc3NhZ2VQb3J0Ojpwb3N0TWVzc2FnZUNh
bGxiYWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhXb3JrZXJDdXN0b20uY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6VjhXb3JrZXI6OnBvc3RNZXNzYWdlQ2FsbGJhY2spOgorCiAy
MDA5LTEyLTIxICBFbnJpY2EgQ2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgTWFjaWVqIFN0YWNob3dpYWsuCmRpZmYgLS1naXQgYS9XZWJDb3JlL1dlYkNv
cmUuZ3lwaSBiL1dlYkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IDgzNmUzM2QuLmJjMjcyYzkgMTAw
NjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5neXBpCisrKyBiL1dlYkNvcmUvV2ViQ29yZS5neXBp
CkBAIC03OTIsNiArNzkyLDcgQEAKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9TY3JpcHRWYWx1
ZS5jcHAnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L1NjcmlwdFZhbHVlLmgnLAogICAgICAg
ICAgICAgJ2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oJywKKyAgICAgICAgICAg
ICdiaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwJywKICAgICAgICAgICAgICdi
aW5kaW5ncy92OC9TdGF0aWNET01EYXRhU3RvcmUuY3BwJywKICAgICAgICAgICAgICdiaW5kaW5n
cy92OC9TdGF0aWNET01EYXRhU3RvcmUuaCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvVjhB
YnN0cmFjdEV2ZW50TGlzdGVuZXIuY3BwJywKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3Mv
c2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG0gYi9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvQ29k
ZUdlbmVyYXRvclY4LnBtCmluZGV4IDcxYzY1MGUuLjliNjE4ZGMgMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG0KKysrIGIvV2ViQ29yZS9iaW5k
aW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5wbQpAQCAtMjM2OCw3ICsyMzY4LDcgQEAgc3Vi
IFJldHVybk5hdGl2ZVRvSlNWYWx1ZQogCiAgICAgaWYgKCR0eXBlIGVxICJTZXJpYWxpemVkU2Ny
aXB0VmFsdWUiKSB7CiAgICAgICAgICRpbXBsSW5jbHVkZXN7IiR0eXBlLmgifSA9IDE7Ci0gICAg
ICAgIHJldHVybiAicmV0dXJuIHY4U3RyaW5nKCR2YWx1ZS0+dG9TdHJpbmcoKSkiOworICAgICAg
ICByZXR1cm4gInJldHVybiAkdmFsdWUtPmRlc2VyaWFsaXplKCkiOwogICAgIH0KIAogICAgIGlm
ICgkdHlwZSBlcSAiRGVkaWNhdGVkV29ya2VyQ29udGV4dCIgb3IgJHR5cGUgZXEgIldvcmtlckNv
bnRleHQiIG9yICR0eXBlIGVxICJTaGFyZWRXb3JrZXJDb250ZXh0IikgewpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwIGIvV2ViQ29yZS9i
aW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLmZjYzgyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRp
bmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAKQEAgLTAsMCArMSw2NjYgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlz
dHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3Ig
dGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwor
ICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9S
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2VyaWFsaXplZFNjcmlwdFZhbHVlLmgiCisKKyNpbmNs
dWRlICJTaGFyZWRCdWZmZXIuaCIKKworI2luY2x1ZGUgPHY4Lmg+CisjaW5jbHVkZSA8d3RmL1Jl
ZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKKy8vIFRPRE8odml0YWx5cik6
CisvLyAtIGNhdGNoIFY4IGV4Y2VwdGlvbnMKKy8vIC0gYmUgcmVhZHkgdG8gZ2V0IGVtcHR5IGhh
bmRsZXMKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisjZGVmaW5lIERPKEFjdGlvbikgaWYgKCFB
Y3Rpb24pIHJldHVybiBmYWxzZQorCituYW1lc3BhY2UgeworCisvLyBTZXJpYWxpemF0aW9uIGZv
cm1hdCBpcyBhIHNlcXVlbmNlIG9mICh0YWcsIG9wdGlvbmFsIGRhdGEpCisvLyBwYWlycy4gVGFn
IGFsd2F5cyB0YWtlcyBleGFjdGx5IG9uZSBieXRlLgorZW51bSBTZXJpYWxpemF0aW9uVGFnIHsK
KyAgICBJbnZhbGlkVGFnID0gJyEnLAorICAgIFBhZGRpbmdUYWcgPSAnXDAnLAorICAgIFVuZGVm
aW5lZFRhZyA9ICdfJywKKyAgICBOdWxsVGFnID0gJzAnLAorICAgIFRydWVUYWcgPSAnVCcsCisg
ICAgRmFsc2VUYWcgPSAnRicsCisgICAgU3RyaW5nVGFnID0gJ1MnLAorICAgIEludDMyVGFnID0g
J0knLAorICAgIE51bWJlclRhZyA9ICdOJywKKyAgICBPYmplY3RUYWcgPSAneycsCisgICAgQXJy
YXlUYWcgPSAnWycsCit9OworCisvLyBIZWxwZXJzIHRvIGRvIHZlcmJvc2UgaGFuZGxlIGNhc3Rz
LgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0YXRpYyB2ODo6SGFuZGxl
PFQ+IGhhbmRsZUNhc3Qodjg6OkhhbmRsZTxVPiBoYW5kbGUpIHsgcmV0dXJuIHY4OjpIYW5kbGU8
VD46OkNhc3QoaGFuZGxlKTsgfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4K
K3N0YXRpYyB2ODo6TG9jYWw8VD4gaGFuZGxlQ2FzdCh2ODo6TG9jYWw8VT4gaGFuZGxlKSB7IHJl
dHVybiB2ODo6TG9jYWw8VD46OkNhc3QoaGFuZGxlKTsgfQorCitzdGF0aWMgYm9vbCBpc1Bvd2Vy
T2ZUd28oaW50IHgpIHsKKyAgICByZXR1cm4gKHggJiAoeCAtIDEpKSA9PSAwOworfQorCisvLyBW
YXJJbnQgZW5jb2RpbmcgY29uc3RhbnRzLgorc3RhdGljIGNvbnN0IGludCBrVmFySW50U2hpZnQg
PSA3Oworc3RhdGljIGNvbnN0IGludCBrVmFySW50TWFzayA9ICgxIDw8IGtWYXJJbnRTaGlmdCkg
LSAxOworCisvLyBaaWdaYWcgZW5jb2RpbmcgdG8gaGVscCBWYXJJbnQgZW5jb2Rpbmcgc3RheSBz
bWFsbCBmb3IgbmVnYXRpdmUKKy8vIG51bWJlcnMgd2l0aCBzbWFsbCBhYnNvbHV0ZSB2YWx1ZXMu
CitjbGFzcyBaaWdaYWcgeworICBwdWJsaWM6CisgICAgc3RhdGljIHVpbnQzMl90IGVuY29kZSh1
aW50MzJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSAmICgxVSA8PCAzMSkpIHsK
KyAgICAgICAgICAgIHZhbHVlID0gKCh+dmFsdWUpIDw8IDEpICsgMTsKKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIHZhbHVlIDw8PSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2
YWx1ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdWludDMyX3QgZGVjb2RlKHVpbnQzMl90IHZhbHVl
KQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlICYgMSkgeworICAgICAgICAgICAgdmFsdWUgPSB+
KHZhbHVlID4+IDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWUgPj49IDE7
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICBwcml2YXRlOgor
ICAgIFppZ1phZygpOworfTsKKworLy8gV3JpdGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZXJpYWxp
emluZyBwcmltaXRpdmUgdHlwZXMgYW5kIHN0b3JpbmcKKy8vIGluZm9ybWF0aW9uIHVzZWQgdG8g
cmVjb25zdHJ1Y3QgY29tcG9zaXRlIHR5cGVzLgorY2xhc3MgV3JpdGVyIDogTm9uY29weWFibGUg
eworICBwdWJsaWM6CisgICAgV3JpdGVyKCkgOiBtX3BvcygwKSB7IH0KKworICAgIC8vIFdyaXRl
IGZ1bmN0aW9ucyBmb3IgcHJpbWl0aXZlIHR5cGVzLgorCisgICAgdm9pZCB3cml0ZVVuZGVmaW5l
ZCgpIHsgYXBwZW5kKFVuZGVmaW5lZFRhZyk7IH0KKworICAgIHZvaWQgd3JpdGVOdWxsKCkgeyBh
cHBlbmQoTnVsbFRhZyk7IH0KKworICAgIHZvaWQgd3JpdGVUcnVlKCkgeyBhcHBlbmQoVHJ1ZVRh
Zyk7IH0KKworICAgIHZvaWQgd3JpdGVGYWxzZSgpIHsgYXBwZW5kKEZhbHNlVGFnKTsgfQorCisg
ICAgdm9pZCB3cml0ZVN0cmluZyhjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKQorICAgIHsK
KyAgICAgICAgYXBwZW5kKFN0cmluZ1RhZyk7CisgICAgICAgIGRvV3JpdGVVaW50MzIoc3RhdGlj
X2Nhc3Q8dWludDMyX3Q+KGxlbmd0aCkpOworICAgICAgICBhcHBlbmQoZGF0YSwgbGVuZ3RoKTsK
KyAgICB9CisKKyAgICB2b2lkIHdyaXRlSW50MzIoaW50MzJfdCB2YWx1ZSkKKyAgICB7CisgICAg
ICAgIGFwcGVuZChJbnQzMlRhZyk7CisgICAgICAgIGRvV3JpdGVVaW50MzIoWmlnWmFnOjplbmNv
ZGUoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlKSkpOworICAgIH0KKworICAgIHZvaWQgd3Jp
dGVOdW1iZXIoZG91YmxlIG51bWJlcikKKyAgICB7CisgICAgICAgIGFwcGVuZChOdW1iZXJUYWcp
OworICAgICAgICBjaGFyKiBudW1iZXJfYnl0ZXMgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigm
bnVtYmVyKTsKKyAgICAgICAgYXBwZW5kKG51bWJlcl9ieXRlcywgc2l6ZW9mKG51bWJlcikpOwor
ICAgIH0KKworICAgIC8vIFJlY29yZHMgdGhhdCBhIGNvbXBvc2l0ZSBvYmplY3QgY2FuIGJlIGNv
bnN0cnVjdGVkIGJ5IHVzaW5nCisgICAgLy8gfGxlbmd0aHwgcHJldmlvdXNseSBzdG9yZWQgdmFs
dWVzLgorICAgIHZvaWQgZW5kQ29tcG9zaXRlKFNlcmlhbGl6YXRpb25UYWcgdGFnLCBpbnQzMl90
IGxlbmd0aCkKKyAgICB7CisgICAgICAgIEFTU0VSVCh0YWcgPT0gT2JqZWN0VGFnIHx8IHRhZyA9
PSBBcnJheVRhZyk7CisgICAgICAgIGFwcGVuZCh0YWcpOworICAgICAgICBkb1dyaXRlVWludDMy
KHN0YXRpY19jYXN0PHVpbnQzMl90PihsZW5ndGgpKTsKKyAgICB9CisKKyAgICBWZWN0b3I8VUNo
YXI+JiBkYXRhKCkgeworICAgICAgICBmaWxsSG9sZSgpOworICAgICAgICByZXR1cm4gbV9idWZm
ZXI7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBkb1dyaXRlVWludDMyKHVpbnQzMl90
IHZhbHVlKQorICAgIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGNoYXIg
YiA9ICh2YWx1ZSAmIGtWYXJJbnRNYXNrKTsKKyAgICAgICAgICAgIHZhbHVlID4+PSBrVmFySW50
U2hpZnQ7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gMCkgeworICAgICAgICAgICAgICAgIGFw
cGVuZChiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGFwcGVuZChiIHwgKDEgPDwga1ZhckludFNoaWZ0KSk7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICB2b2lkIGFwcGVuZChjaGFyIGIpCisgICAgeworICAgICAgICBlbnN1cmVTcGFjZSgxKTsK
KyAgICAgICAgKmNoYXJBdChtX3BvcysrKSA9IGI7CisgICAgfQorCisgICAgdm9pZCBhcHBlbmQo
Y29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIGVuc3VyZVNwYWNl
KGxlbmd0aCk7CisgICAgICAgIG1lbWNweShjaGFyQXQobV9wb3MpLCBkYXRhLCBsZW5ndGgpOwor
ICAgICAgICBtX3BvcyArPSBsZW5ndGg7CisgICAgfQorCisgICAgdm9pZCBlbnN1cmVTcGFjZShp
bnQgZXh0cmEpIHsKKyAgICAgICAgbV9idWZmZXIuZ3JvdygobV9wb3MgKyBleHRyYSArIDEpIC8g
Mik7CisgICAgfQorCisgICAgdm9pZCBmaWxsSG9sZSgpCisgICAgeworICAgICAgICAvLyBJZiB0
aGUgd3JpdGVyIGlzIGF0IG9kZCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyIHRoZW4gb25lIG9mCisg
ICAgICAgIC8vIHRoZSBieXRlcyBpbiB0aGUgbGFzdCBVQ2hhciBpcyBub3QgaW5pdGlhbGl6ZWQu
CisgICAgICAgIGlmIChtX3BvcyAlIDIgIT0gMCkKKyAgICAgICAgICAgICpjaGFyQXQobV9wb3Mp
ID0gUGFkZGluZ1RhZzsKKyAgICB9CisKKyAgICBjaGFyKiBjaGFyQXQoaW50IHBvcykgeyByZXR1
cm4gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obV9idWZmZXIuZGF0YSgpKSArIHBvczsgfQorCisg
ICAgVmVjdG9yPFVDaGFyPiBtX2J1ZmZlcjsKKyAgICBpbnQgbV9wb3M7Cit9OworCitjbGFzcyBT
ZXJpYWxpemVyIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFNlcmlhbGl6ZXIoV3JpdGVyKiB3
cml0ZXIpCisgICAgICAgICAgICA6IG1fd3JpdGVyKHdyaXRlcikKKyAgICAgICAgICAgICwgbV9z
dGF0ZSgwKQorICAgICAgICAgICAgLCBtX2RlcHRoKDApCisgICAge30KKworICAgIGJvb2wgc2Vy
aWFsaXplKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKKyAgICB7CisgICAgICAgIHY4OjpI
YW5kbGVTY29wZSBzY29wZTsKKyAgICAgICAgU3RhY2tDbGVhbmVyIGNsZWFuZXIoJm1fc3RhdGUp
OworICAgICAgICBETyhkb1NlcmlhbGl6ZSh2YWx1ZSkpOworICAgICAgICB3aGlsZSAodG9wKCkp
IHsKKyAgICAgICAgICAgIGludCBsZW5ndGg7CisgICAgICAgICAgICB3aGlsZSAoIXRvcCgpLT5k
b25lKCZsZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGRvU2VyaWFsaXpl
KCkgY2FuIGNoYW5nZSBjdXJyZW50IHRvcCgpLgorICAgICAgICAgICAgICAgIERPKGRvU2VyaWFs
aXplKHRvcCgpLT5hZHZhbmNlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fd3Jp
dGVyLT5lbmRDb21wb3NpdGUodG9wKCktPnRhZygpLCBsZW5ndGgpOworICAgICAgICAgICAgcG9w
KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHByaXZhdGU6
CisgICAgY2xhc3MgU3RhdGVCYXNlIDogcHVibGljIE5vbmNvcHlhYmxlIHsKKyAgICAgIHB1Ymxp
YzoKKyAgICAgICAgdmlydHVhbCB+U3RhdGVCYXNlKCkge30KKworICAgICAgICAvLyBMaW5rIHRv
IHRoZSBuZXh0IHN0YXRlIHRvIGZvcm0gYSBzdGFjay4KKyAgICAgICAgU3RhdGVCYXNlKiBuZXh0
U3RhdGUoKSB7IHJldHVybiBtX25leHQ7IH0KKyAgICAgICAgdm9pZCBzZXROZXh0U3RhdGUoU3Rh
dGVCYXNlKiBuZXh0KSB7IG1fbmV4dCA9IG5leHQ7IH0KKworICAgICAgICAvLyBDb21wb3NpdGUg
b2JqZWN0IHdlJ3JlIHByb2Nlc3NpbmcgaW4gdGhpcyBzdGF0ZS4KKyAgICAgICAgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IGNvbXBvc2l0ZSgpIHsgcmV0dXJuIG1fY29tcG9zaXRlOyB9CisKKyAgICAg
ICAgLy8gU2VyaWFsaXphdGlvbiB0YWcgZm9yIHRoZSBjdXJyZW50IGNvbXBvc2l0ZS4KKyAgICAg
ICAgdmlydHVhbCBTZXJpYWxpemF0aW9uVGFnIHRhZygpIGNvbnN0ID0gMDsKKworICAgICAgICAv
LyBSZXR1cm5zIHdoZXRoZXIgaXRlcmF0aW9uIG92ZXIgc3Vib2JqZWN0cyBvZiB0aGUgY3VycmVu
dAorICAgICAgICAvLyBjb21wb3NpdGUgb2JqZWN0IGlzIGRvbmUuIElmIHllcywgfCpsZW5ndGh8
IGlzIHNldCB0byB0aGUKKyAgICAgICAgLy8gbnVtYmVyIG9mIHN1Ym9iamVjdHMuCisgICAgICAg
IHZpcnR1YWwgYm9vbCBkb25lKGludCogbGVuZ3RoKSA9IDA7CisKKyAgICAgICAgLy8gQWR2YW5j
ZXMgdG8gdGhlIG5leHQgc3Vib2JqZWN0LgorICAgICAgICAvLyBSZXF1aXJlczogIXRoaXMtPmRv
bmUoKS4KKyAgICAgICAgdmlydHVhbCB2ODo6TG9jYWw8djg6OlZhbHVlPiBhZHZhbmNlKCkgPSAw
OworCisgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgIFN0YXRlQmFzZSh2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gY29tcG9zaXRlKQorICAgICAgICAgICAgICAgIDogbV9uZXh0KDApCisgICAgICAgICAg
ICAgICAgLCBtX2NvbXBvc2l0ZShjb21wb3NpdGUpCisgICAgICAgIHt9CisKKyAgICAgIHByaXZh
dGU6CisgICAgICAgIFN0YXRlQmFzZSogbV9uZXh0OworICAgICAgICB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gbV9jb21wb3NpdGU7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBT
ZXJpYWxpemF0aW9uVGFnIGNvbXBvc2l0ZVRhZz4KKyAgICBjbGFzcyBTdGF0ZSA6IHB1YmxpYyBT
dGF0ZUJhc2UgeworICAgICAgcHVibGljOgorICAgICAgICB2ODo6SGFuZGxlPFQ+IGNvbXBvc2l0
ZSgpIHsgcmV0dXJuIGhhbmRsZUNhc3Q8VD4oU3RhdGVCYXNlOjpjb21wb3NpdGUoKSk7IH0KKwor
ICAgICAgICB2aXJ0dWFsIFNlcmlhbGl6YXRpb25UYWcgdGFnKCkgY29uc3QgeyByZXR1cm4gY29t
cG9zaXRlVGFnOyB9CisKKyAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgZXhwbGljaXQgU3RhdGUo
djg6OkhhbmRsZTxUPiBjb21wb3NpdGUpIDogU3RhdGVCYXNlKGNvbXBvc2l0ZSkge30KKyAgICB9
OworCisgICAgLy8gSGVscGVyIHRvIGNsZWFuIHVwIHRoZSBzdGF0ZSBzdGFjayBpbiBjYXNlIG9m
IGVycm9ycy4KKyAgICBjbGFzcyBTdGFja0NsZWFuZXIgOiBOb25jb3B5YWJsZSB7CisgICAgICBw
dWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFN0YWNrQ2xlYW5lcihTdGF0ZUJhc2UqKiBzdGFjaykg
OiBtX3N0YWNrKHN0YWNrKSB7fQorCisgICAgICAgIH5TdGFja0NsZWFuZXIoKQorICAgICAgICB7
CisgICAgICAgICAgICBTdGF0ZUJhc2UqIHN0YXRlID0gKm1fc3RhY2s7CisgICAgICAgICAgICB3
aGlsZSAoc3RhdGUpIHsKKyAgICAgICAgICAgICAgICBTdGF0ZUJhc2UqIHRtcCA9IHN0YXRlLT5u
ZXh0U3RhdGUoKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgc3RhdGU7CisgICAgICAgICAgICAg
ICAgc3RhdGUgPSB0bXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbV9zdGFjayA9IDA7
CisgICAgICAgIH0KKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgU3RhdGVCYXNlKiogbV9zdGFj
azsKKyAgICB9OworCisgICAgY2xhc3MgQXJyYXlTdGF0ZSA6IHB1YmxpYyBTdGF0ZTx2ODo6QXJy
YXksIEFycmF5VGFnPiB7CisgICAgICBwdWJsaWM6CisgICAgICAgIEFycmF5U3RhdGUodjg6Okhh
bmRsZTx2ODo6QXJyYXk+IGFycmF5KQorICAgICAgICAgICAgICAgIDogU3RhdGU8djg6OkFycmF5
LCBBcnJheVRhZz4oYXJyYXkpCisgICAgICAgICAgICAgICAgLCBtX2luZGV4KDApCisgICAgICAg
IHt9CisKKyAgICAgICAgdmlydHVhbCBib29sIGRvbmUoaW50KiBsZW5ndGgpCisgICAgICAgIHsK
KyAgICAgICAgICAgICpsZW5ndGggPSBjb21wb3NpdGUoKS0+TGVuZ3RoKCk7CisgICAgICAgICAg
ICByZXR1cm4gbV9pbmRleCA+PSAqbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVh
bCB2ODo6TG9jYWw8djg6OlZhbHVlPiBhZHZhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAg
QVNTRVJUKG1faW5kZXggPCBjb21wb3NpdGUoKS0+TGVuZ3RoKCkpOworICAgICAgICAgICAgdjg6
OkhhbmRsZVNjb3BlIHNjb3BlOworICAgICAgICAgICAgcmV0dXJuIHNjb3BlLkNsb3NlKGNvbXBv
c2l0ZSgpLT5HZXQodjg6OkludGVnZXI6Ok5ldyhtX2luZGV4KyspKSk7CisgICAgICAgIH0KKwor
ICAgICAgcHJpdmF0ZToKKyAgICAgICAgaW50IG1faW5kZXg7CisgICAgfTsKKworICAgIGNsYXNz
IE9iamVjdFN0YXRlIDogcHVibGljIFN0YXRlPHY4OjpPYmplY3QsIE9iamVjdFRhZz4geworICAg
ICAgcHVibGljOgorICAgICAgICBPYmplY3RTdGF0ZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9i
amVjdCkKKyAgICAgICAgICAgICAgICA6IFN0YXRlPHY4OjpPYmplY3QsIE9iamVjdFRhZz4ob2Jq
ZWN0KQorICAgICAgICAgICAgICAgICwgbV9wcm9wZXJ0eU5hbWVzKG9iamVjdC0+R2V0UHJvcGVy
dHlOYW1lcygpKQorICAgICAgICAgICAgICAgICwgbV9pbmRleCgtMSkKKyAgICAgICAgICAgICAg
ICAsIG1fbGVuZ3RoKDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5leHRQcm9wZXJ0eSgpOwor
ICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGRvbmUoaW50KiBsZW5ndGgpIHsKKyAg
ICAgICAgICAgICpsZW5ndGggPSBtX2xlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4
ID49IDIgKiBtX3Byb3BlcnR5TmFtZXMtPkxlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAg
dmlydHVhbCB2ODo6TG9jYWw8djg6OlZhbHVlPiBhZHZhbmNlKCkKKyAgICAgICAgeworICAgICAg
ICAgICAgQVNTRVJUKG1faW5kZXggPCAyICogbV9wcm9wZXJ0eU5hbWVzLT5MZW5ndGgoKSk7Cisg
ICAgICAgICAgICBpZiAobV9pbmRleCAlIDIgPT0gMCkgeworICAgICAgICAgICAgICAgICsrbV9p
bmRleDsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9wcm9wZXJ0eU5hbWU7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQgPSBjb21wb3NpdGUo
KS0+R2V0KG1fcHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgIG5leHRQcm9wZXJ0eSgpOworICAg
ICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICBwcml2YXRlOgorICAg
ICAgICB2b2lkIG5leHRQcm9wZXJ0eSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHY4OjpIYW5k
bGVTY29wZSBzY29wZTsKKyAgICAgICAgICAgICsrbV9pbmRleDsKKyAgICAgICAgICAgIEFTU0VS
VChtX2luZGV4ICUgMiA9PSAwKTsKKyAgICAgICAgICAgIGZvciAoOyBtX2luZGV4IDwgMiAqIG1f
cHJvcGVydHlOYW1lcy0+TGVuZ3RoKCk7IG1faW5kZXggKz0gMikgeworICAgICAgICAgICAgICAg
IHY4OjpMb2NhbDx2ODo6VmFsdWU+IHByb3BlcnR5TmFtZSA9IG1fcHJvcGVydHlOYW1lcy0+R2V0
KHY4OjpJbnRlZ2VyOjpOZXcobV9pbmRleCAvIDIpKTsKKyAgICAgICAgICAgICAgICBpZiAoKHBy
b3BlcnR5TmFtZS0+SXNTdHJpbmcoKSAmJiBjb21wb3NpdGUoKS0+SGFzUmVhbE5hbWVkUHJvcGVy
dHkoaGFuZGxlQ2FzdDx2ODo6U3RyaW5nPihwcm9wZXJ0eU5hbWUpKSkKKyAgICAgICAgICAgICAg
ICAgICAgfHwgKHByb3BlcnR5TmFtZS0+SXNJbnQzMigpICYmIGNvbXBvc2l0ZSgpLT5IYXNSZWFs
SW5kZXhlZFByb3BlcnR5KHByb3BlcnR5TmFtZS0+VWludDMyVmFsdWUoKSkpKSB7CisgICAgICAg
ICAgICAgICAgICAgIG1fcHJvcGVydHlOYW1lID0gc2NvcGUuQ2xvc2UocHJvcGVydHlOYW1lKTsK
KyAgICAgICAgICAgICAgICAgICAgbV9sZW5ndGggKz0gMjsKKyAgICAgICAgICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisg
ICAgICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IG1fcHJvcGVydHlOYW1lczsKKyAgICAgICAgdjg6
OkxvY2FsPHY4OjpWYWx1ZT4gbV9wcm9wZXJ0eU5hbWU7CisgICAgICAgIGludCBtX2luZGV4Owor
ICAgICAgICBpbnQgbV9sZW5ndGg7CisgICAgfTsKKworICAgIGJvb2wgZG9TZXJpYWxpemUodjg6
OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlLT5Jc1Vu
ZGVmaW5lZCgpKSB7CisgICAgICAgICAgICBtX3dyaXRlci0+d3JpdGVVbmRlZmluZWQoKTsKKyAg
ICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsKKyAgICAgICAgICAgIG1fd3JpdGVy
LT53cml0ZU51bGwoKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+SXNUcnVlKCkpIHsKKyAg
ICAgICAgICAgIG1fd3JpdGVyLT53cml0ZVRydWUoKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1
ZS0+SXNGYWxzZSgpKSB7CisgICAgICAgICAgICBtX3dyaXRlci0+d3JpdGVGYWxzZSgpOworICAg
ICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc1N0cmluZygpKSB7CisgICAgICAgICAgICB2ODo6U3Ry
aW5nOjpVdGY4VmFsdWUgc3RyaW5nVmFsdWUodmFsdWUpOworICAgICAgICAgICAgbV93cml0ZXIt
PndyaXRlU3RyaW5nKCpzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWUubGVuZ3RoKCkpOworICAgICAg
ICB9IGVsc2UgaWYgKHZhbHVlLT5Jc0ludDMyKCkpIHsKKyAgICAgICAgICAgIG1fd3JpdGVyLT53
cml0ZUludDMyKHZhbHVlLT5JbnQzMlZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVl
LT5Jc051bWJlcigpKSB7CisgICAgICAgICAgICBtX3dyaXRlci0+d3JpdGVOdW1iZXIoaGFuZGxl
Q2FzdDx2ODo6TnVtYmVyPih2YWx1ZSktPlZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHZh
bHVlLT5Jc0FycmF5KCkpIHsKKyAgICAgICAgICAgIERPKGNoZWNrQ29tcG9zaXRlKHZhbHVlKSk7
CisgICAgICAgICAgICBwdXNoKG5ldyBBcnJheVN0YXRlKGhhbmRsZUNhc3Q8djg6OkFycmF5Pih2
YWx1ZSkpKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+SXNPYmplY3QoKSkgeworICAgICAg
ICAgICAgRE8oY2hlY2tDb21wb3NpdGUodmFsdWUpKTsKKyAgICAgICAgICAgIHB1c2gobmV3IE9i
amVjdFN0YXRlKGhhbmRsZUNhc3Q8djg6Ok9iamVjdD4odmFsdWUpKSk7CisgICAgICAgICAgICAv
LyBUT0RPKHZpdGFseXIpOgorICAgICAgICAgICAgLy8gLSBjaGVjayBub3QgYSB3cmFwcGVyCisg
ICAgICAgICAgICAvLyAtIHN1cHBvcnQgRmlsZSwgSW1hZ2VEYXRhLCBldGMuCisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCBwdXNoKFN0YXRlQmFzZSog
c3RhdGUpCisgICAgeworICAgICAgICBzdGF0ZS0+c2V0TmV4dFN0YXRlKG1fc3RhdGUpOworICAg
ICAgICBtX3N0YXRlID0gc3RhdGU7CisgICAgICAgICsrbV9kZXB0aDsKKyAgICB9CisKKyAgICBT
dGF0ZUJhc2UqIHRvcCgpIHsgcmV0dXJuIG1fc3RhdGU7IH0KKworICAgIHZvaWQgcG9wKCkKKyAg
ICB7CisgICAgICAgIGlmICghbV9zdGF0ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
U3RhdGVCYXNlKiB0b3AgPSBtX3N0YXRlOworICAgICAgICBtX3N0YXRlID0gdG9wLT5uZXh0U3Rh
dGUoKTsKKyAgICAgICAgZGVsZXRlIHRvcDsKKyAgICAgICAgLS1tX2RlcHRoOworICAgIH0KKwor
ICAgIGJvb2wgY2hlY2tDb21wb3NpdGUodjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbXBvc2l0ZSkK
KyAgICB7CisgICAgICAgIGlmIChtX2RlcHRoID4gMjAwMDApCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgcmVxdWlyZWQgdG8gc3BvdCB0aGUg
Y3ljbGUgYXMgc29vbiBhcyBpdAorICAgICAgICAvLyBoYXBwZW5zIHdlIGNhbiBjaGVjayBmb3Ig
Y3ljbGVzIG9ubHkgd2hlbiB0aGUgY3VycmVudCBkZXB0aAorICAgICAgICAvLyBpcyBhIHBvd2Vy
IG9mIHR3by4KKyAgICAgICAgaWYgKCFpc1Bvd2VyT2ZUd28obV9kZXB0aCkpCisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZm9yIChTdGF0ZUJhc2UqIHN0YXRlID0gdG9wKCk7IHN0
YXRlOyBzdGF0ZSA9IHN0YXRlLT5uZXh0U3RhdGUoKSkgeworICAgICAgICAgICAgaWYgKHN0YXRl
LT5jb21wb3NpdGUoKSA9PSBjb21wb3NpdGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIFdyaXRlciog
bV93cml0ZXI7CisgICAgU3RhdGVCYXNlKiBtX3N0YXRlOworICAgIGludCBtX2RlcHRoOworfTsK
KworLy8gUmVhZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZXNlcmlhbGl6aW5nIHByaW1pdGl2ZSB0
eXBlcyBhbmQKKy8vIHJlc3RvcmluZyBpbmZvcm1hdGlvbiBhYm91dCBzYXZlZCBvYmplY3RzIG9m
IGNvbXBvc2l0ZSB0eXBlcy4KK2NsYXNzIFJlYWRlciB7CisgIHB1YmxpYzoKKyAgICBSZWFkZXIo
Y29uc3QgY2hhciogYnVmZmVyLCBpbnQgbGVuZ3RoKQorICAgICAgICAgICAgOiBtX2J1ZmZlcihi
dWZmZXIpCisgICAgICAgICAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKKyAgICAgICAgICAgICwgbV9w
b3MoMCkKKyAgICB7fQorCisgICAgYm9vbCBpc0VvZigpIGNvbnN0IHsgcmV0dXJuIG1fcG9zID49
IG1fbGVuZ3RoOyB9CisKKyAgICBib29sIHJlYWQoU2VyaWFsaXphdGlvblRhZyogdGFnLCB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4qIHZhbHVlLCBpbnQqIGxlbmd0aCkKKyAgICB7CisgICAgICAgIHVp
bnQzMl90IHJhd19sZW5ndGg7CisgICAgICAgIERPKHJlYWRUYWcodGFnKSk7CisgICAgICAgIHN3
aXRjaCAoKnRhZykgeworICAgICAgICBjYXNlIFBhZGRpbmdUYWc6CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBVbmRlZmluZWRUYWc6CisgICAgICAgICAgICAqdmFsdWUgPSB2ODo6
VW5kZWZpbmVkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOdWxsVGFnOgor
ICAgICAgICAgICAgKnZhbHVlID0gdjg6Ok51bGwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIFRydWVUYWc6CisgICAgICAgICAgICAqdmFsdWUgPSB2ODo6VHJ1ZSgpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmFsc2VUYWc6CisgICAgICAgICAgICAqdmFs
dWUgPSB2ODo6RmFsc2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0cmlu
Z1RhZzoKKyAgICAgICAgICAgIERPKHJlYWRTdHJpbmcodmFsdWUpKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIEludDMyVGFnOgorICAgICAgICAgICAgRE8ocmVhZEludDMyKHZh
bHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOdW1iZXJUYWc6CisgICAg
ICAgICAgICBETyhyZWFkTnVtYmVyKHZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBPYmplY3RUYWc6CisgICAgICAgIGNhc2UgQXJyYXlUYWc6CisgICAgICAgICAgICBE
Tyhkb1JlYWRVaW50MzIoJnJhd19sZW5ndGgpKTsKKyAgICAgICAgICAgICpsZW5ndGggPSByYXdf
bGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCByZWFkVGFnKFNlcmlhbGl6YXRpb25U
YWcqIHRhZykKKyAgICB7CisgICAgICAgIGlmIChtX3BvcyA+PSBtX2xlbmd0aCkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgKnRhZyA9IHN0YXRpY19jYXN0PFNlcmlhbGl6YXRp
b25UYWc+KG1fYnVmZmVyW21fcG9zKytdKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
CisgICAgYm9vbCByZWFkU3RyaW5nKHY4OjpIYW5kbGU8djg6OlZhbHVlPiogdmFsdWUpCisgICAg
eworICAgICAgICB1aW50MzJfdCBsZW5ndGg7CisgICAgICAgIERPKGRvUmVhZFVpbnQzMigmbGVu
Z3RoKSk7CisgICAgICAgIGlmIChtX3BvcyArIGxlbmd0aCA+IG1fbGVuZ3RoKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjaGFyKiBkYXRhID0gbmV3IGNoYXJbbGVuZ3RoXTsK
KyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICAgICAg
ZGF0YVtpXSA9IG1fYnVmZmVyW21fcG9zKytdOworICAgICAgICB9CisgICAgICAgICp2YWx1ZSA9
IHY4OjpTdHJpbmc6Ok5ldyhkYXRhLCBsZW5ndGgpOworICAgICAgICBkZWxldGVbXSBkYXRhOwor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIHJlYWRJbnQzMih2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4qIHZhbHVlKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgcmF3X3ZhbHVl
OworICAgICAgICBETyhkb1JlYWRVaW50MzIoJnJhd192YWx1ZSkpOworICAgICAgICAqdmFsdWUg
PSB2ODo6SW50ZWdlcjo6TmV3KHN0YXRpY19jYXN0PGludDMyX3Q+KFppZ1phZzo6ZGVjb2RlKHJh
d192YWx1ZSkpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCByZWFk
TnVtYmVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPiogdmFsdWUpCisgICAgeworICAgICAgICBpZiAo
bV9wb3MgKyBzaXplb2YoZG91YmxlKSA+IG1fbGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICBkb3VibGUgbnVtYmVyOworICAgICAgICBjaGFyKiBudW1iZXJfYnl0ZXMg
PSByZWludGVycHJldF9jYXN0PGNoYXIqPigmbnVtYmVyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBzaXplb2YoZG91YmxlKTsgKytpKSB7CisgICAgICAgICAgICBudW1iZXJfYnl0ZXNb
aV0gPSBtX2J1ZmZlclttX3BvcysrXTsKKyAgICAgICAgfQorICAgICAgICAqdmFsdWUgPSB2ODo6
TnVtYmVyOjpOZXcobnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAg
Ym9vbCBkb1JlYWRVaW50MzIodWludDMyX3QqIHZhbHVlKQorICAgIHsKKyAgICAgICAgKnZhbHVl
ID0gMDsKKyAgICAgICAgY2hhciBiOworICAgICAgICBpbnQgc2hpZnQgPSAwOworICAgICAgICBk
byB7CisgICAgICAgICAgICBpZiAobV9wb3MgPj0gbV9sZW5ndGgpCisgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICAgICAgYiA9IG1fYnVmZmVyW21fcG9zKytdOworICAgICAg
ICAgICAgKnZhbHVlIHw9ICgoYiAmIGtWYXJJbnRNYXNrKSA8PCBzaGlmdCk7CisgICAgICAgICAg
ICBzaGlmdCArPSA3OworICAgICAgICB9IHdoaWxlIChiICYgKDEgPDwga1ZhckludFNoaWZ0KSk7
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGNvbnN0IGNoYXIqIG1fYnVmZmVy
OworICAgIGNvbnN0IGludCBtX2xlbmd0aDsKKyAgICBpbnQgbV9wb3M7Cit9OworCitjbGFzcyBE
ZXNlcmlhbGl6ZXIgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRGVzZXJpYWxpemVyKFJlYWRl
ciogcmVhZGVyKSA6IG1fcmVhZGVyKHJlYWRlcikge30KKworICAgIHY4OjpMb2NhbDx2ODo6VmFs
dWU+IGRlc2VyaWFsaXplKCkKKyAgICB7CisgICAgICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsK
KyAgICAgICAgd2hpbGUgKCFtX3JlYWRlci0+aXNFb2YoKSkgeworICAgICAgICAgICAgaWYgKCFk
b0Rlc2VyaWFsaXplKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFs
dWU+KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YWNrRGVwdGgoKSAhPSAxKQorICAgICAg
ICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisgICAgICAgIHJldHVybiBzY29w
ZS5DbG9zZShlbGVtZW50KDApKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBib29sIGRvRGVz
ZXJpYWxpemUoKQorICAgIHsKKyAgICAgICAgU2VyaWFsaXphdGlvblRhZyB0YWc7CisgICAgICAg
IHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlOworICAgICAgICBpbnQgbGVuZ3RoOworICAgICAg
ICBETyhtX3JlYWRlci0+cmVhZCgmdGFnLCAmdmFsdWUsICZsZW5ndGgpKTsKKyAgICAgICAgaWYg
KCF2YWx1ZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHB1c2godmFsdWUpOworICAgICAgICB9
IGVsc2UgaWYgKHRhZyA9PSBPYmplY3RUYWcpIHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPiBz
dGFja0RlcHRoKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
djg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpPYmplY3Q6Ok5ldygpOworICAgICAg
ICAgICAgZm9yIChpbnQgaSA9IHN0YWNrRGVwdGgoKSAtIGxlbmd0aDsgaSA8IHN0YWNrRGVwdGgo
KTsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcHJvcGVy
dHlOYW1lID0gZWxlbWVudChpKTsKKyAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVl
PiBwcm9wZXJ0eVZhbHVlID0gZWxlbWVudChpICsgMSk7CisgICAgICAgICAgICAgICAgb2JqZWN0
LT5TZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIHBvcChsZW5ndGgpOworICAgICAgICAgICAgcHVzaChvYmplY3QpOworICAgICAgICB9
IGVsc2UgaWYgKHRhZyA9PSBBcnJheVRhZykgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+IHN0
YWNrRGVwdGgoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB2
ODo6TG9jYWw8djg6OkFycmF5PiBhcnJheSA9IHY4OjpBcnJheTo6TmV3KGxlbmd0aCk7CisgICAg
ICAgICAgICBjb25zdCBpbnQgZGVwdGggPSBzdGFja0RlcHRoKCkgLSBsZW5ndGg7CisgICAgICAg
ICAgICB7CisgICAgICAgICAgICAgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgICAgICAg
ICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAg
ICAgICAgYXJyYXktPlNldCh2ODo6SW50ZWdlcjo6TmV3KGkpLCBlbGVtZW50KGRlcHRoICsgaSkp
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcChsZW5n
dGgpOworICAgICAgICAgICAgcHVzaChhcnJheSk7CisgICAgICAgIH0gZWxzZSBpZiAodGFnICE9
IFBhZGRpbmdUYWcpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHB1c2godjg6OkxvY2FsPHY4OjpW
YWx1ZT4gdmFsdWUpIHsgbV9zdGFjay5hcHBlbmQodmFsdWUpOyB9CisKKyAgICB2b2lkIHBvcChp
bnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGxlbmd0aCA+PSAwKTsKKyAgICAgICAg
QVNTRVJUKGxlbmd0aCA8PSBtX3N0YWNrLnNpemUoKSk7CisgICAgICAgIG1fc3RhY2suc2hyaW5r
KG1fc3RhY2suc2l6ZSgpIC0gbGVuZ3RoKTsKKyAgICB9CisKKyAgICBpbnQgc3RhY2tEZXB0aCgp
IGNvbnN0IHsgcmV0dXJuIG1fc3RhY2suc2l6ZSgpOyB9CisKKyAgICB2ODo6TG9jYWw8djg6OlZh
bHVlPiBlbGVtZW50KGludCBpbmRleCkKKyAgICB7CisgICAgICAgIEFTU0VSVChpbmRleCA+PSAw
KTsKKyAgICAgICAgQVNTRVJUKGluZGV4IDwgbV9zdGFjay5zaXplKCkpOworICAgICAgICByZXR1
cm4gbV9zdGFja1tpbmRleF07CisgICAgfQorCisgICAgUmVhZGVyKiBtX3JlYWRlcjsKKyAgICBW
ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4gPiBtX3N0YWNrOworfTsKKworfSAvLyBuYW1lc3Bh
Y2UKKworU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWUodjg6Okhh
bmRsZTx2ODo6VmFsdWU+IHZhbHVlKQoreworICAgIFdyaXRlciB3cml0ZXI7CisgICAgU2VyaWFs
aXplciBzZXJpYWxpemVyKCZ3cml0ZXIpOworICAgIGlmICghc2VyaWFsaXplci5zZXJpYWxpemUo
dmFsdWUpKSB7CisgICAgICAgIC8vIFRPRE8odml0YWx5cik6IHRocm93IGV4Y2VwdGlvbgorICAg
ICAgICByZXR1cm47CisgICAgfQorICAgIG1fZGF0YSA9IFN0cmluZ0ltcGw6OmFkb3B0KHdyaXRl
ci5kYXRhKCkpOworfQorCitTZXJpYWxpemVkU2NyaXB0VmFsdWU6OlNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZShTdHJpbmcgZGF0YSwgYm9vbCB3aXJlKQoreworICAgIGlmICh3aXJlKSB7CisgICAgICAg
IG1fZGF0YSA9IGRhdGE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUmVmUHRyPFNoYXJlZEJ1ZmZl
cj4gYnVmZmVyID0gdXRmOEJ1ZmZlcihkYXRhKTsKKyAgICAgICAgV3JpdGVyIHdyaXRlcjsKKyAg
ICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7
CisgICAgICAgIG1fZGF0YSA9IFN0cmluZ0ltcGw6OmFkb3B0KHdyaXRlci5kYXRhKCkpOworICAg
IH0KK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpkZXNl
cmlhbGl6ZSgpCit7CisgICAgaWYgKCFtX2RhdGEuaW1wbCgpKQorICAgICAgICByZXR1cm4gdjg6
OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAgICBSZWFkZXIgcmVhZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgY2hhcio+KG1fZGF0YS5pbXBsKCktPmNoYXJhY3RlcnMoKSksIDIgKiBtX2RhdGEubGVu
Z3RoKCkpOworICAgIERlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXIoJnJlYWRlcik7CisgICAgcmV0
dXJuIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1
ZS5oIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuaAppbmRleCAy
NmE0MTk5Li4xYTQyYzhlIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1NlcmlhbGl6
ZWRTY3JpcHRWYWx1ZS5oCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvU2VyaWFsaXplZFNjcmlw
dFZhbHVlLmgKQEAgLTQwLDExICs0MCwyNiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNz
IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSA6IHB1YmxpYyBSZWZDb3VudGVkPFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZT4gewogcHVibGljOgotICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZT4gY3JlYXRlKFN0cmluZyBzdHJpbmcpCisgICAgLy8gQ3JlYXRlcyBhIHNlcmlhbGl6
ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFY4IHZhbHVlLgorICAgIHN0YXRpYyBQYXNz
UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gY3JlYXRlKHY4OjpIYW5kbGU8djg6OlZhbHVl
PiB2YWx1ZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgU2VyaWFsaXplZFNj
cmlwdFZhbHVlKHN0cmluZykpOworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZSh2YWx1ZSkpOwogICAgIH0KIAorICAgIC8vIENyZWF0ZXMgYSBzZXJpYWxp
emVkIHZhbHVlIHdpdGggdGhlIGdpdmVuIGRhdGEgb2J0YWluZWQgZnJvbSBhCisgICAgLy8gcHJp
b3IgY2FsbCB0byB0b1dpcmVTdHJpbmcoKS4KKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxTZXJpYWxp
emVkU2NyaXB0VmFsdWU+IGNyZWF0ZUZyb21XaXJlKFN0cmluZyBkYXRhKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUoZGF0YSwgdHJ1ZSkp
OworICAgIH0KKworICAgIC8vIENyZWF0ZXMgYSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIG9m
IFdlYkNvcmUgc3RyaW5nLgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZT4gY3JlYXRlKFN0cmluZyBkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVm
KG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUoZGF0YSwgZmFsc2UpKTsKKyAgICB9CisKKyAgICAv
LyBDcmVhdGVzIGFuIGVtcHR5IHNlcmlhbGl6ZWQgdmFsdWUuCiAgICAgc3RhdGljIFBhc3NSZWZQ
dHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBjcmVhdGUoKQogICAgIHsKICAgICAgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUoKSk7CkBAIC01MiwyMyArNjcsMjQg
QEAgcHVibGljOgogCiAgICAgUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHJlbGVh
c2UoKQogICAgIHsKLSAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gcmVzdWx0
ID0gYWRvcHRSZWYobmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShtX2RhdGEpKTsKKyAgICAgICAg
UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gcmVzdWx0ID0gYWRvcHRSZWYobmV3IFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZShtX2RhdGEsIHRydWUpKTsKICAgICAgICAgbV9kYXRhID0gU3RyaW5n
KCk7CiAgICAgICAgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOwogICAgIH0KIAotICAgIFN0cmlu
ZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9kYXRhOwotICAgIH0KKyAgICBT
dHJpbmcgdG9XaXJlU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9CiAKLXByaXZhdGU6
Ci0gICAgU2VyaWFsaXplZFNjcmlwdFZhbHVlKFN0cmluZyBzdHJpbmcpCi0gICAgICAgIDogbV9k
YXRhKHN0cmluZykKLSAgICB7Ci0gICAgfQorICAgIC8vIERlc2VyaWFsaXplcyB0aGUgdmFsdWUg
KGluIHRoZSBjdXJyZW50IGNvbnRleHQpLiBSZXR1cm5zIGFuCisgICAgLy8gZW1wdHkgaGFuZGxl
IGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBkZXNlcmlhbGl6
ZSgpOwogCitwcml2YXRlOgogICAgIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpIHsgfQorCisgICAg
ZXhwbGljaXQgU2VyaWFsaXplZFNjcmlwdFZhbHVlKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1
ZSk7CisKKyAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWUoU3RyaW5nIGRhdGEsIGJvb2wgd2lyZSk7
CisKICAgICBTdHJpbmcgbV9kYXRhOwogfTsKIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhET01XaW5kb3dDdXN0b20uY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhET01XaW5kb3dDdXN0b20uY3BwCmluZGV4IDk1NGUyNzIuLjU1YTJjMTMgMTAwNjQ0
Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RE9NV2luZG93Q3VzdG9tLmNwcAor
KysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVdpbmRvd0N1c3RvbS5jcHAKQEAg
LTQxMCw3ICs0MTAsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhET01XaW5kb3c6OnBvc3RN
ZXNzYWdlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncwogICAgIEFTU0VSVChzb3Vy
Y2UtPmZyYW1lKCkpOwogCiAgICAgdjg6OlRyeUNhdGNoIHRyeUNhdGNoOwotICAgIFJlZlB0cjxT
ZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNy
ZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2Ny
aXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzBd
KTsKICAgICBNZXNzYWdlUG9ydEFycmF5IHBvcnRBcnJheTsKICAgICBTdHJpbmcgdGFyZ2V0T3Jp
Z2luOwogCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERlZGljYXRl
ZFdvcmtlckNvbnRleHRDdXN0b20uY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhE
ZWRpY2F0ZWRXb3JrZXJDb250ZXh0Q3VzdG9tLmNwcAppbmRleCAwMmMxNDUzLi44NDJhMzRlIDEw
MDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERlZGljYXRlZFdvcmtlckNv
bnRleHRDdXN0b20uY3BwCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RGVkaWNh
dGVkV29ya2VyQ29udGV4dEN1c3RvbS5jcHAKQEAgLTQ2LDcgKzQ2LDcgQEAgdjg6OkhhbmRsZTx2
ODo6VmFsdWU+IFY4RGVkaWNhdGVkV29ya2VyQ29udGV4dDo6cG9zdE1lc3NhZ2VDYWxsYmFjayhj
b25zdCB2ODo6QXIKIHsKICAgICBJTkNfU1RBVFMoTCJET00uRGVkaWNhdGVkV29ya2VyQ29udGV4
dC5wb3N0TWVzc2FnZSIpOwogICAgIERlZGljYXRlZFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRl
eHQgPSBWOERPTVdyYXBwZXI6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxEZWRpY2F0ZWRXb3JrZXJD
b250ZXh0PihWOENsYXNzSW5kZXg6OkRFRElDQVRFRFdPUktFUkNPTlRFWFQsIGFyZ3MuSG9sZGVy
KCkpOwotICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxp
emVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pKTsK
KyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBtZXNzYWdlID0gU2VyaWFsaXplZFNj
cmlwdFZhbHVlOjpjcmVhdGUoYXJnc1swXSk7CiAgICAgTWVzc2FnZVBvcnRBcnJheSBwb3J0QXJy
YXk7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAxKSB7CiAgICAgICAgIGlmICghZ2V0TWVzc2Fn
ZVBvcnRBcnJheShhcmdzWzFdLCBwb3J0QXJyYXkpKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhIaXN0b3J5Q3VzdG9tLmNwcCBiL1dlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4SGlzdG9yeUN1c3RvbS5jcHAKaW5kZXggYWNiOTZlZC4uMjAwMDdlMiAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIaXN0b3J5Q3VzdG9tLmNwcAorKysg
Yi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhpc3RvcnlDdXN0b20uY3BwCkBAIC00Miw3
ICs0Miw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4
SGlzdG9yeTo6cHVzaFN0YXRlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKIHsK
LSAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBoaXN0b3J5U3RhdGUgPSBTZXJpYWxp
emVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJl
ZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGhpc3RvcnlTdGF0ZSA9IFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZTo6Y3JlYXRlKGFyZ3NbMF0pOwogCiAgICAgdjg6OlRyeUNhdGNoIHRyeUNhdGNoOwog
ICAgIFN0cmluZyB0aXRsZSA9IHRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsT3JVbmRlZmluZWRDaGVj
ayhhcmdzWzFdKTsKQEAgLTYzLDcgKzYzLDcgQEAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4SGlz
dG9yeTo6cHVzaFN0YXRlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKIAogdjg6
OkhhbmRsZTx2ODo6VmFsdWU+IFY4SGlzdG9yeTo6cmVwbGFjZVN0YXRlQ2FsbGJhY2soY29uc3Qg
djg6OkFyZ3VtZW50cyYgYXJncykKIHsKLSAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVl
PiBoaXN0b3J5U3RhdGUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh0b1dlYkNvcmVT
dHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGhpc3Rv
cnlTdGF0ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFyZ3NbMF0pOwogCiAgICAg
djg6OlRyeUNhdGNoIHRyeUNhdGNoOwogICAgIFN0cmluZyB0aXRsZSA9IHRvV2ViQ29yZVN0cmlu
Z1dpdGhOdWxsT3JVbmRlZmluZWRDaGVjayhhcmdzWzFdKTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3VzdG9tLmNwcCBiL1dlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3VzdG9tLmNwcAppbmRleCA1YzAxMTNlLi5l
NDExM2UyIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VF
dmVudEN1c3RvbS5jcHAKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdl
RXZlbnRDdXN0b20uY3BwCkBAIC02NSw3ICs2NSw3IEBAIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBW
OE1lc3NhZ2VFdmVudDo6aW5pdE1lc3NhZ2VFdmVudENhbGxiYWNrKGNvbnN0IHY4OjpBcmd1bWVu
CiAgICAgU3RyaW5nIHR5cGVBcmcgPSB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwog
ICAgIGJvb2wgY2FuQnViYmxlQXJnID0gYXJnc1sxXS0+Qm9vbGVhblZhbHVlKCk7CiAgICAgYm9v
bCBjYW5jZWxhYmxlQXJnID0gYXJnc1syXS0+Qm9vbGVhblZhbHVlKCk7Ci0gICAgUmVmUHRyPFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZT4gZGF0YUFyZyA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3Jl
YXRlKHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcoYXJnc1szXSkpOworICAgIFJlZlB0cjxTZXJpYWxp
emVkU2NyaXB0VmFsdWU+IGRhdGFBcmcgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShh
cmdzWzNdKTsKICAgICBTdHJpbmcgb3JpZ2luQXJnID0gdjhWYWx1ZVRvV2ViQ29yZVN0cmluZyhh
cmdzWzRdKTsKICAgICBTdHJpbmcgbGFzdEV2ZW50SWRBcmcgPSB2OFZhbHVlVG9XZWJDb3JlU3Ry
aW5nKGFyZ3NbNV0pOwogICAgIERPTVdpbmRvdyogc291cmNlQXJnID0gVjhET01XaW5kb3c6Okhh
c0luc3RhbmNlKGFyZ3NbNl0pID8gVjhET01XcmFwcGVyOjpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8
RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgdjg6OkhhbmRsZTx2ODo6T2JqZWN0
Pjo6Q2FzdChhcmdzWzZdKSkgOiAwOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhNZXNzYWdlUG9ydEN1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOE1lc3NhZ2VQb3J0Q3VzdG9tLmNwcAppbmRleCA3ODc5ZmI4Li5kMWIwOWY3IDEwMDY0NAot
LS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3VzdG9tLmNwcAor
KysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3VzdG9tLmNwcApA
QCAtNzgsNyArNzgsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhNZXNzYWdlUG9ydDo6cG9z
dE1lc3NhZ2VDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcgogewogICAgIElOQ19TVEFU
UygiRE9NLk1lc3NhZ2VQb3J0LnBvc3RNZXNzYWdlIik7CiAgICAgTWVzc2FnZVBvcnQqIG1lc3Nh
Z2VQb3J0ID0gVjhET01XcmFwcGVyOjpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TWVzc2FnZVBvcnQ+
KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIGFyZ3MuSG9sZGVyKCkpOwotICAgIFJlZlB0cjxT
ZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNy
ZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2Ny
aXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzBd
KTsKICAgICBNZXNzYWdlUG9ydEFycmF5IHBvcnRBcnJheTsKICAgICBpZiAoYXJncy5MZW5ndGgo
KSA+IDEpIHsKICAgICAgICAgaWYgKCFnZXRNZXNzYWdlUG9ydEFycmF5KGFyZ3NbMV0sIHBvcnRB
cnJheSkpCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckN1
c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckN1c3RvbS5jcHAK
aW5kZXggMWNiZTBhNS4uMmY1ODRhNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhXb3JrZXJDdXN0b20uY3BwCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4V29ya2VyQ3VzdG9tLmNwcApAQCAtOTIsNyArOTIsOCBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gVjhXb3JrZXI6OnBvc3RNZXNzYWdlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJn
cykKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Xb3JrZXIucG9zdE1lc3NhZ2UiKTsKICAgICBXb3Jr
ZXIqIHdvcmtlciA9IFY4RE9NV3JhcHBlcjo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFdvcmtlcj4o
VjhDbGFzc0luZGV4OjpXT1JLRVIsIGFyZ3MuSG9sZGVyKCkpOwotICAgIFJlZlB0cjxTZXJpYWxp
emVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh0
b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFs
dWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzBdKTsKKyAg
ICBmcHJpbnRmKHN0ZGVyciwgIlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSBjcmVhdGVkIGluIFY4V29y
a2VyOjpwb3N0TWVzc2FnZUNhbGxiYWNrXG4iKTsKICAgICBNZXNzYWdlUG9ydEFycmF5IHBvcnRB
cnJheTsKICAgICBpZiAoYXJncy5MZW5ndGgoKSA+IDEpIHsKICAgICAgICAgaWYgKCFnZXRNZXNz
YWdlUG9ydEFycmF5KGFyZ3NbMV0sIHBvcnRBcnJheSkpCmRpZmYgLS1naXQgYS9XZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nIGIvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwppbmRleCAyZDNlODhl
Li5lZGUzZTYzIDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1dl
YktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMyBAQAorMjAwOS0xMi0yNCAgVml0
YWx5IFJlcGVzaGtvICA8dml0YWx5ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW1Y4XSBTdXBwb3J0IFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZS4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTMyOTIwCisgICAgICAgIGh0dHA6Ly9jcmJ1Zy5jb20vMzA2MjAKKworICAgICAgICBVcGRhdGVk
IGNsaWVudHM6CisgICAgICAgICogc3JjL1BsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVsLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVsOjpwb3N0TWVzc2Fn
ZVRvUmVtb3RlKToKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVs
Ojp0cnlHZXRNZXNzYWdlRnJvbVJlbW90ZSk6CisgICAgICAgICogc3JjL1dlYldvcmtlckJhc2Uu
Y3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJXb3JrZXJCYXNlOjpwb3N0TWVzc2FnZVRvV29ya2Vy
T2JqZWN0KToKKyAgICAgICAgKiBzcmMvV2ViV29ya2VyQ2xpZW50SW1wbC5jcHA6CisgICAgICAg
IChXZWJLaXQ6OldlYldvcmtlckNsaWVudEltcGw6OnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0
KToKKyAgICAgICAgKFdlYktpdDo6V2ViV29ya2VyQ2xpZW50SW1wbDo6cG9zdE1lc3NhZ2VUb1dv
cmtlck9iamVjdFRhc2spOgorICAgICAgICAqIHNyYy9XZWJXb3JrZXJJbXBsLmNwcDoKKyAgICAg
ICAgKFdlYktpdDo6V2ViV29ya2VySW1wbDo6cG9zdE1lc3NhZ2VUb1dvcmtlckNvbnRleHRUYXNr
KToKKwogMjAwOS0xMi0xOCAgS2VubmV0aCBSdXNzZWxsICA8a2JyQGdvb2dsZS5jb20+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gRmlzaGVyLgpkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9t
aXVtL3NyYy9QbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbC5jcHAgYi9XZWJLaXQvY2hyb21pdW0v
c3JjL1BsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVsLmNwcAppbmRleCBmOGM0MWQzLi5hYTQyYTEw
IDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0vc3JjL1BsYXRmb3JtTWVzc2FnZVBvcnRDaGFu
bmVsLmNwcAorKysgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1BsYXRmb3JtTWVzc2FnZVBvcnRDaGFu
bmVsLmNwcApAQCAtMTc5LDcgKzE3OSw3IEBAIHZvaWQgUGxhdGZvcm1NZXNzYWdlUG9ydENoYW5u
ZWw6OnBvc3RNZXNzYWdlVG9SZW1vdGUoUGFzc093blB0cjxNZXNzYWdlUG9ydENoYW5uCiAgICAg
aWYgKCFtX2xvY2FsUG9ydCB8fCAhbV93ZWJDaGFubmVsKQogICAgICAgICByZXR1cm47CiAKLSAg
ICBXZWJTdHJpbmcgbWVzc2FnZVN0cmluZyA9IG1lc3NhZ2UtPm1lc3NhZ2UoKS0+dG9TdHJpbmco
KTsKKyAgICBXZWJTdHJpbmcgbWVzc2FnZVN0cmluZyA9IG1lc3NhZ2UtPm1lc3NhZ2UoKS0+dG9X
aXJlU3RyaW5nKCk7CiAgICAgT3duUHRyPFdlYkNvcmU6Ok1lc3NhZ2VQb3J0Q2hhbm5lbEFycmF5
PiBjaGFubmVscyA9IG1lc3NhZ2UtPmNoYW5uZWxzKCk7CiAgICAgV2ViTWVzc2FnZVBvcnRDaGFu
bmVsQXJyYXkqIHdlYkNoYW5uZWxzID0gMDsKICAgICBpZiAoY2hhbm5lbHMuZ2V0KCkgJiYgY2hh
bm5lbHMtPnNpemUoKSkgewpAQCAtMjExLDcgKzIxMSw3IEBAIGJvb2wgUGxhdGZvcm1NZXNzYWdl
UG9ydENoYW5uZWw6OnRyeUdldE1lc3NhZ2VGcm9tUmVtb3RlKE93blB0cjxNZXNzYWdlUG9ydENo
YW5uCiAgICAgICAgICAgICAgICAgKCpjaGFubmVscylbaV0gPSBNZXNzYWdlUG9ydENoYW5uZWw6
OmNyZWF0ZShwbGF0Zm9ybUNoYW5uZWwpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAg
ICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRNZXNzYWdlID0gU2Vy
aWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUobWVzc2FnZSk7CisgICAgICAgIFJlZlB0cjxTZXJp
YWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRNZXNzYWdlID0gU2VyaWFsaXplZFNjcmlwdFZh
bHVlOjpjcmVhdGVGcm9tV2lyZShtZXNzYWdlKTsKICAgICAgICAgcmVzdWx0ID0gTWVzc2FnZVBv
cnRDaGFubmVsOjpFdmVudERhdGE6OmNyZWF0ZShzZXJpYWxpemVkTWVzc2FnZS5yZWxlYXNlKCks
IGNoYW5uZWxzLnJlbGVhc2UoKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21p
dW0vc3JjL1dlYldvcmtlckJhc2UuY3BwIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJC
YXNlLmNwcAppbmRleCA4NWEyNjNiLi43MzMzOTgxIDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21p
dW0vc3JjL1dlYldvcmtlckJhc2UuY3BwCisrKyBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29y
a2VyQmFzZS5jcHAKQEAgLTE1OCw3ICsxNTgsNyBAQCB2b2lkIFdlYldvcmtlckJhc2U6OnBvc3RN
ZXNzYWdlVG9Xb3JrZXJPYmplY3QoUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+CiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc093blB0cjxN
ZXNzYWdlUG9ydENoYW5uZWxBcnJheT4gY2hhbm5lbHMpCiB7CiAgICAgZGlzcGF0Y2hUYXNrVG9N
YWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmcG9zdE1lc3NhZ2VUYXNrLCB0aGlzLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+dG9T
dHJpbmcoKSwgY2hhbm5lbHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1lc3NhZ2UtPnRvV2lyZVN0cmluZygpLCBjaGFubmVscykpOwogfQogCiB2
b2lkIFdlYldvcmtlckJhc2U6OnBvc3RNZXNzYWdlVGFzayhTY3JpcHRFeGVjdXRpb25Db250ZXh0
KiBjb250ZXh0LApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJDbGll
bnRJbXBsLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2VyQ2xpZW50SW1wbC5jcHAK
aW5kZXggNmJlMDNhNy4uNTk4YTA3OCAxMDA2NDQKLS0tIGEvV2ViS2l0L2Nocm9taXVtL3NyYy9X
ZWJXb3JrZXJDbGllbnRJbXBsLmNwcAorKysgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtl
ckNsaWVudEltcGwuY3BwCkBAIC0xNzMsNyArMTczLDcgQEAgdm9pZCBXZWJXb3JrZXJDbGllbnRJ
bXBsOjpwb3N0TWVzc2FnZVRvV29ya2VyQ29udGV4dCgKICAgICBpZiAoIWlzTWFpblRocmVhZCgp
KSB7CiAgICAgICAgIFdlYldvcmtlckJhc2U6OmRpc3BhdGNoVGFza1RvTWFpblRocmVhZChjcmVh
dGVDYWxsYmFja1Rhc2soJnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0VGFzaywKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2Fn
ZS0+dG9XaXJlU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpKTsKICAgICAgICAgcmV0dXJu
OwogICAgIH0KQEAgLTE4NCw3ICsxODQsNyBAQCB2b2lkIFdlYldvcmtlckNsaWVudEltcGw6OnBv
c3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0KAogICAgICAgICB3ZWJjaGFubmVsLT5zZXRDbGllbnQo
MCk7CiAgICAgICAgIHdlYkNoYW5uZWxzW2ldID0gd2ViY2hhbm5lbDsKICAgICB9Ci0gICAgbV93
ZWJXb3JrZXItPnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0KG1lc3NhZ2UtPnRvU3RyaW5nKCks
IHdlYkNoYW5uZWxzKTsKKyAgICBtX3dlYldvcmtlci0+cG9zdE1lc3NhZ2VUb1dvcmtlckNvbnRl
eHQobWVzc2FnZS0+dG9XaXJlU3RyaW5nKCksIHdlYkNoYW5uZWxzKTsKIH0KIAogYm9vbCBXZWJX
b3JrZXJDbGllbnRJbXBsOjpoYXNQZW5kaW5nQWN0aXZpdHkoKSBjb25zdApAQCAtMzU2LDcgKzM1
Niw3IEBAIHZvaWQgV2ViV29ya2VyQ2xpZW50SW1wbDo6cG9zdE1lc3NhZ2VUb1dvcmtlck9iamVj
dFRhc2soCiAgICAgICAgIE93blB0cjxNZXNzYWdlUG9ydEFycmF5PiBwb3J0cyA9CiAgICAgICAg
ICAgICBNZXNzYWdlUG9ydDo6ZW50YW5nbGVQb3J0cygqY29udGV4dCwgY2hhbm5lbHMucmVsZWFz
ZSgpKTsKICAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2VyaWFsaXplZE1l
c3NhZ2UgPQotICAgICAgICAgICAgU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUobWVzc2Fn
ZSk7CisgICAgICAgICAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZUZyb21XaXJlKG1l
c3NhZ2UpOwogICAgICAgICB0aGlzUHRyLT5tX3dvcmtlci0+ZGlzcGF0Y2hFdmVudChNZXNzYWdl
RXZlbnQ6OmNyZWF0ZShwb3J0cy5yZWxlYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRNZXNzYWdlLnJl
bGVhc2UoKSkpOwogICAgIH0KZGlmZiAtLWdpdCBhL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29y
a2VySW1wbC5jcHAgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckltcGwuY3BwCmluZGV4
IDc0NGJlMzAuLjViNWUwNTMgMTAwNjQ0Ci0tLSBhL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29y
a2VySW1wbC5jcHAKKysrIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJJbXBsLmNwcApA
QCAtODgsNyArODgsNyBAQCB2b2lkIFdlYldvcmtlckltcGw6OnBvc3RNZXNzYWdlVG9Xb3JrZXJD
b250ZXh0VGFzayhXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZQogICAgIE93blB0cjxNZXNz
YWdlUG9ydEFycmF5PiBwb3J0cyA9CiAgICAgICAgIE1lc3NhZ2VQb3J0OjplbnRhbmdsZVBvcnRz
KCpjb250ZXh0LCBjaGFubmVscy5yZWxlYXNlKCkpOwogICAgIFJlZlB0cjxTZXJpYWxpemVkU2Ny
aXB0VmFsdWU+IHNlcmlhbGl6ZWRNZXNzYWdlID0KLSAgICAgICAgU2VyaWFsaXplZFNjcmlwdFZh
bHVlOjpjcmVhdGUobWVzc2FnZSk7CisgICAgICAgIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3Jl
YXRlRnJvbVdpcmUobWVzc2FnZSk7CiAgICAgd29ya2VyQ29udGV4dC0+ZGlzcGF0Y2hFdmVudChN
ZXNzYWdlRXZlbnQ6OmNyZWF0ZSgKICAgICAgICAgcG9ydHMucmVsZWFzZSgpLCBzZXJpYWxpemVk
TWVzc2FnZS5yZWxlYXNlKCkpKTsKICAgICB0aGlzUHRyLT5jb25maXJtTWVzc2FnZUZyb21Xb3Jr
ZXJPYmplY3Qod29ya2VyQ29udGV4dC0+aGFzUGVuZGluZ0FjdGl2aXR5KCkpOwo=
</data>
<flag name="review"
          id="27517"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>45473</attachid>
            <date>2009-12-24 12:13:07 -0800</date>
            <delta_ts>2009-12-24 14:40:41 -0800</delta_ts>
            <desc>patch: fixed most style violations</desc>
            <filename>serialize.patch</filename>
            <type>text/plain</type>
            <size>38819</size>
            <attacher name="Vitaly Repeshko">vitalyr</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MzkzMDVlZC4uM2YxOGVkMyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw5NCBAQAorMjAwOS0xMi0yNCAgVml0YWx5IFJlcGVz
aGtvICA8dml0YWx5ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgW1Y4XSBTdXBwb3J0IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMyOTIwCisg
ICAgICAgIGh0dHA6Ly9jcmJ1Zy5jb20vMzA2MjAKKworICAgICAgICBJbml0aWFsIGltcGxlbWVu
dGF0aW9uIG9mIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4KKworICAgICAgICAqIFdlYkNvcmUuZ3lw
aTogQWRkZWQgU2VyaWFsaXplZFNjcmlwdFZhbHVlLmNwcC4KKyAgICAgICAgKiBiaW5kaW5ncy9z
Y3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5wbTogUmVtb3ZlZCBjb252ZXJzaW9uIHRvIHN0cmluZyBi
ZWZvcmUgdXNpbmcgU2VyaWFsaXplZFNjcmlwdFZhbHVlLgorICAgICAgICAqIGJpbmRpbmdzL3Y4
L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6KToK
KyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6V3JpdGVyOjpXcml0ZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6WmlnWmFnOjpXcml0ZXI6OndyaXRlVW5kZWZpbmVkKToKKyAgICAgICAgKFdlYkNvcmU6
OlppZ1phZzo6V3JpdGVyOjp3cml0ZU51bGwpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpX
cml0ZXI6OndyaXRlVHJ1ZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OldyaXRlcjo6d3Jp
dGVGYWxzZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OldyaXRlcjo6d3JpdGVTdHJpbmcp
OgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OndyaXRlSW50MzIpOgorICAgICAg
ICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OndyaXRlTnVtYmVyKToKKyAgICAgICAgKFdlYkNv
cmU6OlppZ1phZzo6V3JpdGVyOjplbmRDb21wb3NpdGUpOgorICAgICAgICAoV2ViQ29yZTo6Wmln
WmFnOjpXcml0ZXI6OmRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OmRv
V3JpdGVVaW50MzIpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OmFwcGVuZCk6
CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OldyaXRlcjo6ZW5zdXJlU3BhY2UpOgorICAgICAg
ICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OmZpbGxIb2xlKToKKyAgICAgICAgKFdlYkNvcmU6
OlppZ1phZzo6V3JpdGVyOjpjaGFyQXQpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJp
YWxpemVyOjpTZXJpYWxpemVyKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXpl
cjo6c2VyaWFsaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6U3Rh
dGVCYXNlOjp+U3RhdGVCYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXpl
cjo6U3RhdGVCYXNlOjpuZXh0U3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJp
YWxpemVyOjpTdGF0ZUJhc2U6OnNldE5leHRTdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWda
YWc6OlNlcmlhbGl6ZXI6OlN0YXRlQmFzZTo6Y29tcG9zaXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OlppZ1phZzo6U2VyaWFsaXplcjo6U3RhdGVCYXNlOjpTdGF0ZUJhc2UpOgorICAgICAgICAoV2Vi
Q29yZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpTdGF0ZTo6Y29tcG9zaXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6U3RhdGU6OnRhZyk6CisgICAgICAgIChXZWJDb3Jl
OjpaaWdaYWc6OlNlcmlhbGl6ZXI6OlN0YXRlOjpTdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpa
aWdaYWc6OlNlcmlhbGl6ZXI6OlN0YWNrQ2xlYW5lcjo6U3RhY2tDbGVhbmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6U3RhY2tDbGVhbmVyOjp+U3RhY2tDbGVhbmVy
KToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6QXJyYXlTdGF0ZTo6QXJy
YXlTdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OlNlcmlhbGl6ZXI6OkFycmF5U3Rh
dGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpBcnJheVN0
YXRlOjphZHZhbmNlKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6T2Jq
ZWN0U3RhdGU6Ok9iamVjdFN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFs
aXplcjo6T2JqZWN0U3RhdGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJp
YWxpemVyOjpPYmplY3RTdGF0ZTo6YWR2YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6
OlNlcmlhbGl6ZXI6Ok9iamVjdFN0YXRlOjpuZXh0UHJvcGVydHkpOgorICAgICAgICAoV2ViQ29y
ZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpkb1NlcmlhbGl6ZSk6CisgICAgICAgIChXZWJDb3JlOjpa
aWdaYWc6OlNlcmlhbGl6ZXI6OnB1c2gpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJp
YWxpemVyOjp0b3ApOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpwb3Ap
OgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpjaGVja0NvbXBvc2l0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OlJlYWRlcjo6UmVhZGVyKToKKyAgICAgICAgKFdl
YkNvcmU6OlppZ1phZzo6UmVhZGVyOjppc0VvZik6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6
OlJlYWRlcjo6cmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OlJlYWRlcjo6cmVhZFRh
Zyk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OlJlYWRlcjo6cmVhZFN0cmluZyk6CisgICAg
ICAgIChXZWJDb3JlOjpaaWdaYWc6OlJlYWRlcjo6cmVhZEludDMyKToKKyAgICAgICAgKFdlYkNv
cmU6OlppZ1phZzo6UmVhZGVyOjpyZWFkTnVtYmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1ph
Zzo6UmVhZGVyOjpkb1JlYWRVaW50MzIpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpEZXNl
cmlhbGl6ZXI6OkRlc2VyaWFsaXplcik6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OkRlc2Vy
aWFsaXplcjo6ZGVzZXJpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpEZXNlcmlh
bGl6ZXI6OmRvRGVzZXJpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpEZXNlcmlh
bGl6ZXI6OnB1c2gpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpEZXNlcmlhbGl6ZXI6OnBv
cCk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OkRlc2VyaWFsaXplcjo6c3RhY2tEZXB0aCk6
CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OkRlc2VyaWFsaXplcjo6ZWxlbWVudCk6CisgICAg
ICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmRlc2VyaWFsaXpl
KToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlRnJvbVdpcmUpOgorICAgICAgICAo
V2ViQ29yZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpyZWxlYXNlKToKKyAgICAgICAgKFdlYkNv
cmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6dG9XaXJlU3RyaW5nKToKKworICAgICAgICBVcGRh
dGVkIGNsaWVudHM6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4RE9NV2luZG93Q3Vz
dG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4RE9NV2luZG93Ojpwb3N0TWVzc2FnZUNhbGxi
YWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhEZWRpY2F0ZWRXb3JrZXJDb250
ZXh0Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4RGVkaWNhdGVkV29ya2VyQ29udGV4
dDo6cG9zdE1lc3NhZ2VDYWxsYmFjayk6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4
SGlzdG9yeUN1c3RvbS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWOEhpc3Rvcnk6OnB1c2hTdGF0
ZUNhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlY4SGlzdG9yeTo6cmVwbGFjZVN0YXRlQ2Fs
bGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VFdmVudEN1c3Rv
bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWOE1lc3NhZ2VFdmVudDo6aW5pdE1lc3NhZ2VFdmVu
dENhbGxiYWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdlUG9ydEN1
c3RvbS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWOE1lc3NhZ2VQb3J0Ojpwb3N0TWVzc2FnZUNh
bGxiYWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhXb3JrZXJDdXN0b20uY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6VjhXb3JrZXI6OnBvc3RNZXNzYWdlQ2FsbGJhY2spOgorCiAy
MDA5LTEyLTIxICBFbnJpY2EgQ2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgTWFjaWVqIFN0YWNob3dpYWsuCmRpZmYgLS1naXQgYS9XZWJDb3JlL1dlYkNv
cmUuZ3lwaSBiL1dlYkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IDgzNmUzM2QuLmJjMjcyYzkgMTAw
NjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5neXBpCisrKyBiL1dlYkNvcmUvV2ViQ29yZS5neXBp
CkBAIC03OTIsNiArNzkyLDcgQEAKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9TY3JpcHRWYWx1
ZS5jcHAnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L1NjcmlwdFZhbHVlLmgnLAogICAgICAg
ICAgICAgJ2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oJywKKyAgICAgICAgICAg
ICdiaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwJywKICAgICAgICAgICAgICdi
aW5kaW5ncy92OC9TdGF0aWNET01EYXRhU3RvcmUuY3BwJywKICAgICAgICAgICAgICdiaW5kaW5n
cy92OC9TdGF0aWNET01EYXRhU3RvcmUuaCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvVjhB
YnN0cmFjdEV2ZW50TGlzdGVuZXIuY3BwJywKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3Mv
c2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG0gYi9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvQ29k
ZUdlbmVyYXRvclY4LnBtCmluZGV4IDcxYzY1MGUuLjliNjE4ZGMgMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG0KKysrIGIvV2ViQ29yZS9iaW5k
aW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5wbQpAQCAtMjM2OCw3ICsyMzY4LDcgQEAgc3Vi
IFJldHVybk5hdGl2ZVRvSlNWYWx1ZQogCiAgICAgaWYgKCR0eXBlIGVxICJTZXJpYWxpemVkU2Ny
aXB0VmFsdWUiKSB7CiAgICAgICAgICRpbXBsSW5jbHVkZXN7IiR0eXBlLmgifSA9IDE7Ci0gICAg
ICAgIHJldHVybiAicmV0dXJuIHY4U3RyaW5nKCR2YWx1ZS0+dG9TdHJpbmcoKSkiOworICAgICAg
ICByZXR1cm4gInJldHVybiAkdmFsdWUtPmRlc2VyaWFsaXplKCkiOwogICAgIH0KIAogICAgIGlm
ICgkdHlwZSBlcSAiRGVkaWNhdGVkV29ya2VyQ29udGV4dCIgb3IgJHR5cGUgZXEgIldvcmtlckNv
bnRleHQiIG9yICR0eXBlIGVxICJTaGFyZWRXb3JrZXJDb250ZXh0IikgewpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwIGIvV2ViQ29yZS9i
aW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLmNkNWZhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRp
bmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAKQEAgLTAsMCArMSw2NjMgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlz
dHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3Ig
dGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwor
ICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9S
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2VyaWFsaXplZFNjcmlwdFZhbHVlLmgiCisKKyNpbmNs
dWRlICJTaGFyZWRCdWZmZXIuaCIKKworI2luY2x1ZGUgPHY4Lmg+CisjaW5jbHVkZSA8d3RmL1Jl
ZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKKy8vIFRPRE8odml0YWx5cik6
CisvLyAtIGNhdGNoIFY4IGV4Y2VwdGlvbnMKKy8vIC0gYmUgcmVhZHkgdG8gZ2V0IGVtcHR5IGhh
bmRsZXMKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisjZGVmaW5lIERPKEFjdGlvbikgaWYgKCFB
Y3Rpb24pIHJldHVybiBmYWxzZQorCituYW1lc3BhY2UgeworCisvLyBTZXJpYWxpemF0aW9uIGZv
cm1hdCBpcyBhIHNlcXVlbmNlIG9mICh0YWcsIG9wdGlvbmFsIGRhdGEpCisvLyBwYWlycy4gVGFn
IGFsd2F5cyB0YWtlcyBleGFjdGx5IG9uZSBieXRlLgorZW51bSBTZXJpYWxpemF0aW9uVGFnIHsK
KyAgICBJbnZhbGlkVGFnID0gJyEnLAorICAgIFBhZGRpbmdUYWcgPSAnXDAnLAorICAgIFVuZGVm
aW5lZFRhZyA9ICdfJywKKyAgICBOdWxsVGFnID0gJzAnLAorICAgIFRydWVUYWcgPSAnVCcsCisg
ICAgRmFsc2VUYWcgPSAnRicsCisgICAgU3RyaW5nVGFnID0gJ1MnLAorICAgIEludDMyVGFnID0g
J0knLAorICAgIE51bWJlclRhZyA9ICdOJywKKyAgICBPYmplY3RUYWcgPSAneycsCisgICAgQXJy
YXlUYWcgPSAnWycsCit9OworCisvLyBIZWxwZXJzIHRvIGRvIHZlcmJvc2UgaGFuZGxlIGNhc3Rz
LgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0YXRpYyB2ODo6SGFuZGxl
PFQ+IGhhbmRsZUNhc3Qodjg6OkhhbmRsZTxVPiBoYW5kbGUpIHsgcmV0dXJuIHY4OjpIYW5kbGU8
VD46OkNhc3QoaGFuZGxlKTsgfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4K
K3N0YXRpYyB2ODo6TG9jYWw8VD4gaGFuZGxlQ2FzdCh2ODo6TG9jYWw8VT4gaGFuZGxlKSB7IHJl
dHVybiB2ODo6TG9jYWw8VD46OkNhc3QoaGFuZGxlKTsgfQorCitzdGF0aWMgYm9vbCBpc1Bvd2Vy
T2ZUd28oaW50IHgpIHsKKyAgICByZXR1cm4gKHggJiAoeCAtIDEpKSA9PSAwOworfQorCisvLyBW
YXJJbnQgZW5jb2RpbmcgY29uc3RhbnRzLgorc3RhdGljIGNvbnN0IGludCBrVmFySW50U2hpZnQg
PSA3Oworc3RhdGljIGNvbnN0IGludCBrVmFySW50TWFzayA9ICgxIDw8IGtWYXJJbnRTaGlmdCkg
LSAxOworCisvLyBaaWdaYWcgZW5jb2RpbmcgdG8gaGVscCBWYXJJbnQgZW5jb2Rpbmcgc3RheSBz
bWFsbCBmb3IgbmVnYXRpdmUKKy8vIG51bWJlcnMgd2l0aCBzbWFsbCBhYnNvbHV0ZSB2YWx1ZXMu
CitjbGFzcyBaaWdaYWcgeworICBwdWJsaWM6CisgICAgc3RhdGljIHVpbnQzMl90IGVuY29kZSh1
aW50MzJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSAmICgxVSA8PCAzMSkpCisg
ICAgICAgICAgICB2YWx1ZSA9ICgofnZhbHVlKSA8PCAxKSArIDE7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIHZhbHVlIDw8PSAxOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisg
ICAgc3RhdGljIHVpbnQzMl90IGRlY29kZSh1aW50MzJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAg
IGlmICh2YWx1ZSAmIDEpCisgICAgICAgICAgICB2YWx1ZSA9IH4odmFsdWUgPj4gMSk7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHVlID4+PSAxOworICAgICAgICByZXR1cm4gdmFsdWU7
CisgICAgfQorCisgIHByaXZhdGU6CisgICAgWmlnWmFnKCk7Cit9OworCisvLyBXcml0ZXIgaXMg
cmVzcG9uc2libGUgZm9yIHNlcmlhbGl6aW5nIHByaW1pdGl2ZSB0eXBlcyBhbmQgc3RvcmluZwor
Ly8gaW5mb3JtYXRpb24gdXNlZCB0byByZWNvbnN0cnVjdCBjb21wb3NpdGUgdHlwZXMuCitjbGFz
cyBXcml0ZXIgOiBOb25jb3B5YWJsZSB7CisgIHB1YmxpYzoKKyAgICBXcml0ZXIoKSA6IG1fcG9z
KDApIHsgfQorCisgICAgLy8gV3JpdGUgZnVuY3Rpb25zIGZvciBwcmltaXRpdmUgdHlwZXMuCisK
KyAgICB2b2lkIHdyaXRlVW5kZWZpbmVkKCkgeyBhcHBlbmQoVW5kZWZpbmVkVGFnKTsgfQorCisg
ICAgdm9pZCB3cml0ZU51bGwoKSB7IGFwcGVuZChOdWxsVGFnKTsgfQorCisgICAgdm9pZCB3cml0
ZVRydWUoKSB7IGFwcGVuZChUcnVlVGFnKTsgfQorCisgICAgdm9pZCB3cml0ZUZhbHNlKCkgeyBh
cHBlbmQoRmFsc2VUYWcpOyB9CisKKyAgICB2b2lkIHdyaXRlU3RyaW5nKGNvbnN0IGNoYXIqIGRh
dGEsIGludCBsZW5ndGgpCisgICAgeworICAgICAgICBhcHBlbmQoU3RyaW5nVGFnKTsKKyAgICAg
ICAgZG9Xcml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4obGVuZ3RoKSk7CisgICAgICAg
IGFwcGVuZChkYXRhLCBsZW5ndGgpOworICAgIH0KKworICAgIHZvaWQgd3JpdGVJbnQzMihpbnQz
Ml90IHZhbHVlKQorICAgIHsKKyAgICAgICAgYXBwZW5kKEludDMyVGFnKTsKKyAgICAgICAgZG9X
cml0ZVVpbnQzMihaaWdaYWc6OmVuY29kZShzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUpKSk7
CisgICAgfQorCisgICAgdm9pZCB3cml0ZU51bWJlcihkb3VibGUgbnVtYmVyKQorICAgIHsKKyAg
ICAgICAgYXBwZW5kKE51bWJlclRhZyk7CisgICAgICAgIGNoYXIqIG51bWJlckJ5dGVzID0gcmVp
bnRlcnByZXRfY2FzdDxjaGFyKj4oJm51bWJlcik7CisgICAgICAgIGFwcGVuZChudW1iZXJCeXRl
cywgc2l6ZW9mKG51bWJlcikpOworICAgIH0KKworICAgIC8vIFJlY29yZHMgdGhhdCBhIGNvbXBv
c2l0ZSBvYmplY3QgY2FuIGJlIGNvbnN0cnVjdGVkIGJ5IHVzaW5nCisgICAgLy8gfGxlbmd0aHwg
cHJldmlvdXNseSBzdG9yZWQgdmFsdWVzLgorICAgIHZvaWQgZW5kQ29tcG9zaXRlKFNlcmlhbGl6
YXRpb25UYWcgdGFnLCBpbnQzMl90IGxlbmd0aCkKKyAgICB7CisgICAgICAgIEFTU0VSVCh0YWcg
PT0gT2JqZWN0VGFnIHx8IHRhZyA9PSBBcnJheVRhZyk7CisgICAgICAgIGFwcGVuZCh0YWcpOwor
ICAgICAgICBkb1dyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihsZW5ndGgpKTsKKyAg
ICB9CisKKyAgICBWZWN0b3I8VUNoYXI+JiBkYXRhKCkKKyAgICB7CisgICAgICAgIGZpbGxIb2xl
KCk7CisgICAgICAgIHJldHVybiBtX2J1ZmZlcjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB2
b2lkIGRvV3JpdGVVaW50MzIodWludDMyX3QgdmFsdWUpCisgICAgeworICAgICAgICB3aGlsZSAo
dHJ1ZSkgeworICAgICAgICAgICAgY2hhciBiID0gKHZhbHVlICYga1ZhckludE1hc2spOworICAg
ICAgICAgICAgdmFsdWUgPj49IGtWYXJJbnRTaGlmdDsKKyAgICAgICAgICAgIGlmICghdmFsdWUp
IHsKKyAgICAgICAgICAgICAgICBhcHBlbmQoYik7CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBhcHBlbmQoYiB8ICgxIDw8IGtWYXJJbnRTaGlmdCkp
OworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBhcHBlbmQoY2hhciBiKQorICAgIHsKKyAg
ICAgICAgZW5zdXJlU3BhY2UoMSk7CisgICAgICAgICpjaGFyQXQobV9wb3MrKykgPSBiOworICAg
IH0KKworICAgIHZvaWQgYXBwZW5kKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpCisgICAg
eworICAgICAgICBlbnN1cmVTcGFjZShsZW5ndGgpOworICAgICAgICBtZW1jcHkoY2hhckF0KG1f
cG9zKSwgZGF0YSwgbGVuZ3RoKTsKKyAgICAgICAgbV9wb3MgKz0gbGVuZ3RoOworICAgIH0KKwor
ICAgIHZvaWQgZW5zdXJlU3BhY2UoaW50IGV4dHJhKQorICAgIHsKKyAgICAgICAgbV9idWZmZXIu
Z3JvdygobV9wb3MgKyBleHRyYSArIDEpIC8gMik7CisgICAgfQorCisgICAgdm9pZCBmaWxsSG9s
ZSgpCisgICAgeworICAgICAgICAvLyBJZiB0aGUgd3JpdGVyIGlzIGF0IG9kZCBwb3NpdGlvbiBp
biB0aGUgYnVmZmVyIHRoZW4gb25lIG9mCisgICAgICAgIC8vIHRoZSBieXRlcyBpbiB0aGUgbGFz
dCBVQ2hhciBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICAgIGlmIChtX3BvcyAlIDIpCisgICAg
ICAgICAgICAqY2hhckF0KG1fcG9zKSA9IFBhZGRpbmdUYWc7CisgICAgfQorCisgICAgY2hhciog
Y2hhckF0KGludCBwb3MpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG1fYnVmZmVy
LmRhdGEoKSkgKyBwb3M7IH0KKworICAgIFZlY3RvcjxVQ2hhcj4gbV9idWZmZXI7CisgICAgaW50
IG1fcG9zOworfTsKKworY2xhc3MgU2VyaWFsaXplciB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNp
dCBTZXJpYWxpemVyKFdyaXRlciogd3JpdGVyKQorICAgICAgICAgICAgOiBtX3dyaXRlcih3cml0
ZXIpCisgICAgICAgICAgICAsIG1fc3RhdGUoMCkKKyAgICAgICAgICAgICwgbV9kZXB0aCgwKQor
ICAgIHt9CisKKyAgICBib29sIHNlcmlhbGl6ZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUp
CisgICAgeworICAgICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgICAgIFN0YWNrQ2xl
YW5lciBjbGVhbmVyKCZtX3N0YXRlKTsKKyAgICAgICAgRE8oZG9TZXJpYWxpemUodmFsdWUpKTsK
KyAgICAgICAgd2hpbGUgKHRvcCgpKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoOworICAgICAg
ICAgICAgd2hpbGUgKCF0b3AoKS0+ZG9uZSgmbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIC8v
IE5vdGUgdGhhdCBkb1NlcmlhbGl6ZSgpIGNhbiBjaGFuZ2UgY3VycmVudCB0b3AoKS4KKyAgICAg
ICAgICAgICAgICBETyhkb1NlcmlhbGl6ZSh0b3AoKS0+YWR2YW5jZSgpKSk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBtX3dyaXRlci0+ZW5kQ29tcG9zaXRlKHRvcCgpLT50YWcoKSwgbGVu
Z3RoKTsKKyAgICAgICAgICAgIHBvcCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKworICBwcml2YXRlOgorICAgIGNsYXNzIFN0YXRlQmFzZSA6IHB1YmxpYyBOb25j
b3B5YWJsZSB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflN0YXRlQmFzZSgpIHt9
CisKKyAgICAgICAgLy8gTGluayB0byB0aGUgbmV4dCBzdGF0ZSB0byBmb3JtIGEgc3RhY2suCisg
ICAgICAgIFN0YXRlQmFzZSogbmV4dFN0YXRlKCkgeyByZXR1cm4gbV9uZXh0OyB9CisgICAgICAg
IHZvaWQgc2V0TmV4dFN0YXRlKFN0YXRlQmFzZSogbmV4dCkgeyBtX25leHQgPSBuZXh0OyB9CisK
KyAgICAgICAgLy8gQ29tcG9zaXRlIG9iamVjdCB3ZSdyZSBwcm9jZXNzaW5nIGluIHRoaXMgc3Rh
dGUuCisgICAgICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb21wb3NpdGUoKSB7IHJldHVybiBt
X2NvbXBvc2l0ZTsgfQorCisgICAgICAgIC8vIFNlcmlhbGl6YXRpb24gdGFnIGZvciB0aGUgY3Vy
cmVudCBjb21wb3NpdGUuCisgICAgICAgIHZpcnR1YWwgU2VyaWFsaXphdGlvblRhZyB0YWcoKSBj
b25zdCA9IDA7CisKKyAgICAgICAgLy8gUmV0dXJucyB3aGV0aGVyIGl0ZXJhdGlvbiBvdmVyIHN1
Ym9iamVjdHMgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gY29tcG9zaXRlIG9iamVjdCBpcyBk
b25lLiBJZiB5ZXMsIHwqbGVuZ3RofCBpcyBzZXQgdG8gdGhlCisgICAgICAgIC8vIG51bWJlciBv
ZiBzdWJvYmplY3RzLgorICAgICAgICB2aXJ0dWFsIGJvb2wgZG9uZShpbnQqIGxlbmd0aCkgPSAw
OworCisgICAgICAgIC8vIEFkdmFuY2VzIHRvIHRoZSBuZXh0IHN1Ym9iamVjdC4KKyAgICAgICAg
Ly8gUmVxdWlyZXM6ICF0aGlzLT5kb25lKCkuCisgICAgICAgIHZpcnR1YWwgdjg6OkxvY2FsPHY4
OjpWYWx1ZT4gYWR2YW5jZSgpID0gMDsKKworICAgICAgcHJvdGVjdGVkOgorICAgICAgICBTdGF0
ZUJhc2Uodjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbXBvc2l0ZSkKKyAgICAgICAgICAgICAgICA6
IG1fbmV4dCgwKQorICAgICAgICAgICAgICAgICwgbV9jb21wb3NpdGUoY29tcG9zaXRlKQorICAg
ICAgICB7fQorCisgICAgICBwcml2YXRlOgorICAgICAgICBTdGF0ZUJhc2UqIG1fbmV4dDsKKyAg
ICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IG1fY29tcG9zaXRlOworICAgIH07CisKKyAgICB0
ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgU2VyaWFsaXphdGlvblRhZyBjb21wb3NpdGVUYWc+CisgICAg
Y2xhc3MgU3RhdGUgOiBwdWJsaWMgU3RhdGVCYXNlIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAg
djg6OkhhbmRsZTxUPiBjb21wb3NpdGUoKSB7IHJldHVybiBoYW5kbGVDYXN0PFQ+KFN0YXRlQmFz
ZTo6Y29tcG9zaXRlKCkpOyB9CisKKyAgICAgICAgdmlydHVhbCBTZXJpYWxpemF0aW9uVGFnIHRh
ZygpIGNvbnN0IHsgcmV0dXJuIGNvbXBvc2l0ZVRhZzsgfQorCisgICAgICBwcm90ZWN0ZWQ6Cisg
ICAgICAgIGV4cGxpY2l0IFN0YXRlKHY4OjpIYW5kbGU8VD4gY29tcG9zaXRlKSA6IFN0YXRlQmFz
ZShjb21wb3NpdGUpIHt9CisgICAgfTsKKworICAgIC8vIEhlbHBlciB0byBjbGVhbiB1cCB0aGUg
c3RhdGUgc3RhY2sgaW4gY2FzZSBvZiBlcnJvcnMuCisgICAgY2xhc3MgU3RhY2tDbGVhbmVyIDog
Tm9uY29weWFibGUgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBTdGFja0NsZWFu
ZXIoU3RhdGVCYXNlKiogc3RhY2spIDogbV9zdGFjayhzdGFjaykge30KKworICAgICAgICB+U3Rh
Y2tDbGVhbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdGVCYXNlKiBzdGF0ZSA9ICpt
X3N0YWNrOworICAgICAgICAgICAgd2hpbGUgKHN0YXRlKSB7CisgICAgICAgICAgICAgICAgU3Rh
dGVCYXNlKiB0bXAgPSBzdGF0ZS0+bmV4dFN0YXRlKCk7CisgICAgICAgICAgICAgICAgZGVsZXRl
IHN0YXRlOworICAgICAgICAgICAgICAgIHN0YXRlID0gdG1wOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgKm1fc3RhY2sgPSAwOworICAgICAgICB9CisKKyAgICAgIHByaXZhdGU6CisgICAg
ICAgIFN0YXRlQmFzZSoqIG1fc3RhY2s7CisgICAgfTsKKworICAgIGNsYXNzIEFycmF5U3RhdGUg
OiBwdWJsaWMgU3RhdGU8djg6OkFycmF5LCBBcnJheVRhZz4geworICAgICAgcHVibGljOgorICAg
ICAgICBBcnJheVN0YXRlKHY4OjpIYW5kbGU8djg6OkFycmF5PiBhcnJheSkKKyAgICAgICAgICAg
ICAgICA6IFN0YXRlPHY4OjpBcnJheSwgQXJyYXlUYWc+KGFycmF5KQorICAgICAgICAgICAgICAg
ICwgbV9pbmRleCgwKQorICAgICAgICB7fQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBkb25lKGlu
dCogbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICAqbGVuZ3RoID0gY29tcG9zaXRlKCkt
Pkxlbmd0aCgpOworICAgICAgICAgICAgcmV0dXJuIG1faW5kZXggPj0gKmxlbmd0aDsKKyAgICAg
ICAgfQorCisgICAgICAgIHZpcnR1YWwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gYWR2YW5jZSgpCisg
ICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2luZGV4IDwgY29tcG9zaXRlKCktPkxlbmd0
aCgpKTsKKyAgICAgICAgICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKyAgICAgICAgICAgIHJl
dHVybiBzY29wZS5DbG9zZShjb21wb3NpdGUoKS0+R2V0KHY4OjpJbnRlZ2VyOjpOZXcobV9pbmRl
eCsrKSkpOworICAgICAgICB9CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIGludCBtX2luZGV4
OworICAgIH07CisKKyAgICBjbGFzcyBPYmplY3RTdGF0ZSA6IHB1YmxpYyBTdGF0ZTx2ODo6T2Jq
ZWN0LCBPYmplY3RUYWc+IHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgT2JqZWN0U3RhdGUodjg6
OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmplY3QpCisgICAgICAgICAgICAgICAgOiBTdGF0ZTx2ODo6
T2JqZWN0LCBPYmplY3RUYWc+KG9iamVjdCkKKyAgICAgICAgICAgICAgICAsIG1fcHJvcGVydHlO
YW1lcyhvYmplY3QtPkdldFByb3BlcnR5TmFtZXMoKSkKKyAgICAgICAgICAgICAgICAsIG1faW5k
ZXgoLTEpCisgICAgICAgICAgICAgICAgLCBtX2xlbmd0aCgwKQorICAgICAgICB7CisgICAgICAg
ICAgICBuZXh0UHJvcGVydHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBk
b25lKGludCogbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICAqbGVuZ3RoID0gbV9sZW5n
dGg7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA+PSAyICogbV9wcm9wZXJ0eU5hbWVzLT5M
ZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdjg6OkxvY2FsPHY4OjpWYWx1
ZT4gYWR2YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2luZGV4IDwgMiAq
IG1fcHJvcGVydHlOYW1lcy0+TGVuZ3RoKCkpOworICAgICAgICAgICAgaWYgKCEobV9pbmRleCAl
IDIpKSB7CisgICAgICAgICAgICAgICAgKyttX2luZGV4OworICAgICAgICAgICAgICAgIHJldHVy
biBtX3Byb3BlcnR5TmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHY4OjpMb2NhbDx2
ODo6VmFsdWU+IHJlc3VsdCA9IGNvbXBvc2l0ZSgpLT5HZXQobV9wcm9wZXJ0eU5hbWUpOworICAg
ICAgICAgICAgbmV4dFByb3BlcnR5KCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAg
ICAgICB9CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbmV4dFByb3BlcnR5KCkKKyAg
ICAgICAgeworICAgICAgICAgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgICAgICAgICAg
KyttX2luZGV4OworICAgICAgICAgICAgQVNTRVJUKCEobV9pbmRleCAlIDIpKTsKKyAgICAgICAg
ICAgIGZvciAoOyBtX2luZGV4IDwgMiAqIG1fcHJvcGVydHlOYW1lcy0+TGVuZ3RoKCk7IG1faW5k
ZXggKz0gMikgeworICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHByb3BlcnR5
TmFtZSA9IG1fcHJvcGVydHlOYW1lcy0+R2V0KHY4OjpJbnRlZ2VyOjpOZXcobV9pbmRleCAvIDIp
KTsKKyAgICAgICAgICAgICAgICBpZiAoKHByb3BlcnR5TmFtZS0+SXNTdHJpbmcoKSAmJiBjb21w
b3NpdGUoKS0+SGFzUmVhbE5hbWVkUHJvcGVydHkoaGFuZGxlQ2FzdDx2ODo6U3RyaW5nPihwcm9w
ZXJ0eU5hbWUpKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHByb3BlcnR5TmFtZS0+SXNJbnQz
MigpICYmIGNvbXBvc2l0ZSgpLT5IYXNSZWFsSW5kZXhlZFByb3BlcnR5KHByb3BlcnR5TmFtZS0+
VWludDMyVmFsdWUoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1fcHJvcGVydHlOYW1lID0g
c2NvcGUuQ2xvc2UocHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbV9sZW5ndGgg
Kz0gMjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IG1f
cHJvcGVydHlOYW1lczsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gbV9wcm9wZXJ0eU5h
bWU7CisgICAgICAgIGludCBtX2luZGV4OworICAgICAgICBpbnQgbV9sZW5ndGg7CisgICAgfTsK
KworICAgIGJvb2wgZG9TZXJpYWxpemUodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQorICAg
IHsKKyAgICAgICAgaWYgKHZhbHVlLT5Jc1VuZGVmaW5lZCgpKSB7CisgICAgICAgICAgICBtX3dy
aXRlci0+d3JpdGVVbmRlZmluZWQoKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+SXNOdWxs
KCkpIHsKKyAgICAgICAgICAgIG1fd3JpdGVyLT53cml0ZU51bGwoKTsKKyAgICAgICAgfSBlbHNl
IGlmICh2YWx1ZS0+SXNUcnVlKCkpIHsKKyAgICAgICAgICAgIG1fd3JpdGVyLT53cml0ZVRydWUo
KTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+SXNGYWxzZSgpKSB7CisgICAgICAgICAgICBt
X3dyaXRlci0+d3JpdGVGYWxzZSgpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc1N0cmlu
ZygpKSB7CisgICAgICAgICAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgc3RyaW5nVmFsdWUodmFs
dWUpOworICAgICAgICAgICAgbV93cml0ZXItPndyaXRlU3RyaW5nKCpzdHJpbmdWYWx1ZSwgc3Ry
aW5nVmFsdWUubGVuZ3RoKCkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc0ludDMyKCkp
IHsKKyAgICAgICAgICAgIG1fd3JpdGVyLT53cml0ZUludDMyKHZhbHVlLT5JbnQzMlZhbHVlKCkp
OworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc051bWJlcigpKSB7CisgICAgICAgICAgICBt
X3dyaXRlci0+d3JpdGVOdW1iZXIoaGFuZGxlQ2FzdDx2ODo6TnVtYmVyPih2YWx1ZSktPlZhbHVl
KCkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc0FycmF5KCkpIHsKKyAgICAgICAgICAg
IERPKGNoZWNrQ29tcG9zaXRlKHZhbHVlKSk7CisgICAgICAgICAgICBwdXNoKG5ldyBBcnJheVN0
YXRlKGhhbmRsZUNhc3Q8djg6OkFycmF5Pih2YWx1ZSkpKTsKKyAgICAgICAgfSBlbHNlIGlmICh2
YWx1ZS0+SXNPYmplY3QoKSkgeworICAgICAgICAgICAgRE8oY2hlY2tDb21wb3NpdGUodmFsdWUp
KTsKKyAgICAgICAgICAgIHB1c2gobmV3IE9iamVjdFN0YXRlKGhhbmRsZUNhc3Q8djg6Ok9iamVj
dD4odmFsdWUpKSk7CisgICAgICAgICAgICAvLyBUT0RPKHZpdGFseXIpOgorICAgICAgICAgICAg
Ly8gLSBjaGVjayBub3QgYSB3cmFwcGVyCisgICAgICAgICAgICAvLyAtIHN1cHBvcnQgRmlsZSwg
SW1hZ2VEYXRhLCBldGMuCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
CisgICAgdm9pZCBwdXNoKFN0YXRlQmFzZSogc3RhdGUpCisgICAgeworICAgICAgICBzdGF0ZS0+
c2V0TmV4dFN0YXRlKG1fc3RhdGUpOworICAgICAgICBtX3N0YXRlID0gc3RhdGU7CisgICAgICAg
ICsrbV9kZXB0aDsKKyAgICB9CisKKyAgICBTdGF0ZUJhc2UqIHRvcCgpIHsgcmV0dXJuIG1fc3Rh
dGU7IH0KKworICAgIHZvaWQgcG9wKCkKKyAgICB7CisgICAgICAgIGlmICghbV9zdGF0ZSkKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgU3RhdGVCYXNlKiB0b3AgPSBtX3N0YXRlOworICAg
ICAgICBtX3N0YXRlID0gdG9wLT5uZXh0U3RhdGUoKTsKKyAgICAgICAgZGVsZXRlIHRvcDsKKyAg
ICAgICAgLS1tX2RlcHRoOworICAgIH0KKworICAgIGJvb2wgY2hlY2tDb21wb3NpdGUodjg6Okhh
bmRsZTx2ODo6VmFsdWU+IGNvbXBvc2l0ZSkKKyAgICB7CisgICAgICAgIGlmIChtX2RlcHRoID4g
MjAwMDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIFNpbmNlIHdlIGFy
ZSBub3QgcmVxdWlyZWQgdG8gc3BvdCB0aGUgY3ljbGUgYXMgc29vbiBhcyBpdAorICAgICAgICAv
LyBoYXBwZW5zIHdlIGNhbiBjaGVjayBmb3IgY3ljbGVzIG9ubHkgd2hlbiB0aGUgY3VycmVudCBk
ZXB0aAorICAgICAgICAvLyBpcyBhIHBvd2VyIG9mIHR3by4KKyAgICAgICAgaWYgKCFpc1Bvd2Vy
T2ZUd28obV9kZXB0aCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZm9yIChT
dGF0ZUJhc2UqIHN0YXRlID0gdG9wKCk7IHN0YXRlOyBzdGF0ZSA9IHN0YXRlLT5uZXh0U3RhdGUo
KSkgeworICAgICAgICAgICAgaWYgKHN0YXRlLT5jb21wb3NpdGUoKSA9PSBjb21wb3NpdGUpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0
cnVlOworICAgIH0KKworICAgIFdyaXRlciogbV93cml0ZXI7CisgICAgU3RhdGVCYXNlKiBtX3N0
YXRlOworICAgIGludCBtX2RlcHRoOworfTsKKworLy8gUmVhZGVyIGlzIHJlc3BvbnNpYmxlIGZv
ciBkZXNlcmlhbGl6aW5nIHByaW1pdGl2ZSB0eXBlcyBhbmQKKy8vIHJlc3RvcmluZyBpbmZvcm1h
dGlvbiBhYm91dCBzYXZlZCBvYmplY3RzIG9mIGNvbXBvc2l0ZSB0eXBlcy4KK2NsYXNzIFJlYWRl
ciB7CisgIHB1YmxpYzoKKyAgICBSZWFkZXIoY29uc3QgY2hhciogYnVmZmVyLCBpbnQgbGVuZ3Ro
KQorICAgICAgICAgICAgOiBtX2J1ZmZlcihidWZmZXIpCisgICAgICAgICAgICAsIG1fbGVuZ3Ro
KGxlbmd0aCkKKyAgICAgICAgICAgICwgbV9wb3MoMCkKKyAgICB7fQorCisgICAgYm9vbCBpc0Vv
ZigpIGNvbnN0IHsgcmV0dXJuIG1fcG9zID49IG1fbGVuZ3RoOyB9CisKKyAgICBib29sIHJlYWQo
U2VyaWFsaXphdGlvblRhZyogdGFnLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4qIHZhbHVlLCBpbnQq
IGxlbmd0aCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHJhd0xlbmd0aDsKKyAgICAgICAgRE8o
cmVhZFRhZyh0YWcpKTsKKyAgICAgICAgc3dpdGNoICgqdGFnKSB7CisgICAgICAgIGNhc2UgUGFk
ZGluZ1RhZzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVuZGVmaW5lZFRhZzoK
KyAgICAgICAgICAgICp2YWx1ZSA9IHY4OjpVbmRlZmluZWQoKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIE51bGxUYWc6CisgICAgICAgICAgICAqdmFsdWUgPSB2ODo6TnVsbCgp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVHJ1ZVRhZzoKKyAgICAgICAgICAg
ICp2YWx1ZSA9IHY4OjpUcnVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBG
YWxzZVRhZzoKKyAgICAgICAgICAgICp2YWx1ZSA9IHY4OjpGYWxzZSgpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgU3RyaW5nVGFnOgorICAgICAgICAgICAgRE8ocmVhZFN0cmlu
Zyh2YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSW50MzJUYWc6Cisg
ICAgICAgICAgICBETyhyZWFkSW50MzIodmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIE51bWJlclRhZzoKKyAgICAgICAgICAgIERPKHJlYWROdW1iZXIodmFsdWUpKTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9iamVjdFRhZzoKKyAgICAgICAgY2Fz
ZSBBcnJheVRhZzoKKyAgICAgICAgICAgIERPKGRvUmVhZFVpbnQzMigmcmF3TGVuZ3RoKSk7Cisg
ICAgICAgICAgICAqbGVuZ3RoID0gcmF3TGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgYm9v
bCByZWFkVGFnKFNlcmlhbGl6YXRpb25UYWcqIHRhZykKKyAgICB7CisgICAgICAgIGlmIChtX3Bv
cyA+PSBtX2xlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgKnRhZyA9
IHN0YXRpY19jYXN0PFNlcmlhbGl6YXRpb25UYWc+KG1fYnVmZmVyW21fcG9zKytdKTsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCByZWFkU3RyaW5nKHY4OjpIYW5kbGU8
djg6OlZhbHVlPiogdmFsdWUpCisgICAgeworICAgICAgICB1aW50MzJfdCBsZW5ndGg7CisgICAg
ICAgIERPKGRvUmVhZFVpbnQzMigmbGVuZ3RoKSk7CisgICAgICAgIGlmIChtX3BvcyArIGxlbmd0
aCA+IG1fbGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjaGFyKiBk
YXRhID0gbmV3IGNoYXJbbGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5n
dGg7ICsraSkKKyAgICAgICAgICAgIGRhdGFbaV0gPSBtX2J1ZmZlclttX3BvcysrXTsKKyAgICAg
ICAgKnZhbHVlID0gdjg6OlN0cmluZzo6TmV3KGRhdGEsIGxlbmd0aCk7CisgICAgICAgIGRlbGV0
ZVtdIGRhdGE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcmVhZElu
dDMyKHY4OjpIYW5kbGU8djg6OlZhbHVlPiogdmFsdWUpCisgICAgeworICAgICAgICB1aW50MzJf
dCByYXdWYWx1ZTsKKyAgICAgICAgRE8oZG9SZWFkVWludDMyKCZyYXdWYWx1ZSkpOworICAgICAg
ICAqdmFsdWUgPSB2ODo6SW50ZWdlcjo6TmV3KHN0YXRpY19jYXN0PGludDMyX3Q+KFppZ1phZzo6
ZGVjb2RlKHJhd1ZhbHVlKSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBi
b29sIHJlYWROdW1iZXIodjg6OkhhbmRsZTx2ODo6VmFsdWU+KiB2YWx1ZSkKKyAgICB7CisgICAg
ICAgIGlmIChtX3BvcyArIHNpemVvZihkb3VibGUpID4gbV9sZW5ndGgpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIGRvdWJsZSBudW1iZXI7CisgICAgICAgIGNoYXIqIG51bWJl
ckJ5dGVzID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm51bWJlcik7CisgICAgICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgc2l6ZW9mKGRvdWJsZSk7ICsraSkKKyAgICAgICAgICAgIG51bWJlckJ5
dGVzW2ldID0gbV9idWZmZXJbbV9wb3MrK107CisgICAgICAgICp2YWx1ZSA9IHY4OjpOdW1iZXI6
Ok5ldyhudW1iZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGRv
UmVhZFVpbnQzMih1aW50MzJfdCogdmFsdWUpCisgICAgeworICAgICAgICAqdmFsdWUgPSAwOwor
ICAgICAgICBjaGFyIGI7CisgICAgICAgIGludCBzaGlmdCA9IDA7CisgICAgICAgIGRvIHsKKyAg
ICAgICAgICAgIGlmIChtX3BvcyA+PSBtX2xlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgICAgICBiID0gbV9idWZmZXJbbV9wb3MrK107CisgICAgICAgICAgICAq
dmFsdWUgfD0gKChiICYga1ZhckludE1hc2spIDw8IHNoaWZ0KTsKKyAgICAgICAgICAgIHNoaWZ0
ICs9IDc7CisgICAgICAgIH0gd2hpbGUgKGIgJiAoMSA8PCBrVmFySW50U2hpZnQpKTsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY29uc3QgY2hhciogbV9idWZmZXI7CisgICAg
Y29uc3QgaW50IG1fbGVuZ3RoOworICAgIGludCBtX3BvczsKK307CisKK2NsYXNzIERlc2VyaWFs
aXplciB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBEZXNlcmlhbGl6ZXIoUmVhZGVyKiByZWFk
ZXIpIDogbV9yZWFkZXIocmVhZGVyKSB7fQorCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gZGVz
ZXJpYWxpemUoKQorICAgIHsKKyAgICAgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgICAg
ICB3aGlsZSAoIW1fcmVhZGVyLT5pc0VvZigpKSB7CisgICAgICAgICAgICBpZiAoIWRvRGVzZXJp
YWxpemUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsK
KyAgICAgICAgfQorICAgICAgICBpZiAoc3RhY2tEZXB0aCgpICE9IDEpCisgICAgICAgICAgICBy
ZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAgICAgICAgcmV0dXJuIHNjb3BlLkNsb3Nl
KGVsZW1lbnQoMCkpOworICAgIH0KKworICBwcml2YXRlOgorICAgIGJvb2wgZG9EZXNlcmlhbGl6
ZSgpCisgICAgeworICAgICAgICBTZXJpYWxpemF0aW9uVGFnIHRhZzsKKyAgICAgICAgdjg6Okxv
Y2FsPHY4OjpWYWx1ZT4gdmFsdWU7CisgICAgICAgIGludCBsZW5ndGg7CisgICAgICAgIERPKG1f
cmVhZGVyLT5yZWFkKCZ0YWcsICZ2YWx1ZSwgJmxlbmd0aCkpOworICAgICAgICBpZiAoIXZhbHVl
LklzRW1wdHkoKSkgeworICAgICAgICAgICAgcHVzaCh2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBp
ZiAodGFnID09IE9iamVjdFRhZykgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+IHN0YWNrRGVw
dGgoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB2ODo6TG9j
YWw8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjg6Ok9iamVjdDo6TmV3KCk7CisgICAgICAgICAgICBm
b3IgKGludCBpID0gc3RhY2tEZXB0aCgpIC0gbGVuZ3RoOyBpIDwgc3RhY2tEZXB0aCgpOyBpICs9
IDIpIHsKKyAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwcm9wZXJ0eU5hbWUg
PSBlbGVtZW50KGkpOworICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHByb3Bl
cnR5VmFsdWUgPSBlbGVtZW50KGkgKyAxKTsKKyAgICAgICAgICAgICAgICBvYmplY3QtPlNldChw
cm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
cG9wKGxlbmd0aCk7CisgICAgICAgICAgICBwdXNoKG9iamVjdCk7CisgICAgICAgIH0gZWxzZSBp
ZiAodGFnID09IEFycmF5VGFnKSB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID4gc3RhY2tEZXB0
aCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHY4OjpMb2Nh
bDx2ODo6QXJyYXk+IGFycmF5ID0gdjg6OkFycmF5OjpOZXcobGVuZ3RoKTsKKyAgICAgICAgICAg
IGNvbnN0IGludCBkZXB0aCA9IHN0YWNrRGVwdGgoKSAtIGxlbmd0aDsKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgICAgICAgICAgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgYXJy
YXktPlNldCh2ODo6SW50ZWdlcjo6TmV3KGkpLCBlbGVtZW50KGRlcHRoICsgaSkpOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgcG9wKGxlbmd0aCk7CisgICAgICAgICAgICBwdXNoKGFycmF5
KTsKKyAgICAgICAgfSBlbHNlIGlmICh0YWcgIT0gUGFkZGluZ1RhZykKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCBwdXNo
KHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlKSB7IG1fc3RhY2suYXBwZW5kKHZhbHVlKTsgfQor
CisgICAgdm9pZCBwb3AoaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIEFTU0VSVChsZW5ndGgg
Pj0gMCk7CisgICAgICAgIEFTU0VSVChsZW5ndGggPD0gbV9zdGFjay5zaXplKCkpOworICAgICAg
ICBtX3N0YWNrLnNocmluayhtX3N0YWNrLnNpemUoKSAtIGxlbmd0aCk7CisgICAgfQorCisgICAg
aW50IHN0YWNrRGVwdGgoKSBjb25zdCB7IHJldHVybiBtX3N0YWNrLnNpemUoKTsgfQorCisgICAg
djg6OkxvY2FsPHY4OjpWYWx1ZT4gZWxlbWVudChpbnQgaW5kZXgpCisgICAgeworICAgICAgICBB
U1NFUlQoaW5kZXggPj0gMCk7CisgICAgICAgIEFTU0VSVChpbmRleCA8IG1fc3RhY2suc2l6ZSgp
KTsKKyAgICAgICAgcmV0dXJuIG1fc3RhY2tbaW5kZXhdOworICAgIH0KKworICAgIFJlYWRlciog
bV9yZWFkZXI7CisgICAgVmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+ID4gbV9zdGFjazsKK307
CisKK30gLy8gbmFtZXNwYWNlCisKK1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6U2VyaWFsaXplZFNj
cmlwdFZhbHVlKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKK3sKKyAgICBXcml0ZXIgd3Jp
dGVyOworICAgIFNlcmlhbGl6ZXIgc2VyaWFsaXplcigmd3JpdGVyKTsKKyAgICBpZiAoIXNlcmlh
bGl6ZXIuc2VyaWFsaXplKHZhbHVlKSkgeworICAgICAgICAvLyBUT0RPKHZpdGFseXIpOiB0aHJv
dyBleGNlcHRpb24KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX2RhdGEgPSBTdHJpbmdJ
bXBsOjphZG9wdCh3cml0ZXIuZGF0YSgpKTsKK30KKworU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpT
ZXJpYWxpemVkU2NyaXB0VmFsdWUoU3RyaW5nIGRhdGEsIGJvb2wgd2lyZSkKK3sKKyAgICBpZiAo
d2lyZSkKKyAgICAgICAgbV9kYXRhID0gZGF0YTsKKyAgICBlbHNlIHsKKyAgICAgICAgUmVmUHRy
PFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0gdXRmOEJ1ZmZlcihkYXRhKTsKKyAgICAgICAgV3JpdGVy
IHdyaXRlcjsKKyAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGJ1ZmZlci0+ZGF0YSgpLCBidWZm
ZXItPnNpemUoKSk7CisgICAgICAgIG1fZGF0YSA9IFN0cmluZ0ltcGw6OmFkb3B0KHdyaXRlci5k
YXRhKCkpOworICAgIH0KK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gU2VyaWFsaXplZFNjcmlw
dFZhbHVlOjpkZXNlcmlhbGl6ZSgpCit7CisgICAgaWYgKCFtX2RhdGEuaW1wbCgpKQorICAgICAg
ICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAgICBSZWFkZXIgcmVhZGVyKHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG1fZGF0YS5pbXBsKCktPmNoYXJhY3RlcnMoKSksIDIg
KiBtX2RhdGEubGVuZ3RoKCkpOworICAgIERlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXIoJnJlYWRl
cik7CisgICAgcmV0dXJuIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZSgpOworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1NlcmlhbGl6
ZWRTY3JpcHRWYWx1ZS5oIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFs
dWUuaAppbmRleCAyNmE0MTk5Li4xYTQyYzhlIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdz
L3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvU2Vy
aWFsaXplZFNjcmlwdFZhbHVlLmgKQEAgLTQwLDExICs0MCwyNiBAQCBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKIGNsYXNzIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSA6IHB1YmxpYyBSZWZDb3VudGVkPFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZT4gewogcHVibGljOgotICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZT4gY3JlYXRlKFN0cmluZyBzdHJpbmcpCisgICAgLy8gQ3JlYXRl
cyBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFY4IHZhbHVlLgorICAg
IHN0YXRpYyBQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gY3JlYXRlKHY4OjpIYW5k
bGU8djg6OlZhbHVlPiB2YWx1ZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcg
U2VyaWFsaXplZFNjcmlwdFZhbHVlKHN0cmluZykpOworICAgICAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSh2YWx1ZSkpOwogICAgIH0KIAorICAgIC8vIENyZWF0
ZXMgYSBzZXJpYWxpemVkIHZhbHVlIHdpdGggdGhlIGdpdmVuIGRhdGEgb2J0YWluZWQgZnJvbSBh
CisgICAgLy8gcHJpb3IgY2FsbCB0byB0b1dpcmVTdHJpbmcoKS4KKyAgICBzdGF0aWMgUGFzc1Jl
ZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGNyZWF0ZUZyb21XaXJlKFN0cmluZyBkYXRhKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUo
ZGF0YSwgdHJ1ZSkpOworICAgIH0KKworICAgIC8vIENyZWF0ZXMgYSBzZXJpYWxpemVkIHJlcHJl
c2VudGF0aW9uIG9mIFdlYkNvcmUgc3RyaW5nLgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZT4gY3JlYXRlKFN0cmluZyBkYXRhKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUoZGF0YSwgZmFsc2UpKTsKKyAg
ICB9CisKKyAgICAvLyBDcmVhdGVzIGFuIGVtcHR5IHNlcmlhbGl6ZWQgdmFsdWUuCiAgICAgc3Rh
dGljIFBhc3NSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBjcmVhdGUoKQogICAgIHsKICAg
ICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUoKSk7CkBAIC01
MiwyMyArNjcsMjQgQEAgcHVibGljOgogCiAgICAgUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0
VmFsdWU+IHJlbGVhc2UoKQogICAgIHsKLSAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZT4gcmVzdWx0ID0gYWRvcHRSZWYobmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShtX2RhdGEp
KTsKKyAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gcmVzdWx0ID0gYWRvcHRS
ZWYobmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShtX2RhdGEsIHRydWUpKTsKICAgICAgICAgbV9k
YXRhID0gU3RyaW5nKCk7CiAgICAgICAgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOwogICAgIH0K
IAotICAgIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9kYXRhOwot
ICAgIH0KKyAgICBTdHJpbmcgdG9XaXJlU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9
CiAKLXByaXZhdGU6Ci0gICAgU2VyaWFsaXplZFNjcmlwdFZhbHVlKFN0cmluZyBzdHJpbmcpCi0g
ICAgICAgIDogbV9kYXRhKHN0cmluZykKLSAgICB7Ci0gICAgfQorICAgIC8vIERlc2VyaWFsaXpl
cyB0aGUgdmFsdWUgKGluIHRoZSBjdXJyZW50IGNvbnRleHQpLiBSZXR1cm5zIGFuCisgICAgLy8g
ZW1wdHkgaGFuZGxlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVl
PiBkZXNlcmlhbGl6ZSgpOwogCitwcml2YXRlOgogICAgIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgp
IHsgfQorCisgICAgZXhwbGljaXQgU2VyaWFsaXplZFNjcmlwdFZhbHVlKHY4OjpIYW5kbGU8djg6
OlZhbHVlPiB2YWx1ZSk7CisKKyAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWUoU3RyaW5nIGRhdGEs
IGJvb2wgd2lyZSk7CisKICAgICBTdHJpbmcgbV9kYXRhOwogfTsKIApkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dDdXN0b20uY3BwIGIvV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dDdXN0b20uY3BwCmluZGV4IDk1NGUyNzIuLjU1
YTJjMTMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RE9NV2luZG93
Q3VzdG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVdpbmRvd0N1
c3RvbS5jcHAKQEAgLTQxMCw3ICs0MTAsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhET01X
aW5kb3c6OnBvc3RNZXNzYWdlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncwogICAg
IEFTU0VSVChzb3VyY2UtPmZyYW1lKCkpOwogCiAgICAgdjg6OlRyeUNhdGNoIHRyeUNhdGNoOwot
ICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2Ny
aXB0VmFsdWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxT
ZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNy
ZWF0ZShhcmdzWzBdKTsKICAgICBNZXNzYWdlUG9ydEFycmF5IHBvcnRBcnJheTsKICAgICBTdHJp
bmcgdGFyZ2V0T3JpZ2luOwogCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOERlZGljYXRlZFdvcmtlckNvbnRleHRDdXN0b20uY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhEZWRpY2F0ZWRXb3JrZXJDb250ZXh0Q3VzdG9tLmNwcAppbmRleCAwMmMxNDUz
Li44NDJhMzRlIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERlZGlj
YXRlZFdvcmtlckNvbnRleHRDdXN0b20uY3BwCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4RGVkaWNhdGVkV29ya2VyQ29udGV4dEN1c3RvbS5jcHAKQEAgLTQ2LDcgKzQ2LDcgQEAg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4RGVkaWNhdGVkV29ya2VyQ29udGV4dDo6cG9zdE1lc3Nh
Z2VDYWxsYmFjayhjb25zdCB2ODo6QXIKIHsKICAgICBJTkNfU1RBVFMoTCJET00uRGVkaWNhdGVk
V29ya2VyQ29udGV4dC5wb3N0TWVzc2FnZSIpOwogICAgIERlZGljYXRlZFdvcmtlckNvbnRleHQq
IHdvcmtlckNvbnRleHQgPSBWOERPTVdyYXBwZXI6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxEZWRp
Y2F0ZWRXb3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6OkRFRElDQVRFRFdPUktFUkNPTlRFWFQs
IGFyZ3MuSG9sZGVyKCkpOwotICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3Nh
Z2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh2OFZhbHVlVG9XZWJDb3JlU3RyaW5n
KGFyZ3NbMF0pKTsKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBtZXNzYWdlID0g
U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoYXJnc1swXSk7CiAgICAgTWVzc2FnZVBvcnRB
cnJheSBwb3J0QXJyYXk7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAxKSB7CiAgICAgICAgIGlm
ICghZ2V0TWVzc2FnZVBvcnRBcnJheShhcmdzWzFdLCBwb3J0QXJyYXkpKQpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIaXN0b3J5Q3VzdG9tLmNwcCBiL1dlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4SGlzdG9yeUN1c3RvbS5jcHAKaW5kZXggYWNiOTZlZC4uMjAw
MDdlMiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIaXN0b3J5Q3Vz
dG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhpc3RvcnlDdXN0b20u
Y3BwCkBAIC00Miw3ICs0Miw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdjg6OkhhbmRsZTx2
ODo6VmFsdWU+IFY4SGlzdG9yeTo6cHVzaFN0YXRlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50
cyYgYXJncykKIHsKLSAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBoaXN0b3J5U3Rh
dGUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1sw
XSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGhpc3RvcnlTdGF0ZSA9IFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFyZ3NbMF0pOwogCiAgICAgdjg6OlRyeUNhdGNo
IHRyeUNhdGNoOwogICAgIFN0cmluZyB0aXRsZSA9IHRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsT3JV
bmRlZmluZWRDaGVjayhhcmdzWzFdKTsKQEAgLTYzLDcgKzYzLDcgQEAgdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IFY4SGlzdG9yeTo6cHVzaFN0YXRlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYg
YXJncykKIAogdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4SGlzdG9yeTo6cmVwbGFjZVN0YXRlQ2Fs
bGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKIHsKLSAgICBSZWZQdHI8U2VyaWFsaXpl
ZFNjcmlwdFZhbHVlPiBoaXN0b3J5U3RhdGUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0
ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0
VmFsdWU+IGhpc3RvcnlTdGF0ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFyZ3Nb
MF0pOwogCiAgICAgdjg6OlRyeUNhdGNoIHRyeUNhdGNoOwogICAgIFN0cmluZyB0aXRsZSA9IHRv
V2ViQ29yZVN0cmluZ1dpdGhOdWxsT3JVbmRlZmluZWRDaGVjayhhcmdzWzFdKTsKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3VzdG9tLmNwcCBi
L1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3VzdG9tLmNwcAppbmRl
eCA1YzAxMTNlLi5lNDExM2UyIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOE1lc3NhZ2VFdmVudEN1c3RvbS5jcHAKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhNZXNzYWdlRXZlbnRDdXN0b20uY3BwCkBAIC02NSw3ICs2NSw3IEBAIHY4OjpIYW5kbGU8
djg6OlZhbHVlPiBWOE1lc3NhZ2VFdmVudDo6aW5pdE1lc3NhZ2VFdmVudENhbGxiYWNrKGNvbnN0
IHY4OjpBcmd1bWVuCiAgICAgU3RyaW5nIHR5cGVBcmcgPSB2OFZhbHVlVG9XZWJDb3JlU3RyaW5n
KGFyZ3NbMF0pOwogICAgIGJvb2wgY2FuQnViYmxlQXJnID0gYXJnc1sxXS0+Qm9vbGVhblZhbHVl
KCk7CiAgICAgYm9vbCBjYW5jZWxhYmxlQXJnID0gYXJnc1syXS0+Qm9vbGVhblZhbHVlKCk7Ci0g
ICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gZGF0YUFyZyA9IFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZTo6Y3JlYXRlKHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcoYXJnc1szXSkpOworICAgIFJl
ZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGRhdGFBcmcgPSBTZXJpYWxpemVkU2NyaXB0VmFs
dWU6OmNyZWF0ZShhcmdzWzNdKTsKICAgICBTdHJpbmcgb3JpZ2luQXJnID0gdjhWYWx1ZVRvV2Vi
Q29yZVN0cmluZyhhcmdzWzRdKTsKICAgICBTdHJpbmcgbGFzdEV2ZW50SWRBcmcgPSB2OFZhbHVl
VG9XZWJDb3JlU3RyaW5nKGFyZ3NbNV0pOwogICAgIERPTVdpbmRvdyogc291cmNlQXJnID0gVjhE
T01XaW5kb3c6Okhhc0luc3RhbmNlKGFyZ3NbNl0pID8gVjhET01XcmFwcGVyOjpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgdjg6OkhhbmRs
ZTx2ODo6T2JqZWN0Pjo6Q2FzdChhcmdzWzZdKSkgOiAwOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdlUG9ydEN1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3VzdG9tLmNwcAppbmRleCA3ODc5ZmI4Li5kMWIw
OWY3IDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0
Q3VzdG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0
Q3VzdG9tLmNwcApAQCAtNzgsNyArNzgsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhNZXNz
YWdlUG9ydDo6cG9zdE1lc3NhZ2VDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcgogewog
ICAgIElOQ19TVEFUUygiRE9NLk1lc3NhZ2VQb3J0LnBvc3RNZXNzYWdlIik7CiAgICAgTWVzc2Fn
ZVBvcnQqIG1lc3NhZ2VQb3J0ID0gVjhET01XcmFwcGVyOjpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8
TWVzc2FnZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIGFyZ3MuSG9sZGVyKCkpOwot
ICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2Ny
aXB0VmFsdWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxT
ZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNy
ZWF0ZShhcmdzWzBdKTsKICAgICBNZXNzYWdlUG9ydEFycmF5IHBvcnRBcnJheTsKICAgICBpZiAo
YXJncy5MZW5ndGgoKSA+IDEpIHsKICAgICAgICAgaWYgKCFnZXRNZXNzYWdlUG9ydEFycmF5KGFy
Z3NbMV0sIHBvcnRBcnJheSkpCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOFdvcmtlckN1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtl
ckN1c3RvbS5jcHAKaW5kZXggMWNiZTBhNS4uMmY1ODRhNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhXb3JrZXJDdXN0b20uY3BwCisrKyBiL1dlYkNvcmUvYmluZGlu
Z3MvdjgvY3VzdG9tL1Y4V29ya2VyQ3VzdG9tLmNwcApAQCAtOTIsNyArOTIsOCBAQCB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gVjhXb3JrZXI6OnBvc3RNZXNzYWdlQ2FsbGJhY2soY29uc3Qgdjg6OkFy
Z3VtZW50cyYgYXJncykKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Xb3JrZXIucG9zdE1lc3NhZ2Ui
KTsKICAgICBXb3JrZXIqIHdvcmtlciA9IFY4RE9NV3JhcHBlcjo6Y29udmVydFRvTmF0aXZlT2Jq
ZWN0PFdvcmtlcj4oVjhDbGFzc0luZGV4OjpXT1JLRVIsIGFyZ3MuSG9sZGVyKCkpOwotICAgIFJl
ZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFs
dWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxp
emVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShh
cmdzWzBdKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSBjcmVh
dGVkIGluIFY4V29ya2VyOjpwb3N0TWVzc2FnZUNhbGxiYWNrXG4iKTsKICAgICBNZXNzYWdlUG9y
dEFycmF5IHBvcnRBcnJheTsKICAgICBpZiAoYXJncy5MZW5ndGgoKSA+IDEpIHsKICAgICAgICAg
aWYgKCFnZXRNZXNzYWdlUG9ydEFycmF5KGFyZ3NbMV0sIHBvcnRBcnJheSkpCmRpZmYgLS1naXQg
YS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nIGIvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwpp
bmRleCAyZDNlODhlLi5lZGUzZTYzIDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdl
TG9nCisrKyBiL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMyBAQAorMjAw
OS0xMi0yNCAgVml0YWx5IFJlcGVzaGtvICA8dml0YWx5ckBjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW1Y4XSBTdXBwb3J0IFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZS4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTMyOTIwCisgICAgICAgIGh0dHA6Ly9jcmJ1Zy5jb20vMzA2MjAKKworICAg
ICAgICBVcGRhdGVkIGNsaWVudHM6CisgICAgICAgICogc3JjL1BsYXRmb3JtTWVzc2FnZVBvcnRD
aGFubmVsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVs
Ojpwb3N0TWVzc2FnZVRvUmVtb3RlKToKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtTWVzc2Fn
ZVBvcnRDaGFubmVsOjp0cnlHZXRNZXNzYWdlRnJvbVJlbW90ZSk6CisgICAgICAgICogc3JjL1dl
YldvcmtlckJhc2UuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJXb3JrZXJCYXNlOjpwb3N0TWVz
c2FnZVRvV29ya2VyT2JqZWN0KToKKyAgICAgICAgKiBzcmMvV2ViV29ya2VyQ2xpZW50SW1wbC5j
cHA6CisgICAgICAgIChXZWJLaXQ6OldlYldvcmtlckNsaWVudEltcGw6OnBvc3RNZXNzYWdlVG9X
b3JrZXJDb250ZXh0KToKKyAgICAgICAgKFdlYktpdDo6V2ViV29ya2VyQ2xpZW50SW1wbDo6cG9z
dE1lc3NhZ2VUb1dvcmtlck9iamVjdFRhc2spOgorICAgICAgICAqIHNyYy9XZWJXb3JrZXJJbXBs
LmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViV29ya2VySW1wbDo6cG9zdE1lc3NhZ2VUb1dvcmtl
ckNvbnRleHRUYXNrKToKKwogMjAwOS0xMi0xOCAgS2VubmV0aCBSdXNzZWxsICA8a2JyQGdvb2ds
ZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gRmlzaGVyLgpkaWZmIC0tZ2l0IGEv
V2ViS2l0L2Nocm9taXVtL3NyYy9QbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbC5jcHAgYi9XZWJL
aXQvY2hyb21pdW0vc3JjL1BsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVsLmNwcAppbmRleCBmOGM0
MWQzLi5hYTQyYTEwIDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0vc3JjL1BsYXRmb3JtTWVz
c2FnZVBvcnRDaGFubmVsLmNwcAorKysgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1BsYXRmb3JtTWVz
c2FnZVBvcnRDaGFubmVsLmNwcApAQCAtMTc5LDcgKzE3OSw3IEBAIHZvaWQgUGxhdGZvcm1NZXNz
YWdlUG9ydENoYW5uZWw6OnBvc3RNZXNzYWdlVG9SZW1vdGUoUGFzc093blB0cjxNZXNzYWdlUG9y
dENoYW5uCiAgICAgaWYgKCFtX2xvY2FsUG9ydCB8fCAhbV93ZWJDaGFubmVsKQogICAgICAgICBy
ZXR1cm47CiAKLSAgICBXZWJTdHJpbmcgbWVzc2FnZVN0cmluZyA9IG1lc3NhZ2UtPm1lc3NhZ2Uo
KS0+dG9TdHJpbmcoKTsKKyAgICBXZWJTdHJpbmcgbWVzc2FnZVN0cmluZyA9IG1lc3NhZ2UtPm1l
c3NhZ2UoKS0+dG9XaXJlU3RyaW5nKCk7CiAgICAgT3duUHRyPFdlYkNvcmU6Ok1lc3NhZ2VQb3J0
Q2hhbm5lbEFycmF5PiBjaGFubmVscyA9IG1lc3NhZ2UtPmNoYW5uZWxzKCk7CiAgICAgV2ViTWVz
c2FnZVBvcnRDaGFubmVsQXJyYXkqIHdlYkNoYW5uZWxzID0gMDsKICAgICBpZiAoY2hhbm5lbHMu
Z2V0KCkgJiYgY2hhbm5lbHMtPnNpemUoKSkgewpAQCAtMjExLDcgKzIxMSw3IEBAIGJvb2wgUGxh
dGZvcm1NZXNzYWdlUG9ydENoYW5uZWw6OnRyeUdldE1lc3NhZ2VGcm9tUmVtb3RlKE93blB0cjxN
ZXNzYWdlUG9ydENoYW5uCiAgICAgICAgICAgICAgICAgKCpjaGFubmVscylbaV0gPSBNZXNzYWdl
UG9ydENoYW5uZWw6OmNyZWF0ZShwbGF0Zm9ybUNoYW5uZWwpOwogICAgICAgICAgICAgfQogICAg
ICAgICB9Ci0gICAgICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRN
ZXNzYWdlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUobWVzc2FnZSk7CisgICAgICAg
IFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRNZXNzYWdlID0gU2VyaWFs
aXplZFNjcmlwdFZhbHVlOjpjcmVhdGVGcm9tV2lyZShtZXNzYWdlKTsKICAgICAgICAgcmVzdWx0
ID0gTWVzc2FnZVBvcnRDaGFubmVsOjpFdmVudERhdGE6OmNyZWF0ZShzZXJpYWxpemVkTWVzc2Fn
ZS5yZWxlYXNlKCksIGNoYW5uZWxzLnJlbGVhc2UoKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9X
ZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckJhc2UuY3BwIGIvV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJXb3JrZXJCYXNlLmNwcAppbmRleCA4NWEyNjNiLi43MzMzOTgxIDEwMDY0NAotLS0gYS9X
ZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckJhc2UuY3BwCisrKyBiL1dlYktpdC9jaHJvbWl1
bS9zcmMvV2ViV29ya2VyQmFzZS5jcHAKQEAgLTE1OCw3ICsxNTgsNyBAQCB2b2lkIFdlYldvcmtl
ckJhc2U6OnBvc3RNZXNzYWdlVG9Xb3JrZXJPYmplY3QoUGFzc1JlZlB0cjxTZXJpYWxpemVkU2Ny
aXB0VmFsdWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
UGFzc093blB0cjxNZXNzYWdlUG9ydENoYW5uZWxBcnJheT4gY2hhbm5lbHMpCiB7CiAgICAgZGlz
cGF0Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmcG9zdE1lc3NhZ2VUYXNr
LCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bWVzc2FnZS0+dG9TdHJpbmcoKSwgY2hhbm5lbHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPnRvV2lyZVN0cmluZygpLCBjaGFubmVs
cykpOwogfQogCiB2b2lkIFdlYldvcmtlckJhc2U6OnBvc3RNZXNzYWdlVGFzayhTY3JpcHRFeGVj
dXRpb25Db250ZXh0KiBjb250ZXh0LApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL3NyYy9X
ZWJXb3JrZXJDbGllbnRJbXBsLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2VyQ2xp
ZW50SW1wbC5jcHAKaW5kZXggNmJlMDNhNy4uNTk4YTA3OCAxMDA2NDQKLS0tIGEvV2ViS2l0L2No
cm9taXVtL3NyYy9XZWJXb3JrZXJDbGllbnRJbXBsLmNwcAorKysgYi9XZWJLaXQvY2hyb21pdW0v
c3JjL1dlYldvcmtlckNsaWVudEltcGwuY3BwCkBAIC0xNzMsNyArMTczLDcgQEAgdm9pZCBXZWJX
b3JrZXJDbGllbnRJbXBsOjpwb3N0TWVzc2FnZVRvV29ya2VyQ29udGV4dCgKICAgICBpZiAoIWlz
TWFpblRocmVhZCgpKSB7CiAgICAgICAgIFdlYldvcmtlckJhc2U6OmRpc3BhdGNoVGFza1RvTWFp
blRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0VGFz
aywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPnRvU3RyaW5nKCksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbWVzc2FnZS0+dG9XaXJlU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpKTsKICAg
ICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTE4NCw3ICsxODQsNyBAQCB2b2lkIFdlYldvcmtlckNs
aWVudEltcGw6OnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0KAogICAgICAgICB3ZWJjaGFubmVs
LT5zZXRDbGllbnQoMCk7CiAgICAgICAgIHdlYkNoYW5uZWxzW2ldID0gd2ViY2hhbm5lbDsKICAg
ICB9Ci0gICAgbV93ZWJXb3JrZXItPnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0KG1lc3NhZ2Ut
PnRvU3RyaW5nKCksIHdlYkNoYW5uZWxzKTsKKyAgICBtX3dlYldvcmtlci0+cG9zdE1lc3NhZ2VU
b1dvcmtlckNvbnRleHQobWVzc2FnZS0+dG9XaXJlU3RyaW5nKCksIHdlYkNoYW5uZWxzKTsKIH0K
IAogYm9vbCBXZWJXb3JrZXJDbGllbnRJbXBsOjpoYXNQZW5kaW5nQWN0aXZpdHkoKSBjb25zdApA
QCAtMzU2LDcgKzM1Niw3IEBAIHZvaWQgV2ViV29ya2VyQ2xpZW50SW1wbDo6cG9zdE1lc3NhZ2VU
b1dvcmtlck9iamVjdFRhc2soCiAgICAgICAgIE93blB0cjxNZXNzYWdlUG9ydEFycmF5PiBwb3J0
cyA9CiAgICAgICAgICAgICBNZXNzYWdlUG9ydDo6ZW50YW5nbGVQb3J0cygqY29udGV4dCwgY2hh
bm5lbHMucmVsZWFzZSgpKTsKICAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4g
c2VyaWFsaXplZE1lc3NhZ2UgPQotICAgICAgICAgICAgU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpj
cmVhdGUobWVzc2FnZSk7CisgICAgICAgICAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0
ZUZyb21XaXJlKG1lc3NhZ2UpOwogICAgICAgICB0aGlzUHRyLT5tX3dvcmtlci0+ZGlzcGF0Y2hF
dmVudChNZXNzYWdlRXZlbnQ6OmNyZWF0ZShwb3J0cy5yZWxlYXNlKCksCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6
ZWRNZXNzYWdlLnJlbGVhc2UoKSkpOwogICAgIH0KZGlmZiAtLWdpdCBhL1dlYktpdC9jaHJvbWl1
bS9zcmMvV2ViV29ya2VySW1wbC5jcHAgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlcklt
cGwuY3BwCmluZGV4IDc0NGJlMzAuLjViNWUwNTMgMTAwNjQ0Ci0tLSBhL1dlYktpdC9jaHJvbWl1
bS9zcmMvV2ViV29ya2VySW1wbC5jcHAKKysrIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3Jr
ZXJJbXBsLmNwcApAQCAtODgsNyArODgsNyBAQCB2b2lkIFdlYldvcmtlckltcGw6OnBvc3RNZXNz
YWdlVG9Xb3JrZXJDb250ZXh0VGFzayhXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZQogICAg
IE93blB0cjxNZXNzYWdlUG9ydEFycmF5PiBwb3J0cyA9CiAgICAgICAgIE1lc3NhZ2VQb3J0Ojpl
bnRhbmdsZVBvcnRzKCpjb250ZXh0LCBjaGFubmVscy5yZWxlYXNlKCkpOwogICAgIFJlZlB0cjxT
ZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRNZXNzYWdlID0KLSAgICAgICAgU2VyaWFs
aXplZFNjcmlwdFZhbHVlOjpjcmVhdGUobWVzc2FnZSk7CisgICAgICAgIFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZTo6Y3JlYXRlRnJvbVdpcmUobWVzc2FnZSk7CiAgICAgd29ya2VyQ29udGV4dC0+ZGlz
cGF0Y2hFdmVudChNZXNzYWdlRXZlbnQ6OmNyZWF0ZSgKICAgICAgICAgcG9ydHMucmVsZWFzZSgp
LCBzZXJpYWxpemVkTWVzc2FnZS5yZWxlYXNlKCkpKTsKICAgICB0aGlzUHRyLT5jb25maXJtTWVz
c2FnZUZyb21Xb3JrZXJPYmplY3Qod29ya2VyQ29udGV4dC0+aGFzUGVuZGluZ0FjdGl2aXR5KCkp
Owo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>45475</attachid>
            <date>2009-12-24 14:40:41 -0800</date>
            <delta_ts>2010-01-14 14:41:50 -0800</delta_ts>
            <desc>patch: fixed all style violations</desc>
            <filename>serialize.patch</filename>
            <type>text/plain</type>
            <size>38816</size>
            <attacher name="Vitaly Repeshko">vitalyr</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MzkzMDVlZC4uM2YxOGVkMyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw5NCBAQAorMjAwOS0xMi0yNCAgVml0YWx5IFJlcGVz
aGtvICA8dml0YWx5ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgW1Y4XSBTdXBwb3J0IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMyOTIwCisg
ICAgICAgIGh0dHA6Ly9jcmJ1Zy5jb20vMzA2MjAKKworICAgICAgICBJbml0aWFsIGltcGxlbWVu
dGF0aW9uIG9mIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4KKworICAgICAgICAqIFdlYkNvcmUuZ3lw
aTogQWRkZWQgU2VyaWFsaXplZFNjcmlwdFZhbHVlLmNwcC4KKyAgICAgICAgKiBiaW5kaW5ncy9z
Y3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5wbTogUmVtb3ZlZCBjb252ZXJzaW9uIHRvIHN0cmluZyBi
ZWZvcmUgdXNpbmcgU2VyaWFsaXplZFNjcmlwdFZhbHVlLgorICAgICAgICAqIGJpbmRpbmdzL3Y4
L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6KToK
KyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6V3JpdGVyOjpXcml0ZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6WmlnWmFnOjpXcml0ZXI6OndyaXRlVW5kZWZpbmVkKToKKyAgICAgICAgKFdlYkNvcmU6
OlppZ1phZzo6V3JpdGVyOjp3cml0ZU51bGwpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpX
cml0ZXI6OndyaXRlVHJ1ZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OldyaXRlcjo6d3Jp
dGVGYWxzZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OldyaXRlcjo6d3JpdGVTdHJpbmcp
OgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OndyaXRlSW50MzIpOgorICAgICAg
ICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OndyaXRlTnVtYmVyKToKKyAgICAgICAgKFdlYkNv
cmU6OlppZ1phZzo6V3JpdGVyOjplbmRDb21wb3NpdGUpOgorICAgICAgICAoV2ViQ29yZTo6Wmln
WmFnOjpXcml0ZXI6OmRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OmRv
V3JpdGVVaW50MzIpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OmFwcGVuZCk6
CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OldyaXRlcjo6ZW5zdXJlU3BhY2UpOgorICAgICAg
ICAoV2ViQ29yZTo6WmlnWmFnOjpXcml0ZXI6OmZpbGxIb2xlKToKKyAgICAgICAgKFdlYkNvcmU6
OlppZ1phZzo6V3JpdGVyOjpjaGFyQXQpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJp
YWxpemVyOjpTZXJpYWxpemVyKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXpl
cjo6c2VyaWFsaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6U3Rh
dGVCYXNlOjp+U3RhdGVCYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXpl
cjo6U3RhdGVCYXNlOjpuZXh0U3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJp
YWxpemVyOjpTdGF0ZUJhc2U6OnNldE5leHRTdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWda
YWc6OlNlcmlhbGl6ZXI6OlN0YXRlQmFzZTo6Y29tcG9zaXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OlppZ1phZzo6U2VyaWFsaXplcjo6U3RhdGVCYXNlOjpTdGF0ZUJhc2UpOgorICAgICAgICAoV2Vi
Q29yZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpTdGF0ZTo6Y29tcG9zaXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6U3RhdGU6OnRhZyk6CisgICAgICAgIChXZWJDb3Jl
OjpaaWdaYWc6OlNlcmlhbGl6ZXI6OlN0YXRlOjpTdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpa
aWdaYWc6OlNlcmlhbGl6ZXI6OlN0YWNrQ2xlYW5lcjo6U3RhY2tDbGVhbmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6U3RhY2tDbGVhbmVyOjp+U3RhY2tDbGVhbmVy
KToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6QXJyYXlTdGF0ZTo6QXJy
YXlTdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OlNlcmlhbGl6ZXI6OkFycmF5U3Rh
dGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpBcnJheVN0
YXRlOjphZHZhbmNlKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFsaXplcjo6T2Jq
ZWN0U3RhdGU6Ok9iamVjdFN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1phZzo6U2VyaWFs
aXplcjo6T2JqZWN0U3RhdGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJp
YWxpemVyOjpPYmplY3RTdGF0ZTo6YWR2YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6
OlNlcmlhbGl6ZXI6Ok9iamVjdFN0YXRlOjpuZXh0UHJvcGVydHkpOgorICAgICAgICAoV2ViQ29y
ZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpkb1NlcmlhbGl6ZSk6CisgICAgICAgIChXZWJDb3JlOjpa
aWdaYWc6OlNlcmlhbGl6ZXI6OnB1c2gpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJp
YWxpemVyOjp0b3ApOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpwb3Ap
OgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpTZXJpYWxpemVyOjpjaGVja0NvbXBvc2l0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OlJlYWRlcjo6UmVhZGVyKToKKyAgICAgICAgKFdl
YkNvcmU6OlppZ1phZzo6UmVhZGVyOjppc0VvZik6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6
OlJlYWRlcjo6cmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OlJlYWRlcjo6cmVhZFRh
Zyk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OlJlYWRlcjo6cmVhZFN0cmluZyk6CisgICAg
ICAgIChXZWJDb3JlOjpaaWdaYWc6OlJlYWRlcjo6cmVhZEludDMyKToKKyAgICAgICAgKFdlYkNv
cmU6OlppZ1phZzo6UmVhZGVyOjpyZWFkTnVtYmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlppZ1ph
Zzo6UmVhZGVyOjpkb1JlYWRVaW50MzIpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpEZXNl
cmlhbGl6ZXI6OkRlc2VyaWFsaXplcik6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OkRlc2Vy
aWFsaXplcjo6ZGVzZXJpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpEZXNlcmlh
bGl6ZXI6OmRvRGVzZXJpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpEZXNlcmlh
bGl6ZXI6OnB1c2gpOgorICAgICAgICAoV2ViQ29yZTo6WmlnWmFnOjpEZXNlcmlhbGl6ZXI6OnBv
cCk6CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OkRlc2VyaWFsaXplcjo6c3RhY2tEZXB0aCk6
CisgICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OkRlc2VyaWFsaXplcjo6ZWxlbWVudCk6CisgICAg
ICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmRlc2VyaWFsaXpl
KToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlRnJvbVdpcmUpOgorICAgICAgICAo
V2ViQ29yZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpyZWxlYXNlKToKKyAgICAgICAgKFdlYkNv
cmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6dG9XaXJlU3RyaW5nKToKKworICAgICAgICBVcGRh
dGVkIGNsaWVudHM6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4RE9NV2luZG93Q3Vz
dG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4RE9NV2luZG93Ojpwb3N0TWVzc2FnZUNhbGxi
YWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhEZWRpY2F0ZWRXb3JrZXJDb250
ZXh0Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4RGVkaWNhdGVkV29ya2VyQ29udGV4
dDo6cG9zdE1lc3NhZ2VDYWxsYmFjayk6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4
SGlzdG9yeUN1c3RvbS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWOEhpc3Rvcnk6OnB1c2hTdGF0
ZUNhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlY4SGlzdG9yeTo6cmVwbGFjZVN0YXRlQ2Fs
bGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VFdmVudEN1c3Rv
bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWOE1lc3NhZ2VFdmVudDo6aW5pdE1lc3NhZ2VFdmVu
dENhbGxiYWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdlUG9ydEN1
c3RvbS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWOE1lc3NhZ2VQb3J0Ojpwb3N0TWVzc2FnZUNh
bGxiYWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhXb3JrZXJDdXN0b20uY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6VjhXb3JrZXI6OnBvc3RNZXNzYWdlQ2FsbGJhY2spOgorCiAy
MDA5LTEyLTIxICBFbnJpY2EgQ2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgTWFjaWVqIFN0YWNob3dpYWsuCmRpZmYgLS1naXQgYS9XZWJDb3JlL1dlYkNv
cmUuZ3lwaSBiL1dlYkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IDgzNmUzM2QuLmJjMjcyYzkgMTAw
NjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5neXBpCisrKyBiL1dlYkNvcmUvV2ViQ29yZS5neXBp
CkBAIC03OTIsNiArNzkyLDcgQEAKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9TY3JpcHRWYWx1
ZS5jcHAnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L1NjcmlwdFZhbHVlLmgnLAogICAgICAg
ICAgICAgJ2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oJywKKyAgICAgICAgICAg
ICdiaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwJywKICAgICAgICAgICAgICdi
aW5kaW5ncy92OC9TdGF0aWNET01EYXRhU3RvcmUuY3BwJywKICAgICAgICAgICAgICdiaW5kaW5n
cy92OC9TdGF0aWNET01EYXRhU3RvcmUuaCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvVjhB
YnN0cmFjdEV2ZW50TGlzdGVuZXIuY3BwJywKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3Mv
c2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG0gYi9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvQ29k
ZUdlbmVyYXRvclY4LnBtCmluZGV4IDcxYzY1MGUuLjliNjE4ZGMgMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG0KKysrIGIvV2ViQ29yZS9iaW5k
aW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5wbQpAQCAtMjM2OCw3ICsyMzY4LDcgQEAgc3Vi
IFJldHVybk5hdGl2ZVRvSlNWYWx1ZQogCiAgICAgaWYgKCR0eXBlIGVxICJTZXJpYWxpemVkU2Ny
aXB0VmFsdWUiKSB7CiAgICAgICAgICRpbXBsSW5jbHVkZXN7IiR0eXBlLmgifSA9IDE7Ci0gICAg
ICAgIHJldHVybiAicmV0dXJuIHY4U3RyaW5nKCR2YWx1ZS0+dG9TdHJpbmcoKSkiOworICAgICAg
ICByZXR1cm4gInJldHVybiAkdmFsdWUtPmRlc2VyaWFsaXplKCkiOwogICAgIH0KIAogICAgIGlm
ICgkdHlwZSBlcSAiRGVkaWNhdGVkV29ya2VyQ29udGV4dCIgb3IgJHR5cGUgZXEgIldvcmtlckNv
bnRleHQiIG9yICR0eXBlIGVxICJTaGFyZWRXb3JrZXJDb250ZXh0IikgewpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwIGIvV2ViQ29yZS9i
aW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLjJkZmUwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRp
bmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAKQEAgLTAsMCArMSw2NjQgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlz
dHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3Ig
dGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwor
ICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9S
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2VyaWFsaXplZFNjcmlwdFZhbHVlLmgiCisKKyNpbmNs
dWRlICJTaGFyZWRCdWZmZXIuaCIKKworI2luY2x1ZGUgPHY4Lmg+CisjaW5jbHVkZSA8d3RmL1Jl
ZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKKy8vIFRPRE8odml0YWx5cik6
CisvLyAtIGNhdGNoIFY4IGV4Y2VwdGlvbnMKKy8vIC0gYmUgcmVhZHkgdG8gZ2V0IGVtcHR5IGhh
bmRsZXMKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisjZGVmaW5lIERPKEFjdGlvbikgaWYgKCFB
Y3Rpb24pIHJldHVybiBmYWxzZQorCituYW1lc3BhY2UgeworCisvLyBTZXJpYWxpemF0aW9uIGZv
cm1hdCBpcyBhIHNlcXVlbmNlIG9mICh0YWcsIG9wdGlvbmFsIGRhdGEpCisvLyBwYWlycy4gVGFn
IGFsd2F5cyB0YWtlcyBleGFjdGx5IG9uZSBieXRlLgorZW51bSBTZXJpYWxpemF0aW9uVGFnIHsK
KyAgICBJbnZhbGlkVGFnID0gJyEnLAorICAgIFBhZGRpbmdUYWcgPSAnXDAnLAorICAgIFVuZGVm
aW5lZFRhZyA9ICdfJywKKyAgICBOdWxsVGFnID0gJzAnLAorICAgIFRydWVUYWcgPSAnVCcsCisg
ICAgRmFsc2VUYWcgPSAnRicsCisgICAgU3RyaW5nVGFnID0gJ1MnLAorICAgIEludDMyVGFnID0g
J0knLAorICAgIE51bWJlclRhZyA9ICdOJywKKyAgICBPYmplY3RUYWcgPSAneycsCisgICAgQXJy
YXlUYWcgPSAnWycsCit9OworCisvLyBIZWxwZXJzIHRvIGRvIHZlcmJvc2UgaGFuZGxlIGNhc3Rz
LgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0YXRpYyB2ODo6SGFuZGxl
PFQ+IGhhbmRsZUNhc3Qodjg6OkhhbmRsZTxVPiBoYW5kbGUpIHsgcmV0dXJuIHY4OjpIYW5kbGU8
VD46OkNhc3QoaGFuZGxlKTsgfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4K
K3N0YXRpYyB2ODo6TG9jYWw8VD4gaGFuZGxlQ2FzdCh2ODo6TG9jYWw8VT4gaGFuZGxlKSB7IHJl
dHVybiB2ODo6TG9jYWw8VD46OkNhc3QoaGFuZGxlKTsgfQorCitzdGF0aWMgYm9vbCBpc1Bvd2Vy
T2ZUd28oaW50IHgpCit7CisgICAgcmV0dXJuICEoeCAmICh4IC0gMSkpOworfQorCisvLyBWYXJJ
bnQgZW5jb2RpbmcgY29uc3RhbnRzLgorc3RhdGljIGNvbnN0IGludCBrVmFySW50U2hpZnQgPSA3
Oworc3RhdGljIGNvbnN0IGludCBrVmFySW50TWFzayA9ICgxIDw8IGtWYXJJbnRTaGlmdCkgLSAx
OworCisvLyBaaWdaYWcgZW5jb2RpbmcgdG8gaGVscCBWYXJJbnQgZW5jb2Rpbmcgc3RheSBzbWFs
bCBmb3IgbmVnYXRpdmUKKy8vIG51bWJlcnMgd2l0aCBzbWFsbCBhYnNvbHV0ZSB2YWx1ZXMuCitj
bGFzcyBaaWdaYWcgeworICBwdWJsaWM6CisgICAgc3RhdGljIHVpbnQzMl90IGVuY29kZSh1aW50
MzJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSAmICgxVSA8PCAzMSkpCisgICAg
ICAgICAgICB2YWx1ZSA9ICgofnZhbHVlKSA8PCAxKSArIDE7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIHZhbHVlIDw8PSAxOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAg
c3RhdGljIHVpbnQzMl90IGRlY29kZSh1aW50MzJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlm
ICh2YWx1ZSAmIDEpCisgICAgICAgICAgICB2YWx1ZSA9IH4odmFsdWUgPj4gMSk7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIHZhbHVlID4+PSAxOworICAgICAgICByZXR1cm4gdmFsdWU7Cisg
ICAgfQorCisgIHByaXZhdGU6CisgICAgWmlnWmFnKCk7Cit9OworCisvLyBXcml0ZXIgaXMgcmVz
cG9uc2libGUgZm9yIHNlcmlhbGl6aW5nIHByaW1pdGl2ZSB0eXBlcyBhbmQgc3RvcmluZworLy8g
aW5mb3JtYXRpb24gdXNlZCB0byByZWNvbnN0cnVjdCBjb21wb3NpdGUgdHlwZXMuCitjbGFzcyBX
cml0ZXIgOiBOb25jb3B5YWJsZSB7CisgIHB1YmxpYzoKKyAgICBXcml0ZXIoKSA6IG1fcG9zKDAp
IHsgfQorCisgICAgLy8gV3JpdGUgZnVuY3Rpb25zIGZvciBwcmltaXRpdmUgdHlwZXMuCisKKyAg
ICB2b2lkIHdyaXRlVW5kZWZpbmVkKCkgeyBhcHBlbmQoVW5kZWZpbmVkVGFnKTsgfQorCisgICAg
dm9pZCB3cml0ZU51bGwoKSB7IGFwcGVuZChOdWxsVGFnKTsgfQorCisgICAgdm9pZCB3cml0ZVRy
dWUoKSB7IGFwcGVuZChUcnVlVGFnKTsgfQorCisgICAgdm9pZCB3cml0ZUZhbHNlKCkgeyBhcHBl
bmQoRmFsc2VUYWcpOyB9CisKKyAgICB2b2lkIHdyaXRlU3RyaW5nKGNvbnN0IGNoYXIqIGRhdGEs
IGludCBsZW5ndGgpCisgICAgeworICAgICAgICBhcHBlbmQoU3RyaW5nVGFnKTsKKyAgICAgICAg
ZG9Xcml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4obGVuZ3RoKSk7CisgICAgICAgIGFw
cGVuZChkYXRhLCBsZW5ndGgpOworICAgIH0KKworICAgIHZvaWQgd3JpdGVJbnQzMihpbnQzMl90
IHZhbHVlKQorICAgIHsKKyAgICAgICAgYXBwZW5kKEludDMyVGFnKTsKKyAgICAgICAgZG9Xcml0
ZVVpbnQzMihaaWdaYWc6OmVuY29kZShzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUpKSk7Cisg
ICAgfQorCisgICAgdm9pZCB3cml0ZU51bWJlcihkb3VibGUgbnVtYmVyKQorICAgIHsKKyAgICAg
ICAgYXBwZW5kKE51bWJlclRhZyk7CisgICAgICAgIGNoYXIqIG51bWJlckJ5dGVzID0gcmVpbnRl
cnByZXRfY2FzdDxjaGFyKj4oJm51bWJlcik7CisgICAgICAgIGFwcGVuZChudW1iZXJCeXRlcywg
c2l6ZW9mKG51bWJlcikpOworICAgIH0KKworICAgIC8vIFJlY29yZHMgdGhhdCBhIGNvbXBvc2l0
ZSBvYmplY3QgY2FuIGJlIGNvbnN0cnVjdGVkIGJ5IHVzaW5nCisgICAgLy8gfGxlbmd0aHwgcHJl
dmlvdXNseSBzdG9yZWQgdmFsdWVzLgorICAgIHZvaWQgZW5kQ29tcG9zaXRlKFNlcmlhbGl6YXRp
b25UYWcgdGFnLCBpbnQzMl90IGxlbmd0aCkKKyAgICB7CisgICAgICAgIEFTU0VSVCh0YWcgPT0g
T2JqZWN0VGFnIHx8IHRhZyA9PSBBcnJheVRhZyk7CisgICAgICAgIGFwcGVuZCh0YWcpOworICAg
ICAgICBkb1dyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihsZW5ndGgpKTsKKyAgICB9
CisKKyAgICBWZWN0b3I8VUNoYXI+JiBkYXRhKCkKKyAgICB7CisgICAgICAgIGZpbGxIb2xlKCk7
CisgICAgICAgIHJldHVybiBtX2J1ZmZlcjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lk
IGRvV3JpdGVVaW50MzIodWludDMyX3QgdmFsdWUpCisgICAgeworICAgICAgICB3aGlsZSAodHJ1
ZSkgeworICAgICAgICAgICAgY2hhciBiID0gKHZhbHVlICYga1ZhckludE1hc2spOworICAgICAg
ICAgICAgdmFsdWUgPj49IGtWYXJJbnRTaGlmdDsKKyAgICAgICAgICAgIGlmICghdmFsdWUpIHsK
KyAgICAgICAgICAgICAgICBhcHBlbmQoYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBhcHBlbmQoYiB8ICgxIDw8IGtWYXJJbnRTaGlmdCkpOwor
ICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBhcHBlbmQoY2hhciBiKQorICAgIHsKKyAgICAg
ICAgZW5zdXJlU3BhY2UoMSk7CisgICAgICAgICpjaGFyQXQobV9wb3MrKykgPSBiOworICAgIH0K
KworICAgIHZvaWQgYXBwZW5kKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpCisgICAgewor
ICAgICAgICBlbnN1cmVTcGFjZShsZW5ndGgpOworICAgICAgICBtZW1jcHkoY2hhckF0KG1fcG9z
KSwgZGF0YSwgbGVuZ3RoKTsKKyAgICAgICAgbV9wb3MgKz0gbGVuZ3RoOworICAgIH0KKworICAg
IHZvaWQgZW5zdXJlU3BhY2UoaW50IGV4dHJhKQorICAgIHsKKyAgICAgICAgbV9idWZmZXIuZ3Jv
dygobV9wb3MgKyBleHRyYSArIDEpIC8gMik7CisgICAgfQorCisgICAgdm9pZCBmaWxsSG9sZSgp
CisgICAgeworICAgICAgICAvLyBJZiB0aGUgd3JpdGVyIGlzIGF0IG9kZCBwb3NpdGlvbiBpbiB0
aGUgYnVmZmVyIHRoZW4gb25lIG9mCisgICAgICAgIC8vIHRoZSBieXRlcyBpbiB0aGUgbGFzdCBV
Q2hhciBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICAgIGlmIChtX3BvcyAlIDIpCisgICAgICAg
ICAgICAqY2hhckF0KG1fcG9zKSA9IFBhZGRpbmdUYWc7CisgICAgfQorCisgICAgY2hhciogY2hh
ckF0KGludCBwb3MpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG1fYnVmZmVyLmRh
dGEoKSkgKyBwb3M7IH0KKworICAgIFZlY3RvcjxVQ2hhcj4gbV9idWZmZXI7CisgICAgaW50IG1f
cG9zOworfTsKKworY2xhc3MgU2VyaWFsaXplciB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBT
ZXJpYWxpemVyKFdyaXRlciogd3JpdGVyKQorICAgICAgICAgICAgOiBtX3dyaXRlcih3cml0ZXIp
CisgICAgICAgICAgICAsIG1fc3RhdGUoMCkKKyAgICAgICAgICAgICwgbV9kZXB0aCgwKQorICAg
IHt9CisKKyAgICBib29sIHNlcmlhbGl6ZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUpCisg
ICAgeworICAgICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgICAgIFN0YWNrQ2xlYW5l
ciBjbGVhbmVyKCZtX3N0YXRlKTsKKyAgICAgICAgRE8oZG9TZXJpYWxpemUodmFsdWUpKTsKKyAg
ICAgICAgd2hpbGUgKHRvcCgpKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoOworICAgICAgICAg
ICAgd2hpbGUgKCF0b3AoKS0+ZG9uZSgmbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIC8vIE5v
dGUgdGhhdCBkb1NlcmlhbGl6ZSgpIGNhbiBjaGFuZ2UgY3VycmVudCB0b3AoKS4KKyAgICAgICAg
ICAgICAgICBETyhkb1NlcmlhbGl6ZSh0b3AoKS0+YWR2YW5jZSgpKSk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBtX3dyaXRlci0+ZW5kQ29tcG9zaXRlKHRvcCgpLT50YWcoKSwgbGVuZ3Ro
KTsKKyAgICAgICAgICAgIHBvcCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKworICBwcml2YXRlOgorICAgIGNsYXNzIFN0YXRlQmFzZSA6IHB1YmxpYyBOb25jb3B5
YWJsZSB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflN0YXRlQmFzZSgpIHt9CisK
KyAgICAgICAgLy8gTGluayB0byB0aGUgbmV4dCBzdGF0ZSB0byBmb3JtIGEgc3RhY2suCisgICAg
ICAgIFN0YXRlQmFzZSogbmV4dFN0YXRlKCkgeyByZXR1cm4gbV9uZXh0OyB9CisgICAgICAgIHZv
aWQgc2V0TmV4dFN0YXRlKFN0YXRlQmFzZSogbmV4dCkgeyBtX25leHQgPSBuZXh0OyB9CisKKyAg
ICAgICAgLy8gQ29tcG9zaXRlIG9iamVjdCB3ZSdyZSBwcm9jZXNzaW5nIGluIHRoaXMgc3RhdGUu
CisgICAgICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb21wb3NpdGUoKSB7IHJldHVybiBtX2Nv
bXBvc2l0ZTsgfQorCisgICAgICAgIC8vIFNlcmlhbGl6YXRpb24gdGFnIGZvciB0aGUgY3VycmVu
dCBjb21wb3NpdGUuCisgICAgICAgIHZpcnR1YWwgU2VyaWFsaXphdGlvblRhZyB0YWcoKSBjb25z
dCA9IDA7CisKKyAgICAgICAgLy8gUmV0dXJucyB3aGV0aGVyIGl0ZXJhdGlvbiBvdmVyIHN1Ym9i
amVjdHMgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gY29tcG9zaXRlIG9iamVjdCBpcyBkb25l
LiBJZiB5ZXMsIHwqbGVuZ3RofCBpcyBzZXQgdG8gdGhlCisgICAgICAgIC8vIG51bWJlciBvZiBz
dWJvYmplY3RzLgorICAgICAgICB2aXJ0dWFsIGJvb2wgZG9uZShpbnQqIGxlbmd0aCkgPSAwOwor
CisgICAgICAgIC8vIEFkdmFuY2VzIHRvIHRoZSBuZXh0IHN1Ym9iamVjdC4KKyAgICAgICAgLy8g
UmVxdWlyZXM6ICF0aGlzLT5kb25lKCkuCisgICAgICAgIHZpcnR1YWwgdjg6OkxvY2FsPHY4OjpW
YWx1ZT4gYWR2YW5jZSgpID0gMDsKKworICAgICAgcHJvdGVjdGVkOgorICAgICAgICBTdGF0ZUJh
c2Uodjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbXBvc2l0ZSkKKyAgICAgICAgICAgICAgICA6IG1f
bmV4dCgwKQorICAgICAgICAgICAgICAgICwgbV9jb21wb3NpdGUoY29tcG9zaXRlKQorICAgICAg
ICB7fQorCisgICAgICBwcml2YXRlOgorICAgICAgICBTdGF0ZUJhc2UqIG1fbmV4dDsKKyAgICAg
ICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IG1fY29tcG9zaXRlOworICAgIH07CisKKyAgICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCwgU2VyaWFsaXphdGlvblRhZyBjb21wb3NpdGVUYWc+CisgICAgY2xh
c3MgU3RhdGUgOiBwdWJsaWMgU3RhdGVCYXNlIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgdjg6
OkhhbmRsZTxUPiBjb21wb3NpdGUoKSB7IHJldHVybiBoYW5kbGVDYXN0PFQ+KFN0YXRlQmFzZTo6
Y29tcG9zaXRlKCkpOyB9CisKKyAgICAgICAgdmlydHVhbCBTZXJpYWxpemF0aW9uVGFnIHRhZygp
IGNvbnN0IHsgcmV0dXJuIGNvbXBvc2l0ZVRhZzsgfQorCisgICAgICBwcm90ZWN0ZWQ6CisgICAg
ICAgIGV4cGxpY2l0IFN0YXRlKHY4OjpIYW5kbGU8VD4gY29tcG9zaXRlKSA6IFN0YXRlQmFzZShj
b21wb3NpdGUpIHt9CisgICAgfTsKKworICAgIC8vIEhlbHBlciB0byBjbGVhbiB1cCB0aGUgc3Rh
dGUgc3RhY2sgaW4gY2FzZSBvZiBlcnJvcnMuCisgICAgY2xhc3MgU3RhY2tDbGVhbmVyIDogTm9u
Y29weWFibGUgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBTdGFja0NsZWFuZXIo
U3RhdGVCYXNlKiogc3RhY2spIDogbV9zdGFjayhzdGFjaykge30KKworICAgICAgICB+U3RhY2tD
bGVhbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdGVCYXNlKiBzdGF0ZSA9ICptX3N0
YWNrOworICAgICAgICAgICAgd2hpbGUgKHN0YXRlKSB7CisgICAgICAgICAgICAgICAgU3RhdGVC
YXNlKiB0bXAgPSBzdGF0ZS0+bmV4dFN0YXRlKCk7CisgICAgICAgICAgICAgICAgZGVsZXRlIHN0
YXRlOworICAgICAgICAgICAgICAgIHN0YXRlID0gdG1wOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgKm1fc3RhY2sgPSAwOworICAgICAgICB9CisKKyAgICAgIHByaXZhdGU6CisgICAgICAg
IFN0YXRlQmFzZSoqIG1fc3RhY2s7CisgICAgfTsKKworICAgIGNsYXNzIEFycmF5U3RhdGUgOiBw
dWJsaWMgU3RhdGU8djg6OkFycmF5LCBBcnJheVRhZz4geworICAgICAgcHVibGljOgorICAgICAg
ICBBcnJheVN0YXRlKHY4OjpIYW5kbGU8djg6OkFycmF5PiBhcnJheSkKKyAgICAgICAgICAgICAg
ICA6IFN0YXRlPHY4OjpBcnJheSwgQXJyYXlUYWc+KGFycmF5KQorICAgICAgICAgICAgICAgICwg
bV9pbmRleCgwKQorICAgICAgICB7fQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBkb25lKGludCog
bGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICAqbGVuZ3RoID0gY29tcG9zaXRlKCktPkxl
bmd0aCgpOworICAgICAgICAgICAgcmV0dXJuIG1faW5kZXggPj0gKmxlbmd0aDsKKyAgICAgICAg
fQorCisgICAgICAgIHZpcnR1YWwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gYWR2YW5jZSgpCisgICAg
ICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2luZGV4IDwgY29tcG9zaXRlKCktPkxlbmd0aCgp
KTsKKyAgICAgICAgICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKyAgICAgICAgICAgIHJldHVy
biBzY29wZS5DbG9zZShjb21wb3NpdGUoKS0+R2V0KHY4OjpJbnRlZ2VyOjpOZXcobV9pbmRleCsr
KSkpOworICAgICAgICB9CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIGludCBtX2luZGV4Owor
ICAgIH07CisKKyAgICBjbGFzcyBPYmplY3RTdGF0ZSA6IHB1YmxpYyBTdGF0ZTx2ODo6T2JqZWN0
LCBPYmplY3RUYWc+IHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgT2JqZWN0U3RhdGUodjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiBvYmplY3QpCisgICAgICAgICAgICAgICAgOiBTdGF0ZTx2ODo6T2Jq
ZWN0LCBPYmplY3RUYWc+KG9iamVjdCkKKyAgICAgICAgICAgICAgICAsIG1fcHJvcGVydHlOYW1l
cyhvYmplY3QtPkdldFByb3BlcnR5TmFtZXMoKSkKKyAgICAgICAgICAgICAgICAsIG1faW5kZXgo
LTEpCisgICAgICAgICAgICAgICAgLCBtX2xlbmd0aCgwKQorICAgICAgICB7CisgICAgICAgICAg
ICBuZXh0UHJvcGVydHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBkb25l
KGludCogbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICAqbGVuZ3RoID0gbV9sZW5ndGg7
CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA+PSAyICogbV9wcm9wZXJ0eU5hbWVzLT5MZW5n
dGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4g
YWR2YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2luZGV4IDwgMiAqIG1f
cHJvcGVydHlOYW1lcy0+TGVuZ3RoKCkpOworICAgICAgICAgICAgaWYgKCEobV9pbmRleCAlIDIp
KSB7CisgICAgICAgICAgICAgICAgKyttX2luZGV4OworICAgICAgICAgICAgICAgIHJldHVybiBt
X3Byb3BlcnR5TmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6
VmFsdWU+IHJlc3VsdCA9IGNvbXBvc2l0ZSgpLT5HZXQobV9wcm9wZXJ0eU5hbWUpOworICAgICAg
ICAgICAgbmV4dFByb3BlcnR5KCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAg
ICB9CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbmV4dFByb3BlcnR5KCkKKyAgICAg
ICAgeworICAgICAgICAgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgICAgICAgICAgKytt
X2luZGV4OworICAgICAgICAgICAgQVNTRVJUKCEobV9pbmRleCAlIDIpKTsKKyAgICAgICAgICAg
IGZvciAoOyBtX2luZGV4IDwgMiAqIG1fcHJvcGVydHlOYW1lcy0+TGVuZ3RoKCk7IG1faW5kZXgg
Kz0gMikgeworICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHByb3BlcnR5TmFt
ZSA9IG1fcHJvcGVydHlOYW1lcy0+R2V0KHY4OjpJbnRlZ2VyOjpOZXcobV9pbmRleCAvIDIpKTsK
KyAgICAgICAgICAgICAgICBpZiAoKHByb3BlcnR5TmFtZS0+SXNTdHJpbmcoKSAmJiBjb21wb3Np
dGUoKS0+SGFzUmVhbE5hbWVkUHJvcGVydHkoaGFuZGxlQ2FzdDx2ODo6U3RyaW5nPihwcm9wZXJ0
eU5hbWUpKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHByb3BlcnR5TmFtZS0+SXNJbnQzMigp
ICYmIGNvbXBvc2l0ZSgpLT5IYXNSZWFsSW5kZXhlZFByb3BlcnR5KHByb3BlcnR5TmFtZS0+VWlu
dDMyVmFsdWUoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1fcHJvcGVydHlOYW1lID0gc2Nv
cGUuQ2xvc2UocHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbV9sZW5ndGggKz0g
MjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IG1fcHJv
cGVydHlOYW1lczsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gbV9wcm9wZXJ0eU5hbWU7
CisgICAgICAgIGludCBtX2luZGV4OworICAgICAgICBpbnQgbV9sZW5ndGg7CisgICAgfTsKKwor
ICAgIGJvb2wgZG9TZXJpYWxpemUodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQorICAgIHsK
KyAgICAgICAgaWYgKHZhbHVlLT5Jc1VuZGVmaW5lZCgpKSB7CisgICAgICAgICAgICBtX3dyaXRl
ci0+d3JpdGVVbmRlZmluZWQoKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+SXNOdWxsKCkp
IHsKKyAgICAgICAgICAgIG1fd3JpdGVyLT53cml0ZU51bGwoKTsKKyAgICAgICAgfSBlbHNlIGlm
ICh2YWx1ZS0+SXNUcnVlKCkpIHsKKyAgICAgICAgICAgIG1fd3JpdGVyLT53cml0ZVRydWUoKTsK
KyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+SXNGYWxzZSgpKSB7CisgICAgICAgICAgICBtX3dy
aXRlci0+d3JpdGVGYWxzZSgpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc1N0cmluZygp
KSB7CisgICAgICAgICAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgc3RyaW5nVmFsdWUodmFsdWUp
OworICAgICAgICAgICAgbV93cml0ZXItPndyaXRlU3RyaW5nKCpzdHJpbmdWYWx1ZSwgc3RyaW5n
VmFsdWUubGVuZ3RoKCkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc0ludDMyKCkpIHsK
KyAgICAgICAgICAgIG1fd3JpdGVyLT53cml0ZUludDMyKHZhbHVlLT5JbnQzMlZhbHVlKCkpOwor
ICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc051bWJlcigpKSB7CisgICAgICAgICAgICBtX3dy
aXRlci0+d3JpdGVOdW1iZXIoaGFuZGxlQ2FzdDx2ODo6TnVtYmVyPih2YWx1ZSktPlZhbHVlKCkp
OworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc0FycmF5KCkpIHsKKyAgICAgICAgICAgIERP
KGNoZWNrQ29tcG9zaXRlKHZhbHVlKSk7CisgICAgICAgICAgICBwdXNoKG5ldyBBcnJheVN0YXRl
KGhhbmRsZUNhc3Q8djg6OkFycmF5Pih2YWx1ZSkpKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1
ZS0+SXNPYmplY3QoKSkgeworICAgICAgICAgICAgRE8oY2hlY2tDb21wb3NpdGUodmFsdWUpKTsK
KyAgICAgICAgICAgIHB1c2gobmV3IE9iamVjdFN0YXRlKGhhbmRsZUNhc3Q8djg6Ok9iamVjdD4o
dmFsdWUpKSk7CisgICAgICAgICAgICAvLyBUT0RPKHZpdGFseXIpOgorICAgICAgICAgICAgLy8g
LSBjaGVjayBub3QgYSB3cmFwcGVyCisgICAgICAgICAgICAvLyAtIHN1cHBvcnQgRmlsZSwgSW1h
Z2VEYXRhLCBldGMuCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisg
ICAgdm9pZCBwdXNoKFN0YXRlQmFzZSogc3RhdGUpCisgICAgeworICAgICAgICBzdGF0ZS0+c2V0
TmV4dFN0YXRlKG1fc3RhdGUpOworICAgICAgICBtX3N0YXRlID0gc3RhdGU7CisgICAgICAgICsr
bV9kZXB0aDsKKyAgICB9CisKKyAgICBTdGF0ZUJhc2UqIHRvcCgpIHsgcmV0dXJuIG1fc3RhdGU7
IH0KKworICAgIHZvaWQgcG9wKCkKKyAgICB7CisgICAgICAgIGlmICghbV9zdGF0ZSkKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgU3RhdGVCYXNlKiB0b3AgPSBtX3N0YXRlOworICAgICAg
ICBtX3N0YXRlID0gdG9wLT5uZXh0U3RhdGUoKTsKKyAgICAgICAgZGVsZXRlIHRvcDsKKyAgICAg
ICAgLS1tX2RlcHRoOworICAgIH0KKworICAgIGJvb2wgY2hlY2tDb21wb3NpdGUodjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IGNvbXBvc2l0ZSkKKyAgICB7CisgICAgICAgIGlmIChtX2RlcHRoID4gMjAw
MDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBu
b3QgcmVxdWlyZWQgdG8gc3BvdCB0aGUgY3ljbGUgYXMgc29vbiBhcyBpdAorICAgICAgICAvLyBo
YXBwZW5zIHdlIGNhbiBjaGVjayBmb3IgY3ljbGVzIG9ubHkgd2hlbiB0aGUgY3VycmVudCBkZXB0
aAorICAgICAgICAvLyBpcyBhIHBvd2VyIG9mIHR3by4KKyAgICAgICAgaWYgKCFpc1Bvd2VyT2ZU
d28obV9kZXB0aCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZm9yIChTdGF0
ZUJhc2UqIHN0YXRlID0gdG9wKCk7IHN0YXRlOyBzdGF0ZSA9IHN0YXRlLT5uZXh0U3RhdGUoKSkg
eworICAgICAgICAgICAgaWYgKHN0YXRlLT5jb21wb3NpdGUoKSA9PSBjb21wb3NpdGUpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKworICAgIFdyaXRlciogbV93cml0ZXI7CisgICAgU3RhdGVCYXNlKiBtX3N0YXRl
OworICAgIGludCBtX2RlcHRoOworfTsKKworLy8gUmVhZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBk
ZXNlcmlhbGl6aW5nIHByaW1pdGl2ZSB0eXBlcyBhbmQKKy8vIHJlc3RvcmluZyBpbmZvcm1hdGlv
biBhYm91dCBzYXZlZCBvYmplY3RzIG9mIGNvbXBvc2l0ZSB0eXBlcy4KK2NsYXNzIFJlYWRlciB7
CisgIHB1YmxpYzoKKyAgICBSZWFkZXIoY29uc3QgY2hhciogYnVmZmVyLCBpbnQgbGVuZ3RoKQor
ICAgICAgICAgICAgOiBtX2J1ZmZlcihidWZmZXIpCisgICAgICAgICAgICAsIG1fbGVuZ3RoKGxl
bmd0aCkKKyAgICAgICAgICAgICwgbV9wb3MoMCkKKyAgICB7fQorCisgICAgYm9vbCBpc0VvZigp
IGNvbnN0IHsgcmV0dXJuIG1fcG9zID49IG1fbGVuZ3RoOyB9CisKKyAgICBib29sIHJlYWQoU2Vy
aWFsaXphdGlvblRhZyogdGFnLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4qIHZhbHVlLCBpbnQqIGxl
bmd0aCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHJhd0xlbmd0aDsKKyAgICAgICAgRE8ocmVh
ZFRhZyh0YWcpKTsKKyAgICAgICAgc3dpdGNoICgqdGFnKSB7CisgICAgICAgIGNhc2UgUGFkZGlu
Z1RhZzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVuZGVmaW5lZFRhZzoKKyAg
ICAgICAgICAgICp2YWx1ZSA9IHY4OjpVbmRlZmluZWQoKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIE51bGxUYWc6CisgICAgICAgICAgICAqdmFsdWUgPSB2ODo6TnVsbCgpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVHJ1ZVRhZzoKKyAgICAgICAgICAgICp2
YWx1ZSA9IHY4OjpUcnVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGYWxz
ZVRhZzoKKyAgICAgICAgICAgICp2YWx1ZSA9IHY4OjpGYWxzZSgpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgU3RyaW5nVGFnOgorICAgICAgICAgICAgRE8ocmVhZFN0cmluZyh2
YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSW50MzJUYWc6CisgICAg
ICAgICAgICBETyhyZWFkSW50MzIodmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIE51bWJlclRhZzoKKyAgICAgICAgICAgIERPKHJlYWROdW1iZXIodmFsdWUpKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9iamVjdFRhZzoKKyAgICAgICAgY2FzZSBB
cnJheVRhZzoKKyAgICAgICAgICAgIERPKGRvUmVhZFVpbnQzMigmcmF3TGVuZ3RoKSk7CisgICAg
ICAgICAgICAqbGVuZ3RoID0gcmF3TGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCBy
ZWFkVGFnKFNlcmlhbGl6YXRpb25UYWcqIHRhZykKKyAgICB7CisgICAgICAgIGlmIChtX3BvcyA+
PSBtX2xlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgKnRhZyA9IHN0
YXRpY19jYXN0PFNlcmlhbGl6YXRpb25UYWc+KG1fYnVmZmVyW21fcG9zKytdKTsKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCByZWFkU3RyaW5nKHY4OjpIYW5kbGU8djg6
OlZhbHVlPiogdmFsdWUpCisgICAgeworICAgICAgICB1aW50MzJfdCBsZW5ndGg7CisgICAgICAg
IERPKGRvUmVhZFVpbnQzMigmbGVuZ3RoKSk7CisgICAgICAgIGlmIChtX3BvcyArIGxlbmd0aCA+
IG1fbGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjaGFyKiBkYXRh
ID0gbmV3IGNoYXJbbGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7
ICsraSkKKyAgICAgICAgICAgIGRhdGFbaV0gPSBtX2J1ZmZlclttX3BvcysrXTsKKyAgICAgICAg
KnZhbHVlID0gdjg6OlN0cmluZzo6TmV3KGRhdGEsIGxlbmd0aCk7CisgICAgICAgIGRlbGV0ZVtd
IGRhdGE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcmVhZEludDMy
KHY4OjpIYW5kbGU8djg6OlZhbHVlPiogdmFsdWUpCisgICAgeworICAgICAgICB1aW50MzJfdCBy
YXdWYWx1ZTsKKyAgICAgICAgRE8oZG9SZWFkVWludDMyKCZyYXdWYWx1ZSkpOworICAgICAgICAq
dmFsdWUgPSB2ODo6SW50ZWdlcjo6TmV3KHN0YXRpY19jYXN0PGludDMyX3Q+KFppZ1phZzo6ZGVj
b2RlKHJhd1ZhbHVlKSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29s
IHJlYWROdW1iZXIodjg6OkhhbmRsZTx2ODo6VmFsdWU+KiB2YWx1ZSkKKyAgICB7CisgICAgICAg
IGlmIChtX3BvcyArIHNpemVvZihkb3VibGUpID4gbV9sZW5ndGgpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIGRvdWJsZSBudW1iZXI7CisgICAgICAgIGNoYXIqIG51bWJlckJ5
dGVzID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm51bWJlcik7CisgICAgICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgc2l6ZW9mKGRvdWJsZSk7ICsraSkKKyAgICAgICAgICAgIG51bWJlckJ5dGVz
W2ldID0gbV9idWZmZXJbbV9wb3MrK107CisgICAgICAgICp2YWx1ZSA9IHY4OjpOdW1iZXI6Ok5l
dyhudW1iZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGRvUmVh
ZFVpbnQzMih1aW50MzJfdCogdmFsdWUpCisgICAgeworICAgICAgICAqdmFsdWUgPSAwOworICAg
ICAgICBjaGFyIGI7CisgICAgICAgIGludCBzaGlmdCA9IDA7CisgICAgICAgIGRvIHsKKyAgICAg
ICAgICAgIGlmIChtX3BvcyA+PSBtX2xlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgICAgICBiID0gbV9idWZmZXJbbV9wb3MrK107CisgICAgICAgICAgICAqdmFs
dWUgfD0gKChiICYga1ZhckludE1hc2spIDw8IHNoaWZ0KTsKKyAgICAgICAgICAgIHNoaWZ0ICs9
IDc7CisgICAgICAgIH0gd2hpbGUgKGIgJiAoMSA8PCBrVmFySW50U2hpZnQpKTsKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY29uc3QgY2hhciogbV9idWZmZXI7CisgICAgY29u
c3QgaW50IG1fbGVuZ3RoOworICAgIGludCBtX3BvczsKK307CisKK2NsYXNzIERlc2VyaWFsaXpl
ciB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBEZXNlcmlhbGl6ZXIoUmVhZGVyKiByZWFkZXIp
IDogbV9yZWFkZXIocmVhZGVyKSB7fQorCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gZGVzZXJp
YWxpemUoKQorICAgIHsKKyAgICAgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgICAgICB3
aGlsZSAoIW1fcmVhZGVyLT5pc0VvZigpKSB7CisgICAgICAgICAgICBpZiAoIWRvRGVzZXJpYWxp
emUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAg
ICAgICAgfQorICAgICAgICBpZiAoc3RhY2tEZXB0aCgpICE9IDEpCisgICAgICAgICAgICByZXR1
cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAgICAgICAgcmV0dXJuIHNjb3BlLkNsb3NlKGVs
ZW1lbnQoMCkpOworICAgIH0KKworICBwcml2YXRlOgorICAgIGJvb2wgZG9EZXNlcmlhbGl6ZSgp
CisgICAgeworICAgICAgICBTZXJpYWxpemF0aW9uVGFnIHRhZzsKKyAgICAgICAgdjg6OkxvY2Fs
PHY4OjpWYWx1ZT4gdmFsdWU7CisgICAgICAgIGludCBsZW5ndGg7CisgICAgICAgIERPKG1fcmVh
ZGVyLT5yZWFkKCZ0YWcsICZ2YWx1ZSwgJmxlbmd0aCkpOworICAgICAgICBpZiAoIXZhbHVlLklz
RW1wdHkoKSkgeworICAgICAgICAgICAgcHVzaCh2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAo
dGFnID09IE9iamVjdFRhZykgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+IHN0YWNrRGVwdGgo
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB2ODo6TG9jYWw8
djg6Ok9iamVjdD4gb2JqZWN0ID0gdjg6Ok9iamVjdDo6TmV3KCk7CisgICAgICAgICAgICBmb3Ig
KGludCBpID0gc3RhY2tEZXB0aCgpIC0gbGVuZ3RoOyBpIDwgc3RhY2tEZXB0aCgpOyBpICs9IDIp
IHsKKyAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwcm9wZXJ0eU5hbWUgPSBl
bGVtZW50KGkpOworICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHByb3BlcnR5
VmFsdWUgPSBlbGVtZW50KGkgKyAxKTsKKyAgICAgICAgICAgICAgICBvYmplY3QtPlNldChwcm9w
ZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9w
KGxlbmd0aCk7CisgICAgICAgICAgICBwdXNoKG9iamVjdCk7CisgICAgICAgIH0gZWxzZSBpZiAo
dGFnID09IEFycmF5VGFnKSB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID4gc3RhY2tEZXB0aCgp
KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHY4OjpMb2NhbDx2
ODo6QXJyYXk+IGFycmF5ID0gdjg6OkFycmF5OjpOZXcobGVuZ3RoKTsKKyAgICAgICAgICAgIGNv
bnN0IGludCBkZXB0aCA9IHN0YWNrRGVwdGgoKSAtIGxlbmd0aDsKKyAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgICAgICAgICAgICAgZm9y
IChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgYXJyYXkt
PlNldCh2ODo6SW50ZWdlcjo6TmV3KGkpLCBlbGVtZW50KGRlcHRoICsgaSkpOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgcG9wKGxlbmd0aCk7CisgICAgICAgICAgICBwdXNoKGFycmF5KTsK
KyAgICAgICAgfSBlbHNlIGlmICh0YWcgIT0gUGFkZGluZ1RhZykKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCBwdXNoKHY4
OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlKSB7IG1fc3RhY2suYXBwZW5kKHZhbHVlKTsgfQorCisg
ICAgdm9pZCBwb3AoaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIEFTU0VSVChsZW5ndGggPj0g
MCk7CisgICAgICAgIEFTU0VSVChsZW5ndGggPD0gbV9zdGFjay5zaXplKCkpOworICAgICAgICBt
X3N0YWNrLnNocmluayhtX3N0YWNrLnNpemUoKSAtIGxlbmd0aCk7CisgICAgfQorCisgICAgaW50
IHN0YWNrRGVwdGgoKSBjb25zdCB7IHJldHVybiBtX3N0YWNrLnNpemUoKTsgfQorCisgICAgdjg6
OkxvY2FsPHY4OjpWYWx1ZT4gZWxlbWVudChpbnQgaW5kZXgpCisgICAgeworICAgICAgICBBU1NF
UlQoaW5kZXggPj0gMCk7CisgICAgICAgIEFTU0VSVChpbmRleCA8IG1fc3RhY2suc2l6ZSgpKTsK
KyAgICAgICAgcmV0dXJuIG1fc3RhY2tbaW5kZXhdOworICAgIH0KKworICAgIFJlYWRlciogbV9y
ZWFkZXI7CisgICAgVmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+ID4gbV9zdGFjazsKK307CisK
K30gLy8gbmFtZXNwYWNlCisKK1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6U2VyaWFsaXplZFNjcmlw
dFZhbHVlKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKK3sKKyAgICBXcml0ZXIgd3JpdGVy
OworICAgIFNlcmlhbGl6ZXIgc2VyaWFsaXplcigmd3JpdGVyKTsKKyAgICBpZiAoIXNlcmlhbGl6
ZXIuc2VyaWFsaXplKHZhbHVlKSkgeworICAgICAgICAvLyBUT0RPKHZpdGFseXIpOiB0aHJvdyBl
eGNlcHRpb24KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX2RhdGEgPSBTdHJpbmdJbXBs
OjphZG9wdCh3cml0ZXIuZGF0YSgpKTsKK30KKworU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpTZXJp
YWxpemVkU2NyaXB0VmFsdWUoU3RyaW5nIGRhdGEsIGJvb2wgd2lyZSkKK3sKKyAgICBpZiAod2ly
ZSkKKyAgICAgICAgbV9kYXRhID0gZGF0YTsKKyAgICBlbHNlIHsKKyAgICAgICAgUmVmUHRyPFNo
YXJlZEJ1ZmZlcj4gYnVmZmVyID0gdXRmOEJ1ZmZlcihkYXRhKTsKKyAgICAgICAgV3JpdGVyIHdy
aXRlcjsKKyAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXIt
PnNpemUoKSk7CisgICAgICAgIG1fZGF0YSA9IFN0cmluZ0ltcGw6OmFkb3B0KHdyaXRlci5kYXRh
KCkpOworICAgIH0KK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gU2VyaWFsaXplZFNjcmlwdFZh
bHVlOjpkZXNlcmlhbGl6ZSgpCit7CisgICAgaWYgKCFtX2RhdGEuaW1wbCgpKQorICAgICAgICBy
ZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAgICBSZWFkZXIgcmVhZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG1fZGF0YS5pbXBsKCktPmNoYXJhY3RlcnMoKSksIDIgKiBt
X2RhdGEubGVuZ3RoKCkpOworICAgIERlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXIoJnJlYWRlcik7
CisgICAgcmV0dXJuIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZSgpOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZS5oIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUu
aAppbmRleCAyNmE0MTk5Li4xYTQyYzhlIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4
L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvU2VyaWFs
aXplZFNjcmlwdFZhbHVlLmgKQEAgLTQwLDExICs0MCwyNiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAKIGNsYXNzIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSA6IHB1YmxpYyBSZWZDb3VudGVkPFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZT4gewogcHVibGljOgotICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZT4gY3JlYXRlKFN0cmluZyBzdHJpbmcpCisgICAgLy8gQ3JlYXRlcyBh
IHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFY4IHZhbHVlLgorICAgIHN0
YXRpYyBQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gY3JlYXRlKHY4OjpIYW5kbGU8
djg6OlZhbHVlPiB2YWx1ZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgU2Vy
aWFsaXplZFNjcmlwdFZhbHVlKHN0cmluZykpOworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3
IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSh2YWx1ZSkpOwogICAgIH0KIAorICAgIC8vIENyZWF0ZXMg
YSBzZXJpYWxpemVkIHZhbHVlIHdpdGggdGhlIGdpdmVuIGRhdGEgb2J0YWluZWQgZnJvbSBhCisg
ICAgLy8gcHJpb3IgY2FsbCB0byB0b1dpcmVTdHJpbmcoKS4KKyAgICBzdGF0aWMgUGFzc1JlZlB0
cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGNyZWF0ZUZyb21XaXJlKFN0cmluZyBkYXRhKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUoZGF0
YSwgdHJ1ZSkpOworICAgIH0KKworICAgIC8vIENyZWF0ZXMgYSBzZXJpYWxpemVkIHJlcHJlc2Vu
dGF0aW9uIG9mIFdlYkNvcmUgc3RyaW5nLgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZT4gY3JlYXRlKFN0cmluZyBkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUoZGF0YSwgZmFsc2UpKTsKKyAgICB9
CisKKyAgICAvLyBDcmVhdGVzIGFuIGVtcHR5IHNlcmlhbGl6ZWQgdmFsdWUuCiAgICAgc3RhdGlj
IFBhc3NSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBjcmVhdGUoKQogICAgIHsKICAgICAg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUoKSk7CkBAIC01Miwy
MyArNjcsMjQgQEAgcHVibGljOgogCiAgICAgUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFs
dWU+IHJlbGVhc2UoKQogICAgIHsKLSAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZT4gcmVzdWx0ID0gYWRvcHRSZWYobmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShtX2RhdGEpKTsK
KyAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gcmVzdWx0ID0gYWRvcHRSZWYo
bmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShtX2RhdGEsIHRydWUpKTsKICAgICAgICAgbV9kYXRh
ID0gU3RyaW5nKCk7CiAgICAgICAgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOwogICAgIH0KIAot
ICAgIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9kYXRhOwotICAg
IH0KKyAgICBTdHJpbmcgdG9XaXJlU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9CiAK
LXByaXZhdGU6Ci0gICAgU2VyaWFsaXplZFNjcmlwdFZhbHVlKFN0cmluZyBzdHJpbmcpCi0gICAg
ICAgIDogbV9kYXRhKHN0cmluZykKLSAgICB7Ci0gICAgfQorICAgIC8vIERlc2VyaWFsaXplcyB0
aGUgdmFsdWUgKGluIHRoZSBjdXJyZW50IGNvbnRleHQpLiBSZXR1cm5zIGFuCisgICAgLy8gZW1w
dHkgaGFuZGxlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBk
ZXNlcmlhbGl6ZSgpOwogCitwcml2YXRlOgogICAgIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpIHsg
fQorCisgICAgZXhwbGljaXQgU2VyaWFsaXplZFNjcmlwdFZhbHVlKHY4OjpIYW5kbGU8djg6OlZh
bHVlPiB2YWx1ZSk7CisKKyAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWUoU3RyaW5nIGRhdGEsIGJv
b2wgd2lyZSk7CisKICAgICBTdHJpbmcgbV9kYXRhOwogfTsKIApkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dDdXN0b20uY3BwIGIvV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dDdXN0b20uY3BwCmluZGV4IDk1NGUyNzIuLjU1YTJj
MTMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RE9NV2luZG93Q3Vz
dG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVdpbmRvd0N1c3Rv
bS5jcHAKQEAgLTQxMCw3ICs0MTAsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhET01XaW5k
b3c6OnBvc3RNZXNzYWdlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncwogICAgIEFT
U0VSVChzb3VyY2UtPmZyYW1lKCkpOwogCiAgICAgdjg6OlRyeUNhdGNoIHRyeUNhdGNoOwotICAg
IFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0
VmFsdWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJp
YWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0
ZShhcmdzWzBdKTsKICAgICBNZXNzYWdlUG9ydEFycmF5IHBvcnRBcnJheTsKICAgICBTdHJpbmcg
dGFyZ2V0T3JpZ2luOwogCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OERlZGljYXRlZFdvcmtlckNvbnRleHRDdXN0b20uY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhEZWRpY2F0ZWRXb3JrZXJDb250ZXh0Q3VzdG9tLmNwcAppbmRleCAwMmMxNDUzLi44
NDJhMzRlIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERlZGljYXRl
ZFdvcmtlckNvbnRleHRDdXN0b20uY3BwCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4RGVkaWNhdGVkV29ya2VyQ29udGV4dEN1c3RvbS5jcHAKQEAgLTQ2LDcgKzQ2LDcgQEAgdjg6
OkhhbmRsZTx2ODo6VmFsdWU+IFY4RGVkaWNhdGVkV29ya2VyQ29udGV4dDo6cG9zdE1lc3NhZ2VD
YWxsYmFjayhjb25zdCB2ODo6QXIKIHsKICAgICBJTkNfU1RBVFMoTCJET00uRGVkaWNhdGVkV29y
a2VyQ29udGV4dC5wb3N0TWVzc2FnZSIpOwogICAgIERlZGljYXRlZFdvcmtlckNvbnRleHQqIHdv
cmtlckNvbnRleHQgPSBWOERPTVdyYXBwZXI6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxEZWRpY2F0
ZWRXb3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6OkRFRElDQVRFRFdPUktFUkNPTlRFWFQsIGFy
Z3MuSG9sZGVyKCkpOwotICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2Ug
PSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKGFy
Z3NbMF0pKTsKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBtZXNzYWdlID0gU2Vy
aWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoYXJnc1swXSk7CiAgICAgTWVzc2FnZVBvcnRBcnJh
eSBwb3J0QXJyYXk7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAxKSB7CiAgICAgICAgIGlmICgh
Z2V0TWVzc2FnZVBvcnRBcnJheShhcmdzWzFdLCBwb3J0QXJyYXkpKQpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIaXN0b3J5Q3VzdG9tLmNwcCBiL1dlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4SGlzdG9yeUN1c3RvbS5jcHAKaW5kZXggYWNiOTZlZC4uMjAwMDdl
MiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIaXN0b3J5Q3VzdG9t
LmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhpc3RvcnlDdXN0b20uY3Bw
CkBAIC00Miw3ICs0Miw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IFY4SGlzdG9yeTo6cHVzaFN0YXRlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYg
YXJncykKIHsKLSAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBoaXN0b3J5U3RhdGUg
PSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkp
OworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGhpc3RvcnlTdGF0ZSA9IFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFyZ3NbMF0pOwogCiAgICAgdjg6OlRyeUNhdGNoIHRy
eUNhdGNoOwogICAgIFN0cmluZyB0aXRsZSA9IHRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsT3JVbmRl
ZmluZWRDaGVjayhhcmdzWzFdKTsKQEAgLTYzLDcgKzYzLDcgQEAgdjg6OkhhbmRsZTx2ODo6VmFs
dWU+IFY4SGlzdG9yeTo6cHVzaFN0YXRlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJn
cykKIAogdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4SGlzdG9yeTo6cmVwbGFjZVN0YXRlQ2FsbGJh
Y2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKIHsKLSAgICBSZWZQdHI8U2VyaWFsaXplZFNj
cmlwdFZhbHVlPiBoaXN0b3J5U3RhdGUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh0
b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFs
dWU+IGhpc3RvcnlTdGF0ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFyZ3NbMF0p
OwogCiAgICAgdjg6OlRyeUNhdGNoIHRyeUNhdGNoOwogICAgIFN0cmluZyB0aXRsZSA9IHRvV2Vi
Q29yZVN0cmluZ1dpdGhOdWxsT3JVbmRlZmluZWRDaGVjayhhcmdzWzFdKTsKZGlmZiAtLWdpdCBh
L1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3VzdG9tLmNwcCBiL1dl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3VzdG9tLmNwcAppbmRleCA1
YzAxMTNlLi5lNDExM2UyIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OE1lc3NhZ2VFdmVudEN1c3RvbS5jcHAKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhNZXNzYWdlRXZlbnRDdXN0b20uY3BwCkBAIC02NSw3ICs2NSw3IEBAIHY4OjpIYW5kbGU8djg6
OlZhbHVlPiBWOE1lc3NhZ2VFdmVudDo6aW5pdE1lc3NhZ2VFdmVudENhbGxiYWNrKGNvbnN0IHY4
OjpBcmd1bWVuCiAgICAgU3RyaW5nIHR5cGVBcmcgPSB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKGFy
Z3NbMF0pOwogICAgIGJvb2wgY2FuQnViYmxlQXJnID0gYXJnc1sxXS0+Qm9vbGVhblZhbHVlKCk7
CiAgICAgYm9vbCBjYW5jZWxhYmxlQXJnID0gYXJnc1syXS0+Qm9vbGVhblZhbHVlKCk7Ci0gICAg
UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gZGF0YUFyZyA9IFNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZTo6Y3JlYXRlKHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcoYXJnc1szXSkpOworICAgIFJlZlB0
cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGRhdGFBcmcgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6
OmNyZWF0ZShhcmdzWzNdKTsKICAgICBTdHJpbmcgb3JpZ2luQXJnID0gdjhWYWx1ZVRvV2ViQ29y
ZVN0cmluZyhhcmdzWzRdKTsKICAgICBTdHJpbmcgbGFzdEV2ZW50SWRBcmcgPSB2OFZhbHVlVG9X
ZWJDb3JlU3RyaW5nKGFyZ3NbNV0pOwogICAgIERPTVdpbmRvdyogc291cmNlQXJnID0gVjhET01X
aW5kb3c6Okhhc0luc3RhbmNlKGFyZ3NbNl0pID8gVjhET01XcmFwcGVyOjpjb252ZXJ0VG9OYXRp
dmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgdjg6OkhhbmRsZTx2
ODo6T2JqZWN0Pjo6Q2FzdChhcmdzWzZdKSkgOiAwOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhNZXNzYWdlUG9ydEN1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3VzdG9tLmNwcAppbmRleCA3ODc5ZmI4Li5kMWIwOWY3
IDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3Vz
dG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3Vz
dG9tLmNwcApAQCAtNzgsNyArNzgsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhNZXNzYWdl
UG9ydDo6cG9zdE1lc3NhZ2VDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcgogewogICAg
IElOQ19TVEFUUygiRE9NLk1lc3NhZ2VQb3J0LnBvc3RNZXNzYWdlIik7CiAgICAgTWVzc2FnZVBv
cnQqIG1lc3NhZ2VQb3J0ID0gVjhET01XcmFwcGVyOjpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TWVz
c2FnZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIGFyZ3MuSG9sZGVyKCkpOwotICAg
IFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0
VmFsdWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJp
YWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0
ZShhcmdzWzBdKTsKICAgICBNZXNzYWdlUG9ydEFycmF5IHBvcnRBcnJheTsKICAgICBpZiAoYXJn
cy5MZW5ndGgoKSA+IDEpIHsKICAgICAgICAgaWYgKCFnZXRNZXNzYWdlUG9ydEFycmF5KGFyZ3Nb
MV0sIHBvcnRBcnJheSkpCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OFdvcmtlckN1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckN1
c3RvbS5jcHAKaW5kZXggMWNiZTBhNS4uMmY1ODRhNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhXb3JrZXJDdXN0b20uY3BwCisrKyBiL1dlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4V29ya2VyQ3VzdG9tLmNwcApAQCAtOTIsNyArOTIsOCBAQCB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gVjhXb3JrZXI6OnBvc3RNZXNzYWdlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3Vt
ZW50cyYgYXJncykKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Xb3JrZXIucG9zdE1lc3NhZ2UiKTsK
ICAgICBXb3JrZXIqIHdvcmtlciA9IFY4RE9NV3JhcHBlcjo6Y29udmVydFRvTmF0aXZlT2JqZWN0
PFdvcmtlcj4oVjhDbGFzc0luZGV4OjpXT1JLRVIsIGFyZ3MuSG9sZGVyKCkpOwotICAgIFJlZlB0
cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6
OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVk
U2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdz
WzBdKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSBjcmVhdGVk
IGluIFY4V29ya2VyOjpwb3N0TWVzc2FnZUNhbGxiYWNrXG4iKTsKICAgICBNZXNzYWdlUG9ydEFy
cmF5IHBvcnRBcnJheTsKICAgICBpZiAoYXJncy5MZW5ndGgoKSA+IDEpIHsKICAgICAgICAgaWYg
KCFnZXRNZXNzYWdlUG9ydEFycmF5KGFyZ3NbMV0sIHBvcnRBcnJheSkpCmRpZmYgLS1naXQgYS9X
ZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nIGIvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwppbmRl
eCAyZDNlODhlLi5lZGUzZTYzIDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9n
CisrKyBiL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMyBAQAorMjAwOS0x
Mi0yNCAgVml0YWx5IFJlcGVzaGtvICA8dml0YWx5ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW1Y4XSBTdXBwb3J0IFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZS4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTMyOTIwCisgICAgICAgIGh0dHA6Ly9jcmJ1Zy5jb20vMzA2MjAKKworICAgICAg
ICBVcGRhdGVkIGNsaWVudHM6CisgICAgICAgICogc3JjL1BsYXRmb3JtTWVzc2FnZVBvcnRDaGFu
bmVsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVsOjpw
b3N0TWVzc2FnZVRvUmVtb3RlKToKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtTWVzc2FnZVBv
cnRDaGFubmVsOjp0cnlHZXRNZXNzYWdlRnJvbVJlbW90ZSk6CisgICAgICAgICogc3JjL1dlYldv
cmtlckJhc2UuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJXb3JrZXJCYXNlOjpwb3N0TWVzc2Fn
ZVRvV29ya2VyT2JqZWN0KToKKyAgICAgICAgKiBzcmMvV2ViV29ya2VyQ2xpZW50SW1wbC5jcHA6
CisgICAgICAgIChXZWJLaXQ6OldlYldvcmtlckNsaWVudEltcGw6OnBvc3RNZXNzYWdlVG9Xb3Jr
ZXJDb250ZXh0KToKKyAgICAgICAgKFdlYktpdDo6V2ViV29ya2VyQ2xpZW50SW1wbDo6cG9zdE1l
c3NhZ2VUb1dvcmtlck9iamVjdFRhc2spOgorICAgICAgICAqIHNyYy9XZWJXb3JrZXJJbXBsLmNw
cDoKKyAgICAgICAgKFdlYktpdDo6V2ViV29ya2VySW1wbDo6cG9zdE1lc3NhZ2VUb1dvcmtlckNv
bnRleHRUYXNrKToKKwogMjAwOS0xMi0xOCAgS2VubmV0aCBSdXNzZWxsICA8a2JyQGdvb2dsZS5j
b20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gRmlzaGVyLgpkaWZmIC0tZ2l0IGEvV2Vi
S2l0L2Nocm9taXVtL3NyYy9QbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbC5jcHAgYi9XZWJLaXQv
Y2hyb21pdW0vc3JjL1BsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVsLmNwcAppbmRleCBmOGM0MWQz
Li5hYTQyYTEwIDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0vc3JjL1BsYXRmb3JtTWVzc2Fn
ZVBvcnRDaGFubmVsLmNwcAorKysgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1BsYXRmb3JtTWVzc2Fn
ZVBvcnRDaGFubmVsLmNwcApAQCAtMTc5LDcgKzE3OSw3IEBAIHZvaWQgUGxhdGZvcm1NZXNzYWdl
UG9ydENoYW5uZWw6OnBvc3RNZXNzYWdlVG9SZW1vdGUoUGFzc093blB0cjxNZXNzYWdlUG9ydENo
YW5uCiAgICAgaWYgKCFtX2xvY2FsUG9ydCB8fCAhbV93ZWJDaGFubmVsKQogICAgICAgICByZXR1
cm47CiAKLSAgICBXZWJTdHJpbmcgbWVzc2FnZVN0cmluZyA9IG1lc3NhZ2UtPm1lc3NhZ2UoKS0+
dG9TdHJpbmcoKTsKKyAgICBXZWJTdHJpbmcgbWVzc2FnZVN0cmluZyA9IG1lc3NhZ2UtPm1lc3Nh
Z2UoKS0+dG9XaXJlU3RyaW5nKCk7CiAgICAgT3duUHRyPFdlYkNvcmU6Ok1lc3NhZ2VQb3J0Q2hh
bm5lbEFycmF5PiBjaGFubmVscyA9IG1lc3NhZ2UtPmNoYW5uZWxzKCk7CiAgICAgV2ViTWVzc2Fn
ZVBvcnRDaGFubmVsQXJyYXkqIHdlYkNoYW5uZWxzID0gMDsKICAgICBpZiAoY2hhbm5lbHMuZ2V0
KCkgJiYgY2hhbm5lbHMtPnNpemUoKSkgewpAQCAtMjExLDcgKzIxMSw3IEBAIGJvb2wgUGxhdGZv
cm1NZXNzYWdlUG9ydENoYW5uZWw6OnRyeUdldE1lc3NhZ2VGcm9tUmVtb3RlKE93blB0cjxNZXNz
YWdlUG9ydENoYW5uCiAgICAgICAgICAgICAgICAgKCpjaGFubmVscylbaV0gPSBNZXNzYWdlUG9y
dENoYW5uZWw6OmNyZWF0ZShwbGF0Zm9ybUNoYW5uZWwpOwogICAgICAgICAgICAgfQogICAgICAg
ICB9Ci0gICAgICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRNZXNz
YWdlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUobWVzc2FnZSk7CisgICAgICAgIFJl
ZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRNZXNzYWdlID0gU2VyaWFsaXpl
ZFNjcmlwdFZhbHVlOjpjcmVhdGVGcm9tV2lyZShtZXNzYWdlKTsKICAgICAgICAgcmVzdWx0ID0g
TWVzc2FnZVBvcnRDaGFubmVsOjpFdmVudERhdGE6OmNyZWF0ZShzZXJpYWxpemVkTWVzc2FnZS5y
ZWxlYXNlKCksIGNoYW5uZWxzLnJlbGVhc2UoKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9XZWJL
aXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckJhc2UuY3BwIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9X
ZWJXb3JrZXJCYXNlLmNwcAppbmRleCA4NWEyNjNiLi43MzMzOTgxIDEwMDY0NAotLS0gYS9XZWJL
aXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckJhc2UuY3BwCisrKyBiL1dlYktpdC9jaHJvbWl1bS9z
cmMvV2ViV29ya2VyQmFzZS5jcHAKQEAgLTE1OCw3ICsxNTgsNyBAQCB2b2lkIFdlYldvcmtlckJh
c2U6OnBvc3RNZXNzYWdlVG9Xb3JrZXJPYmplY3QoUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0
VmFsdWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFz
c093blB0cjxNZXNzYWdlUG9ydENoYW5uZWxBcnJheT4gY2hhbm5lbHMpCiB7CiAgICAgZGlzcGF0
Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmcG9zdE1lc3NhZ2VUYXNrLCB0
aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVz
c2FnZS0+dG9TdHJpbmcoKSwgY2hhbm5lbHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPnRvV2lyZVN0cmluZygpLCBjaGFubmVscykp
OwogfQogCiB2b2lkIFdlYldvcmtlckJhc2U6OnBvc3RNZXNzYWdlVGFzayhTY3JpcHRFeGVjdXRp
b25Db250ZXh0KiBjb250ZXh0LApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJX
b3JrZXJDbGllbnRJbXBsLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2VyQ2xpZW50
SW1wbC5jcHAKaW5kZXggNmJlMDNhNy4uNTk4YTA3OCAxMDA2NDQKLS0tIGEvV2ViS2l0L2Nocm9t
aXVtL3NyYy9XZWJXb3JrZXJDbGllbnRJbXBsLmNwcAorKysgYi9XZWJLaXQvY2hyb21pdW0vc3Jj
L1dlYldvcmtlckNsaWVudEltcGwuY3BwCkBAIC0xNzMsNyArMTczLDcgQEAgdm9pZCBXZWJXb3Jr
ZXJDbGllbnRJbXBsOjpwb3N0TWVzc2FnZVRvV29ya2VyQ29udGV4dCgKICAgICBpZiAoIWlzTWFp
blRocmVhZCgpKSB7CiAgICAgICAgIFdlYldvcmtlckJhc2U6OmRpc3BhdGNoVGFza1RvTWFpblRo
cmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0VGFzaywK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPnRvU3RyaW5nKCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbWVzc2FnZS0+dG9XaXJlU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpKTsKICAgICAg
ICAgcmV0dXJuOwogICAgIH0KQEAgLTE4NCw3ICsxODQsNyBAQCB2b2lkIFdlYldvcmtlckNsaWVu
dEltcGw6OnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0KAogICAgICAgICB3ZWJjaGFubmVsLT5z
ZXRDbGllbnQoMCk7CiAgICAgICAgIHdlYkNoYW5uZWxzW2ldID0gd2ViY2hhbm5lbDsKICAgICB9
Ci0gICAgbV93ZWJXb3JrZXItPnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0KG1lc3NhZ2UtPnRv
U3RyaW5nKCksIHdlYkNoYW5uZWxzKTsKKyAgICBtX3dlYldvcmtlci0+cG9zdE1lc3NhZ2VUb1dv
cmtlckNvbnRleHQobWVzc2FnZS0+dG9XaXJlU3RyaW5nKCksIHdlYkNoYW5uZWxzKTsKIH0KIAog
Ym9vbCBXZWJXb3JrZXJDbGllbnRJbXBsOjpoYXNQZW5kaW5nQWN0aXZpdHkoKSBjb25zdApAQCAt
MzU2LDcgKzM1Niw3IEBAIHZvaWQgV2ViV29ya2VyQ2xpZW50SW1wbDo6cG9zdE1lc3NhZ2VUb1dv
cmtlck9iamVjdFRhc2soCiAgICAgICAgIE93blB0cjxNZXNzYWdlUG9ydEFycmF5PiBwb3J0cyA9
CiAgICAgICAgICAgICBNZXNzYWdlUG9ydDo6ZW50YW5nbGVQb3J0cygqY29udGV4dCwgY2hhbm5l
bHMucmVsZWFzZSgpKTsKICAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2Vy
aWFsaXplZE1lc3NhZ2UgPQotICAgICAgICAgICAgU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVh
dGUobWVzc2FnZSk7CisgICAgICAgICAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZUZy
b21XaXJlKG1lc3NhZ2UpOwogICAgICAgICB0aGlzUHRyLT5tX3dvcmtlci0+ZGlzcGF0Y2hFdmVu
dChNZXNzYWdlRXZlbnQ6OmNyZWF0ZShwb3J0cy5yZWxlYXNlKCksCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRN
ZXNzYWdlLnJlbGVhc2UoKSkpOwogICAgIH0KZGlmZiAtLWdpdCBhL1dlYktpdC9jaHJvbWl1bS9z
cmMvV2ViV29ya2VySW1wbC5jcHAgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckltcGwu
Y3BwCmluZGV4IDc0NGJlMzAuLjViNWUwNTMgMTAwNjQ0Ci0tLSBhL1dlYktpdC9jaHJvbWl1bS9z
cmMvV2ViV29ya2VySW1wbC5jcHAKKysrIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJJ
bXBsLmNwcApAQCAtODgsNyArODgsNyBAQCB2b2lkIFdlYldvcmtlckltcGw6OnBvc3RNZXNzYWdl
VG9Xb3JrZXJDb250ZXh0VGFzayhXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZQogICAgIE93
blB0cjxNZXNzYWdlUG9ydEFycmF5PiBwb3J0cyA9CiAgICAgICAgIE1lc3NhZ2VQb3J0OjplbnRh
bmdsZVBvcnRzKCpjb250ZXh0LCBjaGFubmVscy5yZWxlYXNlKCkpOwogICAgIFJlZlB0cjxTZXJp
YWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRNZXNzYWdlID0KLSAgICAgICAgU2VyaWFsaXpl
ZFNjcmlwdFZhbHVlOjpjcmVhdGUobWVzc2FnZSk7CisgICAgICAgIFNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZTo6Y3JlYXRlRnJvbVdpcmUobWVzc2FnZSk7CiAgICAgd29ya2VyQ29udGV4dC0+ZGlzcGF0
Y2hFdmVudChNZXNzYWdlRXZlbnQ6OmNyZWF0ZSgKICAgICAgICAgcG9ydHMucmVsZWFzZSgpLCBz
ZXJpYWxpemVkTWVzc2FnZS5yZWxlYXNlKCkpKTsKICAgICB0aGlzUHRyLT5jb25maXJtTWVzc2Fn
ZUZyb21Xb3JrZXJPYmplY3Qod29ya2VyQ29udGV4dC0+aGFzUGVuZGluZ0FjdGl2aXR5KCkpOwo=
</data>
<flag name="review"
          id="27532"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46607</attachid>
            <date>2010-01-14 14:41:50 -0800</date>
            <delta_ts>2010-01-15 07:15:53 -0800</delta_ts>
            <desc>patch v2</desc>
            <filename>serialize.patch</filename>
            <type>text/plain</type>
            <size>40732</size>
            <attacher name="Vitaly Repeshko">vitalyr</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MjdkMzQ3MC4uZjhlYTEwMiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw5OCBAQAorMjAxMC0wMS0xNCAgVml0YWx5IFJlcGVz
aGtvICA8dml0YWx5ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgW1Y4XSBTdXBwb3J0IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMyOTIwCisg
ICAgICAgIGh0dHA6Ly9jcmJ1Zy5jb20vMzA2MjAKKworICAgICAgICBJbml0aWFsIGltcGxlbWVu
dGF0aW9uIG9mIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSB3aGljaCBpcyB1c2VkIHRvCisgICAgICAg
IHRvIGNyZWF0ZSBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgSmF2YVNjcmlwdCBvYmpl
Y3RzLiAgVGhpcworICAgICAgICByZXByZXNlbnRhdGlvbiBpcyBuZWVkZWQgZm9yIHN0cnVjdHVy
ZWQgY2xvbmVzIGFuZCB3b3JrZXIgbWVzc2FnZXMuCisKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6
IEFkZGVkIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAuCisgICAgICAgICogYmluZGluZ3Mvc2Ny
aXB0cy9Db2RlR2VuZXJhdG9yVjgucG06IFJlbW92ZWQgY29udmVyc2lvbiB0byBzdHJpbmcgYmVm
b3JlIHVzaW5nIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4KKyAgICAgICAgKiBiaW5kaW5ncy92OC9T
ZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Oik6Cisg
ICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWda
YWc6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OldyaXRlcik6CisgICAgICAg
IChXZWJDb3JlOjpXcml0ZXI6OndyaXRlVW5kZWZpbmVkKToKKyAgICAgICAgKFdlYkNvcmU6Oldy
aXRlcjo6d3JpdGVOdWxsKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVUcnVlKToK
KyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVGYWxzZSk6CisgICAgICAgIChXZWJDb3Jl
OjpXcml0ZXI6OndyaXRlU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVJ
bnQzMik6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OndyaXRlTnVtYmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OldyaXRlcjo6ZW5kQ29tcG9zaXRlKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRl
cjo6ZGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OmRvV3JpdGVVaW50MzIpOgorICAg
ICAgICAoV2ViQ29yZTo6V3JpdGVyOjphcHBlbmQpOgorICAgICAgICAoV2ViQ29yZTo6V3JpdGVy
OjplbnN1cmVTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OmZpbGxIb2xlKToKKyAg
ICAgICAgKFdlYkNvcmU6OldyaXRlcjo6Y2hhckF0KToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlh
bGl6ZXI6OlNlcmlhbGl6ZXIpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6c2VyaWFs
aXplKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0YXRlQmFzZTo6flN0YXRlQmFz
ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6Om5leHRTdGF0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OnNldE5leHRTdGF0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OmNvbXBvc2l0ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OlN0YXRlQmFzZSk6CisgICAg
ICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZTo6Y29tcG9zaXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OlNlcmlhbGl6ZXI6OlN0YXRlOjp0YWcpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFs
aXplcjo6U3RhdGU6OlN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0YWNr
Q2xlYW5lcjo6U3RhY2tDbGVhbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0
YWNrQ2xlYW5lcjo6flN0YWNrQ2xlYW5lcik6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVy
OjpBcnJheVN0YXRlOjpBcnJheVN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6
OkFycmF5U3RhdGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6QXJyYXlT
dGF0ZTo6YWR2YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpPYmplY3RTdGF0
ZTo6T2JqZWN0U3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3Rh
dGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3RhdGU6OmFk
dmFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3RhdGU6Om5leHRQ
cm9wZXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpkb1NlcmlhbGl6ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpwdXNoKToKKyAgICAgICAgKFdlYkNvcmU6OlNl
cmlhbGl6ZXI6OnRvcCk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpwb3ApOgorICAg
ICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6Y2hlY2tDb21wb3NpdGUpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVhZGVyOjpSZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVhZGVyOjppc0VvZik6
CisgICAgICAgIChXZWJDb3JlOjpSZWFkZXI6OnJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVh
ZGVyOjpyZWFkVGFnKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWRlcjo6cmVhZFN0cmluZyk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZWFkZXI6OnJlYWRJbnQzMik6CisgICAgICAgIChXZWJDb3JlOjpS
ZWFkZXI6OnJlYWROdW1iZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVhZGVyOjpkb1JlYWRVaW50
MzIpOgorICAgICAgICAoV2ViQ29yZTo6RGVzZXJpYWxpemVyOjpEZXNlcmlhbGl6ZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6RGVzZXJpYWxpemVyOjpkZXNlcmlhbGl6ZSk6CisgICAgICAgIChXZWJD
b3JlOjpEZXNlcmlhbGl6ZXI6OmRvRGVzZXJpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6RGVz
ZXJpYWxpemVyOjpwdXNoKToKKyAgICAgICAgKFdlYkNvcmU6OkRlc2VyaWFsaXplcjo6cG9wKToK
KyAgICAgICAgKFdlYkNvcmU6OkRlc2VyaWFsaXplcjo6c3RhY2tEZXB0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpEZXNlcmlhbGl6ZXI6OmVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFs
aXplZFNjcmlwdFZhbHVlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWUpOgorICAgICAgICAoV2ViQ29y
ZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpkZXNlcmlhbGl6ZSk6CisgICAgICAgICogYmluZGlu
Z3MvdjgvU2VyaWFsaXplZFNjcmlwdFZhbHVlLmg6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxp
emVkU2NyaXB0VmFsdWU6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2Ny
aXB0VmFsdWU6OmNyZWF0ZUZyb21XaXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZTo6cmVsZWFzZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0
VmFsdWU6OnRvV2lyZVN0cmluZyk6CisKKyAgICAgICAgVXBkYXRlZCB1c2VzIG9mIFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dD
dXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhET01XaW5kb3c6OnBvc3RNZXNzYWdlQ2Fs
bGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOERlZGljYXRlZFdvcmtlckNv
bnRleHRDdXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhEZWRpY2F0ZWRXb3JrZXJDb250
ZXh0Ojpwb3N0TWVzc2FnZUNhbGxiYWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20v
VjhIaXN0b3J5Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4SGlzdG9yeTo6cHVzaFN0
YXRlQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6VjhIaXN0b3J5OjpyZXBsYWNlU3RhdGVD
YWxsYmFjayk6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3Vz
dG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4TWVzc2FnZUV2ZW50Ojppbml0TWVzc2FnZUV2
ZW50Q2FsbGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0
Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4TWVzc2FnZVBvcnQ6OnBvc3RNZXNzYWdl
Q2FsbGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckN1c3RvbS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpWOFdvcmtlcjo6cG9zdE1lc3NhZ2VDYWxsYmFjayk6CisK
IDIwMTAtMDEtMTIgIEpvbiBIb25leWN1dHQgIDxqaG9uZXljdXR0QGFwcGxlLmNvbT4KIAogICAg
ICAgICBNU0FBOiBzZWxlY3RlZCwgc2VsZWN0YWJsZSwgZXh0ZW5kZWQgc2VsZWN0YWJsZSwgYW5k
IG11bHRpcGxlCmRpZmYgLS1naXQgYS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1dlYkNvcmUvV2Vi
Q29yZS5neXBpCmluZGV4IDY2MDEzNDcuLjU5YjJmYjIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2Vi
Q29yZS5neXBpCisrKyBiL1dlYkNvcmUvV2ViQ29yZS5neXBpCkBAIC03OTQsNiArNzk0LDcgQEAK
ICAgICAgICAgICAgICdiaW5kaW5ncy92OC9TY3JpcHRTdHJpbmdJbXBsLmgnLAogICAgICAgICAg
ICAgJ2JpbmRpbmdzL3Y4L1NjcmlwdFZhbHVlLmNwcCcsCiAgICAgICAgICAgICAnYmluZGluZ3Mv
djgvU2NyaXB0VmFsdWUuaCcsCisgICAgICAgICAgICAnYmluZGluZ3MvdjgvU2VyaWFsaXplZFNj
cmlwdFZhbHVlLmNwcCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvU2VyaWFsaXplZFNjcmlw
dFZhbHVlLmgnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L3NwZWNpYWxpemF0aW9uL1Y4Qmlu
ZGluZ0RPTVdpbmRvdy5oJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9zcGVjaWFsaXphdGlv
bi9WOEJpbmRpbmdTdGF0ZS5jcHAnLApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy9zY3Jp
cHRzL0NvZGVHZW5lcmF0b3JWOC5wbSBiL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2Vu
ZXJhdG9yVjgucG0KaW5kZXggZmYyNDA4Ni4uMmZiZjYzNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9i
aW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5wbQorKysgYi9XZWJDb3JlL2JpbmRpbmdz
L3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4LnBtCkBAIC0yNTQwLDcgKzI1NDAsNyBAQCBzdWIgUmV0
dXJuTmF0aXZlVG9KU1ZhbHVlCiAKICAgICBpZiAoJHR5cGUgZXEgIlNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZSIpIHsKICAgICAgICAgJGltcGxJbmNsdWRlc3siJHR5cGUuaCJ9ID0gMTsKLSAgICAgICAg
cmV0dXJuICJyZXR1cm4gdjhTdHJpbmcoJHZhbHVlLT50b1N0cmluZygpKSI7CisgICAgICAgIHJl
dHVybiAicmV0dXJuICR2YWx1ZS0+ZGVzZXJpYWxpemUoKSI7CiAgICAgfQogCiAgICAgaWYgKCR0
eXBlIGVxICJEZWRpY2F0ZWRXb3JrZXJDb250ZXh0IiBvciAkdHlwZSBlcSAiV29ya2VyQ29udGV4
dCIgb3IgJHR5cGUgZXEgIlNoYXJlZFdvcmtlckNvbnRleHQiKSB7CmRpZmYgLS1naXQgYS9XZWJD
b3JlL2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAgYi9XZWJDb3JlL2JpbmRp
bmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uYWI0ZTc3ZgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3Mv
djgvU2VyaWFsaXplZFNjcmlwdFZhbHVlLmNwcApAQCAtMCwwICsxLDY5MyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmli
dXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUg
bmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJTZXJpYWxpemVkU2NyaXB0VmFsdWUuaCIKKworI2luY2x1ZGUg
IlNoYXJlZEJ1ZmZlci5oIgorCisjaW5jbHVkZSA8djguaD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291
bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworLy8gRklYTUU6CisvLyAtIGNhdGNo
IFY4IGV4Y2VwdGlvbnMKKy8vIC0gYmUgcmVhZHkgdG8gZ2V0IGVtcHR5IGhhbmRsZXMKKy8vIC0g
Y29uc2lkZXIgY3Jhc2hpbmcgaW4gZGVidWcgbW9kZSBvbiBkZXNlcmlhbGl6YXRpb24gZXJyb3Jz
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworbmFtZXNwYWNlIHsKKworLy8gU2VyaWFsaXphdGlv
biBmb3JtYXQgaXMgYSBzZXF1ZW5jZSBvZiAodGFnLCBvcHRpb25hbCBkYXRhKQorLy8gcGFpcnMu
IFRhZyBhbHdheXMgdGFrZXMgZXhhY3RseSBvbmUgYnl0ZS4KK2VudW0gU2VyaWFsaXphdGlvblRh
ZyB7CisgICAgSW52YWxpZFRhZyA9ICchJywKKyAgICBQYWRkaW5nVGFnID0gJ1wwJywKKyAgICBV
bmRlZmluZWRUYWcgPSAnXycsCisgICAgTnVsbFRhZyA9ICcwJywKKyAgICBUcnVlVGFnID0gJ1Qn
LAorICAgIEZhbHNlVGFnID0gJ0YnLAorICAgIFN0cmluZ1RhZyA9ICdTJywKKyAgICBJbnQzMlRh
ZyA9ICdJJywKKyAgICBOdW1iZXJUYWcgPSAnTicsCisgICAgT2JqZWN0VGFnID0gJ3snLAorICAg
IEFycmF5VGFnID0gJ1snLAorfTsKKworLy8gSGVscGVycyB0byBkbyB2ZXJib3NlIGhhbmRsZSBj
YXN0cy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzdGF0aWMgdjg6Okhh
bmRsZTxUPiBoYW5kbGVDYXN0KHY4OjpIYW5kbGU8VT4gaGFuZGxlKSB7IHJldHVybiB2ODo6SGFu
ZGxlPFQ+OjpDYXN0KGhhbmRsZSk7IH0KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1l
IFU+CitzdGF0aWMgdjg6OkxvY2FsPFQ+IGhhbmRsZUNhc3Qodjg6OkxvY2FsPFU+IGhhbmRsZSkg
eyByZXR1cm4gdjg6OkxvY2FsPFQ+OjpDYXN0KGhhbmRsZSk7IH0KKworc3RhdGljIGJvb2wgc2hv
dWxkQ2hlY2tGb3JDeWNsZXMoaW50IGRlcHRoKQoreworICAgIEFTU0VSVChkZXB0aCA+PSAwKTsK
KyAgICAvLyBTaW5jZSB3ZSBhcmUgbm90IHJlcXVpcmVkIHRvIHNwb3QgdGhlIGN5Y2xlIGFzIHNv
b24gYXMgaXQKKyAgICAvLyBoYXBwZW5zIHdlIGNhbiBjaGVjayBmb3IgY3ljbGVzIG9ubHkgd2hl
biB0aGUgY3VycmVudCBkZXB0aAorICAgIC8vIGlzIGEgcG93ZXIgb2YgdHdvLgorICAgIHJldHVy
biAhKGRlcHRoICYgKGRlcHRoIC0gMSkpOworfQorCitzdGF0aWMgY29uc3QgaW50IG1heERlcHRo
ID0gMjAwMDA7CisKKy8vIFZhckludCBlbmNvZGluZyBjb25zdGFudHMuCitzdGF0aWMgY29uc3Qg
aW50IHZhckludFNoaWZ0ID0gNzsKK3N0YXRpYyBjb25zdCBpbnQgdmFySW50TWFzayA9ICgxIDw8
IHZhckludFNoaWZ0KSAtIDE7CisKKy8vIFppZ1phZyBlbmNvZGluZyBoZWxwcyBWYXJJbnQgZW5j
b2Rpbmcgc3RheSBzbWFsbCBmb3IgbmVnYXRpdmUKKy8vIG51bWJlcnMgd2l0aCBzbWFsbCBhYnNv
bHV0ZSB2YWx1ZXMuCitjbGFzcyBaaWdaYWcgeworICBwdWJsaWM6CisgICAgc3RhdGljIHVpbnQz
Ml90IGVuY29kZSh1aW50MzJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSAmICgx
VSA8PCAzMSkpCisgICAgICAgICAgICB2YWx1ZSA9ICgofnZhbHVlKSA8PCAxKSArIDE7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHVlIDw8PSAxOworICAgICAgICByZXR1cm4gdmFsdWU7
CisgICAgfQorCisgICAgc3RhdGljIHVpbnQzMl90IGRlY29kZSh1aW50MzJfdCB2YWx1ZSkKKyAg
ICB7CisgICAgICAgIGlmICh2YWx1ZSAmIDEpCisgICAgICAgICAgICB2YWx1ZSA9IH4odmFsdWUg
Pj4gMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHVlID4+PSAxOworICAgICAgICBy
ZXR1cm4gdmFsdWU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgWmlnWmFnKCk7Cit9OworCisv
LyBXcml0ZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlcmlhbGl6aW5nIHByaW1pdGl2ZSB0eXBlcyBh
bmQgc3RvcmluZworLy8gaW5mb3JtYXRpb24gdXNlZCB0byByZWNvbnN0cnVjdCBjb21wb3NpdGUg
dHlwZXMuCitjbGFzcyBXcml0ZXIgOiBOb25jb3B5YWJsZSB7CisgIHB1YmxpYzoKKyAgICBXcml0
ZXIoKSA6IG1fcG9zKDApCisgICAgeworICAgIH0KKworICAgIC8vIFdyaXRlIGZ1bmN0aW9ucyBm
b3IgcHJpbWl0aXZlIHR5cGVzLgorCisgICAgdm9pZCB3cml0ZVVuZGVmaW5lZCgpIHsgYXBwZW5k
KFVuZGVmaW5lZFRhZyk7IH0KKworICAgIHZvaWQgd3JpdGVOdWxsKCkgeyBhcHBlbmQoTnVsbFRh
Zyk7IH0KKworICAgIHZvaWQgd3JpdGVUcnVlKCkgeyBhcHBlbmQoVHJ1ZVRhZyk7IH0KKworICAg
IHZvaWQgd3JpdGVGYWxzZSgpIHsgYXBwZW5kKEZhbHNlVGFnKTsgfQorCisgICAgdm9pZCB3cml0
ZVN0cmluZyhjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgYXBw
ZW5kKFN0cmluZ1RhZyk7CisgICAgICAgIGRvV3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMy
X3Q+KGxlbmd0aCkpOworICAgICAgICBhcHBlbmQoZGF0YSwgbGVuZ3RoKTsKKyAgICB9CisKKyAg
ICB2b2lkIHdyaXRlSW50MzIoaW50MzJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGFwcGVuZChJ
bnQzMlRhZyk7CisgICAgICAgIGRvV3JpdGVVaW50MzIoWmlnWmFnOjplbmNvZGUoc3RhdGljX2Nh
c3Q8dWludDMyX3Q+KHZhbHVlKSkpOworICAgIH0KKworICAgIHZvaWQgd3JpdGVOdW1iZXIoZG91
YmxlIG51bWJlcikKKyAgICB7CisgICAgICAgIGFwcGVuZChOdW1iZXJUYWcpOworICAgICAgICBh
cHBlbmQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm51bWJlciksIHNpemVvZihudW1iZXIpKTsK
KyAgICB9CisKKyAgICAvLyBSZWNvcmRzIHRoYXQgYSBjb21wb3NpdGUgb2JqZWN0IGNhbiBiZSBj
b25zdHJ1Y3RlZCBieSB1c2luZworICAgIC8vIHxsZW5ndGh8IHByZXZpb3VzbHkgc3RvcmVkIHZh
bHVlcy4KKyAgICB2b2lkIGVuZENvbXBvc2l0ZShTZXJpYWxpemF0aW9uVGFnIHRhZywgaW50MzJf
dCBsZW5ndGgpCisgICAgeworICAgICAgICBBU1NFUlQodGFnID09IE9iamVjdFRhZyB8fCB0YWcg
PT0gQXJyYXlUYWcpOworICAgICAgICBhcHBlbmQodGFnKTsKKyAgICAgICAgZG9Xcml0ZVVpbnQz
MihzdGF0aWNfY2FzdDx1aW50MzJfdD4obGVuZ3RoKSk7CisgICAgfQorCisgICAgVmVjdG9yPFVD
aGFyPiYgZGF0YSgpCisgICAgeworICAgICAgICBmaWxsSG9sZSgpOworICAgICAgICByZXR1cm4g
bV9idWZmZXI7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBkb1dyaXRlVWludDMyKHVp
bnQzMl90IHZhbHVlKQorICAgIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAg
IGNoYXIgYiA9ICh2YWx1ZSAmIHZhckludE1hc2spOworICAgICAgICAgICAgdmFsdWUgPj49IHZh
ckludFNoaWZ0OworICAgICAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgICAgIGFw
cGVuZChiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGFwcGVuZChiIHwgKDEgPDwgdmFySW50U2hpZnQpKTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIHZvaWQgYXBwZW5kKFNlcmlhbGl6YXRpb25UYWcgdGFnKQorICAgIHsKKyAgICAgICAgYXBw
ZW5kKHN0YXRpY19jYXN0PGNoYXI+KHRhZykpOworICAgIH0KKworICAgIHZvaWQgYXBwZW5kKGNo
YXIgYikKKyAgICB7CisgICAgICAgIGVuc3VyZVNwYWNlKDEpOworICAgICAgICAqY2hhckF0KG1f
cG9zKyspID0gYjsKKyAgICB9CisKKyAgICB2b2lkIGFwcGVuZChjb25zdCBjaGFyKiBkYXRhLCBp
bnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgZW5zdXJlU3BhY2UobGVuZ3RoKTsKKyAgICAgICAg
bWVtY3B5KGNoYXJBdChtX3BvcyksIGRhdGEsIGxlbmd0aCk7CisgICAgICAgIG1fcG9zICs9IGxl
bmd0aDsKKyAgICB9CisKKyAgICB2b2lkIGVuc3VyZVNwYWNlKGludCBleHRyYSkKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChzaXplb2YoVUNoYXIpID09IDIpOworICAgICAgICBtX2J1ZmZlci5ncm93
KChtX3BvcyArIGV4dHJhICsgMSkgLyAyKTsgIC8vICIrIDEiIHRvIHJvdW5kIHVwLgorICAgIH0K
KworICAgIHZvaWQgZmlsbEhvbGUoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKHNpemVvZihVQ2hh
cikgPT0gMik7CisgICAgICAgIC8vIElmIHRoZSB3cml0ZXIgaXMgYXQgb2RkIHBvc2l0aW9uIGlu
IHRoZSBidWZmZXIsIHRoZW4gb25lIG9mCisgICAgICAgIC8vIHRoZSBieXRlcyBpbiB0aGUgbGFz
dCBVQ2hhciBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICAgIGlmIChtX3BvcyAlIDIpCisgICAg
ICAgICAgICAqY2hhckF0KG1fcG9zKSA9IHN0YXRpY19jYXN0PGNoYXI+KFBhZGRpbmdUYWcpOwor
ICAgIH0KKworICAgIGNoYXIqIGNoYXJBdChpbnQgcG9zKSB7IHJldHVybiByZWludGVycHJldF9j
YXN0PGNoYXIqPihtX2J1ZmZlci5kYXRhKCkpICsgcG9zOyB9CisKKyAgICBWZWN0b3I8VUNoYXI+
IG1fYnVmZmVyOworICAgIGludCBtX3BvczsKK307CisKK2NsYXNzIFNlcmlhbGl6ZXIgeworICBw
dWJsaWM6CisgICAgZXhwbGljaXQgU2VyaWFsaXplcihXcml0ZXImIHdyaXRlcikKKyAgICAgICAg
OiBtX3dyaXRlcih3cml0ZXIpCisgICAgICAgICwgbV9zdGF0ZSgwKQorICAgICAgICAsIG1fZGVw
dGgoMCkKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBzZXJpYWxpemUodjg6OkhhbmRsZTx2ODo6
VmFsdWU+IHZhbHVlKQorICAgIHsKKyAgICAgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAg
ICAgICBTdGFja0NsZWFuZXIgY2xlYW5lcigmbV9zdGF0ZSk7CisgICAgICAgIGlmICghZG9TZXJp
YWxpemUodmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB3aGlsZSAo
dG9wKCkpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGg7CisgICAgICAgICAgICB3aGlsZSAoIXRv
cCgpLT5pc0RvbmUoJmxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgZG9T
ZXJpYWxpemUoKSBjYW4gY2hhbmdlIGN1cnJlbnQgdG9wKCkuCisgICAgICAgICAgICAgICAgaWYg
KCFkb1NlcmlhbGl6ZSh0b3AoKS0+YWR2YW5jZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV93cml0ZXIuZW5kQ29tcG9z
aXRlKHRvcCgpLT50YWcoKSwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHBvcCgpOworICAgICAgICB9
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNsYXNzIFN0
YXRlQmFzZSA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHZp
cnR1YWwgflN0YXRlQmFzZSgpIHsgfQorCisgICAgICAgIC8vIExpbmsgdG8gdGhlIG5leHQgc3Rh
dGUgdG8gZm9ybSBhIHN0YWNrLgorICAgICAgICBTdGF0ZUJhc2UqIG5leHRTdGF0ZSgpIHsgcmV0
dXJuIG1fbmV4dDsgfQorICAgICAgICB2b2lkIHNldE5leHRTdGF0ZShTdGF0ZUJhc2UqIG5leHQp
IHsgbV9uZXh0ID0gbmV4dDsgfQorCisgICAgICAgIC8vIENvbXBvc2l0ZSBvYmplY3Qgd2UncmUg
cHJvY2Vzc2luZyBpbiB0aGlzIHN0YXRlLgorICAgICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4g
Y29tcG9zaXRlKCkgeyByZXR1cm4gbV9jb21wb3NpdGU7IH0KKworICAgICAgICAvLyBTZXJpYWxp
emF0aW9uIHRhZyBmb3IgdGhlIGN1cnJlbnQgY29tcG9zaXRlLgorICAgICAgICB2aXJ0dWFsIFNl
cmlhbGl6YXRpb25UYWcgdGFnKCkgY29uc3QgPSAwOworCisgICAgICAgIC8vIFJldHVybnMgd2hl
dGhlciBpdGVyYXRpb24gb3ZlciBzdWJvYmplY3RzIG9mIHRoZSBjdXJyZW50CisgICAgICAgIC8v
IGNvbXBvc2l0ZSBvYmplY3QgaXMgZG9uZS4gSWYgeWVzLCB8Kmxlbmd0aHwgaXMgc2V0IHRvIHRo
ZQorICAgICAgICAvLyBudW1iZXIgb2Ygc3Vib2JqZWN0cy4KKyAgICAgICAgdmlydHVhbCBib29s
IGlzRG9uZShpbnQqIGxlbmd0aCkgPSAwOworCisgICAgICAgIC8vIEFkdmFuY2VzIHRvIHRoZSBu
ZXh0IHN1Ym9iamVjdC4KKyAgICAgICAgLy8gUmVxdWlyZXM6ICF0aGlzLT5pc0RvbmUoKS4KKyAg
ICAgICAgdmlydHVhbCB2ODo6TG9jYWw8djg6OlZhbHVlPiBhZHZhbmNlKCkgPSAwOworCisgICAg
ICBwcm90ZWN0ZWQ6CisgICAgICAgIFN0YXRlQmFzZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29t
cG9zaXRlKQorICAgICAgICAgICAgOiBtX25leHQoMCkKKyAgICAgICAgICAgICwgbV9jb21wb3Np
dGUoY29tcG9zaXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgcHJpdmF0ZToKKyAg
ICAgICAgU3RhdGVCYXNlKiBtX25leHQ7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBt
X2NvbXBvc2l0ZTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIFNlcmlhbGl6
YXRpb25UYWcgY29tcG9zaXRlVGFnPgorICAgIGNsYXNzIFN0YXRlIDogcHVibGljIFN0YXRlQmFz
ZSB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHY4OjpIYW5kbGU8VD4gY29tcG9zaXRlKCkgeyBy
ZXR1cm4gaGFuZGxlQ2FzdDxUPihTdGF0ZUJhc2U6OmNvbXBvc2l0ZSgpKTsgfQorCisgICAgICAg
IHZpcnR1YWwgU2VyaWFsaXphdGlvblRhZyB0YWcoKSBjb25zdCB7IHJldHVybiBjb21wb3NpdGVU
YWc7IH0KKworICAgICAgcHJvdGVjdGVkOgorICAgICAgICBleHBsaWNpdCBTdGF0ZSh2ODo6SGFu
ZGxlPFQ+IGNvbXBvc2l0ZSkgOiBTdGF0ZUJhc2UoY29tcG9zaXRlKQorICAgICAgICB7CisgICAg
ICAgIH0KKyAgICB9OworCisgICAgLy8gSGVscGVyIHRvIGNsZWFuIHVwIHRoZSBzdGF0ZSBzdGFj
ayBpbiBjYXNlIG9mIGVycm9ycy4KKyAgICBjbGFzcyBTdGFja0NsZWFuZXIgOiBOb25jb3B5YWJs
ZSB7CisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFN0YWNrQ2xlYW5lcihTdGF0ZUJh
c2UqKiBzdGFjaykgOiBtX3N0YWNrKHN0YWNrKQorICAgICAgICB7CisgICAgICAgIH0KKworICAg
ICAgICB+U3RhY2tDbGVhbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdGVCYXNlKiBz
dGF0ZSA9ICptX3N0YWNrOworICAgICAgICAgICAgd2hpbGUgKHN0YXRlKSB7CisgICAgICAgICAg
ICAgICAgU3RhdGVCYXNlKiB0bXAgPSBzdGF0ZS0+bmV4dFN0YXRlKCk7CisgICAgICAgICAgICAg
ICAgZGVsZXRlIHN0YXRlOworICAgICAgICAgICAgICAgIHN0YXRlID0gdG1wOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgKm1fc3RhY2sgPSAwOworICAgICAgICB9CisKKyAgICAgIHByaXZh
dGU6CisgICAgICAgIFN0YXRlQmFzZSoqIG1fc3RhY2s7CisgICAgfTsKKworICAgIGNsYXNzIEFy
cmF5U3RhdGUgOiBwdWJsaWMgU3RhdGU8djg6OkFycmF5LCBBcnJheVRhZz4geworICAgICAgcHVi
bGljOgorICAgICAgICBBcnJheVN0YXRlKHY4OjpIYW5kbGU8djg6OkFycmF5PiBhcnJheSkKKyAg
ICAgICAgICAgIDogU3RhdGU8djg6OkFycmF5LCBBcnJheVRhZz4oYXJyYXkpCisgICAgICAgICAg
ICAsIG1faW5kZXgoMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBi
b29sIGlzRG9uZShpbnQqIGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgKmxlbmd0aCA9
IGNvbXBvc2l0ZSgpLT5MZW5ndGgoKTsKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4ID49ICps
ZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHY4OjpMb2NhbDx2ODo6VmFsdWU+
IGFkdmFuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQobV9pbmRleCA8IGNvbXBv
c2l0ZSgpLT5MZW5ndGgoKSk7CisgICAgICAgICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7Cisg
ICAgICAgICAgICByZXR1cm4gc2NvcGUuQ2xvc2UoY29tcG9zaXRlKCktPkdldCh2ODo6SW50ZWdl
cjo6TmV3KG1faW5kZXgrKykpKTsKKyAgICAgICAgfQorCisgICAgICBwcml2YXRlOgorICAgICAg
ICBpbnQgbV9pbmRleDsKKyAgICB9OworCisgICAgY2xhc3MgT2JqZWN0U3RhdGUgOiBwdWJsaWMg
U3RhdGU8djg6Ok9iamVjdCwgT2JqZWN0VGFnPiB7CisgICAgICBwdWJsaWM6CisgICAgICAgIE9i
amVjdFN0YXRlKHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqZWN0KQorICAgICAgICAgICAgOiBT
dGF0ZTx2ODo6T2JqZWN0LCBPYmplY3RUYWc+KG9iamVjdCkKKyAgICAgICAgICAgICwgbV9wcm9w
ZXJ0eU5hbWVzKG9iamVjdC0+R2V0UHJvcGVydHlOYW1lcygpKQorICAgICAgICAgICAgLCBtX2lu
ZGV4KC0xKQorICAgICAgICAgICAgLCBtX2xlbmd0aCgwKQorICAgICAgICB7CisgICAgICAgICAg
ICBuZXh0UHJvcGVydHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0Rv
bmUoaW50KiBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgICpsZW5ndGggPSBtX2xlbmd0
aDsKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4ID49IDIgKiBtX3Byb3BlcnR5TmFtZXMtPkxl
bmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2ODo6TG9jYWw8djg6OlZhbHVl
PiBhZHZhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKG1faW5kZXggPCAyICog
bV9wcm9wZXJ0eU5hbWVzLT5MZW5ndGgoKSk7CisgICAgICAgICAgICBpZiAoIShtX2luZGV4ICUg
MikpIHsKKyAgICAgICAgICAgICAgICArK21faW5kZXg7CisgICAgICAgICAgICAgICAgcmV0dXJu
IG1fcHJvcGVydHlOYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdjg6OkxvY2FsPHY4
OjpWYWx1ZT4gcmVzdWx0ID0gY29tcG9zaXRlKCktPkdldChtX3Byb3BlcnR5TmFtZSk7CisgICAg
ICAgICAgICBuZXh0UHJvcGVydHkoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAg
ICAgIH0KKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBuZXh0UHJvcGVydHkoKQorICAg
ICAgICB7CisgICAgICAgICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgICAgICAgICAr
K21faW5kZXg7CisgICAgICAgICAgICBBU1NFUlQoIShtX2luZGV4ICUgMikpOworICAgICAgICAg
ICAgZm9yICg7IG1faW5kZXggPCAyICogbV9wcm9wZXJ0eU5hbWVzLT5MZW5ndGgoKTsgbV9pbmRl
eCArPSAyKSB7CisgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcHJvcGVydHlO
YW1lID0gbV9wcm9wZXJ0eU5hbWVzLT5HZXQodjg6OkludGVnZXI6Ok5ldyhtX2luZGV4IC8gMikp
OworICAgICAgICAgICAgICAgIGlmICgocHJvcGVydHlOYW1lLT5Jc1N0cmluZygpICYmIGNvbXBv
c2l0ZSgpLT5IYXNSZWFsTmFtZWRQcm9wZXJ0eShoYW5kbGVDYXN0PHY4OjpTdHJpbmc+KHByb3Bl
cnR5TmFtZSkpKQorICAgICAgICAgICAgICAgICAgICB8fCAocHJvcGVydHlOYW1lLT5Jc0ludDMy
KCkgJiYgY29tcG9zaXRlKCktPkhhc1JlYWxJbmRleGVkUHJvcGVydHkocHJvcGVydHlOYW1lLT5V
aW50MzJWYWx1ZSgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9wcm9wZXJ0eU5hbWUgPSBz
Y29wZS5DbG9zZShwcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgICAgICAgICBtX2xlbmd0aCAr
PSAyOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpBcnJheT4gbV9w
cm9wZXJ0eU5hbWVzOworICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBtX3Byb3BlcnR5TmFt
ZTsKKyAgICAgICAgaW50IG1faW5kZXg7CisgICAgICAgIGludCBtX2xlbmd0aDsKKyAgICB9Owor
CisgICAgYm9vbCBkb1NlcmlhbGl6ZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUpCisgICAg
eworICAgICAgICBpZiAodmFsdWUtPklzVW5kZWZpbmVkKCkpIHsKKyAgICAgICAgICAgIG1fd3Jp
dGVyLndyaXRlVW5kZWZpbmVkKCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUtPklzTnVsbCgp
KSB7CisgICAgICAgICAgICBtX3dyaXRlci53cml0ZU51bGwoKTsKKyAgICAgICAgfSBlbHNlIGlm
ICh2YWx1ZS0+SXNUcnVlKCkpIHsKKyAgICAgICAgICAgIG1fd3JpdGVyLndyaXRlVHJ1ZSgpOwor
ICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc0ZhbHNlKCkpIHsKKyAgICAgICAgICAgIG1fd3Jp
dGVyLndyaXRlRmFsc2UoKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+SXNTdHJpbmcoKSkg
eworICAgICAgICAgICAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN0cmluZ1ZhbHVlKHZhbHVlKTsK
KyAgICAgICAgICAgIG1fd3JpdGVyLndyaXRlU3RyaW5nKCpzdHJpbmdWYWx1ZSwgc3RyaW5nVmFs
dWUubGVuZ3RoKCkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc0ludDMyKCkpIHsKKyAg
ICAgICAgICAgIG1fd3JpdGVyLndyaXRlSW50MzIodmFsdWUtPkludDMyVmFsdWUoKSk7CisgICAg
ICAgIH0gZWxzZSBpZiAodmFsdWUtPklzTnVtYmVyKCkpIHsKKyAgICAgICAgICAgIG1fd3JpdGVy
LndyaXRlTnVtYmVyKGhhbmRsZUNhc3Q8djg6Ok51bWJlcj4odmFsdWUpLT5WYWx1ZSgpKTsKKyAg
ICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+SXNBcnJheSgpKSB7CisgICAgICAgICAgICBpZiAoIWNo
ZWNrQ29tcG9zaXRlKHZhbHVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICBwdXNoKG5ldyBBcnJheVN0YXRlKGhhbmRsZUNhc3Q8djg6OkFycmF5Pih2YWx1ZSkp
KTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+SXNPYmplY3QoKSkgeworICAgICAgICAgICAg
aWYgKCFjaGVja0NvbXBvc2l0ZSh2YWx1ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgcHVzaChuZXcgT2JqZWN0U3RhdGUoaGFuZGxlQ2FzdDx2ODo6T2JqZWN0
Pih2YWx1ZSkpKTsKKyAgICAgICAgICAgIC8vIEZJWE1FOgorICAgICAgICAgICAgLy8gLSBjaGVj
ayBub3QgYSB3cmFwcGVyCisgICAgICAgICAgICAvLyAtIHN1cHBvcnQgRmlsZSwgSW1hZ2VEYXRh
LCBldGMuCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9p
ZCBwdXNoKFN0YXRlQmFzZSogc3RhdGUpCisgICAgeworICAgICAgICBzdGF0ZS0+c2V0TmV4dFN0
YXRlKG1fc3RhdGUpOworICAgICAgICBtX3N0YXRlID0gc3RhdGU7CisgICAgICAgICsrbV9kZXB0
aDsKKyAgICB9CisKKyAgICBTdGF0ZUJhc2UqIHRvcCgpIHsgcmV0dXJuIG1fc3RhdGU7IH0KKwor
ICAgIHZvaWQgcG9wKCkKKyAgICB7CisgICAgICAgIGlmICghbV9zdGF0ZSkKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgU3RhdGVCYXNlKiB0b3AgPSBtX3N0YXRlOworICAgICAgICBtX3N0
YXRlID0gdG9wLT5uZXh0U3RhdGUoKTsKKyAgICAgICAgZGVsZXRlIHRvcDsKKyAgICAgICAgLS1t
X2RlcHRoOworICAgIH0KKworICAgIGJvb2wgY2hlY2tDb21wb3NpdGUodjg6OkhhbmRsZTx2ODo6
VmFsdWU+IGNvbXBvc2l0ZSkKKyAgICB7CisgICAgICAgIGlmIChtX2RlcHRoID4gbWF4RGVwdGgp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghc2hvdWxkQ2hlY2tGb3JD
eWNsZXMobV9kZXB0aCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZm9yIChT
dGF0ZUJhc2UqIHN0YXRlID0gdG9wKCk7IHN0YXRlOyBzdGF0ZSA9IHN0YXRlLT5uZXh0U3RhdGUo
KSkgeworICAgICAgICAgICAgaWYgKHN0YXRlLT5jb21wb3NpdGUoKSA9PSBjb21wb3NpdGUpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0
cnVlOworICAgIH0KKworICAgIFdyaXRlciYgbV93cml0ZXI7CisgICAgU3RhdGVCYXNlKiBtX3N0
YXRlOworICAgIGludCBtX2RlcHRoOworfTsKKworLy8gUmVhZGVyIGlzIHJlc3BvbnNpYmxlIGZv
ciBkZXNlcmlhbGl6aW5nIHByaW1pdGl2ZSB0eXBlcyBhbmQKKy8vIHJlc3RvcmluZyBpbmZvcm1h
dGlvbiBhYm91dCBzYXZlZCBvYmplY3RzIG9mIGNvbXBvc2l0ZSB0eXBlcy4KK2NsYXNzIFJlYWRl
ciB7CisgIHB1YmxpYzoKKyAgICBSZWFkZXIoY29uc3QgY2hhciogYnVmZmVyLCBpbnQgbGVuZ3Ro
KQorICAgICAgICA6IG1fYnVmZmVyKGJ1ZmZlcikKKyAgICAgICAgLCBtX2xlbmd0aChsZW5ndGgp
CisgICAgICAgICwgbV9wb3MoMCkKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBpc0VvZigpIGNv
bnN0IHsgcmV0dXJuIG1fcG9zID49IG1fbGVuZ3RoOyB9CisKKyAgICBib29sIHJlYWQoU2VyaWFs
aXphdGlvblRhZyogdGFnLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4qIHZhbHVlLCBpbnQqIGxlbmd0
aCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHJhd0xlbmd0aDsKKyAgICAgICAgaWYgKCFyZWFk
VGFnKHRhZykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHN3aXRjaCAoKnRh
ZykgeworICAgICAgICBjYXNlIFBhZGRpbmdUYWc6CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBVbmRlZmluZWRUYWc6CisgICAgICAgICAgICAqdmFsdWUgPSB2ODo6VW5kZWZpbmVk
KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOdWxsVGFnOgorICAgICAgICAg
ICAgKnZhbHVlID0gdjg6Ok51bGwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IFRydWVUYWc6CisgICAgICAgICAgICAqdmFsdWUgPSB2ODo6VHJ1ZSgpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgRmFsc2VUYWc6CisgICAgICAgICAgICAqdmFsdWUgPSB2ODo6
RmFsc2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0cmluZ1RhZzoKKyAg
ICAgICAgICAgIGlmICghcmVhZFN0cmluZyh2YWx1ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSW50MzJUYWc6CisgICAg
ICAgICAgICBpZiAoIXJlYWRJbnQzMih2YWx1ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTnVtYmVyVGFnOgorICAgICAg
ICAgICAgaWYgKCFyZWFkTnVtYmVyKHZhbHVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPYmplY3RUYWc6CisgICAgICAg
IGNhc2UgQXJyYXlUYWc6CisgICAgICAgICAgICBpZiAoIWRvUmVhZFVpbnQzMigmcmF3TGVuZ3Ro
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAqbGVuZ3RoID0g
cmF3TGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCByZWFkVGFnKFNlcmlhbGl6YXRp
b25UYWcqIHRhZykKKyAgICB7CisgICAgICAgIGlmIChtX3BvcyA+PSBtX2xlbmd0aCkKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgKnRhZyA9IHN0YXRpY19jYXN0PFNlcmlhbGl6
YXRpb25UYWc+KG1fYnVmZmVyW21fcG9zKytdKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
fQorCisgICAgYm9vbCByZWFkU3RyaW5nKHY4OjpIYW5kbGU8djg6OlZhbHVlPiogdmFsdWUpCisg
ICAgeworICAgICAgICB1aW50MzJfdCBsZW5ndGg7CisgICAgICAgIGlmICghZG9SZWFkVWludDMy
KCZsZW5ndGgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobV9wb3Mg
KyBsZW5ndGggPiBtX2xlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
KnZhbHVlID0gdjg6OlN0cmluZzo6TmV3KG1fYnVmZmVyICsgbV9wb3MsIGxlbmd0aCk7CisgICAg
ICAgIG1fcG9zICs9IGxlbmd0aDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAg
Ym9vbCByZWFkSW50MzIodjg6OkhhbmRsZTx2ODo6VmFsdWU+KiB2YWx1ZSkKKyAgICB7CisgICAg
ICAgIHVpbnQzMl90IHJhd1ZhbHVlOworICAgICAgICBpZiAoIWRvUmVhZFVpbnQzMigmcmF3VmFs
dWUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAqdmFsdWUgPSB2ODo6SW50
ZWdlcjo6TmV3KHN0YXRpY19jYXN0PGludDMyX3Q+KFppZ1phZzo6ZGVjb2RlKHJhd1ZhbHVlKSkp
OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIHJlYWROdW1iZXIodjg6
OkhhbmRsZTx2ODo6VmFsdWU+KiB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmIChtX3BvcyArIHNp
emVvZihkb3VibGUpID4gbV9sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIGRvdWJsZSBudW1iZXI7CisgICAgICAgIGNoYXIqIG51bWJlckFzQnl0ZUFycmF5ID0gcmVp
bnRlcnByZXRfY2FzdDxjaGFyKj4oJm51bWJlcik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgc2l6ZW9mKGRvdWJsZSk7ICsraSkKKyAgICAgICAgICAgIG51bWJlckFzQnl0ZUFycmF5W2ld
ID0gbV9idWZmZXJbbV9wb3MrK107CisgICAgICAgICp2YWx1ZSA9IHY4OjpOdW1iZXI6Ok5ldyhu
dW1iZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGRvUmVhZFVp
bnQzMih1aW50MzJfdCogdmFsdWUpCisgICAgeworICAgICAgICAqdmFsdWUgPSAwOworICAgICAg
ICBjaGFyIGN1cnJlbnRCeXRlOworICAgICAgICBpbnQgc2hpZnQgPSAwOworICAgICAgICBkbyB7
CisgICAgICAgICAgICBpZiAobV9wb3MgPj0gbV9sZW5ndGgpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgY3VycmVudEJ5dGUgPSBtX2J1ZmZlclttX3BvcysrXTsK
KyAgICAgICAgICAgICp2YWx1ZSB8PSAoKGN1cnJlbnRCeXRlICYgdmFySW50TWFzaykgPDwgc2hp
ZnQpOworICAgICAgICAgICAgc2hpZnQgKz0gdmFySW50U2hpZnQ7CisgICAgICAgIH0gd2hpbGUg
KGN1cnJlbnRCeXRlICYgKDEgPDwgdmFySW50U2hpZnQpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorCisgICAgY29uc3QgY2hhciogbV9idWZmZXI7CisgICAgY29uc3QgaW50IG1fbGVu
Z3RoOworICAgIGludCBtX3BvczsKK307CisKK2NsYXNzIERlc2VyaWFsaXplciB7CisgIHB1Ymxp
YzoKKyAgICBleHBsaWNpdCBEZXNlcmlhbGl6ZXIoUmVhZGVyJiByZWFkZXIpIDogbV9yZWFkZXIo
cmVhZGVyKQorICAgIHsKKyAgICB9CisKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBkZXNlcmlh
bGl6ZSgpCisgICAgeworICAgICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgICAgIHdo
aWxlICghbV9yZWFkZXIuaXNFb2YoKSkgeworICAgICAgICAgICAgaWYgKCFkb0Rlc2VyaWFsaXpl
KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisgICAg
ICAgIH0KKyAgICAgICAgaWYgKHN0YWNrRGVwdGgoKSAhPSAxKQorICAgICAgICAgICAgcmV0dXJu
IHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisgICAgICAgIHJldHVybiBzY29wZS5DbG9zZShlbGVt
ZW50KDApKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBib29sIGRvRGVzZXJpYWxpemUoKQor
ICAgIHsKKyAgICAgICAgU2VyaWFsaXphdGlvblRhZyB0YWc7CisgICAgICAgIHY4OjpMb2NhbDx2
ODo6VmFsdWU+IHZhbHVlOworICAgICAgICBpbnQgbGVuZ3RoOworICAgICAgICBpZiAoIW1fcmVh
ZGVyLnJlYWQoJnRhZywgJnZhbHVlLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgaWYgKCF2YWx1ZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHB1c2godmFs
dWUpOworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBPYmplY3RUYWcpIHsKKyAgICAgICAgICAg
IGlmIChsZW5ndGggPiBzdGFja0RlcHRoKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpPYmplY3Q6
Ok5ldygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YWNrRGVwdGgoKSAtIGxlbmd0aDsg
aSA8IHN0YWNrRGVwdGgoKTsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4
OjpWYWx1ZT4gcHJvcGVydHlOYW1lID0gZWxlbWVudChpKTsKKyAgICAgICAgICAgICAgICB2ODo6
TG9jYWw8djg6OlZhbHVlPiBwcm9wZXJ0eVZhbHVlID0gZWxlbWVudChpICsgMSk7CisgICAgICAg
ICAgICAgICAgb2JqZWN0LT5TZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIHBvcChsZW5ndGgpOworICAgICAgICAgICAgcHVzaChvYmpl
Y3QpOworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBBcnJheVRhZykgeworICAgICAgICAgICAg
aWYgKGxlbmd0aCA+IHN0YWNrRGVwdGgoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBhcnJheSA9IHY4OjpBcnJheTo6TmV3
KGxlbmd0aCk7CisgICAgICAgICAgICBjb25zdCBpbnQgZGVwdGggPSBzdGFja0RlcHRoKCkgLSBs
ZW5ndGg7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdjg6OkhhbmRsZVNjb3BlIHNj
b3BlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCisg
ICAgICAgICAgICAgICAgICAgIGFycmF5LT5TZXQodjg6OkludGVnZXI6Ok5ldyhpKSwgZWxlbWVu
dChkZXB0aCArIGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcChsZW5ndGgpOwor
ICAgICAgICAgICAgcHVzaChhcnJheSk7CisgICAgICAgIH0gZWxzZSBpZiAodGFnICE9IFBhZGRp
bmdUYWcpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKworICAgIHZvaWQgcHVzaCh2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSkgeyBtX3N0
YWNrLmFwcGVuZCh2YWx1ZSk7IH0KKworICAgIHZvaWQgcG9wKGludCBsZW5ndGgpCisgICAgewor
ICAgICAgICBBU1NFUlQobGVuZ3RoID49IDApOworICAgICAgICBBU1NFUlQobGVuZ3RoIDw9IG1f
c3RhY2suc2l6ZSgpKTsKKyAgICAgICAgbV9zdGFjay5zaHJpbmsobV9zdGFjay5zaXplKCkgLSBs
ZW5ndGgpOworICAgIH0KKworICAgIGludCBzdGFja0RlcHRoKCkgY29uc3QgeyByZXR1cm4gbV9z
dGFjay5zaXplKCk7IH0KKworICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGVsZW1lbnQoaW50IGlu
ZGV4KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGluZGV4ID49IDApOworICAgICAgICBBU1NFUlQo
aW5kZXggPCBtX3N0YWNrLnNpemUoKSk7CisgICAgICAgIHJldHVybiBtX3N0YWNrW2luZGV4XTsK
KyAgICB9CisKKyAgICBSZWFkZXImIG1fcmVhZGVyOworICAgIFZlY3Rvcjx2ODo6TG9jYWw8djg6
OlZhbHVlPiA+IG1fc3RhY2s7Cit9OworCit9IC8vIG5hbWVzcGFjZQorCitTZXJpYWxpemVkU2Ny
aXB0VmFsdWU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFs
dWUpCit7CisgICAgV3JpdGVyIHdyaXRlcjsKKyAgICBTZXJpYWxpemVyIHNlcmlhbGl6ZXIod3Jp
dGVyKTsKKyAgICBpZiAoIXNlcmlhbGl6ZXIuc2VyaWFsaXplKHZhbHVlKSkgeworICAgICAgICAv
LyBGSVhNRTogdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbV9k
YXRhID0gU3RyaW5nSW1wbDo6YWRvcHQod3JpdGVyLmRhdGEoKSk7Cit9CisKK1NlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlKFN0cmluZyBkYXRhLCBib29sIHdpcmUp
Cit7CisgICAgaWYgKHdpcmUpCisgICAgICAgIG1fZGF0YSA9IGRhdGE7CisgICAgZWxzZSB7Cisg
ICAgICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+IGJ1ZmZlciA9IHV0ZjhCdWZmZXIoZGF0YSk7Cisg
ICAgICAgIFdyaXRlciB3cml0ZXI7CisgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhidWZmZXIt
PmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICBtX2RhdGEgPSBTdHJpbmdJbXBsOjph
ZG9wdCh3cml0ZXIuZGF0YSgpKTsKKyAgICB9Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZTo6ZGVzZXJpYWxpemUoKQoreworICAgIGlmICghbV9kYXRhLmlt
cGwoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisgICAgUmVhZGVy
IHJlYWRlcihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihtX2RhdGEuaW1wbCgpLT5jaGFy
YWN0ZXJzKCkpLCAyICogbV9kYXRhLmxlbmd0aCgpKTsKKyAgICBEZXNlcmlhbGl6ZXIgZGVzZXJp
YWxpemVyKHJlYWRlcik7CisgICAgcmV0dXJuIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZSgpOwor
fQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdz
L3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxp
emVkU2NyaXB0VmFsdWUuaAppbmRleCAyNmE0MTk5Li41NjdiOTM2IDEwMDY0NAotLS0gYS9XZWJD
b3JlL2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oCisrKyBiL1dlYkNvcmUvYmlu
ZGluZ3MvdjgvU2VyaWFsaXplZFNjcmlwdFZhbHVlLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICog
Q29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQwLDExICs0MCwyNiBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKIGNsYXNzIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSA6IHB1YmxpYyBSZWZD
b3VudGVkPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gewogcHVibGljOgotICAgIHN0YXRpYyBQYXNz
UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gY3JlYXRlKFN0cmluZyBzdHJpbmcpCisgICAg
Ly8gQ3JlYXRlcyBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFY4IHZh
bHVlLgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gY3JlYXRl
KHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBhZG9w
dFJlZihuZXcgU2VyaWFsaXplZFNjcmlwdFZhbHVlKHN0cmluZykpOworICAgICAgICByZXR1cm4g
YWRvcHRSZWYobmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSh2YWx1ZSkpOwogICAgIH0KIAorICAg
IC8vIENyZWF0ZXMgYSBzZXJpYWxpemVkIHZhbHVlIHdpdGggdGhlIGdpdmVuIGRhdGEgb2J0YWlu
ZWQgZnJvbSBhCisgICAgLy8gcHJpb3IgY2FsbCB0byB0b1dpcmVTdHJpbmcoKS4KKyAgICBzdGF0
aWMgUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGNyZWF0ZUZyb21XaXJlKFN0cmlu
ZyBkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2Ny
aXB0VmFsdWUoZGF0YSwgdHJ1ZSkpOworICAgIH0KKworICAgIC8vIENyZWF0ZXMgYSBzZXJpYWxp
emVkIHJlcHJlc2VudGF0aW9uIG9mIFdlYkNvcmUgc3RyaW5nLgorICAgIHN0YXRpYyBQYXNzUmVm
UHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gY3JlYXRlKFN0cmluZyBkYXRhKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUoZGF0YSwgZmFs
c2UpKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGVzIGFuIGVtcHR5IHNlcmlhbGl6ZWQgdmFsdWUu
CiAgICAgc3RhdGljIFBhc3NSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBjcmVhdGUoKQog
ICAgIHsKICAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUo
KSk7CkBAIC01MiwyMyArNjcsMjQgQEAgcHVibGljOgogCiAgICAgUGFzc1JlZlB0cjxTZXJpYWxp
emVkU2NyaXB0VmFsdWU+IHJlbGVhc2UoKQogICAgIHsKLSAgICAgICAgUmVmUHRyPFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZT4gcmVzdWx0ID0gYWRvcHRSZWYobmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZShtX2RhdGEpKTsKKyAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gcmVzdWx0
ID0gYWRvcHRSZWYobmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShtX2RhdGEsIHRydWUpKTsKICAg
ICAgICAgbV9kYXRhID0gU3RyaW5nKCk7CiAgICAgICAgIHJldHVybiByZXN1bHQucmVsZWFzZSgp
OwogICAgIH0KIAotICAgIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4g
bV9kYXRhOwotICAgIH0KKyAgICBTdHJpbmcgdG9XaXJlU3RyaW5nKCkgY29uc3QgeyByZXR1cm4g
bV9kYXRhOyB9CiAKLXByaXZhdGU6Ci0gICAgU2VyaWFsaXplZFNjcmlwdFZhbHVlKFN0cmluZyBz
dHJpbmcpCi0gICAgICAgIDogbV9kYXRhKHN0cmluZykKLSAgICB7Ci0gICAgfQorICAgIC8vIERl
c2VyaWFsaXplcyB0aGUgdmFsdWUgKGluIHRoZSBjdXJyZW50IGNvbnRleHQpLiBSZXR1cm5zIGFu
CisgICAgLy8gZW1wdHkgaGFuZGxlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAgICB2ODo6TG9jYWw8
djg6OlZhbHVlPiBkZXNlcmlhbGl6ZSgpOwogCitwcml2YXRlOgogICAgIFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZSgpIHsgfQorCisgICAgZXhwbGljaXQgU2VyaWFsaXplZFNjcmlwdFZhbHVlKHY4OjpI
YW5kbGU8djg6OlZhbHVlPiB2YWx1ZSk7CisKKyAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWUoU3Ry
aW5nIGRhdGEsIGJvb2wgd2lyZSk7CisKICAgICBTdHJpbmcgbV9kYXRhOwogfTsKIApkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dDdXN0b20uY3BwIGIv
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dDdXN0b20uY3BwCmluZGV4IGFh
NWI2YTYuLjBjYTk3MzAgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
RE9NV2luZG93Q3VzdG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERP
TVdpbmRvd0N1c3RvbS5jcHAKQEAgLTQxMCw3ICs0MTAsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gVjhET01XaW5kb3c6OnBvc3RNZXNzYWdlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYg
YXJncwogICAgIEFTU0VSVChzb3VyY2UtPmZyYW1lKCkpOwogCiAgICAgdjg6OlRyeUNhdGNoIHRy
eUNhdGNoOwotICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJp
YWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAg
IFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0
VmFsdWU6OmNyZWF0ZShhcmdzWzBdKTsKICAgICBNZXNzYWdlUG9ydEFycmF5IHBvcnRBcnJheTsK
ICAgICBTdHJpbmcgdGFyZ2V0T3JpZ2luOwogCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOERlZGljYXRlZFdvcmtlckNvbnRleHRDdXN0b20uY3BwIGIvV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhEZWRpY2F0ZWRXb3JrZXJDb250ZXh0Q3VzdG9tLmNwcAppbmRl
eCAwMmMxNDUzLi44NDJhMzRlIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOERlZGljYXRlZFdvcmtlckNvbnRleHRDdXN0b20uY3BwCisrKyBiL1dlYkNvcmUvYmluZGlu
Z3MvdjgvY3VzdG9tL1Y4RGVkaWNhdGVkV29ya2VyQ29udGV4dEN1c3RvbS5jcHAKQEAgLTQ2LDcg
KzQ2LDcgQEAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4RGVkaWNhdGVkV29ya2VyQ29udGV4dDo6
cG9zdE1lc3NhZ2VDYWxsYmFjayhjb25zdCB2ODo6QXIKIHsKICAgICBJTkNfU1RBVFMoTCJET00u
RGVkaWNhdGVkV29ya2VyQ29udGV4dC5wb3N0TWVzc2FnZSIpOwogICAgIERlZGljYXRlZFdvcmtl
ckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBWOERPTVdyYXBwZXI6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxEZWRpY2F0ZWRXb3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6OkRFRElDQVRFRFdPUktF
UkNPTlRFWFQsIGFyZ3MuSG9sZGVyKCkpOwotICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFs
dWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh2OFZhbHVlVG9XZWJD
b3JlU3RyaW5nKGFyZ3NbMF0pKTsKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBt
ZXNzYWdlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoYXJnc1swXSk7CiAgICAgTWVz
c2FnZVBvcnRBcnJheSBwb3J0QXJyYXk7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAxKSB7CiAg
ICAgICAgIGlmICghZ2V0TWVzc2FnZVBvcnRBcnJheShhcmdzWzFdLCBwb3J0QXJyYXkpKQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIaXN0b3J5Q3VzdG9tLmNwcCBi
L1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SGlzdG9yeUN1c3RvbS5jcHAKaW5kZXggZTkx
OTUyNC4uODVkNjc5MyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhI
aXN0b3J5Q3VzdG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhpc3Rv
cnlDdXN0b20uY3BwCkBAIC00Myw3ICs0Myw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdjg6
OkhhbmRsZTx2ODo6VmFsdWU+IFY4SGlzdG9yeTo6cHVzaFN0YXRlQ2FsbGJhY2soY29uc3Qgdjg6
OkFyZ3VtZW50cyYgYXJncykKIHsKLSAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBo
aXN0b3J5U3RhdGUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJp
bmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGhpc3RvcnlT
dGF0ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFyZ3NbMF0pOwogCiAgICAgdjg6
OlRyeUNhdGNoIHRyeUNhdGNoOwogICAgIFN0cmluZyB0aXRsZSA9IHRvV2ViQ29yZVN0cmluZ1dp
dGhOdWxsT3JVbmRlZmluZWRDaGVjayhhcmdzWzFdKTsKQEAgLTY0LDcgKzY0LDcgQEAgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IFY4SGlzdG9yeTo6cHVzaFN0YXRlQ2FsbGJhY2soY29uc3Qgdjg6OkFy
Z3VtZW50cyYgYXJncykKIAogdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4SGlzdG9yeTo6cmVwbGFj
ZVN0YXRlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKIHsKLSAgICBSZWZQdHI8
U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBoaXN0b3J5U3RhdGUgPSBTZXJpYWxpemVkU2NyaXB0VmFs
dWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxp
emVkU2NyaXB0VmFsdWU+IGhpc3RvcnlTdGF0ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3Jl
YXRlKGFyZ3NbMF0pOwogCiAgICAgdjg6OlRyeUNhdGNoIHRyeUNhdGNoOwogICAgIFN0cmluZyB0
aXRsZSA9IHRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsT3JVbmRlZmluZWRDaGVjayhhcmdzWzFdKTsK
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3Vz
dG9tLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3VzdG9t
LmNwcAppbmRleCA3ZWIxMGUxLi41NTdiMTliIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOE1lc3NhZ2VFdmVudEN1c3RvbS5jcHAKKysrIGIvV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhNZXNzYWdlRXZlbnRDdXN0b20uY3BwCkBAIC02NSw3ICs2NSw3IEBAIHY4
OjpIYW5kbGU8djg6OlZhbHVlPiBWOE1lc3NhZ2VFdmVudDo6aW5pdE1lc3NhZ2VFdmVudENhbGxi
YWNrKGNvbnN0IHY4OjpBcmd1bWVuCiAgICAgU3RyaW5nIHR5cGVBcmcgPSB2OFZhbHVlVG9XZWJD
b3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgIGJvb2wgY2FuQnViYmxlQXJnID0gYXJnc1sxXS0+Qm9v
bGVhblZhbHVlKCk7CiAgICAgYm9vbCBjYW5jZWxhYmxlQXJnID0gYXJnc1syXS0+Qm9vbGVhblZh
bHVlKCk7Ci0gICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gZGF0YUFyZyA9IFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcoYXJnc1szXSkp
OworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGRhdGFBcmcgPSBTZXJpYWxpemVk
U2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzNdKTsKICAgICBTdHJpbmcgb3JpZ2luQXJnID0gdjhW
YWx1ZVRvV2ViQ29yZVN0cmluZyhhcmdzWzRdKTsKICAgICBTdHJpbmcgbGFzdEV2ZW50SWRBcmcg
PSB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKGFyZ3NbNV0pOwogICAgIERPTVdpbmRvdyogc291cmNl
QXJnID0gVjhET01XaW5kb3c6Okhhc0luc3RhbmNlKGFyZ3NbNl0pID8gVjhET01XcmFwcGVyOjpj
b252ZXJ0VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywg
djg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdChhcmdzWzZdKSkgOiAwOwpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdlUG9ydEN1c3RvbS5jcHAgYi9XZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3VzdG9tLmNwcAppbmRleCAwMWJl
NjYxLi5mN2QwNDVjIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1l
c3NhZ2VQb3J0Q3VzdG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1l
c3NhZ2VQb3J0Q3VzdG9tLmNwcApAQCAtNzgsNyArNzgsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gVjhNZXNzYWdlUG9ydDo6cG9zdE1lc3NhZ2VDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRz
JiBhcgogewogICAgIElOQ19TVEFUUygiRE9NLk1lc3NhZ2VQb3J0LnBvc3RNZXNzYWdlIik7CiAg
ICAgTWVzc2FnZVBvcnQqIG1lc3NhZ2VQb3J0ID0gVjhET01XcmFwcGVyOjpjb252ZXJ0VG9OYXRp
dmVPYmplY3Q8TWVzc2FnZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIGFyZ3MuSG9s
ZGVyKCkpOwotICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJp
YWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAg
IFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0
VmFsdWU6OmNyZWF0ZShhcmdzWzBdKTsKICAgICBNZXNzYWdlUG9ydEFycmF5IHBvcnRBcnJheTsK
ICAgICBpZiAoYXJncy5MZW5ndGgoKSA+IDEpIHsKICAgICAgICAgaWYgKCFnZXRNZXNzYWdlUG9y
dEFycmF5KGFyZ3NbMV0sIHBvcnRBcnJheSkpCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOFBvcFN0YXRlRXZlbnRDdXN0b20uY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhQb3BTdGF0ZUV2ZW50Q3VzdG9tLmNwcAppbmRleCBkNjgzMDI1Li45NmNiOGUx
IDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFBvcFN0YXRlRXZlbnRD
dXN0b20uY3BwCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4UG9wU3RhdGVFdmVu
dEN1c3RvbS5jcHAKQEAgLTQ0LDcgKzQ0LDcgQEAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UG9w
U3RhdGVFdmVudDo6aW5pdFBvcFN0YXRlRXZlbnRDYWxsYmFjayhjb25zdCB2ODo6QXJndW0KICAg
ICBTdHJpbmcgdHlwZUFyZyA9IHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAg
Ym9vbCBjYW5CdWJibGVBcmcgPSBhcmdzWzFdLT5Cb29sZWFuVmFsdWUoKTsKICAgICBib29sIGNh
bmNlbGFibGVBcmcgPSBhcmdzWzJdLT5Cb29sZWFuVmFsdWUoKTsKLSAgICBSZWZQdHI8U2VyaWFs
aXplZFNjcmlwdFZhbHVlPiBzdGF0ZUFyZyA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRl
KHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcoYXJnc1szXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVk
U2NyaXB0VmFsdWU+IHN0YXRlQXJnID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoYXJn
c1szXSk7CiAKICAgICBQb3BTdGF0ZUV2ZW50KiBldmVudCA9IFY4RE9NV3JhcHBlcjo6Y29udmVy
dFRvTmF0aXZlT2JqZWN0PFBvcFN0YXRlRXZlbnQ+KFY4Q2xhc3NJbmRleDo6UE9QU1RBVEVFVkVO
VCwgYXJncy5Ib2xkZXIoKSk7CiAgICAgZXZlbnQtPmluaXRQb3BTdGF0ZUV2ZW50KHR5cGVBcmcs
IGNhbkJ1YmJsZUFyZywgY2FuY2VsYWJsZUFyZywgc3RhdGVBcmcucmVsZWFzZSgpKTsKQEAgLTYx
LDcgKzYxLDcgQEAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UG9wU3RhdGVFdmVudDo6c3RhdGVB
Y2Nlc3NvckdldHRlcih2ODo6TG9jYWw8djg6OlN0cmluZz4KICAgICBpZiAoIXN0YXRlKQogICAg
ICAgICByZXR1cm4gdjg6Ok51bGwoKTsKIAotICAgIHJldHVybiB2OFN0cmluZ09yTnVsbChzdGF0
ZS0+dG9TdHJpbmcoKSk7CisgICAgcmV0dXJuIHN0YXRlLT5kZXNlcmlhbGl6ZSgpOwogfQogCiB9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOFdvcmtlckN1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdv
cmtlckN1c3RvbS5jcHAKaW5kZXggMWNiZTBhNS4uNzFiZjlmMCAxMDA2NDQKLS0tIGEvV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhXb3JrZXJDdXN0b20uY3BwCisrKyBiL1dlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4V29ya2VyQ3VzdG9tLmNwcApAQCAtOTIsNyArOTIsNyBAQCB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gVjhXb3JrZXI6OnBvc3RNZXNzYWdlQ2FsbGJhY2soY29uc3Qgdjg6
OkFyZ3VtZW50cyYgYXJncykKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Xb3JrZXIucG9zdE1lc3Nh
Z2UiKTsKICAgICBXb3JrZXIqIHdvcmtlciA9IFY4RE9NV3JhcHBlcjo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PFdvcmtlcj4oVjhDbGFzc0luZGV4OjpXT1JLRVIsIGFyZ3MuSG9sZGVyKCkpOwotICAg
IFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0
VmFsdWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJp
YWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0
ZShhcmdzWzBdKTsKICAgICBNZXNzYWdlUG9ydEFycmF5IHBvcnRBcnJheTsKICAgICBpZiAoYXJn
cy5MZW5ndGgoKSA+IDEpIHsKICAgICAgICAgaWYgKCFnZXRNZXNzYWdlUG9ydEFycmF5KGFyZ3Nb
MV0sIHBvcnRBcnJheSkpCmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nIGIv
V2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwppbmRleCA1NGQwN2UwLi4xMTExMTE2IDEwMDY0NAot
LS0gYS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1dlYktpdC9jaHJvbWl1bS9DaGFu
Z2VMb2cKQEAgLTEsMyArMSwyMyBAQAorMjAxMC0wMS0xNCAgVml0YWx5IFJlcGVzaGtvICA8dml0
YWx5ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgW1Y4XSBTdXBwb3J0IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4KKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMyOTIwCisgICAgICAgIGh0
dHA6Ly9jcmJ1Zy5jb20vMzA2MjAKKworICAgICAgICBVcGRhdGVkIHVzZXMgb2YgU2VyaWFsaXpl
ZFNjcmlwdFZhbHVlOgorICAgICAgICAqIHNyYy9QbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpQbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbDo6cG9zdE1l
c3NhZ2VUb1JlbW90ZSk6CisgICAgICAgIChXZWJDb3JlOjpQbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hh
bm5lbDo6dHJ5R2V0TWVzc2FnZUZyb21SZW1vdGUpOgorICAgICAgICAqIHNyYy9XZWJXb3JrZXJC
YXNlLmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViV29ya2VyQmFzZTo6cG9zdE1lc3NhZ2VUb1dv
cmtlck9iamVjdCk6CisgICAgICAgICogc3JjL1dlYldvcmtlckNsaWVudEltcGwuY3BwOgorICAg
ICAgICAoV2ViS2l0OjpXZWJXb3JrZXJDbGllbnRJbXBsOjpwb3N0TWVzc2FnZVRvV29ya2VyQ29u
dGV4dCk6CisgICAgICAgIChXZWJLaXQ6OldlYldvcmtlckNsaWVudEltcGw6OnBvc3RNZXNzYWdl
VG9Xb3JrZXJPYmplY3RUYXNrKToKKyAgICAgICAgKiBzcmMvV2ViV29ya2VySW1wbC5jcHA6Cisg
ICAgICAgIChXZWJLaXQ6OldlYldvcmtlckltcGw6OnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0
VGFzayk6CisKIDIwMTAtMDEtMTMgIEpvbiBIb25leWN1dHQgIDxqaG9uZXljdXR0QGFwcGxlLmNv
bT4KIAogICAgICAgICBNU0FBOiBzZWxlY3RlZCwgc2VsZWN0YWJsZSwgZXh0ZW5kZWQgc2VsZWN0
YWJsZSwgYW5kIG11bHRpcGxlCmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vc3JjL1BsYXRm
b3JtTWVzc2FnZVBvcnRDaGFubmVsLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvUGxhdGZvcm1N
ZXNzYWdlUG9ydENoYW5uZWwuY3BwCmluZGV4IGY4YzQxZDMuLmFhNDJhMTAgMTAwNjQ0Ci0tLSBh
L1dlYktpdC9jaHJvbWl1bS9zcmMvUGxhdGZvcm1NZXNzYWdlUG9ydENoYW5uZWwuY3BwCisrKyBi
L1dlYktpdC9jaHJvbWl1bS9zcmMvUGxhdGZvcm1NZXNzYWdlUG9ydENoYW5uZWwuY3BwCkBAIC0x
NzksNyArMTc5LDcgQEAgdm9pZCBQbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbDo6cG9zdE1lc3Nh
Z2VUb1JlbW90ZShQYXNzT3duUHRyPE1lc3NhZ2VQb3J0Q2hhbm4KICAgICBpZiAoIW1fbG9jYWxQ
b3J0IHx8ICFtX3dlYkNoYW5uZWwpCiAgICAgICAgIHJldHVybjsKIAotICAgIFdlYlN0cmluZyBt
ZXNzYWdlU3RyaW5nID0gbWVzc2FnZS0+bWVzc2FnZSgpLT50b1N0cmluZygpOworICAgIFdlYlN0
cmluZyBtZXNzYWdlU3RyaW5nID0gbWVzc2FnZS0+bWVzc2FnZSgpLT50b1dpcmVTdHJpbmcoKTsK
ICAgICBPd25QdHI8V2ViQ29yZTo6TWVzc2FnZVBvcnRDaGFubmVsQXJyYXk+IGNoYW5uZWxzID0g
bWVzc2FnZS0+Y2hhbm5lbHMoKTsKICAgICBXZWJNZXNzYWdlUG9ydENoYW5uZWxBcnJheSogd2Vi
Q2hhbm5lbHMgPSAwOwogICAgIGlmIChjaGFubmVscy5nZXQoKSAmJiBjaGFubmVscy0+c2l6ZSgp
KSB7CkBAIC0yMTEsNyArMjExLDcgQEAgYm9vbCBQbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbDo6
dHJ5R2V0TWVzc2FnZUZyb21SZW1vdGUoT3duUHRyPE1lc3NhZ2VQb3J0Q2hhbm4KICAgICAgICAg
ICAgICAgICAoKmNoYW5uZWxzKVtpXSA9IE1lc3NhZ2VQb3J0Q2hhbm5lbDo6Y3JlYXRlKHBsYXRm
b3JtQ2hhbm5lbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgUmVmUHRyPFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2VyaWFsaXplZE1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0
VmFsdWU6OmNyZWF0ZShtZXNzYWdlKTsKKyAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZT4gc2VyaWFsaXplZE1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZUZy
b21XaXJlKG1lc3NhZ2UpOwogICAgICAgICByZXN1bHQgPSBNZXNzYWdlUG9ydENoYW5uZWw6OkV2
ZW50RGF0YTo6Y3JlYXRlKHNlcmlhbGl6ZWRNZXNzYWdlLnJlbGVhc2UoKSwgY2hhbm5lbHMucmVs
ZWFzZSgpKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29y
a2VyQmFzZS5jcHAgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckJhc2UuY3BwCmluZGV4
IDBlM2FhNGUuLjdmZDM3NDkgMTAwNjQ0Ci0tLSBhL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29y
a2VyQmFzZS5jcHAKKysrIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJCYXNlLmNwcApA
QCAtMTU3LDcgKzE1Nyw3IEBAIHZvaWQgV2ViV29ya2VyQmFzZTo6cG9zdE1lc3NhZ2VUb1dvcmtl
ck9iamVjdChQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzT3duUHRyPE1lc3NhZ2VQb3J0Q2hh
bm5lbEFycmF5PiBjaGFubmVscykKIHsKICAgICBkaXNwYXRjaFRhc2tUb01haW5UaHJlYWQoY3Jl
YXRlQ2FsbGJhY2tUYXNrKCZwb3N0TWVzc2FnZVRhc2ssIHRoaXMsCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT50b1N0cmluZygpLCBjaGFu
bmVscykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bWVzc2FnZS0+dG9XaXJlU3RyaW5nKCksIGNoYW5uZWxzKSk7CiB9CiAKIHZvaWQgV2ViV29ya2Vy
QmFzZTo6cG9zdE1lc3NhZ2VUYXNrKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQsCmRp
ZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckNsaWVudEltcGwuY3BwIGIv
V2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJDbGllbnRJbXBsLmNwcAppbmRleCA2YmUwM2E3
Li41OThhMDc4IDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckNsaWVu
dEltcGwuY3BwCisrKyBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2VyQ2xpZW50SW1wbC5j
cHAKQEAgLTE3Myw3ICsxNzMsNyBAQCB2b2lkIFdlYldvcmtlckNsaWVudEltcGw6OnBvc3RNZXNz
YWdlVG9Xb3JrZXJDb250ZXh0KAogICAgIGlmICghaXNNYWluVGhyZWFkKCkpIHsKICAgICAgICAg
V2ViV29ya2VyQmFzZTo6ZGlzcGF0Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFz
aygmcG9zdE1lc3NhZ2VUb1dvcmtlckNvbnRleHRUYXNrLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbWVzc2FnZS0+dG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT50b1dpcmVTdHJp
bmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjaGFubmVscykpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAt
MTg0LDcgKzE4NCw3IEBAIHZvaWQgV2ViV29ya2VyQ2xpZW50SW1wbDo6cG9zdE1lc3NhZ2VUb1dv
cmtlckNvbnRleHQoCiAgICAgICAgIHdlYmNoYW5uZWwtPnNldENsaWVudCgwKTsKICAgICAgICAg
d2ViQ2hhbm5lbHNbaV0gPSB3ZWJjaGFubmVsOwogICAgIH0KLSAgICBtX3dlYldvcmtlci0+cG9z
dE1lc3NhZ2VUb1dvcmtlckNvbnRleHQobWVzc2FnZS0+dG9TdHJpbmcoKSwgd2ViQ2hhbm5lbHMp
OworICAgIG1fd2ViV29ya2VyLT5wb3N0TWVzc2FnZVRvV29ya2VyQ29udGV4dChtZXNzYWdlLT50
b1dpcmVTdHJpbmcoKSwgd2ViQ2hhbm5lbHMpOwogfQogCiBib29sIFdlYldvcmtlckNsaWVudElt
cGw6Omhhc1BlbmRpbmdBY3Rpdml0eSgpIGNvbnN0CkBAIC0zNTYsNyArMzU2LDcgQEAgdm9pZCBX
ZWJXb3JrZXJDbGllbnRJbXBsOjpwb3N0TWVzc2FnZVRvV29ya2VyT2JqZWN0VGFzaygKICAgICAg
ICAgT3duUHRyPE1lc3NhZ2VQb3J0QXJyYXk+IHBvcnRzID0KICAgICAgICAgICAgIE1lc3NhZ2VQ
b3J0OjplbnRhbmdsZVBvcnRzKCpjb250ZXh0LCBjaGFubmVscy5yZWxlYXNlKCkpOwogICAgICAg
ICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBzZXJpYWxpemVkTWVzc2FnZSA9Ci0gICAg
ICAgICAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShtZXNzYWdlKTsKKyAgICAgICAg
ICAgIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlRnJvbVdpcmUobWVzc2FnZSk7CiAgICAg
ICAgIHRoaXNQdHItPm1fd29ya2VyLT5kaXNwYXRjaEV2ZW50KE1lc3NhZ2VFdmVudDo6Y3JlYXRl
KHBvcnRzLnJlbGVhc2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZE1lc3NhZ2UucmVsZWFzZSgpKSk7CiAg
ICAgfQpkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJJbXBsLmNwcCBi
L1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2VySW1wbC5jcHAKaW5kZXggNzQ0YmUzMC4uNWI1
ZTA1MyAxMDA2NDQKLS0tIGEvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJJbXBsLmNwcAor
KysgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckltcGwuY3BwCkBAIC04OCw3ICs4OCw3
IEBAIHZvaWQgV2ViV29ya2VySW1wbDo6cG9zdE1lc3NhZ2VUb1dvcmtlckNvbnRleHRUYXNrKFdl
YkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRlCiAgICAgT3duUHRyPE1lc3NhZ2VQb3J0QXJyYXk+
IHBvcnRzID0KICAgICAgICAgTWVzc2FnZVBvcnQ6OmVudGFuZ2xlUG9ydHMoKmNvbnRleHQsIGNo
YW5uZWxzLnJlbGVhc2UoKSk7CiAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2Vy
aWFsaXplZE1lc3NhZ2UgPQotICAgICAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSht
ZXNzYWdlKTsKKyAgICAgICAgU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGVGcm9tV2lyZSht
ZXNzYWdlKTsKICAgICB3b3JrZXJDb250ZXh0LT5kaXNwYXRjaEV2ZW50KE1lc3NhZ2VFdmVudDo6
Y3JlYXRlKAogICAgICAgICBwb3J0cy5yZWxlYXNlKCksIHNlcmlhbGl6ZWRNZXNzYWdlLnJlbGVh
c2UoKSkpOwogICAgIHRoaXNQdHItPmNvbmZpcm1NZXNzYWdlRnJvbVdvcmtlck9iamVjdCh3b3Jr
ZXJDb250ZXh0LT5oYXNQZW5kaW5nQWN0aXZpdHkoKSk7Cg==
</data>
<flag name="review"
          id="28903"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46678</attachid>
            <date>2010-01-15 07:15:53 -0800</date>
            <delta_ts>2010-01-15 07:19:11 -0800</delta_ts>
            <desc>patch v3</desc>
            <filename>serialize.patch</filename>
            <type>text/plain</type>
            <size>40857</size>
            <attacher name="Vitaly Repeshko">vitalyr</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
Y2VmNmRlMi4uOTQzMmUxNCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw5OCBAQAorMjAxMC0wMS0xNSAgVml0YWx5IFJlcGVz
aGtvICA8dml0YWx5ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgW1Y4XSBTdXBwb3J0IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMyOTIwCisg
ICAgICAgIGh0dHA6Ly9jcmJ1Zy5jb20vMzA2MjAKKworICAgICAgICBJbml0aWFsIGltcGxlbWVu
dGF0aW9uIG9mIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSB3aGljaCBpcyB1c2VkIHRvCisgICAgICAg
IHRvIGNyZWF0ZSBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgSmF2YVNjcmlwdCBvYmpl
Y3RzLiAgVGhpcworICAgICAgICByZXByZXNlbnRhdGlvbiBpcyBuZWVkZWQgZm9yIHN0cnVjdHVy
ZWQgY2xvbmVzIGFuZCB3b3JrZXIgbWVzc2FnZXMuCisKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6
IEFkZGVkIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAuCisgICAgICAgICogYmluZGluZ3Mvc2Ny
aXB0cy9Db2RlR2VuZXJhdG9yVjgucG06IFJlbW92ZWQgY29udmVyc2lvbiB0byBzdHJpbmcgYmVm
b3JlIHVzaW5nIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4KKyAgICAgICAgKiBiaW5kaW5ncy92OC9T
ZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Oik6Cisg
ICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWda
YWc6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OldyaXRlcik6CisgICAgICAg
IChXZWJDb3JlOjpXcml0ZXI6OndyaXRlVW5kZWZpbmVkKToKKyAgICAgICAgKFdlYkNvcmU6Oldy
aXRlcjo6d3JpdGVOdWxsKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVUcnVlKToK
KyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVGYWxzZSk6CisgICAgICAgIChXZWJDb3Jl
OjpXcml0ZXI6OndyaXRlU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVJ
bnQzMik6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OndyaXRlTnVtYmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OldyaXRlcjo6ZW5kQ29tcG9zaXRlKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRl
cjo6ZGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OmRvV3JpdGVVaW50MzIpOgorICAg
ICAgICAoV2ViQ29yZTo6V3JpdGVyOjphcHBlbmQpOgorICAgICAgICAoV2ViQ29yZTo6V3JpdGVy
OjplbnN1cmVTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OmZpbGxIb2xlKToKKyAg
ICAgICAgKFdlYkNvcmU6OldyaXRlcjo6Y2hhckF0KToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlh
bGl6ZXI6OlNlcmlhbGl6ZXIpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6c2VyaWFs
aXplKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0YXRlQmFzZTo6flN0YXRlQmFz
ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6Om5leHRTdGF0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OnNldE5leHRTdGF0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OmNvbXBvc2l0ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OlN0YXRlQmFzZSk6CisgICAg
ICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZTo6Y29tcG9zaXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OlNlcmlhbGl6ZXI6OlN0YXRlOjp0YWcpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFs
aXplcjo6U3RhdGU6OlN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0YWNr
Q2xlYW5lcjo6U3RhY2tDbGVhbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0
YWNrQ2xlYW5lcjo6flN0YWNrQ2xlYW5lcik6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVy
OjpBcnJheVN0YXRlOjpBcnJheVN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6
OkFycmF5U3RhdGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6QXJyYXlT
dGF0ZTo6YWR2YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpPYmplY3RTdGF0
ZTo6T2JqZWN0U3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3Rh
dGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3RhdGU6OmFk
dmFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3RhdGU6Om5leHRQ
cm9wZXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpkb1NlcmlhbGl6ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpwdXNoKToKKyAgICAgICAgKFdlYkNvcmU6OlNl
cmlhbGl6ZXI6OnRvcCk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpwb3ApOgorICAg
ICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6Y2hlY2tDb21wb3NpdGUpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVhZGVyOjpSZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVhZGVyOjppc0VvZik6
CisgICAgICAgIChXZWJDb3JlOjpSZWFkZXI6OnJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVh
ZGVyOjpyZWFkVGFnKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWRlcjo6cmVhZFN0cmluZyk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZWFkZXI6OnJlYWRJbnQzMik6CisgICAgICAgIChXZWJDb3JlOjpS
ZWFkZXI6OnJlYWROdW1iZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVhZGVyOjpkb1JlYWRVaW50
MzIpOgorICAgICAgICAoV2ViQ29yZTo6RGVzZXJpYWxpemVyOjpEZXNlcmlhbGl6ZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6RGVzZXJpYWxpemVyOjpkZXNlcmlhbGl6ZSk6CisgICAgICAgIChXZWJD
b3JlOjpEZXNlcmlhbGl6ZXI6OmRvRGVzZXJpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6RGVz
ZXJpYWxpemVyOjpwdXNoKToKKyAgICAgICAgKFdlYkNvcmU6OkRlc2VyaWFsaXplcjo6cG9wKToK
KyAgICAgICAgKFdlYkNvcmU6OkRlc2VyaWFsaXplcjo6c3RhY2tEZXB0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpEZXNlcmlhbGl6ZXI6OmVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFs
aXplZFNjcmlwdFZhbHVlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWUpOgorICAgICAgICAoV2ViQ29y
ZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpkZXNlcmlhbGl6ZSk6CisgICAgICAgICogYmluZGlu
Z3MvdjgvU2VyaWFsaXplZFNjcmlwdFZhbHVlLmg6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxp
emVkU2NyaXB0VmFsdWU6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2Ny
aXB0VmFsdWU6OmNyZWF0ZUZyb21XaXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZTo6cmVsZWFzZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0
VmFsdWU6OnRvV2lyZVN0cmluZyk6CisKKyAgICAgICAgVXBkYXRlZCB1c2VzIG9mIFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dD
dXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhET01XaW5kb3c6OnBvc3RNZXNzYWdlQ2Fs
bGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOERlZGljYXRlZFdvcmtlckNv
bnRleHRDdXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhEZWRpY2F0ZWRXb3JrZXJDb250
ZXh0Ojpwb3N0TWVzc2FnZUNhbGxiYWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20v
VjhIaXN0b3J5Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4SGlzdG9yeTo6cHVzaFN0
YXRlQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6VjhIaXN0b3J5OjpyZXBsYWNlU3RhdGVD
YWxsYmFjayk6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3Vz
dG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4TWVzc2FnZUV2ZW50Ojppbml0TWVzc2FnZUV2
ZW50Q2FsbGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0
Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4TWVzc2FnZVBvcnQ6OnBvc3RNZXNzYWdl
Q2FsbGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckN1c3RvbS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpWOFdvcmtlcjo6cG9zdE1lc3NhZ2VDYWxsYmFjayk6CisK
IDIwMTAtMDEtMTQgIEp1bmdzaGlrIFNoaW4gIDxqc2hpbkBjaHJvbWl1bS5vcmc+CiAKICAgICAg
ICAgVW5yZXZpZXdlZCwgYXR0ZW1wdGVkIGJ1aWxkIGZpeCBvbiBjaHJvbWl1bS4KZGlmZiAtLWdp
dCBhL1dlYkNvcmUvV2ViQ29yZS5neXBpIGIvV2ViQ29yZS9XZWJDb3JlLmd5cGkKaW5kZXggMmE2
MTBiMi4uNjEzMzYwZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvV2Vi
Q29yZS9XZWJDb3JlLmd5cGkKQEAgLTc5NSw2ICs3OTUsNyBAQAogICAgICAgICAgICAgJ2JpbmRp
bmdzL3Y4L1NjcmlwdFN0cmluZ0ltcGwuaCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvU2Ny
aXB0VmFsdWUuY3BwJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9TY3JpcHRWYWx1ZS5oJywK
KyAgICAgICAgICAgICdiaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwJywKICAg
ICAgICAgICAgICdiaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuaCcsCiAgICAgICAg
ICAgICAnYmluZGluZ3Mvdjgvc3BlY2lhbGl6YXRpb24vVjhCaW5kaW5nRE9NV2luZG93LmgnLAog
ICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L3NwZWNpYWxpemF0aW9uL1Y4QmluZGluZ1N0YXRlLmNw
cCcsCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4
LnBtIGIvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5wbQppbmRleCAw
OTE1NTIyLi5jOGQxYjAyIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvQ29k
ZUdlbmVyYXRvclY4LnBtCisrKyBiL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJh
dG9yVjgucG0KQEAgLTI1NDEsNyArMjU0MSw3IEBAIHN1YiBSZXR1cm5OYXRpdmVUb0pTVmFsdWUK
IAogICAgIGlmICgkdHlwZSBlcSAiU2VyaWFsaXplZFNjcmlwdFZhbHVlIikgewogICAgICAgICAk
aW1wbEluY2x1ZGVzeyIkdHlwZS5oIn0gPSAxOwotICAgICAgICByZXR1cm4gInJldHVybiB2OFN0
cmluZygkdmFsdWUtPnRvU3RyaW5nKCkpIjsKKyAgICAgICAgcmV0dXJuICJyZXR1cm4gJHZhbHVl
LT5kZXNlcmlhbGl6ZSgpIjsKICAgICB9CiAKICAgICBpZiAoJHR5cGUgZXEgIkRlZGljYXRlZFdv
cmtlckNvbnRleHQiIG9yICR0eXBlIGVxICJXb3JrZXJDb250ZXh0IiBvciAkdHlwZSBlcSAiU2hh
cmVkV29ya2VyQ29udGV4dCIpIHsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvU2Vy
aWFsaXplZFNjcmlwdFZhbHVlLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvU2VyaWFsaXplZFNj
cmlwdFZhbHVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDE5MjAz
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0
VmFsdWUuY3BwCkBAIC0wLDAgKzEsNjk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUK
KyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5l
aXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP
UFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgorCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCisK
KyNpbmNsdWRlIDx2OC5oPgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVkZSA8
d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKKy8vIEZJWE1FOgor
Ly8gLSBjYXRjaCBWOCBleGNlcHRpb25zCisvLyAtIGJlIHJlYWR5IHRvIGdldCBlbXB0eSBoYW5k
bGVzCisvLyAtIGNvbnNpZGVyIGNyYXNoaW5nIGluIGRlYnVnIG1vZGUgb24gZGVzZXJpYWxpemF0
aW9uIGVycm9ycworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK25hbWVzcGFjZSB7CisKK3R5cGVk
ZWYgVUNoYXIgQnVmZmVyVmFsdWVUeXBlOworCisvLyBTZXJpYWxpemF0aW9uIGZvcm1hdCBpcyBh
IHNlcXVlbmNlIG9mICh0YWcsIG9wdGlvbmFsIGRhdGEpCisvLyBwYWlycy4gVGFnIGFsd2F5cyB0
YWtlcyBleGFjdGx5IG9uZSBieXRlLgorZW51bSBTZXJpYWxpemF0aW9uVGFnIHsKKyAgICBJbnZh
bGlkVGFnID0gJyEnLAorICAgIFBhZGRpbmdUYWcgPSAnXDAnLAorICAgIFVuZGVmaW5lZFRhZyA9
ICdfJywKKyAgICBOdWxsVGFnID0gJzAnLAorICAgIFRydWVUYWcgPSAnVCcsCisgICAgRmFsc2VU
YWcgPSAnRicsCisgICAgU3RyaW5nVGFnID0gJ1MnLAorICAgIEludDMyVGFnID0gJ0knLAorICAg
IE51bWJlclRhZyA9ICdOJywKKyAgICBPYmplY3RUYWcgPSAneycsCisgICAgQXJyYXlUYWcgPSAn
WycsCit9OworCisvLyBIZWxwZXJzIHRvIGRvIHZlcmJvc2UgaGFuZGxlIGNhc3RzLgorCit0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0YXRpYyB2ODo6SGFuZGxlPFQ+IGhhbmRs
ZUNhc3Qodjg6OkhhbmRsZTxVPiBoYW5kbGUpIHsgcmV0dXJuIHY4OjpIYW5kbGU8VD46OkNhc3Qo
aGFuZGxlKTsgfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0YXRpYyB2
ODo6TG9jYWw8VD4gaGFuZGxlQ2FzdCh2ODo6TG9jYWw8VT4gaGFuZGxlKSB7IHJldHVybiB2ODo6
TG9jYWw8VD46OkNhc3QoaGFuZGxlKTsgfQorCitzdGF0aWMgYm9vbCBzaG91bGRDaGVja0ZvckN5
Y2xlcyhpbnQgZGVwdGgpCit7CisgICAgQVNTRVJUKGRlcHRoID49IDApOworICAgIC8vIFNpbmNl
IHdlIGFyZSBub3QgcmVxdWlyZWQgdG8gc3BvdCB0aGUgY3ljbGUgYXMgc29vbiBhcyBpdAorICAg
IC8vIGhhcHBlbnMgd2UgY2FuIGNoZWNrIGZvciBjeWNsZXMgb25seSB3aGVuIHRoZSBjdXJyZW50
IGRlcHRoCisgICAgLy8gaXMgYSBwb3dlciBvZiB0d28uCisgICAgcmV0dXJuICEoZGVwdGggJiAo
ZGVwdGggLSAxKSk7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgbWF4RGVwdGggPSAyMDAwMDsKKwor
Ly8gVmFySW50IGVuY29kaW5nIGNvbnN0YW50cy4KK3N0YXRpYyBjb25zdCBpbnQgdmFySW50U2hp
ZnQgPSA3Oworc3RhdGljIGNvbnN0IGludCB2YXJJbnRNYXNrID0gKDEgPDwgdmFySW50U2hpZnQp
IC0gMTsKKworLy8gWmlnWmFnIGVuY29kaW5nIGhlbHBzIFZhckludCBlbmNvZGluZyBzdGF5IHNt
YWxsIGZvciBuZWdhdGl2ZQorLy8gbnVtYmVycyB3aXRoIHNtYWxsIGFic29sdXRlIHZhbHVlcy4K
K2NsYXNzIFppZ1phZyB7CitwdWJsaWM6CisgICAgc3RhdGljIHVpbnQzMl90IGVuY29kZSh1aW50
MzJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSAmICgxVSA8PCAzMSkpCisgICAg
ICAgICAgICB2YWx1ZSA9ICgofnZhbHVlKSA8PCAxKSArIDE7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIHZhbHVlIDw8PSAxOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAg
c3RhdGljIHVpbnQzMl90IGRlY29kZSh1aW50MzJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlm
ICh2YWx1ZSAmIDEpCisgICAgICAgICAgICB2YWx1ZSA9IH4odmFsdWUgPj4gMSk7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIHZhbHVlID4+PSAxOworICAgICAgICByZXR1cm4gdmFsdWU7Cisg
ICAgfQorCitwcml2YXRlOgorICAgIFppZ1phZygpOworfTsKKworLy8gV3JpdGVyIGlzIHJlc3Bv
bnNpYmxlIGZvciBzZXJpYWxpemluZyBwcmltaXRpdmUgdHlwZXMgYW5kIHN0b3JpbmcKKy8vIGlu
Zm9ybWF0aW9uIHVzZWQgdG8gcmVjb25zdHJ1Y3QgY29tcG9zaXRlIHR5cGVzLgorY2xhc3MgV3Jp
dGVyIDogTm9uY29weWFibGUgeworcHVibGljOgorICAgIFdyaXRlcigpIDogbV9wb3NpdGlvbigw
KQorICAgIHsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBmdW5jdGlvbnMgZm9yIHByaW1pdGl2ZSB0
eXBlcy4KKworICAgIHZvaWQgd3JpdGVVbmRlZmluZWQoKSB7IGFwcGVuZChVbmRlZmluZWRUYWcp
OyB9CisKKyAgICB2b2lkIHdyaXRlTnVsbCgpIHsgYXBwZW5kKE51bGxUYWcpOyB9CisKKyAgICB2
b2lkIHdyaXRlVHJ1ZSgpIHsgYXBwZW5kKFRydWVUYWcpOyB9CisKKyAgICB2b2lkIHdyaXRlRmFs
c2UoKSB7IGFwcGVuZChGYWxzZVRhZyk7IH0KKworICAgIHZvaWQgd3JpdGVTdHJpbmcoY29uc3Qg
Y2hhciogZGF0YSwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIGFwcGVuZChTdHJpbmdUYWcp
OworICAgICAgICBkb1dyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihsZW5ndGgpKTsK
KyAgICAgICAgYXBwZW5kKGRhdGEsIGxlbmd0aCk7CisgICAgfQorCisgICAgdm9pZCB3cml0ZUlu
dDMyKGludDMyX3QgdmFsdWUpCisgICAgeworICAgICAgICBhcHBlbmQoSW50MzJUYWcpOworICAg
ICAgICBkb1dyaXRlVWludDMyKFppZ1phZzo6ZW5jb2RlKHN0YXRpY19jYXN0PHVpbnQzMl90Pih2
YWx1ZSkpKTsKKyAgICB9CisKKyAgICB2b2lkIHdyaXRlTnVtYmVyKGRvdWJsZSBudW1iZXIpCisg
ICAgeworICAgICAgICBhcHBlbmQoTnVtYmVyVGFnKTsKKyAgICAgICAgYXBwZW5kKHJlaW50ZXJw
cmV0X2Nhc3Q8Y2hhcio+KCZudW1iZXIpLCBzaXplb2YobnVtYmVyKSk7CisgICAgfQorCisgICAg
Ly8gUmVjb3JkcyB0aGF0IGEgY29tcG9zaXRlIG9iamVjdCBjYW4gYmUgY29uc3RydWN0ZWQgYnkg
dXNpbmcKKyAgICAvLyB8bGVuZ3RofCBwcmV2aW91c2x5IHN0b3JlZCB2YWx1ZXMuCisgICAgdm9p
ZCBlbmRDb21wb3NpdGUoU2VyaWFsaXphdGlvblRhZyB0YWcsIGludDMyX3QgbGVuZ3RoKQorICAg
IHsKKyAgICAgICAgQVNTRVJUKHRhZyA9PSBPYmplY3RUYWcgfHwgdGFnID09IEFycmF5VGFnKTsK
KyAgICAgICAgYXBwZW5kKHRhZyk7CisgICAgICAgIGRvV3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8
dWludDMyX3Q+KGxlbmd0aCkpOworICAgIH0KKworICAgIFZlY3RvcjxCdWZmZXJWYWx1ZVR5cGU+
JiBkYXRhKCkKKyAgICB7CisgICAgICAgIGZpbGxIb2xlKCk7CisgICAgICAgIHJldHVybiBtX2J1
ZmZlcjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBkb1dyaXRlVWludDMyKHVpbnQzMl90
IHZhbHVlKQorICAgIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGNoYXIg
YiA9ICh2YWx1ZSAmIHZhckludE1hc2spOworICAgICAgICAgICAgdmFsdWUgPj49IHZhckludFNo
aWZ0OworICAgICAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgICAgIGFwcGVuZChi
KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFw
cGVuZChiIHwgKDEgPDwgdmFySW50U2hpZnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZv
aWQgYXBwZW5kKFNlcmlhbGl6YXRpb25UYWcgdGFnKQorICAgIHsKKyAgICAgICAgYXBwZW5kKHN0
YXRpY19jYXN0PGNoYXI+KHRhZykpOworICAgIH0KKworICAgIHZvaWQgYXBwZW5kKGNoYXIgYikK
KyAgICB7CisgICAgICAgIGVuc3VyZVNwYWNlKDEpOworICAgICAgICAqY2hhckF0KG1fcG9zaXRp
b24rKykgPSBiOworICAgIH0KKworICAgIHZvaWQgYXBwZW5kKGNvbnN0IGNoYXIqIGRhdGEsIGlu
dCBsZW5ndGgpCisgICAgeworICAgICAgICBlbnN1cmVTcGFjZShsZW5ndGgpOworICAgICAgICBt
ZW1jcHkoY2hhckF0KG1fcG9zaXRpb24pLCBkYXRhLCBsZW5ndGgpOworICAgICAgICBtX3Bvc2l0
aW9uICs9IGxlbmd0aDsKKyAgICB9CisKKyAgICB2b2lkIGVuc3VyZVNwYWNlKGludCBleHRyYSkK
KyAgICB7CisgICAgICAgIENPTVBJTEVfQVNTRVJUKHNpemVvZihCdWZmZXJWYWx1ZVR5cGUpID09
IDIsIEJ1ZmZlclZhbHVlVHlwZUlzVHdvQnl0ZXMpOworICAgICAgICBtX2J1ZmZlci5ncm93KCht
X3Bvc2l0aW9uICsgZXh0cmEgKyAxKSAvIDIpOyAgLy8gIisgMSIgdG8gcm91bmQgdXAuCisgICAg
fQorCisgICAgdm9pZCBmaWxsSG9sZSgpCisgICAgeworICAgICAgICBDT01QSUxFX0FTU0VSVChz
aXplb2YoQnVmZmVyVmFsdWVUeXBlKSA9PSAyLCBCdWZmZXJWYWx1ZVR5cGVJc1R3b0J5dGVzKTsK
KyAgICAgICAgLy8gSWYgdGhlIHdyaXRlciBpcyBhdCBvZGQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZl
ciwgdGhlbiBvbmUgb2YKKyAgICAgICAgLy8gdGhlIGJ5dGVzIGluIHRoZSBsYXN0IFVDaGFyIGlz
IG5vdCBpbml0aWFsaXplZC4KKyAgICAgICAgaWYgKG1fcG9zaXRpb24gJSAyKQorICAgICAgICAg
ICAgKmNoYXJBdChtX3Bvc2l0aW9uKSA9IHN0YXRpY19jYXN0PGNoYXI+KFBhZGRpbmdUYWcpOwor
ICAgIH0KKworICAgIGNoYXIqIGNoYXJBdChpbnQgcG9zaXRpb24pIHsgcmV0dXJuIHJlaW50ZXJw
cmV0X2Nhc3Q8Y2hhcio+KG1fYnVmZmVyLmRhdGEoKSkgKyBwb3NpdGlvbjsgfQorCisgICAgVmVj
dG9yPEJ1ZmZlclZhbHVlVHlwZT4gbV9idWZmZXI7CisgICAgaW50IG1fcG9zaXRpb247Cit9Owor
CitjbGFzcyBTZXJpYWxpemVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTZXJpYWxpemVyKFdy
aXRlciYgd3JpdGVyKQorICAgICAgICA6IG1fd3JpdGVyKHdyaXRlcikKKyAgICAgICAgLCBtX3N0
YXRlKDApCisgICAgICAgICwgbV9kZXB0aCgwKQorICAgIHsKKyAgICB9CisKKyAgICBib29sIHNl
cmlhbGl6ZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUpCisgICAgeworICAgICAgICB2ODo6
SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgICAgIFN0YWNrQ2xlYW5lciBjbGVhbmVyKCZtX3N0YXRl
KTsKKyAgICAgICAgaWYgKCFkb1NlcmlhbGl6ZSh2YWx1ZSkpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIHdoaWxlICh0b3AoKSkgeworICAgICAgICAgICAgaW50IGxlbmd0aDsK
KyAgICAgICAgICAgIHdoaWxlICghdG9wKCktPmlzRG9uZSgmbGVuZ3RoKSkgeworICAgICAgICAg
ICAgICAgIC8vIE5vdGUgdGhhdCBkb1NlcmlhbGl6ZSgpIGNhbiBjaGFuZ2UgY3VycmVudCB0b3Ao
KS4KKyAgICAgICAgICAgICAgICBpZiAoIWRvU2VyaWFsaXplKHRvcCgpLT5hZHZhbmNlKCkpKQor
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBtX3dyaXRlci5lbmRDb21wb3NpdGUodG9wKCktPnRhZygpLCBsZW5ndGgpOworICAgICAg
ICAgICAgcG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCitw
cml2YXRlOgorICAgIGNsYXNzIFN0YXRlQmFzZSA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CisgICAg
cHVibGljOgorICAgICAgICB2aXJ0dWFsIH5TdGF0ZUJhc2UoKSB7IH0KKworICAgICAgICAvLyBM
aW5rIHRvIHRoZSBuZXh0IHN0YXRlIHRvIGZvcm0gYSBzdGFjay4KKyAgICAgICAgU3RhdGVCYXNl
KiBuZXh0U3RhdGUoKSB7IHJldHVybiBtX25leHQ7IH0KKyAgICAgICAgdm9pZCBzZXROZXh0U3Rh
dGUoU3RhdGVCYXNlKiBuZXh0KSB7IG1fbmV4dCA9IG5leHQ7IH0KKworICAgICAgICAvLyBDb21w
b3NpdGUgb2JqZWN0IHdlJ3JlIHByb2Nlc3NpbmcgaW4gdGhpcyBzdGF0ZS4KKyAgICAgICAgdjg6
OkhhbmRsZTx2ODo6VmFsdWU+IGNvbXBvc2l0ZSgpIHsgcmV0dXJuIG1fY29tcG9zaXRlOyB9CisK
KyAgICAgICAgLy8gU2VyaWFsaXphdGlvbiB0YWcgZm9yIHRoZSBjdXJyZW50IGNvbXBvc2l0ZS4K
KyAgICAgICAgdmlydHVhbCBTZXJpYWxpemF0aW9uVGFnIHRhZygpIGNvbnN0ID0gMDsKKworICAg
ICAgICAvLyBSZXR1cm5zIHdoZXRoZXIgaXRlcmF0aW9uIG92ZXIgc3Vib2JqZWN0cyBvZiB0aGUg
Y3VycmVudAorICAgICAgICAvLyBjb21wb3NpdGUgb2JqZWN0IGlzIGRvbmUuIElmIHllcywgfCps
ZW5ndGh8IGlzIHNldCB0byB0aGUKKyAgICAgICAgLy8gbnVtYmVyIG9mIHN1Ym9iamVjdHMuCisg
ICAgICAgIHZpcnR1YWwgYm9vbCBpc0RvbmUoaW50KiBsZW5ndGgpID0gMDsKKworICAgICAgICAv
LyBBZHZhbmNlcyB0byB0aGUgbmV4dCBzdWJvYmplY3QuCisgICAgICAgIC8vIFJlcXVpcmVzOiAh
dGhpcy0+aXNEb25lKCkuCisgICAgICAgIHZpcnR1YWwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gYWR2
YW5jZSgpID0gMDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgU3RhdGVCYXNlKHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBjb21wb3NpdGUpCisgICAgICAgICAgICA6IG1fbmV4dCgwKQorICAgICAg
ICAgICAgLCBtX2NvbXBvc2l0ZShjb21wb3NpdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisg
ICAgcHJpdmF0ZToKKyAgICAgICAgU3RhdGVCYXNlKiBtX25leHQ7CisgICAgICAgIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBtX2NvbXBvc2l0ZTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQsIFNlcmlhbGl6YXRpb25UYWcgY29tcG9zaXRlVGFnPgorICAgIGNsYXNzIFN0YXRlIDog
cHVibGljIFN0YXRlQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICB2ODo6SGFuZGxlPFQ+IGNv
bXBvc2l0ZSgpIHsgcmV0dXJuIGhhbmRsZUNhc3Q8VD4oU3RhdGVCYXNlOjpjb21wb3NpdGUoKSk7
IH0KKworICAgICAgICB2aXJ0dWFsIFNlcmlhbGl6YXRpb25UYWcgdGFnKCkgY29uc3QgeyByZXR1
cm4gY29tcG9zaXRlVGFnOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGV4cGxpY2l0IFN0
YXRlKHY4OjpIYW5kbGU8VD4gY29tcG9zaXRlKSA6IFN0YXRlQmFzZShjb21wb3NpdGUpCisgICAg
ICAgIHsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBIZWxwZXIgdG8gY2xlYW4gdXAgdGhl
IHN0YXRlIHN0YWNrIGluIGNhc2Ugb2YgZXJyb3JzLgorICAgIGNsYXNzIFN0YWNrQ2xlYW5lciA6
IE5vbmNvcHlhYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFN0YWNrQ2xlYW5l
cihTdGF0ZUJhc2UqKiBzdGFjaykgOiBtX3N0YWNrKHN0YWNrKQorICAgICAgICB7CisgICAgICAg
IH0KKworICAgICAgICB+U3RhY2tDbGVhbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3Rh
dGVCYXNlKiBzdGF0ZSA9ICptX3N0YWNrOworICAgICAgICAgICAgd2hpbGUgKHN0YXRlKSB7Cisg
ICAgICAgICAgICAgICAgU3RhdGVCYXNlKiB0bXAgPSBzdGF0ZS0+bmV4dFN0YXRlKCk7CisgICAg
ICAgICAgICAgICAgZGVsZXRlIHN0YXRlOworICAgICAgICAgICAgICAgIHN0YXRlID0gdG1wOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgKm1fc3RhY2sgPSAwOworICAgICAgICB9CisKKyAg
ICBwcml2YXRlOgorICAgICAgICBTdGF0ZUJhc2UqKiBtX3N0YWNrOworICAgIH07CisKKyAgICBj
bGFzcyBBcnJheVN0YXRlIDogcHVibGljIFN0YXRlPHY4OjpBcnJheSwgQXJyYXlUYWc+IHsKKyAg
ICBwdWJsaWM6CisgICAgICAgIEFycmF5U3RhdGUodjg6OkhhbmRsZTx2ODo6QXJyYXk+IGFycmF5
KQorICAgICAgICAgICAgOiBTdGF0ZTx2ODo6QXJyYXksIEFycmF5VGFnPihhcnJheSkKKyAgICAg
ICAgICAgICwgbV9pbmRleCgwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0
dWFsIGJvb2wgaXNEb25lKGludCogbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICAqbGVu
Z3RoID0gY29tcG9zaXRlKCktPkxlbmd0aCgpOworICAgICAgICAgICAgcmV0dXJuIG1faW5kZXgg
Pj0gKmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdjg6OkxvY2FsPHY4OjpW
YWx1ZT4gYWR2YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2luZGV4IDwg
Y29tcG9zaXRlKCktPkxlbmd0aCgpKTsKKyAgICAgICAgICAgIHY4OjpIYW5kbGVTY29wZSBzY29w
ZTsKKyAgICAgICAgICAgIHJldHVybiBzY29wZS5DbG9zZShjb21wb3NpdGUoKS0+R2V0KHY4OjpJ
bnRlZ2VyOjpOZXcobV9pbmRleCsrKSkpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAg
ICAgICBpbnQgbV9pbmRleDsKKyAgICB9OworCisgICAgY2xhc3MgT2JqZWN0U3RhdGUgOiBwdWJs
aWMgU3RhdGU8djg6Ok9iamVjdCwgT2JqZWN0VGFnPiB7CisgICAgcHVibGljOgorICAgICAgICBP
YmplY3RTdGF0ZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCkKKyAgICAgICAgICAgIDog
U3RhdGU8djg6Ok9iamVjdCwgT2JqZWN0VGFnPihvYmplY3QpCisgICAgICAgICAgICAsIG1fcHJv
cGVydHlOYW1lcyhvYmplY3QtPkdldFByb3BlcnR5TmFtZXMoKSkKKyAgICAgICAgICAgICwgbV9p
bmRleCgtMSkKKyAgICAgICAgICAgICwgbV9sZW5ndGgoMCkKKyAgICAgICAgeworICAgICAgICAg
ICAgbmV4dFByb3BlcnR5KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNE
b25lKGludCogbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICAqbGVuZ3RoID0gbV9sZW5n
dGg7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA+PSAyICogbV9wcm9wZXJ0eU5hbWVzLT5M
ZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdjg6OkxvY2FsPHY4OjpWYWx1
ZT4gYWR2YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2luZGV4IDwgMiAq
IG1fcHJvcGVydHlOYW1lcy0+TGVuZ3RoKCkpOworICAgICAgICAgICAgaWYgKCEobV9pbmRleCAl
IDIpKSB7CisgICAgICAgICAgICAgICAgKyttX2luZGV4OworICAgICAgICAgICAgICAgIHJldHVy
biBtX3Byb3BlcnR5TmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHY4OjpMb2NhbDx2
ODo6VmFsdWU+IHJlc3VsdCA9IGNvbXBvc2l0ZSgpLT5HZXQobV9wcm9wZXJ0eU5hbWUpOworICAg
ICAgICAgICAgbmV4dFByb3BlcnR5KCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAg
ICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIG5leHRQcm9wZXJ0eSgpCisgICAg
ICAgIHsKKyAgICAgICAgICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKyAgICAgICAgICAgICsr
bV9pbmRleDsKKyAgICAgICAgICAgIEFTU0VSVCghKG1faW5kZXggJSAyKSk7CisgICAgICAgICAg
ICBmb3IgKDsgbV9pbmRleCA8IDIgKiBtX3Byb3BlcnR5TmFtZXMtPkxlbmd0aCgpOyBtX2luZGV4
ICs9IDIpIHsKKyAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwcm9wZXJ0eU5h
bWUgPSBtX3Byb3BlcnR5TmFtZXMtPkdldCh2ODo6SW50ZWdlcjo6TmV3KG1faW5kZXggLyAyKSk7
CisgICAgICAgICAgICAgICAgaWYgKChwcm9wZXJ0eU5hbWUtPklzU3RyaW5nKCkgJiYgY29tcG9z
aXRlKCktPkhhc1JlYWxOYW1lZFByb3BlcnR5KGhhbmRsZUNhc3Q8djg6OlN0cmluZz4ocHJvcGVy
dHlOYW1lKSkpCisgICAgICAgICAgICAgICAgICAgIHx8IChwcm9wZXJ0eU5hbWUtPklzSW50MzIo
KSAmJiBjb21wb3NpdGUoKS0+SGFzUmVhbEluZGV4ZWRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUtPlVp
bnQzMlZhbHVlKCkpKSkgeworICAgICAgICAgICAgICAgICAgICBtX3Byb3BlcnR5TmFtZSA9IHNj
b3BlLkNsb3NlKHByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1fbGVuZ3RoICs9
IDI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBtX3By
b3BlcnR5TmFtZXM7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IG1fcHJvcGVydHlOYW1l
OworICAgICAgICBpbnQgbV9pbmRleDsKKyAgICAgICAgaW50IG1fbGVuZ3RoOworICAgIH07CisK
KyAgICBib29sIGRvU2VyaWFsaXplKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKKyAgICB7
CisgICAgICAgIGlmICh2YWx1ZS0+SXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgIG1fd3JpdGVy
LndyaXRlVW5kZWZpbmVkKCk7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlLT5Jc051bGwoKSkKKyAg
ICAgICAgICAgIG1fd3JpdGVyLndyaXRlTnVsbCgpOworICAgICAgICBlbHNlIGlmICh2YWx1ZS0+
SXNUcnVlKCkpCisgICAgICAgICAgICBtX3dyaXRlci53cml0ZVRydWUoKTsKKyAgICAgICAgZWxz
ZSBpZiAodmFsdWUtPklzRmFsc2UoKSkKKyAgICAgICAgICAgIG1fd3JpdGVyLndyaXRlRmFsc2Uo
KTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUtPklzSW50MzIoKSkKKyAgICAgICAgICAgIG1fd3Jp
dGVyLndyaXRlSW50MzIodmFsdWUtPkludDMyVmFsdWUoKSk7CisgICAgICAgIGVsc2UgaWYgKHZh
bHVlLT5Jc051bWJlcigpKQorICAgICAgICAgICAgbV93cml0ZXIud3JpdGVOdW1iZXIoaGFuZGxl
Q2FzdDx2ODo6TnVtYmVyPih2YWx1ZSktPlZhbHVlKCkpOworICAgICAgICBlbHNlIGlmICh2YWx1
ZS0+SXNTdHJpbmcoKSkgeworICAgICAgICAgICAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN0cmlu
Z1ZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgIG1fd3JpdGVyLndyaXRlU3RyaW5nKCpzdHJpbmdW
YWx1ZSwgc3RyaW5nVmFsdWUubGVuZ3RoKCkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5J
c0FycmF5KCkpIHsKKyAgICAgICAgICAgIGlmICghY2hlY2tDb21wb3NpdGUodmFsdWUpKQorICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHB1c2gobmV3IEFycmF5U3Rh
dGUoaGFuZGxlQ2FzdDx2ODo6QXJyYXk+KHZhbHVlKSkpOworICAgICAgICB9IGVsc2UgaWYgKHZh
bHVlLT5Jc09iamVjdCgpKSB7CisgICAgICAgICAgICBpZiAoIWNoZWNrQ29tcG9zaXRlKHZhbHVl
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBwdXNoKG5ldyBP
YmplY3RTdGF0ZShoYW5kbGVDYXN0PHY4OjpPYmplY3Q+KHZhbHVlKSkpOworICAgICAgICAgICAg
Ly8gRklYTUU6CisgICAgICAgICAgICAvLyAtIGNoZWNrIG5vdCBhIHdyYXBwZXIKKyAgICAgICAg
ICAgIC8vIC0gc3VwcG9ydCBGaWxlLCBJbWFnZURhdGEsIGV0Yy4KKyAgICAgICAgfQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHB1c2goU3RhdGVCYXNlKiBzdGF0ZSkK
KyAgICB7CisgICAgICAgIHN0YXRlLT5zZXROZXh0U3RhdGUobV9zdGF0ZSk7CisgICAgICAgIG1f
c3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgKyttX2RlcHRoOworICAgIH0KKworICAgIFN0YXRlQmFz
ZSogdG9wKCkgeyByZXR1cm4gbV9zdGF0ZTsgfQorCisgICAgdm9pZCBwb3AoKQorICAgIHsKKyAg
ICAgICAgaWYgKCFtX3N0YXRlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBTdGF0ZUJh
c2UqIHRvcCA9IG1fc3RhdGU7CisgICAgICAgIG1fc3RhdGUgPSB0b3AtPm5leHRTdGF0ZSgpOwor
ICAgICAgICBkZWxldGUgdG9wOworICAgICAgICAtLW1fZGVwdGg7CisgICAgfQorCisgICAgYm9v
bCBjaGVja0NvbXBvc2l0ZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29tcG9zaXRlKQorICAgIHsK
KyAgICAgICAgaWYgKG1fZGVwdGggPiBtYXhEZXB0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgaWYgKCFzaG91bGRDaGVja0ZvckN5Y2xlcyhtX2RlcHRoKSkKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICBmb3IgKFN0YXRlQmFzZSogc3RhdGUgPSB0b3AoKTsg
c3RhdGU7IHN0YXRlID0gc3RhdGUtPm5leHRTdGF0ZSgpKSB7CisgICAgICAgICAgICBpZiAoc3Rh
dGUtPmNvbXBvc2l0ZSgpID09IGNvbXBvc2l0ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgV3JpdGVy
JiBtX3dyaXRlcjsKKyAgICBTdGF0ZUJhc2UqIG1fc3RhdGU7CisgICAgaW50IG1fZGVwdGg7Cit9
OworCisvLyBSZWFkZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlc2VyaWFsaXppbmcgcHJpbWl0aXZl
IHR5cGVzIGFuZAorLy8gcmVzdG9yaW5nIGluZm9ybWF0aW9uIGFib3V0IHNhdmVkIG9iamVjdHMg
b2YgY29tcG9zaXRlIHR5cGVzLgorY2xhc3MgUmVhZGVyIHsKK3B1YmxpYzoKKyAgICBSZWFkZXIo
Y29uc3QgY2hhciogYnVmZmVyLCBpbnQgbGVuZ3RoKQorICAgICAgICA6IG1fYnVmZmVyKGJ1ZmZl
cikKKyAgICAgICAgLCBtX2xlbmd0aChsZW5ndGgpCisgICAgICAgICwgbV9wb3NpdGlvbigwKQor
ICAgIHsKKyAgICB9CisKKyAgICBib29sIGlzRW9mKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlv
biA+PSBtX2xlbmd0aDsgfQorCisgICAgYm9vbCByZWFkKFNlcmlhbGl6YXRpb25UYWcqIHRhZywg
djg6OkhhbmRsZTx2ODo6VmFsdWU+KiB2YWx1ZSwgaW50KiBsZW5ndGgpCisgICAgeworICAgICAg
ICB1aW50MzJfdCByYXdMZW5ndGg7CisgICAgICAgIGlmICghcmVhZFRhZyh0YWcpKQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBzd2l0Y2ggKCp0YWcpIHsKKyAgICAgICAgY2Fz
ZSBQYWRkaW5nVGFnOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVW5kZWZpbmVk
VGFnOgorICAgICAgICAgICAgKnZhbHVlID0gdjg6OlVuZGVmaW5lZCgpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgTnVsbFRhZzoKKyAgICAgICAgICAgICp2YWx1ZSA9IHY4OjpO
dWxsKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUcnVlVGFnOgorICAgICAg
ICAgICAgKnZhbHVlID0gdjg6OlRydWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEZhbHNlVGFnOgorICAgICAgICAgICAgKnZhbHVlID0gdjg6OkZhbHNlKCk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdHJpbmdUYWc6CisgICAgICAgICAgICBpZiAoIXJl
YWRTdHJpbmcodmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBjYXNlIEludDMyVGFnOgorICAgICAgICAgICAgaWYgKCFyZWFk
SW50MzIodmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBjYXNlIE51bWJlclRhZzoKKyAgICAgICAgICAgIGlmICghcmVhZE51
bWJlcih2YWx1ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgT2JqZWN0VGFnOgorICAgICAgICBjYXNlIEFycmF5VGFnOgor
ICAgICAgICAgICAgaWYgKCFkb1JlYWRVaW50MzIoJnJhd0xlbmd0aCkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgKmxlbmd0aCA9IHJhd0xlbmd0aDsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwor
cHJpdmF0ZToKKyAgICBib29sIHJlYWRUYWcoU2VyaWFsaXphdGlvblRhZyogdGFnKQorICAgIHsK
KyAgICAgICAgaWYgKG1fcG9zaXRpb24gPj0gbV9sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgICp0YWcgPSBzdGF0aWNfY2FzdDxTZXJpYWxpemF0aW9uVGFnPihtX2J1
ZmZlclttX3Bvc2l0aW9uKytdKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAg
Ym9vbCByZWFkU3RyaW5nKHY4OjpIYW5kbGU8djg6OlZhbHVlPiogdmFsdWUpCisgICAgeworICAg
ICAgICB1aW50MzJfdCBsZW5ndGg7CisgICAgICAgIGlmICghZG9SZWFkVWludDMyKCZsZW5ndGgp
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobV9wb3NpdGlvbiArIGxl
bmd0aCA+IG1fbGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAqdmFs
dWUgPSB2ODo6U3RyaW5nOjpOZXcobV9idWZmZXIgKyBtX3Bvc2l0aW9uLCBsZW5ndGgpOworICAg
ICAgICBtX3Bvc2l0aW9uICs9IGxlbmd0aDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
CisgICAgYm9vbCByZWFkSW50MzIodjg6OkhhbmRsZTx2ODo6VmFsdWU+KiB2YWx1ZSkKKyAgICB7
CisgICAgICAgIHVpbnQzMl90IHJhd1ZhbHVlOworICAgICAgICBpZiAoIWRvUmVhZFVpbnQzMigm
cmF3VmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAqdmFsdWUgPSB2
ODo6SW50ZWdlcjo6TmV3KHN0YXRpY19jYXN0PGludDMyX3Q+KFppZ1phZzo6ZGVjb2RlKHJhd1Zh
bHVlKSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIHJlYWROdW1i
ZXIodjg6OkhhbmRsZTx2ODo6VmFsdWU+KiB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmIChtX3Bv
c2l0aW9uICsgc2l6ZW9mKGRvdWJsZSkgPiBtX2xlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgZG91YmxlIG51bWJlcjsKKyAgICAgICAgY2hhciogbnVtYmVyQXNCeXRl
QXJyYXkgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigmbnVtYmVyKTsKKyAgICAgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBzaXplb2YoZG91YmxlKTsgKytpKQorICAgICAgICAgICAgbnVtYmVyQXNC
eXRlQXJyYXlbaV0gPSBtX2J1ZmZlclttX3Bvc2l0aW9uKytdOworICAgICAgICAqdmFsdWUgPSB2
ODo6TnVtYmVyOjpOZXcobnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisg
ICAgYm9vbCBkb1JlYWRVaW50MzIodWludDMyX3QqIHZhbHVlKQorICAgIHsKKyAgICAgICAgKnZh
bHVlID0gMDsKKyAgICAgICAgY2hhciBjdXJyZW50Qnl0ZTsKKyAgICAgICAgaW50IHNoaWZ0ID0g
MDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKG1fcG9zaXRpb24gPj0gbV9sZW5ndGgp
CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgY3VycmVudEJ5dGUg
PSBtX2J1ZmZlclttX3Bvc2l0aW9uKytdOworICAgICAgICAgICAgKnZhbHVlIHw9ICgoY3VycmVu
dEJ5dGUgJiB2YXJJbnRNYXNrKSA8PCBzaGlmdCk7CisgICAgICAgICAgICBzaGlmdCArPSB2YXJJ
bnRTaGlmdDsKKyAgICAgICAgfSB3aGlsZSAoY3VycmVudEJ5dGUgJiAoMSA8PCB2YXJJbnRTaGlm
dCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBtX2J1
ZmZlcjsKKyAgICBjb25zdCBpbnQgbV9sZW5ndGg7CisgICAgaW50IG1fcG9zaXRpb247Cit9Owor
CitjbGFzcyBEZXNlcmlhbGl6ZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IERlc2VyaWFsaXpl
cihSZWFkZXImIHJlYWRlcikgOiBtX3JlYWRlcihyZWFkZXIpCisgICAgeworICAgIH0KKworICAg
IHY4OjpMb2NhbDx2ODo6VmFsdWU+IGRlc2VyaWFsaXplKCkKKyAgICB7CisgICAgICAgIHY4OjpI
YW5kbGVTY29wZSBzY29wZTsKKyAgICAgICAgd2hpbGUgKCFtX3JlYWRlci5pc0VvZigpKSB7Cisg
ICAgICAgICAgICBpZiAoIWRvRGVzZXJpYWxpemUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
djg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhY2tEZXB0
aCgpICE9IDEpCisgICAgICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAg
ICAgICAgcmV0dXJuIHNjb3BlLkNsb3NlKGVsZW1lbnQoMCkpOworICAgIH0KKworcHJpdmF0ZToK
KyAgICBib29sIGRvRGVzZXJpYWxpemUoKQorICAgIHsKKyAgICAgICAgU2VyaWFsaXphdGlvblRh
ZyB0YWc7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlOworICAgICAgICBpbnQg
bGVuZ3RoOworICAgICAgICBpZiAoIW1fcmVhZGVyLnJlYWQoJnRhZywgJnZhbHVlLCAmbGVuZ3Ro
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF2YWx1ZS5Jc0VtcHR5
KCkpIHsKKyAgICAgICAgICAgIHB1c2godmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9
PSBPYmplY3RUYWcpIHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPiBzdGFja0RlcHRoKCkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpP
YmplY3Q+IG9iamVjdCA9IHY4OjpPYmplY3Q6Ok5ldygpOworICAgICAgICAgICAgZm9yIChpbnQg
aSA9IHN0YWNrRGVwdGgoKSAtIGxlbmd0aDsgaSA8IHN0YWNrRGVwdGgoKTsgaSArPSAyKSB7Cisg
ICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcHJvcGVydHlOYW1lID0gZWxlbWVu
dChpKTsKKyAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwcm9wZXJ0eVZhbHVl
ID0gZWxlbWVudChpICsgMSk7CisgICAgICAgICAgICAgICAgb2JqZWN0LT5TZXQocHJvcGVydHlO
YW1lLCBwcm9wZXJ0eVZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcChsZW5n
dGgpOworICAgICAgICAgICAgcHVzaChvYmplY3QpOworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9
PSBBcnJheVRhZykgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+IHN0YWNrRGVwdGgoKSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB2ODo6TG9jYWw8djg6OkFy
cmF5PiBhcnJheSA9IHY4OjpBcnJheTo6TmV3KGxlbmd0aCk7CisgICAgICAgICAgICBjb25zdCBp
bnQgZGVwdGggPSBzdGFja0RlcHRoKCkgLSBsZW5ndGg7CisgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgICAgICAgICAgICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCisgICAgICAgICAgICAgICAgICAgIGFycmF5LT5TZXQo
djg6OkludGVnZXI6Ok5ldyhpKSwgZWxlbWVudChkZXB0aCArIGkpKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIHBvcChsZW5ndGgpOworICAgICAgICAgICAgcHVzaChhcnJheSk7CisgICAg
ICAgIH0gZWxzZSBpZiAodGFnICE9IFBhZGRpbmdUYWcpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZvaWQgcHVzaCh2ODo6TG9j
YWw8djg6OlZhbHVlPiB2YWx1ZSkgeyBtX3N0YWNrLmFwcGVuZCh2YWx1ZSk7IH0KKworICAgIHZv
aWQgcG9wKGludCBsZW5ndGgpCisgICAgeworICAgICAgICBBU1NFUlQobGVuZ3RoID49IDApOwor
ICAgICAgICBBU1NFUlQobGVuZ3RoIDw9IG1fc3RhY2suc2l6ZSgpKTsKKyAgICAgICAgbV9zdGFj
ay5zaHJpbmsobV9zdGFjay5zaXplKCkgLSBsZW5ndGgpOworICAgIH0KKworICAgIGludCBzdGFj
a0RlcHRoKCkgY29uc3QgeyByZXR1cm4gbV9zdGFjay5zaXplKCk7IH0KKworICAgIHY4OjpMb2Nh
bDx2ODo6VmFsdWU+IGVsZW1lbnQoaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlu
ZGV4ID49IDApOworICAgICAgICBBU1NFUlQoaW5kZXggPCBtX3N0YWNrLnNpemUoKSk7CisgICAg
ICAgIHJldHVybiBtX3N0YWNrW2luZGV4XTsKKyAgICB9CisKKyAgICBSZWFkZXImIG1fcmVhZGVy
OworICAgIFZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPiA+IG1fc3RhY2s7Cit9OworCit9IC8v
IG5hbWVzcGFjZQorCitTZXJpYWxpemVkU2NyaXB0VmFsdWU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUpCit7CisgICAgV3JpdGVyIHdyaXRlcjsKKyAg
ICBTZXJpYWxpemVyIHNlcmlhbGl6ZXIod3JpdGVyKTsKKyAgICBpZiAoIXNlcmlhbGl6ZXIuc2Vy
aWFsaXplKHZhbHVlKSkgeworICAgICAgICAvLyBGSVhNRTogdGhyb3cgZXhjZXB0aW9uCisgICAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgbV9kYXRhID0gU3RyaW5nSW1wbDo6YWRvcHQod3JpdGVy
LmRhdGEoKSk7Cit9CisKK1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6U2VyaWFsaXplZFNjcmlwdFZh
bHVlKFN0cmluZyBkYXRhLCBTdHJpbmdEYXRhTW9kZSBtb2RlKQoreworICAgIGlmIChtb2RlID09
IFdpcmVEYXRhKQorICAgICAgICBtX2RhdGEgPSBkYXRhOworICAgIGVsc2UgeworICAgICAgICBB
U1NFUlQobW9kZSA9PSBTdHJpbmdWYWx1ZSk7CisgICAgICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+
IGJ1ZmZlciA9IHV0ZjhCdWZmZXIoZGF0YSk7CisgICAgICAgIFdyaXRlciB3cml0ZXI7CisgICAg
ICAgIHdyaXRlci53cml0ZVN0cmluZyhidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwor
ICAgICAgICBtX2RhdGEgPSBTdHJpbmdJbXBsOjphZG9wdCh3cml0ZXIuZGF0YSgpKTsKKyAgICB9
Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6ZGVzZXJp
YWxpemUoKQoreworICAgIGlmICghbV9kYXRhLmltcGwoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpM
b2NhbDx2ODo6VmFsdWU+KCk7CisgICAgQ09NUElMRV9BU1NFUlQoc2l6ZW9mKEJ1ZmZlclZhbHVl
VHlwZSkgPT0gMiwgQnVmZmVyVmFsdWVUeXBlSXNUd29CeXRlcyk7CisgICAgUmVhZGVyIHJlYWRl
cihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihtX2RhdGEuaW1wbCgpLT5jaGFyYWN0ZXJz
KCkpLCAyICogbV9kYXRhLmxlbmd0aCgpKTsKKyAgICBEZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVy
KHJlYWRlcik7CisgICAgcmV0dXJuIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZSgpOworfQorCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Nl
cmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2Ny
aXB0VmFsdWUuaAppbmRleCAyNmE0MTk5Li43ZWI4OTM1IDEwMDY0NAotLS0gYS9XZWJDb3JlL2Jp
bmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oCisrKyBiL1dlYkNvcmUvYmluZGluZ3Mv
djgvU2VyaWFsaXplZFNjcmlwdFZhbHVlLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJp
Z2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmln
aHQgKEMpIDIwMDksIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQwLDExICs0MCwyNiBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKIGNsYXNzIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSA6IHB1YmxpYyBSZWZD
b3VudGVkPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gewogcHVibGljOgotICAgIHN0YXRpYyBQYXNz
UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gY3JlYXRlKFN0cmluZyBzdHJpbmcpCisgICAg
Ly8gQ3JlYXRlcyBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFY4IHZh
bHVlLgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gY3JlYXRl
KHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBhZG9w
dFJlZihuZXcgU2VyaWFsaXplZFNjcmlwdFZhbHVlKHN0cmluZykpOworICAgICAgICByZXR1cm4g
YWRvcHRSZWYobmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSh2YWx1ZSkpOwogICAgIH0KIAorICAg
IC8vIENyZWF0ZXMgYSBzZXJpYWxpemVkIHZhbHVlIHdpdGggdGhlIGdpdmVuIGRhdGEgb2J0YWlu
ZWQgZnJvbSBhCisgICAgLy8gcHJpb3IgY2FsbCB0byB0b1dpcmVTdHJpbmcoKS4KKyAgICBzdGF0
aWMgUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGNyZWF0ZUZyb21XaXJlKFN0cmlu
ZyBkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2Ny
aXB0VmFsdWUoZGF0YSwgV2lyZURhdGEpKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGVzIGEgc2Vy
aWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiBXZWJDb3JlIHN0cmluZy4KKyAgICBzdGF0aWMgUGFz
c1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGNyZWF0ZShTdHJpbmcgZGF0YSkKKyAgICB7
CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgU2VyaWFsaXplZFNjcmlwdFZhbHVlKGRhdGEs
IFN0cmluZ1ZhbHVlKSk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlcyBhbiBlbXB0eSBzZXJpYWxp
emVkIHZhbHVlLgogICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4g
Y3JlYXRlKCkKICAgICB7CiAgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgU2VyaWFsaXplZFNj
cmlwdFZhbHVlKCkpOwpAQCAtNTIsMjMgKzY3LDI5IEBAIHB1YmxpYzoKIAogICAgIFBhc3NSZWZQ
dHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiByZWxlYXNlKCkKICAgICB7Ci0gICAgICAgIFJlZlB0
cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHJlc3VsdCA9IGFkb3B0UmVmKG5ldyBTZXJpYWxpemVk
U2NyaXB0VmFsdWUobV9kYXRhKSk7CisgICAgICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFs
dWU+IHJlc3VsdCA9IGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUobV9kYXRhLCBX
aXJlRGF0YSkpOwogICAgICAgICBtX2RhdGEgPSBTdHJpbmcoKTsKICAgICAgICAgcmV0dXJuIHJl
c3VsdC5yZWxlYXNlKCk7CiAgICAgfQogCi0gICAgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0g
ICAgICAgIHJldHVybiBtX2RhdGE7Ci0gICAgfQorICAgIFN0cmluZyB0b1dpcmVTdHJpbmcoKSBj
b25zdCB7IHJldHVybiBtX2RhdGE7IH0KKworICAgIC8vIERlc2VyaWFsaXplcyB0aGUgdmFsdWUg
KGluIHRoZSBjdXJyZW50IGNvbnRleHQpLiBSZXR1cm5zIGFuCisgICAgLy8gZW1wdHkgaGFuZGxl
IGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBkZXNlcmlhbGl6
ZSgpOwogCiBwcml2YXRlOgotICAgIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShTdHJpbmcgc3RyaW5n
KQotICAgICAgICA6IG1fZGF0YShzdHJpbmcpCi0gICAgewotICAgIH0KKyAgICBlbnVtIFN0cmlu
Z0RhdGFNb2RlIHsKKyAgICAgICAgU3RyaW5nVmFsdWUsCisgICAgICAgIFdpcmVEYXRhCisgICAg
fTsKIAogICAgIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpIHsgfQorCisgICAgZXhwbGljaXQgU2Vy
aWFsaXplZFNjcmlwdFZhbHVlKHY4OjpIYW5kbGU8djg6OlZhbHVlPik7CisKKyAgICBTZXJpYWxp
emVkU2NyaXB0VmFsdWUoU3RyaW5nIGRhdGEsIFN0cmluZ0RhdGFNb2RlIG1vZGUpOworCiAgICAg
U3RyaW5nIG1fZGF0YTsKIH07CiAKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4RE9NV2luZG93Q3VzdG9tLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
RE9NV2luZG93Q3VzdG9tLmNwcAppbmRleCBkYWNkNGY2Li5iNTk0NTE4IDEwMDY0NAotLS0gYS9X
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVdpbmRvd0N1c3RvbS5jcHAKKysrIGIvV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dDdXN0b20uY3BwCkBAIC00MTEsNyAr
NDExLDcgQEAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4RE9NV2luZG93Ojpwb3N0TWVzc2FnZUNh
bGxiYWNrKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MKICAgICBBU1NFUlQoc291cmNlLT5mcmFt
ZSgpKTsKIAogICAgIHY4OjpUcnlDYXRjaCB0cnlDYXRjaDsKLSAgICBSZWZQdHI8U2VyaWFsaXpl
ZFNjcmlwdFZhbHVlPiBtZXNzYWdlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUodG9X
ZWJDb3JlU3RyaW5nKGFyZ3NbMF0pKTsKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVl
PiBtZXNzYWdlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoYXJnc1swXSk7CiAgICAg
TWVzc2FnZVBvcnRBcnJheSBwb3J0QXJyYXk7CiAgICAgU3RyaW5nIHRhcmdldE9yaWdpbjsKIApk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhEZWRpY2F0ZWRXb3JrZXJD
b250ZXh0Q3VzdG9tLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RGVkaWNhdGVk
V29ya2VyQ29udGV4dEN1c3RvbS5jcHAKaW5kZXggNWFiNjIxOC4uNDQ4NmRiZSAxMDA2NDQKLS0t
IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhEZWRpY2F0ZWRXb3JrZXJDb250ZXh0Q3Vz
dG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERlZGljYXRlZFdvcmtl
ckNvbnRleHRDdXN0b20uY3BwCkBAIC00Niw3ICs0Niw3IEBAIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiBWOERlZGljYXRlZFdvcmtlckNvbnRleHQ6OnBvc3RNZXNzYWdlQ2FsbGJhY2soY29uc3Qgdjg6
OkFyCiB7CiAgICAgSU5DX1NUQVRTKEwiRE9NLkRlZGljYXRlZFdvcmtlckNvbnRleHQucG9zdE1l
c3NhZ2UiKTsKICAgICBEZWRpY2F0ZWRXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhE
ZWRpY2F0ZWRXb3JrZXJDb250ZXh0Ojp0b05hdGl2ZShhcmdzLkhvbGRlcigpKTsKLSAgICBSZWZQ
dHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBtZXNzYWdlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVl
OjpjcmVhdGUodjhWYWx1ZVRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKSk7CisgICAgUmVmUHRyPFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZT4gbWVzc2FnZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3Jl
YXRlKGFyZ3NbMF0pOwogICAgIE1lc3NhZ2VQb3J0QXJyYXkgcG9ydEFycmF5OwogICAgIGlmIChh
cmdzLkxlbmd0aCgpID4gMSkgewogICAgICAgICBpZiAoIWdldE1lc3NhZ2VQb3J0QXJyYXkoYXJn
c1sxXSwgcG9ydEFycmF5KSkKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4SGlzdG9yeUN1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhpc3Rv
cnlDdXN0b20uY3BwCmluZGV4IDZhYTA4MDYuLmI4NTdkNmUgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4SGlzdG9yeUN1c3RvbS5jcHAKKysrIGIvV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhIaXN0b3J5Q3VzdG9tLmNwcApAQCAtNDMsNyArNDMsNyBAQCBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBWOEhpc3Rvcnk6OnB1c2hT
dGF0ZUNhbGxiYWNrKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCiB7Ci0gICAgUmVmUHRyPFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZT4gaGlzdG9yeVN0YXRlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVl
OjpjcmVhdGUodG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pKTsKKyAgICBSZWZQdHI8U2VyaWFsaXpl
ZFNjcmlwdFZhbHVlPiBoaXN0b3J5U3RhdGUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0
ZShhcmdzWzBdKTsKIAogICAgIHY4OjpUcnlDYXRjaCB0cnlDYXRjaDsKICAgICBTdHJpbmcgdGl0
bGUgPSB0b1dlYkNvcmVTdHJpbmdXaXRoTnVsbE9yVW5kZWZpbmVkQ2hlY2soYXJnc1sxXSk7CkBA
IC02NCw3ICs2NCw3IEBAIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBWOEhpc3Rvcnk6OnB1c2hTdGF0
ZUNhbGxiYWNrKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCiAKIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBWOEhpc3Rvcnk6OnJlcGxhY2VTdGF0ZUNhbGxiYWNrKGNvbnN0IHY4OjpBcmd1bWVudHMm
IGFyZ3MpCiB7Ci0gICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gaGlzdG9yeVN0YXRl
ID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUodG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0p
KTsKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBoaXN0b3J5U3RhdGUgPSBTZXJp
YWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzBdKTsKIAogICAgIHY4OjpUcnlDYXRjaCB0
cnlDYXRjaDsKICAgICBTdHJpbmcgdGl0bGUgPSB0b1dlYkNvcmVTdHJpbmdXaXRoTnVsbE9yVW5k
ZWZpbmVkQ2hlY2soYXJnc1sxXSk7CmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOE1lc3NhZ2VFdmVudEN1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOE1lc3NhZ2VFdmVudEN1c3RvbS5jcHAKaW5kZXggYjI5MWQxYS4uMmIwMjdkYyAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdlRXZlbnRDdXN0b20uY3Bw
CisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3VzdG9tLmNw
cApAQCAtNjUsNyArNjUsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhNZXNzYWdlRXZlbnQ6
OmluaXRNZXNzYWdlRXZlbnRDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbgogICAgIFN0cmluZyB0
eXBlQXJnID0gdjhWYWx1ZVRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKICAgICBib29sIGNhbkJ1
YmJsZUFyZyA9IGFyZ3NbMV0tPkJvb2xlYW5WYWx1ZSgpOwogICAgIGJvb2wgY2FuY2VsYWJsZUFy
ZyA9IGFyZ3NbMl0tPkJvb2xlYW5WYWx1ZSgpOwotICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0
VmFsdWU+IGRhdGFBcmcgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh2OFZhbHVlVG9X
ZWJDb3JlU3RyaW5nKGFyZ3NbM10pKTsKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVl
PiBkYXRhQXJnID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoYXJnc1szXSk7CiAgICAg
U3RyaW5nIG9yaWdpbkFyZyA9IHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcoYXJnc1s0XSk7CiAgICAg
U3RyaW5nIGxhc3RFdmVudElkQXJnID0gdjhWYWx1ZVRvV2ViQ29yZVN0cmluZyhhcmdzWzVdKTsK
ICAgICBET01XaW5kb3cqIHNvdXJjZUFyZyA9IFY4RE9NV2luZG93OjpIYXNJbnN0YW5jZShhcmdz
WzZdKSA/IFY4RE9NV2luZG93Ojp0b05hdGl2ZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0
KGFyZ3NbNl0pKSA6IDA7CmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OE1lc3NhZ2VQb3J0Q3VzdG9tLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVz
c2FnZVBvcnRDdXN0b20uY3BwCmluZGV4IDA3MWIxYWMuLmNjNzBiYzUgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZVBvcnRDdXN0b20uY3BwCisrKyBiL1dl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZVBvcnRDdXN0b20uY3BwCkBAIC03OCw3
ICs3OCw3IEBAIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBWOE1lc3NhZ2VQb3J0Ojpwb3N0TWVzc2Fn
ZUNhbGxiYWNrKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyCiB7CiAgICAgSU5DX1NUQVRTKCJET00u
TWVzc2FnZVBvcnQucG9zdE1lc3NhZ2UiKTsKICAgICBNZXNzYWdlUG9ydCogbWVzc2FnZVBvcnQg
PSBWOE1lc3NhZ2VQb3J0Ojp0b05hdGl2ZShhcmdzLkhvbGRlcigpKTsKLSAgICBSZWZQdHI8U2Vy
aWFsaXplZFNjcmlwdFZhbHVlPiBtZXNzYWdlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVh
dGUodG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pKTsKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlw
dFZhbHVlPiBtZXNzYWdlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoYXJnc1swXSk7
CiAgICAgTWVzc2FnZVBvcnRBcnJheSBwb3J0QXJyYXk7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkg
PiAxKSB7CiAgICAgICAgIGlmICghZ2V0TWVzc2FnZVBvcnRBcnJheShhcmdzWzFdLCBwb3J0QXJy
YXkpKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhQb3BTdGF0ZUV2
ZW50Q3VzdG9tLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4UG9wU3RhdGVFdmVu
dEN1c3RvbS5jcHAKaW5kZXggOTljYzJkMS4uNDZlOTkyOSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhQb3BTdGF0ZUV2ZW50Q3VzdG9tLmNwcAorKysgYi9XZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFBvcFN0YXRlRXZlbnRDdXN0b20uY3BwCkBAIC00NCw3ICs0
NCw3IEBAIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFBvcFN0YXRlRXZlbnQ6OmluaXRQb3BTdGF0
ZUV2ZW50Q2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtCiAgICAgU3RyaW5nIHR5cGVBcmcgPSB2OFZh
bHVlVG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgIGJvb2wgY2FuQnViYmxlQXJnID0gYXJn
c1sxXS0+Qm9vbGVhblZhbHVlKCk7CiAgICAgYm9vbCBjYW5jZWxhYmxlQXJnID0gYXJnc1syXS0+
Qm9vbGVhblZhbHVlKCk7Ci0gICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc3RhdGVB
cmcgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh2OFZhbHVlVG9XZWJDb3JlU3RyaW5n
KGFyZ3NbM10pKTsKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBzdGF0ZUFyZyA9
IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFyZ3NbM10pOwogCiAgICAgUG9wU3RhdGVF
dmVudCogZXZlbnQgPSBWOFBvcFN0YXRlRXZlbnQ6OnRvTmF0aXZlKGFyZ3MuSG9sZGVyKCkpOwog
ICAgIGV2ZW50LT5pbml0UG9wU3RhdGVFdmVudCh0eXBlQXJnLCBjYW5CdWJibGVBcmcsIGNhbmNl
bGFibGVBcmcsIHN0YXRlQXJnLnJlbGVhc2UoKSk7CkBAIC02MSw3ICs2MSw3IEBAIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBWOFBvcFN0YXRlRXZlbnQ6OnN0YXRlQWNjZXNzb3JHZXR0ZXIodjg6Okxv
Y2FsPHY4OjpTdHJpbmc+CiAgICAgaWYgKCFzdGF0ZSkKICAgICAgICAgcmV0dXJuIHY4OjpOdWxs
KCk7CiAKLSAgICByZXR1cm4gdjhTdHJpbmdPck51bGwoc3RhdGUtPnRvU3RyaW5nKCkpOworICAg
IHJldHVybiBzdGF0ZS0+ZGVzZXJpYWxpemUoKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhXb3JrZXJDdXN0b20u
Y3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhXb3JrZXJDdXN0b20uY3BwCmluZGV4
IDZkZWM3YWYuLjQyOTFmNmQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4V29ya2VyQ3VzdG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdv
cmtlckN1c3RvbS5jcHAKQEAgLTkyLDcgKzkyLDcgQEAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4
V29ya2VyOjpwb3N0TWVzc2FnZUNhbGxiYWNrKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCiB7
CiAgICAgSU5DX1NUQVRTKCJET00uV29ya2VyLnBvc3RNZXNzYWdlIik7CiAgICAgV29ya2VyKiB3
b3JrZXIgPSBWOFdvcmtlcjo6dG9OYXRpdmUoYXJncy5Ib2xkZXIoKSk7Ci0gICAgUmVmUHRyPFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZT4gbWVzc2FnZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3Jl
YXRlKHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKSk7CisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZT4gbWVzc2FnZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFyZ3NbMF0p
OwogICAgIE1lc3NhZ2VQb3J0QXJyYXkgcG9ydEFycmF5OwogICAgIGlmIChhcmdzLkxlbmd0aCgp
ID4gMSkgewogICAgICAgICBpZiAoIWdldE1lc3NhZ2VQb3J0QXJyYXkoYXJnc1sxXSwgcG9ydEFy
cmF5KSkKZGlmZiAtLWdpdCBhL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cgYi9XZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nCmluZGV4IDNmNTY2ODMuLjU2NjdmZjMgMTAwNjQ0Ci0tLSBhL1dlYktp
dC9jaHJvbWl1bS9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwpAQCAt
MSwzICsxLDIzIEBACisyMDEwLTAxLTE1ICBWaXRhbHkgUmVwZXNoa28gIDx2aXRhbHlyQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBbVjhdIFN1cHBvcnQgU2VyaWFsaXplZFNjcmlwdFZhbHVlLgorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzI5MjAKKyAgICAgICAgaHR0cDovL2NyYnVn
LmNvbS8zMDYyMAorCisgICAgICAgIFVwZGF0ZWQgdXNlcyBvZiBTZXJpYWxpemVkU2NyaXB0VmFs
dWU6CisgICAgICAgICogc3JjL1BsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVsLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OlBsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVsOjpwb3N0TWVzc2FnZVRvUmVt
b3RlKToKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVsOjp0cnlH
ZXRNZXNzYWdlRnJvbVJlbW90ZSk6CisgICAgICAgICogc3JjL1dlYldvcmtlckJhc2UuY3BwOgor
ICAgICAgICAoV2ViS2l0OjpXZWJXb3JrZXJCYXNlOjpwb3N0TWVzc2FnZVRvV29ya2VyT2JqZWN0
KToKKyAgICAgICAgKiBzcmMvV2ViV29ya2VyQ2xpZW50SW1wbC5jcHA6CisgICAgICAgIChXZWJL
aXQ6OldlYldvcmtlckNsaWVudEltcGw6OnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0KToKKyAg
ICAgICAgKFdlYktpdDo6V2ViV29ya2VyQ2xpZW50SW1wbDo6cG9zdE1lc3NhZ2VUb1dvcmtlck9i
amVjdFRhc2spOgorICAgICAgICAqIHNyYy9XZWJXb3JrZXJJbXBsLmNwcDoKKyAgICAgICAgKFdl
YktpdDo6V2ViV29ya2VySW1wbDo6cG9zdE1lc3NhZ2VUb1dvcmtlckNvbnRleHRUYXNrKToKKwog
MjAxMC0wMS0xNCAgQnJpYW4gV2VpbnN0ZWluICA8YndlaW5zdGVpbkBhcHBsZS5jb20+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgQWRhbSBSb2Jlbi4KZGlmZiAtLWdpdCBhL1dlYktpdC9jaHJvbWl1
bS9zcmMvUGxhdGZvcm1NZXNzYWdlUG9ydENoYW5uZWwuY3BwIGIvV2ViS2l0L2Nocm9taXVtL3Ny
Yy9QbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbC5jcHAKaW5kZXggZjhjNDFkMy4uYWE0MmExMCAx
MDA2NDQKLS0tIGEvV2ViS2l0L2Nocm9taXVtL3NyYy9QbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5l
bC5jcHAKKysrIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9QbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5l
bC5jcHAKQEAgLTE3OSw3ICsxNzksNyBAQCB2b2lkIFBsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVs
Ojpwb3N0TWVzc2FnZVRvUmVtb3RlKFBhc3NPd25QdHI8TWVzc2FnZVBvcnRDaGFubgogICAgIGlm
ICghbV9sb2NhbFBvcnQgfHwgIW1fd2ViQ2hhbm5lbCkKICAgICAgICAgcmV0dXJuOwogCi0gICAg
V2ViU3RyaW5nIG1lc3NhZ2VTdHJpbmcgPSBtZXNzYWdlLT5tZXNzYWdlKCktPnRvU3RyaW5nKCk7
CisgICAgV2ViU3RyaW5nIG1lc3NhZ2VTdHJpbmcgPSBtZXNzYWdlLT5tZXNzYWdlKCktPnRvV2ly
ZVN0cmluZygpOwogICAgIE93blB0cjxXZWJDb3JlOjpNZXNzYWdlUG9ydENoYW5uZWxBcnJheT4g
Y2hhbm5lbHMgPSBtZXNzYWdlLT5jaGFubmVscygpOwogICAgIFdlYk1lc3NhZ2VQb3J0Q2hhbm5l
bEFycmF5KiB3ZWJDaGFubmVscyA9IDA7CiAgICAgaWYgKGNoYW5uZWxzLmdldCgpICYmIGNoYW5u
ZWxzLT5zaXplKCkpIHsKQEAgLTIxMSw3ICsyMTEsNyBAQCBib29sIFBsYXRmb3JtTWVzc2FnZVBv
cnRDaGFubmVsOjp0cnlHZXRNZXNzYWdlRnJvbVJlbW90ZShPd25QdHI8TWVzc2FnZVBvcnRDaGFu
bgogICAgICAgICAgICAgICAgICgqY2hhbm5lbHMpW2ldID0gTWVzc2FnZVBvcnRDaGFubmVsOjpj
cmVhdGUocGxhdGZvcm1DaGFubmVsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAg
ICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBzZXJpYWxpemVkTWVzc2FnZSA9IFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKG1lc3NhZ2UpOworICAgICAgICBSZWZQdHI8U2VyaWFs
aXplZFNjcmlwdFZhbHVlPiBzZXJpYWxpemVkTWVzc2FnZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZTo6Y3JlYXRlRnJvbVdpcmUobWVzc2FnZSk7CiAgICAgICAgIHJlc3VsdCA9IE1lc3NhZ2VQb3J0
Q2hhbm5lbDo6RXZlbnREYXRhOjpjcmVhdGUoc2VyaWFsaXplZE1lc3NhZ2UucmVsZWFzZSgpLCBj
aGFubmVscy5yZWxlYXNlKCkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVt
L3NyYy9XZWJXb3JrZXJCYXNlLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2VyQmFz
ZS5jcHAKaW5kZXggMGUzYWE0ZS4uN2ZkMzc0OSAxMDA2NDQKLS0tIGEvV2ViS2l0L2Nocm9taXVt
L3NyYy9XZWJXb3JrZXJCYXNlLmNwcAorKysgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtl
ckJhc2UuY3BwCkBAIC0xNTcsNyArMTU3LDcgQEAgdm9pZCBXZWJXb3JrZXJCYXNlOjpwb3N0TWVz
c2FnZVRvV29ya2VyT2JqZWN0KFBhc3NSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NPd25QdHI8TWVz
c2FnZVBvcnRDaGFubmVsQXJyYXk+IGNoYW5uZWxzKQogewogICAgIGRpc3BhdGNoVGFza1RvTWFp
blRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJnBvc3RNZXNzYWdlVGFzaywgdGhpcywKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPnRvU3Ry
aW5nKCksIGNoYW5uZWxzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtZXNzYWdlLT50b1dpcmVTdHJpbmcoKSwgY2hhbm5lbHMpKTsKIH0KIAogdm9p
ZCBXZWJXb3JrZXJCYXNlOjpwb3N0TWVzc2FnZVRhc2soU2NyaXB0RXhlY3V0aW9uQ29udGV4dCog
Y29udGV4dCwKZGlmZiAtLWdpdCBhL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2VyQ2xpZW50
SW1wbC5jcHAgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckNsaWVudEltcGwuY3BwCmlu
ZGV4IDZiZTAzYTcuLjU5OGEwNzggMTAwNjQ0Ci0tLSBhL1dlYktpdC9jaHJvbWl1bS9zcmMvV2Vi
V29ya2VyQ2xpZW50SW1wbC5jcHAKKysrIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJD
bGllbnRJbXBsLmNwcApAQCAtMTczLDcgKzE3Myw3IEBAIHZvaWQgV2ViV29ya2VyQ2xpZW50SW1w
bDo6cG9zdE1lc3NhZ2VUb1dvcmtlckNvbnRleHQoCiAgICAgaWYgKCFpc01haW5UaHJlYWQoKSkg
ewogICAgICAgICBXZWJXb3JrZXJCYXNlOjpkaXNwYXRjaFRhc2tUb01haW5UaHJlYWQoY3JlYXRl
Q2FsbGJhY2tUYXNrKCZwb3N0TWVzc2FnZVRvV29ya2VyQ29udGV4dFRhc2ssCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBtZXNzYWdlLT50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Ut
PnRvV2lyZVN0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzKSk7CiAgICAgICAgIHJldHVybjsK
ICAgICB9CkBAIC0xODQsNyArMTg0LDcgQEAgdm9pZCBXZWJXb3JrZXJDbGllbnRJbXBsOjpwb3N0
TWVzc2FnZVRvV29ya2VyQ29udGV4dCgKICAgICAgICAgd2ViY2hhbm5lbC0+c2V0Q2xpZW50KDAp
OwogICAgICAgICB3ZWJDaGFubmVsc1tpXSA9IHdlYmNoYW5uZWw7CiAgICAgfQotICAgIG1fd2Vi
V29ya2VyLT5wb3N0TWVzc2FnZVRvV29ya2VyQ29udGV4dChtZXNzYWdlLT50b1N0cmluZygpLCB3
ZWJDaGFubmVscyk7CisgICAgbV93ZWJXb3JrZXItPnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0
KG1lc3NhZ2UtPnRvV2lyZVN0cmluZygpLCB3ZWJDaGFubmVscyk7CiB9CiAKIGJvb2wgV2ViV29y
a2VyQ2xpZW50SW1wbDo6aGFzUGVuZGluZ0FjdGl2aXR5KCkgY29uc3QKQEAgLTM1Niw3ICszNTYs
NyBAQCB2b2lkIFdlYldvcmtlckNsaWVudEltcGw6OnBvc3RNZXNzYWdlVG9Xb3JrZXJPYmplY3RU
YXNrKAogICAgICAgICBPd25QdHI8TWVzc2FnZVBvcnRBcnJheT4gcG9ydHMgPQogICAgICAgICAg
ICAgTWVzc2FnZVBvcnQ6OmVudGFuZ2xlUG9ydHMoKmNvbnRleHQsIGNoYW5uZWxzLnJlbGVhc2Uo
KSk7CiAgICAgICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRNZXNz
YWdlID0KLSAgICAgICAgICAgIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKG1lc3NhZ2Up
OworICAgICAgICAgICAgU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGVGcm9tV2lyZShtZXNz
YWdlKTsKICAgICAgICAgdGhpc1B0ci0+bV93b3JrZXItPmRpc3BhdGNoRXZlbnQoTWVzc2FnZUV2
ZW50OjpjcmVhdGUocG9ydHMucmVsZWFzZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTWVzc2FnZS5yZWxl
YXNlKCkpKTsKICAgICB9CmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtl
ckltcGwuY3BwIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJJbXBsLmNwcAppbmRleCA3
NDRiZTMwLi41YjVlMDUzIDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtl
ckltcGwuY3BwCisrKyBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2VySW1wbC5jcHAKQEAg
LTg4LDcgKzg4LDcgQEAgdm9pZCBXZWJXb3JrZXJJbXBsOjpwb3N0TWVzc2FnZVRvV29ya2VyQ29u
dGV4dFRhc2soV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGUKICAgICBPd25QdHI8TWVzc2Fn
ZVBvcnRBcnJheT4gcG9ydHMgPQogICAgICAgICBNZXNzYWdlUG9ydDo6ZW50YW5nbGVQb3J0cygq
Y29udGV4dCwgY2hhbm5lbHMucmVsZWFzZSgpKTsKICAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlw
dFZhbHVlPiBzZXJpYWxpemVkTWVzc2FnZSA9Ci0gICAgICAgIFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZTo6Y3JlYXRlKG1lc3NhZ2UpOworICAgICAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0
ZUZyb21XaXJlKG1lc3NhZ2UpOwogICAgIHdvcmtlckNvbnRleHQtPmRpc3BhdGNoRXZlbnQoTWVz
c2FnZUV2ZW50OjpjcmVhdGUoCiAgICAgICAgIHBvcnRzLnJlbGVhc2UoKSwgc2VyaWFsaXplZE1l
c3NhZ2UucmVsZWFzZSgpKSk7CiAgICAgdGhpc1B0ci0+Y29uZmlybU1lc3NhZ2VGcm9tV29ya2Vy
T2JqZWN0KHdvcmtlckNvbnRleHQtPmhhc1BlbmRpbmdBY3Rpdml0eSgpKTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46679</attachid>
            <date>2010-01-15 07:19:11 -0800</date>
            <delta_ts>2010-01-19 14:34:21 -0800</delta_ts>
            <desc>patch v3.1: fix style issue</desc>
            <filename>serialize.patch</filename>
            <type>text/plain</type>
            <size>40856</size>
            <attacher name="Vitaly Repeshko">vitalyr</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
Y2VmNmRlMi4uOTQzMmUxNCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw5OCBAQAorMjAxMC0wMS0xNSAgVml0YWx5IFJlcGVz
aGtvICA8dml0YWx5ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgW1Y4XSBTdXBwb3J0IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMyOTIwCisg
ICAgICAgIGh0dHA6Ly9jcmJ1Zy5jb20vMzA2MjAKKworICAgICAgICBJbml0aWFsIGltcGxlbWVu
dGF0aW9uIG9mIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSB3aGljaCBpcyB1c2VkIHRvCisgICAgICAg
IHRvIGNyZWF0ZSBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgSmF2YVNjcmlwdCBvYmpl
Y3RzLiAgVGhpcworICAgICAgICByZXByZXNlbnRhdGlvbiBpcyBuZWVkZWQgZm9yIHN0cnVjdHVy
ZWQgY2xvbmVzIGFuZCB3b3JrZXIgbWVzc2FnZXMuCisKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6
IEFkZGVkIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAuCisgICAgICAgICogYmluZGluZ3Mvc2Ny
aXB0cy9Db2RlR2VuZXJhdG9yVjgucG06IFJlbW92ZWQgY29udmVyc2lvbiB0byBzdHJpbmcgYmVm
b3JlIHVzaW5nIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4KKyAgICAgICAgKiBiaW5kaW5ncy92OC9T
ZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Oik6Cisg
ICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWda
YWc6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OldyaXRlcik6CisgICAgICAg
IChXZWJDb3JlOjpXcml0ZXI6OndyaXRlVW5kZWZpbmVkKToKKyAgICAgICAgKFdlYkNvcmU6Oldy
aXRlcjo6d3JpdGVOdWxsKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVUcnVlKToK
KyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVGYWxzZSk6CisgICAgICAgIChXZWJDb3Jl
OjpXcml0ZXI6OndyaXRlU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVJ
bnQzMik6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OndyaXRlTnVtYmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OldyaXRlcjo6ZW5kQ29tcG9zaXRlKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRl
cjo6ZGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OmRvV3JpdGVVaW50MzIpOgorICAg
ICAgICAoV2ViQ29yZTo6V3JpdGVyOjphcHBlbmQpOgorICAgICAgICAoV2ViQ29yZTo6V3JpdGVy
OjplbnN1cmVTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OmZpbGxIb2xlKToKKyAg
ICAgICAgKFdlYkNvcmU6OldyaXRlcjo6Y2hhckF0KToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlh
bGl6ZXI6OlNlcmlhbGl6ZXIpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6c2VyaWFs
aXplKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0YXRlQmFzZTo6flN0YXRlQmFz
ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6Om5leHRTdGF0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OnNldE5leHRTdGF0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OmNvbXBvc2l0ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OlN0YXRlQmFzZSk6CisgICAg
ICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZTo6Y29tcG9zaXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OlNlcmlhbGl6ZXI6OlN0YXRlOjp0YWcpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFs
aXplcjo6U3RhdGU6OlN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0YWNr
Q2xlYW5lcjo6U3RhY2tDbGVhbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0
YWNrQ2xlYW5lcjo6flN0YWNrQ2xlYW5lcik6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVy
OjpBcnJheVN0YXRlOjpBcnJheVN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6
OkFycmF5U3RhdGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6QXJyYXlT
dGF0ZTo6YWR2YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpPYmplY3RTdGF0
ZTo6T2JqZWN0U3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3Rh
dGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3RhdGU6OmFk
dmFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3RhdGU6Om5leHRQ
cm9wZXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpkb1NlcmlhbGl6ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpwdXNoKToKKyAgICAgICAgKFdlYkNvcmU6OlNl
cmlhbGl6ZXI6OnRvcCk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpwb3ApOgorICAg
ICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6Y2hlY2tDb21wb3NpdGUpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVhZGVyOjpSZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVhZGVyOjppc0VvZik6
CisgICAgICAgIChXZWJDb3JlOjpSZWFkZXI6OnJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVh
ZGVyOjpyZWFkVGFnKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWRlcjo6cmVhZFN0cmluZyk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZWFkZXI6OnJlYWRJbnQzMik6CisgICAgICAgIChXZWJDb3JlOjpS
ZWFkZXI6OnJlYWROdW1iZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVhZGVyOjpkb1JlYWRVaW50
MzIpOgorICAgICAgICAoV2ViQ29yZTo6RGVzZXJpYWxpemVyOjpEZXNlcmlhbGl6ZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6RGVzZXJpYWxpemVyOjpkZXNlcmlhbGl6ZSk6CisgICAgICAgIChXZWJD
b3JlOjpEZXNlcmlhbGl6ZXI6OmRvRGVzZXJpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6RGVz
ZXJpYWxpemVyOjpwdXNoKToKKyAgICAgICAgKFdlYkNvcmU6OkRlc2VyaWFsaXplcjo6cG9wKToK
KyAgICAgICAgKFdlYkNvcmU6OkRlc2VyaWFsaXplcjo6c3RhY2tEZXB0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpEZXNlcmlhbGl6ZXI6OmVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFs
aXplZFNjcmlwdFZhbHVlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWUpOgorICAgICAgICAoV2ViQ29y
ZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpkZXNlcmlhbGl6ZSk6CisgICAgICAgICogYmluZGlu
Z3MvdjgvU2VyaWFsaXplZFNjcmlwdFZhbHVlLmg6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxp
emVkU2NyaXB0VmFsdWU6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2Ny
aXB0VmFsdWU6OmNyZWF0ZUZyb21XaXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZTo6cmVsZWFzZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0
VmFsdWU6OnRvV2lyZVN0cmluZyk6CisKKyAgICAgICAgVXBkYXRlZCB1c2VzIG9mIFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dD
dXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhET01XaW5kb3c6OnBvc3RNZXNzYWdlQ2Fs
bGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOERlZGljYXRlZFdvcmtlckNv
bnRleHRDdXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhEZWRpY2F0ZWRXb3JrZXJDb250
ZXh0Ojpwb3N0TWVzc2FnZUNhbGxiYWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20v
VjhIaXN0b3J5Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4SGlzdG9yeTo6cHVzaFN0
YXRlQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6VjhIaXN0b3J5OjpyZXBsYWNlU3RhdGVD
YWxsYmFjayk6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3Vz
dG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4TWVzc2FnZUV2ZW50Ojppbml0TWVzc2FnZUV2
ZW50Q2FsbGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0
Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4TWVzc2FnZVBvcnQ6OnBvc3RNZXNzYWdl
Q2FsbGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckN1c3RvbS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpWOFdvcmtlcjo6cG9zdE1lc3NhZ2VDYWxsYmFjayk6CisK
IDIwMTAtMDEtMTQgIEp1bmdzaGlrIFNoaW4gIDxqc2hpbkBjaHJvbWl1bS5vcmc+CiAKICAgICAg
ICAgVW5yZXZpZXdlZCwgYXR0ZW1wdGVkIGJ1aWxkIGZpeCBvbiBjaHJvbWl1bS4KZGlmZiAtLWdp
dCBhL1dlYkNvcmUvV2ViQ29yZS5neXBpIGIvV2ViQ29yZS9XZWJDb3JlLmd5cGkKaW5kZXggMmE2
MTBiMi4uNjEzMzYwZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvV2Vi
Q29yZS9XZWJDb3JlLmd5cGkKQEAgLTc5NSw2ICs3OTUsNyBAQAogICAgICAgICAgICAgJ2JpbmRp
bmdzL3Y4L1NjcmlwdFN0cmluZ0ltcGwuaCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvU2Ny
aXB0VmFsdWUuY3BwJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9TY3JpcHRWYWx1ZS5oJywK
KyAgICAgICAgICAgICdiaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwJywKICAg
ICAgICAgICAgICdiaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuaCcsCiAgICAgICAg
ICAgICAnYmluZGluZ3Mvdjgvc3BlY2lhbGl6YXRpb24vVjhCaW5kaW5nRE9NV2luZG93LmgnLAog
ICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L3NwZWNpYWxpemF0aW9uL1Y4QmluZGluZ1N0YXRlLmNw
cCcsCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4
LnBtIGIvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5wbQppbmRleCAw
OTE1NTIyLi5jOGQxYjAyIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvQ29k
ZUdlbmVyYXRvclY4LnBtCisrKyBiL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJh
dG9yVjgucG0KQEAgLTI1NDEsNyArMjU0MSw3IEBAIHN1YiBSZXR1cm5OYXRpdmVUb0pTVmFsdWUK
IAogICAgIGlmICgkdHlwZSBlcSAiU2VyaWFsaXplZFNjcmlwdFZhbHVlIikgewogICAgICAgICAk
aW1wbEluY2x1ZGVzeyIkdHlwZS5oIn0gPSAxOwotICAgICAgICByZXR1cm4gInJldHVybiB2OFN0
cmluZygkdmFsdWUtPnRvU3RyaW5nKCkpIjsKKyAgICAgICAgcmV0dXJuICJyZXR1cm4gJHZhbHVl
LT5kZXNlcmlhbGl6ZSgpIjsKICAgICB9CiAKICAgICBpZiAoJHR5cGUgZXEgIkRlZGljYXRlZFdv
cmtlckNvbnRleHQiIG9yICR0eXBlIGVxICJXb3JrZXJDb250ZXh0IiBvciAkdHlwZSBlcSAiU2hh
cmVkV29ya2VyQ29udGV4dCIpIHsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvU2Vy
aWFsaXplZFNjcmlwdFZhbHVlLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvU2VyaWFsaXplZFNj
cmlwdFZhbHVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWYxZjQy
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0
VmFsdWUuY3BwCkBAIC0wLDAgKzEsNjk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUK
KyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5l
aXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP
UFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgorCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCisK
KyNpbmNsdWRlIDx2OC5oPgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVkZSA8
d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKKy8vIEZJWE1FOgor
Ly8gLSBjYXRjaCBWOCBleGNlcHRpb25zCisvLyAtIGJlIHJlYWR5IHRvIGdldCBlbXB0eSBoYW5k
bGVzCisvLyAtIGNvbnNpZGVyIGNyYXNoaW5nIGluIGRlYnVnIG1vZGUgb24gZGVzZXJpYWxpemF0
aW9uIGVycm9ycworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK25hbWVzcGFjZSB7CisKK3R5cGVk
ZWYgVUNoYXIgQnVmZmVyVmFsdWVUeXBlOworCisvLyBTZXJpYWxpemF0aW9uIGZvcm1hdCBpcyBh
IHNlcXVlbmNlIG9mICh0YWcsIG9wdGlvbmFsIGRhdGEpCisvLyBwYWlycy4gVGFnIGFsd2F5cyB0
YWtlcyBleGFjdGx5IG9uZSBieXRlLgorZW51bSBTZXJpYWxpemF0aW9uVGFnIHsKKyAgICBJbnZh
bGlkVGFnID0gJyEnLAorICAgIFBhZGRpbmdUYWcgPSAnXDAnLAorICAgIFVuZGVmaW5lZFRhZyA9
ICdfJywKKyAgICBOdWxsVGFnID0gJzAnLAorICAgIFRydWVUYWcgPSAnVCcsCisgICAgRmFsc2VU
YWcgPSAnRicsCisgICAgU3RyaW5nVGFnID0gJ1MnLAorICAgIEludDMyVGFnID0gJ0knLAorICAg
IE51bWJlclRhZyA9ICdOJywKKyAgICBPYmplY3RUYWcgPSAneycsCisgICAgQXJyYXlUYWcgPSAn
WycsCit9OworCisvLyBIZWxwZXJzIHRvIGRvIHZlcmJvc2UgaGFuZGxlIGNhc3RzLgorCit0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0YXRpYyB2ODo6SGFuZGxlPFQ+IGhhbmRs
ZUNhc3Qodjg6OkhhbmRsZTxVPiBoYW5kbGUpIHsgcmV0dXJuIHY4OjpIYW5kbGU8VD46OkNhc3Qo
aGFuZGxlKTsgfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0YXRpYyB2
ODo6TG9jYWw8VD4gaGFuZGxlQ2FzdCh2ODo6TG9jYWw8VT4gaGFuZGxlKSB7IHJldHVybiB2ODo6
TG9jYWw8VD46OkNhc3QoaGFuZGxlKTsgfQorCitzdGF0aWMgYm9vbCBzaG91bGRDaGVja0ZvckN5
Y2xlcyhpbnQgZGVwdGgpCit7CisgICAgQVNTRVJUKGRlcHRoID49IDApOworICAgIC8vIFNpbmNl
IHdlIGFyZSBub3QgcmVxdWlyZWQgdG8gc3BvdCB0aGUgY3ljbGUgYXMgc29vbiBhcyBpdAorICAg
IC8vIGhhcHBlbnMgd2UgY2FuIGNoZWNrIGZvciBjeWNsZXMgb25seSB3aGVuIHRoZSBjdXJyZW50
IGRlcHRoCisgICAgLy8gaXMgYSBwb3dlciBvZiB0d28uCisgICAgcmV0dXJuICEoZGVwdGggJiAo
ZGVwdGggLSAxKSk7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgbWF4RGVwdGggPSAyMDAwMDsKKwor
Ly8gVmFySW50IGVuY29kaW5nIGNvbnN0YW50cy4KK3N0YXRpYyBjb25zdCBpbnQgdmFySW50U2hp
ZnQgPSA3Oworc3RhdGljIGNvbnN0IGludCB2YXJJbnRNYXNrID0gKDEgPDwgdmFySW50U2hpZnQp
IC0gMTsKKworLy8gWmlnWmFnIGVuY29kaW5nIGhlbHBzIFZhckludCBlbmNvZGluZyBzdGF5IHNt
YWxsIGZvciBuZWdhdGl2ZQorLy8gbnVtYmVycyB3aXRoIHNtYWxsIGFic29sdXRlIHZhbHVlcy4K
K2NsYXNzIFppZ1phZyB7CitwdWJsaWM6CisgICAgc3RhdGljIHVpbnQzMl90IGVuY29kZSh1aW50
MzJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSAmICgxVSA8PCAzMSkpCisgICAg
ICAgICAgICB2YWx1ZSA9ICgofnZhbHVlKSA8PCAxKSArIDE7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIHZhbHVlIDw8PSAxOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAg
c3RhdGljIHVpbnQzMl90IGRlY29kZSh1aW50MzJfdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlm
ICh2YWx1ZSAmIDEpCisgICAgICAgICAgICB2YWx1ZSA9IH4odmFsdWUgPj4gMSk7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIHZhbHVlID4+PSAxOworICAgICAgICByZXR1cm4gdmFsdWU7Cisg
ICAgfQorCitwcml2YXRlOgorICAgIFppZ1phZygpOworfTsKKworLy8gV3JpdGVyIGlzIHJlc3Bv
bnNpYmxlIGZvciBzZXJpYWxpemluZyBwcmltaXRpdmUgdHlwZXMgYW5kIHN0b3JpbmcKKy8vIGlu
Zm9ybWF0aW9uIHVzZWQgdG8gcmVjb25zdHJ1Y3QgY29tcG9zaXRlIHR5cGVzLgorY2xhc3MgV3Jp
dGVyIDogTm9uY29weWFibGUgeworcHVibGljOgorICAgIFdyaXRlcigpIDogbV9wb3NpdGlvbigw
KQorICAgIHsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBmdW5jdGlvbnMgZm9yIHByaW1pdGl2ZSB0
eXBlcy4KKworICAgIHZvaWQgd3JpdGVVbmRlZmluZWQoKSB7IGFwcGVuZChVbmRlZmluZWRUYWcp
OyB9CisKKyAgICB2b2lkIHdyaXRlTnVsbCgpIHsgYXBwZW5kKE51bGxUYWcpOyB9CisKKyAgICB2
b2lkIHdyaXRlVHJ1ZSgpIHsgYXBwZW5kKFRydWVUYWcpOyB9CisKKyAgICB2b2lkIHdyaXRlRmFs
c2UoKSB7IGFwcGVuZChGYWxzZVRhZyk7IH0KKworICAgIHZvaWQgd3JpdGVTdHJpbmcoY29uc3Qg
Y2hhciogZGF0YSwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIGFwcGVuZChTdHJpbmdUYWcp
OworICAgICAgICBkb1dyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihsZW5ndGgpKTsK
KyAgICAgICAgYXBwZW5kKGRhdGEsIGxlbmd0aCk7CisgICAgfQorCisgICAgdm9pZCB3cml0ZUlu
dDMyKGludDMyX3QgdmFsdWUpCisgICAgeworICAgICAgICBhcHBlbmQoSW50MzJUYWcpOworICAg
ICAgICBkb1dyaXRlVWludDMyKFppZ1phZzo6ZW5jb2RlKHN0YXRpY19jYXN0PHVpbnQzMl90Pih2
YWx1ZSkpKTsKKyAgICB9CisKKyAgICB2b2lkIHdyaXRlTnVtYmVyKGRvdWJsZSBudW1iZXIpCisg
ICAgeworICAgICAgICBhcHBlbmQoTnVtYmVyVGFnKTsKKyAgICAgICAgYXBwZW5kKHJlaW50ZXJw
cmV0X2Nhc3Q8Y2hhcio+KCZudW1iZXIpLCBzaXplb2YobnVtYmVyKSk7CisgICAgfQorCisgICAg
Ly8gUmVjb3JkcyB0aGF0IGEgY29tcG9zaXRlIG9iamVjdCBjYW4gYmUgY29uc3RydWN0ZWQgYnkg
dXNpbmcKKyAgICAvLyB8bGVuZ3RofCBwcmV2aW91c2x5IHN0b3JlZCB2YWx1ZXMuCisgICAgdm9p
ZCBlbmRDb21wb3NpdGUoU2VyaWFsaXphdGlvblRhZyB0YWcsIGludDMyX3QgbGVuZ3RoKQorICAg
IHsKKyAgICAgICAgQVNTRVJUKHRhZyA9PSBPYmplY3RUYWcgfHwgdGFnID09IEFycmF5VGFnKTsK
KyAgICAgICAgYXBwZW5kKHRhZyk7CisgICAgICAgIGRvV3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8
dWludDMyX3Q+KGxlbmd0aCkpOworICAgIH0KKworICAgIFZlY3RvcjxCdWZmZXJWYWx1ZVR5cGU+
JiBkYXRhKCkKKyAgICB7CisgICAgICAgIGZpbGxIb2xlKCk7CisgICAgICAgIHJldHVybiBtX2J1
ZmZlcjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBkb1dyaXRlVWludDMyKHVpbnQzMl90
IHZhbHVlKQorICAgIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGNoYXIg
YiA9ICh2YWx1ZSAmIHZhckludE1hc2spOworICAgICAgICAgICAgdmFsdWUgPj49IHZhckludFNo
aWZ0OworICAgICAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgICAgIGFwcGVuZChi
KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFw
cGVuZChiIHwgKDEgPDwgdmFySW50U2hpZnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZv
aWQgYXBwZW5kKFNlcmlhbGl6YXRpb25UYWcgdGFnKQorICAgIHsKKyAgICAgICAgYXBwZW5kKHN0
YXRpY19jYXN0PGNoYXI+KHRhZykpOworICAgIH0KKworICAgIHZvaWQgYXBwZW5kKGNoYXIgYikK
KyAgICB7CisgICAgICAgIGVuc3VyZVNwYWNlKDEpOworICAgICAgICAqY2hhckF0KG1fcG9zaXRp
b24rKykgPSBiOworICAgIH0KKworICAgIHZvaWQgYXBwZW5kKGNvbnN0IGNoYXIqIGRhdGEsIGlu
dCBsZW5ndGgpCisgICAgeworICAgICAgICBlbnN1cmVTcGFjZShsZW5ndGgpOworICAgICAgICBt
ZW1jcHkoY2hhckF0KG1fcG9zaXRpb24pLCBkYXRhLCBsZW5ndGgpOworICAgICAgICBtX3Bvc2l0
aW9uICs9IGxlbmd0aDsKKyAgICB9CisKKyAgICB2b2lkIGVuc3VyZVNwYWNlKGludCBleHRyYSkK
KyAgICB7CisgICAgICAgIENPTVBJTEVfQVNTRVJUKHNpemVvZihCdWZmZXJWYWx1ZVR5cGUpID09
IDIsIEJ1ZmZlclZhbHVlVHlwZUlzVHdvQnl0ZXMpOworICAgICAgICBtX2J1ZmZlci5ncm93KCht
X3Bvc2l0aW9uICsgZXh0cmEgKyAxKSAvIDIpOyAvLyAiKyAxIiB0byByb3VuZCB1cC4KKyAgICB9
CisKKyAgICB2b2lkIGZpbGxIb2xlKCkKKyAgICB7CisgICAgICAgIENPTVBJTEVfQVNTRVJUKHNp
emVvZihCdWZmZXJWYWx1ZVR5cGUpID09IDIsIEJ1ZmZlclZhbHVlVHlwZUlzVHdvQnl0ZXMpOwor
ICAgICAgICAvLyBJZiB0aGUgd3JpdGVyIGlzIGF0IG9kZCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVy
LCB0aGVuIG9uZSBvZgorICAgICAgICAvLyB0aGUgYnl0ZXMgaW4gdGhlIGxhc3QgVUNoYXIgaXMg
bm90IGluaXRpYWxpemVkLgorICAgICAgICBpZiAobV9wb3NpdGlvbiAlIDIpCisgICAgICAgICAg
ICAqY2hhckF0KG1fcG9zaXRpb24pID0gc3RhdGljX2Nhc3Q8Y2hhcj4oUGFkZGluZ1RhZyk7Cisg
ICAgfQorCisgICAgY2hhciogY2hhckF0KGludCBwb3NpdGlvbikgeyByZXR1cm4gcmVpbnRlcnBy
ZXRfY2FzdDxjaGFyKj4obV9idWZmZXIuZGF0YSgpKSArIHBvc2l0aW9uOyB9CisKKyAgICBWZWN0
b3I8QnVmZmVyVmFsdWVUeXBlPiBtX2J1ZmZlcjsKKyAgICBpbnQgbV9wb3NpdGlvbjsKK307CisK
K2NsYXNzIFNlcmlhbGl6ZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNlcmlhbGl6ZXIoV3Jp
dGVyJiB3cml0ZXIpCisgICAgICAgIDogbV93cml0ZXIod3JpdGVyKQorICAgICAgICAsIG1fc3Rh
dGUoMCkKKyAgICAgICAgLCBtX2RlcHRoKDApCisgICAgeworICAgIH0KKworICAgIGJvb2wgc2Vy
aWFsaXplKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKKyAgICB7CisgICAgICAgIHY4OjpI
YW5kbGVTY29wZSBzY29wZTsKKyAgICAgICAgU3RhY2tDbGVhbmVyIGNsZWFuZXIoJm1fc3RhdGUp
OworICAgICAgICBpZiAoIWRvU2VyaWFsaXplKHZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgd2hpbGUgKHRvcCgpKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoOwor
ICAgICAgICAgICAgd2hpbGUgKCF0b3AoKS0+aXNEb25lKCZsZW5ndGgpKSB7CisgICAgICAgICAg
ICAgICAgLy8gTm90ZSB0aGF0IGRvU2VyaWFsaXplKCkgY2FuIGNoYW5nZSBjdXJyZW50IHRvcCgp
LgorICAgICAgICAgICAgICAgIGlmICghZG9TZXJpYWxpemUodG9wKCktPmFkdmFuY2UoKSkpCisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIG1fd3JpdGVyLmVuZENvbXBvc2l0ZSh0b3AoKS0+dGFnKCksIGxlbmd0aCk7CisgICAgICAg
ICAgICBwb3AoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK3By
aXZhdGU6CisgICAgY2xhc3MgU3RhdGVCYXNlIDogcHVibGljIE5vbmNvcHlhYmxlIHsKKyAgICBw
dWJsaWM6CisgICAgICAgIHZpcnR1YWwgflN0YXRlQmFzZSgpIHsgfQorCisgICAgICAgIC8vIExp
bmsgdG8gdGhlIG5leHQgc3RhdGUgdG8gZm9ybSBhIHN0YWNrLgorICAgICAgICBTdGF0ZUJhc2Uq
IG5leHRTdGF0ZSgpIHsgcmV0dXJuIG1fbmV4dDsgfQorICAgICAgICB2b2lkIHNldE5leHRTdGF0
ZShTdGF0ZUJhc2UqIG5leHQpIHsgbV9uZXh0ID0gbmV4dDsgfQorCisgICAgICAgIC8vIENvbXBv
c2l0ZSBvYmplY3Qgd2UncmUgcHJvY2Vzc2luZyBpbiB0aGlzIHN0YXRlLgorICAgICAgICB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gY29tcG9zaXRlKCkgeyByZXR1cm4gbV9jb21wb3NpdGU7IH0KKwor
ICAgICAgICAvLyBTZXJpYWxpemF0aW9uIHRhZyBmb3IgdGhlIGN1cnJlbnQgY29tcG9zaXRlLgor
ICAgICAgICB2aXJ0dWFsIFNlcmlhbGl6YXRpb25UYWcgdGFnKCkgY29uc3QgPSAwOworCisgICAg
ICAgIC8vIFJldHVybnMgd2hldGhlciBpdGVyYXRpb24gb3ZlciBzdWJvYmplY3RzIG9mIHRoZSBj
dXJyZW50CisgICAgICAgIC8vIGNvbXBvc2l0ZSBvYmplY3QgaXMgZG9uZS4gSWYgeWVzLCB8Kmxl
bmd0aHwgaXMgc2V0IHRvIHRoZQorICAgICAgICAvLyBudW1iZXIgb2Ygc3Vib2JqZWN0cy4KKyAg
ICAgICAgdmlydHVhbCBib29sIGlzRG9uZShpbnQqIGxlbmd0aCkgPSAwOworCisgICAgICAgIC8v
IEFkdmFuY2VzIHRvIHRoZSBuZXh0IHN1Ym9iamVjdC4KKyAgICAgICAgLy8gUmVxdWlyZXM6ICF0
aGlzLT5pc0RvbmUoKS4KKyAgICAgICAgdmlydHVhbCB2ODo6TG9jYWw8djg6OlZhbHVlPiBhZHZh
bmNlKCkgPSAwOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBTdGF0ZUJhc2Uodjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IGNvbXBvc2l0ZSkKKyAgICAgICAgICAgIDogbV9uZXh0KDApCisgICAgICAg
ICAgICAsIG1fY29tcG9zaXRlKGNvbXBvc2l0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAg
ICBwcml2YXRlOgorICAgICAgICBTdGF0ZUJhc2UqIG1fbmV4dDsKKyAgICAgICAgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IG1fY29tcG9zaXRlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVCwgU2VyaWFsaXphdGlvblRhZyBjb21wb3NpdGVUYWc+CisgICAgY2xhc3MgU3RhdGUgOiBw
dWJsaWMgU3RhdGVCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHY4OjpIYW5kbGU8VD4gY29t
cG9zaXRlKCkgeyByZXR1cm4gaGFuZGxlQ2FzdDxUPihTdGF0ZUJhc2U6OmNvbXBvc2l0ZSgpKTsg
fQorCisgICAgICAgIHZpcnR1YWwgU2VyaWFsaXphdGlvblRhZyB0YWcoKSBjb25zdCB7IHJldHVy
biBjb21wb3NpdGVUYWc7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgZXhwbGljaXQgU3Rh
dGUodjg6OkhhbmRsZTxUPiBjb21wb3NpdGUpIDogU3RhdGVCYXNlKGNvbXBvc2l0ZSkKKyAgICAg
ICAgeworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIEhlbHBlciB0byBjbGVhbiB1cCB0aGUg
c3RhdGUgc3RhY2sgaW4gY2FzZSBvZiBlcnJvcnMuCisgICAgY2xhc3MgU3RhY2tDbGVhbmVyIDog
Tm9uY29weWFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgU3RhY2tDbGVhbmVy
KFN0YXRlQmFzZSoqIHN0YWNrKSA6IG1fc3RhY2soc3RhY2spCisgICAgICAgIHsKKyAgICAgICAg
fQorCisgICAgICAgIH5TdGFja0NsZWFuZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBTdGF0
ZUJhc2UqIHN0YXRlID0gKm1fc3RhY2s7CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUpIHsKKyAg
ICAgICAgICAgICAgICBTdGF0ZUJhc2UqIHRtcCA9IHN0YXRlLT5uZXh0U3RhdGUoKTsKKyAgICAg
ICAgICAgICAgICBkZWxldGUgc3RhdGU7CisgICAgICAgICAgICAgICAgc3RhdGUgPSB0bXA7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICAqbV9zdGFjayA9IDA7CisgICAgICAgIH0KKworICAg
IHByaXZhdGU6CisgICAgICAgIFN0YXRlQmFzZSoqIG1fc3RhY2s7CisgICAgfTsKKworICAgIGNs
YXNzIEFycmF5U3RhdGUgOiBwdWJsaWMgU3RhdGU8djg6OkFycmF5LCBBcnJheVRhZz4geworICAg
IHB1YmxpYzoKKyAgICAgICAgQXJyYXlTdGF0ZSh2ODo6SGFuZGxlPHY4OjpBcnJheT4gYXJyYXkp
CisgICAgICAgICAgICA6IFN0YXRlPHY4OjpBcnJheSwgQXJyYXlUYWc+KGFycmF5KQorICAgICAg
ICAgICAgLCBtX2luZGV4KDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1
YWwgYm9vbCBpc0RvbmUoaW50KiBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgICpsZW5n
dGggPSBjb21wb3NpdGUoKS0+TGVuZ3RoKCk7CisgICAgICAgICAgICByZXR1cm4gbV9pbmRleCA+
PSAqbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2ODo6TG9jYWw8djg6OlZh
bHVlPiBhZHZhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKG1faW5kZXggPCBj
b21wb3NpdGUoKS0+TGVuZ3RoKCkpOworICAgICAgICAgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3Bl
OworICAgICAgICAgICAgcmV0dXJuIHNjb3BlLkNsb3NlKGNvbXBvc2l0ZSgpLT5HZXQodjg6Oklu
dGVnZXI6Ok5ldyhtX2luZGV4KyspKSk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAg
ICAgIGludCBtX2luZGV4OworICAgIH07CisKKyAgICBjbGFzcyBPYmplY3RTdGF0ZSA6IHB1Ymxp
YyBTdGF0ZTx2ODo6T2JqZWN0LCBPYmplY3RUYWc+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIE9i
amVjdFN0YXRlKHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqZWN0KQorICAgICAgICAgICAgOiBT
dGF0ZTx2ODo6T2JqZWN0LCBPYmplY3RUYWc+KG9iamVjdCkKKyAgICAgICAgICAgICwgbV9wcm9w
ZXJ0eU5hbWVzKG9iamVjdC0+R2V0UHJvcGVydHlOYW1lcygpKQorICAgICAgICAgICAgLCBtX2lu
ZGV4KC0xKQorICAgICAgICAgICAgLCBtX2xlbmd0aCgwKQorICAgICAgICB7CisgICAgICAgICAg
ICBuZXh0UHJvcGVydHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0Rv
bmUoaW50KiBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgICpsZW5ndGggPSBtX2xlbmd0
aDsKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4ID49IDIgKiBtX3Byb3BlcnR5TmFtZXMtPkxl
bmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2ODo6TG9jYWw8djg6OlZhbHVl
PiBhZHZhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKG1faW5kZXggPCAyICog
bV9wcm9wZXJ0eU5hbWVzLT5MZW5ndGgoKSk7CisgICAgICAgICAgICBpZiAoIShtX2luZGV4ICUg
MikpIHsKKyAgICAgICAgICAgICAgICArK21faW5kZXg7CisgICAgICAgICAgICAgICAgcmV0dXJu
IG1fcHJvcGVydHlOYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdjg6OkxvY2FsPHY4
OjpWYWx1ZT4gcmVzdWx0ID0gY29tcG9zaXRlKCktPkdldChtX3Byb3BlcnR5TmFtZSk7CisgICAg
ICAgICAgICBuZXh0UHJvcGVydHkoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAg
ICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbmV4dFByb3BlcnR5KCkKKyAgICAg
ICAgeworICAgICAgICAgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgICAgICAgICAgKytt
X2luZGV4OworICAgICAgICAgICAgQVNTRVJUKCEobV9pbmRleCAlIDIpKTsKKyAgICAgICAgICAg
IGZvciAoOyBtX2luZGV4IDwgMiAqIG1fcHJvcGVydHlOYW1lcy0+TGVuZ3RoKCk7IG1faW5kZXgg
Kz0gMikgeworICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHByb3BlcnR5TmFt
ZSA9IG1fcHJvcGVydHlOYW1lcy0+R2V0KHY4OjpJbnRlZ2VyOjpOZXcobV9pbmRleCAvIDIpKTsK
KyAgICAgICAgICAgICAgICBpZiAoKHByb3BlcnR5TmFtZS0+SXNTdHJpbmcoKSAmJiBjb21wb3Np
dGUoKS0+SGFzUmVhbE5hbWVkUHJvcGVydHkoaGFuZGxlQ2FzdDx2ODo6U3RyaW5nPihwcm9wZXJ0
eU5hbWUpKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHByb3BlcnR5TmFtZS0+SXNJbnQzMigp
ICYmIGNvbXBvc2l0ZSgpLT5IYXNSZWFsSW5kZXhlZFByb3BlcnR5KHByb3BlcnR5TmFtZS0+VWlu
dDMyVmFsdWUoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1fcHJvcGVydHlOYW1lID0gc2Nv
cGUuQ2xvc2UocHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbV9sZW5ndGggKz0g
MjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IG1fcHJv
cGVydHlOYW1lczsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gbV9wcm9wZXJ0eU5hbWU7
CisgICAgICAgIGludCBtX2luZGV4OworICAgICAgICBpbnQgbV9sZW5ndGg7CisgICAgfTsKKwor
ICAgIGJvb2wgZG9TZXJpYWxpemUodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQorICAgIHsK
KyAgICAgICAgaWYgKHZhbHVlLT5Jc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgbV93cml0ZXIu
d3JpdGVVbmRlZmluZWQoKTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUtPklzTnVsbCgpKQorICAg
ICAgICAgICAgbV93cml0ZXIud3JpdGVOdWxsKCk7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlLT5J
c1RydWUoKSkKKyAgICAgICAgICAgIG1fd3JpdGVyLndyaXRlVHJ1ZSgpOworICAgICAgICBlbHNl
IGlmICh2YWx1ZS0+SXNGYWxzZSgpKQorICAgICAgICAgICAgbV93cml0ZXIud3JpdGVGYWxzZSgp
OworICAgICAgICBlbHNlIGlmICh2YWx1ZS0+SXNJbnQzMigpKQorICAgICAgICAgICAgbV93cml0
ZXIud3JpdGVJbnQzMih2YWx1ZS0+SW50MzJWYWx1ZSgpKTsKKyAgICAgICAgZWxzZSBpZiAodmFs
dWUtPklzTnVtYmVyKCkpCisgICAgICAgICAgICBtX3dyaXRlci53cml0ZU51bWJlcihoYW5kbGVD
YXN0PHY4OjpOdW1iZXI+KHZhbHVlKS0+VmFsdWUoKSk7CisgICAgICAgIGVsc2UgaWYgKHZhbHVl
LT5Jc1N0cmluZygpKSB7CisgICAgICAgICAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgc3RyaW5n
VmFsdWUodmFsdWUpOworICAgICAgICAgICAgbV93cml0ZXIud3JpdGVTdHJpbmcoKnN0cmluZ1Zh
bHVlLCBzdHJpbmdWYWx1ZS5sZW5ndGgoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUtPklz
QXJyYXkoKSkgeworICAgICAgICAgICAgaWYgKCFjaGVja0NvbXBvc2l0ZSh2YWx1ZSkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcHVzaChuZXcgQXJyYXlTdGF0
ZShoYW5kbGVDYXN0PHY4OjpBcnJheT4odmFsdWUpKSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFs
dWUtPklzT2JqZWN0KCkpIHsKKyAgICAgICAgICAgIGlmICghY2hlY2tDb21wb3NpdGUodmFsdWUp
KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHB1c2gobmV3IE9i
amVjdFN0YXRlKGhhbmRsZUNhc3Q8djg6Ok9iamVjdD4odmFsdWUpKSk7CisgICAgICAgICAgICAv
LyBGSVhNRToKKyAgICAgICAgICAgIC8vIC0gY2hlY2sgbm90IGEgd3JhcHBlcgorICAgICAgICAg
ICAgLy8gLSBzdXBwb3J0IEZpbGUsIEltYWdlRGF0YSwgZXRjLgorICAgICAgICB9CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZvaWQgcHVzaChTdGF0ZUJhc2UqIHN0YXRlKQor
ICAgIHsKKyAgICAgICAgc3RhdGUtPnNldE5leHRTdGF0ZShtX3N0YXRlKTsKKyAgICAgICAgbV9z
dGF0ZSA9IHN0YXRlOworICAgICAgICArK21fZGVwdGg7CisgICAgfQorCisgICAgU3RhdGVCYXNl
KiB0b3AoKSB7IHJldHVybiBtX3N0YXRlOyB9CisKKyAgICB2b2lkIHBvcCgpCisgICAgeworICAg
ICAgICBpZiAoIW1fc3RhdGUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFN0YXRlQmFz
ZSogdG9wID0gbV9zdGF0ZTsKKyAgICAgICAgbV9zdGF0ZSA9IHRvcC0+bmV4dFN0YXRlKCk7Cisg
ICAgICAgIGRlbGV0ZSB0b3A7CisgICAgICAgIC0tbV9kZXB0aDsKKyAgICB9CisKKyAgICBib29s
IGNoZWNrQ29tcG9zaXRlKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb21wb3NpdGUpCisgICAgewor
ICAgICAgICBpZiAobV9kZXB0aCA+IG1heERlcHRoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICBpZiAoIXNob3VsZENoZWNrRm9yQ3ljbGVzKG1fZGVwdGgpKQorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgIGZvciAoU3RhdGVCYXNlKiBzdGF0ZSA9IHRvcCgpOyBz
dGF0ZTsgc3RhdGUgPSBzdGF0ZS0+bmV4dFN0YXRlKCkpIHsKKyAgICAgICAgICAgIGlmIChzdGF0
ZS0+Y29tcG9zaXRlKCkgPT0gY29tcG9zaXRlKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBXcml0ZXIm
IG1fd3JpdGVyOworICAgIFN0YXRlQmFzZSogbV9zdGF0ZTsKKyAgICBpbnQgbV9kZXB0aDsKK307
CisKKy8vIFJlYWRlciBpcyByZXNwb25zaWJsZSBmb3IgZGVzZXJpYWxpemluZyBwcmltaXRpdmUg
dHlwZXMgYW5kCisvLyByZXN0b3JpbmcgaW5mb3JtYXRpb24gYWJvdXQgc2F2ZWQgb2JqZWN0cyBv
ZiBjb21wb3NpdGUgdHlwZXMuCitjbGFzcyBSZWFkZXIgeworcHVibGljOgorICAgIFJlYWRlcihj
b25zdCBjaGFyKiBidWZmZXIsIGludCBsZW5ndGgpCisgICAgICAgIDogbV9idWZmZXIoYnVmZmVy
KQorICAgICAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKKyAgICAgICAgLCBtX3Bvc2l0aW9uKDApCisg
ICAgeworICAgIH0KKworICAgIGJvb2wgaXNFb2YoKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aW9u
ID49IG1fbGVuZ3RoOyB9CisKKyAgICBib29sIHJlYWQoU2VyaWFsaXphdGlvblRhZyogdGFnLCB2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4qIHZhbHVlLCBpbnQqIGxlbmd0aCkKKyAgICB7CisgICAgICAg
IHVpbnQzMl90IHJhd0xlbmd0aDsKKyAgICAgICAgaWYgKCFyZWFkVGFnKHRhZykpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHN3aXRjaCAoKnRhZykgeworICAgICAgICBjYXNl
IFBhZGRpbmdUYWc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVbmRlZmluZWRU
YWc6CisgICAgICAgICAgICAqdmFsdWUgPSB2ODo6VW5kZWZpbmVkKCk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBOdWxsVGFnOgorICAgICAgICAgICAgKnZhbHVlID0gdjg6Ok51
bGwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRydWVUYWc6CisgICAgICAg
ICAgICAqdmFsdWUgPSB2ODo6VHJ1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgRmFsc2VUYWc6CisgICAgICAgICAgICAqdmFsdWUgPSB2ODo6RmFsc2UoKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0cmluZ1RhZzoKKyAgICAgICAgICAgIGlmICghcmVh
ZFN0cmluZyh2YWx1ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgSW50MzJUYWc6CisgICAgICAgICAgICBpZiAoIXJlYWRJ
bnQzMih2YWx1ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgTnVtYmVyVGFnOgorICAgICAgICAgICAgaWYgKCFyZWFkTnVt
YmVyKHZhbHVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBPYmplY3RUYWc6CisgICAgICAgIGNhc2UgQXJyYXlUYWc6Cisg
ICAgICAgICAgICBpZiAoIWRvUmVhZFVpbnQzMigmcmF3TGVuZ3RoKSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAqbGVuZ3RoID0gcmF3TGVuZ3RoOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCitw
cml2YXRlOgorICAgIGJvb2wgcmVhZFRhZyhTZXJpYWxpemF0aW9uVGFnKiB0YWcpCisgICAgewor
ICAgICAgICBpZiAobV9wb3NpdGlvbiA+PSBtX2xlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgKnRhZyA9IHN0YXRpY19jYXN0PFNlcmlhbGl6YXRpb25UYWc+KG1fYnVm
ZmVyW21fcG9zaXRpb24rK10pOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBi
b29sIHJlYWRTdHJpbmcodjg6OkhhbmRsZTx2ODo6VmFsdWU+KiB2YWx1ZSkKKyAgICB7CisgICAg
ICAgIHVpbnQzMl90IGxlbmd0aDsKKyAgICAgICAgaWYgKCFkb1JlYWRVaW50MzIoJmxlbmd0aCkp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtX3Bvc2l0aW9uICsgbGVu
Z3RoID4gbV9sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICp2YWx1
ZSA9IHY4OjpTdHJpbmc6Ok5ldyhtX2J1ZmZlciArIG1fcG9zaXRpb24sIGxlbmd0aCk7CisgICAg
ICAgIG1fcG9zaXRpb24gKz0gbGVuZ3RoOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisK
KyAgICBib29sIHJlYWRJbnQzMih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4qIHZhbHVlKQorICAgIHsK
KyAgICAgICAgdWludDMyX3QgcmF3VmFsdWU7CisgICAgICAgIGlmICghZG9SZWFkVWludDMyKCZy
YXdWYWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICp2YWx1ZSA9IHY4
OjpJbnRlZ2VyOjpOZXcoc3RhdGljX2Nhc3Q8aW50MzJfdD4oWmlnWmFnOjpkZWNvZGUocmF3VmFs
dWUpKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcmVhZE51bWJl
cih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4qIHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKG1fcG9z
aXRpb24gKyBzaXplb2YoZG91YmxlKSA+IG1fbGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICBkb3VibGUgbnVtYmVyOworICAgICAgICBjaGFyKiBudW1iZXJBc0J5dGVB
cnJheSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZudW1iZXIpOworICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IHNpemVvZihkb3VibGUpOyArK2kpCisgICAgICAgICAgICBudW1iZXJBc0J5
dGVBcnJheVtpXSA9IG1fYnVmZmVyW21fcG9zaXRpb24rK107CisgICAgICAgICp2YWx1ZSA9IHY4
OjpOdW1iZXI6Ok5ldyhudW1iZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAg
ICBib29sIGRvUmVhZFVpbnQzMih1aW50MzJfdCogdmFsdWUpCisgICAgeworICAgICAgICAqdmFs
dWUgPSAwOworICAgICAgICBjaGFyIGN1cnJlbnRCeXRlOworICAgICAgICBpbnQgc2hpZnQgPSAw
OworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAobV9wb3NpdGlvbiA+PSBtX2xlbmd0aCkK
KyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBjdXJyZW50Qnl0ZSA9
IG1fYnVmZmVyW21fcG9zaXRpb24rK107CisgICAgICAgICAgICAqdmFsdWUgfD0gKChjdXJyZW50
Qnl0ZSAmIHZhckludE1hc2spIDw8IHNoaWZ0KTsKKyAgICAgICAgICAgIHNoaWZ0ICs9IHZhcklu
dFNoaWZ0OworICAgICAgICB9IHdoaWxlIChjdXJyZW50Qnl0ZSAmICgxIDw8IHZhckludFNoaWZ0
KSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGNvbnN0IGNoYXIqIG1fYnVm
ZmVyOworICAgIGNvbnN0IGludCBtX2xlbmd0aDsKKyAgICBpbnQgbV9wb3NpdGlvbjsKK307CisK
K2NsYXNzIERlc2VyaWFsaXplciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRGVzZXJpYWxpemVy
KFJlYWRlciYgcmVhZGVyKSA6IG1fcmVhZGVyKHJlYWRlcikKKyAgICB7CisgICAgfQorCisgICAg
djg6OkxvY2FsPHY4OjpWYWx1ZT4gZGVzZXJpYWxpemUoKQorICAgIHsKKyAgICAgICAgdjg6Okhh
bmRsZVNjb3BlIHNjb3BlOworICAgICAgICB3aGlsZSAoIW1fcmVhZGVyLmlzRW9mKCkpIHsKKyAg
ICAgICAgICAgIGlmICghZG9EZXNlcmlhbGl6ZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiB2
ODo6TG9jYWw8djg6OlZhbHVlPigpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGFja0RlcHRo
KCkgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOworICAg
ICAgICByZXR1cm4gc2NvcGUuQ2xvc2UoZWxlbWVudCgwKSk7CisgICAgfQorCitwcml2YXRlOgor
ICAgIGJvb2wgZG9EZXNlcmlhbGl6ZSgpCisgICAgeworICAgICAgICBTZXJpYWxpemF0aW9uVGFn
IHRhZzsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWU7CisgICAgICAgIGludCBs
ZW5ndGg7CisgICAgICAgIGlmICghbV9yZWFkZXIucmVhZCgmdGFnLCAmdmFsdWUsICZsZW5ndGgp
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXZhbHVlLklzRW1wdHko
KSkgeworICAgICAgICAgICAgcHVzaCh2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodGFnID09
IE9iamVjdFRhZykgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+IHN0YWNrRGVwdGgoKSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9i
amVjdD4gb2JqZWN0ID0gdjg6Ok9iamVjdDo6TmV3KCk7CisgICAgICAgICAgICBmb3IgKGludCBp
ID0gc3RhY2tEZXB0aCgpIC0gbGVuZ3RoOyBpIDwgc3RhY2tEZXB0aCgpOyBpICs9IDIpIHsKKyAg
ICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwcm9wZXJ0eU5hbWUgPSBlbGVtZW50
KGkpOworICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHByb3BlcnR5VmFsdWUg
PSBlbGVtZW50KGkgKyAxKTsKKyAgICAgICAgICAgICAgICBvYmplY3QtPlNldChwcm9wZXJ0eU5h
bWUsIHByb3BlcnR5VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9wKGxlbmd0
aCk7CisgICAgICAgICAgICBwdXNoKG9iamVjdCk7CisgICAgICAgIH0gZWxzZSBpZiAodGFnID09
IEFycmF5VGFnKSB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID4gc3RhY2tEZXB0aCgpKQorICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6QXJy
YXk+IGFycmF5ID0gdjg6OkFycmF5OjpOZXcobGVuZ3RoKTsKKyAgICAgICAgICAgIGNvbnN0IGlu
dCBkZXB0aCA9IHN0YWNrRGVwdGgoKSAtIGxlbmd0aDsKKyAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgICAgICAgICAgICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgYXJyYXktPlNldCh2
ODo6SW50ZWdlcjo6TmV3KGkpLCBlbGVtZW50KGRlcHRoICsgaSkpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgcG9wKGxlbmd0aCk7CisgICAgICAgICAgICBwdXNoKGFycmF5KTsKKyAgICAg
ICAgfSBlbHNlIGlmICh0YWcgIT0gUGFkZGluZ1RhZykKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCBwdXNoKHY4OjpMb2Nh
bDx2ODo6VmFsdWU+IHZhbHVlKSB7IG1fc3RhY2suYXBwZW5kKHZhbHVlKTsgfQorCisgICAgdm9p
ZCBwb3AoaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIEFTU0VSVChsZW5ndGggPj0gMCk7Cisg
ICAgICAgIEFTU0VSVChsZW5ndGggPD0gbV9zdGFjay5zaXplKCkpOworICAgICAgICBtX3N0YWNr
LnNocmluayhtX3N0YWNrLnNpemUoKSAtIGxlbmd0aCk7CisgICAgfQorCisgICAgaW50IHN0YWNr
RGVwdGgoKSBjb25zdCB7IHJldHVybiBtX3N0YWNrLnNpemUoKTsgfQorCisgICAgdjg6OkxvY2Fs
PHY4OjpWYWx1ZT4gZWxlbWVudChpbnQgaW5kZXgpCisgICAgeworICAgICAgICBBU1NFUlQoaW5k
ZXggPj0gMCk7CisgICAgICAgIEFTU0VSVChpbmRleCA8IG1fc3RhY2suc2l6ZSgpKTsKKyAgICAg
ICAgcmV0dXJuIG1fc3RhY2tbaW5kZXhdOworICAgIH0KKworICAgIFJlYWRlciYgbV9yZWFkZXI7
CisgICAgVmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+ID4gbV9zdGFjazsKK307CisKK30gLy8g
bmFtZXNwYWNlCisKK1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVl
KHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKK3sKKyAgICBXcml0ZXIgd3JpdGVyOworICAg
IFNlcmlhbGl6ZXIgc2VyaWFsaXplcih3cml0ZXIpOworICAgIGlmICghc2VyaWFsaXplci5zZXJp
YWxpemUodmFsdWUpKSB7CisgICAgICAgIC8vIEZJWE1FOiB0aHJvdyBleGNlcHRpb24KKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICBtX2RhdGEgPSBTdHJpbmdJbXBsOjphZG9wdCh3cml0ZXIu
ZGF0YSgpKTsKK30KKworU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpTZXJpYWxpemVkU2NyaXB0VmFs
dWUoU3RyaW5nIGRhdGEsIFN0cmluZ0RhdGFNb2RlIG1vZGUpCit7CisgICAgaWYgKG1vZGUgPT0g
V2lyZURhdGEpCisgICAgICAgIG1fZGF0YSA9IGRhdGE7CisgICAgZWxzZSB7CisgICAgICAgIEFT
U0VSVChtb2RlID09IFN0cmluZ1ZhbHVlKTsKKyAgICAgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4g
YnVmZmVyID0gdXRmOEJ1ZmZlcihkYXRhKTsKKyAgICAgICAgV3JpdGVyIHdyaXRlcjsKKyAgICAg
ICAgd3JpdGVyLndyaXRlU3RyaW5nKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7Cisg
ICAgICAgIG1fZGF0YSA9IFN0cmluZ0ltcGw6OmFkb3B0KHdyaXRlci5kYXRhKCkpOworICAgIH0K
K30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpkZXNlcmlh
bGl6ZSgpCit7CisgICAgaWYgKCFtX2RhdGEuaW1wbCgpKQorICAgICAgICByZXR1cm4gdjg6Okxv
Y2FsPHY4OjpWYWx1ZT4oKTsKKyAgICBDT01QSUxFX0FTU0VSVChzaXplb2YoQnVmZmVyVmFsdWVU
eXBlKSA9PSAyLCBCdWZmZXJWYWx1ZVR5cGVJc1R3b0J5dGVzKTsKKyAgICBSZWFkZXIgcmVhZGVy
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG1fZGF0YS5pbXBsKCktPmNoYXJhY3RlcnMo
KSksIDIgKiBtX2RhdGEubGVuZ3RoKCkpOworICAgIERlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXIo
cmVhZGVyKTsKKyAgICByZXR1cm4gZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKCk7Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvU2Vy
aWFsaXplZFNjcmlwdFZhbHVlLmggYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZS5oCmluZGV4IDI2YTQxOTkuLjdlYjg5MzUgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmlu
ZGluZ3MvdjgvU2VyaWFsaXplZFNjcmlwdFZhbHVlLmgKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92
OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdo
dCAoQykgMjAwOSwgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDAsMTEgKzQwLDI2IEBAIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIAogY2xhc3MgU2VyaWFsaXplZFNjcmlwdFZhbHVlIDogcHVibGljIFJlZkNv
dW50ZWQ8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NS
ZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBjcmVhdGUoU3RyaW5nIHN0cmluZykKKyAgICAv
LyBDcmVhdGVzIGEgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gVjggdmFs
dWUuCisgICAgc3RhdGljIFBhc3NSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBjcmVhdGUo
djg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0
UmVmKG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUoc3RyaW5nKSk7CisgICAgICAgIHJldHVybiBh
ZG9wdFJlZihuZXcgU2VyaWFsaXplZFNjcmlwdFZhbHVlKHZhbHVlKSk7CiAgICAgfQogCisgICAg
Ly8gQ3JlYXRlcyBhIHNlcmlhbGl6ZWQgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gZGF0YSBvYnRhaW5l
ZCBmcm9tIGEKKyAgICAvLyBwcmlvciBjYWxsIHRvIHRvV2lyZVN0cmluZygpLgorICAgIHN0YXRp
YyBQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gY3JlYXRlRnJvbVdpcmUoU3RyaW5n
IGRhdGEpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZShkYXRhLCBXaXJlRGF0YSkpOworICAgIH0KKworICAgIC8vIENyZWF0ZXMgYSBzZXJp
YWxpemVkIHJlcHJlc2VudGF0aW9uIG9mIFdlYkNvcmUgc3RyaW5nLgorICAgIHN0YXRpYyBQYXNz
UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gY3JlYXRlKFN0cmluZyBkYXRhKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUoZGF0YSwg
U3RyaW5nVmFsdWUpKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGVzIGFuIGVtcHR5IHNlcmlhbGl6
ZWQgdmFsdWUuCiAgICAgc3RhdGljIFBhc3NSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBj
cmVhdGUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2Ny
aXB0VmFsdWUoKSk7CkBAIC01MiwyMyArNjcsMjkgQEAgcHVibGljOgogCiAgICAgUGFzc1JlZlB0
cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHJlbGVhc2UoKQogICAgIHsKLSAgICAgICAgUmVmUHRy
PFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gcmVzdWx0ID0gYWRvcHRSZWYobmV3IFNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZShtX2RhdGEpKTsKKyAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZT4gcmVzdWx0ID0gYWRvcHRSZWYobmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShtX2RhdGEsIFdp
cmVEYXRhKSk7CiAgICAgICAgIG1fZGF0YSA9IFN0cmluZygpOwogICAgICAgICByZXR1cm4gcmVz
dWx0LnJlbGVhc2UoKTsKICAgICB9CiAKLSAgICBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAg
ICAgICAgcmV0dXJuIG1fZGF0YTsKLSAgICB9CisgICAgU3RyaW5nIHRvV2lyZVN0cmluZygpIGNv
bnN0IHsgcmV0dXJuIG1fZGF0YTsgfQorCisgICAgLy8gRGVzZXJpYWxpemVzIHRoZSB2YWx1ZSAo
aW4gdGhlIGN1cnJlbnQgY29udGV4dCkuIFJldHVybnMgYW4KKyAgICAvLyBlbXB0eSBoYW5kbGUg
aW4gY2FzZSBvZiBmYWlsdXJlLgorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGRlc2VyaWFsaXpl
KCk7CiAKIHByaXZhdGU6Ci0gICAgU2VyaWFsaXplZFNjcmlwdFZhbHVlKFN0cmluZyBzdHJpbmcp
Ci0gICAgICAgIDogbV9kYXRhKHN0cmluZykKLSAgICB7Ci0gICAgfQorICAgIGVudW0gU3RyaW5n
RGF0YU1vZGUgeworICAgICAgICBTdHJpbmdWYWx1ZSwKKyAgICAgICAgV2lyZURhdGEKKyAgICB9
OwogCiAgICAgU2VyaWFsaXplZFNjcmlwdFZhbHVlKCkgeyB9CisKKyAgICBleHBsaWNpdCBTZXJp
YWxpemVkU2NyaXB0VmFsdWUodjg6OkhhbmRsZTx2ODo6VmFsdWU+KTsKKworICAgIFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZShTdHJpbmcgZGF0YSwgU3RyaW5nRGF0YU1vZGUgbW9kZSk7CisKICAgICBT
dHJpbmcgbV9kYXRhOwogfTsKIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhET01XaW5kb3dDdXN0b20uY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhE
T01XaW5kb3dDdXN0b20uY3BwCmluZGV4IGRhY2Q0ZjYuLmI1OTQ1MTggMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RE9NV2luZG93Q3VzdG9tLmNwcAorKysgYi9XZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVdpbmRvd0N1c3RvbS5jcHAKQEAgLTQxMSw3ICs0
MTEsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhET01XaW5kb3c6OnBvc3RNZXNzYWdlQ2Fs
bGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncwogICAgIEFTU0VSVChzb3VyY2UtPmZyYW1l
KCkpOwogCiAgICAgdjg6OlRyeUNhdGNoIHRyeUNhdGNoOwotICAgIFJlZlB0cjxTZXJpYWxpemVk
U2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh0b1dl
YkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+
IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzBdKTsKICAgICBN
ZXNzYWdlUG9ydEFycmF5IHBvcnRBcnJheTsKICAgICBTdHJpbmcgdGFyZ2V0T3JpZ2luOwogCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERlZGljYXRlZFdvcmtlckNv
bnRleHRDdXN0b20uY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhEZWRpY2F0ZWRX
b3JrZXJDb250ZXh0Q3VzdG9tLmNwcAppbmRleCA1YWI2MjE4Li40NDg2ZGJlIDEwMDY0NAotLS0g
YS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERlZGljYXRlZFdvcmtlckNvbnRleHRDdXN0
b20uY3BwCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RGVkaWNhdGVkV29ya2Vy
Q29udGV4dEN1c3RvbS5jcHAKQEAgLTQ2LDcgKzQ2LDcgQEAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+
IFY4RGVkaWNhdGVkV29ya2VyQ29udGV4dDo6cG9zdE1lc3NhZ2VDYWxsYmFjayhjb25zdCB2ODo6
QXIKIHsKICAgICBJTkNfU1RBVFMoTCJET00uRGVkaWNhdGVkV29ya2VyQ29udGV4dC5wb3N0TWVz
c2FnZSIpOwogICAgIERlZGljYXRlZFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBWOERl
ZGljYXRlZFdvcmtlckNvbnRleHQ6OnRvTmF0aXZlKGFyZ3MuSG9sZGVyKCkpOwotICAgIFJlZlB0
cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6
OmNyZWF0ZSh2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pKTsKKyAgICBSZWZQdHI8U2Vy
aWFsaXplZFNjcmlwdFZhbHVlPiBtZXNzYWdlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVh
dGUoYXJnc1swXSk7CiAgICAgTWVzc2FnZVBvcnRBcnJheSBwb3J0QXJyYXk7CiAgICAgaWYgKGFy
Z3MuTGVuZ3RoKCkgPiAxKSB7CiAgICAgICAgIGlmICghZ2V0TWVzc2FnZVBvcnRBcnJheShhcmdz
WzFdLCBwb3J0QXJyYXkpKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhIaXN0b3J5Q3VzdG9tLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SGlzdG9y
eUN1c3RvbS5jcHAKaW5kZXggNmFhMDgwNi4uYjg1N2Q2ZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhIaXN0b3J5Q3VzdG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOEhpc3RvcnlDdXN0b20uY3BwCkBAIC00Myw3ICs0Myw3IEBAIG5hbWVz
cGFjZSBXZWJDb3JlIHsKIAogdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4SGlzdG9yeTo6cHVzaFN0
YXRlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKIHsKLSAgICBSZWZQdHI8U2Vy
aWFsaXplZFNjcmlwdFZhbHVlPiBoaXN0b3J5U3RhdGUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6
OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVk
U2NyaXB0VmFsdWU+IGhpc3RvcnlTdGF0ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRl
KGFyZ3NbMF0pOwogCiAgICAgdjg6OlRyeUNhdGNoIHRyeUNhdGNoOwogICAgIFN0cmluZyB0aXRs
ZSA9IHRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsT3JVbmRlZmluZWRDaGVjayhhcmdzWzFdKTsKQEAg
LTY0LDcgKzY0LDcgQEAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4SGlzdG9yeTo6cHVzaFN0YXRl
Q2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKIAogdjg6OkhhbmRsZTx2ODo6VmFs
dWU+IFY4SGlzdG9yeTo6cmVwbGFjZVN0YXRlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYg
YXJncykKIHsKLSAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBoaXN0b3J5U3RhdGUg
PSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkp
OworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGhpc3RvcnlTdGF0ZSA9IFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFyZ3NbMF0pOwogCiAgICAgdjg6OlRyeUNhdGNoIHRy
eUNhdGNoOwogICAgIFN0cmluZyB0aXRsZSA9IHRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsT3JVbmRl
ZmluZWRDaGVjayhhcmdzWzFdKTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4TWVzc2FnZUV2ZW50Q3VzdG9tLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4TWVzc2FnZUV2ZW50Q3VzdG9tLmNwcAppbmRleCBiMjkxZDFhLi4yYjAyN2RjIDEwMDY0NAot
LS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VFdmVudEN1c3RvbS5jcHAK
KysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdlRXZlbnRDdXN0b20uY3Bw
CkBAIC02NSw3ICs2NSw3IEBAIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBWOE1lc3NhZ2VFdmVudDo6
aW5pdE1lc3NhZ2VFdmVudENhbGxiYWNrKGNvbnN0IHY4OjpBcmd1bWVuCiAgICAgU3RyaW5nIHR5
cGVBcmcgPSB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgIGJvb2wgY2FuQnVi
YmxlQXJnID0gYXJnc1sxXS0+Qm9vbGVhblZhbHVlKCk7CiAgICAgYm9vbCBjYW5jZWxhYmxlQXJn
ID0gYXJnc1syXS0+Qm9vbGVhblZhbHVlKCk7Ci0gICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZT4gZGF0YUFyZyA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKHY4VmFsdWVUb1dl
YkNvcmVTdHJpbmcoYXJnc1szXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+
IGRhdGFBcmcgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzNdKTsKICAgICBT
dHJpbmcgb3JpZ2luQXJnID0gdjhWYWx1ZVRvV2ViQ29yZVN0cmluZyhhcmdzWzRdKTsKICAgICBT
dHJpbmcgbGFzdEV2ZW50SWRBcmcgPSB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKGFyZ3NbNV0pOwog
ICAgIERPTVdpbmRvdyogc291cmNlQXJnID0gVjhET01XaW5kb3c6Okhhc0luc3RhbmNlKGFyZ3Nb
Nl0pID8gVjhET01XaW5kb3c6OnRvTmF0aXZlKHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3Qo
YXJnc1s2XSkpIDogMDsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
TWVzc2FnZVBvcnRDdXN0b20uY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNz
YWdlUG9ydEN1c3RvbS5jcHAKaW5kZXggMDcxYjFhYy4uY2M3MGJjNSAxMDA2NDQKLS0tIGEvV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdlUG9ydEN1c3RvbS5jcHAKKysrIGIvV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdlUG9ydEN1c3RvbS5jcHAKQEAgLTc4LDcg
Kzc4LDcgQEAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4TWVzc2FnZVBvcnQ6OnBvc3RNZXNzYWdl
Q2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXIKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5N
ZXNzYWdlUG9ydC5wb3N0TWVzc2FnZSIpOwogICAgIE1lc3NhZ2VQb3J0KiBtZXNzYWdlUG9ydCA9
IFY4TWVzc2FnZVBvcnQ6OnRvTmF0aXZlKGFyZ3MuSG9sZGVyKCkpOwotICAgIFJlZlB0cjxTZXJp
YWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0
ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0
VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzBdKTsK
ICAgICBNZXNzYWdlUG9ydEFycmF5IHBvcnRBcnJheTsKICAgICBpZiAoYXJncy5MZW5ndGgoKSA+
IDEpIHsKICAgICAgICAgaWYgKCFnZXRNZXNzYWdlUG9ydEFycmF5KGFyZ3NbMV0sIHBvcnRBcnJh
eSkpCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFBvcFN0YXRlRXZl
bnRDdXN0b20uY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhQb3BTdGF0ZUV2ZW50
Q3VzdG9tLmNwcAppbmRleCA5OWNjMmQxLi40NmU5OTI5IDEwMDY0NAotLS0gYS9XZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOFBvcFN0YXRlRXZlbnRDdXN0b20uY3BwCisrKyBiL1dlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4UG9wU3RhdGVFdmVudEN1c3RvbS5jcHAKQEAgLTQ0LDcgKzQ0
LDcgQEAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UG9wU3RhdGVFdmVudDo6aW5pdFBvcFN0YXRl
RXZlbnRDYWxsYmFjayhjb25zdCB2ODo6QXJndW0KICAgICBTdHJpbmcgdHlwZUFyZyA9IHY4VmFs
dWVUb1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgYm9vbCBjYW5CdWJibGVBcmcgPSBhcmdz
WzFdLT5Cb29sZWFuVmFsdWUoKTsKICAgICBib29sIGNhbmNlbGFibGVBcmcgPSBhcmdzWzJdLT5C
b29sZWFuVmFsdWUoKTsKLSAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBzdGF0ZUFy
ZyA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKHY4VmFsdWVUb1dlYkNvcmVTdHJpbmco
YXJnc1szXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHN0YXRlQXJnID0g
U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoYXJnc1szXSk7CiAKICAgICBQb3BTdGF0ZUV2
ZW50KiBldmVudCA9IFY4UG9wU3RhdGVFdmVudDo6dG9OYXRpdmUoYXJncy5Ib2xkZXIoKSk7CiAg
ICAgZXZlbnQtPmluaXRQb3BTdGF0ZUV2ZW50KHR5cGVBcmcsIGNhbkJ1YmJsZUFyZywgY2FuY2Vs
YWJsZUFyZywgc3RhdGVBcmcucmVsZWFzZSgpKTsKQEAgLTYxLDcgKzYxLDcgQEAgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IFY4UG9wU3RhdGVFdmVudDo6c3RhdGVBY2Nlc3NvckdldHRlcih2ODo6TG9j
YWw8djg6OlN0cmluZz4KICAgICBpZiAoIXN0YXRlKQogICAgICAgICByZXR1cm4gdjg6Ok51bGwo
KTsKIAotICAgIHJldHVybiB2OFN0cmluZ09yTnVsbChzdGF0ZS0+dG9TdHJpbmcoKSk7CisgICAg
cmV0dXJuIHN0YXRlLT5kZXNlcmlhbGl6ZSgpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckN1c3RvbS5j
cHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckN1c3RvbS5jcHAKaW5kZXgg
NmRlYzdhZi4uNDI5MWY2ZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhXb3JrZXJDdXN0b20uY3BwCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V29y
a2VyQ3VzdG9tLmNwcApAQCAtOTIsNyArOTIsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhX
b3JrZXI6OnBvc3RNZXNzYWdlQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKIHsK
ICAgICBJTkNfU1RBVFMoIkRPTS5Xb3JrZXIucG9zdE1lc3NhZ2UiKTsKICAgICBXb3JrZXIqIHdv
cmtlciA9IFY4V29ya2VyOjp0b05hdGl2ZShhcmdzLkhvbGRlcigpKTsKLSAgICBSZWZQdHI8U2Vy
aWFsaXplZFNjcmlwdFZhbHVlPiBtZXNzYWdlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVh
dGUodG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pKTsKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlw
dFZhbHVlPiBtZXNzYWdlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoYXJnc1swXSk7
CiAgICAgTWVzc2FnZVBvcnRBcnJheSBwb3J0QXJyYXk7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkg
PiAxKSB7CiAgICAgICAgIGlmICghZ2V0TWVzc2FnZVBvcnRBcnJheShhcmdzWzFdLCBwb3J0QXJy
YXkpKQpkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZyBiL1dlYktpdC9jaHJv
bWl1bS9DaGFuZ2VMb2cKaW5kZXggM2Y1NjY4My4uNTY2N2ZmMyAxMDA2NDQKLS0tIGEvV2ViS2l0
L2Nocm9taXVtL0NoYW5nZUxvZworKysgYi9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCkBAIC0x
LDMgKzEsMjMgQEAKKzIwMTAtMDEtMTUgIFZpdGFseSBSZXBlc2hrbyAgPHZpdGFseXJAY2hyb21p
dW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFtWOF0gU3VwcG9ydCBTZXJpYWxpemVkU2NyaXB0VmFsdWUuCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMjkyMAorICAgICAgICBodHRwOi8vY3JidWcu
Y29tLzMwNjIwCisKKyAgICAgICAgVXBkYXRlZCB1c2VzIG9mIFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZToKKyAgICAgICAgKiBzcmMvUGxhdGZvcm1NZXNzYWdlUG9ydENoYW5uZWwuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6UGxhdGZvcm1NZXNzYWdlUG9ydENoYW5uZWw6OnBvc3RNZXNzYWdlVG9SZW1v
dGUpOgorICAgICAgICAoV2ViQ29yZTo6UGxhdGZvcm1NZXNzYWdlUG9ydENoYW5uZWw6OnRyeUdl
dE1lc3NhZ2VGcm9tUmVtb3RlKToKKyAgICAgICAgKiBzcmMvV2ViV29ya2VyQmFzZS5jcHA6Cisg
ICAgICAgIChXZWJLaXQ6OldlYldvcmtlckJhc2U6OnBvc3RNZXNzYWdlVG9Xb3JrZXJPYmplY3Qp
OgorICAgICAgICAqIHNyYy9XZWJXb3JrZXJDbGllbnRJbXBsLmNwcDoKKyAgICAgICAgKFdlYktp
dDo6V2ViV29ya2VyQ2xpZW50SW1wbDo6cG9zdE1lc3NhZ2VUb1dvcmtlckNvbnRleHQpOgorICAg
ICAgICAoV2ViS2l0OjpXZWJXb3JrZXJDbGllbnRJbXBsOjpwb3N0TWVzc2FnZVRvV29ya2VyT2Jq
ZWN0VGFzayk6CisgICAgICAgICogc3JjL1dlYldvcmtlckltcGwuY3BwOgorICAgICAgICAoV2Vi
S2l0OjpXZWJXb3JrZXJJbXBsOjpwb3N0TWVzc2FnZVRvV29ya2VyQ29udGV4dFRhc2spOgorCiAy
MDEwLTAxLTE0ICBCcmlhbiBXZWluc3RlaW4gIDxid2VpbnN0ZWluQGFwcGxlLmNvbT4KIAogICAg
ICAgICBSZXZpZXdlZCBieSBBZGFtIFJvYmVuLgpkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVt
L3NyYy9QbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbC5jcHAgYi9XZWJLaXQvY2hyb21pdW0vc3Jj
L1BsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVsLmNwcAppbmRleCBmOGM0MWQzLi5hYTQyYTEwIDEw
MDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0vc3JjL1BsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVs
LmNwcAorKysgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1BsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVs
LmNwcApAQCAtMTc5LDcgKzE3OSw3IEBAIHZvaWQgUGxhdGZvcm1NZXNzYWdlUG9ydENoYW5uZWw6
OnBvc3RNZXNzYWdlVG9SZW1vdGUoUGFzc093blB0cjxNZXNzYWdlUG9ydENoYW5uCiAgICAgaWYg
KCFtX2xvY2FsUG9ydCB8fCAhbV93ZWJDaGFubmVsKQogICAgICAgICByZXR1cm47CiAKLSAgICBX
ZWJTdHJpbmcgbWVzc2FnZVN0cmluZyA9IG1lc3NhZ2UtPm1lc3NhZ2UoKS0+dG9TdHJpbmcoKTsK
KyAgICBXZWJTdHJpbmcgbWVzc2FnZVN0cmluZyA9IG1lc3NhZ2UtPm1lc3NhZ2UoKS0+dG9XaXJl
U3RyaW5nKCk7CiAgICAgT3duUHRyPFdlYkNvcmU6Ok1lc3NhZ2VQb3J0Q2hhbm5lbEFycmF5PiBj
aGFubmVscyA9IG1lc3NhZ2UtPmNoYW5uZWxzKCk7CiAgICAgV2ViTWVzc2FnZVBvcnRDaGFubmVs
QXJyYXkqIHdlYkNoYW5uZWxzID0gMDsKICAgICBpZiAoY2hhbm5lbHMuZ2V0KCkgJiYgY2hhbm5l
bHMtPnNpemUoKSkgewpAQCAtMjExLDcgKzIxMSw3IEBAIGJvb2wgUGxhdGZvcm1NZXNzYWdlUG9y
dENoYW5uZWw6OnRyeUdldE1lc3NhZ2VGcm9tUmVtb3RlKE93blB0cjxNZXNzYWdlUG9ydENoYW5u
CiAgICAgICAgICAgICAgICAgKCpjaGFubmVscylbaV0gPSBNZXNzYWdlUG9ydENoYW5uZWw6OmNy
ZWF0ZShwbGF0Zm9ybUNoYW5uZWwpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAg
IFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRNZXNzYWdlID0gU2VyaWFs
aXplZFNjcmlwdFZhbHVlOjpjcmVhdGUobWVzc2FnZSk7CisgICAgICAgIFJlZlB0cjxTZXJpYWxp
emVkU2NyaXB0VmFsdWU+IHNlcmlhbGl6ZWRNZXNzYWdlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVl
OjpjcmVhdGVGcm9tV2lyZShtZXNzYWdlKTsKICAgICAgICAgcmVzdWx0ID0gTWVzc2FnZVBvcnRD
aGFubmVsOjpFdmVudERhdGE6OmNyZWF0ZShzZXJpYWxpemVkTWVzc2FnZS5yZWxlYXNlKCksIGNo
YW5uZWxzLnJlbGVhc2UoKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0v
c3JjL1dlYldvcmtlckJhc2UuY3BwIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJCYXNl
LmNwcAppbmRleCAwZTNhYTRlLi43ZmQzNzQ5IDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0v
c3JjL1dlYldvcmtlckJhc2UuY3BwCisrKyBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2Vy
QmFzZS5jcHAKQEAgLTE1Nyw3ICsxNTcsNyBAQCB2b2lkIFdlYldvcmtlckJhc2U6OnBvc3RNZXNz
YWdlVG9Xb3JrZXJPYmplY3QoUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+CiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc093blB0cjxNZXNz
YWdlUG9ydENoYW5uZWxBcnJheT4gY2hhbm5lbHMpCiB7CiAgICAgZGlzcGF0Y2hUYXNrVG9NYWlu
VGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmcG9zdE1lc3NhZ2VUYXNrLCB0aGlzLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+dG9TdHJp
bmcoKSwgY2hhbm5lbHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1lc3NhZ2UtPnRvV2lyZVN0cmluZygpLCBjaGFubmVscykpOwogfQogCiB2b2lk
IFdlYldvcmtlckJhc2U6OnBvc3RNZXNzYWdlVGFzayhTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBj
b250ZXh0LApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJDbGllbnRJ
bXBsLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2VyQ2xpZW50SW1wbC5jcHAKaW5k
ZXggNmJlMDNhNy4uNTk4YTA3OCAxMDA2NDQKLS0tIGEvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJX
b3JrZXJDbGllbnRJbXBsLmNwcAorKysgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckNs
aWVudEltcGwuY3BwCkBAIC0xNzMsNyArMTczLDcgQEAgdm9pZCBXZWJXb3JrZXJDbGllbnRJbXBs
Ojpwb3N0TWVzc2FnZVRvV29ya2VyQ29udGV4dCgKICAgICBpZiAoIWlzTWFpblRocmVhZCgpKSB7
CiAgICAgICAgIFdlYldvcmtlckJhc2U6OmRpc3BhdGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVD
YWxsYmFja1Rhc2soJnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0VGFzaywKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0
aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1lc3NhZ2UtPnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+
dG9XaXJlU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpKTsKICAgICAgICAgcmV0dXJuOwog
ICAgIH0KQEAgLTE4NCw3ICsxODQsNyBAQCB2b2lkIFdlYldvcmtlckNsaWVudEltcGw6OnBvc3RN
ZXNzYWdlVG9Xb3JrZXJDb250ZXh0KAogICAgICAgICB3ZWJjaGFubmVsLT5zZXRDbGllbnQoMCk7
CiAgICAgICAgIHdlYkNoYW5uZWxzW2ldID0gd2ViY2hhbm5lbDsKICAgICB9Ci0gICAgbV93ZWJX
b3JrZXItPnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0KG1lc3NhZ2UtPnRvU3RyaW5nKCksIHdl
YkNoYW5uZWxzKTsKKyAgICBtX3dlYldvcmtlci0+cG9zdE1lc3NhZ2VUb1dvcmtlckNvbnRleHQo
bWVzc2FnZS0+dG9XaXJlU3RyaW5nKCksIHdlYkNoYW5uZWxzKTsKIH0KIAogYm9vbCBXZWJXb3Jr
ZXJDbGllbnRJbXBsOjpoYXNQZW5kaW5nQWN0aXZpdHkoKSBjb25zdApAQCAtMzU2LDcgKzM1Niw3
IEBAIHZvaWQgV2ViV29ya2VyQ2xpZW50SW1wbDo6cG9zdE1lc3NhZ2VUb1dvcmtlck9iamVjdFRh
c2soCiAgICAgICAgIE93blB0cjxNZXNzYWdlUG9ydEFycmF5PiBwb3J0cyA9CiAgICAgICAgICAg
ICBNZXNzYWdlUG9ydDo6ZW50YW5nbGVQb3J0cygqY29udGV4dCwgY2hhbm5lbHMucmVsZWFzZSgp
KTsKICAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2VyaWFsaXplZE1lc3Nh
Z2UgPQotICAgICAgICAgICAgU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUobWVzc2FnZSk7
CisgICAgICAgICAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZUZyb21XaXJlKG1lc3Nh
Z2UpOwogICAgICAgICB0aGlzUHRyLT5tX3dvcmtlci0+ZGlzcGF0Y2hFdmVudChNZXNzYWdlRXZl
bnQ6OmNyZWF0ZShwb3J0cy5yZWxlYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRNZXNzYWdlLnJlbGVh
c2UoKSkpOwogICAgIH0KZGlmZiAtLWdpdCBhL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2Vy
SW1wbC5jcHAgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckltcGwuY3BwCmluZGV4IDc0
NGJlMzAuLjViNWUwNTMgMTAwNjQ0Ci0tLSBhL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2Vy
SW1wbC5jcHAKKysrIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJJbXBsLmNwcApAQCAt
ODgsNyArODgsNyBAQCB2b2lkIFdlYldvcmtlckltcGw6OnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250
ZXh0VGFzayhXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZQogICAgIE93blB0cjxNZXNzYWdl
UG9ydEFycmF5PiBwb3J0cyA9CiAgICAgICAgIE1lc3NhZ2VQb3J0OjplbnRhbmdsZVBvcnRzKCpj
b250ZXh0LCBjaGFubmVscy5yZWxlYXNlKCkpOwogICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0
VmFsdWU+IHNlcmlhbGl6ZWRNZXNzYWdlID0KLSAgICAgICAgU2VyaWFsaXplZFNjcmlwdFZhbHVl
OjpjcmVhdGUobWVzc2FnZSk7CisgICAgICAgIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRl
RnJvbVdpcmUobWVzc2FnZSk7CiAgICAgd29ya2VyQ29udGV4dC0+ZGlzcGF0Y2hFdmVudChNZXNz
YWdlRXZlbnQ6OmNyZWF0ZSgKICAgICAgICAgcG9ydHMucmVsZWFzZSgpLCBzZXJpYWxpemVkTWVz
c2FnZS5yZWxlYXNlKCkpKTsKICAgICB0aGlzUHRyLT5jb25maXJtTWVzc2FnZUZyb21Xb3JrZXJP
YmplY3Qod29ya2VyQ29udGV4dC0+aGFzUGVuZGluZ0FjdGl2aXR5KCkpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46954</attachid>
            <date>2010-01-19 14:34:21 -0800</date>
            <delta_ts>2010-01-20 05:25:19 -0800</delta_ts>
            <desc>patch v3.2: fix unsigned-signed comparison issues</desc>
            <filename>serialize.patch</filename>
            <type>text/plain</type>
            <size>40900</size>
            <attacher name="Vitaly Repeshko">vitalyr</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NWZlNjM5OC4uMTkxNGM0NyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw5OCBAQAorMjAxMC0wMS0xNSAgVml0YWx5IFJlcGVz
aGtvICA8dml0YWx5ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgW1Y4XSBTdXBwb3J0IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMyOTIwCisg
ICAgICAgIGh0dHA6Ly9jcmJ1Zy5jb20vMzA2MjAKKworICAgICAgICBJbml0aWFsIGltcGxlbWVu
dGF0aW9uIG9mIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSB3aGljaCBpcyB1c2VkIHRvCisgICAgICAg
IHRvIGNyZWF0ZSBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgSmF2YVNjcmlwdCBvYmpl
Y3RzLiAgVGhpcworICAgICAgICByZXByZXNlbnRhdGlvbiBpcyBuZWVkZWQgZm9yIHN0cnVjdHVy
ZWQgY2xvbmVzIGFuZCB3b3JrZXIgbWVzc2FnZXMuCisKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6
IEFkZGVkIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAuCisgICAgICAgICogYmluZGluZ3Mvc2Ny
aXB0cy9Db2RlR2VuZXJhdG9yVjgucG06IFJlbW92ZWQgY29udmVyc2lvbiB0byBzdHJpbmcgYmVm
b3JlIHVzaW5nIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4KKyAgICAgICAgKiBiaW5kaW5ncy92OC9T
ZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Oik6Cisg
ICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWda
YWc6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OldyaXRlcik6CisgICAgICAg
IChXZWJDb3JlOjpXcml0ZXI6OndyaXRlVW5kZWZpbmVkKToKKyAgICAgICAgKFdlYkNvcmU6Oldy
aXRlcjo6d3JpdGVOdWxsKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVUcnVlKToK
KyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVGYWxzZSk6CisgICAgICAgIChXZWJDb3Jl
OjpXcml0ZXI6OndyaXRlU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVJ
bnQzMik6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OndyaXRlTnVtYmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OldyaXRlcjo6ZW5kQ29tcG9zaXRlKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRl
cjo6ZGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OmRvV3JpdGVVaW50MzIpOgorICAg
ICAgICAoV2ViQ29yZTo6V3JpdGVyOjphcHBlbmQpOgorICAgICAgICAoV2ViQ29yZTo6V3JpdGVy
OjplbnN1cmVTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OmZpbGxIb2xlKToKKyAg
ICAgICAgKFdlYkNvcmU6OldyaXRlcjo6Y2hhckF0KToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlh
bGl6ZXI6OlNlcmlhbGl6ZXIpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6c2VyaWFs
aXplKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0YXRlQmFzZTo6flN0YXRlQmFz
ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6Om5leHRTdGF0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OnNldE5leHRTdGF0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OmNvbXBvc2l0ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OlN0YXRlQmFzZSk6CisgICAg
ICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZTo6Y29tcG9zaXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OlNlcmlhbGl6ZXI6OlN0YXRlOjp0YWcpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFs
aXplcjo6U3RhdGU6OlN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0YWNr
Q2xlYW5lcjo6U3RhY2tDbGVhbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0
YWNrQ2xlYW5lcjo6flN0YWNrQ2xlYW5lcik6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVy
OjpBcnJheVN0YXRlOjpBcnJheVN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6
OkFycmF5U3RhdGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6QXJyYXlT
dGF0ZTo6YWR2YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpPYmplY3RTdGF0
ZTo6T2JqZWN0U3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3Rh
dGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3RhdGU6OmFk
dmFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3RhdGU6Om5leHRQ
cm9wZXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpkb1NlcmlhbGl6ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpwdXNoKToKKyAgICAgICAgKFdlYkNvcmU6OlNl
cmlhbGl6ZXI6OnRvcCk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpwb3ApOgorICAg
ICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6Y2hlY2tDb21wb3NpdGUpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVhZGVyOjpSZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVhZGVyOjppc0VvZik6
CisgICAgICAgIChXZWJDb3JlOjpSZWFkZXI6OnJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVh
ZGVyOjpyZWFkVGFnKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWRlcjo6cmVhZFN0cmluZyk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZWFkZXI6OnJlYWRJbnQzMik6CisgICAgICAgIChXZWJDb3JlOjpS
ZWFkZXI6OnJlYWROdW1iZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVhZGVyOjpkb1JlYWRVaW50
MzIpOgorICAgICAgICAoV2ViQ29yZTo6RGVzZXJpYWxpemVyOjpEZXNlcmlhbGl6ZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6RGVzZXJpYWxpemVyOjpkZXNlcmlhbGl6ZSk6CisgICAgICAgIChXZWJD
b3JlOjpEZXNlcmlhbGl6ZXI6OmRvRGVzZXJpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6RGVz
ZXJpYWxpemVyOjpwdXNoKToKKyAgICAgICAgKFdlYkNvcmU6OkRlc2VyaWFsaXplcjo6cG9wKToK
KyAgICAgICAgKFdlYkNvcmU6OkRlc2VyaWFsaXplcjo6c3RhY2tEZXB0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpEZXNlcmlhbGl6ZXI6OmVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFs
aXplZFNjcmlwdFZhbHVlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWUpOgorICAgICAgICAoV2ViQ29y
ZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpkZXNlcmlhbGl6ZSk6CisgICAgICAgICogYmluZGlu
Z3MvdjgvU2VyaWFsaXplZFNjcmlwdFZhbHVlLmg6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxp
emVkU2NyaXB0VmFsdWU6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2Ny
aXB0VmFsdWU6OmNyZWF0ZUZyb21XaXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZTo6cmVsZWFzZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0
VmFsdWU6OnRvV2lyZVN0cmluZyk6CisKKyAgICAgICAgVXBkYXRlZCB1c2VzIG9mIFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dD
dXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhET01XaW5kb3c6OnBvc3RNZXNzYWdlQ2Fs
bGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOERlZGljYXRlZFdvcmtlckNv
bnRleHRDdXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhEZWRpY2F0ZWRXb3JrZXJDb250
ZXh0Ojpwb3N0TWVzc2FnZUNhbGxiYWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20v
VjhIaXN0b3J5Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4SGlzdG9yeTo6cHVzaFN0
YXRlQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6VjhIaXN0b3J5OjpyZXBsYWNlU3RhdGVD
YWxsYmFjayk6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3Vz
dG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4TWVzc2FnZUV2ZW50Ojppbml0TWVzc2FnZUV2
ZW50Q2FsbGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0
Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4TWVzc2FnZVBvcnQ6OnBvc3RNZXNzYWdl
Q2FsbGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckN1c3RvbS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpWOFdvcmtlcjo6cG9zdE1lc3NhZ2VDYWxsYmFjayk6CisK
IDIwMTAtMDEtMTUgIEFsZXhhbmRlciBQYXZsb3YgIDxhcGF2bG92QGNocm9taXVtLm9yZz4KIAog
ICAgICAgICBSZXZpZXdlZCBieSBQYXZlbCBGZWxkbWFuLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9X
ZWJDb3JlLmd5cGkgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCAxYTdhNGRmLi43YjhkZjFm
IDEwMDY0NAotLS0gYS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9XZWJDb3JlL1dlYkNvcmUu
Z3lwaQpAQCAtNzk1LDYgKzc5NSw3IEBACiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvU2NyaXB0
U3RyaW5nSW1wbC5oJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9TY3JpcHRWYWx1ZS5jcHAn
LAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L1NjcmlwdFZhbHVlLmgnLAorICAgICAgICAgICAg
J2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAnLAogICAgICAgICAgICAgJ2Jp
bmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oJywKICAgICAgICAgICAgICdiaW5kaW5n
cy92OC9zcGVjaWFsaXphdGlvbi9WOEJpbmRpbmdET01XaW5kb3cuaCcsCiAgICAgICAgICAgICAn
YmluZGluZ3Mvdjgvc3BlY2lhbGl6YXRpb24vVjhCaW5kaW5nU3RhdGUuY3BwJywKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG0gYi9XZWJDb3Jl
L2JpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4LnBtCmluZGV4IDZhOTBiYjQuLmQ2Nzg2
YjggMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgu
cG0KKysrIGIvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5wbQpAQCAt
MjU2NCw3ICsyNTY0LDcgQEAgc3ViIFJldHVybk5hdGl2ZVRvSlNWYWx1ZQogCiAgICAgaWYgKCR0
eXBlIGVxICJTZXJpYWxpemVkU2NyaXB0VmFsdWUiKSB7CiAgICAgICAgICRpbXBsSW5jbHVkZXN7
IiR0eXBlLmgifSA9IDE7Ci0gICAgICAgIHJldHVybiAicmV0dXJuIHY4U3RyaW5nKCR2YWx1ZS0+
dG9TdHJpbmcoKSkiOworICAgICAgICByZXR1cm4gInJldHVybiAkdmFsdWUtPmRlc2VyaWFsaXpl
KCkiOwogICAgIH0KIAogICAgIGlmICgkdHlwZSBlcSAiRGVkaWNhdGVkV29ya2VyQ29udGV4dCIg
b3IgJHR5cGUgZXEgIldvcmtlckNvbnRleHQiIG9yICR0eXBlIGVxICJTaGFyZWRXb3JrZXJDb250
ZXh0IikgewpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0
VmFsdWUuY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTRmNTIKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAKQEAg
LTAsMCArMSw2OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAq
IG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFt
ZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1h
eSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAq
IHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERF
UlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBD
T1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisg
KiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2VyaWFsaXplZFNj
cmlwdFZhbHVlLmgiCisKKyNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKKworI2luY2x1ZGUgPHY4
Lmg+CisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRl
ZC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworLy8gRklYTUU6CisvLyAtIGNhdGNoIFY4
IGV4Y2VwdGlvbnMKKy8vIC0gYmUgcmVhZHkgdG8gZ2V0IGVtcHR5IGhhbmRsZXMKKy8vIC0gY29u
c2lkZXIgY3Jhc2hpbmcgaW4gZGVidWcgbW9kZSBvbiBkZXNlcmlhbGl6YXRpb24gZXJyb3JzCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworbmFtZXNwYWNlIHsKKwordHlwZWRlZiBVQ2hhciBCdWZm
ZXJWYWx1ZVR5cGU7CisKKy8vIFNlcmlhbGl6YXRpb24gZm9ybWF0IGlzIGEgc2VxdWVuY2Ugb2Yg
KHRhZywgb3B0aW9uYWwgZGF0YSkKKy8vIHBhaXJzLiBUYWcgYWx3YXlzIHRha2VzIGV4YWN0bHkg
b25lIGJ5dGUuCitlbnVtIFNlcmlhbGl6YXRpb25UYWcgeworICAgIEludmFsaWRUYWcgPSAnIScs
CisgICAgUGFkZGluZ1RhZyA9ICdcMCcsCisgICAgVW5kZWZpbmVkVGFnID0gJ18nLAorICAgIE51
bGxUYWcgPSAnMCcsCisgICAgVHJ1ZVRhZyA9ICdUJywKKyAgICBGYWxzZVRhZyA9ICdGJywKKyAg
ICBTdHJpbmdUYWcgPSAnUycsCisgICAgSW50MzJUYWcgPSAnSScsCisgICAgTnVtYmVyVGFnID0g
J04nLAorICAgIE9iamVjdFRhZyA9ICd7JywKKyAgICBBcnJheVRhZyA9ICdbJywKK307CisKKy8v
IEhlbHBlcnMgdG8gZG8gdmVyYm9zZSBoYW5kbGUgY2FzdHMuCisKK3RlbXBsYXRlIDx0eXBlbmFt
ZSBULCB0eXBlbmFtZSBVPgorc3RhdGljIHY4OjpIYW5kbGU8VD4gaGFuZGxlQ2FzdCh2ODo6SGFu
ZGxlPFU+IGhhbmRsZSkgeyByZXR1cm4gdjg6OkhhbmRsZTxUPjo6Q2FzdChoYW5kbGUpOyB9CisK
K3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RhdGljIHY4OjpMb2NhbDxUPiBo
YW5kbGVDYXN0KHY4OjpMb2NhbDxVPiBoYW5kbGUpIHsgcmV0dXJuIHY4OjpMb2NhbDxUPjo6Q2Fz
dChoYW5kbGUpOyB9CisKK3N0YXRpYyBib29sIHNob3VsZENoZWNrRm9yQ3ljbGVzKGludCBkZXB0
aCkKK3sKKyAgICBBU1NFUlQoZGVwdGggPj0gMCk7CisgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCBy
ZXF1aXJlZCB0byBzcG90IHRoZSBjeWNsZSBhcyBzb29uIGFzIGl0CisgICAgLy8gaGFwcGVucyB3
ZSBjYW4gY2hlY2sgZm9yIGN5Y2xlcyBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgZGVwdGgKKyAgICAv
LyBpcyBhIHBvd2VyIG9mIHR3by4KKyAgICByZXR1cm4gIShkZXB0aCAmIChkZXB0aCAtIDEpKTsK
K30KKworc3RhdGljIGNvbnN0IGludCBtYXhEZXB0aCA9IDIwMDAwOworCisvLyBWYXJJbnQgZW5j
b2RpbmcgY29uc3RhbnRzLgorc3RhdGljIGNvbnN0IGludCB2YXJJbnRTaGlmdCA9IDc7CitzdGF0
aWMgY29uc3QgaW50IHZhckludE1hc2sgPSAoMSA8PCB2YXJJbnRTaGlmdCkgLSAxOworCisvLyBa
aWdaYWcgZW5jb2RpbmcgaGVscHMgVmFySW50IGVuY29kaW5nIHN0YXkgc21hbGwgZm9yIG5lZ2F0
aXZlCisvLyBudW1iZXJzIHdpdGggc21hbGwgYWJzb2x1dGUgdmFsdWVzLgorY2xhc3MgWmlnWmFn
IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgdWludDMyX3QgZW5jb2RlKHVpbnQzMl90IHZhbHVlKQor
ICAgIHsKKyAgICAgICAgaWYgKHZhbHVlICYgKDFVIDw8IDMxKSkKKyAgICAgICAgICAgIHZhbHVl
ID0gKCh+dmFsdWUpIDw8IDEpICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsdWUg
PDw9IDE7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdWludDMy
X3QgZGVjb2RlKHVpbnQzMl90IHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlICYgMSkK
KyAgICAgICAgICAgIHZhbHVlID0gfih2YWx1ZSA+PiAxKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgdmFsdWUgPj49IDE7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKK3ByaXZh
dGU6CisgICAgWmlnWmFnKCk7Cit9OworCisvLyBXcml0ZXIgaXMgcmVzcG9uc2libGUgZm9yIHNl
cmlhbGl6aW5nIHByaW1pdGl2ZSB0eXBlcyBhbmQgc3RvcmluZworLy8gaW5mb3JtYXRpb24gdXNl
ZCB0byByZWNvbnN0cnVjdCBjb21wb3NpdGUgdHlwZXMuCitjbGFzcyBXcml0ZXIgOiBOb25jb3B5
YWJsZSB7CitwdWJsaWM6CisgICAgV3JpdGVyKCkgOiBtX3Bvc2l0aW9uKDApCisgICAgeworICAg
IH0KKworICAgIC8vIFdyaXRlIGZ1bmN0aW9ucyBmb3IgcHJpbWl0aXZlIHR5cGVzLgorCisgICAg
dm9pZCB3cml0ZVVuZGVmaW5lZCgpIHsgYXBwZW5kKFVuZGVmaW5lZFRhZyk7IH0KKworICAgIHZv
aWQgd3JpdGVOdWxsKCkgeyBhcHBlbmQoTnVsbFRhZyk7IH0KKworICAgIHZvaWQgd3JpdGVUcnVl
KCkgeyBhcHBlbmQoVHJ1ZVRhZyk7IH0KKworICAgIHZvaWQgd3JpdGVGYWxzZSgpIHsgYXBwZW5k
KEZhbHNlVGFnKTsgfQorCisgICAgdm9pZCB3cml0ZVN0cmluZyhjb25zdCBjaGFyKiBkYXRhLCBp
bnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgYXBwZW5kKFN0cmluZ1RhZyk7CisgICAgICAgIGRv
V3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGxlbmd0aCkpOworICAgICAgICBhcHBl
bmQoZGF0YSwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICB2b2lkIHdyaXRlSW50MzIoaW50MzJfdCB2
YWx1ZSkKKyAgICB7CisgICAgICAgIGFwcGVuZChJbnQzMlRhZyk7CisgICAgICAgIGRvV3JpdGVV
aW50MzIoWmlnWmFnOjplbmNvZGUoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlKSkpOworICAg
IH0KKworICAgIHZvaWQgd3JpdGVOdW1iZXIoZG91YmxlIG51bWJlcikKKyAgICB7CisgICAgICAg
IGFwcGVuZChOdW1iZXJUYWcpOworICAgICAgICBhcHBlbmQocmVpbnRlcnByZXRfY2FzdDxjaGFy
Kj4oJm51bWJlciksIHNpemVvZihudW1iZXIpKTsKKyAgICB9CisKKyAgICAvLyBSZWNvcmRzIHRo
YXQgYSBjb21wb3NpdGUgb2JqZWN0IGNhbiBiZSBjb25zdHJ1Y3RlZCBieSB1c2luZworICAgIC8v
IHxsZW5ndGh8IHByZXZpb3VzbHkgc3RvcmVkIHZhbHVlcy4KKyAgICB2b2lkIGVuZENvbXBvc2l0
ZShTZXJpYWxpemF0aW9uVGFnIHRhZywgaW50MzJfdCBsZW5ndGgpCisgICAgeworICAgICAgICBB
U1NFUlQodGFnID09IE9iamVjdFRhZyB8fCB0YWcgPT0gQXJyYXlUYWcpOworICAgICAgICBhcHBl
bmQodGFnKTsKKyAgICAgICAgZG9Xcml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4obGVu
Z3RoKSk7CisgICAgfQorCisgICAgVmVjdG9yPEJ1ZmZlclZhbHVlVHlwZT4mIGRhdGEoKQorICAg
IHsKKyAgICAgICAgZmlsbEhvbGUoKTsKKyAgICAgICAgcmV0dXJuIG1fYnVmZmVyOworICAgIH0K
KworcHJpdmF0ZToKKyAgICB2b2lkIGRvV3JpdGVVaW50MzIodWludDMyX3QgdmFsdWUpCisgICAg
eworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgY2hhciBiID0gKHZhbHVlICYg
dmFySW50TWFzayk7CisgICAgICAgICAgICB2YWx1ZSA+Pj0gdmFySW50U2hpZnQ7CisgICAgICAg
ICAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgICAgICAgICAgYXBwZW5kKGIpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXBwZW5kKGIgfCAoMSA8
PCB2YXJJbnRTaGlmdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBhcHBlbmQoU2Vy
aWFsaXphdGlvblRhZyB0YWcpCisgICAgeworICAgICAgICBhcHBlbmQoc3RhdGljX2Nhc3Q8Y2hh
cj4odGFnKSk7CisgICAgfQorCisgICAgdm9pZCBhcHBlbmQoY2hhciBiKQorICAgIHsKKyAgICAg
ICAgZW5zdXJlU3BhY2UoMSk7CisgICAgICAgICpjaGFyQXQobV9wb3NpdGlvbisrKSA9IGI7Cisg
ICAgfQorCisgICAgdm9pZCBhcHBlbmQoY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0aCkKKyAg
ICB7CisgICAgICAgIGVuc3VyZVNwYWNlKGxlbmd0aCk7CisgICAgICAgIG1lbWNweShjaGFyQXQo
bV9wb3NpdGlvbiksIGRhdGEsIGxlbmd0aCk7CisgICAgICAgIG1fcG9zaXRpb24gKz0gbGVuZ3Ro
OworICAgIH0KKworICAgIHZvaWQgZW5zdXJlU3BhY2UoaW50IGV4dHJhKQorICAgIHsKKyAgICAg
ICAgQ09NUElMRV9BU1NFUlQoc2l6ZW9mKEJ1ZmZlclZhbHVlVHlwZSkgPT0gMiwgQnVmZmVyVmFs
dWVUeXBlSXNUd29CeXRlcyk7CisgICAgICAgIG1fYnVmZmVyLmdyb3coKG1fcG9zaXRpb24gKyBl
eHRyYSArIDEpIC8gMik7IC8vICIrIDEiIHRvIHJvdW5kIHVwLgorICAgIH0KKworICAgIHZvaWQg
ZmlsbEhvbGUoKQorICAgIHsKKyAgICAgICAgQ09NUElMRV9BU1NFUlQoc2l6ZW9mKEJ1ZmZlclZh
bHVlVHlwZSkgPT0gMiwgQnVmZmVyVmFsdWVUeXBlSXNUd29CeXRlcyk7CisgICAgICAgIC8vIElm
IHRoZSB3cml0ZXIgaXMgYXQgb2RkIHBvc2l0aW9uIGluIHRoZSBidWZmZXIsIHRoZW4gb25lIG9m
CisgICAgICAgIC8vIHRoZSBieXRlcyBpbiB0aGUgbGFzdCBVQ2hhciBpcyBub3QgaW5pdGlhbGl6
ZWQuCisgICAgICAgIGlmIChtX3Bvc2l0aW9uICUgMikKKyAgICAgICAgICAgICpjaGFyQXQobV9w
b3NpdGlvbikgPSBzdGF0aWNfY2FzdDxjaGFyPihQYWRkaW5nVGFnKTsKKyAgICB9CisKKyAgICBj
aGFyKiBjaGFyQXQoaW50IHBvc2l0aW9uKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PGNoYXIq
PihtX2J1ZmZlci5kYXRhKCkpICsgcG9zaXRpb247IH0KKworICAgIFZlY3RvcjxCdWZmZXJWYWx1
ZVR5cGU+IG1fYnVmZmVyOworICAgIHVuc2lnbmVkIG1fcG9zaXRpb247Cit9OworCitjbGFzcyBT
ZXJpYWxpemVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTZXJpYWxpemVyKFdyaXRlciYgd3Jp
dGVyKQorICAgICAgICA6IG1fd3JpdGVyKHdyaXRlcikKKyAgICAgICAgLCBtX3N0YXRlKDApCisg
ICAgICAgICwgbV9kZXB0aCgwKQorICAgIHsKKyAgICB9CisKKyAgICBib29sIHNlcmlhbGl6ZSh2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUpCisgICAgeworICAgICAgICB2ODo6SGFuZGxlU2Nv
cGUgc2NvcGU7CisgICAgICAgIFN0YWNrQ2xlYW5lciBjbGVhbmVyKCZtX3N0YXRlKTsKKyAgICAg
ICAgaWYgKCFkb1NlcmlhbGl6ZSh2YWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIHdoaWxlICh0b3AoKSkgeworICAgICAgICAgICAgaW50IGxlbmd0aDsKKyAgICAgICAg
ICAgIHdoaWxlICghdG9wKCktPmlzRG9uZSgmbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIC8v
IE5vdGUgdGhhdCBkb1NlcmlhbGl6ZSgpIGNhbiBjaGFuZ2UgY3VycmVudCB0b3AoKS4KKyAgICAg
ICAgICAgICAgICBpZiAoIWRvU2VyaWFsaXplKHRvcCgpLT5hZHZhbmNlKCkpKQorICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3dy
aXRlci5lbmRDb21wb3NpdGUodG9wKCktPnRhZygpLCBsZW5ndGgpOworICAgICAgICAgICAgcG9w
KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCitwcml2YXRlOgor
ICAgIGNsYXNzIFN0YXRlQmFzZSA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CisgICAgcHVibGljOgor
ICAgICAgICB2aXJ0dWFsIH5TdGF0ZUJhc2UoKSB7IH0KKworICAgICAgICAvLyBMaW5rIHRvIHRo
ZSBuZXh0IHN0YXRlIHRvIGZvcm0gYSBzdGFjay4KKyAgICAgICAgU3RhdGVCYXNlKiBuZXh0U3Rh
dGUoKSB7IHJldHVybiBtX25leHQ7IH0KKyAgICAgICAgdm9pZCBzZXROZXh0U3RhdGUoU3RhdGVC
YXNlKiBuZXh0KSB7IG1fbmV4dCA9IG5leHQ7IH0KKworICAgICAgICAvLyBDb21wb3NpdGUgb2Jq
ZWN0IHdlJ3JlIHByb2Nlc3NpbmcgaW4gdGhpcyBzdGF0ZS4KKyAgICAgICAgdjg6OkhhbmRsZTx2
ODo6VmFsdWU+IGNvbXBvc2l0ZSgpIHsgcmV0dXJuIG1fY29tcG9zaXRlOyB9CisKKyAgICAgICAg
Ly8gU2VyaWFsaXphdGlvbiB0YWcgZm9yIHRoZSBjdXJyZW50IGNvbXBvc2l0ZS4KKyAgICAgICAg
dmlydHVhbCBTZXJpYWxpemF0aW9uVGFnIHRhZygpIGNvbnN0ID0gMDsKKworICAgICAgICAvLyBS
ZXR1cm5zIHdoZXRoZXIgaXRlcmF0aW9uIG92ZXIgc3Vib2JqZWN0cyBvZiB0aGUgY3VycmVudAor
ICAgICAgICAvLyBjb21wb3NpdGUgb2JqZWN0IGlzIGRvbmUuIElmIHllcywgfCpsZW5ndGh8IGlz
IHNldCB0byB0aGUKKyAgICAgICAgLy8gbnVtYmVyIG9mIHN1Ym9iamVjdHMuCisgICAgICAgIHZp
cnR1YWwgYm9vbCBpc0RvbmUoaW50KiBsZW5ndGgpID0gMDsKKworICAgICAgICAvLyBBZHZhbmNl
cyB0byB0aGUgbmV4dCBzdWJvYmplY3QuCisgICAgICAgIC8vIFJlcXVpcmVzOiAhdGhpcy0+aXNE
b25lKCkuCisgICAgICAgIHZpcnR1YWwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gYWR2YW5jZSgpID0g
MDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgU3RhdGVCYXNlKHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBjb21wb3NpdGUpCisgICAgICAgICAgICA6IG1fbmV4dCgwKQorICAgICAgICAgICAgLCBt
X2NvbXBvc2l0ZShjb21wb3NpdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgcHJpdmF0
ZToKKyAgICAgICAgU3RhdGVCYXNlKiBtX25leHQ7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBtX2NvbXBvc2l0ZTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIFNl
cmlhbGl6YXRpb25UYWcgY29tcG9zaXRlVGFnPgorICAgIGNsYXNzIFN0YXRlIDogcHVibGljIFN0
YXRlQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICB2ODo6SGFuZGxlPFQ+IGNvbXBvc2l0ZSgp
IHsgcmV0dXJuIGhhbmRsZUNhc3Q8VD4oU3RhdGVCYXNlOjpjb21wb3NpdGUoKSk7IH0KKworICAg
ICAgICB2aXJ0dWFsIFNlcmlhbGl6YXRpb25UYWcgdGFnKCkgY29uc3QgeyByZXR1cm4gY29tcG9z
aXRlVGFnOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGV4cGxpY2l0IFN0YXRlKHY4OjpI
YW5kbGU8VD4gY29tcG9zaXRlKSA6IFN0YXRlQmFzZShjb21wb3NpdGUpCisgICAgICAgIHsKKyAg
ICAgICAgfQorICAgIH07CisKKyAgICAvLyBIZWxwZXIgdG8gY2xlYW4gdXAgdGhlIHN0YXRlIHN0
YWNrIGluIGNhc2Ugb2YgZXJyb3JzLgorICAgIGNsYXNzIFN0YWNrQ2xlYW5lciA6IE5vbmNvcHlh
YmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFN0YWNrQ2xlYW5lcihTdGF0ZUJh
c2UqKiBzdGFjaykgOiBtX3N0YWNrKHN0YWNrKQorICAgICAgICB7CisgICAgICAgIH0KKworICAg
ICAgICB+U3RhY2tDbGVhbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdGVCYXNlKiBz
dGF0ZSA9ICptX3N0YWNrOworICAgICAgICAgICAgd2hpbGUgKHN0YXRlKSB7CisgICAgICAgICAg
ICAgICAgU3RhdGVCYXNlKiB0bXAgPSBzdGF0ZS0+bmV4dFN0YXRlKCk7CisgICAgICAgICAgICAg
ICAgZGVsZXRlIHN0YXRlOworICAgICAgICAgICAgICAgIHN0YXRlID0gdG1wOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgKm1fc3RhY2sgPSAwOworICAgICAgICB9CisKKyAgICBwcml2YXRl
OgorICAgICAgICBTdGF0ZUJhc2UqKiBtX3N0YWNrOworICAgIH07CisKKyAgICBjbGFzcyBBcnJh
eVN0YXRlIDogcHVibGljIFN0YXRlPHY4OjpBcnJheSwgQXJyYXlUYWc+IHsKKyAgICBwdWJsaWM6
CisgICAgICAgIEFycmF5U3RhdGUodjg6OkhhbmRsZTx2ODo6QXJyYXk+IGFycmF5KQorICAgICAg
ICAgICAgOiBTdGF0ZTx2ODo6QXJyYXksIEFycmF5VGFnPihhcnJheSkKKyAgICAgICAgICAgICwg
bV9pbmRleCgwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGJvb2wg
aXNEb25lKGludCogbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICAqbGVuZ3RoID0gY29t
cG9zaXRlKCktPkxlbmd0aCgpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4o
bV9pbmRleCkgPj0gKmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdjg6Okxv
Y2FsPHY4OjpWYWx1ZT4gYWR2YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVCht
X2luZGV4IDwgY29tcG9zaXRlKCktPkxlbmd0aCgpKTsKKyAgICAgICAgICAgIHY4OjpIYW5kbGVT
Y29wZSBzY29wZTsKKyAgICAgICAgICAgIHJldHVybiBzY29wZS5DbG9zZShjb21wb3NpdGUoKS0+
R2V0KHY4OjpJbnRlZ2VyOjpOZXcobV9pbmRleCsrKSkpOworICAgICAgICB9CisKKyAgICBwcml2
YXRlOgorICAgICAgICB1bnNpZ25lZCBtX2luZGV4OworICAgIH07CisKKyAgICBjbGFzcyBPYmpl
Y3RTdGF0ZSA6IHB1YmxpYyBTdGF0ZTx2ODo6T2JqZWN0LCBPYmplY3RUYWc+IHsKKyAgICBwdWJs
aWM6CisgICAgICAgIE9iamVjdFN0YXRlKHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqZWN0KQor
ICAgICAgICAgICAgOiBTdGF0ZTx2ODo6T2JqZWN0LCBPYmplY3RUYWc+KG9iamVjdCkKKyAgICAg
ICAgICAgICwgbV9wcm9wZXJ0eU5hbWVzKG9iamVjdC0+R2V0UHJvcGVydHlOYW1lcygpKQorICAg
ICAgICAgICAgLCBtX2luZGV4KC0xKQorICAgICAgICAgICAgLCBtX2xlbmd0aCgwKQorICAgICAg
ICB7CisgICAgICAgICAgICBuZXh0UHJvcGVydHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZp
cnR1YWwgYm9vbCBpc0RvbmUoaW50KiBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgICps
ZW5ndGggPSBtX2xlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4ID49IDIgKiBtX3By
b3BlcnR5TmFtZXMtPkxlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2ODo6
TG9jYWw8djg6OlZhbHVlPiBhZHZhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJU
KG1faW5kZXggPCAyICogbV9wcm9wZXJ0eU5hbWVzLT5MZW5ndGgoKSk7CisgICAgICAgICAgICBp
ZiAoIShtX2luZGV4ICUgMikpIHsKKyAgICAgICAgICAgICAgICArK21faW5kZXg7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIG1fcHJvcGVydHlOYW1lOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmVzdWx0ID0gY29tcG9zaXRlKCktPkdldChtX3Byb3Bl
cnR5TmFtZSk7CisgICAgICAgICAgICBuZXh0UHJvcGVydHkoKTsKKyAgICAgICAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbmV4dFBy
b3BlcnR5KCkKKyAgICAgICAgeworICAgICAgICAgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwor
ICAgICAgICAgICAgKyttX2luZGV4OworICAgICAgICAgICAgQVNTRVJUKCEobV9pbmRleCAlIDIp
KTsKKyAgICAgICAgICAgIGZvciAoOyBtX2luZGV4IDwgMiAqIG1fcHJvcGVydHlOYW1lcy0+TGVu
Z3RoKCk7IG1faW5kZXggKz0gMikgeworICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFs
dWU+IHByb3BlcnR5TmFtZSA9IG1fcHJvcGVydHlOYW1lcy0+R2V0KHY4OjpJbnRlZ2VyOjpOZXco
bV9pbmRleCAvIDIpKTsKKyAgICAgICAgICAgICAgICBpZiAoKHByb3BlcnR5TmFtZS0+SXNTdHJp
bmcoKSAmJiBjb21wb3NpdGUoKS0+SGFzUmVhbE5hbWVkUHJvcGVydHkoaGFuZGxlQ2FzdDx2ODo6
U3RyaW5nPihwcm9wZXJ0eU5hbWUpKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHByb3BlcnR5
TmFtZS0+SXNJbnQzMigpICYmIGNvbXBvc2l0ZSgpLT5IYXNSZWFsSW5kZXhlZFByb3BlcnR5KHBy
b3BlcnR5TmFtZS0+VWludDMyVmFsdWUoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1fcHJv
cGVydHlOYW1lID0gc2NvcGUuQ2xvc2UocHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgICAgICAg
ICAgbV9sZW5ndGggKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHY4OjpMb2NhbDx2
ODo6QXJyYXk+IG1fcHJvcGVydHlOYW1lczsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4g
bV9wcm9wZXJ0eU5hbWU7CisgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgICAgIHVuc2ln
bmVkIG1fbGVuZ3RoOworICAgIH07CisKKyAgICBib29sIGRvU2VyaWFsaXplKHY4OjpIYW5kbGU8
djg6OlZhbHVlPiB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZS0+SXNVbmRlZmluZWQo
KSkKKyAgICAgICAgICAgIG1fd3JpdGVyLndyaXRlVW5kZWZpbmVkKCk7CisgICAgICAgIGVsc2Ug
aWYgKHZhbHVlLT5Jc051bGwoKSkKKyAgICAgICAgICAgIG1fd3JpdGVyLndyaXRlTnVsbCgpOwor
ICAgICAgICBlbHNlIGlmICh2YWx1ZS0+SXNUcnVlKCkpCisgICAgICAgICAgICBtX3dyaXRlci53
cml0ZVRydWUoKTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUtPklzRmFsc2UoKSkKKyAgICAgICAg
ICAgIG1fd3JpdGVyLndyaXRlRmFsc2UoKTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUtPklzSW50
MzIoKSkKKyAgICAgICAgICAgIG1fd3JpdGVyLndyaXRlSW50MzIodmFsdWUtPkludDMyVmFsdWUo
KSk7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlLT5Jc051bWJlcigpKQorICAgICAgICAgICAgbV93
cml0ZXIud3JpdGVOdW1iZXIoaGFuZGxlQ2FzdDx2ODo6TnVtYmVyPih2YWx1ZSktPlZhbHVlKCkp
OworICAgICAgICBlbHNlIGlmICh2YWx1ZS0+SXNTdHJpbmcoKSkgeworICAgICAgICAgICAgdjg6
OlN0cmluZzo6VXRmOFZhbHVlIHN0cmluZ1ZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgIG1fd3Jp
dGVyLndyaXRlU3RyaW5nKCpzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWUubGVuZ3RoKCkpOworICAg
ICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc0FycmF5KCkpIHsKKyAgICAgICAgICAgIGlmICghY2hl
Y2tDb21wb3NpdGUodmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgICAgIHB1c2gobmV3IEFycmF5U3RhdGUoaGFuZGxlQ2FzdDx2ODo6QXJyYXk+KHZhbHVlKSkp
OworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc09iamVjdCgpKSB7CisgICAgICAgICAgICBp
ZiAoIWNoZWNrQ29tcG9zaXRlKHZhbHVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICBwdXNoKG5ldyBPYmplY3RTdGF0ZShoYW5kbGVDYXN0PHY4OjpPYmplY3Q+
KHZhbHVlKSkpOworICAgICAgICAgICAgLy8gRklYTUU6CisgICAgICAgICAgICAvLyAtIGNoZWNr
IG5vdCBhIHdyYXBwZXIKKyAgICAgICAgICAgIC8vIC0gc3VwcG9ydCBGaWxlLCBJbWFnZURhdGEs
IGV0Yy4KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lk
IHB1c2goU3RhdGVCYXNlKiBzdGF0ZSkKKyAgICB7CisgICAgICAgIHN0YXRlLT5zZXROZXh0U3Rh
dGUobV9zdGF0ZSk7CisgICAgICAgIG1fc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgKyttX2RlcHRo
OworICAgIH0KKworICAgIFN0YXRlQmFzZSogdG9wKCkgeyByZXR1cm4gbV9zdGF0ZTsgfQorCisg
ICAgdm9pZCBwb3AoKQorICAgIHsKKyAgICAgICAgaWYgKCFtX3N0YXRlKQorICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICBTdGF0ZUJhc2UqIHRvcCA9IG1fc3RhdGU7CisgICAgICAgIG1fc3Rh
dGUgPSB0b3AtPm5leHRTdGF0ZSgpOworICAgICAgICBkZWxldGUgdG9wOworICAgICAgICAtLW1f
ZGVwdGg7CisgICAgfQorCisgICAgYm9vbCBjaGVja0NvbXBvc2l0ZSh2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gY29tcG9zaXRlKQorICAgIHsKKyAgICAgICAgaWYgKG1fZGVwdGggPiBtYXhEZXB0aCkK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFzaG91bGRDaGVja0ZvckN5
Y2xlcyhtX2RlcHRoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBmb3IgKFN0
YXRlQmFzZSogc3RhdGUgPSB0b3AoKTsgc3RhdGU7IHN0YXRlID0gc3RhdGUtPm5leHRTdGF0ZSgp
KSB7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmNvbXBvc2l0ZSgpID09IGNvbXBvc2l0ZSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorCisgICAgV3JpdGVyJiBtX3dyaXRlcjsKKyAgICBTdGF0ZUJhc2UqIG1fc3Rh
dGU7CisgICAgaW50IG1fZGVwdGg7Cit9OworCisvLyBSZWFkZXIgaXMgcmVzcG9uc2libGUgZm9y
IGRlc2VyaWFsaXppbmcgcHJpbWl0aXZlIHR5cGVzIGFuZAorLy8gcmVzdG9yaW5nIGluZm9ybWF0
aW9uIGFib3V0IHNhdmVkIG9iamVjdHMgb2YgY29tcG9zaXRlIHR5cGVzLgorY2xhc3MgUmVhZGVy
IHsKK3B1YmxpYzoKKyAgICBSZWFkZXIoY29uc3QgY2hhciogYnVmZmVyLCBpbnQgbGVuZ3RoKQor
ICAgICAgICA6IG1fYnVmZmVyKGJ1ZmZlcikKKyAgICAgICAgLCBtX2xlbmd0aChsZW5ndGgpCisg
ICAgICAgICwgbV9wb3NpdGlvbigwKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGxlbmd0aCA+PSAw
KTsKKyAgICB9CisKKyAgICBib29sIGlzRW9mKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvbiA+
PSBtX2xlbmd0aDsgfQorCisgICAgYm9vbCByZWFkKFNlcmlhbGl6YXRpb25UYWcqIHRhZywgdjg6
OkhhbmRsZTx2ODo6VmFsdWU+KiB2YWx1ZSwgaW50KiBsZW5ndGgpCisgICAgeworICAgICAgICB1
aW50MzJfdCByYXdMZW5ndGg7CisgICAgICAgIGlmICghcmVhZFRhZyh0YWcpKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICBzd2l0Y2ggKCp0YWcpIHsKKyAgICAgICAgY2FzZSBJ
bnZhbGlkVGFnOgorICAgICAgICBjYXNlIFBhZGRpbmdUYWc6CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBVbmRlZmluZWRUYWc6CisgICAgICAgICAgICAqdmFsdWUgPSB2ODo6VW5k
ZWZpbmVkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOdWxsVGFnOgorICAg
ICAgICAgICAgKnZhbHVlID0gdjg6Ok51bGwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIFRydWVUYWc6CisgICAgICAgICAgICAqdmFsdWUgPSB2ODo6VHJ1ZSgpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmFsc2VUYWc6CisgICAgICAgICAgICAqdmFsdWUg
PSB2ODo6RmFsc2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0cmluZ1Rh
ZzoKKyAgICAgICAgICAgIGlmICghcmVhZFN0cmluZyh2YWx1ZSkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSW50MzJUYWc6
CisgICAgICAgICAgICBpZiAoIXJlYWRJbnQzMih2YWx1ZSkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTnVtYmVyVGFnOgor
ICAgICAgICAgICAgaWYgKCFyZWFkTnVtYmVyKHZhbHVlKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPYmplY3RUYWc6Cisg
ICAgICAgIGNhc2UgQXJyYXlUYWc6CisgICAgICAgICAgICBpZiAoIWRvUmVhZFVpbnQzMigmcmF3
TGVuZ3RoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAqbGVu
Z3RoID0gcmF3TGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorCitwcml2YXRlOgorICAgIGJvb2wgcmVhZFRhZyhTZXJpYWxp
emF0aW9uVGFnKiB0YWcpCisgICAgeworICAgICAgICBpZiAobV9wb3NpdGlvbiA+PSBtX2xlbmd0
aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgKnRhZyA9IHN0YXRpY19jYXN0
PFNlcmlhbGl6YXRpb25UYWc+KG1fYnVmZmVyW21fcG9zaXRpb24rK10pOworICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIHJlYWRTdHJpbmcodjg6OkhhbmRsZTx2ODo6VmFs
dWU+KiB2YWx1ZSkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGxlbmd0aDsKKyAgICAgICAgaWYg
KCFkb1JlYWRVaW50MzIoJmxlbmd0aCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIGlmIChtX3Bvc2l0aW9uICsgbGVuZ3RoID4gbV9sZW5ndGgpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgICp2YWx1ZSA9IHY4OjpTdHJpbmc6Ok5ldyhtX2J1ZmZlciArIG1f
cG9zaXRpb24sIGxlbmd0aCk7CisgICAgICAgIG1fcG9zaXRpb24gKz0gbGVuZ3RoOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIHJlYWRJbnQzMih2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4qIHZhbHVlKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgcmF3VmFsdWU7CisgICAg
ICAgIGlmICghZG9SZWFkVWludDMyKCZyYXdWYWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgICp2YWx1ZSA9IHY4OjpJbnRlZ2VyOjpOZXcoc3RhdGljX2Nhc3Q8aW50MzJf
dD4oWmlnWmFnOjpkZWNvZGUocmF3VmFsdWUpKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKworICAgIGJvb2wgcmVhZE51bWJlcih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4qIHZhbHVlKQor
ICAgIHsKKyAgICAgICAgaWYgKG1fcG9zaXRpb24gKyBzaXplb2YoZG91YmxlKSA+IG1fbGVuZ3Ro
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBkb3VibGUgbnVtYmVyOworICAg
ICAgICBjaGFyKiBudW1iZXJBc0J5dGVBcnJheSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZu
dW1iZXIpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZW9mKGRvdWJsZSk7
ICsraSkKKyAgICAgICAgICAgIG51bWJlckFzQnl0ZUFycmF5W2ldID0gbV9idWZmZXJbbV9wb3Np
dGlvbisrXTsKKyAgICAgICAgKnZhbHVlID0gdjg6Ok51bWJlcjo6TmV3KG51bWJlcik7CisgICAg
ICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZG9SZWFkVWludDMyKHVpbnQzMl90
KiB2YWx1ZSkKKyAgICB7CisgICAgICAgICp2YWx1ZSA9IDA7CisgICAgICAgIGNoYXIgY3VycmVu
dEJ5dGU7CisgICAgICAgIGludCBzaGlmdCA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAg
IGlmIChtX3Bvc2l0aW9uID49IG1fbGVuZ3RoKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgICAgIGN1cnJlbnRCeXRlID0gbV9idWZmZXJbbV9wb3NpdGlvbisrXTsKKyAg
ICAgICAgICAgICp2YWx1ZSB8PSAoKGN1cnJlbnRCeXRlICYgdmFySW50TWFzaykgPDwgc2hpZnQp
OworICAgICAgICAgICAgc2hpZnQgKz0gdmFySW50U2hpZnQ7CisgICAgICAgIH0gd2hpbGUgKGN1
cnJlbnRCeXRlICYgKDEgPDwgdmFySW50U2hpZnQpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorCisgICAgY29uc3QgY2hhciogbV9idWZmZXI7CisgICAgY29uc3QgdW5zaWduZWQgbV9s
ZW5ndGg7CisgICAgdW5zaWduZWQgbV9wb3NpdGlvbjsKK307CisKK2NsYXNzIERlc2VyaWFsaXpl
ciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRGVzZXJpYWxpemVyKFJlYWRlciYgcmVhZGVyKSA6
IG1fcmVhZGVyKHJlYWRlcikKKyAgICB7CisgICAgfQorCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1
ZT4gZGVzZXJpYWxpemUoKQorICAgIHsKKyAgICAgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwor
ICAgICAgICB3aGlsZSAoIW1fcmVhZGVyLmlzRW9mKCkpIHsKKyAgICAgICAgICAgIGlmICghZG9E
ZXNlcmlhbGl6ZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVl
PigpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGFja0RlcHRoKCkgIT0gMSkKKyAgICAgICAg
ICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOworICAgICAgICByZXR1cm4gc2NvcGUu
Q2xvc2UoZWxlbWVudCgwKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIGJvb2wgZG9EZXNlcmlh
bGl6ZSgpCisgICAgeworICAgICAgICBTZXJpYWxpemF0aW9uVGFnIHRhZzsKKyAgICAgICAgdjg6
OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWU7CisgICAgICAgIGludCBsZW5ndGg7CisgICAgICAgIGlm
ICghbV9yZWFkZXIucmVhZCgmdGFnLCAmdmFsdWUsICZsZW5ndGgpKQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICBpZiAoIXZhbHVlLklzRW1wdHkoKSkgeworICAgICAgICAgICAg
cHVzaCh2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodGFnID09IE9iamVjdFRhZykgeworICAg
ICAgICAgICAgaWYgKGxlbmd0aCA+IHN0YWNrRGVwdGgoKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjg6
Ok9iamVjdDo6TmV3KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhY2tEZXB0aCgpIC0g
bGVuZ3RoOyBpIDwgc3RhY2tEZXB0aCgpOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICB2ODo6
TG9jYWw8djg6OlZhbHVlPiBwcm9wZXJ0eU5hbWUgPSBlbGVtZW50KGkpOworICAgICAgICAgICAg
ICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHByb3BlcnR5VmFsdWUgPSBlbGVtZW50KGkgKyAxKTsK
KyAgICAgICAgICAgICAgICBvYmplY3QtPlNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUp
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9wKGxlbmd0aCk7CisgICAgICAgICAgICBw
dXNoKG9iamVjdCk7CisgICAgICAgIH0gZWxzZSBpZiAodGFnID09IEFycmF5VGFnKSB7CisgICAg
ICAgICAgICBpZiAobGVuZ3RoID4gc3RhY2tEZXB0aCgpKQorICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IGFycmF5ID0gdjg6OkFy
cmF5OjpOZXcobGVuZ3RoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBkZXB0aCA9IHN0YWNrRGVw
dGgoKSAtIGxlbmd0aDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2ODo6SGFuZGxl
U2NvcGUgc2NvcGU7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7
ICsraSkKKyAgICAgICAgICAgICAgICAgICAgYXJyYXktPlNldCh2ODo6SW50ZWdlcjo6TmV3KGkp
LCBlbGVtZW50KGRlcHRoICsgaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9wKGxl
bmd0aCk7CisgICAgICAgICAgICBwdXNoKGFycmF5KTsKKyAgICAgICAgfSBlbHNlIGlmICh0YWcg
IT0gUGFkZGluZ1RhZykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorCisgICAgdm9pZCBwdXNoKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVl
KSB7IG1fc3RhY2suYXBwZW5kKHZhbHVlKTsgfQorCisgICAgdm9pZCBwb3AodW5zaWduZWQgbGVu
Z3RoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGxlbmd0aCA8PSBtX3N0YWNrLnNpemUoKSk7Cisg
ICAgICAgIG1fc3RhY2suc2hyaW5rKG1fc3RhY2suc2l6ZSgpIC0gbGVuZ3RoKTsKKyAgICB9CisK
KyAgICBpbnQgc3RhY2tEZXB0aCgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhY2suc2l6ZSgpOyB9CisK
KyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBlbGVtZW50KHVuc2lnbmVkIGluZGV4KQorICAgIHsK
KyAgICAgICAgQVNTRVJUKGluZGV4IDwgbV9zdGFjay5zaXplKCkpOworICAgICAgICByZXR1cm4g
bV9zdGFja1tpbmRleF07CisgICAgfQorCisgICAgUmVhZGVyJiBtX3JlYWRlcjsKKyAgICBWZWN0
b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4gPiBtX3N0YWNrOworfTsKKworfSAvLyBuYW1lc3BhY2UK
KworU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWUodjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IHZhbHVlKQoreworICAgIFdyaXRlciB3cml0ZXI7CisgICAgU2VyaWFsaXpl
ciBzZXJpYWxpemVyKHdyaXRlcik7CisgICAgaWYgKCFzZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1
ZSkpIHsKKyAgICAgICAgLy8gRklYTUU6IHRocm93IGV4Y2VwdGlvbgorICAgICAgICByZXR1cm47
CisgICAgfQorICAgIG1fZGF0YSA9IFN0cmluZ0ltcGw6OmFkb3B0KHdyaXRlci5kYXRhKCkpOwor
fQorCitTZXJpYWxpemVkU2NyaXB0VmFsdWU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShTdHJpbmcg
ZGF0YSwgU3RyaW5nRGF0YU1vZGUgbW9kZSkKK3sKKyAgICBpZiAobW9kZSA9PSBXaXJlRGF0YSkK
KyAgICAgICAgbV9kYXRhID0gZGF0YTsKKyAgICBlbHNlIHsKKyAgICAgICAgQVNTRVJUKG1vZGUg
PT0gU3RyaW5nVmFsdWUpOworICAgICAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBidWZmZXIgPSB1
dGY4QnVmZmVyKGRhdGEpOworICAgICAgICBXcml0ZXIgd3JpdGVyOworICAgICAgICB3cml0ZXIu
d3JpdGVTdHJpbmcoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgbV9k
YXRhID0gU3RyaW5nSW1wbDo6YWRvcHQod3JpdGVyLmRhdGEoKSk7CisgICAgfQorfQorCit2ODo6
TG9jYWw8djg6OlZhbHVlPiBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmRlc2VyaWFsaXplKCkKK3sK
KyAgICBpZiAoIW1fZGF0YS5pbXBsKCkpCisgICAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZh
bHVlPigpOworICAgIENPTVBJTEVfQVNTRVJUKHNpemVvZihCdWZmZXJWYWx1ZVR5cGUpID09IDIs
IEJ1ZmZlclZhbHVlVHlwZUlzVHdvQnl0ZXMpOworICAgIFJlYWRlciByZWFkZXIocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBjaGFyKj4obV9kYXRhLmltcGwoKS0+Y2hhcmFjdGVycygpKSwgMiAqIG1f
ZGF0YS5sZW5ndGgoKSk7CisgICAgRGVzZXJpYWxpemVyIGRlc2VyaWFsaXplcihyZWFkZXIpOwor
ICAgIHJldHVybiBkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoKTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2Ny
aXB0VmFsdWUuaCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvU2VyaWFsaXplZFNjcmlwdFZhbHVlLmgK
aW5kZXggMjZhNDE5OS4uN2ViODkzNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9iaW5kaW5ncy92OC9T
ZXJpYWxpemVkU2NyaXB0VmFsdWUuaAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1NlcmlhbGl6
ZWRTY3JpcHRWYWx1ZS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAw
OSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5
LCAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00MCwxMSArNDAsMjYgQEAgbmFtZXNwYWNlIFdlYkNvcmUg
ewogCiBjbGFzcyBTZXJpYWxpemVkU2NyaXB0VmFsdWUgOiBwdWJsaWMgUmVmQ291bnRlZDxTZXJp
YWxpemVkU2NyaXB0VmFsdWU+IHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxTZXJp
YWxpemVkU2NyaXB0VmFsdWU+IGNyZWF0ZShTdHJpbmcgc3RyaW5nKQorICAgIC8vIENyZWF0ZXMg
YSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBWOCB2YWx1ZS4KKyAgICBz
dGF0aWMgUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGNyZWF0ZSh2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gdmFsdWUpCiAgICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZShzdHJpbmcpKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5l
dyBTZXJpYWxpemVkU2NyaXB0VmFsdWUodmFsdWUpKTsKICAgICB9CiAKKyAgICAvLyBDcmVhdGVz
IGEgc2VyaWFsaXplZCB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBkYXRhIG9idGFpbmVkIGZyb20gYQor
ICAgIC8vIHByaW9yIGNhbGwgdG8gdG9XaXJlU3RyaW5nKCkuCisgICAgc3RhdGljIFBhc3NSZWZQ
dHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBjcmVhdGVGcm9tV2lyZShTdHJpbmcgZGF0YSkKKyAg
ICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgU2VyaWFsaXplZFNjcmlwdFZhbHVlKGRh
dGEsIFdpcmVEYXRhKSk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlcyBhIHNlcmlhbGl6ZWQgcmVw
cmVzZW50YXRpb24gb2YgV2ViQ29yZSBzdHJpbmcuCisgICAgc3RhdGljIFBhc3NSZWZQdHI8U2Vy
aWFsaXplZFNjcmlwdFZhbHVlPiBjcmVhdGUoU3RyaW5nIGRhdGEpCisgICAgeworICAgICAgICBy
ZXR1cm4gYWRvcHRSZWYobmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShkYXRhLCBTdHJpbmdWYWx1
ZSkpOworICAgIH0KKworICAgIC8vIENyZWF0ZXMgYW4gZW1wdHkgc2VyaWFsaXplZCB2YWx1ZS4K
ICAgICBzdGF0aWMgUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGNyZWF0ZSgpCiAg
ICAgewogICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgp
KTsKQEAgLTUyLDIzICs2NywyOSBAQCBwdWJsaWM6CiAKICAgICBQYXNzUmVmUHRyPFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZT4gcmVsZWFzZSgpCiAgICAgewotICAgICAgICBSZWZQdHI8U2VyaWFsaXpl
ZFNjcmlwdFZhbHVlPiByZXN1bHQgPSBhZG9wdFJlZihuZXcgU2VyaWFsaXplZFNjcmlwdFZhbHVl
KG1fZGF0YSkpOworICAgICAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiByZXN1bHQg
PSBhZG9wdFJlZihuZXcgU2VyaWFsaXplZFNjcmlwdFZhbHVlKG1fZGF0YSwgV2lyZURhdGEpKTsK
ICAgICAgICAgbV9kYXRhID0gU3RyaW5nKCk7CiAgICAgICAgIHJldHVybiByZXN1bHQucmVsZWFz
ZSgpOwogICAgIH0KIAotICAgIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1
cm4gbV9kYXRhOwotICAgIH0KKyAgICBTdHJpbmcgdG9XaXJlU3RyaW5nKCkgY29uc3QgeyByZXR1
cm4gbV9kYXRhOyB9CisKKyAgICAvLyBEZXNlcmlhbGl6ZXMgdGhlIHZhbHVlIChpbiB0aGUgY3Vy
cmVudCBjb250ZXh0KS4gUmV0dXJucyBhbgorICAgIC8vIGVtcHR5IGhhbmRsZSBpbiBjYXNlIG9m
IGZhaWx1cmUuCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gZGVzZXJpYWxpemUoKTsKIAogcHJp
dmF0ZToKLSAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWUoU3RyaW5nIHN0cmluZykKLSAgICAgICAg
OiBtX2RhdGEoc3RyaW5nKQotICAgIHsKLSAgICB9CisgICAgZW51bSBTdHJpbmdEYXRhTW9kZSB7
CisgICAgICAgIFN0cmluZ1ZhbHVlLAorICAgICAgICBXaXJlRGF0YQorICAgIH07CiAKICAgICBT
ZXJpYWxpemVkU2NyaXB0VmFsdWUoKSB7IH0KKworICAgIGV4cGxpY2l0IFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4pOworCisgICAgU2VyaWFsaXplZFNjcmlwdFZh
bHVlKFN0cmluZyBkYXRhLCBTdHJpbmdEYXRhTW9kZSBtb2RlKTsKKwogICAgIFN0cmluZyBtX2Rh
dGE7CiB9OwogCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVdp
bmRvd0N1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVdpbmRvd0N1
c3RvbS5jcHAKaW5kZXggZGFjZDRmNi4uYjU5NDUxOCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dDdXN0b20uY3BwCisrKyBiL1dlYkNvcmUvYmluZGlu
Z3MvdjgvY3VzdG9tL1Y4RE9NV2luZG93Q3VzdG9tLmNwcApAQCAtNDExLDcgKzQxMSw3IEBAIHY4
OjpIYW5kbGU8djg6OlZhbHVlPiBWOERPTVdpbmRvdzo6cG9zdE1lc3NhZ2VDYWxsYmFjayhjb25z
dCB2ODo6QXJndW1lbnRzJiBhcmdzCiAgICAgQVNTRVJUKHNvdXJjZS0+ZnJhbWUoKSk7CiAKICAg
ICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7Ci0gICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZT4gbWVzc2FnZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKHRvV2ViQ29yZVN0cmlu
ZyhhcmdzWzBdKSk7CisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gbWVzc2FnZSA9
IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFyZ3NbMF0pOwogICAgIE1lc3NhZ2VQb3J0
QXJyYXkgcG9ydEFycmF5OwogICAgIFN0cmluZyB0YXJnZXRPcmlnaW47CiAKZGlmZiAtLWdpdCBh
L1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RGVkaWNhdGVkV29ya2VyQ29udGV4dEN1c3Rv
bS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERlZGljYXRlZFdvcmtlckNvbnRl
eHRDdXN0b20uY3BwCmluZGV4IDVhYjYyMTguLjQ0ODZkYmUgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4RGVkaWNhdGVkV29ya2VyQ29udGV4dEN1c3RvbS5jcHAKKysr
IGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhEZWRpY2F0ZWRXb3JrZXJDb250ZXh0Q3Vz
dG9tLmNwcApAQCAtNDYsNyArNDYsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhEZWRpY2F0
ZWRXb3JrZXJDb250ZXh0Ojpwb3N0TWVzc2FnZUNhbGxiYWNrKGNvbnN0IHY4OjpBcgogewogICAg
IElOQ19TVEFUUyhMIkRPTS5EZWRpY2F0ZWRXb3JrZXJDb250ZXh0LnBvc3RNZXNzYWdlIik7CiAg
ICAgRGVkaWNhdGVkV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9IFY4RGVkaWNhdGVkV29y
a2VyQ29udGV4dDo6dG9OYXRpdmUoYXJncy5Ib2xkZXIoKSk7Ci0gICAgUmVmUHRyPFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZT4gbWVzc2FnZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKHY4
VmFsdWVUb1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2Ny
aXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzBd
KTsKICAgICBNZXNzYWdlUG9ydEFycmF5IHBvcnRBcnJheTsKICAgICBpZiAoYXJncy5MZW5ndGgo
KSA+IDEpIHsKICAgICAgICAgaWYgKCFnZXRNZXNzYWdlUG9ydEFycmF5KGFyZ3NbMV0sIHBvcnRB
cnJheSkpCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhpc3RvcnlD
dXN0b20uY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIaXN0b3J5Q3VzdG9tLmNw
cAppbmRleCA2YWEwODA2Li5iODU3ZDZlIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOEhpc3RvcnlDdXN0b20uY3BwCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4SGlzdG9yeUN1c3RvbS5jcHAKQEAgLTQzLDcgKzQzLDcgQEAgbmFtZXNwYWNlIFdlYkNv
cmUgewogCiB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhIaXN0b3J5OjpwdXNoU3RhdGVDYWxsYmFj
ayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKQogewotICAgIFJlZlB0cjxTZXJpYWxpemVkU2Ny
aXB0VmFsdWU+IGhpc3RvcnlTdGF0ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKHRv
V2ViQ29yZVN0cmluZyhhcmdzWzBdKSk7CisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZT4gaGlzdG9yeVN0YXRlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoYXJnc1swXSk7
CiAKICAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7CiAgICAgU3RyaW5nIHRpdGxlID0gdG9XZWJD
b3JlU3RyaW5nV2l0aE51bGxPclVuZGVmaW5lZENoZWNrKGFyZ3NbMV0pOwpAQCAtNjQsNyArNjQs
NyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhIaXN0b3J5OjpwdXNoU3RhdGVDYWxsYmFjayhj
b25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKQogCiB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhIaXN0
b3J5OjpyZXBsYWNlU3RhdGVDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKQogewot
ICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGhpc3RvcnlTdGF0ZSA9IFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKSk7CisgICAgUmVm
UHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gaGlzdG9yeVN0YXRlID0gU2VyaWFsaXplZFNjcmlw
dFZhbHVlOjpjcmVhdGUoYXJnc1swXSk7CiAKICAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7CiAg
ICAgU3RyaW5nIHRpdGxlID0gdG9XZWJDb3JlU3RyaW5nV2l0aE51bGxPclVuZGVmaW5lZENoZWNr
KGFyZ3NbMV0pOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNz
YWdlRXZlbnRDdXN0b20uY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdl
RXZlbnRDdXN0b20uY3BwCmluZGV4IGIyOTFkMWEuLjJiMDI3ZGMgMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3VzdG9tLmNwcAorKysgYi9XZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VFdmVudEN1c3RvbS5jcHAKQEAgLTY1LDcg
KzY1LDcgQEAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4TWVzc2FnZUV2ZW50Ojppbml0TWVzc2Fn
ZUV2ZW50Q2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW4KICAgICBTdHJpbmcgdHlwZUFyZyA9IHY4
VmFsdWVUb1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgYm9vbCBjYW5CdWJibGVBcmcgPSBh
cmdzWzFdLT5Cb29sZWFuVmFsdWUoKTsKICAgICBib29sIGNhbmNlbGFibGVBcmcgPSBhcmdzWzJd
LT5Cb29sZWFuVmFsdWUoKTsKLSAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBkYXRh
QXJnID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUodjhWYWx1ZVRvV2ViQ29yZVN0cmlu
ZyhhcmdzWzNdKSk7CisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gZGF0YUFyZyA9
IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFyZ3NbM10pOwogICAgIFN0cmluZyBvcmln
aW5BcmcgPSB2OFZhbHVlVG9XZWJDb3JlU3RyaW5nKGFyZ3NbNF0pOwogICAgIFN0cmluZyBsYXN0
RXZlbnRJZEFyZyA9IHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcoYXJnc1s1XSk7CiAgICAgRE9NV2lu
ZG93KiBzb3VyY2VBcmcgPSBWOERPTVdpbmRvdzo6SGFzSW5zdGFuY2UoYXJnc1s2XSkgPyBWOERP
TVdpbmRvdzo6dG9OYXRpdmUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdChhcmdzWzZdKSkg
OiAwOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdlUG9y
dEN1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3Vz
dG9tLmNwcAppbmRleCAwNzFiMWFjLi5jYzcwYmM1IDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3VzdG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3VzdG9tLmNwcApAQCAtNzgsNyArNzgsNyBAQCB2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhNZXNzYWdlUG9ydDo6cG9zdE1lc3NhZ2VDYWxsYmFjayhj
b25zdCB2ODo6QXJndW1lbnRzJiBhcgogewogICAgIElOQ19TVEFUUygiRE9NLk1lc3NhZ2VQb3J0
LnBvc3RNZXNzYWdlIik7CiAgICAgTWVzc2FnZVBvcnQqIG1lc3NhZ2VQb3J0ID0gVjhNZXNzYWdl
UG9ydDo6dG9OYXRpdmUoYXJncy5Ib2xkZXIoKSk7Ci0gICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZT4gbWVzc2FnZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKHRvV2ViQ29y
ZVN0cmluZyhhcmdzWzBdKSk7CisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gbWVz
c2FnZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFyZ3NbMF0pOwogICAgIE1lc3Nh
Z2VQb3J0QXJyYXkgcG9ydEFycmF5OwogICAgIGlmIChhcmdzLkxlbmd0aCgpID4gMSkgewogICAg
ICAgICBpZiAoIWdldE1lc3NhZ2VQb3J0QXJyYXkoYXJnc1sxXSwgcG9ydEFycmF5KSkKZGlmZiAt
LWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4UG9wU3RhdGVFdmVudEN1c3RvbS5j
cHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFBvcFN0YXRlRXZlbnRDdXN0b20uY3Bw
CmluZGV4IDk5Y2MyZDEuLjQ2ZTk5MjkgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4UG9wU3RhdGVFdmVudEN1c3RvbS5jcHAKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhQb3BTdGF0ZUV2ZW50Q3VzdG9tLmNwcApAQCAtNDQsNyArNDQsNyBAQCB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gVjhQb3BTdGF0ZUV2ZW50Ojppbml0UG9wU3RhdGVFdmVudENhbGxi
YWNrKGNvbnN0IHY4OjpBcmd1bQogICAgIFN0cmluZyB0eXBlQXJnID0gdjhWYWx1ZVRvV2ViQ29y
ZVN0cmluZyhhcmdzWzBdKTsKICAgICBib29sIGNhbkJ1YmJsZUFyZyA9IGFyZ3NbMV0tPkJvb2xl
YW5WYWx1ZSgpOwogICAgIGJvb2wgY2FuY2VsYWJsZUFyZyA9IGFyZ3NbMl0tPkJvb2xlYW5WYWx1
ZSgpOwotICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHN0YXRlQXJnID0gU2VyaWFs
aXplZFNjcmlwdFZhbHVlOjpjcmVhdGUodjhWYWx1ZVRvV2ViQ29yZVN0cmluZyhhcmdzWzNdKSk7
CisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc3RhdGVBcmcgPSBTZXJpYWxpemVk
U2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzNdKTsKIAogICAgIFBvcFN0YXRlRXZlbnQqIGV2ZW50
ID0gVjhQb3BTdGF0ZUV2ZW50Ojp0b05hdGl2ZShhcmdzLkhvbGRlcigpKTsKICAgICBldmVudC0+
aW5pdFBvcFN0YXRlRXZlbnQodHlwZUFyZywgY2FuQnViYmxlQXJnLCBjYW5jZWxhYmxlQXJnLCBz
dGF0ZUFyZy5yZWxlYXNlKCkpOwpAQCAtNjEsNyArNjEsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gVjhQb3BTdGF0ZUV2ZW50OjpzdGF0ZUFjY2Vzc29yR2V0dGVyKHY4OjpMb2NhbDx2ODo6U3Ry
aW5nPgogICAgIGlmICghc3RhdGUpCiAgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOwogCi0gICAg
cmV0dXJuIHY4U3RyaW5nT3JOdWxsKHN0YXRlLT50b1N0cmluZygpKTsKKyAgICByZXR1cm4gc3Rh
dGUtPmRlc2VyaWFsaXplKCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V29ya2VyQ3VzdG9tLmNwcCBiL1dlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V29ya2VyQ3VzdG9tLmNwcAppbmRleCA2ZGVjN2FmLi40
MjkxZjZkIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckN1
c3RvbS5jcHAKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhXb3JrZXJDdXN0b20u
Y3BwCkBAIC05Miw3ICs5Miw3IEBAIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFdvcmtlcjo6cG9z
dE1lc3NhZ2VDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKQogewogICAgIElOQ19T
VEFUUygiRE9NLldvcmtlci5wb3N0TWVzc2FnZSIpOwogICAgIFdvcmtlciogd29ya2VyID0gVjhX
b3JrZXI6OnRvTmF0aXZlKGFyZ3MuSG9sZGVyKCkpOwotICAgIFJlZlB0cjxTZXJpYWxpemVkU2Ny
aXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZSh0b1dlYkNv
cmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1l
c3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzBdKTsKICAgICBNZXNz
YWdlUG9ydEFycmF5IHBvcnRBcnJheTsKICAgICBpZiAoYXJncy5MZW5ndGgoKSA+IDEpIHsKICAg
ICAgICAgaWYgKCFnZXRNZXNzYWdlUG9ydEFycmF5KGFyZ3NbMV0sIHBvcnRBcnJheSkpCmRpZmYg
LS1naXQgYS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nIGIvV2ViS2l0L2Nocm9taXVtL0NoYW5n
ZUxvZwppbmRleCAwMGE4YzMyLi4xYmIyYjBiIDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0v
Q2hhbmdlTG9nCisrKyBiL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMyBA
QAorMjAxMC0wMS0xNSAgVml0YWx5IFJlcGVzaGtvICA8dml0YWx5ckBjaHJvbWl1bS5vcmc+CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW1Y4XSBTdXBw
b3J0IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTMyOTIwCisgICAgICAgIGh0dHA6Ly9jcmJ1Zy5jb20vMzA2MjAK
KworICAgICAgICBVcGRhdGVkIHVzZXMgb2YgU2VyaWFsaXplZFNjcmlwdFZhbHVlOgorICAgICAg
ICAqIHNyYy9QbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpQbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbDo6cG9zdE1lc3NhZ2VUb1JlbW90ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpQbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbDo6dHJ5R2V0TWVzc2FnZUZy
b21SZW1vdGUpOgorICAgICAgICAqIHNyYy9XZWJXb3JrZXJCYXNlLmNwcDoKKyAgICAgICAgKFdl
YktpdDo6V2ViV29ya2VyQmFzZTo6cG9zdE1lc3NhZ2VUb1dvcmtlck9iamVjdCk6CisgICAgICAg
ICogc3JjL1dlYldvcmtlckNsaWVudEltcGwuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJXb3Jr
ZXJDbGllbnRJbXBsOjpwb3N0TWVzc2FnZVRvV29ya2VyQ29udGV4dCk6CisgICAgICAgIChXZWJL
aXQ6OldlYldvcmtlckNsaWVudEltcGw6OnBvc3RNZXNzYWdlVG9Xb3JrZXJPYmplY3RUYXNrKToK
KyAgICAgICAgKiBzcmMvV2ViV29ya2VySW1wbC5jcHA6CisgICAgICAgIChXZWJLaXQ6OldlYldv
cmtlckltcGw6OnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0VGFzayk6CisKIDIwMTAtMDEtMTQg
IEplcmVteSBPcmxvdyAgPGpvcmxvd0BjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgT2xpdmVyIEh1bnQuCmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vc3JjL1BsYXRmb3Jt
TWVzc2FnZVBvcnRDaGFubmVsLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvUGxhdGZvcm1NZXNz
YWdlUG9ydENoYW5uZWwuY3BwCmluZGV4IGY4YzQxZDMuLmFhNDJhMTAgMTAwNjQ0Ci0tLSBhL1dl
YktpdC9jaHJvbWl1bS9zcmMvUGxhdGZvcm1NZXNzYWdlUG9ydENoYW5uZWwuY3BwCisrKyBiL1dl
YktpdC9jaHJvbWl1bS9zcmMvUGxhdGZvcm1NZXNzYWdlUG9ydENoYW5uZWwuY3BwCkBAIC0xNzks
NyArMTc5LDcgQEAgdm9pZCBQbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbDo6cG9zdE1lc3NhZ2VU
b1JlbW90ZShQYXNzT3duUHRyPE1lc3NhZ2VQb3J0Q2hhbm4KICAgICBpZiAoIW1fbG9jYWxQb3J0
IHx8ICFtX3dlYkNoYW5uZWwpCiAgICAgICAgIHJldHVybjsKIAotICAgIFdlYlN0cmluZyBtZXNz
YWdlU3RyaW5nID0gbWVzc2FnZS0+bWVzc2FnZSgpLT50b1N0cmluZygpOworICAgIFdlYlN0cmlu
ZyBtZXNzYWdlU3RyaW5nID0gbWVzc2FnZS0+bWVzc2FnZSgpLT50b1dpcmVTdHJpbmcoKTsKICAg
ICBPd25QdHI8V2ViQ29yZTo6TWVzc2FnZVBvcnRDaGFubmVsQXJyYXk+IGNoYW5uZWxzID0gbWVz
c2FnZS0+Y2hhbm5lbHMoKTsKICAgICBXZWJNZXNzYWdlUG9ydENoYW5uZWxBcnJheSogd2ViQ2hh
bm5lbHMgPSAwOwogICAgIGlmIChjaGFubmVscy5nZXQoKSAmJiBjaGFubmVscy0+c2l6ZSgpKSB7
CkBAIC0yMTEsNyArMjExLDcgQEAgYm9vbCBQbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbDo6dHJ5
R2V0TWVzc2FnZUZyb21SZW1vdGUoT3duUHRyPE1lc3NhZ2VQb3J0Q2hhbm4KICAgICAgICAgICAg
ICAgICAoKmNoYW5uZWxzKVtpXSA9IE1lc3NhZ2VQb3J0Q2hhbm5lbDo6Y3JlYXRlKHBsYXRmb3Jt
Q2hhbm5lbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgUmVmUHRyPFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZT4gc2VyaWFsaXplZE1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFs
dWU6OmNyZWF0ZShtZXNzYWdlKTsKKyAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZT4gc2VyaWFsaXplZE1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZUZyb21X
aXJlKG1lc3NhZ2UpOwogICAgICAgICByZXN1bHQgPSBNZXNzYWdlUG9ydENoYW5uZWw6OkV2ZW50
RGF0YTo6Y3JlYXRlKHNlcmlhbGl6ZWRNZXNzYWdlLnJlbGVhc2UoKSwgY2hhbm5lbHMucmVsZWFz
ZSgpKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2Vy
QmFzZS5jcHAgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckJhc2UuY3BwCmluZGV4IDBl
M2FhNGUuLjdmZDM3NDkgMTAwNjQ0Ci0tLSBhL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2Vy
QmFzZS5jcHAKKysrIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJCYXNlLmNwcApAQCAt
MTU3LDcgKzE1Nyw3IEBAIHZvaWQgV2ViV29ya2VyQmFzZTo6cG9zdE1lc3NhZ2VUb1dvcmtlck9i
amVjdChQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzT3duUHRyPE1lc3NhZ2VQb3J0Q2hhbm5l
bEFycmF5PiBjaGFubmVscykKIHsKICAgICBkaXNwYXRjaFRhc2tUb01haW5UaHJlYWQoY3JlYXRl
Q2FsbGJhY2tUYXNrKCZwb3N0TWVzc2FnZVRhc2ssIHRoaXMsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT50b1N0cmluZygpLCBjaGFubmVs
cykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVz
c2FnZS0+dG9XaXJlU3RyaW5nKCksIGNoYW5uZWxzKSk7CiB9CiAKIHZvaWQgV2ViV29ya2VyQmFz
ZTo6cG9zdE1lc3NhZ2VUYXNrKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQsCmRpZmYg
LS1naXQgYS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckNsaWVudEltcGwuY3BwIGIvV2Vi
S2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJDbGllbnRJbXBsLmNwcAppbmRleCA2YmUwM2E3Li41
OThhMDc4IDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckNsaWVudElt
cGwuY3BwCisrKyBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2VyQ2xpZW50SW1wbC5jcHAK
QEAgLTE3Myw3ICsxNzMsNyBAQCB2b2lkIFdlYldvcmtlckNsaWVudEltcGw6OnBvc3RNZXNzYWdl
VG9Xb3JrZXJDb250ZXh0KAogICAgIGlmICghaXNNYWluVGhyZWFkKCkpIHsKICAgICAgICAgV2Vi
V29ya2VyQmFzZTo6ZGlzcGF0Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygm
cG9zdE1lc3NhZ2VUb1dvcmtlckNvbnRleHRUYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbWVzc2FnZS0+dG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT50b1dpcmVTdHJpbmco
KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjaGFubmVscykpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTg0
LDcgKzE4NCw3IEBAIHZvaWQgV2ViV29ya2VyQ2xpZW50SW1wbDo6cG9zdE1lc3NhZ2VUb1dvcmtl
ckNvbnRleHQoCiAgICAgICAgIHdlYmNoYW5uZWwtPnNldENsaWVudCgwKTsKICAgICAgICAgd2Vi
Q2hhbm5lbHNbaV0gPSB3ZWJjaGFubmVsOwogICAgIH0KLSAgICBtX3dlYldvcmtlci0+cG9zdE1l
c3NhZ2VUb1dvcmtlckNvbnRleHQobWVzc2FnZS0+dG9TdHJpbmcoKSwgd2ViQ2hhbm5lbHMpOwor
ICAgIG1fd2ViV29ya2VyLT5wb3N0TWVzc2FnZVRvV29ya2VyQ29udGV4dChtZXNzYWdlLT50b1dp
cmVTdHJpbmcoKSwgd2ViQ2hhbm5lbHMpOwogfQogCiBib29sIFdlYldvcmtlckNsaWVudEltcGw6
Omhhc1BlbmRpbmdBY3Rpdml0eSgpIGNvbnN0CkBAIC0zNTYsNyArMzU2LDcgQEAgdm9pZCBXZWJX
b3JrZXJDbGllbnRJbXBsOjpwb3N0TWVzc2FnZVRvV29ya2VyT2JqZWN0VGFzaygKICAgICAgICAg
T3duUHRyPE1lc3NhZ2VQb3J0QXJyYXk+IHBvcnRzID0KICAgICAgICAgICAgIE1lc3NhZ2VQb3J0
OjplbnRhbmdsZVBvcnRzKCpjb250ZXh0LCBjaGFubmVscy5yZWxlYXNlKCkpOwogICAgICAgICBS
ZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBzZXJpYWxpemVkTWVzc2FnZSA9Ci0gICAgICAg
ICAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShtZXNzYWdlKTsKKyAgICAgICAgICAg
IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlRnJvbVdpcmUobWVzc2FnZSk7CiAgICAgICAg
IHRoaXNQdHItPm1fd29ya2VyLT5kaXNwYXRjaEV2ZW50KE1lc3NhZ2VFdmVudDo6Y3JlYXRlKHBv
cnRzLnJlbGVhc2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZE1lc3NhZ2UucmVsZWFzZSgpKSk7CiAgICAg
fQpkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJJbXBsLmNwcCBiL1dl
YktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2VySW1wbC5jcHAKaW5kZXggNzQ0YmUzMC4uNWI1ZTA1
MyAxMDA2NDQKLS0tIGEvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJJbXBsLmNwcAorKysg
Yi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtlckltcGwuY3BwCkBAIC04OCw3ICs4OCw3IEBA
IHZvaWQgV2ViV29ya2VySW1wbDo6cG9zdE1lc3NhZ2VUb1dvcmtlckNvbnRleHRUYXNrKFdlYkNv
cmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRlCiAgICAgT3duUHRyPE1lc3NhZ2VQb3J0QXJyYXk+IHBv
cnRzID0KICAgICAgICAgTWVzc2FnZVBvcnQ6OmVudGFuZ2xlUG9ydHMoKmNvbnRleHQsIGNoYW5u
ZWxzLnJlbGVhc2UoKSk7CiAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2VyaWFs
aXplZE1lc3NhZ2UgPQotICAgICAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShtZXNz
YWdlKTsKKyAgICAgICAgU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGVGcm9tV2lyZShtZXNz
YWdlKTsKICAgICB3b3JrZXJDb250ZXh0LT5kaXNwYXRjaEV2ZW50KE1lc3NhZ2VFdmVudDo6Y3Jl
YXRlKAogICAgICAgICBwb3J0cy5yZWxlYXNlKCksIHNlcmlhbGl6ZWRNZXNzYWdlLnJlbGVhc2Uo
KSkpOwogICAgIHRoaXNQdHItPmNvbmZpcm1NZXNzYWdlRnJvbVdvcmtlck9iamVjdCh3b3JrZXJD
b250ZXh0LT5oYXNQZW5kaW5nQWN0aXZpdHkoKSk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>47001</attachid>
            <date>2010-01-20 03:19:35 -0800</date>
            <delta_ts>2010-01-20 17:36:03 -0800</delta_ts>
            <desc>patch v3.3</desc>
            <filename>serialize.patch</filename>
            <type>text/plain</type>
            <size>40927</size>
            <attacher name="Vitaly Repeshko">vitalyr</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NWZlNjM5OC4uMTkxNGM0NyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw5OCBAQAorMjAxMC0wMS0xNSAgVml0YWx5IFJlcGVz
aGtvICA8dml0YWx5ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgW1Y4XSBTdXBwb3J0IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMyOTIwCisg
ICAgICAgIGh0dHA6Ly9jcmJ1Zy5jb20vMzA2MjAKKworICAgICAgICBJbml0aWFsIGltcGxlbWVu
dGF0aW9uIG9mIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSB3aGljaCBpcyB1c2VkIHRvCisgICAgICAg
IHRvIGNyZWF0ZSBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgSmF2YVNjcmlwdCBvYmpl
Y3RzLiAgVGhpcworICAgICAgICByZXByZXNlbnRhdGlvbiBpcyBuZWVkZWQgZm9yIHN0cnVjdHVy
ZWQgY2xvbmVzIGFuZCB3b3JrZXIgbWVzc2FnZXMuCisKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6
IEFkZGVkIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAuCisgICAgICAgICogYmluZGluZ3Mvc2Ny
aXB0cy9Db2RlR2VuZXJhdG9yVjgucG06IFJlbW92ZWQgY29udmVyc2lvbiB0byBzdHJpbmcgYmVm
b3JlIHVzaW5nIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4KKyAgICAgICAgKiBiaW5kaW5ncy92OC9T
ZXJpYWxpemVkU2NyaXB0VmFsdWUuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Oik6Cisg
ICAgICAgIChXZWJDb3JlOjpaaWdaYWc6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpaaWda
YWc6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OldyaXRlcik6CisgICAgICAg
IChXZWJDb3JlOjpXcml0ZXI6OndyaXRlVW5kZWZpbmVkKToKKyAgICAgICAgKFdlYkNvcmU6Oldy
aXRlcjo6d3JpdGVOdWxsKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVUcnVlKToK
KyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVGYWxzZSk6CisgICAgICAgIChXZWJDb3Jl
OjpXcml0ZXI6OndyaXRlU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRlcjo6d3JpdGVJ
bnQzMik6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OndyaXRlTnVtYmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OldyaXRlcjo6ZW5kQ29tcG9zaXRlKToKKyAgICAgICAgKFdlYkNvcmU6OldyaXRl
cjo6ZGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OmRvV3JpdGVVaW50MzIpOgorICAg
ICAgICAoV2ViQ29yZTo6V3JpdGVyOjphcHBlbmQpOgorICAgICAgICAoV2ViQ29yZTo6V3JpdGVy
OjplbnN1cmVTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpXcml0ZXI6OmZpbGxIb2xlKToKKyAg
ICAgICAgKFdlYkNvcmU6OldyaXRlcjo6Y2hhckF0KToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlh
bGl6ZXI6OlNlcmlhbGl6ZXIpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6c2VyaWFs
aXplKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0YXRlQmFzZTo6flN0YXRlQmFz
ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6Om5leHRTdGF0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OnNldE5leHRTdGF0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OmNvbXBvc2l0ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZUJhc2U6OlN0YXRlQmFzZSk6CisgICAg
ICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpTdGF0ZTo6Y29tcG9zaXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OlNlcmlhbGl6ZXI6OlN0YXRlOjp0YWcpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFs
aXplcjo6U3RhdGU6OlN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0YWNr
Q2xlYW5lcjo6U3RhY2tDbGVhbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6OlN0
YWNrQ2xlYW5lcjo6flN0YWNrQ2xlYW5lcik6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVy
OjpBcnJheVN0YXRlOjpBcnJheVN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZXI6
OkFycmF5U3RhdGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6QXJyYXlT
dGF0ZTo6YWR2YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpPYmplY3RTdGF0
ZTo6T2JqZWN0U3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3Rh
dGU6OmRvbmUpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3RhdGU6OmFk
dmFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6T2JqZWN0U3RhdGU6Om5leHRQ
cm9wZXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpkb1NlcmlhbGl6ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpwdXNoKToKKyAgICAgICAgKFdlYkNvcmU6OlNl
cmlhbGl6ZXI6OnRvcCk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVyOjpwb3ApOgorICAg
ICAgICAoV2ViQ29yZTo6U2VyaWFsaXplcjo6Y2hlY2tDb21wb3NpdGUpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVhZGVyOjpSZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVhZGVyOjppc0VvZik6
CisgICAgICAgIChXZWJDb3JlOjpSZWFkZXI6OnJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVh
ZGVyOjpyZWFkVGFnKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWRlcjo6cmVhZFN0cmluZyk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZWFkZXI6OnJlYWRJbnQzMik6CisgICAgICAgIChXZWJDb3JlOjpS
ZWFkZXI6OnJlYWROdW1iZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVhZGVyOjpkb1JlYWRVaW50
MzIpOgorICAgICAgICAoV2ViQ29yZTo6RGVzZXJpYWxpemVyOjpEZXNlcmlhbGl6ZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6RGVzZXJpYWxpemVyOjpkZXNlcmlhbGl6ZSk6CisgICAgICAgIChXZWJD
b3JlOjpEZXNlcmlhbGl6ZXI6OmRvRGVzZXJpYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6RGVz
ZXJpYWxpemVyOjpwdXNoKToKKyAgICAgICAgKFdlYkNvcmU6OkRlc2VyaWFsaXplcjo6cG9wKToK
KyAgICAgICAgKFdlYkNvcmU6OkRlc2VyaWFsaXplcjo6c3RhY2tEZXB0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpEZXNlcmlhbGl6ZXI6OmVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6U2VyaWFs
aXplZFNjcmlwdFZhbHVlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWUpOgorICAgICAgICAoV2ViQ29y
ZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpkZXNlcmlhbGl6ZSk6CisgICAgICAgICogYmluZGlu
Z3MvdjgvU2VyaWFsaXplZFNjcmlwdFZhbHVlLmg6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxp
emVkU2NyaXB0VmFsdWU6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2Ny
aXB0VmFsdWU6OmNyZWF0ZUZyb21XaXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZTo6cmVsZWFzZSk6CisgICAgICAgIChXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0
VmFsdWU6OnRvV2lyZVN0cmluZyk6CisKKyAgICAgICAgVXBkYXRlZCB1c2VzIG9mIFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dD
dXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhET01XaW5kb3c6OnBvc3RNZXNzYWdlQ2Fs
bGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOERlZGljYXRlZFdvcmtlckNv
bnRleHRDdXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhEZWRpY2F0ZWRXb3JrZXJDb250
ZXh0Ojpwb3N0TWVzc2FnZUNhbGxiYWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20v
VjhIaXN0b3J5Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4SGlzdG9yeTo6cHVzaFN0
YXRlQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6VjhIaXN0b3J5OjpyZXBsYWNlU3RhdGVD
YWxsYmFjayk6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUV2ZW50Q3Vz
dG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4TWVzc2FnZUV2ZW50Ojppbml0TWVzc2FnZUV2
ZW50Q2FsbGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0
Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4TWVzc2FnZVBvcnQ6OnBvc3RNZXNzYWdl
Q2FsbGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckN1c3RvbS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpWOFdvcmtlcjo6cG9zdE1lc3NhZ2VDYWxsYmFjayk6CisK
IDIwMTAtMDEtMTUgIEFsZXhhbmRlciBQYXZsb3YgIDxhcGF2bG92QGNocm9taXVtLm9yZz4KIAog
ICAgICAgICBSZXZpZXdlZCBieSBQYXZlbCBGZWxkbWFuLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9X
ZWJDb3JlLmd5cGkgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCAxYTdhNGRmLi43YjhkZjFm
IDEwMDY0NAotLS0gYS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9XZWJDb3JlL1dlYkNvcmUu
Z3lwaQpAQCAtNzk1LDYgKzc5NSw3IEBACiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvU2NyaXB0
U3RyaW5nSW1wbC5oJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9TY3JpcHRWYWx1ZS5jcHAn
LAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L1NjcmlwdFZhbHVlLmgnLAorICAgICAgICAgICAg
J2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAnLAogICAgICAgICAgICAgJ2Jp
bmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oJywKICAgICAgICAgICAgICdiaW5kaW5n
cy92OC9zcGVjaWFsaXphdGlvbi9WOEJpbmRpbmdET01XaW5kb3cuaCcsCiAgICAgICAgICAgICAn
YmluZGluZ3Mvdjgvc3BlY2lhbGl6YXRpb24vVjhCaW5kaW5nU3RhdGUuY3BwJywKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG0gYi9XZWJDb3Jl
L2JpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4LnBtCmluZGV4IDZhOTBiYjQuLmQ2Nzg2
YjggMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgu
cG0KKysrIGIvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5wbQpAQCAt
MjU2NCw3ICsyNTY0LDcgQEAgc3ViIFJldHVybk5hdGl2ZVRvSlNWYWx1ZQogCiAgICAgaWYgKCR0
eXBlIGVxICJTZXJpYWxpemVkU2NyaXB0VmFsdWUiKSB7CiAgICAgICAgICRpbXBsSW5jbHVkZXN7
IiR0eXBlLmgifSA9IDE7Ci0gICAgICAgIHJldHVybiAicmV0dXJuIHY4U3RyaW5nKCR2YWx1ZS0+
dG9TdHJpbmcoKSkiOworICAgICAgICByZXR1cm4gInJldHVybiAkdmFsdWUtPmRlc2VyaWFsaXpl
KCkiOwogICAgIH0KIAogICAgIGlmICgkdHlwZSBlcSAiRGVkaWNhdGVkV29ya2VyQ29udGV4dCIg
b3IgJHR5cGUgZXEgIldvcmtlckNvbnRleHQiIG9yICR0eXBlIGVxICJTaGFyZWRXb3JrZXJDb250
ZXh0IikgewpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0
VmFsdWUuY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjFhM2EKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5jcHAKQEAg
LTAsMCArMSw2OTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAq
IG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFt
ZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1h
eSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAq
IHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERF
UlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBD
T1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisg
KiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2VyaWFsaXplZFNj
cmlwdFZhbHVlLmgiCisKKyNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKKworI2luY2x1ZGUgPHY4
Lmg+CisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRl
ZC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworLy8gRklYTUU6CisvLyAtIGNhdGNoIFY4
IGV4Y2VwdGlvbnMKKy8vIC0gYmUgcmVhZHkgdG8gZ2V0IGVtcHR5IGhhbmRsZXMKKy8vIC0gY29u
c2lkZXIgY3Jhc2hpbmcgaW4gZGVidWcgbW9kZSBvbiBkZXNlcmlhbGl6YXRpb24gZXJyb3JzCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworbmFtZXNwYWNlIHsKKwordHlwZWRlZiBVQ2hhciBCdWZm
ZXJWYWx1ZVR5cGU7CisKKy8vIFNlcmlhbGl6YXRpb24gZm9ybWF0IGlzIGEgc2VxdWVuY2Ugb2Yg
KHRhZywgb3B0aW9uYWwgZGF0YSkKKy8vIHBhaXJzLiBUYWcgYWx3YXlzIHRha2VzIGV4YWN0bHkg
b25lIGJ5dGUuCitlbnVtIFNlcmlhbGl6YXRpb25UYWcgeworICAgIEludmFsaWRUYWcgPSAnIScs
CisgICAgUGFkZGluZ1RhZyA9ICdcMCcsCisgICAgVW5kZWZpbmVkVGFnID0gJ18nLAorICAgIE51
bGxUYWcgPSAnMCcsCisgICAgVHJ1ZVRhZyA9ICdUJywKKyAgICBGYWxzZVRhZyA9ICdGJywKKyAg
ICBTdHJpbmdUYWcgPSAnUycsCisgICAgSW50MzJUYWcgPSAnSScsCisgICAgTnVtYmVyVGFnID0g
J04nLAorICAgIE9iamVjdFRhZyA9ICd7JywKKyAgICBBcnJheVRhZyA9ICdbJywKK307CisKKy8v
IEhlbHBlcnMgdG8gZG8gdmVyYm9zZSBoYW5kbGUgY2FzdHMuCisKK3RlbXBsYXRlIDx0eXBlbmFt
ZSBULCB0eXBlbmFtZSBVPgorc3RhdGljIHY4OjpIYW5kbGU8VD4gaGFuZGxlQ2FzdCh2ODo6SGFu
ZGxlPFU+IGhhbmRsZSkgeyByZXR1cm4gdjg6OkhhbmRsZTxUPjo6Q2FzdChoYW5kbGUpOyB9CisK
K3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RhdGljIHY4OjpMb2NhbDxUPiBo
YW5kbGVDYXN0KHY4OjpMb2NhbDxVPiBoYW5kbGUpIHsgcmV0dXJuIHY4OjpMb2NhbDxUPjo6Q2Fz
dChoYW5kbGUpOyB9CisKK3N0YXRpYyBib29sIHNob3VsZENoZWNrRm9yQ3ljbGVzKGludCBkZXB0
aCkKK3sKKyAgICBBU1NFUlQoZGVwdGggPj0gMCk7CisgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCBy
ZXF1aXJlZCB0byBzcG90IHRoZSBjeWNsZSBhcyBzb29uIGFzIGl0CisgICAgLy8gaGFwcGVucyB3
ZSBjYW4gY2hlY2sgZm9yIGN5Y2xlcyBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgZGVwdGgKKyAgICAv
LyBpcyBhIHBvd2VyIG9mIHR3by4KKyAgICByZXR1cm4gIShkZXB0aCAmIChkZXB0aCAtIDEpKTsK
K30KKworc3RhdGljIGNvbnN0IGludCBtYXhEZXB0aCA9IDIwMDAwOworCisvLyBWYXJJbnQgZW5j
b2RpbmcgY29uc3RhbnRzLgorc3RhdGljIGNvbnN0IGludCB2YXJJbnRTaGlmdCA9IDc7CitzdGF0
aWMgY29uc3QgaW50IHZhckludE1hc2sgPSAoMSA8PCB2YXJJbnRTaGlmdCkgLSAxOworCisvLyBa
aWdaYWcgZW5jb2RpbmcgaGVscHMgVmFySW50IGVuY29kaW5nIHN0YXkgc21hbGwgZm9yIG5lZ2F0
aXZlCisvLyBudW1iZXJzIHdpdGggc21hbGwgYWJzb2x1dGUgdmFsdWVzLgorY2xhc3MgWmlnWmFn
IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgdWludDMyX3QgZW5jb2RlKHVpbnQzMl90IHZhbHVlKQor
ICAgIHsKKyAgICAgICAgaWYgKHZhbHVlICYgKDFVIDw8IDMxKSkKKyAgICAgICAgICAgIHZhbHVl
ID0gKCh+dmFsdWUpIDw8IDEpICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsdWUg
PDw9IDE7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdWludDMy
X3QgZGVjb2RlKHVpbnQzMl90IHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlICYgMSkK
KyAgICAgICAgICAgIHZhbHVlID0gfih2YWx1ZSA+PiAxKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgdmFsdWUgPj49IDE7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKK3ByaXZh
dGU6CisgICAgWmlnWmFnKCk7Cit9OworCisvLyBXcml0ZXIgaXMgcmVzcG9uc2libGUgZm9yIHNl
cmlhbGl6aW5nIHByaW1pdGl2ZSB0eXBlcyBhbmQgc3RvcmluZworLy8gaW5mb3JtYXRpb24gdXNl
ZCB0byByZWNvbnN0cnVjdCBjb21wb3NpdGUgdHlwZXMuCitjbGFzcyBXcml0ZXIgOiBOb25jb3B5
YWJsZSB7CitwdWJsaWM6CisgICAgV3JpdGVyKCkgOiBtX3Bvc2l0aW9uKDApCisgICAgeworICAg
IH0KKworICAgIC8vIFdyaXRlIGZ1bmN0aW9ucyBmb3IgcHJpbWl0aXZlIHR5cGVzLgorCisgICAg
dm9pZCB3cml0ZVVuZGVmaW5lZCgpIHsgYXBwZW5kKFVuZGVmaW5lZFRhZyk7IH0KKworICAgIHZv
aWQgd3JpdGVOdWxsKCkgeyBhcHBlbmQoTnVsbFRhZyk7IH0KKworICAgIHZvaWQgd3JpdGVUcnVl
KCkgeyBhcHBlbmQoVHJ1ZVRhZyk7IH0KKworICAgIHZvaWQgd3JpdGVGYWxzZSgpIHsgYXBwZW5k
KEZhbHNlVGFnKTsgfQorCisgICAgdm9pZCB3cml0ZVN0cmluZyhjb25zdCBjaGFyKiBkYXRhLCBp
bnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgYXBwZW5kKFN0cmluZ1RhZyk7CisgICAgICAgIGRv
V3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGxlbmd0aCkpOworICAgICAgICBhcHBl
bmQoZGF0YSwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICB2b2lkIHdyaXRlSW50MzIoaW50MzJfdCB2
YWx1ZSkKKyAgICB7CisgICAgICAgIGFwcGVuZChJbnQzMlRhZyk7CisgICAgICAgIGRvV3JpdGVV
aW50MzIoWmlnWmFnOjplbmNvZGUoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlKSkpOworICAg
IH0KKworICAgIHZvaWQgd3JpdGVOdW1iZXIoZG91YmxlIG51bWJlcikKKyAgICB7CisgICAgICAg
IGFwcGVuZChOdW1iZXJUYWcpOworICAgICAgICBhcHBlbmQocmVpbnRlcnByZXRfY2FzdDxjaGFy
Kj4oJm51bWJlciksIHNpemVvZihudW1iZXIpKTsKKyAgICB9CisKKyAgICAvLyBSZWNvcmRzIHRo
YXQgYSBjb21wb3NpdGUgb2JqZWN0IGNhbiBiZSBjb25zdHJ1Y3RlZCBieSB1c2luZworICAgIC8v
IHxsZW5ndGh8IHByZXZpb3VzbHkgc3RvcmVkIHZhbHVlcy4KKyAgICB2b2lkIGVuZENvbXBvc2l0
ZShTZXJpYWxpemF0aW9uVGFnIHRhZywgaW50MzJfdCBsZW5ndGgpCisgICAgeworICAgICAgICBB
U1NFUlQodGFnID09IE9iamVjdFRhZyB8fCB0YWcgPT0gQXJyYXlUYWcpOworICAgICAgICBhcHBl
bmQodGFnKTsKKyAgICAgICAgZG9Xcml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4obGVu
Z3RoKSk7CisgICAgfQorCisgICAgVmVjdG9yPEJ1ZmZlclZhbHVlVHlwZT4mIGRhdGEoKQorICAg
IHsKKyAgICAgICAgZmlsbEhvbGUoKTsKKyAgICAgICAgcmV0dXJuIG1fYnVmZmVyOworICAgIH0K
KworcHJpdmF0ZToKKyAgICB2b2lkIGRvV3JpdGVVaW50MzIodWludDMyX3QgdmFsdWUpCisgICAg
eworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgY2hhciBiID0gKHZhbHVlICYg
dmFySW50TWFzayk7CisgICAgICAgICAgICB2YWx1ZSA+Pj0gdmFySW50U2hpZnQ7CisgICAgICAg
ICAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgICAgICAgICAgYXBwZW5kKGIpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXBwZW5kKGIgfCAoMSA8
PCB2YXJJbnRTaGlmdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBhcHBlbmQoU2Vy
aWFsaXphdGlvblRhZyB0YWcpCisgICAgeworICAgICAgICBhcHBlbmQoc3RhdGljX2Nhc3Q8Y2hh
cj4odGFnKSk7CisgICAgfQorCisgICAgdm9pZCBhcHBlbmQoY2hhciBiKQorICAgIHsKKyAgICAg
ICAgZW5zdXJlU3BhY2UoMSk7CisgICAgICAgICpjaGFyQXQobV9wb3NpdGlvbisrKSA9IGI7Cisg
ICAgfQorCisgICAgdm9pZCBhcHBlbmQoY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0aCkKKyAg
ICB7CisgICAgICAgIGVuc3VyZVNwYWNlKGxlbmd0aCk7CisgICAgICAgIG1lbWNweShjaGFyQXQo
bV9wb3NpdGlvbiksIGRhdGEsIGxlbmd0aCk7CisgICAgICAgIG1fcG9zaXRpb24gKz0gbGVuZ3Ro
OworICAgIH0KKworICAgIHZvaWQgZW5zdXJlU3BhY2UoaW50IGV4dHJhKQorICAgIHsKKyAgICAg
ICAgQ09NUElMRV9BU1NFUlQoc2l6ZW9mKEJ1ZmZlclZhbHVlVHlwZSkgPT0gMiwgQnVmZmVyVmFs
dWVUeXBlSXNUd29CeXRlcyk7CisgICAgICAgIG1fYnVmZmVyLmdyb3coKG1fcG9zaXRpb24gKyBl
eHRyYSArIDEpIC8gMik7IC8vICIrIDEiIHRvIHJvdW5kIHVwLgorICAgIH0KKworICAgIHZvaWQg
ZmlsbEhvbGUoKQorICAgIHsKKyAgICAgICAgQ09NUElMRV9BU1NFUlQoc2l6ZW9mKEJ1ZmZlclZh
bHVlVHlwZSkgPT0gMiwgQnVmZmVyVmFsdWVUeXBlSXNUd29CeXRlcyk7CisgICAgICAgIC8vIElm
IHRoZSB3cml0ZXIgaXMgYXQgb2RkIHBvc2l0aW9uIGluIHRoZSBidWZmZXIsIHRoZW4gb25lIG9m
CisgICAgICAgIC8vIHRoZSBieXRlcyBpbiB0aGUgbGFzdCBVQ2hhciBpcyBub3QgaW5pdGlhbGl6
ZWQuCisgICAgICAgIGlmIChtX3Bvc2l0aW9uICUgMikKKyAgICAgICAgICAgICpjaGFyQXQobV9w
b3NpdGlvbikgPSBzdGF0aWNfY2FzdDxjaGFyPihQYWRkaW5nVGFnKTsKKyAgICB9CisKKyAgICBj
aGFyKiBjaGFyQXQoaW50IHBvc2l0aW9uKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PGNoYXIq
PihtX2J1ZmZlci5kYXRhKCkpICsgcG9zaXRpb247IH0KKworICAgIFZlY3RvcjxCdWZmZXJWYWx1
ZVR5cGU+IG1fYnVmZmVyOworICAgIHVuc2lnbmVkIG1fcG9zaXRpb247Cit9OworCitjbGFzcyBT
ZXJpYWxpemVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTZXJpYWxpemVyKFdyaXRlciYgd3Jp
dGVyKQorICAgICAgICA6IG1fd3JpdGVyKHdyaXRlcikKKyAgICAgICAgLCBtX3N0YXRlKDApCisg
ICAgICAgICwgbV9kZXB0aCgwKQorICAgIHsKKyAgICB9CisKKyAgICBib29sIHNlcmlhbGl6ZSh2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUpCisgICAgeworICAgICAgICB2ODo6SGFuZGxlU2Nv
cGUgc2NvcGU7CisgICAgICAgIFN0YWNrQ2xlYW5lciBjbGVhbmVyKCZtX3N0YXRlKTsKKyAgICAg
ICAgaWYgKCFkb1NlcmlhbGl6ZSh2YWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIHdoaWxlICh0b3AoKSkgeworICAgICAgICAgICAgaW50IGxlbmd0aDsKKyAgICAgICAg
ICAgIHdoaWxlICghdG9wKCktPmlzRG9uZSgmbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIC8v
IE5vdGUgdGhhdCBkb1NlcmlhbGl6ZSgpIGNhbiBjaGFuZ2UgY3VycmVudCB0b3AoKS4KKyAgICAg
ICAgICAgICAgICBpZiAoIWRvU2VyaWFsaXplKHRvcCgpLT5hZHZhbmNlKCkpKQorICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3dy
aXRlci5lbmRDb21wb3NpdGUodG9wKCktPnRhZygpLCBsZW5ndGgpOworICAgICAgICAgICAgcG9w
KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCitwcml2YXRlOgor
ICAgIGNsYXNzIFN0YXRlQmFzZSA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CisgICAgcHVibGljOgor
ICAgICAgICB2aXJ0dWFsIH5TdGF0ZUJhc2UoKSB7IH0KKworICAgICAgICAvLyBMaW5rIHRvIHRo
ZSBuZXh0IHN0YXRlIHRvIGZvcm0gYSBzdGFjay4KKyAgICAgICAgU3RhdGVCYXNlKiBuZXh0U3Rh
dGUoKSB7IHJldHVybiBtX25leHQ7IH0KKyAgICAgICAgdm9pZCBzZXROZXh0U3RhdGUoU3RhdGVC
YXNlKiBuZXh0KSB7IG1fbmV4dCA9IG5leHQ7IH0KKworICAgICAgICAvLyBDb21wb3NpdGUgb2Jq
ZWN0IHdlJ3JlIHByb2Nlc3NpbmcgaW4gdGhpcyBzdGF0ZS4KKyAgICAgICAgdjg6OkhhbmRsZTx2
ODo6VmFsdWU+IGNvbXBvc2l0ZSgpIHsgcmV0dXJuIG1fY29tcG9zaXRlOyB9CisKKyAgICAgICAg
Ly8gU2VyaWFsaXphdGlvbiB0YWcgZm9yIHRoZSBjdXJyZW50IGNvbXBvc2l0ZS4KKyAgICAgICAg
dmlydHVhbCBTZXJpYWxpemF0aW9uVGFnIHRhZygpIGNvbnN0ID0gMDsKKworICAgICAgICAvLyBS
ZXR1cm5zIHdoZXRoZXIgaXRlcmF0aW9uIG92ZXIgc3Vib2JqZWN0cyBvZiB0aGUgY3VycmVudAor
ICAgICAgICAvLyBjb21wb3NpdGUgb2JqZWN0IGlzIGRvbmUuIElmIHllcywgfCpsZW5ndGh8IGlz
IHNldCB0byB0aGUKKyAgICAgICAgLy8gbnVtYmVyIG9mIHN1Ym9iamVjdHMuCisgICAgICAgIHZp
cnR1YWwgYm9vbCBpc0RvbmUoaW50KiBsZW5ndGgpID0gMDsKKworICAgICAgICAvLyBBZHZhbmNl
cyB0byB0aGUgbmV4dCBzdWJvYmplY3QuCisgICAgICAgIC8vIFJlcXVpcmVzOiAhdGhpcy0+aXNE
b25lKCkuCisgICAgICAgIHZpcnR1YWwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gYWR2YW5jZSgpID0g
MDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgU3RhdGVCYXNlKHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBjb21wb3NpdGUpCisgICAgICAgICAgICA6IG1fbmV4dCgwKQorICAgICAgICAgICAgLCBt
X2NvbXBvc2l0ZShjb21wb3NpdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgcHJpdmF0
ZToKKyAgICAgICAgU3RhdGVCYXNlKiBtX25leHQ7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBtX2NvbXBvc2l0ZTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIFNl
cmlhbGl6YXRpb25UYWcgY29tcG9zaXRlVGFnPgorICAgIGNsYXNzIFN0YXRlIDogcHVibGljIFN0
YXRlQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICB2ODo6SGFuZGxlPFQ+IGNvbXBvc2l0ZSgp
IHsgcmV0dXJuIGhhbmRsZUNhc3Q8VD4oU3RhdGVCYXNlOjpjb21wb3NpdGUoKSk7IH0KKworICAg
ICAgICB2aXJ0dWFsIFNlcmlhbGl6YXRpb25UYWcgdGFnKCkgY29uc3QgeyByZXR1cm4gY29tcG9z
aXRlVGFnOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGV4cGxpY2l0IFN0YXRlKHY4OjpI
YW5kbGU8VD4gY29tcG9zaXRlKSA6IFN0YXRlQmFzZShjb21wb3NpdGUpCisgICAgICAgIHsKKyAg
ICAgICAgfQorICAgIH07CisKKyAgICAvLyBIZWxwZXIgdG8gY2xlYW4gdXAgdGhlIHN0YXRlIHN0
YWNrIGluIGNhc2Ugb2YgZXJyb3JzLgorICAgIGNsYXNzIFN0YWNrQ2xlYW5lciA6IE5vbmNvcHlh
YmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFN0YWNrQ2xlYW5lcihTdGF0ZUJh
c2UqKiBzdGFjaykgOiBtX3N0YWNrKHN0YWNrKQorICAgICAgICB7CisgICAgICAgIH0KKworICAg
ICAgICB+U3RhY2tDbGVhbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdGVCYXNlKiBz
dGF0ZSA9ICptX3N0YWNrOworICAgICAgICAgICAgd2hpbGUgKHN0YXRlKSB7CisgICAgICAgICAg
ICAgICAgU3RhdGVCYXNlKiB0bXAgPSBzdGF0ZS0+bmV4dFN0YXRlKCk7CisgICAgICAgICAgICAg
ICAgZGVsZXRlIHN0YXRlOworICAgICAgICAgICAgICAgIHN0YXRlID0gdG1wOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgKm1fc3RhY2sgPSAwOworICAgICAgICB9CisKKyAgICBwcml2YXRl
OgorICAgICAgICBTdGF0ZUJhc2UqKiBtX3N0YWNrOworICAgIH07CisKKyAgICBjbGFzcyBBcnJh
eVN0YXRlIDogcHVibGljIFN0YXRlPHY4OjpBcnJheSwgQXJyYXlUYWc+IHsKKyAgICBwdWJsaWM6
CisgICAgICAgIEFycmF5U3RhdGUodjg6OkhhbmRsZTx2ODo6QXJyYXk+IGFycmF5KQorICAgICAg
ICAgICAgOiBTdGF0ZTx2ODo6QXJyYXksIEFycmF5VGFnPihhcnJheSkKKyAgICAgICAgICAgICwg
bV9pbmRleCgwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGJvb2wg
aXNEb25lKGludCogbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICAqbGVuZ3RoID0gY29t
cG9zaXRlKCktPkxlbmd0aCgpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4o
bV9pbmRleCkgPj0gKmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdjg6Okxv
Y2FsPHY4OjpWYWx1ZT4gYWR2YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVCht
X2luZGV4IDwgY29tcG9zaXRlKCktPkxlbmd0aCgpKTsKKyAgICAgICAgICAgIHY4OjpIYW5kbGVT
Y29wZSBzY29wZTsKKyAgICAgICAgICAgIHJldHVybiBzY29wZS5DbG9zZShjb21wb3NpdGUoKS0+
R2V0KHY4OjpJbnRlZ2VyOjpOZXcobV9pbmRleCsrKSkpOworICAgICAgICB9CisKKyAgICBwcml2
YXRlOgorICAgICAgICB1bnNpZ25lZCBtX2luZGV4OworICAgIH07CisKKyAgICBjbGFzcyBPYmpl
Y3RTdGF0ZSA6IHB1YmxpYyBTdGF0ZTx2ODo6T2JqZWN0LCBPYmplY3RUYWc+IHsKKyAgICBwdWJs
aWM6CisgICAgICAgIE9iamVjdFN0YXRlKHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqZWN0KQor
ICAgICAgICAgICAgOiBTdGF0ZTx2ODo6T2JqZWN0LCBPYmplY3RUYWc+KG9iamVjdCkKKyAgICAg
ICAgICAgICwgbV9wcm9wZXJ0eU5hbWVzKG9iamVjdC0+R2V0UHJvcGVydHlOYW1lcygpKQorICAg
ICAgICAgICAgLCBtX2luZGV4KC0xKQorICAgICAgICAgICAgLCBtX2xlbmd0aCgwKQorICAgICAg
ICB7CisgICAgICAgICAgICBuZXh0UHJvcGVydHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZp
cnR1YWwgYm9vbCBpc0RvbmUoaW50KiBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgICps
ZW5ndGggPSBtX2xlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4ID49IDIgKiBtX3By
b3BlcnR5TmFtZXMtPkxlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2ODo6
TG9jYWw8djg6OlZhbHVlPiBhZHZhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJU
KG1faW5kZXggPCAyICogbV9wcm9wZXJ0eU5hbWVzLT5MZW5ndGgoKSk7CisgICAgICAgICAgICBp
ZiAoIShtX2luZGV4ICUgMikpIHsKKyAgICAgICAgICAgICAgICArK21faW5kZXg7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIG1fcHJvcGVydHlOYW1lOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmVzdWx0ID0gY29tcG9zaXRlKCktPkdldChtX3Byb3Bl
cnR5TmFtZSk7CisgICAgICAgICAgICBuZXh0UHJvcGVydHkoKTsKKyAgICAgICAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbmV4dFBy
b3BlcnR5KCkKKyAgICAgICAgeworICAgICAgICAgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwor
ICAgICAgICAgICAgKyttX2luZGV4OworICAgICAgICAgICAgQVNTRVJUKCEobV9pbmRleCAlIDIp
KTsKKyAgICAgICAgICAgIGZvciAoOyBtX2luZGV4IDwgMiAqIG1fcHJvcGVydHlOYW1lcy0+TGVu
Z3RoKCk7IG1faW5kZXggKz0gMikgeworICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFs
dWU+IHByb3BlcnR5TmFtZSA9IG1fcHJvcGVydHlOYW1lcy0+R2V0KHY4OjpJbnRlZ2VyOjpOZXco
bV9pbmRleCAvIDIpKTsKKyAgICAgICAgICAgICAgICBpZiAoKHByb3BlcnR5TmFtZS0+SXNTdHJp
bmcoKSAmJiBjb21wb3NpdGUoKS0+SGFzUmVhbE5hbWVkUHJvcGVydHkoaGFuZGxlQ2FzdDx2ODo6
U3RyaW5nPihwcm9wZXJ0eU5hbWUpKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHByb3BlcnR5
TmFtZS0+SXNJbnQzMigpICYmIGNvbXBvc2l0ZSgpLT5IYXNSZWFsSW5kZXhlZFByb3BlcnR5KHBy
b3BlcnR5TmFtZS0+VWludDMyVmFsdWUoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1fcHJv
cGVydHlOYW1lID0gc2NvcGUuQ2xvc2UocHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgICAgICAg
ICAgbV9sZW5ndGggKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHY4OjpMb2NhbDx2
ODo6QXJyYXk+IG1fcHJvcGVydHlOYW1lczsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4g
bV9wcm9wZXJ0eU5hbWU7CisgICAgICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgICAgIHVuc2ln
bmVkIG1fbGVuZ3RoOworICAgIH07CisKKyAgICBib29sIGRvU2VyaWFsaXplKHY4OjpIYW5kbGU8
djg6OlZhbHVlPiB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZS0+SXNVbmRlZmluZWQo
KSkKKyAgICAgICAgICAgIG1fd3JpdGVyLndyaXRlVW5kZWZpbmVkKCk7CisgICAgICAgIGVsc2Ug
aWYgKHZhbHVlLT5Jc051bGwoKSkKKyAgICAgICAgICAgIG1fd3JpdGVyLndyaXRlTnVsbCgpOwor
ICAgICAgICBlbHNlIGlmICh2YWx1ZS0+SXNUcnVlKCkpCisgICAgICAgICAgICBtX3dyaXRlci53
cml0ZVRydWUoKTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUtPklzRmFsc2UoKSkKKyAgICAgICAg
ICAgIG1fd3JpdGVyLndyaXRlRmFsc2UoKTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUtPklzSW50
MzIoKSkKKyAgICAgICAgICAgIG1fd3JpdGVyLndyaXRlSW50MzIodmFsdWUtPkludDMyVmFsdWUo
KSk7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlLT5Jc051bWJlcigpKQorICAgICAgICAgICAgbV93
cml0ZXIud3JpdGVOdW1iZXIoaGFuZGxlQ2FzdDx2ODo6TnVtYmVyPih2YWx1ZSktPlZhbHVlKCkp
OworICAgICAgICBlbHNlIGlmICh2YWx1ZS0+SXNTdHJpbmcoKSkgeworICAgICAgICAgICAgdjg6
OlN0cmluZzo6VXRmOFZhbHVlIHN0cmluZ1ZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgIG1fd3Jp
dGVyLndyaXRlU3RyaW5nKCpzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWUubGVuZ3RoKCkpOworICAg
ICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc0FycmF5KCkpIHsKKyAgICAgICAgICAgIGlmICghY2hl
Y2tDb21wb3NpdGUodmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgICAgIHB1c2gobmV3IEFycmF5U3RhdGUoaGFuZGxlQ2FzdDx2ODo6QXJyYXk+KHZhbHVlKSkp
OworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc09iamVjdCgpKSB7CisgICAgICAgICAgICBp
ZiAoIWNoZWNrQ29tcG9zaXRlKHZhbHVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICBwdXNoKG5ldyBPYmplY3RTdGF0ZShoYW5kbGVDYXN0PHY4OjpPYmplY3Q+
KHZhbHVlKSkpOworICAgICAgICAgICAgLy8gRklYTUU6CisgICAgICAgICAgICAvLyAtIGNoZWNr
IG5vdCBhIHdyYXBwZXIKKyAgICAgICAgICAgIC8vIC0gc3VwcG9ydCBGaWxlLCBJbWFnZURhdGEs
IGV0Yy4KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lk
IHB1c2goU3RhdGVCYXNlKiBzdGF0ZSkKKyAgICB7CisgICAgICAgIHN0YXRlLT5zZXROZXh0U3Rh
dGUobV9zdGF0ZSk7CisgICAgICAgIG1fc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgKyttX2RlcHRo
OworICAgIH0KKworICAgIFN0YXRlQmFzZSogdG9wKCkgeyByZXR1cm4gbV9zdGF0ZTsgfQorCisg
ICAgdm9pZCBwb3AoKQorICAgIHsKKyAgICAgICAgaWYgKCFtX3N0YXRlKQorICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICBTdGF0ZUJhc2UqIHRvcCA9IG1fc3RhdGU7CisgICAgICAgIG1fc3Rh
dGUgPSB0b3AtPm5leHRTdGF0ZSgpOworICAgICAgICBkZWxldGUgdG9wOworICAgICAgICAtLW1f
ZGVwdGg7CisgICAgfQorCisgICAgYm9vbCBjaGVja0NvbXBvc2l0ZSh2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gY29tcG9zaXRlKQorICAgIHsKKyAgICAgICAgaWYgKG1fZGVwdGggPiBtYXhEZXB0aCkK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFzaG91bGRDaGVja0ZvckN5
Y2xlcyhtX2RlcHRoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBmb3IgKFN0
YXRlQmFzZSogc3RhdGUgPSB0b3AoKTsgc3RhdGU7IHN0YXRlID0gc3RhdGUtPm5leHRTdGF0ZSgp
KSB7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmNvbXBvc2l0ZSgpID09IGNvbXBvc2l0ZSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorCisgICAgV3JpdGVyJiBtX3dyaXRlcjsKKyAgICBTdGF0ZUJhc2UqIG1fc3Rh
dGU7CisgICAgaW50IG1fZGVwdGg7Cit9OworCisvLyBSZWFkZXIgaXMgcmVzcG9uc2libGUgZm9y
IGRlc2VyaWFsaXppbmcgcHJpbWl0aXZlIHR5cGVzIGFuZAorLy8gcmVzdG9yaW5nIGluZm9ybWF0
aW9uIGFib3V0IHNhdmVkIG9iamVjdHMgb2YgY29tcG9zaXRlIHR5cGVzLgorY2xhc3MgUmVhZGVy
IHsKK3B1YmxpYzoKKyAgICBSZWFkZXIoY29uc3QgY2hhciogYnVmZmVyLCBpbnQgbGVuZ3RoKQor
ICAgICAgICA6IG1fYnVmZmVyKGJ1ZmZlcikKKyAgICAgICAgLCBtX2xlbmd0aChsZW5ndGgpCisg
ICAgICAgICwgbV9wb3NpdGlvbigwKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGxlbmd0aCA+PSAw
KTsKKyAgICB9CisKKyAgICBib29sIGlzRW9mKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvbiA+
PSBtX2xlbmd0aDsgfQorCisgICAgYm9vbCByZWFkKFNlcmlhbGl6YXRpb25UYWcqIHRhZywgdjg6
OkhhbmRsZTx2ODo6VmFsdWU+KiB2YWx1ZSwgaW50KiBsZW5ndGgpCisgICAgeworICAgICAgICB1
aW50MzJfdCByYXdMZW5ndGg7CisgICAgICAgIGlmICghcmVhZFRhZyh0YWcpKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICBzd2l0Y2ggKCp0YWcpIHsKKyAgICAgICAgY2FzZSBJ
bnZhbGlkVGFnOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIFBhZGRp
bmdUYWc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVbmRlZmluZWRUYWc6Cisg
ICAgICAgICAgICAqdmFsdWUgPSB2ODo6VW5kZWZpbmVkKCk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBOdWxsVGFnOgorICAgICAgICAgICAgKnZhbHVlID0gdjg6Ok51bGwoKTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRydWVUYWc6CisgICAgICAgICAgICAq
dmFsdWUgPSB2ODo6VHJ1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmFs
c2VUYWc6CisgICAgICAgICAgICAqdmFsdWUgPSB2ODo6RmFsc2UoKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIFN0cmluZ1RhZzoKKyAgICAgICAgICAgIGlmICghcmVhZFN0cmlu
Zyh2YWx1ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgSW50MzJUYWc6CisgICAgICAgICAgICBpZiAoIXJlYWRJbnQzMih2
YWx1ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgTnVtYmVyVGFnOgorICAgICAgICAgICAgaWYgKCFyZWFkTnVtYmVyKHZh
bHVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBPYmplY3RUYWc6CisgICAgICAgIGNhc2UgQXJyYXlUYWc6CisgICAgICAg
ICAgICBpZiAoIWRvUmVhZFVpbnQzMigmcmF3TGVuZ3RoKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgICAgICAqbGVuZ3RoID0gcmF3TGVuZ3RoOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCitwcml2YXRl
OgorICAgIGJvb2wgcmVhZFRhZyhTZXJpYWxpemF0aW9uVGFnKiB0YWcpCisgICAgeworICAgICAg
ICBpZiAobV9wb3NpdGlvbiA+PSBtX2xlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgKnRhZyA9IHN0YXRpY19jYXN0PFNlcmlhbGl6YXRpb25UYWc+KG1fYnVmZmVyW21f
cG9zaXRpb24rK10pOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIHJl
YWRTdHJpbmcodjg6OkhhbmRsZTx2ODo6VmFsdWU+KiB2YWx1ZSkKKyAgICB7CisgICAgICAgIHVp
bnQzMl90IGxlbmd0aDsKKyAgICAgICAgaWYgKCFkb1JlYWRVaW50MzIoJmxlbmd0aCkpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtX3Bvc2l0aW9uICsgbGVuZ3RoID4g
bV9sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICp2YWx1ZSA9IHY4
OjpTdHJpbmc6Ok5ldyhtX2J1ZmZlciArIG1fcG9zaXRpb24sIGxlbmd0aCk7CisgICAgICAgIG1f
cG9zaXRpb24gKz0gbGVuZ3RoOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBi
b29sIHJlYWRJbnQzMih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4qIHZhbHVlKQorICAgIHsKKyAgICAg
ICAgdWludDMyX3QgcmF3VmFsdWU7CisgICAgICAgIGlmICghZG9SZWFkVWludDMyKCZyYXdWYWx1
ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICp2YWx1ZSA9IHY4OjpJbnRl
Z2VyOjpOZXcoc3RhdGljX2Nhc3Q8aW50MzJfdD4oWmlnWmFnOjpkZWNvZGUocmF3VmFsdWUpKSk7
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcmVhZE51bWJlcih2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4qIHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKG1fcG9zaXRpb24g
KyBzaXplb2YoZG91YmxlKSA+IG1fbGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICBkb3VibGUgbnVtYmVyOworICAgICAgICBjaGFyKiBudW1iZXJBc0J5dGVBcnJheSA9
IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZudW1iZXIpOworICAgICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgc2l6ZW9mKGRvdWJsZSk7ICsraSkKKyAgICAgICAgICAgIG51bWJlckFzQnl0
ZUFycmF5W2ldID0gbV9idWZmZXJbbV9wb3NpdGlvbisrXTsKKyAgICAgICAgKnZhbHVlID0gdjg6
Ok51bWJlcjo6TmV3KG51bWJlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IGJvb2wgZG9SZWFkVWludDMyKHVpbnQzMl90KiB2YWx1ZSkKKyAgICB7CisgICAgICAgICp2YWx1
ZSA9IDA7CisgICAgICAgIGNoYXIgY3VycmVudEJ5dGU7CisgICAgICAgIGludCBzaGlmdCA9IDA7
CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChtX3Bvc2l0aW9uID49IG1fbGVuZ3RoKQor
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGN1cnJlbnRCeXRlID0g
bV9idWZmZXJbbV9wb3NpdGlvbisrXTsKKyAgICAgICAgICAgICp2YWx1ZSB8PSAoKGN1cnJlbnRC
eXRlICYgdmFySW50TWFzaykgPDwgc2hpZnQpOworICAgICAgICAgICAgc2hpZnQgKz0gdmFySW50
U2hpZnQ7CisgICAgICAgIH0gd2hpbGUgKGN1cnJlbnRCeXRlICYgKDEgPDwgdmFySW50U2hpZnQp
KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY29uc3QgY2hhciogbV9idWZm
ZXI7CisgICAgY29uc3QgdW5zaWduZWQgbV9sZW5ndGg7CisgICAgdW5zaWduZWQgbV9wb3NpdGlv
bjsKK307CisKK2NsYXNzIERlc2VyaWFsaXplciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRGVz
ZXJpYWxpemVyKFJlYWRlciYgcmVhZGVyKSA6IG1fcmVhZGVyKHJlYWRlcikKKyAgICB7CisgICAg
fQorCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gZGVzZXJpYWxpemUoKQorICAgIHsKKyAgICAg
ICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgICAgICB3aGlsZSAoIW1fcmVhZGVyLmlzRW9m
KCkpIHsKKyAgICAgICAgICAgIGlmICghZG9EZXNlcmlhbGl6ZSgpKQorICAgICAgICAgICAgICAg
IHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOworICAgICAgICB9CisgICAgICAgIGlmIChz
dGFja0RlcHRoKCkgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVl
PigpOworICAgICAgICByZXR1cm4gc2NvcGUuQ2xvc2UoZWxlbWVudCgwKSk7CisgICAgfQorCitw
cml2YXRlOgorICAgIGJvb2wgZG9EZXNlcmlhbGl6ZSgpCisgICAgeworICAgICAgICBTZXJpYWxp
emF0aW9uVGFnIHRhZzsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWU7CisgICAg
ICAgIGludCBsZW5ndGg7CisgICAgICAgIGlmICghbV9yZWFkZXIucmVhZCgmdGFnLCAmdmFsdWUs
ICZsZW5ndGgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXZhbHVl
LklzRW1wdHkoKSkgeworICAgICAgICAgICAgcHVzaCh2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBp
ZiAodGFnID09IE9iamVjdFRhZykgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+IHN0YWNrRGVw
dGgoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB2ODo6TG9j
YWw8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjg6Ok9iamVjdDo6TmV3KCk7CisgICAgICAgICAgICBm
b3IgKGludCBpID0gc3RhY2tEZXB0aCgpIC0gbGVuZ3RoOyBpIDwgc3RhY2tEZXB0aCgpOyBpICs9
IDIpIHsKKyAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwcm9wZXJ0eU5hbWUg
PSBlbGVtZW50KGkpOworICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHByb3Bl
cnR5VmFsdWUgPSBlbGVtZW50KGkgKyAxKTsKKyAgICAgICAgICAgICAgICBvYmplY3QtPlNldChw
cm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
cG9wKGxlbmd0aCk7CisgICAgICAgICAgICBwdXNoKG9iamVjdCk7CisgICAgICAgIH0gZWxzZSBp
ZiAodGFnID09IEFycmF5VGFnKSB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID4gc3RhY2tEZXB0
aCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHY4OjpMb2Nh
bDx2ODo6QXJyYXk+IGFycmF5ID0gdjg6OkFycmF5OjpOZXcobGVuZ3RoKTsKKyAgICAgICAgICAg
IGNvbnN0IGludCBkZXB0aCA9IHN0YWNrRGVwdGgoKSAtIGxlbmd0aDsKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgICAgICAgICAgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgYXJy
YXktPlNldCh2ODo6SW50ZWdlcjo6TmV3KGkpLCBlbGVtZW50KGRlcHRoICsgaSkpOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgcG9wKGxlbmd0aCk7CisgICAgICAgICAgICBwdXNoKGFycmF5
KTsKKyAgICAgICAgfSBlbHNlIGlmICh0YWcgIT0gUGFkZGluZ1RhZykKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCBwdXNo
KHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlKSB7IG1fc3RhY2suYXBwZW5kKHZhbHVlKTsgfQor
CisgICAgdm9pZCBwb3AodW5zaWduZWQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGxl
bmd0aCA8PSBtX3N0YWNrLnNpemUoKSk7CisgICAgICAgIG1fc3RhY2suc2hyaW5rKG1fc3RhY2su
c2l6ZSgpIC0gbGVuZ3RoKTsKKyAgICB9CisKKyAgICBpbnQgc3RhY2tEZXB0aCgpIGNvbnN0IHsg
cmV0dXJuIG1fc3RhY2suc2l6ZSgpOyB9CisKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBlbGVt
ZW50KHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGluZGV4IDwgbV9zdGFj
ay5zaXplKCkpOworICAgICAgICByZXR1cm4gbV9zdGFja1tpbmRleF07CisgICAgfQorCisgICAg
UmVhZGVyJiBtX3JlYWRlcjsKKyAgICBWZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4gPiBtX3N0
YWNrOworfTsKKworfSAvLyBuYW1lc3BhY2UKKworU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpTZXJp
YWxpemVkU2NyaXB0VmFsdWUodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQoreworICAgIFdy
aXRlciB3cml0ZXI7CisgICAgU2VyaWFsaXplciBzZXJpYWxpemVyKHdyaXRlcik7CisgICAgaWYg
KCFzZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSkpIHsKKyAgICAgICAgLy8gRklYTUU6IHRocm93
IGV4Y2VwdGlvbgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1fZGF0YSA9IFN0cmluZ0lt
cGw6OmFkb3B0KHdyaXRlci5kYXRhKCkpOworfQorCitTZXJpYWxpemVkU2NyaXB0VmFsdWU6OlNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZShTdHJpbmcgZGF0YSwgU3RyaW5nRGF0YU1vZGUgbW9kZSkKK3sK
KyAgICBpZiAobW9kZSA9PSBXaXJlRGF0YSkKKyAgICAgICAgbV9kYXRhID0gZGF0YTsKKyAgICBl
bHNlIHsKKyAgICAgICAgQVNTRVJUKG1vZGUgPT0gU3RyaW5nVmFsdWUpOworICAgICAgICBSZWZQ
dHI8U2hhcmVkQnVmZmVyPiBidWZmZXIgPSB1dGY4QnVmZmVyKGRhdGEpOworICAgICAgICBXcml0
ZXIgd3JpdGVyOworICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoYnVmZmVyLT5kYXRhKCksIGJ1
ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgbV9kYXRhID0gU3RyaW5nSW1wbDo6YWRvcHQod3JpdGVy
LmRhdGEoKSk7CisgICAgfQorfQorCit2ODo6TG9jYWw8djg6OlZhbHVlPiBTZXJpYWxpemVkU2Ny
aXB0VmFsdWU6OmRlc2VyaWFsaXplKCkKK3sKKyAgICBpZiAoIW1fZGF0YS5pbXBsKCkpCisgICAg
ICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOworICAgIENPTVBJTEVfQVNTRVJUKHNp
emVvZihCdWZmZXJWYWx1ZVR5cGUpID09IDIsIEJ1ZmZlclZhbHVlVHlwZUlzVHdvQnl0ZXMpOwor
ICAgIFJlYWRlciByZWFkZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obV9kYXRhLmlt
cGwoKS0+Y2hhcmFjdGVycygpKSwgMiAqIG1fZGF0YS5sZW5ndGgoKSk7CisgICAgRGVzZXJpYWxp
emVyIGRlc2VyaWFsaXplcihyZWFkZXIpOworICAgIHJldHVybiBkZXNlcmlhbGl6ZXIuZGVzZXJp
YWxpemUoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuaCBiL1dlYkNvcmUvYmluZGluZ3Mv
djgvU2VyaWFsaXplZFNjcmlwdFZhbHVlLmgKaW5kZXggMjZhNDE5OS4uN2ViODkzNSAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9iaW5kaW5ncy92OC9TZXJpYWxpemVkU2NyaXB0VmFsdWUuaAorKysgYi9X
ZWJDb3JlL2JpbmRpbmdzL3Y4L1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oCkBAIC0xLDUgKzEsNSBA
QAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00MCwxMSAr
NDAsMjYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBTZXJpYWxpemVkU2NyaXB0VmFs
dWUgOiBwdWJsaWMgUmVmQ291bnRlZDxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHsKIHB1YmxpYzoK
LSAgICBzdGF0aWMgUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGNyZWF0ZShTdHJp
bmcgc3RyaW5nKQorICAgIC8vIENyZWF0ZXMgYSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIG9m
IHRoZSBnaXZlbiBWOCB2YWx1ZS4KKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxTZXJpYWxpemVkU2Ny
aXB0VmFsdWU+IGNyZWF0ZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUpCiAgICAgewotICAg
ICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShzdHJpbmcpKTsK
KyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTZXJpYWxpemVkU2NyaXB0VmFsdWUodmFsdWUp
KTsKICAgICB9CiAKKyAgICAvLyBDcmVhdGVzIGEgc2VyaWFsaXplZCB2YWx1ZSB3aXRoIHRoZSBn
aXZlbiBkYXRhIG9idGFpbmVkIGZyb20gYQorICAgIC8vIHByaW9yIGNhbGwgdG8gdG9XaXJlU3Ry
aW5nKCkuCisgICAgc3RhdGljIFBhc3NSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBjcmVh
dGVGcm9tV2lyZShTdHJpbmcgZGF0YSkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihu
ZXcgU2VyaWFsaXplZFNjcmlwdFZhbHVlKGRhdGEsIFdpcmVEYXRhKSk7CisgICAgfQorCisgICAg
Ly8gQ3JlYXRlcyBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgV2ViQ29yZSBzdHJpbmcu
CisgICAgc3RhdGljIFBhc3NSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBjcmVhdGUoU3Ry
aW5nIGRhdGEpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZShkYXRhLCBTdHJpbmdWYWx1ZSkpOworICAgIH0KKworICAgIC8vIENyZWF0ZXMg
YW4gZW1wdHkgc2VyaWFsaXplZCB2YWx1ZS4KICAgICBzdGF0aWMgUGFzc1JlZlB0cjxTZXJpYWxp
emVkU2NyaXB0VmFsdWU+IGNyZWF0ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpKTsKQEAgLTUyLDIzICs2NywyOSBAQCBwdWJsaWM6
CiAKICAgICBQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gcmVsZWFzZSgpCiAgICAg
ewotICAgICAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiByZXN1bHQgPSBhZG9wdFJl
ZihuZXcgU2VyaWFsaXplZFNjcmlwdFZhbHVlKG1fZGF0YSkpOworICAgICAgICBSZWZQdHI8U2Vy
aWFsaXplZFNjcmlwdFZhbHVlPiByZXN1bHQgPSBhZG9wdFJlZihuZXcgU2VyaWFsaXplZFNjcmlw
dFZhbHVlKG1fZGF0YSwgV2lyZURhdGEpKTsKICAgICAgICAgbV9kYXRhID0gU3RyaW5nKCk7CiAg
ICAgICAgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOwogICAgIH0KIAotICAgIFN0cmluZyB0b1N0
cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9kYXRhOwotICAgIH0KKyAgICBTdHJpbmcg
dG9XaXJlU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9CisKKyAgICAvLyBEZXNlcmlh
bGl6ZXMgdGhlIHZhbHVlIChpbiB0aGUgY3VycmVudCBjb250ZXh0KS4gUmV0dXJucyBhbgorICAg
IC8vIGVtcHR5IGhhbmRsZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgICAgdjg6OkxvY2FsPHY4OjpW
YWx1ZT4gZGVzZXJpYWxpemUoKTsKIAogcHJpdmF0ZToKLSAgICBTZXJpYWxpemVkU2NyaXB0VmFs
dWUoU3RyaW5nIHN0cmluZykKLSAgICAgICAgOiBtX2RhdGEoc3RyaW5nKQotICAgIHsKLSAgICB9
CisgICAgZW51bSBTdHJpbmdEYXRhTW9kZSB7CisgICAgICAgIFN0cmluZ1ZhbHVlLAorICAgICAg
ICBXaXJlRGF0YQorICAgIH07CiAKICAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWUoKSB7IH0KKwor
ICAgIGV4cGxpY2l0IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4p
OworCisgICAgU2VyaWFsaXplZFNjcmlwdFZhbHVlKFN0cmluZyBkYXRhLCBTdHJpbmdEYXRhTW9k
ZSBtb2RlKTsKKwogICAgIFN0cmluZyBtX2RhdGE7CiB9OwogCmRpZmYgLS1naXQgYS9XZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVdpbmRvd0N1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOERPTVdpbmRvd0N1c3RvbS5jcHAKaW5kZXggZGFjZDRmNi4uYjU5NDUx
OCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dDdXN0
b20uY3BwCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RE9NV2luZG93Q3VzdG9t
LmNwcApAQCAtNDExLDcgKzQxMSw3IEBAIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBWOERPTVdpbmRv
dzo6cG9zdE1lc3NhZ2VDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzCiAgICAgQVNT
RVJUKHNvdXJjZS0+ZnJhbWUoKSk7CiAKICAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7Ci0gICAg
UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gbWVzc2FnZSA9IFNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZTo6Y3JlYXRlKHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKSk7CisgICAgUmVmUHRyPFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZT4gbWVzc2FnZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRl
KGFyZ3NbMF0pOwogICAgIE1lc3NhZ2VQb3J0QXJyYXkgcG9ydEFycmF5OwogICAgIFN0cmluZyB0
YXJnZXRPcmlnaW47CiAKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
RGVkaWNhdGVkV29ya2VyQ29udGV4dEN1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOERlZGljYXRlZFdvcmtlckNvbnRleHRDdXN0b20uY3BwCmluZGV4IDVhYjYyMTguLjQ0
ODZkYmUgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RGVkaWNhdGVk
V29ya2VyQ29udGV4dEN1c3RvbS5jcHAKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhEZWRpY2F0ZWRXb3JrZXJDb250ZXh0Q3VzdG9tLmNwcApAQCAtNDYsNyArNDYsNyBAQCB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gVjhEZWRpY2F0ZWRXb3JrZXJDb250ZXh0Ojpwb3N0TWVzc2FnZUNh
bGxiYWNrKGNvbnN0IHY4OjpBcgogewogICAgIElOQ19TVEFUUyhMIkRPTS5EZWRpY2F0ZWRXb3Jr
ZXJDb250ZXh0LnBvc3RNZXNzYWdlIik7CiAgICAgRGVkaWNhdGVkV29ya2VyQ29udGV4dCogd29y
a2VyQ29udGV4dCA9IFY4RGVkaWNhdGVkV29ya2VyQ29udGV4dDo6dG9OYXRpdmUoYXJncy5Ib2xk
ZXIoKSk7Ci0gICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gbWVzc2FnZSA9IFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcoYXJnc1swXSkp
OworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVk
U2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzBdKTsKICAgICBNZXNzYWdlUG9ydEFycmF5IHBvcnRB
cnJheTsKICAgICBpZiAoYXJncy5MZW5ndGgoKSA+IDEpIHsKICAgICAgICAgaWYgKCFnZXRNZXNz
YWdlUG9ydEFycmF5KGFyZ3NbMV0sIHBvcnRBcnJheSkpCmRpZmYgLS1naXQgYS9XZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOEhpc3RvcnlDdXN0b20uY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhIaXN0b3J5Q3VzdG9tLmNwcAppbmRleCA2YWEwODA2Li5iODU3ZDZlIDEwMDY0
NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhpc3RvcnlDdXN0b20uY3BwCisr
KyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SGlzdG9yeUN1c3RvbS5jcHAKQEAgLTQz
LDcgKzQzLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4g
VjhIaXN0b3J5OjpwdXNoU3RhdGVDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKQog
ewotICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGhpc3RvcnlTdGF0ZSA9IFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKSk7CisgICAg
UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gaGlzdG9yeVN0YXRlID0gU2VyaWFsaXplZFNj
cmlwdFZhbHVlOjpjcmVhdGUoYXJnc1swXSk7CiAKICAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7
CiAgICAgU3RyaW5nIHRpdGxlID0gdG9XZWJDb3JlU3RyaW5nV2l0aE51bGxPclVuZGVmaW5lZENo
ZWNrKGFyZ3NbMV0pOwpAQCAtNjQsNyArNjQsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhI
aXN0b3J5OjpwdXNoU3RhdGVDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKQogCiB2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhIaXN0b3J5OjpyZXBsYWNlU3RhdGVDYWxsYmFjayhjb25z
dCB2ODo6QXJndW1lbnRzJiBhcmdzKQogewotICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFs
dWU+IGhpc3RvcnlTdGF0ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKHRvV2ViQ29y
ZVN0cmluZyhhcmdzWzBdKSk7CisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gaGlz
dG9yeVN0YXRlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoYXJnc1swXSk7CiAKICAg
ICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7CiAgICAgU3RyaW5nIHRpdGxlID0gdG9XZWJDb3JlU3Ry
aW5nV2l0aE51bGxPclVuZGVmaW5lZENoZWNrKGFyZ3NbMV0pOwpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdlRXZlbnRDdXN0b20uY3BwIGIvV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdlRXZlbnRDdXN0b20uY3BwCmluZGV4IGIyOTFkMWEu
LjJiMDI3ZGMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2Fn
ZUV2ZW50Q3VzdG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3Nh
Z2VFdmVudEN1c3RvbS5jcHAKQEAgLTY1LDcgKzY1LDcgQEAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+
IFY4TWVzc2FnZUV2ZW50Ojppbml0TWVzc2FnZUV2ZW50Q2FsbGJhY2soY29uc3Qgdjg6OkFyZ3Vt
ZW4KICAgICBTdHJpbmcgdHlwZUFyZyA9IHY4VmFsdWVUb1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7
CiAgICAgYm9vbCBjYW5CdWJibGVBcmcgPSBhcmdzWzFdLT5Cb29sZWFuVmFsdWUoKTsKICAgICBi
b29sIGNhbmNlbGFibGVBcmcgPSBhcmdzWzJdLT5Cb29sZWFuVmFsdWUoKTsKLSAgICBSZWZQdHI8
U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBkYXRhQXJnID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpj
cmVhdGUodjhWYWx1ZVRvV2ViQ29yZVN0cmluZyhhcmdzWzNdKSk7CisgICAgUmVmUHRyPFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZT4gZGF0YUFyZyA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRl
KGFyZ3NbM10pOwogICAgIFN0cmluZyBvcmlnaW5BcmcgPSB2OFZhbHVlVG9XZWJDb3JlU3RyaW5n
KGFyZ3NbNF0pOwogICAgIFN0cmluZyBsYXN0RXZlbnRJZEFyZyA9IHY4VmFsdWVUb1dlYkNvcmVT
dHJpbmcoYXJnc1s1XSk7CiAgICAgRE9NV2luZG93KiBzb3VyY2VBcmcgPSBWOERPTVdpbmRvdzo6
SGFzSW5zdGFuY2UoYXJnc1s2XSkgPyBWOERPTVdpbmRvdzo6dG9OYXRpdmUodjg6OkhhbmRsZTx2
ODo6T2JqZWN0Pjo6Q2FzdChhcmdzWzZdKSkgOiAwOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhNZXNzYWdlUG9ydEN1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3VzdG9tLmNwcAppbmRleCAwNzFiMWFjLi5jYzcwYmM1
IDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3Vz
dG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3Vz
dG9tLmNwcApAQCAtNzgsNyArNzgsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhNZXNzYWdl
UG9ydDo6cG9zdE1lc3NhZ2VDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcgogewogICAg
IElOQ19TVEFUUygiRE9NLk1lc3NhZ2VQb3J0LnBvc3RNZXNzYWdlIik7CiAgICAgTWVzc2FnZVBv
cnQqIG1lc3NhZ2VQb3J0ID0gVjhNZXNzYWdlUG9ydDo6dG9OYXRpdmUoYXJncy5Ib2xkZXIoKSk7
Ci0gICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gbWVzc2FnZSA9IFNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZTo6Y3JlYXRlKHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKSk7CisgICAgUmVmUHRy
PFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gbWVzc2FnZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6
Y3JlYXRlKGFyZ3NbMF0pOwogICAgIE1lc3NhZ2VQb3J0QXJyYXkgcG9ydEFycmF5OwogICAgIGlm
IChhcmdzLkxlbmd0aCgpID4gMSkgewogICAgICAgICBpZiAoIWdldE1lc3NhZ2VQb3J0QXJyYXko
YXJnc1sxXSwgcG9ydEFycmF5KSkKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4UG9wU3RhdGVFdmVudEN1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOFBvcFN0YXRlRXZlbnRDdXN0b20uY3BwCmluZGV4IDk5Y2MyZDEuLjQ2ZTk5MjkgMTAwNjQ0
Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4UG9wU3RhdGVFdmVudEN1c3RvbS5j
cHAKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhQb3BTdGF0ZUV2ZW50Q3VzdG9t
LmNwcApAQCAtNDQsNyArNDQsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQb3BTdGF0ZUV2
ZW50Ojppbml0UG9wU3RhdGVFdmVudENhbGxiYWNrKGNvbnN0IHY4OjpBcmd1bQogICAgIFN0cmlu
ZyB0eXBlQXJnID0gdjhWYWx1ZVRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKICAgICBib29sIGNh
bkJ1YmJsZUFyZyA9IGFyZ3NbMV0tPkJvb2xlYW5WYWx1ZSgpOwogICAgIGJvb2wgY2FuY2VsYWJs
ZUFyZyA9IGFyZ3NbMl0tPkJvb2xlYW5WYWx1ZSgpOwotICAgIFJlZlB0cjxTZXJpYWxpemVkU2Ny
aXB0VmFsdWU+IHN0YXRlQXJnID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUodjhWYWx1
ZVRvV2ViQ29yZVN0cmluZyhhcmdzWzNdKSk7CisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZT4gc3RhdGVBcmcgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzNdKTsK
IAogICAgIFBvcFN0YXRlRXZlbnQqIGV2ZW50ID0gVjhQb3BTdGF0ZUV2ZW50Ojp0b05hdGl2ZShh
cmdzLkhvbGRlcigpKTsKICAgICBldmVudC0+aW5pdFBvcFN0YXRlRXZlbnQodHlwZUFyZywgY2Fu
QnViYmxlQXJnLCBjYW5jZWxhYmxlQXJnLCBzdGF0ZUFyZy5yZWxlYXNlKCkpOwpAQCAtNjEsNyAr
NjEsNyBAQCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQb3BTdGF0ZUV2ZW50OjpzdGF0ZUFjY2Vz
c29yR2V0dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPgogICAgIGlmICghc3RhdGUpCiAgICAgICAg
IHJldHVybiB2ODo6TnVsbCgpOwogCi0gICAgcmV0dXJuIHY4U3RyaW5nT3JOdWxsKHN0YXRlLT50
b1N0cmluZygpKTsKKyAgICByZXR1cm4gc3RhdGUtPmRlc2VyaWFsaXplKCk7CiB9CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4V29ya2VyQ3VzdG9tLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V29ya2Vy
Q3VzdG9tLmNwcAppbmRleCA2ZGVjN2FmLi40MjkxZjZkIDEwMDY0NAotLS0gYS9XZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckN1c3RvbS5jcHAKKysrIGIvV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhXb3JrZXJDdXN0b20uY3BwCkBAIC05Miw3ICs5Miw3IEBAIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBWOFdvcmtlcjo6cG9zdE1lc3NhZ2VDYWxsYmFjayhjb25zdCB2ODo6QXJn
dW1lbnRzJiBhcmdzKQogewogICAgIElOQ19TVEFUUygiRE9NLldvcmtlci5wb3N0TWVzc2FnZSIp
OwogICAgIFdvcmtlciogd29ya2VyID0gVjhXb3JrZXI6OnRvTmF0aXZlKGFyZ3MuSG9sZGVyKCkp
OwotICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVk
U2NyaXB0VmFsdWU6OmNyZWF0ZSh0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgIFJlZlB0
cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IG1lc3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6
OmNyZWF0ZShhcmdzWzBdKTsKICAgICBNZXNzYWdlUG9ydEFycmF5IHBvcnRBcnJheTsKICAgICBp
ZiAoYXJncy5MZW5ndGgoKSA+IDEpIHsKICAgICAgICAgaWYgKCFnZXRNZXNzYWdlUG9ydEFycmF5
KGFyZ3NbMV0sIHBvcnRBcnJheSkpCmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdl
TG9nIGIvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwppbmRleCAwMGE4YzMyLi4xYmIyYjBiIDEw
MDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1dlYktpdC9jaHJvbWl1
bS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMyBAQAorMjAxMC0wMS0xNSAgVml0YWx5IFJlcGVzaGtv
ICA8dml0YWx5ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgW1Y4XSBTdXBwb3J0IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS4KKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMyOTIwCisgICAg
ICAgIGh0dHA6Ly9jcmJ1Zy5jb20vMzA2MjAKKworICAgICAgICBVcGRhdGVkIHVzZXMgb2YgU2Vy
aWFsaXplZFNjcmlwdFZhbHVlOgorICAgICAgICAqIHNyYy9QbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hh
bm5lbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpQbGF0Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbDo6
cG9zdE1lc3NhZ2VUb1JlbW90ZSk6CisgICAgICAgIChXZWJDb3JlOjpQbGF0Zm9ybU1lc3NhZ2VQ
b3J0Q2hhbm5lbDo6dHJ5R2V0TWVzc2FnZUZyb21SZW1vdGUpOgorICAgICAgICAqIHNyYy9XZWJX
b3JrZXJCYXNlLmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViV29ya2VyQmFzZTo6cG9zdE1lc3Nh
Z2VUb1dvcmtlck9iamVjdCk6CisgICAgICAgICogc3JjL1dlYldvcmtlckNsaWVudEltcGwuY3Bw
OgorICAgICAgICAoV2ViS2l0OjpXZWJXb3JrZXJDbGllbnRJbXBsOjpwb3N0TWVzc2FnZVRvV29y
a2VyQ29udGV4dCk6CisgICAgICAgIChXZWJLaXQ6OldlYldvcmtlckNsaWVudEltcGw6OnBvc3RN
ZXNzYWdlVG9Xb3JrZXJPYmplY3RUYXNrKToKKyAgICAgICAgKiBzcmMvV2ViV29ya2VySW1wbC5j
cHA6CisgICAgICAgIChXZWJLaXQ6OldlYldvcmtlckltcGw6OnBvc3RNZXNzYWdlVG9Xb3JrZXJD
b250ZXh0VGFzayk6CisKIDIwMTAtMDEtMTQgIEplcmVteSBPcmxvdyAgPGpvcmxvd0BjaHJvbWl1
bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgT2xpdmVyIEh1bnQuCmRpZmYgLS1naXQgYS9X
ZWJLaXQvY2hyb21pdW0vc3JjL1BsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVsLmNwcCBiL1dlYktp
dC9jaHJvbWl1bS9zcmMvUGxhdGZvcm1NZXNzYWdlUG9ydENoYW5uZWwuY3BwCmluZGV4IGY4YzQx
ZDMuLmFhNDJhMTAgMTAwNjQ0Ci0tLSBhL1dlYktpdC9jaHJvbWl1bS9zcmMvUGxhdGZvcm1NZXNz
YWdlUG9ydENoYW5uZWwuY3BwCisrKyBiL1dlYktpdC9jaHJvbWl1bS9zcmMvUGxhdGZvcm1NZXNz
YWdlUG9ydENoYW5uZWwuY3BwCkBAIC0xNzksNyArMTc5LDcgQEAgdm9pZCBQbGF0Zm9ybU1lc3Nh
Z2VQb3J0Q2hhbm5lbDo6cG9zdE1lc3NhZ2VUb1JlbW90ZShQYXNzT3duUHRyPE1lc3NhZ2VQb3J0
Q2hhbm4KICAgICBpZiAoIW1fbG9jYWxQb3J0IHx8ICFtX3dlYkNoYW5uZWwpCiAgICAgICAgIHJl
dHVybjsKIAotICAgIFdlYlN0cmluZyBtZXNzYWdlU3RyaW5nID0gbWVzc2FnZS0+bWVzc2FnZSgp
LT50b1N0cmluZygpOworICAgIFdlYlN0cmluZyBtZXNzYWdlU3RyaW5nID0gbWVzc2FnZS0+bWVz
c2FnZSgpLT50b1dpcmVTdHJpbmcoKTsKICAgICBPd25QdHI8V2ViQ29yZTo6TWVzc2FnZVBvcnRD
aGFubmVsQXJyYXk+IGNoYW5uZWxzID0gbWVzc2FnZS0+Y2hhbm5lbHMoKTsKICAgICBXZWJNZXNz
YWdlUG9ydENoYW5uZWxBcnJheSogd2ViQ2hhbm5lbHMgPSAwOwogICAgIGlmIChjaGFubmVscy5n
ZXQoKSAmJiBjaGFubmVscy0+c2l6ZSgpKSB7CkBAIC0yMTEsNyArMjExLDcgQEAgYm9vbCBQbGF0
Zm9ybU1lc3NhZ2VQb3J0Q2hhbm5lbDo6dHJ5R2V0TWVzc2FnZUZyb21SZW1vdGUoT3duUHRyPE1l
c3NhZ2VQb3J0Q2hhbm4KICAgICAgICAgICAgICAgICAoKmNoYW5uZWxzKVtpXSA9IE1lc3NhZ2VQ
b3J0Q2hhbm5lbDo6Y3JlYXRlKHBsYXRmb3JtQ2hhbm5lbCk7CiAgICAgICAgICAgICB9CiAgICAg
ICAgIH0KLSAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2VyaWFsaXplZE1l
c3NhZ2UgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShtZXNzYWdlKTsKKyAgICAgICAg
UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2VyaWFsaXplZE1lc3NhZ2UgPSBTZXJpYWxp
emVkU2NyaXB0VmFsdWU6OmNyZWF0ZUZyb21XaXJlKG1lc3NhZ2UpOwogICAgICAgICByZXN1bHQg
PSBNZXNzYWdlUG9ydENoYW5uZWw6OkV2ZW50RGF0YTo6Y3JlYXRlKHNlcmlhbGl6ZWRNZXNzYWdl
LnJlbGVhc2UoKSwgY2hhbm5lbHMucmVsZWFzZSgpKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL1dl
YktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2VyQmFzZS5jcHAgYi9XZWJLaXQvY2hyb21pdW0vc3Jj
L1dlYldvcmtlckJhc2UuY3BwCmluZGV4IDBlM2FhNGUuLjdmZDM3NDkgMTAwNjQ0Ci0tLSBhL1dl
YktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2VyQmFzZS5jcHAKKysrIGIvV2ViS2l0L2Nocm9taXVt
L3NyYy9XZWJXb3JrZXJCYXNlLmNwcApAQCAtMTU3LDcgKzE1Nyw3IEBAIHZvaWQgV2ViV29ya2Vy
QmFzZTo6cG9zdE1lc3NhZ2VUb1dvcmtlck9iamVjdChQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQ
YXNzT3duUHRyPE1lc3NhZ2VQb3J0Q2hhbm5lbEFycmF5PiBjaGFubmVscykKIHsKICAgICBkaXNw
YXRjaFRhc2tUb01haW5UaHJlYWQoY3JlYXRlQ2FsbGJhY2tUYXNrKCZwb3N0TWVzc2FnZVRhc2ss
IHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt
ZXNzYWdlLT50b1N0cmluZygpLCBjaGFubmVscykpOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+dG9XaXJlU3RyaW5nKCksIGNoYW5uZWxz
KSk7CiB9CiAKIHZvaWQgV2ViV29ya2VyQmFzZTo6cG9zdE1lc3NhZ2VUYXNrKFNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQqIGNvbnRleHQsCmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vc3JjL1dl
YldvcmtlckNsaWVudEltcGwuY3BwIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJXb3JrZXJDbGll
bnRJbXBsLmNwcAppbmRleCA2YmUwM2E3Li41OThhMDc4IDEwMDY0NAotLS0gYS9XZWJLaXQvY2hy
b21pdW0vc3JjL1dlYldvcmtlckNsaWVudEltcGwuY3BwCisrKyBiL1dlYktpdC9jaHJvbWl1bS9z
cmMvV2ViV29ya2VyQ2xpZW50SW1wbC5jcHAKQEAgLTE3Myw3ICsxNzMsNyBAQCB2b2lkIFdlYldv
cmtlckNsaWVudEltcGw6OnBvc3RNZXNzYWdlVG9Xb3JrZXJDb250ZXh0KAogICAgIGlmICghaXNN
YWluVGhyZWFkKCkpIHsKICAgICAgICAgV2ViV29ya2VyQmFzZTo6ZGlzcGF0Y2hUYXNrVG9NYWlu
VGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmcG9zdE1lc3NhZ2VUb1dvcmtlckNvbnRleHRUYXNr
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+dG9TdHJpbmcoKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBtZXNzYWdlLT50b1dpcmVTdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscykpOwogICAg
ICAgICByZXR1cm47CiAgICAgfQpAQCAtMTg0LDcgKzE4NCw3IEBAIHZvaWQgV2ViV29ya2VyQ2xp
ZW50SW1wbDo6cG9zdE1lc3NhZ2VUb1dvcmtlckNvbnRleHQoCiAgICAgICAgIHdlYmNoYW5uZWwt
PnNldENsaWVudCgwKTsKICAgICAgICAgd2ViQ2hhbm5lbHNbaV0gPSB3ZWJjaGFubmVsOwogICAg
IH0KLSAgICBtX3dlYldvcmtlci0+cG9zdE1lc3NhZ2VUb1dvcmtlckNvbnRleHQobWVzc2FnZS0+
dG9TdHJpbmcoKSwgd2ViQ2hhbm5lbHMpOworICAgIG1fd2ViV29ya2VyLT5wb3N0TWVzc2FnZVRv
V29ya2VyQ29udGV4dChtZXNzYWdlLT50b1dpcmVTdHJpbmcoKSwgd2ViQ2hhbm5lbHMpOwogfQog
CiBib29sIFdlYldvcmtlckNsaWVudEltcGw6Omhhc1BlbmRpbmdBY3Rpdml0eSgpIGNvbnN0CkBA
IC0zNTYsNyArMzU2LDcgQEAgdm9pZCBXZWJXb3JrZXJDbGllbnRJbXBsOjpwb3N0TWVzc2FnZVRv
V29ya2VyT2JqZWN0VGFzaygKICAgICAgICAgT3duUHRyPE1lc3NhZ2VQb3J0QXJyYXk+IHBvcnRz
ID0KICAgICAgICAgICAgIE1lc3NhZ2VQb3J0OjplbnRhbmdsZVBvcnRzKCpjb250ZXh0LCBjaGFu
bmVscy5yZWxlYXNlKCkpOwogICAgICAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBz
ZXJpYWxpemVkTWVzc2FnZSA9Ci0gICAgICAgICAgICBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNy
ZWF0ZShtZXNzYWdlKTsKKyAgICAgICAgICAgIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRl
RnJvbVdpcmUobWVzc2FnZSk7CiAgICAgICAgIHRoaXNQdHItPm1fd29ya2VyLT5kaXNwYXRjaEV2
ZW50KE1lc3NhZ2VFdmVudDo6Y3JlYXRlKHBvcnRzLnJlbGVhc2UoKSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXpl
ZE1lc3NhZ2UucmVsZWFzZSgpKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVt
L3NyYy9XZWJXb3JrZXJJbXBsLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViV29ya2VySW1w
bC5jcHAKaW5kZXggNzQ0YmUzMC4uNWI1ZTA1MyAxMDA2NDQKLS0tIGEvV2ViS2l0L2Nocm9taXVt
L3NyYy9XZWJXb3JrZXJJbXBsLmNwcAorKysgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYldvcmtl
ckltcGwuY3BwCkBAIC04OCw3ICs4OCw3IEBAIHZvaWQgV2ViV29ya2VySW1wbDo6cG9zdE1lc3Nh
Z2VUb1dvcmtlckNvbnRleHRUYXNrKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRlCiAgICAg
T3duUHRyPE1lc3NhZ2VQb3J0QXJyYXk+IHBvcnRzID0KICAgICAgICAgTWVzc2FnZVBvcnQ6OmVu
dGFuZ2xlUG9ydHMoKmNvbnRleHQsIGNoYW5uZWxzLnJlbGVhc2UoKSk7CiAgICAgUmVmUHRyPFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2VyaWFsaXplZE1lc3NhZ2UgPQotICAgICAgICBTZXJpYWxp
emVkU2NyaXB0VmFsdWU6OmNyZWF0ZShtZXNzYWdlKTsKKyAgICAgICAgU2VyaWFsaXplZFNjcmlw
dFZhbHVlOjpjcmVhdGVGcm9tV2lyZShtZXNzYWdlKTsKICAgICB3b3JrZXJDb250ZXh0LT5kaXNw
YXRjaEV2ZW50KE1lc3NhZ2VFdmVudDo6Y3JlYXRlKAogICAgICAgICBwb3J0cy5yZWxlYXNlKCks
IHNlcmlhbGl6ZWRNZXNzYWdlLnJlbGVhc2UoKSkpOwogICAgIHRoaXNQdHItPmNvbmZpcm1NZXNz
YWdlRnJvbVdvcmtlck9iamVjdCh3b3JrZXJDb250ZXh0LT5oYXNQZW5kaW5nQWN0aXZpdHkoKSk7
Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>