<?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>26623</bug_id>
          
          <creation_ts>2009-06-22 14:17:42 -0700</creation_ts>
          <short_desc>[Chromium] Upstream V8Proxy</short_desc>
          <delta_ts>2009-06-29 11:14:26 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Nate Chapin">nate.chapin</reporter>
          <assigned_to name="Nate Chapin">nate.chapin</assigned_to>
          <cc>levin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>127443</commentid>
    <comment_count>0</comment_count>
    <who name="Nate Chapin">nate.chapin</who>
    <bug_when>2009-06-22 14:17:42 -0700</bug_when>
    <thetext>See summary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127445</commentid>
    <comment_count>1</comment_count>
      <attachid>31673</attachid>
    <who name="Nate Chapin">nate.chapin</who>
    <bug_when>2009-06-22 14:25:51 -0700</bug_when>
    <thetext>Created attachment 31673
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127568</commentid>
    <comment_count>2</comment_count>
      <attachid>31673</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-06-22 21:48:12 -0700</bug_when>
    <thetext>Comment on attachment 31673
patch

Thanks Nate for taking this on.  I know it is huge.  However, I think this needs to be scrubbed a bit more before an in depth review.  

Here&apos;s some steps to do to get this in better shape:

1. s/NULL/0/
2. Find all &quot;!= 0&quot; and &quot;== 0&quot; and get rid of them, replacing with appropriate logic.
3. Find variables_like_this and replace with variablesLikeThis.
4. getRidOfAbbrInVarNmes
5. Get rid of USE_VAR and replace with UNUSED_PARAM(whateverVariable); (from &lt;wtf/UnusedParam.h&gt;).
6. Change static locals in functions to use DEFINE_STATIC_LOCAL from wtf/StdLibExtras.h
7. Variable names should be descriptive words and &quot;a&quot; doesn&apos;t count :)  (Loop variables and iterators are the rare exception.)
8. End of line comments should only have one space before them.
9. Fix indentation in V8Proxy::SVGObjectWithContextToV8Object (actually there are several other places with 2 space indenting, scan the file and they will pop out at you).
10. Remove comments like &quot;// static&quot;
11. Get rid of variable names in function definitions when they add no information.  For example: &quot;void AddToPage(Page* page) const;&quot; but there are others.
12. Change MethodNames to be methodNames.
13. Spaces around |
14. Replace ASSERT(false); with ASSERT_NOT_REACHED() (from wtf/Assertions.h).
15. At about line 3128, the function bracing is at the end of line.  For example &quot;void V8Proxy::CreateUtilityContext() {&quot;
16. TODO(*): -&gt; FIXME:</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127977</commentid>
    <comment_count>3</comment_count>
      <attachid>31805</attachid>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2009-06-24 13:28:19 -0700</bug_when>
    <thetext>Created attachment 31805
patch2

The change in function names has grow the size of the CL substantial, I apologize in advance.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127979</commentid>
    <comment_count>4</comment_count>
      <attachid>31806</attachid>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2009-06-24 13:39:19 -0700</bug_when>
    <thetext>Created attachment 31806
patch3

Fixed the broken patching of V8Proxy.cpp into my webkit client.  Also, I hadn&apos;t applied all the latest change to the v8_proxy.cpp in src.chromium.org.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128025</commentid>
    <comment_count>5</comment_count>
      <attachid>31815</attachid>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2009-06-24 16:29:12 -0700</bug_when>
    <thetext>Created attachment 31815
patch4</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128097</commentid>
    <comment_count>6</comment_count>
      <attachid>31815</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-06-24 22:53:36 -0700</bug_when>
    <thetext>Comment on attachment 31815
patch4

I think we can finish with just one more round.  A few specific things to clean up below.



&gt; Index: WebCore/ChangeLog
&gt; +2009-06-24  Nate Chapin  &lt;japhet@chromium.org&gt;

I think this changelog need to be updated due to the new changes.


&gt; Index: WebCore/bindings/v8/V8Proxy.h

very minor nit: General comment, WebKit uses one space after periods in comments. If you do a search and replace of &quot;.  &quot; with &quot;. &quot;, that would fix this up.

&gt; +    class CSSStyleDeclaration;
&gt; +    class ClientRectList;
&gt; +    class DOMImplementation;
&gt; +    class Element;
&gt; +    class Event;
&gt; +    class EventListener;
&gt; +    class Frame;
&gt; +    class HTMLCollection;
&gt; +    class HTMLOptionsCollection;
&gt; +    class HTMLElement;
&gt; +    class HTMLDocument;
&gt; +    class MediaList;
&gt; +    class NamedNodeMap;
&gt; +    class Node;
&gt; +    class NodeList;
&gt; +    class Screen;
&gt; +    class String;
&gt; +    class StyleSheet;
&gt; +    class SVGElement;
&gt; +    class DOMWindow;
&gt; +    class Document;
&gt; +    class EventTarget;
&gt; +    class Event;
&gt; +    class EventListener;
&gt; +    class Navigator;
&gt; +    class MimeType;
&gt; +    class MimeTypeArray;
&gt; +    class Plugin;
&gt; +    class PluginArray;
&gt; +    class StyleSheetList;
&gt; +    class CSSValue;
&gt; +    class CSSRule;
&gt; +    class CSSRuleList;
&gt; +    class CSSValueList;
&gt; +    class NodeFilter;
&gt; +    class ScriptExecutionContext;

These should be sorted (to avoid duplicates) for example Event is duplicated and a few others.


&gt; + #if ENABLE(SVG)
&gt; +    class SVGElementInstance;
&gt; + #endif

Extra space before #&apos;s here.

&gt; +    class V8EventListener;
&gt; +    class V8ObjectEventListener;

Put with the rest of the forward declarations.

&gt; +    void logInfo(Frame* frame, const String&amp; msg, const String&amp; url);

Remove param name &quot;frame&quot;.
s/msg/message/

&gt; +    class GlobalHandleInfo {
&gt; +    public:
&gt; +        GlobalHandleInfo(void* host, GlobalHandleType type) : host_(host), type_(type) { }
&gt; +        void* host_;

Use m_host

&gt; +        GlobalHandleType type_;
Use m_type

&gt; +    };
&gt; +
&gt; +#endif  // NDEBUG

single space before end of line comments.


&gt; +         enum ErrorType {
&gt; +             RANGE_ERROR,
&gt; +             REFERENCE_ERROR,
&gt; +             SYNTAX_ERROR,
&gt; +             TYPE_ERROR,
&gt; +             GENERAL_ERROR
&gt; +         };

&quot;Enum members should user InterCaps with an initial capital letter.&quot;
RangeError, etc.


&gt; +        void setEventHandlerLineNumber(int lineNumber) { m_handlerLineno = lineNumber; }
&gt; +        void finishedWithEvent(Event* event) { }

Remove &quot;event&quot;.


&gt; +        // Create a V8 wrapper for a C pointer
&gt; +        static v8::Handle&lt;v8::Value&gt; wrapCPointer(void* cptr)
&gt; +        {
&gt; +            // Represent void* as int
&gt; +            int addr = reinterpret_cast&lt;int&gt;(cptr);
&gt; +            ASSERT(!(addr &amp; 0x01));  // the address must be aligned.
Single space before end of line comment.

&quot;T&quot;he address...


&gt; +        // Take C pointer out of a v8 wrapper

Add &quot;.&quot;

&gt; +#ifndef NDEBUG
&gt; +        // Checks if a v8 value can be a DOM wrapper

Add &quot;.&quot;


&gt; +        template&lt;typename T&gt;
&gt; +        static v8::Handle&lt;v8::Value&gt; convertToV8Object(V8ClassIndex::V8WrapperType type, PassRefPtr&lt;T&gt; imp)
&gt; +        {
&gt; +          return convertToV8Object(type, imp.get());

Fix indentation.

&gt; +        // Wrap and unwrap JS event listeners
Add &quot;.&quot;

&gt; +        // Wrap JS node filter in C++

Add &quot;.&quot;

&gt; +#ifndef NDEBUG
&gt; +        // For debugging and leak detection purpose
Add &quot;.&quot;


&gt; +        // Check whether a V8 value is a DOM Event wrapper
Add &quot;.&quot;

&gt; +        // Take C pointer out of a v8 wrapper
Add &quot;.&quot;

&gt; +        // The first parameter, desc_type, specifies the function descriptor
&gt; +        // used to create JS object. The second parameter, cptr_type, specifies
&gt; +        // the type of third parameter, impl, for type casting.
&gt; +        // For example, a HTML element has HTMLELEMENT desc_type, but always
&gt; +        // use NODE as cptr_type. JS wrapper stores cptr_type and impl as
&gt; +        // internal fields.
&gt; +        static v8::Local&lt;v8::Object&gt; instantiateV8Object(V8ClassIndex::V8WrapperType, V8ClassIndex::V8WrapperType, void*);

Rework the comment to remove parameters names since they aren&apos;t in the decl anymore.

&gt; +        static v8::Local&lt;v8::Context&gt; utilityContext()
&gt; +        {
&gt; +          if (m_utilityContext.IsEmpty())
&gt; +              createUtilityContext();
&gt; +          return v8::Local&lt;v8::Context&gt;::New(m_utilityContext);
&gt; +        }
Indentation is off.


&gt; +    template &lt;int tag, typename T&gt;
&gt; +    v8::Handle&lt;v8::Value&gt; V8Proxy::constructDOMObject(const v8::Arguments&amp; args)
&gt; +    {
&gt; +        if (!args.IsConstructCall()) {
&gt; +          V8Proxy::throwError(V8Proxy::TYPE_ERROR, &quot;DOM object constructor cannot be called as a function.&quot;);
&gt; +          return v8::Undefined();
Fix indentation and switch to the new &quot;throwError&quot;.



&gt; Index: WebCore/bindings/v8/V8Proxy.cpp

&gt; +#include &lt;algorithm&gt;
&gt; +#include &lt;utility&gt;
&gt; +#include &lt;v8.h&gt;
&gt; +#include &lt;v8-debug.h&gt;
&gt; +#include &lt;wtf/Assertions.h&gt;
&gt; +#include &lt;wtf/StdLibExtras.h&gt;
&gt; +#include &lt;wtf/UnusedParam.h&gt;

Typically these come after the &quot;&quot; includes.


&gt; +// Static utility context.

Seems obvious I&apos;d remove the comment.

&gt; +v8::Persistent&lt;v8::Context&gt; V8Proxy::m_utilityContext;

&gt; +void batchConfigureAttributes(v8::Handle&lt;v8::ObjectTemplate&gt; instance, v8::Handle&lt;v8::ObjectTemplate&gt; proto, const BatchedAttribute* attributes, size_t attributeCount)
&gt; +void batchConfigureConstants(v8::Handle&lt;v8::FunctionTemplate&gt; functionDescriptor, v8::Handle&lt;v8::ObjectTemplate&gt; proto, const BatchedConstant* constants, size_t constantCount)

If these functions are only used within this file, make them &quot;static&quot;.


&gt; +v8::Handle&lt;v8::Value&gt; V8Proxy::convertSVGObjectWithContextToV8Object(V8ClassIndex::V8WrapperType type, void* object)
&gt; +{
&gt; +    if (!object)
&gt; +        return v8::Null();
&gt; +
&gt; +    v8::Persistent&lt;v8::Object&gt; result = getDOMSVGObjectWithContextMap().get(object);
&gt; +    if (!result.IsEmpty())
&gt; +        return result;
&gt; +
&gt; +    // Special case: SVGPathSegs need to be downcast to their real type
&gt; +    if (type == V8ClassIndex::SVGPATHSEG)
&gt; +        type = V8Custom::DowncastSVGPathSeg(object);
&gt; +
&gt; +    v8::Local&lt;v8::Object&gt; v8Object = instantiateV8Object(type, type, object);
&gt; +    if (!v8Object.IsEmpty()) {
&gt; +      result = v8::Persistent&lt;v8::Object&gt;::New(v8Object);
Fix indentation starting here.



&gt; +    for (size_t i = 0; i &lt; grouper.size(); ) {
&gt; +        // Seek to the next key (or the end of the list).
&gt; +        size_t nextKeyIndex = grouper.size();
&gt; +        for (size_t j = i; j &lt; grouper.size(); ++j) {
&gt; +            if (grouper[i].first != grouper[j].first) {
&gt; +              nextKeyIndex = j;
&gt; +              break;
Fix indentation.



&gt; +typedef HashMap&lt;int, v8::FunctionTemplate*&gt; FunctionTemplateMap;
&gt; +
&gt; +bool AllowAllocation::m_current = false;
&gt; +
&gt; +// JavaScriptConsoleMessages encapsulate everything needed to
&gt; +// log messages originating from JavaScript to the Chrome console.
&gt; +class JavaScriptConsoleMessage {
&gt; +public:
&gt; +    JavaScriptConsoleMessage(const String&amp; string, const String&amp; sourceID, unsigned lineNumber)
&gt; +        : m_string(string)
&gt; +        , m_sourceID(sourceID)
&gt; +        , m_lineNumber(lineNumber) { }
Put the { } on seperate lines below.


&gt; +static void handleConsoleMessage(v8::Handle&lt;v8::Message&gt; message, v8::Handle&lt;v8::Value&gt; data)
&gt; +{
...
&gt; +    bool useURL = (resourceName.IsEmpty() || !resourceName-&gt;IsString());
Remove unnecessary parens.

&gt; +    String resourceNameString = (useURL) ? frame-&gt;document()-&gt;url() : ToWebCoreString(resourceName);

Remove unnecessary parens.

&gt; +enum DelayReporting {
&gt; +    REPORT_LATER,
&gt; +    REPORT_NOW
&gt; +};

&quot;Enum members should user InterCaps with an initial capital letter.&quot;
  ReportLater
  ReportNow


&gt; +
&gt; +static void reportUnsafeAccessTo(Frame* target, DelayReporting delay)
&gt; +{
&gt; +    ASSERT(target);
&gt; +    Document* targetDocument = target-&gt;document();
&gt; +    if (!targetDocument)
&gt; +        return;
&gt; +
&gt; +    Frame* source = V8Proxy::retrieveFrameForEnteredContext();
&gt; +    if (!source || !source-&gt;document())
&gt; +        return;  // Ignore error if the source document is gone.
Single space before end of line comment.

&gt; +    String str = String::format(&quot;Unsafe JavaScript attempt to access frame &quot;
&gt; +        &quot;with URL %s from frame with URL %s. &quot;
&gt; +        &quot;Domains, protocols and ports must match.\n&quot;,
&gt; +        targetDocument-&gt;url().string().utf8().data(),
&gt; +        sourceDocument-&gt;url().string().utf8().data());

When indenting within a parenthesized expression, indent to the (.

&gt; +
&gt; +    // Build a console message with fake source ID and line number.
&gt; +    const String kSourceID = &quot;&quot;;
&gt; +    const int kLineNumber = 1;
&gt; +    JavaScriptConsoleMessage message(str, kSourceID, kLineNumber);
&gt; +
&gt; +    if (delay == REPORT_NOW) {
&gt; +        // NOTE(tc): Apple prints the message in the target page, but it seems like

I think (tc) is an alias, so we can remove that, and it should probably say &quot;Safari&quot; instead of Apple.



&gt; +bool V8Proxy::handleOutOfMemory()
&gt; +{
...
&gt; +    if (proxy) {
&gt; +        // Clean m_context, and event handlers.
&gt; +        proxy-&gt;clearForClose();
&gt; +        // Destroy the global object.
&gt; +        proxy-&gt;destroyGlobal();

&quot;Destroy the global object.&quot; seems too obvious to have as a comment but leave a blank line to separate from the other commented item.


&gt; +        // Isolate exceptions that occur when executing the code.  These
&gt; +        // exceptions should not interfere with javascript code we might
&gt; +        // evaluate from C++ when returning from here
Add &quot;.&quot;

&gt; +
&gt; +        // Evaluating the JavaScript could cause the frame to be deallocated,
&gt; +        // so we start the keep alive timer here.
&gt; +        // Frame::keepAlive method adds the ref count of the frame and sets a
&gt; +        // timer to decrease the ref count. It assumes that the current JavaScript
&gt; +        // execution finishs before firing the timer.
s/finishs/finishes/

&gt; +        // See issue 1218756 and 914430.
s/issue/issues/  These are internal bug numbers so it is odd to keep them here but maybe they are good for reference.  Ask around and see what people think should be done with this.

&gt; +v8::Local&lt;v8::Value&gt; V8Proxy::callFunction(v8::Handle&lt;v8::Function&gt; function, v8::Handle&lt;v8::Object&gt; receiver, int argc, v8::Handle&lt;v8::Value&gt; args[])
&gt; +{
...
&gt; +        // Evaluating the JavaScript could cause the frame to be deallocated,
&gt; +        // so we start the keep alive timer here.
&gt; +        // Frame::keepAlive method adds the ref count of the frame and sets a
&gt; +        // timer to decrease the ref count. It assumes that the current JavaScript
&gt; +        // execution finishs before firing the timer.
&gt; +        // See issue 1218756 and 914430.

Same code comment as before with the same issues.


&gt; +v8::Local&lt;v8::Value&gt; V8Proxy::newInstance(v8::Handle&lt;v8::Function&gt; constructor, int argc, v8::Handle&lt;v8::Value&gt; args[])
&gt; +{
...
&gt; +        // See comment in V8Proxy::callFunction.

I&apos;m happy the comment isn&apos;t here again, but maybe we can reduce the two copies to one using a technique like this :)


&gt; +
&gt; +v8::Persistent&lt;v8::FunctionTemplate&gt; V8Proxy::getTemplate(V8ClassIndex::V8WrapperType type)
&gt; +{
&gt; +    v8::Persistent&lt;v8::FunctionTemplate&gt;* cacheCell = V8ClassIndex::GetCache(type);
&gt; +    if (!(*cacheCell).IsEmpty())

The more typical way to write this would be: 
    if (!cacheCell-&gt;IsEmpty())

&gt; +
&gt; +    // not found

How about &quot;Not in the cache.&quot;


&gt; +void V8Proxy::clearForNavigation()
&gt; +{
&gt; +    // disconnect all event listeners
&gt; +    disconnectEventListeners();

Remove comment.

&gt; +void V8Proxy::setSecurityToken()
&gt; +{
&gt; +    Document* document = m_frame-&gt;document();
&gt; +    // Setup security origin and security token
Add &quot;.&quot;


&gt; +v8::Persistent&lt;v8::Context&gt; V8Proxy::createNewContext(v8::Handle&lt;v8::Object&gt; global)
&gt; +{

&gt; +    const char** extensionNames = new const char*[m_extensions.size()];

Make this a OwnArrayPtr (and get rid of the &quot;delete[] extensionNames&quot;).

&gt; +void V8Proxy::initContextIfNeeded()
&gt; +{
...
&gt; +    DEFINE_STATIC_LOCAL(bool, isV8Initialized, (false));

You really only need to use &quot;DEFINE_STATIC_LOCAL&quot; when you have a class (something with a destructor).  For bool&apos;s, int&apos;s etc., just define them like usual.
There may have been other instances of this, so just take this comment to apply to all of them.

&gt; +
&gt; +    // Store the first global object created so we can reuse it.
&gt; +    if (m_global.IsEmpty()) {
&gt; +        m_global = v8::Persistent&lt;v8::Object&gt;::New(v8Context-&gt;Global());
&gt; +        // Bail out if allocation of the first global objects fails.
&gt; +        if (m_global.IsEmpty()) {
&gt; +          disposeContextHandles();
&gt; +          return;

Fix indentation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128338</commentid>
    <comment_count>7</comment_count>
      <attachid>31893</attachid>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2009-06-25 17:21:59 -0700</bug_when>
    <thetext>Created attachment 31893
patch5

batchConfigure{Constants,Attributes} are used outside of V8Proxy.cpp, so leaving them non-static.

Merged in another revision to v8_proxy.cpp downstream as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128392</commentid>
    <comment_count>8</comment_count>
      <attachid>31893</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-06-25 22:25:30 -0700</bug_when>
    <thetext>Comment on attachment 31893
patch5

I think it has made huge progress and we should land it.

Please fix this *before* landing (just fix it and land it *without* uploading another patch):

  &gt; WebCore/bindings/v8/V8DOMMap.cpp

   Has unresolved conflict in it at line 495.





Ideally we&apos;d have a *subsequent* patch to fix the following few things:  (Please *don&apos;t* update this patch with these fixes.)
  
  &gt; WebCore/bindings/v8/V8Proxy.cpp


  1. Finish getting rid of USE_VAR and replace with UNUSED_PARAM.
  2. In all classes, public: protected: private: shouldn&apos;t be indented.
  3. In class GrouperItem,
     a. the variable names need to have this m_style
     b. group_id should be groupId (for the method and variable)
     c. For the constructor: &quot;Each member (and superclass) should be indented on a separate line&quot;
  4. In several of the class the functions have braces at the end of line.
  5. In ObjectGrouperVisitor::visitDOMWrapper
     a. typo &quot;elment&quot;
     b. braces around single line statement
  6. ObjectGrouperVisitor::grouper_ naming.
  7. JavaScriptConsoleMessage::JavaScriptConsoleMessage constructor braces are too indented.
  8. ConsoleMessageManager::processDelayedMessages braces on single line statement.
  9. There are several places that do the two spaces before end of line comments (should be one) -- search for &quot;;  //&quot;
  10. V8Proxy::setContextDebugId has end of line brace.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128825</commentid>
    <comment_count>9</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-06-29 09:40:42 -0700</bug_when>
    <thetext>We&apos;re going to have to roll this one out, because we&apos;re having problems reconciling this downstream.

For big pieces of the puzzle like this:

1) Let&apos;s first land the code upstream, however ugly it is (look at V8Index!) and switch over to using it downstream.

2) Refactor for code style upstream.

I know this means we&apos;ll have non-conforming code in the WebKit tree, but it&apos;s temporary and sure beats struggling with keeping up with changes while refactoring, struggling with landing, then realizing we&apos;ve missed one thing and having to revert both sides.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128844</commentid>
    <comment_count>10</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-06-29 11:14:26 -0700</bug_when>
    <thetext>We&apos;ve talked and despite our better judgement, we&apos;re going to try to keep this patch and fix it as-is.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31673</attachid>
            <date>2009-06-22 14:25:51 -0700</date>
            <delta_ts>2009-06-24 13:29:04 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>150476</size>
            <attacher name="Nate Chapin">nate.chapin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDk0MikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMDktMDYtMjIgIE5hdGUgQ2hhcGluICA8amFwaGV0QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBV
cHN0cmVhbSBWOFByb3h5LgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0yNjYyMworCisgICAgICAgICogYmluZGluZ3MvdjgvVjhQcm94eS5jcHA6IFBv
cnRlZCBmcm9tIHN2bi5jaHJvbWl1bS5vcmcgKHNwZWNpZmljIGZ1bmN0aW9uIGVudHJpZXMgcmVt
b3ZlZCBzaW5jZSBpdCdkIGJlIG1hbnkgbGluZXMgb2YgcmVkdW5kYW5jeSkuCisgICAgICAgICog
YmluZGluZ3MvdjgvVjhQcm94eS5oOiBQb3J0ZWQgZnJvbSBzdm4uY2hyb21pdW0ub3JnIChzcGVj
aWZpYyBmdW5jdGlvbiBlbnRyaWVzIHJlbW92ZWQgc2luY2UgaXQnZCBiZSBtYW55IGxpbmVzIG9m
IHJlZHVuZGFuY3kpLgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRp
b25Qcm94eS5jcHA6IENoYW5nZWQgZG9tT2JqZWN0TWFwKCkgcmVmZXJlbmNlcyB0byBnZXRET01P
YmplY3RNYXAoKS4KKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhEYXRhYmFzZUN1c3Rv
bS5jcHA6IFVwZGF0ZWQgI2luY2x1ZGUuCisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4
U1FMUmVzdWx0U2V0Um93TGlzdEN1c3RvbS5jcHA6IFVwZGF0ZWQgI2luY2x1ZGUuCisgICAgICAg
ICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMVHJhbnNhY3Rpb25DdXN0b20uY3BwOiBVcGRhdGVk
ICNpbmNsdWRlLgorCiAyMDA5LTA2LTIyICBTdGV2ZSBGYWxrZW5idXJnICA8c2ZhbGtlbkBhcHBs
ZS5jb20+CiAKICAgICAgICAgV2luZG93cyBidWlsZCBmaXguCkluZGV4OiBXZWJDb3JlL2JpbmRp
bmdzL3Y4L1Y4UHJveHkuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhQ
cm94eS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4UHJveHkuY3Bw
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMyMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDgsIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24u
CisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMg
b2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElT
IiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICog
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiVjhQcm94eS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1
ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8djguaD4KKyNpbmNsdWRlIDx2OC1kZWJ1Zy5oPgorCisj
aW5jbHVkZSAiQ2hyb21pdW1CcmlkZ2UuaCIKKyNpbmNsdWRlICJDU1NNdXRhYmxlU3R5bGVEZWNs
YXJhdGlvbi5oIgorI2luY2x1ZGUgIkRPTU9iamVjdHNJbmNsdWRlLmgiCisjaW5jbHVkZSAiRG9j
dW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJTY3JpcHRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAi
VjhCaW5kaW5nLmgiCisjaW5jbHVkZSAiVjhDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiVjhDdXN0
b21CaW5kaW5nLmgiCisjaW5jbHVkZSAiVjhET01NYXAuaCIKKyNpbmNsdWRlICJWOERPTVdpbmRv
dy5oIgorI2luY2x1ZGUgIlY4SW5kZXguaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBT
dGF0aWMgdXRpbGl0eSBjb250ZXh0Lgordjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IFY4UHJv
eHk6Om1fdXRpbGl0eUNvbnRleHQ7CisKKy8vIFN0YXRpYyBsaXN0IG9mIHJlZ2lzdGVyZWQgZXh0
ZW5zaW9ucworVjhFeHRlbnNpb25MaXN0IFY4UHJveHk6Om1fZXh0ZW5zaW9uczsKKworLy8gc3Rh
dGljCitjb25zdCBjaGFyKiBWOFByb3h5OjprQ29udGV4dERlYnVnRGF0YVR5cGUgPSAidHlwZSI7
Citjb25zdCBjaGFyKiBWOFByb3h5OjprQ29udGV4dERlYnVnRGF0YVZhbHVlID0gInZhbHVlIjsK
KworI2lmbmRlZiBOREVCVUcKKy8vIEtlZXBzIHRyYWNrIG9mIGdsb2JhbCBoYW5kbGVzIGNyZWF0
ZWQgKG5vdCBKUyB3cmFwcGVycworLy8gb2YgRE9NIG9iamVjdHMpLiBPZnRlbiB0aGVzZSBnbG9i
YWwgaGFuZGxlcyBhcmUgc291cmNlCisvLyBvZiBsZWFrcy4KKy8vCisvLyBJZiB5b3Ugd2FudCB0
byBsZXQgYSBDKysgb2JqZWN0IGhvbGQgYSBwZXJzaXN0ZW50IGhhbmRsZQorLy8gdG8gYSBKUyBv
YmplY3QsIHlvdSBzaG91bGQgcmVnaXN0ZXIgdGhlIGhhbmRsZSBoZXJlIHRvCisvLyBrZWVwIHRy
YWNrIG9mIGxlYWtzLgorLy8KKy8vIFdoZW4gY3JlYXRpbmcgYSBwZXJzaXN0ZW50IGhhbmRsZSwg
Y2FsbDoKKy8vCisvLyAjaWZuZGVmIE5ERUJVRworLy8gICAgVjhQcm94eTo6UmVnaXN0ZXJHbG9i
YWxIYW5kbGUodHlwZSwgaG9zdCwgaGFuZGxlKTsKKy8vICNlbmRpZgorLy8KKy8vIFdoZW4gcmVs
ZWFzaW5nIHRoZSBoYW5kbGUsIGNhbGw6CisvLworLy8gI2lmbmRlZiBOREVCVUcKKy8vICAgIFY4
UHJveHk6OlVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodHlwZSwgaG9zdCwgaGFuZGxlKTsKKy8vICNl
bmRpZgorLy8KK3R5cGVkZWYgSGFzaE1hcDx2ODo6VmFsdWUqLCBHbG9iYWxIYW5kbGVJbmZvKj4g
R2xvYmFsSGFuZGxlTWFwOworCitzdGF0aWMgR2xvYmFsSGFuZGxlTWFwJiBnbG9iYWxIYW5kbGVN
YXAoKQoreworICAgIHN0YXRpYyBHbG9iYWxIYW5kbGVNYXAgc3RhdGljR2xvYmFsSGFuZGxlTWFw
OworICAgIHJldHVybiBzdGF0aWNHbG9iYWxIYW5kbGVNYXA7Cit9CisKKworLy8gVGhlIFVTRV9W
QVIoeCkgdGVtcGxhdGUgaXMgdXNlZCB0byBzaWxlbmNlIEMrKyBjb21waWxlciB3YXJuaW5ncwor
Ly8gaXNzdWVkIGZvciB1bnVzZWQgdmFyaWFibGVzICh0eXBpY2FsbHkgcGFyYW1ldGVycyBvciB2
YWx1ZXMgdGhhdAorLy8gd2Ugd2FudCB0byB3YXRjaCBpbiB0aGUgZGVidWdnZXIpLgordGVtcGxh
dGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIHZvaWQgVVNFX1ZBUihUKSB7IH0KKworLy8g
VGhlIGZ1bmN0aW9uIGlzIHRoZSBwbGFjZSB0byBzZXQgdGhlIGJyZWFrIHBvaW50IHRvIGluc3Bl
Y3QKKy8vIGxpdmUgZ2xvYmFsIGhhbmRsZXMuIExlYWtzIGFyZSBvZnRlbiBjb21lIGZyb20gbGVh
a2VkIGdsb2JhbCBoYW5kbGVzLgorc3RhdGljIHZvaWQgRW51bWVyYXRlR2xvYmFsSGFuZGxlcygp
Cit7CisgICAgZm9yIChHbG9iYWxIYW5kbGVNYXA6Oml0ZXJhdG9yIGl0ID0gZ2xvYmFsSGFuZGxl
TWFwKCkuYmVnaW4oKSwgZW5kID0gZ2xvYmFsSGFuZGxlTWFwKCkuZW5kKCk7IGl0ICE9IGVuZDsg
KytpdCkgeworICAgICAgICBHbG9iYWxIYW5kbGVJbmZvKiBpbmZvID0gaXQtPnNlY29uZDsKKyAg
ICAgICAgVVNFX1ZBUihpbmZvKTsKKyAgICAgICAgdjg6OlZhbHVlKiBoYW5kbGUgPSBpdC0+Zmly
c3Q7CisgICAgICAgIFVTRV9WQVIoaGFuZGxlKTsKKyAgICB9Cit9CisKK3ZvaWQgVjhQcm94eTo6
UmVnaXN0ZXJHbG9iYWxIYW5kbGUoR2xvYmFsSGFuZGxlVHlwZSB0eXBlLCB2b2lkKiBob3N0LCB2
ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IGhhbmRsZSkKK3sKKyAgICBBU1NFUlQoIWdsb2JhbEhh
bmRsZU1hcCgpLmNvbnRhaW5zKCpoYW5kbGUpKTsKKyAgICBnbG9iYWxIYW5kbGVNYXAoKS5zZXQo
KmhhbmRsZSwgbmV3IEdsb2JhbEhhbmRsZUluZm8oaG9zdCwgdHlwZSkpOworfQorCisKK3ZvaWQg
VjhQcm94eTo6VW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh2b2lkKiBob3N0LCB2ODo6UGVyc2lzdGVu
dDx2ODo6VmFsdWU+IGhhbmRsZSkKK3sKKyAgICBBU1NFUlQoZ2xvYmFsSGFuZGxlTWFwKCkuY29u
dGFpbnMoKmhhbmRsZSkpOworICAgIEdsb2JhbEhhbmRsZUluZm8qIGluZm8gPSBnbG9iYWxIYW5k
bGVNYXAoKS50YWtlKCpoYW5kbGUpOworICAgIEFTU0VSVChpbmZvLT5ob3N0XyA9PSBob3N0KTsK
KyAgICBkZWxldGUgaW5mbzsKK30KKyNlbmRpZiAgLy8gaWZuZGVmIE5ERUJVRworCit2b2lkIEJh
dGNoQ29uZmlndXJlQXR0cmlidXRlcyh2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5z
dCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+IHByb3RvLCBjb25zdCBCYXRjaGVkQXR0
cmlidXRlKiBhdHRycywgc2l6ZV90IG51bV9hdHRycykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IG51bV9hdHRyczsgKytpKSB7CisgICAgICAgIGNvbnN0IEJhdGNoZWRBdHRyaWJ1dGUq
IGEgPSAmYXR0cnNbaV07CisgICAgICAgIChhLT5vbl9wcm90byA/IHByb3RvIDogaW5zdCktPlNl
dEFjY2Vzc29yKHY4OjpTdHJpbmc6Ok5ldyhhLT5uYW1lKSwKKyAgICAgICAgICAgIGEtPmdldHRl
ciwKKyAgICAgICAgICAgIGEtPnNldHRlciwKKyAgICAgICAgICAgIGEtPmRhdGEgPT0gVjhDbGFz
c0luZGV4OjpJTlZBTElEX0NMQVNTX0lOREVYID8gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCkgOiB2
ODo6SW50ZWdlcjo6TmV3KFY4Q2xhc3NJbmRleDo6VG9JbnQoYS0+ZGF0YSkpLAorICAgICAgICAg
ICAgYS0+c2V0dGluZ3MsCisgICAgICAgICAgICBhLT5hdHRyaWJ1dGUpOworICAgIH0KK30KKwor
dm9pZCBCYXRjaENvbmZpZ3VyZUNvbnN0YW50cyh2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBs
YXRlPiBkZXNjLCB2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4gcHJvdG8sIGNvbnN0IEJh
dGNoZWRDb25zdGFudCogY29uc3RzLCBzaXplX3QgbnVtX2NvbnN0cykKK3sKKyAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IG51bV9jb25zdHM7ICsraSkgeworICAgICAgICBjb25zdCBCYXRjaGVk
Q29uc3RhbnQqIGMgPSAmY29uc3RzW2ldOworICAgICAgICBkZXNjLT5TZXQodjg6OlN0cmluZzo6
TmV3KGMtPm5hbWUpLCB2ODo6SW50ZWdlcjo6TmV3KGMtPnZhbHVlKSwgdjg6OlJlYWRPbmx5KTsK
KyAgICAgICAgcHJvdG8tPlNldCh2ODo6U3RyaW5nOjpOZXcoYy0+bmFtZSksIHY4OjpJbnRlZ2Vy
OjpOZXcoYy0+dmFsdWUpLCB2ODo6UmVhZE9ubHkpOworICAgIH0KK30KKwordHlwZWRlZiBIYXNo
TWFwPE5vZGUqLCB2ODo6T2JqZWN0Kj4gRE9NTm9kZU1hcDsKK3R5cGVkZWYgSGFzaE1hcDx2b2lk
Kiwgdjg6Ok9iamVjdCo+IERPTU9iamVjdE1hcDsKKworI2lmbmRlZiBOREVCVUcKK3N0YXRpYyB2
b2lkIEVudW1lcmF0ZURPTU9iamVjdE1hcChET01PYmplY3RNYXAmIHdyYXBwZXJfbWFwKQorewor
ICAgIGZvciAoRE9NT2JqZWN0TWFwOjppdGVyYXRvciBpdCA9IHdyYXBwZXJfbWFwLmJlZ2luKCks
IGVuZCA9IHdyYXBwZXJfbWFwLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgdjg6
OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gd3JhcHBlcihpdC0+c2Vjb25kKTsKKyAgICAgICAgVjhD
bGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFwcGVyVHlw
ZSh3cmFwcGVyKTsKKyAgICAgICAgdm9pZCogb2JqID0gaXQtPmZpcnN0OworICAgICAgICBVU0Vf
VkFSKHR5cGUpOworICAgICAgICBVU0VfVkFSKG9iaik7CisgICAgfQorfQorCisKK3N0YXRpYyB2
b2lkIEVudW1lcmF0ZURPTU5vZGVNYXAoRE9NTm9kZU1hcCYgbm9kZU1hcCkKK3sKKyAgICBmb3Ig
KERPTU5vZGVNYXA6Oml0ZXJhdG9yIGl0ID0gbm9kZU1hcC5iZWdpbigpLCBlbmQgPSBub2RlTWFw
LmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgTm9kZSogbm9kZSA9IGl0LT5maXJz
dDsKKyAgICAgICAgVVNFX1ZBUihub2RlKTsKKyAgICAgICAgQVNTRVJUKHY4OjpQZXJzaXN0ZW50
PHY4OjpPYmplY3Q+KGl0LT5zZWNvbmQpLklzV2VhaygpKTsKKyAgICB9Cit9CisjZW5kaWYgIC8v
IE5ERUJVRworCisjaWYgRU5BQkxFKFNWRykKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5
OjpTVkdFbGVtZW50SW5zdGFuY2VUb1Y4T2JqZWN0KFNWR0VsZW1lbnRJbnN0YW5jZSogaW5zdGFu
Y2UpCit7CisgICAgaWYgKCFpbnN0YW5jZSkKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisK
KyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGV4aXN0aW5nX2luc3RhbmNlID0gZ2V0RE9NU1ZH
RWxlbWVudEluc3RhbmNlTWFwKCkuZ2V0KGluc3RhbmNlKTsKKyAgICBpZiAoIWV4aXN0aW5nX2lu
c3RhbmNlLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGV4aXN0aW5nX2luc3RhbmNlOworCisg
ICAgaW5zdGFuY2UtPnJlZigpOworCisgICAgLy8gSW5zdGFudGlhdGUgdGhlIFY4IG9iamVjdCBh
bmQgcmVtZW1iZXIgaXQKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJlc3VsdCA9IEluc3Rh
bnRpYXRlVjhPYmplY3QoVjhDbGFzc0luZGV4OjpTVkdFTEVNRU5USU5TVEFOQ0UsIFY4Q2xhc3NJ
bmRleDo6U1ZHRUxFTUVOVElOU1RBTkNFLCBpbnN0YW5jZSk7CisgICAgaWYgKCFyZXN1bHQuSXNF
bXB0eSgpKSB7CisgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBET00gU1ZHIGVsZW1lbnQgbWFw
IGlmIHRoZSByZXN1bHQgaXMgbm9uLWVtcHR5LgorICAgICAgICBnZXRET01TVkdFbGVtZW50SW5z
dGFuY2VNYXAoKS5zZXQoaW5zdGFuY2UsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXco
cmVzdWx0KSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIE1hcCBvZiBTVkcg
b2JqZWN0cyB3aXRoIGNvbnRleHRzIHRvIHRoZWlyIGNvbnRleHRzCitzdGF0aWMgSGFzaE1hcDx2
b2lkKiwgU1ZHRWxlbWVudCo+JiBzdmdPYmplY3RUb0NvbnRleHRNYXAoKQoreworICAgIHN0YXRp
YyBIYXNoTWFwPHZvaWQqLCBTVkdFbGVtZW50Kj4gc3RhdGljU3ZnT2JqZWN0VG9Db250ZXh0TWFw
OworICAgIHJldHVybiBzdGF0aWNTdmdPYmplY3RUb0NvbnRleHRNYXA7Cit9CisKK3Y4OjpIYW5k
bGU8djg6OlZhbHVlPiBWOFByb3h5OjpTVkdPYmplY3RXaXRoQ29udGV4dFRvVjhPYmplY3QoVjhD
bGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHZvaWQqIG9iamVjdCkKK3sKKyAgICBpZiAo
IW9iamVjdCkKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICB2ODo6UGVyc2lzdGVu
dDx2ODo6T2JqZWN0PiByZXN1bHQgPSBnZXRET01TVkdPYmplY3RXaXRoQ29udGV4dE1hcCgpLmdl
dChvYmplY3QpOworICAgIGlmICghcmVzdWx0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHJl
c3VsdDsKKworICAgIC8vIFNwZWNpYWwgY2FzZTogU1ZHUGF0aFNlZ3MgbmVlZCB0byBiZSBkb3du
Y2FzdCB0byB0aGVpciByZWFsIHR5cGUKKyAgICBpZiAodHlwZSA9PSBWOENsYXNzSW5kZXg6OlNW
R1BBVEhTRUcpCisgICAgICAgIHR5cGUgPSBWOEN1c3RvbTo6RG93bmNhc3RTVkdQYXRoU2VnKG9i
amVjdCk7CisKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhvYmogPSBJbnN0YW50aWF0ZVY4
T2JqZWN0KHR5cGUsIHR5cGUsIG9iamVjdCk7CisgICAgaWYgKCF2OG9iai5Jc0VtcHR5KCkpIHsK
KyAgICAgIHJlc3VsdCA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcodjhvYmopOwor
ICAgICAgc3dpdGNoICh0eXBlKSB7CisjZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBOQU1FKSAgICAg
XAorICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OlRZUEU6IHN0YXRpY19jYXN0PE5BTUUqPihvYmpl
Y3QpLT5yZWYoKTsgYnJlYWs7CisgICAgICBTVkdfT0JKRUNUX1RZUEVTKE1BS0VfQ0FTRSkKKyN1
bmRlZiBNQUtFX0NBU0UKKyNkZWZpbmUgTUFLRV9DQVNFKFRZUEUsIE5BTUUpICAgICBcCisgICAg
ICBjYXNlIFY4Q2xhc3NJbmRleDo6VFlQRTogICAgXAorICAgICAgICAgIHN0YXRpY19jYXN0PFY4
U1ZHUE9EVHlwZVdyYXBwZXI8TkFNRT4qPihvYmplY3QpLT5yZWYoKTsgYnJlYWs7CisgICAgICBT
VkdfUE9EX05BVElWRV9UWVBFUyhNQUtFX0NBU0UpCisjdW5kZWYgTUFLRV9DQVNFCisgICAgICBk
ZWZhdWx0OgorICAgICAgICAgIEFTU0VSVChmYWxzZSk7CisgICAgICB9CisgICAgICBnZXRET01T
VkdPYmplY3RXaXRoQ29udGV4dE1hcCgpLnNldChvYmplY3QsIHJlc3VsdCk7CisgIH0KKworICBy
ZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFY4UHJveHk6OlNldFNWR0NvbnRleHQodm9pZCogb2Jq
LCBTVkdFbGVtZW50KiBjb250ZXh0KQoreworICAgIGlmIChvYmogPT0gTlVMTCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgU1ZHRWxlbWVudCogb2xkQ29udGV4dCA9IHN2Z09iamVjdFRvQ29udGV4
dE1hcCgpLmdldChvYmopOworCisgICAgaWYgKG9sZENvbnRleHQgPT0gY29udGV4dCkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgaWYgKG9sZENvbnRleHQpCisgICAgICAgIG9sZENvbnRleHQtPmRl
cmVmKCk7CisKKyAgICBpZiAoY29udGV4dCkKKyAgICAgICAgY29udGV4dC0+cmVmKCk7CisKKyAg
ICBzdmdPYmplY3RUb0NvbnRleHRNYXAoKS5zZXQob2JqLCBjb250ZXh0KTsKK30KKworU1ZHRWxl
bWVudCogVjhQcm94eTo6R2V0U1ZHQ29udGV4dCh2b2lkKiBvYmopCit7CisgICAgcmV0dXJuIHN2
Z09iamVjdFRvQ29udGV4dE1hcCgpLmdldChvYmopOworfQorCisjZW5kaWYKKworLy8gQSBtYXAg
ZnJvbSBhIERPTSBub2RlIHRvIGl0cyBKUyB3cmFwcGVyLCB0aGUgd3JhcHBlcgorLy8gaXMga2Vw
dCBhcyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gc3Vydml2ZSBHQ3MuCitzdGF0aWMgRE9NT2JqZWN0
TWFwJiBnY1Byb3RlY3RlZE1hcCgpIHsKKyAgICBzdGF0aWMgRE9NT2JqZWN0TWFwIHN0YXRpY0dj
UHJvdGVjdGVkTWFwOworICAgIHJldHVybiBzdGF0aWNHY1Byb3RlY3RlZE1hcDsKK30KKworLy8g
c3RhdGljCit2b2lkIFY4UHJveHk6OkdDUHJvdGVjdCh2b2lkKiBkb21PYmplY3QpCit7CisgICAg
aWYgKCFkb21PYmplY3QpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoZ2NQcm90ZWN0ZWRNYXAo
KS5jb250YWlucyhkb21PYmplY3QpKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFnZXRET01P
YmplY3RNYXAoKS5jb250YWlucyhkb21PYmplY3QpKQorICAgICAgICByZXR1cm47CisKKyAgICAv
LyBDcmVhdGUgYSBuZXcgKHN0cm9uZykgcGVyc2lzdGVudCBoYW5kbGUgZm9yIHRoZSBvYmplY3Qu
CisgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gd3JhcHBlciA9IGdldERPTU9iamVjdE1h
cCgpLmdldChkb21PYmplY3QpOworICAgIGlmICh3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgZ2NQcm90ZWN0ZWRNYXAoKS5zZXQoZG9tT2JqZWN0LCAqdjg6OlBlcnNp
c3RlbnQ8djg6Ok9iamVjdD46Ok5ldyh3cmFwcGVyKSk7Cit9CisKKworLy8gc3RhdGljCit2b2lk
IFY4UHJveHk6OkdDVW5wcm90ZWN0KHZvaWQqIGRvbU9iamVjdCkKK3sKKyAgICBpZiAoIWRvbU9i
amVjdCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghZ2NQcm90ZWN0ZWRNYXAoKS5jb250YWlu
cyhkb21PYmplY3QpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBEaXNwb3NlIHRoZSBzdHJv
bmcgcmVmZXJlbmNlLgorICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdyYXBwZXIoZ2NQ
cm90ZWN0ZWRNYXAoKS50YWtlKGRvbU9iamVjdCkpOworICAgIHdyYXBwZXIuRGlzcG9zZSgpOwor
fQorCisKKy8vIENyZWF0ZSBvYmplY3QgZ3JvdXBzIGZvciBET00gdHJlZSBub2Rlcy4KK3N0YXRp
YyB2b2lkIEdDUHJvbG9ndWUoKQoreworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKworI2lm
bmRlZiBOREVCVUcKKyAgICBFbnVtZXJhdGVET01PYmplY3RNYXAoZ2V0RE9NT2JqZWN0TWFwKCku
aW1wbCgpKTsKKyNlbmRpZgorCisgICAgLy8gUnVuIHRocm91Z2ggYWxsIG9iamVjdHMgd2l0aCBw
b3NzaWJsZSBwZW5kaW5nIGFjdGl2aXR5IG1ha2luZyB0aGVpcgorICAgIC8vIHdyYXBwZXJzIG5v
biB3ZWFrIGlmIHRoZXJlIGlzIHBlbmRpbmcgYWN0aXZpdHkuCisgICAgRE9NT2JqZWN0TWFwIGFj
dGl2ZU1hcCA9IGdldEFjdGl2ZURPTU9iamVjdE1hcCgpLmltcGwoKTsKKyAgICBmb3IgKERPTU9i
amVjdE1hcDo6aXRlcmF0b3IgaXQgPSBhY3RpdmVNYXAuYmVnaW4oKSwgZW5kID0gYWN0aXZlTWFw
LmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgdm9pZCogb2JqID0gaXQtPmZpcnN0
OworICAgICAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiB3cmFwcGVyID0gdjg6OlBlcnNp
c3RlbnQ8djg6Ok9iamVjdD4oaXQtPnNlY29uZCk7CisgICAgICAgIEFTU0VSVCh3cmFwcGVyLklz
V2VhaygpKTsKKyAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFBy
b3h5OjpHZXRET01XcmFwcGVyVHlwZSh3cmFwcGVyKTsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7
CisjZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBOQU1FKSAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OlRZUEU6IHsgICAgICAgICAgICAgICAgXAorICAgICAg
ICAgICAgTkFNRSogaW1wbCA9IHN0YXRpY19jYXN0PE5BTUUqPihvYmopOyBcCisgICAgICAgICAg
ICBpZiAoaW1wbC0+aGFzUGVuZGluZ0FjdGl2aXR5KCkpICAgICAgIFwKKyAgICAgICAgICAgICAg
ICB3cmFwcGVyLkNsZWFyV2VhaygpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKyAgICAgICAgQUNU
SVZFX0RPTV9PQkpFQ1RfVFlQRVMoTUFLRV9DQVNFKQorICAgICAgICBkZWZhdWx0OgorICAgICAg
ICAgICAgQVNTRVJUKGZhbHNlKTsKKyN1bmRlZiBNQUtFX0NBU0UKKyAgICAgICAgfQorCisgICAg
ICAgIC8vIEFkZGl0aW9uYWwgaGFuZGxpbmcgb2YgbWVzc2FnZSBwb3J0IGVuc3VyaW5nIHRoYXQg
ZW50YW5nbGVkIHBvcnRzIGFsc28KKyAgICAgICAgLy8gaGF2ZSB0aGVpciB3cmFwcGVycyBlbnRh
bmdsZWQuIFRoaXMgc2hvdWxkIGlkZWFsbHkgYmUgaGFuZGxlZCB3aGVuIHRoZQorICAgICAgICAv
LyBwb3J0cyBhcmUgYWN0dWFsbHkgZW50YW5nbGVkIGluIE1lc3NhZ2VQb3J0OjplbnRhbmdsZSwg
YnV0IHRvIGF2b2lkCisgICAgICAgIC8vIGZvcmtpbmcgTWVzc2FnZVBvcnQuKiB0aGlzIGlzIHBv
c3Rwb25lZCB0byBHQyB0aW1lLiBIYXZpbmcgdGhpcyBwb3N0cG9uZWQKKyAgICAgICAgLy8gaGFz
IHRoZSBkcmF3YmFjayB0aGF0IHRoZSB3cmFwcGVycyBhcmUgImVudGFuZ2xlZC91bmVudGFuZ2xl
ZCIgZm9yIGVhY2gKKyAgICAgICAgLy8gR0MgZXZlbiB0aG91Z2ggdGhlaXIgZW50YWdsZW1lbnQg
bW9zdCBsaWtlbHkgaXMgc3RpbGwgdGhlIHNhbWUuCisgICAgICAgIGlmICh0eXBlID09IFY4Q2xh
c3NJbmRleDo6TUVTU0FHRVBPUlQpIHsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgcG9ydCBhbmQg
aXRzIGVudGFuZ2xlZCBwb3J0LgorICAgICAgICAgICAgTWVzc2FnZVBvcnQqIHBvcnQxID0gc3Rh
dGljX2Nhc3Q8TWVzc2FnZVBvcnQqPihvYmopOworICAgICAgICAgICAgTWVzc2FnZVBvcnQqIHBv
cnQyID0gcG9ydDEtPmxvY2FsbHlFbnRhbmdsZWRQb3J0KCk7DQorDQorICAgICAgICAgICAgLy8g
SWYgd2UgYXJlIHJlbW90ZWx5IGVudGFuZ2xlZCwgdGhlbiBtYXJrIHRoaXMgb2JqZWN0IGFzIHJl
YWNoYWJsZQ0KKyAgICAgICAgICAgIC8vICh3ZSBjYW4ndCBkZXRlcm1pbmUgcmVhY2hhYmlsaXR5
IGRpcmVjdGx5IGFzIHRoZSByZW1vdGUgb2JqZWN0IGlzDQorICAgICAgICAgICAgLy8gb3V0LW9m
LXByb2MpLg0KKyAgICAgICAgICAgIGlmIChwb3J0MS0+aXNFbnRhbmdsZWQoKSAmJiAhcG9ydDIp
DQorICAgICAgICAgICAgICAgIHdyYXBwZXIuQ2xlYXJXZWFrKCk7CisKKyAgICAgICAgICAgIGlm
IChwb3J0MiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gQXMgcG9ydHMgYXJlIGFsd2F5
cyBlbnRhbmdsZWQgaW4gcGFpcnMgb25seSBwZXJmb3JtIHRoZSBlbnRhbmdsZW1lbnQKKyAgICAg
ICAgICAgICAgICAvLyBvbmNlIGZvciBlYWNoIHBhaXIgKHNlZSBBU1NFUlQgaW4gTWVzc2FnZVBv
cnQ6OnVuZW50YW5nbGUoKSkuCisgICAgICAgICAgICAgICAgaWYgKHBvcnQxIDwgcG9ydDIpIHsK
KyAgICAgICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHBvcnQxV3JhcHBlciA9
IFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgcG9ydDEpOwor
ICAgICAgICAgICAgICAgICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcG9ydDJXcmFwcGVyID0g
VjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JULCBwb3J0Mik7Cisg
ICAgICAgICAgICAgICAgICAgIEFTU0VSVChwb3J0MVdyYXBwZXItPklzT2JqZWN0KCkpOworICAg
ICAgICAgICAgICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHBvcnQxV3JhcHBl
ciktPlNldEludGVybmFsRmllbGQoVjhDdXN0b206OmtNZXNzYWdlUG9ydEVudGFuZ2xlZFBvcnRJ
bmRleCwgcG9ydDJXcmFwcGVyKTsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHBvcnQyV3Jh
cHBlci0+SXNPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9i
amVjdD46OkNhc3QocG9ydDJXcmFwcGVyKS0+U2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a01l
c3NhZ2VQb3J0RW50YW5nbGVkUG9ydEluZGV4LCBwb3J0MVdyYXBwZXIpOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRo
ZSB3cmFwcGVyIGVudGFuZ2xlbWVudCB3aGVuIGEgcG9ydCBpcyBub3QgZW50YW5nbGVkLgorICAg
ICAgICAgICAgICAgIGlmIChWOFByb3h5OjpET01PYmplY3RIYXNKU1dyYXBwZXIocG9ydDEpKSB7
CisgICAgICAgICAgICAgICAgICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3cmFwcGVyID0gVjhQ
cm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JULCBwb3J0MSk7CisgICAg
ICAgICAgICAgICAgICAgIEFTU0VSVCh3cmFwcGVyLT5Jc09iamVjdCgpKTsKKyAgICAgICAgICAg
ICAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh3cmFwcGVyKS0+U2V0SW50ZXJu
YWxGaWVsZChWOEN1c3RvbTo6a01lc3NhZ2VQb3J0RW50YW5nbGVkUG9ydEluZGV4LCB2ODo6VW5k
ZWZpbmVkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgIH0KKworICAgIC8vIENyZWF0ZSBvYmplY3QgZ3JvdXBzLgorICAgIHR5cGVkZWYgc3RkOjpw
YWlyPHVpbnRwdHJfdCwgTm9kZSo+IEdyb3VwZXJQYWlyOworICAgIHR5cGVkZWYgVmVjdG9yPEdy
b3VwZXJQYWlyPiBHcm91cGVyTGlzdDsKKworICAgIERPTU5vZGVNYXAgbm9kZU1hcCA9IGdldERP
TU5vZGVNYXAoKS5pbXBsKCk7CisgICAgR3JvdXBlckxpc3QgZ3JvdXBlcjsKKyAgICBncm91cGVy
LnJlc2VydmVDYXBhY2l0eShub2RlTWFwLnNpemUoKSk7CisKKyAgICBmb3IgKERPTU5vZGVNYXA6
Oml0ZXJhdG9yIGl0ID0gbm9kZU1hcC5iZWdpbigpLCBlbmQgPSBub2RlTWFwLmVuZCgpOyBpdCAh
PSBlbmQ7ICsraXQpIHsKKyAgICAgICAgTm9kZSogbm9kZSA9IGl0LT5maXJzdDsKKworICAgICAg
ICAvLyBJZiB0aGUgbm9kZSBpcyBpbiBkb2N1bWVudCwgcHV0IGl0IGluIHRoZSBvd25lckRvY3Vt
ZW50J3Mgb2JqZWN0IGdyb3VwLgorICAgICAgICAvLworICAgICAgICAvLyBJZiBhbiBpbWFnZSBl
bGVtZW50IHdhcyBjcmVhdGVkIGJ5IEphdmFTY3JpcHQgIm5ldyBJbWFnZSIsCisgICAgICAgIC8v
IGl0IGlzIG5vdCBpbiBhIGRvY3VtZW50LiBIb3dldmVyLCBpZiB0aGUgbG9hZCBldmVudCBoYXMg
bm90CisgICAgICAgIC8vIGJlZW4gZmlyZWQgKHN0aWxsIG9ubG9hZGluZyksIGl0IGlzIHRyZWF0
ZWQgYXMgaW4gdGhlIGRvY3VtZW50LgorICAgICAgICAvLworICAgICAgICAvLyBPdGhlcndpc2Us
IHRoZSBub2RlIGlzIHB1dCBpbiBhbiBvYmplY3QgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcm9v
dAorICAgICAgICAvLyBlbG1lbnQgb2YgdGhlIHRyZWUgdG8gd2hpY2ggaXQgYmVsb25ncy4KKyAg
ICAgICAgdWludHB0cl90IGdyb3VwSWQ7CisgICAgICAgIGlmIChub2RlLT5pbkRvY3VtZW50KCkg
fHwgKG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjppbWdUYWcpICYmICFzdGF0aWNfY2FzdDxI
VE1MSW1hZ2VFbGVtZW50Kj4obm9kZSktPmhhdmVGaXJlZExvYWRFdmVudCgpKSkgeworICAgICAg
ICAgICAgZ3JvdXBJZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihub2RlLT5kb2N1bWVu
dCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE5vZGUqIHJvb3QgPSBub2RlOwor
ICAgICAgICAgICAgd2hpbGUgKHJvb3QtPnBhcmVudCgpKQorICAgICAgICAgICAgICAgIHJvb3Qg
PSByb290LT5wYXJlbnQoKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgYWxvbmUg
aW4gaXRzIERPTSB0cmVlIChkb2Vzbid0IGhhdmUgYSBwYXJlbnQgb3IgYW55CisgICAgICAgICAg
ICAvLyBjaGlsZHJlbikgdGhlbiB0aGUgZ3JvdXAgd2lsbCBiZSBmaWx0ZXJlZCBvdXQgbGF0ZXIg
YW55d2F5LgorICAgICAgICAgICAgaWYgKHJvb3QgPT0gbm9kZSAmJiAhbm9kZS0+aGFzQ2hpbGRO
b2RlcygpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBncm91cElk
ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHJvb3QpOworICAgICAgICB9CisgICAgICAg
IGdyb3VwZXIuYXBwZW5kKEdyb3VwZXJQYWlyKGdyb3VwSWQsIG5vZGUpKTsKKyAgICB9CisKKyAg
ICAvLyBHcm91cCBieSBzb3J0aW5nIGJ5IHRoZSBncm91cCBpZC4gIFRoaXMgd2lsbCB1c2UgdGhl
IHN0ZDo6cGFpciBvcGVyYXRvcjwsCisgICAgLy8gd2hpY2ggd2lsbCByZWFsbHkgc29ydCBieSBi
b3RoIHRoZSBncm91cCBpZCBhbmQgdGhlIE5vZGUqLiAgSG93ZXZlciB0aGUKKyAgICAvLyBOb2Rl
KiBpcyBvbmx5IGludm9sdmVkIHRvIHNvcnQgd2l0aGluIGEgZ3JvdXAgaWQsIHNvIGl0IHdpbGwg
YmUgZmluZS4KKyAgICBzdGQ6OnNvcnQoZ3JvdXBlci5iZWdpbigpLCBncm91cGVyLmVuZCgpKTsK
KworICAgIC8vIFRPRE8oZGVhbm0pOiBTaG91bGQgcHJvYmFibHkgd29yayBpbiBpdGVyYXRvcnMg
aGVyZSwgYnV0IGluZGV4ZXMgd2VyZQorICAgIC8vIGVhc2llciBmb3IgbXkgc2ltcGxlIG1pbmQu
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBncm91cGVyLnNpemUoKTsgKSB7CisgICAgICAg
IC8vIFNlZWsgdG8gdGhlIG5leHQga2V5IChvciB0aGUgZW5kIG9mIHRoZSBsaXN0KS4KKyAgICAg
ICAgc2l6ZV90IG5leHRLZXlJbmRleCA9IGdyb3VwZXIuc2l6ZSgpOworICAgICAgICBmb3IgKHNp
emVfdCBqID0gaTsgaiA8IGdyb3VwZXIuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIGlmIChn
cm91cGVyW2ldLmZpcnN0ICE9IGdyb3VwZXJbal0uZmlyc3QpIHsKKyAgICAgICAgICAgICAgbmV4
dEtleUluZGV4ID0gajsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKworICAgICAgICBBU1NFUlQobmV4dEtleUluZGV4ID4gaSk7CisKKyAgICAgICAgLy8g
V2Ugb25seSBjYXJlIGFib3V0IGEgZ3JvdXAgaWYgaXQgaGFzIG1vcmUgdGhhbiBvbmUgb2JqZWN0
LiAgSWYgaXQgb25seQorICAgICAgICAvLyBoYXMgb25lIG9iamVjdCwgaXQgaGFzIG5vdGhpbmcg
ZWxzZSB0aGF0IG5lZWRzIHRvIGJlIGtlcHQgYWxpdmUuCisgICAgICAgIGlmIChuZXh0S2V5SW5k
ZXggLSBpIDw9IDEpIHsKKyAgICAgICAgICAgIGkgPSBuZXh0S2V5SW5kZXg7CisgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIFZlY3Rvcjx2ODo6UGVyc2lzdGVudDx2
ODo6VmFsdWU+ID4gZ3JvdXA7CisgICAgICAgIGdyb3VwLnJlc2VydmVDYXBhY2l0eShuZXh0S2V5
SW5kZXggLSBpKTsKKyAgICAgICAgZm9yICg7IGkgPCBuZXh0S2V5SW5kZXg7ICsraSkgeworICAg
ICAgICAgICAgTm9kZSogbm9kZSA9IGdyb3VwZXJbaV0uc2Vjb25kOworICAgICAgICAgICAgdjg6
OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB3cmFwcGVyID0gZ2V0RE9NTm9kZU1hcCgpLmdldChub2Rl
KTsKKyAgICAgICAgICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpCisgICAgICAgICAgICAgICAg
Z3JvdXAuYXBwZW5kKHdyYXBwZXIpOworICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgc3R5
bGVkIGFuZCB0aGVyZSBpcyBhIHdyYXBwZXIgZm9yIHRoZSBpbmxpbmUKKyAgICAgICAgICAgIC8v
IHN0eWxlIGRlY2xhcmF0aW9uLCB3ZSBuZWVkIHRvIGtlZXAgdGhhdCBzdHlsZSBkZWNsYXJhdGlv
bgorICAgICAgICAgICAgLy8gd3JhcHBlciBhbGl2ZSBhcyB3ZWxsLCBzbyB3ZSBhZGQgaXQgdG8g
dGhlIG9iamVjdCBncm91cC4KKyAgICAgICAgICAgIGlmIChub2RlLT5pc1N0eWxlZEVsZW1lbnQo
KSkgeworICAgICAgICAgICAgICAgIFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQgPSByZWludGVycHJl
dF9jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKTsKKyAgICAgICAgICAgICAgICBDU1NTdHlsZURl
Y2xhcmF0aW9uKiBzdHlsZSA9IGVsZW1lbnQtPmlubGluZVN0eWxlRGVjbCgpOworICAgICAgICAg
ICAgICAgIGlmIChzdHlsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIg
PSBnZXRET01PYmplY3RNYXAoKS5nZXQoc3R5bGUpOworICAgICAgICAgICAgICAgICAgICBpZiAo
IXdyYXBwZXIuSXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAuYXBwZW5k
KHdyYXBwZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
CisgICAgICAgIGlmIChncm91cC5zaXplKCkgPiAxKQorICAgICAgICAgICAgdjg6OlY4OjpBZGRP
YmplY3RHcm91cCgmZ3JvdXBbMF0sIGdyb3VwLnNpemUoKSk7CisKKyAgICAgICAgQVNTRVJUKGkg
PT0gbmV4dEtleUluZGV4KTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgR0NFcGlsb2d1ZSgp
Cit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworCisgICAgLy8gUnVuIHRocm91Z2ggYWxs
IG9iamVjdHMgd2l0aCBwZW5kaW5nIGFjdGl2aXR5IG1ha2luZyB0aGVpciB3cmFwcGVycyB3ZWFr
IGFnYWluLgorICAgIERPTU9iamVjdE1hcCBhY3RpdmVNYXAgPSBnZXRBY3RpdmVET01PYmplY3RN
YXAoKS5pbXBsKCk7CisgICAgZm9yIChET01PYmplY3RNYXA6Oml0ZXJhdG9yIGl0ID0gYWN0aXZl
TWFwLmJlZ2luKCksIGVuZCA9IGFjdGl2ZU1hcC5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Cisg
ICAgICAgIHZvaWQqIG9iaiA9IGl0LT5maXJzdDsKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6
Ok9iamVjdD4gd3JhcHBlciA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+KGl0LT5zZWNvbmQp
OworICAgICAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IFY4UHJveHk6Okdl
dERPTVdyYXBwZXJUeXBlKHdyYXBwZXIpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyNkZWZp
bmUgTUFLRV9DQVNFKFRZUEUsIE5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpUWVBFOiB7ICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTkFNRSogaW1wbCA9IHN0YXRp
Y19jYXN0PE5BTUUqPihvYmopOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlm
IChpbXBsLT5oYXNQZW5kaW5nQWN0aXZpdHkoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgICAgICAgICAgICAgQVNTRVJUKCF3cmFwcGVyLklzV2VhaygpKTsgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdyYXBwZXIuTWFrZVdlYWsoaW1wbCwg
JndlYWtBY3RpdmVET01PYmplY3RDYWxsYmFjayk7IFwKKyAgICAgICAgICAgIH0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAg
ICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXAorICAgICAgICB9CisgICAgICAgIEFDVElWRV9ET01fT0JKRUNUX1RZUEVTKE1BS0Vf
Q0FTRSkKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVChmYWxzZSk7CisjdW5k
ZWYgTUFLRV9DQVNFCisgICAgICAgIH0KKyAgICB9CisKKyNpZm5kZWYgTkRFQlVHCisgICAgLy8g
Q2hlY2sgYWxsIHN1cnZpdmFscyBhcmUgd2Vhay4KKyAgICBFbnVtZXJhdGVET01PYmplY3RNYXAo
Z2V0RE9NT2JqZWN0TWFwKCkuaW1wbCgpKTsKKyAgICBFbnVtZXJhdGVET01Ob2RlTWFwKGdldERP
TU5vZGVNYXAoKS5pbXBsKCkpOworICAgIEVudW1lcmF0ZURPTU9iamVjdE1hcChnY1Byb3RlY3Rl
ZE1hcCgpKTsKKyAgICBFbnVtZXJhdGVHbG9iYWxIYW5kbGVzKCk7CisjdW5kZWYgVVNFX1ZBUgor
I2VuZGlmCit9CisKKwordHlwZWRlZiBIYXNoTWFwPGludCwgdjg6OkZ1bmN0aW9uVGVtcGxhdGUq
PiBGdW5jdGlvblRlbXBsYXRlTWFwOworCitib29sIEFsbG93QWxsb2NhdGlvbjo6bV9jdXJyZW50
ID0gZmFsc2U7CisKKworLy8gSmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlcyBlbmNhcHN1bGF0ZSBl
dmVyeXRoaW5nIG5lZWRlZCB0bworLy8gbG9nIG1lc3NhZ2VzIG9yaWdpbmF0aW5nIGZyb20gSmF2
YVNjcmlwdCB0byB0aGUgQ2hyb21lIGNvbnNvbGUuCitjbGFzcyBKYXZhU2NyaXB0Q29uc29sZU1l
c3NhZ2UgeworcHVibGljOgorICAgIEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZShjb25zdCBTdHJp
bmcmIHN0ciwgY29uc3QgU3RyaW5nJiBzb3VyY2VJRCwgdW5zaWduZWQgbGluZU51bWJlcikKKyAg
ICAgICAgOiBtX3N0cmluZyhzdHIpCisgICAgICAgICwgbV9zb3VyY2VJRChzb3VyY2VJRCkKKyAg
ICAgICAgLCBtX2xpbmVOdW1iZXIobGluZU51bWJlcikgeyB9CisKKyAgICB2b2lkIEFkZFRvUGFn
ZShQYWdlKiBwYWdlKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBjb25zdCBTdHJpbmcgbV9zdHJp
bmc7CisgICAgY29uc3QgU3RyaW5nIG1fc291cmNlSUQ7CisgICAgY29uc3QgdW5zaWduZWQgbV9s
aW5lTnVtYmVyOworfTsKKwordm9pZCBKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2U6OkFkZFRvUGFn
ZShQYWdlKiBwYWdlKSBjb25zdAoreworICAgIEFTU0VSVChwYWdlKTsKKyAgICBDb25zb2xlKiBj
b25zb2xlID0gcGFnZS0+bWFpbkZyYW1lKCktPmRvbVdpbmRvdygpLT5jb25zb2xlKCk7CisgICAg
Y29uc29sZS0+YWRkTWVzc2FnZShKU01lc3NhZ2VTb3VyY2UsIEVycm9yTWVzc2FnZUxldmVsLCBt
X3N0cmluZywgbV9saW5lTnVtYmVyLCBtX3NvdXJjZUlEKTsKK30KKworLy8gVGhlIENvbnNvbGVN
ZXNzYWdlTWFuYWdlciBoYW5kbGVzIGFsbCBjb25zb2xlIG1lc3NhZ2VzIHRoYXQgc3RlbQorLy8g
ZnJvbSBKYXZhU2NyaXB0LiBJdCBrZWVwcyBhIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCBoYXZlIGJl
ZW4gZGVsYXllZCBidXQKKy8vIGl0IG1ha2VzIHN1cmUgdG8gYWRkIGFsbCBtZXNzYWdlcyB0byB0
aGUgY29uc29sZSBpbiB0aGUgcmlnaHQgb3JkZXIuCitjbGFzcyBDb25zb2xlTWVzc2FnZU1hbmFn
ZXIgeworcHVibGljOgorICAgIC8vIEFkZCBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUuIE1heSBl
bmQgdXAgY2FsbGluZyBKYXZhU2NyaXB0IGNvZGUKKyAgICAvLyBpbmRpcmVjdGx5IHRocm91Z2gg
dGhlIGluc3BlY3RvciBzbyBvbmx5IGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuCisgICAgLy8gaXQg
aXMgc2FmZSB0byBkbyBhbGxvY2F0aW9ucy4KKyAgICBzdGF0aWMgdm9pZCBBZGRNZXNzYWdlKFBh
Z2UqIHBhZ2UsIGNvbnN0IEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAg
ICAvLyBBZGQgYSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlIGJ1dCBkZWxheSB0aGUgcmVwb3J0aW5n
IHVudGlsIGl0CisgICAgLy8gaXMgc2FmZSB0byBkbyBzbzogRWl0aGVyIHdoZW4gd2UgbGVhdmUg
SmF2YVNjcmlwdCBleGVjdXRpb24gb3IKKyAgICAvLyB3aGVuIGFkZGluZyBvdGhlciBjb25zb2xl
IG1lc3NhZ2VzLiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMKKyAgICAvLyBtZXRob2QgaXMg
dG8gYXZvaWQgY2FsbGluZyBpbnRvIFY4IHRvIGhhbmRsZSBjb25zb2xlIG1lc3NhZ2VzCisgICAg
Ly8gd2hlbiB0aGUgVk0gaXMgaW4gYSBzdGF0ZSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgR0NzIG9y
IGFsbG9jYXRpb25zLgorICAgIC8vIERlbGF5ZWQgbWVzc2FnZXMgYXJlIGFsd2F5cyByZXBvcnRl
ZCBpbiB0aGUgcGFnZSBjb3JyZXNwb25kaW5nCisgICAgLy8gdG8gdGhlIGFjdGl2ZSBjb250ZXh0
LgorICAgIHN0YXRpYyB2b2lkIEFkZERlbGF5ZWRNZXNzYWdlKGNvbnN0IEphdmFTY3JpcHRDb25z
b2xlTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAgICAvLyBQcm9jZXNzIGFueSBkZWxheWVkIG1lc3Nh
Z2VzLiBNYXkgZW5kIHVwIGNhbGxpbmcgSmF2YVNjcmlwdCBjb2RlCisgICAgLy8gaW5kaXJlY3Rs
eSB0aHJvdWdoIHRoZSBpbnNwZWN0b3Igc28gb25seSBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbgor
ICAgIC8vIGl0IGlzIHNhZmUgdG8gZG8gYWxsb2NhdGlvbnMuCisgICAgc3RhdGljIHZvaWQgUHJv
Y2Vzc0RlbGF5ZWRNZXNzYWdlcygpOworCitwcml2YXRlOgorICAgIC8vIEFsbCBkZWxheWVkIG1l
c3NhZ2VzIGFyZSBzdG9yZWQgaW4gdGhpcyB2ZWN0b3IuIElmIHRoZSB2ZWN0b3IKKyAgICAvLyBp
cyBOVUxMLCB0aGVyZSBhcmUgbm8gZGVsYXllZCBtZXNzYWdlcy4KKyAgICBzdGF0aWMgVmVjdG9y
PEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZT4qIG1fZGVsYXllZDsKK307CisKKworVmVjdG9yPEph
dmFTY3JpcHRDb25zb2xlTWVzc2FnZT4qIENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6bV9kZWxheWVk
ID0gTlVMTDsKKworCit2b2lkIENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6QWRkTWVzc2FnZShQYWdl
KiBwYWdlLCBjb25zdCBKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UmIG1lc3NhZ2UpCit7CisgICAg
Ly8gUHJvY2VzcyBhbnkgZGVsYXllZCBtZXNzYWdlcyB0byBtYWtlIHN1cmUgdGhhdCBtZXNzYWdl
cworICAgIC8vIGFwcGVhciBpbiB0aGUgcmlnaHQgb3JkZXIgaW4gdGhlIGNvbnNvbGUuCisgICAg
UHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpOworICAgIG1lc3NhZ2UuQWRkVG9QYWdlKHBhZ2UpOwor
fQorCisKK3ZvaWQgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjpBZGREZWxheWVkTWVzc2FnZShjb25z
dCBKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UmIG1lc3NhZ2UpCit7CisgICAgaWYgKCFtX2RlbGF5
ZWQpIHsKKyAgICAgICAgLy8gQWxsb2NhdGUgYSB2ZWN0b3IgZm9yIHRoZSBkZWxheWVkIG1lc3Nh
Z2VzLiBXaWxsIGJlCisgICAgICAgIC8vIGRlYWxsb2NhdGVkIHdoZW4gdGhlIGRlbGF5ZWQgbWVz
c2FnZXMgYXJlIHByb2Nlc3NlZAorICAgICAgICAvLyBpbiBQcm9jZXNzRGVsYXllZE1lc3NhZ2Vz
KCkuCisgICAgICAgIG1fZGVsYXllZCA9IG5ldyBWZWN0b3I8SmF2YVNjcmlwdENvbnNvbGVNZXNz
YWdlPigpOworICAgIH0KKyAgICBtX2RlbGF5ZWQtPmFwcGVuZChtZXNzYWdlKTsKK30KKworCit2
b2lkIENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6UHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpCit7Cisg
ICAgLy8gSWYgd2UgaGF2ZSBhIGRlbGF5ZWQgdmVjdG9yIGl0IGNhbm5vdCBiZSBlbXB0eS4KKyAg
ICBpZiAoIW1fZGVsYXllZCkKKyAgICAgICAgcmV0dXJuOworICAgIEFTU0VSVCghbV9kZWxheWVk
LT5pc0VtcHR5KCkpOworCisgICAgLy8gQWRkIHRoZSBkZWxheWVkIG1lc3NhZ2VzIHRvIHRoZSBw
YWdlIG9mIHRoZSBhY3RpdmUKKyAgICAvLyBjb250ZXh0LiBJZiB0aGF0IGZvciBzb21lIGJpemFy
cmUgcmVhc29uIGRvZXMgbm90CisgICAgLy8gZXhpc3QsIHdlIGNsZWFyIHRoZSBsaXN0IG9mIGRl
bGF5ZWQgbWVzc2FnZXMgdG8gYXZvaWQKKyAgICAvLyBwb3N0aW5nIG1lc3NhZ2VzLiBXZSBzdGls
bCBkZWFsbG9jYXRlIHRoZSB2ZWN0b3IuCisgICAgRnJhbWUqIGZyYW1lID0gVjhQcm94eTo6cmV0
cmlldmVGcmFtZUZvckVudGVyZWRDb250ZXh0KCk7CisgICAgUGFnZSogcGFnZSA9IE5VTEw7Cisg
ICAgaWYgKGZyYW1lKQorICAgICAgICBwYWdlID0gZnJhbWUtPnBhZ2UoKTsKKyAgICBpZiAoIXBh
Z2UpCisgICAgICAgIG1fZGVsYXllZC0+Y2xlYXIoKTsKKworICAgIC8vIEl0ZXJhdGUgdGhyb3Vn
aCBhbGwgdGhlIGRlbGF5ZWQgbWVzc2FnZXMgYW5kIGFkZCB0aGVtCisgICAgLy8gdG8gdGhlIGNv
bnNvbGUuCisgICAgY29uc3QgaW50IHNpemUgPSBtX2RlbGF5ZWQtPnNpemUoKTsKKyAgICBmb3Ig
KGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBtX2RlbGF5ZWQtPmF0KGkpLkFk
ZFRvUGFnZShwYWdlKTsKKyAgICB9CisKKyAgICAvLyBEZWFsbG9jYXRlIHRoZSBkZWxheWVkIHZl
Y3Rvci4KKyAgICBkZWxldGUgbV9kZWxheWVkOworICAgIG1fZGVsYXllZCA9IE5VTEw7Cit9CisK
KworLy8gQ29udmVuaWVuY2UgY2xhc3MgZm9yIGVuc3VyaW5nIHRoYXQgZGVsYXllZCBtZXNzYWdl
cyBpbiB0aGUKKy8vIENvbnNvbGVNZXNzYWdlTWFuYWdlciBhcmUgcHJvY2Vzc2VkIHF1aWNrbHku
CitjbGFzcyBDb25zb2xlTWVzc2FnZVNjb3BlIHsKK3B1YmxpYzoKKyAgICBDb25zb2xlTWVzc2Fn
ZVNjb3BlKCkgeyBDb25zb2xlTWVzc2FnZU1hbmFnZXI6OlByb2Nlc3NEZWxheWVkTWVzc2FnZXMo
KTsgfQorICAgIH5Db25zb2xlTWVzc2FnZVNjb3BlKCkgeyBDb25zb2xlTWVzc2FnZU1hbmFnZXI6
OlByb2Nlc3NEZWxheWVkTWVzc2FnZXMoKTsgfQorfTsKKwordm9pZCBsb2dfaW5mbyhGcmFtZSog
ZnJhbWUsIGNvbnN0IFN0cmluZyYgbXNnLCBjb25zdCBTdHJpbmcmIHVybCkKK3sKKyAgICBQYWdl
KiBwYWdlID0gZnJhbWUtPnBhZ2UoKTsKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgIHJldHVybjsK
KyAgICBKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UgbWVzc2FnZShtc2csIHVybCwgMCk7CisgICAg
Q29uc29sZU1lc3NhZ2VNYW5hZ2VyOjpBZGRNZXNzYWdlKHBhZ2UsIG1lc3NhZ2UpOworfQorCitz
dGF0aWMgdm9pZCBIYW5kbGVDb25zb2xlTWVzc2FnZSh2ODo6SGFuZGxlPHY4OjpNZXNzYWdlPiBt
ZXNzYWdlLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZGF0YSkKK3sKKyAgICAvLyBVc2UgdGhlIGZy
YW1lIHdoZXJlIEphdmFTY3JpcHQgaXMgY2FsbGVkIGZyb20uCisgICAgRnJhbWUqIGZyYW1lID0g
VjhQcm94eTo6cmV0cmlldmVGcmFtZUZvckVudGVyZWRDb250ZXh0KCk7CisgICAgaWYgKCFmcmFt
ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUGFnZSogcGFnZSA9IGZyYW1lLT5wYWdlKCk7Cisg
ICAgaWYgKCFwYWdlKQorICAgICAgICByZXR1cm47CisKKyAgICB2ODo6SGFuZGxlPHY4OjpTdHJp
bmc+IGVycm9yTWVzc2FnZVN0cmluZyA9IG1lc3NhZ2UtPkdldCgpOworICAgIEFTU0VSVCghZXJy
b3JNZXNzYWdlU3RyaW5nLklzRW1wdHkoKSk7CisgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IFRv
V2ViQ29yZVN0cmluZyhlcnJvck1lc3NhZ2VTdHJpbmcpOworCisgICAgdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IHJlc291cmNlTmFtZSA9IG1lc3NhZ2UtPkdldFNjcmlwdFJlc291cmNlTmFtZSgpOwor
ICAgIGJvb2wgdXNlVVJMID0gKHJlc291cmNlTmFtZS5Jc0VtcHR5KCkgfHwgIXJlc291cmNlTmFt
ZS0+SXNTdHJpbmcoKSk7CisgICAgU3RyaW5nIHJlc291cmNlTmFtZVN0cmluZyA9ICh1c2VVUkwp
ID8gZnJhbWUtPmRvY3VtZW50KCktPnVybCgpIDogVG9XZWJDb3JlU3RyaW5nKHJlc291cmNlTmFt
ZSk7CisgICAgSmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlIGNvbnNvbGVNZXNzYWdlKGVycm9yTWVz
c2FnZSwgcmVzb3VyY2VOYW1lU3RyaW5nLCBtZXNzYWdlLT5HZXRMaW5lTnVtYmVyKCkpOworICAg
IENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6QWRkTWVzc2FnZShwYWdlLCBjb25zb2xlTWVzc2FnZSk7
Cit9CisKKworZW51bSBEZWxheVJlcG9ydGluZyB7CisgICAgUkVQT1JUX0xBVEVSLAorICAgIFJF
UE9SVF9OT1cKK307CisKKworc3RhdGljIHZvaWQgUmVwb3J0VW5zYWZlQWNjZXNzVG8oRnJhbWUq
IHRhcmdldCwgRGVsYXlSZXBvcnRpbmcgZGVsYXkpCit7CisgICAgQVNTRVJUKHRhcmdldCk7Cisg
ICAgRG9jdW1lbnQqIHRhcmdldERvY3VtZW50ID0gdGFyZ2V0LT5kb2N1bWVudCgpOworICAgIGlm
ICghdGFyZ2V0RG9jdW1lbnQpCisgICAgICAgIHJldHVybjsKKworICAgIEZyYW1lKiBzb3VyY2Ug
PSBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lRm9yRW50ZXJlZENvbnRleHQoKTsKKyAgICBpZiAoIXNv
dXJjZSB8fCAhc291cmNlLT5kb2N1bWVudCgpKQorICAgICAgICByZXR1cm47ICAvLyBJZ25vcmUg
ZXJyb3IgaWYgdGhlIHNvdXJjZSBkb2N1bWVudCBpcyBnb25lLgorCisgICAgRG9jdW1lbnQqIHNv
dXJjZURvY3VtZW50ID0gc291cmNlLT5kb2N1bWVudCgpOworCisgICAgLy8gRklYTUU6IFRoaXMg
ZXJyb3IgbWVzc2FnZSBzaG91bGQgY29udGFpbiBtb3JlIHNwZWNpZmljcyBvZiB3aHkgdGhlIHNh
bWUKKyAgICAvLyBvcmlnaW4gY2hlY2sgaGFzIGZhaWxlZC4KKyAgICBTdHJpbmcgc3RyID0gU3Ry
aW5nOjpmb3JtYXQoIlVuc2FmZSBKYXZhU2NyaXB0IGF0dGVtcHQgdG8gYWNjZXNzIGZyYW1lICIK
KyAgICAgICAgIndpdGggVVJMICVzIGZyb20gZnJhbWUgd2l0aCBVUkwgJXMuICIKKyAgICAgICAg
IkRvbWFpbnMsIHByb3RvY29scyBhbmQgcG9ydHMgbXVzdCBtYXRjaC5cbiIsCisgICAgICAgIHRh
cmdldERvY3VtZW50LT51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpLAorICAgICAgICBzb3Vy
Y2VEb2N1bWVudC0+dXJsKCkuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICAvLyBCdWls
ZCBhIGNvbnNvbGUgbWVzc2FnZSB3aXRoIGZha2Ugc291cmNlIElEIGFuZCBsaW5lIG51bWJlci4K
KyAgICBjb25zdCBTdHJpbmcga1NvdXJjZUlEID0gIiI7CisgICAgY29uc3QgaW50IGtMaW5lTnVt
YmVyID0gMTsKKyAgICBKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UgbWVzc2FnZShzdHIsIGtTb3Vy
Y2VJRCwga0xpbmVOdW1iZXIpOworCisgICAgaWYgKGRlbGF5ID09IFJFUE9SVF9OT1cpIHsKKyAg
ICAgICAgLy8gTk9URSh0Yyk6IEFwcGxlIHByaW50cyB0aGUgbWVzc2FnZSBpbiB0aGUgdGFyZ2V0
IHBhZ2UsIGJ1dCBpdCBzZWVtcyBsaWtlCisgICAgICAgIC8vIGl0IHNob3VsZCBiZSBpbiB0aGUg
c291cmNlIHBhZ2UuIEV2ZW4gZm9yIGRlbGF5ZWQgbWVzc2FnZXMsIHdlIHB1dCBpdCBpbgorICAg
ICAgICAvLyB0aGUgc291cmNlIHBhZ2U7IHNlZSBDb25zb2xlTWVzc2FnZU1hbmFnZXI6OlByb2Nl
c3NEZWxheWVkTWVzc2FnZXMoKS4KKyAgICAgICAgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjpBZGRN
ZXNzYWdlKHNvdXJjZS0+cGFnZSgpLCBtZXNzYWdlKTsKKworICAgIH0gZWxzZSB7CisgICAgICAg
IEFTU0VSVChkZWxheSA9PSBSRVBPUlRfTEFURVIpOworICAgICAgICAvLyBXZSBjYW5ub3Qgc2Fm
ZWx5IHJlcG9ydCB0aGUgbWVzc2FnZSBlYWdlcmx5LCBiZWNhdXNlIHRoaXMgbWF5IGNhdXNlCisg
ICAgICAgIC8vIGFsbG9jYXRpb25zIGFuZCBHQ3MgaW50ZXJuYWxseSBpbiBWOCBhbmQgd2UgY2Fu
bm90IGhhbmRsZSB0aGF0IGF0IHRoaXMKKyAgICAgICAgLy8gcG9pbnQuIFRoZXJlZm9yZSB3ZSBk
ZWxheSB0aGUgcmVwb3J0aW5nLgorICAgICAgICBDb25zb2xlTWVzc2FnZU1hbmFnZXI6OkFkZERl
bGF5ZWRNZXNzYWdlKG1lc3NhZ2UpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgUmVwb3J0VW5z
YWZlSmF2YVNjcmlwdEFjY2Vzcyh2ODo6TG9jYWw8djg6Ok9iamVjdD4gaG9zdCwgdjg6OkFjY2Vz
c1R5cGUgdHlwZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gZGF0YSkKK3sKKyAgICBGcmFtZSogdGFy
Z2V0ID0gVjhDdXN0b206OkdldFRhcmdldEZyYW1lKGhvc3QsIGRhdGEpOworICAgIGlmICh0YXJn
ZXQpCisgICAgICAgIFJlcG9ydFVuc2FmZUFjY2Vzc1RvKHRhcmdldCwgUkVQT1JUX0xBVEVSKTsK
K30KKworc3RhdGljIHZvaWQgSGFuZGxlRmF0YWxFcnJvckluVjgoKQoreworICAgIC8vIFRPRE86
IFdlIHRlbXBvcmFyaWx5IGRlYWwgd2l0aCBWOCBpbnRlcm5hbCBlcnJvciBzaXR1YXRpb25zCisg
ICAgLy8gc3VjaCBhcyBvdXQtb2YtbWVtb3J5IGJ5IGNyYXNoaW5nIHRoZSByZW5kZXJlci4KKyAg
ICBDUkFTSCgpOworfQorCitzdGF0aWMgdm9pZCBSZXBvcnRGYXRhbEVycm9ySW5WOChjb25zdCBj
aGFyKiBsb2NhdGlvbiwgY29uc3QgY2hhciogbWVzc2FnZSkKK3sKKyAgICAvLyBWOCBpcyBzaHV0
ZG93biwgd2UgY2Fubm90IHVzZSBWOCBhcGkuCisgICAgLy8gVGhlIG9ubHkgdGhpbmcgd2UgY2Fu
IGRvIGlzIHRvIGRpc2FibGUgSmF2YVNjcmlwdC4KKyAgICAvLyBUT0RPOiBjbGVhbiB1cCBWOFBy
b3h5IGFuZCBkaXNhYmxlIEphdmFTY3JpcHQuCisgICAgcHJpbnRmKCJWOCBlcnJvcjogJXMgKCVz
KVxuIiwgbWVzc2FnZSwgbG9jYXRpb24pOworICAgIEhhbmRsZUZhdGFsRXJyb3JJblY4KCk7Cit9
CisKK1Y4UHJveHk6On5WOFByb3h5KCkKK3sKKyAgICBjbGVhckZvckNsb3NlKCk7CisgICAgRGVz
dHJveUdsb2JhbCgpOworfQorCit2b2lkIFY4UHJveHk6OkRlc3Ryb3lHbG9iYWwoKQoreworICAg
IGlmICghbV9nbG9iYWwuSXNFbXB0eSgpKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgICBVbnJl
Z2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMsIG1fZ2xvYmFsKTsKKyNlbmRpZgorICAgICAgICBtX2ds
b2JhbC5EaXNwb3NlKCk7CisgICAgICAgIG1fZ2xvYmFsLkNsZWFyKCk7CisgICAgfQorfQorCisK
K2Jvb2wgVjhQcm94eTo6RE9NT2JqZWN0SGFzSlNXcmFwcGVyKHZvaWQqIG9iaikgeworICByZXR1
cm4gZ2V0RE9NT2JqZWN0TWFwKCkuY29udGFpbnMob2JqKSB8fCBnZXRBY3RpdmVET01PYmplY3RN
YXAoKS5jb250YWlucyhvYmopOworfQorCisKKy8vIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGluY3Jl
YXNlZCBvYmoncyByZWYgY291bnQuCit2b2lkIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU9i
amVjdCh2b2lkKiBvYmosIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdyYXBwZXIpCit7Cisg
ICAgQVNTRVJUKE1heWJlRE9NV3JhcHBlcih3cmFwcGVyKSk7CisjaWZuZGVmIE5ERUJVRworICAg
IFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBl
clR5cGUod3JhcHBlcik7CisgICAgc3dpdGNoICh0eXBlKSB7CisjZGVmaW5lIE1BS0VfQ0FTRShU
WVBFLCBOQU1FKSBjYXNlIFY4Q2xhc3NJbmRleDo6VFlQRToKKyAgICAgICAgQUNUSVZFX0RPTV9P
QkpFQ1RfVFlQRVMoTUFLRV9DQVNFKQorICAgICAgICBBU1NFUlQoZmFsc2UpOworI3VuZGVmIE1B
S0VfQ0FTRQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorICAg
IGdldERPTU9iamVjdE1hcCgpLnNldChvYmosIHdyYXBwZXIpOworfQorCisvLyBUaGUgY2FsbGVy
IG11c3QgaGF2ZSBpbmNyZWFzZWQgb2JqJ3MgcmVmIGNvdW50Lgordm9pZCBWOFByb3h5OjpTZXRK
U1dyYXBwZXJGb3JBY3RpdmVET01PYmplY3Qodm9pZCogb2JqLCB2ODo6UGVyc2lzdGVudDx2ODo6
T2JqZWN0PiB3cmFwcGVyKQoreworICAgIEFTU0VSVChNYXliZURPTVdyYXBwZXIod3JhcHBlcikp
OworI2lmbmRlZiBOREVCVUcKKyAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9
IFY4UHJveHk6OkdldERPTVdyYXBwZXJUeXBlKHdyYXBwZXIpOworICAgIHN3aXRjaCAodHlwZSkg
eworI2RlZmluZSBNQUtFX0NBU0UoVFlQRSwgTkFNRSkgY2FzZSBWOENsYXNzSW5kZXg6OlRZUEU6
IGJyZWFrOworICAgICAgQUNUSVZFX0RPTV9PQkpFQ1RfVFlQRVMoTUFLRV9DQVNFKQorICAgICAg
ZGVmYXVsdDogQVNTRVJUKGZhbHNlKTsKKyN1bmRlZiBNQUtFX0NBU0UKKyAgICB9CisjZW5kaWYK
KyAgICBnZXRBY3RpdmVET01PYmplY3RNYXAoKS5zZXQob2JqLCB3cmFwcGVyKTsKK30KKworLy8g
VGhlIGNhbGxlciBtdXN0IGhhdmUgaW5jcmVhc2VkIG5vZGUncyByZWYgY291bnQuCit2b2lkIFY4
UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU5vZGUoTm9kZSogbm9kZSwgdjg6OlBlcnNpc3RlbnQ8
djg6Ok9iamVjdD4gd3JhcHBlcikKK3sKKyAgICBBU1NFUlQoTWF5YmVET01XcmFwcGVyKHdyYXBw
ZXIpKTsKKyAgICBnZXRET01Ob2RlTWFwKCkuc2V0KG5vZGUsIHdyYXBwZXIpOworfQorCisvLyBF
dmVudCBsaXN0ZW5lcnMKKworc3RhdGljIFY4RXZlbnRMaXN0ZW5lciogRmluZEV2ZW50TGlzdGVu
ZXJJbkxpc3QoVjhFdmVudExpc3RlbmVyTGlzdCYgbGlzdCwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4g
bGlzdGVuZXIsIGJvb2wgaXNJbmxpbmUpCit7CisgICAgQVNTRVJUKHY4OjpDb250ZXh0OjpJbkNv
bnRleHQoKSk7CisKKyAgICBpZiAoIWxpc3RlbmVyLT5Jc09iamVjdCgpKQorICAgICAgICByZXR1
cm4gMDsKKworICAgIHJldHVybiBsaXN0LmZpbmQobGlzdGVuZXItPlRvT2JqZWN0KCksIGlzSW5s
aW5lKTsKK30KKworLy8gRmluZCBhbiBleGlzdGluZyB3cmFwcGVyIGZvciBhIEpTIGV2ZW50IGxp
c3RlbmVyIGluIHRoZSBtYXAuCitQYXNzUmVmUHRyPFY4RXZlbnRMaXN0ZW5lcj4gVjhQcm94eTo6
RmluZFY4RXZlbnRMaXN0ZW5lcih2ODo6TG9jYWw8djg6OlZhbHVlPiBsaXN0ZW5lciwgYm9vbCBp
c0lubGluZSkKK3sKKyAgICByZXR1cm4gRmluZEV2ZW50TGlzdGVuZXJJbkxpc3QobV9ldmVudExp
c3RlbmVycywgbGlzdGVuZXIsIGlzSW5saW5lKTsKK30KKworUGFzc1JlZlB0cjxWOEV2ZW50TGlz
dGVuZXI+IFY4UHJveHk6OkZpbmRPckNyZWF0ZVY4RXZlbnRMaXN0ZW5lcih2ODo6TG9jYWw8djg6
OlZhbHVlPiBvYmosIGJvb2wgaXNJbmxpbmUpCit7CisgICAgQVNTRVJUKHY4OjpDb250ZXh0OjpJ
bkNvbnRleHQoKSk7CisKKyAgICBpZiAoIW9iai0+SXNPYmplY3QoKSkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICBWOEV2ZW50TGlzdGVuZXIqIHdyYXBwZXIgPSBGaW5kRXZlbnRMaXN0ZW5lcklu
TGlzdChtX2V2ZW50TGlzdGVuZXJzLCBvYmosIGlzSW5saW5lKTsKKyAgICBpZiAod3JhcHBlcikK
KyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgb25lLCBhbmQg
YWRkIHRvIGNhY2hlLgorICAgIFJlZlB0cjxWOEV2ZW50TGlzdGVuZXI+IG5ld0xpc3RlbmVyID0g
VjhFdmVudExpc3RlbmVyOjpjcmVhdGUobV9mcmFtZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpD
YXN0KG9iaiksIGlzSW5saW5lKTsKKyAgICBtX2V2ZW50TGlzdGVuZXJzLmFkZChuZXdMaXN0ZW5l
ci5nZXQoKSk7CisKKyAgICByZXR1cm4gbmV3TGlzdGVuZXI7Cit9CisKKworLy8gT2JqZWN0IGV2
ZW50IGxpc3RlbmVycyAoc3VjaCBhcyBYbWxIdHRwUmVxdWVzdCBhbmQgTWVzc2FnZVBvcnQpIGFy
ZQorLy8gZGlmZmVyZW50IGZyb20gbGlzdGVuZXJzIG9uIERPTSBub2Rlcy4gQW4gb2JqZWN0IGV2
ZW50IGxpc3RlbmVyIHdyYXBwZXIKKy8vIG9ubHkgaG9sZHMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0
aGUgSlMgZnVuY3Rpb24uIEEgc3Ryb25nIHJlZmVyZW5jZSBjYW4KKy8vIGNyZWF0ZSBhIGN5Y2xl
LgorLy8KKy8vIFRoZSBsaWZldGltZSBvZiB0aGVzZSBvYmplY3RzIGlzIGJvdW5kZWQgYnkgdGhl
IGxpZmUgdGltZSBvZiBpdHMgSlMKKy8vIHdyYXBwZXIuIFNvIHdlIGNhbiBjcmVhdGUgYSBoaWRk
ZW4gcmVmZXJlbmNlIGZyb20gdGhlIEpTIHdyYXBwZXIgdG8KKy8vIHRvIGl0cyBKUyBmdW5jdGlv
bi4KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcCkKKy8vICAgICAgICAgICAg
ICBYSFIgICAgICA8LS0tLS0tLS0tLSAgSlNfd3JhcHBlcgorLy8gICAgICAgICAgICAgICB8ICAg
ICAgICAgICAgIChoaWRkZW4pIDogIF4KKy8vICAgICAgICAgICAgICAgViAgICAgICAgICAgICAg
ICAgICAgICBWICA6IChtYXkgcmVhY2hhYmxlIGJ5IGNsb3N1cmUpCisvLyAgICAgICAgICAgVjhf
bGlzdGVuZXIgIC0tLS0tLS0tPiBKU19mdW5jdGlvbgorLy8gICAgICAgICAgICAgICAgICAgICAg
ICAgKHdlYWspICA8LS0gbWF5IGNyZWF0ZSBhIGN5Y2xlIGlmIGl0IGlzIHN0cm9uZworLy8KKy8v
IFRoZSBwZXJzaXN0ZW50IHJlZmVyZW5jZSBpcyBtYWRlIHdlYWsgaW4gdGhlIGNvbnN0cnVjdG9y
CisvLyBvZiBWOE9iamVjdEV2ZW50TGlzdGVuZXIuCisKK1Bhc3NSZWZQdHI8VjhFdmVudExpc3Rl
bmVyPiBWOFByb3h5OjpGaW5kT2JqZWN0RXZlbnRMaXN0ZW5lciggdjg6OkxvY2FsPHY4OjpWYWx1
ZT4gbGlzdGVuZXIsIGJvb2wgaXNJbmxpbmUpCit7CisgICAgcmV0dXJuIEZpbmRFdmVudExpc3Rl
bmVySW5MaXN0KG1feGhyTGlzdGVuZXJzLCBsaXN0ZW5lciwgaXNJbmxpbmUpOworfQorCisKK1Bh
c3NSZWZQdHI8VjhFdmVudExpc3RlbmVyPiBWOFByb3h5OjpGaW5kT3JDcmVhdGVPYmplY3RFdmVu
dExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6VmFsdWU+IG9iaiwgYm9vbCBpc0lubGluZSkKK3sKKyAg
ICBBU1NFUlQodjg6OkNvbnRleHQ6OkluQ29udGV4dCgpKTsKKworICAgIGlmICghb2JqLT5Jc09i
amVjdCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFY4RXZlbnRMaXN0ZW5lciogd3JhcHBl
ciA9IEZpbmRFdmVudExpc3RlbmVySW5MaXN0KG1feGhyTGlzdGVuZXJzLCBvYmosIGlzSW5saW5l
KTsKKyAgICBpZiAod3JhcHBlcikKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisKKyAgICAvLyBD
cmVhdGUgYSBuZXcgb25lLCBhbmQgYWRkIHRvIGNhY2hlLgorICAgIFJlZlB0cjxWOEV2ZW50TGlz
dGVuZXI+IG5ld0xpc3RlbmVyID0gVjhPYmplY3RFdmVudExpc3RlbmVyOjpjcmVhdGUobV9mcmFt
ZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpDYXN0KG9iaiksIGlzSW5saW5lKTsKKyAgICBtX3ho
ckxpc3RlbmVycy5hZGQobmV3TGlzdGVuZXIuZ2V0KCkpOworCisgICAgcmV0dXJuIG5ld0xpc3Rl
bmVyLnJlbGVhc2UoKTsKK30KKworCitzdGF0aWMgdm9pZCBSZW1vdmVFdmVudExpc3RlbmVyRnJv
bUxpc3QoVjhFdmVudExpc3RlbmVyTGlzdCYgbGlzdCwgVjhFdmVudExpc3RlbmVyKiBsaXN0ZW5l
cikKK3sKKyAgICBsaXN0LnJlbW92ZShsaXN0ZW5lcik7Cit9CisKKwordm9pZCBWOFByb3h5OjpS
ZW1vdmVWOEV2ZW50TGlzdGVuZXIoVjhFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikKK3sKKyAgICBS
ZW1vdmVFdmVudExpc3RlbmVyRnJvbUxpc3QobV9ldmVudExpc3RlbmVycywgbGlzdGVuZXIpOwor
fQorCisKK3ZvaWQgVjhQcm94eTo6UmVtb3ZlT2JqZWN0RXZlbnRMaXN0ZW5lcihWOE9iamVjdEV2
ZW50TGlzdGVuZXIqIGxpc3RlbmVyKQoreworICAgIFJlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTGlz
dChtX3hockxpc3RlbmVycywgbGlzdGVuZXIpOworfQorCisKK3N0YXRpYyB2b2lkIERpc2Nvbm5l
Y3RFdmVudExpc3RlbmVyc0luTGlzdChWOEV2ZW50TGlzdGVuZXJMaXN0JiBsaXN0KQoreworICAg
IFY4RXZlbnRMaXN0ZW5lckxpc3Q6Oml0ZXJhdG9yIHAgPSBsaXN0LmJlZ2luKCk7CisgICAgd2hp
bGUgKHAgIT0gbGlzdC5lbmQoKSkgeworICAgICAgICAoKnApLT5kaXNjb25uZWN0RnJhbWUoKTsK
KyAgICAgICAgKytwOworICAgIH0KKyAgICBsaXN0LmNsZWFyKCk7Cit9CisKKwordm9pZCBWOFBy
b3h5OjpEaXNjb25uZWN0RXZlbnRMaXN0ZW5lcnMoKQoreworICAgIERpc2Nvbm5lY3RFdmVudExp
c3RlbmVyc0luTGlzdChtX2V2ZW50TGlzdGVuZXJzKTsKKyAgICBEaXNjb25uZWN0RXZlbnRMaXN0
ZW5lcnNJbkxpc3QobV94aHJMaXN0ZW5lcnMpOworfQorCisKK3Y4OjpIYW5kbGU8djg6OlNjcmlw
dD4gVjhQcm94eTo6Q29tcGlsZVNjcmlwdCh2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IGNvZGUsIGNv
bnN0IFN0cmluZyYgZmlsZU5hbWUsIGludCBiYXNlTGluZSkKK3sKKyAgICBjb25zdCB1aW50MTZf
dCogZmlsZU5hbWVTdHJpbmcgPSBGcm9tV2ViQ29yZVN0cmluZyhmaWxlTmFtZSk7CisgICAgdjg6
OkhhbmRsZTx2ODo6U3RyaW5nPiBuYW1lID0gdjg6OlN0cmluZzo6TmV3KGZpbGVOYW1lU3RyaW5n
LCBmaWxlTmFtZS5sZW5ndGgoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6SW50ZWdlcj4gbGluZSA9
IHY4OjpJbnRlZ2VyOjpOZXcoYmFzZUxpbmUpOworICAgIHY4OjpTY3JpcHRPcmlnaW4gb3JpZ2lu
KG5hbWUsIGxpbmUpOworICAgIHY4OjpIYW5kbGU8djg6OlNjcmlwdD4gc2NyaXB0ID0gdjg6OlNj
cmlwdDo6Q29tcGlsZShjb2RlLCAmb3JpZ2luKTsKKyAgICByZXR1cm4gc2NyaXB0OworfQorCiti
b29sIFY4UHJveHk6OkhhbmRsZU91dE9mTWVtb3J5KCkKK3sKKyAgICB2ODo6TG9jYWw8djg6OkNv
bnRleHQ+IGNvbnRleHQgPSB2ODo6Q29udGV4dDo6R2V0Q3VycmVudCgpOworCisgICAgaWYgKCFj
b250ZXh0LT5IYXNPdXRPZk1lbW9yeUV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICAvLyBXYXJuaW5nLCBlcnJvciwgZGlzYWJsZSBKUyBmb3IgdGhpcyBmcmFtZT8KKyAg
ICBGcmFtZSogZnJhbWUgPSBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lKGNvbnRleHQpOworCisgICAg
VjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShmcmFtZSk7CisgICAgaWYgKHByb3h5
ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gQ2xlYW4gbV9jb250ZXh0LCBhbmQgZXZlbnQgaGFuZGxl
cnMuCisgICAgICAgIHByb3h5LT5jbGVhckZvckNsb3NlKCk7CisgICAgICAgIC8vIERlc3Ryb3kg
dGhlIGdsb2JhbCBvYmplY3QuCisgICAgICAgIHByb3h5LT5EZXN0cm95R2xvYmFsKCk7CisgICAg
fQorCisgICAgQ2hyb21pdW1CcmlkZ2U6Om5vdGlmeUpTT3V0T2ZNZW1vcnkoZnJhbWUpOworCisg
ICAgLy8gRGlzYWJsZSBKUy4KKyAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBmcmFtZS0+c2V0dGlu
Z3MoKTsKKyAgICBBU1NFUlQoc2V0dGluZ3MpOworICAgIHNldHRpbmdzLT5zZXRKYXZhU2NyaXB0
RW5hYmxlZChmYWxzZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBWOFByb3h5Ojpl
dmFsdWF0ZUluTmV3Q29udGV4dChjb25zdCBWZWN0b3I8U2NyaXB0U291cmNlQ29kZT4mIHNvdXJj
ZXMpCit7CisgICAgSW5pdENvbnRleHRJZk5lZWRlZCgpOworCisgICAgdjg6OkhhbmRsZVNjb3Bl
IGhhbmRsZVNjb3BlOworCisgICAgLy8gU2V0IHVwIHRoZSBET00gd2luZG93IGFzIHRoZSBwcm90
b3R5cGUgb2YgdGhlIG5ldyBnbG9iYWwgb2JqZWN0LgorICAgIHY4OjpIYW5kbGU8djg6OkNvbnRl
eHQ+IHdpbmRvd0NvbnRleHQgPSBtX2NvbnRleHQ7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0
PiB3aW5kb3dHbG9iYWwgPSB3aW5kb3dDb250ZXh0LT5HbG9iYWwoKTsKKyAgICB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gd2luZG93V3JhcHBlciA9IFY4UHJveHk6Okxvb2t1cERPTVdyYXBwZXIoVjhD
bGFzc0luZGV4OjpET01XSU5ET1csIHdpbmRvd0dsb2JhbCk7CisKKyAgICBBU1NFUlQoVjhQcm94
eTo6RE9NV3JhcHBlclRvTmF0aXZlPERPTVdpbmRvdz4od2luZG93V3JhcHBlcikgPT0gbV9mcmFt
ZS0+ZG9tV2luZG93KCkpOworCisgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IGNvbnRl
eHQgPSBjcmVhdGVOZXdDb250ZXh0KHY4OjpIYW5kbGU8djg6Ok9iamVjdD4oKSk7CisgICAgdjg6
OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRTY29wZShjb250ZXh0KTsKKworICAgIC8vIFNldHVwIGNv
bnRleHQgaWQgZm9yIEpTIGRlYnVnZ2VyLgorICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gY29u
dGV4dF9kYXRhID0gdjg6Ok9iamVjdDo6TmV3KCk7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+
IHdpbmRvd19jb250ZXh0X2RhdGEgPSB3aW5kb3dDb250ZXh0LT5HZXREYXRhKCk7CisgICAgaWYg
KHdpbmRvd19jb250ZXh0X2RhdGEtPklzT2JqZWN0KCkpIHsKKyAgICAgICAgdjg6OkhhbmRsZTx2
ODo6U3RyaW5nPiBwcm9wZXJ0eV9uYW1lID0gdjg6OlN0cmluZzo6TmV3KGtDb250ZXh0RGVidWdE
YXRhVmFsdWUpOworICAgICAgICBjb250ZXh0X2RhdGEtPlNldChwcm9wZXJ0eV9uYW1lLCB2ODo6
T2JqZWN0OjpDYXN0KCp3aW5kb3dfY29udGV4dF9kYXRhKS0+R2V0KHByb3BlcnR5X25hbWUpKTsK
KyAgICB9CisgICAgY29udGV4dF9kYXRhLT5TZXQodjg6OlN0cmluZzo6TmV3KGtDb250ZXh0RGVi
dWdEYXRhVHlwZSksIHY4OjpTdHJpbmc6Ok5ldygiaW5qZWN0ZWQiKSk7CisgICAgY29udGV4dC0+
U2V0RGF0YShjb250ZXh0X2RhdGEpOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9i
YWwgPSBjb250ZXh0LT5HbG9iYWwoKTsKKworICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gaW1w
bGljaXRQcm90b1N0cmluZyA9IHY4OjpTdHJpbmc6Ok5ldygiX19wcm90b19fIik7CisgICAgZ2xv
YmFsLT5TZXQoaW1wbGljaXRQcm90b1N0cmluZywgd2luZG93V3JhcHBlcik7CisKKyAgICAvLyBH
aXZlIHRoZSBjb2RlIHJ1bm5pbmcgaW4gdGhlIG5ldyBjb250ZXh0IGEgd2F5IHRvIGdldCBhY2Nl
c3MgdG8gdGhlCisgICAgLy8gb3JpZ2luYWwgY29udGV4dC4KKyAgICBnbG9iYWwtPlNldCh2ODo6
U3RyaW5nOjpOZXcoImNvbnRlbnRXaW5kb3ciKSwgd2luZG93R2xvYmFsKTsKKworICAgIC8vIFJ1
biBjb2RlIGluIHRoZSBuZXcgY29udGV4dC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNv
dXJjZXMuc2l6ZSgpOyArK2kpCisgICAgICAgIGV2YWx1YXRlKHNvdXJjZXNbaV0sIDApOworCisg
ICAgLy8gVXNpbmcgdGhlIGRlZmF1bHQgc2VjdXJpdHkgdG9rZW4gbWVhbnMgdGhhdCB0aGUgY2Fu
QWNjZXNzIGlzIGFsd2F5cworICAgIC8vIGNhbGxlZCwgd2hpY2ggaXMgc2xvdy4KKyAgICAvLyBU
T0RPKGFhKTogVXNlIHRva2VucyB3aGVyZSBwb3NzaWJsZS4gVGhpcyB3aWxsIG1lYW4ga2VlcGlu
ZyB0cmFjayBvZiBhbGwKKyAgICAvLyBjcmVhdGVkIGNvbnRleHRzIHNvIHRoYXQgdGhleSBjYW4g
YWxsIGJlIHVwZGF0ZWQgd2hlbiB0aGUgZG9jdW1lbnQgZG9tYWluCisgICAgLy8gY2hhbmdlcy4K
KyAgICBjb250ZXh0LT5Vc2VEZWZhdWx0U2VjdXJpdHlUb2tlbigpOworICAgIGNvbnRleHQuRGlz
cG9zZSgpOworfQorCit2ODo6TG9jYWw8djg6OlZhbHVlPiBWOFByb3h5OjpldmFsdWF0ZShjb25z
dCBTY3JpcHRTb3VyY2VDb2RlJiBzb3VyY2UsIE5vZGUqIG4pCit7CisgICAgQVNTRVJUKHY4OjpD
b250ZXh0OjpJbkNvbnRleHQoKSk7CisKKyAgICAvLyBDb21waWxlIHRoZSBzY3JpcHQuCisgICAg
djg6OkxvY2FsPHY4OjpTdHJpbmc+IGNvZGUgPSB2OEV4dGVybmFsU3RyaW5nKHNvdXJjZS5zb3Vy
Y2UoKSk7CisgICAgQ2hyb21pdW1CcmlkZ2U6OnRyYWNlRXZlbnRCZWdpbigidjguY29tcGlsZSIs
IG4sICIiKTsKKworICAgIC8vIE5PVEU6IEZvciBjb21wYXRpYmlsaXR5IHdpdGggV2ViQ29yZSwg
U2NyaXB0U291cmNlQ29kZSdzIGxpbmUgc3RhcnRzIGF0CisgICAgLy8gMSwgd2hlcmVhcyB2OCBz
dGFydHMgYXQgMC4KKyAgICB2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IHNjcmlwdCA9IENvbXBpbGVT
Y3JpcHQoY29kZSwgc291cmNlLnVybCgpLCBzb3VyY2Uuc3RhcnRMaW5lKCkgLSAxKTsKKyAgICBD
aHJvbWl1bUJyaWRnZTo6dHJhY2VFdmVudEVuZCgidjguY29tcGlsZSIsIG4sICIiKTsKKworICAg
IENocm9taXVtQnJpZGdlOjp0cmFjZUV2ZW50QmVnaW4oInY4LnJ1biIsIG4sICIiKTsKKyAgICB2
ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQ7CisgICAgeworICAgICAgICAvLyBJc29sYXRlIGV4
Y2VwdGlvbnMgdGhhdCBvY2N1ciB3aGVuIGV4ZWN1dGluZyB0aGUgY29kZS4gIFRoZXNlCisgICAg
ICAgIC8vIGV4Y2VwdGlvbnMgc2hvdWxkIG5vdCBpbnRlcmZlcmUgd2l0aCBqYXZhc2NyaXB0IGNv
ZGUgd2UgbWlnaHQKKyAgICAgICAgLy8gZXZhbHVhdGUgZnJvbSBDKysgd2hlbiByZXR1cm5pbmcg
ZnJvbSBoZXJlCisgICAgICAgIHY4OjpUcnlDYXRjaCB0cnlDYXRjaDsKKyAgICAgICAgdHJ5Q2F0
Y2guU2V0VmVyYm9zZSh0cnVlKTsKKworICAgICAgICAvLyBTZXQgaW5saW5lQ29kZSB0byB0cnVl
IGZvciA8YSBocmVmPSJqYXZhc2NyaXB0OmRvU29tZXRoaW5nKCkiPgorICAgICAgICAvLyBhbmQg
ZmFsc2UgZm9yIDxzY3JpcHQ+ZG9Tb21ldGhpbmc8L3NjcmlwdD4uIFdlIG1ha2UgYSByb3VnaCBn
dWVzcyBhdAorICAgICAgICAvLyB0aGlzIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHNjcmlwdCBzb3Vy
Y2UgaGFzIGEgVVJMLgorICAgICAgICByZXN1bHQgPSBSdW5TY3JpcHQoc2NyaXB0LCBzb3VyY2Uu
dXJsKCkuc3RyaW5nKCkuaXNOdWxsKCkpOworICAgIH0KKyAgICBDaHJvbWl1bUJyaWRnZTo6dHJh
Y2VFdmVudEVuZCgidjgucnVuIiwgbiwgIiIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Y4
OjpMb2NhbDx2ODo6VmFsdWU+IFY4UHJveHk6OlJ1blNjcmlwdCh2ODo6SGFuZGxlPHY4OjpTY3Jp
cHQ+IHNjcmlwdCwgYm9vbCBpc0lubGluZUNvZGUpCit7CisgICAgaWYgKHNjcmlwdC5Jc0VtcHR5
KCkpCisgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworCisgICAgLy8g
Q29tcHV0ZSB0aGUgc291cmNlIHN0cmluZyBhbmQgcHJldmVudCBhZ2FpbnN0IGluZmluaXRlIHJl
Y3Vyc2lvbi4KKyAgICBpZiAobV9yZWN1cnNpb24gPj0ga01heFJlY3Vyc2lvbkRlcHRoKSB7Cisg
ICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBjb2RlID0gdjhFeHRlcm5hbFN0cmluZygidGhy
b3cgUmFuZ2VFcnJvcignUmVjdXJzaW9uIHRvbyBkZWVwJykiKTsKKyAgICAgICAgLy8gVE9ETyhr
YXNwZXJsKTogSWRlYWxseSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gcmUtdXNlIHRoZSBvcmlnaW4g
b2YgdGhlCisgICAgICAgIC8vIHNjcmlwdCBwYXNzZWQgdG8gdXMgYXMgdGhlIGFyZ3VtZW50IGlu
c3RlYWQgb2YgdXNpbmcgYW4gZW1wdHkgc3RyaW5nCisgICAgICAgIC8vIGFuZCAwIGJhc2VMaW5l
LgorICAgICAgICBzY3JpcHQgPSBDb21waWxlU2NyaXB0KGNvZGUsICIiLCAwKTsKKyAgICB9CisK
KyAgICBpZiAoSGFuZGxlT3V0T2ZNZW1vcnkoKSkKKyAgICAgICAgQVNTRVJUKHNjcmlwdC5Jc0Vt
cHR5KCkpOworCisgICAgaWYgKHNjcmlwdC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBub3RI
YW5kbGVkQnlJbnRlcmNlcHRvcigpOworCisgICAgLy8gU2F2ZSB0aGUgcHJldmlvdXMgdmFsdWUg
b2YgdGhlIGlubGluZUNvZGUgZmxhZyBhbmQgdXBkYXRlIHRoZSBmbGFnIGZvcgorICAgIC8vIHRo
ZSBkdXJhdGlvbiBvZiB0aGUgc2NyaXB0IGludm9jYXRpb24uCisgICAgYm9vbCBwcmV2aW91c0lu
bGluZUNvZGUgPSBpbmxpbmVDb2RlKCk7CisgICAgc2V0SW5saW5lQ29kZShpc0lubGluZUNvZGUp
OworCisgICAgLy8gUnVuIHRoZSBzY3JpcHQgYW5kIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQg
cmVjdXJzaW9uIGRlcHRoLgorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJlc3VsdDsKKyAgICB7
CisgICAgICAgIENvbnNvbGVNZXNzYWdlU2NvcGUgc2NvcGU7CisgICAgICAgIG1fcmVjdXJzaW9u
Kys7CisKKyAgICAgICAgLy8gRXZhbHVhdGluZyB0aGUgSmF2YVNjcmlwdCBjb3VsZCBjYXVzZSB0
aGUgZnJhbWUgdG8gYmUgZGVhbGxvY2F0ZWQsCisgICAgICAgIC8vIHNvIHdlIHN0YXJ0IHRoZSBr
ZWVwIGFsaXZlIHRpbWVyIGhlcmUuCisgICAgICAgIC8vIEZyYW1lOjprZWVwQWxpdmUgbWV0aG9k
IGFkZHMgdGhlIHJlZiBjb3VudCBvZiB0aGUgZnJhbWUgYW5kIHNldHMgYQorICAgICAgICAvLyB0
aW1lciB0byBkZWNyZWFzZSB0aGUgcmVmIGNvdW50LiBJdCBhc3N1bWVzIHRoYXQgdGhlIGN1cnJl
bnQgSmF2YVNjcmlwdAorICAgICAgICAvLyBleGVjdXRpb24gZmluaXNocyBiZWZvcmUgZmlyaW5n
IHRoZSB0aW1lci4KKyAgICAgICAgLy8gU2VlIGlzc3VlIDEyMTg3NTYgYW5kIDkxNDQzMC4KKyAg
ICAgICAgbV9mcmFtZS0+a2VlcEFsaXZlKCk7CisKKyAgICAgICAgcmVzdWx0ID0gc2NyaXB0LT5S
dW4oKTsKKyAgICAgICAgbV9yZWN1cnNpb24tLTsKKyAgICB9CisKKyAgICBpZiAoSGFuZGxlT3V0
T2ZNZW1vcnkoKSkKKyAgICAgICAgQVNTRVJUKHJlc3VsdC5Jc0VtcHR5KCkpOworCisgICAgLy8g
SGFuZGxlIFY4IGludGVybmFsIGVycm9yIHNpdHVhdGlvbiAoT3V0LW9mLW1lbW9yeSkuCisgICAg
aWYgKHJlc3VsdC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNl
cHRvcigpOworCisgICAgLy8gUmVzdG9yZSBpbmxpbmVDb2RlIGZsYWcuCisgICAgc2V0SW5saW5l
Q29kZShwcmV2aW91c0lubGluZUNvZGUpOworCisgICAgaWYgKHY4OjpWODo6SXNEZWFkKCkpCisg
ICAgICAgIEhhbmRsZUZhdGFsRXJyb3JJblY4KCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQor
CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFY4UHJveHk6OkNhbGxGdW5jdGlvbih2ODo6SGFuZGxl
PHY4OjpGdW5jdGlvbj4gZnVuY3Rpb24sIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gcmVjZWl2ZXIs
IGludCBhcmdjLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJnc1tdKQoreworICAgIC8vIEZvciBu
b3csIHdlIGRvbid0IHB1dCBhbnkgYXJ0aWZpY2lhbCBsaW1pdGF0aW9ucyBvbiB0aGUgZGVwdGgK
KyAgICAvLyBvZiByZWN1cnNpb24gdGhhdCBzdGVtcyBmcm9tIGNhbGxpbmcgZnVuY3Rpb25zLiBU
aGlzIGlzIGluCisgICAgLy8gY29udHJhc3QgdG8gdGhlIHNjcmlwdCBldmFsdWF0aW9ucy4KKyAg
ICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQ7CisgICAgeworICAgICAgICBDb25zb2xlTWVz
c2FnZVNjb3BlIHNjb3BlOworCisgICAgICAgIC8vIEV2YWx1YXRpbmcgdGhlIEphdmFTY3JpcHQg
Y291bGQgY2F1c2UgdGhlIGZyYW1lIHRvIGJlIGRlYWxsb2NhdGVkLAorICAgICAgICAvLyBzbyB3
ZSBzdGFydCB0aGUga2VlcCBhbGl2ZSB0aW1lciBoZXJlLgorICAgICAgICAvLyBGcmFtZTo6a2Vl
cEFsaXZlIG1ldGhvZCBhZGRzIHRoZSByZWYgY291bnQgb2YgdGhlIGZyYW1lIGFuZCBzZXRzIGEK
KyAgICAgICAgLy8gdGltZXIgdG8gZGVjcmVhc2UgdGhlIHJlZiBjb3VudC4gSXQgYXNzdW1lcyB0
aGF0IHRoZSBjdXJyZW50IEphdmFTY3JpcHQKKyAgICAgICAgLy8gZXhlY3V0aW9uIGZpbmlzaHMg
YmVmb3JlIGZpcmluZyB0aGUgdGltZXIuCisgICAgICAgIC8vIFNlZSBpc3N1ZSAxMjE4NzU2IGFu
ZCA5MTQ0MzAuCisgICAgICAgIG1fZnJhbWUtPmtlZXBBbGl2ZSgpOworCisgICAgICAgIHJlc3Vs
dCA9IGZ1bmN0aW9uLT5DYWxsKHJlY2VpdmVyLCBhcmdjLCBhcmdzKTsKKyAgICB9CisKKyAgICBp
ZiAodjg6OlY4OjpJc0RlYWQoKSkKKyAgICAgICAgSGFuZGxlRmF0YWxFcnJvckluVjgoKTsKKwor
ICAgIHJldHVybiByZXN1bHQ7Cit9CisKKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gVjhQcm94eTo6
TmV3SW5zdGFuY2Uodjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+IGNvbnN0cnVjdG9yLCBpbnQgYXJn
Yywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZ3NbXSkKK3sKKyAgICAvLyBObyBhcnRpZmljaWFs
IGxpbWl0YXRpb25zIG9uIHRoZSBkZXB0aCBvZiByZWN1cnNpb24sIHNlZSBjb21tZW50IGluCisg
ICAgLy8gVjhQcm94eTo6Q2FsbEZ1bmN0aW9uLgorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJl
c3VsdDsKKyAgICB7CisgICAgICAgIENvbnNvbGVNZXNzYWdlU2NvcGUgc2NvcGU7CisKKyAgICAg
ICAgLy8gU2VlIGNvbW1lbnQgaW4gVjhQcm94eTo6Q2FsbEZ1bmN0aW9uLgorICAgICAgICBtX2Zy
YW1lLT5rZWVwQWxpdmUoKTsKKworICAgICAgICByZXN1bHQgPSBjb25zdHJ1Y3Rvci0+TmV3SW5z
dGFuY2UoYXJnYywgYXJncyk7CisgICAgfQorCisgICAgaWYgKHY4OjpWODo6SXNEZWFkKCkpCisg
ICAgICAgIEhhbmRsZUZhdGFsRXJyb3JJblY4KCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQor
CisKK3Y4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IFY4UHJveHk6OkdldENvbnN0cnVjdG9yKFY4Q2xh
c3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0KQoreworICAgIC8vIEEgRE9NIGNvbnN0cnVjdG9yIGlz
IGEgZnVuY3Rpb24gaW5zdGFuY2UgY3JlYXRlZCBmcm9tIGEgRE9NIGNvbnN0cnVjdG9yCisgICAg
Ly8gdGVtcGxhdGUuIFRoZXJlIGlzIG9uZSBpbnN0YW5jZSBwZXIgY29udGV4dC4gQSBET00gY29u
c3RydWN0b3IgaXMKKyAgICAvLyBkaWZmZXJlbnQgZnJvbSBhIG5vcm1hbCBmdW5jdGlvbiBpbiB0
d28gd2F5czoKKyAgICAvLyAgIDEpIGl0IGNhbm5vdCBiZSBjYWxsZWQgYXMgY29uc3RydWN0b3Ig
KGFrYSwgdXNlZCB0byBjcmVhdGUgYSBET00gb2JqZWN0KQorICAgIC8vICAgMikgaXRzIF9fcHJv
dG9fXyBwb2ludHMgdG8gT2JqZWN0LnByb3RvdHlwZSByYXRoZXIgdGhhbgorICAgIC8vICAgICAg
RnVuY3Rpb24ucHJvdG90eXBlLgorICAgIC8vIFRoZSByZWFzb24gZm9yIDIpIGlzIHRoYXQsIGlu
IFNhZmFyaSwgYSBET00gY29uc3RydWN0b3IgaXMgYSBub3JtYWwgSlMKKyAgICAvLyBvYmplY3Qs
IGJ1dCBub3QgYSBmdW5jdGlvbi4gSG90bWFpbCByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCwgaW4g
U2FmYXJpLAorICAgIC8vIEhUTUxFbGVtZW50Ll9fcHJvdG9fXyA9PSBPYmplY3QucHJvdG90eXBl
LgorICAgIC8vCisgICAgLy8gbV9vYmplY3RQcm90b3R5cGUgaXMgYSBjYWNoZSBvZiB0aGUgb3Jp
Z2luYWwgT2JqZWN0LnByb3RvdHlwZS4KKworICAgIEFTU0VSVChDb250ZXh0SW5pdGlhbGl6ZWQo
KSk7CisgICAgLy8gRW50ZXIgdGhlIGNvbnRleHQgb2YgdGhlIHByb3h5IHRvIG1ha2Ugc3VyZSB0
aGF0IHRoZQorICAgIC8vIGZ1bmN0aW9uIGlzIGNvbnN0cnVjdGVkIGluIHRoZSBjb250ZXh0IGNv
cnJlc3BvbmRpbmcgdG8KKyAgICAvLyB0aGlzIHByb3h5LgorICAgIHY4OjpDb250ZXh0OjpTY29w
ZSBzY29wZShtX2NvbnRleHQpOworICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+
IHRlbXBsID0gR2V0VGVtcGxhdGUodCk7CisgICAgLy8gR2V0dGluZyB0aGUgZnVuY3Rpb24gbWln
aHQgZmFpbCBpZiB3ZSdyZSBydW5uaW5nIG91dCBvZgorICAgIC8vIHN0YWNrIG9yIG1lbW9yeS4K
KyAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7CisgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4g
dmFsdWUgPSB0ZW1wbC0+R2V0RnVuY3Rpb24oKTsKKyAgICBpZiAodmFsdWUuSXNFbXB0eSgpKQor
ICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+KCk7CisgICAgLy8gSG90bWFpbCBm
aXgsIHNlZSBjb21tZW50cyBhYm92ZS4KKyAgICB2YWx1ZS0+U2V0KHY4OjpTdHJpbmc6Ok5ldygi
X19wcm90b19fIiksIG1fb2JqZWN0UHJvdG90eXBlKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisK
Kwordjg6OkxvY2FsPHY4OjpPYmplY3Q+IFY4UHJveHk6OkNyZWF0ZVdyYXBwZXJGcm9tQ2FjaGUo
VjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUpCit7CisgICAgaW50IGNsYXNzSW5kZXgg
PSBWOENsYXNzSW5kZXg6OlRvSW50KHR5cGUpOworICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGNh
Y2hlZE9iamVjdCA9IG1fd3JhcHBlckJvaWxlcnBsYXRlcy0+R2V0KHY4OjpJbnRlZ2VyOjpOZXco
Y2xhc3NJbmRleCkpOworICAgIGlmIChjYWNoZWRPYmplY3QtPklzT2JqZWN0KCkpIHsKKyAgICAg
ICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6
Q2FzdChjYWNoZWRPYmplY3QpOworICAgICAgICByZXR1cm4gb2JqZWN0LT5DbG9uZSgpOworICAg
IH0KKworICAgIC8vIE5vdCBpbiBjYWNoZS4KKyAgICBJbml0Q29udGV4dElmTmVlZGVkKCk7Cisg
ICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKG1fY29udGV4dCk7CisgICAgdjg6OkxvY2FsPHY4
OjpGdW5jdGlvbj4gZnVuY3Rpb24gPSBHZXRDb25zdHJ1Y3Rvcih0eXBlKTsKKyAgICB2ODo6TG9j
YWw8djg6Ok9iamVjdD4gaW5zdGFuY2UgPSBTYWZlQWxsb2NhdGlvbjo6TmV3SW5zdGFuY2UoZnVu
Y3Rpb24pOworICAgIGlmICghaW5zdGFuY2UuSXNFbXB0eSgpKSB7CisgICAgICAgIG1fd3JhcHBl
ckJvaWxlcnBsYXRlcy0+U2V0KHY4OjpJbnRlZ2VyOjpOZXcoY2xhc3NJbmRleCksIGluc3RhbmNl
KTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlLT5DbG9uZSgpOworICAgIH0KKyAgICByZXR1cm4g
bm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKK30KKworCisvLyBHZXQgdGhlIHN0cmluZyAndG9T
dHJpbmcnLgorc3RhdGljIHY4OjpQZXJzaXN0ZW50PHY4OjpTdHJpbmc+IEdldFRvU3RyaW5nTmFt
ZSgpCit7CisgIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6U3RyaW5nPiB2YWx1ZTsKKyAgaWYg
KHZhbHVlLklzRW1wdHkoKSkKKyAgICAgIHZhbHVlID0gdjg6OlBlcnNpc3RlbnQ8djg6OlN0cmlu
Zz46Ok5ldyh2ODo6U3RyaW5nOjpOZXcoInRvU3RyaW5nIikpOworICByZXR1cm4gdmFsdWU7Cit9
CisKKworc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBDb25zdHJ1Y3RvclRvU3RyaW5nKGNv
bnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCit7CisgICAgLy8gVGhlIERPTSBjb25zdHJ1Y3RvcnMn
IHRvU3RyaW5nIGZ1bmN0aW9ucyBncmFiIHRoZSBjdXJyZW50IHRvU3RyaW5nCisgICAgLy8gZm9y
IEZ1bmN0aW9ucyBieSB0YWtpbmcgdGhlIHRvU3RyaW5nIGZ1bmN0aW9uIG9mIGl0c2VsZiBhbmQg
dGhlbgorICAgIC8vIGNhbGxpbmcgaXQgd2l0aCB0aGUgY29uc3RydWN0b3IgYXMgaXRzIHJlY2Vp
dmVyLiAgVGhpcyBtZWFucyB0aGF0CisgICAgLy8gY2hhbmdlcyB0byB0aGUgRnVuY3Rpb24gcHJv
dG90eXBlIGNoYWluIG9yIHRvU3RyaW5nIGZ1bmN0aW9uIGFyZQorICAgIC8vIHJlZmxlY3RlZCB3
aGVuIHByaW50aW5nIERPTSBjb25zdHJ1Y3RvcnMuICBUaGUgb25seSB3YXJ0IGlzIHRoYXQKKyAg
ICAvLyBjaGFuZ2VzIHRvIGEgRE9NIGNvbnN0cnVjdG9yJ3MgdG9TdHJpbmcncyB0b1N0cmluZyB3
aWxsIGNhdXNlIHRoZQorICAgIC8vIHRvU3RyaW5nIG9mIHRoZSBET00gY29uc3RydWN0b3IgaXRz
ZWxmIHRvIGNoYW5nZS4gIFRoaXMgaXMgZXh0cmVtZWx5CisgICAgLy8gb2JzY3VyZSBhbmQgdW5s
aWtlbHkgdG8gYmUgYSBwcm9ibGVtLgorICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWwgPSBh
cmdzLkNhbGxlZSgpLT5HZXQoR2V0VG9TdHJpbmdOYW1lKCkpOworICAgIGlmICghdmFsLT5Jc0Z1
bmN0aW9uKCkpIAorICAgICAgICByZXR1cm4gdjg6OlN0cmluZzo6TmV3KCIiKTsKKyAgICByZXR1
cm4gdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+OjpDYXN0KHZhbCktPkNhbGwoYXJncy5UaGlzKCks
IDAsIE5VTEwpOworfQorCisKK3Y4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBW
OFByb3h5OjpHZXRUZW1wbGF0ZShWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSkKK3sK
KyAgICB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4qIGNhY2hlQ2VsbCA9IFY4
Q2xhc3NJbmRleDo6R2V0Q2FjaGUodHlwZSk7CisgICAgaWYgKCEoKmNhY2hlQ2VsbCkuSXNFbXB0
eSgpKQorICAgICAgICByZXR1cm4gKmNhY2hlQ2VsbDsKKworICAgIC8vIG5vdCBmb3VuZAorICAg
IEZ1bmN0aW9uVGVtcGxhdGVGYWN0b3J5IGZhY3RvcnkgPSBWOENsYXNzSW5kZXg6OkdldEZhY3Rv
cnkodHlwZSk7CisgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGRlc2Mg
PSBmYWN0b3J5KCk7CisgICAgLy8gRE9NIGNvbnN0cnVjdG9ycyBhcmUgZnVuY3Rpb25zIGFuZCBz
aG91bGQgcHJpbnQgdGhlbXNlbHZlcyBhcyBzdWNoLgorICAgIC8vIEhvd2V2ZXIsIHdlIHdpbGwg
bGF0ZXIgcmVwbGFjZSB0aGVpciBwcm90b3R5cGVzIHdpdGggT2JqZWN0CisgICAgLy8gcHJvdG90
eXBlcyBzbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgb3ZlcnJpZGUgdG9TdHJpbmcgb24gdGhlCisg
ICAgLy8gaW5zdGFuY2UgaXRzZWxmLiAgSWYgd2UgbGF0ZXIgbWFrZSBET00gY29uc3RydWN0b3Jz
IGZ1bGwgb2JqZWN0cworICAgIC8vIHdlIGNhbiBnaXZlIHRoZW0gY2xhc3MgbmFtZXMgaW5zdGVh
ZCBhbmQgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZworICAgIC8vIHdpbGwgd29yayBzbyB3ZSBj
YW4gcmVtb3ZlIHRoaXMgY29kZS4KKyAgICBzdGF0aWMgdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0
aW9uVGVtcGxhdGU+IHRvU3RyaW5nVGVtcGxhdGU7CisgICAgaWYgKHRvU3RyaW5nVGVtcGxhdGUu
SXNFbXB0eSgpKQorICAgICAgICB0b1N0cmluZ1RlbXBsYXRlID0gdjg6OlBlcnNpc3RlbnQ8djg6
OkZ1bmN0aW9uVGVtcGxhdGU+OjpOZXcodjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhDb25zdHJ1
Y3RvclRvU3RyaW5nKSk7CisgICAgZGVzYy0+U2V0KEdldFRvU3RyaW5nTmFtZSgpLCB0b1N0cmlu
Z1RlbXBsYXRlKTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6
Q1NTU1RZTEVERUNMQVJBVElPTjoKKyAgICAgICAgLy8gVGhlIG5hbWVkIHByb3BlcnR5IGhhbmRs
ZXIgZm9yIHN0eWxlIGRlY2xhcmF0aW9ucyBoYXMgYQorICAgICAgICAvLyBzZXR0ZXIuICBUaGVy
ZWZvcmUsIHRoZSBpbnRlcmNlcHRvciBoYXMgdG8gYmUgb24gdGhlIG9iamVjdAorICAgICAgICAv
LyBpdHNlbGYgYW5kIG5vdCBvbiB0aGUgcHJvdG90eXBlIG9iamVjdC4KKyAgICAgICAgZGVzYy0+
SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlciggVVNFX05BTUVEX1BS
T1BFUlRZX0dFVFRFUihDU1NTdHlsZURlY2xhcmF0aW9uKSwgVVNFX05BTUVEX1BST1BFUlRZX1NF
VFRFUihDU1NTdHlsZURlY2xhcmF0aW9uKSk7CisgICAgICAgIHNldENvbGxlY3Rpb25TdHJpbmdP
ck51bGxJbmRleGVkR2V0dGVyPENTU1N0eWxlRGVjbGFyYXRpb24+KGRlc2MpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q1NTUlVMRUxJU1Q6CisgICAgICAgIHNldENv
bGxlY3Rpb25JbmRleGVkR2V0dGVyPENTU1J1bGVMaXN0LCBDU1NSdWxlPihkZXNjLCAgVjhDbGFz
c0luZGV4OjpDU1NSVUxFKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6
OkNTU1ZBTFVFTElTVDoKKyAgICAgICAgc2V0Q29sbGVjdGlvbkluZGV4ZWRHZXR0ZXI8Q1NTVmFs
dWVMaXN0LCBDU1NWYWx1ZT4oZGVzYywgVjhDbGFzc0luZGV4OjpDU1NWQUxVRSk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpDU1NWQVJJQUJMRVNERUNMQVJBVElPTjoK
KyAgICAgICAgc2V0Q29sbGVjdGlvblN0cmluZ09yTnVsbEluZGV4ZWRHZXR0ZXI8Q1NTVmFyaWFi
bGVzRGVjbGFyYXRpb24+KGRlc2MpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJ
bmRleDo6V0VCS0lUQ1NTVFJBTlNGT1JNVkFMVUU6CisgICAgICAgIHNldENvbGxlY3Rpb25JbmRl
eGVkR2V0dGVyPFdlYktpdENTU1RyYW5zZm9ybVZhbHVlLCBDU1NWYWx1ZT4oZGVzYywgVjhDbGFz
c0luZGV4OjpDU1NWQUxVRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4
OjpVTkRFVEVDVEFCTEVIVE1MQ09MTEVDVElPTjoKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1w
bGF0ZSgpLT5NYXJrQXNVbmRldGVjdGFibGUoKTsgIC8vIGZhbGwgdGhyb3VnaAorICAgIGNhc2Ug
VjhDbGFzc0luZGV4OjpIVE1MQ09MTEVDVElPTjoKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1w
bGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVS
KEhUTUxDb2xsZWN0aW9uKSk7CisgICAgICAgIGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0
Q2FsbEFzRnVuY3Rpb25IYW5kbGVyKFVTRV9DQUxMQkFDSyhIVE1MQ29sbGVjdGlvbkNhbGxBc0Z1
bmN0aW9uKSk7CisgICAgICAgIHNldENvbGxlY3Rpb25JbmRleGVkR2V0dGVyPEhUTUxDb2xsZWN0
aW9uLCBOb2RlPihkZXNjLCBWOENsYXNzSW5kZXg6Ok5PREUpOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OOgorICAgICAgICBkZXNj
LT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldE5hbWVkUHJvcGVydHlIYW5kbGVyKFVTRV9OQU1FRF9Q
Uk9QRVJUWV9HRVRURVIoSFRNTENvbGxlY3Rpb24pKTsKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VU
ZW1wbGF0ZSgpLT5TZXRJbmRleGVkUHJvcGVydHlIYW5kbGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZ
X0dFVFRFUihIVE1MT3B0aW9uc0NvbGxlY3Rpb24pLCBVU0VfSU5ERVhFRF9QUk9QRVJUWV9TRVRU
RVIoSFRNTE9wdGlvbnNDb2xsZWN0aW9uKSk7CisgICAgICAgIGRlc2MtPkluc3RhbmNlVGVtcGxh
dGUoKS0+U2V0Q2FsbEFzRnVuY3Rpb25IYW5kbGVyKFVTRV9DQUxMQkFDSyhIVE1MQ29sbGVjdGlv
bkNhbGxBc0Z1bmN0aW9uKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4
OjpIVE1MU0VMRUNURUxFTUVOVDoKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5T
ZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxTZWxl
Y3RFbGVtZW50Q29sbGVjdGlvbikpOworICAgICAgICBkZXNjLT5JbnN0YW5jZVRlbXBsYXRlKCkt
PlNldEluZGV4ZWRQcm9wZXJ0eUhhbmRsZXIobm9kZUNvbGxlY3Rpb25JbmRleGVkUHJvcGVydHlH
ZXR0ZXI8SFRNTFNlbGVjdEVsZW1lbnQ+LCBVU0VfSU5ERVhFRF9QUk9QRVJUWV9TRVRURVIoSFRN
TFNlbGVjdEVsZW1lbnRDb2xsZWN0aW9uKSwKKyAgICAgICAgICAgIDAsIDAsIG5vZGVDb2xsZWN0
aW9uSW5kZXhlZFByb3BlcnR5RW51bWVyYXRvcjxIVE1MU2VsZWN0RWxlbWVudD4sIHY4OjpJbnRl
Z2VyOjpOZXcoVjhDbGFzc0luZGV4OjpOT0RFKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
VjhDbGFzc0luZGV4OjpIVE1MRE9DVU1FTlQ6IHsKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1w
bGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVS
KEhUTUxEb2N1bWVudCksIDAsIDAsIFVTRV9OQU1FRF9QUk9QRVJUWV9ERUxFVEVSKEhUTUxEb2N1
bWVudCkpOworCisgICAgICAgIC8vIFdlIGFkZCBhbiBleHRyYSBpbnRlcm5hbCBmaWVsZCB0byBh
bGwgRG9jdW1lbnQgd3JhcHBlcnMgZm9yCisgICAgICAgIC8vIHN0b3JpbmcgYSBwZXIgZG9jdW1l
bnQgRE9NSW1wbGVtZW50YXRpb24gd3JhcHBlci4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWRk
aXRpb25hbGx5LCB3ZSBhZGQgdHdvIGV4dHJhIGludGVybmFsIGZpZWxkcyBmb3IKKyAgICAgICAg
Ly8gSFRNTERvY3VtZW50cyB0byBpbXBsZW1lbnQgdGVtcG9yYXJ5IHNoYWRvd2luZyBvZgorICAg
ICAgICAvLyBkb2N1bWVudC5hbGwuICBPbmUgZmllbGQgaG9sZHMgYW4gb2JqZWN0IHRoYXQgaXMg
dXNlZCBhcyBhCisgICAgICAgIC8vIG1hcmtlci4gIFRoZSBvdGhlciBmaWVsZCBob2xkcyB0aGUg
bWFya2VyIG9iamVjdCBpZgorICAgICAgICAvLyBkb2N1bWVudC5hbGwgaXMgbm90IHNoYWRvd2Vk
IGFuZCBzb21lIG90aGVyIHZhbHVlIGlmCisgICAgICAgIC8vIGRvY3VtZW50LmFsbCBpcyBzaGFk
b3dlZC4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1w
bGF0ZSA9IGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAgICAgICAgQVNTRVJUKGluc3RhbmNl
VGVtcGxhdGUtPkludGVybmFsRmllbGRDb3VudCgpID09IFY4Q3VzdG9tOjprRGVmYXVsdFdyYXBw
ZXJJbnRlcm5hbEZpZWxkQ291bnQpOworICAgICAgICBpbnN0YW5jZVRlbXBsYXRlLT5TZXRJbnRl
cm5hbEZpZWxkQ291bnQoVjhDdXN0b206OmtIVE1MRG9jdW1lbnRJbnRlcm5hbEZpZWxkQ291bnQp
OworICAgICAgICBicmVhazsKKyAgICB9CisjaWYgRU5BQkxFKFNWRykKKyAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6U1ZHRE9DVU1FTlQ6ICAvLyBmYWxsIHRocm91Z2gKKyNlbmRpZgorICAgIGNhc2Ug
VjhDbGFzc0luZGV4OjpET0NVTUVOVDogeworICAgICAgICAvLyBXZSBhZGQgYW4gZXh0cmEgaW50
ZXJuYWwgZmllbGQgdG8gYWxsIERvY3VtZW50IHdyYXBwZXJzIGZvcgorICAgICAgICAvLyBzdG9y
aW5nIGEgcGVyIGRvY3VtZW50IERPTUltcGxlbWVudGF0aW9uIHdyYXBwZXIuCisgICAgICAgIHY4
OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjLT5JbnN0
YW5jZVRlbXBsYXRlKCk7CisgICAgICAgIEFTU0VSVChpbnN0YW5jZVRlbXBsYXRlLT5JbnRlcm5h
bEZpZWxkQ291bnQoKSA9PSBWOEN1c3RvbTo6a0RlZmF1bHRXcmFwcGVySW50ZXJuYWxGaWVsZENv
dW50KTsKKyAgICAgICAgaW5zdGFuY2VUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KCBW
OEN1c3RvbTo6a0RvY3VtZW50TWluaW11bUludGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGJy
ZWFrOworICAgIH0KKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTEFQUExFVEVMRU1FTlQ6ICAv
LyBmYWxsIHRocm91Z2gKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTEVNQkVERUxFTUVOVDog
IC8vIGZhbGwgdGhyb3VnaAorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpIVE1MT0JKRUNURUxFTUVO
VDoKKyAgICAgICAgLy8gSFRNTEFwcGxldEVsZW1lbnQsIEhUTUxFbWJlZEVsZW1lbnQgYW5kIEhU
TUxPYmplY3RFbGVtZW50IGFyZQorICAgICAgICAvLyBpbmhlcml0ZWQgZnJvbSBIVE1MUGx1Z0lu
RWxlbWVudCwgYW5kIHRoZXkgc2hhcmUgdGhlIHNhbWUgcHJvcGVydHkKKyAgICAgICAgLy8gaGFu
ZGxpbmcgY29kZS4KKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFBy
b3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxQbHVnSW5FbGVtZW50
KSwgVVNFX05BTUVEX1BST1BFUlRZX1NFVFRFUihIVE1MUGx1Z0luRWxlbWVudCkpOworICAgICAg
ICBkZXNjLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldEluZGV4ZWRQcm9wZXJ0eUhhbmRsZXIoVVNF
X0lOREVYRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxQbHVnSW5FbGVtZW50KSwgVVNFX0lOREVYRURf
UFJPUEVSVFlfU0VUVEVSKEhUTUxQbHVnSW5FbGVtZW50KSk7CisgICAgICAgIGRlc2MtPkluc3Rh
bmNlVGVtcGxhdGUoKS0+U2V0Q2FsbEFzRnVuY3Rpb25IYW5kbGVyKFVTRV9DQUxMQkFDSyhIVE1M
UGx1Z0luRWxlbWVudCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6
SFRNTEZSQU1FU0VURUxFTUVOVDoKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5T
ZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxGcmFt
ZVNldEVsZW1lbnQpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhU
TUxGT1JNRUxFTUVOVDoKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1l
ZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxGb3JtRWxlbWVu
dCkpOworICAgICAgICBkZXNjLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldEluZGV4ZWRQcm9wZXJ0
eUhhbmRsZXIoVVNFX0lOREVYRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxGb3JtRWxlbWVudCksIDAs
IDAsIDAsIG5vZGVDb2xsZWN0aW9uSW5kZXhlZFByb3BlcnR5RW51bWVyYXRvcjxIVE1MRm9ybUVs
ZW1lbnQ+LCB2ODo6SW50ZWdlcjo6TmV3KFY4Q2xhc3NJbmRleDo6Tk9ERSkpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q0FOVkFTUElYRUxBUlJBWToKKyAgICAgICAg
ZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRJbmRleGVkUHJvcGVydHlIYW5kbGVyKFVTRV9J
TkRFWEVEX1BST1BFUlRZX0dFVFRFUihDYW52YXNQaXhlbEFycmF5KSwgVVNFX0lOREVYRURfUFJP
UEVSVFlfU0VUVEVSKENhbnZhc1BpeGVsQXJyYXkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVQ6ICAvLyBmYWxsIHRocm91Z2gKKyAgICBjYXNlIFY4
Q2xhc3NJbmRleDo6Q1NTU1RZTEVTSEVFVDogeworICAgICAgICAvLyBXZSBhZGQgYW4gZXh0cmEg
aW50ZXJuYWwgZmllbGQgdG8gaG9sZCBhIHJlZmVyZW5jZSB0bworICAgICAgICAvLyB0aGUgb3du
ZXIgbm9kZS4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VU
ZW1wbGF0ZSA9IGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAgICAgICAgQVNTRVJUKGluc3Rh
bmNlVGVtcGxhdGUtPkludGVybmFsRmllbGRDb3VudCgpID09IFY4Q3VzdG9tOjprRGVmYXVsdFdy
YXBwZXJJbnRlcm5hbEZpZWxkQ291bnQpOworICAgICAgICBpbnN0YW5jZVRlbXBsYXRlLT5TZXRJ
bnRlcm5hbEZpZWxkQ291bnQoVjhDdXN0b206OmtTdHlsZVNoZWV0SW50ZXJuYWxGaWVsZENvdW50
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpNRURJQUxJ
U1Q6CisgICAgICAgIHNldENvbGxlY3Rpb25TdHJpbmdPck51bGxJbmRleGVkR2V0dGVyPE1lZGlh
TGlzdD4oZGVzYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpNSU1F
VFlQRUFSUkFZOgorICAgICAgICBzZXRDb2xsZWN0aW9uSW5kZXhlZEFuZE5hbWVkR2V0dGVyczxN
aW1lVHlwZUFycmF5LCBNaW1lVHlwZT4oZGVzYywgVjhDbGFzc0luZGV4OjpNSU1FVFlQRSk7Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpOQU1FRE5PREVNQVA6CisgICAg
ICAgIGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNF
X05BTUVEX1BST1BFUlRZX0dFVFRFUihOYW1lZE5vZGVNYXApKTsKKyAgICAgICAgZGVzYy0+SW5z
dGFuY2VUZW1wbGF0ZSgpLT5TZXRJbmRleGVkUHJvcGVydHlIYW5kbGVyKFVTRV9JTkRFWEVEX1BS
T1BFUlRZX0dFVFRFUihOYW1lZE5vZGVNYXApLCAwLCAwLCAwLCBjb2xsZWN0aW9uSW5kZXhlZFBy
b3BlcnR5RW51bWVyYXRvcjxOYW1lZE5vZGVNYXA+LCB2ODo6SW50ZWdlcjo6TmV3KFY4Q2xhc3NJ
bmRleDo6Tk9ERSkpOworICAgICAgICBicmVhazsKKyNpZiBFTkFCTEUoRE9NX1NUT1JBR0UpDQor
ICAgIGNhc2UgVjhDbGFzc0luZGV4OjpTVE9SQUdFOg0KKyAgICAgICAgZGVzYy0+SW5zdGFuY2VU
ZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VU
VEVSKFN0b3JhZ2UpLCBVU0VfTkFNRURfUFJPUEVSVFlfU0VUVEVSKFN0b3JhZ2UpLCAwLCBVU0Vf
TkFNRURfUFJPUEVSVFlfREVMRVRFUihTdG9yYWdlKSwgVjhDdXN0b206OnY4U3RvcmFnZU5hbWVk
UHJvcGVydHlFbnVtZXJhdG9yKTsNCisgICAgICAgIGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKS0+
U2V0SW5kZXhlZFByb3BlcnR5SGFuZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoU3Rv
cmFnZSksIFVTRV9JTkRFWEVEX1BST1BFUlRZX1NFVFRFUihTdG9yYWdlKSwgMCwgVVNFX0lOREVY
RURfUFJPUEVSVFlfREVMRVRFUihTdG9yYWdlKSk7DQorICAgICAgICBicmVhazsNCisjZW5kaWYK
KyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Tk9ERUxJU1Q6CisgICAgICAgIHNldENvbGxlY3Rpb25J
bmRleGVkR2V0dGVyPE5vZGVMaXN0LCBOb2RlPihkZXNjLCBWOENsYXNzSW5kZXg6Ok5PREUpOwor
ICAgICAgICBkZXNjLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldE5hbWVkUHJvcGVydHlIYW5kbGVy
KFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoTm9kZUxpc3QpKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBWOENsYXNzSW5kZXg6OlBMVUdJTjoKKyAgICAgICAgc2V0Q29sbGVjdGlvbkluZGV4
ZWRBbmROYW1lZEdldHRlcnM8UGx1Z2luLCBNaW1lVHlwZT4oZGVzYywgVjhDbGFzc0luZGV4OjpN
SU1FVFlQRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpQTFVHSU5B
UlJBWToKKyAgICAgICAgc2V0Q29sbGVjdGlvbkluZGV4ZWRBbmROYW1lZEdldHRlcnM8UGx1Z2lu
QXJyYXksIFBsdWdpbj4oZGVzYywgVjhDbGFzc0luZGV4OjpQTFVHSU4pOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6U1RZTEVTSEVFVExJU1Q6CisgICAgICAgIGRlc2Mt
Pkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BS
T1BFUlRZX0dFVFRFUihTdHlsZVNoZWV0TGlzdCkpOworICAgICAgICBzZXRDb2xsZWN0aW9uSW5k
ZXhlZEdldHRlcjxTdHlsZVNoZWV0TGlzdCwgU3R5bGVTaGVldD4oZGVzYywgVjhDbGFzc0luZGV4
OjpTVFlMRVNIRUVUKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkRP
TVdJTkRPVzogeworICAgICAgICB2ODo6TG9jYWw8djg6OlNpZ25hdHVyZT4gZGVmYXVsdF9zaWdu
YXR1cmUgPSB2ODo6U2lnbmF0dXJlOjpOZXcoZGVzYyk7CisKKyAgICAgICAgZGVzYy0+UHJvdG90
eXBlVGVtcGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZ
X0dFVFRFUihET01XaW5kb3cpKTsKKyAgICAgICAgZGVzYy0+UHJvdG90eXBlVGVtcGxhdGUoKS0+
U2V0SW5kZXhlZFByb3BlcnR5SGFuZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoRE9N
V2luZG93KSk7CisKKyAgICAgICAgZGVzYy0+U2V0SGlkZGVuUHJvdG90eXBlKHRydWUpOworCisg
ICAgICAgIC8vIFJlc2VydmUgc3BhY2VzIGZvciByZWZlcmVuY2VzIHRvIGxvY2F0aW9uLCBoaXN0
b3J5IGFuZAorICAgICAgICAvLyBuYXZpZ2F0b3Igb2JqZWN0cy4KKyAgICAgICAgdjg6OkxvY2Fs
PHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9ZGVzYy0+SW5zdGFuY2VUZW1w
bGF0ZSgpOworICAgICAgICBpbnN0YW5jZVRlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQo
VjhDdXN0b206OmtET01XaW5kb3dJbnRlcm5hbEZpZWxkQ291bnQpOworCisgICAgICAgIC8vIFNl
dCBhY2Nlc3MgY2hlY2sgY2FsbGJhY2tzLCBidXQgdHVybmVkIG9mZiBpbml0aWFsbHkuCisgICAg
ICAgIC8vIFdoZW4gYSBjb250ZXh0IGlzIGRldGFjaGVkIGZyb20gYSBmcmFtZSwgdHVybiBvbiB0
aGUgYWNjZXNzIGNoZWNrLgorICAgICAgICAvLyBUdXJuaW5nIG9uIGNoZWNrcyBhbHNvIGludmFs
aWRhdGVzIGlubGluZSBjYWNoZXMgb2YgdGhlIG9iamVjdC4KKyAgICAgICAgaW5zdGFuY2VUZW1w
bGF0ZS0+U2V0QWNjZXNzQ2hlY2tDYWxsYmFja3MoVjhDdXN0b206OnY4RE9NV2luZG93TmFtZWRT
ZWN1cml0eUNoZWNrLCBWOEN1c3RvbTo6djhET01XaW5kb3dJbmRleGVkU2VjdXJpdHlDaGVjaywg
djg6OkludGVnZXI6Ok5ldyhWOENsYXNzSW5kZXg6OkRPTVdJTkRPVyksIGZhbHNlKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpMT0NBVElPTjogeworICAg
ICAgICAvLyBGb3Igc2VjdXJpdHkgcmVhc29ucywgdGhlc2UgZnVuY3Rpb25zIGFyZSBvbiB0aGUg
aW5zdGFuY2UKKyAgICAgICAgLy8gaW5zdGVhZCBvZiBvbiB0aGUgcHJvdG90eXBlIG9iamVjdCB0
byBpbnN1cmUgdGhhdCB0aGV5IGNhbm5vdAorICAgICAgICAvLyBiZSBvdmVyd3JpdHRlbi4KKyAg
ICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2UgPSBkZXNjLT5JbnN0
YW5jZVRlbXBsYXRlKCk7CisgICAgICAgIGluc3RhbmNlLT5TZXRBY2Nlc3Nvcih2ODo6U3RyaW5n
OjpOZXcoInJlbG9hZCIpLCBWOEN1c3RvbTo6djhMb2NhdGlvblJlbG9hZEFjY2Vzc29yR2V0dGVy
LCAwLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKSwgdjg6OkFMTF9DQU5fUkVBRCwgc3RhdGljX2Nh
c3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6RG9udERlbGV0ZXx2ODo6UmVhZE9ubHkpKTsK
KyAgICAgICAgaW5zdGFuY2UtPlNldEFjY2Vzc29yKHY4OjpTdHJpbmc6Ok5ldygicmVwbGFjZSIp
LCBWOEN1c3RvbTo6djhMb2NhdGlvblJlcGxhY2VBY2Nlc3NvckdldHRlciwgMCwgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+KCksIHY4OjpBTExfQ0FOX1JFQUQsIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0
eUF0dHJpYnV0ZT4odjg6OkRvbnREZWxldGV8djg6OlJlYWRPbmx5KSk7CisgICAgICAgIGluc3Rh
bmNlLT5TZXRBY2Nlc3Nvcih2ODo6U3RyaW5nOjpOZXcoImFzc2lnbiIpLCBWOEN1c3RvbTo6djhM
b2NhdGlvbkFzc2lnbkFjY2Vzc29yR2V0dGVyLCAwLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKSwg
djg6OkFMTF9DQU5fUkVBRCwgc3RhdGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6
RG9udERlbGV0ZXx2ODo6UmVhZE9ubHkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNh
c2UgVjhDbGFzc0luZGV4OjpISVNUT1JZOgorICAgICAgICBicmVhazsKKworICAgIGNhc2UgVjhD
bGFzc0luZGV4OjpNRVNTQUdFQ0hBTk5FTDogeworICAgICAgICAvLyBSZXNlcnZlIHR3byBtb3Jl
IGludGVybmFsIGZpZWxkcyBmb3IgcmVmZXJlbmNpbmcgdGhlIHBvcnQxCisgICAgICAgIC8vIGFu
ZCBwb3J0MiB3cmFwcGVycy4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBwb3J0IHdyYXBwZXJzIGFy
ZQorICAgICAgICAvLyBrZXB0IGFsaXZlIHdoZW4gdGhlIGNoYW5uZWwgd3JhcHBlciBpcy4KKyAg
ICAgICAgZGVzYy0+U2V0Q2FsbEhhbmRsZXIoVVNFX0NBTExCQUNLKE1lc3NhZ2VDaGFubmVsQ29u
c3RydWN0b3IpKTsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFu
Y2VUZW1wbGF0ZSA9IGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2VU
ZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9tOjprTWVzc2FnZUNoYW5uZWxJ
bnRlcm5hbEZpZWxkQ291bnQpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFY4
Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQ6IHsKKyAgICAgICAgLy8gUmVzZXJ2ZSBvbmUgbW9yZSBp
bnRlcm5hbCBmaWVsZCBmb3Iga2VlcGluZyBldmVudCBsaXN0ZW5lcnMuCisgICAgICAgIHY4OjpM
b2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjLT5JbnN0YW5j
ZVRlbXBsYXRlKCk7CisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUtPlNldEludGVybmFsRmllbGRD
b3VudChWOEN1c3RvbTo6a01lc3NhZ2VQb3J0SW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAg
YnJlYWs7CisgICAgfQorCisjaWYgRU5BQkxFKFdPUktFUlMpCisgICAgY2FzZSBWOENsYXNzSW5k
ZXg6OldPUktFUjogeworICAgICAgICAvLyBSZXNlcnZlIG9uZSBtb3JlIGludGVybmFsIGZpZWxk
IGZvciBrZWVwaW5nIGV2ZW50IGxpc3RlbmVycy4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmpl
Y3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKTsK
KyAgICAgICAgaW5zdGFuY2VUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9t
OjprV29ya2VySW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgZGVzYy0+U2V0Q2FsbEhhbmRs
ZXIoVVNFX0NBTExCQUNLKFdvcmtlckNvbnN0cnVjdG9yKSk7CisgICAgICAgIGJyZWFrOworICAg
IH0KKworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhUOiB7CisgICAgICAgIC8v
IFJlc2VydmUgb25lIG1vcmUgaW50ZXJuYWwgZmllbGQgZm9yIGtlZXBpbmcgZXZlbnQgbGlzdGVu
ZXJzLgorICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBpbnN0YW5jZVRlbXBs
YXRlID0gZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBpbnN0YW5jZVRlbXBsYXRl
LT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoVjhDdXN0b206OmtXb3JrZXJDb250ZXh0SW50ZXJuYWxG
aWVsZENvdW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmICAvLyBXT1JLRVJTCisK
KyAgICAvLyBUaGUgZm9sbG93aW5nIG9iamVjdHMgYXJlIGNyZWF0ZWQgZnJvbSBKYXZhU2NyaXB0
LgorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpET01QQVJTRVI6CisgICAgICAgIGRlc2MtPlNldENh
bGxIYW5kbGVyKFVTRV9DQUxMQkFDSyhET01QYXJzZXJDb25zdHJ1Y3RvcikpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTElNQUdFRUxFTUVOVDoKKyAgICAgICAg
ZGVzYy0+U2V0Q2FsbEhhbmRsZXIoVVNFX0NBTExCQUNLKEhUTUxJbWFnZUVsZW1lbnRDb25zdHJ1
Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTE9QVElP
TkVMRU1FTlQ6CisgICAgICAgIGRlc2MtPlNldENhbGxIYW5kbGVyKFVTRV9DQUxMQkFDSyhIVE1M
T3B0aW9uRWxlbWVudENvbnN0cnVjdG9yKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhD
bGFzc0luZGV4OjpXRUJLSVRDU1NNQVRSSVg6CisgICAgICAgIGRlc2MtPlNldENhbGxIYW5kbGVy
KFVTRV9DQUxMQkFDSyhXZWJLaXRDU1NNYXRyaXhDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6V0VCS0lUUE9JTlQ6CisgICAgICAgIGRlc2MtPlNl
dENhbGxIYW5kbGVyKFVTRV9DQUxMQkFDSyhXZWJLaXRQb2ludENvbnN0cnVjdG9yKSk7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpYTUxTRVJJQUxJWkVSOgorICAgICAg
ICBkZXNjLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJBQ0soWE1MU2VyaWFsaXplckNvbnN0cnVj
dG9yKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVR
VUVTVDogeworICAgICAgICAvLyBSZXNlcnZlIG9uZSBtb3JlIGludGVybmFsIGZpZWxkIGZvciBr
ZWVwaW5nIGV2ZW50IGxpc3RlbmVycy4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1w
bGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAgICAg
ICAgaW5zdGFuY2VUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9tOjprWE1M
SHR0cFJlcXVlc3RJbnRlcm5hbEZpZWxkQ291bnQpOworICAgICAgICBkZXNjLT5TZXRDYWxsSGFu
ZGxlcihVU0VfQ0FMTEJBQ0soWE1MSHR0cFJlcXVlc3RDb25zdHJ1Y3RvcikpOworICAgICAgICBi
cmVhazsKKyAgICB9CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FE
OiB7CisgICAgICAgIC8vIFJlc2VydmUgb25lIG1vcmUgaW50ZXJuYWwgZmllbGQgZm9yIGtlZXBp
bmcgZXZlbnQgbGlzdGVuZXJzLgorICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRl
PiBpbnN0YW5jZVRlbXBsYXRlID0gZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBp
bnN0YW5jZVRlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoVjhDdXN0b206OmtYTUxIdHRw
UmVxdWVzdEludGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBj
YXNlIFY4Q2xhc3NJbmRleDo6WFBBVEhFVkFMVUFUT1I6CisgICAgICAgIGRlc2MtPlNldENhbGxI
YW5kbGVyKFVTRV9DQUxMQkFDSyhYUGF0aEV2YWx1YXRvckNvbnN0cnVjdG9yKSk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SOgorICAgICAgICBk
ZXNjLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJBQ0soWFNMVFByb2Nlc3NvckNvbnN0cnVjdG9y
KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpDTElFTlRSRUNUTElT
VDoKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRJbmRleGVkUHJvcGVydHlI
YW5kbGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZX0dFVFRFUihDbGllbnRSZWN0TGlzdCkpOworICAg
ICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAq
Y2FjaGVDZWxsID0gZGVzYzsKKyAgICByZXR1cm4gZGVzYzsKK30KKworCitib29sIFY4UHJveHk6
OkNvbnRleHRJbml0aWFsaXplZCgpCit7CisgICAgLy8gbV9jb250ZXh0LCBtX2dsb2JhbCwgbV9v
YmplY3RQcm90b3R5cGUgYW5kIG1fd3JhcHBlckJvaWxlcnBsYXRlcyBzaG91bGQKKyAgICAvLyBh
bGwgYmUgbm9uLWVtcHR5IGlmIGlmIG1fY29udGV4dCBpcyBub24tZW1wdHkuCisgICAgQVNTRVJU
KG1fY29udGV4dC5Jc0VtcHR5KCkgfHwgIW1fZ2xvYmFsLklzRW1wdHkoKSk7CisgICAgQVNTRVJU
KG1fY29udGV4dC5Jc0VtcHR5KCkgfHwgIW1fb2JqZWN0UHJvdG90eXBlLklzRW1wdHkoKSk7Cisg
ICAgQVNTRVJUKG1fY29udGV4dC5Jc0VtcHR5KCkgfHwgIW1fd3JhcHBlckJvaWxlcnBsYXRlcy5J
c0VtcHR5KCkpOworICAgIHJldHVybiAhbV9jb250ZXh0LklzRW1wdHkoKTsKK30KKworCitET01X
aW5kb3cqIFY4UHJveHk6OnJldHJpZXZlV2luZG93KCkKK3sKKyAgICAvLyBUT0RPOiBUaGlzIHNl
ZW1zIHZlcnkgZnJhZ2lsZS4gSG93IGRvIHdlIGtub3cgdGhhdCB0aGUgZ2xvYmFsIG9iamVjdAor
ICAgIC8vIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCBpcyBzb21ldGhpbmcgc2Vuc2libGU/IERv
IHdlIG5lZWQgdG8gdXNlIHRoZQorICAgIC8vIGxhc3QgZW50ZXJlZCBoZXJlPyBXaG8gY2FsbHMg
dGhpcz8KKyAgICByZXR1cm4gcmV0cmlldmVXaW5kb3codjg6OkNvbnRleHQ6OkdldEN1cnJlbnQo
KSk7Cit9CisKKworRE9NV2luZG93KiBWOFByb3h5OjpyZXRyaWV2ZVdpbmRvdyh2ODo6SGFuZGxl
PHY4OjpDb250ZXh0PiBjb250ZXh0KQoreworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xv
YmFsID0gY29udGV4dC0+R2xvYmFsKCk7CisgICAgQVNTRVJUKCFnbG9iYWwuSXNFbXB0eSgpKTsK
KyAgICBnbG9iYWwgPSBMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBn
bG9iYWwpOworICAgIEFTU0VSVCghZ2xvYmFsLklzRW1wdHkoKSk7CisgICAgcmV0dXJuIFRvTmF0
aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGdsb2JhbCk7Cit9
CisKKworRnJhbWUqIFY4UHJveHk6OnJldHJpZXZlRnJhbWUodjg6OkhhbmRsZTx2ODo6Q29udGV4
dD4gY29udGV4dCkKK3sKKyAgICByZXR1cm4gcmV0cmlldmVXaW5kb3coY29udGV4dCktPmZyYW1l
KCk7Cit9CisKKworRnJhbWUqIFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JFbnRlcmVkQ29udGV4
dCgpCit7CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0
OjpHZXRFbnRlcmVkKCk7CisgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1
cm4gMDsKKyAgICByZXR1cm4gcmV0cmlldmVGcmFtZShjb250ZXh0KTsKK30KKworCitGcmFtZSog
VjhQcm94eTo6cmV0cmlldmVGcmFtZUZvckN1cnJlbnRDb250ZXh0KCkKK3sKKyAgICB2ODo6SGFu
ZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gdjg6OkNvbnRleHQ6OkdldEN1cnJlbnQoKTsKKyAg
ICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBy
ZXRyaWV2ZUZyYW1lKGNvbnRleHQpOworfQorCisKK0ZyYW1lKiBWOFByb3h5OjpyZXRyaWV2ZUZy
YW1lRm9yQ2FsbGluZ0NvbnRleHQoKQoreworICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNv
bnRleHQgPSB2ODo6Q29udGV4dDo6R2V0Q2FsbGluZygpOworICAgIGlmIChjb250ZXh0LklzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHJldHJpZXZlRnJhbWUoY29udGV4
dCk7Cit9CisKKworRnJhbWUqIFY4UHJveHk6OnJldHJpZXZlRnJhbWUoKQoreworICAgIERPTVdp
bmRvdyogd2luZG93ID0gcmV0cmlldmVXaW5kb3coKTsKKyAgICByZXR1cm4gd2luZG93ID8gd2lu
ZG93LT5mcmFtZSgpIDogMDsKK30KKworCitWOFByb3h5KiBWOFByb3h5OjpyZXRyaWV2ZSgpCit7
CisgICAgRE9NV2luZG93KiB3aW5kb3cgPSByZXRyaWV2ZVdpbmRvdygpOworICAgIEFTU0VSVCh3
aW5kb3cpOworICAgIHJldHVybiByZXRyaWV2ZSh3aW5kb3ctPmZyYW1lKCkpOworfQorCitWOFBy
b3h5KiBWOFByb3h5OjpyZXRyaWV2ZShGcmFtZSogZnJhbWUpCit7CisgICAgaWYgKCFmcmFtZSkK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGZyYW1lLT5zY3JpcHQoKS0+aXNFbmFibGVk
KCkgPyBmcmFtZS0+c2NyaXB0KCktPnByb3h5KCkgOiAwOworfQorCisKK1Y4UHJveHkqIFY4UHJv
eHk6OnJldHJpZXZlKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQpCit7CisgICAgaWYg
KCFjb250ZXh0LT5pc0RvY3VtZW50KCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBy
ZXRyaWV2ZShzdGF0aWNfY2FzdDxEb2N1bWVudCo+KGNvbnRleHQpLT5mcmFtZSgpKTsKK30KKwor
Cit2b2lkIFY4UHJveHk6OmRpc2Nvbm5lY3RGcmFtZSgpCit7CisgICAgLy8gZGlzY29ubmVjdCBh
bGwgZXZlbnQgbGlzdGVuZXJzCisgICAgRGlzY29ubmVjdEV2ZW50TGlzdGVuZXJzKCk7Cit9CisK
KworYm9vbCBWOFByb3h5Ojppc0VuYWJsZWQoKQoreworICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9
IG1fZnJhbWUtPnNldHRpbmdzKCk7CisgICAgaWYgKCFzZXR0aW5ncykKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgLy8gSW4gdGhlIGNvbW1vbiBjYXNlLCBKYXZhU2NyaXB0IGlzIGVuYWJs
ZWQgYW5kIHdlJ3JlIGRvbmUuCisgICAgaWYgKHNldHRpbmdzLT5pc0phdmFTY3JpcHRFbmFibGVk
KCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gSWYgSmF2YVNjcmlwdCBoYXMgYmVl
biBkaXNhYmxlZCwgd2UgbmVlZCB0byBsb29rIGF0IHRoZSBmcmFtZSB0byB0ZWxsCisgICAgLy8g
d2hldGhlciB0aGlzIHNjcmlwdCBjYW1lIGZyb20gdGhlIHdlYiBvciB0aGUgZW1iZWRkZXIuIFNj
cmlwdHMgZnJvbSB0aGUKKyAgICAvLyBlbWJlZGRlciBhcmUgc2FmZSB0byBydW4sIGJ1dCBzY3Jp
cHRzIGZyb20gdGhlIG90aGVyIHNvdXJjZXMgYXJlCisgICAgLy8gZGlzYWxsb3dlZC4KKyAgICBE
b2N1bWVudCogZG9jdW1lbnQgPSBtX2ZyYW1lLT5kb2N1bWVudCgpOworICAgIGlmICghZG9jdW1l
bnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4g
PSBkb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKTsKKyAgICBpZiAob3JpZ2luLT5wcm90b2NvbCgp
LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gVW5pbml0aWFsaXplZCBkb2N1
bWVudAorCisgICAgaWYgKG9yaWdpbi0+cHJvdG9jb2woKSA9PSAiaHR0cCIgfHwgb3JpZ2luLT5w
cm90b2NvbCgpID09ICJodHRwcyIpCisgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIFdlYiBzaXRl
CisKKyAgICAvLyBGSVhNRTogdGhlIGZvbGxvd2luZyBhcmUgYXBwbGljYXRpb24gZGVjaXNpb25z
LCBhbmQgdGhleSBzaG91bGQKKyAgICAvLyBub3QgYmUgbWFkZSBhdCB0aGlzIGxheWVyLiAgaW5z
dGVhZCwgd2Ugc2hvdWxkIGJyaWRnZSBvdXQgdG8gdGhlCisgICAgLy8gZW1iZWRkZXIgdG8gYWxs
b3cgdGhlbSB0byBvdmVycmlkZSBwb2xpY3kgaGVyZS4KKworICAgIGlmIChvcmlnaW4tPnByb3Rv
Y29sKCkgPT0gQ2hyb21pdW1CcmlkZ2U6OnVpUmVzb3VyY2VQcm90b2NvbCgpKQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsgICAvLyBFbWJlZGRlcidzIHNjcmlwdHMgYXJlIG9rIHRvIHJ1bgorCisgICAg
Ly8gSWYgdGhlIHNjaGVtZSBpcyBmdHA6IG9yIGZpbGU6LCBhbiBlbXB0eSBmaWxlIG5hbWUgaW5k
aWNhdGVzIGEgZGlyZWN0b3J5CisgICAgLy8gbGlzdGluZywgd2hpY2ggcmVxdWlyZXMgSmF2YVNj
cmlwdCB0byBmdW5jdGlvbiBwcm9wZXJseS4KKyAgICBjb25zdCBjaGFyKiBrRGlyUHJvdG9jb2xz
W10gPSB7ICJmdHAiLCAiZmlsZSIgfTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5
c2l6ZShrRGlyUHJvdG9jb2xzKTsgKytpKSB7CisgICAgICAgIGlmIChvcmlnaW4tPnByb3RvY29s
KCkgPT0ga0RpclByb3RvY29sc1tpXSkgeworICAgICAgICAgICAgY29uc3QgS1VSTCYgdXJsID0g
ZG9jdW1lbnQtPnVybCgpOworICAgICAgICAgICAgcmV0dXJuIHVybC5wYXRoQWZ0ZXJMYXN0U2xh
c2goKSA9PSB1cmwucGF0aEVuZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZh
bHNlOyAgLy8gT3RoZXIgcHJvdG9jb2xzIGZhbGwgdGhyb3VnaCB0byBoZXJlCit9CisKKwordm9p
ZCBWOFByb3h5OjpVcGRhdGVEb2N1bWVudFdyYXBwZXIodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdy
YXBwZXIpCit7CisgICAgQ2xlYXJEb2N1bWVudFdyYXBwZXIoKTsKKworICAgIEFTU0VSVChtX2Rv
Y3VtZW50LklzRW1wdHkoKSk7CisgICAgbV9kb2N1bWVudCA9IHY4OjpQZXJzaXN0ZW50PHY4OjpW
YWx1ZT46Ok5ldyh3cmFwcGVyKTsKKyNpZm5kZWYgTkRFQlVHCisgICAgUmVnaXN0ZXJHbG9iYWxI
YW5kbGUoUFJPWFksIHRoaXMsIG1fZG9jdW1lbnQpOworI2VuZGlmCit9CisKKwordm9pZCBWOFBy
b3h5OjpDbGVhckRvY3VtZW50V3JhcHBlcigpCit7CisgICAgaWYgKCFtX2RvY3VtZW50LklzRW1w
dHkoKSkgeworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgVW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0
aGlzLCBtX2RvY3VtZW50KTsKKyNlbmRpZgorICAgICAgICBtX2RvY3VtZW50LkRpc3Bvc2UoKTsK
KyAgICAgICAgbV9kb2N1bWVudC5DbGVhcigpOworICAgIH0KK30KKworCit2b2lkIFY4UHJveHk6
OlVwZGF0ZURvY3VtZW50V3JhcHBlckNhY2hlKCkKK3sKKyAgICB2ODo6SGFuZGxlU2NvcGUgaGFu
ZGxlU2NvcGU7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRTY29wZShHZXRDb250ZXh0
KCkpOworCisgICAgLy8gSWYgdGhlIGRvY3VtZW50IGhhcyBubyBmcmFtZSwgTm9kZVRvVjhPYmpl
Y3QgbWlnaHQgZ2V0IHRoZQorICAgIC8vIGRvY3VtZW50IHdyYXBwZXIgZm9yIGEgZG9jdW1lbnQg
dGhhdCBpcyBhYm91dCB0byBiZSBkZWxldGVkLgorICAgIC8vIElmIHRoZSBGb3JjZVNldCBiZWxv
dyBjYXVzZXMgYSBnYXJiYWdlIGNvbGxlY3Rpb24sIHRoZSBkb2N1bWVudAorICAgIC8vIG1pZ2h0
IGdldCBkZWxldGVkIGFuZCB0aGUgZ2xvYmFsIGhhbmRsZSBmb3IgdGhlIGRvY3VtZW50CisgICAg
Ly8gd3JhcHBlciBjbGVhcmVkLiBVc2luZyB0aGUgY2xlYXJlZCBnbG9iYWwgaGFuZGxlIHdpbGwg
bGVhZCB0bworICAgIC8vIGNyYXNoZXMuICBJbiB0aGlzIGNhc2Ugd2UgY2xlYXIgdGhlIGNhY2hl
IGFuZCBsZXQgdGhlIERPTVdpbmRvdworICAgIC8vIGFjY2Vzc29yIGhhbmRsZSBhY2Nlc3MgdG8g
dGhlIGRvY3VtZW50LgorICAgIGlmICghbV9mcmFtZS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSkgewor
ICAgICAgICBDbGVhckRvY3VtZW50V3JhcHBlckNhY2hlKCk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZG9jdW1lbnRXcmFwcGVyID0gTm9kZVRv
VjhPYmplY3QobV9mcmFtZS0+ZG9jdW1lbnQoKSk7CisKKyAgICAvLyBJZiBpbnN0YW50aWF0aW9u
IG9mIHRoZSBkb2N1bWVudCB3cmFwcGVyIGZhaWxzLCBjbGVhciB0aGUgY2FjaGUNCisgICAgLy8g
YW5kIGxldCB0aGUgRE9NV2luZG93IGFjY2Vzc29yIGhhbmRsZSBhY2Nlc3MgdG8gdGhlIGRvY3Vt
ZW50Lg0KKyAgICBpZiAoZG9jdW1lbnRXcmFwcGVyLklzRW1wdHkoKSkgew0KKyAgICAgICAgQ2xl
YXJEb2N1bWVudFdyYXBwZXJDYWNoZSgpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9CisgICAg
bV9jb250ZXh0LT5HbG9iYWwoKS0+Rm9yY2VTZXQodjg6OlN0cmluZzo6TmV3KCJkb2N1bWVudCIp
LCBkb2N1bWVudFdyYXBwZXIsIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6
OlJlYWRPbmx5IHwgdjg6OkRvbnREZWxldGUpKTsKK30KKworCit2b2lkIFY4UHJveHk6OkNsZWFy
RG9jdW1lbnRXcmFwcGVyQ2FjaGUoKQoreworICAgIEFTU0VSVCghbV9jb250ZXh0LklzRW1wdHko
KSk7CisgICAgbV9jb250ZXh0LT5HbG9iYWwoKS0+Rm9yY2VEZWxldGUodjg6OlN0cmluZzo6TmV3
KCJkb2N1bWVudCIpKTsKK30KKworCit2b2lkIFY4UHJveHk6OkRpc3Bvc2VDb250ZXh0SGFuZGxl
cygpCit7CisgICAgaWYgKCFtX2NvbnRleHQuSXNFbXB0eSgpKSB7CisgICAgICAgIG1fY29udGV4
dC5EaXNwb3NlKCk7CisgICAgICAgIG1fY29udGV4dC5DbGVhcigpOworICAgIH0KKworICAgIGlm
ICghbV93cmFwcGVyQm9pbGVycGxhdGVzLklzRW1wdHkoKSkgeworI2lmbmRlZiBOREVCVUcKKyAg
ICAgICAgVW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBtX3dyYXBwZXJCb2lsZXJwbGF0ZXMp
OworI2VuZGlmCisgICAgICAgIG1fd3JhcHBlckJvaWxlcnBsYXRlcy5EaXNwb3NlKCk7CisgICAg
ICAgIG1fd3JhcHBlckJvaWxlcnBsYXRlcy5DbGVhcigpOworICAgIH0KKworICAgIGlmICghbV9v
YmplY3RQcm90b3R5cGUuSXNFbXB0eSgpKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgICBVbnJl
Z2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMsIG1fb2JqZWN0UHJvdG90eXBlKTsKKyNlbmRpZgorICAg
ICAgICBtX29iamVjdFByb3RvdHlwZS5EaXNwb3NlKCk7CisgICAgICAgIG1fb2JqZWN0UHJvdG90
eXBlLkNsZWFyKCk7CisgICAgfQorfQorCit2b2lkIFY4UHJveHk6OmNsZWFyRm9yQ2xvc2UoKQor
eworICAgIGlmICghbV9jb250ZXh0LklzRW1wdHkoKSkgeworICAgICAgICB2ODo6SGFuZGxlU2Nv
cGUgaGFuZGxlU2NvcGU7CisKKyAgICAgICAgQ2xlYXJEb2N1bWVudFdyYXBwZXIoKTsKKyAgICAg
ICAgRGlzcG9zZUNvbnRleHRIYW5kbGVzKCk7CisgICAgfQorfQorCisKK3ZvaWQgVjhQcm94eTo6
Y2xlYXJGb3JOYXZpZ2F0aW9uKCkKK3sKKyAgICAvLyBkaXNjb25uZWN0IGFsbCBldmVudCBsaXN0
ZW5lcnMKKyAgICBEaXNjb25uZWN0RXZlbnRMaXN0ZW5lcnMoKTsKKworICAgIGlmICghbV9jb250
ZXh0LklzRW1wdHkoKSkgeworICAgICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlOworICAgICAg
ICBDbGVhckRvY3VtZW50V3JhcHBlcigpOworCisgICAgICAgIHY4OjpDb250ZXh0OjpTY29wZSBj
b250ZXh0U2NvcGUobV9jb250ZXh0KTsKKworICAgICAgICAvLyBDbGVhciB0aGUgZG9jdW1lbnQg
d3JhcHBlciBjYWNoZSBiZWZvcmUgdHVybmluZyBvbiBhY2Nlc3MgY2hlY2tzIG9uCisgICAgICAg
IC8vIHRoZSBvbGQgRE9NV2luZG93IHdyYXBwZXIuICBUaGlzIHdheSwgYWNjZXNzIHRvIHRoZSBk
b2N1bWVudCB3cmFwcGVyCisgICAgICAgIC8vIHdpbGwgYmUgcHJvdGVjdGVkIGJ5IHRoZSBzZWN1
cml0eSBjaGVja3Mgb24gdGhlIERPTVdpbmRvdyB3cmFwcGVyLgorICAgICAgICBDbGVhckRvY3Vt
ZW50V3JhcHBlckNhY2hlKCk7CisKKyAgICAgICAgLy8gVHVybiBvbiBhY2Nlc3MgY2hlY2sgb24g
dGhlIG9sZCBET01XaW5kb3cgd3JhcHBlci4KKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0
PiB3cmFwcGVyID0gTG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgbV9n
bG9iYWwpOworICAgICAgICBBU1NFUlQoIXdyYXBwZXIuSXNFbXB0eSgpKTsKKyAgICAgICAgd3Jh
cHBlci0+VHVybk9uQWNjZXNzQ2hlY2soKTsKKworICAgICAgICAvLyBTZXBhcmF0ZSB0aGUgY29u
dGV4dCBmcm9tIGl0cyBnbG9iYWwgb2JqZWN0LgorICAgICAgICBtX2NvbnRleHQtPkRldGFjaEds
b2JhbCgpOworCisgICAgICAgIERpc3Bvc2VDb250ZXh0SGFuZGxlcygpOworCisgICAgICAgIC8v
IFJlaW5pdGlhbGl6ZSB0aGUgY29udGV4dCBzbyB0aGUgZ2xvYmFsIG9iamVjdCBwb2ludHMgdG8K
KyAgICAgICAgLy8gdGhlIG5ldyBET00gd2luZG93LgorICAgICAgICBJbml0Q29udGV4dElmTmVl
ZGVkKCk7CisgICAgfQorfQorCisKK3ZvaWQgVjhQcm94eTo6U2V0U2VjdXJpdHlUb2tlbigpCit7
CisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gbV9mcmFtZS0+ZG9jdW1lbnQoKTsKKyAgICAvLyBT
ZXR1cCBzZWN1cml0eSBvcmlnaW4gYW5kIHNlY3VyaXR5IHRva2VuCisgICAgaWYgKCFkb2N1bWVu
dCkgeworICAgICAgICBtX2NvbnRleHQtPlVzZURlZmF1bHRTZWN1cml0eVRva2VuKCk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBBc2sgdGhlIGRvY3VtZW50J3MgU2VjdXJpdHlP
cmlnaW4gdG8gZ2VuZXJhdGUgYSBzZWN1cml0eSB0b2tlbi4KKyAgICAvLyBJZiB0d28gdG9rZW5z
IGFyZSBlcXVhbCwgdGhlbiB0aGUgU2VjdXJpdHlPcmlnaW5zIGNhbkFjY2VzcyBlYWNoIG90aGVy
LgorICAgIC8vIElmIHR3byB0b2tlbnMgYXJlIG5vdCBlcXVhbCwgdGhlbiB3ZSBoYXZlIHRvIGNh
bGwgY2FuQWNjZXNzLgorICAgIC8vIE5vdGU6IHdlIGNhbid0IHVzZSB0aGUgSFRUUE9yaWdpbiBp
ZiBpdCB3YXMgc2V0IGZyb20gdGhlIERPTS4KKyAgICBTZWN1cml0eU9yaWdpbiogb3JpZ2luID0g
ZG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCk7CisgICAgU3RyaW5nIHRva2VuOworICAgIGlmICgh
b3JpZ2luLT5kb21haW5XYXNTZXRJbkRPTSgpKQorICAgICAgICB0b2tlbiA9IGRvY3VtZW50LT5z
ZWN1cml0eU9yaWdpbigpLT50b1N0cmluZygpOworCisgICAgLy8gQW4gZW1wdHkgb3IgIm51bGwi
IHRva2VuIG1lYW5zIHdlIGFsd2F5cyBoYXZlIHRvIGNhbGwKKyAgICAvLyBjYW5BY2Nlc3MuICBU
aGUgdG9TdHJpbmcgbWV0aG9kIG9uIHNlY3VyaXR5T3JpZ2lucyByZXR1cm5zIHRoZQorICAgIC8v
IHN0cmluZyAibnVsbCIgZm9yIGVtcHR5IHNlY3VyaXR5IG9yaWdpbnMgYW5kIGZvciBzZWN1cml0
eQorICAgIC8vIG9yaWdpbnMgdGhhdCBzaG91bGQgb25seSBhbGxvdyBhY2Nlc3MgdG8gdGhlbXNl
bHZlcy4gIEluIHRoaXMKKyAgICAvLyBjYXNlLCB3ZSB1c2UgdGhlIGdsb2JhbCBvYmplY3QgYXMg
dGhlIHNlY3VyaXR5IHRva2VuIHRvIGF2b2lkCisgICAgLy8gY2FsbGluZyBjYW5BY2Nlc3Mgd2hl
biBhIHNjcmlwdCBhY2Nlc3NlcyBpdHMgb3duIG9iamVjdHMuCisgICAgaWYgKHRva2VuLmlzRW1w
dHkoKSB8fCB0b2tlbiA9PSAibnVsbCIpIHsKKyAgICAgICAgbV9jb250ZXh0LT5Vc2VEZWZhdWx0
U2VjdXJpdHlUb2tlbigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ1N0cmluZyB1
dGY4X3Rva2VuID0gdG9rZW4udXRmOCgpOworICAgIC8vIE5PVEU6IFY4IGRvZXMgaWRlbnRpdHkg
Y29tcGFyaXNvbiBpbiBmYXN0IHBhdGgsIG11c3QgdXNlIGEgc3ltYm9sCisgICAgLy8gYXMgdGhl
IHNlY3VyaXR5IHRva2VuLgorICAgIG1fY29udGV4dC0+U2V0U2VjdXJpdHlUb2tlbih2ODo6U3Ry
aW5nOjpOZXdTeW1ib2wodXRmOF90b2tlbi5kYXRhKCksIHV0ZjhfdG9rZW4ubGVuZ3RoKCkpKTsK
K30KKworCit2b2lkIFY4UHJveHk6OnVwZGF0ZURvY3VtZW50KCkKK3sKKyAgICBpZiAoIW1fZnJh
bWUtPmRvY3VtZW50KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2dsb2JhbC5Jc0Vt
cHR5KCkpIHsKKyAgICAgICAgQVNTRVJUKG1fY29udGV4dC5Jc0VtcHR5KCkpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgLy8gV2UgaGF2ZSBhIG5ldyBkb2N1bWVudCBhbmQgd2UgbmVl
ZCB0byB1cGRhdGUgdGhlIGNhY2hlLgorICAgIFVwZGF0ZURvY3VtZW50V3JhcHBlckNhY2hlKCk7
CisKKyAgICB1cGRhdGVTZWN1cml0eU9yaWdpbigpOworfQorCit2b2lkIFY4UHJveHk6OnVwZGF0
ZVNlY3VyaXR5T3JpZ2luKCkKK3sKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgU2V0
U2VjdXJpdHlUb2tlbigpOworfQorCisvLyBTYW1lIG9yaWdpbiBwb2xpY3kgaW1wbGVtZW50YXRp
b246CisvLworLy8gU2FtZSBvcmlnaW4gcG9saWN5IHByZXZlbnRzIEpTIGNvZGUgZnJvbSBkb21h
aW4gQSBhY2Nlc3MgSlMgJiBET00gb2JqZWN0cworLy8gaW4gYSBkaWZmZXJlbnQgZG9tYWluIEIu
IFRoZXJlIGFyZSBleGNlcHRpb25zIGFuZCBzZXZlcmFsIG9iamVjdHMgYXJlCisvLyBhY2Nlc3Np
YmxlIGJ5IGNyb3NzLWRvbWFpbiBjb2RlLiBGb3IgZXhhbXBsZSwgdGhlIHdpbmRvdy5mcmFtZXMg
b2JqZWN0IGlzCisvLyBhY2Nlc3NpYmxlIGJ5IGNvZGUgZnJvbSBhIGRpZmZlcmVudCBkb21haW4s
IGJ1dCB3aW5kb3cuZG9jdW1lbnQgaXMgbm90LgorLy8KKy8vIFRoZSBiaW5kaW5nIGNvZGUgc2V0
cyBzZWN1cml0eSBjaGVjayBjYWxsYmFja3Mgb24gYSBmdW5jdGlvbiB0ZW1wbGF0ZSwKKy8vIGFu
ZCBhY2Nlc3NpbmcgaW5zdGFuY2VzIG9mIHRoZSB0ZW1wbGF0ZSBjYWxscyB0aGUgY2FsbGJhY2sg
ZnVuY3Rpb24uCisvLyBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gY2hlY2tzIHNhbWUgb3JpZ2luIHBv
bGljeS4KKy8vCisvLyBDYWxsYmFjayBmdW5jdGlvbnMgYXJlIGV4cGVuc2l2ZS4gVjggdXNlcyBh
IHNlY3VyaXR5IHRva2VuIHN0cmluZyB0byBkbworLy8gZmFzdCBhY2Nlc3MgY2hlY2tzIGZvciB0
aGUgY29tbW9uIGNhc2Ugd2hlcmUgc291cmNlIGFuZCB0YXJnZXQgYXJlIGluIHRoZQorLy8gc2Ft
ZSBkb21haW4uIEEgc2VjdXJpdHkgdG9rZW4gaXMgYSBzdHJpbmcgb2JqZWN0IHRoYXQgcmVwcmVz
ZW50cworLy8gdGhlIHByb3RvY29sL3VybC9wb3J0IG9mIGEgZG9tYWluLgorLy8KKy8vIFRoZXJl
IGFyZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGEgc2VjdXJpdHkgdG9rZW4gbWF0Y2hpbmcgaXMgbm90
IGVub3VnaC4KKy8vIEZvciBleGFtcGxlLCBKYXZhU2NyaXB0IGNhbiBzZXQgaXRzIGRvbWFpbiB0
byBhIHN1cGVyIGRvbWFpbiBieSBjYWxsaW5nCisvLyBkb2N1bWVudC5zZXREb21haW4oLi4uKS4g
SW4gdGhlc2UgY2FzZXMsIHRoZSBiaW5kaW5nIGNvZGUgY2FuIHJlc2V0CisvLyBhIGNvbnRleHQn
cyBzZWN1cml0eSB0b2tlbiB0byBpdHMgZ2xvYmFsIG9iamVjdCBzbyB0aGF0IHRoZSBmYXN0IGFj
Y2VzcworLy8gY2hlY2sgd2lsbCBhbHdheXMgZmFpbC4KKworLy8gQ2hlY2sgaWYgdGhlIGN1cnJl
bnQgZXhlY3V0aW9uIGNvbnRleHQgY2FuIGFjY2VzcyBhIHRhcmdldCBmcmFtZS4KKy8vIEZpcnN0
IGl0IGNoZWNrcyBzYW1lIGRvbWFpbiBwb2xpY3kgdXNpbmcgdGhlIGxleGljYWwgY29udGV4dAor
Ly8KKy8vIFRoaXMgaXMgZXF1aXZhbGVudCB0byBLSlM6OldpbmRvdzo6YWxsb3dzQWNjZXNzRnJv
bShFeGVjU3RhdGUqLCBTdHJpbmcmKS4KK2Jvb2wgVjhQcm94eTo6Q2FuQWNjZXNzUHJpdmF0ZShE
T01XaW5kb3cqIHRhcmdldFdpbmRvdykKK3sKKyAgICBBU1NFUlQodGFyZ2V0V2luZG93KTsKKwor
ICAgIFN0cmluZyBtZXNzYWdlOworCisgICAgRE9NV2luZG93KiBvcmlnaW5XaW5kb3cgPSByZXRy
aWV2ZVdpbmRvdygpOworICAgIGlmIChvcmlnaW5XaW5kb3cgPT0gdGFyZ2V0V2luZG93KQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghb3JpZ2luV2luZG93KQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBjb25zdCBTZWN1cml0eU9yaWdpbiogYWN0aXZlU2VjdXJpdHlPcmln
aW4gPSBvcmlnaW5XaW5kb3ctPnNlY3VyaXR5T3JpZ2luKCk7CisgICAgY29uc3QgU2VjdXJpdHlP
cmlnaW4qIHRhcmdldFNlY3VyaXR5T3JpZ2luID0gdGFyZ2V0V2luZG93LT5zZWN1cml0eU9yaWdp
bigpOworCisgICAgLy8gV2UgaGF2ZSBzZWVuIGNyYXNoZXMgd2VyZSB0aGUgc2VjdXJpdHkgb3Jp
Z2luIG9mIHRoZSB0YXJnZXQgaGFzIG5vdCBiZWVuCisgICAgLy8gaW5pdGlhbGl6ZWQuICBEZWZl
bmQgYWdhaW5zdCB0aGF0LgorICAgIGlmICghdGFyZ2V0U2VjdXJpdHlPcmlnaW4pCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGlmIChhY3RpdmVTZWN1cml0eU9yaWdpbi0+Y2FuQWNjZXNz
KHRhcmdldFNlY3VyaXR5T3JpZ2luKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBB
bGxvdyBhY2Nlc3MgdG8gYSAiYWJvdXQ6YmxhbmsiIHBhZ2UgaWYgdGhlIGR5bmFtaWMgY29udGV4
dCBpcyBhCisgICAgLy8gZGV0YWNoZWQgY29udGV4dCBvZiB0aGUgc2FtZSBmcmFtZSBhcyB0aGUg
YmxhbmsgcGFnZS4KKyAgICBpZiAodGFyZ2V0U2VjdXJpdHlPcmlnaW4tPmlzRW1wdHkoKSAmJiBv
cmlnaW5XaW5kb3ctPmZyYW1lKCkgPT0gdGFyZ2V0V2luZG93LT5mcmFtZSgpKQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworCitib29sIFY4UHJveHk6OkNh
bkFjY2Vzc0ZyYW1lKEZyYW1lKiB0YXJnZXQsIGJvb2wgcmVwb3J0RXJyb3IpCit7CisgICAgLy8g
VGhlIHN1YmplY3QgaXMgZGV0YWNoZWQgZnJvbSBhIGZyYW1lLCBkZW55IGFjY2Vzc2VzLgorICAg
IGlmICghdGFyZ2V0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIUNhbkFjY2Vz
c1ByaXZhdGUodGFyZ2V0LT5kb21XaW5kb3coKSkpIHsKKyAgICAgICAgaWYgKHJlcG9ydEVycm9y
KQorICAgICAgICAgICAgUmVwb3J0VW5zYWZlQWNjZXNzVG8odGFyZ2V0LCBSRVBPUlRfTk9XKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCiti
b29sIFY4UHJveHk6OkNoZWNrTm9kZVNlY3VyaXR5KE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFu
b2RlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBGcmFtZSogdGFyZ2V0ID0gbm9kZS0+
ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKKworICAgIGlmICghdGFyZ2V0KQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICByZXR1cm4gQ2FuQWNjZXNzRnJhbWUodGFyZ2V0LCB0cnVlKTsKK30KKwor
djg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IFY4UHJveHk6OmNyZWF0ZU5ld0NvbnRleHQodjg6
OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwpCit7CisgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkNv
bnRleHQ+IHJlc3VsdDsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBlbnZpcm9ubWVudCB1c2luZyBh
biBlbXB0eSB0ZW1wbGF0ZSBmb3IgdGhlIHNoYWRvdworICAgIC8vIG9iamVjdC4gIFJldXNlIHRo
ZSBnbG9iYWwgb2JqZWN0IGlmIG9uZSBoYXMgYmVlbiBjcmVhdGVkIGVhcmxpZXIuCisgICAgdjg6
OlBlcnNpc3RlbnQ8djg6Ok9iamVjdFRlbXBsYXRlPiBnbG9iYWxUZW1wbGF0ZSA9IFY4RE9NV2lu
ZG93OjpHZXRTaGFkb3dPYmplY3RUZW1wbGF0ZSgpOworICAgIGlmIChnbG9iYWxUZW1wbGF0ZS5J
c0VtcHR5KCkpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAvLyBJbnN0YWxsIGEgc2Vj
dXJpdHkgaGFuZGxlciB3aXRoIFY4LgorICAgIGdsb2JhbFRlbXBsYXRlLT5TZXRBY2Nlc3NDaGVj
a0NhbGxiYWNrcyggVjhDdXN0b206OnY4RE9NV2luZG93TmFtZWRTZWN1cml0eUNoZWNrLCBWOEN1
c3RvbTo6djhET01XaW5kb3dJbmRleGVkU2VjdXJpdHlDaGVjaywgdjg6OkludGVnZXI6Ok5ldyhW
OENsYXNzSW5kZXg6OkRPTVdJTkRPVykpOworCisgICAgLy8gRHluYW1pY2FsbHkgdGVsbCB2OCBh
Ym91dCBvdXIgZXh0ZW5zaW9ucyBub3cuCisgICAgY29uc3QgY2hhcioqIGV4dGVuc2lvbk5hbWVz
ID0gbmV3IGNvbnN0IGNoYXIqW21fZXh0ZW5zaW9ucy5zaXplKCldOworICAgIGludCBpbmRleCA9
IDA7CisgICAgZm9yIChWOEV4dGVuc2lvbkxpc3Q6Oml0ZXJhdG9yIGl0ID0gbV9leHRlbnNpb25z
LmJlZ2luKCk7IGl0ICE9IG1fZXh0ZW5zaW9ucy5lbmQoKTsgKytpdCkgeworICAgICAgICAvLyBO
b3RlOiB3ZSBjaGVjayB0aGUgbG9hZGVyIFVSTCBoZXJlIGluc3RlYWQgb2YgdGhlIGRvY3VtZW50
IFVSTAorICAgICAgICAvLyBiZWNhdXNlIHdlIG1pZ2h0IGJlIGN1cnJlbnRseSBsb2FkaW5nIGFu
IFVSTCBpbnRvIGEgYmxhbmsgcGFnZS4KKyAgICAgICAgLy8gU2VlIGh0dHA6Ly9jb2RlLmdvb2ds
ZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEwOTI0CisgICAgICAgIGlmIChpdC0+
c2NoZW1lLmxlbmd0aCgpID4gMCAmJiAoaXQtPnNjaGVtZSAhPSBtX2ZyYW1lLT5sb2FkZXIoKS0+
YWN0aXZlRG9jdW1lbnRMb2FkZXIoKS0+dXJsKCkucHJvdG9jb2woKSB8fCBpdC0+c2NoZW1lICE9
IG1fZnJhbWUtPnBhZ2UoKS0+bWFpbkZyYW1lKCktPmxvYWRlcigpLT5hY3RpdmVEb2N1bWVudExv
YWRlcigpLT51cmwoKS5wcm90b2NvbCgpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAg
ICAgIGV4dGVuc2lvbk5hbWVzW2luZGV4KytdID0gaXQtPmV4dGVuc2lvbi0+bmFtZSgpOworICAg
IH0KKyAgICB2ODo6RXh0ZW5zaW9uQ29uZmlndXJhdGlvbiBleHRlbnNpb25zKGluZGV4LCBleHRl
bnNpb25OYW1lcyk7CisgICAgcmVzdWx0ID0gdjg6OkNvbnRleHQ6Ok5ldygmZXh0ZW5zaW9ucywg
Z2xvYmFsVGVtcGxhdGUsIGdsb2JhbCk7CisgICAgZGVsZXRlW10gZXh0ZW5zaW9uTmFtZXM7Cisg
ICAgZXh0ZW5zaW9uTmFtZXMgPSAwOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gQ3Jl
YXRlIGEgbmV3IGVudmlyb25tZW50IGFuZCBzZXR1cCB0aGUgZ2xvYmFsIG9iamVjdC4KKy8vCisv
LyBUaGUgZ2xvYmFsIG9iamVjdCBjb3JyZXNwb25kcyB0byBhIERPTVdpbmRvdyBpbnN0YW5jZS4g
IEhvd2V2ZXIsIHRvCisvLyBhbGxvdyBwcm9wZXJ0aWVzIG9mIHRoZSBKUyBET01XaW5kb3cgaW5z
dGFuY2UgdG8gYmUgc2hhZG93ZWQsIHdlCisvLyB1c2UgYSBzaGFkb3cgb2JqZWN0IGFzIHRoZSBn
bG9iYWwgb2JqZWN0IGFuZCB1c2UgdGhlIEpTIERPTVdpbmRvdworLy8gaW5zdGFuY2UgYXMgdGhl
IHByb3RvdHlwZSBmb3IgdGhhdCBzaGFkb3cgb2JqZWN0LiAgVGhlIEpTIERPTVdpbmRvdworLy8g
aW5zdGFuY2UgaXMgdW5kZXRlY3RhYmxlIGZyb20gamF2YXNjcmlwdCBjb2RlIGJlY2F1c2UgdGhl
IF9fcHJvdG9fXworLy8gYWNjZXNzb3JzIHNraXAgdGhhdCBvYmplY3QuCisvLworLy8gVGhlIHNo
YWRvdyBvYmplY3QgYW5kIHRoZSBET01XaW5kb3cgaW5zdGFuY2UgYXJlIHNlZW4gYXMgb25lIG9i
amVjdAorLy8gZnJvbSBqYXZhc2NyaXB0LiAgVGhlIGphdmFzY3JpcHQgb2JqZWN0IHRoYXQgY29y
cmVzcG9uZHMgdG8gYQorLy8gRE9NV2luZG93IGluc3RhbmNlIGlzIHRoZSBzaGFkb3cgb2JqZWN0
LiAgV2hlbiBtYXBwaW5nIGEgRE9NV2luZG93CisvLyBpbnN0YW5jZSB0byBhIFY4IG9iamVjdCwg
d2UgcmV0dXJuIHRoZSBzaGFkb3cgb2JqZWN0LgorLy8KKy8vIFRvIGltcGxlbWVudCBzcGxpdC13
aW5kb3csIHNlZQorLy8gICAxKSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTcyNDkKKy8vICAgMikgaHR0cHM6Ly93aWtpLm1vemlsbGEub3JnL0dlY2tvOlNwbGl0V2lu
ZG93CisvLyAgIDMpIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lk
PTI5NjYzOQorLy8gd2UgbmVlZCB0byBzcGxpdCB0aGUgc2hhZG93IG9iamVjdCBmdXJ0aGVyIGlu
dG8gdHdvIG9iamVjdHM6CisvLyBhbiBvdXRlciB3aW5kb3cgYW5kIGFuIGlubmVyIHdpbmRvdy4g
VGhlIGlubmVyIHdpbmRvdyBpcyB0aGUgaGlkZGVuCisvLyBwcm90b3R5cGUgb2YgdGhlIG91dGVy
IHdpbmRvdy4gVGhlIGlubmVyIHdpbmRvdyBpcyB0aGUgZGVmYXVsdAorLy8gZ2xvYmFsIG9iamVj
dCBvZiB0aGUgY29udGV4dC4gQSB2YXJpYWJsZSBkZWNsYXJlZCBpbiB0aGUgZ2xvYmFsCisvLyBz
Y29wZSBpcyBhIHByb3BlcnR5IG9mIHRoZSBpbm5lciB3aW5kb3cuCisvLworLy8gVGhlIG91dGVy
IHdpbmRvdyBzdGlja3MgdG8gYSBGcmFtZSwgaXQgaXMgZXhwb3NlZCB0byBKYXZhU2NyaXB0Cisv
LyB2aWEgd2luZG93LndpbmRvdywgd2luZG93LnNlbGYsIHdpbmRvdy5wYXJlbnQsIGV0Yy4gVGhl
IG91dGVyIHdpbmRvdworLy8gaGFzIGEgc2VjdXJpdHkgdG9rZW4gd2hpY2ggaXMgdGhlIGRvbWFp
bi4gVGhlIG91dGVyIHdpbmRvdyBjYW5ub3QKKy8vIGhhdmUgaXRzIG93biBwcm9wZXJ0aWVzLiB3
aW5kb3cuZm9vID0gJ3gnIGlzIGRlbGVnYXRlZCB0byB0aGUKKy8vIGlubmVyIHdpbmRvdy4KKy8v
CisvLyBXaGVuIGEgZnJhbWUgbmF2aWdhdGVzIHRvIGEgbmV3IHBhZ2UsIHRoZSBpbm5lciB3aW5k
b3cgaXMgY3V0IG9mZgorLy8gdGhlIG91dGVyIHdpbmRvdywgYW5kIHRoZSBvdXRlciB3aW5kb3cg
aWRlbnRpZnkgaXMgcHJlc2VydmVkIGZvcgorLy8gdGhlIGZyYW1lLiBIb3dldmVyLCBhIG5ldyBp
bm5lciB3aW5kb3cgaXMgY3JlYXRlZCBmb3IgdGhlIG5ldyBwYWdlLgorLy8gSWYgdGhlcmUgYXJl
IEpTIGNvZGUgaG9sZHMgYSBjbG9zdXJlIHRvIHRoZSBvbGQgaW5uZXIgd2luZG93LAorLy8gaXQg
d29uJ3QgYmUgYWJsZSB0byByZWFjaCB0aGUgb3V0ZXIgd2luZG93IHZpYSBpdHMgZ2xvYmFsIG9i
amVjdC4KK3ZvaWQgVjhQcm94eTo6SW5pdENvbnRleHRJZk5lZWRlZCgpCit7CisgICAgLy8gQmFp
bCBvdXQgaWYgdGhlIGNvbnRleHQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KKyAgICBp
ZiAoIW1fY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIENyZWF0
ZSBhIGhhbmRsZSBzY29wZSBmb3IgYWxsIGxvY2FsIGhhbmRsZXMuCisgICAgdjg6OkhhbmRsZVNj
b3BlIGhhbmRsZVNjb3BlOworCisgICAgLy8gU2V0dXAgdGhlIHNlY3VyaXR5IGhhbmRsZXJzIGFu
ZCBtZXNzYWdlIGxpc3RlbmVyLiAgVGhpcyBvbmx5IGhhcworICAgIC8vIHRvIGJlIGRvbmUgb25j
ZS4KKyAgICBzdGF0aWMgYm9vbCBpc1Y4SW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBpZiAoIWlz
VjhJbml0aWFsaXplZCkgeworICAgICAgICAvLyBUZWxscyBWOCBub3QgdG8gY2FsbCB0aGUgZGVm
YXVsdCBPT00gaGFuZGxlciwgYmluZGluZyBjb2RlCisgICAgICAgIC8vIHdpbGwgaGFuZGxlIGl0
LgorICAgICAgICB2ODo6Vjg6Oklnbm9yZU91dE9mTWVtb3J5RXhjZXB0aW9uKCk7CisgICAgICAg
IHY4OjpWODo6U2V0RmF0YWxFcnJvckhhbmRsZXIoUmVwb3J0RmF0YWxFcnJvckluVjgpOworCisg
ICAgICAgIHY4OjpWODo6U2V0R2xvYmFsR0NQcm9sb2d1ZUNhbGxiYWNrKCZHQ1Byb2xvZ3VlKTsK
KyAgICAgICAgdjg6OlY4OjpTZXRHbG9iYWxHQ0VwaWxvZ3VlQ2FsbGJhY2soJkdDRXBpbG9ndWUp
OworCisgICAgICAgIHY4OjpWODo6QWRkTWVzc2FnZUxpc3RlbmVyKEhhbmRsZUNvbnNvbGVNZXNz
YWdlKTsKKworICAgICAgICB2ODo6Vjg6OlNldEZhaWxlZEFjY2Vzc0NoZWNrQ2FsbGJhY2tGdW5j
dGlvbihSZXBvcnRVbnNhZmVKYXZhU2NyaXB0QWNjZXNzKTsKKworICAgICAgICBpc1Y4SW5pdGlh
bGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIG1fY29udGV4dCA9IGNyZWF0ZU5ld0NvbnRleHQo
bV9nbG9iYWwpOworICAgIGlmIChtX2NvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm47
CisKKyAgICAvLyBTdGFydGluZyBmcm9tIG5vdywgdXNlIGxvY2FsIGNvbnRleHQgb25seS4KKyAg
ICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBHZXRDb250ZXh0KCk7CisgICAgdjg6
OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRTY29wZShjb250ZXh0KTsKKworICAgIC8vIFN0b3JlIHRo
ZSBmaXJzdCBnbG9iYWwgb2JqZWN0IGNyZWF0ZWQgc28gd2UgY2FuIHJldXNlIGl0LgorICAgIGlm
IChtX2dsb2JhbC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgbV9nbG9iYWwgPSB2ODo6UGVyc2lzdGVu
dDx2ODo6T2JqZWN0Pjo6TmV3KGNvbnRleHQtPkdsb2JhbCgpKTsKKyAgICAgICAgLy8gQmFpbCBv
dXQgaWYgYWxsb2NhdGlvbiBvZiB0aGUgZmlyc3QgZ2xvYmFsIG9iamVjdHMgZmFpbHMuCisgICAg
ICAgIGlmIChtX2dsb2JhbC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICBEaXNwb3NlQ29udGV4dEhh
bmRsZXMoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNpZm5kZWYgTkRFQlVHCisg
ICAgICAgIFJlZ2lzdGVyR2xvYmFsSGFuZGxlKFBST1hZLCB0aGlzLCBtX2dsb2JhbCk7CisjZW5k
aWYKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSBzdHJpbmdzIHVzZWQgZHVyaW5nIGluaXRpYWxp
emF0aW9uLgorICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gb2JqZWN0U3RyaW5nID0gdjg6OlN0
cmluZzo6TmV3KCJPYmplY3QiKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IHByb3RvdHlw
ZVN0cmluZyA9IHY4OjpTdHJpbmc6Ok5ldygicHJvdG90eXBlIik7CisgICAgdjg6OkhhbmRsZTx2
ODo6U3RyaW5nPiBpbXBsaWNpdFByb3RvU3RyaW5nID0gdjg6OlN0cmluZzo6TmV3KCJfX3Byb3Rv
X18iKTsKKyAgICAvLyBCYWlsIG91dCBpZiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAgICBpZiAob2Jq
ZWN0U3RyaW5nLklzRW1wdHkoKSB8fCBwcm90b3R5cGVTdHJpbmcuSXNFbXB0eSgpIHx8IGltcGxp
Y2l0UHJvdG9TdHJpbmcuSXNFbXB0eSgpKSB7CisgICAgICAgIERpc3Bvc2VDb250ZXh0SGFuZGxl
cygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgY2xvbmUgY2Fj
aGUgYW5kIHByZS1hbGxvY2F0ZWQgb2JqZWN0cworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
b2JqZWN0ID0gdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdChtX2dsb2JhbC0+R2V0KG9iamVj
dFN0cmluZykpOworICAgIG1fb2JqZWN0UHJvdG90eXBlID0gdjg6OlBlcnNpc3RlbnQ8djg6OlZh
bHVlPjo6TmV3KG9iamVjdC0+R2V0KHByb3RvdHlwZVN0cmluZykpOworICAgIG1fd3JhcHBlckJv
aWxlcnBsYXRlcyA9IHY4OjpQZXJzaXN0ZW50PHY4OjpBcnJheT46Ok5ldyh2ODo6QXJyYXk6Ok5l
dyhWOENsYXNzSW5kZXg6OldSQVBQRVJfVFlQRV9DT1VOVCkpOworICAgIC8vIEJhaWwgb3V0IGlm
IGFsbG9jYXRpb24gZmFpbGVkLgorICAgIGlmIChtX29iamVjdFByb3RvdHlwZS5Jc0VtcHR5KCkp
IHsKKyAgICAgICAgRGlzcG9zZUNvbnRleHRIYW5kbGVzKCk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisjaWZuZGVmIE5ERUJVRworICAgIFJlZ2lzdGVyR2xvYmFsSGFuZGxlKFBST1hZLCB0aGlz
LCBtX29iamVjdFByb3RvdHlwZSk7CisgICAgUmVnaXN0ZXJHbG9iYWxIYW5kbGUoUFJPWFksIHRo
aXMsIG1fd3JhcHBlckJvaWxlcnBsYXRlcyk7CisjZW5kaWYKKworICAgIC8vIENyZWF0ZSBhIG5l
dyBKUyB3aW5kb3cgb2JqZWN0IGFuZCB1c2UgaXQgYXMgdGhlIHByb3RvdHlwZSBmb3IgdGhlCisg
ICAgLy8gc2hhZG93IGdsb2JhbCBvYmplY3QuCisgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+
IHdpbmRvd0NvbnN0cnVjdG9yID0gR2V0Q29uc3RydWN0b3IoVjhDbGFzc0luZGV4OjpET01XSU5E
T1cpOworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBqc1dpbmRvdyA9IFNhZmVBbGxvY2F0aW9u
OjpOZXdJbnN0YW5jZSh3aW5kb3dDb25zdHJ1Y3Rvcik7CisgICAgLy8gQmFpbCBvdXQgaWYgYWxs
b2NhdGlvbiBmYWlsZWQuCisgICAgaWYgKGpzV2luZG93LklzRW1wdHkoKSkgeworICAgICAgICBE
aXNwb3NlQ29udGV4dEhhbmRsZXMoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERP
TVdpbmRvdyogd2luZG93ID0gbV9mcmFtZS0+ZG9tV2luZG93KCk7CisKKyAgICAvLyBXcmFwIHRo
ZSB3aW5kb3cuCisgICAgU2V0RE9NV3JhcHBlcihqc1dpbmRvdywgVjhDbGFzc0luZGV4OjpUb0lu
dChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVyksIHdpbmRvdyk7CisKKyAgICB3aW5kb3ctPnJlZigp
OworICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU9iamVjdCh3aW5kb3csIHY4OjpQZXJz
aXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcoanNXaW5kb3cpKTsKKworICAgIC8vIEluc2VydCB0aGUg
d2luZG93IGluc3RhbmNlIGFzIHRoZSBwcm90b3R5cGUgb2YgdGhlIHNoYWRvdyBvYmplY3QuCisg
ICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB2OF9nbG9iYWwgPSBjb250ZXh0LT5HbG9iYWwoKTsK
KyAgICB2OF9nbG9iYWwtPlNldChpbXBsaWNpdFByb3RvU3RyaW5nLCBqc1dpbmRvdyk7CisKKyAg
ICB1cGRhdGVEb2N1bWVudCgpOworCisgICAgU2V0U2VjdXJpdHlUb2tlbigpOworCisgICAgbV9m
cmFtZS0+bG9hZGVyKCktPmRpc3BhdGNoV2luZG93T2JqZWN0QXZhaWxhYmxlKCk7Cit9CisKKwor
dm9pZCBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oaW50IGV4Y2VwdGlvbkNvZGUpCit7CisgICAg
aWYgKGV4Y2VwdGlvbkNvZGUgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgRXhjZXB0aW9u
Q29kZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworICAgIGdldEV4Y2VwdGlvbkNvZGVEZXNjcmlw
dGlvbihleGNlcHRpb25Db2RlLCBkZXNjcmlwdGlvbik7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gZXhjZXB0aW9uOworICAgIHN3aXRjaCAoZGVzY3JpcHRpb24udHlwZSkgeworICAgIGNh
c2UgRE9NRXhjZXB0aW9uVHlwZToKKyAgICAgICAgZXhjZXB0aW9uID0gVG9WOE9iamVjdChWOENs
YXNzSW5kZXg6OkRPTUNPUkVFWENFUFRJT04sIERPTUNvcmVFeGNlcHRpb246OmNyZWF0ZShkZXNj
cmlwdGlvbikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJhbmdlRXhjZXB0aW9uVHlwZToK
KyAgICAgICAgZXhjZXB0aW9uID0gVG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlJBTkdFRVhDRVBU
SU9OLCBSYW5nZUV4Y2VwdGlvbjo6Y3JlYXRlKGRlc2NyaXB0aW9uKSk7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgRXZlbnRFeGNlcHRpb25UeXBlOgorICAgICAgICBleGNlcHRpb24gPSBUb1Y4
T2JqZWN0KFY4Q2xhc3NJbmRleDo6RVZFTlRFWENFUFRJT04sIEV2ZW50RXhjZXB0aW9uOjpjcmVh
dGUoZGVzY3JpcHRpb24pKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxIdHRwUmVxdWVz
dEV4Y2VwdGlvblR5cGU6CisgICAgICAgIGV4Y2VwdGlvbiA9IFRvVjhPYmplY3QoVjhDbGFzc0lu
ZGV4OjpYTUxIVFRQUkVRVUVTVEVYQ0VQVElPTiwgWE1MSHR0cFJlcXVlc3RFeGNlcHRpb246OmNy
ZWF0ZShkZXNjcmlwdGlvbikpOworICAgICAgICBicmVhazsKKyNpZiBFTkFCTEUoU1ZHKQorICAg
IGNhc2UgU1ZHRXhjZXB0aW9uVHlwZToKKyAgICAgICAgZXhjZXB0aW9uID0gVG9WOE9iamVjdChW
OENsYXNzSW5kZXg6OlNWR0VYQ0VQVElPTiwgU1ZHRXhjZXB0aW9uOjpjcmVhdGUoZGVzY3JpcHRp
b24pKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBFTkFCTEUoWFBBVEgpCisgICAgY2Fz
ZSBYUGF0aEV4Y2VwdGlvblR5cGU6CisgICAgICAgIGV4Y2VwdGlvbiA9IFRvVjhPYmplY3QoVjhD
bGFzc0luZGV4OjpYUEFUSEVYQ0VQVElPTiwgWFBhdGhFeGNlcHRpb246OmNyZWF0ZShkZXNjcmlw
dGlvbikpOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIH0KKworICAgIEFTU0VSVCghZXhj
ZXB0aW9uLklzRW1wdHkoKSk7CisgICAgdjg6OlRocm93RXhjZXB0aW9uKGV4Y2VwdGlvbik7Cit9
CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5OjpUaHJvd0Vycm9yKEVycm9yVHlwZSB0
eXBlLCBjb25zdCBjaGFyKiBtZXNzYWdlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNh
c2UgUkFOR0VfRVJST1I6CisgICAgICAgIHJldHVybiB2ODo6VGhyb3dFeGNlcHRpb24odjg6OkV4
Y2VwdGlvbjo6UmFuZ2VFcnJvcih2OFN0cmluZyhtZXNzYWdlKSkpOworICAgIGNhc2UgUkVGRVJF
TkNFX0VSUk9SOgorICAgICAgICByZXR1cm4gdjg6OlRocm93RXhjZXB0aW9uKHY4OjpFeGNlcHRp
b246OlJlZmVyZW5jZUVycm9yKHY4U3RyaW5nKG1lc3NhZ2UpKSk7CisgICAgY2FzZSBTWU5UQVhf
RVJST1I6CisgICAgICAgIHJldHVybiB2ODo6VGhyb3dFeGNlcHRpb24odjg6OkV4Y2VwdGlvbjo6
U3ludGF4RXJyb3IodjhTdHJpbmcobWVzc2FnZSkpKTsKKyAgICBjYXNlIFRZUEVfRVJST1I6Cisg
ICAgICAgIHJldHVybiB2ODo6VGhyb3dFeGNlcHRpb24odjg6OkV4Y2VwdGlvbjo6VHlwZUVycm9y
KHY4U3RyaW5nKG1lc3NhZ2UpKSk7CisgICAgY2FzZSBHRU5FUkFMX0VSUk9SOgorICAgICAgICBy
ZXR1cm4gdjg6OlRocm93RXhjZXB0aW9uKHY4OjpFeGNlcHRpb246OkVycm9yKHY4U3RyaW5nKG1l
c3NhZ2UpKSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUKGZhbHNlKTsKKyAgICAgICAg
cmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CisgICAgfQorfQorCit2ODo6TG9jYWw8
djg6OkNvbnRleHQ+IFY4UHJveHk6OkdldENvbnRleHQoRnJhbWUqIGZyYW1lKQoreworICAgIFY4
UHJveHkqIHByb3h5ID0gcmV0cmlldmUoZnJhbWUpOworICAgIGlmICghcHJveHkpCisgICAgICAg
IHJldHVybiB2ODo6TG9jYWw8djg6OkNvbnRleHQ+KCk7CisKKyAgICBwcm94eS0+SW5pdENvbnRl
eHRJZk5lZWRlZCgpOworICAgIHJldHVybiBwcm94eS0+R2V0Q29udGV4dCgpOworfQorCit2ODo6
TG9jYWw8djg6OkNvbnRleHQ+IFY4UHJveHk6OkdldEN1cnJlbnRDb250ZXh0KCkKK3sKKyAgICBy
ZXR1cm4gdjg6OkNvbnRleHQ6OkdldEN1cnJlbnQoKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFs
dWU+IFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUs
IHZvaWQqIGltcCkKK3sKKyAgICBBU1NFUlQodHlwZSAhPSBWOENsYXNzSW5kZXg6OkVWRU5UTElT
VEVORVIpOworICAgIEFTU0VSVCh0eXBlICE9IFY4Q2xhc3NJbmRleDo6RVZFTlRUQVJHRVQpOwor
ICAgIEFTU0VSVCh0eXBlICE9IFY4Q2xhc3NJbmRleDo6RVZFTlQpOworCisgICAgYm9vbCBpc0Fj
dGl2ZURvbU9iamVjdCA9IGZhbHNlOworICAgIHN3aXRjaCAodHlwZSkgeworI2RlZmluZSBNQUtF
X0NBU0UoVFlQRSwgTkFNRSkgY2FzZSBWOENsYXNzSW5kZXg6OlRZUEU6CisgICAgICAgIERPTV9O
T0RFX1RZUEVTKE1BS0VfQ0FTRSkKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBTVkdfTk9ERV9U
WVBFUyhNQUtFX0NBU0UpCisjZW5kaWYKKyAgICAgICAgcmV0dXJuIE5vZGVUb1Y4T2JqZWN0KHN0
YXRpY19jYXN0PE5vZGUqPihpbXApKTsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q1NTVkFMVUU6
CisgICAgICAgIHJldHVybiBDU1NWYWx1ZVRvVjhPYmplY3Qoc3RhdGljX2Nhc3Q8Q1NTVmFsdWUq
PihpbXApKTsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q1NTUlVMRToKKyAgICAgICAgcmV0dXJu
IENTU1J1bGVUb1Y4T2JqZWN0KHN0YXRpY19jYXN0PENTU1J1bGUqPihpbXApKTsKKyAgICBjYXNl
IFY4Q2xhc3NJbmRleDo6U1RZTEVTSEVFVDoKKyAgICAgICAgcmV0dXJuIFN0eWxlU2hlZXRUb1Y4
T2JqZWN0KHN0YXRpY19jYXN0PFN0eWxlU2hlZXQqPihpbXApKTsKKyAgICBjYXNlIFY4Q2xhc3NJ
bmRleDo6RE9NV0lORE9XOgorICAgICAgICByZXR1cm4gV2luZG93VG9WOE9iamVjdChzdGF0aWNf
Y2FzdDxET01XaW5kb3cqPihpbXApKTsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBTVkdfTk9O
Tk9ERV9UWVBFUyhNQUtFX0NBU0UpCisgICAgICAgIGlmICh0eXBlID09IFY4Q2xhc3NJbmRleDo6
U1ZHRUxFTUVOVElOU1RBTkNFKQorICAgICAgICAgICAgcmV0dXJuIFNWR0VsZW1lbnRJbnN0YW5j
ZVRvVjhPYmplY3Qoc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudEluc3RhbmNlKj4oaW1wKSk7CisgICAg
ICAgIHJldHVybiBTVkdPYmplY3RXaXRoQ29udGV4dFRvVjhPYmplY3QodHlwZSwgaW1wKTsKKyNl
bmRpZgorCisgICAgICAgIEFDVElWRV9ET01fT0JKRUNUX1RZUEVTKE1BS0VfQ0FTRSkKKyAgICAg
ICAgaXNBY3RpdmVEb21PYmplY3QgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0
OgorICAgICAgICBicmVhazsKKyAgfQorCisjdW5kZWYgTUFLRV9DQVNFCisKKyAgICBpZiAoIWlt
cCkKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICAvLyBOb24gRE9NIG5vZGUKKyAg
ICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiByZXN1bHQgPSBpc0FjdGl2ZURvbU9iamVjdCA/
IGdldEFjdGl2ZURPTU9iamVjdE1hcCgpLmdldChpbXApIDogZ2V0RE9NT2JqZWN0TWFwKCkuZ2V0
KGltcCk7CisgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgdjg6OkxvY2FsPHY4
OjpPYmplY3Q+IHY4b2JqID0gSW5zdGFudGlhdGVWOE9iamVjdCh0eXBlLCB0eXBlLCBpbXApOwor
ICAgICAgICBpZiAoIXY4b2JqLklzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gR28gdGhyb3Vn
aCBiaWcgc3dpdGNoIHN0YXRlbWVudCwgaXQgaGFzIHNvbWUgZHVwbGljYXRpb25zCisgICAgICAg
ICAgICAvLyB0aGF0IHdlcmUgaGFuZGxlZCBieSBjb2RlIGFib3ZlIChzdWNoIGFzIENTU1ZBTFVF
LCBDU1NSVUxFLCBldGMpLgorICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisjZGVmaW5lIE1B
S0VfQ0FTRShUWVBFLCBOQU1FKSBcCisgICAgICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6VFlQ
RTogc3RhdGljX2Nhc3Q8TkFNRSo+KGltcCktPnJlZigpOyBicmVhazsKKyAgICAgICAgICAgICAg
ICBET01fT0JKRUNUX1RZUEVTKE1BS0VfQ0FTRSkKKyN1bmRlZiBNQUtFX0NBU0UKKyAgICAgICAg
ICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJUKGZhbHNlKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIHJlc3VsdCA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXco
djhvYmopOworICAgICAgICAgICAgaWYgKGlzQWN0aXZlRG9tT2JqZWN0KQorICAgICAgICAgICAg
ICAgIFNldEpTV3JhcHBlckZvckFjdGl2ZURPTU9iamVjdChpbXAsIHJlc3VsdCk7CisgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgU2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KGltcCwg
cmVzdWx0KTsKKworICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBub24tbm9kZSBvYmpl
Y3RzIGFzc29jaWF0ZWQgd2l0aCBhCisgICAgICAgICAgICAvLyBET01XaW5kb3cuIEJvdGggU2Fm
YXJpIGFuZCBGRiBsZXQgdGhlIEpTIHdyYXBwZXJzIGZvciB0aGVzZQorICAgICAgICAgICAgLy8g
b2JqZWN0cyBzdXJ2aXZlIEdDLiBUbyBtaW1pYyB0aGVpciBiZWhhdmlvciwgVjggY3JlYXRlcwor
ICAgICAgICAgICAgLy8gaGlkZGVuIHJlZmVyZW5jZXMgZnJvbSB0aGUgRE9NV2luZG93IHRvIHRo
ZXNlIHdyYXBwZXIKKyAgICAgICAgICAgIC8vIG9iamVjdHMuIFRoZXNlIHJlZmVyZW5jZXMgZ2V0
IGNsZWFyZWQgd2hlbiB0aGUgRE9NV2luZG93IGlzCisgICAgICAgICAgICAvLyByZXVzZWQgYnkg
YSBuZXcgcGFnZS4KKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2Fz
ZSBWOENsYXNzSW5kZXg6OkNPTlNPTEU6CisgICAgICAgICAgICAgICAgU2V0SGlkZGVuV2luZG93
UmVmZXJlbmNlKHN0YXRpY19jYXN0PENvbnNvbGUqPihpbXApLT5mcmFtZSgpLCBWOEN1c3RvbTo6
a0RPTVdpbmRvd0NvbnNvbGVJbmRleCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpISVNUT1JZOgorICAgICAgICAgICAgICAg
IFNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShzdGF0aWNfY2FzdDxIaXN0b3J5Kj4oaW1wKS0+ZnJh
bWUoKSwgVjhDdXN0b206OmtET01XaW5kb3dIaXN0b3J5SW5kZXgsIHJlc3VsdCk7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6TkFWSUdBVE9S
OgorICAgICAgICAgICAgICAgIFNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShzdGF0aWNfY2FzdDxO
YXZpZ2F0b3IqPihpbXApLT5mcmFtZSgpLCBWOEN1c3RvbTo6a0RPTVdpbmRvd05hdmlnYXRvcklu
ZGV4LCByZXN1bHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBW
OENsYXNzSW5kZXg6OlNDUkVFTjoKKyAgICAgICAgICAgICAgICBTZXRIaWRkZW5XaW5kb3dSZWZl
cmVuY2Uoc3RhdGljX2Nhc3Q8U2NyZWVuKj4oaW1wKS0+ZnJhbWUoKSwgVjhDdXN0b206OmtET01X
aW5kb3dTY3JlZW5JbmRleCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpMT0NBVElPTjoKKyAgICAgICAgICAgICAgICBTZXRI
aWRkZW5XaW5kb3dSZWZlcmVuY2Uoc3RhdGljX2Nhc3Q8TG9jYXRpb24qPihpbXApLT5mcmFtZSgp
LCBWOEN1c3RvbTo6a0RPTVdpbmRvd0xvY2F0aW9uSW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6RE9NU0VMRUNUSU9O
OgorICAgICAgICAgICAgICAgIFNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShzdGF0aWNfY2FzdDxE
T01TZWxlY3Rpb24qPihpbXApLT5mcmFtZSgpLCBWOEN1c3RvbTo6a0RPTVdpbmRvd0RPTVNlbGVj
dGlvbkluZGV4LCByZXN1bHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
Y2FzZSBWOENsYXNzSW5kZXg6OkJBUklORk86IHsKKyAgICAgICAgICAgICAgICBCYXJJbmZvKiBi
YXJpbmZvID0gc3RhdGljX2Nhc3Q8QmFySW5mbyo+KGltcCk7CisgICAgICAgICAgICAgICAgRnJh
bWUqIGZyYW1lID0gYmFyaW5mby0+ZnJhbWUoKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGJh
cmluZm8tPnR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQmFySW5mbzo6TG9jYXRpb25i
YXI6CisgICAgICAgICAgICAgICAgICAgIFNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShmcmFtZSwg
VjhDdXN0b206OmtET01XaW5kb3dMb2NhdGlvbmJhckluZGV4LCByZXN1bHQpOworICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJhckluZm86Ok1lbnViYXI6
CisgICAgICAgICAgICAgICAgICAgIFNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShmcmFtZSwgVjhD
dXN0b206OmtET01XaW5kb3dNZW51YmFySW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQmFySW5mbzo6UGVyc29uYWxiYXI6Cisg
ICAgICAgICAgICAgICAgICAgIFNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShmcmFtZSwgVjhDdXN0
b206OmtET01XaW5kb3dQZXJzb25hbGJhckluZGV4LCByZXN1bHQpOworICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJhckluZm86OlNjcm9sbGJhcnM6Cisg
ICAgICAgICAgICAgICAgICAgIFNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShmcmFtZSwgVjhDdXN0
b206OmtET01XaW5kb3dTY3JvbGxiYXJzSW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQmFySW5mbzo6U3RhdHVzYmFyOgorICAg
ICAgICAgICAgICAgICAgICBTZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2UoZnJhbWUsIFY4Q3VzdG9t
OjprRE9NV2luZG93U3RhdHVzYmFySW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQmFySW5mbzo6VG9vbGJhcjoKKyAgICAgICAg
ICAgICAgICAgICAgU2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKGZyYW1lLCBWOEN1c3RvbTo6a0RP
TVdpbmRvd1Rvb2xiYXJJbmRleCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3ZvaWQg
VjhQcm94eTo6U2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKEZyYW1lKiBmcmFtZSwgY29uc3QgaW50
IGludGVybmFsSW5kZXgsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4ganNPYmplY3QpCit7CisgICAg
Ly8gR2V0IERPTVdpbmRvdworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybjsgIC8vIE9i
amVjdCBtaWdodCBiZSBkZXRhY2hlZCBmcm9tIHdpbmRvdworICAgIHY4OjpIYW5kbGU8djg6OkNv
bnRleHQ+IGNvbnRleHQgPSBHZXRDb250ZXh0KGZyYW1lKTsKKyAgICBpZiAoY29udGV4dC5Jc0Vt
cHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVChpbnRlcm5hbEluZGV4IDwgVjhD
dXN0b206OmtET01XaW5kb3dJbnRlcm5hbEZpZWxkQ291bnQpOworCisgICAgdjg6OkhhbmRsZTx2
ODo6T2JqZWN0PiBnbG9iYWwgPSBjb250ZXh0LT5HbG9iYWwoKTsKKyAgICAvLyBMb29rIGZvciBy
ZWFsIERPTSB3cmFwcGVyLgorICAgIGdsb2JhbCA9IExvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0lu
ZGV4OjpET01XSU5ET1csIGdsb2JhbCk7CisgICAgQVNTRVJUKCFnbG9iYWwuSXNFbXB0eSgpKTsK
KyAgICBBU1NFUlQoZ2xvYmFsLT5HZXRJbnRlcm5hbEZpZWxkKGludGVybmFsSW5kZXgpLT5Jc1Vu
ZGVmaW5lZCgpKTsKKyAgICBnbG9iYWwtPlNldEludGVybmFsRmllbGQoaW50ZXJuYWxJbmRleCwg
anNPYmplY3QpOworfQorCisKK1Y4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBWOFByb3h5OjpH
ZXRET01XcmFwcGVyVHlwZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCkKK3sKKyAgICBB
U1NFUlQoTWF5YmVET01XcmFwcGVyKG9iamVjdCkpOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiB0eXBlID0gb2JqZWN0LT5HZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprRE9NV3JhcHBlclR5
cGVJbmRleCk7CisgICAgcmV0dXJuIFY4Q2xhc3NJbmRleDo6RnJvbUludCh0eXBlLT5JbnQzMlZh
bHVlKCkpOworfQorCisKK3ZvaWQqIFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0SW1wbChWOENsYXNz
SW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IG9iamVjdCkK
K3sKKyAgICAvLyBOYXRpdmUgZXZlbnQgbGlzdGVuZXIgaXMgcGVyIGZyYW1lLCBpdCBjYW5ub3Qg
YmUgaGFuZGxlZCBieSB0aGlzIGdlbmVyaWMgZnVuY3Rpb24uCisgICAgQVNTRVJUKHR5cGUgIT0g
VjhDbGFzc0luZGV4OjpFVkVOVExJU1RFTkVSKTsKKyAgICBBU1NFUlQodHlwZSAhPSBWOENsYXNz
SW5kZXg6OkVWRU5UVEFSR0VUKTsKKworICAgIEFTU0VSVChNYXliZURPTVdyYXBwZXIob2JqZWN0
KSk7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyNkZWZpbmUgTUFLRV9DQVNFKFRZUEUsIE5BTUUp
IGNhc2UgVjhDbGFzc0luZGV4OjpUWVBFOgorICAgICAgICBET01fTk9ERV9UWVBFUyhNQUtFX0NB
U0UpCisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgU1ZHX05PREVfVFlQRVMoTUFLRV9DQVNFKQor
I2VuZGlmCisgICAgICAgIEFTU0VSVChmYWxzZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAg
IGNhc2UgVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVDoKKyAgICAgICAgcmV0dXJuIERPTVdy
YXBwZXJUb05hdGl2ZTxYTUxIdHRwUmVxdWVzdD4ob2JqZWN0KTsKKyAgICBjYXNlIFY4Q2xhc3NJ
bmRleDo6RVZFTlQ6CisgICAgICAgIHJldHVybiBET01XcmFwcGVyVG9OYXRpdmU8RXZlbnQ+KG9i
amVjdCk7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkNTU1JVTEU6CisgICAgICAgIHJldHVybiBE
T01XcmFwcGVyVG9OYXRpdmU8Q1NTUnVsZT4ob2JqZWN0KTsKKyAgICBkZWZhdWx0OgorICAgICAg
ICBicmVhazsKKyAgICB9CisjdW5kZWYgTUFLRV9DQVNFCisKKyAgICByZXR1cm4gRE9NV3JhcHBl
clRvTmF0aXZlPHZvaWQ+KG9iamVjdCk7Cit9CisKKwordm9pZCogVjhQcm94eTo6VG9TVkdQT0RU
eXBlSW1wbChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSwgdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IG9iamVjdCkKK3sKKyAgcmV0dXJuIElzV3JhcHBlck9mVHlwZShvYmplY3QsIHR5cGUp
ID8gRE9NV3JhcHBlclRvTmF0aXZlPHZvaWQ+KG9iamVjdCkgOiBOVUxMOworfQorCisKK3Y4OjpI
YW5kbGU8djg6Ok9iamVjdD4gVjhQcm94eTo6TG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUgdHlwZSwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQoreworICAg
IGlmICh2YWx1ZS5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNl
cHRvcigpOworCisgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gZGVzYyA9IFY4
UHJveHk6OkdldFRlbXBsYXRlKHR5cGUpOworICAgIHdoaWxlICh2YWx1ZS0+SXNPYmplY3QoKSkg
eworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpIYW5kbGU8djg6
Ok9iamVjdD46OkNhc3QodmFsdWUpOworICAgICAgICBpZiAoZGVzYy0+SGFzSW5zdGFuY2Uob2Jq
ZWN0KSkKKyAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CisKKyAgICAgICAgdmFsdWUgPSBvYmpl
Y3QtPkdldFByb3RvdHlwZSgpOworICAgIH0KKyAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJj
ZXB0b3IoKTsKK30KKwordm9pZCogVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZUhlbHBlcih2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUpCit7CisgICAgQVNTRVJUKE1heWJlRE9NV3JhcHBlcih2
YWx1ZSkpOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmplY3QgPSB2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+OjpDYXN0KHZhbHVlKTsKKworICAgIEFTU0VSVChHZXRET01XcmFwcGVyVHlw
ZShvYmplY3QpID09IFY4Q2xhc3NJbmRleDo6Tk9ERSk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gd3JhcHBlciA9IG9iamVjdC0+R2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RPTVdy
YXBwZXJPYmplY3RJbmRleCk7CisgICAgcmV0dXJuIEV4dHJhY3RDUG9pbnRlcjxOb2RlPih3cmFw
cGVyKTsKK30KKworCitQYXNzUmVmUHRyPE5vZGVGaWx0ZXI+IFY4UHJveHk6OlRvTmF0aXZlTm9k
ZUZpbHRlcih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZmlsdGVyKQoreworICAgIC8vIEEgTm9kZUZp
bHRlciBpcyB1c2VkIHdoZW4gd2Fsa2luZyB0aHJvdWdoIGEgRE9NIHRyZWUgb3IgaXRlcmF0aW5n
IHRyZWUKKyAgICAvLyBub2Rlcy4KKyAgICAvLyBUT0RPOiB3ZSBtYXkgd2FudCB0byBjYWNoZSBO
b2RlRmlsdGVyQ29uZGl0aW9uIGFuZCBOb2RlRmlsdGVyCisgICAgLy8gb2JqZWN0LCBidXQgaXQg
aXMgbWlub3IuCisgICAgLy8gTm9kZUZpbHRlciBpcyBwYXNzZWQgdG8gTm9kZUl0ZXJhdG9yIHRo
YXQgaGFzIGEgcmVmIGNvdW50ZWQgcG9pbnRlcgorICAgIC8vIHRvIE5vZGVGaWx0ZXIuIE5vZGVG
aWx0ZXIgaGFzIGEgcmVmIGNvdW50ZWQgcG9pbnRlciB0byBOb2RlRmlsdGVyQ29uZGl0aW9uLgor
ICAgIC8vIEluIE5vZGVGaWx0ZXJDb25kaXRpb24sIGZpbHRlciBvYmplY3QgaXMgcGVyc2lzdGVk
IGluIGl0cyBjb25zdHJ1Y3RvciwKKyAgICAvLyBhbmQgZGlzcG9zZWQgaW4gaXRzIGRlc3RydWN0
b3IuCisgICAgaWYgKCFmaWx0ZXItPklzRnVuY3Rpb24oKSkKKyAgICAgICAgcmV0dXJuIDA7CisK
KyAgICBOb2RlRmlsdGVyQ29uZGl0aW9uKiBjb25kID0gbmV3IFY4Tm9kZUZpbHRlckNvbmRpdGlv
bihmaWx0ZXIpOworICAgIHJldHVybiBOb2RlRmlsdGVyOjpjcmVhdGUoY29uZCk7Cit9CisKKwor
djg6OkxvY2FsPHY4OjpPYmplY3Q+IFY4UHJveHk6Okluc3RhbnRpYXRlVjhPYmplY3QoVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlIGRlc2NUeXBlLCBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5
cGUgY3B0clR5cGUsIHZvaWQqIGltcCkKK3sKKyAgICAvLyBNYWtlIGEgc3BlY2lhbCBjYXNlIGZv
ciBkb2N1bWVudC5hbGwKKyAgICBpZiAoZGVzY1R5cGUgPT0gVjhDbGFzc0luZGV4OjpIVE1MQ09M
TEVDVElPTiAmJiBzdGF0aWNfY2FzdDxIVE1MQ29sbGVjdGlvbio+KGltcCktPnR5cGUoKSA9PSBE
b2NBbGwpCisgICAgICAgIGRlc2NUeXBlID0gVjhDbGFzc0luZGV4OjpVTkRFVEVDVEFCTEVIVE1M
Q09MTEVDVElPTjsKKworICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUoKTsK
KyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaW5zdGFuY2U7CisgICAgaWYgKHByb3h5KQorICAg
ICAgICBpbnN0YW5jZSA9IHByb3h5LT5DcmVhdGVXcmFwcGVyRnJvbUNhY2hlKGRlc2NUeXBlKTsK
KyAgICBlbHNlIHsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gZnVuY3Rpb24gPSBH
ZXRUZW1wbGF0ZShkZXNjVHlwZSktPkdldEZ1bmN0aW9uKCk7CisgICAgICAgIGluc3RhbmNlID0g
U2FmZUFsbG9jYXRpb246Ok5ld0luc3RhbmNlKGZ1bmN0aW9uKTsKKyAgICB9CisgICAgaWYgKCFp
bnN0YW5jZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gQXZvaWQgc2V0dGluZyB0aGUgRE9NIHdy
YXBwZXIgZm9yIGZhaWxlZCBhbGxvY2F0aW9ucy4KKyAgICAgICAgU2V0RE9NV3JhcHBlcihpbnN0
YW5jZSwgVjhDbGFzc0luZGV4OjpUb0ludChjcHRyVHlwZSksIGltcCk7CisgICAgfQorICAgIHJl
dHVybiBpbnN0YW5jZTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6OkNoZWNr
TmV3TGVnYWwoY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICBpZiAoIUFsbG93QWxs
b2NhdGlvbjo6bV9jdXJyZW50KQorICAgICAgICByZXR1cm4gVGhyb3dFcnJvcihUWVBFX0VSUk9S
LCAiSWxsZWdhbCBjb25zdHJ1Y3RvciIpOworCisgICAgcmV0dXJuIGFyZ3MuVGhpcygpOworfQor
Cit2b2lkIFY4UHJveHk6OlNldERPTVdyYXBwZXIodjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmpl
Y3QsIGludCB0eXBlLCB2b2lkKiBjcHRyKQoreworICBBU1NFUlQob2JqZWN0LT5JbnRlcm5hbEZp
ZWxkQ291bnQoKSA+PSAyKTsKKyAgb2JqZWN0LT5TZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjpr
RE9NV3JhcHBlck9iamVjdEluZGV4LCBXcmFwQ1BvaW50ZXIoY3B0cikpOworICBvYmplY3QtPlNl
dEludGVybmFsRmllbGQoVjhDdXN0b206OmtET01XcmFwcGVyVHlwZUluZGV4LCB2ODo6SW50ZWdl
cjo6TmV3KHR5cGUpKTsKK30KKworCisjaWZuZGVmIE5ERUJVRworYm9vbCBWOFByb3h5OjpNYXli
ZURPTVdyYXBwZXIodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQoreworICAgIGlmICh2YWx1
ZS5Jc0VtcHR5KCkgfHwgIXZhbHVlLT5Jc09iamVjdCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpIYW5kbGU8djg6Ok9i
amVjdD46OkNhc3QodmFsdWUpOworICAgIGlmIChvYmplY3QtPkludGVybmFsRmllbGRDb3VudCgp
ID09IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFTU0VSVChvYmplY3QtPkludGVy
bmFsRmllbGRDb3VudCgpID49IFY4Q3VzdG9tOjprRGVmYXVsdFdyYXBwZXJJbnRlcm5hbEZpZWxk
Q291bnQpOworCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHR5cGUgPSBvYmplY3QtPkdldElu
dGVybmFsRmllbGQoVjhDdXN0b206OmtET01XcmFwcGVyVHlwZUluZGV4KTsKKyAgICBBU1NFUlQo
dHlwZS0+SXNJbnQzMigpKTsKKyAgICBBU1NFUlQoVjhDbGFzc0luZGV4OjpJTlZBTElEX0NMQVNT
X0lOREVYIDwgdHlwZS0+SW50MzJWYWx1ZSgpICYmIHR5cGUtPkludDMyVmFsdWUoKSA8IFY4Q2xh
c3NJbmRleDo6Q0xBU1NJTkRFWF9FTkQpOworCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdy
YXBwZXIgPSBvYmplY3QtPkdldEludGVybmFsRmllbGQoVjhDdXN0b206OmtET01XcmFwcGVyT2Jq
ZWN0SW5kZXgpOworICAgIEFTU0VSVCh3cmFwcGVyLT5Jc051bWJlcigpIHx8IHdyYXBwZXItPklz
RXh0ZXJuYWwoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCisKK2Jvb2wgVjhQ
cm94eTo6SXNET01FdmVudFdyYXBwZXIodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQorewor
ICAgIC8vIEFsbCBraW5kcyBvZiBldmVudHMgdXNlIEVWRU5UIGFzIGRvbSB0eXBlIGluIEpTIHdy
YXBwZXJzLgorICAgIC8vIFNlZSBFdmVudFRvVjhPYmplY3QKKyAgICByZXR1cm4gSXNXcmFwcGVy
T2ZUeXBlKHZhbHVlLCBWOENsYXNzSW5kZXg6OkVWRU5UKTsKK30KKworYm9vbCBWOFByb3h5OjpJ
c1dyYXBwZXJPZlR5cGUodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlLCBWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUgY2xhc3NUeXBlKQoreworICAgIGlmICh2YWx1ZS5Jc0VtcHR5KCkgfHwg
IXZhbHVlLT5Jc09iamVjdCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodmFs
dWUpOworICAgIGlmIChvYmplY3QtPkludGVybmFsRmllbGRDb3VudCgpID09IDApCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIEFTU0VSVChvYmplY3QtPkludGVybmFsRmllbGRDb3VudCgp
ID49IFY4Q3VzdG9tOjprRGVmYXVsdFdyYXBwZXJJbnRlcm5hbEZpZWxkQ291bnQpOworCisgICAg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IHdyYXBwZXIgPSBvYmplY3QtPkdldEludGVybmFsRmllbGQo
VjhDdXN0b206OmtET01XcmFwcGVyT2JqZWN0SW5kZXgpOworICAgIEFTU0VSVCh3cmFwcGVyLT5J
c051bWJlcigpIHx8IHdyYXBwZXItPklzRXh0ZXJuYWwoKSk7CisKKyAgICB2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4gdHlwZSA9IG9iamVjdC0+R2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RPTVdy
YXBwZXJUeXBlSW5kZXgpOworICAgIEFTU0VSVCh0eXBlLT5Jc0ludDMyKCkpOworICAgIEFTU0VS
VChWOENsYXNzSW5kZXg6OklOVkFMSURfQ0xBU1NfSU5ERVggPCB0eXBlLT5JbnQzMlZhbHVlKCkg
JiYgdHlwZS0+SW50MzJWYWx1ZSgpIDwgVjhDbGFzc0luZGV4OjpDTEFTU0lOREVYX0VORCk7CisK
KyAgICByZXR1cm4gVjhDbGFzc0luZGV4OjpGcm9tSW50KHR5cGUtPkludDMyVmFsdWUoKSkgPT0g
Y2xhc3NUeXBlOworfQorCisjaWYgRU5BQkxFKFZJREVPKQorI2RlZmluZSBGT1JfRUFDSF9WSURF
T19UQUcobWFjcm8pICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvKGF1ZGlvLCBBVURJTykg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvKHNvdXJjZSwgU09VUkNFKSAg
ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvKHZpZGVvLCBWSURFTykKKyNlbHNl
CisjZGVmaW5lIEZPUl9FQUNIX1ZJREVPX1RBRyhtYWNybykKKyNlbmRpZgorCisjZGVmaW5lIEZP
Ul9FQUNIX1RBRyhtYWNybykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYSwg
QU5DSE9SKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYXBwbGV0
LCBBUFBMRVQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYXJlYSwgQVJF
QSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYmFzZSwgQkFTRSkg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYmFzZWZvbnQsIEJBU0VG
T05UKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYmxvY2txdW90ZSwgQkxPQ0tR
VU9URSkgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYm9keSwgQk9EWSkgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYnIsIEJSKSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYnV0dG9uLCBCVVRUT04pICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgbWFjcm8oY2FwdGlvbiwgVEFCTEVDQVBUSU9OKSAgICAgICAg
ICAgICAgICAgICBcCisgICAgbWFjcm8oY29sLCBUQUJMRUNPTCkgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgICAgbWFjcm8oY29sZ3JvdXAsIFRBQkxFQ09MKSAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgbWFjcm8oZGVsLCBNT0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgbWFjcm8oY2FudmFzLCBDQU5WQVMpICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgbWFjcm8oZGlyLCBESVJFQ1RPUlkpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgbWFjcm8oZGl2LCBESVYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
bWFjcm8oZGwsIERMSVNUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFj
cm8oZW1iZWQsIEVNQkVEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8o
ZmllbGRzZXQsIEZJRUxEU0VUKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oZm9u
dCwgRk9OVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oZm9ybSwg
Rk9STSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oZnJhbWUsIEZS
QU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oZnJhbWVzZXQsIEZS
QU1FU0VUKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaDEsIEhFQURJTkcpICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaDIsIEhFQURJTkcpICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaDMsIEhFQURJTkcpICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaDQsIEhFQURJTkcpICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaDUsIEhFQURJTkcpICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaDYsIEhFQURJTkcpICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgbWFjcm8oaGVhZCwgSEVBRCkgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgICAgbWFjcm8oaHIsIEhSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgbWFjcm8oaHRtbCwgSFRNTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgbWFjcm8oaW1nLCBJTUFHRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgbWFjcm8oaWZyYW1lLCBJRlJBTUUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgbWFjcm8oaW1hZ2UsIElNQUdFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
bWFjcm8oaW5wdXQsIElOUFVUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFj
cm8oaW5zLCBNT0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8o
aXNpbmRleCwgSVNJTkRFWCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oa2V5
Z2VuLCBTRUxFQ1QpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obGFiZWws
IExBQkVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obGVnZW5kLCBM
RUdFTkQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obGksIExJKSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obGluaywgTElOSykgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obGlzdGluZywgUFJFKSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obWFwLCBNQVApICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obWFycXVlZSwgTUFSUVVFRSkgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obWVudSwgTUVOVSkgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgbWFjcm8obWV0YSwgTUVUQSkgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgbWFjcm8ob2JqZWN0LCBPQkpFQ1QpICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgICAgbWFjcm8ob2wsIE9MSVNUKSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgbWFjcm8ob3B0Z3JvdXAsIE9QVEdST1VQKSAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgbWFjcm8ob3B0aW9uLCBPUFRJT04pICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgbWFjcm8ocCwgUEFSQUdSQVBIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgbWFjcm8ocGFyYW0sIFBBUkFNKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
bWFjcm8ocHJlLCBQUkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFj
cm8ocSwgUVVPVEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8o
c2NyaXB0LCBTQ1JJUFQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oc2Vs
ZWN0LCBTRUxFQ1QpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oc3R5bGUs
IFNUWUxFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGFibGUsIFRB
QkxFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGhlYWQsIFRBQkxF
U0VDVElPTikgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGJvZHksIFRBQkxFU0VD
VElPTikgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGZvb3QsIFRBQkxFU0VDVElP
TikgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGQsIFRBQkxFQ0VMTCkgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGgsIFRBQkxFQ0VMTCkgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odHIsIFRBQkxFUk9XKSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGV4dGFyZWEsIFRFWFRBUkVBKSAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgbWFjcm8odGl0bGUsIFRJVExFKSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgICAgbWFjcm8odWwsIFVMSVNUKSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgbWFjcm8oeG1wLCBQUkUpCisKK1Y4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlw
ZSBWOFByb3h5OjpHZXRIVE1MRWxlbWVudFR5cGUoSFRNTEVsZW1lbnQqIGVsZW1lbnQpCit7Cisg
ICAgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGU+IG1h
cDsKKyAgICBpZiAobWFwLmlzRW1wdHkoKSkgeworI2RlZmluZSBBRERfVE9fSEFTSF9NQVAodGFn
LCBuYW1lKSBcCisgICAgICAgIG1hcC5zZXQoI3RhZywgVjhDbGFzc0luZGV4OjpIVE1MIyNuYW1l
IyNFTEVNRU5UKTsKKyAgICAgICAgRk9SX0VBQ0hfVEFHKEFERF9UT19IQVNIX01BUCkKKyNpZiBF
TkFCTEUoVklERU8pCisgICAgICAgIGlmIChNZWRpYVBsYXllcjo6aXNBdmFpbGFibGUoKSkgewor
ICAgICAgICAgICAgRk9SX0VBQ0hfVklERU9fVEFHKEFERF9UT19IQVNIX01BUCkKKyAgICAgICAg
fQorI2VuZGlmCisjdW5kZWYgQUREX1RPX0hBU0hfTUFQCisgICAgfQorCisgICAgVjhDbGFzc0lu
ZGV4OjpWOFdyYXBwZXJUeXBlIHQgPSBtYXAuZ2V0KGVsZW1lbnQtPmxvY2FsTmFtZSgpLmltcGwo
KSk7CisgICAgaWYgKHQgPT0gMCkKKyAgICAgICAgcmV0dXJuIFY4Q2xhc3NJbmRleDo6SFRNTEVM
RU1FTlQ7CisgICAgcmV0dXJuIHQ7Cit9CisjdW5kZWYgRk9SX0VBQ0hfVEFHCisKKyNpZiBFTkFC
TEUoU1ZHKQorCisjaWYgRU5BQkxFKFNWR19BTklNQVRJT04pCisjZGVmaW5lIEZPUl9FQUNIX0FO
SU1BVElPTl9UQUcobWFjcm8pIFwKKyAgICBtYWNybyhhbmltYXRlQ29sb3IsIEFOSU1BVEVDT0xP
UikgXAorICAgIG1hY3JvKGFuaW1hdGUsIEFOSU1BVEUpIFwKKyAgICBtYWNybyhhbmltYXRlVHJh
bnNmb3JtLCBBTklNQVRFVFJBTlNGT1JNKSBcCisgICAgbWFjcm8oc2V0LCBTRVQpCisjZWxzZQor
I2RlZmluZSBGT1JfRUFDSF9BTklNQVRJT05fVEFHKG1hY3JvKQorI2VuZGlmCisKKyNpZiBFTkFC
TEUoU1ZHX0ZJTFRFUlMpCisjZGVmaW5lIEZPUl9FQUNIX0ZJTFRFUlNfVEFHKG1hY3JvKSBcCisg
ICAgbWFjcm8oZmVCbGVuZCwgRkVCTEVORCkgXAorICAgIG1hY3JvKGZlQ29sb3JNYXRyaXgsIEZF
Q09MT1JNQVRSSVgpIFwKKyAgICBtYWNybyhmZUNvbXBvbmVudFRyYW5zZmVyLCBGRUNPTVBPTkVO
VFRSQU5TRkVSKSBcCisgICAgbWFjcm8oZmVDb21wb3NpdGUsIEZFQ09NUE9TSVRFKSBcCisgICAg
bWFjcm8oZmVEaWZmdXNlTGlnaHRpbmcsIEZFRElGRlVTRUxJR0hUSU5HKSBcCisgICAgbWFjcm8o
ZmVEaXNwbGFjZW1lbnRNYXAsIEZFRElTUExBQ0VNRU5UTUFQKSBcCisgICAgbWFjcm8oZmVEaXN0
YW50TGlnaHQsIEZFRElTVEFOVExJR0hUKSBcCisgICAgbWFjcm8oZmVGbG9vZCwgRkVGTE9PRCkg
XAorICAgIG1hY3JvKGZlRnVuY0EsIEZFRlVOQ0EpIFwKKyAgICBtYWNybyhmZUZ1bmNCLCBGRUZV
TkNCKSBcCisgICAgbWFjcm8oZmVGdW5jRywgRkVGVU5DRykgXAorICAgIG1hY3JvKGZlRnVuY1Is
IEZFRlVOQ1IpIFwKKyAgICBtYWNybyhmZUdhdXNzaWFuQmx1ciwgRkVHQVVTU0lBTkJMVVIpIFwK
KyAgICBtYWNybyhmZUltYWdlLCBGRUlNQUdFKSBcCisgICAgbWFjcm8oZmVNZXJnZSwgRkVNRVJH
RSkgXAorICAgIG1hY3JvKGZlTWVyZ2VOb2RlLCBGRU1FUkdFTk9ERSkgXAorICAgIG1hY3JvKGZl
T2Zmc2V0LCBGRU9GRlNFVCkgXAorICAgIG1hY3JvKGZlUG9pbnRMaWdodCwgRkVQT0lOVExJR0hU
KSBcCisgICAgbWFjcm8oZmVTcGVjdWxhckxpZ2h0aW5nLCBGRVNQRUNVTEFSTElHSFRJTkcpIFwK
KyAgICBtYWNybyhmZVNwb3RMaWdodCwgRkVTUE9UTElHSFQpIFwKKyAgICBtYWNybyhmZVRpbGUs
IEZFVElMRSkgXAorICAgIG1hY3JvKGZlVHVyYnVsZW5jZSwgRkVUVVJCVUxFTkNFKSBcCisgICAg
bWFjcm8oZmlsdGVyLCBGSUxURVIpCisjZWxzZQorI2RlZmluZSBGT1JfRUFDSF9GSUxURVJTX1RB
RyhtYWNybykKKyNlbmRpZgorCisjaWYgRU5BQkxFKFNWR19GT05UUykKKyNkZWZpbmUgRk9SX0VB
Q0hfRk9OVFNfVEFHKG1hY3JvKSBcCisgICAgbWFjcm8oZGVmaW5pdGlvbi1zcmMsIERFRklOSVRJ
T05TUkMpIFwKKyAgICBtYWNybyhmb250LWZhY2UsIEZPTlRGQUNFKSBcCisgICAgbWFjcm8oZm9u
dC1mYWNlLWZvcm1hdCwgRk9OVEZBQ0VGT1JNQVQpIFwKKyAgICBtYWNybyhmb250LWZhY2UtbmFt
ZSwgRk9OVEZBQ0VOQU1FKSBcCisgICAgbWFjcm8oZm9udC1mYWNlLXNyYywgRk9OVEZBQ0VTUkMp
IFwKKyAgICBtYWNybyhmb250LWZhY2UtdXJpLCBGT05URkFDRVVSSSkKKyNlbHNlCisjZGVmaW5l
IEZPUl9FQUNIX0ZPTlRTX1RBRyhtYXJjbykKKyNlbmRpZgorCisjaWYgRU5BQkxFKFNWR19GT1JF
SUdOX09CSkVDVCkKKyNkZWZpbmUgRk9SX0VBQ0hfRk9SRUlHTl9PQkpFQ1RfVEFHKG1hY3JvKSBc
CisgICAgbWFjcm8oZm9yZWlnbk9iamVjdCwgRk9SRUlHTk9CSkVDVCkKKyNlbHNlCisjZGVmaW5l
IEZPUl9FQUNIX0ZPUkVJR05fT0JKRUNUX1RBRyhtYWNybykKKyNlbmRpZgorCisjaWYgRU5BQkxF
KFNWR19VU0UpCisjZGVmaW5lIEZPUl9FQUNIX1VTRV9UQUcobWFjcm8pIFwKKyAgICBtYWNybyh1
c2UsIFVTRSkKKyNlbHNlCisjZGVmaW5lIEZPUl9FQUNIX1VTRV9UQUcobWFjcm8pCisjZW5kaWYK
KworI2RlZmluZSBGT1JfRUFDSF9UQUcobWFjcm8pIFwKKyAgICBGT1JfRUFDSF9BTklNQVRJT05f
VEFHKG1hY3JvKSBcCisgICAgRk9SX0VBQ0hfRklMVEVSU19UQUcobWFjcm8pIFwKKyAgICBGT1Jf
RUFDSF9GT05UU19UQUcobWFjcm8pIFwKKyAgICBGT1JfRUFDSF9GT1JFSUdOX09CSkVDVF9UQUco
bWFjcm8pIFwKKyAgICBGT1JfRUFDSF9VU0VfVEFHKG1hY3JvKSBcCisgICAgbWFjcm8oYSwgQSkg
XAorICAgIG1hY3JvKGFsdEdseXBoLCBBTFRHTFlQSCkgXAorICAgIG1hY3JvKGNpcmNsZSwgQ0lS
Q0xFKSBcCisgICAgbWFjcm8oY2xpcFBhdGgsIENMSVBQQVRIKSBcCisgICAgbWFjcm8oY3Vyc29y
LCBDVVJTT1IpIFwKKyAgICBtYWNybyhkZWZzLCBERUZTKSBcCisgICAgbWFjcm8oZGVzYywgREVT
QykgXAorICAgIG1hY3JvKGVsbGlwc2UsIEVMTElQU0UpIFwKKyAgICBtYWNybyhnLCBHKSBcCisg
ICAgbWFjcm8oZ2x5cGgsIEdMWVBIKSBcCisgICAgbWFjcm8oaW1hZ2UsIElNQUdFKSBcCisgICAg
bWFjcm8obGluZWFyR3JhZGllbnQsIExJTkVBUkdSQURJRU5UKSBcCisgICAgbWFjcm8obGluZSwg
TElORSkgXAorICAgIG1hY3JvKG1hcmtlciwgTUFSS0VSKSBcCisgICAgbWFjcm8obWFzaywgTUFT
SykgXAorICAgIG1hY3JvKG1ldGFkYXRhLCBNRVRBREFUQSkgXAorICAgIG1hY3JvKHBhdGgsIFBB
VEgpIFwKKyAgICBtYWNybyhwYXR0ZXJuLCBQQVRURVJOKSBcCisgICAgbWFjcm8ocG9seWxpbmUs
IFBPTFlMSU5FKSBcCisgICAgbWFjcm8ocG9seWdvbiwgUE9MWUdPTikgXAorICAgIG1hY3JvKHJh
ZGlhbEdyYWRpZW50LCBSQURJQUxHUkFESUVOVCkgXAorICAgIG1hY3JvKHJlY3QsIFJFQ1QpIFwK
KyAgICBtYWNybyhzY3JpcHQsIFNDUklQVCkgXAorICAgIG1hY3JvKHN0b3AsIFNUT1ApIFwKKyAg
ICBtYWNybyhzdHlsZSwgU1RZTEUpIFwKKyAgICBtYWNybyhzdmcsIFNWRykgXAorICAgIG1hY3Jv
KHN3aXRjaCwgU1dJVENIKSBcCisgICAgbWFjcm8oc3ltYm9sLCBTWU1CT0wpIFwKKyAgICBtYWNy
byh0ZXh0LCBURVhUKSBcCisgICAgbWFjcm8odGV4dFBhdGgsIFRFWFRQQVRIKSBcCisgICAgbWFj
cm8odGl0bGUsIFRJVExFKSBcCisgICAgbWFjcm8odHJlZiwgVFJFRikgXAorICAgIG1hY3JvKHRz
cGFuLCBUU1BBTikgXAorICAgIG1hY3JvKHZpZXcsIFZJRVcpIFwKKyAgICAvLyBlbmQgb2YgbWFj
cm8KKworVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIFY4UHJveHk6OkdldFNWR0VsZW1lbnRU
eXBlKFNWR0VsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBW
OENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGU+IG1hcDsKKyAgICBpZiAobWFwLmlzRW1wdHkoKSkg
eworI2RlZmluZSBBRERfVE9fSEFTSF9NQVAodGFnLCBuYW1lKSBcCisgICAgICAgIG1hcC5zZXQo
I3RhZywgVjhDbGFzc0luZGV4OjpTVkcjI25hbWUjI0VMRU1FTlQpOworICAgICAgICBGT1JfRUFD
SF9UQUcoQUREX1RPX0hBU0hfTUFQKQorI3VuZGVmIEFERF9UT19IQVNIX01BUAorICAgIH0KKwor
ICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0ID0gbWFwLmdldChlbGVtZW50LT5sb2Nh
bE5hbWUoKS5pbXBsKCkpOworICAgIGlmICh0ID09IDApCisgICAgICAgIHJldHVybiBWOENsYXNz
SW5kZXg6OlNWR0VMRU1FTlQ7CisgICAgcmV0dXJuIHQ7Cit9CisjdW5kZWYgRk9SX0VBQ0hfVEFH
CisKKyNlbmRpZiAgLy8gRU5BQkxFKFNWRykKKworCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQ
cm94eTo6RXZlbnRUb1Y4T2JqZWN0KEV2ZW50KiBldmVudCkKK3sKKyAgICBpZiAoIWV2ZW50KQor
ICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
d3JhcHBlciA9IGdldERPTU9iamVjdE1hcCgpLmdldChldmVudCk7CisgICAgaWYgKCF3cmFwcGVy
LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisKKyAgICBWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUgdHlwZSA9IFY4Q2xhc3NJbmRleDo6RVZFTlQ7CisKKyAgICBpZiAoZXZl
bnQtPmlzVUlFdmVudCgpKSB7CisgICAgICAgIGlmIChldmVudC0+aXNLZXlib2FyZEV2ZW50KCkp
CisgICAgICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpLRVlCT0FSREVWRU5UOworICAgICAg
ICBlbHNlIGlmIChldmVudC0+aXNUZXh0RXZlbnQoKSkKKyAgICAgICAgICAgIHR5cGUgPSBWOENs
YXNzSW5kZXg6OlRFWFRFVkVOVDsKKyAgICAgICAgZWxzZSBpZiAoZXZlbnQtPmlzTW91c2VFdmVu
dCgpKQorICAgICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6TU9VU0VFVkVOVDsKKyAgICAg
ICAgZWxzZSBpZiAoZXZlbnQtPmlzV2hlZWxFdmVudCgpKQorICAgICAgICAgICAgdHlwZSA9IFY4
Q2xhc3NJbmRleDo6V0hFRUxFVkVOVDsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBlbHNlIGlm
IChldmVudC0+aXNTVkdab29tRXZlbnQoKSkKKyAgICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5k
ZXg6OlNWR1pPT01FVkVOVDsKKyNlbmRpZgorICAgICAgICBlbHNlCisgICAgICAgICAgICB0eXBl
ID0gVjhDbGFzc0luZGV4OjpVSUVWRU5UOworICAgIH0gZWxzZSBpZiAoZXZlbnQtPmlzTXV0YXRp
b25FdmVudCgpKQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpNVVRBVElPTkVWRU5UOwor
ICAgIGVsc2UgaWYgKGV2ZW50LT5pc092ZXJmbG93RXZlbnQoKSkKKyAgICAgICAgdHlwZSA9IFY4
Q2xhc3NJbmRleDo6T1ZFUkZMT1dFVkVOVDsKKyAgICBlbHNlIGlmIChldmVudC0+aXNNZXNzYWdl
RXZlbnQoKSkKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6TUVTU0FHRUVWRU5UOworICAg
IGVsc2UgaWYgKGV2ZW50LT5pc1Byb2dyZXNzRXZlbnQoKSkgeworICAgICAgICBpZiAoZXZlbnQt
PmlzWE1MSHR0cFJlcXVlc3RQcm9ncmVzc0V2ZW50KCkpCisgICAgICAgICAgICB0eXBlID0gVjhD
bGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFBST0dSRVNTRVZFTlQ7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlBST0dSRVNTRVZFTlQ7CisgICAgfSBlbHNl
IGlmIChldmVudC0+aXNXZWJLaXRBbmltYXRpb25FdmVudCgpKQorICAgICAgICB0eXBlID0gVjhD
bGFzc0luZGV4OjpXRUJLSVRBTklNQVRJT05FVkVOVDsKKyAgICBlbHNlIGlmIChldmVudC0+aXNX
ZWJLaXRUcmFuc2l0aW9uRXZlbnQoKSkKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6V0VC
S0lUVFJBTlNJVElPTkVWRU5UOworCisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJlc3Vs
dCA9IEluc3RhbnRpYXRlVjhPYmplY3QodHlwZSwgVjhDbGFzc0luZGV4OjpFVkVOVCwgZXZlbnQp
OworICAgIGlmIChyZXN1bHQuSXNFbXB0eSgpKSB7CisgICAgICAgIC8vIEluc3RhbnRpYXRpb24g
ZmFpbGVkLiBBdm9pZCB1cGRhdGluZyB0aGUgRE9NIG9iamVjdCBtYXAgYW5kCisgICAgICAgIC8v
IHJldHVybiBudWxsIHdoaWNoIGlzIGFscmVhZHkgaGFuZGxlZCBieSBjYWxsZXJzIG9mIHRoaXMg
ZnVuY3Rpb24KKyAgICAgICAgLy8gaW4gY2FzZSB0aGUgZXZlbnQgaXMgTlVMTC4KKyAgICAgICAg
cmV0dXJuIHY4OjpOdWxsKCk7CisgICAgfQorCisgICAgZXZlbnQtPnJlZigpOyAgLy8gZmFzdCBy
ZWYKKyAgICBTZXRKU1dyYXBwZXJGb3JET01PYmplY3QoZXZlbnQsIHY4OjpQZXJzaXN0ZW50PHY4
OjpPYmplY3Q+OjpOZXcocmVzdWx0KSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8v
IENhbGxlciBjaGVja3Mgbm9kZSBpcyBub3QgbnVsbC4KK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBW
OFByb3h5OjpOb2RlVG9WOE9iamVjdChOb2RlKiBub2RlKQoreworICAgIGlmICghbm9kZSkKKyAg
ICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICAvLyBGaW5kIHRoZSBjb250ZXh0IHRvIHdo
aWNoIHRoZSBub2RlIGJlbG9uZ3MgYW5kIGNyZWF0ZSB0aGUgd3JhcHBlcgorICAgIC8vIGluIHRo
YXQgY29udGV4dC4gIElmIHRoZSBub2RlIGlzIG5vdCBpbiBhIGRvY3VtZW50LCB0aGUgY3VycmVu
dAorICAgIC8vIGNvbnRleHQgaXMgdXNlZC4KKyAgICAvLworICAgIC8vIEdldHRpbmcgdGhlIGNv
bnRleHQgbWlnaHQgaW5pdGlhbGl6ZSB0aGUgY29udGV4dCB3aGljaCBjYW4gaW5zdGFudGlhdGUK
KyAgICAvLyBhIGRvY3VtZW50IHdyYXBwZXIuICBUaGVyZWZvcmUsIHdlIGdldCB0aGUgY29udGV4
dCBiZWZvcmUgY2hlY2tpbmcgaWYKKyAgICAvLyB0aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHdyYXBw
ZXIuCisgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0OworICAgIERvY3VtZW50KiBk
b2MgPSBub2RlLT5kb2N1bWVudCgpOworICAgIGlmIChkb2MpCisgICAgICAgIGNvbnRleHQgPSBW
OFByb3h5OjpHZXRDb250ZXh0KGRvYy0+ZnJhbWUoKSk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+IHdyYXBwZXIgPSBnZXRET01Ob2RlTWFwKCkuZ2V0KG5vZGUpOworICAgIGlmICghd3Jh
cHBlci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB3cmFwcGVyOworCisgICAgYm9vbCBpc0Rv
Y3VtZW50ID0gZmFsc2U7ICAvLyBkb2N1bWVudCB0eXBlIG5vZGUgaGFzIHNwZWNpYWwgaGFuZGxp
bmcKKyAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZTsKKworICAgIHN3aXRjaCAo
bm9kZS0+bm9kZVR5cGUoKSkgeworICAgIGNhc2UgTm9kZTo6RUxFTUVOVF9OT0RFOgorICAgICAg
ICBpZiAobm9kZS0+aXNIVE1MRWxlbWVudCgpKQorICAgICAgICAgICAgdHlwZSA9IEdldEhUTUxF
bGVtZW50VHlwZShzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCo+KG5vZGUpKTsKKyNpZiBFTkFCTEUo
U1ZHKQorICAgICAgICBlbHNlIGlmIChub2RlLT5pc1NWR0VsZW1lbnQoKSkKKyAgICAgICAgICAg
IHR5cGUgPSBHZXRTVkdFbGVtZW50VHlwZShzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4obm9kZSkp
OworI2VuZGlmCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6
OkVMRU1FTlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6QVRUUklCVVRFX05PREU6
CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkFUVFI7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgTm9kZTo6VEVYVF9OT0RFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpURVhU
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5vZGU6OkNEQVRBX1NFQ1RJT05fTk9ERToKKyAg
ICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q0RBVEFTRUNUSU9OOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIE5vZGU6OkVOVElUWV9OT0RFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4
OjpFTlRJVFk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6UFJPQ0VTU0lOR19JTlNU
UlVDVElPTl9OT0RFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpQUk9DRVNTSU5HSU5T
VFJVQ1RJT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6Q09NTUVOVF9OT0RFOgor
ICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDT01NRU5UOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIE5vZGU6OkRPQ1VNRU5UX05PREU6IHsKKyAgICAgICAgaXNEb2N1bWVudCA9IHRydWU7
CisgICAgICAgIERvY3VtZW50KiBkb2MgPSBzdGF0aWNfY2FzdDxEb2N1bWVudCo+KG5vZGUpOwor
ICAgICAgICBpZiAoZG9jLT5pc0hUTUxEb2N1bWVudCgpKQorICAgICAgICAgICAgdHlwZSA9IFY4
Q2xhc3NJbmRleDo6SFRNTERPQ1VNRU5UOworI2lmIEVOQUJMRShTVkcpCisgICAgICAgIGVsc2Ug
aWYgKGRvYy0+aXNTVkdEb2N1bWVudCgpKQorICAgICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRl
eDo6U1ZHRE9DVU1FTlQ7CisjZW5kaWYKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZSA9
IFY4Q2xhc3NJbmRleDo6RE9DVU1FTlQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNl
IE5vZGU6OkRPQ1VNRU5UX1RZUEVfTk9ERToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6
RE9DVU1FTlRUWVBFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5vZGU6Ok5PVEFUSU9OX05P
REU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6Ok5PVEFUSU9OOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6CisgICAgICAgIHR5cGUg
PSBWOENsYXNzSW5kZXg6OkRPQ1VNRU5URlJBR01FTlQ7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgTm9kZTo6RU5USVRZX1JFRkVSRU5DRV9OT0RFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0lu
ZGV4OjpFTlRJVFlSRUZFUkVOQ0U7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAg
ICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6Ok5PREU7CisgICAgfQorCisgICAgLy8gRW50ZXIgdGhl
IG5vZGUncyBjb250ZXh0IGFuZCBjcmVhdGUgdGhlIHdyYXBwZXIgaW4gdGhhdCBjb250ZXh0Lgor
ICAgIGlmICghY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIGNvbnRleHQtPkVudGVyKCk7CisK
KyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcmVzdWx0ID0gSW5zdGFudGlhdGVWOE9iamVjdCh0
eXBlLCBWOENsYXNzSW5kZXg6Ok5PREUsIG5vZGUpOworCisgICAgLy8gRXhpdCB0aGUgbm9kZSdz
IGNvbnRleHQgaWYgaXQgd2FzIGVudGVyZWQuCisgICAgaWYgKCFjb250ZXh0LklzRW1wdHkoKSkK
KyAgICAgICAgY29udGV4dC0+RXhpdCgpOworCisgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpIHsK
KyAgICAgICAgLy8gSWYgaW5zdGFudGlhdGlvbiBmYWlsZWQgaXQncyBpbXBvcnRhbnQgbm90IHRv
IGFkZCB0aGUgcmVzdWx0CisgICAgICAgIC8vIHRvIHRoZSBET00gbm9kZSBtYXAuIEluc3RlYWQg
d2UgcmV0dXJuIGFuIGVtcHR5IGhhbmRsZSwgd2hpY2gKKyAgICAgICAgLy8gc2hvdWxkIGFscmVh
ZHkgYmUgaGFuZGxlZCBieSBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gaW4gY2FzZQorICAgICAg
ICAvLyB0aGUgbm9kZSBpcyBOVUxMLgorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwor
ICAgIG5vZGUtPnJlZigpOworICAgIFNldEpTV3JhcHBlckZvckRPTU5vZGUobm9kZSwgdjg6OlBl
cnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhyZXN1bHQpKTsKKworICAgIGlmIChpc0RvY3VtZW50
KSB7CisgICAgICAgIERvY3VtZW50KiBkb2MgPSBzdGF0aWNfY2FzdDxEb2N1bWVudCo+KG5vZGUp
OworICAgICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKGRvYy0+ZnJhbWUo
KSk7CisgICAgICAgIGlmIChwcm94eSkKKyAgICAgICAgICAgIHByb3h5LT5VcGRhdGVEb2N1bWVu
dFdyYXBwZXIocmVzdWx0KTsKKworICAgICAgICBpZiAodHlwZSA9PSBWOENsYXNzSW5kZXg6OkhU
TUxET0NVTUVOVCkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG1hcmtlciBvYmplY3QgYW5kIGlu
c2VydCBpdCBpbiB0d28gaW50ZXJuYWwgZmllbGRzLgorICAgICAgICAgICAgLy8gVGhpcyBpcyB1
c2VkIHRvIGltcGxlbWVudCB0ZW1wb3Jhcnkgc2hhZG93aW5nIG9mCisgICAgICAgICAgICAvLyBk
b2N1bWVudC5hbGwuCisgICAgICAgICAgICBBU1NFUlQocmVzdWx0LT5JbnRlcm5hbEZpZWxkQ291
bnQoKSA9PSBWOEN1c3RvbTo6a0hUTUxEb2N1bWVudEludGVybmFsRmllbGRDb3VudCk7CisgICAg
ICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gbWFya2VyID0gdjg6Ok9iamVjdDo6TmV3KCk7
CisgICAgICAgICAgICByZXN1bHQtPlNldEludGVybmFsRmllbGQoVjhDdXN0b206OmtIVE1MRG9j
dW1lbnRNYXJrZXJJbmRleCwgbWFya2VyKTsKKyAgICAgICAgICAgIHJlc3VsdC0+U2V0SW50ZXJu
YWxGaWVsZChWOEN1c3RvbTo6a0hUTUxEb2N1bWVudFNoYWRvd0luZGV4LCBtYXJrZXIpOworICAg
ICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvLyBBIEpTIG9iamVj
dCBvZiB0eXBlIEV2ZW50VGFyZ2V0IGNhbiBvbmx5IGJlIHRoZSBmb2xsb3dpbmcgcG9zc2libGUg
dHlwZXM6CisvLyAxKSBFdmVudFRhcmdldE5vZGU7IDIpIERPTVdpbmRvdyAzKSBYTUxIdHRwUmVx
dWVzdDsgNCkgTWVzc2FnZVBvcnQ7CisvLyA1KSBYTUxIdHRwUmVxdWVzdFVwbG9hZAorLy8gY2hl
Y2sgRXZlbnRUYXJnZXQuaCBmb3IgbmV3IHR5cGUgY29udmVyc2lvbiBtZXRob2RzCit2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6RXZlbnRUYXJnZXRUb1Y4T2JqZWN0KEV2ZW50VGFyZ2V0
KiB0YXJnZXQpCit7CisgICAgaWYgKCF0YXJnZXQpCisgICAgICAgIHJldHVybiB2ODo6TnVsbCgp
OworCisjaWYgRU5BQkxFKFNWRykKKyAgICBTVkdFbGVtZW50SW5zdGFuY2UqIGluc3RhbmNlID0g
dGFyZ2V0LT50b1NWR0VsZW1lbnRJbnN0YW5jZSgpOworICAgIGlmIChpbnN0YW5jZSkKKyAgICAg
ICAgcmV0dXJuIFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpTVkdFTEVNRU5USU5TVEFOQ0UsIGlu
c3RhbmNlKTsKKyNlbmRpZgorCisjaWYgRU5BQkxFKFdPUktFUlMpCisgICAgV29ya2VyKiB3b3Jr
ZXIgPSB0YXJnZXQtPnRvV29ya2VyKCk7CisgICAgaWYgKHdvcmtlcikKKyAgICAgICAgcmV0dXJu
IFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpXT1JLRVIsIHdvcmtlcik7CisjZW5kaWYgIC8vIFdP
UktFUlMKKworICAgIE5vZGUqIG5vZGUgPSB0YXJnZXQtPnRvTm9kZSgpOworICAgIGlmIChub2Rl
KQorICAgICAgICByZXR1cm4gTm9kZVRvVjhPYmplY3Qobm9kZSk7CisKKyAgICBpZiAoRE9NV2lu
ZG93KiBkb21XaW5kb3cgPSB0YXJnZXQtPnRvRE9NV2luZG93KCkpCisgICAgICAgIHJldHVybiBU
b1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBkb21XaW5kb3cpOworCisgICAgLy8g
WE1MSHR0cFJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoaW4gaXRzIEpTIGNvdW50ZXJwYXJ0LgorICAg
IFhNTEh0dHBSZXF1ZXN0KiB4aHIgPSB0YXJnZXQtPnRvWE1MSHR0cFJlcXVlc3QoKTsKKyAgICBp
ZiAoeGhyKSB7CisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlciA9IGdldEFj
dGl2ZURPTU9iamVjdE1hcCgpLmdldCh4aHIpOworICAgICAgICBBU1NFUlQoIXdyYXBwZXIuSXNF
bXB0eSgpKTsKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisgICAgfQorCisgICAgLy8gTWVzc2Fn
ZVBvcnQgaXMgY3JlYXRlZCB3aXRoaW4gaXRzIEpTIGNvdW50ZXJwYXJ0CisgICAgTWVzc2FnZVBv
cnQqIHBvcnQgPSB0YXJnZXQtPnRvTWVzc2FnZVBvcnQoKTsKKyAgICBpZiAocG9ydCkgeworICAg
ICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRBY3RpdmVET01PYmplY3RN
YXAoKS5nZXQocG9ydCk7CisgICAgICAgIEFTU0VSVCghd3JhcHBlci5Jc0VtcHR5KCkpOworICAg
ICAgICByZXR1cm4gd3JhcHBlcjsKKyAgICB9CisKKyAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCog
dXBsb2FkID0gdGFyZ2V0LT50b1hNTEh0dHBSZXF1ZXN0VXBsb2FkKCk7CisgICAgaWYgKHVwbG9h
ZCkgeworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRET01PYmpl
Y3RNYXAoKS5nZXQodXBsb2FkKTsKKyAgICAgICAgQVNTRVJUKCF3cmFwcGVyLklzRW1wdHkoKSk7
CisgICAgICAgIHJldHVybiB3cmFwcGVyOworICAgIH0KKworICAgIEFTU0VSVCgwKTsKKyAgICBy
ZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKK30KKworCit2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gVjhQcm94eTo6RXZlbnRMaXN0ZW5lclRvVjhPYmplY3QoRXZlbnRMaXN0ZW5lciogbGlz
dGVuZXIpCit7CisgICAgaWYgKGxpc3RlbmVyID09IDApCisgICAgICAgIHJldHVybiB2ODo6TnVs
bCgpOworCisgICAgLy8gRklYTUU6IGNhbiBhIHVzZXIgdGFrZSBhIGxhenkgZXZlbnQgbGlzdGVu
ZXIgYW5kIHNldCB0byBvdGhlciBwbGFjZXM/CisgICAgVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIq
IHY4bGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcio+KGxpc3Rl
bmVyKTsKKyAgICByZXR1cm4gdjhsaXN0ZW5lci0+Z2V0TGlzdGVuZXJPYmplY3QoKTsKK30KKwor
Cit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6RE9NSW1wbGVtZW50YXRpb25Ub1Y4T2Jq
ZWN0KERPTUltcGxlbWVudGF0aW9uKiBpbXBsKQoreworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVj
dD4gcmVzdWx0ID0gSW5zdGFudGlhdGVWOE9iamVjdChWOENsYXNzSW5kZXg6OkRPTUlNUExFTUVO
VEFUSU9OLCBWOENsYXNzSW5kZXg6OkRPTUlNUExFTUVOVEFUSU9OLCBpbXBsKTsKKyAgICBpZiAo
cmVzdWx0LklzRW1wdHkoKSkgeworICAgICAgICAvLyBJZiB0aGUgaW5zdGFudGlhdGlvbiBmYWls
ZWQsIHdlIGlnbm9yZSBpdCBhbmQgcmV0dXJuIG51bGwgaW5zdGVhZAorICAgICAgICAvLyBvZiBy
ZXR1cm5pbmcgYW4gZW1wdHkgaGFuZGxlLgorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKyAg
ICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQ
cm94eTo6U3R5bGVTaGVldFRvVjhPYmplY3QoU3R5bGVTaGVldCogc2hlZXQpCit7CisgICAgaWYg
KCFzaGVldCkKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICB2ODo6SGFuZGxlPHY4
OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRET01PYmplY3RNYXAoKS5nZXQoc2hlZXQpOworICAgIGlm
ICghd3JhcHBlci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB3cmFwcGVyOworCisgICAgVjhD
bGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVQ7
CisgICAgaWYgKHNoZWV0LT5pc0NTU1N0eWxlU2hlZXQoKSkKKyAgICAgICAgdHlwZSA9IFY4Q2xh
c3NJbmRleDo6Q1NTU1RZTEVTSEVFVDsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gcmVz
dWx0ID0gSW5zdGFudGlhdGVWOE9iamVjdCh0eXBlLCBWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVQs
IHNoZWV0KTsKKyAgICBpZiAoIXJlc3VsdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gT25seSB1
cGRhdGUgdGhlIERPTSBvYmplY3QgbWFwIGlmIHRoZSByZXN1bHQgaXMgbm9uLWVtcHR5LgorICAg
ICAgICBzaGVldC0+cmVmKCk7CisgICAgICAgIFNldEpTV3JhcHBlckZvckRPTU9iamVjdChzaGVl
dCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhyZXN1bHQpKTsKKyAgICB9CisKKyAg
ICAvLyBBZGQgYSBoaWRkZW4gcmVmZXJlbmNlIGZyb20gc3R5bGVzaGVldCBvYmplY3QgdG8gaXRz
IG93bmVyIG5vZGUuCisgICAgTm9kZSogb3duZXJOb2RlID0gc2hlZXQtPm93bmVyTm9kZSgpOwor
ICAgIGlmIChvd25lck5vZGUpIHsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvd25l
ciA9IHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QoTm9kZVRvVjhPYmplY3Qob3duZXJOb2Rl
KSk7CisgICAgICAgIHJlc3VsdC0+U2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a1N0eWxlU2hl
ZXRPd25lck5vZGVJbmRleCwgb3duZXIpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9
CisKKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6OkNTU1ZhbHVlVG9WOE9iamVjdChD
U1NWYWx1ZSogdmFsdWUpCit7CisgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHY4OjpO
dWxsKCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRET01PYmpl
Y3RNYXAoKS5nZXQodmFsdWUpOworICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiB3cmFwcGVyOworCisgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGU7
CisKKyAgICBpZiAodmFsdWUtPmlzV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUoKSkKKyAgICAgICAg
dHlwZSA9IFY4Q2xhc3NJbmRleDo6V0VCS0lUQ1NTVFJBTlNGT1JNVkFMVUU7CisgICAgZWxzZSBp
ZiAodmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNT
U1ZBTFVFTElTVDsKKyAgICBlbHNlIGlmICh2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAg
ICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDU1NQUklNSVRJVkVWQUxVRTsKKyNpZiBFTkFCTEUo
U1ZHKQorICAgIGVsc2UgaWYgKHZhbHVlLT5pc1NWR1BhaW50KCkpCisgICAgICAgIHR5cGUgPSBW
OENsYXNzSW5kZXg6OlNWR1BBSU5UOworICAgIGVsc2UgaWYgKHZhbHVlLT5pc1NWR0NvbG9yKCkp
CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlNWR0NPTE9SOworI2VuZGlmCisgICAgZWxz
ZQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDU1NWQUxVRTsKKworICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gcmVzdWx0ID0gSW5zdGFudGlhdGVWOE9iamVjdCh0eXBlLCBWOENsYXNz
SW5kZXg6OkNTU1ZBTFVFLCB2YWx1ZSk7CisgICAgaWYgKCFyZXN1bHQuSXNFbXB0eSgpKSB7Cisg
ICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBET00gb2JqZWN0IG1hcCBpZiB0aGUgcmVzdWx0IGlz
IG5vbi1lbXB0eS4KKyAgICAgICAgdmFsdWUtPnJlZigpOworICAgICAgICBTZXRKU1dyYXBwZXJG
b3JET01PYmplY3QodmFsdWUsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcocmVzdWx0
KSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCit2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gVjhQcm94eTo6Q1NTUnVsZVRvVjhPYmplY3QoQ1NTUnVsZSogcnVsZSkKK3sKKyAgICBp
ZiAoIXJ1bGUpIHJldHVybiB2ODo6TnVsbCgpOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0
PiB3cmFwcGVyID0gZ2V0RE9NT2JqZWN0TWFwKCkuZ2V0KHJ1bGUpOworICAgIGlmICghd3JhcHBl
ci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB3cmFwcGVyOworCisgICAgVjhDbGFzc0luZGV4
OjpWOFdyYXBwZXJUeXBlIHR5cGU7CisKKyAgICBzd2l0Y2ggKHJ1bGUtPnR5cGUoKSkgeworICAg
IGNhc2UgQ1NTUnVsZTo6U1RZTEVfUlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6
Q1NTU1RZTEVSVUxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1J1bGU6OkNIQVJTRVRf
UlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q1NTQ0hBUlNFVFJVTEU7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgQ1NTUnVsZTo6SU1QT1JUX1JVTEU6CisgICAgICAgIHR5cGUg
PSBWOENsYXNzSW5kZXg6OkNTU0lNUE9SVFJVTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
Q1NTUnVsZTo6TUVESUFfUlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q1NTTUVE
SUFSVUxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1J1bGU6OkZPTlRfRkFDRV9SVUxF
OgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDU1NGT05URkFDRVJVTEU7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgQ1NTUnVsZTo6UEFHRV9SVUxFOgorICAgICAgICB0eXBlID0gVjhD
bGFzc0luZGV4OjpDU1NQQUdFUlVMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NSdWxl
OjpWQVJJQUJMRVNfUlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q1NTVkFSSUFC
TEVTUlVMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NSdWxlOjpXRUJLSVRfS0VZRlJB
TUVfUlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6V0VCS0lUQ1NTS0VZRlJBTUVS
VUxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1J1bGU6OldFQktJVF9LRVlGUkFNRVNf
UlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6V0VCS0lUQ1NTS0VZRlJBTUVTUlVM
RTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogIC8vIENTU1J1bGU6OlVOS05PV05fUlVM
RQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDU1NSVUxFOworICAgICAgICBicmVhazsK
KyAgICB9CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJlc3VsdCA9IEluc3RhbnRpYXRl
VjhPYmplY3QodHlwZSwgVjhDbGFzc0luZGV4OjpDU1NSVUxFLCBydWxlKTsKKyAgICBpZiAoIXJl
c3VsdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gT25seSB1cGRhdGUgdGhlIERPTSBvYmplY3Qg
bWFwIGlmIHRoZSByZXN1bHQgaXMgbm9uLWVtcHR5LgorICAgICAgICBydWxlLT5yZWYoKTsKKyAg
ICAgICAgU2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KHJ1bGUsIHY4OjpQZXJzaXN0ZW50PHY4OjpP
YmplY3Q+OjpOZXcocmVzdWx0KSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Y4
OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5OjpXaW5kb3dUb1Y4T2JqZWN0KERPTVdpbmRvdyog
d2luZG93KQoreworICAgIGlmICghd2luZG93KQorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsK
KyAgICAvLyBJbml0aWFsaXplcyBlbnZpcm9ubWVudCBvZiBhIGZyYW1lLCBhbmQgcmV0dXJuIHRo
ZSBnbG9iYWwgb2JqZWN0CisgICAgLy8gb2YgdGhlIGZyYW1lLgorICAgIEZyYW1lKiBmcmFtZSA9
IHdpbmRvdy0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PigpOworCisgICAgLy8gU3BlY2lhbCBjYXNlOiBCZWNhdXNlIG9mIGV2
YWx1YXRlSW5OZXdDb250ZXh0KCkgb25lIERPTVdpbmRvdyBjYW4gaGF2ZQorICAgIC8vIG11bHRp
cGxlIGNvbnRleHRzIGFuZCBtdWx0aXBsZSBnbG9iYWwgb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGgg
aXQuIFdoZW4KKyAgICAvLyBjb2RlIHJ1bm5pbmcgaW4gb25lIG9mIHRob3NlIGNvbnRleHRzIGFj
Y2Vzc2VzIHRoZSB3aW5kb3cgb2JqZWN0LCB3ZQorICAgIC8vIHdhbnQgdG8gcmV0dXJuIHRoZSBn
bG9iYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGF0IGNvbnRleHQsIG5vdAorICAgIC8vIG5l
Y2Vzc2FyaWx5IHRoZSBmaXJzdCBnbG9iYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGF0IERP
TVdpbmRvdy4KKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjdXJyZW50Q29udGV4dCA9IHY4
OjpDb250ZXh0OjpHZXRDdXJyZW50KCk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBjdXJy
ZW50R2xvYmFsID0gY3VycmVudENvbnRleHQtPkdsb2JhbCgpOworICAgIHY4OjpIYW5kbGU8djg6
Ok9iamVjdD4gd2luZG93V3JhcHBlciA9IExvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpE
T01XSU5ET1csIGN1cnJlbnRHbG9iYWwpOworICAgIGlmICghd2luZG93V3JhcHBlci5Jc0VtcHR5
KCkpCisgICAgICAgIGlmIChET01XcmFwcGVyVG9OYXRpdmU8RE9NV2luZG93Pih3aW5kb3dXcmFw
cGVyKSA9PSB3aW5kb3cpCisgICAgICAgICAgICByZXR1cm4gY3VycmVudEdsb2JhbDsKKworICAg
IC8vIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBnbG9iYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0
aGlzIGZyYW1lLgorICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBHZXRDb250
ZXh0KGZyYW1lKTsKKyAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+KCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGds
b2JhbCA9IGNvbnRleHQtPkdsb2JhbCgpOworICAgIEFTU0VSVCghZ2xvYmFsLklzRW1wdHkoKSk7
CisgICAgcmV0dXJuIGdsb2JhbDsKK30KKwordm9pZCBWOFByb3h5OjpCaW5kSnNPYmplY3RUb1dp
bmRvdyhGcmFtZSogZnJhbWUsIGNvbnN0IGNoYXIqIG5hbWUsIGludCB0eXBlLCB2ODo6SGFuZGxl
PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBkZXNjLCB2b2lkKiBpbXApCit7CisgICAgLy8gR2V0IGVu
dmlyb25tZW50LgorICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5
OjpHZXRDb250ZXh0KGZyYW1lKTsKKyAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAg
IHJldHVybjsgIC8vIEpTIG5vdCBlbmFibGVkLgorCisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNj
b3BlKGNvbnRleHQpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaW5zdGFuY2UgPSBkZXNj
LT5HZXRGdW5jdGlvbigpOworICAgIFNldERPTVdyYXBwZXIoaW5zdGFuY2UsIHR5cGUsIGltcCk7
CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGdsb2JhbCA9IGNvbnRleHQtPkdsb2JhbCgp
OworICAgIGdsb2JhbC0+U2V0KHY4OjpTdHJpbmc6Ok5ldyhuYW1lKSwgaW5zdGFuY2UpOworfQor
Cit2b2lkIFY4UHJveHk6OlByb2Nlc3NDb25zb2xlTWVzc2FnZXMoKQoreworICAgIENvbnNvbGVN
ZXNzYWdlTWFuYWdlcjo6UHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpOworfQorCisKKy8vIENyZWF0
ZSB0aGUgdXRpbGl0eSBjb250ZXh0IGZvciBob2xkaW5nIEphdmFTY3JpcHQgZnVuY3Rpb25zIHVz
ZWQgaW50ZXJuYWxseQorLy8gd2hpY2ggYXJlIG5vdCB2aXNpYmxlIHRvIEphdmFTY3JpcHQgZXhl
Y3V0aW5nIG9uIHRoZSBwYWdlLgordm9pZCBWOFByb3h5OjpDcmVhdGVVdGlsaXR5Q29udGV4dCgp
IHsKKyAgICBBU1NFUlQobV91dGlsaXR5Q29udGV4dC5Jc0VtcHR5KCkpOworCisgICAgdjg6Okhh
bmRsZVNjb3BlIHNjb3BlOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdFRlbXBsYXRlPiBnbG9i
YWxUZW1wbGF0ZSA9IHY4OjpPYmplY3RUZW1wbGF0ZTo6TmV3KCk7CisgICAgbV91dGlsaXR5Q29u
dGV4dCA9IHY4OjpDb250ZXh0OjpOZXcoTlVMTCwgZ2xvYmFsVGVtcGxhdGUpOworICAgIHY4OjpD
b250ZXh0OjpTY29wZSBjb250ZXh0U2NvcGUobV91dGlsaXR5Q29udGV4dCk7CisKKyAgICAvLyBD
b21waWxlIEphdmFTY3JpcHQgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHNvdXJjZSBsaW5l
IG9mIHRoZSB0b3AKKyAgICAvLyBKYXZhU2NyaXB0IHN0YWNrIGZyYW1lLgorICAgIHN0YXRpYyBj
b25zdCBjaGFyKiBmcmFtZVNvdXJjZUxpbmVfc291cmNlID0KKyAgICAgICAgImZ1bmN0aW9uIGZy
YW1lU291cmNlTGluZShleGVjX3N0YXRlKSB7IgorICAgICAgICAiICByZXR1cm4gZXhlY19zdGF0
ZS5mcmFtZSgwKS5zb3VyY2VMaW5lKCk7IgorICAgICAgICAifSI7CisgICAgdjg6OlNjcmlwdDo6
Q29tcGlsZSh2ODo6U3RyaW5nOjpOZXcoZnJhbWVTb3VyY2VMaW5lX3NvdXJjZSkpLT5SdW4oKTsK
KworICAgIC8vIENvbXBpbGUgSmF2YVNjcmlwdCBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUg
c291cmNlIG5hbWUgb2YgdGhlIHRvcAorICAgIC8vIEphdmFTY3JpcHQgc3RhY2sgZnJhbWUuCisg
ICAgc3RhdGljIGNvbnN0IGNoYXIqIGZyYW1lU291cmNlTmFtZV9zb3VyY2UgPQorICAgICAgICAi
ZnVuY3Rpb24gZnJhbWVTb3VyY2VOYW1lKGV4ZWNfc3RhdGUpIHsiCisgICAgICAgICIgIHZhciBm
cmFtZSA9IGV4ZWNfc3RhdGUuZnJhbWUoMCk7IgorICAgICAgICAiICBpZiAoZnJhbWUuZnVuYygp
LnJlc29sdmVkKCkgJiYgIgorICAgICAgICAiICAgICAgZnJhbWUuZnVuYygpLnNjcmlwdCgpICYm
ICIKKyAgICAgICAgIiAgICAgIGZyYW1lLmZ1bmMoKS5zY3JpcHQoKS5uYW1lKCkpIHsiCisgICAg
ICAgICIgICAgcmV0dXJuIGZyYW1lLmZ1bmMoKS5zY3JpcHQoKS5uYW1lKCk7IgorICAgICAgICAi
ICB9IgorICAgICAgICAifSI7CisgICAgdjg6OlNjcmlwdDo6Q29tcGlsZSh2ODo6U3RyaW5nOjpO
ZXcoZnJhbWVTb3VyY2VOYW1lX3NvdXJjZSkpLT5SdW4oKTsKK30KKworCitpbnQgVjhQcm94eTo6
R2V0U291cmNlTGluZU51bWJlcigpIHsKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAg
djg6OkhhbmRsZTx2ODo6Q29udGV4dD4gdXRpbGl0eUNvbnRleHQgPSBWOFByb3h5OjpHZXRVdGls
aXR5Q29udGV4dCgpOworICAgIGlmICh1dGlsaXR5Q29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiAwOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0U2NvcGUodXRpbGl0eUNv
bnRleHQpOworICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiBmcmFtZVNvdXJjZUxpbmU7Cisg
ICAgZnJhbWVTb3VyY2VMaW5lID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj46OkNhc3QodXRpbGl0
eUNvbnRleHQtPkdsb2JhbCgpLT5HZXQodjg6OlN0cmluZzo6TmV3KCJmcmFtZVNvdXJjZUxpbmUi
KSkpOworICAgIGlmIChmcmFtZVNvdXJjZUxpbmUuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4g
MDsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmVzdWx0ID0gdjg6OkRlYnVnOjpDYWxsKGZy
YW1lU291cmNlTGluZSk7CisgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVy
biAwOworICAgIHJldHVybiByZXN1bHQtPkludDMyVmFsdWUoKTsKK30KKworCitTdHJpbmcgVjhQ
cm94eTo6R2V0U291cmNlTmFtZSgpIHsKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAg
djg6OkhhbmRsZTx2ODo6Q29udGV4dD4gdXRpbGl0eUNvbnRleHQgPSBHZXRVdGlsaXR5Q29udGV4
dCgpOworICAgIGlmICh1dGlsaXR5Q29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBT
dHJpbmcoKTsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dFNjb3BlKHV0aWxpdHlDb250
ZXh0KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4gZnJhbWVTb3VyY2VOYW1lOworICAg
IGZyYW1lU291cmNlTmFtZSA9IHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+OjpDYXN0KHV0aWxpdHlD
b250ZXh0LT5HbG9iYWwoKS0+R2V0KHY4OjpTdHJpbmc6Ok5ldygiZnJhbWVTb3VyY2VOYW1lIikp
KTsKKyAgICBpZiAoZnJhbWVTb3VyY2VOYW1lLklzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4g
U3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBUb1dlYkNvcmVTdHJpbmcodjg6OkRlYnVnOjpD
YWxsKGZyYW1lU291cmNlTmFtZSkpOworfQorCit2b2lkIFY4UHJveHk6OlJlZ2lzdGVyRXh0ZW5z
aW9uKHY4OjpFeHRlbnNpb24qIGV4dGVuc2lvbiwgY29uc3QgU3RyaW5nJiBzY2hlbWVSZXN0cmlj
dGlvbikKK3sKKyAgICB2ODo6UmVnaXN0ZXJFeHRlbnNpb24oZXh0ZW5zaW9uKTsKKyAgICBWOEV4
dGVuc2lvbkluZm8gaW5mbyA9IHtzY2hlbWVSZXN0cmljdGlvbiwgZXh0ZW5zaW9ufTsKKyAgICBt
X2V4dGVuc2lvbnMucHVzaF9iYWNrKGluZm8pOworfQorCitib29sIFY4UHJveHk6OlNldENvbnRl
eHREZWJ1Z0lkKGludCBkZWJ1Z0lkKSB7CisgICAgQVNTRVJUKGRlYnVnSWQgPiAwKTsKKyAgICBp
ZiAobV9jb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHY4OjpI
YW5kbGVTY29wZSBzY29wZTsKKyAgICBpZiAoIW1fY29udGV4dC0+R2V0RGF0YSgpLT5Jc1VuZGVm
aW5lZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmpl
Y3Q+IGNvbnRleHRfZGF0YSA9IHY4OjpPYmplY3Q6Ok5ldygpOworICAgIGNvbnRleHRfZGF0YS0+
U2V0KHY4OjpTdHJpbmc6Ok5ldyhrQ29udGV4dERlYnVnRGF0YVR5cGUpLCB2ODo6U3RyaW5nOjpO
ZXcoInBhZ2UiKSk7CisgICAgY29udGV4dF9kYXRhLT5TZXQodjg6OlN0cmluZzo6TmV3KGtDb250
ZXh0RGVidWdEYXRhVmFsdWUpLCB2ODo6SW50ZWdlcjo6TmV3KGRlYnVnSWQpKTsKKyAgICBtX2Nv
bnRleHQtPlNldERhdGEoY29udGV4dF9kYXRhKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8g
c3RhdGljCitpbnQgVjhQcm94eTo6R2V0Q29udGV4dERlYnVnSWQodjg6OkhhbmRsZTx2ODo6Q29u
dGV4dD4gY29udGV4dCkKK3sKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgaWYgKCFj
b250ZXh0LT5HZXREYXRhKCktPklzT2JqZWN0KCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZGF0YSA9IGNvbnRleHQtPkdldERhdGEoKS0+VG9PYmplY3Qo
KS0+R2V0KCB2ODo6U3RyaW5nOjpOZXcoa0NvbnRleHREZWJ1Z0RhdGFWYWx1ZSkpOworICAgIHJl
dHVybiBkYXRhLT5Jc0ludDMyKCkgPyBkYXRhLT5JbnQzMlZhbHVlKCkgOiAtMTsKK30KKworfSAg
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvVjhQcm94eS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhQcm94eS5oCShyZXZpc2lvbiA0
NDkzOSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhQcm94eS5oCSh3b3JraW5nIGNvcHkpCkBA
IC0zMSwxMiArMzEsNjE2IEBACiAjaWZuZGVmIFY4UHJveHlfaAogI2RlZmluZSBWOFByb3h5X2gK
IAotLy8gRklYTUU6IFRoaXMgaXMgYSB0ZW1wb3JhcnkgZm9yd2FyZGluZyBoZWFkZXIgdW50aWwg
YWxsIGJpbmRpbmdzIGhhdmUgbWlncmF0ZWQKLS8vIG92ZXIgYW5kIHY4X3Byb3h5IGFjdHVhbGx5
IGJlY29tZXMgVjhQcm94eS4KLSNpbmNsdWRlICJ2OF9wcm94eS5oIgorI2luY2x1ZGUgIkNocm9t
aXVtQnJpZGdlLmgiCisjaW5jbHVkZSAiTm9kZS5oIgorI2luY2x1ZGUgIk5vZGVGaWx0ZXIuaCIK
KyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIiAgLy8gZm9yIFdlYkNvcmU6OlN0cmluZworI2lu
Y2x1ZGUgIlNjcmlwdFNvdXJjZUNvZGUuaCIgIC8vIGZvciBXZWJDb3JlOjpTY3JpcHRTb3VyY2VD
b2RlCisjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIgIC8vIGZvciBXZWJDb3JlOjpTZWN1cml0
eU9yaWdpbgorI2luY2x1ZGUgIlY4Q3VzdG9tQmluZGluZy5oIgorI2luY2x1ZGUgIlY4RE9NTWFw
LmgiCisjaW5jbHVkZSAiVjhFdmVudExpc3RlbmVyTGlzdC5oIgorI2luY2x1ZGUgIlY4SW5kZXgu
aCIKKyNpbmNsdWRlICJWOFV0aWxpdGllcy5oIgorI2luY2x1ZGUgPHY4Lmg+CisjaW5jbHVkZSA8
d3RmL0Fzc2VydGlvbnMuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPiAvLyBzbyBnZW5l
cmF0ZWQgYmluZGluZ3MgZG9uJ3QgaGF2ZSB0bworI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKwor
I2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpZmRlZiBFTkFCTEVfRE9N
X1NUQVRTX0NPVU5URVJTCisjZGVmaW5lIElOQ19TVEFUUyhuYW1lKSBDaHJvbWl1bUJyaWRnZTo6
aW5jcmVtZW50U3RhdHNDb3VudGVyKG5hbWUpCisjZWxzZQorI2RlZmluZSBJTkNfU1RBVFMobmFt
ZSkKKyNlbmRpZgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKKyAgICBjbGFzcyBDU1NTdHlsZURl
Y2xhcmF0aW9uOworICAgIGNsYXNzIENsaWVudFJlY3RMaXN0OworICAgIGNsYXNzIERPTUltcGxl
bWVudGF0aW9uOworICAgIGNsYXNzIEVsZW1lbnQ7CisgICAgY2xhc3MgRXZlbnQ7CisgICAgY2xh
c3MgRXZlbnRMaXN0ZW5lcjsKKyAgICBjbGFzcyBGcmFtZTsKKyAgICBjbGFzcyBIVE1MQ29sbGVj
dGlvbjsKKyAgICBjbGFzcyBIVE1MT3B0aW9uc0NvbGxlY3Rpb247CisgICAgY2xhc3MgSFRNTEVs
ZW1lbnQ7CisgICAgY2xhc3MgSFRNTERvY3VtZW50OworICAgIGNsYXNzIE1lZGlhTGlzdDsKKyAg
ICBjbGFzcyBOYW1lZE5vZGVNYXA7CisgICAgY2xhc3MgTm9kZTsKKyAgICBjbGFzcyBOb2RlTGlz
dDsKKyAgICBjbGFzcyBTY3JlZW47CisgICAgY2xhc3MgU3RyaW5nOworICAgIGNsYXNzIFN0eWxl
U2hlZXQ7CisgICAgY2xhc3MgU1ZHRWxlbWVudDsKKyAgICBjbGFzcyBET01XaW5kb3c7CisgICAg
Y2xhc3MgRG9jdW1lbnQ7CisgICAgY2xhc3MgRXZlbnRUYXJnZXQ7CisgICAgY2xhc3MgRXZlbnQ7
CisgICAgY2xhc3MgRXZlbnRMaXN0ZW5lcjsKKyAgICBjbGFzcyBOYXZpZ2F0b3I7CisgICAgY2xh
c3MgTWltZVR5cGU7CisgICAgY2xhc3MgTWltZVR5cGVBcnJheTsKKyAgICBjbGFzcyBQbHVnaW47
CisgICAgY2xhc3MgUGx1Z2luQXJyYXk7CisgICAgY2xhc3MgU3R5bGVTaGVldExpc3Q7CisgICAg
Y2xhc3MgQ1NTVmFsdWU7CisgICAgY2xhc3MgQ1NTUnVsZTsKKyAgICBjbGFzcyBDU1NSdWxlTGlz
dDsKKyAgICBjbGFzcyBDU1NWYWx1ZUxpc3Q7CisgICAgY2xhc3MgTm9kZUZpbHRlcjsKKyAgICBj
bGFzcyBTY3JpcHRFeGVjdXRpb25Db250ZXh0OworCisjaWYgRU5BQkxFKERPTV9TVE9SQUdFKQor
ICAgIGNsYXNzIFN0b3JhZ2U7CisgICAgY2xhc3MgU3RvcmFnZUV2ZW50OworI2VuZGlmCisKKyAj
aWYgRU5BQkxFKFNWRykKKyAgICBjbGFzcyBTVkdFbGVtZW50SW5zdGFuY2U7CisgI2VuZGlmCisK
KyAgICBjbGFzcyBWOEV2ZW50TGlzdGVuZXI7CisgICAgY2xhc3MgVjhPYmplY3RFdmVudExpc3Rl
bmVyOworCisKKyAgICAvLyBGSVhNRTogdXNlIHN0YW5kYXJkIGxvZ2dpbmcgZmFjaWxpdGllcyBp
biBXZWJDb3JlLgorICAgIHZvaWQgbG9nX2luZm8oRnJhbWUqIGZyYW1lLCBjb25zdCBTdHJpbmcm
IG1zZywgY29uc3QgU3RyaW5nJiB1cmwpOworCisKKyNpZm5kZWYgTkRFQlVHCisKKyNkZWZpbmUg
R2xvYmFsSGFuZGxlVHlwZUxpc3QoVikgICBcCisgICAgVihQUk9YWSkgICAgICAgICAgICAgICAg
ICAgICAgXAorICAgIFYoTlBPQkpFQ1QpICAgICAgICAgICAgICAgICAgIFwKKyAgICBWKFNDSEVE
VUxFRF9BQ1RJT04pICAgICAgICAgICBcCisgICAgVihFVkVOVF9MSVNURU5FUikgICAgICAgICAg
ICAgXAorICAgIFYoTk9ERV9GSUxURVIpICAgICAgICAgICAgICAgIFwKKyAgICBWKFNDUklQVElO
U1RBTkNFKSAgICAgICAgICAgICBcCisgICAgVihTQ1JJUFRWQUxVRSkKKworCisgICAgLy8gSG9z
dCBpbmZvcm1hdGlvbiBvZiBwZXJzaXN0ZW50IGhhbmRsZXMuCisgICAgZW51bSBHbG9iYWxIYW5k
bGVUeXBlIHsKKyNkZWZpbmUgRU5VTShuYW1lKSBuYW1lLAorICAgICAgICBHbG9iYWxIYW5kbGVU
eXBlTGlzdChFTlVNKQorI3VuZGVmIEVOVU0KKyAgICB9OworCisKKyAgICBjbGFzcyBHbG9iYWxI
YW5kbGVJbmZvIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEdsb2JhbEhhbmRsZUluZm8odm9pZCog
aG9zdCwgR2xvYmFsSGFuZGxlVHlwZSB0eXBlKSA6IGhvc3RfKGhvc3QpLCB0eXBlXyh0eXBlKSB7
IH0KKyAgICAgICAgdm9pZCogaG9zdF87CisgICAgICAgIEdsb2JhbEhhbmRsZVR5cGUgdHlwZV87
CisgICAgfTsKKworI2VuZGlmICAvLyBOREVCVUcKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgQmF0
Y2ggc3RydWN0cyBhbmQgbWV0aG9kcyBhcmUgdXNlZCBmb3Igc2V0dGluZyBtdWx0aXBsZQorICAg
IC8vIHByb3BlcnRpZXMgb24gYW4gT2JqZWN0VGVtcGxhdGUsIHVzZWQgZnJvbSB0aGUgZ2VuZXJh
dGVkIGJpbmRpbmdzCisgICAgLy8gaW5pdGlhbGl6YXRpb24gKENvbmZpZ3VyZVhYWFRlbXBsYXRl
KS4gIFRoaXMgZ3JlYXRseSByZWR1Y2VzIHRoZSBiaW5hcnkKKyAgICAvLyBzaXplIGJ5IG1vdmlu
ZyBmcm9tIGNvZGUgZHJpdmVuIHNldHVwIHRvIGRhdGEgdGFibGUgZHJpdmVuIHNldHVwLgorCisg
ICAgLy8gQmF0Y2hlZEF0dHJpYnV0ZSB0cmFuc2xhdGVzIGludG8gY2FsbHMgdG8gU2V0QWNjZXNz
b3IoKSBvbiBlaXRoZXIgdGhlCisgICAgLy8gaW5zdGFuY2Ugb3IgdGhlIHByb3RvdHlwZSBPYmpl
Y3RUZW1wbGF0ZSwgYmFzZWQgb24gfG9uX3Byb3RvfC4KKyAgICBzdHJ1Y3QgQmF0Y2hlZEF0dHJp
YnV0ZSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWU7CisgICAgICAgIHY4OjpBY2Nl
c3NvckdldHRlciBnZXR0ZXI7CisgICAgICAgIHY4OjpBY2Nlc3NvclNldHRlciBzZXR0ZXI7Cisg
ICAgICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBkYXRhOworICAgICAgICB2ODo6QWNj
ZXNzQ29udHJvbCBzZXR0aW5nczsKKyAgICAgICAgdjg6OlByb3BlcnR5QXR0cmlidXRlIGF0dHJp
YnV0ZTsKKyAgICAgICAgYm9vbCBvbl9wcm90bzsKKyAgICB9OworCisgICAgdm9pZCBCYXRjaENv
bmZpZ3VyZUF0dHJpYnV0ZXModjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+LCB2ODo6SGFu
ZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4gcHJvdG8sIGNvbnN0IEJhdGNoZWRBdHRyaWJ1dGUqIGF0
dHJpYnV0ZXMsIHNpemVfdCBhdHRyaWJ1dGVDb3VudCk7CisKKyAgICAvLyBCYXRjaGVkQ29uc3Rh
bnQgdHJhbnNsYXRlcyBpbnRvIGNhbGxzIHRvIFNldCgpIGZvciBzZXR0aW5nIHVwIGFuIG9iamVj
dCdzCisgICAgLy8gY29uc3RhbnRzLiAgSXQgc2V0cyB0aGUgY29uc3RhbnQgb24gYm90aCB0aGUg
RnVuY3Rpb25UZW1wbGF0ZSB8ZGVzY3wgYW5kIHRoZQorICAgIC8vIE9iamVjdFRlbXBsYXRlIHxw
cm90b3wuICBQcm9wZXJ0eUF0dHJpYnV0ZXMgaXMgYWx3YXlzIFJlYWRPbmx5LgorICAgIHN0cnVj
dCBCYXRjaGVkQ29uc3RhbnQgeworICAgICAgICBjb25zdCBjaGFyKiBjb25zdCBuYW1lOworICAg
ICAgICBpbnQgdmFsdWU7CisgICAgfTsKKworICAgIHZvaWQgQmF0Y2hDb25maWd1cmVDb25zdGFu
dHModjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gZGVzYywgdjg6OkhhbmRsZTx2ODo6
T2JqZWN0VGVtcGxhdGU+IHByb3RvLCBjb25zdCBCYXRjaGVkQ29uc3RhbnQqIGNvbnN0YW50cywg
c2l6ZV90IGNvbnN0YW50Q291bnQpOworCisgICAgY29uc3QgaW50IGtNYXhSZWN1cnNpb25EZXB0
aCA9IDIwOworCisgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgYW4gZXh0ZW5zaW9uIHRoYXQgaXMg
cmVnaXN0ZXJlZCBmb3IgdXNlIHdpdGggVjguIElmIHNjaGVtZQorICAgIC8vIGlzIG5vbi1lbXB0
eSwgaXQgY29udGFpbnMgdGhlIFVSTCBzY2hlbWUgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgdXNl
ZCB3aXRoLgorICAgIC8vIE90aGVyd2lzZSwgdGhlIGV4dGVuc2lvbiBpcyB1c2VkIHdpdGggYWxs
IHNjaGVtZXMuCisgICAgc3RydWN0IFY4RXh0ZW5zaW9uSW5mbyB7CisgICAgICAgIFN0cmluZyBz
Y2hlbWU7CisgICAgICAgIHY4OjpFeHRlbnNpb24qIGV4dGVuc2lvbjsKKyAgICB9OworICAgIHR5
cGVkZWYgc3RkOjpsaXN0PFY4RXh0ZW5zaW9uSW5mbz4gVjhFeHRlbnNpb25MaXN0OworCisgICAg
Y2xhc3MgVjhQcm94eSB7CisgICAgcHVibGljOgorICAgICAgICAvLyBUaGUgdHlwZXMgb2YgamF2
YXNjcmlwdCBlcnJvcnMgdGhhdCBjYW4gYmUgdGhyb3duLgorICAgICAgICBlbnVtIEVycm9yVHlw
ZSB7CisgICAgICAgICAgICBSQU5HRV9FUlJPUiwKKyAgICAgICAgICAgIFJFRkVSRU5DRV9FUlJP
UiwKKyAgICAgICAgICAgIFNZTlRBWF9FUlJPUiwKKyAgICAgICAgICAgIFRZUEVfRVJST1IsCisg
ICAgICAgICAgICBHRU5FUkFMX0VSUk9SCisgICAgICAgIH07CisKKyAgICAgICAgZXhwbGljaXQg
VjhQcm94eShGcmFtZSogZnJhbWUpIDogbV9mcmFtZShmcmFtZSksIG1faW5saW5lQ29kZShmYWxz
ZSksIG1fdGltZXJDYWxsYmFjayhmYWxzZSksIG1fcmVjdXJzaW9uKDApIHsgfQorCisgICAgICAg
IH5WOFByb3h5KCk7CisKKyAgICAgICAgRnJhbWUqIGZyYW1lKCkgeyByZXR1cm4gbV9mcmFtZTsg
fQorCisgICAgICAgIC8vIENsZWFyIHBhZ2Utc3BlY2lmaWMgZGF0YSwgYnV0IGtlZXAgdGhlIGds
b2JhbCBvYmplY3QgaWRlbnRpZnkuCisgICAgICAgIHZvaWQgY2xlYXJGb3JOYXZpZ2F0aW9uKCk7
CisKKyAgICAgICAgLy8gQ2xlYXIgcGFnZS1zcGVjaWZpYyBkYXRhIGJlZm9yZSBzaHV0dGluZyBk
b3duIHRoZSBwcm94eSBvYmplY3QuCisgICAgICAgIHZvaWQgY2xlYXJGb3JDbG9zZSgpOworCisg
ICAgICAgIC8vIFVwZGF0ZSBkb2N1bWVudCBvYmplY3Qgb2YgdGhlIGZyYW1lLgorICAgICAgICB2
b2lkIHVwZGF0ZURvY3VtZW50KCk7CisKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWN1cml0eSBv
cmlnaW4gb2YgYSBkb2N1bWVudAorICAgICAgICAvLyAoZS5nLiwgYWZ0ZXIgc2V0dGluZyBkb2Nv
dW1lbnQuZG9tYWluKS4KKyAgICAgICAgdm9pZCB1cGRhdGVTZWN1cml0eU9yaWdpbigpOworCisg
ICAgICAgIC8vIERlc3Ryb3kgdGhlIGdsb2JhbCBvYmplY3QuCisgICAgICAgIHZvaWQgRGVzdHJv
eUdsb2JhbCgpOworCisgICAgICAgIC8vIFRPRE8obXBjb21wbGV0ZSk6IE5lZWQgY29tbWVudC4g
IFVzZXIgR2VzdHVyZSByZWxhdGVkLgorICAgICAgICBib29sIGlubGluZUNvZGUoKSBjb25zdCB7
IHJldHVybiBtX2lubGluZUNvZGU7IH0KKyAgICAgICAgdm9pZCBzZXRJbmxpbmVDb2RlKGJvb2wg
dmFsdWUpIHsgbV9pbmxpbmVDb2RlID0gdmFsdWU7IH0KKworICAgICAgICBib29sIHRpbWVyQ2Fs
bGJhY2soKSBjb25zdCB7IHJldHVybiBtX3RpbWVyQ2FsbGJhY2s7IH0KKyAgICAgICAgdm9pZCBz
ZXRUaW1lckNhbGxiYWNrKGJvb2wgdmFsdWUpIHsgbV90aW1lckNhbGxiYWNrID0gdmFsdWU7IH0K
KworICAgICAgICAvLyBIYXMgdGhlIGNvbnRleHQgZm9yIHRoaXMgcHJveHkgYmVlbiBpbml0aWFs
aXplZD8KKyAgICAgICAgYm9vbCBDb250ZXh0SW5pdGlhbGl6ZWQoKTsKKworICAgICAgICAvLyBE
aXNjb25uZWN0cyB0aGUgcHJveHkgZnJvbSBpdHMgb3duZXIgZnJhbWUsCisgICAgICAgIC8vIGFu
ZCBjbGVhcnMgYWxsIHRpbWVvdXRzIG9uIHRoZSBET00gd2luZG93LgorICAgICAgICB2b2lkIGRp
c2Nvbm5lY3RGcmFtZSgpOworCisgICAgICAgIGJvb2wgaXNFbmFibGVkKCk7CisKKyAgICAgICAg
Ly8gRmluZC9DcmVhdGUvUmVtb3ZlIGV2ZW50IGxpc3RlbmVyIHdyYXBwZXJzLgorICAgICAgICBQ
YXNzUmVmUHRyPFY4RXZlbnRMaXN0ZW5lcj4gRmluZFY4RXZlbnRMaXN0ZW5lcih2ODo6TG9jYWw8
djg6OlZhbHVlPiBsaXN0ZW5lciwgYm9vbCBpc0h0bWwpOworICAgICAgICBQYXNzUmVmUHRyPFY4
RXZlbnRMaXN0ZW5lcj4gRmluZE9yQ3JlYXRlVjhFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6
VmFsdWU+IGxpc3RlbmVyLCBib29sIGlzSHRtbCk7CisKKyAgICAgICAgUGFzc1JlZlB0cjxWOEV2
ZW50TGlzdGVuZXI+IEZpbmRPYmplY3RFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6VmFsdWU+
IGxpc3RlbmVyLCBib29sIGlzSHRtbCk7CisgICAgICAgIFBhc3NSZWZQdHI8VjhFdmVudExpc3Rl
bmVyPiBGaW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6VmFsdWU+
IGxpc3RlbmVyLCBib29sIGlzSHRtbCk7CisKKyAgICAgICAgdm9pZCBSZW1vdmVWOEV2ZW50TGlz
dGVuZXIoVjhFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7CisgICAgICAgIHZvaWQgUmVtb3ZlT2Jq
ZWN0RXZlbnRMaXN0ZW5lcihWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICAg
ICAgICAvLyBQcm90ZWN0L1VucHJvdGVjdCBKUyB3cmFwcGVycyBvZiBhIERPTSBvYmplY3QuCisg
ICAgICAgIHN0YXRpYyB2b2lkIEdDUHJvdGVjdCh2b2lkKiBkb21PYmplY3QpOworICAgICAgICBz
dGF0aWMgdm9pZCBHQ1VucHJvdGVjdCh2b2lkKiBkb21PYmplY3QpOworCisjaWYgRU5BQkxFKFNW
RykKKyAgICAgICAgc3RhdGljIHZvaWQgU2V0U1ZHQ29udGV4dCh2b2lkKiBvYmplY3QsIFNWR0Vs
ZW1lbnQqIGNvbnRleHQpOworICAgICAgICBzdGF0aWMgU1ZHRWxlbWVudCogR2V0U1ZHQ29udGV4
dCh2b2lkKiBvYmplY3QpOworI2VuZGlmCisKKyAgICAgICAgdm9pZCBzZXRFdmVudEhhbmRsZXJM
aW5lbm8oaW50IGxpbmVubykgeyBtX2hhbmRsZXJMaW5lbm8gPSBsaW5lbm87IH0KKyAgICAgICAg
dm9pZCBmaW5pc2hlZFdpdGhFdmVudChFdmVudCogZXZlbnQpIHsgfQorCisgICAgICAgIC8vIEV2
YWx1YXRlIEphdmFTY3JpcHQgaW4gYSBuZXcgY29udGV4dC4gVGhlIHNjcmlwdCBnZXRzIGl0cyBv
d24gZ2xvYmFsIHNjb3BlCisgICAgICAgIC8vIGFuZCBpdHMgb3duIHByb3RvdHlwZXMgZm9yIGlu
dHJpbnNpYyBKYXZhU2NyaXB0IG9iamVjdHMgKFN0cmluZywgQXJyYXksCisgICAgICAgIC8vIGFu
ZCBzby1vbikuIEl0IHNoYXJlcyB0aGUgd3JhcHBlcnMgZm9yIGFsbCBET00gbm9kZXMgYW5kIERP
TSBjb25zdHJ1Y3RvcnMuCisgICAgICAgIHZvaWQgZXZhbHVhdGVJbk5ld0NvbnRleHQoY29uc3Qg
VmVjdG9yPFNjcmlwdFNvdXJjZUNvZGU+Jik7CisKKyAgICAgICAgLy8gRXZhbHVhdGUgYSBzY3Jp
cHQgZmlsZSBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQuCisgICAgICAgIC8v
IFRoZSBjYWxsZXIgbXVzdCBob2xkIGFuIGV4ZWN1dGlvbiBjb250ZXh0LgorICAgICAgICAvLyBJ
ZiBjYW5ub3QgZXZhbHV0ZSB0aGUgc2NyaXB0LCBpdCByZXR1cm5zIGFuIGVycm9yLgorICAgICAg
ICB2ODo6TG9jYWw8djg6OlZhbHVlPiBldmFsdWF0ZShjb25zdCBTY3JpcHRTb3VyY2VDb2RlJiwg
Tm9kZSopOworCisgICAgICAgIC8vIFJ1biBhbiBhbHJlYWR5IGNvbXBpbGVkIHNjcmlwdC4KKyAg
ICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gUnVuU2NyaXB0KHY4OjpIYW5kbGU8djg6OlNjcmlw
dD4sIGJvb2wgaXNJbmxpbmVDb2RlKTsKKworICAgICAgICAvLyBDYWxsIHRoZSBmdW5jdGlvbiB3
aXRoIHRoZSBnaXZlbiByZWNlaXZlciBhbmQgYXJndW1lbnRzLgorICAgICAgICB2ODo6TG9jYWw8
djg6OlZhbHVlPiBDYWxsRnVuY3Rpb24odjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+IGZ1bmN0aW9u
LCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJlY2VpdmVyLCBpbnQgYXJnYywgdjg6OkhhbmRsZTx2
ODo6VmFsdWU+IGFyZ3ZbXSk7CisKKyAgICAgICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24gYXMgY29u
c3RydWN0b3Igd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorICAgICAgICB2ODo6TG9jYWw8djg6
OlZhbHVlPiBOZXdJbnN0YW5jZSh2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4gY29uc3RydWN0b3Is
IGludCBhcmdjLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJndltdKTsKKworICAgICAgICAvLyBS
ZXR1cm5zIHRoZSBkb20gY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBub2RlIHR5
cGUuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IEdldENvbnN0cnVjdG9yKFY4Q2xh
c3NJbmRleDo6VjhXcmFwcGVyVHlwZSk7CisKKyAgICAgICAgLy8gVG8gY3JlYXRlIEpTIFdyYXBw
ZXIgb2JqZWN0cywgd2UgY3JlYXRlIGEgY2FjaGUgb2YgYSAnYm9pbGVyIHBsYXRlJworICAgICAg
ICAvLyBvYmplY3QsIGFuZCB0aGVuIHNpbXBseSBDbG9uZSB0aGF0IG9iamVjdCBlYWNoIHRpbWUg
d2UgbmVlZCBhIG5ldyBvbmUuCisgICAgICAgIC8vIFRoaXMgaXMgZmFzdGVyIHRoYW4gZ29pbmcg
dGhyb3VnaCB0aGUgZnVsbCBvYmplY3QgY3JlYXRpb24gcHJvY2Vzcy4KKyAgICAgICAgdjg6Okxv
Y2FsPHY4OjpPYmplY3Q+IENyZWF0ZVdyYXBwZXJGcm9tQ2FjaGUoVjhDbGFzc0luZGV4OjpWOFdy
YXBwZXJUeXBlIHR5cGUpOworCisgICAgICAgIC8vIFJldHVybnMgdGhlIHdpbmRvdyBvYmplY3Qg
b2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgY29udGV4dC4KKyAgICAgICAgc3RhdGljIERPTVdp
bmRvdyogcmV0cmlldmVXaW5kb3coKTsKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgd2luZG93IG9i
amVjdCBhc3NvY2lhdGVkIHdpdGggYSBjb250ZXh0LgorICAgICAgICBzdGF0aWMgRE9NV2luZG93
KiByZXRyaWV2ZVdpbmRvdyh2ODo6SGFuZGxlPHY4OjpDb250ZXh0Pik7CisgICAgICAgIC8vIFJl
dHVybnMgVjhQcm94eSBvYmplY3Qgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgY29udGV4dC4K
KyAgICAgICAgc3RhdGljIFY4UHJveHkqIHJldHJpZXZlKCk7CisgICAgICAgIC8vIFJldHVybnMg
VjhQcm94eSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgZnJhbWUuCisgICAgICAgIHN0YXRpYyBW
OFByb3h5KiByZXRyaWV2ZShGcmFtZSopOworICAgICAgICAvLyBSZXR1cm5zIFY4UHJveHkgb2Jq
ZWN0IGFzc29jaWF0ZWQgd2l0aCBhIHNjcmlwdCBleGVjdXRpb24gY29udGV4dC4KKyAgICAgICAg
c3RhdGljIFY4UHJveHkqIHJldHJpZXZlKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqKTsKKworICAg
ICAgICAvLyBSZXR1cm5zIHRoZSBmcmFtZSBvYmplY3Qgb2YgdGhlIHdpbmRvdyBvYmplY3QgYXNz
b2NpYXRlZAorICAgICAgICAvLyB3aXRoIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbnRleHQu
CisgICAgICAgIHN0YXRpYyBGcmFtZSogcmV0cmlldmVGcmFtZSgpOworICAgICAgICAvLyBSZXR1
cm5zIHRoZSBmcmFtZSBvYmplY3Qgb2YgdGhlIHdpbmRvdyBvYmplY3QgYXNzb2NpYXRlZCB3aXRo
CisgICAgICAgIC8vIGEgY29udGV4dC4KKyAgICAgICAgc3RhdGljIEZyYW1lKiByZXRyaWV2ZUZy
YW1lKHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+KTsKKworCisgICAgICAgIC8vIFRoZSB0aHJlZSBm
dW5jdGlvbnMgYmVsb3cgcmV0cmlldmUgV2ViRnJhbWUgaW5zdGFuY2VzIHJlbGF0aW5nIHRoZQor
ICAgICAgICAvLyBjdXJyZW50bHkgZXhlY3V0aW5nIEphdmFTY3JpcHQuIFNpbmNlIEphdmFTY3Jp
cHQgY2FuIG1ha2UgZnVuY3Rpb24gY2FsbHMKKyAgICAgICAgLy8gYWNyb3NzIGZyYW1lcywgdGhv
dWdoLCB3ZSBuZWVkIHRvIGJlIG1vcmUgcHJlY2lzZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8g
Rm9yIGV4YW1wbGUsIGltYWdpbmUgdGhhdCBhIEpTIGZ1bmN0aW9uIGluIGZyYW1lIEEgY2FsbHMg
YSBmdW5jdGlvbiBpbgorICAgICAgICAvLyBmcmFtZSBCLCB3aGljaCBjYWxscyBuYXRpdmUgY29k
ZSwgd2hpY2ggd2FudHMgdG8ga25vdyB3aGF0IHRoZSAnYWN0aXZlJworICAgICAgICAvLyBmcmFt
ZSBpcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlICdlbnRlcmVkIGNvbnRleHQnIGlzIHRo
ZSBjb250ZXh0IHdoZXJlIGV4ZWN1dGlvbiBmaXJzdCBlbnRlcmVkIHRoZQorICAgICAgICAvLyBz
Y3JpcHQgZW5naW5lOyB0aGUgY29udGV4dCB0aGF0IGlzIGF0IHRoZSBib3R0b20gb2YgdGhlIEpT
IGZ1bmN0aW9uIHN0YWNrLgorICAgICAgICAvLyBSZXRyaWV2ZUZyYW1lRm9yRW50ZXJlZENvbnRl
eHQoKSB3b3VsZCByZXR1cm4gRnJhbWUgQSBpbiBvdXIgZXhhbXBsZS4KKyAgICAgICAgLy8gVGhp
cyBmcmFtZSBpcyBvZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgImR5bmFtaWMgZ2xvYmFsIG9iamVj
dC4iCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSAnY3VycmVudCBjb250ZXh0JyBpcyB0aGUg
Y29udGV4dCB0aGUgSlMgZW5naW5lIGlzIGN1cnJlbnRseSBpbnNpZGUgb2Y7CisgICAgICAgIC8v
IHRoZSBjb250ZXh0IHRoYXQgaXMgYXQgdGhlIHRvcCBvZiB0aGUgSlMgZnVuY3Rpb24gc3RhY2su
CisgICAgICAgIC8vIFJldHJpZXZlRnJhbWVGb3JDdXJyZW50Q29udGV4dCgpIHdvdWxkIHJldHVy
biBGcmFtZSBCIGluIG91ciBleGFtcGxlLgorICAgICAgICAvLyBUaGlzIGZyYW1lIGlzIG9mdGVu
IHJlZmVycmVkIHRvIGFzIHRoZSAibGV4aWNhbCBnbG9iYWwgb2JqZWN0LiIKKyAgICAgICAgLy8K
KyAgICAgICAgLy8gRmluYWxseSwgdGhlICdjYWxsaW5nIGNvbnRleHQnIGlzIHRoZSBjb250ZXh0
IG9uZSBiZWxvdyB0aGUgY3VycmVudAorICAgICAgICAvLyBjb250ZXh0IG9uIHRoZSBKUyBmdW5j
dGlvbiBzdGFjay4gIEZvciBleGFtcGxlLCBpZiBmdW5jdGlvbiBmIGNhbGxzCisgICAgICAgIC8v
IGZ1bmN0aW9uIGcsIHRoZW4gdGhlIGNhbGxpbmcgY29udGV4dCB3aWxsIGJlIHRoZSBjb250ZXh0
IGFzc29jaWF0ZWQgd2l0aAorICAgICAgICAvLyBmLiAgVGhpcyBjb250ZXh0IGlzIGNvbW1vbmx5
IHVzZWQgYnkgRE9NIHNlY3VyaXR5IGNoZWNrcyBiZWNhdXNlIHRoZXkgd2FudAorICAgICAgICAv
LyB0byBrbm93IHdobyBjYWxsZWQgdGhlbS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgeW91
IGFyZSB1bnN1cmUgd2hpY2ggb2YgdGhlc2UgZnVuY3Rpb25zIHRvIHVzZSwgYXNrIGFiYXJ0aC4K
KyAgICAgICAgLy8KKyAgICAgICAgLy8gTk9URTogVGhlc2UgY2Fubm90IGJlIGRlY2xhcmVkIGFz
IGlubGluZSBmdW5jdGlvbiwgYmVjYXVzZSBWUyBjb21wbGFpbnMgYXQKKyAgICAgICAgLy8gbGlu
a2luZyB0aW1lLgorICAgICAgICBzdGF0aWMgRnJhbWUqIHJldHJpZXZlRnJhbWVGb3JFbnRlcmVk
Q29udGV4dCgpOworICAgICAgICBzdGF0aWMgRnJhbWUqIHJldHJpZXZlRnJhbWVGb3JDdXJyZW50
Q29udGV4dCgpOworICAgICAgICBzdGF0aWMgRnJhbWUqIHJldHJpZXZlRnJhbWVGb3JDYWxsaW5n
Q29udGV4dCgpOworCisgICAgICAgIC8vIFJldHVybnMgVjggQ29udGV4dCBvZiBhIGZyYW1lLiBJ
ZiBub25lIGV4aXN0cywgY3JlYXRlcworICAgICAgICAvLyBhIG5ldyBjb250ZXh0LiAgSXQgaXMg
cG90ZW50aWFsbHkgc2xvdyBhbmQgY29uc3VtZXMgbWVtb3J5LgorICAgICAgICBzdGF0aWMgdjg6
OkxvY2FsPHY4OjpDb250ZXh0PiBHZXRDb250ZXh0KEZyYW1lKik7CisgICAgICAgIHN0YXRpYyB2
ODo6TG9jYWw8djg6OkNvbnRleHQ+IEdldEN1cnJlbnRDb250ZXh0KCk7CisKKyAgICAgICAgLy8g
SWYgdGhlIGN1cnJlbnQgY29udGV4dCBjYXVzZXMgb3V0IG9mIG1lbW9yeSwgSmF2YVNjcmlwdCBz
ZXR0aW5nCisgICAgICAgIC8vIGlzIGRpc2FibGVkIGFuZCBpdCByZXR1cm5zIHRydWUuCisgICAg
ICAgIHN0YXRpYyBib29sIEhhbmRsZU91dE9mTWVtb3J5KCk7CisKKyAgICAgICAgLy8gQ2hlY2sg
aWYgdGhlIGFjdGl2ZSBleGVjdXRpb24gY29udGV4dCBjYW4gYWNjZXNzIHRoZSB0YXJnZXQgZnJh
bWUuCisgICAgICAgIHN0YXRpYyBib29sIENhbkFjY2Vzc0ZyYW1lKEZyYW1lKiB0YXJnZXQsIGJv
b2wgcmVwb3J0RXJyb3IpOworCisgICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIHNhZmUgdG8gYWNj
ZXNzIHRoZSBnaXZlbiBub2RlIGZyb20gdGhlCisgICAgICAgIC8vIGN1cnJlbnQgc2VjdXJpdHkg
Y29udGV4dC4KKyAgICAgICAgc3RhdGljIGJvb2wgQ2hlY2tOb2RlU2VjdXJpdHkoTm9kZSopOwor
CisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gQ2hlY2tOZXdMZWdhbChjb25z
dCB2ODo6QXJndW1lbnRzJik7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgVjggd3JhcHBlciBmb3Ig
YSBDIHBvaW50ZXIKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBXcmFwQ1Bv
aW50ZXIodm9pZCogY3B0cikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVwcmVzZW50IHZv
aWQqIGFzIGludAorICAgICAgICAgICAgaW50IGFkZHIgPSByZWludGVycHJldF9jYXN0PGludD4o
Y3B0cik7CisgICAgICAgICAgICBBU1NFUlQoKGFkZHIgJiAweDAxKSA9PSAwKTsgIC8vIHRoZSBh
ZGRyZXNzIG11c3QgYmUgYWxpZ25lZC4KKyAgICAgICAgICAgIHJldHVybiB2ODo6SW50ZWdlcjo6
TmV3KGFkZHIgPj4gMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUYWtlIEMgcG9pbnRlciBv
dXQgb2YgYSB2OCB3cmFwcGVyCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBDPgorICAgICAgICBz
dGF0aWMgQyogRXh0cmFjdENQb2ludGVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBvYmopCisgICAg
ICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxDKj4oRXh0cmFjdENQb2ludGVy
SW1wbChvYmopKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpT
Y3JpcHQ+IENvbXBpbGVTY3JpcHQodjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBjb2RlLCBjb25zdCBT
dHJpbmcmIGZpbGVOYW1lLCBpbnQgYmFzZUxpbmUpOworCisjaWZuZGVmIE5ERUJVRworICAgICAg
ICAvLyBDaGVja3MgaWYgYSB2OCB2YWx1ZSBjYW4gYmUgYSBET00gd3JhcHBlcgorICAgICAgICBz
dGF0aWMgYm9vbCBNYXliZURPTVdyYXBwZXIodjg6OkhhbmRsZTx2ODo6VmFsdWU+KTsKKyNlbmRp
ZgorCisgICAgICAgIC8vIFNldHMgY29udGVudHMgb2YgYSBET00gd3JhcHBlci4KKyAgICAgICAg
c3RhdGljIHZvaWQgU2V0RE9NV3JhcHBlcih2ODo6SGFuZGxlPHY4OjpPYmplY3Q+LCBpbnQgdHlw
ZSwgdm9pZCogcHRyKTsKKworICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBM
b29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSwgdjg6OkhhbmRsZTx2
ODo6VmFsdWU+KTsKKworICAgICAgICAvLyBBIGhlbHBlciBmdW5jdGlvbiBleHRyYWN0IG5hdGl2
ZSBvYmplY3QgcG9pbnRlciBmcm9tIGEgRE9NIHdyYXBwZXIKKyAgICAgICAgLy8gYW5kIGNhc3Qg
dG8gdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KKyAgICAg
ICAgc3RhdGljIEMqIERPTVdyYXBwZXJUb05hdGl2ZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gb2Jq
ZWN0KQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQoTWF5YmVET01XcmFwcGVyKG9iamVj
dCkpOworICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHB0ciA9IHY4OjpIYW5kbGU8
djg6Ok9iamVjdD46OkNhc3Qob2JqZWN0KS0+R2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RP
TVdyYXBwZXJPYmplY3RJbmRleCk7CisgICAgICAgICAgICByZXR1cm4gRXh0cmFjdENQb2ludGVy
PEM+KHB0cik7CisgICAgICAgIH0KKworICAgICAgICAvLyBBIGhlbHAgZnVuY3Rpb24gZXh0cmFj
dCBhIG5vZGUgdHlwZSBwb2ludGVyIGZyb20gYSBET00gd3JhcHBlci4KKyAgICAgICAgLy8gV3Jh
cHBlZCBwb2ludGVyIG11c3QgYmUgY2FzdCB0byBOb2RlKiBmaXJzdC4KKyAgICAgICAgc3RhdGlj
IHZvaWQqIERPTVdyYXBwZXJUb05vZGVIZWxwZXIodjg6OkhhbmRsZTx2ODo6VmFsdWU+KTsKKwor
ICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KKyAgICAgICAgc3RhdGljIEMqIERPTVdyYXBwZXJU
b05vZGUodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8Qyo+KERPTVdyYXBwZXJUb05vZGVIZWxwZXIodmFsdWUpKTsK
KyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRp
YyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlY4V3JhcHBl
clR5cGUgdHlwZSwgUGFzc1JlZlB0cjxUPiBpbXApCisgICAgICAgIHsKKyAgICAgICAgICByZXR1
cm4gVG9WOE9iamVjdCh0eXBlLCBpbXAuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIHN0YXRp
YyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlY4V3JhcHBl
clR5cGUgdHlwZSwgdm9pZCogaW1wKTsKKworICAgICAgICAvLyBGYXN0LXBhdGggZm9yIE5vZGUg
b2JqZWN0cy4KKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBOb2RlVG9WOE9i
amVjdChOb2RlKiBub2RlKTsKKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KKyAgICAgICAg
c3RhdGljIEMqIFRvTmF0aXZlT2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBl
LCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gb2JqZWN0KQorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8Qyo+KFRvTmF0aXZlT2JqZWN0SW1wbCh0eXBlLCBvYmplY3QpKTsK
KyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUg
R2V0RE9NV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0PiApOworCisgICAgICAgIC8v
IElmIHRoZSBleGNlcHRpb24gY29kZSBpcyBkaWZmZXJlbnQgZnJvbSB6ZXJvLCBhIERPTSBleGNl
cHRpb24gaXMKKyAgICAgICAgLy8gc2NoZWR1bGUgdG8gYmUgdGhyb3duLgorICAgICAgICBzdGF0
aWMgdm9pZCBTZXRET01FeGNlcHRpb24oaW50IGV4Y2VwdGlvbkNvZGUpOworCisgICAgICAgIC8v
IFNjaGVkdWxlIGFuIGVycm9yIG9iamVjdCB0byBiZSB0aHJvd24uCisgICAgICAgIHN0YXRpYyB2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVGhyb3dFcnJvcihFcnJvclR5cGUsIGNvbnN0IGNoYXIqIG1l
c3NhZ2UpOworCisgICAgICAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGZ1bmN0aW9uIGRl
c2NyaXB0b3IgYW5kIHNldCB0byB0aGUgZ2xvYmFsIG9iamVjdAorICAgICAgICAvLyBhcyBhIG5h
bWVkIHByb3BlcnR5LiBVc2VkIGJ5IHY4X3Rlc3Rfc2hlbGwuCisgICAgICAgIHN0YXRpYyB2b2lk
IEJpbmRKc09iamVjdFRvV2luZG93KEZyYW1lKiwgY29uc3QgY2hhciogbmFtZSwgaW50IHR5cGUs
IHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGRlc2MsIHZvaWQqIGltcCk7CisKKyAg
ICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBFdmVudFRvVjhPYmplY3QoRXZlbnQq
IGV2ZW50KTsKKyAgICAgICAgc3RhdGljIEV2ZW50KiBUb05hdGl2ZUV2ZW50KHY4OjpIYW5kbGU8
djg6OlZhbHVlPiBqc0V2ZW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIUlzRE9NRXZl
bnRXcmFwcGVyKGpzRXZlbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAg
ICAgcmV0dXJuIERPTVdyYXBwZXJUb05hdGl2ZTxFdmVudD4oanNFdmVudCk7CisgICAgICAgIH0K
KworICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IEV2ZW50VGFyZ2V0VG9WOE9i
amVjdChFdmVudFRhcmdldCogdGFyZ2V0KTsKKyAgICAgICAgLy8gV3JhcCBhbmQgdW53cmFwIEpT
IGV2ZW50IGxpc3RlbmVycworICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IEV2
ZW50TGlzdGVuZXJUb1Y4T2JqZWN0KEV2ZW50TGlzdGVuZXIqIHRhcmdldCk7CisKKyAgICAgICAg
Ly8gRE9NSW1wbGVtZW50YXRpb24gaXMgYSBzaW5nbGV0b24gYW5kIGl0IGlzIGhhbmRsZWQgaW4g
YSBzcGVjaWFsCisgICAgICAgIC8vIHdheS4gIEEgd3JhcHBlciBpcyBnZW5lcmF0ZWQgcGVyIGRv
Y3VtZW50IGFuZCBzdG9yZWQgaW4gYW4KKyAgICAgICAgLy8gaW50ZXJuYWwgZmllbGQgb2YgdGhl
IGRvY3VtZW50LgorICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IERPTUltcGxl
bWVudGF0aW9uVG9WOE9iamVjdChET01JbXBsZW1lbnRhdGlvbiogaW1wbCk7CisKKyAgICAgICAg
Ly8gV3JhcCBKUyBub2RlIGZpbHRlciBpbiBDKysKKyAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8
Tm9kZUZpbHRlcj4gVG9OYXRpdmVOb2RlRmlsdGVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBmaWx0
ZXIpOworCisgICAgICAgIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0
ZT4gR2V0VGVtcGxhdGUoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUpOworCisgICAg
ICAgIHRlbXBsYXRlIDxpbnQgdGFnLCB0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IENvbnN0cnVjdERPTU9iamVjdChjb25zdCB2ODo6QXJndW1lbnRzJik7
CisKKyAgICAgICAgLy8gQ2hlY2tzIHdoZXRoZXIgYSBET00gb2JqZWN0IGhhcyBhIEpTIHdyYXBw
ZXIuCisgICAgICAgIHN0YXRpYyBib29sIERPTU9iamVjdEhhc0pTV3JhcHBlcih2b2lkKiBvYmop
OworICAgICAgICAvLyBTZXQgSlMgd3JhcHBlciBvZiBhIERPTSBvYmplY3QsIHRoZSBjYWxsZXIg
aW4gY2hhcmdlIG9mIGluY3JlYXNlIHJlZi4KKyAgICAgICAgc3RhdGljIHZvaWQgU2V0SlNXcmFw
cGVyRm9yRE9NT2JqZWN0KHZvaWQqIG9iaiwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gd3Jh
cHBlcik7CisgICAgICAgIHN0YXRpYyB2b2lkIFNldEpTV3JhcHBlckZvckFjdGl2ZURPTU9iamVj
dCh2b2lkKiBvYmosIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdyYXBwZXIpOworICAgICAg
ICBzdGF0aWMgdm9pZCBTZXRKU1dyYXBwZXJGb3JET01Ob2RlKE5vZGUqLCB2ODo6UGVyc2lzdGVu
dDx2ODo6T2JqZWN0PiB3cmFwcGVyKTsKKworICAgICAgICAvLyBQcm9jZXNzIGFueSBwZW5kaW5n
IEphdmFTY3JpcHQgY29uc29sZSBtZXNzYWdlcy4KKyAgICAgICAgc3RhdGljIHZvaWQgUHJvY2Vz
c0NvbnNvbGVNZXNzYWdlcygpOworCisjaWZuZGVmIE5ERUJVRworICAgICAgICAvLyBGb3IgZGVi
dWdnaW5nIGFuZCBsZWFrIGRldGVjdGlvbiBwdXJwb3NlCisgICAgICAgIHN0YXRpYyB2b2lkIFJl
Z2lzdGVyR2xvYmFsSGFuZGxlKEdsb2JhbEhhbmRsZVR5cGUgdHlwZSwgdm9pZCogaG9zdCwgdjg6
OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiBoYW5kbGUpOworICAgICAgICBzdGF0aWMgdm9pZCBVbnJl
Z2lzdGVyR2xvYmFsSGFuZGxlKHZvaWQqIGhvc3QsIHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4g
aGFuZGxlKTsKKyNlbmRpZgorCisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYSBWOCB2YWx1ZSBp
cyBhIHdyYXBwZXIgb2YgdHlwZSB8Y2xhc3NUeXBlfC4KKyAgICAgICAgc3RhdGljIGJvb2wgSXNX
cmFwcGVyT2ZUeXBlKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBvYmosIFY4Q2xhc3NJbmRleDo6VjhX
cmFwcGVyVHlwZSBjbGFzc1R5cGUpOworCisgICAgICAgIC8vIEZ1bmN0aW9uIGZvciByZXRyaWV2
aW5nIHRoZSBsaW5lIG51bWJlciBhbmQgc291cmNlIG5hbWUgZm9yIHRoZSB0b3AKKyAgICAgICAg
Ly8gSmF2YVNjcmlwdCBzdGFjayBmcmFtZS4KKyAgICAgICAgc3RhdGljIGludCBHZXRTb3VyY2VM
aW5lTnVtYmVyKCk7CisgICAgICAgIHN0YXRpYyBTdHJpbmcgR2V0U291cmNlTmFtZSgpOworCisK
KyAgICAgICAgLy8gUmV0dXJucyBhIGxvY2FsIGhhbmRsZSBvZiB0aGUgY29udGV4dC4KKyAgICAg
ICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBHZXRDb250ZXh0KCkKKyAgICAgICAgeworICAgICAg
ICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhtX2NvbnRleHQpOworICAg
ICAgICB9CisKKyAgICAgICAgYm9vbCBTZXRDb250ZXh0RGVidWdJZChpbnQgaWQpOworICAgICAg
ICBzdGF0aWMgaW50IEdldENvbnRleHREZWJ1Z0lkKHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+KTsK
KworICAgICAgICAvLyBSZWdpc3RlcnMgYW4gZXh0ZW5zaW9uIHRvIGJlIGF2YWlsYWJsZSBvbiB3
ZWJwYWdlcyB3aXRoIGEgcGFydGljdWxhciBzY2hlbWUKKyAgICAgICAgLy8gSWYgdGhlIHNjaGVt
ZSBhcmd1bWVudCBpcyBlbXB0eSwgdGhlIGV4dGVuc2lvbiBpcyBhdmFpbGFibGUgb24gYWxsIHBh
Z2VzLgorICAgICAgICAvLyBXaWxsIG9ubHkgYWZmZWN0IHY4IGNvbnRleHRzIGluaXRpYWxpemVk
IGFmdGVyIHRoaXMgY2FsbC4gVGFrZXMgb3duZXJzaGlwCisgICAgICAgIC8vIG9mIHRoZSB2ODo6
RXh0ZW5zaW9uIG9iamVjdCBwYXNzZWQuCisgICAgICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0
ZW5zaW9uKHY4OjpFeHRlbnNpb24qLCBjb25zdCBTdHJpbmcmIHNjaGVtZVJlc3RyaWN0aW9uKTsK
KworICAgICAgICBzdGF0aWMgdm9pZCogVG9TVkdQT0RUeXBlSW1wbChWOENsYXNzSW5kZXg6OlY4
V3JhcHBlclR5cGUsIHY4OjpIYW5kbGU8djg6OlZhbHVlPik7CisKKyAgICBwcml2YXRlOgorICAg
ICAgICBzdGF0aWMgY29uc3QgY2hhcioga0NvbnRleHREZWJ1Z0RhdGFUeXBlOworICAgICAgICBz
dGF0aWMgY29uc3QgY2hhcioga0NvbnRleHREZWJ1Z0RhdGFWYWx1ZTsKKworICAgICAgICB2ODo6
UGVyc2lzdGVudDx2ODo6Q29udGV4dD4gY3JlYXRlTmV3Q29udGV4dCh2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+IGdsb2JhbCk7CisgICAgICAgIHZvaWQgSW5pdENvbnRleHRJZk5lZWRlZCgpOworICAg
ICAgICB2b2lkIERpc2Nvbm5lY3RFdmVudExpc3RlbmVycygpOworICAgICAgICB2b2lkIFNldFNl
Y3VyaXR5VG9rZW4oKTsKKyAgICAgICAgdm9pZCBDbGVhckRvY3VtZW50V3JhcHBlcigpOworICAg
ICAgICB2b2lkIFVwZGF0ZURvY3VtZW50V3JhcHBlcih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3Jh
cHBlcik7CisKKyAgICAgICAgLy8gVGhlIEphdmFTY3JpcHQgd3JhcHBlciBmb3IgdGhlIGRvY3Vt
ZW50IG9iamVjdCBpcyBjYWNoZWQgb24gdGhlIGdsb2JhbAorICAgICAgICAvLyBvYmplY3QgZm9y
IGZhc3QgYWNjZXNzLiAgVXBkYXRlRG9jdW1lbnRXcmFwcGVyQ2FjaGUgc2V0cyB0aGUgd3JhcHBl
cgorICAgICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQgb24gdGhlIGdsb2JhbCBvYmpl
Y3QuICBDbGVhckRvY3VtZW50V3JhcHBlckNhY2hlCisgICAgICAgIC8vIGRlbGV0ZXMgdGhlIGRv
Y3VtZW50IHdyYXBwZXIgZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgdm9pZCBVcGRh
dGVEb2N1bWVudFdyYXBwZXJDYWNoZSgpOworICAgICAgICB2b2lkIENsZWFyRG9jdW1lbnRXcmFw
cGVyQ2FjaGUoKTsKKworICAgICAgICAvLyBEaXNwb3NlIGdsb2JhbCBoYW5kbGVzIG9mIG1fY29u
dGV4dHMgYW5kIGZyaWVuZHMuCisgICAgICAgIHZvaWQgRGlzcG9zZUNvbnRleHRIYW5kbGVzKCk7
CisKKyAgICAgICAgc3RhdGljIGJvb2wgQ2FuQWNjZXNzUHJpdmF0ZShET01XaW5kb3cqIHRhcmdl
dCk7CisKKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhIFY4IHZhbHVlIGlzIGEgRE9NIEV2ZW50
IHdyYXBwZXIKKyAgICAgICAgc3RhdGljIGJvb2wgSXNET01FdmVudFdyYXBwZXIodjg6OkhhbmRs
ZTx2ODo6VmFsdWU+KTsKKworICAgICAgICBzdGF0aWMgdm9pZCogVG9OYXRpdmVPYmplY3RJbXBs
KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4g
b2JqZWN0KTsKKworICAgICAgICAvLyBUYWtlIEMgcG9pbnRlciBvdXQgb2YgYSB2OCB3cmFwcGVy
CisgICAgICAgIHN0YXRpYyB2b2lkKiBFeHRyYWN0Q1BvaW50ZXJJbXBsKHY4OjpIYW5kbGU8djg6
OlZhbHVlPiBvYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChvYmotPklzTnVtYmVy
KCkpOworICAgICAgICAgICAgaW50IGFkZHIgPSBvYmotPkludDMyVmFsdWUoKTsKKyAgICAgICAg
ICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPihhZGRyIDw8IDEpOworICAgICAgICB9
CisKKworICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFN0eWxlU2hlZXRUb1Y4
T2JqZWN0KFN0eWxlU2hlZXQqKTsKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiBDU1NWYWx1ZVRvVjhPYmplY3QoQ1NTVmFsdWUqKTsKKyAgICAgICAgc3RhdGljIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBDU1NSdWxlVG9WOE9iamVjdChDU1NSdWxlKik7CisgICAgICAgIC8vIFJl
dHVybnMgdGhlIEpTIHdyYXBwZXIgb2YgYSB3aW5kb3cgb2JqZWN0LCBpbml0aWFsaXplcyB0aGUg
ZW52aXJvbm1lbnQKKyAgICAgICAgLy8gb2YgdGhlIHdpbmRvdyBmcmFtZSBpZiBuZWVkZWQuCisg
ICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gV2luZG93VG9WOE9iamVjdChET01X
aW5kb3cqKTsKKworI2lmIEVOQUJMRShTVkcpCisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4gU1ZHRWxlbWVudEluc3RhbmNlVG9WOE9iamVjdChTVkdFbGVtZW50SW5zdGFuY2Uq
KTsKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBTVkdPYmplY3RXaXRoQ29u
dGV4dFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlLCB2b2lkKiBvYmplY3Qp
OworI2VuZGlmCisKKyAgICAgICAgLy8gU2V0IGhpZGRlbiByZWZlcmVuY2VzIGluIGEgRE9NV2lu
ZG93IG9iamVjdCBvZiBhIGZyYW1lLgorICAgICAgICBzdGF0aWMgdm9pZCBTZXRIaWRkZW5XaW5k
b3dSZWZlcmVuY2UoRnJhbWUqLCBjb25zdCBpbnQgaW50ZXJuYWxJbmRleCwgdjg6OkhhbmRsZTx2
ODo6T2JqZWN0PiBqc09iamVjdCk7CisKKyAgICAgICAgc3RhdGljIFY4Q2xhc3NJbmRleDo6VjhX
cmFwcGVyVHlwZSBHZXRIVE1MRWxlbWVudFR5cGUoSFRNTEVsZW1lbnQqIGVsbSk7CisKKyAgICAg
ICAgLy8gVGhlIGZpcnN0IHBhcmFtZXRlciwgZGVzY190eXBlLCBzcGVjaWZpZXMgdGhlIGZ1bmN0
aW9uIGRlc2NyaXB0b3IKKyAgICAgICAgLy8gdXNlZCB0byBjcmVhdGUgSlMgb2JqZWN0LiBUaGUg
c2Vjb25kIHBhcmFtZXRlciwgY3B0cl90eXBlLCBzcGVjaWZpZXMKKyAgICAgICAgLy8gdGhlIHR5
cGUgb2YgdGhpcmQgcGFyYW1ldGVyLCBpbXBsLCBmb3IgdHlwZSBjYXN0aW5nLgorICAgICAgICAv
LyBGb3IgZXhhbXBsZSwgYSBIVE1MIGVsZW1lbnQgaGFzIEhUTUxFTEVNRU5UIGRlc2NfdHlwZSwg
YnV0IGFsd2F5cworICAgICAgICAvLyB1c2UgTk9ERSBhcyBjcHRyX3R5cGUuIEpTIHdyYXBwZXIg
c3RvcmVzIGNwdHJfdHlwZSBhbmQgaW1wbCBhcworICAgICAgICAvLyBpbnRlcm5hbCBmaWVsZHMu
CisgICAgICAgIHN0YXRpYyB2ODo6TG9jYWw8djg6Ok9iamVjdD4gSW5zdGFudGlhdGVWOE9iamVj
dChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgZGVzY1R5cGUsIFY4Q2xhc3NJbmRleDo6VjhX
cmFwcGVyVHlwZSBjcHRyVHlwZSwgdm9pZCogaW1wbCk7CisKKyAgICAgICAgc3RhdGljIGNvbnN0
IGNoYXIqIEdldFJhbmdlRXhjZXB0aW9uTmFtZShpbnQgZXhjZXB0aW9uQ29kZSk7CisgICAgICAg
IHN0YXRpYyBjb25zdCBjaGFyKiBHZXRFdmVudEV4Y2VwdGlvbk5hbWUoaW50IGV4Y2VwdGlvbkNv
ZGUpOworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogR2V0WE1MSHR0cFJlcXVlc3RFeGNlcHRp
b25OYW1lKGludCBleGNlcHRpb25Db2RlKTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIEdl
dERPTUV4Y2VwdGlvbk5hbWUoaW50IGV4Y2VwdGlvbkNvZGUpOworCisjaWYgRU5BQkxFKFhQQVRI
KQorICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogR2V0WFBhdGhFeGNlcHRpb25OYW1lKGludCBl
eGNlcHRpb25Db2RlKTsKKyNlbmRpZgorCisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgc3RhdGlj
IFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBHZXRTVkdFbGVtZW50VHlwZShTVkdFbGVtZW50
Kik7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBHZXRTVkdFeGNlcHRpb25OYW1lKGludCBl
eGNlcHRpb25Db2RlKTsKKyNlbmRpZgorCisgICAgICAgIC8vIENyZWF0ZSBhbmQgcG9wdWxhdGUg
dGhlIHV0aWxpdHkgY29udGV4dC4KKyAgICAgICAgc3RhdGljIHZvaWQgQ3JlYXRlVXRpbGl0eUNv
bnRleHQoKTsKKworICAgICAgICAvLyBSZXR1cm5zIGEgbG9jYWwgaGFuZGxlIG9mIHRoZSB1dGls
aXR5IGNvbnRleHQuCisgICAgICAgIHN0YXRpYyB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IEdldFV0
aWxpdHlDb250ZXh0KCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChtX3V0aWxpdHlDb250ZXh0
LklzRW1wdHkoKSkKKyAgICAgICAgICAgICAgQ3JlYXRlVXRpbGl0eUNvbnRleHQoKTsKKyAgICAg
ICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KG1fdXRpbGl0eUNvbnRleHQp
OworICAgICAgICB9CisKKyAgICAgICAgRnJhbWUqIG1fZnJhbWU7CisKKyAgICAgICAgdjg6OlBl
cnNpc3RlbnQ8djg6OkNvbnRleHQ+IG1fY29udGV4dDsKKyAgICAgICAgLy8gRm9yIGVhY2ggcG9z
c2libGUgdHlwZSBvZiB3cmFwcGVyLCB3ZSBrZWVwIGEgYm9pbGVycGxhdGUgb2JqZWN0LgorICAg
ICAgICAvLyBUaGUgYm9pbGVycGxhdGUgaXMgdXNlZCB0byBjcmVhdGUgYWRkaXRpb25hbCB3cmFw
cGVycyBvZiB0aGUgc2FtZSB0eXBlLgorICAgICAgICAvLyBXZSBrZWVwIGEgc2luZ2xlIHBlcnNp
c3RlbnQgaGFuZGxlIHRvIGFuIGFycmF5IG9mIHRoZSBhY3RpdmF0ZWQKKyAgICAgICAgLy8gYm9p
bGVycGxhdGVzLgorICAgICAgICB2ODo6UGVyc2lzdGVudDx2ODo6QXJyYXk+IG1fd3JhcHBlckJv
aWxlcnBsYXRlczsKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiBtX29iamVjdFBy
b3RvdHlwZTsKKworICAgICAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiBtX2dsb2JhbDsK
KyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiBtX2RvY3VtZW50OworCisgICAgICAg
IC8vIFV0aWxpdHkgY29udGV4dCBob2xkaW5nIEphdmFTY3JpcHQgZnVuY3Rpb25zIHVzZWQgaW50
ZXJuYWxseS4KKyAgICAgICAgc3RhdGljIHY4OjpQZXJzaXN0ZW50PHY4OjpDb250ZXh0PiBtX3V0
aWxpdHlDb250ZXh0OworCisgICAgICAgIGludCBtX2hhbmRsZXJMaW5lbm87CisKKyAgICAgICAg
Ly8gQSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyBjcmVhdGVkIGZvciB0aGlzIGZyYW1lLAorICAg
ICAgICAvLyB0aGUgbGlzdCBnZXRzIGNsZWFyZWQgd2hlbiByZW1vdmluZyBhbGwgdGltZW91dHMu
CisgICAgICAgIFY4RXZlbnRMaXN0ZW5lckxpc3QgbV9ldmVudExpc3RlbmVyczsKKworICAgICAg
ICAvLyBBIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJzIGNyZWF0ZSBmb3IgWE1MSHR0cFJlcXVlc3Qg
b2JqZWN0IGZvciB0aGlzIGZyYW1lLAorICAgICAgICAvLyB0aGUgbGlzdCBnZXRzIGNsZWFyZWQg
d2hlbiByZW1vdmluZyBhbGwgdGltZW91dHMuCisgICAgICAgIFY4RXZlbnRMaXN0ZW5lckxpc3Qg
bV94aHJMaXN0ZW5lcnM7CisKKyAgICAgICAgLy8gVHJ1ZSBmb3IgPGEgaHJlZj0iamF2YXNjcmlw
dDpmb28oKSI+IGFuZCBmYWxzZSBmb3IgPHNjcmlwdD5mb28oKTwvc2NyaXB0Pi4KKyAgICAgICAg
Ly8gT25seSB2YWxpZCBkdXJpbmcgZXhlY3V0aW9uLgorICAgICAgICBib29sIG1faW5saW5lQ29k
ZTsKKworICAgICAgICAvLyBUcnVlIHdoZW4gZXhlY3V0aW5nIGZyb20gd2l0aGluIGEgdGltZXIg
Y2FsbGJhY2suICBPbmx5IHZhbGlkIGR1cmluZworICAgICAgICAvLyBleGVjdXRpb24uCisgICAg
ICAgIGJvb2wgbV90aW1lckNhbGxiYWNrOworCisgICAgICAgIC8vIFRyYWNrIHRoZSByZWN1cnNp
b24gZGVwdGggdG8gYmUgYWJsZSB0byBhdm9pZCB0b28gZGVlcCByZWN1cnNpb24uIFRoZSBWOAor
ICAgICAgICAvLyBlbmdpbmUgYWxsb3dzIG11Y2ggbW9yZSByZWN1cnNpb24gdGhhbiBLSlMgZG9l
cyBzbyB3ZSBuZWVkIHRvIGd1YXJkIGFnYWluc3QKKyAgICAgICAgLy8gZXhjZXNzaXZlIHJlY3Vy
c2lvbiBpbiB0aGUgYmluZGluZyBsYXllci4KKyAgICAgICAgaW50IG1fcmVjdXJzaW9uOworCisg
ICAgICAgIC8vIExpc3Qgb2YgZXh0ZW5zaW9ucyByZWdpc3RlcmVkIHdpdGggdGhlIGNvbnRleHQu
CisgICAgICAgIHN0YXRpYyBWOEV4dGVuc2lvbkxpc3QgbV9leHRlbnNpb25zOworICAgIH07CisK
KyAgICB0ZW1wbGF0ZSA8aW50IHRhZywgdHlwZW5hbWUgVD4KKyAgICB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gVjhQcm94eTo6Q29uc3RydWN0RE9NT2JqZWN0KGNvbnN0IHY4OjpBcmd1bWVudHMmIGFy
Z3MpCisgICAgeworICAgICAgICBpZiAoIWFyZ3MuSXNDb25zdHJ1Y3RDYWxsKCkpIHsKKyAgICAg
ICAgICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4UHJveHk6OlRZUEVfRVJST1IsICJET00gb2JqZWN0
IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4iKTsKKyAgICAgICAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworICAgICAgICB9CisKKworICAgICAgICAvLyBOb3Rl
OiBpdCdzIE9LIHRvIGxldCB0aGlzIFJlZlB0ciBnbyBvdXQgb2Ygc2NvcGUgYmVjYXVzZSB3ZSBh
bHNvIGNhbGwKKyAgICAgICAgLy8gU2V0RE9NV3JhcHBlcigpLCB3aGljaCBlZmZlY3RpdmVseSBo
b2xkcyBhIHJlZmVyZW5jZSB0byBvYmouCisgICAgICAgIFJlZlB0cjxUPiBvYmogPSBUOjpjcmVh
dGUoKTsKKyAgICAgICAgVjhQcm94eTo6U2V0RE9NV3JhcHBlcihhcmdzLkhvbGRlcigpLCB0YWcs
IG9iai5nZXQoKSk7CisgICAgICAgIG9iai0+cmVmKCk7CisgICAgICAgIFY4UHJveHk6OlNldEpT
V3JhcHBlckZvckRPTU9iamVjdChvYmouZ2V0KCksIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+
OjpOZXcoYXJncy5Ib2xkZXIoKSkpOworICAgICAgICByZXR1cm4gYXJncy5Ib2xkZXIoKTsKKyAg
ICB9CisKKwogICAgIC8vIFVzZWQgYnkgYW4gaW50ZXJjZXB0b3IgY2FsbGJhY2sgdGhhdCBpdCBo
YXNuJ3QgZm91bmQgYW55dGhpbmcgdG8KICAgICAvLyBpbnRlcmNlcHQuCiAgICAgaW5saW5lIHN0
YXRpYyB2ODo6TG9jYWw8djg6Ok9iamVjdD4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKQpAQCAt
NDgsMTMgKzY1Miw2IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICB7CiAgICAgICAgIHJldHVy
biB2ODo6TG9jYWw8djg6OkJvb2xlYW4+KCk7CiAgICAgfQotCi0gICAgLy8gRklYTUU6IFJlbW92
ZSBvbmNlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZS4KLSAgICBpbmxpbmUgc3RhdGljIERPTVdyYXBw
ZXJNYXA8dm9pZD4mIGRvbU9iamVjdE1hcCgpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0RE9N
T2JqZWN0TWFwKCk7Ci0gICAgfQotCiAgICAgaW5saW5lIHY4OjpIYW5kbGU8djg6OlByaW1pdGl2
ZT4gdGhyb3dFcnJvcihjb25zdCBjaGFyKiBtZXNzYWdlLCBWOFByb3h5OjpFcnJvclR5cGUgdHlw
ZSA9IFY4UHJveHk6OlRZUEVfRVJST1IpCiAgICAgewogICAgICAgICBWOFByb3h5OjpUaHJvd0Vy
cm9yKHR5cGUsIG1lc3NhZ2UpOwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9Xb3JrZXJDb250
ZXh0RXhlY3V0aW9uUHJveHkuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mvdjgv
V29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5LmNwcAkocmV2aXNpb24gNDQ5MzkpCisrKyBXZWJD
b3JlL2JpbmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTM1LDkgKzM1LDEwIEBACiAKICNpbmNsdWRlICJXb3JrZXJDb250ZXh0RXhlY3V0
aW9uUHJveHkuaCIKIAorI2luY2x1ZGUgIkV2ZW50LmgiCiAjaW5jbHVkZSAiVjhCaW5kaW5nLmgi
CisjaW5jbHVkZSAiVjhET01NYXAuaCIKICNpbmNsdWRlICJWOFByb3h5LmgiCi0jaW5jbHVkZSAi
RXZlbnQuaCIKICNpbmNsdWRlICJWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyLmgiCiAjaW5j
bHVkZSAiVjhXb3JrZXJDb250ZXh0T2JqZWN0RXZlbnRMaXN0ZW5lci5oIgogI2luY2x1ZGUgIldv
cmtlci5oIgpAQCAtMjMxLDcgKzIzMiw3IEBAIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBXb3JrZXJD
b250ZXh0RXhlY3UKICAgICB9CiAKICAgICAvLyBOb24gRE9NIG5vZGUKLSAgICB2ODo6UGVyc2lz
dGVudDx2ODo6T2JqZWN0PiByZXN1bHQgPSBkb21PYmplY3RNYXAoKS5nZXQoaW1wbCk7CisgICAg
djg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gcmVzdWx0ID0gZ2V0RE9NT2JqZWN0TWFwKCkuZ2V0
KGltcGwpOwogICAgIGlmIChyZXN1bHQuSXNFbXB0eSgpKSB7CiAgICAgICAgIHY4OjpMb2NhbDx2
ODo6T2JqZWN0PiBvYmplY3QgPSB0b1Y4KHR5cGUsIHR5cGUsIGltcGwpOwogICAgICAgICBpZiAo
IW9iamVjdC5Jc0VtcHR5KCkpIHsKQEAgLTI1Nyw3ICsyNTgsNyBAQCB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gV29ya2VyQ29udGV4dEV4ZWN1CiAgICAgaWYgKCFldmVudCkKICAgICAgICAgcmV0dXJu
IHY4OjpOdWxsKCk7CiAKLSAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBkb21P
YmplY3RNYXAoKS5nZXQoZXZlbnQpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBl
ciA9IGdldERPTU9iamVjdE1hcCgpLmdldChldmVudCk7CiAgICAgaWYgKCF3cmFwcGVyLklzRW1w
dHkoKSkKICAgICAgICAgcmV0dXJuIHdyYXBwZXI7CiAKQEAgLTMzMiw4ICszMzMsOCBAQCB2ODo6
TG9jYWw8djg6Ok9iamVjdD4gV29ya2VyQ29udGV4dEV4ZWN1CiAKIGJvb2wgV29ya2VyQ29udGV4
dEV4ZWN1dGlvblByb3h5Ojpmb3JnZXRWOEV2ZW50T2JqZWN0KEV2ZW50KiBldmVudCkKIHsKLSAg
ICBpZiAoZG9tT2JqZWN0TWFwKCkuY29udGFpbnMoZXZlbnQpKSB7Ci0gICAgICAgIGRvbU9iamVj
dE1hcCgpLmZvcmdldChldmVudCk7CisgICAgaWYgKGdldERPTU9iamVjdE1hcCgpLmNvbnRhaW5z
KGV2ZW50KSkgeworICAgICAgICBnZXRET01PYmplY3RNYXAoKS5mb3JnZXQoZXZlbnQpOwogICAg
ICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGVsc2UKICAgICAgICAgcmV0dXJuIGZhbHNlOwpJbmRl
eDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhEYXRhYmFzZUN1c3RvbS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhEYXRhYmFzZUN1c3RvbS5jcHAJ
KHJldmlzaW9uIDQ0OTM5KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhEYXRhYmFz
ZUN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDE0ICszMiwxMyBAQAogCiAjaWYgRU5B
QkxFKERBVEFCQVNFKQogCi0jaW5jbHVkZSAidjhfYmluZGluZy5oIgotI2luY2x1ZGUgInY4X3By
b3h5LmgiCi0KICNpbmNsdWRlICJEYXRhYmFzZS5oIgorI2luY2x1ZGUgIlY4QmluZGluZy5oIgog
I2luY2x1ZGUgIlY4Q3VzdG9tQmluZGluZy5oIgogI2luY2x1ZGUgIlY4Q3VzdG9tU1FMVHJhbnNh
Y3Rpb25DYWxsYmFjay5oIgogI2luY2x1ZGUgIlY4Q3VzdG9tU1FMVHJhbnNhY3Rpb25FcnJvckNh
bGxiYWNrLmgiCiAjaW5jbHVkZSAiVjhDdXN0b21Wb2lkQ2FsbGJhY2suaCIKKyNpbmNsdWRlICJW
OFByb3h5LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApJbmRleDogV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhTUUxSZXN1bHRTZXRSb3dMaXN0Q3VzdG9tLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFNRTFJlc3VsdFNldFJvd0xpc3RDdXN0b20u
Y3BwCShyZXZpc2lvbiA0NDkzOSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FM
UmVzdWx0U2V0Um93TGlzdEN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDExICszMiwx
MCBAQAogCiAjaWYgRU5BQkxFKERBVEFCQVNFKQogCi0jaW5jbHVkZSAidjhfYmluZGluZy5oIgot
I2luY2x1ZGUgInY4X3Byb3h5LmgiCi0KICNpbmNsdWRlICJTUUxSZXN1bHRTZXRSb3dMaXN0Lmgi
CisjaW5jbHVkZSAiVjhCaW5kaW5nLmgiCiAjaW5jbHVkZSAiVjhDdXN0b21CaW5kaW5nLmgiCisj
aW5jbHVkZSAiVjhQcm94eS5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKSW5kZXg6IFdlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMVHJhbnNhY3Rpb25DdXN0b20uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMVHJhbnNhY3Rpb25DdXN0b20u
Y3BwCShyZXZpc2lvbiA0NDkzOSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FM
VHJhbnNhY3Rpb25DdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiwxNCArMzIsMTMgQEAK
IAogI2lmIEVOQUJMRShEQVRBQkFTRSkKIAotI2luY2x1ZGUgInY4X2JpbmRpbmcuaCIKLSNpbmNs
dWRlICJ2OF9wcm94eS5oIgotCiAjaW5jbHVkZSAiRGF0YWJhc2UuaCIKICNpbmNsdWRlICJTUUxW
YWx1ZS5oIgorI2luY2x1ZGUgIlY4QmluZGluZy5oIgogI2luY2x1ZGUgIlY4Q3VzdG9tQmluZGlu
Zy5oIgogI2luY2x1ZGUgIlY4Q3VzdG9tU1FMU3RhdGVtZW50Q2FsbGJhY2suaCIKICNpbmNsdWRl
ICJWOEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2suaCIKKyNpbmNsdWRlICJWOFByb3h5
LmgiCiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgogCiB1c2luZyBuYW1lc3BhY2UgV1RGOwo=
</data>
<flag name="review"
          id="16283"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31805</attachid>
            <date>2009-06-24 13:28:19 -0700</date>
            <delta_ts>2009-06-24 13:39:19 -0700</delta_ts>
            <desc>patch2</desc>
            <filename>patch2.txt</filename>
            <type>text/plain</type>
            <size>478904</size>
            <attacher name="Nate Chapin">japhet</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDk5MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMDktMDYtMjQgIE5hdGUgQ2hhcGluICA8amFwaGV0QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBV
cHN0cmVhbSBWOFByb3h5LgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0yNjYyMworCisgICAgICAgICogYmluZGluZ3MvdjgvVjhQcm94eS5jcHA6IFBv
cnRlZCBmcm9tIHN2bi5jaHJvbWl1bS5vcmcgKHNwZWNpZmljIGZ1bmN0aW9uIGVudHJpZXMgcmVt
b3ZlZCBzaW5jZSBpdCdkIGJlIG1hbnkgbGluZXMgb2YgcmVkdW5kYW5jeSkuCisgICAgICAgICog
YmluZGluZ3MvdjgvVjhQcm94eS5oOiBQb3J0ZWQgZnJvbSBzdm4uY2hyb21pdW0ub3JnIChzcGVj
aWZpYyBmdW5jdGlvbiBlbnRyaWVzIHJlbW92ZWQgc2luY2UgaXQnZCBiZSBtYW55IGxpbmVzIG9m
IHJlZHVuZGFuY3kpLgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRp
b25Qcm94eS5jcHA6IENoYW5nZWQgZG9tT2JqZWN0TWFwKCkgcmVmZXJlbmNlcyB0byBnZXRET01P
YmplY3RNYXAoKS4KKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhEYXRhYmFzZUN1c3Rv
bS5jcHA6IFVwZGF0ZWQgI2luY2x1ZGUuCisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4
U1FMUmVzdWx0U2V0Um93TGlzdEN1c3RvbS5jcHA6IFVwZGF0ZWQgI2luY2x1ZGUuCisgICAgICAg
ICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMVHJhbnNhY3Rpb25DdXN0b20uY3BwOiBVcGRhdGVk
ICNpbmNsdWRlLgorCiAyMDA5LTA2LTIzICBFcmljIENhcmxzb24gIDxlcmljLmNhcmxzb25AYXBw
bGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFkbGVyLgpJbmRleDogV2ViQ29y
ZS9iaW5kaW5ncy92OC9TY3JpcHRTY29wZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5k
aW5ncy92OC9TY3JpcHRTY29wZS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5k
aW5ncy92OC9TY3JpcHRTY29wZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQzLDcgKzQzLDcgQEAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogU2NyaXB0U2NvcGU6OlNjcmlwdFNjb3BlKFNjcmlwdFN0
YXRlKiBzY3JpcHRTdGF0ZSwgYm9vbCByZXBvcnRFeGNlcHRpb25zKQotICAgIDogbV9jb250ZXh0
KFY4UHJveHk6OkdldENvbnRleHQoc2NyaXB0U3RhdGUtPmZyYW1lKCkpKQorICAgIDogbV9jb250
ZXh0KFY4UHJveHk6OmNvbnRleHQoc2NyaXB0U3RhdGUtPmZyYW1lKCkpKQogICAgICwgbV9zY29w
ZShtX2NvbnRleHQpCiAgICAgLCBtX3NjcmlwdFN0YXRlKHNjcmlwdFN0YXRlKQogICAgICwgbV9y
ZXBvcnRFeGNlcHRpb25zKHJlcG9ydEV4Y2VwdGlvbnMpCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdz
L3Y4L1Y4VXRpbGl0aWVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOFV0
aWxpdGllcy5oCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhVdGls
aXRpZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMzEsOSArMzEsNiBAQAogI2lmbmRlZiBWOFV0aWxp
dGllc19oCiAjZGVmaW5lIFY4VXRpbGl0aWVzX2gKIAotLy8gRklYTUU6IFJlbW92ZSBvbmNlIGNo
cm9taXVtIGRlcGVuZGVuY2llcyBvbiB2OF91dGlsaXR5LmggYXJlIHJlbW92ZWQuCi0jZGVmaW5l
IFY4VVRJTElUSUVTX0RFRklORUQgMQotCiAjaW5jbHVkZSA8djguaD4KIAogbmFtZXNwYWNlIFdl
YkNvcmUgewpAQCAtNzUsMTEgKzcyLDYgQEAKICAgICAgIHN0YXRpYyBpbmxpbmUgdjg6OkxvY2Fs
PHY4OjpPYmplY3Q+IG5ld0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPik7CiAgICAg
ICBzdGF0aWMgaW5saW5lIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBuZXdJbnN0YW5jZSh2ODo6SGFu
ZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4pOwogICAgICAgc3RhdGljIGlubGluZSB2ODo6TG9jYWw8
djg6Ok9iamVjdD4gbmV3SW5zdGFuY2Uodjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+LCBpbnQgYXJn
Yywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZ3ZbXSk7Ci0KLSAgICAgIC8vIEZJWE1FOiBUaGVz
ZSBOZXdJbnN0YW5jZSBmdW5jdGlvbnMgYXJlIGhlcmUgdG8gZWFzZSB1cHN0cmVhbWluZy4gUmVt
b3ZlIGFsb25nIHdpdGggVjhVVElMSVRJRVNfREVGSU5FRCBvbmNlIGNocm9taXVtIGRlcGVuZGVu
Y2llcyBvbiB2OF91dGlsaXR5LmggYXJlIHJlbW92ZWQuCi0gICAgICBzdGF0aWMgaW5saW5lIHY4
OjpMb2NhbDx2ODo6T2JqZWN0PiBOZXdJbnN0YW5jZSh2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4p
OwotICAgICAgc3RhdGljIGlubGluZSB2ODo6TG9jYWw8djg6Ok9iamVjdD4gTmV3SW5zdGFuY2Uo
djg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+KTsKLSAgICAgIHN0YXRpYyBpbmxpbmUgdjg6
OkxvY2FsPHY4OjpPYmplY3Q+IE5ld0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiwg
aW50IGFyZ2MsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmd2W10pOwogICAgIH07CiAKICAgICB2
ODo6TG9jYWw8djg6Ok9iamVjdD4gU2FmZUFsbG9jYXRpb246Om5ld0luc3RhbmNlKHY4OjpIYW5k
bGU8djg6OkZ1bmN0aW9uPiBmdW5jdGlvbikKQEAgLTEwNiwyMiArOTgsNiBAQAogICAgICAgICBy
ZXR1cm4gZnVuY3Rpb24tPk5ld0luc3RhbmNlKGFyZ2MsIGFyZ3YpOwogICAgIH0KIAotICAgIC8v
IEZJWE1FOiBUaGVzZSBOZXdJbnN0YW5jZSBmdW5jdGlvbnMgYXJlIGhlcmUgdG8gZWFzZSB1cHN0
cmVhbWluZy4gUmVtb3ZlIGFsb25nIHdpdGggVjhVVElMSVRJRVNfREVGSU5FRCBvbmNlIGNocm9t
aXVtIGRlcGVuZGVuY2llcyBvbiB2OF91dGlsaXR5LmggYXJlIHJlbW92ZWQuCi0gICAgdjg6Okxv
Y2FsPHY4OjpPYmplY3Q+IFNhZmVBbGxvY2F0aW9uOjpOZXdJbnN0YW5jZSh2ODo6SGFuZGxlPHY4
OjpGdW5jdGlvbj4gZnVuY3Rpb24pCi0gICAgewotICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2Uo
ZnVuY3Rpb24pOwotICAgIH0KLQotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBTYWZlQWxsb2Nh
dGlvbjo6TmV3SW5zdGFuY2Uodjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+IG9iamVjdFRl
bXBsYXRlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKG9iamVjdFRlbXBsYXRl
KTsKLSAgICB9Ci0KLSAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gU2FmZUFsbG9jYXRpb246Ok5l
d0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiBmdW5jdGlvbiwgaW50IGFyZ2MsIHY4
OjpIYW5kbGU8djg6OlZhbHVlPiBhcmd2W10pCi0gICAgewotICAgICAgICByZXR1cm4gbmV3SW5z
dGFuY2UoZnVuY3Rpb24sIGFyZ2MsIGFyZ3YpOwotICAgIH0KLQogfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQogCiAjZW5kaWYgLy8gVjhVdGlsaXRpZXNfaApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92
OC9WOFByb3h5LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOFByb3h5LmgJ
KHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOFByb3h5LmgJKHdvcmtp
bmcgY29weSkKQEAgLTMxLDEyICszMSw2MTQgQEAKICNpZm5kZWYgVjhQcm94eV9oCiAjZGVmaW5l
IFY4UHJveHlfaAogCi0vLyBGSVhNRTogVGhpcyBpcyBhIHRlbXBvcmFyeSBmb3J3YXJkaW5nIGhl
YWRlciB1bnRpbCBhbGwgYmluZGluZ3MgaGF2ZSBtaWdyYXRlZAotLy8gb3ZlciBhbmQgdjhfcHJv
eHkgYWN0dWFsbHkgYmVjb21lcyBWOFByb3h5LgotI2luY2x1ZGUgInY4X3Byb3h5LmgiCisjaW5j
bHVkZSAiQ2hyb21pdW1CcmlkZ2UuaCIKKyNpbmNsdWRlICJOb2RlLmgiCisjaW5jbHVkZSAiTm9k
ZUZpbHRlci5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiIC8vIGZvciBXZWJDb3JlOjpT
dHJpbmcKKyNpbmNsdWRlICJTY3JpcHRTb3VyY2VDb2RlLmgiIC8vIGZvciBXZWJDb3JlOjpTY3Jp
cHRTb3VyY2VDb2RlCisjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIgLy8gZm9yIFdlYkNvcmU6
OlNlY3VyaXR5T3JpZ2luCisjaW5jbHVkZSAiVjhDdXN0b21CaW5kaW5nLmgiCisjaW5jbHVkZSAi
VjhET01NYXAuaCIKKyNpbmNsdWRlICJWOEV2ZW50TGlzdGVuZXJMaXN0LmgiCisjaW5jbHVkZSAi
VjhJbmRleC5oIgorI2luY2x1ZGUgIlY4VXRpbGl0aWVzLmgiCisjaW5jbHVkZSA8djguaD4KKyNp
bmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+IC8v
IHNvIGdlbmVyYXRlZCBiaW5kaW5ncyBkb24ndCBoYXZlIHRvCisjaW5jbHVkZSA8d3RmL1ZlY3Rv
ci5oPgogCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGlzdD4KKworI2lmZGVmIEVO
QUJMRV9ET01fU1RBVFNfQ09VTlRFUlMKKyNkZWZpbmUgSU5DX1NUQVRTKG5hbWUpIENocm9taXVt
QnJpZGdlOjppbmNyZW1lbnRTdGF0c0NvdW50ZXIobmFtZSkKKyNlbHNlCisjZGVmaW5lIElOQ19T
VEFUUyhuYW1lKQorI2VuZGlmCisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorICAgIGNsYXNzIENT
U1N0eWxlRGVjbGFyYXRpb247CisgICAgY2xhc3MgQ2xpZW50UmVjdExpc3Q7CisgICAgY2xhc3Mg
RE9NSW1wbGVtZW50YXRpb247CisgICAgY2xhc3MgRWxlbWVudDsKKyAgICBjbGFzcyBFdmVudDsK
KyAgICBjbGFzcyBFdmVudExpc3RlbmVyOworICAgIGNsYXNzIEZyYW1lOworICAgIGNsYXNzIEhU
TUxDb2xsZWN0aW9uOworICAgIGNsYXNzIEhUTUxPcHRpb25zQ29sbGVjdGlvbjsKKyAgICBjbGFz
cyBIVE1MRWxlbWVudDsKKyAgICBjbGFzcyBIVE1MRG9jdW1lbnQ7CisgICAgY2xhc3MgTWVkaWFM
aXN0OworICAgIGNsYXNzIE5hbWVkTm9kZU1hcDsKKyAgICBjbGFzcyBOb2RlOworICAgIGNsYXNz
IE5vZGVMaXN0OworICAgIGNsYXNzIFNjcmVlbjsKKyAgICBjbGFzcyBTdHJpbmc7CisgICAgY2xh
c3MgU3R5bGVTaGVldDsKKyAgICBjbGFzcyBTVkdFbGVtZW50OworICAgIGNsYXNzIERPTVdpbmRv
dzsKKyAgICBjbGFzcyBEb2N1bWVudDsKKyAgICBjbGFzcyBFdmVudFRhcmdldDsKKyAgICBjbGFz
cyBFdmVudDsKKyAgICBjbGFzcyBFdmVudExpc3RlbmVyOworICAgIGNsYXNzIE5hdmlnYXRvcjsK
KyAgICBjbGFzcyBNaW1lVHlwZTsKKyAgICBjbGFzcyBNaW1lVHlwZUFycmF5OworICAgIGNsYXNz
IFBsdWdpbjsKKyAgICBjbGFzcyBQbHVnaW5BcnJheTsKKyAgICBjbGFzcyBTdHlsZVNoZWV0TGlz
dDsKKyAgICBjbGFzcyBDU1NWYWx1ZTsKKyAgICBjbGFzcyBDU1NSdWxlOworICAgIGNsYXNzIENT
U1J1bGVMaXN0OworICAgIGNsYXNzIENTU1ZhbHVlTGlzdDsKKyAgICBjbGFzcyBOb2RlRmlsdGVy
OworICAgIGNsYXNzIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ7CisKKyNpZiBFTkFCTEUoRE9NX1NU
T1JBR0UpCisgICAgY2xhc3MgU3RvcmFnZTsKKyAgICBjbGFzcyBTdG9yYWdlRXZlbnQ7CisjZW5k
aWYKKworICNpZiBFTkFCTEUoU1ZHKQorICAgIGNsYXNzIFNWR0VsZW1lbnRJbnN0YW5jZTsKKyAj
ZW5kaWYKKworICAgIGNsYXNzIFY4RXZlbnRMaXN0ZW5lcjsKKyAgICBjbGFzcyBWOE9iamVjdEV2
ZW50TGlzdGVuZXI7CisKKyAgICAvLyBGSVhNRTogdXNlIHN0YW5kYXJkIGxvZ2dpbmcgZmFjaWxp
dGllcyBpbiBXZWJDb3JlLgorICAgIHZvaWQgbG9nSW5mbyhGcmFtZSogZnJhbWUsIGNvbnN0IFN0
cmluZyYgbXNnLCBjb25zdCBTdHJpbmcmIHVybCk7CisKKyNpZm5kZWYgTkRFQlVHCisKKyNkZWZp
bmUgR2xvYmFsSGFuZGxlVHlwZUxpc3QoVikgICBcCisgICAgVihQUk9YWSkgICAgICAgICAgICAg
ICAgICAgICAgXAorICAgIFYoTlBPQkpFQ1QpICAgICAgICAgICAgICAgICAgIFwKKyAgICBWKFND
SEVEVUxFRF9BQ1RJT04pICAgICAgICAgICBcCisgICAgVihFVkVOVF9MSVNURU5FUikgICAgICAg
ICAgICAgXAorICAgIFYoTk9ERV9GSUxURVIpICAgICAgICAgICAgICAgIFwKKyAgICBWKFNDUklQ
VElOU1RBTkNFKSAgICAgICAgICAgICBcCisgICAgVihTQ1JJUFRWQUxVRSkKKworCisgICAgLy8g
SG9zdCBpbmZvcm1hdGlvbiBvZiBwZXJzaXN0ZW50IGhhbmRsZXMuCisgICAgZW51bSBHbG9iYWxI
YW5kbGVUeXBlIHsKKyNkZWZpbmUgRU5VTShuYW1lKSBuYW1lLAorICAgICAgICBHbG9iYWxIYW5k
bGVUeXBlTGlzdChFTlVNKQorI3VuZGVmIEVOVU0KKyAgICB9OworCisKKyAgICBjbGFzcyBHbG9i
YWxIYW5kbGVJbmZvIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEdsb2JhbEhhbmRsZUluZm8odm9p
ZCogaG9zdCwgR2xvYmFsSGFuZGxlVHlwZSB0eXBlKSA6IGhvc3RfKGhvc3QpLCB0eXBlXyh0eXBl
KSB7IH0KKyAgICAgICAgdm9pZCogaG9zdF87CisgICAgICAgIEdsb2JhbEhhbmRsZVR5cGUgdHlw
ZV87CisgICAgfTsKKworI2VuZGlmICAvLyBOREVCVUcKKworICAgIC8vIFRoZSBmb2xsb3dpbmcg
QmF0Y2ggc3RydWN0cyBhbmQgbWV0aG9kcyBhcmUgdXNlZCBmb3Igc2V0dGluZyBtdWx0aXBsZQor
ICAgIC8vIHByb3BlcnRpZXMgb24gYW4gT2JqZWN0VGVtcGxhdGUsIHVzZWQgZnJvbSB0aGUgZ2Vu
ZXJhdGVkIGJpbmRpbmdzCisgICAgLy8gaW5pdGlhbGl6YXRpb24gKENvbmZpZ3VyZVhYWFRlbXBs
YXRlKS4gIFRoaXMgZ3JlYXRseSByZWR1Y2VzIHRoZSBiaW5hcnkKKyAgICAvLyBzaXplIGJ5IG1v
dmluZyBmcm9tIGNvZGUgZHJpdmVuIHNldHVwIHRvIGRhdGEgdGFibGUgZHJpdmVuIHNldHVwLgor
CisgICAgLy8gQmF0Y2hlZEF0dHJpYnV0ZSB0cmFuc2xhdGVzIGludG8gY2FsbHMgdG8gU2V0QWNj
ZXNzb3IoKSBvbiBlaXRoZXIgdGhlCisgICAgLy8gaW5zdGFuY2Ugb3IgdGhlIHByb3RvdHlwZSBP
YmplY3RUZW1wbGF0ZSwgYmFzZWQgb24gfG9uUHJvdG98LgorICAgIHN0cnVjdCBCYXRjaGVkQXR0
cmlidXRlIHsKKyAgICAgICAgY29uc3QgY2hhciogY29uc3QgbmFtZTsKKyAgICAgICAgdjg6OkFj
Y2Vzc29yR2V0dGVyIGdldHRlcjsKKyAgICAgICAgdjg6OkFjY2Vzc29yU2V0dGVyIHNldHRlcjsK
KyAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIGRhdGE7CisgICAgICAgIHY4OjpB
Y2Nlc3NDb250cm9sIHNldHRpbmdzOworICAgICAgICB2ODo6UHJvcGVydHlBdHRyaWJ1dGUgYXR0
cmlidXRlOworICAgICAgICBib29sIG9uUHJvdG87CisgICAgfTsKKworICAgIHZvaWQgYmF0Y2hD
b25maWd1cmVBdHRyaWJ1dGVzKHY4OjpIYW5kbGU8djg6Ok9iamVjdFRlbXBsYXRlPiwgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+LCBjb25zdCBCYXRjaGVkQXR0cmlidXRlKiwgc2l6ZV90
IGF0dHJpYnV0ZUNvdW50KTsKKworICAgIC8vIEJhdGNoZWRDb25zdGFudCB0cmFuc2xhdGVzIGlu
dG8gY2FsbHMgdG8gU2V0KCkgZm9yIHNldHRpbmcgdXAgYW4gb2JqZWN0J3MKKyAgICAvLyBjb25z
dGFudHMuICBJdCBzZXRzIHRoZSBjb25zdGFudCBvbiBib3RoIHRoZSBGdW5jdGlvblRlbXBsYXRl
IGFuZCB0aGUKKyAgICAvLyBPYmplY3RUZW1wbGF0ZS4gIFByb3BlcnR5QXR0cmlidXRlcyBpcyBh
bHdheXMgUmVhZE9ubHkuCisgICAgc3RydWN0IEJhdGNoZWRDb25zdGFudCB7CisgICAgICAgIGNv
bnN0IGNoYXIqIGNvbnN0IG5hbWU7CisgICAgICAgIGludCB2YWx1ZTsKKyAgICB9OworCisgICAg
dm9pZCBiYXRjaENvbmZpZ3VyZUNvbnN0YW50cyh2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBs
YXRlPiwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+LCBjb25zdCBCYXRjaGVkQ29uc3Rh
bnQqLCBzaXplX3QgY29uc3RhbnRDb3VudCk7CisKKyAgICBjb25zdCBpbnQga01heFJlY3Vyc2lv
bkRlcHRoID0gMjA7CisKKyAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhbiBleHRlbnNpb24gdGhh
dCBpcyByZWdpc3RlcmVkIGZvciB1c2Ugd2l0aCBWOC4gSWYgc2NoZW1lCisgICAgLy8gaXMgbm9u
LWVtcHR5LCBpdCBjb250YWlucyB0aGUgVVJMIHNjaGVtZSB0aGUgZXh0ZW5zaW9uIHNob3VsZCBi
ZSB1c2VkIHdpdGguCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgZXh0ZW5zaW9uIGlzIHVzZWQgd2l0
aCBhbGwgc2NoZW1lcy4KKyAgICBzdHJ1Y3QgVjhFeHRlbnNpb25JbmZvIHsKKyAgICAgICAgU3Ry
aW5nIHNjaGVtZTsKKyAgICAgICAgdjg6OkV4dGVuc2lvbiogZXh0ZW5zaW9uOworICAgIH07Cisg
ICAgdHlwZWRlZiBzdGQ6Omxpc3Q8VjhFeHRlbnNpb25JbmZvPiBWOEV4dGVuc2lvbkxpc3Q7CisK
KyAgICBjbGFzcyBWOFByb3h5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8vIFRoZSB0eXBlcyBv
ZiBqYXZhc2NyaXB0IGVycm9ycyB0aGF0IGNhbiBiZSB0aHJvd24uCisgICAgICAgIGVudW0gRXJy
b3JUeXBlIHsKKyAgICAgICAgICAgIFJBTkdFX0VSUk9SLAorICAgICAgICAgICAgUkVGRVJFTkNF
X0VSUk9SLAorICAgICAgICAgICAgU1lOVEFYX0VSUk9SLAorICAgICAgICAgICAgVFlQRV9FUlJP
UiwKKyAgICAgICAgICAgIEdFTkVSQUxfRVJST1IKKyAgICAgICAgfTsKKworICAgICAgICBleHBs
aWNpdCBWOFByb3h5KEZyYW1lKiBmcmFtZSkgOiBtX2ZyYW1lKGZyYW1lKSwgbV9pbmxpbmVDb2Rl
KGZhbHNlKSwgbV90aW1lckNhbGxiYWNrKGZhbHNlKSwgbV9yZWN1cnNpb24oMCkgeyB9CisKKyAg
ICAgICAgflY4UHJveHkoKTsKKworICAgICAgICBGcmFtZSogZnJhbWUoKSB7IHJldHVybiBtX2Zy
YW1lOyB9CisKKyAgICAgICAgLy8gQ2xlYXIgcGFnZS1zcGVjaWZpYyBkYXRhLCBidXQga2VlcCB0
aGUgZ2xvYmFsIG9iamVjdCBpZGVudGlmeS4KKyAgICAgICAgdm9pZCBjbGVhckZvck5hdmlnYXRp
b24oKTsKKworICAgICAgICAvLyBDbGVhciBwYWdlLXNwZWNpZmljIGRhdGEgYmVmb3JlIHNodXR0
aW5nIGRvd24gdGhlIHByb3h5IG9iamVjdC4KKyAgICAgICAgdm9pZCBjbGVhckZvckNsb3NlKCk7
CisKKyAgICAgICAgLy8gVXBkYXRlIGRvY3VtZW50IG9iamVjdCBvZiB0aGUgZnJhbWUuCisgICAg
ICAgIHZvaWQgdXBkYXRlRG9jdW1lbnQoKTsKKworICAgICAgICAvLyBVcGRhdGUgdGhlIHNlY3Vy
aXR5IG9yaWdpbiBvZiBhIGRvY3VtZW50CisgICAgICAgIC8vIChlLmcuLCBhZnRlciBzZXR0aW5n
IGRvY291bWVudC5kb21haW4pLgorICAgICAgICB2b2lkIHVwZGF0ZVNlY3VyaXR5T3JpZ2luKCk7
CisKKyAgICAgICAgLy8gRGVzdHJveSB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgdm9pZCBk
ZXN0cm95R2xvYmFsKCk7CisKKyAgICAgICAgLy8gRklYTUU6IE5lZWQgY29tbWVudC4gIFVzZXIg
R2VzdHVyZSByZWxhdGVkLgorICAgICAgICBib29sIGlubGluZUNvZGUoKSBjb25zdCB7IHJldHVy
biBtX2lubGluZUNvZGU7IH0KKyAgICAgICAgdm9pZCBzZXRJbmxpbmVDb2RlKGJvb2wgdmFsdWUp
IHsgbV9pbmxpbmVDb2RlID0gdmFsdWU7IH0KKworICAgICAgICBib29sIHRpbWVyQ2FsbGJhY2so
KSBjb25zdCB7IHJldHVybiBtX3RpbWVyQ2FsbGJhY2s7IH0KKyAgICAgICAgdm9pZCBzZXRUaW1l
ckNhbGxiYWNrKGJvb2wgdmFsdWUpIHsgbV90aW1lckNhbGxiYWNrID0gdmFsdWU7IH0KKworICAg
ICAgICAvLyBIYXMgdGhlIGNvbnRleHQgZm9yIHRoaXMgcHJveHkgYmVlbiBpbml0aWFsaXplZD8K
KyAgICAgICAgYm9vbCBpc0NvbnRleHRJbml0aWFsaXplZCgpOworCisgICAgICAgIC8vIERpc2Nv
bm5lY3RzIHRoZSBwcm94eSBmcm9tIGl0cyBvd25lciBmcmFtZSwKKyAgICAgICAgLy8gYW5kIGNs
ZWFycyBhbGwgdGltZW91dHMgb24gdGhlIERPTSB3aW5kb3cuCisgICAgICAgIHZvaWQgZGlzY29u
bmVjdEZyYW1lKCk7CisKKyAgICAgICAgYm9vbCBpc0VuYWJsZWQoKTsKKworICAgICAgICAvLyBG
aW5kL0NyZWF0ZS9SZW1vdmUgZXZlbnQgbGlzdGVuZXIgd3JhcHBlcnMuCisgICAgICAgIFBhc3NS
ZWZQdHI8VjhFdmVudExpc3RlbmVyPiBmaW5kVjhFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6
VmFsdWU+IGxpc3RlbmVyLCBib29sIGlzSHRtbCk7CisgICAgICAgIFBhc3NSZWZQdHI8VjhFdmVu
dExpc3RlbmVyPiBmaW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1
ZT4gbGlzdGVuZXIsIGJvb2wgaXNIdG1sKTsKKworICAgICAgICBQYXNzUmVmUHRyPFY4RXZlbnRM
aXN0ZW5lcj4gZmluZE9iamVjdEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1ZT4gbGlz
dGVuZXIsIGJvb2wgaXNIdG1sKTsKKyAgICAgICAgUGFzc1JlZlB0cjxWOEV2ZW50TGlzdGVuZXI+
IGZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1ZT4gbGlz
dGVuZXIsIGJvb2wgaXNIdG1sKTsKKworICAgICAgICB2b2lkIHJlbW92ZVY4RXZlbnRMaXN0ZW5l
cihWOEV2ZW50TGlzdGVuZXIqKTsKKyAgICAgICAgdm9pZCByZW1vdmVPYmplY3RFdmVudExpc3Rl
bmVyKFY4T2JqZWN0RXZlbnRMaXN0ZW5lciopOworCisgICAgICAgIC8vIFByb3RlY3QvVW5wcm90
ZWN0IEpTIHdyYXBwZXJzIG9mIGEgRE9NIG9iamVjdC4KKyAgICAgICAgc3RhdGljIHZvaWQgZ2NQ
cm90ZWN0KHZvaWQqIGRvbU9iamVjdCk7CisgICAgICAgIHN0YXRpYyB2b2lkIGdjVW5wcm90ZWN0
KHZvaWQqIGRvbU9iamVjdCk7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBzdGF0aWMgdm9p
ZCBzZXRTVkdDb250ZXh0KHZvaWQqLCBTVkdFbGVtZW50Kik7CisgICAgICAgIHN0YXRpYyBTVkdF
bGVtZW50KiBzdmdDb250ZXh0KHZvaWQqKTsKKyNlbmRpZgorCisgICAgICAgIHZvaWQgc2V0RXZl
bnRIYW5kbGVyTGluZU51bWJlcihpbnQgbGluZU51bWJlcikgeyBtX2hhbmRsZXJMaW5lbm8gPSBs
aW5lTnVtYmVyOyB9CisgICAgICAgIHZvaWQgZmluaXNoZWRXaXRoRXZlbnQoRXZlbnQqIGV2ZW50
KSB7IH0KKworICAgICAgICAvLyBFdmFsdWF0ZSBKYXZhU2NyaXB0IGluIGEgbmV3IGNvbnRleHQu
IFRoZSBzY3JpcHQgZ2V0cyBpdHMgb3duIGdsb2JhbCBzY29wZQorICAgICAgICAvLyBhbmQgaXRz
IG93biBwcm90b3R5cGVzIGZvciBpbnRyaW5zaWMgSmF2YVNjcmlwdCBvYmplY3RzIChTdHJpbmcs
IEFycmF5LAorICAgICAgICAvLyBhbmQgc28tb24pLiBJdCBzaGFyZXMgdGhlIHdyYXBwZXJzIGZv
ciBhbGwgRE9NIG5vZGVzIGFuZCBET00gY29uc3RydWN0b3JzLgorICAgICAgICB2b2lkIGV2YWx1
YXRlSW5OZXdDb250ZXh0KGNvbnN0IFZlY3RvcjxTY3JpcHRTb3VyY2VDb2RlPiYpOworCisgICAg
ICAgIC8vIEV2YWx1YXRlIGEgc2NyaXB0IGZpbGUgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVu
dmlyb25tZW50LgorICAgICAgICAvLyBUaGUgY2FsbGVyIG11c3QgaG9sZCBhbiBleGVjdXRpb24g
Y29udGV4dC4KKyAgICAgICAgLy8gSWYgY2Fubm90IGV2YWx1dGUgdGhlIHNjcmlwdCwgaXQgcmV0
dXJucyBhbiBlcnJvci4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gZXZhbHVhdGUoY29u
c3QgU2NyaXB0U291cmNlQ29kZSYsIE5vZGUqKTsKKworICAgICAgICAvLyBSdW4gYW4gYWxyZWFk
eSBjb21waWxlZCBzY3JpcHQuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJ1blNjcmlw
dCh2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+LCBib29sIGlzSW5saW5lQ29kZSk7CisKKyAgICAgICAg
Ly8gQ2FsbCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcmVjZWl2ZXIgYW5kIGFyZ3VtZW50
cy4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gY2FsbEZ1bmN0aW9uKHY4OjpIYW5kbGU8
djg6OkZ1bmN0aW9uPiwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiwgaW50IGFyZ2MsIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBhcmd2W10pOworCisgICAgICAgIC8vIENhbGwgdGhlIGZ1bmN0aW9uIGFz
IGNvbnN0cnVjdG9yIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgICAgICAgdjg6OkxvY2Fs
PHY4OjpWYWx1ZT4gbmV3SW5zdGFuY2Uodjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+LCBpbnQgYXJn
Yywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZ3ZbXSk7CisKKyAgICAgICAgLy8gUmV0dXJucyB0
aGUgZG9tIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gbm9kZSB0eXBlLgorICAg
ICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBnZXRDb25zdHJ1Y3RvcihWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUpOworCisgICAgICAgIC8vIFRvIGNyZWF0ZSBKUyBXcmFwcGVyIG9iamVj
dHMsIHdlIGNyZWF0ZSBhIGNhY2hlIG9mIGEgJ2JvaWxlciBwbGF0ZScKKyAgICAgICAgLy8gb2Jq
ZWN0LCBhbmQgdGhlbiBzaW1wbHkgQ2xvbmUgdGhhdCBvYmplY3QgZWFjaCB0aW1lIHdlIG5lZWQg
YSBuZXcgb25lLgorICAgICAgICAvLyBUaGlzIGlzIGZhc3RlciB0aGFuIGdvaW5nIHRocm91Z2gg
dGhlIGZ1bGwgb2JqZWN0IGNyZWF0aW9uIHByb2Nlc3MuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6
T2JqZWN0PiBjcmVhdGVXcmFwcGVyRnJvbUNhY2hlKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlw
ZSk7CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgd2luZG93IG9iamVjdCBvZiB0aGUgY3VycmVu
dGx5IGV4ZWN1dGluZyBjb250ZXh0LgorICAgICAgICBzdGF0aWMgRE9NV2luZG93KiByZXRyaWV2
ZVdpbmRvdygpOworICAgICAgICAvLyBSZXR1cm5zIHRoZSB3aW5kb3cgb2JqZWN0IGFzc29jaWF0
ZWQgd2l0aCBhIGNvbnRleHQuCisgICAgICAgIHN0YXRpYyBET01XaW5kb3cqIHJldHJpZXZlV2lu
ZG93KHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+KTsKKyAgICAgICAgLy8gUmV0dXJucyBWOFByb3h5
IG9iamVjdCBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBjb250ZXh0LgorICAgICAgICBzdGF0
aWMgVjhQcm94eSogcmV0cmlldmUoKTsKKyAgICAgICAgLy8gUmV0dXJucyBWOFByb3h5IG9iamVj
dCBhc3NvY2lhdGVkIHdpdGggYSBmcmFtZS4KKyAgICAgICAgc3RhdGljIFY4UHJveHkqIHJldHJp
ZXZlKEZyYW1lKik7CisgICAgICAgIC8vIFJldHVybnMgVjhQcm94eSBvYmplY3QgYXNzb2NpYXRl
ZCB3aXRoIGEgc2NyaXB0IGV4ZWN1dGlvbiBjb250ZXh0LgorICAgICAgICBzdGF0aWMgVjhQcm94
eSogcmV0cmlldmUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCopOworCisgICAgICAgIC8vIFJldHVy
bnMgdGhlIGZyYW1lIG9iamVjdCBvZiB0aGUgd2luZG93IG9iamVjdCBhc3NvY2lhdGVkCisgICAg
ICAgIC8vIHdpdGggdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgY29udGV4dC4KKyAgICAgICAgc3Rh
dGljIEZyYW1lKiByZXRyaWV2ZUZyYW1lKCk7CisgICAgICAgIC8vIFJldHVybnMgdGhlIGZyYW1l
IG9iamVjdCBvZiB0aGUgd2luZG93IG9iamVjdCBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgLy8g
YSBjb250ZXh0LgorICAgICAgICBzdGF0aWMgRnJhbWUqIHJldHJpZXZlRnJhbWUodjg6OkhhbmRs
ZTx2ODo6Q29udGV4dD4pOworCisKKyAgICAgICAgLy8gVGhlIHRocmVlIGZ1bmN0aW9ucyBiZWxv
dyByZXRyaWV2ZSBXZWJGcmFtZSBpbnN0YW5jZXMgcmVsYXRpbmcgdGhlCisgICAgICAgIC8vIGN1
cnJlbnRseSBleGVjdXRpbmcgSmF2YVNjcmlwdC4gU2luY2UgSmF2YVNjcmlwdCBjYW4gbWFrZSBm
dW5jdGlvbiBjYWxscworICAgICAgICAvLyBhY3Jvc3MgZnJhbWVzLCB0aG91Z2gsIHdlIG5lZWQg
dG8gYmUgbW9yZSBwcmVjaXNlLgorICAgICAgICAvLworICAgICAgICAvLyBGb3IgZXhhbXBsZSwg
aW1hZ2luZSB0aGF0IGEgSlMgZnVuY3Rpb24gaW4gZnJhbWUgQSBjYWxscyBhIGZ1bmN0aW9uIGlu
CisgICAgICAgIC8vIGZyYW1lIEIsIHdoaWNoIGNhbGxzIG5hdGl2ZSBjb2RlLCB3aGljaCB3YW50
cyB0byBrbm93IHdoYXQgdGhlICdhY3RpdmUnCisgICAgICAgIC8vIGZyYW1lIGlzLgorICAgICAg
ICAvLworICAgICAgICAvLyBUaGUgJ2VudGVyZWQgY29udGV4dCcgaXMgdGhlIGNvbnRleHQgd2hl
cmUgZXhlY3V0aW9uIGZpcnN0IGVudGVyZWQgdGhlCisgICAgICAgIC8vIHNjcmlwdCBlbmdpbmU7
IHRoZSBjb250ZXh0IHRoYXQgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgSlMgZnVuY3Rpb24gc3Rh
Y2suCisgICAgICAgIC8vIFJldHJpZXZlRnJhbWVGb3JFbnRlcmVkQ29udGV4dCgpIHdvdWxkIHJl
dHVybiBGcmFtZSBBIGluIG91ciBleGFtcGxlLgorICAgICAgICAvLyBUaGlzIGZyYW1lIGlzIG9m
dGVuIHJlZmVycmVkIHRvIGFzIHRoZSAiZHluYW1pYyBnbG9iYWwgb2JqZWN0LiIKKyAgICAgICAg
Ly8KKyAgICAgICAgLy8gVGhlICdjdXJyZW50IGNvbnRleHQnIGlzIHRoZSBjb250ZXh0IHRoZSBK
UyBlbmdpbmUgaXMgY3VycmVudGx5IGluc2lkZSBvZjsKKyAgICAgICAgLy8gdGhlIGNvbnRleHQg
dGhhdCBpcyBhdCB0aGUgdG9wIG9mIHRoZSBKUyBmdW5jdGlvbiBzdGFjay4KKyAgICAgICAgLy8g
UmV0cmlldmVGcmFtZUZvckN1cnJlbnRDb250ZXh0KCkgd291bGQgcmV0dXJuIEZyYW1lIEIgaW4g
b3VyIGV4YW1wbGUuCisgICAgICAgIC8vIFRoaXMgZnJhbWUgaXMgb2Z0ZW4gcmVmZXJyZWQgdG8g
YXMgdGhlICJsZXhpY2FsIGdsb2JhbCBvYmplY3QuIgorICAgICAgICAvLworICAgICAgICAvLyBG
aW5hbGx5LCB0aGUgJ2NhbGxpbmcgY29udGV4dCcgaXMgdGhlIGNvbnRleHQgb25lIGJlbG93IHRo
ZSBjdXJyZW50CisgICAgICAgIC8vIGNvbnRleHQgb24gdGhlIEpTIGZ1bmN0aW9uIHN0YWNrLiAg
Rm9yIGV4YW1wbGUsIGlmIGZ1bmN0aW9uIGYgY2FsbHMKKyAgICAgICAgLy8gZnVuY3Rpb24gZywg
dGhlbiB0aGUgY2FsbGluZyBjb250ZXh0IHdpbGwgYmUgdGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3
aXRoCisgICAgICAgIC8vIGYuICBUaGlzIGNvbnRleHQgaXMgY29tbW9ubHkgdXNlZCBieSBET00g
c2VjdXJpdHkgY2hlY2tzIGJlY2F1c2UgdGhleSB3YW50CisgICAgICAgIC8vIHRvIGtub3cgd2hv
IGNhbGxlZCB0aGVtLgorICAgICAgICAvLworICAgICAgICAvLyBJZiB5b3UgYXJlIHVuc3VyZSB3
aGljaCBvZiB0aGVzZSBmdW5jdGlvbnMgdG8gdXNlLCBhc2sgYWJhcnRoLgorICAgICAgICAvLwor
ICAgICAgICAvLyBOT1RFOiBUaGVzZSBjYW5ub3QgYmUgZGVjbGFyZWQgYXMgaW5saW5lIGZ1bmN0
aW9uLCBiZWNhdXNlIFZTIGNvbXBsYWlucyBhdAorICAgICAgICAvLyBsaW5raW5nIHRpbWUuCisg
ICAgICAgIHN0YXRpYyBGcmFtZSogcmV0cmlldmVGcmFtZUZvckVudGVyZWRDb250ZXh0KCk7Cisg
ICAgICAgIHN0YXRpYyBGcmFtZSogcmV0cmlldmVGcmFtZUZvckN1cnJlbnRDb250ZXh0KCk7Cisg
ICAgICAgIHN0YXRpYyBGcmFtZSogcmV0cmlldmVGcmFtZUZvckNhbGxpbmdDb250ZXh0KCk7CisK
KyAgICAgICAgLy8gUmV0dXJucyBWOCBDb250ZXh0IG9mIGEgZnJhbWUuIElmIG5vbmUgZXhpc3Rz
LCBjcmVhdGVzCisgICAgICAgIC8vIGEgbmV3IGNvbnRleHQuICBJdCBpcyBwb3RlbnRpYWxseSBz
bG93IGFuZCBjb25zdW1lcyBtZW1vcnkuCisgICAgICAgIHN0YXRpYyB2ODo6TG9jYWw8djg6OkNv
bnRleHQ+IGNvbnRleHQoRnJhbWUqKTsKKyAgICAgICAgc3RhdGljIHY4OjpMb2NhbDx2ODo6Q29u
dGV4dD4gY3VycmVudENvbnRleHQoKTsKKworICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBjb250
ZXh0IGNhdXNlcyBvdXQgb2YgbWVtb3J5LCBKYXZhU2NyaXB0IHNldHRpbmcKKyAgICAgICAgLy8g
aXMgZGlzYWJsZWQgYW5kIGl0IHJldHVybnMgdHJ1ZS4KKyAgICAgICAgc3RhdGljIGJvb2wgaGFu
ZGxlT3V0T2ZNZW1vcnkoKTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aXZlIGV4ZWN1
dGlvbiBjb250ZXh0IGNhbiBhY2Nlc3MgdGhlIHRhcmdldCBmcmFtZS4KKyAgICAgICAgc3RhdGlj
IGJvb2wgY2FuQWNjZXNzRnJhbWUoRnJhbWUqLCBib29sIHJlcG9ydEVycm9yKTsKKworICAgICAg
ICAvLyBDaGVjayBpZiBpdCBpcyBzYWZlIHRvIGFjY2VzcyB0aGUgZ2l2ZW4gbm9kZSBmcm9tIHRo
ZQorICAgICAgICAvLyBjdXJyZW50IHNlY3VyaXR5IGNvbnRleHQuCisgICAgICAgIHN0YXRpYyBi
b29sIGNoZWNrTm9kZVNlY3VyaXR5KE5vZGUqKTsKKworICAgICAgICBzdGF0aWMgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IGNoZWNrTmV3TGVnYWwoY29uc3Qgdjg6OkFyZ3VtZW50cyYpOworCisgICAg
ICAgIC8vIENyZWF0ZSBhIFY4IHdyYXBwZXIgZm9yIGEgQyBwb2ludGVyCisgICAgICAgIHN0YXRp
YyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcENQb2ludGVyKHZvaWQqIGNwdHIpCisgICAgICAg
IHsKKyAgICAgICAgICAgIC8vIFJlcHJlc2VudCB2b2lkKiBhcyBpbnQKKyAgICAgICAgICAgIGlu
dCBhZGRyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQ+KGNwdHIpOworICAgICAgICAgICAgQVNTRVJU
KCEoYWRkciAmIDB4MDEpKTsgIC8vIHRoZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZC4KKyAgICAg
ICAgICAgIHJldHVybiB2ODo6SW50ZWdlcjo6TmV3KGFkZHIgPj4gMSk7CisgICAgICAgIH0KKwor
ICAgICAgICAvLyBUYWtlIEMgcG9pbnRlciBvdXQgb2YgYSB2OCB3cmFwcGVyCisgICAgICAgIHRl
bXBsYXRlIDxjbGFzcyBDPgorICAgICAgICBzdGF0aWMgQyogZXh0cmFjdENQb2ludGVyKHY4OjpI
YW5kbGU8djg6OlZhbHVlPiBvYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxDKj4oZXh0cmFjdENQb2ludGVySW1wbChvYmopKTsKKyAgICAgICAgfQorCisgICAg
ICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IGNvbXBpbGVTY3JpcHQodjg6OkhhbmRs
ZTx2ODo6U3RyaW5nPiBjb2RlLCBjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBpbnQgYmFzZUxpbmUp
OworCisjaWZuZGVmIE5ERUJVRworICAgICAgICAvLyBDaGVja3MgaWYgYSB2OCB2YWx1ZSBjYW4g
YmUgYSBET00gd3JhcHBlcgorICAgICAgICBzdGF0aWMgYm9vbCBtYXliZURPTVdyYXBwZXIodjg6
OkhhbmRsZTx2ODo6VmFsdWU+KTsKKyNlbmRpZgorCisgICAgICAgIC8vIFNldHMgY29udGVudHMg
b2YgYSBET00gd3JhcHBlci4KKyAgICAgICAgc3RhdGljIHZvaWQgc2V0RE9NV3JhcHBlcih2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+LCBpbnQgdHlwZSwgdm9pZCogcHRyKTsKKworICAgICAgICBzdGF0
aWMgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6
VjhXcmFwcGVyVHlwZSwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KTsKKworICAgICAgICAvLyBBIGhl
bHBlciBmdW5jdGlvbiBleHRyYWN0IG5hdGl2ZSBvYmplY3QgcG9pbnRlciBmcm9tIGEgRE9NIHdy
YXBwZXIKKyAgICAgICAgLy8gYW5kIGNhc3QgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAg
ICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KKyAgICAgICAgc3RhdGljIEMqIGNvbnZlcnRET01XcmFwcGVy
VG9OYXRpdmUodjg6OkhhbmRsZTx2ODo6VmFsdWU+IG9iamVjdCkKKyAgICAgICAgeworICAgICAg
ICAgICAgQVNTRVJUKG1heWJlRE9NV3JhcHBlcihvYmplY3QpKTsKKyAgICAgICAgICAgIHY4OjpI
YW5kbGU8djg6OlZhbHVlPiBwdHIgPSB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KG9iamVj
dCktPkdldEludGVybmFsRmllbGQoVjhDdXN0b206OmtET01XcmFwcGVyT2JqZWN0SW5kZXgpOwor
ICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RDUG9pbnRlcjxDPihwdHIpOworICAgICAgICB9CisK
KyAgICAgICAgLy8gQSBoZWxwIGZ1bmN0aW9uIGV4dHJhY3QgYSBub2RlIHR5cGUgcG9pbnRlciBm
cm9tIGEgRE9NIHdyYXBwZXIuCisgICAgICAgIC8vIFdyYXBwZWQgcG9pbnRlciBtdXN0IGJlIGNh
c3QgdG8gTm9kZSogZmlyc3QuCisgICAgICAgIHN0YXRpYyB2b2lkKiBjb252ZXJ0RE9NV3JhcHBl
clRvTm9kZUhlbHBlcih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4pOworCisgICAgICAgIHRlbXBsYXRl
IDxjbGFzcyBDPgorICAgICAgICBzdGF0aWMgQyogY29udmVydERPTVdyYXBwZXJUb05vZGUodjg6
OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8Qyo+KGNvbnZlcnRET01XcmFwcGVyVG9Ob2RlSGVscGVyKHZhbHVlKSk7Cisg
ICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhX
cmFwcGVyVHlwZSB0eXBlLCBQYXNzUmVmUHRyPFQ+IGltcCkKKyAgICAgICAgeworICAgICAgICAg
IHJldHVybiBjb252ZXJ0VG9WOE9iamVjdCh0eXBlLCBpbXAuZ2V0KCkpOworICAgICAgICB9CisK
KyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252ZXJ0VG9WOE9iamVjdChW
OENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUsIHZvaWQqKTsKKworICAgICAgICAvLyBGYXN0LXBh
dGggZm9yIE5vZGUgb2JqZWN0cy4KKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiBjb252ZXJ0Tm9kZVRvVjhPYmplY3QoTm9kZSopOworCisgICAgICAgIHRlbXBsYXRlIDxjbGFz
cyBDPgorICAgICAgICBzdGF0aWMgQyogY29udmVydFRvTmF0aXZlT2JqZWN0KFY4Q2xhc3NJbmRl
eDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gb2JqZWN0KQorICAg
ICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Qyo+KGNvbnZlcnRUb05hdGl2
ZU9iamVjdEltcGwodHlwZSwgb2JqZWN0KSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMg
VjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIGRvbVdyYXBwZXJUeXBlKHY4OjpIYW5kbGU8djg6
Ok9iamVjdD4pOworCisgICAgICAgIC8vIElmIHRoZSBleGNlcHRpb24gY29kZSBpcyBkaWZmZXJl
bnQgZnJvbSB6ZXJvLCBhIERPTSBleGNlcHRpb24gaXMKKyAgICAgICAgLy8gc2NoZWR1bGUgdG8g
YmUgdGhyb3duLgorICAgICAgICBzdGF0aWMgdm9pZCBzZXRET01FeGNlcHRpb24oaW50IGV4Y2Vw
dGlvbkNvZGUpOworCisgICAgICAgIC8vIFNjaGVkdWxlIGFuIGVycm9yIG9iamVjdCB0byBiZSB0
aHJvd24uCisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdGhyb3dFcnJvcihF
cnJvclR5cGUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworCisgICAgICAgIC8vIENyZWF0ZSBhbiBp
bnN0YW5jZSBvZiBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IgYW5kIHNldCB0byB0aGUgZ2xvYmFsIG9i
amVjdAorICAgICAgICAvLyBhcyBhIG5hbWVkIHByb3BlcnR5LiBVc2VkIGJ5IHY4X3Rlc3Rfc2hl
bGwuCisgICAgICAgIHN0YXRpYyB2b2lkIGJpbmRKc09iamVjdFRvV2luZG93KEZyYW1lKiwgY29u
c3QgY2hhciogbmFtZSwgaW50IHR5cGUsIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+
LCB2b2lkKik7CisKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252ZXJ0
RXZlbnRUb1Y4T2JqZWN0KEV2ZW50Kik7CisKKyAgICAgICAgc3RhdGljIEV2ZW50KiBjb252ZXJ0
VG9OYXRpdmVFdmVudCh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4ganNFdmVudCkKKyAgICAgICAgewor
ICAgICAgICAgICAgaWYgKCFpc0RPTUV2ZW50V3JhcHBlcihqc0V2ZW50KSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0RE9NV3JhcHBlclRvTmF0
aXZlPEV2ZW50Pihqc0V2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gY29udmVydEV2ZW50VGFyZ2V0VG9WOE9iamVjdChFdmVudFRhcmdldCop
OworICAgICAgICAvLyBXcmFwIGFuZCB1bndyYXAgSlMgZXZlbnQgbGlzdGVuZXJzCisgICAgICAg
IHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVydEV2ZW50TGlzdGVuZXJUb1Y4T2Jq
ZWN0KEV2ZW50TGlzdGVuZXIqKTsKKworICAgICAgICAvLyBET01JbXBsZW1lbnRhdGlvbiBpcyBh
IHNpbmdsZXRvbiBhbmQgaXQgaXMgaGFuZGxlZCBpbiBhIHNwZWNpYWwKKyAgICAgICAgLy8gd2F5
LiAgQSB3cmFwcGVyIGlzIGdlbmVyYXRlZCBwZXIgZG9jdW1lbnQgYW5kIHN0b3JlZCBpbiBhbgor
ICAgICAgICAvLyBpbnRlcm5hbCBmaWVsZCBvZiB0aGUgZG9jdW1lbnQuCisgICAgICAgIHN0YXRp
YyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVydERPTUltcGxlbWVudGF0aW9uVG9WOE9iamVj
dChET01JbXBsZW1lbnRhdGlvbiopOworCisgICAgICAgIC8vIFdyYXAgSlMgbm9kZSBmaWx0ZXIg
aW4gQysrCisgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPE5vZGVGaWx0ZXI+IHdyYXBOYXRpdmVO
b2RlRmlsdGVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPik7CisKKyAgICAgICAgc3RhdGljIHY4OjpQ
ZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBnZXRUZW1wbGF0ZShWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUpOworCisgICAgICAgIHRlbXBsYXRlIDxpbnQgdGFnLCB0eXBlbmFtZSBU
PgorICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnN0cnVjdERPTU9iamVj
dChjb25zdCB2ODo6QXJndW1lbnRzJik7CisKKyAgICAgICAgLy8gQ2hlY2tzIHdoZXRoZXIgYSBE
T00gb2JqZWN0IGhhcyBhIEpTIHdyYXBwZXIuCisgICAgICAgIHN0YXRpYyBib29sIGRvbU9iamVj
dEhhc0pTV3JhcHBlcih2b2lkKik7CisgICAgICAgIC8vIFNldCBKUyB3cmFwcGVyIG9mIGEgRE9N
IG9iamVjdCwgdGhlIGNhbGxlciBpbiBjaGFyZ2Ugb2YgaW5jcmVhc2UgcmVmLgorICAgICAgICBz
dGF0aWMgdm9pZCBzZXRKU1dyYXBwZXJGb3JET01PYmplY3Qodm9pZCosIHY4OjpQZXJzaXN0ZW50
PHY4OjpPYmplY3Q+KTsKKyAgICAgICAgc3RhdGljIHZvaWQgc2V0SlNXcmFwcGVyRm9yQWN0aXZl
RE9NT2JqZWN0KHZvaWQqLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pik7CisgICAgICAgIHN0
YXRpYyB2b2lkIHNldEpTV3JhcHBlckZvckRPTU5vZGUoTm9kZSosIHY4OjpQZXJzaXN0ZW50PHY4
OjpPYmplY3Q+KTsKKworICAgICAgICAvLyBQcm9jZXNzIGFueSBwZW5kaW5nIEphdmFTY3JpcHQg
Y29uc29sZSBtZXNzYWdlcy4KKyAgICAgICAgc3RhdGljIHZvaWQgcHJvY2Vzc0NvbnNvbGVNZXNz
YWdlcygpOworCisjaWZuZGVmIE5ERUJVRworICAgICAgICAvLyBGb3IgZGVidWdnaW5nIGFuZCBs
ZWFrIGRldGVjdGlvbiBwdXJwb3NlCisgICAgICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyR2xvYmFs
SGFuZGxlKEdsb2JhbEhhbmRsZVR5cGUsIHZvaWQqLCB2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+
KTsKKyAgICAgICAgc3RhdGljIHZvaWQgdW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh2b2lkKiwgdjg6
OlBlcnNpc3RlbnQ8djg6OlZhbHVlPik7CisjZW5kaWYKKworICAgICAgICAvLyBDaGVjayB3aGV0
aGVyIGEgVjggdmFsdWUgaXMgYSB3cmFwcGVyIG9mIHR5cGUgfGNsYXNzVHlwZXwuCisgICAgICAg
IHN0YXRpYyBib29sIGlzV3JhcHBlck9mVHlwZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4sIFY4Q2xh
c3NJbmRleDo6VjhXcmFwcGVyVHlwZSk7CisKKyAgICAgICAgLy8gRnVuY3Rpb24gZm9yIHJldHJp
ZXZpbmcgdGhlIGxpbmUgbnVtYmVyIGFuZCBzb3VyY2UgbmFtZSBmb3IgdGhlIHRvcAorICAgICAg
ICAvLyBKYXZhU2NyaXB0IHN0YWNrIGZyYW1lLgorICAgICAgICBzdGF0aWMgaW50IHNvdXJjZUxp
bmVOdW1iZXIoKTsKKyAgICAgICAgc3RhdGljIFN0cmluZyBzb3VyY2VOYW1lKCk7CisKKworICAg
ICAgICAvLyBSZXR1cm5zIGEgbG9jYWwgaGFuZGxlIG9mIHRoZSBjb250ZXh0LgorICAgICAgICB2
ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQoKQorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KG1fY29udGV4dCk7CisgICAgICAgIH0K
KworICAgICAgICBib29sIHNldENvbnRleHREZWJ1Z0lkKGludCBpZCk7CisgICAgICAgIHN0YXRp
YyBpbnQgY29udGV4dERlYnVnSWQodjg6OkhhbmRsZTx2ODo6Q29udGV4dD4pOworCisgICAgICAg
IC8vIFJlZ2lzdGVycyBhbiBleHRlbnNpb24gdG8gYmUgYXZhaWxhYmxlIG9uIHdlYnBhZ2VzIHdp
dGggYSBwYXJ0aWN1bGFyIHNjaGVtZQorICAgICAgICAvLyBJZiB0aGUgc2NoZW1lIGFyZ3VtZW50
IGlzIGVtcHR5LCB0aGUgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZSBvbiBhbGwgcGFnZXMuCisgICAg
ICAgIC8vIFdpbGwgb25seSBhZmZlY3QgdjggY29udGV4dHMgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhp
cyBjYWxsLiBUYWtlcyBvd25lcnNoaXAKKyAgICAgICAgLy8gb2YgdGhlIHY4OjpFeHRlbnNpb24g
b2JqZWN0IHBhc3NlZC4KKyAgICAgICAgc3RhdGljIHZvaWQgcmVnaXN0ZXJFeHRlbnNpb24odjg6
OkV4dGVuc2lvbiosIGNvbnN0IFN0cmluZyYgc2NoZW1lUmVzdHJpY3Rpb24pOworCisgICAgICAg
IHN0YXRpYyB2b2lkKiBjb252ZXJ0VG9TVkdQT0RUeXBlSW1wbChWOENsYXNzSW5kZXg6OlY4V3Jh
cHBlclR5cGUsIHY4OjpIYW5kbGU8djg6OlZhbHVlPik7CisKKyAgICBwcml2YXRlOgorICAgICAg
ICBzdGF0aWMgY29uc3QgY2hhcioga0NvbnRleHREZWJ1Z0RhdGFUeXBlOworICAgICAgICBzdGF0
aWMgY29uc3QgY2hhcioga0NvbnRleHREZWJ1Z0RhdGFWYWx1ZTsKKworICAgICAgICB2ODo6UGVy
c2lzdGVudDx2ODo6Q29udGV4dD4gY3JlYXRlTmV3Q29udGV4dCh2ODo6SGFuZGxlPHY4OjpPYmpl
Y3Q+IGdsb2JhbCk7CisgICAgICAgIHZvaWQgaW5pdENvbnRleHRJZk5lZWRlZCgpOworICAgICAg
ICB2b2lkIGRpc2Nvbm5lY3RFdmVudExpc3RlbmVycygpOworICAgICAgICB2b2lkIHNldFNlY3Vy
aXR5VG9rZW4oKTsKKyAgICAgICAgdm9pZCBjbGVhckRvY3VtZW50V3JhcHBlcigpOworICAgICAg
ICB2b2lkIHVwZGF0ZURvY3VtZW50V3JhcHBlcih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcHBl
cik7CisKKyAgICAgICAgLy8gVGhlIEphdmFTY3JpcHQgd3JhcHBlciBmb3IgdGhlIGRvY3VtZW50
IG9iamVjdCBpcyBjYWNoZWQgb24gdGhlIGdsb2JhbAorICAgICAgICAvLyBvYmplY3QgZm9yIGZh
c3QgYWNjZXNzLiAgVXBkYXRlRG9jdW1lbnRXcmFwcGVyQ2FjaGUgc2V0cyB0aGUgd3JhcHBlcgor
ICAgICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQgb24gdGhlIGdsb2JhbCBvYmplY3Qu
ICBDbGVhckRvY3VtZW50V3JhcHBlckNhY2hlCisgICAgICAgIC8vIGRlbGV0ZXMgdGhlIGRvY3Vt
ZW50IHdyYXBwZXIgZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgdm9pZCB1cGRhdGVE
b2N1bWVudFdyYXBwZXJDYWNoZSgpOworICAgICAgICB2b2lkIGNsZWFyRG9jdW1lbnRXcmFwcGVy
Q2FjaGUoKTsKKworICAgICAgICAvLyBEaXNwb3NlIGdsb2JhbCBoYW5kbGVzIG9mIG1fY29udGV4
dHMgYW5kIGZyaWVuZHMuCisgICAgICAgIHZvaWQgZGlzcG9zZUNvbnRleHRIYW5kbGVzKCk7CisK
KyAgICAgICAgc3RhdGljIGJvb2wgY2FuQWNjZXNzUHJpdmF0ZShET01XaW5kb3cqKTsKKworICAg
ICAgICAvLyBDaGVjayB3aGV0aGVyIGEgVjggdmFsdWUgaXMgYSBET00gRXZlbnQgd3JhcHBlcgor
ICAgICAgICBzdGF0aWMgYm9vbCBpc0RPTUV2ZW50V3JhcHBlcih2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4pOworCisgICAgICAgIHN0YXRpYyB2b2lkKiBjb252ZXJ0VG9OYXRpdmVPYmplY3RJbXBsKFY4
Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KTsKKworICAg
ICAgICAvLyBUYWtlIEMgcG9pbnRlciBvdXQgb2YgYSB2OCB3cmFwcGVyCisgICAgICAgIHN0YXRp
YyB2b2lkKiBleHRyYWN0Q1BvaW50ZXJJbXBsKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBvYmplY3Qp
CisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChvYmplY3QtPklzTnVtYmVyKCkpOworICAg
ICAgICAgICAgaW50IGFkZHIgPSBvYmplY3QtPkludDMyVmFsdWUoKTsKKyAgICAgICAgICAgIHJl
dHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPihhZGRyIDw8IDEpOworICAgICAgICB9CisKKwor
ICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnRTdHlsZVNoZWV0VG9W
OE9iamVjdChTdHlsZVNoZWV0Kik7CisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gY29udmVydENTU1ZhbHVlVG9WOE9iamVjdChDU1NWYWx1ZSopOworICAgICAgICBzdGF0aWMg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnRDU1NSdWxlVG9WOE9iamVjdChDU1NSdWxlKik7
CisgICAgICAgIC8vIFJldHVybnMgdGhlIEpTIHdyYXBwZXIgb2YgYSB3aW5kb3cgb2JqZWN0LCBp
bml0aWFsaXplcyB0aGUgZW52aXJvbm1lbnQKKyAgICAgICAgLy8gb2YgdGhlIHdpbmRvdyBmcmFt
ZSBpZiBuZWVkZWQuCisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVy
dFdpbmRvd1RvVjhPYmplY3QoRE9NV2luZG93Kik7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAg
ICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnRTVkdFbGVtZW50SW5zdGFuY2VU
b1Y4T2JqZWN0KFNWR0VsZW1lbnRJbnN0YW5jZSopOworICAgICAgICBzdGF0aWMgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IGNvbnZlcnRTVkdPYmplY3RXaXRoQ29udGV4dFRvVjhPYmplY3QoVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlLCB2b2lkKik7CisjZW5kaWYKKworICAgICAgICAvLyBTZXQg
aGlkZGVuIHJlZmVyZW5jZXMgaW4gYSBET01XaW5kb3cgb2JqZWN0IG9mIGEgZnJhbWUuCisgICAg
ICAgIHN0YXRpYyB2b2lkIHNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShGcmFtZSosIGNvbnN0IGlu
dCBpbnRlcm5hbEluZGV4LCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+KTsKKworICAgICAgICBzdGF0
aWMgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIGh0bWxFbGVtZW50VHlwZShIVE1MRWxlbWVu
dCopOworCisgICAgICAgIC8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIsIGRlc2NfdHlwZSwgc3BlY2lm
aWVzIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yCisgICAgICAgIC8vIHVzZWQgdG8gY3JlYXRlIEpT
IG9iamVjdC4gVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGNwdHJfdHlwZSwgc3BlY2lmaWVzCisgICAg
ICAgIC8vIHRoZSB0eXBlIG9mIHRoaXJkIHBhcmFtZXRlciwgaW1wbCwgZm9yIHR5cGUgY2FzdGlu
Zy4KKyAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGEgSFRNTCBlbGVtZW50IGhhcyBIVE1MRUxFTUVO
VCBkZXNjX3R5cGUsIGJ1dCBhbHdheXMKKyAgICAgICAgLy8gdXNlIE5PREUgYXMgY3B0cl90eXBl
LiBKUyB3cmFwcGVyIHN0b3JlcyBjcHRyX3R5cGUgYW5kIGltcGwgYXMKKyAgICAgICAgLy8gaW50
ZXJuYWwgZmllbGRzLgorICAgICAgICBzdGF0aWMgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGluc3Rh
bnRpYXRlVjhPYmplY3QoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlLCBWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUsIHZvaWQqKTsKKworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogcmFu
Z2VFeGNlcHRpb25OYW1lKGludCBleGNlcHRpb25Db2RlKTsKKyAgICAgICAgc3RhdGljIGNvbnN0
IGNoYXIqIGV2ZW50RXhjZXB0aW9uTmFtZShpbnQgZXhjZXB0aW9uQ29kZSk7CisgICAgICAgIHN0
YXRpYyBjb25zdCBjaGFyKiB4bWxIdHRwUmVxdWVzdEV4Y2VwdGlvbk5hbWUoaW50IGV4Y2VwdGlv
bkNvZGUpOworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogZG9tRXhjZXB0aW9uTmFtZShpbnQg
ZXhjZXB0aW9uQ29kZSk7CisKKyNpZiBFTkFCTEUoWFBBVEgpCisgICAgICAgIHN0YXRpYyBjb25z
dCBjaGFyKiB4cGF0aEV4Y2VwdGlvbk5hbWUoaW50IGV4Y2VwdGlvbkNvZGUpOworI2VuZGlmCisK
KyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBzdGF0aWMgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJU
eXBlIHN2Z0VsZW1lbnRUeXBlKFNWR0VsZW1lbnQqKTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNo
YXIqIHN2Z0V4Y2VwdGlvbk5hbWUoaW50IGV4Y2VwdGlvbkNvZGUpOworI2VuZGlmCisKKyAgICAg
ICAgc3RhdGljIHZvaWQgY3JlYXRlVXRpbGl0eUNvbnRleHQoKTsKKworICAgICAgICAvLyBSZXR1
cm5zIGEgbG9jYWwgaGFuZGxlIG9mIHRoZSB1dGlsaXR5IGNvbnRleHQuCisgICAgICAgIHN0YXRp
YyB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHV0aWxpdHlDb250ZXh0KCkKKyAgICAgICAgeworICAg
ICAgICAgIGlmIChtX3V0aWxpdHlDb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgICAgICAgY3Jl
YXRlVXRpbGl0eUNvbnRleHQoKTsKKyAgICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250
ZXh0Pjo6TmV3KG1fdXRpbGl0eUNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgRnJhbWUq
IG1fZnJhbWU7CisKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IG1fY29udGV4
dDsKKyAgICAgICAgLy8gRm9yIGVhY2ggcG9zc2libGUgdHlwZSBvZiB3cmFwcGVyLCB3ZSBrZWVw
IGEgYm9pbGVycGxhdGUgb2JqZWN0LgorICAgICAgICAvLyBUaGUgYm9pbGVycGxhdGUgaXMgdXNl
ZCB0byBjcmVhdGUgYWRkaXRpb25hbCB3cmFwcGVycyBvZiB0aGUgc2FtZSB0eXBlLgorICAgICAg
ICAvLyBXZSBrZWVwIGEgc2luZ2xlIHBlcnNpc3RlbnQgaGFuZGxlIHRvIGFuIGFycmF5IG9mIHRo
ZSBhY3RpdmF0ZWQKKyAgICAgICAgLy8gYm9pbGVycGxhdGVzLgorICAgICAgICB2ODo6UGVyc2lz
dGVudDx2ODo6QXJyYXk+IG1fd3JhcHBlckJvaWxlcnBsYXRlczsKKyAgICAgICAgdjg6OlBlcnNp
c3RlbnQ8djg6OlZhbHVlPiBtX29iamVjdFByb3RvdHlwZTsKKworICAgICAgICB2ODo6UGVyc2lz
dGVudDx2ODo6T2JqZWN0PiBtX2dsb2JhbDsKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6OlZh
bHVlPiBtX2RvY3VtZW50OworCisgICAgICAgIC8vIFV0aWxpdHkgY29udGV4dCBob2xkaW5nIEph
dmFTY3JpcHQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseS4KKyAgICAgICAgc3RhdGljIHY4OjpQ
ZXJzaXN0ZW50PHY4OjpDb250ZXh0PiBtX3V0aWxpdHlDb250ZXh0OworCisgICAgICAgIGludCBt
X2hhbmRsZXJMaW5lbm87CisKKyAgICAgICAgLy8gQSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyBj
cmVhdGVkIGZvciB0aGlzIGZyYW1lLAorICAgICAgICAvLyB0aGUgbGlzdCBnZXRzIGNsZWFyZWQg
d2hlbiByZW1vdmluZyBhbGwgdGltZW91dHMuCisgICAgICAgIFY4RXZlbnRMaXN0ZW5lckxpc3Qg
bV9ldmVudExpc3RlbmVyczsKKworICAgICAgICAvLyBBIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJz
IGNyZWF0ZSBmb3IgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0IGZvciB0aGlzIGZyYW1lLAorICAgICAg
ICAvLyB0aGUgbGlzdCBnZXRzIGNsZWFyZWQgd2hlbiByZW1vdmluZyBhbGwgdGltZW91dHMuCisg
ICAgICAgIFY4RXZlbnRMaXN0ZW5lckxpc3QgbV94aHJMaXN0ZW5lcnM7CisKKyAgICAgICAgLy8g
VHJ1ZSBmb3IgPGEgaHJlZj0iamF2YXNjcmlwdDpmb28oKSI+IGFuZCBmYWxzZSBmb3IgPHNjcmlw
dD5mb28oKTwvc2NyaXB0Pi4KKyAgICAgICAgLy8gT25seSB2YWxpZCBkdXJpbmcgZXhlY3V0aW9u
LgorICAgICAgICBib29sIG1faW5saW5lQ29kZTsKKworICAgICAgICAvLyBUcnVlIHdoZW4gZXhl
Y3V0aW5nIGZyb20gd2l0aGluIGEgdGltZXIgY2FsbGJhY2suICBPbmx5IHZhbGlkIGR1cmluZwor
ICAgICAgICAvLyBleGVjdXRpb24uCisgICAgICAgIGJvb2wgbV90aW1lckNhbGxiYWNrOworCisg
ICAgICAgIC8vIFRyYWNrIHRoZSByZWN1cnNpb24gZGVwdGggdG8gYmUgYWJsZSB0byBhdm9pZCB0
b28gZGVlcCByZWN1cnNpb24uIFRoZSBWOAorICAgICAgICAvLyBlbmdpbmUgYWxsb3dzIG11Y2gg
bW9yZSByZWN1cnNpb24gdGhhbiBLSlMgZG9lcyBzbyB3ZSBuZWVkIHRvIGd1YXJkIGFnYWluc3QK
KyAgICAgICAgLy8gZXhjZXNzaXZlIHJlY3Vyc2lvbiBpbiB0aGUgYmluZGluZyBsYXllci4KKyAg
ICAgICAgaW50IG1fcmVjdXJzaW9uOworCisgICAgICAgIC8vIExpc3Qgb2YgZXh0ZW5zaW9ucyBy
ZWdpc3RlcmVkIHdpdGggdGhlIGNvbnRleHQuCisgICAgICAgIHN0YXRpYyBWOEV4dGVuc2lvbkxp
c3QgbV9leHRlbnNpb25zOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8aW50IHRhZywgdHlwZW5h
bWUgVD4KKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y29uc3RydWN0RE9NT2Jq
ZWN0KGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCisgICAgeworICAgICAgICBpZiAoIWFyZ3Mu
SXNDb25zdHJ1Y3RDYWxsKCkpIHsKKyAgICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJv
eHk6OlRZUEVfRVJST1IsICJET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQg
YXMgYSBmdW5jdGlvbi4iKTsKKyAgICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworICAg
ICAgICB9CisKKyAgICAgICAgLy8gTm90ZTogaXQncyBPSyB0byBsZXQgdGhpcyBSZWZQdHIgZ28g
b3V0IG9mIHNjb3BlIGJlY2F1c2Ugd2UgYWxzbyBjYWxsCisgICAgICAgIC8vIFNldERPTVdyYXBw
ZXIoKSwgd2hpY2ggZWZmZWN0aXZlbHkgaG9sZHMgYSByZWZlcmVuY2UgdG8gb2JqLgorICAgICAg
ICBSZWZQdHI8VD4gb2JqID0gVDo6Y3JlYXRlKCk7CisgICAgICAgIFY4UHJveHk6OnNldERPTVdy
YXBwZXIoYXJncy5Ib2xkZXIoKSwgdGFnLCBvYmouZ2V0KCkpOworICAgICAgICBvYmotPnJlZigp
OworICAgICAgICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01PYmplY3Qob2JqLmdldCgpLCB2
ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGFyZ3MuSG9sZGVyKCkpKTsKKyAgICAgICAg
cmV0dXJuIGFyZ3MuSG9sZGVyKCk7CisgICAgfQorCisKICAgICAvLyBVc2VkIGJ5IGFuIGludGVy
Y2VwdG9yIGNhbGxiYWNrIHRoYXQgaXQgaGFzbid0IGZvdW5kIGFueXRoaW5nIHRvCiAgICAgLy8g
aW50ZXJjZXB0LgogICAgIGlubGluZSBzdGF0aWMgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG5vdEhh
bmRsZWRCeUludGVyY2VwdG9yKCkKQEAgLTQ4LDIyICs2NTAsMTUgQEAKICAgICB7CiAgICAgICAg
IHJldHVybiB2ODo6TG9jYWw8djg6OkJvb2xlYW4+KCk7CiAgICAgfQotCi0gICAgLy8gRklYTUU6
IFJlbW92ZSBvbmNlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZS4KLSAgICBpbmxpbmUgc3RhdGljIERP
TVdyYXBwZXJNYXA8dm9pZD4mIGRvbU9iamVjdE1hcCgpCi0gICAgewotICAgICAgICByZXR1cm4g
R2V0RE9NT2JqZWN0TWFwKCk7Ci0gICAgfQotCiAgICAgaW5saW5lIHY4OjpIYW5kbGU8djg6OlBy
aW1pdGl2ZT4gdGhyb3dFcnJvcihjb25zdCBjaGFyKiBtZXNzYWdlLCBWOFByb3h5OjpFcnJvclR5
cGUgdHlwZSA9IFY4UHJveHk6OlRZUEVfRVJST1IpCiAgICAgewotICAgICAgICBWOFByb3h5OjpU
aHJvd0Vycm9yKHR5cGUsIG1lc3NhZ2UpOworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKHR5
cGUsIG1lc3NhZ2UpOwogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgIH0KIAog
ICAgIGlubGluZSB2ODo6SGFuZGxlPHY4OjpQcmltaXRpdmU+IHRocm93RXJyb3IoRXhjZXB0aW9u
Q29kZSBlYykKICAgICB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7Cisg
ICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgIHJldHVybiB2ODo6
VW5kZWZpbmVkKCk7CiAgICAgfQogCkBAIC03Niw3ICs2NzEsNyBAQAogICAgIHRlbXBsYXRlIDxj
bGFzcyBUPiBpbmxpbmUgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB0b1Y4KFBhc3NSZWZQdHI8VD4g
b2JqZWN0LCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaG9sZGVyKQogICAgIHsKICAgICAgICAgb2Jq
ZWN0LT5yZWYoKTsKLSAgICAgICAgVjhQcm94eTo6U2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KG9i
amVjdC5nZXQoKSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhob2xkZXIpKTsKKyAg
ICAgICAgVjhQcm94eTo6c2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KG9iamVjdC5nZXQoKSwgdjg6
OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhob2xkZXIpKTsKICAgICAgICAgcmV0dXJuIGhv
bGRlcjsKICAgICB9CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4
ZWN1dGlvblByb3h5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtl
ckNvbnRleHRFeGVjdXRpb25Qcm94eS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9i
aW5kaW5ncy92OC9Xb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zNSwxMyArMzUsMTMgQEAKIAogI2luY2x1ZGUgIldvcmtlckNvbnRleHRFeGVjdXRpb25Q
cm94eS5oIgogCi0jaW5jbHVkZSAiVjhCaW5kaW5nLmgiCi0jaW5jbHVkZSAiVjhQcm94eS5oIgog
I2luY2x1ZGUgIkRPTUNvcmVFeGNlcHRpb24uaCIKICNpbmNsdWRlICJFdmVudC5oIgogI2luY2x1
ZGUgIkV2ZW50RXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiUmFuZ2VFeGNlcHRpb24uaCIKLSNpbmNs
dWRlICJYTUxIdHRwUmVxdWVzdEV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgIlY4QmluZGluZy5oIgor
I2luY2x1ZGUgIlY4RE9NTWFwLmgiCisjaW5jbHVkZSAiVjhQcm94eS5oIgogI2luY2x1ZGUgIlY4
V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIuaCIKICNpbmNsdWRlICJWOFdvcmtlckNvbnRleHRP
YmplY3RFdmVudExpc3RlbmVyLmgiCiAjaW5jbHVkZSAiV29ya2VyLmgiCkBAIC00OSw2ICs0OSw3
IEBACiAjaW5jbHVkZSAiV29ya2VyTG9jYXRpb24uaCIKICNpbmNsdWRlICJXb3JrZXJOYXZpZ2F0
b3IuaCIKICNpbmNsdWRlICJXb3JrZXJTY3JpcHRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiWE1M
SHR0cFJlcXVlc3RFeGNlcHRpb24uaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC0xMzMs
MTEgKzEzNCwxMSBAQAogewogICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2
ODo6Q29udGV4dDo6R2V0Q3VycmVudCgpOwogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xv
YmFsID0gY29udGV4dC0+R2xvYmFsKCk7Ci0gICAgZ2xvYmFsID0gVjhQcm94eTo6TG9va3VwRE9N
V3JhcHBlcihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGdsb2JhbCk7CisgICAgZ2xvYmFs
ID0gVjhQcm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQs
IGdsb2JhbCk7CiAgICAgLy8gUmV0dXJuIDAgaWYgdGhlIGN1cnJlbnQgZXhlY3V0aW5nIGNvbnRl
eHQgaXMgbm90IHRoZSB3b3JrZXIgY29udGV4dC4KICAgICBpZiAoZ2xvYmFsLklzRW1wdHkoKSkK
ICAgICAgICAgcmV0dXJuIDA7Ci0gICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VS
Q09OVEVYVCwgZ2xvYmFsKTsKKyAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQ
cm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6
V09SS0VSQ09OVEVYVCwgZ2xvYmFsKTsKICAgICByZXR1cm4gd29ya2VyQ29udGV4dC0+c2NyaXB0
KCktPnByb3h5KCk7CiB9CiAKQEAgLTE4NSw5ICsxODYsOSBAQAogICAgIH0KIAogICAgIC8vIFdy
YXAgdGhlIG9iamVjdC4KLSAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKGpzV29ya2VyQ29udGV4
dCwgVjhDbGFzc0luZGV4OjpUb0ludChWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQpLCBtX3dv
cmtlckNvbnRleHQpOworICAgIFY4UHJveHk6OnNldERPTVdyYXBwZXIoanNXb3JrZXJDb250ZXh0
LCBWOENsYXNzSW5kZXg6OlRvSW50KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCksIG1fd29y
a2VyQ29udGV4dCk7CiAKLSAgICBWOFByb3h5OjpTZXRKU1dyYXBwZXJGb3JET01PYmplY3QobV93
b3JrZXJDb250ZXh0LCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGpzV29ya2VyQ29u
dGV4dCkpOworICAgIFY4UHJveHk6OnNldEpTV3JhcHBlckZvckRPTU9iamVjdChtX3dvcmtlckNv
bnRleHQsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcoanNXb3JrZXJDb250ZXh0KSk7
CiAgICAgbV93b3JrZXJDb250ZXh0LT5yZWYoKTsKIAogICAgIC8vIEluc2VydCB0aGUgb2JqZWN0
IGluc3RhbmNlIGFzIHRoZSBwcm90b3R5cGUgb2YgdGhlIHNoYWRvdyBvYmplY3QuCkBAIC0yMDIs
NyArMjAzLDcgQEAKICAgICAvLyBFbnRlciB0aGUgY29udGV4dCBvZiB0aGUgcHJveHkgdG8gbWFr
ZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGlzCiAgICAgLy8gY29uc3RydWN0ZWQgaW4gdGhlIGNv
bnRleHQgY29ycmVzcG9uZGluZyB0byB0aGlzIHByb3h5LgogICAgIHY4OjpDb250ZXh0OjpTY29w
ZSBzY29wZShtX2NvbnRleHQpOwotICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+
IGZ1bmN0aW9uVGVtcGxhdGUgPSBWOFByb3h5OjpHZXRUZW1wbGF0ZSh0eXBlKTsKKyAgICB2ODo6
SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBmdW5jdGlvblRlbXBsYXRlID0gVjhQcm94eTo6
Z2V0VGVtcGxhdGUodHlwZSk7CiAKICAgICAvLyBHZXR0aW5nIHRoZSBmdW5jdGlvbiBtaWdodCBm
YWlsIGlmIHdlJ3JlIHJ1bm5pbmcgb3V0IG9mIHN0YWNrIG9yIG1lbW9yeS4KICAgICB2ODo6VHJ5
Q2F0Y2ggdHJ5Q2F0Y2g7CkBAIC0yMzAsMTIgKzIzMSwxMiBAQAogICAgICAgICBpZiAoIW9iamVj
dC5Jc0VtcHR5KCkpCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxXb3JrZXIqPihpbXBsKS0+cmVm
KCk7CiAgICAgICAgIHJlc3VsdCA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcob2Jq
ZWN0KTsKLSAgICAgICAgVjhQcm94eTo6U2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KGltcGwsIHJl
c3VsdCk7CisgICAgICAgIFY4UHJveHk6OnNldEpTV3JhcHBlckZvckRPTU9iamVjdChpbXBsLCBy
ZXN1bHQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8vIE5vbiBET00g
bm9kZQotICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHJlc3VsdCA9IGRvbU9iamVjdE1h
cCgpLmdldChpbXBsKTsKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiByZXN1bHQgPSBn
ZXRET01PYmplY3RNYXAoKS5nZXQoaW1wbCk7CiAgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpIHsK
ICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IHRvVjgodHlwZSwgdHlwZSwg
aW1wbCk7CiAgICAgICAgIGlmICghb2JqZWN0LklzRW1wdHkoKSkgewpAQCAtMjYyLDcgKzI2Myw3
IEBACiAgICAgICAgICAgICAgICAgQVNTRVJUKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAg
ICAgICAgIHJlc3VsdCA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcob2JqZWN0KTsK
LSAgICAgICAgICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU9iamVjdChpbXBsLCByZXN1
bHQpOworICAgICAgICAgICAgVjhQcm94eTo6c2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KGltcGws
IHJlc3VsdCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTI3Myw3
ICsyNzQsNyBAQAogICAgIGlmICghZXZlbnQpCiAgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOwog
Ci0gICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZG9tT2JqZWN0TWFwKCkuZ2V0
KGV2ZW50KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRET01PYmpl
Y3RNYXAoKS5nZXQoZXZlbnQpOwogICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpCiAgICAgICAg
IHJldHVybiB3cmFwcGVyOwogCkBAIC0yOTAsNyArMjkxLDcgQEAKICAgICB9CiAKICAgICBldmVu
dC0+cmVmKCk7ICAvLyBmYXN0IHJlZgotICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU9i
amVjdChldmVudCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhyZXN1bHQpKTsKKyAg
ICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01PYmplY3QoZXZlbnQsIHY4OjpQZXJzaXN0ZW50
PHY4OjpPYmplY3Q+OjpOZXcocmVzdWx0KSk7CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAt
MzM2LDIwICszMzcsMjAgQEAKICAgICBpZiAocHJveHkpCiAgICAgICAgIGZ1bmN0aW9uID0gcHJv
eHktPkdldENvbnN0cnVjdG9yKGRlc2NUeXBlKTsKICAgICBlbHNlCi0gICAgICAgIGZ1bmN0aW9u
ID0gVjhQcm94eTo6R2V0VGVtcGxhdGUoZGVzY1R5cGUpLT5HZXRGdW5jdGlvbigpOworICAgICAg
ICBmdW5jdGlvbiA9IFY4UHJveHk6OmdldFRlbXBsYXRlKGRlc2NUeXBlKS0+R2V0RnVuY3Rpb24o
KTsKIAogICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBpbnN0YW5jZSA9IFNhZmVBbGxvY2F0aW9u
OjpuZXdJbnN0YW5jZShmdW5jdGlvbik7CiAgICAgaWYgKCFpbnN0YW5jZS5Jc0VtcHR5KCkpIHsK
ICAgICAgICAgLy8gQXZvaWQgc2V0dGluZyB0aGUgRE9NIHdyYXBwZXIgZm9yIGZhaWxlZCBhbGxv
Y2F0aW9ucy4KLSAgICAgICAgVjhQcm94eTo6U2V0RE9NV3JhcHBlcihpbnN0YW5jZSwgVjhDbGFz
c0luZGV4OjpUb0ludChjcHRyVHlwZSksIGltcGwpOworICAgICAgICBWOFByb3h5OjpzZXRET01X
cmFwcGVyKGluc3RhbmNlLCBWOENsYXNzSW5kZXg6OlRvSW50KGNwdHJUeXBlKSwgaW1wbCk7CiAg
ICAgfQogICAgIHJldHVybiBpbnN0YW5jZTsKIH0KIAogYm9vbCBXb3JrZXJDb250ZXh0RXhlY3V0
aW9uUHJveHk6OmZvcmdldFY4RXZlbnRPYmplY3QoRXZlbnQqIGV2ZW50KQogewotICAgIGlmIChk
b21PYmplY3RNYXAoKS5jb250YWlucyhldmVudCkpIHsKLSAgICAgICAgZG9tT2JqZWN0TWFwKCku
Zm9yZ2V0KGV2ZW50KTsKKyAgICBpZiAoZ2V0RE9NT2JqZWN0TWFwKCkuY29udGFpbnMoZXZlbnQp
KSB7CisgICAgICAgIGdldERPTU9iamVjdE1hcCgpLmZvcmdldChldmVudCk7CiAgICAgICAgIHJl
dHVybiB0cnVlOwogICAgIH0gZWxzZQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0zNjMsNyAr
MzY0LDcgQEAKICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUobV9jb250ZXh0KTsKIAogICAg
IHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBzY3JpcHRTdHJpbmcgPSB2OEV4dGVybmFsU3RyaW5nKHNj
cmlwdCk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6U2NyaXB0PiBjb21waWxlZFNjcmlwdCA9IFY4UHJv
eHk6OkNvbXBpbGVTY3JpcHQoc2NyaXB0U3RyaW5nLCBmaWxlTmFtZSwgYmFzZUxpbmUpOworICAg
IHY4OjpIYW5kbGU8djg6OlNjcmlwdD4gY29tcGlsZWRTY3JpcHQgPSBWOFByb3h5Ojpjb21waWxl
U2NyaXB0KHNjcmlwdFN0cmluZywgZmlsZU5hbWUsIGJhc2VMaW5lKTsKICAgICByZXR1cm4gcnVu
U2NyaXB0KGNvbXBpbGVkU2NyaXB0KTsKIH0KIApAQCAtMzc1LDEwICszNzYsMTAgQEAKICAgICAv
LyBDb21wdXRlIHRoZSBzb3VyY2Ugc3RyaW5nIGFuZCBwcmV2ZW50IGFnYWluc3QgaW5maW5pdGUg
cmVjdXJzaW9uLgogICAgIGlmIChtX3JlY3Vyc2lvbiA+PSBrTWF4UmVjdXJzaW9uRGVwdGgpIHsK
ICAgICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGNvZGUgPSB2OEV4dGVybmFsU3RyaW5nKCJ0
aHJvdyBSYW5nZUVycm9yKCdSZWN1cnNpb24gdG9vIGRlZXAnKSIpOwotICAgICAgICBzY3JpcHQg
PSBWOFByb3h5OjpDb21waWxlU2NyaXB0KGNvZGUsICIiLCAwKTsKKyAgICAgICAgc2NyaXB0ID0g
VjhQcm94eTo6Y29tcGlsZVNjcmlwdChjb2RlLCAiIiwgMCk7CiAgICAgfQogCi0gICAgaWYgKFY4
UHJveHk6OkhhbmRsZU91dE9mTWVtb3J5KCkpCisgICAgaWYgKFY4UHJveHk6OmhhbmRsZU91dE9m
TWVtb3J5KCkpCiAgICAgICAgIEFTU0VSVChzY3JpcHQuSXNFbXB0eSgpKTsKIAogICAgIGlmIChz
Y3JpcHQuSXNFbXB0eSgpKQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOExhenlFdmVudExp
c3RlbmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4TGF6eUV2ZW50
TGlzdGVuZXIuY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhM
YXp5RXZlbnRMaXN0ZW5lci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU0LDcgKzU0LDcgQEAKICAg
ICAvLyBEaXNwb3NlIHdyYXBwZWQgZnVuY3Rpb24KICAgICBpZiAoIW1fd3JhcHBlZEZ1bmN0aW9u
LklzRW1wdHkoKSkgewogI2lmbmRlZiBOREVCVUcKLSAgICAgICAgVjhQcm94eTo6VW5yZWdpc3Rl
ckdsb2JhbEhhbmRsZSh0aGlzLCBtX3dyYXBwZWRGdW5jdGlvbik7CisgICAgICAgIFY4UHJveHk6
OnVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV93cmFwcGVkRnVuY3Rpb24pOwogI2VuZGlm
CiAgICAgICAgIG1fd3JhcHBlZEZ1bmN0aW9uLkRpc3Bvc2UoKTsKICAgICAgICAgbV93cmFwcGVk
RnVuY3Rpb24uQ2xlYXIoKTsKQEAgLTc3LDEyICs3NywxMiBAQAogICAgICAgICB2ODo6SGFuZGxl
U2NvcGUgaGFuZGxlU2NvcGU7CiAKICAgICAgICAgLy8gVXNlIHRoZSBvdXRlciBzY29wZSB0byBo
b2xkIGNvbnRleHQuCi0gICAgICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBW
OFByb3h5OjpHZXRDb250ZXh0KG1fZnJhbWUpOworICAgICAgICB2ODo6SGFuZGxlPHY4OjpDb250
ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KG1fZnJhbWUpOwogICAgICAgICAvLyBC
YWlsIG91dCBpZiB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBjb250ZXh0LgotICAgICAgICBpZiAoY29u
dGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQogICAgICAg
ICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+KCk7CiAKLSAgICAgICAgdjg6OkNv
bnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUg
c2NvcGUodjhDb250ZXh0KTsKIAogICAgICAgICAvLyBXcmFwIGZ1bmN0aW9uIGFyb3VuZCB0aGUg
ZXZlbnQgY29kZS4gIFRoZSBwYXJlbnRoZXNpcyBhcm91bmQgdGhlIGZ1bmN0aW9uIGFyZSBuZWVk
ZWQgc28gdGhhdCBldmFsdWF0aW5nIHRoZSBjb2RlIHlpZWxkcwogICAgICAgICAvLyB0aGUgZnVu
Y3Rpb24gdmFsdWUuICBXaXRob3V0IHRoZSBwYXJlbnRoZXNpcyB0aGUgZnVuY3Rpb24gdmFsdWUg
aXMgdGhyb3duIGF3YXkuCkBAIC0xMDIsMTEgKzEwMiwxMSBAQAogICAgICAgICBjb2RlLmFwcGVu
ZCgiXG59KSIpOwogCiAgICAgICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gY29kZUV4dGVybmFs
U3RyaW5nID0gdjhFeHRlcm5hbFN0cmluZyhjb2RlKTsKLSAgICAgICAgdjg6OkhhbmRsZTx2ODo6
U2NyaXB0PiBzY3JpcHQgPSBWOFByb3h5OjpDb21waWxlU2NyaXB0KGNvZGVFeHRlcm5hbFN0cmlu
ZywgbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCksIG1fbGluZU51bWJlciAtIDEpOworICAgICAg
ICB2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IHNjcmlwdCA9IFY4UHJveHk6OmNvbXBpbGVTY3JpcHQo
Y29kZUV4dGVybmFsU3RyaW5nLCBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSwgbV9saW5lTnVt
YmVyIC0gMSk7CiAgICAgICAgIGlmICghc2NyaXB0LklzRW1wdHkoKSkgewogICAgICAgICAgICAg
VjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShtX2ZyYW1lKTsKICAgICAgICAgICAg
IEFTU0VSVChwcm94eSk7Ci0gICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSA9
IHByb3h5LT5SdW5TY3JpcHQoc2NyaXB0LCBmYWxzZSk7CisgICAgICAgICAgICB2ODo6TG9jYWw8
djg6OlZhbHVlPiB2YWx1ZSA9IHByb3h5LT5ydW5TY3JpcHQoc2NyaXB0LCBmYWxzZSk7CiAgICAg
ICAgICAgICBpZiAoIXZhbHVlLklzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIEFTU0VSVCh2
YWx1ZS0+SXNGdW5jdGlvbigpKTsKICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0
aW9uPiBsaXN0ZW5lckZ1bmN0aW9uID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj46OkNhc3QodmFs
dWUpOwpAQCAtMTE0LDcgKzExNCw3IEBACiAKICAgICAgICAgICAgICAgICBtX2xpc3RlbmVyID0g
djg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uPjo6TmV3KGxpc3RlbmVyRnVuY3Rpb24pOwogI2lm
bmRlZiBOREVCVUcKLSAgICAgICAgICAgICAgICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhhbmRs
ZShFVkVOVF9MSVNURU5FUiwgdGhpcywgbV9saXN0ZW5lcik7CisgICAgICAgICAgICAgICAgVjhQ
cm94eTo6cmVnaXN0ZXJHbG9iYWxIYW5kbGUoRVZFTlRfTElTVEVORVIsIHRoaXMsIG1fbGlzdGVu
ZXIpOwogI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEzNCw3ICsxMzQsNyBA
QAogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBwYXJhbWV0ZXJzWzFdID0geyBqc0V2ZW50IH07
CiAKICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKG1fZnJhbWUpOwotICAg
IHJldHVybiBwcm94eS0+Q2FsbEZ1bmN0aW9uKGhhbmRsZXJGdW5jdGlvbiwgcmVjZWl2ZXIsIDEs
IHBhcmFtZXRlcnMpOworICAgIHJldHVybiBwcm94eS0+Y2FsbEZ1bmN0aW9uKGhhbmRsZXJGdW5j
dGlvbiwgcmVjZWl2ZXIsIDEsIHBhcmFtZXRlcnMpOwogfQogCiAKQEAgLTE1OCwxMiArMTU4LDEy
IEBACiAgICAgICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKIAogICAgICAgICAvLyBV
c2UgdGhlIG91dGVyIHNjb3BlIHRvIGhvbGQgY29udGV4dC4KLSAgICAgICAgdjg6OkhhbmRsZTx2
ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQobV9mcmFtZSk7CisgICAg
ICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQo
bV9mcmFtZSk7CiAgICAgICAgIC8vIEJhaWwgb3V0IGlmIHdlIGNhbm5vdCBnZXQgdGhlIGNvbnRl
eHQuCi0gICAgICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgaWYgKHY4Q29udGV4
dC5Jc0VtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4o
KTsKIAotICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisgICAgICAg
IHY4OjpDb250ZXh0OjpTY29wZSBzY29wZSh2OENvbnRleHQpOwogCiAgICAgICAgIC8vIEZJWE1F
OiBjYWNoZSB0aGUgd3JhcHBlciBmdW5jdGlvbi4KIApAQCAtMTg0LDExICsxODQsMTEgQEAKICAg
ICAgICAgLy8gSW5zZXJ0ICdcbicgb3RoZXJ3aXNlIC8vLXN0eWxlIGNvbW1lbnRzIGNvdWxkIGJy
ZWFrIHRoZSBoYW5kbGVyLgogICAgICAgICBjb2RlLmFwcGVuZCggICJcbn0pLmNhbGwodGhpcywg
ZXZ0KTt9fX19KSIpOwogICAgICAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IGNvZGVFeHRlcm5h
bFN0cmluZyA9IHY4RXh0ZXJuYWxTdHJpbmcoY29kZSk7Ci0gICAgICAgIHY4OjpIYW5kbGU8djg6
OlNjcmlwdD4gc2NyaXB0ID0gVjhQcm94eTo6Q29tcGlsZVNjcmlwdChjb2RlRXh0ZXJuYWxTdHJp
bmcsIG1fZnJhbWUtPmRvY3VtZW50KCktPnVybCgpLCBtX2xpbmVOdW1iZXIpOworICAgICAgICB2
ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IHNjcmlwdCA9IFY4UHJveHk6OmNvbXBpbGVTY3JpcHQoY29k
ZUV4dGVybmFsU3RyaW5nLCBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSwgbV9saW5lTnVtYmVy
KTsKICAgICAgICAgaWYgKCFzY3JpcHQuSXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBWOFByb3h5
KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKG1fZnJhbWUpOwogICAgICAgICAgICAgQVNTRVJU
KHByb3h5KTsKLSAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlID0gcHJveHkt
PlJ1blNjcmlwdChzY3JpcHQsIGZhbHNlKTsKKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFs
dWU+IHZhbHVlID0gcHJveHktPnJ1blNjcmlwdChzY3JpcHQsIGZhbHNlKTsKICAgICAgICAgICAg
IGlmICghdmFsdWUuSXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgQVNTRVJUKHZhbHVlLT5J
c0Z1bmN0aW9uKCkpOwogCkBAIC0yMTgsNyArMjE4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAK
ICNpZm5kZWYgTkRFQlVHCi0gICAgICAgICAgICAgICAgVjhQcm94eTo6UmVnaXN0ZXJHbG9iYWxI
YW5kbGUoRVZFTlRfTElTVEVORVIsIHRoaXMsIG1fd3JhcHBlZEZ1bmN0aW9uKTsKKyAgICAgICAg
ICAgICAgICBWOFByb3h5OjpyZWdpc3Rlckdsb2JhbEhhbmRsZShFVkVOVF9MSVNURU5FUiwgdGhp
cywgbV93cmFwcGVkRnVuY3Rpb24pOwogI2VuZGlmCiAgICAgICAgICAgICAgICAgbV93cmFwcGVk
RnVuY3Rpb24tPlNldE5hbWUodjg6OlN0cmluZzo6TmV3KGZyb21XZWJDb3JlU3RyaW5nKG1fZnVu
Y3Rpb25OYW1lKSwgbV9mdW5jdGlvbk5hbWUubGVuZ3RoKCkpKTsKICAgICAgICAgICAgIH0KSW5k
ZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvU2NyaXB0VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL2JpbmRpbmdzL3Y4L1NjcmlwdFZhbHVlLmgJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29y
ZS9iaW5kaW5ncy92OC9TY3JpcHRWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC01Myw3ICs1Myw3
IEBACiAKICAgICAgICAgbV92YWx1ZSA9IHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT46Ok5ldyh2
YWx1ZSk7CiAjaWZuZGVmIE5ERUJVRwotICAgICAgICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhh
bmRsZShTQ1JJUFRWQUxVRSwgdGhpcywgbV92YWx1ZSk7CisgICAgICAgIFY4UHJveHk6OnJlZ2lz
dGVyR2xvYmFsSGFuZGxlKFNDUklQVFZBTFVFLCB0aGlzLCBtX3ZhbHVlKTsKICNlbmRpZgogICAg
IH0KIApAQCAtNjQsNyArNjQsNyBAQAogCiAgICAgICAgIG1fdmFsdWUgPSB2ODo6UGVyc2lzdGVu
dDx2ODo6VmFsdWU+OjpOZXcodmFsdWUubV92YWx1ZSk7CiAjaWZuZGVmIE5ERUJVRwotICAgICAg
ICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhhbmRsZShTQ1JJUFRWQUxVRSwgdGhpcywgbV92YWx1
ZSk7CisgICAgICAgIFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxlKFNDUklQVFZBTFVFLCB0
aGlzLCBtX3ZhbHVlKTsKICNlbmRpZgogICAgIH0KIApAQCAtODAsNyArODAsNyBAQAogCiAgICAg
ICAgIG1fdmFsdWUgPSB2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+OjpOZXcodmFsdWUubV92YWx1
ZSk7CiAjaWZuZGVmIE5ERUJVRwotICAgICAgICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhhbmRs
ZShTQ1JJUFRWQUxVRSwgdGhpcywgbV92YWx1ZSk7CisgICAgICAgIFY4UHJveHk6OnJlZ2lzdGVy
R2xvYmFsSGFuZGxlKFNDUklQVFZBTFVFLCB0aGlzLCBtX3ZhbHVlKTsKICNlbmRpZgogCiAgICAg
ICAgIHJldHVybiAqdGhpczsKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgICAgICAgICAgcmV0dXJu
OwogCiAjaWZuZGVmIE5ERUJVRwotICAgICAgICBWOFByb3h5OjpVbnJlZ2lzdGVyR2xvYmFsSGFu
ZGxlKHRoaXMsIG1fdmFsdWUpOworICAgICAgICBWOFByb3h5Ojp1bnJlZ2lzdGVyR2xvYmFsSGFu
ZGxlKHRoaXMsIG1fdmFsdWUpOwogI2VuZGlmCiAgICAgICAgIG1fdmFsdWUuRGlzcG9zZSgpOwog
ICAgICAgICBtX3ZhbHVlLkNsZWFyKCk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4Q29s
bGVjdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhDb2xsZWN0aW9u
LmgJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOENvbGxlY3Rpb24u
aAkod29ya2luZyBjb3B5KQpAQCAtNDcsOCArNDcsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHY4
OjpIYW5kbGU8djg6OlZhbHVlPigpOwogICAgICAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5
cGUgdHlwZSA9IFY4Q2xhc3NJbmRleDo6RnJvbUludChpbXBsZW1lbnRhdGlvblR5cGUtPkludDMy
VmFsdWUoKSk7CiAgICAgICAgIGlmICh0eXBlID09IFY4Q2xhc3NJbmRleDo6Tk9ERSkKLSAgICAg
ICAgICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChzdGF0aWNfY2FzdDxOb2RlKj4o
aW1wbGVtZW50YXRpb24pKTsKLSAgICAgICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QodHlw
ZSwgaW1wbGVtZW50YXRpb24pOworICAgICAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRO
b2RlVG9WOE9iamVjdChzdGF0aWNfY2FzdDxOb2RlKj4oaW1wbGVtZW50YXRpb24pKTsKKyAgICAg
ICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KHR5cGUsIGltcGxlbWVudGF0aW9u
KTsKICAgICB9CiAKICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IGdldFY4T2JqZWN0KFBhc3NSZWZQdHI8VD4gaW1wbGVtZW50YXRpb24sIHY4OjpMb2Nh
bDx2ODo6VmFsdWU+IGltcGxlbWVudGF0aW9uVHlwZSkKQEAgLTYxLDEwICs2MSwxMCBAQAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4
OjpWYWx1ZT4gaW1wbGVtZW50YXRpb25UeXBlKQogICAgIHsKICAgICAgICAgLy8gRklYTUU6IGFz
c2VydCBvYmplY3QgaXMgYSBjb2xsZWN0aW9uIHR5cGUKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6
Ok1heWJlRE9NV3JhcHBlcihvYmplY3QpKTsKLSAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBw
ZXJUeXBlIHdyYXBwZXJUeXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUob2JqZWN0KTsK
KyAgICAgICAgQVNTRVJUKFY4UHJveHk6Om1heWJlRE9NV3JhcHBlcihvYmplY3QpKTsKKyAgICAg
ICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHdyYXBwZXJUeXBlID0gVjhQcm94eTo6ZG9t
V3JhcHBlclR5cGUob2JqZWN0KTsKICAgICAgICAgQVNTRVJUKHdyYXBwZXJUeXBlICE9IFY4Q2xh
c3NJbmRleDo6Tk9ERSk7Ci0gICAgICAgIENvbGxlY3Rpb24qIGNvbGxlY3Rpb24gPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgb2JqZWN0KTsKKyAgICAg
ICAgQ29sbGVjdGlvbiogY29sbGVjdGlvbiA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVj
dDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgb2JqZWN0KTsKICAgICAgICAgU3RyaW5nIHByb3Bl
cnR5TmFtZSA9IHRvV2ViQ29yZVN0cmluZyhuYW1lKTsKICAgICAgICAgcmV0dXJuIGdldFY4T2Jq
ZWN0PEl0ZW1UeXBlPihjb2xsZWN0aW9uLT5uYW1lZEl0ZW0ocHJvcGVydHlOYW1lKSwgaW1wbGVt
ZW50YXRpb25UeXBlKTsKICAgICB9CkBAIC04Nyw4ICs4Nyw4IEBACiAgICAgLy8gQSB0ZW1wbGF0
ZSBvZiBuYW1lZCBwcm9wZXJ0eSBhY2Nlc3NvciBvZiBIVE1MU2VsZWN0RWxlbWVudCBhbmQgSFRN
TEZvcm1FbGVtZW50LgogICAgIHRlbXBsYXRlPGNsYXNzIENvbGxlY3Rpb24+IHN0YXRpYyB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gbm9kZUNvbGxlY3Rpb25OYW1lZFByb3BlcnR5R2V0dGVyKHY4OjpM
b2NhbDx2ODo6U3RyaW5nPiBuYW1lLCBjb25zdCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZvKQogICAg
IHsKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6Ok1heWJlRE9NV3JhcHBlcihpbmZvLkhvbGRlcigp
KSk7Ci0gICAgICAgIEFTU0VSVChWOFByb3h5OjpHZXRET01XcmFwcGVyVHlwZShpbmZvLkhvbGRl
cigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOworICAgICAgICBBU1NFUlQoVjhQcm94eTo6bWF5
YmVET01XcmFwcGVyKGluZm8uSG9sZGVyKCkpKTsKKyAgICAgICAgQVNTRVJUKFY4UHJveHk6OmRv
bVdyYXBwZXJUeXBlKGluZm8uSG9sZGVyKCkpID09IFY4Q2xhc3NJbmRleDo6Tk9ERSk7CiAgICAg
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSA9IGluZm8uSG9sZGVyKCktPkdldFJlYWxO
YW1lZFByb3BlcnR5SW5Qcm90b3R5cGVDaGFpbihuYW1lKTsKIAogICAgICAgICBpZiAoIXZhbHVl
LklzRW1wdHkoKSkKQEAgLTEwOSwxMCArMTA5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGltcGxlbWVu
dGF0aW9uVHlwZSkKICAgICB7CiAgICAgICAgIC8vIEZJWE1FOiBBc3NlcnQgdGhhdCBvYmplY3Qg
bXVzdCBiZSBhIGNvbGxlY3Rpb24gdHlwZS4KLSAgICAgICAgQVNTRVJUKFY4UHJveHk6Ok1heWJl
RE9NV3JhcHBlcihvYmplY3QpKTsKLSAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBl
IHdyYXBwZXJUeXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUob2JqZWN0KTsKKyAgICAg
ICAgQVNTRVJUKFY4UHJveHk6Om1heWJlRE9NV3JhcHBlcihvYmplY3QpKTsKKyAgICAgICAgVjhD
bGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHdyYXBwZXJUeXBlID0gVjhQcm94eTo6ZG9tV3JhcHBl
clR5cGUob2JqZWN0KTsKICAgICAgICAgQVNTRVJUKHdyYXBwZXJUeXBlICE9IFY4Q2xhc3NJbmRl
eDo6Tk9ERSk7Ci0gICAgICAgIENvbGxlY3Rpb24qIGNvbGxlY3Rpb24gPSBWOFByb3h5OjpUb05h
dGl2ZU9iamVjdDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgb2JqZWN0KTsKKyAgICAgICAgQ29s
bGVjdGlvbiogY29sbGVjdGlvbiA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDb2xs
ZWN0aW9uPih3cmFwcGVyVHlwZSwgb2JqZWN0KTsKICAgICAgICAgcmV0dXJuIGdldFY4T2JqZWN0
PEl0ZW1UeXBlPihjb2xsZWN0aW9uLT5pdGVtKGluZGV4KSwgaW1wbGVtZW50YXRpb25UeXBlKTsK
ICAgICB9CiAKQEAgLTEyNSw5ICsxMjUsOSBAQAogICAgIC8vIEEgdGVtcGxhdGUgb2YgaW5kZXgg
aW50ZXJjZXB0b3Igb2YgSFRNTFNlbGVjdEVsZW1lbnQgYW5kIEhUTUxGb3JtRWxlbWVudC4KICAg
ICB0ZW1wbGF0ZTxjbGFzcyBDb2xsZWN0aW9uPiBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+
IG5vZGVDb2xsZWN0aW9uSW5kZXhlZFByb3BlcnR5R2V0dGVyKHVpbnQzMl90IGluZGV4LCBjb25z
dCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZvKQogICAgIHsKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6
Ok1heWJlRE9NV3JhcHBlcihpbmZvLkhvbGRlcigpKSk7Ci0gICAgICAgIEFTU0VSVChWOFByb3h5
OjpHZXRET01XcmFwcGVyVHlwZShpbmZvLkhvbGRlcigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUp
OwotICAgICAgICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6RE9NV3JhcHBlclRv
Tm9kZTxDb2xsZWN0aW9uPihpbmZvLkhvbGRlcigpKTsKKyAgICAgICAgQVNTRVJUKFY4UHJveHk6
Om1heWJlRE9NV3JhcHBlcihpbmZvLkhvbGRlcigpKSk7CisgICAgICAgIEFTU0VSVChWOFByb3h5
Ojpkb21XcmFwcGVyVHlwZShpbmZvLkhvbGRlcigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOwor
ICAgICAgICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBw
ZXJUb05vZGU8Q29sbGVjdGlvbj4oaW5mby5Ib2xkZXIoKSk7CiAgICAgICAgIHZvaWQqIGltcGxl
bWVudGF0aW9uID0gY29sbGVjdGlvbi0+aXRlbShpbmRleCk7CiAgICAgICAgIHJldHVybiBnZXRW
OE9iamVjdChpbXBsZW1lbnRhdGlvbiwgaW5mby5EYXRhKCkpOwogICAgIH0KQEAgLTEzNSw5ICsx
MzUsOSBAQAogICAgIC8vIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBpbmRl
eGVkIHByb3BlcnRpZXMgb2YgSFRNTFNlbGVjdEVsZW1lbnQgYW5kIEhUTUxGb3JtRWxlbWVudC4K
ICAgICB0ZW1wbGF0ZTxjbGFzcyBDb2xsZWN0aW9uPiBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6QXJy
YXk+IG5vZGVDb2xsZWN0aW9uSW5kZXhlZFByb3BlcnR5RW51bWVyYXRvcihjb25zdCB2ODo6QWNj
ZXNzb3JJbmZvJiBpbmZvKQogICAgIHsKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6Ok1heWJlRE9N
V3JhcHBlcihpbmZvLkhvbGRlcigpKSk7Ci0gICAgICAgIEFTU0VSVChWOFByb3h5OjpHZXRET01X
cmFwcGVyVHlwZShpbmZvLkhvbGRlcigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOwotICAgICAg
ICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxDb2xs
ZWN0aW9uPihpbmZvLkhvbGRlcigpKTsKKyAgICAgICAgQVNTRVJUKFY4UHJveHk6Om1heWJlRE9N
V3JhcHBlcihpbmZvLkhvbGRlcigpKSk7CisgICAgICAgIEFTU0VSVChWOFByb3h5Ojpkb21XcmFw
cGVyVHlwZShpbmZvLkhvbGRlcigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOworICAgICAgICBD
b2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8
Q29sbGVjdGlvbj4oaW5mby5Ib2xkZXIoKSk7CiAgICAgICAgIGludCBsZW5ndGggPSBjb2xsZWN0
aW9uLT5sZW5ndGgoKTsKICAgICAgICAgdjg6OkhhbmRsZTx2ODo6QXJyYXk+IHByb3BlcnRpZXMg
PSB2ODo6QXJyYXk6Ok5ldyhsZW5ndGgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxl
bmd0aDsgKytpKSB7CkBAIC0xNTEsOSArMTUxLDkgQEAKICAgICAvLyBHZXQgYW4gYXJyYXkgY29u
dGFpbmluZyB0aGUgbmFtZXMgb2YgaW5kZXhlZCBwcm9wZXJ0aWVzIGluIGEgY29sbGVjdGlvbi4K
ICAgICB0ZW1wbGF0ZTxjbGFzcyBDb2xsZWN0aW9uPiBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6QXJy
YXk+IGNvbGxlY3Rpb25JbmRleGVkUHJvcGVydHlFbnVtZXJhdG9yKGNvbnN0IHY4OjpBY2Nlc3Nv
ckluZm8mIGluZm8pCiAgICAgewotICAgICAgICBBU1NFUlQoVjhQcm94eTo6TWF5YmVET01XcmFw
cGVyKGluZm8uSG9sZGVyKCkpKTsKLSAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBl
IHdyYXBwZXJUeXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUoaW5mby5Ib2xkZXIoKSk7
Ci0gICAgICAgIENvbGxlY3Rpb24qIGNvbGxlY3Rpb24gPSBWOFByb3h5OjpUb05hdGl2ZU9iamVj
dDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgaW5mby5Ib2xkZXIoKSk7CisgICAgICAgIEFTU0VS
VChWOFByb3h5OjptYXliZURPTVdyYXBwZXIoaW5mby5Ib2xkZXIoKSkpOworICAgICAgICBWOENs
YXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgd3JhcHBlclR5cGUgPSBWOFByb3h5Ojpkb21XcmFwcGVy
VHlwZShpbmZvLkhvbGRlcigpKTsKKyAgICAgICAgQ29sbGVjdGlvbiogY29sbGVjdGlvbiA9IFY4
UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgaW5m
by5Ib2xkZXIoKSk7CiAgICAgICAgIGludCBsZW5ndGggPSBjb2xsZWN0aW9uLT5sZW5ndGgoKTsK
ICAgICAgICAgdjg6OkhhbmRsZTx2ODo6QXJyYXk+IHByb3BlcnRpZXMgPSB2ODo6QXJyYXk6Ok5l
dyhsZW5ndGgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CkBA
IC0xNjksOSArMTY5LDkgQEAKICAgICB0ZW1wbGF0ZTxjbGFzcyBDb2xsZWN0aW9uPiBzdGF0aWMg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbGxlY3Rpb25TdHJpbmdPck51bGxJbmRleGVkUHJvcGVy
dHlHZXR0ZXIodWludDMyX3QgaW5kZXgsIGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pCiAg
ICAgewogICAgICAgICAvLyBGSVhNRTogYXNzZXJ0IHRoYXQgb2JqZWN0IG11c3QgYmUgYSBjb2xs
ZWN0aW9uIHR5cGUKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6Ok1heWJlRE9NV3JhcHBlcihpbmZv
LkhvbGRlcigpKSk7Ci0gICAgICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB3cmFwcGVy
VHlwZSA9IFY4UHJveHk6OkdldERPTVdyYXBwZXJUeXBlKGluZm8uSG9sZGVyKCkpOwotICAgICAg
ICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q29sbGVj
dGlvbj4od3JhcHBlclR5cGUsIGluZm8uSG9sZGVyKCkpOworICAgICAgICBBU1NFUlQoVjhQcm94
eTo6bWF5YmVET01XcmFwcGVyKGluZm8uSG9sZGVyKCkpKTsKKyAgICAgICAgVjhDbGFzc0luZGV4
OjpWOFdyYXBwZXJUeXBlIHdyYXBwZXJUeXBlID0gVjhQcm94eTo6ZG9tV3JhcHBlclR5cGUoaW5m
by5Ib2xkZXIoKSk7CisgICAgICAgIENvbGxlY3Rpb24qIGNvbGxlY3Rpb24gPSBWOFByb3h5Ojpj
b252ZXJ0VG9OYXRpdmVPYmplY3Q8Q29sbGVjdGlvbj4od3JhcHBlclR5cGUsIGluZm8uSG9sZGVy
KCkpOwogICAgICAgICBTdHJpbmcgcmVzdWx0ID0gY29sbGVjdGlvbi0+aXRlbShpbmRleCk7CiAg
ICAgICAgIHJldHVybiB2OFN0cmluZ09yTnVsbChyZXN1bHQpOwogICAgIH0KSW5kZXg6IFdlYkNv
cmUvYmluZGluZ3MvdjgvU2NyaXB0T2JqZWN0UXVhcmFudGluZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9iaW5kaW5ncy92OC9TY3JpcHRPYmplY3RRdWFyYW50aW5lLmNwcAkocmV2aXNpb24g
NDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjcmlwdE9iamVjdFF1YXJhbnRpbmUuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC03NywxMCArNzcsMTAgQEAKICAgICBBU1NFUlQobm9kZSk7CiAK
ICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7Ci0gICAgdjg6OkxvY2FsPHY4OjpDb250
ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChub2RlLT5kb2N1bWVudCgpLT5wYWdl
KCktPm1haW5GcmFtZSgpKTsKKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBW
OFByb3h5Ojpjb250ZXh0KG5vZGUtPmRvY3VtZW50KCktPnBhZ2UoKS0+bWFpbkZyYW1lKCkpOwog
ICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKIAotICAgIHY4OjpIYW5kbGU8
djg6OlZhbHVlPiB2OE5vZGUgPSBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChub2RlKTsKKyAgICB2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdjhOb2RlID0gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2Jq
ZWN0KG5vZGUpOwogICAgIHF1YXJhbnRpbmVkT2JqZWN0ID0gU2NyaXB0T2JqZWN0KHY4OjpMb2Nh
bDx2ODo6T2JqZWN0Pih2ODo6T2JqZWN0OjpDYXN0KCp2OE5vZGUpKSk7CiAKICAgICByZXR1cm4g
dHJ1ZTsKQEAgLTkxLDEwICs5MSwxMCBAQAogICAgIEFTU0VSVChkb21XaW5kb3cpOwogCiAgICAg
djg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4g
Y29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQoZG9tV2luZG93LT5mcmFtZSgpKTsKKyAgICB2
ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KGRvbVdpbmRv
dy0+ZnJhbWUoKSk7CiAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOwogCi0g
ICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHY4RG9tV2luZG93ID0gVjhQcm94eTo6VG9WOE9iamVj
dChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgZG9tV2luZG93KTsKKyAgICB2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4gdjhEb21XaW5kb3cgPSBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVywgZG9tV2luZG93KTsKICAgICBxdWFyYW50aW5lZE9iamVjdCA9IFNj
cmlwdE9iamVjdCh2ODo6TG9jYWw8djg6Ok9iamVjdD4odjg6Ok9iamVjdDo6Q2FzdCgqdjhEb21X
aW5kb3cpKSk7CiAKICAgICByZXR1cm4gdHJ1ZTsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mvdjgv
U2NyaXB0Q2FsbFN0YWNrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Nj
cmlwdENhbGxTdGFjay5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92
OC9TY3JpcHRDYWxsU3RhY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICszOSw3IEBACiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKIFNjcmlwdENhbGxTdGFjazo6U2NyaXB0Q2FsbFN0YWNrKGNv
bnN0IHY4OjpBcmd1bWVudHMmIGFyZ3VtZW50cywgdW5zaWduZWQgc2tpcEFyZ3VtZW50Q291bnQp
Ci0gICAgOiBtX2xhc3RDYWxsZXIoU3RyaW5nKCksIFY4UHJveHk6OkdldFNvdXJjZU5hbWUoKSwg
VjhQcm94eTo6R2V0U291cmNlTGluZU51bWJlcigpICsgMSwgYXJndW1lbnRzLCBza2lwQXJndW1l
bnRDb3VudCkKKyAgICA6IG1fbGFzdENhbGxlcihTdHJpbmcoKSwgVjhQcm94eTo6c291cmNlTmFt
ZSgpLCBWOFByb3h5Ojpzb3VyY2VMaW5lTnVtYmVyKCkgKyAxLCBhcmd1bWVudHMsIHNraXBBcmd1
bWVudENvdW50KQogICAgICwgbV9zY3JpcHRTdGF0ZShuZXcgU2NyaXB0U3RhdGUoVjhQcm94eTo6
cmV0cmlldmVGcmFtZSgpKSkKIHsKIH0KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvU2NyaXB0
T2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjcmlwdE9iamVj
dC5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9TY3JpcHRPYmpl
Y3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTksNyArMTE5LDcgQEAKIGJvb2wgU2NyaXB0R2xv
YmFsT2JqZWN0OjpzZXQoU2NyaXB0U3RhdGUqIHNjcmlwdFN0YXRlLCBjb25zdCBjaGFyKiBuYW1l
LCBJbnNwZWN0b3JDb250cm9sbGVyKiB2YWx1ZSkKIHsKICAgICBTY3JpcHRTY29wZSBzY29wZShz
Y3JpcHRTdGF0ZSk7Ci0gICAgc2NvcGUuZ2xvYmFsKCktPlNldCh2ODo6U3RyaW5nOjpOZXcobmFt
ZSksIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVS
LCB2YWx1ZSkpOworICAgIHNjb3BlLmdsb2JhbCgpLT5TZXQodjg6OlN0cmluZzo6TmV3KG5hbWUp
LCBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OklOU1BFQ1RPUkNPTlRS
T0xMRVIsIHZhbHVlKSk7CiAgICAgcmV0dXJuIHNjb3BlLnN1Y2Nlc3MoKTsKIH0KIApJbmRleDog
V2ViQ29yZS9iaW5kaW5ncy92OC9WOE9iamVjdEV2ZW50TGlzdGVuZXIuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhPYmplY3RFdmVudExpc3RlbmVyLmNwcAkocmV2aXNp
b24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4T2JqZWN0RXZlbnRMaXN0ZW5lci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICBpZiAoZnJhbWUpIHsKICAg
ICAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShmcmFtZSk7CiAgICAgICAg
IGlmIChwcm94eSkKLSAgICAgICAgICAgIHByb3h5LT5SZW1vdmVPYmplY3RFdmVudExpc3RlbmVy
KGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHByb3h5LT5yZW1vdmVPYmplY3RFdmVudExpc3RlbmVy
KGxpc3RlbmVyKTsKIAogICAgICAgICAvLyBCZWNhdXNlIHRoZSBsaXN0ZW5lciBpcyBubyBsb25n
ZXIgaW4gdGhlIGxpc3QsIGl0IG11c3QgYmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIGZyYW1lIHRv
IGF2b2lkIGRhbmdsaW5nIGZyYW1lIHBvaW50ZXIKICAgICAgICAgLy8gaW4gdGhlIGRlc3RydWN0
b3IuCkBAIC02Niw3ICs2Niw3IEBACiAgICAgICAgIEFTU0VSVCghbV9saXN0ZW5lci5Jc0VtcHR5
KCkpOwogICAgICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKG1fZnJhbWUp
OwogICAgICAgICBpZiAocHJveHkpCi0gICAgICAgICAgICBwcm94eS0+UmVtb3ZlT2JqZWN0RXZl
bnRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIHByb3h5LT5yZW1vdmVPYmplY3RFdmVudExp
c3RlbmVyKHRoaXMpOwogICAgIH0KIAogICAgIGRpc3Bvc2VMaXN0ZW5lck9iamVjdCgpOwpJbmRl
eDogV2ViQ29yZS9iaW5kaW5ncy92OC9TY2hlZHVsZWRBY3Rpb24uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvYmluZGluZ3MvdjgvU2NoZWR1bGVkQWN0aW9uLmNwcAkocmV2aXNpb24gNDUwOTUp
CisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjaGVkdWxlZEFjdGlvbi5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTUwLDcgKzUwLDcgQEAKICAgICBtX2Z1bmN0aW9uID0gdjg6OlBlcnNpc3RlbnQ8djg6
OkZ1bmN0aW9uPjo6TmV3KGZ1bmMpOwogCiAjaWZuZGVmIE5ERUJVRwotICAgIFY4UHJveHk6OlJl
Z2lzdGVyR2xvYmFsSGFuZGxlKFNDSEVEVUxFRF9BQ1RJT04sIHRoaXMsIG1fZnVuY3Rpb24pOwor
ICAgIFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxlKFNDSEVEVUxFRF9BQ1RJT04sIHRoaXMs
IG1fZnVuY3Rpb24pOwogI2VuZGlmCiAKICAgICBtX2FyZ2MgPSBhcmdjOwpAQCAtNjAsNyArNjAs
NyBAQAogICAgICAgICAgICAgbV9hcmd2W2ldID0gdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPjo6
TmV3KGFyZ3ZbaV0pOwogCiAjaWZuZGVmIE5ERUJVRwotICAgIFY4UHJveHk6OlJlZ2lzdGVyR2xv
YmFsSGFuZGxlKFNDSEVEVUxFRF9BQ1RJT04sIHRoaXMsIG1fYXJndltpXSk7CisgICAgVjhQcm94
eTo6cmVnaXN0ZXJHbG9iYWxIYW5kbGUoU0NIRURVTEVEX0FDVElPTiwgdGhpcywgbV9hcmd2W2ld
KTsKICNlbmRpZgogICAgICAgICB9CiAgICAgfSBlbHNlCkBAIC03MywxMyArNzMsMTMgQEAKICAg
ICAgICAgcmV0dXJuOwogCiAjaWZuZGVmIE5ERUJVRwotICAgIFY4UHJveHk6OlVucmVnaXN0ZXJH
bG9iYWxIYW5kbGUodGhpcywgbV9mdW5jdGlvbik7CisgICAgVjhQcm94eTo6dW5yZWdpc3Rlckds
b2JhbEhhbmRsZSh0aGlzLCBtX2Z1bmN0aW9uKTsKICNlbmRpZgogICAgIG1fZnVuY3Rpb24uRGlz
cG9zZSgpOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2FyZ2M7IGkrKykgewogI2lmbmRl
ZiBOREVCVUcKLSAgICAgICAgVjhQcm94eTo6VW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBt
X2FyZ3ZbaV0pOworICAgICAgICBWOFByb3h5Ojp1bnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMs
IG1fYXJndltpXSk7CiAjZW5kaWYKICAgICAgICAgbV9hcmd2W2ldLkRpc3Bvc2UoKTsKICAgICB9
CkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICBBU1NFUlQocHJveHkpOwogCiAgICAgdjg6OkhhbmRs
ZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gdjhDb250ZXh0
ID0gcHJveHktPkdldENvbnRleHQoKTsKKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHY4Q29u
dGV4dCA9IHByb3h5LT5jb250ZXh0KCk7CiAgICAgaWYgKHY4Q29udGV4dC5Jc0VtcHR5KCkpCiAg
ICAgICAgIHJldHVybjsgLy8gSlMgbWF5IG5vdCBiZSBlbmFibGVkLgogCkBAIC0xMTYsNyArMTE2
LDcgQEAKIAogICAgIC8vIEZJWE1FOiBOZWVkIHRvIGltcGxlbWVudCB0aW1lb3V0cyBmb3IgcHJl
ZW1wdGluZyBhIGxvbmctcnVubmluZyBzY3JpcHQuCiAgICAgaWYgKCFtX2Z1bmN0aW9uLklzRW1w
dHkoKSAmJiBtX2Z1bmN0aW9uLT5Jc0Z1bmN0aW9uKCkpIHsKLSAgICAgICAgcHJveHktPkNhbGxG
dW5jdGlvbih2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+OjpDYXN0KG1fZnVuY3Rpb24pLCB2
OENvbnRleHQtPkdsb2JhbCgpLCBtX2FyZ2MsIG1fYXJndik7CisgICAgICAgIHByb3h5LT5jYWxs
RnVuY3Rpb24odjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uPjo6Q2FzdChtX2Z1bmN0aW9uKSwg
djhDb250ZXh0LT5HbG9iYWwoKSwgbV9hcmdjLCBtX2FyZ3YpOwogICAgICAgICBEb2N1bWVudDo6
dXBkYXRlU3R5bGVGb3JBbGxEb2N1bWVudHMoKTsKICAgICB9IGVsc2UKICAgICAgICAgcHJveHkt
PmV2YWx1YXRlKG1fY29kZSwgMCk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4UHJveHku
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhQcm94eS5jcHAJKHJldmlz
aW9uIDApCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4UHJveHkuY3BwCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDYzNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisg
KiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0
aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250
cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2
ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
VjhQcm94eS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxpdHk+Cisj
aW5jbHVkZSA8djguaD4KKyNpbmNsdWRlIDx2OC1kZWJ1Zy5oPgorI2luY2x1ZGUgPHd0Zi9Bc3Nl
cnRpb25zLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9V
bnVzZWRQYXJhbS5oPgorCisjaW5jbHVkZSAiQ2hyb21pdW1CcmlkZ2UuaCIKKyNpbmNsdWRlICJD
U1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbi5oIgorI2luY2x1ZGUgIkRPTU9iamVjdHNJbmNsdWRl
LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJTY3JpcHRDb250cm9s
bGVyLmgiCisjaW5jbHVkZSAiVjhCaW5kaW5nLmgiCisjaW5jbHVkZSAiVjhDb2xsZWN0aW9uLmgi
CisjaW5jbHVkZSAiVjhDdXN0b21CaW5kaW5nLmgiCisjaW5jbHVkZSAiVjhET01NYXAuaCIKKyNp
bmNsdWRlICJWOERPTVdpbmRvdy5oIgorI2luY2x1ZGUgIlY4SW5kZXguaCIKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCisvLyBTdGF0aWMgdXRpbGl0eSBjb250ZXh0Lgordjg6OlBlcnNpc3RlbnQ8
djg6OkNvbnRleHQ+IFY4UHJveHk6Om1fdXRpbGl0eUNvbnRleHQ7CisKKy8vIFN0YXRpYyBsaXN0
IG9mIHJlZ2lzdGVyZWQgZXh0ZW5zaW9ucworVjhFeHRlbnNpb25MaXN0IFY4UHJveHk6Om1fZXh0
ZW5zaW9uczsKKworY29uc3QgY2hhciogVjhQcm94eTo6a0NvbnRleHREZWJ1Z0RhdGFUeXBlID0g
InR5cGUiOworY29uc3QgY2hhciogVjhQcm94eTo6a0NvbnRleHREZWJ1Z0RhdGFWYWx1ZSA9ICJ2
YWx1ZSI7CisKKyNpZm5kZWYgTkRFQlVHCisvLyBLZWVwcyB0cmFjayBvZiBnbG9iYWwgaGFuZGxl
cyBjcmVhdGVkIChub3QgSlMgd3JhcHBlcnMKKy8vIG9mIERPTSBvYmplY3RzKS4gT2Z0ZW4gdGhl
c2UgZ2xvYmFsIGhhbmRsZXMgYXJlIHNvdXJjZQorLy8gb2YgbGVha3MuCisvLworLy8gSWYgeW91
IHdhbnQgdG8gbGV0IGEgQysrIG9iamVjdCBob2xkIGEgcGVyc2lzdGVudCBoYW5kbGUKKy8vIHRv
IGEgSlMgb2JqZWN0LCB5b3Ugc2hvdWxkIHJlZ2lzdGVyIHRoZSBoYW5kbGUgaGVyZSB0bworLy8g
a2VlcCB0cmFjayBvZiBsZWFrcy4KKy8vCisvLyBXaGVuIGNyZWF0aW5nIGEgcGVyc2lzdGVudCBo
YW5kbGUsIGNhbGw6CisvLworLy8gI2lmbmRlZiBOREVCVUcKKy8vICAgIFY4UHJveHk6OnJlZ2lz
dGVyR2xvYmFsSGFuZGxlKHR5cGUsIGhvc3QsIGhhbmRsZSk7CisvLyAjZW5kaWYKKy8vCisvLyBX
aGVuIHJlbGVhc2luZyB0aGUgaGFuZGxlLCBjYWxsOgorLy8KKy8vICNpZm5kZWYgTkRFQlVHCisv
LyAgICBWOFByb3h5Ojp1bnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHR5cGUsIGhvc3QsIGhhbmRsZSk7
CisvLyAjZW5kaWYKKy8vCit0eXBlZGVmIEhhc2hNYXA8djg6OlZhbHVlKiwgR2xvYmFsSGFuZGxl
SW5mbyo+IEdsb2JhbEhhbmRsZU1hcDsKKworc3RhdGljIEdsb2JhbEhhbmRsZU1hcCYgZ2xvYmFs
SGFuZGxlTWFwKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEdsb2JhbEhhbmRsZU1hcCwg
c3RhdGljR2xvYmFsSGFuZGxlTWFwLCAoKSk7CisgICAgcmV0dXJuIHN0YXRpY0dsb2JhbEhhbmRs
ZU1hcDsKK30KKworLy8gVGhlIGZ1bmN0aW9uIGlzIHRoZSBwbGFjZSB0byBzZXQgdGhlIGJyZWFr
IHBvaW50IHRvIGluc3BlY3QKKy8vIGxpdmUgZ2xvYmFsIGhhbmRsZXMuIExlYWtzIGFyZSBvZnRl
biBjb21lIGZyb20gbGVha2VkIGdsb2JhbCBoYW5kbGVzLgorc3RhdGljIHZvaWQgZW51bWVyYXRl
R2xvYmFsSGFuZGxlcygpCit7CisgICAgZm9yIChHbG9iYWxIYW5kbGVNYXA6Oml0ZXJhdG9yIGl0
ID0gZ2xvYmFsSGFuZGxlTWFwKCkuYmVnaW4oKSwgZW5kID0gZ2xvYmFsSGFuZGxlTWFwKCkuZW5k
KCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBHbG9iYWxIYW5kbGVJbmZvKiBpbmZvID0g
aXQtPnNlY29uZDsKKyAgICAgICAgVU5VU0VEX1BBUkFNKGluZm8pOworICAgICAgICB2ODo6VmFs
dWUqIGhhbmRsZSA9IGl0LT5maXJzdDsKKyAgICAgICAgVU5VU0VEX1BBUkFNKGhhbmRsZSk7Cisg
ICAgfQorfQorCit2b2lkIFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxlKEdsb2JhbEhhbmRs
ZVR5cGUgdHlwZSwgdm9pZCogaG9zdCwgdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiBoYW5kbGUp
Cit7CisgICAgQVNTRVJUKCFnbG9iYWxIYW5kbGVNYXAoKS5jb250YWlucygqaGFuZGxlKSk7Cisg
ICAgZ2xvYmFsSGFuZGxlTWFwKCkuc2V0KCpoYW5kbGUsIG5ldyBHbG9iYWxIYW5kbGVJbmZvKGhv
c3QsIHR5cGUpKTsKK30KKwordm9pZCBWOFByb3h5Ojp1bnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHZv
aWQqIGhvc3QsIHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gaGFuZGxlKQoreworICAgIEFTU0VS
VChnbG9iYWxIYW5kbGVNYXAoKS5jb250YWlucygqaGFuZGxlKSk7CisgICAgR2xvYmFsSGFuZGxl
SW5mbyogaW5mbyA9IGdsb2JhbEhhbmRsZU1hcCgpLnRha2UoKmhhbmRsZSk7CisgICAgQVNTRVJU
KGluZm8tPmhvc3RfID09IGhvc3QpOworICAgIGRlbGV0ZSBpbmZvOworfQorI2VuZGlmIC8vIGlm
bmRlZiBOREVCVUcKKwordm9pZCBiYXRjaENvbmZpZ3VyZUF0dHJpYnV0ZXModjg6OkhhbmRsZTx2
ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlLCB2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0
ZT4gcHJvdG8sIGNvbnN0IEJhdGNoZWRBdHRyaWJ1dGUqIGF0dHJpYnV0ZXMsIHNpemVfdCBhdHRy
aWJ1dGVDb3VudCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF0dHJpYnV0ZUNvdW50
OyArK2kpIHsKKyAgICAgICAgY29uc3QgQmF0Y2hlZEF0dHJpYnV0ZSogYXR0cmlidXRlID0gJmF0
dHJpYnV0ZXNbaV07CisgICAgICAgIChhdHRyaWJ1dGUtPm9uUHJvdG8gPyBwcm90byA6IGluc3Rh
bmNlKS0+U2V0QWNjZXNzb3Iodjg6OlN0cmluZzo6TmV3KGF0dHJpYnV0ZS0+bmFtZSksCisgICAg
ICAgICAgICBhdHRyaWJ1dGUtPmdldHRlciwKKyAgICAgICAgICAgIGF0dHJpYnV0ZS0+c2V0dGVy
LAorICAgICAgICAgICAgYXR0cmlidXRlLT5kYXRhID09IFY4Q2xhc3NJbmRleDo6SU5WQUxJRF9D
TEFTU19JTkRFWCA/IHY4OjpIYW5kbGU8djg6OlZhbHVlPigpIDogdjg6OkludGVnZXI6Ok5ldyhW
OENsYXNzSW5kZXg6OlRvSW50KGF0dHJpYnV0ZS0+ZGF0YSkpLAorICAgICAgICAgICAgYXR0cmli
dXRlLT5zZXR0aW5ncywKKyAgICAgICAgICAgIGF0dHJpYnV0ZS0+YXR0cmlidXRlKTsKKyAgICB9
Cit9CisKK3ZvaWQgYmF0Y2hDb25maWd1cmVDb25zdGFudHModjg6OkhhbmRsZTx2ODo6RnVuY3Rp
b25UZW1wbGF0ZT4gZnVuY3Rpb25EZXNjcmlwdG9yLCB2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1w
bGF0ZT4gcHJvdG8sIGNvbnN0IEJhdGNoZWRDb25zdGFudCogY29uc3RhbnRzLCBzaXplX3QgY29u
c3RhbnRDb3VudCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbnN0YW50Q291bnQ7
ICsraSkgeworICAgICAgICBjb25zdCBCYXRjaGVkQ29uc3RhbnQqIGNvbnN0YW50ID0gJmNvbnN0
YW50c1tpXTsKKyAgICAgICAgZnVuY3Rpb25EZXNjcmlwdG9yLT5TZXQodjg6OlN0cmluZzo6TmV3
KGNvbnN0YW50LT5uYW1lKSwgdjg6OkludGVnZXI6Ok5ldyhjb25zdGFudC0+dmFsdWUpLCB2ODo6
UmVhZE9ubHkpOworICAgICAgICBwcm90by0+U2V0KHY4OjpTdHJpbmc6Ok5ldyhjb25zdGFudC0+
bmFtZSksIHY4OjpJbnRlZ2VyOjpOZXcoY29uc3RhbnQtPnZhbHVlKSwgdjg6OlJlYWRPbmx5KTsK
KyAgICB9Cit9CisKK3R5cGVkZWYgSGFzaE1hcDxOb2RlKiwgdjg6Ok9iamVjdCo+IERPTU5vZGVN
YXA7Cit0eXBlZGVmIEhhc2hNYXA8dm9pZCosIHY4OjpPYmplY3QqPiBET01PYmplY3RNYXA7CisK
KyNpZm5kZWYgTkRFQlVHCitzdGF0aWMgdm9pZCBlbnVtZXJhdGVET01PYmplY3RNYXAoRE9NT2Jq
ZWN0TWFwJiB3cmFwcGVyTWFwKQoreworICAgIGZvciAoRE9NT2JqZWN0TWFwOjppdGVyYXRvciBp
dCA9IHdyYXBwZXJNYXAuYmVnaW4oKSwgZW5kID0gd3JhcHBlck1hcC5lbmQoKTsgaXQgIT0gZW5k
OyArK2l0KSB7CisgICAgICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdyYXBwZXIoaXQt
PnNlY29uZCk7CisgICAgICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQ
cm94eTo6ZG9tV3JhcHBlclR5cGUod3JhcHBlcik7CisgICAgICAgIHZvaWQqIG9iamVjdCA9IGl0
LT5maXJzdDsKKyAgICAgICAgVU5VU0VEX1BBUkFNKHR5cGUpOworICAgICAgICBVTlVTRURfUEFS
QU0ob2JqZWN0KTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgZW51bWVyYXRlRE9NTm9kZU1h
cChET01Ob2RlTWFwJiBub2RlTWFwKQoreworICAgIGZvciAoRE9NTm9kZU1hcDo6aXRlcmF0b3Ig
aXQgPSBub2RlTWFwLmJlZ2luKCksIGVuZCA9IG5vZGVNYXAuZW5kKCk7IGl0ICE9IGVuZDsgKytp
dCkgeworICAgICAgICBOb2RlKiBub2RlID0gaXQtPmZpcnN0OworICAgICAgICBVTlVTRURfUEFS
QU0obm9kZSk7CisgICAgICAgIEFTU0VSVCh2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PihpdC0+
c2Vjb25kKS5Jc1dlYWsoKSk7CisgICAgfQorfQorI2VuZGlmIC8vIE5ERUJVRworCisjaWYgRU5B
QkxFKFNWRykKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpjb252ZXJ0U1ZHRWxlbWVu
dEluc3RhbmNlVG9WOE9iamVjdChTVkdFbGVtZW50SW5zdGFuY2UqIGluc3RhbmNlKQoreworICAg
IGlmICghaW5zdGFuY2UpCisgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisgICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiBleGlzdGluZ0luc3RhbmNlID0gZ2V0RE9NU1ZHRWxlbWVudEluc3Rh
bmNlTWFwKCkuZ2V0KGluc3RhbmNlKTsKKyAgICBpZiAoIWV4aXN0aW5nSW5zdGFuY2UuSXNFbXB0
eSgpKQorICAgICAgICByZXR1cm4gZXhpc3RpbmdJbnN0YW5jZTsKKworICAgIGluc3RhbmNlLT5y
ZWYoKTsKKworICAgIC8vIEluc3RhbnRpYXRlIHRoZSBWOCBvYmplY3QgYW5kIHJlbWVtYmVyIGl0
CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiByZXN1bHQgPSBpbnN0YW50aWF0ZVY4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6U1ZHRUxFTUVOVElOU1RBTkNFLCBWOENsYXNzSW5kZXg6OlNWR0VMRU1F
TlRJTlNUQU5DRSwgaW5zdGFuY2UpOworICAgIGlmICghcmVzdWx0LklzRW1wdHkoKSkgeworICAg
ICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgRE9NIFNWRyBlbGVtZW50IG1hcCBpZiB0aGUgcmVzdWx0
IGlzIG5vbi1lbXB0eS4KKyAgICAgICAgZ2V0RE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwKCkuc2V0
KGluc3RhbmNlLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHJlc3VsdCkpOworICAg
IH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBNYXAgb2YgU1ZHIG9iamVjdHMgd2l0aCBj
b250ZXh0cyB0byB0aGVpciBjb250ZXh0cworc3RhdGljIEhhc2hNYXA8dm9pZCosIFNWR0VsZW1l
bnQqPiYgc3ZnT2JqZWN0VG9Db250ZXh0TWFwKCkKK3sKKyAgICB0eXBlZGVmIEhhc2hNYXA8dm9p
ZCosIFNWR0VsZW1lbnQqPiBTdmdPYmplY3RUb0NvbnRleHRNYXA7CisgICAgREVGSU5FX1NUQVRJ
Q19MT0NBTChTdmdPYmplY3RUb0NvbnRleHRNYXAsIHN0YXRpY1N2Z09iamVjdFRvQ29udGV4dE1h
cCwgKCkpOworICAgIHJldHVybiBzdGF0aWNTdmdPYmplY3RUb0NvbnRleHRNYXA7Cit9CisKK3Y4
OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpjb252ZXJ0U1ZHT2JqZWN0V2l0aENvbnRleHRU
b1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBvYmplY3Qp
Cit7CisgICAgaWYgKCFvYmplY3QpCisgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisgICAg
djg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gcmVzdWx0ID0gZ2V0RE9NU1ZHT2JqZWN0V2l0aENv
bnRleHRNYXAoKS5nZXQob2JqZWN0KTsKKyAgICBpZiAoIXJlc3VsdC5Jc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAvLyBTcGVjaWFsIGNhc2U6IFNWR1BhdGhTZWdzIG5l
ZWQgdG8gYmUgZG93bmNhc3QgdG8gdGhlaXIgcmVhbCB0eXBlCisgICAgaWYgKHR5cGUgPT0gVjhD
bGFzc0luZGV4OjpTVkdQQVRIU0VHKQorICAgICAgICB0eXBlID0gVjhDdXN0b206OkRvd25jYXN0
U1ZHUGF0aFNlZyhvYmplY3QpOworCisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4T2JqZWN0
ID0gaW5zdGFudGlhdGVWOE9iamVjdCh0eXBlLCB0eXBlLCBvYmplY3QpOworICAgIGlmICghdjhP
YmplY3QuSXNFbXB0eSgpKSB7CisgICAgICByZXN1bHQgPSB2ODo6UGVyc2lzdGVudDx2ODo6T2Jq
ZWN0Pjo6TmV3KHY4T2JqZWN0KTsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworI2RlZmluZSBNQUtF
X0NBU0UoVFlQRSwgTkFNRSkgICAgIFwKKyAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpUWVBFOiBz
dGF0aWNfY2FzdDxOQU1FKj4ob2JqZWN0KS0+cmVmKCk7IGJyZWFrOworICAgICAgU1ZHX09CSkVD
VF9UWVBFUyhNQUtFX0NBU0UpCisjdW5kZWYgTUFLRV9DQVNFCisjZGVmaW5lIE1BS0VfQ0FTRShU
WVBFLCBOQU1FKSAgICAgXAorICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OlRZUEU6ICAgIFwKKyAg
ICAgICAgICBzdGF0aWNfY2FzdDxWOFNWR1BPRFR5cGVXcmFwcGVyPE5BTUU+Kj4ob2JqZWN0KS0+
cmVmKCk7IGJyZWFrOworICAgICAgU1ZHX1BPRF9OQVRJVkVfVFlQRVMoTUFLRV9DQVNFKQorI3Vu
ZGVmIE1BS0VfQ0FTRQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICAgIH0KKyAgICAgIGdldERPTVNWR09iamVjdFdpdGhDb250ZXh0TWFwKCkuc2V0
KG9iamVjdCwgcmVzdWx0KTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgVjhQ
cm94eTo6c2V0U1ZHQ29udGV4dCh2b2lkKiBvYmplY3QsIFNWR0VsZW1lbnQqIGNvbnRleHQpCit7
CisgICAgaWYgKCFvYmplY3QpCisgICAgICAgIHJldHVybjsKKworICAgIFNWR0VsZW1lbnQqIG9s
ZENvbnRleHQgPSBzdmdPYmplY3RUb0NvbnRleHRNYXAoKS5nZXQob2JqZWN0KTsKKworICAgIGlm
IChvbGRDb250ZXh0ID09IGNvbnRleHQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChvbGRD
b250ZXh0KQorICAgICAgICBvbGRDb250ZXh0LT5kZXJlZigpOworCisgICAgaWYgKGNvbnRleHQp
CisgICAgICAgIGNvbnRleHQtPnJlZigpOworCisgICAgc3ZnT2JqZWN0VG9Db250ZXh0TWFwKCku
c2V0KG9iamVjdCwgY29udGV4dCk7Cit9CisKK1NWR0VsZW1lbnQqIFY4UHJveHk6OnN2Z0NvbnRl
eHQodm9pZCogb2JqZWN0KQoreworICAgIHJldHVybiBzdmdPYmplY3RUb0NvbnRleHRNYXAoKS5n
ZXQob2JqZWN0KTsKK30KKworI2VuZGlmCisKKy8vIEEgbWFwIGZyb20gYSBET00gbm9kZSB0byBp
dHMgSlMgd3JhcHBlciwgdGhlIHdyYXBwZXIKKy8vIGlzIGtlcHQgYXMgYSBzdHJvbmcgcmVmZXJl
bmNlIHRvIHN1cnZpdmUgR0NzLgorc3RhdGljIERPTU9iamVjdE1hcCYgZ2NQcm90ZWN0ZWRNYXAo
KSB7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChET01PYmplY3RNYXAsIHN0YXRpY0djUHJvdGVj
dGVkTWFwLCAoKSk7CisgICAgcmV0dXJuIHN0YXRpY0djUHJvdGVjdGVkTWFwOworfQorCit2b2lk
IFY4UHJveHk6OmdjUHJvdGVjdCh2b2lkKiBkb21PYmplY3QpCit7CisgICAgaWYgKCFkb21PYmpl
Y3QpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoZ2NQcm90ZWN0ZWRNYXAoKS5jb250YWlucyhk
b21PYmplY3QpKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFnZXRET01PYmplY3RNYXAoKS5j
b250YWlucyhkb21PYmplY3QpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDcmVhdGUgYSBu
ZXcgKHN0cm9uZykgcGVyc2lzdGVudCBoYW5kbGUgZm9yIHRoZSBvYmplY3QuCisgICAgdjg6OlBl
cnNpc3RlbnQ8djg6Ok9iamVjdD4gd3JhcHBlciA9IGdldERPTU9iamVjdE1hcCgpLmdldChkb21P
YmplY3QpOworICAgIGlmICh3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgZ2NQcm90ZWN0ZWRNYXAoKS5zZXQoZG9tT2JqZWN0LCAqdjg6OlBlcnNpc3RlbnQ8djg6Ok9i
amVjdD46Ok5ldyh3cmFwcGVyKSk7Cit9CisKK3ZvaWQgVjhQcm94eTo6Z2NVbnByb3RlY3Qodm9p
ZCogZG9tT2JqZWN0KQoreworICAgIGlmICghZG9tT2JqZWN0KQorICAgICAgICByZXR1cm47Cisg
ICAgaWYgKCFnY1Byb3RlY3RlZE1hcCgpLmNvbnRhaW5zKGRvbU9iamVjdCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIC8vIERpc3Bvc2UgdGhlIHN0cm9uZyByZWZlcmVuY2UuCisgICAgdjg6OlBl
cnNpc3RlbnQ8djg6Ok9iamVjdD4gd3JhcHBlcihnY1Byb3RlY3RlZE1hcCgpLnRha2UoZG9tT2Jq
ZWN0KSk7CisgICAgd3JhcHBlci5EaXNwb3NlKCk7Cit9CisKKy8vIENyZWF0ZSBvYmplY3QgZ3Jv
dXBzIGZvciBET00gdHJlZSBub2Rlcy4KK3N0YXRpYyB2b2lkIGdjUHJvbG9ndWUoKQoreworICAg
IHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKworI2lmbmRlZiBOREVCVUcKKyAgICBlbnVtZXJhdGVE
T01PYmplY3RNYXAoZ2V0RE9NT2JqZWN0TWFwKCkuaW1wbCgpKTsKKyNlbmRpZgorCisgICAgLy8g
UnVuIHRocm91Z2ggYWxsIG9iamVjdHMgd2l0aCBwb3NzaWJsZSBwZW5kaW5nIGFjdGl2aXR5IG1h
a2luZyB0aGVpcgorICAgIC8vIHdyYXBwZXJzIG5vbiB3ZWFrIGlmIHRoZXJlIGlzIHBlbmRpbmcg
YWN0aXZpdHkuCisgICAgRE9NT2JqZWN0TWFwIGFjdGl2ZU1hcCA9IGdldEFjdGl2ZURPTU9iamVj
dE1hcCgpLmltcGwoKTsKKyAgICBmb3IgKERPTU9iamVjdE1hcDo6aXRlcmF0b3IgaXQgPSBhY3Rp
dmVNYXAuYmVnaW4oKSwgZW5kID0gYWN0aXZlTWFwLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsK
KyAgICAgICAgdm9pZCogb2JqZWN0ID0gaXQtPmZpcnN0OworICAgICAgICB2ODo6UGVyc2lzdGVu
dDx2ODo6T2JqZWN0PiB3cmFwcGVyID0gdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4oaXQtPnNl
Y29uZCk7CisgICAgICAgIEFTU0VSVCh3cmFwcGVyLklzV2VhaygpKTsKKyAgICAgICAgVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5Ojpkb21XcmFwcGVyVHlwZSh3cmFw
cGVyKTsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisjZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBO
QU1FKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4
OjpUWVBFOiB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBOQU1FKiBpbXBsID0g
c3RhdGljX2Nhc3Q8TkFNRSo+KG9iamVjdCk7ICBcCisgICAgICAgICAgICBpZiAoaW1wbC0+aGFz
UGVuZGluZ0FjdGl2aXR5KCkpICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd3JhcHBlci5D
bGVhcldlYWsoKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKyAgICAgICAgQUNUSVZF
X0RPTV9PQkpFQ1RfVFlQRVMoTUFLRV9DQVNFKQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisjdW5kZWYgTUFLRV9DQVNFCisgICAgICAgIH0KKwor
ICAgICAgICAvLyBBZGRpdGlvbmFsIGhhbmRsaW5nIG9mIG1lc3NhZ2UgcG9ydCBlbnN1cmluZyB0
aGF0IGVudGFuZ2xlZCBwb3J0cyBhbHNvCisgICAgICAgIC8vIGhhdmUgdGhlaXIgd3JhcHBlcnMg
ZW50YW5nbGVkLiBUaGlzIHNob3VsZCBpZGVhbGx5IGJlIGhhbmRsZWQgd2hlbiB0aGUKKyAgICAg
ICAgLy8gcG9ydHMgYXJlIGFjdHVhbGx5IGVudGFuZ2xlZCBpbiBNZXNzYWdlUG9ydDo6ZW50YW5n
bGUsIGJ1dCB0byBhdm9pZAorICAgICAgICAvLyBmb3JraW5nIE1lc3NhZ2VQb3J0LiogdGhpcyBp
cyBwb3N0cG9uZWQgdG8gR0MgdGltZS4gSGF2aW5nIHRoaXMgcG9zdHBvbmVkCisgICAgICAgIC8v
IGhhcyB0aGUgZHJhd2JhY2sgdGhhdCB0aGUgd3JhcHBlcnMgYXJlICJlbnRhbmdsZWQvdW5lbnRh
bmdsZWQiIGZvciBlYWNoCisgICAgICAgIC8vIEdDIGV2ZW4gdGhvdWdoIHRoZWlyIGVudGFnbGVt
ZW50IG1vc3QgbGlrZWx5IGlzIHN0aWxsIHRoZSBzYW1lLgorICAgICAgICBpZiAodHlwZSA9PSBW
OENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JUKSB7CisgICAgICAgICAgICAvLyBHZXQgdGhlIHBvcnQg
YW5kIGl0cyBlbnRhbmdsZWQgcG9ydC4KKyAgICAgICAgICAgIE1lc3NhZ2VQb3J0KiBwb3J0MSA9
IHN0YXRpY19jYXN0PE1lc3NhZ2VQb3J0Kj4ob2JqZWN0KTsKKyAgICAgICAgICAgIE1lc3NhZ2VQ
b3J0KiBwb3J0MiA9IHBvcnQxLT5sb2NhbGx5RW50YW5nbGVkUG9ydCgpOworCisgICAgICAgICAg
ICAvLyBJZiB3ZSBhcmUgcmVtb3RlbHkgZW50YW5nbGVkLCB0aGVuIG1hcmsgdGhpcyBvYmplY3Qg
YXMgcmVhY2hhYmxlCisgICAgICAgICAgICAvLyAod2UgY2FuJ3QgZGV0ZXJtaW5lIHJlYWNoYWJp
bGl0eSBkaXJlY3RseSBhcyB0aGUgcmVtb3RlIG9iamVjdCBpcworICAgICAgICAgICAgLy8gb3V0
LW9mLXByb2MpLgorICAgICAgICAgICAgaWYgKHBvcnQxLT5pc0VudGFuZ2xlZCgpICYmICFwb3J0
MikKKyAgICAgICAgICAgICAgICB3cmFwcGVyLkNsZWFyV2VhaygpOworCisgICAgICAgICAgICBp
ZiAoIXBvcnQyKSB7CisgICAgICAgICAgICAgICAgLy8gQXMgcG9ydHMgYXJlIGFsd2F5cyBlbnRh
bmdsZWQgaW4gcGFpcnMgb25seSBwZXJmb3JtIHRoZSBlbnRhbmdsZW1lbnQKKyAgICAgICAgICAg
ICAgICAvLyBvbmNlIGZvciBlYWNoIHBhaXIgKHNlZSBBU1NFUlQgaW4gTWVzc2FnZVBvcnQ6OnVu
ZW50YW5nbGUoKSkuCisgICAgICAgICAgICAgICAgaWYgKHBvcnQxIDwgcG9ydDIpIHsKKyAgICAg
ICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHBvcnQxV3JhcHBlciA9IFY4UHJv
eHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIHBvcnQxKTsK
KyAgICAgICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHBvcnQyV3JhcHBlciA9
IFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIHBv
cnQyKTsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHBvcnQxV3JhcHBlci0+SXNPYmplY3Qo
KSk7CisgICAgICAgICAgICAgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QocG9y
dDFXcmFwcGVyKS0+U2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a01lc3NhZ2VQb3J0RW50YW5n
bGVkUG9ydEluZGV4LCBwb3J0MldyYXBwZXIpOworICAgICAgICAgICAgICAgICAgICBBU1NFUlQo
cG9ydDJXcmFwcGVyLT5Jc09iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdjg6OkhhbmRs
ZTx2ODo6T2JqZWN0Pjo6Q2FzdChwb3J0MldyYXBwZXIpLT5TZXRJbnRlcm5hbEZpZWxkKFY4Q3Vz
dG9tOjprTWVzc2FnZVBvcnRFbnRhbmdsZWRQb3J0SW5kZXgsIHBvcnQxV3JhcHBlcik7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBS
ZW1vdmUgdGhlIHdyYXBwZXIgZW50YW5nbGVtZW50IHdoZW4gYSBwb3J0IGlzIG5vdCBlbnRhbmds
ZWQuCisgICAgICAgICAgICAgICAgaWYgKFY4UHJveHk6OmRvbU9iamVjdEhhc0pTV3JhcHBlcihw
b3J0MSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdyYXBw
ZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JU
LCBwb3J0MSk7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVCh3cmFwcGVyLT5Jc09iamVjdCgp
KTsKKyAgICAgICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh3cmFw
cGVyKS0+U2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a01lc3NhZ2VQb3J0RW50YW5nbGVkUG9y
dEluZGV4LCB2ODo6VW5kZWZpbmVkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENyZWF0ZSBvYmplY3QgZ3JvdXBzLgorICAg
IHR5cGVkZWYgc3RkOjpwYWlyPHVpbnRwdHJfdCwgTm9kZSo+IEdyb3VwZXJQYWlyOworICAgIHR5
cGVkZWYgVmVjdG9yPEdyb3VwZXJQYWlyPiBHcm91cGVyTGlzdDsKKworICAgIERPTU5vZGVNYXAg
bm9kZU1hcCA9IGdldERPTU5vZGVNYXAoKS5pbXBsKCk7CisgICAgR3JvdXBlckxpc3QgZ3JvdXBl
cjsKKyAgICBncm91cGVyLnJlc2VydmVDYXBhY2l0eShub2RlTWFwLnNpemUoKSk7CisKKyAgICBm
b3IgKERPTU5vZGVNYXA6Oml0ZXJhdG9yIGl0ID0gbm9kZU1hcC5iZWdpbigpLCBlbmQgPSBub2Rl
TWFwLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgTm9kZSogbm9kZSA9IGl0LT5m
aXJzdDsKKworICAgICAgICAvLyBJZiB0aGUgbm9kZSBpcyBpbiBkb2N1bWVudCwgcHV0IGl0IGlu
IHRoZSBvd25lckRvY3VtZW50J3Mgb2JqZWN0IGdyb3VwLgorICAgICAgICAvLworICAgICAgICAv
LyBJZiBhbiBpbWFnZSBlbGVtZW50IHdhcyBjcmVhdGVkIGJ5IEphdmFTY3JpcHQgIm5ldyBJbWFn
ZSIsCisgICAgICAgIC8vIGl0IGlzIG5vdCBpbiBhIGRvY3VtZW50LiBIb3dldmVyLCBpZiB0aGUg
bG9hZCBldmVudCBoYXMgbm90CisgICAgICAgIC8vIGJlZW4gZmlyZWQgKHN0aWxsIG9ubG9hZGlu
ZyksIGl0IGlzIHRyZWF0ZWQgYXMgaW4gdGhlIGRvY3VtZW50LgorICAgICAgICAvLworICAgICAg
ICAvLyBPdGhlcndpc2UsIHRoZSBub2RlIGlzIHB1dCBpbiBhbiBvYmplY3QgZ3JvdXAgaWRlbnRp
ZmllZCBieSB0aGUgcm9vdAorICAgICAgICAvLyBlbG1lbnQgb2YgdGhlIHRyZWUgdG8gd2hpY2gg
aXQgYmVsb25ncy4KKyAgICAgICAgdWludHB0cl90IGdyb3VwSWQ7CisgICAgICAgIGlmIChub2Rl
LT5pbkRvY3VtZW50KCkgfHwgKG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjppbWdUYWcpICYm
ICFzdGF0aWNfY2FzdDxIVE1MSW1hZ2VFbGVtZW50Kj4obm9kZSktPmhhdmVGaXJlZExvYWRFdmVu
dCgpKSkgeworICAgICAgICAgICAgZ3JvdXBJZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90
Pihub2RlLT5kb2N1bWVudCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE5vZGUq
IHJvb3QgPSBub2RlOworICAgICAgICAgICAgd2hpbGUgKHJvb3QtPnBhcmVudCgpKQorICAgICAg
ICAgICAgICAgIHJvb3QgPSByb290LT5wYXJlbnQoKTsKKworICAgICAgICAgICAgLy8gSWYgdGhl
IG5vZGUgaXMgYWxvbmUgaW4gaXRzIERPTSB0cmVlIChkb2Vzbid0IGhhdmUgYSBwYXJlbnQgb3Ig
YW55CisgICAgICAgICAgICAvLyBjaGlsZHJlbikgdGhlbiB0aGUgZ3JvdXAgd2lsbCBiZSBmaWx0
ZXJlZCBvdXQgbGF0ZXIgYW55d2F5LgorICAgICAgICAgICAgaWYgKHJvb3QgPT0gbm9kZSAmJiAh
bm9kZS0+aGFzQ2hpbGROb2RlcygpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAg
ICAgICAgICBncm91cElkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHJvb3QpOworICAg
ICAgICB9CisgICAgICAgIGdyb3VwZXIuYXBwZW5kKEdyb3VwZXJQYWlyKGdyb3VwSWQsIG5vZGUp
KTsKKyAgICB9CisKKyAgICAvLyBHcm91cCBieSBzb3J0aW5nIGJ5IHRoZSBncm91cCBpZC4gIFRo
aXMgd2lsbCB1c2UgdGhlIHN0ZDo6cGFpciBvcGVyYXRvcjwsCisgICAgLy8gd2hpY2ggd2lsbCBy
ZWFsbHkgc29ydCBieSBib3RoIHRoZSBncm91cCBpZCBhbmQgdGhlIE5vZGUqLiAgSG93ZXZlciB0
aGUKKyAgICAvLyBOb2RlKiBpcyBvbmx5IGludm9sdmVkIHRvIHNvcnQgd2l0aGluIGEgZ3JvdXAg
aWQsIHNvIGl0IHdpbGwgYmUgZmluZS4KKyAgICBzdGQ6OnNvcnQoZ3JvdXBlci5iZWdpbigpLCBn
cm91cGVyLmVuZCgpKTsKKworICAgIC8vIEZJWE1FOiBTaG91bGQgcHJvYmFibHkgd29yayBpbiBp
dGVyYXRvcnMgaGVyZSwgYnV0IGluZGV4ZXMgd2VyZQorICAgIC8vIGVhc2llciBmb3IgbXkgc2lt
cGxlIG1pbmQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBncm91cGVyLnNpemUoKTsgKSB7
CisgICAgICAgIC8vIFNlZWsgdG8gdGhlIG5leHQga2V5IChvciB0aGUgZW5kIG9mIHRoZSBsaXN0
KS4KKyAgICAgICAgc2l6ZV90IG5leHRLZXlJbmRleCA9IGdyb3VwZXIuc2l6ZSgpOworICAgICAg
ICBmb3IgKHNpemVfdCBqID0gaTsgaiA8IGdyb3VwZXIuc2l6ZSgpOyArK2opIHsKKyAgICAgICAg
ICAgIGlmIChncm91cGVyW2ldLmZpcnN0ICE9IGdyb3VwZXJbal0uZmlyc3QpIHsKKyAgICAgICAg
ICAgICAgbmV4dEtleUluZGV4ID0gajsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKworICAgICAgICBBU1NFUlQobmV4dEtleUluZGV4ID4gaSk7CisKKyAg
ICAgICAgLy8gV2Ugb25seSBjYXJlIGFib3V0IGEgZ3JvdXAgaWYgaXQgaGFzIG1vcmUgdGhhbiBv
bmUgb2JqZWN0LiAgSWYgaXQgb25seQorICAgICAgICAvLyBoYXMgb25lIG9iamVjdCwgaXQgaGFz
IG5vdGhpbmcgZWxzZSB0aGF0IG5lZWRzIHRvIGJlIGtlcHQgYWxpdmUuCisgICAgICAgIGlmIChu
ZXh0S2V5SW5kZXggLSBpIDw9IDEpIHsKKyAgICAgICAgICAgIGkgPSBuZXh0S2V5SW5kZXg7Cisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIFZlY3Rvcjx2ODo6UGVy
c2lzdGVudDx2ODo6VmFsdWU+ID4gZ3JvdXA7CisgICAgICAgIGdyb3VwLnJlc2VydmVDYXBhY2l0
eShuZXh0S2V5SW5kZXggLSBpKTsKKyAgICAgICAgZm9yICg7IGkgPCBuZXh0S2V5SW5kZXg7ICsr
aSkgeworICAgICAgICAgICAgTm9kZSogbm9kZSA9IGdyb3VwZXJbaV0uc2Vjb25kOworICAgICAg
ICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB3cmFwcGVyID0gZ2V0RE9NTm9kZU1hcCgp
LmdldChub2RlKTsKKyAgICAgICAgICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpCisgICAgICAg
ICAgICAgICAgZ3JvdXAuYXBwZW5kKHdyYXBwZXIpOworICAgICAgICAgICAgLy8gSWYgdGhlIG5v
ZGUgaXMgc3R5bGVkIGFuZCB0aGVyZSBpcyBhIHdyYXBwZXIgZm9yIHRoZSBpbmxpbmUKKyAgICAg
ICAgICAgIC8vIHN0eWxlIGRlY2xhcmF0aW9uLCB3ZSBuZWVkIHRvIGtlZXAgdGhhdCBzdHlsZSBk
ZWNsYXJhdGlvbgorICAgICAgICAgICAgLy8gd3JhcHBlciBhbGl2ZSBhcyB3ZWxsLCBzbyB3ZSBh
ZGQgaXQgdG8gdGhlIG9iamVjdCBncm91cC4KKyAgICAgICAgICAgIGlmIChub2RlLT5pc1N0eWxl
ZEVsZW1lbnQoKSkgeworICAgICAgICAgICAgICAgIFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQgPSBy
ZWludGVycHJldF9jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKTsKKyAgICAgICAgICAgICAgICBD
U1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSA9IGVsZW1lbnQtPmlubGluZVN0eWxlRGVjbCgpOwor
ICAgICAgICAgICAgICAgIGlmICghc3R5bGUpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JhcHBl
ciA9IGdldERPTU9iamVjdE1hcCgpLmdldChzdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlm
ICghd3JhcHBlci5Jc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cC5hcHBl
bmQod3JhcHBlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9
CisKKyAgICAgICAgaWYgKGdyb3VwLnNpemUoKSA+IDEpCisgICAgICAgICAgICB2ODo6Vjg6OkFk
ZE9iamVjdEdyb3VwKCZncm91cFswXSwgZ3JvdXAuc2l6ZSgpKTsKKworICAgICAgICBBU1NFUlQo
aSA9PSBuZXh0S2V5SW5kZXgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2NFcGlsb2d1ZSgp
Cit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworCisgICAgLy8gUnVuIHRocm91Z2ggYWxs
IG9iamVjdHMgd2l0aCBwZW5kaW5nIGFjdGl2aXR5IG1ha2luZyB0aGVpciB3cmFwcGVycyB3ZWFr
IGFnYWluLgorICAgIERPTU9iamVjdE1hcCBhY3RpdmVNYXAgPSBnZXRBY3RpdmVET01PYmplY3RN
YXAoKS5pbXBsKCk7CisgICAgZm9yIChET01PYmplY3RNYXA6Oml0ZXJhdG9yIGl0ID0gYWN0aXZl
TWFwLmJlZ2luKCksIGVuZCA9IGFjdGl2ZU1hcC5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Cisg
ICAgICAgIHZvaWQqIG9iaiA9IGl0LT5maXJzdDsKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6
Ok9iamVjdD4gd3JhcHBlciA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+KGl0LT5zZWNvbmQp
OworICAgICAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IFY4UHJveHk6OmRv
bVdyYXBwZXJUeXBlKHdyYXBwZXIpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyNkZWZpbmUg
TUFLRV9DQVNFKFRZUEUsIE5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpUWVBFOiB7ICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTkFNRSogaW1wbCA9IHN0YXRpY19j
YXN0PE5BTUUqPihvYmopOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChp
bXBsLT5oYXNQZW5kaW5nQWN0aXZpdHkoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgICAgICAgICAgICAgQVNTRVJUKCF3cmFwcGVyLklzV2VhaygpKTsgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdyYXBwZXIuTWFrZVdlYWsoaW1wbCwgJndl
YWtBY3RpdmVET01PYmplY3RDYWxsYmFjayk7IFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAg
ICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICAgICAgICB9CisgICAgICAgIEFDVElWRV9ET01fT0JKRUNUX1RZUEVTKE1BS0VfQ0FT
RSkKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
I3VuZGVmIE1BS0VfQ0FTRQorICAgICAgICB9CisgICAgfQorCisjaWZuZGVmIE5ERUJVRworICAg
IC8vIENoZWNrIGFsbCBzdXJ2aXZhbHMgYXJlIHdlYWsuCisgICAgZW51bWVyYXRlRE9NT2JqZWN0
TWFwKGdldERPTU9iamVjdE1hcCgpLmltcGwoKSk7CisgICAgZW51bWVyYXRlRE9NTm9kZU1hcChn
ZXRET01Ob2RlTWFwKCkuaW1wbCgpKTsKKyAgICBlbnVtZXJhdGVET01PYmplY3RNYXAoZ2NQcm90
ZWN0ZWRNYXAoKSk7CisgICAgZW51bWVyYXRlR2xvYmFsSGFuZGxlcygpOworI2VuZGlmCit9CisK
K3R5cGVkZWYgSGFzaE1hcDxpbnQsIHY4OjpGdW5jdGlvblRlbXBsYXRlKj4gRnVuY3Rpb25UZW1w
bGF0ZU1hcDsKKworYm9vbCBBbGxvd0FsbG9jYXRpb246Om1fY3VycmVudCA9IGZhbHNlOworCisv
LyBKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2VzIGVuY2Fwc3VsYXRlIGV2ZXJ5dGhpbmcgbmVlZGVk
IHRvCisvLyBsb2cgbWVzc2FnZXMgb3JpZ2luYXRpbmcgZnJvbSBKYXZhU2NyaXB0IHRvIHRoZSBD
aHJvbWUgY29uc29sZS4KK2NsYXNzIEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZSB7CitwdWJsaWM6
CisgICAgSmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlKGNvbnN0IFN0cmluZyYgc3RyaW5nLCBjb25z
dCBTdHJpbmcmIHNvdXJjZUlELCB1bnNpZ25lZCBsaW5lTnVtYmVyKQorICAgICAgICA6IG1fc3Ry
aW5nKHN0cmluZykKKyAgICAgICAgLCBtX3NvdXJjZUlEKHNvdXJjZUlEKQorICAgICAgICAsIG1f
bGluZU51bWJlcihsaW5lTnVtYmVyKSB7IH0KKworICAgIHZvaWQgYWRkVG9QYWdlKFBhZ2UqKSBj
b25zdDsKKworcHJpdmF0ZToKKyAgICBjb25zdCBTdHJpbmcgbV9zdHJpbmc7CisgICAgY29uc3Qg
U3RyaW5nIG1fc291cmNlSUQ7CisgICAgY29uc3QgdW5zaWduZWQgbV9saW5lTnVtYmVyOworfTsK
Kwordm9pZCBKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2U6OmFkZFRvUGFnZShQYWdlKiBwYWdlKSBj
b25zdAoreworICAgIEFTU0VSVChwYWdlKTsKKyAgICBDb25zb2xlKiBjb25zb2xlID0gcGFnZS0+
bWFpbkZyYW1lKCktPmRvbVdpbmRvdygpLT5jb25zb2xlKCk7CisgICAgY29uc29sZS0+YWRkTWVz
c2FnZShKU01lc3NhZ2VTb3VyY2UsIEVycm9yTWVzc2FnZUxldmVsLCBtX3N0cmluZywgbV9saW5l
TnVtYmVyLCBtX3NvdXJjZUlEKTsKK30KKworLy8gVGhlIENvbnNvbGVNZXNzYWdlTWFuYWdlciBo
YW5kbGVzIGFsbCBjb25zb2xlIG1lc3NhZ2VzIHRoYXQgc3RlbQorLy8gZnJvbSBKYXZhU2NyaXB0
LiBJdCBrZWVwcyBhIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCBoYXZlIGJlZW4gZGVsYXllZCBidXQK
Ky8vIGl0IG1ha2VzIHN1cmUgdG8gYWRkIGFsbCBtZXNzYWdlcyB0byB0aGUgY29uc29sZSBpbiB0
aGUgcmlnaHQgb3JkZXIuCitjbGFzcyBDb25zb2xlTWVzc2FnZU1hbmFnZXIgeworcHVibGljOgor
ICAgIC8vIEFkZCBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUuIE1heSBlbmQgdXAgY2FsbGluZyBK
YXZhU2NyaXB0IGNvZGUKKyAgICAvLyBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIGluc3BlY3RvciBz
byBvbmx5IGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuCisgICAgLy8gaXQgaXMgc2FmZSB0byBkbyBh
bGxvY2F0aW9ucy4KKyAgICBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKFBhZ2UqLCBjb25zdCBKYXZh
U2NyaXB0Q29uc29sZU1lc3NhZ2UmKTsKKworICAgIC8vIEFkZCBhIG1lc3NhZ2UgdG8gdGhlIGNv
bnNvbGUgYnV0IGRlbGF5IHRoZSByZXBvcnRpbmcgdW50aWwgaXQKKyAgICAvLyBpcyBzYWZlIHRv
IGRvIHNvOiBFaXRoZXIgd2hlbiB3ZSBsZWF2ZSBKYXZhU2NyaXB0IGV4ZWN1dGlvbiBvcgorICAg
IC8vIHdoZW4gYWRkaW5nIG90aGVyIGNvbnNvbGUgbWVzc2FnZXMuIFRoZSBwcmltYXJ5IHB1cnBv
c2Ugb2YgdGhpcworICAgIC8vIG1ldGhvZCBpcyB0byBhdm9pZCBjYWxsaW5nIGludG8gVjggdG8g
aGFuZGxlIGNvbnNvbGUgbWVzc2FnZXMKKyAgICAvLyB3aGVuIHRoZSBWTSBpcyBpbiBhIHN0YXRl
IHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBHQ3Mgb3IgYWxsb2NhdGlvbnMuCisgICAgLy8gRGVsYXll
ZCBtZXNzYWdlcyBhcmUgYWx3YXlzIHJlcG9ydGVkIGluIHRoZSBwYWdlIGNvcnJlc3BvbmRpbmcK
KyAgICAvLyB0byB0aGUgYWN0aXZlIGNvbnRleHQuCisgICAgc3RhdGljIHZvaWQgYWRkRGVsYXll
ZE1lc3NhZ2UoY29uc3QgSmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlJik7CisKKyAgICAvLyBQcm9j
ZXNzIGFueSBkZWxheWVkIG1lc3NhZ2VzLiBNYXkgZW5kIHVwIGNhbGxpbmcgSmF2YVNjcmlwdCBj
b2RlCisgICAgLy8gaW5kaXJlY3RseSB0aHJvdWdoIHRoZSBpbnNwZWN0b3Igc28gb25seSBjYWxs
IHRoaXMgZnVuY3Rpb24gd2hlbgorICAgIC8vIGl0IGlzIHNhZmUgdG8gZG8gYWxsb2NhdGlvbnMu
CisgICAgc3RhdGljIHZvaWQgcHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpOworCitwcml2YXRlOgor
ICAgIC8vIEFsbCBkZWxheWVkIG1lc3NhZ2VzIGFyZSBzdG9yZWQgaW4gdGhpcyB2ZWN0b3IuIElm
IHRoZSB2ZWN0b3IKKyAgICAvLyBpcyBOVUxMLCB0aGVyZSBhcmUgbm8gZGVsYXllZCBtZXNzYWdl
cy4KKyAgICBzdGF0aWMgVmVjdG9yPEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZT4qIG1fZGVsYXll
ZDsKK307CisKK1ZlY3RvcjxKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2U+KiBDb25zb2xlTWVzc2Fn
ZU1hbmFnZXI6Om1fZGVsYXllZCA9IDA7CisKK3ZvaWQgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjph
ZGRNZXNzYWdlKFBhZ2UqIHBhZ2UsIGNvbnN0IEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZSYgbWVz
c2FnZSkKK3sKKyAgICAvLyBQcm9jZXNzIGFueSBkZWxheWVkIG1lc3NhZ2VzIHRvIG1ha2Ugc3Vy
ZSB0aGF0IG1lc3NhZ2VzCisgICAgLy8gYXBwZWFyIGluIHRoZSByaWdodCBvcmRlciBpbiB0aGUg
Y29uc29sZS4KKyAgICBwcm9jZXNzRGVsYXllZE1lc3NhZ2VzKCk7CisgICAgbWVzc2FnZS5hZGRU
b1BhZ2UocGFnZSk7Cit9CisKK3ZvaWQgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjphZGREZWxheWVk
TWVzc2FnZShjb25zdCBKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UmIG1lc3NhZ2UpCit7CisgICAg
aWYgKCFtX2RlbGF5ZWQpIHsKKyAgICAgICAgLy8gQWxsb2NhdGUgYSB2ZWN0b3IgZm9yIHRoZSBk
ZWxheWVkIG1lc3NhZ2VzLiBXaWxsIGJlCisgICAgICAgIC8vIGRlYWxsb2NhdGVkIHdoZW4gdGhl
IGRlbGF5ZWQgbWVzc2FnZXMgYXJlIHByb2Nlc3NlZAorICAgICAgICAvLyBpbiBwcm9jZXNzRGVs
YXllZE1lc3NhZ2VzKCkuCisgICAgICAgIG1fZGVsYXllZCA9IG5ldyBWZWN0b3I8SmF2YVNjcmlw
dENvbnNvbGVNZXNzYWdlPigpOworICAgIH0KKyAgICBtX2RlbGF5ZWQtPmFwcGVuZChtZXNzYWdl
KTsKK30KKwordm9pZCBDb25zb2xlTWVzc2FnZU1hbmFnZXI6OnByb2Nlc3NEZWxheWVkTWVzc2Fn
ZXMoKQoreworICAgIC8vIElmIHdlIGhhdmUgYSBkZWxheWVkIHZlY3RvciBpdCBjYW5ub3QgYmUg
ZW1wdHkuCisgICAgaWYgKCFtX2RlbGF5ZWQpCisgICAgICAgIHJldHVybjsKKyAgICBBU1NFUlQo
IW1fZGVsYXllZC0+aXNFbXB0eSgpKTsKKworICAgIC8vIEFkZCB0aGUgZGVsYXllZCBtZXNzYWdl
cyB0byB0aGUgcGFnZSBvZiB0aGUgYWN0aXZlCisgICAgLy8gY29udGV4dC4gSWYgdGhhdCBmb3Ig
c29tZSBiaXphcnJlIHJlYXNvbiBkb2VzIG5vdAorICAgIC8vIGV4aXN0LCB3ZSBjbGVhciB0aGUg
bGlzdCBvZiBkZWxheWVkIG1lc3NhZ2VzIHRvIGF2b2lkCisgICAgLy8gcG9zdGluZyBtZXNzYWdl
cy4gV2Ugc3RpbGwgZGVhbGxvY2F0ZSB0aGUgdmVjdG9yLgorICAgIEZyYW1lKiBmcmFtZSA9IFY4
UHJveHk6OnJldHJpZXZlRnJhbWVGb3JFbnRlcmVkQ29udGV4dCgpOworICAgIFBhZ2UqIHBhZ2Ug
PSAwOworICAgIGlmIChmcmFtZSkKKyAgICAgICAgcGFnZSA9IGZyYW1lLT5wYWdlKCk7CisgICAg
aWYgKCFwYWdlKQorICAgICAgICBtX2RlbGF5ZWQtPmNsZWFyKCk7CisKKyAgICAvLyBJdGVyYXRl
IHRocm91Z2ggYWxsIHRoZSBkZWxheWVkIG1lc3NhZ2VzIGFuZCBhZGQgdGhlbQorICAgIC8vIHRv
IHRoZSBjb25zb2xlLgorICAgIGNvbnN0IGludCBzaXplID0gbV9kZWxheWVkLT5zaXplKCk7Cisg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgbV9kZWxheWVkLT5h
dChpKS5hZGRUb1BhZ2UocGFnZSk7CisgICAgfQorCisgICAgLy8gRGVhbGxvY2F0ZSB0aGUgZGVs
YXllZCB2ZWN0b3IuCisgICAgZGVsZXRlIG1fZGVsYXllZDsKKyAgICBtX2RlbGF5ZWQgPSAwOwor
fQorCisvLyBDb252ZW5pZW5jZSBjbGFzcyBmb3IgZW5zdXJpbmcgdGhhdCBkZWxheWVkIG1lc3Nh
Z2VzIGluIHRoZQorLy8gQ29uc29sZU1lc3NhZ2VNYW5hZ2VyIGFyZSBwcm9jZXNzZWQgcXVpY2ts
eS4KK2NsYXNzIENvbnNvbGVNZXNzYWdlU2NvcGUgeworcHVibGljOgorICAgIENvbnNvbGVNZXNz
YWdlU2NvcGUoKSB7IENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6cHJvY2Vzc0RlbGF5ZWRNZXNzYWdl
cygpOyB9CisgICAgfkNvbnNvbGVNZXNzYWdlU2NvcGUoKSB7IENvbnNvbGVNZXNzYWdlTWFuYWdl
cjo6cHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpOyB9Cit9OworCit2b2lkIGxvZ0luZm8oRnJhbWUq
IGZyYW1lLCBjb25zdCBTdHJpbmcmIG1lc3NhZ2UsIGNvbnN0IFN0cmluZyYgdXJsKQoreworICAg
IFBhZ2UqIHBhZ2UgPSBmcmFtZS0+cGFnZSgpOworICAgIGlmICghcGFnZSkKKyAgICAgICAgcmV0
dXJuOworICAgIEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZSBjb25zb2xlTWVzc2FnZShtZXNzYWdl
LCB1cmwsIDApOworICAgIENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6YWRkTWVzc2FnZShwYWdlLCBj
b25zb2xlTWVzc2FnZSk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZUNvbnNvbGVNZXNzYWdlKHY4
OjpIYW5kbGU8djg6Ok1lc3NhZ2U+IG1lc3NhZ2UsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBkYXRh
KQoreworICAgIC8vIFVzZSB0aGUgZnJhbWUgd2hlcmUgSmF2YVNjcmlwdCBpcyBjYWxsZWQgZnJv
bS4KKyAgICBGcmFtZSogZnJhbWUgPSBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lRm9yRW50ZXJlZENv
bnRleHQoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm47CisKKyAgICBQYWdlKiBw
YWdlID0gZnJhbWUtPnBhZ2UoKTsKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgIHJldHVybjsKKwor
ICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gZXJyb3JNZXNzYWdlU3RyaW5nID0gbWVzc2FnZS0+
R2V0KCk7CisgICAgQVNTRVJUKCFlcnJvck1lc3NhZ2VTdHJpbmcuSXNFbXB0eSgpKTsKKyAgICBT
dHJpbmcgZXJyb3JNZXNzYWdlID0gVG9XZWJDb3JlU3RyaW5nKGVycm9yTWVzc2FnZVN0cmluZyk7
CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmVzb3VyY2VOYW1lID0gbWVzc2FnZS0+R2V0
U2NyaXB0UmVzb3VyY2VOYW1lKCk7CisgICAgYm9vbCB1c2VVUkwgPSAocmVzb3VyY2VOYW1lLklz
RW1wdHkoKSB8fCAhcmVzb3VyY2VOYW1lLT5Jc1N0cmluZygpKTsKKyAgICBTdHJpbmcgcmVzb3Vy
Y2VOYW1lU3RyaW5nID0gKHVzZVVSTCkgPyBmcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCkgOiBUb1dl
YkNvcmVTdHJpbmcocmVzb3VyY2VOYW1lKTsKKyAgICBKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2Ug
Y29uc29sZU1lc3NhZ2UoZXJyb3JNZXNzYWdlLCByZXNvdXJjZU5hbWVTdHJpbmcsIG1lc3NhZ2Ut
PkdldExpbmVOdW1iZXIoKSk7CisgICAgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjphZGRNZXNzYWdl
KHBhZ2UsIGNvbnNvbGVNZXNzYWdlKTsKK30KKworZW51bSBEZWxheVJlcG9ydGluZyB7CisgICAg
UkVQT1JUX0xBVEVSLAorICAgIFJFUE9SVF9OT1cKK307CisKK3N0YXRpYyB2b2lkIHJlcG9ydFVu
c2FmZUFjY2Vzc1RvKEZyYW1lKiB0YXJnZXQsIERlbGF5UmVwb3J0aW5nIGRlbGF5KQoreworICAg
IEFTU0VSVCh0YXJnZXQpOworICAgIERvY3VtZW50KiB0YXJnZXREb2N1bWVudCA9IHRhcmdldC0+
ZG9jdW1lbnQoKTsKKyAgICBpZiAoIXRhcmdldERvY3VtZW50KQorICAgICAgICByZXR1cm47CisK
KyAgICBGcmFtZSogc291cmNlID0gVjhQcm94eTo6cmV0cmlldmVGcmFtZUZvckVudGVyZWRDb250
ZXh0KCk7CisgICAgaWYgKCFzb3VyY2UgfHwgIXNvdXJjZS0+ZG9jdW1lbnQoKSkKKyAgICAgICAg
cmV0dXJuOyAgLy8gSWdub3JlIGVycm9yIGlmIHRoZSBzb3VyY2UgZG9jdW1lbnQgaXMgZ29uZS4K
KworICAgIERvY3VtZW50KiBzb3VyY2VEb2N1bWVudCA9IHNvdXJjZS0+ZG9jdW1lbnQoKTsKKwor
ICAgIC8vIEZJWE1FOiBUaGlzIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGNvbnRhaW4gbW9yZSBzcGVj
aWZpY3Mgb2Ygd2h5IHRoZSBzYW1lCisgICAgLy8gb3JpZ2luIGNoZWNrIGhhcyBmYWlsZWQuCisg
ICAgU3RyaW5nIHN0ciA9IFN0cmluZzo6Zm9ybWF0KCJVbnNhZmUgSmF2YVNjcmlwdCBhdHRlbXB0
IHRvIGFjY2VzcyBmcmFtZSAiCisgICAgICAgICJ3aXRoIFVSTCAlcyBmcm9tIGZyYW1lIHdpdGgg
VVJMICVzLiAiCisgICAgICAgICJEb21haW5zLCBwcm90b2NvbHMgYW5kIHBvcnRzIG11c3QgbWF0
Y2guXG4iLAorICAgICAgICB0YXJnZXREb2N1bWVudC0+dXJsKCkuc3RyaW5nKCkudXRmOCgpLmRh
dGEoKSwKKyAgICAgICAgc291cmNlRG9jdW1lbnQtPnVybCgpLnN0cmluZygpLnV0ZjgoKS5kYXRh
KCkpOworCisgICAgLy8gQnVpbGQgYSBjb25zb2xlIG1lc3NhZ2Ugd2l0aCBmYWtlIHNvdXJjZSBJ
RCBhbmQgbGluZSBudW1iZXIuCisgICAgY29uc3QgU3RyaW5nIGtTb3VyY2VJRCA9ICIiOworICAg
IGNvbnN0IGludCBrTGluZU51bWJlciA9IDE7CisgICAgSmF2YVNjcmlwdENvbnNvbGVNZXNzYWdl
IG1lc3NhZ2Uoc3RyLCBrU291cmNlSUQsIGtMaW5lTnVtYmVyKTsKKworICAgIGlmIChkZWxheSA9
PSBSRVBPUlRfTk9XKSB7CisgICAgICAgIC8vIE5PVEUodGMpOiBBcHBsZSBwcmludHMgdGhlIG1l
c3NhZ2UgaW4gdGhlIHRhcmdldCBwYWdlLCBidXQgaXQgc2VlbXMgbGlrZQorICAgICAgICAvLyBp
dCBzaG91bGQgYmUgaW4gdGhlIHNvdXJjZSBwYWdlLiBFdmVuIGZvciBkZWxheWVkIG1lc3NhZ2Vz
LCB3ZSBwdXQgaXQgaW4KKyAgICAgICAgLy8gdGhlIHNvdXJjZSBwYWdlOyBzZWUgQ29uc29sZU1l
c3NhZ2VNYW5hZ2VyOjpwcm9jZXNzRGVsYXllZE1lc3NhZ2VzKCkuCisgICAgICAgIENvbnNvbGVN
ZXNzYWdlTWFuYWdlcjo6YWRkTWVzc2FnZShzb3VyY2UtPnBhZ2UoKSwgbWVzc2FnZSk7CisKKyAg
ICB9IGVsc2UgeworICAgICAgICBBU1NFUlQoZGVsYXkgPT0gUkVQT1JUX0xBVEVSKTsKKyAgICAg
ICAgLy8gV2UgY2Fubm90IHNhZmVseSByZXBvcnQgdGhlIG1lc3NhZ2UgZWFnZXJseSwgYmVjYXVz
ZSB0aGlzIG1heSBjYXVzZQorICAgICAgICAvLyBhbGxvY2F0aW9ucyBhbmQgR0NzIGludGVybmFs
bHkgaW4gVjggYW5kIHdlIGNhbm5vdCBoYW5kbGUgdGhhdCBhdCB0aGlzCisgICAgICAgIC8vIHBv
aW50LiBUaGVyZWZvcmUgd2UgZGVsYXkgdGhlIHJlcG9ydGluZy4KKyAgICAgICAgQ29uc29sZU1l
c3NhZ2VNYW5hZ2VyOjphZGREZWxheWVkTWVzc2FnZShtZXNzYWdlKTsKKyAgICB9Cit9CisKK3N0
YXRpYyB2b2lkIHJlcG9ydFVuc2FmZUphdmFTY3JpcHRBY2Nlc3Modjg6OkxvY2FsPHY4OjpPYmpl
Y3Q+IGhvc3QsIHY4OjpBY2Nlc3NUeXBlIHR5cGUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGRhdGEp
Cit7CisgICAgRnJhbWUqIHRhcmdldCA9IFY4Q3VzdG9tOjpHZXRUYXJnZXRGcmFtZShob3N0LCBk
YXRhKTsKKyAgICBpZiAodGFyZ2V0KQorICAgICAgICByZXBvcnRVbnNhZmVBY2Nlc3NUbyh0YXJn
ZXQsIFJFUE9SVF9MQVRFUik7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZUZhdGFsRXJyb3JJblY4
KCkKK3sKKyAgICAvLyBGSVhNRTogV2UgdGVtcG9yYXJpbHkgZGVhbCB3aXRoIFY4IGludGVybmFs
IGVycm9yIHNpdHVhdGlvbnMKKyAgICAvLyBzdWNoIGFzIG91dC1vZi1tZW1vcnkgYnkgY3Jhc2hp
bmcgdGhlIHJlbmRlcmVyLgorICAgIENSQVNIKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlcG9ydEZh
dGFsRXJyb3JJblY4KGNvbnN0IGNoYXIqIGxvY2F0aW9uLCBjb25zdCBjaGFyKiBtZXNzYWdlKQor
eworICAgIC8vIFY4IGlzIHNodXRkb3duLCB3ZSBjYW5ub3QgdXNlIFY4IGFwaS4KKyAgICAvLyBU
aGUgb25seSB0aGluZyB3ZSBjYW4gZG8gaXMgdG8gZGlzYWJsZSBKYXZhU2NyaXB0LgorICAgIC8v
IEZJWE1FOiBjbGVhbiB1cCBWOFByb3h5IGFuZCBkaXNhYmxlIEphdmFTY3JpcHQuCisgICAgcHJp
bnRmKCJWOCBlcnJvcjogJXMgKCVzKVxuIiwgbWVzc2FnZSwgbG9jYXRpb24pOworICAgIGhhbmRs
ZUZhdGFsRXJyb3JJblY4KCk7Cit9CisKK1Y4UHJveHk6On5WOFByb3h5KCkKK3sKKyAgICBjbGVh
ckZvckNsb3NlKCk7CisgICAgZGVzdHJveUdsb2JhbCgpOworfQorCit2b2lkIFY4UHJveHk6OmRl
c3Ryb3lHbG9iYWwoKQoreworICAgIGlmICghbV9nbG9iYWwuSXNFbXB0eSgpKSB7CisjaWZuZGVm
IE5ERUJVRworICAgICAgICB1bnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMsIG1fZ2xvYmFsKTsK
KyNlbmRpZgorICAgICAgICBtX2dsb2JhbC5EaXNwb3NlKCk7CisgICAgICAgIG1fZ2xvYmFsLkNs
ZWFyKCk7CisgICAgfQorfQorCisKK2Jvb2wgVjhQcm94eTo6ZG9tT2JqZWN0SGFzSlNXcmFwcGVy
KHZvaWQqIG9iamVjdCkgeworICAgIHJldHVybiBnZXRET01PYmplY3RNYXAoKS5jb250YWlucyhv
YmplY3QpIHx8IGdldEFjdGl2ZURPTU9iamVjdE1hcCgpLmNvbnRhaW5zKG9iamVjdCk7Cit9CisK
Ky8vIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGluY3JlYXNlZCBvYmoncyByZWYgY291bnQuCit2b2lk
IFY4UHJveHk6OnNldEpTV3JhcHBlckZvckRPTU9iamVjdCh2b2lkKiBvYmplY3QsIHY4OjpQZXJz
aXN0ZW50PHY4OjpPYmplY3Q+IHdyYXBwZXIpCit7CisgICAgQVNTRVJUKG1heWJlRE9NV3JhcHBl
cih3cmFwcGVyKSk7CisjaWZuZGVmIE5ERUJVRworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVy
VHlwZSB0eXBlID0gVjhQcm94eTo6ZG9tV3JhcHBlclR5cGUod3JhcHBlcik7CisgICAgc3dpdGNo
ICh0eXBlKSB7CisjZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBOQU1FKSBjYXNlIFY4Q2xhc3NJbmRl
eDo6VFlQRToKKyAgICAgICAgQUNUSVZFX0RPTV9PQkpFQ1RfVFlQRVMoTUFLRV9DQVNFKQorICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyN1bmRlZiBNQUtFX0NBU0UKKyAgICBkZWZhdWx0
OgorICAgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYKKyAgICBnZXRET01PYmplY3RNYXAoKS5z
ZXQob2JqZWN0LCB3cmFwcGVyKTsKK30KKworLy8gVGhlIGNhbGxlciBtdXN0IGhhdmUgaW5jcmVh
c2VkIG9iaidzIHJlZiBjb3VudC4KK3ZvaWQgVjhQcm94eTo6c2V0SlNXcmFwcGVyRm9yQWN0aXZl
RE9NT2JqZWN0KHZvaWQqIG9iamVjdCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gd3JhcHBl
cikKK3sKKyAgICBBU1NFUlQobWF5YmVET01XcmFwcGVyKHdyYXBwZXIpKTsKKyNpZm5kZWYgTkRF
QlVHCisgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5Ojpkb21X
cmFwcGVyVHlwZSh3cmFwcGVyKTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyNkZWZpbmUgTUFLRV9D
QVNFKFRZUEUsIE5BTUUpIGNhc2UgVjhDbGFzc0luZGV4OjpUWVBFOiBicmVhazsKKyAgICAgICAg
QUNUSVZFX0RPTV9PQkpFQ1RfVFlQRVMoTUFLRV9DQVNFKQorICAgIGRlZmF1bHQ6IAorICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyN1bmRlZiBNQUtFX0NBU0UKKyAgICB9CisjZW5kaWYK
KyAgICBnZXRBY3RpdmVET01PYmplY3RNYXAoKS5zZXQob2JqZWN0LCB3cmFwcGVyKTsKK30KKwor
Ly8gVGhlIGNhbGxlciBtdXN0IGhhdmUgaW5jcmVhc2VkIG5vZGUncyByZWYgY291bnQuCit2b2lk
IFY4UHJveHk6OnNldEpTV3JhcHBlckZvckRPTU5vZGUoTm9kZSogbm9kZSwgdjg6OlBlcnNpc3Rl
bnQ8djg6Ok9iamVjdD4gd3JhcHBlcikKK3sKKyAgICBBU1NFUlQobWF5YmVET01XcmFwcGVyKHdy
YXBwZXIpKTsKKyAgICBnZXRET01Ob2RlTWFwKCkuc2V0KG5vZGUsIHdyYXBwZXIpOworfQorCisv
LyBFdmVudCBsaXN0ZW5lcnMKKworc3RhdGljIFY4RXZlbnRMaXN0ZW5lciogZmluZEV2ZW50TGlz
dGVuZXJJbkxpc3QoVjhFdmVudExpc3RlbmVyTGlzdCYgbGlzdCwgdjg6OkxvY2FsPHY4OjpWYWx1
ZT4gbGlzdGVuZXIsIGJvb2wgaXNJbmxpbmUpCit7CisgICAgQVNTRVJUKHY4OjpDb250ZXh0OjpJ
bkNvbnRleHQoKSk7CisKKyAgICBpZiAoIWxpc3RlbmVyLT5Jc09iamVjdCgpKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIHJldHVybiBsaXN0LmZpbmQobGlzdGVuZXItPlRvT2JqZWN0KCksIGlz
SW5saW5lKTsKK30KKworLy8gRmluZCBhbiBleGlzdGluZyB3cmFwcGVyIGZvciBhIEpTIGV2ZW50
IGxpc3RlbmVyIGluIHRoZSBtYXAuCitQYXNzUmVmUHRyPFY4RXZlbnRMaXN0ZW5lcj4gVjhQcm94
eTo6ZmluZFY4RXZlbnRMaXN0ZW5lcih2ODo6TG9jYWw8djg6OlZhbHVlPiBsaXN0ZW5lciwgYm9v
bCBpc0lubGluZSkKK3sKKyAgICByZXR1cm4gZmluZEV2ZW50TGlzdGVuZXJJbkxpc3QobV9ldmVu
dExpc3RlbmVycywgbGlzdGVuZXIsIGlzSW5saW5lKTsKK30KKworUGFzc1JlZlB0cjxWOEV2ZW50
TGlzdGVuZXI+IFY4UHJveHk6OmZpbmRPckNyZWF0ZVY4RXZlbnRMaXN0ZW5lcih2ODo6TG9jYWw8
djg6OlZhbHVlPiBvYmplY3QsIGJvb2wgaXNJbmxpbmUpCit7CisgICAgQVNTRVJUKHY4OjpDb250
ZXh0OjpJbkNvbnRleHQoKSk7CisKKyAgICBpZiAoIW9iamVjdC0+SXNPYmplY3QoKSkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBWOEV2ZW50TGlzdGVuZXIqIHdyYXBwZXIgPSBmaW5kRXZlbnRM
aXN0ZW5lckluTGlzdChtX2V2ZW50TGlzdGVuZXJzLCBvYmplY3QsIGlzSW5saW5lKTsKKyAgICBp
ZiAod3JhcHBlcikKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisKKyAgICAvLyBDcmVhdGUgYSBu
ZXcgb25lLCBhbmQgYWRkIHRvIGNhY2hlLgorICAgIFJlZlB0cjxWOEV2ZW50TGlzdGVuZXI+IG5l
d0xpc3RlbmVyID0gVjhFdmVudExpc3RlbmVyOjpjcmVhdGUobV9mcmFtZSwgdjg6OkxvY2FsPHY4
OjpPYmplY3Q+OjpDYXN0KG9iamVjdCksIGlzSW5saW5lKTsKKyAgICBtX2V2ZW50TGlzdGVuZXJz
LmFkZChuZXdMaXN0ZW5lci5nZXQoKSk7CisKKyAgICByZXR1cm4gbmV3TGlzdGVuZXI7Cit9CisK
Ky8vIE9iamVjdCBldmVudCBsaXN0ZW5lcnMgKHN1Y2ggYXMgWG1sSHR0cFJlcXVlc3QgYW5kIE1l
c3NhZ2VQb3J0KSBhcmUKKy8vIGRpZmZlcmVudCBmcm9tIGxpc3RlbmVycyBvbiBET00gbm9kZXMu
IEFuIG9iamVjdCBldmVudCBsaXN0ZW5lciB3cmFwcGVyCisvLyBvbmx5IGhvbGRzIGEgd2VhayBy
ZWZlcmVuY2UgdG8gdGhlIEpTIGZ1bmN0aW9uLiBBIHN0cm9uZyByZWZlcmVuY2UgY2FuCisvLyBj
cmVhdGUgYSBjeWNsZS4KKy8vCisvLyBUaGUgbGlmZXRpbWUgb2YgdGhlc2Ugb2JqZWN0cyBpcyBi
b3VuZGVkIGJ5IHRoZSBsaWZlIHRpbWUgb2YgaXRzIEpTCisvLyB3cmFwcGVyLiBTbyB3ZSBjYW4g
Y3JlYXRlIGEgaGlkZGVuIHJlZmVyZW5jZSBmcm9tIHRoZSBKUyB3cmFwcGVyIHRvCisvLyB0byBp
dHMgSlMgZnVuY3Rpb24uCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIChtYXApCisv
LyAgICAgICAgICAgICAgWEhSICAgICAgPC0tLS0tLS0tLS0gIEpTX3dyYXBwZXIKKy8vICAgICAg
ICAgICAgICAgfCAgICAgICAgICAgICAoaGlkZGVuKSA6ICBeCisvLyAgICAgICAgICAgICAgIFYg
ICAgICAgICAgICAgICAgICAgICAgViAgOiAobWF5IHJlYWNoYWJsZSBieSBjbG9zdXJlKQorLy8g
ICAgICAgICAgIFY4X2xpc3RlbmVyICAtLS0tLS0tLT4gSlNfZnVuY3Rpb24KKy8vICAgICAgICAg
ICAgICAgICAgICAgICAgICh3ZWFrKSAgPC0tIG1heSBjcmVhdGUgYSBjeWNsZSBpZiBpdCBpcyBz
dHJvbmcKKy8vCisvLyBUaGUgcGVyc2lzdGVudCByZWZlcmVuY2UgaXMgbWFkZSB3ZWFrIGluIHRo
ZSBjb25zdHJ1Y3RvcgorLy8gb2YgVjhPYmplY3RFdmVudExpc3RlbmVyLgorCitQYXNzUmVmUHRy
PFY4RXZlbnRMaXN0ZW5lcj4gVjhQcm94eTo6ZmluZE9iamVjdEV2ZW50TGlzdGVuZXIoIHY4OjpM
b2NhbDx2ODo6VmFsdWU+IGxpc3RlbmVyLCBib29sIGlzSW5saW5lKQoreworICAgIHJldHVybiBm
aW5kRXZlbnRMaXN0ZW5lckluTGlzdChtX3hockxpc3RlbmVycywgbGlzdGVuZXIsIGlzSW5saW5l
KTsKK30KKworUGFzc1JlZlB0cjxWOEV2ZW50TGlzdGVuZXI+IFY4UHJveHk6OmZpbmRPckNyZWF0
ZU9iamVjdEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1ZT4gb2JqZWN0LCBib29sIGlz
SW5saW5lKQoreworICAgIEFTU0VSVCh2ODo6Q29udGV4dDo6SW5Db250ZXh0KCkpOworCisgICAg
aWYgKCFvYmplY3QtPklzT2JqZWN0KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgVjhFdmVu
dExpc3RlbmVyKiB3cmFwcGVyID0gZmluZEV2ZW50TGlzdGVuZXJJbkxpc3QobV94aHJMaXN0ZW5l
cnMsIG9iamVjdCwgaXNJbmxpbmUpOworICAgIGlmICh3cmFwcGVyKQorICAgICAgICByZXR1cm4g
d3JhcHBlcjsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBvbmUsIGFuZCBhZGQgdG8gY2FjaGUuCisg
ICAgUmVmUHRyPFY4RXZlbnRMaXN0ZW5lcj4gbmV3TGlzdGVuZXIgPSBWOE9iamVjdEV2ZW50TGlz
dGVuZXI6OmNyZWF0ZShtX2ZyYW1lLCB2ODo6TG9jYWw8djg6Ok9iamVjdD46OkNhc3Qob2JqZWN0
KSwgaXNJbmxpbmUpOworICAgIG1feGhyTGlzdGVuZXJzLmFkZChuZXdMaXN0ZW5lci5nZXQoKSk7
CisKKyAgICByZXR1cm4gbmV3TGlzdGVuZXIucmVsZWFzZSgpOworfQorCisKK3N0YXRpYyB2b2lk
IHJlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTGlzdChWOEV2ZW50TGlzdGVuZXJMaXN0JiBsaXN0LCBW
OEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKQoreworICAgIGxpc3QucmVtb3ZlKGxpc3RlbmVyKTsK
K30KKwordm9pZCBWOFByb3h5OjpyZW1vdmVWOEV2ZW50TGlzdGVuZXIoVjhFdmVudExpc3RlbmVy
KiBsaXN0ZW5lcikKK3sKKyAgICByZW1vdmVFdmVudExpc3RlbmVyRnJvbUxpc3QobV9ldmVudExp
c3RlbmVycywgbGlzdGVuZXIpOworfQorCisKK3ZvaWQgVjhQcm94eTo6cmVtb3ZlT2JqZWN0RXZl
bnRMaXN0ZW5lcihWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKQoreworICAgIHJlbW92
ZUV2ZW50TGlzdGVuZXJGcm9tTGlzdChtX3hockxpc3RlbmVycywgbGlzdGVuZXIpOworfQorCitz
dGF0aWMgdm9pZCBkaXNjb25uZWN0RXZlbnRMaXN0ZW5lcnNJbkxpc3QoVjhFdmVudExpc3RlbmVy
TGlzdCYgbGlzdCkKK3sKKyAgICBWOEV2ZW50TGlzdGVuZXJMaXN0OjppdGVyYXRvciBpdCA9IGxp
c3QuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbGlzdC5lbmQoKSkgeworICAgICAgICAoKml0
KS0+ZGlzY29ubmVjdEZyYW1lKCk7CisgICAgICAgICsraXQ7CisgICAgfQorICAgIGxpc3QuY2xl
YXIoKTsKK30KKworCit2b2lkIFY4UHJveHk6OmRpc2Nvbm5lY3RFdmVudExpc3RlbmVycygpCit7
CisgICAgZGlzY29ubmVjdEV2ZW50TGlzdGVuZXJzSW5MaXN0KG1fZXZlbnRMaXN0ZW5lcnMpOwor
ICAgIGRpc2Nvbm5lY3RFdmVudExpc3RlbmVyc0luTGlzdChtX3hockxpc3RlbmVycyk7Cit9CisK
Kwordjg6OkhhbmRsZTx2ODo6U2NyaXB0PiBWOFByb3h5Ojpjb21waWxlU2NyaXB0KHY4OjpIYW5k
bGU8djg6OlN0cmluZz4gY29kZSwgY29uc3QgU3RyaW5nJiBmaWxlTmFtZSwgaW50IGJhc2VMaW5l
KQoreworICAgIGNvbnN0IHVpbnQxNl90KiBmaWxlTmFtZVN0cmluZyA9IEZyb21XZWJDb3JlU3Ry
aW5nKGZpbGVOYW1lKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IG5hbWUgPSB2ODo6U3Ry
aW5nOjpOZXcoZmlsZU5hbWVTdHJpbmcsIGZpbGVOYW1lLmxlbmd0aCgpKTsKKyAgICB2ODo6SGFu
ZGxlPHY4OjpJbnRlZ2VyPiBsaW5lID0gdjg6OkludGVnZXI6Ok5ldyhiYXNlTGluZSk7CisgICAg
djg6OlNjcmlwdE9yaWdpbiBvcmlnaW4obmFtZSwgbGluZSk7CisgICAgdjg6OkhhbmRsZTx2ODo6
U2NyaXB0PiBzY3JpcHQgPSB2ODo6U2NyaXB0OjpDb21waWxlKGNvZGUsICZvcmlnaW4pOworICAg
IHJldHVybiBzY3JpcHQ7Cit9CisKK2Jvb2wgVjhQcm94eTo6aGFuZGxlT3V0T2ZNZW1vcnkoKQor
eworICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0OjpHZXRD
dXJyZW50KCk7CisKKyAgICBpZiAoIWNvbnRleHQtPkhhc091dE9mTWVtb3J5RXhjZXB0aW9uKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFdhcm5pbmcsIGVycm9yLCBkaXNhYmxl
IEpTIGZvciB0aGlzIGZyYW1lPworICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6OnJldHJpZXZl
RnJhbWUoY29udGV4dCk7CisKKyAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZl
KGZyYW1lKTsKKyAgICBpZiAocHJveHkpIHsKKyAgICAgICAgLy8gQ2xlYW4gbV9jb250ZXh0LCBh
bmQgZXZlbnQgaGFuZGxlcnMuCisgICAgICAgIHByb3h5LT5jbGVhckZvckNsb3NlKCk7CisgICAg
ICAgIC8vIERlc3Ryb3kgdGhlIGdsb2JhbCBvYmplY3QuCisgICAgICAgIHByb3h5LT5kZXN0cm95
R2xvYmFsKCk7CisgICAgfQorCisgICAgQ2hyb21pdW1CcmlkZ2U6Om5vdGlmeUpTT3V0T2ZNZW1v
cnkoZnJhbWUpOworCisgICAgLy8gRGlzYWJsZSBKUy4KKyAgICBTZXR0aW5ncyogc2V0dGluZ3Mg
PSBmcmFtZS0+c2V0dGluZ3MoKTsKKyAgICBBU1NFUlQoc2V0dGluZ3MpOworICAgIHNldHRpbmdz
LT5zZXRKYXZhU2NyaXB0RW5hYmxlZChmYWxzZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
dm9pZCBWOFByb3h5OjpldmFsdWF0ZUluTmV3Q29udGV4dChjb25zdCBWZWN0b3I8U2NyaXB0U291
cmNlQ29kZT4mIHNvdXJjZXMpCit7CisgICAgaW5pdENvbnRleHRJZk5lZWRlZCgpOworCisgICAg
djg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworCisgICAgLy8gU2V0IHVwIHRoZSBET00gd2lu
ZG93IGFzIHRoZSBwcm90b3R5cGUgb2YgdGhlIG5ldyBnbG9iYWwgb2JqZWN0LgorICAgIHY4OjpI
YW5kbGU8djg6OkNvbnRleHQ+IHdpbmRvd0NvbnRleHQgPSBtX2NvbnRleHQ7CisgICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiB3aW5kb3dHbG9iYWwgPSB3aW5kb3dDb250ZXh0LT5HbG9iYWwoKTsK
KyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd2luZG93V3JhcHBlciA9IFY4UHJveHk6Omxvb2t1
cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIHdpbmRvd0dsb2JhbCk7CisKKyAg
ICBBU1NFUlQoVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxET01XaW5kb3c+KHdp
bmRvd1dyYXBwZXIpID09IG1fZnJhbWUtPmRvbVdpbmRvdygpKTsKKworICAgIHY4OjpQZXJzaXN0
ZW50PHY4OjpDb250ZXh0PiBjb250ZXh0ID0gY3JlYXRlTmV3Q29udGV4dCh2ODo6SGFuZGxlPHY4
OjpPYmplY3Q+KCkpOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0U2NvcGUoY29udGV4
dCk7CisKKyAgICAvLyBTZXR1cCBjb250ZXh0IGlkIGZvciBKUyBkZWJ1Z2dlci4KKyAgICB2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+IGNvbnRleHREYXRhID0gdjg6Ok9iamVjdDo6TmV3KCk7CisgICAg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IHdpbmRvd0NvbnRleHREYXRhID0gd2luZG93Q29udGV4dC0+
R2V0RGF0YSgpOworICAgIGlmICh3aW5kb3dDb250ZXh0RGF0YS0+SXNPYmplY3QoKSkgeworICAg
ICAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IHByb3BlcnR5TmFtZSA9IHY4OjpTdHJpbmc6Ok5l
dyhrQ29udGV4dERlYnVnRGF0YVZhbHVlKTsKKyAgICAgICAgY29udGV4dERhdGEtPlNldChwcm9w
ZXJ0eU5hbWUsIHY4OjpPYmplY3Q6OkNhc3QoKndpbmRvd0NvbnRleHREYXRhKS0+R2V0KHByb3Bl
cnR5TmFtZSkpOworICAgIH0KKyAgICBjb250ZXh0RGF0YS0+U2V0KHY4OjpTdHJpbmc6Ok5ldyhr
Q29udGV4dERlYnVnRGF0YVR5cGUpLCB2ODo6U3RyaW5nOjpOZXcoImluamVjdGVkIikpOworICAg
IGNvbnRleHQtPlNldERhdGEoY29udGV4dERhdGEpOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0PiBnbG9iYWwgPSBjb250ZXh0LT5HbG9iYWwoKTsKKworICAgIHY4OjpIYW5kbGU8djg6OlN0
cmluZz4gaW1wbGljaXRQcm90b1N0cmluZyA9IHY4OjpTdHJpbmc6Ok5ldygiX19wcm90b19fIik7
CisgICAgZ2xvYmFsLT5TZXQoaW1wbGljaXRQcm90b1N0cmluZywgd2luZG93V3JhcHBlcik7CisK
KyAgICAvLyBHaXZlIHRoZSBjb2RlIHJ1bm5pbmcgaW4gdGhlIG5ldyBjb250ZXh0IGEgd2F5IHRv
IGdldCBhY2Nlc3MgdG8gdGhlCisgICAgLy8gb3JpZ2luYWwgY29udGV4dC4KKyAgICBnbG9iYWwt
PlNldCh2ODo6U3RyaW5nOjpOZXcoImNvbnRlbnRXaW5kb3ciKSwgd2luZG93R2xvYmFsKTsKKwor
ICAgIC8vIFJ1biBjb2RlIGluIHRoZSBuZXcgY29udGV4dC4KKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IHNvdXJjZXMuc2l6ZSgpOyArK2kpCisgICAgICAgIGV2YWx1YXRlKHNvdXJjZXNbaV0s
IDApOworCisgICAgLy8gVXNpbmcgdGhlIGRlZmF1bHQgc2VjdXJpdHkgdG9rZW4gbWVhbnMgdGhh
dCB0aGUgY2FuQWNjZXNzIGlzIGFsd2F5cworICAgIC8vIGNhbGxlZCwgd2hpY2ggaXMgc2xvdy4K
KyAgICAvLyBGSVhNRTogVXNlIHRva2VucyB3aGVyZSBwb3NzaWJsZS4gVGhpcyB3aWxsIG1lYW4g
a2VlcGluZyB0cmFjayBvZiBhbGwKKyAgICAvLyBjcmVhdGVkIGNvbnRleHRzIHNvIHRoYXQgdGhl
eSBjYW4gYWxsIGJlIHVwZGF0ZWQgd2hlbiB0aGUgZG9jdW1lbnQgZG9tYWluCisgICAgLy8gY2hh
bmdlcy4KKyAgICBjb250ZXh0LT5Vc2VEZWZhdWx0U2VjdXJpdHlUb2tlbigpOworICAgIGNvbnRl
eHQuRGlzcG9zZSgpOworfQorCit2ODo6TG9jYWw8djg6OlZhbHVlPiBWOFByb3h5OjpldmFsdWF0
ZShjb25zdCBTY3JpcHRTb3VyY2VDb2RlJiBzb3VyY2UsIE5vZGUqIG5vZGUpCit7CisgICAgQVNT
RVJUKHY4OjpDb250ZXh0OjpJbkNvbnRleHQoKSk7CisKKyAgICAvLyBDb21waWxlIHRoZSBzY3Jp
cHQuCisgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGNvZGUgPSB2OEV4dGVybmFsU3RyaW5nKHNv
dXJjZS5zb3VyY2UoKSk7CisgICAgQ2hyb21pdW1CcmlkZ2U6OnRyYWNlRXZlbnRCZWdpbigidjgu
Y29tcGlsZSIsIG5vZGUsICIiKTsKKworICAgIC8vIE5PVEU6IEZvciBjb21wYXRpYmlsaXR5IHdp
dGggV2ViQ29yZSwgU2NyaXB0U291cmNlQ29kZSdzIGxpbmUgc3RhcnRzIGF0CisgICAgLy8gMSwg
d2hlcmVhcyB2OCBzdGFydHMgYXQgMC4KKyAgICB2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IHNjcmlw
dCA9IGNvbXBpbGVTY3JpcHQoY29kZSwgc291cmNlLnVybCgpLCBzb3VyY2Uuc3RhcnRMaW5lKCkg
LSAxKTsKKyAgICBDaHJvbWl1bUJyaWRnZTo6dHJhY2VFdmVudEVuZCgidjguY29tcGlsZSIsIG5v
ZGUsICIiKTsKKworICAgIENocm9taXVtQnJpZGdlOjp0cmFjZUV2ZW50QmVnaW4oInY4LnJ1biIs
IG5vZGUsICIiKTsKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQ7CisgICAgeworICAg
ICAgICAvLyBJc29sYXRlIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciB3aGVuIGV4ZWN1dGluZyB0aGUg
Y29kZS4gIFRoZXNlCisgICAgICAgIC8vIGV4Y2VwdGlvbnMgc2hvdWxkIG5vdCBpbnRlcmZlcmUg
d2l0aCBqYXZhc2NyaXB0IGNvZGUgd2UgbWlnaHQKKyAgICAgICAgLy8gZXZhbHVhdGUgZnJvbSBD
Kysgd2hlbiByZXR1cm5pbmcgZnJvbSBoZXJlCisgICAgICAgIHY4OjpUcnlDYXRjaCB0cnlDYXRj
aDsKKyAgICAgICAgdHJ5Q2F0Y2guU2V0VmVyYm9zZSh0cnVlKTsKKworICAgICAgICAvLyBTZXQg
aW5saW5lQ29kZSB0byB0cnVlIGZvciA8YSBocmVmPSJqYXZhc2NyaXB0OmRvU29tZXRoaW5nKCki
PgorICAgICAgICAvLyBhbmQgZmFsc2UgZm9yIDxzY3JpcHQ+ZG9Tb21ldGhpbmc8L3NjcmlwdD4u
IFdlIG1ha2UgYSByb3VnaCBndWVzcyBhdAorICAgICAgICAvLyB0aGlzIGJhc2VkIG9uIHdoZXRo
ZXIgdGhlIHNjcmlwdCBzb3VyY2UgaGFzIGEgVVJMLgorICAgICAgICByZXN1bHQgPSBydW5TY3Jp
cHQoc2NyaXB0LCBzb3VyY2UudXJsKCkuc3RyaW5nKCkuaXNOdWxsKCkpOworICAgIH0KKyAgICBD
aHJvbWl1bUJyaWRnZTo6dHJhY2VFdmVudEVuZCgidjgucnVuIiwgbm9kZSwgIiIpOworICAgIHJl
dHVybiByZXN1bHQ7Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFY4UHJveHk6OnJ1blNjcmlw
dCh2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IHNjcmlwdCwgYm9vbCBpc0lubGluZUNvZGUpCit7Cisg
ICAgaWYgKHNjcmlwdC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRl
cmNlcHRvcigpOworCisgICAgLy8gQ29tcHV0ZSB0aGUgc291cmNlIHN0cmluZyBhbmQgcHJldmVu
dCBhZ2FpbnN0IGluZmluaXRlIHJlY3Vyc2lvbi4KKyAgICBpZiAobV9yZWN1cnNpb24gPj0ga01h
eFJlY3Vyc2lvbkRlcHRoKSB7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBjb2RlID0g
djhFeHRlcm5hbFN0cmluZygidGhyb3cgUmFuZ2VFcnJvcignUmVjdXJzaW9uIHRvbyBkZWVwJyki
KTsKKyAgICAgICAgLy8gRklYTUU6IElkZWFsbHksIHdlIHNob3VsZCBiZSBhYmxlIHRvIHJlLXVz
ZSB0aGUgb3JpZ2luIG9mIHRoZQorICAgICAgICAvLyBzY3JpcHQgcGFzc2VkIHRvIHVzIGFzIHRo
ZSBhcmd1bWVudCBpbnN0ZWFkIG9mIHVzaW5nIGFuIGVtcHR5IHN0cmluZworICAgICAgICAvLyBh
bmQgMCBiYXNlTGluZS4KKyAgICAgICAgc2NyaXB0ID0gY29tcGlsZVNjcmlwdChjb2RlLCAiIiwg
MCk7CisgICAgfQorCisgICAgaWYgKGhhbmRsZU91dE9mTWVtb3J5KCkpCisgICAgICAgIEFTU0VS
VChzY3JpcHQuSXNFbXB0eSgpKTsKKworICAgIGlmIChzY3JpcHQuSXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKworICAgIC8vIFNhdmUgdGhlIHBy
ZXZpb3VzIHZhbHVlIG9mIHRoZSBpbmxpbmVDb2RlIGZsYWcgYW5kIHVwZGF0ZSB0aGUgZmxhZyBm
b3IKKyAgICAvLyB0aGUgZHVyYXRpb24gb2YgdGhlIHNjcmlwdCBpbnZvY2F0aW9uLgorICAgIGJv
b2wgcHJldmlvdXNJbmxpbmVDb2RlID0gaW5saW5lQ29kZSgpOworICAgIHNldElubGluZUNvZGUo
aXNJbmxpbmVDb2RlKTsKKworICAgIC8vIFJ1biB0aGUgc2NyaXB0IGFuZCBrZWVwIHRyYWNrIG9m
IHRoZSBjdXJyZW50IHJlY3Vyc2lvbiBkZXB0aC4KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBy
ZXN1bHQ7CisgICAgeworICAgICAgICBDb25zb2xlTWVzc2FnZVNjb3BlIHNjb3BlOworICAgICAg
ICBtX3JlY3Vyc2lvbisrOworCisgICAgICAgIC8vIEV2YWx1YXRpbmcgdGhlIEphdmFTY3JpcHQg
Y291bGQgY2F1c2UgdGhlIGZyYW1lIHRvIGJlIGRlYWxsb2NhdGVkLAorICAgICAgICAvLyBzbyB3
ZSBzdGFydCB0aGUga2VlcCBhbGl2ZSB0aW1lciBoZXJlLgorICAgICAgICAvLyBGcmFtZTo6a2Vl
cEFsaXZlIG1ldGhvZCBhZGRzIHRoZSByZWYgY291bnQgb2YgdGhlIGZyYW1lIGFuZCBzZXRzIGEK
KyAgICAgICAgLy8gdGltZXIgdG8gZGVjcmVhc2UgdGhlIHJlZiBjb3VudC4gSXQgYXNzdW1lcyB0
aGF0IHRoZSBjdXJyZW50IEphdmFTY3JpcHQKKyAgICAgICAgLy8gZXhlY3V0aW9uIGZpbmlzaHMg
YmVmb3JlIGZpcmluZyB0aGUgdGltZXIuCisgICAgICAgIC8vIFNlZSBpc3N1ZSAxMjE4NzU2IGFu
ZCA5MTQ0MzAuCisgICAgICAgIG1fZnJhbWUtPmtlZXBBbGl2ZSgpOworCisgICAgICAgIHJlc3Vs
dCA9IHNjcmlwdC0+UnVuKCk7CisgICAgICAgIG1fcmVjdXJzaW9uLS07CisgICAgfQorCisgICAg
aWYgKGhhbmRsZU91dE9mTWVtb3J5KCkpCisgICAgICAgIEFTU0VSVChyZXN1bHQuSXNFbXB0eSgp
KTsKKworICAgIC8vIEhhbmRsZSBWOCBpbnRlcm5hbCBlcnJvciBzaXR1YXRpb24gKE91dC1vZi1t
ZW1vcnkpLgorICAgIGlmIChyZXN1bHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gbm90SGFu
ZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKworICAgIC8vIFJlc3RvcmUgaW5saW5lQ29kZSBmbGFnLgor
ICAgIHNldElubGluZUNvZGUocHJldmlvdXNJbmxpbmVDb2RlKTsKKworICAgIGlmICh2ODo6Vjg6
OklzRGVhZCgpKQorICAgICAgICBoYW5kbGVGYXRhbEVycm9ySW5WOCgpOworCisgICAgcmV0dXJu
IHJlc3VsdDsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y2FsbEZ1bmN0aW9u
KHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiBmdW5jdGlvbiwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0
PiByZWNlaXZlciwgaW50IGFyZ2MsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmdzW10pCit7Cisg
ICAgLy8gRm9yIG5vdywgd2UgZG9uJ3QgcHV0IGFueSBhcnRpZmljaWFsIGxpbWl0YXRpb25zIG9u
IHRoZSBkZXB0aAorICAgIC8vIG9mIHJlY3Vyc2lvbiB0aGF0IHN0ZW1zIGZyb20gY2FsbGluZyBm
dW5jdGlvbnMuIFRoaXMgaXMgaW4KKyAgICAvLyBjb250cmFzdCB0byB0aGUgc2NyaXB0IGV2YWx1
YXRpb25zLgorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJlc3VsdDsKKyAgICB7CisgICAgICAg
IENvbnNvbGVNZXNzYWdlU2NvcGUgc2NvcGU7CisKKyAgICAgICAgLy8gRXZhbHVhdGluZyB0aGUg
SmF2YVNjcmlwdCBjb3VsZCBjYXVzZSB0aGUgZnJhbWUgdG8gYmUgZGVhbGxvY2F0ZWQsCisgICAg
ICAgIC8vIHNvIHdlIHN0YXJ0IHRoZSBrZWVwIGFsaXZlIHRpbWVyIGhlcmUuCisgICAgICAgIC8v
IEZyYW1lOjprZWVwQWxpdmUgbWV0aG9kIGFkZHMgdGhlIHJlZiBjb3VudCBvZiB0aGUgZnJhbWUg
YW5kIHNldHMgYQorICAgICAgICAvLyB0aW1lciB0byBkZWNyZWFzZSB0aGUgcmVmIGNvdW50LiBJ
dCBhc3N1bWVzIHRoYXQgdGhlIGN1cnJlbnQgSmF2YVNjcmlwdAorICAgICAgICAvLyBleGVjdXRp
b24gZmluaXNocyBiZWZvcmUgZmlyaW5nIHRoZSB0aW1lci4KKyAgICAgICAgLy8gU2VlIGlzc3Vl
IDEyMTg3NTYgYW5kIDkxNDQzMC4KKyAgICAgICAgbV9mcmFtZS0+a2VlcEFsaXZlKCk7CisKKyAg
ICAgICAgcmVzdWx0ID0gZnVuY3Rpb24tPkNhbGwocmVjZWl2ZXIsIGFyZ2MsIGFyZ3MpOworICAg
IH0KKworICAgIGlmICh2ODo6Vjg6OklzRGVhZCgpKQorICAgICAgICBoYW5kbGVGYXRhbEVycm9y
SW5WOCgpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4g
VjhQcm94eTo6bmV3SW5zdGFuY2Uodjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+IGNvbnN0cnVjdG9y
LCBpbnQgYXJnYywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZ3NbXSkKK3sKKyAgICAvLyBObyBh
cnRpZmljaWFsIGxpbWl0YXRpb25zIG9uIHRoZSBkZXB0aCBvZiByZWN1cnNpb24sIHNlZSBjb21t
ZW50IGluCisgICAgLy8gVjhQcm94eTo6Y2FsbEZ1bmN0aW9uLgorICAgIHY4OjpMb2NhbDx2ODo6
VmFsdWU+IHJlc3VsdDsKKyAgICB7CisgICAgICAgIENvbnNvbGVNZXNzYWdlU2NvcGUgc2NvcGU7
CisKKyAgICAgICAgLy8gU2VlIGNvbW1lbnQgaW4gVjhQcm94eTo6Y2FsbEZ1bmN0aW9uLgorICAg
ICAgICBtX2ZyYW1lLT5rZWVwQWxpdmUoKTsKKworICAgICAgICByZXN1bHQgPSBjb25zdHJ1Y3Rv
ci0+TmV3SW5zdGFuY2UoYXJnYywgYXJncyk7CisgICAgfQorCisgICAgaWYgKHY4OjpWODo6SXNE
ZWFkKCkpCisgICAgICAgIGhhbmRsZUZhdGFsRXJyb3JJblY4KCk7CisKKyAgICByZXR1cm4gcmVz
dWx0OworfQorCit2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBWOFByb3h5OjpnZXRDb25zdHJ1Y3Rv
cihWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSkKK3sKKyAgICAvLyBBIERPTSBjb25z
dHJ1Y3RvciBpcyBhIGZ1bmN0aW9uIGluc3RhbmNlIGNyZWF0ZWQgZnJvbSBhIERPTSBjb25zdHJ1
Y3RvcgorICAgIC8vIHRlbXBsYXRlLiBUaGVyZSBpcyBvbmUgaW5zdGFuY2UgcGVyIGNvbnRleHQu
IEEgRE9NIGNvbnN0cnVjdG9yIGlzCisgICAgLy8gZGlmZmVyZW50IGZyb20gYSBub3JtYWwgZnVu
Y3Rpb24gaW4gdHdvIHdheXM6CisgICAgLy8gICAxKSBpdCBjYW5ub3QgYmUgY2FsbGVkIGFzIGNv
bnN0cnVjdG9yIChha2EsIHVzZWQgdG8gY3JlYXRlIGEgRE9NIG9iamVjdCkKKyAgICAvLyAgIDIp
IGl0cyBfX3Byb3RvX18gcG9pbnRzIHRvIE9iamVjdC5wcm90b3R5cGUgcmF0aGVyIHRoYW4KKyAg
ICAvLyAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS4KKyAgICAvLyBUaGUgcmVhc29uIGZvciAyKSBp
cyB0aGF0LCBpbiBTYWZhcmksIGEgRE9NIGNvbnN0cnVjdG9yIGlzIGEgbm9ybWFsIEpTCisgICAg
Ly8gb2JqZWN0LCBidXQgbm90IGEgZnVuY3Rpb24uIEhvdG1haWwgcmVsaWVzIG9uIHRoZSBmYWN0
IHRoYXQsIGluIFNhZmFyaSwKKyAgICAvLyBIVE1MRWxlbWVudC5fX3Byb3RvX18gPT0gT2JqZWN0
LnByb3RvdHlwZS4KKyAgICAvLworICAgIC8vIG1fb2JqZWN0UHJvdG90eXBlIGlzIGEgY2FjaGUg
b2YgdGhlIG9yaWdpbmFsIE9iamVjdC5wcm90b3R5cGUuCisKKyAgICBBU1NFUlQoaXNDb250ZXh0
SW5pdGlhbGl6ZWQoKSk7CisgICAgLy8gRW50ZXIgdGhlIGNvbnRleHQgb2YgdGhlIHByb3h5IHRv
IG1ha2Ugc3VyZSB0aGF0IHRoZQorICAgIC8vIGZ1bmN0aW9uIGlzIGNvbnN0cnVjdGVkIGluIHRo
ZSBjb250ZXh0IGNvcnJlc3BvbmRpbmcgdG8KKyAgICAvLyB0aGlzIHByb3h5LgorICAgIHY4OjpD
b250ZXh0OjpTY29wZSBzY29wZShtX2NvbnRleHQpOworICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0
aW9uVGVtcGxhdGU+IGZ1bmN0aW9uVGVtcGxhdGUgPSBnZXRUZW1wbGF0ZSh0eXBlKTsKKyAgICAv
LyBHZXR0aW5nIHRoZSBmdW5jdGlvbiBtaWdodCBmYWlsIGlmIHdlJ3JlIHJ1bm5pbmcgb3V0IG9m
CisgICAgLy8gc3RhY2sgb3IgbWVtb3J5LgorICAgIHY4OjpUcnlDYXRjaCB0cnlDYXRjaDsKKyAg
ICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiB2YWx1ZSA9IGZ1bmN0aW9uVGVtcGxhdGUtPkdldEZ1
bmN0aW9uKCk7CisgICAgaWYgKHZhbHVlLklzRW1wdHkoKSkKKyAgICAgIHJldHVybiB2ODo6TG9j
YWw8djg6OkZ1bmN0aW9uPigpOworICAgIC8vIEhvdG1haWwgZml4LCBzZWUgY29tbWVudHMgYWJv
dmUuCisgICAgdmFsdWUtPlNldCh2ODo6U3RyaW5nOjpOZXcoIl9fcHJvdG9fXyIpLCBtX29iamVj
dFByb3RvdHlwZSk7CisgICAgcmV0dXJuIHZhbHVlOworfQorCit2ODo6TG9jYWw8djg6Ok9iamVj
dD4gVjhQcm94eTo6Y3JlYXRlV3JhcHBlckZyb21DYWNoZShWOENsYXNzSW5kZXg6OlY4V3JhcHBl
clR5cGUgdHlwZSkKK3sKKyAgICBpbnQgY2xhc3NJbmRleCA9IFY4Q2xhc3NJbmRleDo6VG9JbnQo
dHlwZSk7CisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gY2FjaGVkT2JqZWN0ID0gbV93cmFwcGVy
Qm9pbGVycGxhdGVzLT5HZXQodjg6OkludGVnZXI6Ok5ldyhjbGFzc0luZGV4KSk7CisgICAgaWYg
KGNhY2hlZE9iamVjdC0+SXNPYmplY3QoKSkgeworICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVj
dD4gb2JqZWN0ID0gdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpDYXN0KGNhY2hlZE9iamVjdCk7Cisg
ICAgICAgIHJldHVybiBvYmplY3QtPkNsb25lKCk7CisgICAgfQorCisgICAgLy8gTm90IGluIGNh
Y2hlLgorICAgIGluaXRDb250ZXh0SWZOZWVkZWQoKTsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUg
c2NvcGUobV9jb250ZXh0KTsKKyAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBmdW5jdGlvbiA9
IGdldENvbnN0cnVjdG9yKHR5cGUpOworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBpbnN0YW5j
ZSA9IFNhZmVBbGxvY2F0aW9uOjpuZXdJbnN0YW5jZShmdW5jdGlvbik7CisgICAgaWYgKCFpbnN0
YW5jZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgbV93cmFwcGVyQm9pbGVycGxhdGVzLT5TZXQodjg6
OkludGVnZXI6Ok5ldyhjbGFzc0luZGV4KSwgaW5zdGFuY2UpOworICAgICAgICByZXR1cm4gaW5z
dGFuY2UtPkNsb25lKCk7CisgICAgfQorICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRv
cigpOworfQorCisvLyBHZXQgdGhlIHN0cmluZyAndG9TdHJpbmcnLgorc3RhdGljIHY4OjpQZXJz
aXN0ZW50PHY4OjpTdHJpbmc+IEdldFRvU3RyaW5nTmFtZSgpCit7CisgICAgREVGSU5FX1NUQVRJ
Q19MT0NBTCh2ODo6UGVyc2lzdGVudDx2ODo6U3RyaW5nPiwgdmFsdWUsICgpKTsKKyAgICBpZiAo
dmFsdWUuSXNFbXB0eSgpKQorICAgICAgICB2YWx1ZSA9IHY4OjpQZXJzaXN0ZW50PHY4OjpTdHJp
bmc+OjpOZXcodjg6OlN0cmluZzo6TmV3KCJ0b1N0cmluZyIpKTsKKyAgICByZXR1cm4gdmFsdWU7
Cit9CisKK3N0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gQ29uc3RydWN0b3JUb1N0cmluZyhj
b25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKQoreworICAgIC8vIFRoZSBET00gY29uc3RydWN0b3Jz
JyB0b1N0cmluZyBmdW5jdGlvbnMgZ3JhYiB0aGUgY3VycmVudCB0b1N0cmluZworICAgIC8vIGZv
ciBGdW5jdGlvbnMgYnkgdGFraW5nIHRoZSB0b1N0cmluZyBmdW5jdGlvbiBvZiBpdHNlbGYgYW5k
IHRoZW4KKyAgICAvLyBjYWxsaW5nIGl0IHdpdGggdGhlIGNvbnN0cnVjdG9yIGFzIGl0cyByZWNl
aXZlci4gIFRoaXMgbWVhbnMgdGhhdAorICAgIC8vIGNoYW5nZXMgdG8gdGhlIEZ1bmN0aW9uIHBy
b3RvdHlwZSBjaGFpbiBvciB0b1N0cmluZyBmdW5jdGlvbiBhcmUKKyAgICAvLyByZWZsZWN0ZWQg
d2hlbiBwcmludGluZyBET00gY29uc3RydWN0b3JzLiAgVGhlIG9ubHkgd2FydCBpcyB0aGF0Cisg
ICAgLy8gY2hhbmdlcyB0byBhIERPTSBjb25zdHJ1Y3RvcidzIHRvU3RyaW5nJ3MgdG9TdHJpbmcg
d2lsbCBjYXVzZSB0aGUKKyAgICAvLyB0b1N0cmluZyBvZiB0aGUgRE9NIGNvbnN0cnVjdG9yIGl0
c2VsZiB0byBjaGFuZ2UuICBUaGlzIGlzIGV4dHJlbWVseQorICAgIC8vIG9ic2N1cmUgYW5kIHVu
bGlrZWx5IHRvIGJlIGEgcHJvYmxlbS4KKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUg
PSBhcmdzLkNhbGxlZSgpLT5HZXQoR2V0VG9TdHJpbmdOYW1lKCkpOworICAgIGlmICghdmFsdWUt
PklzRnVuY3Rpb24oKSkgCisgICAgICAgIHJldHVybiB2ODo6U3RyaW5nOjpOZXcoIiIpOworICAg
IHJldHVybiB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj46OkNhc3QodmFsdWUpLT5DYWxsKGFyZ3Mu
VGhpcygpLCAwLCAwKTsKK30KKwordjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+
IFY4UHJveHk6OmdldFRlbXBsYXRlKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlKQor
eworICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiogY2FjaGVDZWxsID0g
VjhDbGFzc0luZGV4OjpHZXRDYWNoZSh0eXBlKTsKKyAgICBpZiAoISgqY2FjaGVDZWxsKS5Jc0Vt
cHR5KCkpCisgICAgICAgIHJldHVybiAqY2FjaGVDZWxsOworCisgICAgLy8gbm90IGZvdW5kCisg
ICAgRnVuY3Rpb25UZW1wbGF0ZUZhY3RvcnkgZmFjdG9yeSA9IFY4Q2xhc3NJbmRleDo6R2V0RmFj
dG9yeSh0eXBlKTsKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gZGVz
Y3JpcHRvciA9IGZhY3RvcnkoKTsKKyAgICAvLyBET00gY29uc3RydWN0b3JzIGFyZSBmdW5jdGlv
bnMgYW5kIHNob3VsZCBwcmludCB0aGVtc2VsdmVzIGFzIHN1Y2guCisgICAgLy8gSG93ZXZlciwg
d2Ugd2lsbCBsYXRlciByZXBsYWNlIHRoZWlyIHByb3RvdHlwZXMgd2l0aCBPYmplY3QKKyAgICAv
LyBwcm90b3R5cGVzIHNvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBvdmVycmlkZSB0b1N0cmluZyBv
biB0aGUKKyAgICAvLyBpbnN0YW5jZSBpdHNlbGYuICBJZiB3ZSBsYXRlciBtYWtlIERPTSBjb25z
dHJ1Y3RvcnMgZnVsbCBvYmplY3RzCisgICAgLy8gd2UgY2FuIGdpdmUgdGhlbSBjbGFzcyBuYW1l
cyBpbnN0ZWFkIGFuZCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nCisgICAgLy8gd2lsbCB3b3Jr
IHNvIHdlIGNhbiByZW1vdmUgdGhpcyBjb2RlLgorICAgIERFRklORV9TVEFUSUNfTE9DQUwodjg6
OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+LCB0b1N0cmluZ1RlbXBsYXRlLCAoKSk7
CisgICAgaWYgKHRvU3RyaW5nVGVtcGxhdGUuSXNFbXB0eSgpKQorICAgICAgICB0b1N0cmluZ1Rl
bXBsYXRlID0gdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+OjpOZXcodjg6OkZ1
bmN0aW9uVGVtcGxhdGU6Ok5ldyhDb25zdHJ1Y3RvclRvU3RyaW5nKSk7CisgICAgZGVzY3JpcHRv
ci0+U2V0KEdldFRvU3RyaW5nTmFtZSgpLCB0b1N0cmluZ1RlbXBsYXRlKTsKKyAgICBzd2l0Y2gg
KHR5cGUpIHsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q1NTU1RZTEVERUNMQVJBVElPTjoKKyAg
ICAgICAgLy8gVGhlIG5hbWVkIHByb3BlcnR5IGhhbmRsZXIgZm9yIHN0eWxlIGRlY2xhcmF0aW9u
cyBoYXMgYQorICAgICAgICAvLyBzZXR0ZXIuICBUaGVyZWZvcmUsIHRoZSBpbnRlcmNlcHRvciBo
YXMgdG8gYmUgb24gdGhlIG9iamVjdAorICAgICAgICAvLyBpdHNlbGYgYW5kIG5vdCBvbiB0aGUg
cHJvdG90eXBlIG9iamVjdC4KKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgp
LT5TZXROYW1lZFByb3BlcnR5SGFuZGxlciggVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihDU1NT
dHlsZURlY2xhcmF0aW9uKSwgVVNFX05BTUVEX1BST1BFUlRZX1NFVFRFUihDU1NTdHlsZURlY2xh
cmF0aW9uKSk7CisgICAgICAgIHNldENvbGxlY3Rpb25TdHJpbmdPck51bGxJbmRleGVkR2V0dGVy
PENTU1N0eWxlRGVjbGFyYXRpb24+KGRlc2NyaXB0b3IpOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIFY4Q2xhc3NJbmRleDo6Q1NTUlVMRUxJU1Q6CisgICAgICAgIHNldENvbGxlY3Rpb25JbmRl
eGVkR2V0dGVyPENTU1J1bGVMaXN0LCBDU1NSdWxlPihkZXNjcmlwdG9yLCAgVjhDbGFzc0luZGV4
OjpDU1NSVUxFKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkNTU1ZB
TFVFTElTVDoKKyAgICAgICAgc2V0Q29sbGVjdGlvbkluZGV4ZWRHZXR0ZXI8Q1NTVmFsdWVMaXN0
LCBDU1NWYWx1ZT4oZGVzY3JpcHRvciwgVjhDbGFzc0luZGV4OjpDU1NWQUxVRSk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpDU1NWQVJJQUJMRVNERUNMQVJBVElPTjoK
KyAgICAgICAgc2V0Q29sbGVjdGlvblN0cmluZ09yTnVsbEluZGV4ZWRHZXR0ZXI8Q1NTVmFyaWFi
bGVzRGVjbGFyYXRpb24+KGRlc2NyaXB0b3IpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4
Q2xhc3NJbmRleDo6V0VCS0lUQ1NTVFJBTlNGT1JNVkFMVUU6CisgICAgICAgIHNldENvbGxlY3Rp
b25JbmRleGVkR2V0dGVyPFdlYktpdENTU1RyYW5zZm9ybVZhbHVlLCBDU1NWYWx1ZT4oZGVzY3Jp
cHRvciwgVjhDbGFzc0luZGV4OjpDU1NWQUxVRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
VjhDbGFzc0luZGV4OjpVTkRFVEVDVEFCTEVIVE1MQ09MTEVDVElPTjoKKyAgICAgICAgZGVzY3Jp
cHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5NYXJrQXNVbmRldGVjdGFibGUoKTsgIC8vIGZhbGwg
dGhyb3VnaAorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpIVE1MQ09MTEVDVElPTjoKKyAgICAgICAg
ZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihV
U0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxDb2xsZWN0aW9uKSk7CisgICAgICAgIGRlc2Ny
aXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0Q2FsbEFzRnVuY3Rpb25IYW5kbGVyKFVTRV9D
QUxMQkFDSyhIVE1MQ29sbGVjdGlvbkNhbGxBc0Z1bmN0aW9uKSk7CisgICAgICAgIHNldENvbGxl
Y3Rpb25JbmRleGVkR2V0dGVyPEhUTUxDb2xsZWN0aW9uLCBOb2RlPihkZXNjcmlwdG9yLCBWOENs
YXNzSW5kZXg6Ok5PREUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6
SFRNTE9QVElPTlNDT0xMRUNUSU9OOgorICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBs
YXRlKCktPlNldE5hbWVkUHJvcGVydHlIYW5kbGVyKFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIo
SFRNTENvbGxlY3Rpb24pKTsKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgp
LT5TZXRJbmRleGVkUHJvcGVydHlIYW5kbGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZX0dFVFRFUihI
VE1MT3B0aW9uc0NvbGxlY3Rpb24pLCBVU0VfSU5ERVhFRF9QUk9QRVJUWV9TRVRURVIoSFRNTE9w
dGlvbnNDb2xsZWN0aW9uKSk7CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUo
KS0+U2V0Q2FsbEFzRnVuY3Rpb25IYW5kbGVyKFVTRV9DQUxMQkFDSyhIVE1MQ29sbGVjdGlvbkNh
bGxBc0Z1bmN0aW9uKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpI
VE1MU0VMRUNURUxFTUVOVDoKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgp
LT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxT
ZWxlY3RFbGVtZW50Q29sbGVjdGlvbikpOworICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRl
bXBsYXRlKCktPlNldEluZGV4ZWRQcm9wZXJ0eUhhbmRsZXIobm9kZUNvbGxlY3Rpb25JbmRleGVk
UHJvcGVydHlHZXR0ZXI8SFRNTFNlbGVjdEVsZW1lbnQ+LCBVU0VfSU5ERVhFRF9QUk9QRVJUWV9T
RVRURVIoSFRNTFNlbGVjdEVsZW1lbnRDb2xsZWN0aW9uKSwKKyAgICAgICAgICAgIDAsIDAsIG5v
ZGVDb2xsZWN0aW9uSW5kZXhlZFByb3BlcnR5RW51bWVyYXRvcjxIVE1MU2VsZWN0RWxlbWVudD4s
IHY4OjpJbnRlZ2VyOjpOZXcoVjhDbGFzc0luZGV4OjpOT0RFKSk7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgVjhDbGFzc0luZGV4OjpIVE1MRE9DVU1FTlQ6IHsKKyAgICAgICAgZGVzY3JpcHRv
ci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURf
UFJPUEVSVFlfR0VUVEVSKEhUTUxEb2N1bWVudCksIDAsIDAsIFVTRV9OQU1FRF9QUk9QRVJUWV9E
RUxFVEVSKEhUTUxEb2N1bWVudCkpOworCisgICAgICAgIC8vIFdlIGFkZCBhbiBleHRyYSBpbnRl
cm5hbCBmaWVsZCB0byBhbGwgRG9jdW1lbnQgd3JhcHBlcnMgZm9yCisgICAgICAgIC8vIHN0b3Jp
bmcgYSBwZXIgZG9jdW1lbnQgRE9NSW1wbGVtZW50YXRpb24gd3JhcHBlci4KKyAgICAgICAgLy8K
KyAgICAgICAgLy8gQWRkaXRpb25hbGx5LCB3ZSBhZGQgdHdvIGV4dHJhIGludGVybmFsIGZpZWxk
cyBmb3IKKyAgICAgICAgLy8gSFRNTERvY3VtZW50cyB0byBpbXBsZW1lbnQgdGVtcG9yYXJ5IHNo
YWRvd2luZyBvZgorICAgICAgICAvLyBkb2N1bWVudC5hbGwuICBPbmUgZmllbGQgaG9sZHMgYW4g
b2JqZWN0IHRoYXQgaXMgdXNlZCBhcyBhCisgICAgICAgIC8vIG1hcmtlci4gIFRoZSBvdGhlciBm
aWVsZCBob2xkcyB0aGUgbWFya2VyIG9iamVjdCBpZgorICAgICAgICAvLyBkb2N1bWVudC5hbGwg
aXMgbm90IHNoYWRvd2VkIGFuZCBzb21lIG90aGVyIHZhbHVlIGlmCisgICAgICAgIC8vIGRvY3Vt
ZW50LmFsbCBpcyBzaGFkb3dlZC4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0
ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAg
ICAgICAgQVNTRVJUKGluc3RhbmNlVGVtcGxhdGUtPkludGVybmFsRmllbGRDb3VudCgpID09IFY4
Q3VzdG9tOjprRGVmYXVsdFdyYXBwZXJJbnRlcm5hbEZpZWxkQ291bnQpOworICAgICAgICBpbnN0
YW5jZVRlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoVjhDdXN0b206OmtIVE1MRG9jdW1l
bnRJbnRlcm5hbEZpZWxkQ291bnQpOworICAgICAgICBicmVhazsKKyAgICB9CisjaWYgRU5BQkxF
KFNWRykKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6U1ZHRE9DVU1FTlQ6ICAvLyBmYWxsIHRocm91
Z2gKKyNlbmRpZgorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpET0NVTUVOVDogeworICAgICAgICAv
LyBXZSBhZGQgYW4gZXh0cmEgaW50ZXJuYWwgZmllbGQgdG8gYWxsIERvY3VtZW50IHdyYXBwZXJz
IGZvcgorICAgICAgICAvLyBzdG9yaW5nIGEgcGVyIGRvY3VtZW50IERPTUltcGxlbWVudGF0aW9u
IHdyYXBwZXIuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNl
VGVtcGxhdGUgPSBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAgICAgIEFTU0VS
VChpbnN0YW5jZVRlbXBsYXRlLT5JbnRlcm5hbEZpZWxkQ291bnQoKSA9PSBWOEN1c3RvbTo6a0Rl
ZmF1bHRXcmFwcGVySW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgaW5zdGFuY2VUZW1wbGF0
ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KCBWOEN1c3RvbTo6a0RvY3VtZW50TWluaW11bUludGVy
bmFsRmllbGRDb3VudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFY4Q2xhc3NJ
bmRleDo6SFRNTEFQUExFVEVMRU1FTlQ6ICAvLyBmYWxsIHRocm91Z2gKKyAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6SFRNTEVNQkVERUxFTUVOVDogIC8vIGZhbGwgdGhyb3VnaAorICAgIGNhc2UgVjhD
bGFzc0luZGV4OjpIVE1MT0JKRUNURUxFTUVOVDoKKyAgICAgICAgLy8gSFRNTEFwcGxldEVsZW1l
bnQsIEhUTUxFbWJlZEVsZW1lbnQgYW5kIEhUTUxPYmplY3RFbGVtZW50IGFyZQorICAgICAgICAv
LyBpbmhlcml0ZWQgZnJvbSBIVE1MUGx1Z0luRWxlbWVudCwgYW5kIHRoZXkgc2hhcmUgdGhlIHNh
bWUgcHJvcGVydHkKKyAgICAgICAgLy8gaGFuZGxpbmcgY29kZS4KKyAgICAgICAgZGVzY3JpcHRv
ci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURf
UFJPUEVSVFlfR0VUVEVSKEhUTUxQbHVnSW5FbGVtZW50KSwgVVNFX05BTUVEX1BST1BFUlRZX1NF
VFRFUihIVE1MUGx1Z0luRWxlbWVudCkpOworICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRl
bXBsYXRlKCktPlNldEluZGV4ZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX0lOREVYRURfUFJPUEVSVFlf
R0VUVEVSKEhUTUxQbHVnSW5FbGVtZW50KSwgVVNFX0lOREVYRURfUFJPUEVSVFlfU0VUVEVSKEhU
TUxQbHVnSW5FbGVtZW50KSk7CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUo
KS0+U2V0Q2FsbEFzRnVuY3Rpb25IYW5kbGVyKFVTRV9DQUxMQkFDSyhIVE1MUGx1Z0luRWxlbWVu
dCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTEZSQU1FU0VU
RUxFTUVOVDoKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1l
ZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxGcmFtZVNldEVs
ZW1lbnQpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhUTUxGT1JN
RUxFTUVOVDoKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1l
ZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxGb3JtRWxlbWVu
dCkpOworICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldEluZGV4ZWRQ
cm9wZXJ0eUhhbmRsZXIoVVNFX0lOREVYRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxGb3JtRWxlbWVu
dCksIDAsIDAsIDAsIG5vZGVDb2xsZWN0aW9uSW5kZXhlZFByb3BlcnR5RW51bWVyYXRvcjxIVE1M
Rm9ybUVsZW1lbnQ+LCB2ODo6SW50ZWdlcjo6TmV3KFY4Q2xhc3NJbmRleDo6Tk9ERSkpOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q0FOVkFTUElYRUxBUlJBWToKKyAg
ICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRJbmRleGVkUHJvcGVydHlI
YW5kbGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZX0dFVFRFUihDYW52YXNQaXhlbEFycmF5KSwgVVNF
X0lOREVYRURfUFJPUEVSVFlfU0VUVEVSKENhbnZhc1BpeGVsQXJyYXkpKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVQ6ICAvLyBmYWxsIHRocm91Z2gK
KyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q1NTU1RZTEVTSEVFVDogeworICAgICAgICAvLyBXZSBh
ZGQgYW4gZXh0cmEgaW50ZXJuYWwgZmllbGQgdG8gaG9sZCBhIHJlZmVyZW5jZSB0bworICAgICAg
ICAvLyB0aGUgb3duZXIgbm9kZS4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0
ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAg
ICAgICAgQVNTRVJUKGluc3RhbmNlVGVtcGxhdGUtPkludGVybmFsRmllbGRDb3VudCgpID09IFY4
Q3VzdG9tOjprRGVmYXVsdFdyYXBwZXJJbnRlcm5hbEZpZWxkQ291bnQpOworICAgICAgICBpbnN0
YW5jZVRlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoVjhDdXN0b206OmtTdHlsZVNoZWV0
SW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVjhD
bGFzc0luZGV4OjpNRURJQUxJU1Q6CisgICAgICAgIHNldENvbGxlY3Rpb25TdHJpbmdPck51bGxJ
bmRleGVkR2V0dGVyPE1lZGlhTGlzdD4oZGVzY3JpcHRvcik7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgVjhDbGFzc0luZGV4OjpNSU1FVFlQRUFSUkFZOgorICAgICAgICBzZXRDb2xsZWN0aW9u
SW5kZXhlZEFuZE5hbWVkR2V0dGVyczxNaW1lVHlwZUFycmF5LCBNaW1lVHlwZT4oZGVzY3JpcHRv
ciwgVjhDbGFzc0luZGV4OjpNSU1FVFlQRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhD
bGFzc0luZGV4OjpOQU1FRE5PREVNQVA6CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVt
cGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRF
UihOYW1lZE5vZGVNYXApKTsKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgp
LT5TZXRJbmRleGVkUHJvcGVydHlIYW5kbGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZX0dFVFRFUihO
YW1lZE5vZGVNYXApLCAwLCAwLCAwLCBjb2xsZWN0aW9uSW5kZXhlZFByb3BlcnR5RW51bWVyYXRv
cjxOYW1lZE5vZGVNYXA+LCB2ODo6SW50ZWdlcjo6TmV3KFY4Q2xhc3NJbmRleDo6Tk9ERSkpOwor
ICAgICAgICBicmVhazsKKyNpZiBFTkFCTEUoRE9NX1NUT1JBR0UpCisgICAgY2FzZSBWOENsYXNz
SW5kZXg6OlNUT1JBR0U6CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+
U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihTdG9yYWdl
KSwgVVNFX05BTUVEX1BST1BFUlRZX1NFVFRFUihTdG9yYWdlKSwgMCwgVVNFX05BTUVEX1BST1BF
UlRZX0RFTEVURVIoU3RvcmFnZSksIFY4Q3VzdG9tOjp2OFN0b3JhZ2VOYW1lZFByb3BlcnR5RW51
bWVyYXRvcik7CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0SW5k
ZXhlZFByb3BlcnR5SGFuZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoU3RvcmFnZSks
IFVTRV9JTkRFWEVEX1BST1BFUlRZX1NFVFRFUihTdG9yYWdlKSwgMCwgVVNFX0lOREVYRURfUFJP
UEVSVFlfREVMRVRFUihTdG9yYWdlKSk7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2Fz
ZSBWOENsYXNzSW5kZXg6Ok5PREVMSVNUOgorICAgICAgICBzZXRDb2xsZWN0aW9uSW5kZXhlZEdl
dHRlcjxOb2RlTGlzdCwgTm9kZT4oZGVzY3JpcHRvciwgVjhDbGFzc0luZGV4OjpOT0RFKTsKKyAg
ICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFu
ZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKE5vZGVMaXN0KSk7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpQTFVHSU46CisgICAgICAgIHNldENvbGxlY3Rpb25J
bmRleGVkQW5kTmFtZWRHZXR0ZXJzPFBsdWdpbiwgTWltZVR5cGU+KGRlc2NyaXB0b3IsIFY4Q2xh
c3NJbmRleDo6TUlNRVRZUEUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRl
eDo6UExVR0lOQVJSQVk6CisgICAgICAgIHNldENvbGxlY3Rpb25JbmRleGVkQW5kTmFtZWRHZXR0
ZXJzPFBsdWdpbkFycmF5LCBQbHVnaW4+KGRlc2NyaXB0b3IsIFY4Q2xhc3NJbmRleDo6UExVR0lO
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVRMSVNU
OgorICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldE5hbWVkUHJvcGVy
dHlIYW5kbGVyKFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoU3R5bGVTaGVldExpc3QpKTsKKyAg
ICAgICAgc2V0Q29sbGVjdGlvbkluZGV4ZWRHZXR0ZXI8U3R5bGVTaGVldExpc3QsIFN0eWxlU2hl
ZXQ+KGRlc2NyaXB0b3IsIFY4Q2xhc3NJbmRleDo6U1RZTEVTSEVFVCk7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpET01XSU5ET1c6IHsKKyAgICAgICAgdjg6OkxvY2Fs
PHY4OjpTaWduYXR1cmU+IGRlZmF1bHRTaWduYXR1cmUgPSB2ODo6U2lnbmF0dXJlOjpOZXcoZGVz
Y3JpcHRvcik7CisKKyAgICAgICAgZGVzY3JpcHRvci0+UHJvdG90eXBlVGVtcGxhdGUoKS0+U2V0
TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihET01XaW5kb3cp
KTsKKyAgICAgICAgZGVzY3JpcHRvci0+UHJvdG90eXBlVGVtcGxhdGUoKS0+U2V0SW5kZXhlZFBy
b3BlcnR5SGFuZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoRE9NV2luZG93KSk7CisK
KyAgICAgICAgZGVzY3JpcHRvci0+U2V0SGlkZGVuUHJvdG90eXBlKHRydWUpOworCisgICAgICAg
IC8vIFJlc2VydmUgc3BhY2VzIGZvciByZWZlcmVuY2VzIHRvIGxvY2F0aW9uLCBoaXN0b3J5IGFu
ZAorICAgICAgICAvLyBuYXZpZ2F0b3Igb2JqZWN0cy4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpP
YmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2NyaXB0b3ItPkluc3RhbmNlVGVt
cGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2VUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50
KFY4Q3VzdG9tOjprRE9NV2luZG93SW50ZXJuYWxGaWVsZENvdW50KTsKKworICAgICAgICAvLyBT
ZXQgYWNjZXNzIGNoZWNrIGNhbGxiYWNrcywgYnV0IHR1cm5lZCBvZmYgaW5pdGlhbGx5LgorICAg
ICAgICAvLyBXaGVuIGEgY29udGV4dCBpcyBkZXRhY2hlZCBmcm9tIGEgZnJhbWUsIHR1cm4gb24g
dGhlIGFjY2VzcyBjaGVjay4KKyAgICAgICAgLy8gVHVybmluZyBvbiBjaGVja3MgYWxzbyBpbnZh
bGlkYXRlcyBpbmxpbmUgY2FjaGVzIG9mIHRoZSBvYmplY3QuCisgICAgICAgIGluc3RhbmNlVGVt
cGxhdGUtPlNldEFjY2Vzc0NoZWNrQ2FsbGJhY2tzKFY4Q3VzdG9tOjp2OERPTVdpbmRvd05hbWVk
U2VjdXJpdHlDaGVjaywgVjhDdXN0b206OnY4RE9NV2luZG93SW5kZXhlZFNlY3VyaXR5Q2hlY2ss
IHY4OjpJbnRlZ2VyOjpOZXcoVjhDbGFzc0luZGV4OjpET01XSU5ET1cpLCBmYWxzZSk7CisgICAg
ICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6TE9DQVRJT046IHsKKyAg
ICAgICAgLy8gRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgb24gdGhl
IGluc3RhbmNlCisgICAgICAgIC8vIGluc3RlYWQgb2Ygb24gdGhlIHByb3RvdHlwZSBvYmplY3Qg
dG8gaW5zdXJlIHRoYXQgdGhleSBjYW5ub3QKKyAgICAgICAgLy8gYmUgb3ZlcndyaXR0ZW4uCisg
ICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlID0gZGVzY3JpcHRv
ci0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBpbnN0YW5jZS0+U2V0QWNjZXNzb3Iodjg6
OlN0cmluZzo6TmV3KCJyZWxvYWQiKSwgVjhDdXN0b206OnY4TG9jYXRpb25SZWxvYWRBY2Nlc3Nv
ckdldHRlciwgMCwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCksIHY4OjpBTExfQ0FOX1JFQUQsIHN0
YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OkRvbnREZWxldGUgfCB2ODo6UmVh
ZE9ubHkpKTsKKyAgICAgICAgaW5zdGFuY2UtPlNldEFjY2Vzc29yKHY4OjpTdHJpbmc6Ok5ldygi
cmVwbGFjZSIpLCBWOEN1c3RvbTo6djhMb2NhdGlvblJlcGxhY2VBY2Nlc3NvckdldHRlciwgMCwg
djg6OkhhbmRsZTx2ODo6VmFsdWU+KCksIHY4OjpBTExfQ0FOX1JFQUQsIHN0YXRpY19jYXN0PHY4
OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OkRvbnREZWxldGUgfCB2ODo6UmVhZE9ubHkpKTsKKyAg
ICAgICAgaW5zdGFuY2UtPlNldEFjY2Vzc29yKHY4OjpTdHJpbmc6Ok5ldygiYXNzaWduIiksIFY4
Q3VzdG9tOjp2OExvY2F0aW9uQXNzaWduQWNjZXNzb3JHZXR0ZXIsIDAsIHY4OjpIYW5kbGU8djg6
OlZhbHVlPigpLCB2ODo6QUxMX0NBTl9SRUFELCBzdGF0aWNfY2FzdDx2ODo6UHJvcGVydHlBdHRy
aWJ1dGU+KHY4OjpEb250RGVsZXRlIHwgdjg6OlJlYWRPbmx5KSk7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SElTVE9SWToKKyAgICAgICAgYnJlYWs7CisK
KyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6TUVTU0FHRUNIQU5ORUw6IHsKKyAgICAgICAgLy8gUmVz
ZXJ2ZSB0d28gbW9yZSBpbnRlcm5hbCBmaWVsZHMgZm9yIHJlZmVyZW5jaW5nIHRoZSBwb3J0MQor
ICAgICAgICAvLyBhbmQgcG9ydDIgd3JhcHBlcnMuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcG9y
dCB3cmFwcGVycyBhcmUKKyAgICAgICAgLy8ga2VwdCBhbGl2ZSB3aGVuIHRoZSBjaGFubmVsIHdy
YXBwZXIgaXMuCisgICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5kbGVyKFVTRV9DQUxMQkFD
SyhNZXNzYWdlQ2hhbm5lbENvbnN0cnVjdG9yKSk7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2Jq
ZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBs
YXRlKCk7CisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUtPlNldEludGVybmFsRmllbGRDb3VudChW
OEN1c3RvbTo6a01lc3NhZ2VDaGFubmVsSW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorCisgICAgY2FzZSBWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JUOiB7CisgICAg
ICAgIC8vIFJlc2VydmUgb25lIG1vcmUgaW50ZXJuYWwgZmllbGQgZm9yIGtlZXBpbmcgZXZlbnQg
bGlzdGVuZXJzLgorICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBpbnN0YW5j
ZVRlbXBsYXRlID0gZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBpbnN0
YW5jZVRlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoVjhDdXN0b206OmtNZXNzYWdlUG9y
dEludGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmIEVOQUJM
RShXT1JLRVJTKQorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpXT1JLRVI6IHsKKyAgICAgICAgLy8g
UmVzZXJ2ZSBvbmUgbW9yZSBpbnRlcm5hbCBmaWVsZCBmb3Iga2VlcGluZyBldmVudCBsaXN0ZW5l
cnMuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVtcGxh
dGUgPSBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAgICAgIGluc3RhbmNlVGVt
cGxhdGUtPlNldEludGVybmFsRmllbGRDb3VudChWOEN1c3RvbTo6a1dvcmtlckludGVybmFsRmll
bGRDb3VudCk7CisgICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5kbGVyKFVTRV9DQUxMQkFD
SyhXb3JrZXJDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNl
IFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVDogeworICAgICAgICAvLyBSZXNlcnZlIG9uZSBt
b3JlIGludGVybmFsIGZpZWxkIGZvciBrZWVwaW5nIGV2ZW50IGxpc3RlbmVycy4KKyAgICAgICAg
djg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2NyaXB0
b3ItPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2VUZW1wbGF0ZS0+U2V0SW50
ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9tOjprV29ya2VyQ29udGV4dEludGVybmFsRmllbGRDb3Vu
dCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvLyBXT1JLRVJTCisKKyAgICAvLyBU
aGUgZm9sbG93aW5nIG9iamVjdHMgYXJlIGNyZWF0ZWQgZnJvbSBKYXZhU2NyaXB0LgorICAgIGNh
c2UgVjhDbGFzc0luZGV4OjpET01QQVJTRVI6CisgICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxI
YW5kbGVyKFVTRV9DQUxMQkFDSyhET01QYXJzZXJDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTElNQUdFRUxFTUVOVDoKKyAgICAgICAgZGVz
Y3JpcHRvci0+U2V0Q2FsbEhhbmRsZXIoVVNFX0NBTExCQUNLKEhUTUxJbWFnZUVsZW1lbnRDb25z
dHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTE9Q
VElPTkVMRU1FTlQ6CisgICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5kbGVyKFVTRV9DQUxM
QkFDSyhIVE1MT3B0aW9uRWxlbWVudENvbnN0cnVjdG9yKSk7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgVjhDbGFzc0luZGV4OjpXRUJLSVRDU1NNQVRSSVg6CisgICAgICAgIGRlc2NyaXB0b3It
PlNldENhbGxIYW5kbGVyKFVTRV9DQUxMQkFDSyhXZWJLaXRDU1NNYXRyaXhDb25zdHJ1Y3Rvcikp
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6V0VCS0lUUE9JTlQ6Cisg
ICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5kbGVyKFVTRV9DQUxMQkFDSyhXZWJLaXRQb2lu
dENvbnN0cnVjdG9yKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpY
TUxTRVJJQUxJWkVSOgorICAgICAgICBkZXNjcmlwdG9yLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FM
TEJBQ0soWE1MU2VyaWFsaXplckNvbnN0cnVjdG9yKSk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVDogeworICAgICAgICAvLyBSZXNlcnZlIG9u
ZSBtb3JlIGludGVybmFsIGZpZWxkIGZvciBrZWVwaW5nIGV2ZW50IGxpc3RlbmVycy4KKyAgICAg
ICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2Ny
aXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2VUZW1wbGF0ZS0+U2V0
SW50ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9tOjprWE1MSHR0cFJlcXVlc3RJbnRlcm5hbEZpZWxk
Q291bnQpOworICAgICAgICBkZXNjcmlwdG9yLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJBQ0so
WE1MSHR0cFJlcXVlc3RDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAg
Y2FzZSBWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FEOiB7CisgICAgICAgIC8vIFJl
c2VydmUgb25lIG1vcmUgaW50ZXJuYWwgZmllbGQgZm9yIGtlZXBpbmcgZXZlbnQgbGlzdGVuZXJz
LgorICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBpbnN0YW5jZVRlbXBsYXRl
ID0gZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBpbnN0YW5jZVRlbXBs
YXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoVjhDdXN0b206OmtYTUxIdHRwUmVxdWVzdEludGVy
bmFsRmllbGRDb3VudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFY4Q2xhc3NJ
bmRleDo6WFBBVEhFVkFMVUFUT1I6CisgICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5kbGVy
KFVTRV9DQUxMQkFDSyhYUGF0aEV2YWx1YXRvckNvbnN0cnVjdG9yKSk7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SOgorICAgICAgICBkZXNjcmlw
dG9yLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJBQ0soWFNMVFByb2Nlc3NvckNvbnN0cnVjdG9y
KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpDTElFTlRSRUNUTElT
VDoKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRJbmRleGVkUHJv
cGVydHlIYW5kbGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZX0dFVFRFUihDbGllbnRSZWN0TGlzdCkp
OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisK
KyAgICAqY2FjaGVDZWxsID0gZGVzY3JpcHRvcjsKKyAgICByZXR1cm4gZGVzY3JpcHRvcjsKK30K
KworYm9vbCBWOFByb3h5Ojppc0NvbnRleHRJbml0aWFsaXplZCgpCit7CisgICAgLy8gbV9jb250
ZXh0LCBtX2dsb2JhbCwgbV9vYmplY3RQcm90b3R5cGUgYW5kIG1fd3JhcHBlckJvaWxlcnBsYXRl
cyBzaG91bGQKKyAgICAvLyBhbGwgYmUgbm9uLWVtcHR5IGlmIGlmIG1fY29udGV4dCBpcyBub24t
ZW1wdHkuCisgICAgQVNTRVJUKG1fY29udGV4dC5Jc0VtcHR5KCkgfHwgIW1fZ2xvYmFsLklzRW1w
dHkoKSk7CisgICAgQVNTRVJUKG1fY29udGV4dC5Jc0VtcHR5KCkgfHwgIW1fb2JqZWN0UHJvdG90
eXBlLklzRW1wdHkoKSk7CisgICAgQVNTRVJUKG1fY29udGV4dC5Jc0VtcHR5KCkgfHwgIW1fd3Jh
cHBlckJvaWxlcnBsYXRlcy5Jc0VtcHR5KCkpOworICAgIHJldHVybiAhbV9jb250ZXh0LklzRW1w
dHkoKTsKK30KKworRE9NV2luZG93KiBWOFByb3h5OjpyZXRyaWV2ZVdpbmRvdygpCit7CisgICAg
Ly8gRklYTUU6IFRoaXMgc2VlbXMgdmVyeSBmcmFnaWxlLiBIb3cgZG8gd2Uga25vdyB0aGF0IHRo
ZSBnbG9iYWwgb2JqZWN0CisgICAgLy8gZnJvbSB0aGUgY3VycmVudCBjb250ZXh0IGlzIHNvbWV0
aGluZyBzZW5zaWJsZT8gRG8gd2UgbmVlZCB0byB1c2UgdGhlCisgICAgLy8gbGFzdCBlbnRlcmVk
IGhlcmU/IFdobyBjYWxscyB0aGlzPworICAgIHJldHVybiByZXRyaWV2ZVdpbmRvdyh2ODo6Q29u
dGV4dDo6R2V0Q3VycmVudCgpKTsKK30KKworRE9NV2luZG93KiBWOFByb3h5OjpyZXRyaWV2ZVdp
bmRvdyh2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0KQoreworICAgIHY4OjpIYW5kbGU8
djg6Ok9iamVjdD4gZ2xvYmFsID0gY29udGV4dC0+R2xvYmFsKCk7CisgICAgQVNTRVJUKCFnbG9i
YWwuSXNFbXB0eSgpKTsKKyAgICBnbG9iYWwgPSBsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRl
eDo6RE9NV0lORE9XLCBnbG9iYWwpOworICAgIEFTU0VSVCghZ2xvYmFsLklzRW1wdHkoKSk7Cisg
ICAgcmV0dXJuIGNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6
RE9NV0lORE9XLCBnbG9iYWwpOworfQorCitGcmFtZSogVjhQcm94eTo6cmV0cmlldmVGcmFtZSh2
ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0KQoreworICAgIHJldHVybiByZXRyaWV2ZVdp
bmRvdyhjb250ZXh0KS0+ZnJhbWUoKTsKK30KKworRnJhbWUqIFY4UHJveHk6OnJldHJpZXZlRnJh
bWVGb3JFbnRlcmVkQ29udGV4dCgpCit7CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29u
dGV4dCA9IHY4OjpDb250ZXh0OjpHZXRFbnRlcmVkKCk7CisgICAgaWYgKGNvbnRleHQuSXNFbXB0
eSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcmV0cmlldmVGcmFtZShjb250ZXh0
KTsKK30KKworRnJhbWUqIFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JDdXJyZW50Q29udGV4dCgp
Cit7CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0OjpH
ZXRDdXJyZW50KCk7CisgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4g
MDsKKyAgICByZXR1cm4gcmV0cmlldmVGcmFtZShjb250ZXh0KTsKK30KKworRnJhbWUqIFY4UHJv
eHk6OnJldHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29udGV4dCgpCit7CisgICAgdjg6OkhhbmRsZTx2
ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0OjpHZXRDYWxsaW5nKCk7CisgICAgaWYg
KGNvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcmV0cmll
dmVGcmFtZShjb250ZXh0KTsKK30KKworRnJhbWUqIFY4UHJveHk6OnJldHJpZXZlRnJhbWUoKQor
eworICAgIERPTVdpbmRvdyogd2luZG93ID0gcmV0cmlldmVXaW5kb3coKTsKKyAgICByZXR1cm4g
d2luZG93ID8gd2luZG93LT5mcmFtZSgpIDogMDsKK30KKworVjhQcm94eSogVjhQcm94eTo6cmV0
cmlldmUoKQoreworICAgIERPTVdpbmRvdyogd2luZG93ID0gcmV0cmlldmVXaW5kb3coKTsKKyAg
ICBBU1NFUlQod2luZG93KTsKKyAgICByZXR1cm4gcmV0cmlldmUod2luZG93LT5mcmFtZSgpKTsK
K30KKworVjhQcm94eSogVjhQcm94eTo6cmV0cmlldmUoRnJhbWUqIGZyYW1lKQoreworICAgIGlm
ICghZnJhbWUpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBmcmFtZS0+c2NyaXB0KCkt
PmlzRW5hYmxlZCgpID8gZnJhbWUtPnNjcmlwdCgpLT5wcm94eSgpIDogMDsKK30KKworVjhQcm94
eSogVjhQcm94eTo6cmV0cmlldmUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCkKK3sK
KyAgICBpZiAoIWNvbnRleHQtPmlzRG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
cmV0dXJuIHJldHJpZXZlKHN0YXRpY19jYXN0PERvY3VtZW50Kj4oY29udGV4dCktPmZyYW1lKCkp
OworfQorCit2b2lkIFY4UHJveHk6OmRpc2Nvbm5lY3RGcmFtZSgpCit7CisgICAgZGlzY29ubmVj
dEV2ZW50TGlzdGVuZXJzKCk7Cit9CisKK2Jvb2wgVjhQcm94eTo6aXNFbmFibGVkKCkKK3sKKyAg
ICBTZXR0aW5ncyogc2V0dGluZ3MgPSBtX2ZyYW1lLT5zZXR0aW5ncygpOworICAgIGlmICghc2V0
dGluZ3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEluIHRoZSBjb21tb24gY2Fz
ZSwgSmF2YVNjcmlwdCBpcyBlbmFibGVkIGFuZCB3ZSdyZSBkb25lLgorICAgIGlmIChzZXR0aW5n
cy0+aXNKYXZhU2NyaXB0RW5hYmxlZCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8v
IElmIEphdmFTY3JpcHQgaGFzIGJlZW4gZGlzYWJsZWQsIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUg
ZnJhbWUgdG8gdGVsbAorICAgIC8vIHdoZXRoZXIgdGhpcyBzY3JpcHQgY2FtZSBmcm9tIHRoZSB3
ZWIgb3IgdGhlIGVtYmVkZGVyLiBTY3JpcHRzIGZyb20gdGhlCisgICAgLy8gZW1iZWRkZXIgYXJl
IHNhZmUgdG8gcnVuLCBidXQgc2NyaXB0cyBmcm9tIHRoZSBvdGhlciBzb3VyY2VzIGFyZQorICAg
IC8vIGRpc2FsbG93ZWQuCisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gbV9mcmFtZS0+ZG9jdW1l
bnQoKTsKKyAgICBpZiAoIWRvY3VtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBT
ZWN1cml0eU9yaWdpbiogb3JpZ2luID0gZG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCk7CisgICAg
aWYgKG9yaWdpbi0+cHJvdG9jb2woKS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsg
IC8vIFVuaW5pdGlhbGl6ZWQgZG9jdW1lbnQKKworICAgIGlmIChvcmlnaW4tPnByb3RvY29sKCkg
PT0gImh0dHAiIHx8IG9yaWdpbi0+cHJvdG9jb2woKSA9PSAiaHR0cHMiKQorICAgICAgICByZXR1
cm4gZmFsc2U7ICAvLyBXZWIgc2l0ZQorCisgICAgLy8gRklYTUU6IHRoZSBmb2xsb3dpbmcgYXJl
IGFwcGxpY2F0aW9uIGRlY2lzaW9ucywgYW5kIHRoZXkgc2hvdWxkCisgICAgLy8gbm90IGJlIG1h
ZGUgYXQgdGhpcyBsYXllci4gIGluc3RlYWQsIHdlIHNob3VsZCBicmlkZ2Ugb3V0IHRvIHRoZQor
ICAgIC8vIGVtYmVkZGVyIHRvIGFsbG93IHRoZW0gdG8gb3ZlcnJpZGUgcG9saWN5IGhlcmUuCisK
KyAgICBpZiAob3JpZ2luLT5wcm90b2NvbCgpID09IENocm9taXVtQnJpZGdlOjp1aVJlc291cmNl
UHJvdG9jb2woKSkKKyAgICAgICAgcmV0dXJuIHRydWU7ICAgLy8gRW1iZWRkZXIncyBzY3JpcHRz
IGFyZSBvayB0byBydW4KKworICAgIC8vIElmIHRoZSBzY2hlbWUgaXMgZnRwOiBvciBmaWxlOiwg
YW4gZW1wdHkgZmlsZSBuYW1lIGluZGljYXRlcyBhIGRpcmVjdG9yeQorICAgIC8vIGxpc3Rpbmcs
IHdoaWNoIHJlcXVpcmVzIEphdmFTY3JpcHQgdG8gZnVuY3Rpb24gcHJvcGVybHkuCisgICAgY29u
c3QgY2hhcioga0RpclByb3RvY29sc1tdID0geyAiZnRwIiwgImZpbGUiIH07CisgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoa0RpclByb3RvY29scyk7ICsraSkgeworICAgICAg
ICBpZiAob3JpZ2luLT5wcm90b2NvbCgpID09IGtEaXJQcm90b2NvbHNbaV0pIHsKKyAgICAgICAg
ICAgIGNvbnN0IEtVUkwmIHVybCA9IGRvY3VtZW50LT51cmwoKTsKKyAgICAgICAgICAgIHJldHVy
biB1cmwucGF0aEFmdGVyTGFzdFNsYXNoKCkgPT0gdXJsLnBhdGhFbmQoKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIHJldHVybiBmYWxzZTsgIC8vIE90aGVyIHByb3RvY29scyBmYWxsIHRocm91
Z2ggdG8gaGVyZQorfQorCit2b2lkIFY4UHJveHk6OnVwZGF0ZURvY3VtZW50V3JhcHBlcih2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcHBlcikKK3sKKyAgICBjbGVhckRvY3VtZW50V3JhcHBlcigp
OworCisgICAgQVNTRVJUKG1fZG9jdW1lbnQuSXNFbXB0eSgpKTsKKyAgICBtX2RvY3VtZW50ID0g
djg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPjo6TmV3KHdyYXBwZXIpOworI2lmbmRlZiBOREVCVUcK
KyAgICByZWdpc3Rlckdsb2JhbEhhbmRsZShQUk9YWSwgdGhpcywgbV9kb2N1bWVudCk7CisjZW5k
aWYKK30KKwordm9pZCBWOFByb3h5OjpjbGVhckRvY3VtZW50V3JhcHBlcigpCit7CisgICAgaWYg
KCFtX2RvY3VtZW50LklzRW1wdHkoKSkgeworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgdW5yZWdp
c3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBtX2RvY3VtZW50KTsKKyNlbmRpZgorICAgICAgICBtX2Rv
Y3VtZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgbV9kb2N1bWVudC5DbGVhcigpOworICAgIH0KK30K
Kwordm9pZCBWOFByb3h5Ojp1cGRhdGVEb2N1bWVudFdyYXBwZXJDYWNoZSgpCit7CisgICAgdjg6
OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0
U2NvcGUoY29udGV4dCgpKTsKKworICAgIC8vIElmIHRoZSBkb2N1bWVudCBoYXMgbm8gZnJhbWUs
IE5vZGVUb1Y4T2JqZWN0IG1pZ2h0IGdldCB0aGUKKyAgICAvLyBkb2N1bWVudCB3cmFwcGVyIGZv
ciBhIGRvY3VtZW50IHRoYXQgaXMgYWJvdXQgdG8gYmUgZGVsZXRlZC4KKyAgICAvLyBJZiB0aGUg
Rm9yY2VTZXQgYmVsb3cgY2F1c2VzIGEgZ2FyYmFnZSBjb2xsZWN0aW9uLCB0aGUgZG9jdW1lbnQK
KyAgICAvLyBtaWdodCBnZXQgZGVsZXRlZCBhbmQgdGhlIGdsb2JhbCBoYW5kbGUgZm9yIHRoZSBk
b2N1bWVudAorICAgIC8vIHdyYXBwZXIgY2xlYXJlZC4gVXNpbmcgdGhlIGNsZWFyZWQgZ2xvYmFs
IGhhbmRsZSB3aWxsIGxlYWQgdG8KKyAgICAvLyBjcmFzaGVzLiAgSW4gdGhpcyBjYXNlIHdlIGNs
ZWFyIHRoZSBjYWNoZSBhbmQgbGV0IHRoZSBET01XaW5kb3cKKyAgICAvLyBhY2Nlc3NvciBoYW5k
bGUgYWNjZXNzIHRvIHRoZSBkb2N1bWVudC4KKyAgICBpZiAoIW1fZnJhbWUtPmRvY3VtZW50KCkt
PmZyYW1lKCkpIHsKKyAgICAgICAgY2xlYXJEb2N1bWVudFdyYXBwZXJDYWNoZSgpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGRvY3VtZW50V3Jh
cHBlciA9IGNvbnZlcnROb2RlVG9WOE9iamVjdChtX2ZyYW1lLT5kb2N1bWVudCgpKTsKKworICAg
IC8vIElmIGluc3RhbnRpYXRpb24gb2YgdGhlIGRvY3VtZW50IHdyYXBwZXIgZmFpbHMsIGNsZWFy
IHRoZSBjYWNoZQorICAgIC8vIGFuZCBsZXQgdGhlIERPTVdpbmRvdyBhY2Nlc3NvciBoYW5kbGUg
YWNjZXNzIHRvIHRoZSBkb2N1bWVudC4KKyAgICBpZiAoZG9jdW1lbnRXcmFwcGVyLklzRW1wdHko
KSkgeworICAgICAgICBjbGVhckRvY3VtZW50V3JhcHBlckNhY2hlKCk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisgICAgbV9jb250ZXh0LT5HbG9iYWwoKS0+Rm9yY2VTZXQodjg6OlN0cmluZzo6
TmV3KCJkb2N1bWVudCIpLCBkb2N1bWVudFdyYXBwZXIsIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0
eUF0dHJpYnV0ZT4odjg6OlJlYWRPbmx5IHwgdjg6OkRvbnREZWxldGUpKTsKK30KKwordm9pZCBW
OFByb3h5OjpjbGVhckRvY3VtZW50V3JhcHBlckNhY2hlKCkKK3sKKyAgICBBU1NFUlQoIW1fY29u
dGV4dC5Jc0VtcHR5KCkpOworICAgIG1fY29udGV4dC0+R2xvYmFsKCktPkZvcmNlRGVsZXRlKHY4
OjpTdHJpbmc6Ok5ldygiZG9jdW1lbnQiKSk7Cit9CisKK3ZvaWQgVjhQcm94eTo6ZGlzcG9zZUNv
bnRleHRIYW5kbGVzKCkKK3sKKyAgICBpZiAoIW1fY29udGV4dC5Jc0VtcHR5KCkpIHsKKyAgICAg
ICAgbV9jb250ZXh0LkRpc3Bvc2UoKTsKKyAgICAgICAgbV9jb250ZXh0LkNsZWFyKCk7CisgICAg
fQorCisgICAgaWYgKCFtX3dyYXBwZXJCb2lsZXJwbGF0ZXMuSXNFbXB0eSgpKSB7CisjaWZuZGVm
IE5ERUJVRworICAgICAgICB1bnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMsIG1fd3JhcHBlckJv
aWxlcnBsYXRlcyk7CisjZW5kaWYKKyAgICAgICAgbV93cmFwcGVyQm9pbGVycGxhdGVzLkRpc3Bv
c2UoKTsKKyAgICAgICAgbV93cmFwcGVyQm9pbGVycGxhdGVzLkNsZWFyKCk7CisgICAgfQorCisg
ICAgaWYgKCFtX29iamVjdFByb3RvdHlwZS5Jc0VtcHR5KCkpIHsKKyNpZm5kZWYgTkRFQlVHCisg
ICAgICAgIHVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9vYmplY3RQcm90b3R5cGUpOwor
I2VuZGlmCisgICAgICAgIG1fb2JqZWN0UHJvdG90eXBlLkRpc3Bvc2UoKTsKKyAgICAgICAgbV9v
YmplY3RQcm90b3R5cGUuQ2xlYXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgVjhQcm94eTo6Y2xlYXJG
b3JDbG9zZSgpCit7CisgICAgaWYgKCFtX2NvbnRleHQuSXNFbXB0eSgpKSB7CisgICAgICAgIHY4
OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKworICAgICAgICBjbGVhckRvY3VtZW50V3JhcHBl
cigpOworICAgICAgICBkaXNwb3NlQ29udGV4dEhhbmRsZXMoKTsKKyAgICB9Cit9CisKK3ZvaWQg
VjhQcm94eTo6Y2xlYXJGb3JOYXZpZ2F0aW9uKCkKK3sKKyAgICAvLyBkaXNjb25uZWN0IGFsbCBl
dmVudCBsaXN0ZW5lcnMKKyAgICBkaXNjb25uZWN0RXZlbnRMaXN0ZW5lcnMoKTsKKworICAgIGlm
ICghbV9jb250ZXh0LklzRW1wdHkoKSkgeworICAgICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxl
OworICAgICAgICBjbGVhckRvY3VtZW50V3JhcHBlcigpOworCisgICAgICAgIHY4OjpDb250ZXh0
OjpTY29wZSBjb250ZXh0U2NvcGUobV9jb250ZXh0KTsKKworICAgICAgICAvLyBDbGVhciB0aGUg
ZG9jdW1lbnQgd3JhcHBlciBjYWNoZSBiZWZvcmUgdHVybmluZyBvbiBhY2Nlc3MgY2hlY2tzIG9u
CisgICAgICAgIC8vIHRoZSBvbGQgRE9NV2luZG93IHdyYXBwZXIuICBUaGlzIHdheSwgYWNjZXNz
IHRvIHRoZSBkb2N1bWVudCB3cmFwcGVyCisgICAgICAgIC8vIHdpbGwgYmUgcHJvdGVjdGVkIGJ5
IHRoZSBzZWN1cml0eSBjaGVja3Mgb24gdGhlIERPTVdpbmRvdyB3cmFwcGVyLgorICAgICAgICBj
bGVhckRvY3VtZW50V3JhcHBlckNhY2hlKCk7CisKKyAgICAgICAgLy8gVHVybiBvbiBhY2Nlc3Mg
Y2hlY2sgb24gdGhlIG9sZCBET01XaW5kb3cgd3JhcHBlci4KKyAgICAgICAgdjg6OkhhbmRsZTx2
ODo6T2JqZWN0PiB3cmFwcGVyID0gbG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJ
TkRPVywgbV9nbG9iYWwpOworICAgICAgICBBU1NFUlQoIXdyYXBwZXIuSXNFbXB0eSgpKTsKKyAg
ICAgICAgd3JhcHBlci0+VHVybk9uQWNjZXNzQ2hlY2soKTsKKworICAgICAgICAvLyBTZXBhcmF0
ZSB0aGUgY29udGV4dCBmcm9tIGl0cyBnbG9iYWwgb2JqZWN0LgorICAgICAgICBtX2NvbnRleHQt
PkRldGFjaEdsb2JhbCgpOworCisgICAgICAgIGRpc3Bvc2VDb250ZXh0SGFuZGxlcygpOworCisg
ICAgICAgIC8vIFJlaW5pdGlhbGl6ZSB0aGUgY29udGV4dCBzbyB0aGUgZ2xvYmFsIG9iamVjdCBw
b2ludHMgdG8KKyAgICAgICAgLy8gdGhlIG5ldyBET00gd2luZG93LgorICAgICAgICBpbml0Q29u
dGV4dElmTmVlZGVkKCk7CisgICAgfQorfQorCit2b2lkIFY4UHJveHk6OnNldFNlY3VyaXR5VG9r
ZW4oKQoreworICAgIERvY3VtZW50KiBkb2N1bWVudCA9IG1fZnJhbWUtPmRvY3VtZW50KCk7Cisg
ICAgLy8gU2V0dXAgc2VjdXJpdHkgb3JpZ2luIGFuZCBzZWN1cml0eSB0b2tlbgorICAgIGlmICgh
ZG9jdW1lbnQpIHsKKyAgICAgICAgbV9jb250ZXh0LT5Vc2VEZWZhdWx0U2VjdXJpdHlUb2tlbigp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQXNrIHRoZSBkb2N1bWVudCdzIFNl
Y3VyaXR5T3JpZ2luIHRvIGdlbmVyYXRlIGEgc2VjdXJpdHkgdG9rZW4uCisgICAgLy8gSWYgdHdv
IHRva2VucyBhcmUgZXF1YWwsIHRoZW4gdGhlIFNlY3VyaXR5T3JpZ2lucyBjYW5BY2Nlc3MgZWFj
aCBvdGhlci4KKyAgICAvLyBJZiB0d28gdG9rZW5zIGFyZSBub3QgZXF1YWwsIHRoZW4gd2UgaGF2
ZSB0byBjYWxsIGNhbkFjY2Vzcy4KKyAgICAvLyBOb3RlOiB3ZSBjYW4ndCB1c2UgdGhlIEhUVFBP
cmlnaW4gaWYgaXQgd2FzIHNldCBmcm9tIHRoZSBET00uCisgICAgU2VjdXJpdHlPcmlnaW4qIG9y
aWdpbiA9IGRvY3VtZW50LT5zZWN1cml0eU9yaWdpbigpOworICAgIFN0cmluZyB0b2tlbjsKKyAg
ICBpZiAoIW9yaWdpbi0+ZG9tYWluV2FzU2V0SW5ET00oKSkKKyAgICAgICAgdG9rZW4gPSBkb2N1
bWVudC0+c2VjdXJpdHlPcmlnaW4oKS0+dG9TdHJpbmcoKTsKKworICAgIC8vIEFuIGVtcHR5IG9y
ICJudWxsIiB0b2tlbiBtZWFucyB3ZSBhbHdheXMgaGF2ZSB0byBjYWxsCisgICAgLy8gY2FuQWNj
ZXNzLiAgVGhlIHRvU3RyaW5nIG1ldGhvZCBvbiBzZWN1cml0eU9yaWdpbnMgcmV0dXJucyB0aGUK
KyAgICAvLyBzdHJpbmcgIm51bGwiIGZvciBlbXB0eSBzZWN1cml0eSBvcmlnaW5zIGFuZCBmb3Ig
c2VjdXJpdHkKKyAgICAvLyBvcmlnaW5zIHRoYXQgc2hvdWxkIG9ubHkgYWxsb3cgYWNjZXNzIHRv
IHRoZW1zZWx2ZXMuICBJbiB0aGlzCisgICAgLy8gY2FzZSwgd2UgdXNlIHRoZSBnbG9iYWwgb2Jq
ZWN0IGFzIHRoZSBzZWN1cml0eSB0b2tlbiB0byBhdm9pZAorICAgIC8vIGNhbGxpbmcgY2FuQWNj
ZXNzIHdoZW4gYSBzY3JpcHQgYWNjZXNzZXMgaXRzIG93biBvYmplY3RzLgorICAgIGlmICh0b2tl
bi5pc0VtcHR5KCkgfHwgdG9rZW4gPT0gIm51bGwiKSB7CisgICAgICAgIG1fY29udGV4dC0+VXNl
RGVmYXVsdFNlY3VyaXR5VG9rZW4oKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENT
dHJpbmcgdXRmOFRva2VuID0gdG9rZW4udXRmOCgpOworICAgIC8vIE5PVEU6IFY4IGRvZXMgaWRl
bnRpdHkgY29tcGFyaXNvbiBpbiBmYXN0IHBhdGgsIG11c3QgdXNlIGEgc3ltYm9sCisgICAgLy8g
YXMgdGhlIHNlY3VyaXR5IHRva2VuLgorICAgIG1fY29udGV4dC0+U2V0U2VjdXJpdHlUb2tlbih2
ODo6U3RyaW5nOjpOZXdTeW1ib2wodXRmOFRva2VuLmRhdGEoKSwgdXRmOFRva2VuLmxlbmd0aCgp
KSk7Cit9CisKK3ZvaWQgVjhQcm94eTo6dXBkYXRlRG9jdW1lbnQoKQoreworICAgIGlmICghbV9m
cmFtZS0+ZG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fZ2xvYmFsLklz
RW1wdHkoKSkgeworICAgICAgICBBU1NFUlQobV9jb250ZXh0LklzRW1wdHkoKSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICAvLyBXZSBoYXZlIGEgbmV3IGRvY3VtZW50IGFuZCB3ZSBu
ZWVkIHRvIHVwZGF0ZSB0aGUgY2FjaGUuCisgICAgdXBkYXRlRG9jdW1lbnRXcmFwcGVyQ2FjaGUo
KTsKKworICAgIHVwZGF0ZVNlY3VyaXR5T3JpZ2luKCk7Cit9CisKK3ZvaWQgVjhQcm94eTo6dXBk
YXRlU2VjdXJpdHlPcmlnaW4oKQoreworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKyAgICBz
ZXRTZWN1cml0eVRva2VuKCk7Cit9CisKKy8vIFNhbWUgb3JpZ2luIHBvbGljeSBpbXBsZW1lbnRh
dGlvbjoKKy8vCisvLyBTYW1lIG9yaWdpbiBwb2xpY3kgcHJldmVudHMgSlMgY29kZSBmcm9tIGRv
bWFpbiBBIGFjY2VzcyBKUyAmIERPTSBvYmplY3RzCisvLyBpbiBhIGRpZmZlcmVudCBkb21haW4g
Qi4gVGhlcmUgYXJlIGV4Y2VwdGlvbnMgYW5kIHNldmVyYWwgb2JqZWN0cyBhcmUKKy8vIGFjY2Vz
c2libGUgYnkgY3Jvc3MtZG9tYWluIGNvZGUuIEZvciBleGFtcGxlLCB0aGUgd2luZG93LmZyYW1l
cyBvYmplY3QgaXMKKy8vIGFjY2Vzc2libGUgYnkgY29kZSBmcm9tIGEgZGlmZmVyZW50IGRvbWFp
biwgYnV0IHdpbmRvdy5kb2N1bWVudCBpcyBub3QuCisvLworLy8gVGhlIGJpbmRpbmcgY29kZSBz
ZXRzIHNlY3VyaXR5IGNoZWNrIGNhbGxiYWNrcyBvbiBhIGZ1bmN0aW9uIHRlbXBsYXRlLAorLy8g
YW5kIGFjY2Vzc2luZyBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRlIGNhbGxzIHRoZSBjYWxsYmFj
ayBmdW5jdGlvbi4KKy8vIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBjaGVja3Mgc2FtZSBvcmlnaW4g
cG9saWN5LgorLy8KKy8vIENhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgZXhwZW5zaXZlLiBWOCB1c2Vz
IGEgc2VjdXJpdHkgdG9rZW4gc3RyaW5nIHRvIGRvCisvLyBmYXN0IGFjY2VzcyBjaGVja3MgZm9y
IHRoZSBjb21tb24gY2FzZSB3aGVyZSBzb3VyY2UgYW5kIHRhcmdldCBhcmUgaW4gdGhlCisvLyBz
YW1lIGRvbWFpbi4gQSBzZWN1cml0eSB0b2tlbiBpcyBhIHN0cmluZyBvYmplY3QgdGhhdCByZXBy
ZXNlbnRzCisvLyB0aGUgcHJvdG9jb2wvdXJsL3BvcnQgb2YgYSBkb21haW4uCisvLworLy8gVGhl
cmUgYXJlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYSBzZWN1cml0eSB0b2tlbiBtYXRjaGluZyBpcyBu
b3QgZW5vdWdoLgorLy8gRm9yIGV4YW1wbGUsIEphdmFTY3JpcHQgY2FuIHNldCBpdHMgZG9tYWlu
IHRvIGEgc3VwZXIgZG9tYWluIGJ5IGNhbGxpbmcKKy8vIGRvY3VtZW50LnNldERvbWFpbiguLi4p
LiBJbiB0aGVzZSBjYXNlcywgdGhlIGJpbmRpbmcgY29kZSBjYW4gcmVzZXQKKy8vIGEgY29udGV4
dCdzIHNlY3VyaXR5IHRva2VuIHRvIGl0cyBnbG9iYWwgb2JqZWN0IHNvIHRoYXQgdGhlIGZhc3Qg
YWNjZXNzCisvLyBjaGVjayB3aWxsIGFsd2F5cyBmYWlsLgorCisvLyBDaGVjayBpZiB0aGUgY3Vy
cmVudCBleGVjdXRpb24gY29udGV4dCBjYW4gYWNjZXNzIGEgdGFyZ2V0IGZyYW1lLgorLy8gRmly
c3QgaXQgY2hlY2tzIHNhbWUgZG9tYWluIHBvbGljeSB1c2luZyB0aGUgbGV4aWNhbCBjb250ZXh0
CisvLworLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIEtKUzo6V2luZG93OjphbGxvd3NBY2Nlc3NG
cm9tKEV4ZWNTdGF0ZSosIFN0cmluZyYpLgorYm9vbCBWOFByb3h5OjpjYW5BY2Nlc3NQcml2YXRl
KERPTVdpbmRvdyogdGFyZ2V0V2luZG93KQoreworICAgIEFTU0VSVCh0YXJnZXRXaW5kb3cpOwor
CisgICAgU3RyaW5nIG1lc3NhZ2U7CisKKyAgICBET01XaW5kb3cqIG9yaWdpbldpbmRvdyA9IHJl
dHJpZXZlV2luZG93KCk7CisgICAgaWYgKG9yaWdpbldpbmRvdyA9PSB0YXJnZXRXaW5kb3cpCisg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFvcmlnaW5XaW5kb3cpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIGNvbnN0IFNlY3VyaXR5T3JpZ2luKiBhY3RpdmVTZWN1cml0eU9y
aWdpbiA9IG9yaWdpbldpbmRvdy0+c2VjdXJpdHlPcmlnaW4oKTsKKyAgICBjb25zdCBTZWN1cml0
eU9yaWdpbiogdGFyZ2V0U2VjdXJpdHlPcmlnaW4gPSB0YXJnZXRXaW5kb3ctPnNlY3VyaXR5T3Jp
Z2luKCk7CisKKyAgICAvLyBXZSBoYXZlIHNlZW4gY3Jhc2hlcyB3ZXJlIHRoZSBzZWN1cml0eSBv
cmlnaW4gb2YgdGhlIHRhcmdldCBoYXMgbm90IGJlZW4KKyAgICAvLyBpbml0aWFsaXplZC4gIERl
ZmVuZCBhZ2FpbnN0IHRoYXQuCisgICAgaWYgKCF0YXJnZXRTZWN1cml0eU9yaWdpbikKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGFjdGl2ZVNlY3VyaXR5T3JpZ2luLT5jYW5BY2Nl
c3ModGFyZ2V0U2VjdXJpdHlPcmlnaW4pKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8v
IEFsbG93IGFjY2VzcyB0byBhICJhYm91dDpibGFuayIgcGFnZSBpZiB0aGUgZHluYW1pYyBjb250
ZXh0IGlzIGEKKyAgICAvLyBkZXRhY2hlZCBjb250ZXh0IG9mIHRoZSBzYW1lIGZyYW1lIGFzIHRo
ZSBibGFuayBwYWdlLgorICAgIGlmICh0YXJnZXRTZWN1cml0eU9yaWdpbi0+aXNFbXB0eSgpICYm
IG9yaWdpbldpbmRvdy0+ZnJhbWUoKSA9PSB0YXJnZXRXaW5kb3ctPmZyYW1lKCkpCisgICAgICAg
IHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFY4UHJveHk6OmNh
bkFjY2Vzc0ZyYW1lKEZyYW1lKiB0YXJnZXQsIGJvb2wgcmVwb3J0RXJyb3IpCit7CisgICAgLy8g
VGhlIHN1YmplY3QgaXMgZGV0YWNoZWQgZnJvbSBhIGZyYW1lLCBkZW55IGFjY2Vzc2VzLgorICAg
IGlmICghdGFyZ2V0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWNhbkFjY2Vz
c1ByaXZhdGUodGFyZ2V0LT5kb21XaW5kb3coKSkpIHsKKyAgICAgICAgaWYgKHJlcG9ydEVycm9y
KQorICAgICAgICAgICAgcmVwb3J0VW5zYWZlQWNjZXNzVG8odGFyZ2V0LCBSRVBPUlRfTk9XKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9v
bCBWOFByb3h5OjpjaGVja05vZGVTZWN1cml0eShOb2RlKiBub2RlKQoreworICAgIGlmICghbm9k
ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgRnJhbWUqIHRhcmdldCA9IG5vZGUtPmRv
Y3VtZW50KCktPmZyYW1lKCk7CisKKyAgICBpZiAoIXRhcmdldCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgcmV0dXJuIGNhbkFjY2Vzc0ZyYW1lKHRhcmdldCwgdHJ1ZSk7Cit9CisKK3Y4
OjpQZXJzaXN0ZW50PHY4OjpDb250ZXh0PiBWOFByb3h5OjpjcmVhdGVOZXdDb250ZXh0KHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsKQoreworICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpDb250
ZXh0PiByZXN1bHQ7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgZW52aXJvbm1lbnQgdXNpbmcgYW4g
ZW1wdHkgdGVtcGxhdGUgZm9yIHRoZSBzaGFkb3cKKyAgICAvLyBvYmplY3QuICBSZXVzZSB0aGUg
Z2xvYmFsIG9iamVjdCBpZiBvbmUgaGFzIGJlZW4gY3JlYXRlZCBlYXJsaWVyLgorICAgIHY4OjpQ
ZXJzaXN0ZW50PHY4OjpPYmplY3RUZW1wbGF0ZT4gZ2xvYmFsVGVtcGxhdGUgPSBWOERPTVdpbmRv
dzo6R2V0U2hhZG93T2JqZWN0VGVtcGxhdGUoKTsKKyAgICBpZiAoZ2xvYmFsVGVtcGxhdGUuSXNF
bXB0eSgpKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgLy8gSW5zdGFsbCBhIHNlY3Vy
aXR5IGhhbmRsZXIgd2l0aCBWOC4KKyAgICBnbG9iYWxUZW1wbGF0ZS0+U2V0QWNjZXNzQ2hlY2tD
YWxsYmFja3MoVjhDdXN0b206OnY4RE9NV2luZG93TmFtZWRTZWN1cml0eUNoZWNrLCBWOEN1c3Rv
bTo6djhET01XaW5kb3dJbmRleGVkU2VjdXJpdHlDaGVjaywgdjg6OkludGVnZXI6Ok5ldyhWOENs
YXNzSW5kZXg6OkRPTVdJTkRPVykpOworCisgICAgLy8gRHluYW1pY2FsbHkgdGVsbCB2OCBhYm91
dCBvdXIgZXh0ZW5zaW9ucyBub3cuCisgICAgY29uc3QgY2hhcioqIGV4dGVuc2lvbk5hbWVzID0g
bmV3IGNvbnN0IGNoYXIqW21fZXh0ZW5zaW9ucy5zaXplKCldOworICAgIGludCBpbmRleCA9IDA7
CisgICAgZm9yIChWOEV4dGVuc2lvbkxpc3Q6Oml0ZXJhdG9yIGl0ID0gbV9leHRlbnNpb25zLmJl
Z2luKCk7IGl0ICE9IG1fZXh0ZW5zaW9ucy5lbmQoKTsgKytpdCkgeworICAgICAgICAvLyBOb3Rl
OiB3ZSBjaGVjayB0aGUgbG9hZGVyIFVSTCBoZXJlIGluc3RlYWQgb2YgdGhlIGRvY3VtZW50IFVS
TAorICAgICAgICAvLyBiZWNhdXNlIHdlIG1pZ2h0IGJlIGN1cnJlbnRseSBsb2FkaW5nIGFuIFVS
TCBpbnRvIGEgYmxhbmsgcGFnZS4KKyAgICAgICAgLy8gU2VlIGh0dHA6Ly9jb2RlLmdvb2dsZS5j
b20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEwOTI0CisgICAgICAgIGlmIChpdC0+c2No
ZW1lLmxlbmd0aCgpID4gMCAmJiAoaXQtPnNjaGVtZSAhPSBtX2ZyYW1lLT5sb2FkZXIoKS0+YWN0
aXZlRG9jdW1lbnRMb2FkZXIoKS0+dXJsKCkucHJvdG9jb2woKSB8fCBpdC0+c2NoZW1lICE9IG1f
ZnJhbWUtPnBhZ2UoKS0+bWFpbkZyYW1lKCktPmxvYWRlcigpLT5hY3RpdmVEb2N1bWVudExvYWRl
cigpLT51cmwoKS5wcm90b2NvbCgpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAg
IGV4dGVuc2lvbk5hbWVzW2luZGV4KytdID0gaXQtPmV4dGVuc2lvbi0+bmFtZSgpOworICAgIH0K
KyAgICB2ODo6RXh0ZW5zaW9uQ29uZmlndXJhdGlvbiBleHRlbnNpb25zKGluZGV4LCBleHRlbnNp
b25OYW1lcyk7CisgICAgcmVzdWx0ID0gdjg6OkNvbnRleHQ6Ok5ldygmZXh0ZW5zaW9ucywgZ2xv
YmFsVGVtcGxhdGUsIGdsb2JhbCk7CisgICAgZGVsZXRlW10gZXh0ZW5zaW9uTmFtZXM7CisgICAg
ZXh0ZW5zaW9uTmFtZXMgPSAwOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gQ3JlYXRl
IGEgbmV3IGVudmlyb25tZW50IGFuZCBzZXR1cCB0aGUgZ2xvYmFsIG9iamVjdC4KKy8vCisvLyBU
aGUgZ2xvYmFsIG9iamVjdCBjb3JyZXNwb25kcyB0byBhIERPTVdpbmRvdyBpbnN0YW5jZS4gIEhv
d2V2ZXIsIHRvCisvLyBhbGxvdyBwcm9wZXJ0aWVzIG9mIHRoZSBKUyBET01XaW5kb3cgaW5zdGFu
Y2UgdG8gYmUgc2hhZG93ZWQsIHdlCisvLyB1c2UgYSBzaGFkb3cgb2JqZWN0IGFzIHRoZSBnbG9i
YWwgb2JqZWN0IGFuZCB1c2UgdGhlIEpTIERPTVdpbmRvdworLy8gaW5zdGFuY2UgYXMgdGhlIHBy
b3RvdHlwZSBmb3IgdGhhdCBzaGFkb3cgb2JqZWN0LiAgVGhlIEpTIERPTVdpbmRvdworLy8gaW5z
dGFuY2UgaXMgdW5kZXRlY3RhYmxlIGZyb20gamF2YXNjcmlwdCBjb2RlIGJlY2F1c2UgdGhlIF9f
cHJvdG9fXworLy8gYWNjZXNzb3JzIHNraXAgdGhhdCBvYmplY3QuCisvLworLy8gVGhlIHNoYWRv
dyBvYmplY3QgYW5kIHRoZSBET01XaW5kb3cgaW5zdGFuY2UgYXJlIHNlZW4gYXMgb25lIG9iamVj
dAorLy8gZnJvbSBqYXZhc2NyaXB0LiAgVGhlIGphdmFzY3JpcHQgb2JqZWN0IHRoYXQgY29ycmVz
cG9uZHMgdG8gYQorLy8gRE9NV2luZG93IGluc3RhbmNlIGlzIHRoZSBzaGFkb3cgb2JqZWN0LiAg
V2hlbiBtYXBwaW5nIGEgRE9NV2luZG93CisvLyBpbnN0YW5jZSB0byBhIFY4IG9iamVjdCwgd2Ug
cmV0dXJuIHRoZSBzaGFkb3cgb2JqZWN0LgorLy8KKy8vIFRvIGltcGxlbWVudCBzcGxpdC13aW5k
b3csIHNlZQorLy8gICAxKSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTcyNDkKKy8vICAgMikgaHR0cHM6Ly93aWtpLm1vemlsbGEub3JnL0dlY2tvOlNwbGl0V2luZG93
CisvLyAgIDMpIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTI5
NjYzOQorLy8gd2UgbmVlZCB0byBzcGxpdCB0aGUgc2hhZG93IG9iamVjdCBmdXJ0aGVyIGludG8g
dHdvIG9iamVjdHM6CisvLyBhbiBvdXRlciB3aW5kb3cgYW5kIGFuIGlubmVyIHdpbmRvdy4gVGhl
IGlubmVyIHdpbmRvdyBpcyB0aGUgaGlkZGVuCisvLyBwcm90b3R5cGUgb2YgdGhlIG91dGVyIHdp
bmRvdy4gVGhlIGlubmVyIHdpbmRvdyBpcyB0aGUgZGVmYXVsdAorLy8gZ2xvYmFsIG9iamVjdCBv
ZiB0aGUgY29udGV4dC4gQSB2YXJpYWJsZSBkZWNsYXJlZCBpbiB0aGUgZ2xvYmFsCisvLyBzY29w
ZSBpcyBhIHByb3BlcnR5IG9mIHRoZSBpbm5lciB3aW5kb3cuCisvLworLy8gVGhlIG91dGVyIHdp
bmRvdyBzdGlja3MgdG8gYSBGcmFtZSwgaXQgaXMgZXhwb3NlZCB0byBKYXZhU2NyaXB0CisvLyB2
aWEgd2luZG93LndpbmRvdywgd2luZG93LnNlbGYsIHdpbmRvdy5wYXJlbnQsIGV0Yy4gVGhlIG91
dGVyIHdpbmRvdworLy8gaGFzIGEgc2VjdXJpdHkgdG9rZW4gd2hpY2ggaXMgdGhlIGRvbWFpbi4g
VGhlIG91dGVyIHdpbmRvdyBjYW5ub3QKKy8vIGhhdmUgaXRzIG93biBwcm9wZXJ0aWVzLiB3aW5k
b3cuZm9vID0gJ3gnIGlzIGRlbGVnYXRlZCB0byB0aGUKKy8vIGlubmVyIHdpbmRvdy4KKy8vCisv
LyBXaGVuIGEgZnJhbWUgbmF2aWdhdGVzIHRvIGEgbmV3IHBhZ2UsIHRoZSBpbm5lciB3aW5kb3cg
aXMgY3V0IG9mZgorLy8gdGhlIG91dGVyIHdpbmRvdywgYW5kIHRoZSBvdXRlciB3aW5kb3cgaWRl
bnRpZnkgaXMgcHJlc2VydmVkIGZvcgorLy8gdGhlIGZyYW1lLiBIb3dldmVyLCBhIG5ldyBpbm5l
ciB3aW5kb3cgaXMgY3JlYXRlZCBmb3IgdGhlIG5ldyBwYWdlLgorLy8gSWYgdGhlcmUgYXJlIEpT
IGNvZGUgaG9sZHMgYSBjbG9zdXJlIHRvIHRoZSBvbGQgaW5uZXIgd2luZG93LAorLy8gaXQgd29u
J3QgYmUgYWJsZSB0byByZWFjaCB0aGUgb3V0ZXIgd2luZG93IHZpYSBpdHMgZ2xvYmFsIG9iamVj
dC4KK3ZvaWQgVjhQcm94eTo6aW5pdENvbnRleHRJZk5lZWRlZCgpCit7CisgICAgLy8gQmFpbCBv
dXQgaWYgdGhlIGNvbnRleHQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KKyAgICBpZiAo
IW1fY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIENyZWF0ZSBh
IGhhbmRsZSBzY29wZSBmb3IgYWxsIGxvY2FsIGhhbmRsZXMuCisgICAgdjg6OkhhbmRsZVNjb3Bl
IGhhbmRsZVNjb3BlOworCisgICAgLy8gU2V0dXAgdGhlIHNlY3VyaXR5IGhhbmRsZXJzIGFuZCBt
ZXNzYWdlIGxpc3RlbmVyLiAgVGhpcyBvbmx5IGhhcworICAgIC8vIHRvIGJlIGRvbmUgb25jZS4K
KyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGJvb2wsIGlzVjhJbml0aWFsaXplZCwgKGZhbHNlKSk7
CisgICAgaWYgKCFpc1Y4SW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgLy8gVGVsbHMgVjggbm90IHRv
IGNhbGwgdGhlIGRlZmF1bHQgT09NIGhhbmRsZXIsIGJpbmRpbmcgY29kZQorICAgICAgICAvLyB3
aWxsIGhhbmRsZSBpdC4KKyAgICAgICAgdjg6OlY4OjpJZ25vcmVPdXRPZk1lbW9yeUV4Y2VwdGlv
bigpOworICAgICAgICB2ODo6Vjg6OlNldEZhdGFsRXJyb3JIYW5kbGVyKHJlcG9ydEZhdGFsRXJy
b3JJblY4KTsKKworICAgICAgICB2ODo6Vjg6OlNldEdsb2JhbEdDUHJvbG9ndWVDYWxsYmFjaygm
Z2NQcm9sb2d1ZSk7CisgICAgICAgIHY4OjpWODo6U2V0R2xvYmFsR0NFcGlsb2d1ZUNhbGxiYWNr
KCZnY0VwaWxvZ3VlKTsKKworICAgICAgICB2ODo6Vjg6OkFkZE1lc3NhZ2VMaXN0ZW5lcihoYW5k
bGVDb25zb2xlTWVzc2FnZSk7CisKKyAgICAgICAgdjg6OlY4OjpTZXRGYWlsZWRBY2Nlc3NDaGVj
a0NhbGxiYWNrRnVuY3Rpb24ocmVwb3J0VW5zYWZlSmF2YVNjcmlwdEFjY2Vzcyk7CisKKyAgICAg
ICAgaXNWOEluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBtX2NvbnRleHQgPSBjcmVh
dGVOZXdDb250ZXh0KG1fZ2xvYmFsKTsKKyAgICBpZiAobV9jb250ZXh0LklzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgLy8gU3RhcnRpbmcgZnJvbSBub3csIHVzZSBsb2NhbCBjb250
ZXh0IG9ubHkuCisgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSBjb250ZXh0
KCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRTY29wZSh2OENvbnRleHQpOworCisg
ICAgLy8gU3RvcmUgdGhlIGZpcnN0IGdsb2JhbCBvYmplY3QgY3JlYXRlZCBzbyB3ZSBjYW4gcmV1
c2UgaXQuCisgICAgaWYgKG1fZ2xvYmFsLklzRW1wdHkoKSkgeworICAgICAgICBtX2dsb2JhbCA9
IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcodjhDb250ZXh0LT5HbG9iYWwoKSk7Cisg
ICAgICAgIC8vIEJhaWwgb3V0IGlmIGFsbG9jYXRpb24gb2YgdGhlIGZpcnN0IGdsb2JhbCBvYmpl
Y3RzIGZhaWxzLgorICAgICAgICBpZiAobV9nbG9iYWwuSXNFbXB0eSgpKSB7CisgICAgICAgICAg
ZGlzcG9zZUNvbnRleHRIYW5kbGVzKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisj
aWZuZGVmIE5ERUJVRworICAgICAgICByZWdpc3Rlckdsb2JhbEhhbmRsZShQUk9YWSwgdGhpcywg
bV9nbG9iYWwpOworI2VuZGlmCisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgc3RyaW5ncyB1c2Vk
IGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IG9iamVj
dFN0cmluZyA9IHY4OjpTdHJpbmc6Ok5ldygiT2JqZWN0Iik7CisgICAgdjg6OkhhbmRsZTx2ODo6
U3RyaW5nPiBwcm90b3R5cGVTdHJpbmcgPSB2ODo6U3RyaW5nOjpOZXcoInByb3RvdHlwZSIpOwor
ICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gaW1wbGljaXRQcm90b1N0cmluZyA9IHY4OjpTdHJp
bmc6Ok5ldygiX19wcm90b19fIik7CisgICAgLy8gQmFpbCBvdXQgaWYgYWxsb2NhdGlvbiBmYWls
ZWQuCisgICAgaWYgKG9iamVjdFN0cmluZy5Jc0VtcHR5KCkgfHwgcHJvdG90eXBlU3RyaW5nLklz
RW1wdHkoKSB8fCBpbXBsaWNpdFByb3RvU3RyaW5nLklzRW1wdHkoKSkgeworICAgICAgICBkaXNw
b3NlQ29udGV4dEhhbmRsZXMoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEFs
bG9jYXRlIGNsb25lIGNhY2hlIGFuZCBwcmUtYWxsb2NhdGVkIG9iamVjdHMKKyAgICB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QobV9n
bG9iYWwtPkdldChvYmplY3RTdHJpbmcpKTsKKyAgICBtX29iamVjdFByb3RvdHlwZSA9IHY4OjpQ
ZXJzaXN0ZW50PHY4OjpWYWx1ZT46Ok5ldyhvYmplY3QtPkdldChwcm90b3R5cGVTdHJpbmcpKTsK
KyAgICBtX3dyYXBwZXJCb2lsZXJwbGF0ZXMgPSB2ODo6UGVyc2lzdGVudDx2ODo6QXJyYXk+OjpO
ZXcodjg6OkFycmF5OjpOZXcoVjhDbGFzc0luZGV4OjpXUkFQUEVSX1RZUEVfQ09VTlQpKTsKKyAg
ICAvLyBCYWlsIG91dCBpZiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAgICBpZiAobV9vYmplY3RQcm90
b3R5cGUuSXNFbXB0eSgpKSB7CisgICAgICAgIGRpc3Bvc2VDb250ZXh0SGFuZGxlcygpOworICAg
ICAgICByZXR1cm47CisgICAgfQorI2lmbmRlZiBOREVCVUcKKyAgICByZWdpc3Rlckdsb2JhbEhh
bmRsZShQUk9YWSwgdGhpcywgbV9vYmplY3RQcm90b3R5cGUpOworICAgIHJlZ2lzdGVyR2xvYmFs
SGFuZGxlKFBST1hZLCB0aGlzLCBtX3dyYXBwZXJCb2lsZXJwbGF0ZXMpOworI2VuZGlmCisKKyAg
ICAvLyBDcmVhdGUgYSBuZXcgSlMgd2luZG93IG9iamVjdCBhbmQgdXNlIGl0IGFzIHRoZSBwcm90
b3R5cGUgZm9yIHRoZQorICAgIC8vIHNoYWRvdyBnbG9iYWwgb2JqZWN0LgorICAgIHY4OjpIYW5k
bGU8djg6OkZ1bmN0aW9uPiB3aW5kb3dDb25zdHJ1Y3RvciA9IGdldENvbnN0cnVjdG9yKFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XKTsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4ganNXaW5kb3cg
PSBTYWZlQWxsb2NhdGlvbjo6bmV3SW5zdGFuY2Uod2luZG93Q29uc3RydWN0b3IpOworICAgIC8v
IEJhaWwgb3V0IGlmIGFsbG9jYXRpb24gZmFpbGVkLgorICAgIGlmIChqc1dpbmRvdy5Jc0VtcHR5
KCkpIHsKKyAgICAgICAgZGlzcG9zZUNvbnRleHRIYW5kbGVzKCk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBET01XaW5kb3cqIHdpbmRvdyA9IG1fZnJhbWUtPmRvbVdpbmRvdygpOwor
CisgICAgLy8gV3JhcCB0aGUgd2luZG93LgorICAgIHNldERPTVdyYXBwZXIoanNXaW5kb3csIFY4
Q2xhc3NJbmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpET01XSU5ET1cpLCB3aW5kb3cpOworCisg
ICAgd2luZG93LT5yZWYoKTsKKyAgICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01PYmplY3Qo
d2luZG93LCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGpzV2luZG93KSk7CisKKyAg
ICAvLyBJbnNlcnQgdGhlIHdpbmRvdyBpbnN0YW5jZSBhcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBz
aGFkb3cgb2JqZWN0LgorICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gdjhfZ2xvYmFsID0gdjhD
b250ZXh0LT5HbG9iYWwoKTsKKyAgICB2OF9nbG9iYWwtPlNldChpbXBsaWNpdFByb3RvU3RyaW5n
LCBqc1dpbmRvdyk7CisKKyAgICB1cGRhdGVEb2N1bWVudCgpOworCisgICAgc2V0U2VjdXJpdHlU
b2tlbigpOworCisgICAgbV9mcmFtZS0+bG9hZGVyKCktPmRpc3BhdGNoV2luZG93T2JqZWN0QXZh
aWxhYmxlKCk7Cit9CisKKwordm9pZCBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oaW50IGV4Y2Vw
dGlvbkNvZGUpCit7CisgICAgaWYgKGV4Y2VwdGlvbkNvZGUgPD0gMCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgRXhjZXB0aW9uQ29kZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworICAgIGdldEV4
Y2VwdGlvbkNvZGVEZXNjcmlwdGlvbihleGNlcHRpb25Db2RlLCBkZXNjcmlwdGlvbik7CisKKyAg
ICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZXhjZXB0aW9uOworICAgIHN3aXRjaCAoZGVzY3JpcHRp
b24udHlwZSkgeworICAgIGNhc2UgRE9NRXhjZXB0aW9uVHlwZToKKyAgICAgICAgZXhjZXB0aW9u
ID0gY29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01DT1JFRVhDRVBUSU9OLCBET01D
b3JlRXhjZXB0aW9uOjpjcmVhdGUoZGVzY3JpcHRpb24pKTsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBSYW5nZUV4Y2VwdGlvblR5cGU6CisgICAgICAgIGV4Y2VwdGlvbiA9IGNvbnZlcnRUb1Y4
T2JqZWN0KFY4Q2xhc3NJbmRleDo6UkFOR0VFWENFUFRJT04sIFJhbmdlRXhjZXB0aW9uOjpjcmVh
dGUoZGVzY3JpcHRpb24pKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFdmVudEV4Y2VwdGlv
blR5cGU6CisgICAgICAgIGV4Y2VwdGlvbiA9IGNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRl
eDo6RVZFTlRFWENFUFRJT04sIEV2ZW50RXhjZXB0aW9uOjpjcmVhdGUoZGVzY3JpcHRpb24pKTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxIdHRwUmVxdWVzdEV4Y2VwdGlvblR5cGU6Cisg
ICAgICAgIGV4Y2VwdGlvbiA9IGNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6WE1MSFRU
UFJFUVVFU1RFWENFUFRJT04sIFhNTEh0dHBSZXF1ZXN0RXhjZXB0aW9uOjpjcmVhdGUoZGVzY3Jp
cHRpb24pKTsKKyAgICAgICAgYnJlYWs7CisjaWYgRU5BQkxFKFNWRykKKyAgICBjYXNlIFNWR0V4
Y2VwdGlvblR5cGU6CisgICAgICAgIGV4Y2VwdGlvbiA9IGNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xh
c3NJbmRleDo6U1ZHRVhDRVBUSU9OLCBTVkdFeGNlcHRpb246OmNyZWF0ZShkZXNjcmlwdGlvbikp
OworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmIEVOQUJMRShYUEFUSCkKKyAgICBjYXNlIFhQ
YXRoRXhjZXB0aW9uVHlwZToKKyAgICAgICAgZXhjZXB0aW9uID0gY29udmVydFRvVjhPYmplY3Qo
VjhDbGFzc0luZGV4OjpYUEFUSEVYQ0VQVElPTiwgWFBhdGhFeGNlcHRpb246OmNyZWF0ZShkZXNj
cmlwdGlvbikpOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIH0KKworICAgIEFTU0VSVCgh
ZXhjZXB0aW9uLklzRW1wdHkoKSk7CisgICAgdjg6OlRocm93RXhjZXB0aW9uKGV4Y2VwdGlvbik7
Cit9CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojp0aHJvd0Vycm9yKEVycm9yVHlw
ZSB0eXBlLCBjb25zdCBjaGFyKiBtZXNzYWdlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAg
IGNhc2UgUkFOR0VfRVJST1I6CisgICAgICAgIHJldHVybiB2ODo6VGhyb3dFeGNlcHRpb24odjg6
OkV4Y2VwdGlvbjo6UmFuZ2VFcnJvcih2OFN0cmluZyhtZXNzYWdlKSkpOworICAgIGNhc2UgUkVG
RVJFTkNFX0VSUk9SOgorICAgICAgICByZXR1cm4gdjg6OlRocm93RXhjZXB0aW9uKHY4OjpFeGNl
cHRpb246OlJlZmVyZW5jZUVycm9yKHY4U3RyaW5nKG1lc3NhZ2UpKSk7CisgICAgY2FzZSBTWU5U
QVhfRVJST1I6CisgICAgICAgIHJldHVybiB2ODo6VGhyb3dFeGNlcHRpb24odjg6OkV4Y2VwdGlv
bjo6U3ludGF4RXJyb3IodjhTdHJpbmcobWVzc2FnZSkpKTsKKyAgICBjYXNlIFRZUEVfRVJST1I6
CisgICAgICAgIHJldHVybiB2ODo6VGhyb3dFeGNlcHRpb24odjg6OkV4Y2VwdGlvbjo6VHlwZUVy
cm9yKHY4U3RyaW5nKG1lc3NhZ2UpKSk7CisgICAgY2FzZSBHRU5FUkFMX0VSUk9SOgorICAgICAg
ICByZXR1cm4gdjg6OlRocm93RXhjZXB0aW9uKHY4OjpFeGNlcHRpb246OkVycm9yKHY4U3RyaW5n
KG1lc3NhZ2UpKSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworICAgIH0KK30KKwor
djg6OkxvY2FsPHY4OjpDb250ZXh0PiBWOFByb3h5Ojpjb250ZXh0KEZyYW1lKiBmcmFtZSkKK3sK
KyAgICBWOFByb3h5KiBwcm94eSA9IHJldHJpZXZlKGZyYW1lKTsKKyAgICBpZiAoIXByb3h5KQor
ICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250ZXh0PigpOworCisgICAgcHJveHktPmlu
aXRDb250ZXh0SWZOZWVkZWQoKTsKKyAgICByZXR1cm4gcHJveHktPmNvbnRleHQoKTsKK30KKwor
djg6OkxvY2FsPHY4OjpDb250ZXh0PiBWOFByb3h5OjpjdXJyZW50Q29udGV4dCgpCit7CisgICAg
cmV0dXJuIHY4OjpDb250ZXh0OjpHZXRDdXJyZW50KCk7Cit9CisKK3Y4OjpIYW5kbGU8djg6OlZh
bHVlPiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5
cGUgdHlwZSwgdm9pZCogaW1wbCkKK3sKKyAgICBBU1NFUlQodHlwZSAhPSBWOENsYXNzSW5kZXg6
OkVWRU5UTElTVEVORVIpOworICAgIEFTU0VSVCh0eXBlICE9IFY4Q2xhc3NJbmRleDo6RVZFTlRU
QVJHRVQpOworICAgIEFTU0VSVCh0eXBlICE9IFY4Q2xhc3NJbmRleDo6RVZFTlQpOworCisgICAg
Ym9vbCBpc0FjdGl2ZURvbU9iamVjdCA9IGZhbHNlOworICAgIHN3aXRjaCAodHlwZSkgeworI2Rl
ZmluZSBNQUtFX0NBU0UoVFlQRSwgTkFNRSkgY2FzZSBWOENsYXNzSW5kZXg6OlRZUEU6CisgICAg
ICAgIERPTV9OT0RFX1RZUEVTKE1BS0VfQ0FTRSkKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBT
VkdfTk9ERV9UWVBFUyhNQUtFX0NBU0UpCisjZW5kaWYKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRO
b2RlVG9WOE9iamVjdChzdGF0aWNfY2FzdDxOb2RlKj4oaW1wbCkpOworICAgIGNhc2UgVjhDbGFz
c0luZGV4OjpDU1NWQUxVRToKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRDU1NWYWx1ZVRvVjhPYmpl
Y3Qoc3RhdGljX2Nhc3Q8Q1NTVmFsdWUqPihpbXBsKSk7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6
OkNTU1JVTEU6CisgICAgICAgIHJldHVybiBjb252ZXJ0Q1NTUnVsZVRvVjhPYmplY3Qoc3RhdGlj
X2Nhc3Q8Q1NTUnVsZSo+KGltcGwpKTsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6U1RZTEVTSEVF
VDoKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRTdHlsZVNoZWV0VG9WOE9iamVjdChzdGF0aWNfY2Fz
dDxTdHlsZVNoZWV0Kj4oaW1wbCkpOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpET01XSU5ET1c6
CisgICAgICAgIHJldHVybiBjb252ZXJ0V2luZG93VG9WOE9iamVjdChzdGF0aWNfY2FzdDxET01X
aW5kb3cqPihpbXBsKSk7CisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgU1ZHX05PTk5PREVfVFlQ
RVMoTUFLRV9DQVNFKQorICAgICAgICBpZiAodHlwZSA9PSBWOENsYXNzSW5kZXg6OlNWR0VMRU1F
TlRJTlNUQU5DRSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0U1ZHRWxlbWVudEluc3RhbmNl
VG9WOE9iamVjdChzdGF0aWNfY2FzdDxTVkdFbGVtZW50SW5zdGFuY2UqPihpbXBsKSk7CisgICAg
ICAgIHJldHVybiBjb252ZXJ0U1ZHT2JqZWN0V2l0aENvbnRleHRUb1Y4T2JqZWN0KHR5cGUsIGlt
cGwpOworI2VuZGlmCisKKyAgICAgICAgQUNUSVZFX0RPTV9PQkpFQ1RfVFlQRVMoTUFLRV9DQVNF
KQorICAgICAgICBpc0FjdGl2ZURvbU9iamVjdCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAg
IGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICB9CisKKyN1bmRlZiBNQUtFX0NBU0UKKworICAg
IGlmICghaW1wbCkKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICAvLyBOb24gRE9N
IG5vZGUKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiByZXN1bHQgPSBpc0FjdGl2ZURv
bU9iamVjdCA/IGdldEFjdGl2ZURPTU9iamVjdE1hcCgpLmdldChpbXBsKSA6IGdldERPTU9iamVj
dE1hcCgpLmdldChpbXBsKTsKKyAgICBpZiAocmVzdWx0LklzRW1wdHkoKSkgeworICAgICAgICB2
ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhPYmplY3QgPSBpbnN0YW50aWF0ZVY4T2JqZWN0KHR5cGUs
IHR5cGUsIGltcGwpOworICAgICAgICBpZiAoIXY4T2JqZWN0LklzRW1wdHkoKSkgeworICAgICAg
ICAgICAgLy8gR28gdGhyb3VnaCBiaWcgc3dpdGNoIHN0YXRlbWVudCwgaXQgaGFzIHNvbWUgZHVw
bGljYXRpb25zCisgICAgICAgICAgICAvLyB0aGF0IHdlcmUgaGFuZGxlZCBieSBjb2RlIGFib3Zl
IChzdWNoIGFzIENTU1ZBTFVFLCBDU1NSVUxFLCBldGMpLgorICAgICAgICAgICAgc3dpdGNoICh0
eXBlKSB7CisjZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBOQU1FKSBcCisgICAgICAgICAgICBjYXNl
IFY4Q2xhc3NJbmRleDo6VFlQRTogc3RhdGljX2Nhc3Q8TkFNRSo+KGltcGwpLT5yZWYoKTsgYnJl
YWs7CisgICAgICAgICAgICAgICAgRE9NX09CSkVDVF9UWVBFUyhNQUtFX0NBU0UpCisjdW5kZWYg
TUFLRV9DQVNFCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gdjg6OlBl
cnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyh2OE9iamVjdCk7CisgICAgICAgICAgICBpZiAoaXNB
Y3RpdmVEb21PYmplY3QpCisgICAgICAgICAgICAgICAgc2V0SlNXcmFwcGVyRm9yQWN0aXZlRE9N
T2JqZWN0KGltcGwsIHJlc3VsdCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
c2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KGltcGwsIHJlc3VsdCk7CisKKyAgICAgICAgICAgIC8v
IFNwZWNpYWwgY2FzZSBmb3Igbm9uLW5vZGUgb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggYQorICAg
ICAgICAgICAgLy8gRE9NV2luZG93LiBCb3RoIFNhZmFyaSBhbmQgRkYgbGV0IHRoZSBKUyB3cmFw
cGVycyBmb3IgdGhlc2UKKyAgICAgICAgICAgIC8vIG9iamVjdHMgc3Vydml2ZSBHQy4gVG8gbWlt
aWMgdGhlaXIgYmVoYXZpb3IsIFY4IGNyZWF0ZXMKKyAgICAgICAgICAgIC8vIGhpZGRlbiByZWZl
cmVuY2VzIGZyb20gdGhlIERPTVdpbmRvdyB0byB0aGVzZSB3cmFwcGVyCisgICAgICAgICAgICAv
LyBvYmplY3RzLiBUaGVzZSByZWZlcmVuY2VzIGdldCBjbGVhcmVkIHdoZW4gdGhlIERPTVdpbmRv
dyBpcworICAgICAgICAgICAgLy8gcmV1c2VkIGJ5IGEgbmV3IHBhZ2UuCisgICAgICAgICAgICBz
d2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpDT05TT0xFOgor
ICAgICAgICAgICAgICAgIHNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShzdGF0aWNfY2FzdDxDb25z
b2xlKj4oaW1wbCktPmZyYW1lKCksIFY4Q3VzdG9tOjprRE9NV2luZG93Q29uc29sZUluZGV4LCBy
ZXN1bHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWOENsYXNz
SW5kZXg6OkhJU1RPUlk6CisgICAgICAgICAgICAgICAgc2V0SGlkZGVuV2luZG93UmVmZXJlbmNl
KHN0YXRpY19jYXN0PEhpc3RvcnkqPihpbXBsKS0+ZnJhbWUoKSwgVjhDdXN0b206OmtET01XaW5k
b3dIaXN0b3J5SW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6TkFWSUdBVE9SOgorICAgICAgICAgICAgICAgIHNldEhp
ZGRlbldpbmRvd1JlZmVyZW5jZShzdGF0aWNfY2FzdDxOYXZpZ2F0b3IqPihpbXBsKS0+ZnJhbWUo
KSwgVjhDdXN0b206OmtET01XaW5kb3dOYXZpZ2F0b3JJbmRleCwgcmVzdWx0KTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpTQ1JFRU46Cisg
ICAgICAgICAgICAgICAgc2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKHN0YXRpY19jYXN0PFNjcmVl
bio+KGltcGwpLT5mcmFtZSgpLCBWOEN1c3RvbTo6a0RPTVdpbmRvd1NjcmVlbkluZGV4LCByZXN1
bHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5k
ZXg6OkxPQ0FUSU9OOgorICAgICAgICAgICAgICAgIHNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShz
dGF0aWNfY2FzdDxMb2NhdGlvbio+KGltcGwpLT5mcmFtZSgpLCBWOEN1c3RvbTo6a0RPTVdpbmRv
d0xvY2F0aW9uSW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6RE9NU0VMRUNUSU9OOgorICAgICAgICAgICAgICAgIHNl
dEhpZGRlbldpbmRvd1JlZmVyZW5jZShzdGF0aWNfY2FzdDxET01TZWxlY3Rpb24qPihpbXBsKS0+
ZnJhbWUoKSwgVjhDdXN0b206OmtET01XaW5kb3dET01TZWxlY3Rpb25JbmRleCwgcmVzdWx0KTsK
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpC
QVJJTkZPOiB7CisgICAgICAgICAgICAgICAgQmFySW5mbyogYmFySW5mbyA9IHN0YXRpY19jYXN0
PEJhckluZm8qPihpbXBsKTsKKyAgICAgICAgICAgICAgICBGcmFtZSogZnJhbWUgPSBiYXJJbmZv
LT5mcmFtZSgpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYmFySW5mby0+dHlwZSgpKSB7Cisg
ICAgICAgICAgICAgICAgY2FzZSBCYXJJbmZvOjpMb2NhdGlvbmJhcjoKKyAgICAgICAgICAgICAg
ICAgICAgc2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKGZyYW1lLCBWOEN1c3RvbTo6a0RPTVdpbmRv
d0xvY2F0aW9uYmFySW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgIGNhc2UgQmFySW5mbzo6TWVudWJhcjoKKyAgICAgICAgICAgICAgICAg
ICAgc2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKGZyYW1lLCBWOEN1c3RvbTo6a0RPTVdpbmRvd01l
bnViYXJJbmRleCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgY2FzZSBCYXJJbmZvOjpQZXJzb25hbGJhcjoKKyAgICAgICAgICAgICAgICAgICAg
c2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKGZyYW1lLCBWOEN1c3RvbTo6a0RPTVdpbmRvd1BlcnNv
bmFsYmFySW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgIGNhc2UgQmFySW5mbzo6U2Nyb2xsYmFyczoKKyAgICAgICAgICAgICAgICAgICAg
c2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKGZyYW1lLCBWOEN1c3RvbTo6a0RPTVdpbmRvd1Njcm9s
bGJhcnNJbmRleCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgY2FzZSBCYXJJbmZvOjpTdGF0dXNiYXI6CisgICAgICAgICAgICAgICAgICAgIHNl
dEhpZGRlbldpbmRvd1JlZmVyZW5jZShmcmFtZSwgVjhDdXN0b206OmtET01XaW5kb3dTdGF0dXNi
YXJJbmRleCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgY2FzZSBCYXJJbmZvOjpUb29sYmFyOgorICAgICAgICAgICAgICAgICAgICBzZXRIaWRk
ZW5XaW5kb3dSZWZlcmVuY2UoZnJhbWUsIFY4Q3VzdG9tOjprRE9NV2luZG93VG9vbGJhckluZGV4
LCByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZh
dWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgVjhQcm94eTo6c2V0SGlkZGVuV2lu
ZG93UmVmZXJlbmNlKEZyYW1lKiBmcmFtZSwgY29uc3QgaW50IGludGVybmFsSW5kZXgsIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4ganNPYmplY3QpCit7CisgICAgLy8gR2V0IERPTVdpbmRvdworICAg
IGlmICghZnJhbWUpCisgICAgICAgIHJldHVybjsgIC8vIE9iamVjdCBtaWdodCBiZSBkZXRhY2hl
ZCBmcm9tIHdpbmRvdworICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9IGNv
bnRleHQoZnJhbWUpOworICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBBU1NFUlQoaW50ZXJuYWxJbmRleCA8IFY4Q3VzdG9tOjprRE9NV2luZG93SW50
ZXJuYWxGaWVsZENvdW50KTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsID0g
djhDb250ZXh0LT5HbG9iYWwoKTsKKyAgICAvLyBMb29rIGZvciByZWFsIERPTSB3cmFwcGVyLgor
ICAgIGdsb2JhbCA9IGxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGds
b2JhbCk7CisgICAgQVNTRVJUKCFnbG9iYWwuSXNFbXB0eSgpKTsKKyAgICBBU1NFUlQoZ2xvYmFs
LT5HZXRJbnRlcm5hbEZpZWxkKGludGVybmFsSW5kZXgpLT5Jc1VuZGVmaW5lZCgpKTsKKyAgICBn
bG9iYWwtPlNldEludGVybmFsRmllbGQoaW50ZXJuYWxJbmRleCwganNPYmplY3QpOworfQorCitW
OENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgVjhQcm94eTo6ZG9tV3JhcHBlclR5cGUodjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiBvYmplY3QpCit7CisgICAgQVNTRVJUKG1heWJlRE9NV3JhcHBlcihv
YmplY3QpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdHlwZSA9IG9iamVjdC0+R2V0SW50
ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RPTVdyYXBwZXJUeXBlSW5kZXgpOworICAgIHJldHVybiBW
OENsYXNzSW5kZXg6OkZyb21JbnQodHlwZS0+SW50MzJWYWx1ZSgpKTsKK30KKwordm9pZCogVjhQ
cm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0SW1wbChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5
cGUgdHlwZSwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IG9iamVjdCkKK3sKKyAgICAvLyBOYXRpdmUg
ZXZlbnQgbGlzdGVuZXIgaXMgcGVyIGZyYW1lLCBpdCBjYW5ub3QgYmUgaGFuZGxlZCBieSB0aGlz
IGdlbmVyaWMgZnVuY3Rpb24uCisgICAgQVNTRVJUKHR5cGUgIT0gVjhDbGFzc0luZGV4OjpFVkVO
VExJU1RFTkVSKTsKKyAgICBBU1NFUlQodHlwZSAhPSBWOENsYXNzSW5kZXg6OkVWRU5UVEFSR0VU
KTsKKworICAgIEFTU0VSVChtYXliZURPTVdyYXBwZXIob2JqZWN0KSk7CisKKyAgICBzd2l0Y2gg
KHR5cGUpIHsKKyNkZWZpbmUgTUFLRV9DQVNFKFRZUEUsIE5BTUUpIGNhc2UgVjhDbGFzc0luZGV4
OjpUWVBFOgorICAgICAgICBET01fTk9ERV9UWVBFUyhNQUtFX0NBU0UpCisjaWYgRU5BQkxFKFNW
RykKKyAgICAgICAgU1ZHX05PREVfVFlQRVMoTUFLRV9DQVNFKQorI2VuZGlmCisgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIFY4Q2xhc3NJ
bmRleDo6WE1MSFRUUFJFUVVFU1Q6CisgICAgICAgIHJldHVybiBjb252ZXJ0RE9NV3JhcHBlclRv
TmF0aXZlPFhNTEh0dHBSZXF1ZXN0PihvYmplY3QpOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpF
VkVOVDoKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8RXZlbnQ+KG9i
amVjdCk7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkNTU1JVTEU6CisgICAgICAgIHJldHVybiBj
b252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPENTU1J1bGU+KG9iamVjdCk7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgYnJlYWs7CisgICAgfQorI3VuZGVmIE1BS0VfQ0FTRQorCisgICAgcmV0dXJuIGNv
bnZlcnRET01XcmFwcGVyVG9OYXRpdmU8dm9pZD4ob2JqZWN0KTsKK30KKworCit2b2lkKiBWOFBy
b3h5Ojpjb252ZXJ0VG9TVkdQT0RUeXBlSW1wbChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUg
dHlwZSwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IG9iamVjdCkKK3sKKyAgICByZXR1cm4gaXNXcmFw
cGVyT2ZUeXBlKG9iamVjdCwgdHlwZSkgPyBjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPHZvaWQ+
KG9iamVjdCkgOiAwOworfQorCit2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IFY4UHJveHk6Omxvb2t1
cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHY4OjpIYW5kbGU8
djg6OlZhbHVlPiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUuSXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKworICAgIHY4OjpIYW5kbGU8djg6OkZ1
bmN0aW9uVGVtcGxhdGU+IGRlc2NyaXB0b3IgPSBWOFByb3h5OjpnZXRUZW1wbGF0ZSh0eXBlKTsK
KyAgICB3aGlsZSAodmFsdWUtPklzT2JqZWN0KCkpIHsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6
T2JqZWN0PiBvYmplY3QgPSB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHZhbHVlKTsKKyAg
ICAgICAgaWYgKGRlc2NyaXB0b3ItPkhhc0luc3RhbmNlKG9iamVjdCkpCisgICAgICAgICAgICBy
ZXR1cm4gb2JqZWN0OworCisgICAgICAgIHZhbHVlID0gb2JqZWN0LT5HZXRQcm90b3R5cGUoKTsK
KyAgICB9CisgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7Cit9IAorCit2b2lk
KiBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZUhlbHBlcih2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gdmFsdWUpCit7CisgICAgQVNTRVJUKG1heWJlRE9NV3JhcHBlcih2YWx1ZSkpOworCisg
ICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmplY3QgPSB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+
OjpDYXN0KHZhbHVlKTsKKworICAgIEFTU0VSVChkb21XcmFwcGVyVHlwZShvYmplY3QpID09IFY4
Q2xhc3NJbmRleDo6Tk9ERSk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcHBlciA9
IG9iamVjdC0+R2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RPTVdyYXBwZXJPYmplY3RJbmRl
eCk7CisgICAgcmV0dXJuIGV4dHJhY3RDUG9pbnRlcjxOb2RlPih3cmFwcGVyKTsKK30KKworUGFz
c1JlZlB0cjxOb2RlRmlsdGVyPiBWOFByb3h5Ojp3cmFwTmF0aXZlTm9kZUZpbHRlcih2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gZmlsdGVyKQoreworICAgIC8vIEEgTm9kZUZpbHRlciBpcyB1c2VkIHdo
ZW4gd2Fsa2luZyB0aHJvdWdoIGEgRE9NIHRyZWUgb3IgaXRlcmF0aW5nIHRyZWUKKyAgICAvLyBu
b2Rlcy4KKyAgICAvLyBGSVhNRTogd2UgbWF5IHdhbnQgdG8gY2FjaGUgTm9kZUZpbHRlckNvbmRp
dGlvbiBhbmQgTm9kZUZpbHRlcgorICAgIC8vIG9iamVjdCwgYnV0IGl0IGlzIG1pbm9yLgorICAg
IC8vIE5vZGVGaWx0ZXIgaXMgcGFzc2VkIHRvIE5vZGVJdGVyYXRvciB0aGF0IGhhcyBhIHJlZiBj
b3VudGVkIHBvaW50ZXIKKyAgICAvLyB0byBOb2RlRmlsdGVyLiBOb2RlRmlsdGVyIGhhcyBhIHJl
ZiBjb3VudGVkIHBvaW50ZXIgdG8gTm9kZUZpbHRlckNvbmRpdGlvbi4KKyAgICAvLyBJbiBOb2Rl
RmlsdGVyQ29uZGl0aW9uLCBmaWx0ZXIgb2JqZWN0IGlzIHBlcnNpc3RlZCBpbiBpdHMgY29uc3Ry
dWN0b3IsCisgICAgLy8gYW5kIGRpc3Bvc2VkIGluIGl0cyBkZXN0cnVjdG9yLgorICAgIGlmICgh
ZmlsdGVyLT5Jc0Z1bmN0aW9uKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgTm9kZUZpbHRl
ckNvbmRpdGlvbiogY29uZGl0aW9uID0gbmV3IFY4Tm9kZUZpbHRlckNvbmRpdGlvbihmaWx0ZXIp
OworICAgIHJldHVybiBOb2RlRmlsdGVyOjpjcmVhdGUoY29uZGl0aW9uKTsKK30KKwordjg6Okxv
Y2FsPHY4OjpPYmplY3Q+IFY4UHJveHk6Omluc3RhbnRpYXRlVjhPYmplY3QoVjhDbGFzc0luZGV4
OjpWOFdyYXBwZXJUeXBlIGRlc2NyaXB0b3JUeXBlLCBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5
cGUgY3B0clR5cGUsIHZvaWQqIGltcGwpCit7CisgICAgLy8gTWFrZSBhIHNwZWNpYWwgY2FzZSBm
b3IgZG9jdW1lbnQuYWxsCisgICAgaWYgKGRlc2NyaXB0b3JUeXBlID09IFY4Q2xhc3NJbmRleDo6
SFRNTENPTExFQ1RJT04gJiYgc3RhdGljX2Nhc3Q8SFRNTENvbGxlY3Rpb24qPihpbXBsKS0+dHlw
ZSgpID09IERvY0FsbCkKKyAgICAgICAgZGVzY3JpcHRvclR5cGUgPSBWOENsYXNzSW5kZXg6OlVO
REVURUNUQUJMRUhUTUxDT0xMRUNUSU9OOworCisgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5
OjpyZXRyaWV2ZSgpOworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBpbnN0YW5jZTsKKyAgICBp
ZiAocHJveHkpCisgICAgICAgIGluc3RhbmNlID0gcHJveHktPmNyZWF0ZVdyYXBwZXJGcm9tQ2Fj
aGUoZGVzY3JpcHRvclR5cGUpOworICAgIGVsc2UgeworICAgICAgICB2ODo6TG9jYWw8djg6OkZ1
bmN0aW9uPiBmdW5jdGlvbiA9IGdldFRlbXBsYXRlKGRlc2NyaXB0b3JUeXBlKS0+R2V0RnVuY3Rp
b24oKTsKKyAgICAgICAgaW5zdGFuY2UgPSBTYWZlQWxsb2NhdGlvbjo6bmV3SW5zdGFuY2UoZnVu
Y3Rpb24pOworICAgIH0KKyAgICBpZiAoIWluc3RhbmNlLklzRW1wdHkoKSkgeworICAgICAgICAv
LyBBdm9pZCBzZXR0aW5nIHRoZSBET00gd3JhcHBlciBmb3IgZmFpbGVkIGFsbG9jYXRpb25zLgor
ICAgICAgICBzZXRET01XcmFwcGVyKGluc3RhbmNlLCBWOENsYXNzSW5kZXg6OlRvSW50KGNwdHJU
eXBlKSwgaW1wbCk7CisgICAgfQorICAgIHJldHVybiBpbnN0YW5jZTsKK30KKwordjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IFY4UHJveHk6OmNoZWNrTmV3TGVnYWwoY29uc3Qgdjg6OkFyZ3VtZW50cyYg
YXJncykKK3sKKyAgICBpZiAoIUFsbG93QWxsb2NhdGlvbjo6bV9jdXJyZW50KQorICAgICAgICBy
ZXR1cm4gdGhyb3dFcnJvcihUWVBFX0VSUk9SLCAiSWxsZWdhbCBjb25zdHJ1Y3RvciIpOworCisg
ICAgcmV0dXJuIGFyZ3MuVGhpcygpOworfQorCit2b2lkIFY4UHJveHk6OnNldERPTVdyYXBwZXIo
djg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmplY3QsIGludCB0eXBlLCB2b2lkKiBjcHRyKQorewor
ICAgIEFTU0VSVChvYmplY3QtPkludGVybmFsRmllbGRDb3VudCgpID49IDIpOworICAgIG9iamVj
dC0+U2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RPTVdyYXBwZXJPYmplY3RJbmRleCwgd3Jh
cENQb2ludGVyKGNwdHIpKTsKKyAgICBvYmplY3QtPlNldEludGVybmFsRmllbGQoVjhDdXN0b206
OmtET01XcmFwcGVyVHlwZUluZGV4LCB2ODo6SW50ZWdlcjo6TmV3KHR5cGUpKTsKK30KKworI2lm
bmRlZiBOREVCVUcKK2Jvb2wgVjhQcm94eTo6bWF5YmVET01XcmFwcGVyKHY4OjpIYW5kbGU8djg6
OlZhbHVlPiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUuSXNFbXB0eSgpIHx8ICF2YWx1ZS0+SXNP
YmplY3QoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0PiBvYmplY3QgPSB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHZhbHVlKTsKKyAgICBp
ZiAoIW9iamVjdC0+SW50ZXJuYWxGaWVsZENvdW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIEFTU0VSVChvYmplY3QtPkludGVybmFsRmllbGRDb3VudCgpID49IFY4Q3VzdG9tOjpr
RGVmYXVsdFdyYXBwZXJJbnRlcm5hbEZpZWxkQ291bnQpOworCisgICAgdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IHR5cGUgPSBvYmplY3QtPkdldEludGVybmFsRmllbGQoVjhDdXN0b206OmtET01XcmFw
cGVyVHlwZUluZGV4KTsKKyAgICBBU1NFUlQodHlwZS0+SXNJbnQzMigpKTsKKyAgICBBU1NFUlQo
VjhDbGFzc0luZGV4OjpJTlZBTElEX0NMQVNTX0lOREVYIDwgdHlwZS0+SW50MzJWYWx1ZSgpICYm
IHR5cGUtPkludDMyVmFsdWUoKSA8IFY4Q2xhc3NJbmRleDo6Q0xBU1NJTkRFWF9FTkQpOworCisg
ICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdyYXBwZXIgPSBvYmplY3QtPkdldEludGVybmFsRmll
bGQoVjhDdXN0b206OmtET01XcmFwcGVyT2JqZWN0SW5kZXgpOworICAgIEFTU0VSVCh3cmFwcGVy
LT5Jc051bWJlcigpIHx8IHdyYXBwZXItPklzRXh0ZXJuYWwoKSk7CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKyNlbmRpZgorCitib29sIFY4UHJveHk6OmlzRE9NRXZlbnRXcmFwcGVyKHY4OjpIYW5k
bGU8djg6OlZhbHVlPiB2YWx1ZSkKK3sKKyAgICAvLyBBbGwga2luZHMgb2YgZXZlbnRzIHVzZSBF
VkVOVCBhcyBkb20gdHlwZSBpbiBKUyB3cmFwcGVycy4KKyAgICAvLyBTZWUgRXZlbnRUb1Y4T2Jq
ZWN0CisgICAgcmV0dXJuIGlzV3JhcHBlck9mVHlwZSh2YWx1ZSwgVjhDbGFzc0luZGV4OjpFVkVO
VCk7Cit9CisKK2Jvb2wgVjhQcm94eTo6aXNXcmFwcGVyT2ZUeXBlKHY4OjpIYW5kbGU8djg6OlZh
bHVlPiB2YWx1ZSwgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIGNsYXNzVHlwZSkKK3sKKyAg
ICBpZiAodmFsdWUuSXNFbXB0eSgpIHx8ICF2YWx1ZS0+SXNPYmplY3QoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmplY3QgPSB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHZhbHVlKTsKKyAgICBpZiAoIW9iamVjdC0+SW50ZXJuYWxG
aWVsZENvdW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFTU0VSVChvYmplY3Qt
PkludGVybmFsRmllbGRDb3VudCgpID49IFY4Q3VzdG9tOjprRGVmYXVsdFdyYXBwZXJJbnRlcm5h
bEZpZWxkQ291bnQpOworCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdyYXBwZXIgPSBvYmpl
Y3QtPkdldEludGVybmFsRmllbGQoVjhDdXN0b206OmtET01XcmFwcGVyT2JqZWN0SW5kZXgpOwor
ICAgIEFTU0VSVCh3cmFwcGVyLT5Jc051bWJlcigpIHx8IHdyYXBwZXItPklzRXh0ZXJuYWwoKSk7
CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdHlwZSA9IG9iamVjdC0+R2V0SW50ZXJuYWxG
aWVsZChWOEN1c3RvbTo6a0RPTVdyYXBwZXJUeXBlSW5kZXgpOworICAgIEFTU0VSVCh0eXBlLT5J
c0ludDMyKCkpOworICAgIEFTU0VSVChWOENsYXNzSW5kZXg6OklOVkFMSURfQ0xBU1NfSU5ERVgg
PCB0eXBlLT5JbnQzMlZhbHVlKCkgJiYgdHlwZS0+SW50MzJWYWx1ZSgpIDwgVjhDbGFzc0luZGV4
OjpDTEFTU0lOREVYX0VORCk7CisKKyAgICByZXR1cm4gVjhDbGFzc0luZGV4OjpGcm9tSW50KHR5
cGUtPkludDMyVmFsdWUoKSkgPT0gY2xhc3NUeXBlOworfQorCisjaWYgRU5BQkxFKFZJREVPKQor
I2RlZmluZSBGT1JfRUFDSF9WSURFT19UQUcobWFjcm8pICAgICAgICAgICAgICAgICAgXAorICAg
IG1hY3JvKGF1ZGlvLCBBVURJTykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1h
Y3JvKHNvdXJjZSwgU09VUkNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3Jv
KHZpZGVvLCBWSURFTykKKyNlbHNlCisjZGVmaW5lIEZPUl9FQUNIX1ZJREVPX1RBRyhtYWNybykK
KyNlbmRpZgorCisjZGVmaW5lIEZPUl9FQUNIX1RBRyhtYWNybykgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgbWFjcm8oYSwgQU5DSE9SKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgbWFjcm8oYXBwbGV0LCBBUFBMRVQpICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgbWFjcm8oYXJlYSwgQVJFQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgbWFjcm8oYmFzZSwgQkFTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
bWFjcm8oYmFzZWZvbnQsIEJBU0VGT05UKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFj
cm8oYmxvY2txdW90ZSwgQkxPQ0tRVU9URSkgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8o
Ym9keSwgQk9EWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYnIs
IEJSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYnV0dG9u
LCBCVVRUT04pICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oY2FwdGlvbiwg
VEFCTEVDQVBUSU9OKSAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oY29sLCBUQUJMRUNP
TCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oY29sZ3JvdXAsIFRBQkxF
Q09MKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oZGVsLCBNT0QpICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oY2FudmFzLCBDQU5WQVMpICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oZGlyLCBESVJFQ1RPUlkpICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oZGl2LCBESVYpICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgbWFjcm8oZGwsIERMSVNUKSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgbWFjcm8oZW1iZWQsIEVNQkVEKSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgICAgbWFjcm8oZmllbGRzZXQsIEZJRUxEU0VUKSAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgbWFjcm8oZm9udCwgRk9OVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgbWFjcm8oZm9ybSwgRk9STSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgbWFjcm8oZnJhbWUsIEZSQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgbWFjcm8oZnJhbWVzZXQsIEZSQU1FU0VUKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
bWFjcm8oaDEsIEhFQURJTkcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFj
cm8oaDIsIEhFQURJTkcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8o
aDMsIEhFQURJTkcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaDQs
IEhFQURJTkcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaDUsIEhF
QURJTkcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaDYsIEhFQURJ
TkcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaGVhZCwgSEVBRCkg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaHIsIEhSKSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaHRtbCwgSFRNTCkgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaW1nLCBJTUFHRSkgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaWZyYW1lLCBJRlJBTUUpICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaW1hZ2UsIElNQUdFKSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaW5wdXQsIElOUFVUKSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgbWFjcm8oaW5zLCBNT0QpICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgICAgbWFjcm8oaXNpbmRleCwgSVNJTkRFWCkgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgbWFjcm8oa2V5Z2VuLCBTRUxFQ1QpICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgbWFjcm8obGFiZWwsIExBQkVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgbWFjcm8obGVnZW5kLCBMRUdFTkQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgbWFjcm8obGksIExJKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
bWFjcm8obGluaywgTElOSykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFj
cm8obGlzdGluZywgUFJFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8o
bWFwLCBNQVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obWFy
cXVlZSwgTUFSUVVFRSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obWVudSwg
TUVOVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obWV0YSwgTUVU
QSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8ob2JqZWN0LCBPQkpF
Q1QpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8ob2wsIE9MSVNUKSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8ob3B0Z3JvdXAsIE9QVEdST1VQ
KSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8ob3B0aW9uLCBPUFRJT04pICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8ocCwgUEFSQUdSQVBIKSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8ocGFyYW0sIFBBUkFNKSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgbWFjcm8ocHJlLCBQUkUpICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgbWFjcm8ocSwgUVVPVEUpICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgICAgbWFjcm8oc2NyaXB0LCBTQ1JJUFQpICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgbWFjcm8oc2VsZWN0LCBTRUxFQ1QpICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgbWFjcm8oc3R5bGUsIFNUWUxFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgbWFjcm8odGFibGUsIFRBQkxFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgbWFjcm8odGhlYWQsIFRBQkxFU0VDVElPTikgICAgICAgICAgICAgICAgICAgICBcCisgICAg
bWFjcm8odGJvZHksIFRBQkxFU0VDVElPTikgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFj
cm8odGZvb3QsIFRBQkxFU0VDVElPTikgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8o
dGQsIFRBQkxFQ0VMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGgs
IFRBQkxFQ0VMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odHIsIFRB
QkxFUk9XKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGV4dGFyZWEs
IFRFWFRBUkVBKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGl0bGUsIFRJVExF
KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odWwsIFVMSVNUKSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oeG1wLCBQUkUpCisKK1Y4Q2xh
c3NJbmRleDo6VjhXcmFwcGVyVHlwZSBWOFByb3h5OjpodG1sRWxlbWVudFR5cGUoSFRNTEVsZW1l
bnQqIGVsZW1lbnQpCit7CisgICAgdHlwZWRlZiBIYXNoTWFwPFN0cmluZywgVjhDbGFzc0luZGV4
OjpWOFdyYXBwZXJUeXBlPiBXcmFwcGVyVHlwZU1hcDsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FM
KFdyYXBwZXJUeXBlTWFwLCB3cmFwcGVyVHlwZU1hcCwgKCkpOworICAgIGlmICh3cmFwcGVyVHlw
ZU1hcC5pc0VtcHR5KCkpIHsKKyNkZWZpbmUgQUREX1RPX0hBU0hfTUFQKHRhZywgbmFtZSkgXAor
ICAgICAgICB3cmFwcGVyVHlwZU1hcC5zZXQoI3RhZywgVjhDbGFzc0luZGV4OjpIVE1MIyNuYW1l
IyNFTEVNRU5UKTsKKyAgICAgICAgRk9SX0VBQ0hfVEFHKEFERF9UT19IQVNIX01BUCkKKyNpZiBF
TkFCTEUoVklERU8pCisgICAgICAgIGlmIChNZWRpYVBsYXllcjo6aXNBdmFpbGFibGUoKSkgewor
ICAgICAgICAgICAgRk9SX0VBQ0hfVklERU9fVEFHKEFERF9UT19IQVNIX01BUCkKKyAgICAgICAg
fQorI2VuZGlmCisjdW5kZWYgQUREX1RPX0hBU0hfTUFQCisgICAgfQorCisgICAgVjhDbGFzc0lu
ZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSB3cmFwcGVyVHlwZU1hcC5nZXQoZWxlbWVudC0+bG9j
YWxOYW1lKCkuaW1wbCgpKTsKKyAgICBpZiAoIXR5cGUpCisgICAgICAgIHJldHVybiBWOENsYXNz
SW5kZXg6OkhUTUxFTEVNRU5UOworICAgIHJldHVybiB0eXBlOworfQorI3VuZGVmIEZPUl9FQUNI
X1RBRworCisjaWYgRU5BQkxFKFNWRykKKworI2lmIEVOQUJMRShTVkdfQU5JTUFUSU9OKQorI2Rl
ZmluZSBGT1JfRUFDSF9BTklNQVRJT05fVEFHKG1hY3JvKSBcCisgICAgbWFjcm8oYW5pbWF0ZUNv
bG9yLCBBTklNQVRFQ09MT1IpIFwKKyAgICBtYWNybyhhbmltYXRlLCBBTklNQVRFKSBcCisgICAg
bWFjcm8oYW5pbWF0ZVRyYW5zZm9ybSwgQU5JTUFURVRSQU5TRk9STSkgXAorICAgIG1hY3JvKHNl
dCwgU0VUKQorI2Vsc2UKKyNkZWZpbmUgRk9SX0VBQ0hfQU5JTUFUSU9OX1RBRyhtYWNybykKKyNl
bmRpZgorCisjaWYgRU5BQkxFKFNWR19GSUxURVJTKQorI2RlZmluZSBGT1JfRUFDSF9GSUxURVJT
X1RBRyhtYWNybykgXAorICAgIG1hY3JvKGZlQmxlbmQsIEZFQkxFTkQpIFwKKyAgICBtYWNybyhm
ZUNvbG9yTWF0cml4LCBGRUNPTE9STUFUUklYKSBcCisgICAgbWFjcm8oZmVDb21wb25lbnRUcmFu
c2ZlciwgRkVDT01QT05FTlRUUkFOU0ZFUikgXAorICAgIG1hY3JvKGZlQ29tcG9zaXRlLCBGRUNP
TVBPU0lURSkgXAorICAgIG1hY3JvKGZlRGlmZnVzZUxpZ2h0aW5nLCBGRURJRkZVU0VMSUdIVElO
RykgXAorICAgIG1hY3JvKGZlRGlzcGxhY2VtZW50TWFwLCBGRURJU1BMQUNFTUVOVE1BUCkgXAor
ICAgIG1hY3JvKGZlRGlzdGFudExpZ2h0LCBGRURJU1RBTlRMSUdIVCkgXAorICAgIG1hY3JvKGZl
Rmxvb2QsIEZFRkxPT0QpIFwKKyAgICBtYWNybyhmZUZ1bmNBLCBGRUZVTkNBKSBcCisgICAgbWFj
cm8oZmVGdW5jQiwgRkVGVU5DQikgXAorICAgIG1hY3JvKGZlRnVuY0csIEZFRlVOQ0cpIFwKKyAg
ICBtYWNybyhmZUZ1bmNSLCBGRUZVTkNSKSBcCisgICAgbWFjcm8oZmVHYXVzc2lhbkJsdXIsIEZF
R0FVU1NJQU5CTFVSKSBcCisgICAgbWFjcm8oZmVJbWFnZSwgRkVJTUFHRSkgXAorICAgIG1hY3Jv
KGZlTWVyZ2UsIEZFTUVSR0UpIFwKKyAgICBtYWNybyhmZU1lcmdlTm9kZSwgRkVNRVJHRU5PREUp
IFwKKyAgICBtYWNybyhmZU9mZnNldCwgRkVPRkZTRVQpIFwKKyAgICBtYWNybyhmZVBvaW50TGln
aHQsIEZFUE9JTlRMSUdIVCkgXAorICAgIG1hY3JvKGZlU3BlY3VsYXJMaWdodGluZywgRkVTUEVD
VUxBUkxJR0hUSU5HKSBcCisgICAgbWFjcm8oZmVTcG90TGlnaHQsIEZFU1BPVExJR0hUKSBcCisg
ICAgbWFjcm8oZmVUaWxlLCBGRVRJTEUpIFwKKyAgICBtYWNybyhmZVR1cmJ1bGVuY2UsIEZFVFVS
QlVMRU5DRSkgXAorICAgIG1hY3JvKGZpbHRlciwgRklMVEVSKQorI2Vsc2UKKyNkZWZpbmUgRk9S
X0VBQ0hfRklMVEVSU19UQUcobWFjcm8pCisjZW5kaWYKKworI2lmIEVOQUJMRShTVkdfRk9OVFMp
CisjZGVmaW5lIEZPUl9FQUNIX0ZPTlRTX1RBRyhtYWNybykgXAorICAgIG1hY3JvKGRlZmluaXRp
b24tc3JjLCBERUZJTklUSU9OU1JDKSBcCisgICAgbWFjcm8oZm9udC1mYWNlLCBGT05URkFDRSkg
XAorICAgIG1hY3JvKGZvbnQtZmFjZS1mb3JtYXQsIEZPTlRGQUNFRk9STUFUKSBcCisgICAgbWFj
cm8oZm9udC1mYWNlLW5hbWUsIEZPTlRGQUNFTkFNRSkgXAorICAgIG1hY3JvKGZvbnQtZmFjZS1z
cmMsIEZPTlRGQUNFU1JDKSBcCisgICAgbWFjcm8oZm9udC1mYWNlLXVyaSwgRk9OVEZBQ0VVUkkp
CisjZWxzZQorI2RlZmluZSBGT1JfRUFDSF9GT05UU19UQUcobWFyY28pCisjZW5kaWYKKworI2lm
IEVOQUJMRShTVkdfRk9SRUlHTl9PQkpFQ1QpCisjZGVmaW5lIEZPUl9FQUNIX0ZPUkVJR05fT0JK
RUNUX1RBRyhtYWNybykgXAorICAgIG1hY3JvKGZvcmVpZ25PYmplY3QsIEZPUkVJR05PQkpFQ1Qp
CisjZWxzZQorI2RlZmluZSBGT1JfRUFDSF9GT1JFSUdOX09CSkVDVF9UQUcobWFjcm8pCisjZW5k
aWYKKworI2lmIEVOQUJMRShTVkdfVVNFKQorI2RlZmluZSBGT1JfRUFDSF9VU0VfVEFHKG1hY3Jv
KSBcCisgICAgbWFjcm8odXNlLCBVU0UpCisjZWxzZQorI2RlZmluZSBGT1JfRUFDSF9VU0VfVEFH
KG1hY3JvKQorI2VuZGlmCisKKyNkZWZpbmUgRk9SX0VBQ0hfVEFHKG1hY3JvKSBcCisgICAgRk9S
X0VBQ0hfQU5JTUFUSU9OX1RBRyhtYWNybykgXAorICAgIEZPUl9FQUNIX0ZJTFRFUlNfVEFHKG1h
Y3JvKSBcCisgICAgRk9SX0VBQ0hfRk9OVFNfVEFHKG1hY3JvKSBcCisgICAgRk9SX0VBQ0hfRk9S
RUlHTl9PQkpFQ1RfVEFHKG1hY3JvKSBcCisgICAgRk9SX0VBQ0hfVVNFX1RBRyhtYWNybykgXAor
ICAgIG1hY3JvKGEsIEEpIFwKKyAgICBtYWNybyhhbHRHbHlwaCwgQUxUR0xZUEgpIFwKKyAgICBt
YWNybyhjaXJjbGUsIENJUkNMRSkgXAorICAgIG1hY3JvKGNsaXBQYXRoLCBDTElQUEFUSCkgXAor
ICAgIG1hY3JvKGN1cnNvciwgQ1VSU09SKSBcCisgICAgbWFjcm8oZGVmcywgREVGUykgXAorICAg
IG1hY3JvKGRlc2MsIERFU0MpIFwKKyAgICBtYWNybyhlbGxpcHNlLCBFTExJUFNFKSBcCisgICAg
bWFjcm8oZywgRykgXAorICAgIG1hY3JvKGdseXBoLCBHTFlQSCkgXAorICAgIG1hY3JvKGltYWdl
LCBJTUFHRSkgXAorICAgIG1hY3JvKGxpbmVhckdyYWRpZW50LCBMSU5FQVJHUkFESUVOVCkgXAor
ICAgIG1hY3JvKGxpbmUsIExJTkUpIFwKKyAgICBtYWNybyhtYXJrZXIsIE1BUktFUikgXAorICAg
IG1hY3JvKG1hc2ssIE1BU0spIFwKKyAgICBtYWNybyhtZXRhZGF0YSwgTUVUQURBVEEpIFwKKyAg
ICBtYWNybyhwYXRoLCBQQVRIKSBcCisgICAgbWFjcm8ocGF0dGVybiwgUEFUVEVSTikgXAorICAg
IG1hY3JvKHBvbHlsaW5lLCBQT0xZTElORSkgXAorICAgIG1hY3JvKHBvbHlnb24sIFBPTFlHT04p
IFwKKyAgICBtYWNybyhyYWRpYWxHcmFkaWVudCwgUkFESUFMR1JBRElFTlQpIFwKKyAgICBtYWNy
byhyZWN0LCBSRUNUKSBcCisgICAgbWFjcm8oc2NyaXB0LCBTQ1JJUFQpIFwKKyAgICBtYWNybyhz
dG9wLCBTVE9QKSBcCisgICAgbWFjcm8oc3R5bGUsIFNUWUxFKSBcCisgICAgbWFjcm8oc3ZnLCBT
VkcpIFwKKyAgICBtYWNybyhzd2l0Y2gsIFNXSVRDSCkgXAorICAgIG1hY3JvKHN5bWJvbCwgU1lN
Qk9MKSBcCisgICAgbWFjcm8odGV4dCwgVEVYVCkgXAorICAgIG1hY3JvKHRleHRQYXRoLCBURVhU
UEFUSCkgXAorICAgIG1hY3JvKHRpdGxlLCBUSVRMRSkgXAorICAgIG1hY3JvKHRyZWYsIFRSRUYp
IFwKKyAgICBtYWNybyh0c3BhbiwgVFNQQU4pIFwKKyAgICBtYWNybyh2aWV3LCBWSUVXKSBcCisg
ICAgLy8gZW5kIG9mIG1hY3JvCisKK1Y4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBWOFByb3h5
OjpzdmdFbGVtZW50VHlwZShTVkdFbGVtZW50KiBlbGVtZW50KQoreworICAgIHR5cGVkZWYgSGFz
aE1hcDxTdHJpbmcsIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZT4gV3JhcHBlclR5cGVNYXA7
CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChXcmFwcGVyVHlwZU1hcCwgd3JhcHBlclR5cGVNYXAs
ICgpKTsKKyAgICBpZiAod3JhcHBlclR5cGVNYXAuaXNFbXB0eSgpKSB7CisjZGVmaW5lIEFERF9U
T19IQVNIX01BUCh0YWcsIG5hbWUpIFwKKyAgICAgICAgd3JhcHBlclR5cGVNYXAuc2V0KCN0YWcs
IFY4Q2xhc3NJbmRleDo6U1ZHIyNuYW1lIyNFTEVNRU5UKTsKKyAgICAgICAgRk9SX0VBQ0hfVEFH
KEFERF9UT19IQVNIX01BUCkKKyN1bmRlZiBBRERfVE9fSEFTSF9NQVAKKyAgICB9CisKKyAgICBW
OENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IHdyYXBwZXJUeXBlTWFwLmdldChlbGVt
ZW50LT5sb2NhbE5hbWUoKS5pbXBsKCkpOworICAgIGlmICghdHlwZSkKKyAgICAgICAgcmV0dXJu
IFY4Q2xhc3NJbmRleDo6U1ZHRUxFTUVOVDsKKyAgICByZXR1cm4gdHlwZTsKK30KKyN1bmRlZiBG
T1JfRUFDSF9UQUcKKworI2VuZGlmIC8vIEVOQUJMRShTVkcpCisKK3Y4OjpIYW5kbGU8djg6OlZh
bHVlPiBWOFByb3h5Ojpjb252ZXJ0RXZlbnRUb1Y4T2JqZWN0KEV2ZW50KiBldmVudCkKK3sKKyAg
ICBpZiAoIWV2ZW50KQorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gd3JhcHBlciA9IGdldERPTU9iamVjdE1hcCgpLmdldChldmVudCk7Cisg
ICAgaWYgKCF3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisKKyAg
ICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IFY4Q2xhc3NJbmRleDo6RVZFTlQ7
CisKKyAgICBpZiAoZXZlbnQtPmlzVUlFdmVudCgpKSB7CisgICAgICAgIGlmIChldmVudC0+aXNL
ZXlib2FyZEV2ZW50KCkpCisgICAgICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpLRVlCT0FS
REVWRU5UOworICAgICAgICBlbHNlIGlmIChldmVudC0+aXNUZXh0RXZlbnQoKSkKKyAgICAgICAg
ICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlRFWFRFVkVOVDsKKyAgICAgICAgZWxzZSBpZiAoZXZl
bnQtPmlzTW91c2VFdmVudCgpKQorICAgICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6TU9V
U0VFVkVOVDsKKyAgICAgICAgZWxzZSBpZiAoZXZlbnQtPmlzV2hlZWxFdmVudCgpKQorICAgICAg
ICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6V0hFRUxFVkVOVDsKKyNpZiBFTkFCTEUoU1ZHKQor
ICAgICAgICBlbHNlIGlmIChldmVudC0+aXNTVkdab29tRXZlbnQoKSkKKyAgICAgICAgICAgIHR5
cGUgPSBWOENsYXNzSW5kZXg6OlNWR1pPT01FVkVOVDsKKyNlbmRpZgorICAgICAgICBlbHNlCisg
ICAgICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpVSUVWRU5UOworICAgIH0gZWxzZSBpZiAo
ZXZlbnQtPmlzTXV0YXRpb25FdmVudCgpKQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpN
VVRBVElPTkVWRU5UOworICAgIGVsc2UgaWYgKGV2ZW50LT5pc092ZXJmbG93RXZlbnQoKSkKKyAg
ICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6T1ZFUkZMT1dFVkVOVDsKKyAgICBlbHNlIGlmIChl
dmVudC0+aXNNZXNzYWdlRXZlbnQoKSkKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6TUVT
U0FHRUVWRU5UOworICAgIGVsc2UgaWYgKGV2ZW50LT5pc1Byb2dyZXNzRXZlbnQoKSkgeworICAg
ICAgICBpZiAoZXZlbnQtPmlzWE1MSHR0cFJlcXVlc3RQcm9ncmVzc0V2ZW50KCkpCisgICAgICAg
ICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFBST0dSRVNTRVZFTlQ7Cisg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlBST0dSRVNTRVZF
TlQ7CisgICAgfSBlbHNlIGlmIChldmVudC0+aXNXZWJLaXRBbmltYXRpb25FdmVudCgpKQorICAg
ICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpXRUJLSVRBTklNQVRJT05FVkVOVDsKKyAgICBlbHNl
IGlmIChldmVudC0+aXNXZWJLaXRUcmFuc2l0aW9uRXZlbnQoKSkKKyAgICAgICAgdHlwZSA9IFY4
Q2xhc3NJbmRleDo6V0VCS0lUVFJBTlNJVElPTkVWRU5UOworCisKKyAgICB2ODo6SGFuZGxlPHY4
OjpPYmplY3Q+IHJlc3VsdCA9IGluc3RhbnRpYXRlVjhPYmplY3QodHlwZSwgVjhDbGFzc0luZGV4
OjpFVkVOVCwgZXZlbnQpOworICAgIGlmIChyZXN1bHQuSXNFbXB0eSgpKSB7CisgICAgICAgIC8v
IEluc3RhbnRpYXRpb24gZmFpbGVkLiBBdm9pZCB1cGRhdGluZyB0aGUgRE9NIG9iamVjdCBtYXAg
YW5kCisgICAgICAgIC8vIHJldHVybiBudWxsIHdoaWNoIGlzIGFscmVhZHkgaGFuZGxlZCBieSBj
YWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgLy8gaW4gY2FzZSB0aGUgZXZlbnQgaXMg
TlVMTC4KKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisgICAgfQorCisgICAgZXZlbnQtPnJl
ZigpOyAgLy8gZmFzdCByZWYKKyAgICBzZXRKU1dyYXBwZXJGb3JET01PYmplY3QoZXZlbnQsIHY4
OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcocmVzdWx0KSk7CisKKyAgICByZXR1cm4gcmVz
dWx0OworfQorCisvLyBDYWxsZXIgY2hlY2tzIG5vZGUgaXMgbm90IG51bGwuCit2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KE5vZGUqIG5vZGUpCit7
CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIC8vIEZp
bmQgdGhlIGNvbnRleHQgdG8gd2hpY2ggdGhlIG5vZGUgYmVsb25ncyBhbmQgY3JlYXRlIHRoZSB3
cmFwcGVyCisgICAgLy8gaW4gdGhhdCBjb250ZXh0LiAgSWYgdGhlIG5vZGUgaXMgbm90IGluIGEg
ZG9jdW1lbnQsIHRoZSBjdXJyZW50CisgICAgLy8gY29udGV4dCBpcyB1c2VkLgorICAgIC8vCisg
ICAgLy8gR2V0dGluZyB0aGUgY29udGV4dCBtaWdodCBpbml0aWFsaXplIHRoZSBjb250ZXh0IHdo
aWNoIGNhbiBpbnN0YW50aWF0ZQorICAgIC8vIGEgZG9jdW1lbnQgd3JhcHBlci4gIFRoZXJlZm9y
ZSwgd2UgZ2V0IHRoZSBjb250ZXh0IGJlZm9yZSBjaGVja2luZyBpZgorICAgIC8vIHRoZSBub2Rl
IGFscmVhZHkgaGFzIGEgd3JhcHBlci4KKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHY4Q29u
dGV4dDsKKyAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBub2RlLT5kb2N1bWVudCgpOworICAgIGlm
IChkb2N1bWVudCkKKyAgICAgICAgdjhDb250ZXh0ID0gVjhQcm94eTo6Y29udGV4dChkb2N1bWVu
dC0+ZnJhbWUoKSk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRE
T01Ob2RlTWFwKCkuZ2V0KG5vZGUpOworICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybiB3cmFwcGVyOworCisgICAgYm9vbCBpc0RvY3VtZW50ID0gZmFsc2U7ICAvLyBk
b2N1bWVudCB0eXBlIG5vZGUgaGFzIHNwZWNpYWwgaGFuZGxpbmcKKyAgICBWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUgdHlwZTsKKworICAgIHN3aXRjaCAobm9kZS0+bm9kZVR5cGUoKSkgewor
ICAgIGNhc2UgTm9kZTo6RUxFTUVOVF9OT0RFOgorICAgICAgICBpZiAobm9kZS0+aXNIVE1MRWxl
bWVudCgpKQorICAgICAgICAgICAgdHlwZSA9IGh0bWxFbGVtZW50VHlwZShzdGF0aWNfY2FzdDxI
VE1MRWxlbWVudCo+KG5vZGUpKTsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBlbHNlIGlmIChu
b2RlLT5pc1NWR0VsZW1lbnQoKSkKKyAgICAgICAgICAgIHR5cGUgPSBzdmdFbGVtZW50VHlwZShz
dGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4obm9kZSkpOworI2VuZGlmCisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkVMRU1FTlQ7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgTm9kZTo6QVRUUklCVVRFX05PREU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5k
ZXg6OkFUVFI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6VEVYVF9OT0RFOgorICAg
ICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpURVhUOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IE5vZGU6OkNEQVRBX1NFQ1RJT05fTk9ERToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6
Q0RBVEFTRUNUSU9OOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5vZGU6OkVOVElUWV9OT0RF
OgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpFTlRJVFk7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgorICAgICAgICB0eXBl
ID0gVjhDbGFzc0luZGV4OjpQUk9DRVNTSU5HSU5TVFJVQ1RJT047CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgTm9kZTo6Q09NTUVOVF9OT0RFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4
OjpDT01NRU5UOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX05PREU6
IHsKKyAgICAgICAgaXNEb2N1bWVudCA9IHRydWU7CisgICAgICAgIERvY3VtZW50KiBkb2N1bWVu
dCA9IHN0YXRpY19jYXN0PERvY3VtZW50Kj4obm9kZSk7CisgICAgICAgIGlmIChkb2N1bWVudC0+
aXNIVE1MRG9jdW1lbnQoKSkKKyAgICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkhUTUxE
T0NVTUVOVDsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBlbHNlIGlmIChkb2N1bWVudC0+aXNT
VkdEb2N1bWVudCgpKQorICAgICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6U1ZHRE9DVU1F
TlQ7CisjZW5kaWYKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRl
eDo6RE9DVU1FTlQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE5vZGU6OkRPQ1VN
RU5UX1RZUEVfTk9ERToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6RE9DVU1FTlRUWVBF
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5vZGU6Ok5PVEFUSU9OX05PREU6CisgICAgICAg
IHR5cGUgPSBWOENsYXNzSW5kZXg6Ok5PVEFUSU9OOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IE5vZGU6OkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5k
ZXg6OkRPQ1VNRU5URlJBR01FTlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6RU5U
SVRZX1JFRkVSRU5DRV9OT0RFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpFTlRJVFlS
RUZFUkVOQ0U7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHR5cGUgPSBW
OENsYXNzSW5kZXg6Ok5PREU7CisgICAgfQorCisgICAgLy8gRW50ZXIgdGhlIG5vZGUncyBjb250
ZXh0IGFuZCBjcmVhdGUgdGhlIHdyYXBwZXIgaW4gdGhhdCBjb250ZXh0LgorICAgIGlmICghdjhD
b250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgdjhDb250ZXh0LT5FbnRlcigpOworCisgICAgdjg6
OkxvY2FsPHY4OjpPYmplY3Q+IHJlc3VsdCA9IGluc3RhbnRpYXRlVjhPYmplY3QodHlwZSwgVjhD
bGFzc0luZGV4OjpOT0RFLCBub2RlKTsKKworICAgIC8vIEV4aXQgdGhlIG5vZGUncyBjb250ZXh0
IGlmIGl0IHdhcyBlbnRlcmVkLgorICAgIGlmICghdjhDb250ZXh0LklzRW1wdHkoKSkKKyAgICAg
ICAgdjhDb250ZXh0LT5FeGl0KCk7CisKKyAgICBpZiAocmVzdWx0LklzRW1wdHkoKSkgeworICAg
ICAgICAvLyBJZiBpbnN0YW50aWF0aW9uIGZhaWxlZCBpdCdzIGltcG9ydGFudCBub3QgdG8gYWRk
IHRoZSByZXN1bHQKKyAgICAgICAgLy8gdG8gdGhlIERPTSBub2RlIG1hcC4gSW5zdGVhZCB3ZSBy
ZXR1cm4gYW4gZW1wdHkgaGFuZGxlLCB3aGljaAorICAgICAgICAvLyBzaG91bGQgYWxyZWFkeSBi
ZSBoYW5kbGVkIGJ5IGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbiBpbiBjYXNlCisgICAgICAgIC8v
IHRoZSBub2RlIGlzIE5VTEwuCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAg
bm9kZS0+cmVmKCk7CisgICAgc2V0SlNXcmFwcGVyRm9yRE9NTm9kZShub2RlLCB2ODo6UGVyc2lz
dGVudDx2ODo6T2JqZWN0Pjo6TmV3KHJlc3VsdCkpOworCisgICAgaWYgKGlzRG9jdW1lbnQpIHsK
KyAgICAgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gc3RhdGljX2Nhc3Q8RG9jdW1lbnQqPihub2Rl
KTsKKyAgICAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShkb2N1bWVudC0+
ZnJhbWUoKSk7CisgICAgICAgIGlmIChwcm94eSkKKyAgICAgICAgICAgIHByb3h5LT51cGRhdGVE
b2N1bWVudFdyYXBwZXIocmVzdWx0KTsKKworICAgICAgICBpZiAodHlwZSA9PSBWOENsYXNzSW5k
ZXg6OkhUTUxET0NVTUVOVCkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG1hcmtlciBvYmplY3Qg
YW5kIGluc2VydCBpdCBpbiB0d28gaW50ZXJuYWwgZmllbGRzLgorICAgICAgICAgICAgLy8gVGhp
cyBpcyB1c2VkIHRvIGltcGxlbWVudCB0ZW1wb3Jhcnkgc2hhZG93aW5nIG9mCisgICAgICAgICAg
ICAvLyBkb2N1bWVudC5hbGwuCisgICAgICAgICAgICBBU1NFUlQocmVzdWx0LT5JbnRlcm5hbEZp
ZWxkQ291bnQoKSA9PSBWOEN1c3RvbTo6a0hUTUxEb2N1bWVudEludGVybmFsRmllbGRDb3VudCk7
CisgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gbWFya2VyID0gdjg6Ok9iamVjdDo6
TmV3KCk7CisgICAgICAgICAgICByZXN1bHQtPlNldEludGVybmFsRmllbGQoVjhDdXN0b206OmtI
VE1MRG9jdW1lbnRNYXJrZXJJbmRleCwgbWFya2VyKTsKKyAgICAgICAgICAgIHJlc3VsdC0+U2V0
SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0hUTUxEb2N1bWVudFNoYWRvd0luZGV4LCBtYXJrZXIp
OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gQSBKUyBv
YmplY3Qgb2YgdHlwZSBFdmVudFRhcmdldCBjYW4gb25seSBiZSB0aGUgZm9sbG93aW5nIHBvc3Np
YmxlIHR5cGVzOgorLy8gMSkgRXZlbnRUYXJnZXROb2RlOyAyKSBET01XaW5kb3cgMykgWE1MSHR0
cFJlcXVlc3Q7IDQpIE1lc3NhZ2VQb3J0OworLy8gNSkgWE1MSHR0cFJlcXVlc3RVcGxvYWQKKy8v
IGNoZWNrIEV2ZW50VGFyZ2V0LmggZm9yIG5ldyB0eXBlIGNvbnZlcnNpb24gbWV0aG9kcwordjg6
OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6OmNvbnZlcnRFdmVudFRhcmdldFRvVjhPYmplY3Qo
RXZlbnRUYXJnZXQqIHRhcmdldCkKK3sKKyAgICBpZiAoIXRhcmdldCkKKyAgICAgICAgcmV0dXJu
IHY4OjpOdWxsKCk7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgIFNWR0VsZW1lbnRJbnN0YW5jZSog
aW5zdGFuY2UgPSB0YXJnZXQtPnRvU1ZHRWxlbWVudEluc3RhbmNlKCk7CisgICAgaWYgKGluc3Rh
bmNlKQorICAgICAgICByZXR1cm4gY29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpTVkdF
TEVNRU5USU5TVEFOQ0UsIGluc3RhbmNlKTsKKyNlbmRpZgorCisjaWYgRU5BQkxFKFdPUktFUlMp
CisgICAgV29ya2VyKiB3b3JrZXIgPSB0YXJnZXQtPnRvV29ya2VyKCk7CisgICAgaWYgKHdvcmtl
cikKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6V09SS0VS
LCB3b3JrZXIpOworI2VuZGlmIC8vIFdPUktFUlMKKworICAgIE5vZGUqIG5vZGUgPSB0YXJnZXQt
PnRvTm9kZSgpOworICAgIGlmIChub2RlKQorICAgICAgICByZXR1cm4gY29udmVydE5vZGVUb1Y4
T2JqZWN0KG5vZGUpOworCisgICAgaWYgKERPTVdpbmRvdyogZG9tV2luZG93ID0gdGFyZ2V0LT50
b0RPTVdpbmRvdygpKQorICAgICAgICByZXR1cm4gY29udmVydFRvVjhPYmplY3QoVjhDbGFzc0lu
ZGV4OjpET01XSU5ET1csIGRvbVdpbmRvdyk7CisKKyAgICAvLyBYTUxIdHRwUmVxdWVzdCBpcyBj
cmVhdGVkIHdpdGhpbiBpdHMgSlMgY291bnRlcnBhcnQuCisgICAgWE1MSHR0cFJlcXVlc3QqIHht
bEh0dHBSZXF1ZXN0ID0gdGFyZ2V0LT50b1hNTEh0dHBSZXF1ZXN0KCk7CisgICAgaWYgKHhtbEh0
dHBSZXF1ZXN0KSB7CisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlciA9IGdl
dEFjdGl2ZURPTU9iamVjdE1hcCgpLmdldCh4bWxIdHRwUmVxdWVzdCk7CisgICAgICAgIEFTU0VS
VCghd3JhcHBlci5Jc0VtcHR5KCkpOworICAgICAgICByZXR1cm4gd3JhcHBlcjsKKyAgICB9CisK
KyAgICAvLyBNZXNzYWdlUG9ydCBpcyBjcmVhdGVkIHdpdGhpbiBpdHMgSlMgY291bnRlcnBhcnQK
KyAgICBNZXNzYWdlUG9ydCogcG9ydCA9IHRhcmdldC0+dG9NZXNzYWdlUG9ydCgpOworICAgIGlm
IChwb3J0KSB7CisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlciA9IGdldEFj
dGl2ZURPTU9iamVjdE1hcCgpLmdldChwb3J0KTsKKyAgICAgICAgQVNTRVJUKCF3cmFwcGVyLklz
RW1wdHkoKSk7CisgICAgICAgIHJldHVybiB3cmFwcGVyOworICAgIH0KKworICAgIFhNTEh0dHBS
ZXF1ZXN0VXBsb2FkKiB1cGxvYWQgPSB0YXJnZXQtPnRvWE1MSHR0cFJlcXVlc3RVcGxvYWQoKTsK
KyAgICBpZiAodXBsb2FkKSB7CisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBl
ciA9IGdldERPTU9iamVjdE1hcCgpLmdldCh1cGxvYWQpOworICAgICAgICBBU1NFUlQoIXdyYXBw
ZXIuSXNFbXB0eSgpKTsKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisgICAgfQorCisgICAgQVNT
RVJUKDApOworICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworfQorCit2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y29udmVydEV2ZW50TGlzdGVuZXJUb1Y4T2JqZWN0
KEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKQoreworICAgIGlmICghbGlzdGVuZXIpCisgICAgICAg
IHJldHVybiB2ODo6TnVsbCgpOworCisgICAgLy8gRklYTUU6IGNhbiBhIHVzZXIgdGFrZSBhIGxh
enkgZXZlbnQgbGlzdGVuZXIgYW5kIHNldCB0byBvdGhlciBwbGFjZXM/CisgICAgVjhBYnN0cmFj
dEV2ZW50TGlzdGVuZXIqIHY4bGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOEFic3RyYWN0RXZlbnRM
aXN0ZW5lcio+KGxpc3RlbmVyKTsKKyAgICByZXR1cm4gdjhsaXN0ZW5lci0+Z2V0TGlzdGVuZXJP
YmplY3QoKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6OmNvbnZlcnRET01J
bXBsZW1lbnRhdGlvblRvVjhPYmplY3QoRE9NSW1wbGVtZW50YXRpb24qIGltcGwpCit7CisgICAg
djg6OkhhbmRsZTx2ODo6T2JqZWN0PiByZXN1bHQgPSBpbnN0YW50aWF0ZVY4T2JqZWN0KFY4Q2xh
c3NJbmRleDo6RE9NSU1QTEVNRU5UQVRJT04sIFY4Q2xhc3NJbmRleDo6RE9NSU1QTEVNRU5UQVRJ
T04sIGltcGwpOworICAgIGlmIChyZXN1bHQuSXNFbXB0eSgpKSB7CisgICAgICAgIC8vIElmIHRo
ZSBpbnN0YW50aWF0aW9uIGZhaWxlZCwgd2UgaWdub3JlIGl0IGFuZCByZXR1cm4gbnVsbCBpbnN0
ZWFkCisgICAgICAgIC8vIG9mIHJldHVybmluZyBhbiBlbXB0eSBoYW5kbGUuCisgICAgICAgIHJl
dHVybiB2ODo6TnVsbCgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y29udmVydFN0eWxlU2hlZXRUb1Y4T2JqZWN0KFN0eWxl
U2hlZXQqIHNoZWV0KQoreworICAgIGlmICghc2hlZXQpCisgICAgICAgIHJldHVybiB2ODo6TnVs
bCgpOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZ2V0RE9NT2JqZWN0
TWFwKCkuZ2V0KHNoZWV0KTsKKyAgICBpZiAoIXdyYXBwZXIuSXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gd3JhcHBlcjsKKworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0g
VjhDbGFzc0luZGV4OjpTVFlMRVNIRUVUOworICAgIGlmIChzaGVldC0+aXNDU1NTdHlsZVNoZWV0
KCkpCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU1NUWUxFU0hFRVQ7CisKKyAgICB2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJlc3VsdCA9IGluc3RhbnRpYXRlVjhPYmplY3QodHlwZSwg
VjhDbGFzc0luZGV4OjpTVFlMRVNIRUVULCBzaGVldCk7CisgICAgaWYgKCFyZXN1bHQuSXNFbXB0
eSgpKSB7CisgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBET00gb2JqZWN0IG1hcCBpZiB0aGUg
cmVzdWx0IGlzIG5vbi1lbXB0eS4KKyAgICAgICAgc2hlZXQtPnJlZigpOworICAgICAgICBzZXRK
U1dyYXBwZXJGb3JET01PYmplY3Qoc2hlZXQsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpO
ZXcocmVzdWx0KSk7CisgICAgfQorCisgICAgLy8gQWRkIGEgaGlkZGVuIHJlZmVyZW5jZSBmcm9t
IHN0eWxlc2hlZXQgb2JqZWN0IHRvIGl0cyBvd25lciBub2RlLgorICAgIE5vZGUqIG93bmVyTm9k
ZSA9IHNoZWV0LT5vd25lck5vZGUoKTsKKyAgICBpZiAob3duZXJOb2RlKSB7CisgICAgICAgIHY4
OjpIYW5kbGU8djg6Ok9iamVjdD4gb3duZXIgPSB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0
KGNvbnZlcnROb2RlVG9WOE9iamVjdChvd25lck5vZGUpKTsKKyAgICAgICAgcmVzdWx0LT5TZXRJ
bnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprU3R5bGVTaGVldE93bmVyTm9kZUluZGV4LCBvd25lcik7
CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+
IFY4UHJveHk6OmNvbnZlcnRDU1NWYWx1ZVRvVjhPYmplY3QoQ1NTVmFsdWUqIHZhbHVlKQorewor
ICAgIGlmICghdmFsdWUpCisgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisgICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZ2V0RE9NT2JqZWN0TWFwKCkuZ2V0KHZhbHVlKTsK
KyAgICBpZiAoIXdyYXBwZXIuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gd3JhcHBlcjsKKwor
ICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlOworCisgICAgaWYgKHZhbHVlLT5p
c1dlYktpdENTU1RyYW5zZm9ybVZhbHVlKCkpCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6
OldFQktJVENTU1RSQU5TRk9STVZBTFVFOworICAgIGVsc2UgaWYgKHZhbHVlLT5pc1ZhbHVlTGlz
dCgpKQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDU1NWQUxVRUxJU1Q7CisgICAgZWxz
ZSBpZiAodmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJ
bmRleDo6Q1NTUFJJTUlUSVZFVkFMVUU7CisjaWYgRU5BQkxFKFNWRykKKyAgICBlbHNlIGlmICh2
YWx1ZS0+aXNTVkdQYWludCgpKQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpTVkdQQUlO
VDsKKyAgICBlbHNlIGlmICh2YWx1ZS0+aXNTVkdDb2xvcigpKQorICAgICAgICB0eXBlID0gVjhD
bGFzc0luZGV4OjpTVkdDT0xPUjsKKyNlbmRpZgorICAgIGVsc2UKKyAgICAgICAgdHlwZSA9IFY4
Q2xhc3NJbmRleDo6Q1NTVkFMVUU7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJlc3Vs
dCA9IGluc3RhbnRpYXRlVjhPYmplY3QodHlwZSwgVjhDbGFzc0luZGV4OjpDU1NWQUxVRSwgdmFs
dWUpOworICAgIGlmICghcmVzdWx0LklzRW1wdHkoKSkgeworICAgICAgICAvLyBPbmx5IHVwZGF0
ZSB0aGUgRE9NIG9iamVjdCBtYXAgaWYgdGhlIHJlc3VsdCBpcyBub24tZW1wdHkuCisgICAgICAg
IHZhbHVlLT5yZWYoKTsKKyAgICAgICAgc2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KHZhbHVlLCB2
ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHJlc3VsdCkpOworICAgIH0KKworICAgIHJl
dHVybiByZXN1bHQ7Cit9CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpjb252ZXJ0
Q1NTUnVsZVRvVjhPYmplY3QoQ1NTUnVsZSogcnVsZSkKK3sKKyAgICBpZiAoIXJ1bGUpIAorICAg
ICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3Jh
cHBlciA9IGdldERPTU9iamVjdE1hcCgpLmdldChydWxlKTsKKyAgICBpZiAoIXdyYXBwZXIuSXNF
bXB0eSgpKQorICAgICAgICByZXR1cm4gd3JhcHBlcjsKKworICAgIFY4Q2xhc3NJbmRleDo6VjhX
cmFwcGVyVHlwZSB0eXBlOworCisgICAgc3dpdGNoIChydWxlLT50eXBlKCkpIHsKKyAgICBjYXNl
IENTU1J1bGU6OlNUWUxFX1JVTEU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU1NU
WUxFUlVMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NSdWxlOjpDSEFSU0VUX1JVTEU6
CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU0NIQVJTRVRSVUxFOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIENTU1J1bGU6OklNUE9SVF9SVUxFOgorICAgICAgICB0eXBlID0gVjhD
bGFzc0luZGV4OjpDU1NJTVBPUlRSVUxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1J1
bGU6Ok1FRElBX1JVTEU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU01FRElBUlVM
RTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NSdWxlOjpGT05UX0ZBQ0VfUlVMRToKKyAg
ICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q1NTRk9OVEZBQ0VSVUxFOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIENTU1J1bGU6OlBBR0VfUlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJ
bmRleDo6Q1NTUEFHRVJVTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NTUnVsZTo6VkFS
SUFCTEVTX1JVTEU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU1ZBUklBQkxFU1JV
TEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NTUnVsZTo6V0VCS0lUX0tFWUZSQU1FX1JV
TEU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OldFQktJVENTU0tFWUZSQU1FUlVMRTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NSdWxlOjpXRUJLSVRfS0VZRlJBTUVTX1JVTEU6
CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OldFQktJVENTU0tFWUZSQU1FU1JVTEU7Cisg
ICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAvLyBDU1NSdWxlOjpVTktOT1dOX1JVTEUKKyAg
ICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q1NTUlVMRTsKKyAgICAgICAgYnJlYWs7CisgICAg
fQorCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiByZXN1bHQgPSBpbnN0YW50aWF0ZVY4T2Jq
ZWN0KHR5cGUsIFY4Q2xhc3NJbmRleDo6Q1NTUlVMRSwgcnVsZSk7CisgICAgaWYgKCFyZXN1bHQu
SXNFbXB0eSgpKSB7CisgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBET00gb2JqZWN0IG1hcCBp
ZiB0aGUgcmVzdWx0IGlzIG5vbi1lbXB0eS4KKyAgICAgICAgcnVsZS0+cmVmKCk7CisgICAgICAg
IHNldEpTV3JhcHBlckZvckRPTU9iamVjdChydWxlLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0
Pjo6TmV3KHJlc3VsdCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y29udmVydFdpbmRvd1RvVjhPYmplY3QoRE9NV2luZG93
KiB3aW5kb3cpCit7CisgICAgaWYgKCF3aW5kb3cpCisgICAgICAgIHJldHVybiB2ODo6TnVsbCgp
OworICAgIC8vIEluaXRpYWxpemVzIGVudmlyb25tZW50IG9mIGEgZnJhbWUsIGFuZCByZXR1cm4g
dGhlIGdsb2JhbCBvYmplY3QKKyAgICAvLyBvZiB0aGUgZnJhbWUuCisgICAgRnJhbWUqIGZyYW1l
ID0gd2luZG93LT5mcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiB2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+KCk7CisKKyAgICAvLyBTcGVjaWFsIGNhc2U6IEJlY2F1c2Ugb2Yg
ZXZhbHVhdGVJbk5ld0NvbnRleHQoKSBvbmUgRE9NV2luZG93IGNhbiBoYXZlCisgICAgLy8gbXVs
dGlwbGUgY29udGV4dHMgYW5kIG11bHRpcGxlIGdsb2JhbCBvYmplY3RzIGFzc29jaWF0ZWQgd2l0
aCBpdC4gV2hlbgorICAgIC8vIGNvZGUgcnVubmluZyBpbiBvbmUgb2YgdGhvc2UgY29udGV4dHMg
YWNjZXNzZXMgdGhlIHdpbmRvdyBvYmplY3QsIHdlCisgICAgLy8gd2FudCB0byByZXR1cm4gdGhl
IGdsb2JhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoYXQgY29udGV4dCwgbm90CisgICAgLy8g
bmVjZXNzYXJpbHkgdGhlIGZpcnN0IGdsb2JhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoYXQg
RE9NV2luZG93LgorICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGN1cnJlbnRDb250ZXh0ID0g
djg6OkNvbnRleHQ6OkdldEN1cnJlbnQoKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGN1
cnJlbnRHbG9iYWwgPSBjdXJyZW50Q29udGV4dC0+R2xvYmFsKCk7CisgICAgdjg6OkhhbmRsZTx2
ODo6T2JqZWN0PiB3aW5kb3dXcmFwcGVyID0gbG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6
OkRPTVdJTkRPVywgY3VycmVudEdsb2JhbCk7CisgICAgaWYgKCF3aW5kb3dXcmFwcGVyLklzRW1w
dHkoKSkgeworICAgICAgICBpZiAoY29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxET01XaW5kb3c+
KHdpbmRvd1dyYXBwZXIpID09IHdpbmRvdykKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50R2xv
YmFsOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBnbG9iYWwgb2JqZWN0
IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZyYW1lLgorICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+
IHY4Q29udGV4dCA9IGNvbnRleHQoZnJhbWUpOworICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgp
KQorICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6T2JqZWN0PigpOworCisgICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwgPSB2OENvbnRleHQtPkdsb2JhbCgpOworICAgIEFTU0VS
VCghZ2xvYmFsLklzRW1wdHkoKSk7CisgICAgcmV0dXJuIGdsb2JhbDsKK30KKwordm9pZCBWOFBy
b3h5OjpiaW5kSnNPYmplY3RUb1dpbmRvdyhGcmFtZSogZnJhbWUsIGNvbnN0IGNoYXIqIG5hbWUs
IGludCB0eXBlLCB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBkZXNjcmlwdG9yLCB2
b2lkKiBpbXBsKQoreworICAgIC8vIEdldCBlbnZpcm9ubWVudC4KKyAgICB2ODo6SGFuZGxlPHY4
OjpDb250ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KGZyYW1lKTsKKyAgICBpZiAo
djhDb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOyAgLy8gSlMgbm90IGVuYWJsZWQu
CisKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUodjhDb250ZXh0KTsKKyAgICB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+IGluc3RhbmNlID0gZGVzY3JpcHRvci0+R2V0RnVuY3Rpb24oKTsKKyAg
ICBzZXRET01XcmFwcGVyKGluc3RhbmNlLCB0eXBlLCBpbXBsKTsKKworICAgIHY4OjpIYW5kbGU8
djg6Ok9iamVjdD4gZ2xvYmFsID0gdjhDb250ZXh0LT5HbG9iYWwoKTsKKyAgICBnbG9iYWwtPlNl
dCh2ODo6U3RyaW5nOjpOZXcobmFtZSksIGluc3RhbmNlKTsKK30KKwordm9pZCBWOFByb3h5Ojpw
cm9jZXNzQ29uc29sZU1lc3NhZ2VzKCkKK3sKKyAgICBDb25zb2xlTWVzc2FnZU1hbmFnZXI6OnBy
b2Nlc3NEZWxheWVkTWVzc2FnZXMoKTsKK30KKworLy8gQ3JlYXRlIHRoZSB1dGlsaXR5IGNvbnRl
eHQgZm9yIGhvbGRpbmcgSmF2YVNjcmlwdCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5CisvLyB3
aGljaCBhcmUgbm90IHZpc2libGUgdG8gSmF2YVNjcmlwdCBleGVjdXRpbmcgb24gdGhlIHBhZ2Uu
Cit2b2lkIFY4UHJveHk6OmNyZWF0ZVV0aWxpdHlDb250ZXh0KCkKK3sKKyAgICBBU1NFUlQobV91
dGlsaXR5Q29udGV4dC5Jc0VtcHR5KCkpOworCisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwor
ICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdFRlbXBsYXRlPiBnbG9iYWxUZW1wbGF0ZSA9IHY4OjpP
YmplY3RUZW1wbGF0ZTo6TmV3KCk7CisgICAgbV91dGlsaXR5Q29udGV4dCA9IHY4OjpDb250ZXh0
OjpOZXcoMCwgZ2xvYmFsVGVtcGxhdGUpOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0
U2NvcGUobV91dGlsaXR5Q29udGV4dCk7CisKKyAgICAvLyBDb21waWxlIEphdmFTY3JpcHQgZnVu
Y3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHNvdXJjZSBsaW5lIG9mIHRoZSB0b3AKKyAgICAvLyBK
YXZhU2NyaXB0IHN0YWNrIGZyYW1lLgorICAgIERFRklORV9TVEFUSUNfTE9DQUwoY29uc3QgY2hh
ciosIGZyYW1lU291cmNlTGluZVNvdXJjZSwKKyAgICAgICAgKCJmdW5jdGlvbiBmcmFtZVNvdXJj
ZUxpbmUoZXhlY19zdGF0ZSkgeyIKKyAgICAgICAgIiAgcmV0dXJuIGV4ZWNfc3RhdGUuZnJhbWUo
MCkuc291cmNlTGluZSgpOyIKKyAgICAgICAgIn0iKSk7CisgICAgdjg6OlNjcmlwdDo6Q29tcGls
ZSh2ODo6U3RyaW5nOjpOZXcoZnJhbWVTb3VyY2VMaW5lU291cmNlKSktPlJ1bigpOworCisgICAg
Ly8gQ29tcGlsZSBKYXZhU2NyaXB0IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSBzb3VyY2Ug
bmFtZSBvZiB0aGUgdG9wCisgICAgLy8gSmF2YVNjcmlwdCBzdGFjayBmcmFtZS4KKyAgICBERUZJ
TkVfU1RBVElDX0xPQ0FMKGNvbnN0IGNoYXIqLCBmcmFtZVNvdXJjZU5hbWVTb3VyY2UsCisgICAg
ICAgICgiZnVuY3Rpb24gZnJhbWVTb3VyY2VOYW1lKGV4ZWNfc3RhdGUpIHsiCisgICAgICAgICIg
IHZhciBmcmFtZSA9IGV4ZWNfc3RhdGUuZnJhbWUoMCk7IgorICAgICAgICAiICBpZiAoZnJhbWUu
ZnVuYygpLnJlc29sdmVkKCkgJiYgIgorICAgICAgICAiICAgICAgZnJhbWUuZnVuYygpLnNjcmlw
dCgpICYmICIKKyAgICAgICAgIiAgICAgIGZyYW1lLmZ1bmMoKS5zY3JpcHQoKS5uYW1lKCkpIHsi
CisgICAgICAgICIgICAgcmV0dXJuIGZyYW1lLmZ1bmMoKS5zY3JpcHQoKS5uYW1lKCk7IgorICAg
ICAgICAiICB9IgorICAgICAgICAifSIpKTsKKyAgICB2ODo6U2NyaXB0OjpDb21waWxlKHY4OjpT
dHJpbmc6Ok5ldyhmcmFtZVNvdXJjZU5hbWVTb3VyY2UpKS0+UnVuKCk7Cit9CisKK2ludCBWOFBy
b3h5Ojpzb3VyY2VMaW5lTnVtYmVyKCkKK3sKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7Cisg
ICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gdjhVdGlsaXR5Q29udGV4dCA9IFY4UHJveHk6OnV0
aWxpdHlDb250ZXh0KCk7CisgICAgaWYgKHY4VXRpbGl0eUNvbnRleHQuSXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm4gMDsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dFNjb3BlKHY4VXRp
bGl0eUNvbnRleHQpOworICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiBmcmFtZVNvdXJjZUxp
bmU7CisgICAgZnJhbWVTb3VyY2VMaW5lID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj46OkNhc3Qo
djhVdGlsaXR5Q29udGV4dC0+R2xvYmFsKCktPkdldCh2ODo6U3RyaW5nOjpOZXcoImZyYW1lU291
cmNlTGluZSIpKSk7CisgICAgaWYgKGZyYW1lU291cmNlTGluZS5Jc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiAwOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiByZXN1bHQgPSB2ODo6RGVidWc6
OkNhbGwoZnJhbWVTb3VyY2VMaW5lKTsKKyAgICBpZiAocmVzdWx0LklzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHJlc3VsdC0+SW50MzJWYWx1ZSgpOworfQorCitTdHJp
bmcgVjhQcm94eTo6c291cmNlTmFtZSgpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwor
ICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IHY4VXRpbGl0eUNvbnRleHQgPSB1dGlsaXR5Q29u
dGV4dCgpOworICAgIGlmICh2OFV0aWxpdHlDb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuIFN0cmluZygpOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0U2NvcGUodjhVdGls
aXR5Q29udGV4dCk7CisgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+IGZyYW1lU291cmNlTmFt
ZTsKKyAgICBmcmFtZVNvdXJjZU5hbWUgPSB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPjo6Q2FzdCh2
OFV0aWxpdHlDb250ZXh0LT5HbG9iYWwoKS0+R2V0KHY4OjpTdHJpbmc6Ok5ldygiZnJhbWVTb3Vy
Y2VOYW1lIikpKTsKKyAgICBpZiAoZnJhbWVTb3VyY2VOYW1lLklzRW1wdHkoKSkgeworICAgICAg
ICByZXR1cm4gU3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBUb1dlYkNvcmVTdHJpbmcodjg6
OkRlYnVnOjpDYWxsKGZyYW1lU291cmNlTmFtZSkpOworfQorCit2b2lkIFY4UHJveHk6OnJlZ2lz
dGVyRXh0ZW5zaW9uKHY4OjpFeHRlbnNpb24qIGV4dGVuc2lvbiwgY29uc3QgU3RyaW5nJiBzY2hl
bWVSZXN0cmljdGlvbikKK3sKKyAgICB2ODo6UmVnaXN0ZXJFeHRlbnNpb24oZXh0ZW5zaW9uKTsK
KyAgICBWOEV4dGVuc2lvbkluZm8gaW5mbyA9IHtzY2hlbWVSZXN0cmljdGlvbiwgZXh0ZW5zaW9u
fTsKKyAgICBtX2V4dGVuc2lvbnMucHVzaF9iYWNrKGluZm8pOworfQorCitib29sIFY4UHJveHk6
OnNldENvbnRleHREZWJ1Z0lkKGludCBkZWJ1Z0lkKSB7CisgICAgQVNTRVJUKGRlYnVnSWQgPiAw
KTsKKyAgICBpZiAobV9jb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKyAgICBpZiAoIW1fY29udGV4dC0+R2V0RGF0YSgp
LT5Jc1VuZGVmaW5lZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+IGNvbnRleHREYXRhID0gdjg6Ok9iamVjdDo6TmV3KCk7CisgICAgY29udGV4
dERhdGEtPlNldCh2ODo6U3RyaW5nOjpOZXcoa0NvbnRleHREZWJ1Z0RhdGFUeXBlKSwgdjg6OlN0
cmluZzo6TmV3KCJwYWdlIikpOworICAgIGNvbnRleHREYXRhLT5TZXQodjg6OlN0cmluZzo6TmV3
KGtDb250ZXh0RGVidWdEYXRhVmFsdWUpLCB2ODo6SW50ZWdlcjo6TmV3KGRlYnVnSWQpKTsKKyAg
ICBtX2NvbnRleHQtPlNldERhdGEoY29udGV4dERhdGEpOworICAgIHJldHVybiB0cnVlOworfQor
CitpbnQgVjhQcm94eTo6Y29udGV4dERlYnVnSWQodjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29u
dGV4dCkKK3sKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgaWYgKCFjb250ZXh0LT5H
ZXREYXRhKCktPklzT2JqZWN0KCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gZGF0YSA9IGNvbnRleHQtPkdldERhdGEoKS0+VG9PYmplY3QoKS0+R2V0KCB2
ODo6U3RyaW5nOjpOZXcoa0NvbnRleHREZWJ1Z0RhdGFWYWx1ZSkpOworICAgIHJldHVybiBkYXRh
LT5Jc0ludDMyKCkgPyBkYXRhLT5JbnQzMlZhbHVlKCkgOiAtMTsKK30KKworfSAgLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5
cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU
IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgor
ICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVjhQcm94
eS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVk
ZSA8djguaD4KKyNpbmNsdWRlIDx2OC1kZWJ1Zy5oPgorCisjaW5jbHVkZSAiQ2hyb21pdW1Ccmlk
Z2UuaCIKKyNpbmNsdWRlICJDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbi5oIgorI2luY2x1ZGUg
IkRPTU9iamVjdHNJbmNsdWRlLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNs
dWRlICJTY3JpcHRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiVjhCaW5kaW5nLmgiCisjaW5jbHVk
ZSAiVjhDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiVjhDdXN0b21CaW5kaW5nLmgiCisjaW5jbHVk
ZSAiVjhET01NYXAuaCIKKyNpbmNsdWRlICJWOERPTVdpbmRvdy5oIgorI2luY2x1ZGUgIlY4SW5k
ZXguaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBTdGF0aWMgdXRpbGl0eSBjb250ZXh0
Lgordjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IFY4UHJveHk6Om1fdXRpbGl0eUNvbnRleHQ7
CisKKy8vIFN0YXRpYyBsaXN0IG9mIHJlZ2lzdGVyZWQgZXh0ZW5zaW9ucworVjhFeHRlbnNpb25M
aXN0IFY4UHJveHk6Om1fZXh0ZW5zaW9uczsKKworLy8gc3RhdGljCitjb25zdCBjaGFyKiBWOFBy
b3h5OjprQ29udGV4dERlYnVnRGF0YVR5cGUgPSAidHlwZSI7Citjb25zdCBjaGFyKiBWOFByb3h5
OjprQ29udGV4dERlYnVnRGF0YVZhbHVlID0gInZhbHVlIjsKKworI2lmbmRlZiBOREVCVUcKKy8v
IEtlZXBzIHRyYWNrIG9mIGdsb2JhbCBoYW5kbGVzIGNyZWF0ZWQgKG5vdCBKUyB3cmFwcGVycwor
Ly8gb2YgRE9NIG9iamVjdHMpLiBPZnRlbiB0aGVzZSBnbG9iYWwgaGFuZGxlcyBhcmUgc291cmNl
CisvLyBvZiBsZWFrcy4KKy8vCisvLyBJZiB5b3Ugd2FudCB0byBsZXQgYSBDKysgb2JqZWN0IGhv
bGQgYSBwZXJzaXN0ZW50IGhhbmRsZQorLy8gdG8gYSBKUyBvYmplY3QsIHlvdSBzaG91bGQgcmVn
aXN0ZXIgdGhlIGhhbmRsZSBoZXJlIHRvCisvLyBrZWVwIHRyYWNrIG9mIGxlYWtzLgorLy8KKy8v
IFdoZW4gY3JlYXRpbmcgYSBwZXJzaXN0ZW50IGhhbmRsZSwgY2FsbDoKKy8vCisvLyAjaWZuZGVm
IE5ERUJVRworLy8gICAgVjhQcm94eTo6UmVnaXN0ZXJHbG9iYWxIYW5kbGUodHlwZSwgaG9zdCwg
aGFuZGxlKTsKKy8vICNlbmRpZgorLy8KKy8vIFdoZW4gcmVsZWFzaW5nIHRoZSBoYW5kbGUsIGNh
bGw6CisvLworLy8gI2lmbmRlZiBOREVCVUcKKy8vICAgIFY4UHJveHk6OlVucmVnaXN0ZXJHbG9i
YWxIYW5kbGUodHlwZSwgaG9zdCwgaGFuZGxlKTsKKy8vICNlbmRpZgorLy8KK3R5cGVkZWYgSGFz
aE1hcDx2ODo6VmFsdWUqLCBHbG9iYWxIYW5kbGVJbmZvKj4gR2xvYmFsSGFuZGxlTWFwOworCitz
dGF0aWMgR2xvYmFsSGFuZGxlTWFwJiBnbG9iYWxIYW5kbGVNYXAoKQoreworICAgIHN0YXRpYyBH
bG9iYWxIYW5kbGVNYXAgc3RhdGljR2xvYmFsSGFuZGxlTWFwOworICAgIHJldHVybiBzdGF0aWNH
bG9iYWxIYW5kbGVNYXA7Cit9CisKKworLy8gVGhlIFVTRV9WQVIoeCkgdGVtcGxhdGUgaXMgdXNl
ZCB0byBzaWxlbmNlIEMrKyBjb21waWxlciB3YXJuaW5ncworLy8gaXNzdWVkIGZvciB1bnVzZWQg
dmFyaWFibGVzICh0eXBpY2FsbHkgcGFyYW1ldGVycyBvciB2YWx1ZXMgdGhhdAorLy8gd2Ugd2Fu
dCB0byB3YXRjaCBpbiB0aGUgZGVidWdnZXIpLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0
aWMgaW5saW5lIHZvaWQgVVNFX1ZBUihUKSB7IH0KKworLy8gVGhlIGZ1bmN0aW9uIGlzIHRoZSBw
bGFjZSB0byBzZXQgdGhlIGJyZWFrIHBvaW50IHRvIGluc3BlY3QKKy8vIGxpdmUgZ2xvYmFsIGhh
bmRsZXMuIExlYWtzIGFyZSBvZnRlbiBjb21lIGZyb20gbGVha2VkIGdsb2JhbCBoYW5kbGVzLgor
c3RhdGljIHZvaWQgRW51bWVyYXRlR2xvYmFsSGFuZGxlcygpCit7CisgICAgZm9yIChHbG9iYWxI
YW5kbGVNYXA6Oml0ZXJhdG9yIGl0ID0gZ2xvYmFsSGFuZGxlTWFwKCkuYmVnaW4oKSwgZW5kID0g
Z2xvYmFsSGFuZGxlTWFwKCkuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBHbG9i
YWxIYW5kbGVJbmZvKiBpbmZvID0gaXQtPnNlY29uZDsKKyAgICAgICAgVVNFX1ZBUihpbmZvKTsK
KyAgICAgICAgdjg6OlZhbHVlKiBoYW5kbGUgPSBpdC0+Zmlyc3Q7CisgICAgICAgIFVTRV9WQVIo
aGFuZGxlKTsKKyAgICB9Cit9CisKK3ZvaWQgVjhQcm94eTo6UmVnaXN0ZXJHbG9iYWxIYW5kbGUo
R2xvYmFsSGFuZGxlVHlwZSB0eXBlLCB2b2lkKiBob3N0LCB2ODo6UGVyc2lzdGVudDx2ODo6VmFs
dWU+IGhhbmRsZSkKK3sKKyAgICBBU1NFUlQoIWdsb2JhbEhhbmRsZU1hcCgpLmNvbnRhaW5zKCpo
YW5kbGUpKTsKKyAgICBnbG9iYWxIYW5kbGVNYXAoKS5zZXQoKmhhbmRsZSwgbmV3IEdsb2JhbEhh
bmRsZUluZm8oaG9zdCwgdHlwZSkpOworfQorCisKK3ZvaWQgVjhQcm94eTo6VW5yZWdpc3Rlckds
b2JhbEhhbmRsZSh2b2lkKiBob3N0LCB2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IGhhbmRsZSkK
K3sKKyAgICBBU1NFUlQoZ2xvYmFsSGFuZGxlTWFwKCkuY29udGFpbnMoKmhhbmRsZSkpOworICAg
IEdsb2JhbEhhbmRsZUluZm8qIGluZm8gPSBnbG9iYWxIYW5kbGVNYXAoKS50YWtlKCpoYW5kbGUp
OworICAgIEFTU0VSVChpbmZvLT5ob3N0XyA9PSBob3N0KTsKKyAgICBkZWxldGUgaW5mbzsKK30K
KyNlbmRpZiAgLy8gaWZuZGVmIE5ERUJVRworCit2b2lkIEJhdGNoQ29uZmlndXJlQXR0cmlidXRl
cyh2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdCwgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0VGVtcGxhdGU+IHByb3RvLCBjb25zdCBCYXRjaGVkQXR0cmlidXRlKiBhdHRycywgc2l6ZV90
IG51bV9hdHRycykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9hdHRyczsgKytp
KSB7CisgICAgICAgIGNvbnN0IEJhdGNoZWRBdHRyaWJ1dGUqIGEgPSAmYXR0cnNbaV07CisgICAg
ICAgIChhLT5vbl9wcm90byA/IHByb3RvIDogaW5zdCktPlNldEFjY2Vzc29yKHY4OjpTdHJpbmc6
Ok5ldyhhLT5uYW1lKSwKKyAgICAgICAgICAgIGEtPmdldHRlciwKKyAgICAgICAgICAgIGEtPnNl
dHRlciwKKyAgICAgICAgICAgIGEtPmRhdGEgPT0gVjhDbGFzc0luZGV4OjpJTlZBTElEX0NMQVNT
X0lOREVYID8gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCkgOiB2ODo6SW50ZWdlcjo6TmV3KFY4Q2xh
c3NJbmRleDo6VG9JbnQoYS0+ZGF0YSkpLAorICAgICAgICAgICAgYS0+c2V0dGluZ3MsCisgICAg
ICAgICAgICBhLT5hdHRyaWJ1dGUpOworICAgIH0KK30KKwordm9pZCBCYXRjaENvbmZpZ3VyZUNv
bnN0YW50cyh2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBkZXNjLCB2ODo6SGFuZGxl
PHY4OjpPYmplY3RUZW1wbGF0ZT4gcHJvdG8sIGNvbnN0IEJhdGNoZWRDb25zdGFudCogY29uc3Rz
LCBzaXplX3QgbnVtX2NvbnN0cykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9j
b25zdHM7ICsraSkgeworICAgICAgICBjb25zdCBCYXRjaGVkQ29uc3RhbnQqIGMgPSAmY29uc3Rz
W2ldOworICAgICAgICBkZXNjLT5TZXQodjg6OlN0cmluZzo6TmV3KGMtPm5hbWUpLCB2ODo6SW50
ZWdlcjo6TmV3KGMtPnZhbHVlKSwgdjg6OlJlYWRPbmx5KTsKKyAgICAgICAgcHJvdG8tPlNldCh2
ODo6U3RyaW5nOjpOZXcoYy0+bmFtZSksIHY4OjpJbnRlZ2VyOjpOZXcoYy0+dmFsdWUpLCB2ODo6
UmVhZE9ubHkpOworICAgIH0KK30KKwordHlwZWRlZiBIYXNoTWFwPE5vZGUqLCB2ODo6T2JqZWN0
Kj4gRE9NTm9kZU1hcDsKK3R5cGVkZWYgSGFzaE1hcDx2b2lkKiwgdjg6Ok9iamVjdCo+IERPTU9i
amVjdE1hcDsKKworI2lmbmRlZiBOREVCVUcKK3N0YXRpYyB2b2lkIEVudW1lcmF0ZURPTU9iamVj
dE1hcChET01PYmplY3RNYXAmIHdyYXBwZXJfbWFwKQoreworICAgIGZvciAoRE9NT2JqZWN0TWFw
OjppdGVyYXRvciBpdCA9IHdyYXBwZXJfbWFwLmJlZ2luKCksIGVuZCA9IHdyYXBwZXJfbWFwLmVu
ZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVj
dD4gd3JhcHBlcihpdC0+c2Vjb25kKTsKKyAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJU
eXBlIHR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFwcGVyVHlwZSh3cmFwcGVyKTsKKyAgICAgICAg
dm9pZCogb2JqID0gaXQtPmZpcnN0OworICAgICAgICBVU0VfVkFSKHR5cGUpOworICAgICAgICBV
U0VfVkFSKG9iaik7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIEVudW1lcmF0ZURPTU5vZGVN
YXAoRE9NTm9kZU1hcCYgbm9kZU1hcCkKK3sKKyAgICBmb3IgKERPTU5vZGVNYXA6Oml0ZXJhdG9y
IGl0ID0gbm9kZU1hcC5iZWdpbigpLCBlbmQgPSBub2RlTWFwLmVuZCgpOyBpdCAhPSBlbmQ7ICsr
aXQpIHsKKyAgICAgICAgTm9kZSogbm9kZSA9IGl0LT5maXJzdDsKKyAgICAgICAgVVNFX1ZBUihu
b2RlKTsKKyAgICAgICAgQVNTRVJUKHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+KGl0LT5zZWNv
bmQpLklzV2VhaygpKTsKKyAgICB9Cit9CisjZW5kaWYgIC8vIE5ERUJVRworCisjaWYgRU5BQkxF
KFNWRykKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5OjpTVkdFbGVtZW50SW5zdGFuY2VU
b1Y4T2JqZWN0KFNWR0VsZW1lbnRJbnN0YW5jZSogaW5zdGFuY2UpCit7CisgICAgaWYgKCFpbnN0
YW5jZSkKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+IGV4aXN0aW5nX2luc3RhbmNlID0gZ2V0RE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwKCku
Z2V0KGluc3RhbmNlKTsKKyAgICBpZiAoIWV4aXN0aW5nX2luc3RhbmNlLklzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuIGV4aXN0aW5nX2luc3RhbmNlOworCisgICAgaW5zdGFuY2UtPnJlZigpOwor
CisgICAgLy8gSW5zdGFudGlhdGUgdGhlIFY4IG9iamVjdCBhbmQgcmVtZW1iZXIgaXQKKyAgICB2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJlc3VsdCA9IEluc3RhbnRpYXRlVjhPYmplY3QoVjhDbGFz
c0luZGV4OjpTVkdFTEVNRU5USU5TVEFOQ0UsIFY4Q2xhc3NJbmRleDo6U1ZHRUxFTUVOVElOU1RB
TkNFLCBpbnN0YW5jZSk7CisgICAgaWYgKCFyZXN1bHQuSXNFbXB0eSgpKSB7CisgICAgICAgIC8v
IE9ubHkgdXBkYXRlIHRoZSBET00gU1ZHIGVsZW1lbnQgbWFwIGlmIHRoZSByZXN1bHQgaXMgbm9u
LWVtcHR5LgorICAgICAgICBnZXRET01TVkdFbGVtZW50SW5zdGFuY2VNYXAoKS5zZXQoaW5zdGFu
Y2UsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcocmVzdWx0KSk7CisgICAgfQorICAg
IHJldHVybiByZXN1bHQ7Cit9CisKKy8vIE1hcCBvZiBTVkcgb2JqZWN0cyB3aXRoIGNvbnRleHRz
IHRvIHRoZWlyIGNvbnRleHRzCitzdGF0aWMgSGFzaE1hcDx2b2lkKiwgU1ZHRWxlbWVudCo+JiBz
dmdPYmplY3RUb0NvbnRleHRNYXAoKQoreworICAgIHN0YXRpYyBIYXNoTWFwPHZvaWQqLCBTVkdF
bGVtZW50Kj4gc3RhdGljU3ZnT2JqZWN0VG9Db250ZXh0TWFwOworICAgIHJldHVybiBzdGF0aWNT
dmdPYmplY3RUb0NvbnRleHRNYXA7Cit9CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5
OjpTVkdPYmplY3RXaXRoQ29udGV4dFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJU
eXBlIHR5cGUsIHZvaWQqIG9iamVjdCkKK3sKKyAgICBpZiAoIW9iamVjdCkKKyAgICAgICAgcmV0
dXJuIHY4OjpOdWxsKCk7CisKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiByZXN1bHQg
PSBnZXRET01TVkdPYmplY3RXaXRoQ29udGV4dE1hcCgpLmdldChvYmplY3QpOworICAgIGlmICgh
cmVzdWx0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIC8vIFNwZWNp
YWwgY2FzZTogU1ZHUGF0aFNlZ3MgbmVlZCB0byBiZSBkb3duY2FzdCB0byB0aGVpciByZWFsIHR5
cGUKKyAgICBpZiAodHlwZSA9PSBWOENsYXNzSW5kZXg6OlNWR1BBVEhTRUcpCisgICAgICAgIHR5
cGUgPSBWOEN1c3RvbTo6RG93bmNhc3RTVkdQYXRoU2VnKG9iamVjdCk7CisKKyAgICB2ODo6TG9j
YWw8djg6Ok9iamVjdD4gdjhvYmogPSBJbnN0YW50aWF0ZVY4T2JqZWN0KHR5cGUsIHR5cGUsIG9i
amVjdCk7CisgICAgaWYgKCF2OG9iai5Jc0VtcHR5KCkpIHsKKyAgICAgIHJlc3VsdCA9IHY4OjpQ
ZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcodjhvYmopOworICAgICAgc3dpdGNoICh0eXBlKSB7
CisjZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBOQU1FKSAgICAgXAorICAgICAgY2FzZSBWOENsYXNz
SW5kZXg6OlRZUEU6IHN0YXRpY19jYXN0PE5BTUUqPihvYmplY3QpLT5yZWYoKTsgYnJlYWs7Cisg
ICAgICBTVkdfT0JKRUNUX1RZUEVTKE1BS0VfQ0FTRSkKKyN1bmRlZiBNQUtFX0NBU0UKKyNkZWZp
bmUgTUFLRV9DQVNFKFRZUEUsIE5BTUUpICAgICBcCisgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6
VFlQRTogICAgXAorICAgICAgICAgIHN0YXRpY19jYXN0PFY4U1ZHUE9EVHlwZVdyYXBwZXI8TkFN
RT4qPihvYmplY3QpLT5yZWYoKTsgYnJlYWs7CisgICAgICBTVkdfUE9EX05BVElWRV9UWVBFUyhN
QUtFX0NBU0UpCisjdW5kZWYgTUFLRV9DQVNFCisgICAgICBkZWZhdWx0OgorICAgICAgICAgIEFT
U0VSVChmYWxzZSk7CisgICAgICB9CisgICAgICBnZXRET01TVkdPYmplY3RXaXRoQ29udGV4dE1h
cCgpLnNldChvYmplY3QsIHJlc3VsdCk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCit2
b2lkIFY4UHJveHk6OlNldFNWR0NvbnRleHQodm9pZCogb2JqLCBTVkdFbGVtZW50KiBjb250ZXh0
KQoreworICAgIGlmIChvYmogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgU1ZHRWxl
bWVudCogb2xkQ29udGV4dCA9IHN2Z09iamVjdFRvQ29udGV4dE1hcCgpLmdldChvYmopOworCisg
ICAgaWYgKG9sZENvbnRleHQgPT0gY29udGV4dCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYg
KG9sZENvbnRleHQpCisgICAgICAgIG9sZENvbnRleHQtPmRlcmVmKCk7CisKKyAgICBpZiAoY29u
dGV4dCkKKyAgICAgICAgY29udGV4dC0+cmVmKCk7CisKKyAgICBzdmdPYmplY3RUb0NvbnRleHRN
YXAoKS5zZXQob2JqLCBjb250ZXh0KTsKK30KKworU1ZHRWxlbWVudCogVjhQcm94eTo6R2V0U1ZH
Q29udGV4dCh2b2lkKiBvYmopCit7CisgICAgcmV0dXJuIHN2Z09iamVjdFRvQ29udGV4dE1hcCgp
LmdldChvYmopOworfQorCisjZW5kaWYKKworLy8gQSBtYXAgZnJvbSBhIERPTSBub2RlIHRvIGl0
cyBKUyB3cmFwcGVyLCB0aGUgd3JhcHBlcgorLy8gaXMga2VwdCBhcyBhIHN0cm9uZyByZWZlcmVu
Y2UgdG8gc3Vydml2ZSBHQ3MuCitzdGF0aWMgRE9NT2JqZWN0TWFwJiBnY1Byb3RlY3RlZE1hcCgp
IHsKKyAgICBzdGF0aWMgRE9NT2JqZWN0TWFwIHN0YXRpY0djUHJvdGVjdGVkTWFwOworICAgIHJl
dHVybiBzdGF0aWNHY1Byb3RlY3RlZE1hcDsKK30KKworLy8gc3RhdGljCit2b2lkIFY4UHJveHk6
OkdDUHJvdGVjdCh2b2lkKiBkb21PYmplY3QpCit7CisgICAgaWYgKCFkb21PYmplY3QpCisgICAg
ICAgIHJldHVybjsKKyAgICBpZiAoZ2NQcm90ZWN0ZWRNYXAoKS5jb250YWlucyhkb21PYmplY3Qp
KQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFnZXRET01PYmplY3RNYXAoKS5jb250YWlucyhk
b21PYmplY3QpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgKHN0cm9u
ZykgcGVyc2lzdGVudCBoYW5kbGUgZm9yIHRoZSBvYmplY3QuCisgICAgdjg6OlBlcnNpc3RlbnQ8
djg6Ok9iamVjdD4gd3JhcHBlciA9IGdldERPTU9iamVjdE1hcCgpLmdldChkb21PYmplY3QpOwor
ICAgIGlmICh3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZ2NQcm90
ZWN0ZWRNYXAoKS5zZXQoZG9tT2JqZWN0LCAqdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5l
dyh3cmFwcGVyKSk7Cit9CisKKworLy8gc3RhdGljCit2b2lkIFY4UHJveHk6OkdDVW5wcm90ZWN0
KHZvaWQqIGRvbU9iamVjdCkKK3sKKyAgICBpZiAoIWRvbU9iamVjdCkKKyAgICAgICAgcmV0dXJu
OworICAgIGlmICghZ2NQcm90ZWN0ZWRNYXAoKS5jb250YWlucyhkb21PYmplY3QpKQorICAgICAg
ICByZXR1cm47CisKKyAgICAvLyBEaXNwb3NlIHRoZSBzdHJvbmcgcmVmZXJlbmNlLgorICAgIHY4
OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdyYXBwZXIoZ2NQcm90ZWN0ZWRNYXAoKS50YWtlKGRv
bU9iamVjdCkpOworICAgIHdyYXBwZXIuRGlzcG9zZSgpOworfQorCisKKy8vIENyZWF0ZSBvYmpl
Y3QgZ3JvdXBzIGZvciBET00gdHJlZSBub2Rlcy4KK3N0YXRpYyB2b2lkIEdDUHJvbG9ndWUoKQor
eworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKworI2lmbmRlZiBOREVCVUcKKyAgICBFbnVt
ZXJhdGVET01PYmplY3RNYXAoZ2V0RE9NT2JqZWN0TWFwKCkuaW1wbCgpKTsKKyNlbmRpZgorCisg
ICAgLy8gUnVuIHRocm91Z2ggYWxsIG9iamVjdHMgd2l0aCBwb3NzaWJsZSBwZW5kaW5nIGFjdGl2
aXR5IG1ha2luZyB0aGVpcgorICAgIC8vIHdyYXBwZXJzIG5vbiB3ZWFrIGlmIHRoZXJlIGlzIHBl
bmRpbmcgYWN0aXZpdHkuCisgICAgRE9NT2JqZWN0TWFwIGFjdGl2ZU1hcCA9IGdldEFjdGl2ZURP
TU9iamVjdE1hcCgpLmltcGwoKTsKKyAgICBmb3IgKERPTU9iamVjdE1hcDo6aXRlcmF0b3IgaXQg
PSBhY3RpdmVNYXAuYmVnaW4oKSwgZW5kID0gYWN0aXZlTWFwLmVuZCgpOyBpdCAhPSBlbmQ7ICsr
aXQpIHsKKyAgICAgICAgdm9pZCogb2JqID0gaXQtPmZpcnN0OworICAgICAgICB2ODo6UGVyc2lz
dGVudDx2ODo6T2JqZWN0PiB3cmFwcGVyID0gdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4oaXQt
PnNlY29uZCk7CisgICAgICAgIEFTU0VSVCh3cmFwcGVyLklzV2VhaygpKTsKKyAgICAgICAgVjhD
bGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFwcGVyVHlw
ZSh3cmFwcGVyKTsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisjZGVmaW5lIE1BS0VfQ0FTRShU
WVBFLCBOQU1FKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBWOENsYXNzSW5k
ZXg6OlRZUEU6IHsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTkFNRSogaW1wbCA9IHN0
YXRpY19jYXN0PE5BTUUqPihvYmopOyBcCisgICAgICAgICAgICBpZiAoaW1wbC0+aGFzUGVuZGlu
Z0FjdGl2aXR5KCkpICAgICAgIFwKKyAgICAgICAgICAgICAgICB3cmFwcGVyLkNsZWFyV2Vhaygp
OyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgICAgIH0KKyAgICAgICAgQUNUSVZFX0RPTV9PQkpFQ1RfVFlQRVMo
TUFLRV9DQVNFKQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUKGZhbHNlKTsK
KyN1bmRlZiBNQUtFX0NBU0UKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZGl0aW9uYWwgaGFu
ZGxpbmcgb2YgbWVzc2FnZSBwb3J0IGVuc3VyaW5nIHRoYXQgZW50YW5nbGVkIHBvcnRzIGFsc28K
KyAgICAgICAgLy8gaGF2ZSB0aGVpciB3cmFwcGVycyBlbnRhbmdsZWQuIFRoaXMgc2hvdWxkIGlk
ZWFsbHkgYmUgaGFuZGxlZCB3aGVuIHRoZQorICAgICAgICAvLyBwb3J0cyBhcmUgYWN0dWFsbHkg
ZW50YW5nbGVkIGluIE1lc3NhZ2VQb3J0OjplbnRhbmdsZSwgYnV0IHRvIGF2b2lkCisgICAgICAg
IC8vIGZvcmtpbmcgTWVzc2FnZVBvcnQuKiB0aGlzIGlzIHBvc3Rwb25lZCB0byBHQyB0aW1lLiBI
YXZpbmcgdGhpcyBwb3N0cG9uZWQKKyAgICAgICAgLy8gaGFzIHRoZSBkcmF3YmFjayB0aGF0IHRo
ZSB3cmFwcGVycyBhcmUgImVudGFuZ2xlZC91bmVudGFuZ2xlZCIgZm9yIGVhY2gKKyAgICAgICAg
Ly8gR0MgZXZlbiB0aG91Z2ggdGhlaXIgZW50YWdsZW1lbnQgbW9zdCBsaWtlbHkgaXMgc3RpbGwg
dGhlIHNhbWUuCisgICAgICAgIGlmICh0eXBlID09IFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQp
IHsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgcG9ydCBhbmQgaXRzIGVudGFuZ2xlZCBwb3J0Lgor
ICAgICAgICAgICAgTWVzc2FnZVBvcnQqIHBvcnQxID0gc3RhdGljX2Nhc3Q8TWVzc2FnZVBvcnQq
PihvYmopOworICAgICAgICAgICAgTWVzc2FnZVBvcnQqIHBvcnQyID0gcG9ydDEtPmxvY2FsbHlF
bnRhbmdsZWRQb3J0KCk7CisKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSByZW1vdGVseSBlbnRh
bmdsZWQsIHRoZW4gbWFyayB0aGlzIG9iamVjdCBhcyByZWFjaGFibGUKKyAgICAgICAgICAgIC8v
ICh3ZSBjYW4ndCBkZXRlcm1pbmUgcmVhY2hhYmlsaXR5IGRpcmVjdGx5IGFzIHRoZSByZW1vdGUg
b2JqZWN0IGlzCisgICAgICAgICAgICAvLyBvdXQtb2YtcHJvYykuCisgICAgICAgICAgICBpZiAo
cG9ydDEtPmlzRW50YW5nbGVkKCkgJiYgIXBvcnQyKQorICAgICAgICAgICAgICAgIHdyYXBwZXIu
Q2xlYXJXZWFrKCk7CisKKyAgICAgICAgICAgIGlmIChwb3J0MiAhPSBOVUxMKSB7CisgICAgICAg
ICAgICAgICAgLy8gQXMgcG9ydHMgYXJlIGFsd2F5cyBlbnRhbmdsZWQgaW4gcGFpcnMgb25seSBw
ZXJmb3JtIHRoZSBlbnRhbmdsZW1lbnQKKyAgICAgICAgICAgICAgICAvLyBvbmNlIGZvciBlYWNo
IHBhaXIgKHNlZSBBU1NFUlQgaW4gTWVzc2FnZVBvcnQ6OnVuZW50YW5nbGUoKSkuCisgICAgICAg
ICAgICAgICAgaWYgKHBvcnQxIDwgcG9ydDIpIHsKKyAgICAgICAgICAgICAgICAgICAgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IHBvcnQxV3JhcHBlciA9IFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFz
c0luZGV4OjpNRVNTQUdFUE9SVCwgcG9ydDEpOworICAgICAgICAgICAgICAgICAgICB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gcG9ydDJXcmFwcGVyID0gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNz
SW5kZXg6Ok1FU1NBR0VQT1JULCBwb3J0Mik7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChw
b3J0MVdyYXBwZXItPklzT2JqZWN0KCkpOworICAgICAgICAgICAgICAgICAgICB2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+OjpDYXN0KHBvcnQxV3JhcHBlciktPlNldEludGVybmFsRmllbGQoVjhDdXN0
b206OmtNZXNzYWdlUG9ydEVudGFuZ2xlZFBvcnRJbmRleCwgcG9ydDJXcmFwcGVyKTsKKyAgICAg
ICAgICAgICAgICAgICAgQVNTRVJUKHBvcnQyV3JhcHBlci0+SXNPYmplY3QoKSk7CisgICAgICAg
ICAgICAgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QocG9ydDJXcmFwcGVyKS0+
U2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a01lc3NhZ2VQb3J0RW50YW5nbGVkUG9ydEluZGV4
LCBwb3J0MVdyYXBwZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSB3cmFwcGVyIGVudGFuZ2xlbWVudCB3aGVu
IGEgcG9ydCBpcyBub3QgZW50YW5nbGVkLgorICAgICAgICAgICAgICAgIGlmIChWOFByb3h5OjpE
T01PYmplY3RIYXNKU1dyYXBwZXIocG9ydDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHY4OjpI
YW5kbGU8djg6OlZhbHVlPiB3cmFwcGVyID0gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5k
ZXg6Ok1FU1NBR0VQT1JULCBwb3J0MSk7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVCh3cmFw
cGVyLT5Jc09iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0Pjo6Q2FzdCh3cmFwcGVyKS0+U2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a01lc3NhZ2VQ
b3J0RW50YW5nbGVkUG9ydEluZGV4LCB2ODo6VW5kZWZpbmVkKCkpOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENyZWF0ZSBvYmpl
Y3QgZ3JvdXBzLgorICAgIHR5cGVkZWYgc3RkOjpwYWlyPHVpbnRwdHJfdCwgTm9kZSo+IEdyb3Vw
ZXJQYWlyOworICAgIHR5cGVkZWYgVmVjdG9yPEdyb3VwZXJQYWlyPiBHcm91cGVyTGlzdDsKKwor
ICAgIERPTU5vZGVNYXAgbm9kZU1hcCA9IGdldERPTU5vZGVNYXAoKS5pbXBsKCk7CisgICAgR3Jv
dXBlckxpc3QgZ3JvdXBlcjsKKyAgICBncm91cGVyLnJlc2VydmVDYXBhY2l0eShub2RlTWFwLnNp
emUoKSk7CisKKyAgICBmb3IgKERPTU5vZGVNYXA6Oml0ZXJhdG9yIGl0ID0gbm9kZU1hcC5iZWdp
bigpLCBlbmQgPSBub2RlTWFwLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgTm9k
ZSogbm9kZSA9IGl0LT5maXJzdDsKKworICAgICAgICAvLyBJZiB0aGUgbm9kZSBpcyBpbiBkb2N1
bWVudCwgcHV0IGl0IGluIHRoZSBvd25lckRvY3VtZW50J3Mgb2JqZWN0IGdyb3VwLgorICAgICAg
ICAvLworICAgICAgICAvLyBJZiBhbiBpbWFnZSBlbGVtZW50IHdhcyBjcmVhdGVkIGJ5IEphdmFT
Y3JpcHQgIm5ldyBJbWFnZSIsCisgICAgICAgIC8vIGl0IGlzIG5vdCBpbiBhIGRvY3VtZW50LiBI
b3dldmVyLCBpZiB0aGUgbG9hZCBldmVudCBoYXMgbm90CisgICAgICAgIC8vIGJlZW4gZmlyZWQg
KHN0aWxsIG9ubG9hZGluZyksIGl0IGlzIHRyZWF0ZWQgYXMgaW4gdGhlIGRvY3VtZW50LgorICAg
ICAgICAvLworICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBub2RlIGlzIHB1dCBpbiBhbiBvYmpl
Y3QgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcm9vdAorICAgICAgICAvLyBlbG1lbnQgb2YgdGhl
IHRyZWUgdG8gd2hpY2ggaXQgYmVsb25ncy4KKyAgICAgICAgdWludHB0cl90IGdyb3VwSWQ7Cisg
ICAgICAgIGlmIChub2RlLT5pbkRvY3VtZW50KCkgfHwgKG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5h
bWVzOjppbWdUYWcpICYmICFzdGF0aWNfY2FzdDxIVE1MSW1hZ2VFbGVtZW50Kj4obm9kZSktPmhh
dmVGaXJlZExvYWRFdmVudCgpKSkgeworICAgICAgICAgICAgZ3JvdXBJZCA9IHJlaW50ZXJwcmV0
X2Nhc3Q8dWludHB0cl90Pihub2RlLT5kb2N1bWVudCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgIE5vZGUqIHJvb3QgPSBub2RlOworICAgICAgICAgICAgd2hpbGUgKHJvb3QtPnBh
cmVudCgpKQorICAgICAgICAgICAgICAgIHJvb3QgPSByb290LT5wYXJlbnQoKTsKKworICAgICAg
ICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgYWxvbmUgaW4gaXRzIERPTSB0cmVlIChkb2Vzbid0IGhh
dmUgYSBwYXJlbnQgb3IgYW55CisgICAgICAgICAgICAvLyBjaGlsZHJlbikgdGhlbiB0aGUgZ3Jv
dXAgd2lsbCBiZSBmaWx0ZXJlZCBvdXQgbGF0ZXIgYW55d2F5LgorICAgICAgICAgICAgaWYgKHJv
b3QgPT0gbm9kZSAmJiAhbm9kZS0+aGFzQ2hpbGROb2RlcygpKQorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworCisgICAgICAgICAgICBncm91cElkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRy
X3Q+KHJvb3QpOworICAgICAgICB9CisgICAgICAgIGdyb3VwZXIuYXBwZW5kKEdyb3VwZXJQYWly
KGdyb3VwSWQsIG5vZGUpKTsKKyAgICB9CisKKyAgICAvLyBHcm91cCBieSBzb3J0aW5nIGJ5IHRo
ZSBncm91cCBpZC4gIFRoaXMgd2lsbCB1c2UgdGhlIHN0ZDo6cGFpciBvcGVyYXRvcjwsCisgICAg
Ly8gd2hpY2ggd2lsbCByZWFsbHkgc29ydCBieSBib3RoIHRoZSBncm91cCBpZCBhbmQgdGhlIE5v
ZGUqLiAgSG93ZXZlciB0aGUKKyAgICAvLyBOb2RlKiBpcyBvbmx5IGludm9sdmVkIHRvIHNvcnQg
d2l0aGluIGEgZ3JvdXAgaWQsIHNvIGl0IHdpbGwgYmUgZmluZS4KKyAgICBzdGQ6OnNvcnQoZ3Jv
dXBlci5iZWdpbigpLCBncm91cGVyLmVuZCgpKTsKKworICAgIC8vIFRPRE8oZGVhbm0pOiBTaG91
bGQgcHJvYmFibHkgd29yayBpbiBpdGVyYXRvcnMgaGVyZSwgYnV0IGluZGV4ZXMgd2VyZQorICAg
IC8vIGVhc2llciBmb3IgbXkgc2ltcGxlIG1pbmQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBncm91cGVyLnNpemUoKTsgKSB7CisgICAgICAgIC8vIFNlZWsgdG8gdGhlIG5leHQga2V5IChv
ciB0aGUgZW5kIG9mIHRoZSBsaXN0KS4KKyAgICAgICAgc2l6ZV90IG5leHRLZXlJbmRleCA9IGdy
b3VwZXIuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBqID0gaTsgaiA8IGdyb3VwZXIuc2l6
ZSgpOyArK2opIHsKKyAgICAgICAgICAgIGlmIChncm91cGVyW2ldLmZpcnN0ICE9IGdyb3VwZXJb
al0uZmlyc3QpIHsKKyAgICAgICAgICAgICAgbmV4dEtleUluZGV4ID0gajsKKyAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBU1NFUlQobmV4
dEtleUluZGV4ID4gaSk7CisKKyAgICAgICAgLy8gV2Ugb25seSBjYXJlIGFib3V0IGEgZ3JvdXAg
aWYgaXQgaGFzIG1vcmUgdGhhbiBvbmUgb2JqZWN0LiAgSWYgaXQgb25seQorICAgICAgICAvLyBo
YXMgb25lIG9iamVjdCwgaXQgaGFzIG5vdGhpbmcgZWxzZSB0aGF0IG5lZWRzIHRvIGJlIGtlcHQg
YWxpdmUuCisgICAgICAgIGlmIChuZXh0S2V5SW5kZXggLSBpIDw9IDEpIHsKKyAgICAgICAgICAg
IGkgPSBuZXh0S2V5SW5kZXg7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisg
ICAgICAgIFZlY3Rvcjx2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+ID4gZ3JvdXA7CisgICAgICAg
IGdyb3VwLnJlc2VydmVDYXBhY2l0eShuZXh0S2V5SW5kZXggLSBpKTsKKyAgICAgICAgZm9yICg7
IGkgPCBuZXh0S2V5SW5kZXg7ICsraSkgeworICAgICAgICAgICAgTm9kZSogbm9kZSA9IGdyb3Vw
ZXJbaV0uc2Vjb25kOworICAgICAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB3cmFw
cGVyID0gZ2V0RE9NTm9kZU1hcCgpLmdldChub2RlKTsKKyAgICAgICAgICAgIGlmICghd3JhcHBl
ci5Jc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgZ3JvdXAuYXBwZW5kKHdyYXBwZXIpOworICAg
ICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgc3R5bGVkIGFuZCB0aGVyZSBpcyBhIHdyYXBwZXIg
Zm9yIHRoZSBpbmxpbmUKKyAgICAgICAgICAgIC8vIHN0eWxlIGRlY2xhcmF0aW9uLCB3ZSBuZWVk
IHRvIGtlZXAgdGhhdCBzdHlsZSBkZWNsYXJhdGlvbgorICAgICAgICAgICAgLy8gd3JhcHBlciBh
bGl2ZSBhcyB3ZWxsLCBzbyB3ZSBhZGQgaXQgdG8gdGhlIG9iamVjdCBncm91cC4KKyAgICAgICAg
ICAgIGlmIChub2RlLT5pc1N0eWxlZEVsZW1lbnQoKSkgeworICAgICAgICAgICAgICAgIFN0eWxl
ZEVsZW1lbnQqIGVsZW1lbnQgPSByZWludGVycHJldF9jYXN0PFN0eWxlZEVsZW1lbnQqPihub2Rl
KTsKKyAgICAgICAgICAgICAgICBDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSA9IGVsZW1lbnQt
PmlubGluZVN0eWxlRGVjbCgpOworICAgICAgICAgICAgICAgIGlmIChzdHlsZSAhPSBOVUxMKSB7
CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIgPSBnZXRET01PYmplY3RNYXAoKS5nZXQoc3R5
bGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXdyYXBwZXIuSXNFbXB0eSgpKQorICAgICAg
ICAgICAgICAgICAgICAgICAgZ3JvdXAuYXBwZW5kKHdyYXBwZXIpOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChncm91cC5zaXplKCkg
PiAxKQorICAgICAgICAgICAgdjg6OlY4OjpBZGRPYmplY3RHcm91cCgmZ3JvdXBbMF0sIGdyb3Vw
LnNpemUoKSk7CisKKyAgICAgICAgQVNTRVJUKGkgPT0gbmV4dEtleUluZGV4KTsKKyAgICB9Cit9
CisKKworc3RhdGljIHZvaWQgR0NFcGlsb2d1ZSgpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNj
b3BlOworCisgICAgLy8gUnVuIHRocm91Z2ggYWxsIG9iamVjdHMgd2l0aCBwZW5kaW5nIGFjdGl2
aXR5IG1ha2luZyB0aGVpciB3cmFwcGVycyB3ZWFrIGFnYWluLgorICAgIERPTU9iamVjdE1hcCBh
Y3RpdmVNYXAgPSBnZXRBY3RpdmVET01PYmplY3RNYXAoKS5pbXBsKCk7CisgICAgZm9yIChET01P
YmplY3RNYXA6Oml0ZXJhdG9yIGl0ID0gYWN0aXZlTWFwLmJlZ2luKCksIGVuZCA9IGFjdGl2ZU1h
cC5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIHZvaWQqIG9iaiA9IGl0LT5maXJz
dDsKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gd3JhcHBlciA9IHY4OjpQZXJz
aXN0ZW50PHY4OjpPYmplY3Q+KGl0LT5zZWNvbmQpOworICAgICAgICBWOENsYXNzSW5kZXg6OlY4
V3JhcHBlclR5cGUgdHlwZSA9IFY4UHJveHk6OkdldERPTVdyYXBwZXJUeXBlKHdyYXBwZXIpOwor
ICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyNkZWZpbmUgTUFLRV9DQVNFKFRZUEUsIE5BTUUpICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgVjhD
bGFzc0luZGV4OjpUWVBFOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor
ICAgICAgICAgICAgTkFNRSogaW1wbCA9IHN0YXRpY19jYXN0PE5BTUUqPihvYmopOyAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChpbXBsLT5oYXNQZW5kaW5nQWN0aXZpdHko
KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQVNTRVJUKCF3
cmFwcGVyLklzV2VhaygpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAg
ICAgICAgIHdyYXBwZXIuTWFrZVdlYWsoaW1wbCwgJndlYWtBY3RpdmVET01PYmplY3RDYWxsYmFj
ayk7IFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisgICAgICAg
IEFDVElWRV9ET01fT0JKRUNUX1RZUEVTKE1BS0VfQ0FTRSkKKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgIEFTU0VSVChmYWxzZSk7CisjdW5kZWYgTUFLRV9DQVNFCisgICAgICAgIH0KKyAg
ICB9CisKKyNpZm5kZWYgTkRFQlVHCisgICAgLy8gQ2hlY2sgYWxsIHN1cnZpdmFscyBhcmUgd2Vh
ay4KKyAgICBFbnVtZXJhdGVET01PYmplY3RNYXAoZ2V0RE9NT2JqZWN0TWFwKCkuaW1wbCgpKTsK
KyAgICBFbnVtZXJhdGVET01Ob2RlTWFwKGdldERPTU5vZGVNYXAoKS5pbXBsKCkpOworICAgIEVu
dW1lcmF0ZURPTU9iamVjdE1hcChnY1Byb3RlY3RlZE1hcCgpKTsKKyAgICBFbnVtZXJhdGVHbG9i
YWxIYW5kbGVzKCk7CisjdW5kZWYgVVNFX1ZBUgorI2VuZGlmCit9CisKKwordHlwZWRlZiBIYXNo
TWFwPGludCwgdjg6OkZ1bmN0aW9uVGVtcGxhdGUqPiBGdW5jdGlvblRlbXBsYXRlTWFwOworCiti
b29sIEFsbG93QWxsb2NhdGlvbjo6bV9jdXJyZW50ID0gZmFsc2U7CisKKworLy8gSmF2YVNjcmlw
dENvbnNvbGVNZXNzYWdlcyBlbmNhcHN1bGF0ZSBldmVyeXRoaW5nIG5lZWRlZCB0bworLy8gbG9n
IG1lc3NhZ2VzIG9yaWdpbmF0aW5nIGZyb20gSmF2YVNjcmlwdCB0byB0aGUgQ2hyb21lIGNvbnNv
bGUuCitjbGFzcyBKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UgeworcHVibGljOgorICAgIEphdmFT
Y3JpcHRDb25zb2xlTWVzc2FnZShjb25zdCBTdHJpbmcmIHN0ciwgY29uc3QgU3RyaW5nJiBzb3Vy
Y2VJRCwgdW5zaWduZWQgbGluZU51bWJlcikKKyAgICAgICAgOiBtX3N0cmluZyhzdHIpCisgICAg
ICAgICwgbV9zb3VyY2VJRChzb3VyY2VJRCkKKyAgICAgICAgLCBtX2xpbmVOdW1iZXIobGluZU51
bWJlcikgeyB9CisKKyAgICB2b2lkIEFkZFRvUGFnZShQYWdlKiBwYWdlKSBjb25zdDsKKworcHJp
dmF0ZToKKyAgICBjb25zdCBTdHJpbmcgbV9zdHJpbmc7CisgICAgY29uc3QgU3RyaW5nIG1fc291
cmNlSUQ7CisgICAgY29uc3QgdW5zaWduZWQgbV9saW5lTnVtYmVyOworfTsKKwordm9pZCBKYXZh
U2NyaXB0Q29uc29sZU1lc3NhZ2U6OkFkZFRvUGFnZShQYWdlKiBwYWdlKSBjb25zdAoreworICAg
IEFTU0VSVChwYWdlKTsKKyAgICBDb25zb2xlKiBjb25zb2xlID0gcGFnZS0+bWFpbkZyYW1lKCkt
PmRvbVdpbmRvdygpLT5jb25zb2xlKCk7CisgICAgY29uc29sZS0+YWRkTWVzc2FnZShKU01lc3Nh
Z2VTb3VyY2UsIEVycm9yTWVzc2FnZUxldmVsLCBtX3N0cmluZywgbV9saW5lTnVtYmVyLCBtX3Nv
dXJjZUlEKTsKK30KKworLy8gVGhlIENvbnNvbGVNZXNzYWdlTWFuYWdlciBoYW5kbGVzIGFsbCBj
b25zb2xlIG1lc3NhZ2VzIHRoYXQgc3RlbQorLy8gZnJvbSBKYXZhU2NyaXB0LiBJdCBrZWVwcyBh
IGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCBoYXZlIGJlZW4gZGVsYXllZCBidXQKKy8vIGl0IG1ha2Vz
IHN1cmUgdG8gYWRkIGFsbCBtZXNzYWdlcyB0byB0aGUgY29uc29sZSBpbiB0aGUgcmlnaHQgb3Jk
ZXIuCitjbGFzcyBDb25zb2xlTWVzc2FnZU1hbmFnZXIgeworcHVibGljOgorICAgIC8vIEFkZCBh
IG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUuIE1heSBlbmQgdXAgY2FsbGluZyBKYXZhU2NyaXB0IGNv
ZGUKKyAgICAvLyBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIGluc3BlY3RvciBzbyBvbmx5IGNhbGwg
dGhpcyBmdW5jdGlvbiB3aGVuCisgICAgLy8gaXQgaXMgc2FmZSB0byBkbyBhbGxvY2F0aW9ucy4K
KyAgICBzdGF0aWMgdm9pZCBBZGRNZXNzYWdlKFBhZ2UqIHBhZ2UsIGNvbnN0IEphdmFTY3JpcHRD
b25zb2xlTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAgICAvLyBBZGQgYSBtZXNzYWdlIHRvIHRoZSBj
b25zb2xlIGJ1dCBkZWxheSB0aGUgcmVwb3J0aW5nIHVudGlsIGl0CisgICAgLy8gaXMgc2FmZSB0
byBkbyBzbzogRWl0aGVyIHdoZW4gd2UgbGVhdmUgSmF2YVNjcmlwdCBleGVjdXRpb24gb3IKKyAg
ICAvLyB3aGVuIGFkZGluZyBvdGhlciBjb25zb2xlIG1lc3NhZ2VzLiBUaGUgcHJpbWFyeSBwdXJw
b3NlIG9mIHRoaXMKKyAgICAvLyBtZXRob2QgaXMgdG8gYXZvaWQgY2FsbGluZyBpbnRvIFY4IHRv
IGhhbmRsZSBjb25zb2xlIG1lc3NhZ2VzCisgICAgLy8gd2hlbiB0aGUgVk0gaXMgaW4gYSBzdGF0
ZSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgR0NzIG9yIGFsbG9jYXRpb25zLgorICAgIC8vIERlbGF5
ZWQgbWVzc2FnZXMgYXJlIGFsd2F5cyByZXBvcnRlZCBpbiB0aGUgcGFnZSBjb3JyZXNwb25kaW5n
CisgICAgLy8gdG8gdGhlIGFjdGl2ZSBjb250ZXh0LgorICAgIHN0YXRpYyB2b2lkIEFkZERlbGF5
ZWRNZXNzYWdlKGNvbnN0IEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAg
ICAvLyBQcm9jZXNzIGFueSBkZWxheWVkIG1lc3NhZ2VzLiBNYXkgZW5kIHVwIGNhbGxpbmcgSmF2
YVNjcmlwdCBjb2RlCisgICAgLy8gaW5kaXJlY3RseSB0aHJvdWdoIHRoZSBpbnNwZWN0b3Igc28g
b25seSBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbgorICAgIC8vIGl0IGlzIHNhZmUgdG8gZG8gYWxs
b2NhdGlvbnMuCisgICAgc3RhdGljIHZvaWQgUHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpOworCitw
cml2YXRlOgorICAgIC8vIEFsbCBkZWxheWVkIG1lc3NhZ2VzIGFyZSBzdG9yZWQgaW4gdGhpcyB2
ZWN0b3IuIElmIHRoZSB2ZWN0b3IKKyAgICAvLyBpcyBOVUxMLCB0aGVyZSBhcmUgbm8gZGVsYXll
ZCBtZXNzYWdlcy4KKyAgICBzdGF0aWMgVmVjdG9yPEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZT4q
IG1fZGVsYXllZDsKK307CisKKworVmVjdG9yPEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZT4qIENv
bnNvbGVNZXNzYWdlTWFuYWdlcjo6bV9kZWxheWVkID0gTlVMTDsKKworCit2b2lkIENvbnNvbGVN
ZXNzYWdlTWFuYWdlcjo6QWRkTWVzc2FnZShQYWdlKiBwYWdlLCBjb25zdCBKYXZhU2NyaXB0Q29u
c29sZU1lc3NhZ2UmIG1lc3NhZ2UpCit7CisgICAgLy8gUHJvY2VzcyBhbnkgZGVsYXllZCBtZXNz
YWdlcyB0byBtYWtlIHN1cmUgdGhhdCBtZXNzYWdlcworICAgIC8vIGFwcGVhciBpbiB0aGUgcmln
aHQgb3JkZXIgaW4gdGhlIGNvbnNvbGUuCisgICAgUHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpOwor
ICAgIG1lc3NhZ2UuQWRkVG9QYWdlKHBhZ2UpOworfQorCisKK3ZvaWQgQ29uc29sZU1lc3NhZ2VN
YW5hZ2VyOjpBZGREZWxheWVkTWVzc2FnZShjb25zdCBKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2Um
IG1lc3NhZ2UpCit7CisgICAgaWYgKCFtX2RlbGF5ZWQpIHsKKyAgICAgICAgLy8gQWxsb2NhdGUg
YSB2ZWN0b3IgZm9yIHRoZSBkZWxheWVkIG1lc3NhZ2VzLiBXaWxsIGJlCisgICAgICAgIC8vIGRl
YWxsb2NhdGVkIHdoZW4gdGhlIGRlbGF5ZWQgbWVzc2FnZXMgYXJlIHByb2Nlc3NlZAorICAgICAg
ICAvLyBpbiBQcm9jZXNzRGVsYXllZE1lc3NhZ2VzKCkuCisgICAgICAgIG1fZGVsYXllZCA9IG5l
dyBWZWN0b3I8SmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlPigpOworICAgIH0KKyAgICBtX2RlbGF5
ZWQtPmFwcGVuZChtZXNzYWdlKTsKK30KKworCit2b2lkIENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6
UHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpCit7CisgICAgLy8gSWYgd2UgaGF2ZSBhIGRlbGF5ZWQg
dmVjdG9yIGl0IGNhbm5vdCBiZSBlbXB0eS4KKyAgICBpZiAoIW1fZGVsYXllZCkKKyAgICAgICAg
cmV0dXJuOworICAgIEFTU0VSVCghbV9kZWxheWVkLT5pc0VtcHR5KCkpOworCisgICAgLy8gQWRk
IHRoZSBkZWxheWVkIG1lc3NhZ2VzIHRvIHRoZSBwYWdlIG9mIHRoZSBhY3RpdmUKKyAgICAvLyBj
b250ZXh0LiBJZiB0aGF0IGZvciBzb21lIGJpemFycmUgcmVhc29uIGRvZXMgbm90CisgICAgLy8g
ZXhpc3QsIHdlIGNsZWFyIHRoZSBsaXN0IG9mIGRlbGF5ZWQgbWVzc2FnZXMgdG8gYXZvaWQKKyAg
ICAvLyBwb3N0aW5nIG1lc3NhZ2VzLiBXZSBzdGlsbCBkZWFsbG9jYXRlIHRoZSB2ZWN0b3IuCisg
ICAgRnJhbWUqIGZyYW1lID0gVjhQcm94eTo6cmV0cmlldmVGcmFtZUZvckVudGVyZWRDb250ZXh0
KCk7CisgICAgUGFnZSogcGFnZSA9IE5VTEw7CisgICAgaWYgKGZyYW1lKQorICAgICAgICBwYWdl
ID0gZnJhbWUtPnBhZ2UoKTsKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgIG1fZGVsYXllZC0+Y2xl
YXIoKTsKKworICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIGRlbGF5ZWQgbWVzc2FnZXMg
YW5kIGFkZCB0aGVtCisgICAgLy8gdG8gdGhlIGNvbnNvbGUuCisgICAgY29uc3QgaW50IHNpemUg
PSBtX2RlbGF5ZWQtPnNpemUoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykg
eworICAgICAgICBtX2RlbGF5ZWQtPmF0KGkpLkFkZFRvUGFnZShwYWdlKTsKKyAgICB9CisKKyAg
ICAvLyBEZWFsbG9jYXRlIHRoZSBkZWxheWVkIHZlY3Rvci4KKyAgICBkZWxldGUgbV9kZWxheWVk
OworICAgIG1fZGVsYXllZCA9IE5VTEw7Cit9CisKKworLy8gQ29udmVuaWVuY2UgY2xhc3MgZm9y
IGVuc3VyaW5nIHRoYXQgZGVsYXllZCBtZXNzYWdlcyBpbiB0aGUKKy8vIENvbnNvbGVNZXNzYWdl
TWFuYWdlciBhcmUgcHJvY2Vzc2VkIHF1aWNrbHkuCitjbGFzcyBDb25zb2xlTWVzc2FnZVNjb3Bl
IHsKK3B1YmxpYzoKKyAgICBDb25zb2xlTWVzc2FnZVNjb3BlKCkgeyBDb25zb2xlTWVzc2FnZU1h
bmFnZXI6OlByb2Nlc3NEZWxheWVkTWVzc2FnZXMoKTsgfQorICAgIH5Db25zb2xlTWVzc2FnZVNj
b3BlKCkgeyBDb25zb2xlTWVzc2FnZU1hbmFnZXI6OlByb2Nlc3NEZWxheWVkTWVzc2FnZXMoKTsg
fQorfTsKKwordm9pZCBsb2dfaW5mbyhGcmFtZSogZnJhbWUsIGNvbnN0IFN0cmluZyYgbXNnLCBj
b25zdCBTdHJpbmcmIHVybCkKK3sKKyAgICBQYWdlKiBwYWdlID0gZnJhbWUtPnBhZ2UoKTsKKyAg
ICBpZiAoIXBhZ2UpCisgICAgICAgIHJldHVybjsKKyAgICBKYXZhU2NyaXB0Q29uc29sZU1lc3Nh
Z2UgbWVzc2FnZShtc2csIHVybCwgMCk7CisgICAgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjpBZGRN
ZXNzYWdlKHBhZ2UsIG1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZCBIYW5kbGVDb25zb2xlTWVz
c2FnZSh2ODo6SGFuZGxlPHY4OjpNZXNzYWdlPiBtZXNzYWdlLCB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gZGF0YSkKK3sKKyAgICAvLyBVc2UgdGhlIGZyYW1lIHdoZXJlIEphdmFTY3JpcHQgaXMgY2Fs
bGVkIGZyb20uCisgICAgRnJhbWUqIGZyYW1lID0gVjhQcm94eTo6cmV0cmlldmVGcmFtZUZvckVu
dGVyZWRDb250ZXh0KCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
UGFnZSogcGFnZSA9IGZyYW1lLT5wYWdlKCk7CisgICAgaWYgKCFwYWdlKQorICAgICAgICByZXR1
cm47CisKKyAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IGVycm9yTWVzc2FnZVN0cmluZyA9IG1l
c3NhZ2UtPkdldCgpOworICAgIEFTU0VSVCghZXJyb3JNZXNzYWdlU3RyaW5nLklzRW1wdHkoKSk7
CisgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IFRvV2ViQ29yZVN0cmluZyhlcnJvck1lc3NhZ2VT
dHJpbmcpOworCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJlc291cmNlTmFtZSA9IG1lc3Nh
Z2UtPkdldFNjcmlwdFJlc291cmNlTmFtZSgpOworICAgIGJvb2wgdXNlVVJMID0gKHJlc291cmNl
TmFtZS5Jc0VtcHR5KCkgfHwgIXJlc291cmNlTmFtZS0+SXNTdHJpbmcoKSk7CisgICAgU3RyaW5n
IHJlc291cmNlTmFtZVN0cmluZyA9ICh1c2VVUkwpID8gZnJhbWUtPmRvY3VtZW50KCktPnVybCgp
IDogVG9XZWJDb3JlU3RyaW5nKHJlc291cmNlTmFtZSk7CisgICAgSmF2YVNjcmlwdENvbnNvbGVN
ZXNzYWdlIGNvbnNvbGVNZXNzYWdlKGVycm9yTWVzc2FnZSwgcmVzb3VyY2VOYW1lU3RyaW5nLCBt
ZXNzYWdlLT5HZXRMaW5lTnVtYmVyKCkpOworICAgIENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6QWRk
TWVzc2FnZShwYWdlLCBjb25zb2xlTWVzc2FnZSk7Cit9CisKKworZW51bSBEZWxheVJlcG9ydGlu
ZyB7CisgICAgUkVQT1JUX0xBVEVSLAorICAgIFJFUE9SVF9OT1cKK307CisKKworc3RhdGljIHZv
aWQgUmVwb3J0VW5zYWZlQWNjZXNzVG8oRnJhbWUqIHRhcmdldCwgRGVsYXlSZXBvcnRpbmcgZGVs
YXkpCit7CisgICAgQVNTRVJUKHRhcmdldCk7CisgICAgRG9jdW1lbnQqIHRhcmdldERvY3VtZW50
ID0gdGFyZ2V0LT5kb2N1bWVudCgpOworICAgIGlmICghdGFyZ2V0RG9jdW1lbnQpCisgICAgICAg
IHJldHVybjsKKworICAgIEZyYW1lKiBzb3VyY2UgPSBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lRm9y
RW50ZXJlZENvbnRleHQoKTsKKyAgICBpZiAoIXNvdXJjZSB8fCAhc291cmNlLT5kb2N1bWVudCgp
KQorICAgICAgICByZXR1cm47ICAvLyBJZ25vcmUgZXJyb3IgaWYgdGhlIHNvdXJjZSBkb2N1bWVu
dCBpcyBnb25lLgorCisgICAgRG9jdW1lbnQqIHNvdXJjZURvY3VtZW50ID0gc291cmNlLT5kb2N1
bWVudCgpOworCisgICAgLy8gRklYTUU6IFRoaXMgZXJyb3IgbWVzc2FnZSBzaG91bGQgY29udGFp
biBtb3JlIHNwZWNpZmljcyBvZiB3aHkgdGhlIHNhbWUKKyAgICAvLyBvcmlnaW4gY2hlY2sgaGFz
IGZhaWxlZC4KKyAgICBTdHJpbmcgc3RyID0gU3RyaW5nOjpmb3JtYXQoIlVuc2FmZSBKYXZhU2Ny
aXB0IGF0dGVtcHQgdG8gYWNjZXNzIGZyYW1lICIKKyAgICAgICAgIndpdGggVVJMICVzIGZyb20g
ZnJhbWUgd2l0aCBVUkwgJXMuICIKKyAgICAgICAgIkRvbWFpbnMsIHByb3RvY29scyBhbmQgcG9y
dHMgbXVzdCBtYXRjaC5cbiIsCisgICAgICAgIHRhcmdldERvY3VtZW50LT51cmwoKS5zdHJpbmco
KS51dGY4KCkuZGF0YSgpLAorICAgICAgICBzb3VyY2VEb2N1bWVudC0+dXJsKCkuc3RyaW5nKCku
dXRmOCgpLmRhdGEoKSk7CisKKyAgICAvLyBCdWlsZCBhIGNvbnNvbGUgbWVzc2FnZSB3aXRoIGZh
a2Ugc291cmNlIElEIGFuZCBsaW5lIG51bWJlci4KKyAgICBjb25zdCBTdHJpbmcga1NvdXJjZUlE
ID0gIiI7CisgICAgY29uc3QgaW50IGtMaW5lTnVtYmVyID0gMTsKKyAgICBKYXZhU2NyaXB0Q29u
c29sZU1lc3NhZ2UgbWVzc2FnZShzdHIsIGtTb3VyY2VJRCwga0xpbmVOdW1iZXIpOworCisgICAg
aWYgKGRlbGF5ID09IFJFUE9SVF9OT1cpIHsKKyAgICAgICAgLy8gTk9URSh0Yyk6IEFwcGxlIHBy
aW50cyB0aGUgbWVzc2FnZSBpbiB0aGUgdGFyZ2V0IHBhZ2UsIGJ1dCBpdCBzZWVtcyBsaWtlCisg
ICAgICAgIC8vIGl0IHNob3VsZCBiZSBpbiB0aGUgc291cmNlIHBhZ2UuIEV2ZW4gZm9yIGRlbGF5
ZWQgbWVzc2FnZXMsIHdlIHB1dCBpdCBpbgorICAgICAgICAvLyB0aGUgc291cmNlIHBhZ2U7IHNl
ZSBDb25zb2xlTWVzc2FnZU1hbmFnZXI6OlByb2Nlc3NEZWxheWVkTWVzc2FnZXMoKS4KKyAgICAg
ICAgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjpBZGRNZXNzYWdlKHNvdXJjZS0+cGFnZSgpLCBtZXNz
YWdlKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVChkZWxheSA9PSBSRVBPUlRfTEFU
RVIpOworICAgICAgICAvLyBXZSBjYW5ub3Qgc2FmZWx5IHJlcG9ydCB0aGUgbWVzc2FnZSBlYWdl
cmx5LCBiZWNhdXNlIHRoaXMgbWF5IGNhdXNlCisgICAgICAgIC8vIGFsbG9jYXRpb25zIGFuZCBH
Q3MgaW50ZXJuYWxseSBpbiBWOCBhbmQgd2UgY2Fubm90IGhhbmRsZSB0aGF0IGF0IHRoaXMKKyAg
ICAgICAgLy8gcG9pbnQuIFRoZXJlZm9yZSB3ZSBkZWxheSB0aGUgcmVwb3J0aW5nLgorICAgICAg
ICBDb25zb2xlTWVzc2FnZU1hbmFnZXI6OkFkZERlbGF5ZWRNZXNzYWdlKG1lc3NhZ2UpOworICAg
IH0KK30KKworc3RhdGljIHZvaWQgUmVwb3J0VW5zYWZlSmF2YVNjcmlwdEFjY2Vzcyh2ODo6TG9j
YWw8djg6Ok9iamVjdD4gaG9zdCwgdjg6OkFjY2Vzc1R5cGUgdHlwZSwgdjg6OkxvY2FsPHY4OjpW
YWx1ZT4gZGF0YSkKK3sKKyAgICBGcmFtZSogdGFyZ2V0ID0gVjhDdXN0b206OkdldFRhcmdldEZy
YW1lKGhvc3QsIGRhdGEpOworICAgIGlmICh0YXJnZXQpCisgICAgICAgIFJlcG9ydFVuc2FmZUFj
Y2Vzc1RvKHRhcmdldCwgUkVQT1JUX0xBVEVSKTsKK30KKworc3RhdGljIHZvaWQgSGFuZGxlRmF0
YWxFcnJvckluVjgoKQoreworICAgIC8vIFRPRE86IFdlIHRlbXBvcmFyaWx5IGRlYWwgd2l0aCBW
OCBpbnRlcm5hbCBlcnJvciBzaXR1YXRpb25zCisgICAgLy8gc3VjaCBhcyBvdXQtb2YtbWVtb3J5
IGJ5IGNyYXNoaW5nIHRoZSByZW5kZXJlci4KKyAgICBDUkFTSCgpOworfQorCitzdGF0aWMgdm9p
ZCBSZXBvcnRGYXRhbEVycm9ySW5WOChjb25zdCBjaGFyKiBsb2NhdGlvbiwgY29uc3QgY2hhciog
bWVzc2FnZSkKK3sKKyAgICAvLyBWOCBpcyBzaHV0ZG93biwgd2UgY2Fubm90IHVzZSBWOCBhcGku
CisgICAgLy8gVGhlIG9ubHkgdGhpbmcgd2UgY2FuIGRvIGlzIHRvIGRpc2FibGUgSmF2YVNjcmlw
dC4KKyAgICAvLyBUT0RPOiBjbGVhbiB1cCBWOFByb3h5IGFuZCBkaXNhYmxlIEphdmFTY3JpcHQu
CisgICAgcHJpbnRmKCJWOCBlcnJvcjogJXMgKCVzKVxuIiwgbWVzc2FnZSwgbG9jYXRpb24pOwor
ICAgIEhhbmRsZUZhdGFsRXJyb3JJblY4KCk7Cit9CisKK1Y4UHJveHk6On5WOFByb3h5KCkKK3sK
KyAgICBjbGVhckZvckNsb3NlKCk7CisgICAgRGVzdHJveUdsb2JhbCgpOworfQorCit2b2lkIFY4
UHJveHk6OkRlc3Ryb3lHbG9iYWwoKQoreworICAgIGlmICghbV9nbG9iYWwuSXNFbXB0eSgpKSB7
CisjaWZuZGVmIE5ERUJVRworICAgICAgICBVbnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMsIG1f
Z2xvYmFsKTsKKyNlbmRpZgorICAgICAgICBtX2dsb2JhbC5EaXNwb3NlKCk7CisgICAgICAgIG1f
Z2xvYmFsLkNsZWFyKCk7CisgICAgfQorfQorCisKK2Jvb2wgVjhQcm94eTo6RE9NT2JqZWN0SGFz
SlNXcmFwcGVyKHZvaWQqIG9iaikgeworICByZXR1cm4gZ2V0RE9NT2JqZWN0TWFwKCkuY29udGFp
bnMob2JqKSB8fCBnZXRBY3RpdmVET01PYmplY3RNYXAoKS5jb250YWlucyhvYmopOworfQorCisK
Ky8vIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGluY3JlYXNlZCBvYmoncyByZWYgY291bnQuCit2b2lk
IFY4UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU9iamVjdCh2b2lkKiBvYmosIHY4OjpQZXJzaXN0
ZW50PHY4OjpPYmplY3Q+IHdyYXBwZXIpCit7CisgICAgQVNTRVJUKE1heWJlRE9NV3JhcHBlcih3
cmFwcGVyKSk7CisjaWZuZGVmIE5ERUJVRworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlw
ZSB0eXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUod3JhcHBlcik7CisgICAgc3dpdGNo
ICh0eXBlKSB7CisjZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBOQU1FKSBjYXNlIFY4Q2xhc3NJbmRl
eDo6VFlQRToKKyAgICAgICAgQUNUSVZFX0RPTV9PQkpFQ1RfVFlQRVMoTUFLRV9DQVNFKQorICAg
ICAgICBBU1NFUlQoZmFsc2UpOworI3VuZGVmIE1BS0VfQ0FTRQorICAgIGRlZmF1bHQ6CisgICAg
ICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorICAgIGdldERPTU9iamVjdE1hcCgpLnNldChvYmos
IHdyYXBwZXIpOworfQorCisvLyBUaGUgY2FsbGVyIG11c3QgaGF2ZSBpbmNyZWFzZWQgb2JqJ3Mg
cmVmIGNvdW50Lgordm9pZCBWOFByb3h5OjpTZXRKU1dyYXBwZXJGb3JBY3RpdmVET01PYmplY3Qo
dm9pZCogb2JqLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiB3cmFwcGVyKQoreworICAgIEFT
U0VSVChNYXliZURPTVdyYXBwZXIod3JhcHBlcikpOworI2lmbmRlZiBOREVCVUcKKyAgICBWOENs
YXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IFY4UHJveHk6OkdldERPTVdyYXBwZXJUeXBl
KHdyYXBwZXIpOworICAgIHN3aXRjaCAodHlwZSkgeworI2RlZmluZSBNQUtFX0NBU0UoVFlQRSwg
TkFNRSkgY2FzZSBWOENsYXNzSW5kZXg6OlRZUEU6IGJyZWFrOworICAgICAgQUNUSVZFX0RPTV9P
QkpFQ1RfVFlQRVMoTUFLRV9DQVNFKQorICAgICAgZGVmYXVsdDogQVNTRVJUKGZhbHNlKTsKKyN1
bmRlZiBNQUtFX0NBU0UKKyAgICB9CisjZW5kaWYKKyAgICBnZXRBY3RpdmVET01PYmplY3RNYXAo
KS5zZXQob2JqLCB3cmFwcGVyKTsKK30KKworLy8gVGhlIGNhbGxlciBtdXN0IGhhdmUgaW5jcmVh
c2VkIG5vZGUncyByZWYgY291bnQuCit2b2lkIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU5v
ZGUoTm9kZSogbm9kZSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gd3JhcHBlcikKK3sKKyAg
ICBBU1NFUlQoTWF5YmVET01XcmFwcGVyKHdyYXBwZXIpKTsKKyAgICBnZXRET01Ob2RlTWFwKCku
c2V0KG5vZGUsIHdyYXBwZXIpOworfQorCisvLyBFdmVudCBsaXN0ZW5lcnMKKworc3RhdGljIFY4
RXZlbnRMaXN0ZW5lciogRmluZEV2ZW50TGlzdGVuZXJJbkxpc3QoVjhFdmVudExpc3RlbmVyTGlz
dCYgbGlzdCwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gbGlzdGVuZXIsIGJvb2wgaXNJbmxpbmUpCit7
CisgICAgQVNTRVJUKHY4OjpDb250ZXh0OjpJbkNvbnRleHQoKSk7CisKKyAgICBpZiAoIWxpc3Rl
bmVyLT5Jc09iamVjdCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBsaXN0LmZp
bmQobGlzdGVuZXItPlRvT2JqZWN0KCksIGlzSW5saW5lKTsKK30KKworLy8gRmluZCBhbiBleGlz
dGluZyB3cmFwcGVyIGZvciBhIEpTIGV2ZW50IGxpc3RlbmVyIGluIHRoZSBtYXAuCitQYXNzUmVm
UHRyPFY4RXZlbnRMaXN0ZW5lcj4gVjhQcm94eTo6RmluZFY4RXZlbnRMaXN0ZW5lcih2ODo6TG9j
YWw8djg6OlZhbHVlPiBsaXN0ZW5lciwgYm9vbCBpc0lubGluZSkKK3sKKyAgICByZXR1cm4gRmlu
ZEV2ZW50TGlzdGVuZXJJbkxpc3QobV9ldmVudExpc3RlbmVycywgbGlzdGVuZXIsIGlzSW5saW5l
KTsKK30KKworUGFzc1JlZlB0cjxWOEV2ZW50TGlzdGVuZXI+IFY4UHJveHk6OkZpbmRPckNyZWF0
ZVY4RXZlbnRMaXN0ZW5lcih2ODo6TG9jYWw8djg6OlZhbHVlPiBvYmosIGJvb2wgaXNJbmxpbmUp
Cit7CisgICAgQVNTRVJUKHY4OjpDb250ZXh0OjpJbkNvbnRleHQoKSk7CisKKyAgICBpZiAoIW9i
ai0+SXNPYmplY3QoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBWOEV2ZW50TGlzdGVuZXIq
IHdyYXBwZXIgPSBGaW5kRXZlbnRMaXN0ZW5lckluTGlzdChtX2V2ZW50TGlzdGVuZXJzLCBvYmos
IGlzSW5saW5lKTsKKyAgICBpZiAod3JhcHBlcikKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisK
KyAgICAvLyBDcmVhdGUgYSBuZXcgb25lLCBhbmQgYWRkIHRvIGNhY2hlLgorICAgIFJlZlB0cjxW
OEV2ZW50TGlzdGVuZXI+IG5ld0xpc3RlbmVyID0gVjhFdmVudExpc3RlbmVyOjpjcmVhdGUobV9m
cmFtZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpDYXN0KG9iaiksIGlzSW5saW5lKTsKKyAgICBt
X2V2ZW50TGlzdGVuZXJzLmFkZChuZXdMaXN0ZW5lci5nZXQoKSk7CisKKyAgICByZXR1cm4gbmV3
TGlzdGVuZXI7Cit9CisKKworLy8gT2JqZWN0IGV2ZW50IGxpc3RlbmVycyAoc3VjaCBhcyBYbWxI
dHRwUmVxdWVzdCBhbmQgTWVzc2FnZVBvcnQpIGFyZQorLy8gZGlmZmVyZW50IGZyb20gbGlzdGVu
ZXJzIG9uIERPTSBub2Rlcy4gQW4gb2JqZWN0IGV2ZW50IGxpc3RlbmVyIHdyYXBwZXIKKy8vIG9u
bHkgaG9sZHMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgSlMgZnVuY3Rpb24uIEEgc3Ryb25nIHJl
ZmVyZW5jZSBjYW4KKy8vIGNyZWF0ZSBhIGN5Y2xlLgorLy8KKy8vIFRoZSBsaWZldGltZSBvZiB0
aGVzZSBvYmplY3RzIGlzIGJvdW5kZWQgYnkgdGhlIGxpZmUgdGltZSBvZiBpdHMgSlMKKy8vIHdy
YXBwZXIuIFNvIHdlIGNhbiBjcmVhdGUgYSBoaWRkZW4gcmVmZXJlbmNlIGZyb20gdGhlIEpTIHdy
YXBwZXIgdG8KKy8vIHRvIGl0cyBKUyBmdW5jdGlvbi4KKy8vCisvLyAgICAgICAgICAgICAgICAg
ICAgICAgICAgKG1hcCkKKy8vICAgICAgICAgICAgICBYSFIgICAgICA8LS0tLS0tLS0tLSAgSlNf
d3JhcHBlcgorLy8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgIChoaWRkZW4pIDogIF4KKy8v
ICAgICAgICAgICAgICAgViAgICAgICAgICAgICAgICAgICAgICBWICA6IChtYXkgcmVhY2hhYmxl
IGJ5IGNsb3N1cmUpCisvLyAgICAgICAgICAgVjhfbGlzdGVuZXIgIC0tLS0tLS0tPiBKU19mdW5j
dGlvbgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgKHdlYWspICA8LS0gbWF5IGNyZWF0ZSBh
IGN5Y2xlIGlmIGl0IGlzIHN0cm9uZworLy8KKy8vIFRoZSBwZXJzaXN0ZW50IHJlZmVyZW5jZSBp
cyBtYWRlIHdlYWsgaW4gdGhlIGNvbnN0cnVjdG9yCisvLyBvZiBWOE9iamVjdEV2ZW50TGlzdGVu
ZXIuCisKK1Bhc3NSZWZQdHI8VjhFdmVudExpc3RlbmVyPiBWOFByb3h5OjpGaW5kT2JqZWN0RXZl
bnRMaXN0ZW5lciggdjg6OkxvY2FsPHY4OjpWYWx1ZT4gbGlzdGVuZXIsIGJvb2wgaXNJbmxpbmUp
Cit7CisgICAgcmV0dXJuIEZpbmRFdmVudExpc3RlbmVySW5MaXN0KG1feGhyTGlzdGVuZXJzLCBs
aXN0ZW5lciwgaXNJbmxpbmUpOworfQorCisKK1Bhc3NSZWZQdHI8VjhFdmVudExpc3RlbmVyPiBW
OFByb3h5OjpGaW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6VmFs
dWU+IG9iaiwgYm9vbCBpc0lubGluZSkKK3sKKyAgICBBU1NFUlQodjg6OkNvbnRleHQ6OkluQ29u
dGV4dCgpKTsKKworICAgIGlmICghb2JqLT5Jc09iamVjdCgpKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIFY4RXZlbnRMaXN0ZW5lciogd3JhcHBlciA9IEZpbmRFdmVudExpc3RlbmVySW5MaXN0
KG1feGhyTGlzdGVuZXJzLCBvYmosIGlzSW5saW5lKTsKKyAgICBpZiAod3JhcHBlcikKKyAgICAg
ICAgcmV0dXJuIHdyYXBwZXI7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgb25lLCBhbmQgYWRkIHRv
IGNhY2hlLgorICAgIFJlZlB0cjxWOEV2ZW50TGlzdGVuZXI+IG5ld0xpc3RlbmVyID0gVjhPYmpl
Y3RFdmVudExpc3RlbmVyOjpjcmVhdGUobV9mcmFtZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpD
YXN0KG9iaiksIGlzSW5saW5lKTsKKyAgICBtX3hockxpc3RlbmVycy5hZGQobmV3TGlzdGVuZXIu
Z2V0KCkpOworCisgICAgcmV0dXJuIG5ld0xpc3RlbmVyLnJlbGVhc2UoKTsKK30KKworCitzdGF0
aWMgdm9pZCBSZW1vdmVFdmVudExpc3RlbmVyRnJvbUxpc3QoVjhFdmVudExpc3RlbmVyTGlzdCYg
bGlzdCwgVjhFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikKK3sKKyAgICBsaXN0LnJlbW92ZShsaXN0
ZW5lcik7Cit9CisKKwordm9pZCBWOFByb3h5OjpSZW1vdmVWOEV2ZW50TGlzdGVuZXIoVjhFdmVu
dExpc3RlbmVyKiBsaXN0ZW5lcikKK3sKKyAgICBSZW1vdmVFdmVudExpc3RlbmVyRnJvbUxpc3Qo
bV9ldmVudExpc3RlbmVycywgbGlzdGVuZXIpOworfQorCisKK3ZvaWQgVjhQcm94eTo6UmVtb3Zl
T2JqZWN0RXZlbnRMaXN0ZW5lcihWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKQorewor
ICAgIFJlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTGlzdChtX3hockxpc3RlbmVycywgbGlzdGVuZXIp
OworfQorCisKK3N0YXRpYyB2b2lkIERpc2Nvbm5lY3RFdmVudExpc3RlbmVyc0luTGlzdChWOEV2
ZW50TGlzdGVuZXJMaXN0JiBsaXN0KQoreworICAgIFY4RXZlbnRMaXN0ZW5lckxpc3Q6Oml0ZXJh
dG9yIHAgPSBsaXN0LmJlZ2luKCk7CisgICAgd2hpbGUgKHAgIT0gbGlzdC5lbmQoKSkgeworICAg
ICAgICAoKnApLT5kaXNjb25uZWN0RnJhbWUoKTsKKyAgICAgICAgKytwOworICAgIH0KKyAgICBs
aXN0LmNsZWFyKCk7Cit9CisKKwordm9pZCBWOFByb3h5OjpEaXNjb25uZWN0RXZlbnRMaXN0ZW5l
cnMoKQoreworICAgIERpc2Nvbm5lY3RFdmVudExpc3RlbmVyc0luTGlzdChtX2V2ZW50TGlzdGVu
ZXJzKTsKKyAgICBEaXNjb25uZWN0RXZlbnRMaXN0ZW5lcnNJbkxpc3QobV94aHJMaXN0ZW5lcnMp
OworfQorCisKK3Y4OjpIYW5kbGU8djg6OlNjcmlwdD4gVjhQcm94eTo6Q29tcGlsZVNjcmlwdCh2
ODo6SGFuZGxlPHY4OjpTdHJpbmc+IGNvZGUsIGNvbnN0IFN0cmluZyYgZmlsZU5hbWUsIGludCBi
YXNlTGluZSkKK3sKKyAgICBjb25zdCB1aW50MTZfdCogZmlsZU5hbWVTdHJpbmcgPSBGcm9tV2Vi
Q29yZVN0cmluZyhmaWxlTmFtZSk7CisgICAgdjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBuYW1lID0g
djg6OlN0cmluZzo6TmV3KGZpbGVOYW1lU3RyaW5nLCBmaWxlTmFtZS5sZW5ndGgoKSk7CisgICAg
djg6OkhhbmRsZTx2ODo6SW50ZWdlcj4gbGluZSA9IHY4OjpJbnRlZ2VyOjpOZXcoYmFzZUxpbmUp
OworICAgIHY4OjpTY3JpcHRPcmlnaW4gb3JpZ2luKG5hbWUsIGxpbmUpOworICAgIHY4OjpIYW5k
bGU8djg6OlNjcmlwdD4gc2NyaXB0ID0gdjg6OlNjcmlwdDo6Q29tcGlsZShjb2RlLCAmb3JpZ2lu
KTsKKyAgICByZXR1cm4gc2NyaXB0OworfQorCitib29sIFY4UHJveHk6OkhhbmRsZU91dE9mTWVt
b3J5KCkKK3sKKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2ODo6Q29udGV4
dDo6R2V0Q3VycmVudCgpOworCisgICAgaWYgKCFjb250ZXh0LT5IYXNPdXRPZk1lbW9yeUV4Y2Vw
dGlvbigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBXYXJuaW5nLCBlcnJvciwg
ZGlzYWJsZSBKUyBmb3IgdGhpcyBmcmFtZT8KKyAgICBGcmFtZSogZnJhbWUgPSBWOFByb3h5Ojpy
ZXRyaWV2ZUZyYW1lKGNvbnRleHQpOworCisgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5Ojpy
ZXRyaWV2ZShmcmFtZSk7CisgICAgaWYgKHByb3h5ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gQ2xl
YW4gbV9jb250ZXh0LCBhbmQgZXZlbnQgaGFuZGxlcnMuCisgICAgICAgIHByb3h5LT5jbGVhckZv
ckNsb3NlKCk7CisgICAgICAgIC8vIERlc3Ryb3kgdGhlIGdsb2JhbCBvYmplY3QuCisgICAgICAg
IHByb3h5LT5EZXN0cm95R2xvYmFsKCk7CisgICAgfQorCisgICAgQ2hyb21pdW1CcmlkZ2U6Om5v
dGlmeUpTT3V0T2ZNZW1vcnkoZnJhbWUpOworCisgICAgLy8gRGlzYWJsZSBKUy4KKyAgICBTZXR0
aW5ncyogc2V0dGluZ3MgPSBmcmFtZS0+c2V0dGluZ3MoKTsKKyAgICBBU1NFUlQoc2V0dGluZ3Mp
OworICAgIHNldHRpbmdzLT5zZXRKYXZhU2NyaXB0RW5hYmxlZChmYWxzZSk7CisKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKwordm9pZCBWOFByb3h5OjpldmFsdWF0ZUluTmV3Q29udGV4dChjb25zdCBW
ZWN0b3I8U2NyaXB0U291cmNlQ29kZT4mIHNvdXJjZXMpCit7CisgICAgSW5pdENvbnRleHRJZk5l
ZWRlZCgpOworCisgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworCisgICAgLy8gU2V0
IHVwIHRoZSBET00gd2luZG93IGFzIHRoZSBwcm90b3R5cGUgb2YgdGhlIG5ldyBnbG9iYWwgb2Jq
ZWN0LgorICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IHdpbmRvd0NvbnRleHQgPSBtX2NvbnRl
eHQ7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3aW5kb3dHbG9iYWwgPSB3aW5kb3dDb250
ZXh0LT5HbG9iYWwoKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd2luZG93V3JhcHBlciA9
IFY4UHJveHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIHdpbmRv
d0dsb2JhbCk7CisKKyAgICBBU1NFUlQoVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0aXZlPERPTVdp
bmRvdz4od2luZG93V3JhcHBlcikgPT0gbV9mcmFtZS0+ZG9tV2luZG93KCkpOworCisgICAgdjg6
OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBjcmVhdGVOZXdDb250ZXh0KHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4oKSk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRTY29w
ZShjb250ZXh0KTsKKworICAgIC8vIFNldHVwIGNvbnRleHQgaWQgZm9yIEpTIGRlYnVnZ2VyLgor
ICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gY29udGV4dF9kYXRhID0gdjg6Ok9iamVjdDo6TmV3
KCk7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdpbmRvd19jb250ZXh0X2RhdGEgPSB3aW5k
b3dDb250ZXh0LT5HZXREYXRhKCk7CisgICAgaWYgKHdpbmRvd19jb250ZXh0X2RhdGEtPklzT2Jq
ZWN0KCkpIHsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBwcm9wZXJ0eV9uYW1lID0g
djg6OlN0cmluZzo6TmV3KGtDb250ZXh0RGVidWdEYXRhVmFsdWUpOworICAgICAgICBjb250ZXh0
X2RhdGEtPlNldChwcm9wZXJ0eV9uYW1lLCB2ODo6T2JqZWN0OjpDYXN0KCp3aW5kb3dfY29udGV4
dF9kYXRhKS0+R2V0KHByb3BlcnR5X25hbWUpKTsKKyAgICB9CisgICAgY29udGV4dF9kYXRhLT5T
ZXQodjg6OlN0cmluZzo6TmV3KGtDb250ZXh0RGVidWdEYXRhVHlwZSksIHY4OjpTdHJpbmc6Ok5l
dygiaW5qZWN0ZWQiKSk7CisgICAgY29udGV4dC0+U2V0RGF0YShjb250ZXh0X2RhdGEpOworCisg
ICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwgPSBjb250ZXh0LT5HbG9iYWwoKTsKKwor
ICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gaW1wbGljaXRQcm90b1N0cmluZyA9IHY4OjpTdHJp
bmc6Ok5ldygiX19wcm90b19fIik7CisgICAgZ2xvYmFsLT5TZXQoaW1wbGljaXRQcm90b1N0cmlu
Zywgd2luZG93V3JhcHBlcik7CisKKyAgICAvLyBHaXZlIHRoZSBjb2RlIHJ1bm5pbmcgaW4gdGhl
IG5ldyBjb250ZXh0IGEgd2F5IHRvIGdldCBhY2Nlc3MgdG8gdGhlCisgICAgLy8gb3JpZ2luYWwg
Y29udGV4dC4KKyAgICBnbG9iYWwtPlNldCh2ODo6U3RyaW5nOjpOZXcoImNvbnRlbnRXaW5kb3ci
KSwgd2luZG93R2xvYmFsKTsKKworICAgIC8vIFJ1biBjb2RlIGluIHRoZSBuZXcgY29udGV4dC4K
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNvdXJjZXMuc2l6ZSgpOyArK2kpCisgICAgICAg
IGV2YWx1YXRlKHNvdXJjZXNbaV0sIDApOworCisgICAgLy8gVXNpbmcgdGhlIGRlZmF1bHQgc2Vj
dXJpdHkgdG9rZW4gbWVhbnMgdGhhdCB0aGUgY2FuQWNjZXNzIGlzIGFsd2F5cworICAgIC8vIGNh
bGxlZCwgd2hpY2ggaXMgc2xvdy4KKyAgICAvLyBUT0RPKGFhKTogVXNlIHRva2VucyB3aGVyZSBw
b3NzaWJsZS4gVGhpcyB3aWxsIG1lYW4ga2VlcGluZyB0cmFjayBvZiBhbGwKKyAgICAvLyBjcmVh
dGVkIGNvbnRleHRzIHNvIHRoYXQgdGhleSBjYW4gYWxsIGJlIHVwZGF0ZWQgd2hlbiB0aGUgZG9j
dW1lbnQgZG9tYWluCisgICAgLy8gY2hhbmdlcy4KKyAgICBjb250ZXh0LT5Vc2VEZWZhdWx0U2Vj
dXJpdHlUb2tlbigpOworICAgIGNvbnRleHQuRGlzcG9zZSgpOworfQorCit2ODo6TG9jYWw8djg6
OlZhbHVlPiBWOFByb3h5OjpldmFsdWF0ZShjb25zdCBTY3JpcHRTb3VyY2VDb2RlJiBzb3VyY2Us
IE5vZGUqIG4pCit7CisgICAgQVNTRVJUKHY4OjpDb250ZXh0OjpJbkNvbnRleHQoKSk7CisKKyAg
ICAvLyBDb21waWxlIHRoZSBzY3JpcHQuCisgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGNvZGUg
PSB2OEV4dGVybmFsU3RyaW5nKHNvdXJjZS5zb3VyY2UoKSk7CisgICAgQ2hyb21pdW1CcmlkZ2U6
OnRyYWNlRXZlbnRCZWdpbigidjguY29tcGlsZSIsIG4sICIiKTsKKworICAgIC8vIE5PVEU6IEZv
ciBjb21wYXRpYmlsaXR5IHdpdGggV2ViQ29yZSwgU2NyaXB0U291cmNlQ29kZSdzIGxpbmUgc3Rh
cnRzIGF0CisgICAgLy8gMSwgd2hlcmVhcyB2OCBzdGFydHMgYXQgMC4KKyAgICB2ODo6SGFuZGxl
PHY4OjpTY3JpcHQ+IHNjcmlwdCA9IENvbXBpbGVTY3JpcHQoY29kZSwgc291cmNlLnVybCgpLCBz
b3VyY2Uuc3RhcnRMaW5lKCkgLSAxKTsKKyAgICBDaHJvbWl1bUJyaWRnZTo6dHJhY2VFdmVudEVu
ZCgidjguY29tcGlsZSIsIG4sICIiKTsKKworICAgIENocm9taXVtQnJpZGdlOjp0cmFjZUV2ZW50
QmVnaW4oInY4LnJ1biIsIG4sICIiKTsKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQ7
CisgICAgeworICAgICAgICAvLyBJc29sYXRlIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciB3aGVuIGV4
ZWN1dGluZyB0aGUgY29kZS4gIFRoZXNlCisgICAgICAgIC8vIGV4Y2VwdGlvbnMgc2hvdWxkIG5v
dCBpbnRlcmZlcmUgd2l0aCBqYXZhc2NyaXB0IGNvZGUgd2UgbWlnaHQKKyAgICAgICAgLy8gZXZh
bHVhdGUgZnJvbSBDKysgd2hlbiByZXR1cm5pbmcgZnJvbSBoZXJlCisgICAgICAgIHY4OjpUcnlD
YXRjaCB0cnlDYXRjaDsKKyAgICAgICAgdHJ5Q2F0Y2guU2V0VmVyYm9zZSh0cnVlKTsKKworICAg
ICAgICAvLyBTZXQgaW5saW5lQ29kZSB0byB0cnVlIGZvciA8YSBocmVmPSJqYXZhc2NyaXB0OmRv
U29tZXRoaW5nKCkiPgorICAgICAgICAvLyBhbmQgZmFsc2UgZm9yIDxzY3JpcHQ+ZG9Tb21ldGhp
bmc8L3NjcmlwdD4uIFdlIG1ha2UgYSByb3VnaCBndWVzcyBhdAorICAgICAgICAvLyB0aGlzIGJh
c2VkIG9uIHdoZXRoZXIgdGhlIHNjcmlwdCBzb3VyY2UgaGFzIGEgVVJMLgorICAgICAgICByZXN1
bHQgPSBSdW5TY3JpcHQoc2NyaXB0LCBzb3VyY2UudXJsKCkuc3RyaW5nKCkuaXNOdWxsKCkpOwor
ICAgIH0KKyAgICBDaHJvbWl1bUJyaWRnZTo6dHJhY2VFdmVudEVuZCgidjgucnVuIiwgbiwgIiIp
OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFY4UHJveHk6
OlJ1blNjcmlwdCh2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IHNjcmlwdCwgYm9vbCBpc0lubGluZUNv
ZGUpCit7CisgICAgaWYgKHNjcmlwdC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBub3RIYW5k
bGVkQnlJbnRlcmNlcHRvcigpOworCisgICAgLy8gQ29tcHV0ZSB0aGUgc291cmNlIHN0cmluZyBh
bmQgcHJldmVudCBhZ2FpbnN0IGluZmluaXRlIHJlY3Vyc2lvbi4KKyAgICBpZiAobV9yZWN1cnNp
b24gPj0ga01heFJlY3Vyc2lvbkRlcHRoKSB7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5n
PiBjb2RlID0gdjhFeHRlcm5hbFN0cmluZygidGhyb3cgUmFuZ2VFcnJvcignUmVjdXJzaW9uIHRv
byBkZWVwJykiKTsKKyAgICAgICAgLy8gVE9ETyhrYXNwZXJsKTogSWRlYWxseSwgd2Ugc2hvdWxk
IGJlIGFibGUgdG8gcmUtdXNlIHRoZSBvcmlnaW4gb2YgdGhlCisgICAgICAgIC8vIHNjcmlwdCBw
YXNzZWQgdG8gdXMgYXMgdGhlIGFyZ3VtZW50IGluc3RlYWQgb2YgdXNpbmcgYW4gZW1wdHkgc3Ry
aW5nCisgICAgICAgIC8vIGFuZCAwIGJhc2VMaW5lLgorICAgICAgICBzY3JpcHQgPSBDb21waWxl
U2NyaXB0KGNvZGUsICIiLCAwKTsKKyAgICB9CisKKyAgICBpZiAoSGFuZGxlT3V0T2ZNZW1vcnko
KSkKKyAgICAgICAgQVNTRVJUKHNjcmlwdC5Jc0VtcHR5KCkpOworCisgICAgaWYgKHNjcmlwdC5J
c0VtcHR5KCkpCisgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworCisg
ICAgLy8gU2F2ZSB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGlubGluZUNvZGUgZmxhZyBhbmQg
dXBkYXRlIHRoZSBmbGFnIGZvcgorICAgIC8vIHRoZSBkdXJhdGlvbiBvZiB0aGUgc2NyaXB0IGlu
dm9jYXRpb24uCisgICAgYm9vbCBwcmV2aW91c0lubGluZUNvZGUgPSBpbmxpbmVDb2RlKCk7Cisg
ICAgc2V0SW5saW5lQ29kZShpc0lubGluZUNvZGUpOworCisgICAgLy8gUnVuIHRoZSBzY3JpcHQg
YW5kIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLgorICAgIHY4OjpM
b2NhbDx2ODo6VmFsdWU+IHJlc3VsdDsKKyAgICB7CisgICAgICAgIENvbnNvbGVNZXNzYWdlU2Nv
cGUgc2NvcGU7CisgICAgICAgIG1fcmVjdXJzaW9uKys7CisKKyAgICAgICAgLy8gRXZhbHVhdGlu
ZyB0aGUgSmF2YVNjcmlwdCBjb3VsZCBjYXVzZSB0aGUgZnJhbWUgdG8gYmUgZGVhbGxvY2F0ZWQs
CisgICAgICAgIC8vIHNvIHdlIHN0YXJ0IHRoZSBrZWVwIGFsaXZlIHRpbWVyIGhlcmUuCisgICAg
ICAgIC8vIEZyYW1lOjprZWVwQWxpdmUgbWV0aG9kIGFkZHMgdGhlIHJlZiBjb3VudCBvZiB0aGUg
ZnJhbWUgYW5kIHNldHMgYQorICAgICAgICAvLyB0aW1lciB0byBkZWNyZWFzZSB0aGUgcmVmIGNv
dW50LiBJdCBhc3N1bWVzIHRoYXQgdGhlIGN1cnJlbnQgSmF2YVNjcmlwdAorICAgICAgICAvLyBl
eGVjdXRpb24gZmluaXNocyBiZWZvcmUgZmlyaW5nIHRoZSB0aW1lci4KKyAgICAgICAgLy8gU2Vl
IGlzc3VlIDEyMTg3NTYgYW5kIDkxNDQzMC4KKyAgICAgICAgbV9mcmFtZS0+a2VlcEFsaXZlKCk7
CisKKyAgICAgICAgcmVzdWx0ID0gc2NyaXB0LT5SdW4oKTsKKyAgICAgICAgbV9yZWN1cnNpb24t
LTsKKyAgICB9CisKKyAgICBpZiAoSGFuZGxlT3V0T2ZNZW1vcnkoKSkKKyAgICAgICAgQVNTRVJU
KHJlc3VsdC5Jc0VtcHR5KCkpOworCisgICAgLy8gSGFuZGxlIFY4IGludGVybmFsIGVycm9yIHNp
dHVhdGlvbiAoT3V0LW9mLW1lbW9yeSkuCisgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworCisgICAgLy8gUmVzdG9yZSBp
bmxpbmVDb2RlIGZsYWcuCisgICAgc2V0SW5saW5lQ29kZShwcmV2aW91c0lubGluZUNvZGUpOwor
CisgICAgaWYgKHY4OjpWODo6SXNEZWFkKCkpCisgICAgICAgIEhhbmRsZUZhdGFsRXJyb3JJblY4
KCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFY4
UHJveHk6OkNhbGxGdW5jdGlvbih2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4gZnVuY3Rpb24sIHY4
OjpIYW5kbGU8djg6Ok9iamVjdD4gcmVjZWl2ZXIsIGludCBhcmdjLCB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gYXJnc1tdKQoreworICAgIC8vIEZvciBub3csIHdlIGRvbid0IHB1dCBhbnkgYXJ0aWZp
Y2lhbCBsaW1pdGF0aW9ucyBvbiB0aGUgZGVwdGgKKyAgICAvLyBvZiByZWN1cnNpb24gdGhhdCBz
dGVtcyBmcm9tIGNhbGxpbmcgZnVuY3Rpb25zLiBUaGlzIGlzIGluCisgICAgLy8gY29udHJhc3Qg
dG8gdGhlIHNjcmlwdCBldmFsdWF0aW9ucy4KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1
bHQ7CisgICAgeworICAgICAgICBDb25zb2xlTWVzc2FnZVNjb3BlIHNjb3BlOworCisgICAgICAg
IC8vIEV2YWx1YXRpbmcgdGhlIEphdmFTY3JpcHQgY291bGQgY2F1c2UgdGhlIGZyYW1lIHRvIGJl
IGRlYWxsb2NhdGVkLAorICAgICAgICAvLyBzbyB3ZSBzdGFydCB0aGUga2VlcCBhbGl2ZSB0aW1l
ciBoZXJlLgorICAgICAgICAvLyBGcmFtZTo6a2VlcEFsaXZlIG1ldGhvZCBhZGRzIHRoZSByZWYg
Y291bnQgb2YgdGhlIGZyYW1lIGFuZCBzZXRzIGEKKyAgICAgICAgLy8gdGltZXIgdG8gZGVjcmVh
c2UgdGhlIHJlZiBjb3VudC4gSXQgYXNzdW1lcyB0aGF0IHRoZSBjdXJyZW50IEphdmFTY3JpcHQK
KyAgICAgICAgLy8gZXhlY3V0aW9uIGZpbmlzaHMgYmVmb3JlIGZpcmluZyB0aGUgdGltZXIuCisg
ICAgICAgIC8vIFNlZSBpc3N1ZSAxMjE4NzU2IGFuZCA5MTQ0MzAuCisgICAgICAgIG1fZnJhbWUt
PmtlZXBBbGl2ZSgpOworCisgICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9uLT5DYWxsKHJlY2VpdmVy
LCBhcmdjLCBhcmdzKTsKKyAgICB9CisKKyAgICBpZiAodjg6OlY4OjpJc0RlYWQoKSkKKyAgICAg
ICAgSGFuZGxlRmF0YWxFcnJvckluVjgoKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKwor
djg6OkxvY2FsPHY4OjpWYWx1ZT4gVjhQcm94eTo6TmV3SW5zdGFuY2Uodjg6OkhhbmRsZTx2ODo6
RnVuY3Rpb24+IGNvbnN0cnVjdG9yLCBpbnQgYXJnYywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFy
Z3NbXSkKK3sKKyAgICAvLyBObyBhcnRpZmljaWFsIGxpbWl0YXRpb25zIG9uIHRoZSBkZXB0aCBv
ZiByZWN1cnNpb24sIHNlZSBjb21tZW50IGluCisgICAgLy8gVjhQcm94eTo6Q2FsbEZ1bmN0aW9u
LgorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJlc3VsdDsKKyAgICB7CisgICAgICAgIENvbnNv
bGVNZXNzYWdlU2NvcGUgc2NvcGU7CisKKyAgICAgICAgLy8gU2VlIGNvbW1lbnQgaW4gVjhQcm94
eTo6Q2FsbEZ1bmN0aW9uLgorICAgICAgICBtX2ZyYW1lLT5rZWVwQWxpdmUoKTsKKworICAgICAg
ICByZXN1bHQgPSBjb25zdHJ1Y3Rvci0+TmV3SW5zdGFuY2UoYXJnYywgYXJncyk7CisgICAgfQor
CisgICAgaWYgKHY4OjpWODo6SXNEZWFkKCkpCisgICAgICAgIEhhbmRsZUZhdGFsRXJyb3JJblY4
KCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3Y4OjpMb2NhbDx2ODo6RnVuY3Rpb24+
IFY4UHJveHk6OkdldENvbnN0cnVjdG9yKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0KQor
eworICAgIC8vIEEgRE9NIGNvbnN0cnVjdG9yIGlzIGEgZnVuY3Rpb24gaW5zdGFuY2UgY3JlYXRl
ZCBmcm9tIGEgRE9NIGNvbnN0cnVjdG9yCisgICAgLy8gdGVtcGxhdGUuIFRoZXJlIGlzIG9uZSBp
bnN0YW5jZSBwZXIgY29udGV4dC4gQSBET00gY29uc3RydWN0b3IgaXMKKyAgICAvLyBkaWZmZXJl
bnQgZnJvbSBhIG5vcm1hbCBmdW5jdGlvbiBpbiB0d28gd2F5czoKKyAgICAvLyAgIDEpIGl0IGNh
bm5vdCBiZSBjYWxsZWQgYXMgY29uc3RydWN0b3IgKGFrYSwgdXNlZCB0byBjcmVhdGUgYSBET00g
b2JqZWN0KQorICAgIC8vICAgMikgaXRzIF9fcHJvdG9fXyBwb2ludHMgdG8gT2JqZWN0LnByb3Rv
dHlwZSByYXRoZXIgdGhhbgorICAgIC8vICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLgorICAgIC8v
IFRoZSByZWFzb24gZm9yIDIpIGlzIHRoYXQsIGluIFNhZmFyaSwgYSBET00gY29uc3RydWN0b3Ig
aXMgYSBub3JtYWwgSlMKKyAgICAvLyBvYmplY3QsIGJ1dCBub3QgYSBmdW5jdGlvbi4gSG90bWFp
bCByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCwgaW4gU2FmYXJpLAorICAgIC8vIEhUTUxFbGVtZW50
Ll9fcHJvdG9fXyA9PSBPYmplY3QucHJvdG90eXBlLgorICAgIC8vCisgICAgLy8gbV9vYmplY3RQ
cm90b3R5cGUgaXMgYSBjYWNoZSBvZiB0aGUgb3JpZ2luYWwgT2JqZWN0LnByb3RvdHlwZS4KKwor
ICAgIEFTU0VSVChDb250ZXh0SW5pdGlhbGl6ZWQoKSk7CisgICAgLy8gRW50ZXIgdGhlIGNvbnRl
eHQgb2YgdGhlIHByb3h5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorICAgIC8vIGZ1bmN0aW9uIGlz
IGNvbnN0cnVjdGVkIGluIHRoZSBjb250ZXh0IGNvcnJlc3BvbmRpbmcgdG8KKyAgICAvLyB0aGlz
IHByb3h5LgorICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShtX2NvbnRleHQpOworICAgIHY4
OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IHRlbXBsID0gR2V0VGVtcGxhdGUodCk7Cisg
ICAgLy8gR2V0dGluZyB0aGUgZnVuY3Rpb24gbWlnaHQgZmFpbCBpZiB3ZSdyZSBydW5uaW5nIG91
dCBvZgorICAgIC8vIHN0YWNrIG9yIG1lbW9yeS4KKyAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7
CisgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gdmFsdWUgPSB0ZW1wbC0+R2V0RnVuY3Rpb24o
KTsKKyAgICBpZiAodmFsdWUuSXNFbXB0eSgpKQorICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6
RnVuY3Rpb24+KCk7CisgICAgLy8gSG90bWFpbCBmaXgsIHNlZSBjb21tZW50cyBhYm92ZS4KKyAg
ICB2YWx1ZS0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiX19wcm90b19fIiksIG1fb2JqZWN0UHJvdG90
eXBlKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKwordjg6OkxvY2FsPHY4OjpPYmplY3Q+IFY4
UHJveHk6OkNyZWF0ZVdyYXBwZXJGcm9tQ2FjaGUoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBl
IHR5cGUpCit7CisgICAgaW50IGNsYXNzSW5kZXggPSBWOENsYXNzSW5kZXg6OlRvSW50KHR5cGUp
OworICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGNhY2hlZE9iamVjdCA9IG1fd3JhcHBlckJvaWxl
cnBsYXRlcy0+R2V0KHY4OjpJbnRlZ2VyOjpOZXcoY2xhc3NJbmRleCkpOworICAgIGlmIChjYWNo
ZWRPYmplY3QtPklzT2JqZWN0KCkpIHsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9i
amVjdCA9IHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6Q2FzdChjYWNoZWRPYmplY3QpOworICAgICAg
ICByZXR1cm4gb2JqZWN0LT5DbG9uZSgpOworICAgIH0KKworICAgIC8vIE5vdCBpbiBjYWNoZS4K
KyAgICBJbml0Q29udGV4dElmTmVlZGVkKCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3Bl
KG1fY29udGV4dCk7CisgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gZnVuY3Rpb24gPSBHZXRD
b25zdHJ1Y3Rvcih0eXBlKTsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaW5zdGFuY2UgPSBT
YWZlQWxsb2NhdGlvbjo6TmV3SW5zdGFuY2UoZnVuY3Rpb24pOworICAgIGlmICghaW5zdGFuY2Uu
SXNFbXB0eSgpKSB7CisgICAgICAgIG1fd3JhcHBlckJvaWxlcnBsYXRlcy0+U2V0KHY4OjpJbnRl
Z2VyOjpOZXcoY2xhc3NJbmRleCksIGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNl
LT5DbG9uZSgpOworICAgIH0KKyAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsK
K30KKworCisvLyBHZXQgdGhlIHN0cmluZyAndG9TdHJpbmcnLgorc3RhdGljIHY4OjpQZXJzaXN0
ZW50PHY4OjpTdHJpbmc+IEdldFRvU3RyaW5nTmFtZSgpCit7CisgIHN0YXRpYyB2ODo6UGVyc2lz
dGVudDx2ODo6U3RyaW5nPiB2YWx1ZTsKKyAgaWYgKHZhbHVlLklzRW1wdHkoKSkKKyAgICAgIHZh
bHVlID0gdjg6OlBlcnNpc3RlbnQ8djg6OlN0cmluZz46Ok5ldyh2ODo6U3RyaW5nOjpOZXcoInRv
U3RyaW5nIikpOworICByZXR1cm4gdmFsdWU7Cit9CisKKworc3RhdGljIHY4OjpIYW5kbGU8djg6
OlZhbHVlPiBDb25zdHJ1Y3RvclRvU3RyaW5nKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCit7
CisgICAgLy8gVGhlIERPTSBjb25zdHJ1Y3RvcnMnIHRvU3RyaW5nIGZ1bmN0aW9ucyBncmFiIHRo
ZSBjdXJyZW50IHRvU3RyaW5nCisgICAgLy8gZm9yIEZ1bmN0aW9ucyBieSB0YWtpbmcgdGhlIHRv
U3RyaW5nIGZ1bmN0aW9uIG9mIGl0c2VsZiBhbmQgdGhlbgorICAgIC8vIGNhbGxpbmcgaXQgd2l0
aCB0aGUgY29uc3RydWN0b3IgYXMgaXRzIHJlY2VpdmVyLiAgVGhpcyBtZWFucyB0aGF0CisgICAg
Ly8gY2hhbmdlcyB0byB0aGUgRnVuY3Rpb24gcHJvdG90eXBlIGNoYWluIG9yIHRvU3RyaW5nIGZ1
bmN0aW9uIGFyZQorICAgIC8vIHJlZmxlY3RlZCB3aGVuIHByaW50aW5nIERPTSBjb25zdHJ1Y3Rv
cnMuICBUaGUgb25seSB3YXJ0IGlzIHRoYXQKKyAgICAvLyBjaGFuZ2VzIHRvIGEgRE9NIGNvbnN0
cnVjdG9yJ3MgdG9TdHJpbmcncyB0b1N0cmluZyB3aWxsIGNhdXNlIHRoZQorICAgIC8vIHRvU3Ry
aW5nIG9mIHRoZSBET00gY29uc3RydWN0b3IgaXRzZWxmIHRvIGNoYW5nZS4gIFRoaXMgaXMgZXh0
cmVtZWx5CisgICAgLy8gb2JzY3VyZSBhbmQgdW5saWtlbHkgdG8gYmUgYSBwcm9ibGVtLgorICAg
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWwgPSBhcmdzLkNhbGxlZSgpLT5HZXQoR2V0VG9TdHJp
bmdOYW1lKCkpOworICAgIGlmICghdmFsLT5Jc0Z1bmN0aW9uKCkpIAorICAgICAgICByZXR1cm4g
djg6OlN0cmluZzo6TmV3KCIiKTsKKyAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+
OjpDYXN0KHZhbCktPkNhbGwoYXJncy5UaGlzKCksIDAsIE5VTEwpOworfQorCisKK3Y4OjpQZXJz
aXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBWOFByb3h5OjpHZXRUZW1wbGF0ZShWOENsYXNz
SW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSkKK3sKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6RnVu
Y3Rpb25UZW1wbGF0ZT4qIGNhY2hlQ2VsbCA9IFY4Q2xhc3NJbmRleDo6R2V0Q2FjaGUodHlwZSk7
CisgICAgaWYgKCEoKmNhY2hlQ2VsbCkuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gKmNhY2hl
Q2VsbDsKKworICAgIC8vIG5vdCBmb3VuZAorICAgIEZ1bmN0aW9uVGVtcGxhdGVGYWN0b3J5IGZh
Y3RvcnkgPSBWOENsYXNzSW5kZXg6OkdldEZhY3RvcnkodHlwZSk7CisgICAgdjg6OlBlcnNpc3Rl
bnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGRlc2MgPSBmYWN0b3J5KCk7CisgICAgLy8gRE9NIGNv
bnN0cnVjdG9ycyBhcmUgZnVuY3Rpb25zIGFuZCBzaG91bGQgcHJpbnQgdGhlbXNlbHZlcyBhcyBz
dWNoLgorICAgIC8vIEhvd2V2ZXIsIHdlIHdpbGwgbGF0ZXIgcmVwbGFjZSB0aGVpciBwcm90b3R5
cGVzIHdpdGggT2JqZWN0CisgICAgLy8gcHJvdG90eXBlcyBzbyB3ZSBuZWVkIHRvIGV4cGxpY2l0
bHkgb3ZlcnJpZGUgdG9TdHJpbmcgb24gdGhlCisgICAgLy8gaW5zdGFuY2UgaXRzZWxmLiAgSWYg
d2UgbGF0ZXIgbWFrZSBET00gY29uc3RydWN0b3JzIGZ1bGwgb2JqZWN0cworICAgIC8vIHdlIGNh
biBnaXZlIHRoZW0gY2xhc3MgbmFtZXMgaW5zdGVhZCBhbmQgT2JqZWN0LnByb3RvdHlwZS50b1N0
cmluZworICAgIC8vIHdpbGwgd29yayBzbyB3ZSBjYW4gcmVtb3ZlIHRoaXMgY29kZS4KKyAgICBz
dGF0aWMgdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IHRvU3RyaW5nVGVtcGxh
dGU7CisgICAgaWYgKHRvU3RyaW5nVGVtcGxhdGUuSXNFbXB0eSgpKQorICAgICAgICB0b1N0cmlu
Z1RlbXBsYXRlID0gdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+OjpOZXcodjg6
OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhDb25zdHJ1Y3RvclRvU3RyaW5nKSk7CisgICAgZGVzYy0+
U2V0KEdldFRvU3RyaW5nTmFtZSgpLCB0b1N0cmluZ1RlbXBsYXRlKTsKKyAgICBzd2l0Y2ggKHR5
cGUpIHsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q1NTU1RZTEVERUNMQVJBVElPTjoKKyAgICAg
ICAgLy8gVGhlIG5hbWVkIHByb3BlcnR5IGhhbmRsZXIgZm9yIHN0eWxlIGRlY2xhcmF0aW9ucyBo
YXMgYQorICAgICAgICAvLyBzZXR0ZXIuICBUaGVyZWZvcmUsIHRoZSBpbnRlcmNlcHRvciBoYXMg
dG8gYmUgb24gdGhlIG9iamVjdAorICAgICAgICAvLyBpdHNlbGYgYW5kIG5vdCBvbiB0aGUgcHJv
dG90eXBlIG9iamVjdC4KKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1l
ZFByb3BlcnR5SGFuZGxlciggVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihDU1NTdHlsZURlY2xh
cmF0aW9uKSwgVVNFX05BTUVEX1BST1BFUlRZX1NFVFRFUihDU1NTdHlsZURlY2xhcmF0aW9uKSk7
CisgICAgICAgIHNldENvbGxlY3Rpb25TdHJpbmdPck51bGxJbmRleGVkR2V0dGVyPENTU1N0eWxl
RGVjbGFyYXRpb24+KGRlc2MpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRl
eDo6Q1NTUlVMRUxJU1Q6CisgICAgICAgIHNldENvbGxlY3Rpb25JbmRleGVkR2V0dGVyPENTU1J1
bGVMaXN0LCBDU1NSdWxlPihkZXNjLCAgVjhDbGFzc0luZGV4OjpDU1NSVUxFKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkNTU1ZBTFVFTElTVDoKKyAgICAgICAgc2V0
Q29sbGVjdGlvbkluZGV4ZWRHZXR0ZXI8Q1NTVmFsdWVMaXN0LCBDU1NWYWx1ZT4oZGVzYywgVjhD
bGFzc0luZGV4OjpDU1NWQUxVRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0lu
ZGV4OjpDU1NWQVJJQUJMRVNERUNMQVJBVElPTjoKKyAgICAgICAgc2V0Q29sbGVjdGlvblN0cmlu
Z09yTnVsbEluZGV4ZWRHZXR0ZXI8Q1NTVmFyaWFibGVzRGVjbGFyYXRpb24+KGRlc2MpOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6V0VCS0lUQ1NTVFJBTlNGT1JNVkFM
VUU6CisgICAgICAgIHNldENvbGxlY3Rpb25JbmRleGVkR2V0dGVyPFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlLCBDU1NWYWx1ZT4oZGVzYywgVjhDbGFzc0luZGV4OjpDU1NWQUxVRSk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpVTkRFVEVDVEFCTEVIVE1MQ09MTEVDVElP
TjoKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5NYXJrQXNVbmRldGVjdGFibGUo
KTsgIC8vIGZhbGwgdGhyb3VnaAorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpIVE1MQ09MTEVDVElP
TjoKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFu
ZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxDb2xsZWN0aW9uKSk7CisgICAgICAg
IGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0Q2FsbEFzRnVuY3Rpb25IYW5kbGVyKFVTRV9D
QUxMQkFDSyhIVE1MQ29sbGVjdGlvbkNhbGxBc0Z1bmN0aW9uKSk7CisgICAgICAgIHNldENvbGxl
Y3Rpb25JbmRleGVkR2V0dGVyPEhUTUxDb2xsZWN0aW9uLCBOb2RlPihkZXNjLCBWOENsYXNzSW5k
ZXg6Ok5PREUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTE9Q
VElPTlNDT0xMRUNUSU9OOgorICAgICAgICBkZXNjLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldE5h
bWVkUHJvcGVydHlIYW5kbGVyKFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoSFRNTENvbGxlY3Rp
b24pKTsKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRJbmRleGVkUHJvcGVy
dHlIYW5kbGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZX0dFVFRFUihIVE1MT3B0aW9uc0NvbGxlY3Rp
b24pLCBVU0VfSU5ERVhFRF9QUk9QRVJUWV9TRVRURVIoSFRNTE9wdGlvbnNDb2xsZWN0aW9uKSk7
CisgICAgICAgIGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0Q2FsbEFzRnVuY3Rpb25IYW5k
bGVyKFVTRV9DQUxMQkFDSyhIVE1MQ29sbGVjdGlvbkNhbGxBc0Z1bmN0aW9uKSk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpIVE1MU0VMRUNURUxFTUVOVDoKKyAgICAg
ICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0Vf
TkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxTZWxlY3RFbGVtZW50Q29sbGVjdGlvbikpOworICAg
ICAgICBkZXNjLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldEluZGV4ZWRQcm9wZXJ0eUhhbmRsZXIo
bm9kZUNvbGxlY3Rpb25JbmRleGVkUHJvcGVydHlHZXR0ZXI8SFRNTFNlbGVjdEVsZW1lbnQ+LCBV
U0VfSU5ERVhFRF9QUk9QRVJUWV9TRVRURVIoSFRNTFNlbGVjdEVsZW1lbnRDb2xsZWN0aW9uKSwK
KyAgICAgICAgICAgIDAsIDAsIG5vZGVDb2xsZWN0aW9uSW5kZXhlZFByb3BlcnR5RW51bWVyYXRv
cjxIVE1MU2VsZWN0RWxlbWVudD4sIHY4OjpJbnRlZ2VyOjpOZXcoVjhDbGFzc0luZGV4OjpOT0RF
KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpIVE1MRE9DVU1FTlQ6
IHsKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFu
ZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxEb2N1bWVudCksIDAsIDAsIFVTRV9O
QU1FRF9QUk9QRVJUWV9ERUxFVEVSKEhUTUxEb2N1bWVudCkpOworCisgICAgICAgIC8vIFdlIGFk
ZCBhbiBleHRyYSBpbnRlcm5hbCBmaWVsZCB0byBhbGwgRG9jdW1lbnQgd3JhcHBlcnMgZm9yCisg
ICAgICAgIC8vIHN0b3JpbmcgYSBwZXIgZG9jdW1lbnQgRE9NSW1wbGVtZW50YXRpb24gd3JhcHBl
ci4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWRkaXRpb25hbGx5LCB3ZSBhZGQgdHdvIGV4dHJh
IGludGVybmFsIGZpZWxkcyBmb3IKKyAgICAgICAgLy8gSFRNTERvY3VtZW50cyB0byBpbXBsZW1l
bnQgdGVtcG9yYXJ5IHNoYWRvd2luZyBvZgorICAgICAgICAvLyBkb2N1bWVudC5hbGwuICBPbmUg
ZmllbGQgaG9sZHMgYW4gb2JqZWN0IHRoYXQgaXMgdXNlZCBhcyBhCisgICAgICAgIC8vIG1hcmtl
ci4gIFRoZSBvdGhlciBmaWVsZCBob2xkcyB0aGUgbWFya2VyIG9iamVjdCBpZgorICAgICAgICAv
LyBkb2N1bWVudC5hbGwgaXMgbm90IHNoYWRvd2VkIGFuZCBzb21lIG90aGVyIHZhbHVlIGlmCisg
ICAgICAgIC8vIGRvY3VtZW50LmFsbCBpcyBzaGFkb3dlZC4KKyAgICAgICAgdjg6OkxvY2FsPHY4
OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2MtPkluc3RhbmNlVGVtcGxh
dGUoKTsKKyAgICAgICAgQVNTRVJUKGluc3RhbmNlVGVtcGxhdGUtPkludGVybmFsRmllbGRDb3Vu
dCgpID09IFY4Q3VzdG9tOjprRGVmYXVsdFdyYXBwZXJJbnRlcm5hbEZpZWxkQ291bnQpOworICAg
ICAgICBpbnN0YW5jZVRlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoVjhDdXN0b206OmtI
VE1MRG9jdW1lbnRJbnRlcm5hbEZpZWxkQ291bnQpOworICAgICAgICBicmVhazsKKyAgICB9Cisj
aWYgRU5BQkxFKFNWRykKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6U1ZHRE9DVU1FTlQ6ICAvLyBm
YWxsIHRocm91Z2gKKyNlbmRpZgorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpET0NVTUVOVDogewor
ICAgICAgICAvLyBXZSBhZGQgYW4gZXh0cmEgaW50ZXJuYWwgZmllbGQgdG8gYWxsIERvY3VtZW50
IHdyYXBwZXJzIGZvcgorICAgICAgICAvLyBzdG9yaW5nIGEgcGVyIGRvY3VtZW50IERPTUltcGxl
bWVudGF0aW9uIHdyYXBwZXIuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+
IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjLT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAgICAgIEFT
U0VSVChpbnN0YW5jZVRlbXBsYXRlLT5JbnRlcm5hbEZpZWxkQ291bnQoKSA9PSBWOEN1c3RvbTo6
a0RlZmF1bHRXcmFwcGVySW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgaW5zdGFuY2VUZW1w
bGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KCBWOEN1c3RvbTo6a0RvY3VtZW50TWluaW11bUlu
dGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6SFRNTEFQUExFVEVMRU1FTlQ6ICAvLyBmYWxsIHRocm91Z2gKKyAgICBjYXNlIFY4
Q2xhc3NJbmRleDo6SFRNTEVNQkVERUxFTUVOVDogIC8vIGZhbGwgdGhyb3VnaAorICAgIGNhc2Ug
VjhDbGFzc0luZGV4OjpIVE1MT0JKRUNURUxFTUVOVDoKKyAgICAgICAgLy8gSFRNTEFwcGxldEVs
ZW1lbnQsIEhUTUxFbWJlZEVsZW1lbnQgYW5kIEhUTUxPYmplY3RFbGVtZW50IGFyZQorICAgICAg
ICAvLyBpbmhlcml0ZWQgZnJvbSBIVE1MUGx1Z0luRWxlbWVudCwgYW5kIHRoZXkgc2hhcmUgdGhl
IHNhbWUgcHJvcGVydHkKKyAgICAgICAgLy8gaGFuZGxpbmcgY29kZS4KKyAgICAgICAgZGVzYy0+
SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJP
UEVSVFlfR0VUVEVSKEhUTUxQbHVnSW5FbGVtZW50KSwgVVNFX05BTUVEX1BST1BFUlRZX1NFVFRF
UihIVE1MUGx1Z0luRWxlbWVudCkpOworICAgICAgICBkZXNjLT5JbnN0YW5jZVRlbXBsYXRlKCkt
PlNldEluZGV4ZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX0lOREVYRURfUFJPUEVSVFlfR0VUVEVSKEhU
TUxQbHVnSW5FbGVtZW50KSwgVVNFX0lOREVYRURfUFJPUEVSVFlfU0VUVEVSKEhUTUxQbHVnSW5F
bGVtZW50KSk7CisgICAgICAgIGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0Q2FsbEFzRnVu
Y3Rpb25IYW5kbGVyKFVTRV9DQUxMQkFDSyhIVE1MUGx1Z0luRWxlbWVudCkpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTEZSQU1FU0VURUxFTUVOVDoKKyAgICAg
ICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0Vf
TkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxGcmFtZVNldEVsZW1lbnQpKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhUTUxGT1JNRUxFTUVOVDoKKyAgICAgICAgZGVz
Yy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURf
UFJPUEVSVFlfR0VUVEVSKEhUTUxGb3JtRWxlbWVudCkpOworICAgICAgICBkZXNjLT5JbnN0YW5j
ZVRlbXBsYXRlKCktPlNldEluZGV4ZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX0lOREVYRURfUFJPUEVS
VFlfR0VUVEVSKEhUTUxGb3JtRWxlbWVudCksIDAsIDAsIDAsIG5vZGVDb2xsZWN0aW9uSW5kZXhl
ZFByb3BlcnR5RW51bWVyYXRvcjxIVE1MRm9ybUVsZW1lbnQ+LCB2ODo6SW50ZWdlcjo6TmV3KFY4
Q2xhc3NJbmRleDo6Tk9ERSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRl
eDo6Q0FOVkFTUElYRUxBUlJBWToKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5T
ZXRJbmRleGVkUHJvcGVydHlIYW5kbGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZX0dFVFRFUihDYW52
YXNQaXhlbEFycmF5KSwgVVNFX0lOREVYRURfUFJPUEVSVFlfU0VUVEVSKENhbnZhc1BpeGVsQXJy
YXkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVQ6
ICAvLyBmYWxsIHRocm91Z2gKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q1NTU1RZTEVTSEVFVDog
eworICAgICAgICAvLyBXZSBhZGQgYW4gZXh0cmEgaW50ZXJuYWwgZmllbGQgdG8gaG9sZCBhIHJl
ZmVyZW5jZSB0bworICAgICAgICAvLyB0aGUgb3duZXIgbm9kZS4KKyAgICAgICAgdjg6OkxvY2Fs
PHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2MtPkluc3RhbmNlVGVt
cGxhdGUoKTsKKyAgICAgICAgQVNTRVJUKGluc3RhbmNlVGVtcGxhdGUtPkludGVybmFsRmllbGRD
b3VudCgpID09IFY4Q3VzdG9tOjprRGVmYXVsdFdyYXBwZXJJbnRlcm5hbEZpZWxkQ291bnQpOwor
ICAgICAgICBpbnN0YW5jZVRlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoVjhDdXN0b206
OmtTdHlsZVNoZWV0SW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQor
ICAgIGNhc2UgVjhDbGFzc0luZGV4OjpNRURJQUxJU1Q6CisgICAgICAgIHNldENvbGxlY3Rpb25T
dHJpbmdPck51bGxJbmRleGVkR2V0dGVyPE1lZGlhTGlzdD4oZGVzYyk7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpNSU1FVFlQRUFSUkFZOgorICAgICAgICBzZXRDb2xs
ZWN0aW9uSW5kZXhlZEFuZE5hbWVkR2V0dGVyczxNaW1lVHlwZUFycmF5LCBNaW1lVHlwZT4oZGVz
YywgVjhDbGFzc0luZGV4OjpNSU1FVFlQRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhD
bGFzc0luZGV4OjpOQU1FRE5PREVNQVA6CisgICAgICAgIGRlc2MtPkluc3RhbmNlVGVtcGxhdGUo
KS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihOYW1l
ZE5vZGVNYXApKTsKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRJbmRleGVk
UHJvcGVydHlIYW5kbGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZX0dFVFRFUihOYW1lZE5vZGVNYXAp
LCAwLCAwLCAwLCBjb2xsZWN0aW9uSW5kZXhlZFByb3BlcnR5RW51bWVyYXRvcjxOYW1lZE5vZGVN
YXA+LCB2ODo6SW50ZWdlcjo6TmV3KFY4Q2xhc3NJbmRleDo6Tk9ERSkpOworICAgICAgICBicmVh
azsKKyNpZiBFTkFCTEUoRE9NX1NUT1JBR0UpCisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlNUT1JB
R0U6CisgICAgICAgIGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0eUhh
bmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihTdG9yYWdlKSwgVVNFX05BTUVEX1BST1BF
UlRZX1NFVFRFUihTdG9yYWdlKSwgMCwgVVNFX05BTUVEX1BST1BFUlRZX0RFTEVURVIoU3RvcmFn
ZSksIFY4Q3VzdG9tOjp2OFN0b3JhZ2VOYW1lZFByb3BlcnR5RW51bWVyYXRvcik7CisgICAgICAg
IGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0SW5kZXhlZFByb3BlcnR5SGFuZGxlcihVU0Vf
SU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoU3RvcmFnZSksIFVTRV9JTkRFWEVEX1BST1BFUlRZX1NF
VFRFUihTdG9yYWdlKSwgMCwgVVNFX0lOREVYRURfUFJPUEVSVFlfREVMRVRFUihTdG9yYWdlKSk7
CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBWOENsYXNzSW5kZXg6Ok5PREVMSVNU
OgorICAgICAgICBzZXRDb2xsZWN0aW9uSW5kZXhlZEdldHRlcjxOb2RlTGlzdCwgTm9kZT4oZGVz
YywgVjhDbGFzc0luZGV4OjpOT0RFKTsKKyAgICAgICAgZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgp
LT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKE5vZGVM
aXN0KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpQTFVHSU46Cisg
ICAgICAgIHNldENvbGxlY3Rpb25JbmRleGVkQW5kTmFtZWRHZXR0ZXJzPFBsdWdpbiwgTWltZVR5
cGU+KGRlc2MsIFY4Q2xhc3NJbmRleDo6TUlNRVRZUEUpOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIFY4Q2xhc3NJbmRleDo6UExVR0lOQVJSQVk6CisgICAgICAgIHNldENvbGxlY3Rpb25JbmRl
eGVkQW5kTmFtZWRHZXR0ZXJzPFBsdWdpbkFycmF5LCBQbHVnaW4+KGRlc2MsIFY4Q2xhc3NJbmRl
eDo6UExVR0lOKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlNUWUxF
U0hFRVRMSVNUOgorICAgICAgICBkZXNjLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldE5hbWVkUHJv
cGVydHlIYW5kbGVyKFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoU3R5bGVTaGVldExpc3QpKTsK
KyAgICAgICAgc2V0Q29sbGVjdGlvbkluZGV4ZWRHZXR0ZXI8U3R5bGVTaGVldExpc3QsIFN0eWxl
U2hlZXQ+KGRlc2MsIFY4Q2xhc3NJbmRleDo6U1RZTEVTSEVFVCk7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgVjhDbGFzc0luZGV4OjpET01XSU5ET1c6IHsKKyAgICAgICAgdjg6OkxvY2FsPHY4
OjpTaWduYXR1cmU+IGRlZmF1bHRfc2lnbmF0dXJlID0gdjg6OlNpZ25hdHVyZTo6TmV3KGRlc2Mp
OworCisgICAgICAgIGRlc2MtPlByb3RvdHlwZVRlbXBsYXRlKCktPlNldE5hbWVkUHJvcGVydHlI
YW5kbGVyKFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoRE9NV2luZG93KSk7CisgICAgICAgIGRl
c2MtPlByb3RvdHlwZVRlbXBsYXRlKCktPlNldEluZGV4ZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX0lO
REVYRURfUFJPUEVSVFlfR0VUVEVSKERPTVdpbmRvdykpOworCisgICAgICAgIGRlc2MtPlNldEhp
ZGRlblByb3RvdHlwZSh0cnVlKTsKKworICAgICAgICAvLyBSZXNlcnZlIHNwYWNlcyBmb3IgcmVm
ZXJlbmNlcyB0byBsb2NhdGlvbiwgaGlzdG9yeSBhbmQKKyAgICAgICAgLy8gbmF2aWdhdG9yIG9i
amVjdHMuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVt
cGxhdGUgPWRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2VUZW1wbGF0
ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9tOjprRE9NV2luZG93SW50ZXJuYWxGaWVs
ZENvdW50KTsKKworICAgICAgICAvLyBTZXQgYWNjZXNzIGNoZWNrIGNhbGxiYWNrcywgYnV0IHR1
cm5lZCBvZmYgaW5pdGlhbGx5LgorICAgICAgICAvLyBXaGVuIGEgY29udGV4dCBpcyBkZXRhY2hl
ZCBmcm9tIGEgZnJhbWUsIHR1cm4gb24gdGhlIGFjY2VzcyBjaGVjay4KKyAgICAgICAgLy8gVHVy
bmluZyBvbiBjaGVja3MgYWxzbyBpbnZhbGlkYXRlcyBpbmxpbmUgY2FjaGVzIG9mIHRoZSBvYmpl
Y3QuCisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUtPlNldEFjY2Vzc0NoZWNrQ2FsbGJhY2tzKFY4
Q3VzdG9tOjp2OERPTVdpbmRvd05hbWVkU2VjdXJpdHlDaGVjaywgVjhDdXN0b206OnY4RE9NV2lu
ZG93SW5kZXhlZFNlY3VyaXR5Q2hlY2ssIHY4OjpJbnRlZ2VyOjpOZXcoVjhDbGFzc0luZGV4OjpE
T01XSU5ET1cpLCBmYWxzZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6TE9DQVRJT046IHsKKyAgICAgICAgLy8gRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHRo
ZXNlIGZ1bmN0aW9ucyBhcmUgb24gdGhlIGluc3RhbmNlCisgICAgICAgIC8vIGluc3RlYWQgb2Yg
b24gdGhlIHByb3RvdHlwZSBvYmplY3QgdG8gaW5zdXJlIHRoYXQgdGhleSBjYW5ub3QKKyAgICAg
ICAgLy8gYmUgb3ZlcndyaXR0ZW4uCisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxh
dGU+IGluc3RhbmNlID0gZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBpbnN0YW5j
ZS0+U2V0QWNjZXNzb3Iodjg6OlN0cmluZzo6TmV3KCJyZWxvYWQiKSwgVjhDdXN0b206OnY4TG9j
YXRpb25SZWxvYWRBY2Nlc3NvckdldHRlciwgMCwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCksIHY4
OjpBTExfQ0FOX1JFQUQsIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OkRv
bnREZWxldGV8djg6OlJlYWRPbmx5KSk7CisgICAgICAgIGluc3RhbmNlLT5TZXRBY2Nlc3Nvcih2
ODo6U3RyaW5nOjpOZXcoInJlcGxhY2UiKSwgVjhDdXN0b206OnY4TG9jYXRpb25SZXBsYWNlQWNj
ZXNzb3JHZXR0ZXIsIDAsIHY4OjpIYW5kbGU8djg6OlZhbHVlPigpLCB2ODo6QUxMX0NBTl9SRUFE
LCBzdGF0aWNfY2FzdDx2ODo6UHJvcGVydHlBdHRyaWJ1dGU+KHY4OjpEb250RGVsZXRlfHY4OjpS
ZWFkT25seSkpOworICAgICAgICBpbnN0YW5jZS0+U2V0QWNjZXNzb3Iodjg6OlN0cmluZzo6TmV3
KCJhc3NpZ24iKSwgVjhDdXN0b206OnY4TG9jYXRpb25Bc3NpZ25BY2Nlc3NvckdldHRlciwgMCwg
djg6OkhhbmRsZTx2ODo6VmFsdWU+KCksIHY4OjpBTExfQ0FOX1JFQUQsIHN0YXRpY19jYXN0PHY4
OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OkRvbnREZWxldGV8djg6OlJlYWRPbmx5KSk7CisgICAg
ICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SElTVE9SWToKKyAgICAg
ICAgYnJlYWs7CisKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6TUVTU0FHRUNIQU5ORUw6IHsKKyAg
ICAgICAgLy8gUmVzZXJ2ZSB0d28gbW9yZSBpbnRlcm5hbCBmaWVsZHMgZm9yIHJlZmVyZW5jaW5n
IHRoZSBwb3J0MQorICAgICAgICAvLyBhbmQgcG9ydDIgd3JhcHBlcnMuICBUaGlzIGVuc3VyZXMg
dGhhdCB0aGUgcG9ydCB3cmFwcGVycyBhcmUKKyAgICAgICAgLy8ga2VwdCBhbGl2ZSB3aGVuIHRo
ZSBjaGFubmVsIHdyYXBwZXIgaXMuCisgICAgICAgIGRlc2MtPlNldENhbGxIYW5kbGVyKFVTRV9D
QUxMQkFDSyhNZXNzYWdlQ2hhbm5lbENvbnN0cnVjdG9yKSk7CisgICAgICAgIHY4OjpMb2NhbDx2
ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjLT5JbnN0YW5jZVRlbXBs
YXRlKCk7CisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUtPlNldEludGVybmFsRmllbGRDb3VudChW
OEN1c3RvbTo6a01lc3NhZ2VDaGFubmVsSW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorCisgICAgY2FzZSBWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JUOiB7CisgICAg
ICAgIC8vIFJlc2VydmUgb25lIG1vcmUgaW50ZXJuYWwgZmllbGQgZm9yIGtlZXBpbmcgZXZlbnQg
bGlzdGVuZXJzLgorICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBpbnN0YW5j
ZVRlbXBsYXRlID0gZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBpbnN0YW5jZVRl
bXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoVjhDdXN0b206OmtNZXNzYWdlUG9ydEludGVy
bmFsRmllbGRDb3VudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmIEVOQUJMRShXT1JL
RVJTKQorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpXT1JLRVI6IHsKKyAgICAgICAgLy8gUmVzZXJ2
ZSBvbmUgbW9yZSBpbnRlcm5hbCBmaWVsZCBmb3Iga2VlcGluZyBldmVudCBsaXN0ZW5lcnMuCisg
ICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVtcGxhdGUgPSBk
ZXNjLT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUtPlNldElu
dGVybmFsRmllbGRDb3VudChWOEN1c3RvbTo6a1dvcmtlckludGVybmFsRmllbGRDb3VudCk7Cisg
ICAgICAgIGRlc2MtPlNldENhbGxIYW5kbGVyKFVTRV9DQUxMQkFDSyhXb3JrZXJDb25zdHJ1Y3Rv
cikpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6V09S
S0VSQ09OVEVYVDogeworICAgICAgICAvLyBSZXNlcnZlIG9uZSBtb3JlIGludGVybmFsIGZpZWxk
IGZvciBrZWVwaW5nIGV2ZW50IGxpc3RlbmVycy4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmpl
Y3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKTsK
KyAgICAgICAgaW5zdGFuY2VUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9t
OjprV29ya2VyQ29udGV4dEludGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGJyZWFrOworICAg
IH0KKyNlbmRpZiAgLy8gV09SS0VSUworCisgICAgLy8gVGhlIGZvbGxvd2luZyBvYmplY3RzIGFy
ZSBjcmVhdGVkIGZyb20gSmF2YVNjcmlwdC4KKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6RE9NUEFS
U0VSOgorICAgICAgICBkZXNjLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJBQ0soRE9NUGFyc2Vy
Q29uc3RydWN0b3IpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhU
TUxJTUFHRUVMRU1FTlQ6CisgICAgICAgIGRlc2MtPlNldENhbGxIYW5kbGVyKFVTRV9DQUxMQkFD
SyhIVE1MSW1hZ2VFbGVtZW50Q29uc3RydWN0b3IpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBWOENsYXNzSW5kZXg6OkhUTUxPUFRJT05FTEVNRU5UOgorICAgICAgICBkZXNjLT5TZXRDYWxs
SGFuZGxlcihVU0VfQ0FMTEJBQ0soSFRNTE9wdGlvbkVsZW1lbnRDb25zdHJ1Y3RvcikpOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6V0VCS0lUQ1NTTUFUUklYOgorICAg
ICAgICBkZXNjLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJBQ0soV2ViS2l0Q1NTTWF0cml4Q29u
c3RydWN0b3IpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OldFQktJ
VFBPSU5UOgorICAgICAgICBkZXNjLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJBQ0soV2ViS2l0
UG9pbnRDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRl
eDo6WE1MU0VSSUFMSVpFUjoKKyAgICAgICAgZGVzYy0+U2V0Q2FsbEhhbmRsZXIoVVNFX0NBTExC
QUNLKFhNTFNlcmlhbGl6ZXJDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1Q6IHsKKyAgICAgICAgLy8gUmVzZXJ2ZSBvbmUg
bW9yZSBpbnRlcm5hbCBmaWVsZCBmb3Iga2VlcGluZyBldmVudCBsaXN0ZW5lcnMuCisgICAgICAg
IHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjLT5J
bnN0YW5jZVRlbXBsYXRlKCk7CisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUtPlNldEludGVybmFs
RmllbGRDb3VudChWOEN1c3RvbTo6a1hNTEh0dHBSZXF1ZXN0SW50ZXJuYWxGaWVsZENvdW50KTsK
KyAgICAgICAgZGVzYy0+U2V0Q2FsbEhhbmRsZXIoVVNFX0NBTExCQUNLKFhNTEh0dHBSZXF1ZXN0
Q29uc3RydWN0b3IpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVjhDbGFzc0lu
ZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRDogeworICAgICAgICAvLyBSZXNlcnZlIG9uZSBtb3Jl
IGludGVybmFsIGZpZWxkIGZvciBrZWVwaW5nIGV2ZW50IGxpc3RlbmVycy4KKyAgICAgICAgdjg6
OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2MtPkluc3Rh
bmNlVGVtcGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2VUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVs
ZENvdW50KFY4Q3VzdG9tOjprWE1MSHR0cFJlcXVlc3RJbnRlcm5hbEZpZWxkQ291bnQpOworICAg
ICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlhQQVRIRVZBTFVBVE9S
OgorICAgICAgICBkZXNjLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJBQ0soWFBhdGhFdmFsdWF0
b3JDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6
WFNMVFBST0NFU1NPUjoKKyAgICAgICAgZGVzYy0+U2V0Q2FsbEhhbmRsZXIoVVNFX0NBTExCQUNL
KFhTTFRQcm9jZXNzb3JDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4
Q2xhc3NJbmRleDo6Q0xJRU5UUkVDVExJU1Q6CisgICAgICAgIGRlc2MtPkluc3RhbmNlVGVtcGxh
dGUoKS0+U2V0SW5kZXhlZFByb3BlcnR5SGFuZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRU
RVIoQ2xpZW50UmVjdExpc3QpKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorCisgICAgKmNhY2hlQ2VsbCA9IGRlc2M7CisgICAgcmV0dXJuIGRl
c2M7Cit9CisKKworYm9vbCBWOFByb3h5OjpDb250ZXh0SW5pdGlhbGl6ZWQoKQoreworICAgIC8v
IG1fY29udGV4dCwgbV9nbG9iYWwsIG1fb2JqZWN0UHJvdG90eXBlIGFuZCBtX3dyYXBwZXJCb2ls
ZXJwbGF0ZXMgc2hvdWxkCisgICAgLy8gYWxsIGJlIG5vbi1lbXB0eSBpZiBpZiBtX2NvbnRleHQg
aXMgbm9uLWVtcHR5LgorICAgIEFTU0VSVChtX2NvbnRleHQuSXNFbXB0eSgpIHx8ICFtX2dsb2Jh
bC5Jc0VtcHR5KCkpOworICAgIEFTU0VSVChtX2NvbnRleHQuSXNFbXB0eSgpIHx8ICFtX29iamVj
dFByb3RvdHlwZS5Jc0VtcHR5KCkpOworICAgIEFTU0VSVChtX2NvbnRleHQuSXNFbXB0eSgpIHx8
ICFtX3dyYXBwZXJCb2lsZXJwbGF0ZXMuSXNFbXB0eSgpKTsKKyAgICByZXR1cm4gIW1fY29udGV4
dC5Jc0VtcHR5KCk7Cit9CisKKworRE9NV2luZG93KiBWOFByb3h5OjpyZXRyaWV2ZVdpbmRvdygp
Cit7CisgICAgLy8gVE9ETzogVGhpcyBzZWVtcyB2ZXJ5IGZyYWdpbGUuIEhvdyBkbyB3ZSBrbm93
IHRoYXQgdGhlIGdsb2JhbCBvYmplY3QKKyAgICAvLyBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQg
aXMgc29tZXRoaW5nIHNlbnNpYmxlPyBEbyB3ZSBuZWVkIHRvIHVzZSB0aGUKKyAgICAvLyBsYXN0
IGVudGVyZWQgaGVyZT8gV2hvIGNhbGxzIHRoaXM/CisgICAgcmV0dXJuIHJldHJpZXZlV2luZG93
KHY4OjpDb250ZXh0OjpHZXRDdXJyZW50KCkpOworfQorCisKK0RPTVdpbmRvdyogVjhQcm94eTo6
cmV0cmlldmVXaW5kb3codjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCkKK3sKKyAgICB2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGdsb2JhbCA9IGNvbnRleHQtPkdsb2JhbCgpOworICAgIEFT
U0VSVCghZ2xvYmFsLklzRW1wdHkoKSk7CisgICAgZ2xvYmFsID0gTG9va3VwRE9NV3JhcHBlcihW
OENsYXNzSW5kZXg6OkRPTVdJTkRPVywgZ2xvYmFsKTsKKyAgICBBU1NFUlQoIWdsb2JhbC5Jc0Vt
cHR5KCkpOworICAgIHJldHVybiBUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRl
eDo6RE9NV0lORE9XLCBnbG9iYWwpOworfQorCisKK0ZyYW1lKiBWOFByb3h5OjpyZXRyaWV2ZUZy
YW1lKHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQpCit7CisgICAgcmV0dXJuIHJldHJp
ZXZlV2luZG93KGNvbnRleHQpLT5mcmFtZSgpOworfQorCisKK0ZyYW1lKiBWOFByb3h5OjpyZXRy
aWV2ZUZyYW1lRm9yRW50ZXJlZENvbnRleHQoKQoreworICAgIHY4OjpIYW5kbGU8djg6OkNvbnRl
eHQ+IGNvbnRleHQgPSB2ODo6Q29udGV4dDo6R2V0RW50ZXJlZCgpOworICAgIGlmIChjb250ZXh0
LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHJldHJpZXZlRnJhbWUo
Y29udGV4dCk7Cit9CisKKworRnJhbWUqIFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JDdXJyZW50
Q29udGV4dCgpCit7CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpD
b250ZXh0OjpHZXRDdXJyZW50KCk7CisgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm4gMDsKKyAgICByZXR1cm4gcmV0cmlldmVGcmFtZShjb250ZXh0KTsKK30KKworCitG
cmFtZSogVjhQcm94eTo6cmV0cmlldmVGcmFtZUZvckNhbGxpbmdDb250ZXh0KCkKK3sKKyAgICB2
ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gdjg6OkNvbnRleHQ6OkdldENhbGxpbmco
KTsKKyAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJl
dHVybiByZXRyaWV2ZUZyYW1lKGNvbnRleHQpOworfQorCisKK0ZyYW1lKiBWOFByb3h5OjpyZXRy
aWV2ZUZyYW1lKCkKK3sKKyAgICBET01XaW5kb3cqIHdpbmRvdyA9IHJldHJpZXZlV2luZG93KCk7
CisgICAgcmV0dXJuIHdpbmRvdyA/IHdpbmRvdy0+ZnJhbWUoKSA6IDA7Cit9CisKKworVjhQcm94
eSogVjhQcm94eTo6cmV0cmlldmUoKQoreworICAgIERPTVdpbmRvdyogd2luZG93ID0gcmV0cmll
dmVXaW5kb3coKTsKKyAgICBBU1NFUlQod2luZG93KTsKKyAgICByZXR1cm4gcmV0cmlldmUod2lu
ZG93LT5mcmFtZSgpKTsKK30KKworVjhQcm94eSogVjhQcm94eTo6cmV0cmlldmUoRnJhbWUqIGZy
YW1lKQoreworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBm
cmFtZS0+c2NyaXB0KCktPmlzRW5hYmxlZCgpID8gZnJhbWUtPnNjcmlwdCgpLT5wcm94eSgpIDog
MDsKK30KKworCitWOFByb3h5KiBWOFByb3h5OjpyZXRyaWV2ZShTY3JpcHRFeGVjdXRpb25Db250
ZXh0KiBjb250ZXh0KQoreworICAgIGlmICghY29udGV4dC0+aXNEb2N1bWVudCgpKQorICAgICAg
ICByZXR1cm4gMDsKKyAgICByZXR1cm4gcmV0cmlldmUoc3RhdGljX2Nhc3Q8RG9jdW1lbnQqPihj
b250ZXh0KS0+ZnJhbWUoKSk7Cit9CisKKwordm9pZCBWOFByb3h5OjpkaXNjb25uZWN0RnJhbWUo
KQoreworICAgIC8vIGRpc2Nvbm5lY3QgYWxsIGV2ZW50IGxpc3RlbmVycworICAgIERpc2Nvbm5l
Y3RFdmVudExpc3RlbmVycygpOworfQorCisKK2Jvb2wgVjhQcm94eTo6aXNFbmFibGVkKCkKK3sK
KyAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBtX2ZyYW1lLT5zZXR0aW5ncygpOworICAgIGlmICgh
c2V0dGluZ3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEluIHRoZSBjb21tb24g
Y2FzZSwgSmF2YVNjcmlwdCBpcyBlbmFibGVkIGFuZCB3ZSdyZSBkb25lLgorICAgIGlmIChzZXR0
aW5ncy0+aXNKYXZhU2NyaXB0RW5hYmxlZCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAg
IC8vIElmIEphdmFTY3JpcHQgaGFzIGJlZW4gZGlzYWJsZWQsIHdlIG5lZWQgdG8gbG9vayBhdCB0
aGUgZnJhbWUgdG8gdGVsbAorICAgIC8vIHdoZXRoZXIgdGhpcyBzY3JpcHQgY2FtZSBmcm9tIHRo
ZSB3ZWIgb3IgdGhlIGVtYmVkZGVyLiBTY3JpcHRzIGZyb20gdGhlCisgICAgLy8gZW1iZWRkZXIg
YXJlIHNhZmUgdG8gcnVuLCBidXQgc2NyaXB0cyBmcm9tIHRoZSBvdGhlciBzb3VyY2VzIGFyZQor
ICAgIC8vIGRpc2FsbG93ZWQuCisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gbV9mcmFtZS0+ZG9j
dW1lbnQoKTsKKyAgICBpZiAoIWRvY3VtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBTZWN1cml0eU9yaWdpbiogb3JpZ2luID0gZG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCk7Cisg
ICAgaWYgKG9yaWdpbi0+cHJvdG9jb2woKS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsgIC8vIFVuaW5pdGlhbGl6ZWQgZG9jdW1lbnQKKworICAgIGlmIChvcmlnaW4tPnByb3RvY29s
KCkgPT0gImh0dHAiIHx8IG9yaWdpbi0+cHJvdG9jb2woKSA9PSAiaHR0cHMiKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7ICAvLyBXZWIgc2l0ZQorCisgICAgLy8gRklYTUU6IHRoZSBmb2xsb3dpbmcg
YXJlIGFwcGxpY2F0aW9uIGRlY2lzaW9ucywgYW5kIHRoZXkgc2hvdWxkCisgICAgLy8gbm90IGJl
IG1hZGUgYXQgdGhpcyBsYXllci4gIGluc3RlYWQsIHdlIHNob3VsZCBicmlkZ2Ugb3V0IHRvIHRo
ZQorICAgIC8vIGVtYmVkZGVyIHRvIGFsbG93IHRoZW0gdG8gb3ZlcnJpZGUgcG9saWN5IGhlcmUu
CisKKyAgICBpZiAob3JpZ2luLT5wcm90b2NvbCgpID09IENocm9taXVtQnJpZGdlOjp1aVJlc291
cmNlUHJvdG9jb2woKSkKKyAgICAgICAgcmV0dXJuIHRydWU7ICAgLy8gRW1iZWRkZXIncyBzY3Jp
cHRzIGFyZSBvayB0byBydW4KKworICAgIC8vIElmIHRoZSBzY2hlbWUgaXMgZnRwOiBvciBmaWxl
OiwgYW4gZW1wdHkgZmlsZSBuYW1lIGluZGljYXRlcyBhIGRpcmVjdG9yeQorICAgIC8vIGxpc3Rp
bmcsIHdoaWNoIHJlcXVpcmVzIEphdmFTY3JpcHQgdG8gZnVuY3Rpb24gcHJvcGVybHkuCisgICAg
Y29uc3QgY2hhcioga0RpclByb3RvY29sc1tdID0geyAiZnRwIiwgImZpbGUiIH07CisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoa0RpclByb3RvY29scyk7ICsraSkgeworICAg
ICAgICBpZiAob3JpZ2luLT5wcm90b2NvbCgpID09IGtEaXJQcm90b2NvbHNbaV0pIHsKKyAgICAg
ICAgICAgIGNvbnN0IEtVUkwmIHVybCA9IGRvY3VtZW50LT51cmwoKTsKKyAgICAgICAgICAgIHJl
dHVybiB1cmwucGF0aEFmdGVyTGFzdFNsYXNoKCkgPT0gdXJsLnBhdGhFbmQoKTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsgIC8vIE90aGVyIHByb3RvY29scyBmYWxsIHRo
cm91Z2ggdG8gaGVyZQorfQorCisKK3ZvaWQgVjhQcm94eTo6VXBkYXRlRG9jdW1lbnRXcmFwcGVy
KHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3cmFwcGVyKQoreworICAgIENsZWFyRG9jdW1lbnRXcmFw
cGVyKCk7CisKKyAgICBBU1NFUlQobV9kb2N1bWVudC5Jc0VtcHR5KCkpOworICAgIG1fZG9jdW1l
bnQgPSB2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+OjpOZXcod3JhcHBlcik7CisjaWZuZGVmIE5E
RUJVRworICAgIFJlZ2lzdGVyR2xvYmFsSGFuZGxlKFBST1hZLCB0aGlzLCBtX2RvY3VtZW50KTsK
KyNlbmRpZgorfQorCisKK3ZvaWQgVjhQcm94eTo6Q2xlYXJEb2N1bWVudFdyYXBwZXIoKQorewor
ICAgIGlmICghbV9kb2N1bWVudC5Jc0VtcHR5KCkpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAg
IFVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9kb2N1bWVudCk7CisjZW5kaWYKKyAgICAg
ICAgbV9kb2N1bWVudC5EaXNwb3NlKCk7CisgICAgICAgIG1fZG9jdW1lbnQuQ2xlYXIoKTsKKyAg
ICB9Cit9CisKKwordm9pZCBWOFByb3h5OjpVcGRhdGVEb2N1bWVudFdyYXBwZXJDYWNoZSgpCit7
CisgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworICAgIHY4OjpDb250ZXh0OjpTY29w
ZSBjb250ZXh0U2NvcGUoR2V0Q29udGV4dCgpKTsKKworICAgIC8vIElmIHRoZSBkb2N1bWVudCBo
YXMgbm8gZnJhbWUsIE5vZGVUb1Y4T2JqZWN0IG1pZ2h0IGdldCB0aGUKKyAgICAvLyBkb2N1bWVu
dCB3cmFwcGVyIGZvciBhIGRvY3VtZW50IHRoYXQgaXMgYWJvdXQgdG8gYmUgZGVsZXRlZC4KKyAg
ICAvLyBJZiB0aGUgRm9yY2VTZXQgYmVsb3cgY2F1c2VzIGEgZ2FyYmFnZSBjb2xsZWN0aW9uLCB0
aGUgZG9jdW1lbnQKKyAgICAvLyBtaWdodCBnZXQgZGVsZXRlZCBhbmQgdGhlIGdsb2JhbCBoYW5k
bGUgZm9yIHRoZSBkb2N1bWVudAorICAgIC8vIHdyYXBwZXIgY2xlYXJlZC4gVXNpbmcgdGhlIGNs
ZWFyZWQgZ2xvYmFsIGhhbmRsZSB3aWxsIGxlYWQgdG8KKyAgICAvLyBjcmFzaGVzLiAgSW4gdGhp
cyBjYXNlIHdlIGNsZWFyIHRoZSBjYWNoZSBhbmQgbGV0IHRoZSBET01XaW5kb3cKKyAgICAvLyBh
Y2Nlc3NvciBoYW5kbGUgYWNjZXNzIHRvIHRoZSBkb2N1bWVudC4KKyAgICBpZiAoIW1fZnJhbWUt
PmRvY3VtZW50KCktPmZyYW1lKCkpIHsKKyAgICAgICAgQ2xlYXJEb2N1bWVudFdyYXBwZXJDYWNo
ZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+
IGRvY3VtZW50V3JhcHBlciA9IE5vZGVUb1Y4T2JqZWN0KG1fZnJhbWUtPmRvY3VtZW50KCkpOwor
CisgICAgLy8gSWYgaW5zdGFudGlhdGlvbiBvZiB0aGUgZG9jdW1lbnQgd3JhcHBlciBmYWlscywg
Y2xlYXIgdGhlIGNhY2hlCisgICAgLy8gYW5kIGxldCB0aGUgRE9NV2luZG93IGFjY2Vzc29yIGhh
bmRsZSBhY2Nlc3MgdG8gdGhlIGRvY3VtZW50LgorICAgIGlmIChkb2N1bWVudFdyYXBwZXIuSXNF
bXB0eSgpKSB7CisgICAgICAgIENsZWFyRG9jdW1lbnRXcmFwcGVyQ2FjaGUoKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICBtX2NvbnRleHQtPkdsb2JhbCgpLT5Gb3JjZVNldCh2ODo6U3Ry
aW5nOjpOZXcoImRvY3VtZW50IiksIGRvY3VtZW50V3JhcHBlciwgc3RhdGljX2Nhc3Q8djg6OlBy
b3BlcnR5QXR0cmlidXRlPih2ODo6UmVhZE9ubHkgfCB2ODo6RG9udERlbGV0ZSkpOworfQorCisK
K3ZvaWQgVjhQcm94eTo6Q2xlYXJEb2N1bWVudFdyYXBwZXJDYWNoZSgpCit7CisgICAgQVNTRVJU
KCFtX2NvbnRleHQuSXNFbXB0eSgpKTsKKyAgICBtX2NvbnRleHQtPkdsb2JhbCgpLT5Gb3JjZURl
bGV0ZSh2ODo6U3RyaW5nOjpOZXcoImRvY3VtZW50IikpOworfQorCisKK3ZvaWQgVjhQcm94eTo6
RGlzcG9zZUNvbnRleHRIYW5kbGVzKCkKK3sKKyAgICBpZiAoIW1fY29udGV4dC5Jc0VtcHR5KCkp
IHsKKyAgICAgICAgbV9jb250ZXh0LkRpc3Bvc2UoKTsKKyAgICAgICAgbV9jb250ZXh0LkNsZWFy
KCk7CisgICAgfQorCisgICAgaWYgKCFtX3dyYXBwZXJCb2lsZXJwbGF0ZXMuSXNFbXB0eSgpKSB7
CisjaWZuZGVmIE5ERUJVRworICAgICAgICBVbnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMsIG1f
d3JhcHBlckJvaWxlcnBsYXRlcyk7CisjZW5kaWYKKyAgICAgICAgbV93cmFwcGVyQm9pbGVycGxh
dGVzLkRpc3Bvc2UoKTsKKyAgICAgICAgbV93cmFwcGVyQm9pbGVycGxhdGVzLkNsZWFyKCk7Cisg
ICAgfQorCisgICAgaWYgKCFtX29iamVjdFByb3RvdHlwZS5Jc0VtcHR5KCkpIHsKKyNpZm5kZWYg
TkRFQlVHCisgICAgICAgIFVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9vYmplY3RQcm90
b3R5cGUpOworI2VuZGlmCisgICAgICAgIG1fb2JqZWN0UHJvdG90eXBlLkRpc3Bvc2UoKTsKKyAg
ICAgICAgbV9vYmplY3RQcm90b3R5cGUuQ2xlYXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgVjhQcm94
eTo6Y2xlYXJGb3JDbG9zZSgpCit7CisgICAgaWYgKCFtX2NvbnRleHQuSXNFbXB0eSgpKSB7Cisg
ICAgICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKworICAgICAgICBDbGVhckRvY3Vt
ZW50V3JhcHBlcigpOworICAgICAgICBEaXNwb3NlQ29udGV4dEhhbmRsZXMoKTsKKyAgICB9Cit9
CisKKwordm9pZCBWOFByb3h5OjpjbGVhckZvck5hdmlnYXRpb24oKQoreworICAgIC8vIGRpc2Nv
bm5lY3QgYWxsIGV2ZW50IGxpc3RlbmVycworICAgIERpc2Nvbm5lY3RFdmVudExpc3RlbmVycygp
OworCisgICAgaWYgKCFtX2NvbnRleHQuSXNFbXB0eSgpKSB7CisgICAgICAgIHY4OjpIYW5kbGVT
Y29wZSBoYW5kbGU7CisgICAgICAgIENsZWFyRG9jdW1lbnRXcmFwcGVyKCk7CisKKyAgICAgICAg
djg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRTY29wZShtX2NvbnRleHQpOworCisgICAgICAgIC8v
IENsZWFyIHRoZSBkb2N1bWVudCB3cmFwcGVyIGNhY2hlIGJlZm9yZSB0dXJuaW5nIG9uIGFjY2Vz
cyBjaGVja3Mgb24KKyAgICAgICAgLy8gdGhlIG9sZCBET01XaW5kb3cgd3JhcHBlci4gIFRoaXMg
d2F5LCBhY2Nlc3MgdG8gdGhlIGRvY3VtZW50IHdyYXBwZXIKKyAgICAgICAgLy8gd2lsbCBiZSBw
cm90ZWN0ZWQgYnkgdGhlIHNlY3VyaXR5IGNoZWNrcyBvbiB0aGUgRE9NV2luZG93IHdyYXBwZXIu
CisgICAgICAgIENsZWFyRG9jdW1lbnRXcmFwcGVyQ2FjaGUoKTsKKworICAgICAgICAvLyBUdXJu
IG9uIGFjY2VzcyBjaGVjayBvbiB0aGUgb2xkIERPTVdpbmRvdyB3cmFwcGVyLgorICAgICAgICB2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJ
bmRleDo6RE9NV0lORE9XLCBtX2dsb2JhbCk7CisgICAgICAgIEFTU0VSVCghd3JhcHBlci5Jc0Vt
cHR5KCkpOworICAgICAgICB3cmFwcGVyLT5UdXJuT25BY2Nlc3NDaGVjaygpOworCisgICAgICAg
IC8vIFNlcGFyYXRlIHRoZSBjb250ZXh0IGZyb20gaXRzIGdsb2JhbCBvYmplY3QuCisgICAgICAg
IG1fY29udGV4dC0+RGV0YWNoR2xvYmFsKCk7CisKKyAgICAgICAgRGlzcG9zZUNvbnRleHRIYW5k
bGVzKCk7CisKKyAgICAgICAgLy8gUmVpbml0aWFsaXplIHRoZSBjb250ZXh0IHNvIHRoZSBnbG9i
YWwgb2JqZWN0IHBvaW50cyB0bworICAgICAgICAvLyB0aGUgbmV3IERPTSB3aW5kb3cuCisgICAg
ICAgIEluaXRDb250ZXh0SWZOZWVkZWQoKTsKKyAgICB9Cit9CisKKwordm9pZCBWOFByb3h5OjpT
ZXRTZWN1cml0eVRva2VuKCkKK3sKKyAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBtX2ZyYW1lLT5k
b2N1bWVudCgpOworICAgIC8vIFNldHVwIHNlY3VyaXR5IG9yaWdpbiBhbmQgc2VjdXJpdHkgdG9r
ZW4KKyAgICBpZiAoIWRvY3VtZW50KSB7CisgICAgICAgIG1fY29udGV4dC0+VXNlRGVmYXVsdFNl
Y3VyaXR5VG9rZW4oKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEFzayB0aGUg
ZG9jdW1lbnQncyBTZWN1cml0eU9yaWdpbiB0byBnZW5lcmF0ZSBhIHNlY3VyaXR5IHRva2VuLgor
ICAgIC8vIElmIHR3byB0b2tlbnMgYXJlIGVxdWFsLCB0aGVuIHRoZSBTZWN1cml0eU9yaWdpbnMg
Y2FuQWNjZXNzIGVhY2ggb3RoZXIuCisgICAgLy8gSWYgdHdvIHRva2VucyBhcmUgbm90IGVxdWFs
LCB0aGVuIHdlIGhhdmUgdG8gY2FsbCBjYW5BY2Nlc3MuCisgICAgLy8gTm90ZTogd2UgY2FuJ3Qg
dXNlIHRoZSBIVFRQT3JpZ2luIGlmIGl0IHdhcyBzZXQgZnJvbSB0aGUgRE9NLgorICAgIFNlY3Vy
aXR5T3JpZ2luKiBvcmlnaW4gPSBkb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKTsKKyAgICBTdHJp
bmcgdG9rZW47CisgICAgaWYgKCFvcmlnaW4tPmRvbWFpbldhc1NldEluRE9NKCkpCisgICAgICAg
IHRva2VuID0gZG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCktPnRvU3RyaW5nKCk7CisKKyAgICAv
LyBBbiBlbXB0eSBvciAibnVsbCIgdG9rZW4gbWVhbnMgd2UgYWx3YXlzIGhhdmUgdG8gY2FsbAor
ICAgIC8vIGNhbkFjY2Vzcy4gIFRoZSB0b1N0cmluZyBtZXRob2Qgb24gc2VjdXJpdHlPcmlnaW5z
IHJldHVybnMgdGhlCisgICAgLy8gc3RyaW5nICJudWxsIiBmb3IgZW1wdHkgc2VjdXJpdHkgb3Jp
Z2lucyBhbmQgZm9yIHNlY3VyaXR5CisgICAgLy8gb3JpZ2lucyB0aGF0IHNob3VsZCBvbmx5IGFs
bG93IGFjY2VzcyB0byB0aGVtc2VsdmVzLiAgSW4gdGhpcworICAgIC8vIGNhc2UsIHdlIHVzZSB0
aGUgZ2xvYmFsIG9iamVjdCBhcyB0aGUgc2VjdXJpdHkgdG9rZW4gdG8gYXZvaWQKKyAgICAvLyBj
YWxsaW5nIGNhbkFjY2VzcyB3aGVuIGEgc2NyaXB0IGFjY2Vzc2VzIGl0cyBvd24gb2JqZWN0cy4K
KyAgICBpZiAodG9rZW4uaXNFbXB0eSgpIHx8IHRva2VuID09ICJudWxsIikgeworICAgICAgICBt
X2NvbnRleHQtPlVzZURlZmF1bHRTZWN1cml0eVRva2VuKCk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBDU3RyaW5nIHV0ZjhfdG9rZW4gPSB0b2tlbi51dGY4KCk7CisgICAgLy8gTk9U
RTogVjggZG9lcyBpZGVudGl0eSBjb21wYXJpc29uIGluIGZhc3QgcGF0aCwgbXVzdCB1c2UgYSBz
eW1ib2wKKyAgICAvLyBhcyB0aGUgc2VjdXJpdHkgdG9rZW4uCisgICAgbV9jb250ZXh0LT5TZXRT
ZWN1cml0eVRva2VuKHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCh1dGY4X3Rva2VuLmRhdGEoKSwgdXRm
OF90b2tlbi5sZW5ndGgoKSkpOworfQorCisKK3ZvaWQgVjhQcm94eTo6dXBkYXRlRG9jdW1lbnQo
KQoreworICAgIGlmICghbV9mcmFtZS0+ZG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgaWYgKG1fZ2xvYmFsLklzRW1wdHkoKSkgeworICAgICAgICBBU1NFUlQobV9jb250ZXh0Lklz
RW1wdHkoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBXZSBoYXZlIGEgbmV3
IGRvY3VtZW50IGFuZCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgY2FjaGUuCisgICAgVXBkYXRlRG9j
dW1lbnRXcmFwcGVyQ2FjaGUoKTsKKworICAgIHVwZGF0ZVNlY3VyaXR5T3JpZ2luKCk7Cit9CisK
K3ZvaWQgVjhQcm94eTo6dXBkYXRlU2VjdXJpdHlPcmlnaW4oKQoreworICAgIHY4OjpIYW5kbGVT
Y29wZSBzY29wZTsKKyAgICBTZXRTZWN1cml0eVRva2VuKCk7Cit9CisKKy8vIFNhbWUgb3JpZ2lu
IHBvbGljeSBpbXBsZW1lbnRhdGlvbjoKKy8vCisvLyBTYW1lIG9yaWdpbiBwb2xpY3kgcHJldmVu
dHMgSlMgY29kZSBmcm9tIGRvbWFpbiBBIGFjY2VzcyBKUyAmIERPTSBvYmplY3RzCisvLyBpbiBh
IGRpZmZlcmVudCBkb21haW4gQi4gVGhlcmUgYXJlIGV4Y2VwdGlvbnMgYW5kIHNldmVyYWwgb2Jq
ZWN0cyBhcmUKKy8vIGFjY2Vzc2libGUgYnkgY3Jvc3MtZG9tYWluIGNvZGUuIEZvciBleGFtcGxl
LCB0aGUgd2luZG93LmZyYW1lcyBvYmplY3QgaXMKKy8vIGFjY2Vzc2libGUgYnkgY29kZSBmcm9t
IGEgZGlmZmVyZW50IGRvbWFpbiwgYnV0IHdpbmRvdy5kb2N1bWVudCBpcyBub3QuCisvLworLy8g
VGhlIGJpbmRpbmcgY29kZSBzZXRzIHNlY3VyaXR5IGNoZWNrIGNhbGxiYWNrcyBvbiBhIGZ1bmN0
aW9uIHRlbXBsYXRlLAorLy8gYW5kIGFjY2Vzc2luZyBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRl
IGNhbGxzIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KKy8vIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBj
aGVja3Mgc2FtZSBvcmlnaW4gcG9saWN5LgorLy8KKy8vIENhbGxiYWNrIGZ1bmN0aW9ucyBhcmUg
ZXhwZW5zaXZlLiBWOCB1c2VzIGEgc2VjdXJpdHkgdG9rZW4gc3RyaW5nIHRvIGRvCisvLyBmYXN0
IGFjY2VzcyBjaGVja3MgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSBzb3VyY2UgYW5kIHRhcmdl
dCBhcmUgaW4gdGhlCisvLyBzYW1lIGRvbWFpbi4gQSBzZWN1cml0eSB0b2tlbiBpcyBhIHN0cmlu
ZyBvYmplY3QgdGhhdCByZXByZXNlbnRzCisvLyB0aGUgcHJvdG9jb2wvdXJsL3BvcnQgb2YgYSBk
b21haW4uCisvLworLy8gVGhlcmUgYXJlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYSBzZWN1cml0eSB0
b2tlbiBtYXRjaGluZyBpcyBub3QgZW5vdWdoLgorLy8gRm9yIGV4YW1wbGUsIEphdmFTY3JpcHQg
Y2FuIHNldCBpdHMgZG9tYWluIHRvIGEgc3VwZXIgZG9tYWluIGJ5IGNhbGxpbmcKKy8vIGRvY3Vt
ZW50LnNldERvbWFpbiguLi4pLiBJbiB0aGVzZSBjYXNlcywgdGhlIGJpbmRpbmcgY29kZSBjYW4g
cmVzZXQKKy8vIGEgY29udGV4dCdzIHNlY3VyaXR5IHRva2VuIHRvIGl0cyBnbG9iYWwgb2JqZWN0
IHNvIHRoYXQgdGhlIGZhc3QgYWNjZXNzCisvLyBjaGVjayB3aWxsIGFsd2F5cyBmYWlsLgorCisv
LyBDaGVjayBpZiB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dCBjYW4gYWNjZXNzIGEgdGFy
Z2V0IGZyYW1lLgorLy8gRmlyc3QgaXQgY2hlY2tzIHNhbWUgZG9tYWluIHBvbGljeSB1c2luZyB0
aGUgbGV4aWNhbCBjb250ZXh0CisvLworLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIEtKUzo6V2lu
ZG93OjphbGxvd3NBY2Nlc3NGcm9tKEV4ZWNTdGF0ZSosIFN0cmluZyYpLgorYm9vbCBWOFByb3h5
OjpDYW5BY2Nlc3NQcml2YXRlKERPTVdpbmRvdyogdGFyZ2V0V2luZG93KQoreworICAgIEFTU0VS
VCh0YXJnZXRXaW5kb3cpOworCisgICAgU3RyaW5nIG1lc3NhZ2U7CisKKyAgICBET01XaW5kb3cq
IG9yaWdpbldpbmRvdyA9IHJldHJpZXZlV2luZG93KCk7CisgICAgaWYgKG9yaWdpbldpbmRvdyA9
PSB0YXJnZXRXaW5kb3cpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFvcmlnaW5X
aW5kb3cpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IFNlY3VyaXR5T3JpZ2lu
KiBhY3RpdmVTZWN1cml0eU9yaWdpbiA9IG9yaWdpbldpbmRvdy0+c2VjdXJpdHlPcmlnaW4oKTsK
KyAgICBjb25zdCBTZWN1cml0eU9yaWdpbiogdGFyZ2V0U2VjdXJpdHlPcmlnaW4gPSB0YXJnZXRX
aW5kb3ctPnNlY3VyaXR5T3JpZ2luKCk7CisKKyAgICAvLyBXZSBoYXZlIHNlZW4gY3Jhc2hlcyB3
ZXJlIHRoZSBzZWN1cml0eSBvcmlnaW4gb2YgdGhlIHRhcmdldCBoYXMgbm90IGJlZW4KKyAgICAv
LyBpbml0aWFsaXplZC4gIERlZmVuZCBhZ2FpbnN0IHRoYXQuCisgICAgaWYgKCF0YXJnZXRTZWN1
cml0eU9yaWdpbikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGFjdGl2ZVNlY3Vy
aXR5T3JpZ2luLT5jYW5BY2Nlc3ModGFyZ2V0U2VjdXJpdHlPcmlnaW4pKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIC8vIEFsbG93IGFjY2VzcyB0byBhICJhYm91dDpibGFuayIgcGFnZSBp
ZiB0aGUgZHluYW1pYyBjb250ZXh0IGlzIGEKKyAgICAvLyBkZXRhY2hlZCBjb250ZXh0IG9mIHRo
ZSBzYW1lIGZyYW1lIGFzIHRoZSBibGFuayBwYWdlLgorICAgIGlmICh0YXJnZXRTZWN1cml0eU9y
aWdpbi0+aXNFbXB0eSgpICYmIG9yaWdpbldpbmRvdy0+ZnJhbWUoKSA9PSB0YXJnZXRXaW5kb3ct
PmZyYW1lKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQor
CisKK2Jvb2wgVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoRnJhbWUqIHRhcmdldCwgYm9vbCByZXBv
cnRFcnJvcikKK3sKKyAgICAvLyBUaGUgc3ViamVjdCBpcyBkZXRhY2hlZCBmcm9tIGEgZnJhbWUs
IGRlbnkgYWNjZXNzZXMuCisgICAgaWYgKCF0YXJnZXQpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIGlmICghQ2FuQWNjZXNzUHJpdmF0ZSh0YXJnZXQtPmRvbVdpbmRvdygpKSkgeworICAg
ICAgICBpZiAocmVwb3J0RXJyb3IpCisgICAgICAgICAgICBSZXBvcnRVbnNhZmVBY2Nlc3NUbyh0
YXJnZXQsIFJFUE9SVF9OT1cpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJl
dHVybiB0cnVlOworfQorCisKK2Jvb2wgVjhQcm94eTo6Q2hlY2tOb2RlU2VjdXJpdHkoTm9kZSog
bm9kZSkKK3sKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEZy
YW1lKiB0YXJnZXQgPSBub2RlLT5kb2N1bWVudCgpLT5mcmFtZSgpOworCisgICAgaWYgKCF0YXJn
ZXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBDYW5BY2Nlc3NGcmFtZSh0
YXJnZXQsIHRydWUpOworfQorCit2ODo6UGVyc2lzdGVudDx2ODo6Q29udGV4dD4gVjhQcm94eTo6
Y3JlYXRlTmV3Q29udGV4dCh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGdsb2JhbCkKK3sKKyAgICB2
ODo6UGVyc2lzdGVudDx2ODo6Q29udGV4dD4gcmVzdWx0OworCisgICAgLy8gQ3JlYXRlIGEgbmV3
IGVudmlyb25tZW50IHVzaW5nIGFuIGVtcHR5IHRlbXBsYXRlIGZvciB0aGUgc2hhZG93CisgICAg
Ly8gb2JqZWN0LiAgUmV1c2UgdGhlIGdsb2JhbCBvYmplY3QgaWYgb25lIGhhcyBiZWVuIGNyZWF0
ZWQgZWFybGllci4KKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0VGVtcGxhdGU+IGdsb2Jh
bFRlbXBsYXRlID0gVjhET01XaW5kb3c6OkdldFNoYWRvd09iamVjdFRlbXBsYXRlKCk7CisgICAg
aWYgKGdsb2JhbFRlbXBsYXRlLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKwor
ICAgIC8vIEluc3RhbGwgYSBzZWN1cml0eSBoYW5kbGVyIHdpdGggVjguCisgICAgZ2xvYmFsVGVt
cGxhdGUtPlNldEFjY2Vzc0NoZWNrQ2FsbGJhY2tzKCBWOEN1c3RvbTo6djhET01XaW5kb3dOYW1l
ZFNlY3VyaXR5Q2hlY2ssIFY4Q3VzdG9tOjp2OERPTVdpbmRvd0luZGV4ZWRTZWN1cml0eUNoZWNr
LCB2ODo6SW50ZWdlcjo6TmV3KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XKSk7CisKKyAgICAvLyBE
eW5hbWljYWxseSB0ZWxsIHY4IGFib3V0IG91ciBleHRlbnNpb25zIG5vdy4KKyAgICBjb25zdCBj
aGFyKiogZXh0ZW5zaW9uTmFtZXMgPSBuZXcgY29uc3QgY2hhcipbbV9leHRlbnNpb25zLnNpemUo
KV07CisgICAgaW50IGluZGV4ID0gMDsKKyAgICBmb3IgKFY4RXh0ZW5zaW9uTGlzdDo6aXRlcmF0
b3IgaXQgPSBtX2V4dGVuc2lvbnMuYmVnaW4oKTsgaXQgIT0gbV9leHRlbnNpb25zLmVuZCgpOyAr
K2l0KSB7CisgICAgICAgIC8vIE5vdGU6IHdlIGNoZWNrIHRoZSBsb2FkZXIgVVJMIGhlcmUgaW5z
dGVhZCBvZiB0aGUgZG9jdW1lbnQgVVJMCisgICAgICAgIC8vIGJlY2F1c2Ugd2UgbWlnaHQgYmUg
Y3VycmVudGx5IGxvYWRpbmcgYW4gVVJMIGludG8gYSBibGFuayBwYWdlLgorICAgICAgICAvLyBT
ZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTA5
MjQKKyAgICAgICAgaWYgKGl0LT5zY2hlbWUubGVuZ3RoKCkgPiAwICYmIChpdC0+c2NoZW1lICE9
IG1fZnJhbWUtPmxvYWRlcigpLT5hY3RpdmVEb2N1bWVudExvYWRlcigpLT51cmwoKS5wcm90b2Nv
bCgpIHx8IGl0LT5zY2hlbWUgIT0gbV9mcmFtZS0+cGFnZSgpLT5tYWluRnJhbWUoKS0+bG9hZGVy
KCktPmFjdGl2ZURvY3VtZW50TG9hZGVyKCktPnVybCgpLnByb3RvY29sKCkpKQorICAgICAgICAg
ICAgY29udGludWU7CisKKyAgICAgICAgZXh0ZW5zaW9uTmFtZXNbaW5kZXgrK10gPSBpdC0+ZXh0
ZW5zaW9uLT5uYW1lKCk7CisgICAgfQorICAgIHY4OjpFeHRlbnNpb25Db25maWd1cmF0aW9uIGV4
dGVuc2lvbnMoaW5kZXgsIGV4dGVuc2lvbk5hbWVzKTsKKyAgICByZXN1bHQgPSB2ODo6Q29udGV4
dDo6TmV3KCZleHRlbnNpb25zLCBnbG9iYWxUZW1wbGF0ZSwgZ2xvYmFsKTsKKyAgICBkZWxldGVb
XSBleHRlbnNpb25OYW1lczsKKyAgICBleHRlbnNpb25OYW1lcyA9IDA7CisKKyAgICByZXR1cm4g
cmVzdWx0OworfQorCisvLyBDcmVhdGUgYSBuZXcgZW52aXJvbm1lbnQgYW5kIHNldHVwIHRoZSBn
bG9iYWwgb2JqZWN0LgorLy8KKy8vIFRoZSBnbG9iYWwgb2JqZWN0IGNvcnJlc3BvbmRzIHRvIGEg
RE9NV2luZG93IGluc3RhbmNlLiAgSG93ZXZlciwgdG8KKy8vIGFsbG93IHByb3BlcnRpZXMgb2Yg
dGhlIEpTIERPTVdpbmRvdyBpbnN0YW5jZSB0byBiZSBzaGFkb3dlZCwgd2UKKy8vIHVzZSBhIHNo
YWRvdyBvYmplY3QgYXMgdGhlIGdsb2JhbCBvYmplY3QgYW5kIHVzZSB0aGUgSlMgRE9NV2luZG93
CisvLyBpbnN0YW5jZSBhcyB0aGUgcHJvdG90eXBlIGZvciB0aGF0IHNoYWRvdyBvYmplY3QuICBU
aGUgSlMgRE9NV2luZG93CisvLyBpbnN0YW5jZSBpcyB1bmRldGVjdGFibGUgZnJvbSBqYXZhc2Ny
aXB0IGNvZGUgYmVjYXVzZSB0aGUgX19wcm90b19fCisvLyBhY2Nlc3NvcnMgc2tpcCB0aGF0IG9i
amVjdC4KKy8vCisvLyBUaGUgc2hhZG93IG9iamVjdCBhbmQgdGhlIERPTVdpbmRvdyBpbnN0YW5j
ZSBhcmUgc2VlbiBhcyBvbmUgb2JqZWN0CisvLyBmcm9tIGphdmFzY3JpcHQuICBUaGUgamF2YXNj
cmlwdCBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byBhCisvLyBET01XaW5kb3cgaW5zdGFuY2Ug
aXMgdGhlIHNoYWRvdyBvYmplY3QuICBXaGVuIG1hcHBpbmcgYSBET01XaW5kb3cKKy8vIGluc3Rh
bmNlIHRvIGEgVjggb2JqZWN0LCB3ZSByZXR1cm4gdGhlIHNoYWRvdyBvYmplY3QuCisvLworLy8g
VG8gaW1wbGVtZW50IHNwbGl0LXdpbmRvdywgc2VlCisvLyAgIDEpIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzI0OQorLy8gICAyKSBodHRwczovL3dpa2kubW96aWxs
YS5vcmcvR2Vja286U3BsaXRXaW5kb3cKKy8vICAgMykgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxh
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjk2NjM5CisvLyB3ZSBuZWVkIHRvIHNwbGl0IHRoZSBzaGFk
b3cgb2JqZWN0IGZ1cnRoZXIgaW50byB0d28gb2JqZWN0czoKKy8vIGFuIG91dGVyIHdpbmRvdyBh
bmQgYW4gaW5uZXIgd2luZG93LiBUaGUgaW5uZXIgd2luZG93IGlzIHRoZSBoaWRkZW4KKy8vIHBy
b3RvdHlwZSBvZiB0aGUgb3V0ZXIgd2luZG93LiBUaGUgaW5uZXIgd2luZG93IGlzIHRoZSBkZWZh
dWx0CisvLyBnbG9iYWwgb2JqZWN0IG9mIHRoZSBjb250ZXh0LiBBIHZhcmlhYmxlIGRlY2xhcmVk
IGluIHRoZSBnbG9iYWwKKy8vIHNjb3BlIGlzIGEgcHJvcGVydHkgb2YgdGhlIGlubmVyIHdpbmRv
dy4KKy8vCisvLyBUaGUgb3V0ZXIgd2luZG93IHN0aWNrcyB0byBhIEZyYW1lLCBpdCBpcyBleHBv
c2VkIHRvIEphdmFTY3JpcHQKKy8vIHZpYSB3aW5kb3cud2luZG93LCB3aW5kb3cuc2VsZiwgd2lu
ZG93LnBhcmVudCwgZXRjLiBUaGUgb3V0ZXIgd2luZG93CisvLyBoYXMgYSBzZWN1cml0eSB0b2tl
biB3aGljaCBpcyB0aGUgZG9tYWluLiBUaGUgb3V0ZXIgd2luZG93IGNhbm5vdAorLy8gaGF2ZSBp
dHMgb3duIHByb3BlcnRpZXMuIHdpbmRvdy5mb28gPSAneCcgaXMgZGVsZWdhdGVkIHRvIHRoZQor
Ly8gaW5uZXIgd2luZG93LgorLy8KKy8vIFdoZW4gYSBmcmFtZSBuYXZpZ2F0ZXMgdG8gYSBuZXcg
cGFnZSwgdGhlIGlubmVyIHdpbmRvdyBpcyBjdXQgb2ZmCisvLyB0aGUgb3V0ZXIgd2luZG93LCBh
bmQgdGhlIG91dGVyIHdpbmRvdyBpZGVudGlmeSBpcyBwcmVzZXJ2ZWQgZm9yCisvLyB0aGUgZnJh
bWUuIEhvd2V2ZXIsIGEgbmV3IGlubmVyIHdpbmRvdyBpcyBjcmVhdGVkIGZvciB0aGUgbmV3IHBh
Z2UuCisvLyBJZiB0aGVyZSBhcmUgSlMgY29kZSBob2xkcyBhIGNsb3N1cmUgdG8gdGhlIG9sZCBp
bm5lciB3aW5kb3csCisvLyBpdCB3b24ndCBiZSBhYmxlIHRvIHJlYWNoIHRoZSBvdXRlciB3aW5k
b3cgdmlhIGl0cyBnbG9iYWwgb2JqZWN0Lgordm9pZCBWOFByb3h5OjpJbml0Q29udGV4dElmTmVl
ZGVkKCkKK3sKKyAgICAvLyBCYWlsIG91dCBpZiB0aGUgY29udGV4dCBoYXMgYWxyZWFkeSBiZWVu
IGluaXRpYWxpemVkLgorICAgIGlmICghbV9jb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgLy8gQ3JlYXRlIGEgaGFuZGxlIHNjb3BlIGZvciBhbGwgbG9jYWwgaGFuZGxl
cy4KKyAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CisKKyAgICAvLyBTZXR1cCB0aGUg
c2VjdXJpdHkgaGFuZGxlcnMgYW5kIG1lc3NhZ2UgbGlzdGVuZXIuICBUaGlzIG9ubHkgaGFzCisg
ICAgLy8gdG8gYmUgZG9uZSBvbmNlLgorICAgIHN0YXRpYyBib29sIGlzVjhJbml0aWFsaXplZCA9
IGZhbHNlOworICAgIGlmICghaXNWOEluaXRpYWxpemVkKSB7CisgICAgICAgIC8vIFRlbGxzIFY4
IG5vdCB0byBjYWxsIHRoZSBkZWZhdWx0IE9PTSBoYW5kbGVyLCBiaW5kaW5nIGNvZGUKKyAgICAg
ICAgLy8gd2lsbCBoYW5kbGUgaXQuCisgICAgICAgIHY4OjpWODo6SWdub3JlT3V0T2ZNZW1vcnlF
eGNlcHRpb24oKTsKKyAgICAgICAgdjg6OlY4OjpTZXRGYXRhbEVycm9ySGFuZGxlcihSZXBvcnRG
YXRhbEVycm9ySW5WOCk7CisKKyAgICAgICAgdjg6OlY4OjpTZXRHbG9iYWxHQ1Byb2xvZ3VlQ2Fs
bGJhY2soJkdDUHJvbG9ndWUpOworICAgICAgICB2ODo6Vjg6OlNldEdsb2JhbEdDRXBpbG9ndWVD
YWxsYmFjaygmR0NFcGlsb2d1ZSk7CisKKyAgICAgICAgdjg6OlY4OjpBZGRNZXNzYWdlTGlzdGVu
ZXIoSGFuZGxlQ29uc29sZU1lc3NhZ2UpOworCisgICAgICAgIHY4OjpWODo6U2V0RmFpbGVkQWNj
ZXNzQ2hlY2tDYWxsYmFja0Z1bmN0aW9uKFJlcG9ydFVuc2FmZUphdmFTY3JpcHRBY2Nlc3MpOwor
CisgICAgICAgIGlzVjhJbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorCisgICAgbV9jb250ZXh0
ID0gY3JlYXRlTmV3Q29udGV4dChtX2dsb2JhbCk7CisgICAgaWYgKG1fY29udGV4dC5Jc0VtcHR5
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFN0YXJ0aW5nIGZyb20gbm93LCB1c2UgbG9j
YWwgY29udGV4dCBvbmx5LgorICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IEdl
dENvbnRleHQoKTsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dFNjb3BlKGNvbnRleHQp
OworCisgICAgLy8gU3RvcmUgdGhlIGZpcnN0IGdsb2JhbCBvYmplY3QgY3JlYXRlZCBzbyB3ZSBj
YW4gcmV1c2UgaXQuCisgICAgaWYgKG1fZ2xvYmFsLklzRW1wdHkoKSkgeworICAgICAgICBtX2ds
b2JhbCA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcoY29udGV4dC0+R2xvYmFsKCkp
OworICAgICAgICAvLyBCYWlsIG91dCBpZiBhbGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBnbG9iYWwg
b2JqZWN0cyBmYWlscy4KKyAgICAgICAgaWYgKG1fZ2xvYmFsLklzRW1wdHkoKSkgeworICAgICAg
ICAgIERpc3Bvc2VDb250ZXh0SGFuZGxlcygpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorI2lmbmRlZiBOREVCVUcKKyAgICAgICAgUmVnaXN0ZXJHbG9iYWxIYW5kbGUoUFJPWFksIHRo
aXMsIG1fZ2xvYmFsKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIEFsbG9jYXRlIHN0cmluZ3Mg
dXNlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgICAgdjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBv
YmplY3RTdHJpbmcgPSB2ODo6U3RyaW5nOjpOZXcoIk9iamVjdCIpOworICAgIHY4OjpIYW5kbGU8
djg6OlN0cmluZz4gcHJvdG90eXBlU3RyaW5nID0gdjg6OlN0cmluZzo6TmV3KCJwcm90b3R5cGUi
KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IGltcGxpY2l0UHJvdG9TdHJpbmcgPSB2ODo6
U3RyaW5nOjpOZXcoIl9fcHJvdG9fXyIpOworICAgIC8vIEJhaWwgb3V0IGlmIGFsbG9jYXRpb24g
ZmFpbGVkLgorICAgIGlmIChvYmplY3RTdHJpbmcuSXNFbXB0eSgpIHx8IHByb3RvdHlwZVN0cmlu
Zy5Jc0VtcHR5KCkgfHwgaW1wbGljaXRQcm90b1N0cmluZy5Jc0VtcHR5KCkpIHsKKyAgICAgICAg
RGlzcG9zZUNvbnRleHRIYW5kbGVzKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAv
LyBBbGxvY2F0ZSBjbG9uZSBjYWNoZSBhbmQgcHJlLWFsbG9jYXRlZCBvYmplY3RzCisgICAgdjg6
OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmplY3QgPSB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0
KG1fZ2xvYmFsLT5HZXQob2JqZWN0U3RyaW5nKSk7CisgICAgbV9vYmplY3RQcm90b3R5cGUgPSB2
ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+OjpOZXcob2JqZWN0LT5HZXQocHJvdG90eXBlU3RyaW5n
KSk7CisgICAgbV93cmFwcGVyQm9pbGVycGxhdGVzID0gdjg6OlBlcnNpc3RlbnQ8djg6OkFycmF5
Pjo6TmV3KHY4OjpBcnJheTo6TmV3KFY4Q2xhc3NJbmRleDo6V1JBUFBFUl9UWVBFX0NPVU5UKSk7
CisgICAgLy8gQmFpbCBvdXQgaWYgYWxsb2NhdGlvbiBmYWlsZWQuCisgICAgaWYgKG1fb2JqZWN0
UHJvdG90eXBlLklzRW1wdHkoKSkgeworICAgICAgICBEaXNwb3NlQ29udGV4dEhhbmRsZXMoKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZm5kZWYgTkRFQlVHCisgICAgUmVnaXN0ZXJHbG9i
YWxIYW5kbGUoUFJPWFksIHRoaXMsIG1fb2JqZWN0UHJvdG90eXBlKTsKKyAgICBSZWdpc3Rlckds
b2JhbEhhbmRsZShQUk9YWSwgdGhpcywgbV93cmFwcGVyQm9pbGVycGxhdGVzKTsKKyNlbmRpZgor
CisgICAgLy8gQ3JlYXRlIGEgbmV3IEpTIHdpbmRvdyBvYmplY3QgYW5kIHVzZSBpdCBhcyB0aGUg
cHJvdG90eXBlIGZvciB0aGUKKyAgICAvLyBzaGFkb3cgZ2xvYmFsIG9iamVjdC4KKyAgICB2ODo6
SGFuZGxlPHY4OjpGdW5jdGlvbj4gd2luZG93Q29uc3RydWN0b3IgPSBHZXRDb25zdHJ1Y3RvcihW
OENsYXNzSW5kZXg6OkRPTVdJTkRPVyk7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGpzV2lu
ZG93ID0gU2FmZUFsbG9jYXRpb246Ok5ld0luc3RhbmNlKHdpbmRvd0NvbnN0cnVjdG9yKTsKKyAg
ICAvLyBCYWlsIG91dCBpZiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAgICBpZiAoanNXaW5kb3cuSXNF
bXB0eSgpKSB7CisgICAgICAgIERpc3Bvc2VDb250ZXh0SGFuZGxlcygpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgRE9NV2luZG93KiB3aW5kb3cgPSBtX2ZyYW1lLT5kb21XaW5kb3co
KTsKKworICAgIC8vIFdyYXAgdGhlIHdpbmRvdy4KKyAgICBTZXRET01XcmFwcGVyKGpzV2luZG93
LCBWOENsYXNzSW5kZXg6OlRvSW50KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XKSwgd2luZG93KTsK
KworICAgIHdpbmRvdy0+cmVmKCk7CisgICAgVjhQcm94eTo6U2V0SlNXcmFwcGVyRm9yRE9NT2Jq
ZWN0KHdpbmRvdywgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhqc1dpbmRvdykpOwor
CisgICAgLy8gSW5zZXJ0IHRoZSB3aW5kb3cgaW5zdGFuY2UgYXMgdGhlIHByb3RvdHlwZSBvZiB0
aGUgc2hhZG93IG9iamVjdC4KKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHY4X2dsb2JhbCA9
IGNvbnRleHQtPkdsb2JhbCgpOworICAgIHY4X2dsb2JhbC0+U2V0KGltcGxpY2l0UHJvdG9TdHJp
bmcsIGpzV2luZG93KTsKKworICAgIHVwZGF0ZURvY3VtZW50KCk7CisKKyAgICBTZXRTZWN1cml0
eVRva2VuKCk7CisKKyAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+ZGlzcGF0Y2hXaW5kb3dPYmplY3RB
dmFpbGFibGUoKTsKK30KKworCit2b2lkIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihpbnQgZXhj
ZXB0aW9uQ29kZSkKK3sKKyAgICBpZiAoZXhjZXB0aW9uQ29kZSA8PSAwKQorICAgICAgICByZXR1
cm47CisKKyAgICBFeGNlcHRpb25Db2RlRGVzY3JpcHRpb24gZGVzY3JpcHRpb247CisgICAgZ2V0
RXhjZXB0aW9uQ29kZURlc2NyaXB0aW9uKGV4Y2VwdGlvbkNvZGUsIGRlc2NyaXB0aW9uKTsKKwor
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBleGNlcHRpb247CisgICAgc3dpdGNoIChkZXNjcmlw
dGlvbi50eXBlKSB7CisgICAgY2FzZSBET01FeGNlcHRpb25UeXBlOgorICAgICAgICBleGNlcHRp
b24gPSBUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NQ09SRUVYQ0VQVElPTiwgRE9NQ29yZUV4
Y2VwdGlvbjo6Y3JlYXRlKGRlc2NyaXB0aW9uKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
UmFuZ2VFeGNlcHRpb25UeXBlOgorICAgICAgICBleGNlcHRpb24gPSBUb1Y4T2JqZWN0KFY4Q2xh
c3NJbmRleDo6UkFOR0VFWENFUFRJT04sIFJhbmdlRXhjZXB0aW9uOjpjcmVhdGUoZGVzY3JpcHRp
b24pKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFdmVudEV4Y2VwdGlvblR5cGU6CisgICAg
ICAgIGV4Y2VwdGlvbiA9IFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpFVkVOVEVYQ0VQVElPTiwg
RXZlbnRFeGNlcHRpb246OmNyZWF0ZShkZXNjcmlwdGlvbikpOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIFhNTEh0dHBSZXF1ZXN0RXhjZXB0aW9uVHlwZToKKyAgICAgICAgZXhjZXB0aW9uID0g
VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNURVhDRVBUSU9OLCBYTUxIdHRw
UmVxdWVzdEV4Y2VwdGlvbjo6Y3JlYXRlKGRlc2NyaXB0aW9uKSk7CisgICAgICAgIGJyZWFrOwor
I2lmIEVOQUJMRShTVkcpCisgICAgY2FzZSBTVkdFeGNlcHRpb25UeXBlOgorICAgICAgICBleGNl
cHRpb24gPSBUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1ZHRVhDRVBUSU9OLCBTVkdFeGNlcHRp
b246OmNyZWF0ZShkZXNjcmlwdGlvbikpOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmIEVO
QUJMRShYUEFUSCkKKyAgICBjYXNlIFhQYXRoRXhjZXB0aW9uVHlwZToKKyAgICAgICAgZXhjZXB0
aW9uID0gVG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlhQQVRIRVhDRVBUSU9OLCBYUGF0aEV4Y2Vw
dGlvbjo6Y3JlYXRlKGRlc2NyaXB0aW9uKSk7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAg
fQorCisgICAgQVNTRVJUKCFleGNlcHRpb24uSXNFbXB0eSgpKTsKKyAgICB2ODo6VGhyb3dFeGNl
cHRpb24oZXhjZXB0aW9uKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6OlRo
cm93RXJyb3IoRXJyb3JUeXBlIHR5cGUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpCit7CisgICAgc3dp
dGNoICh0eXBlKSB7CisgICAgY2FzZSBSQU5HRV9FUlJPUjoKKyAgICAgICAgcmV0dXJuIHY4OjpU
aHJvd0V4Y2VwdGlvbih2ODo6RXhjZXB0aW9uOjpSYW5nZUVycm9yKHY4U3RyaW5nKG1lc3NhZ2Up
KSk7CisgICAgY2FzZSBSRUZFUkVOQ0VfRVJST1I6CisgICAgICAgIHJldHVybiB2ODo6VGhyb3dF
eGNlcHRpb24odjg6OkV4Y2VwdGlvbjo6UmVmZXJlbmNlRXJyb3IodjhTdHJpbmcobWVzc2FnZSkp
KTsKKyAgICBjYXNlIFNZTlRBWF9FUlJPUjoKKyAgICAgICAgcmV0dXJuIHY4OjpUaHJvd0V4Y2Vw
dGlvbih2ODo6RXhjZXB0aW9uOjpTeW50YXhFcnJvcih2OFN0cmluZyhtZXNzYWdlKSkpOworICAg
IGNhc2UgVFlQRV9FUlJPUjoKKyAgICAgICAgcmV0dXJuIHY4OjpUaHJvd0V4Y2VwdGlvbih2ODo6
RXhjZXB0aW9uOjpUeXBlRXJyb3IodjhTdHJpbmcobWVzc2FnZSkpKTsKKyAgICBjYXNlIEdFTkVS
QUxfRVJST1I6CisgICAgICAgIHJldHVybiB2ODo6VGhyb3dFeGNlcHRpb24odjg6OkV4Y2VwdGlv
bjo6RXJyb3IodjhTdHJpbmcobWVzc2FnZSkpKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NF
UlQoZmFsc2UpOworICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKyAg
ICB9Cit9CisKK3Y4OjpMb2NhbDx2ODo6Q29udGV4dD4gVjhQcm94eTo6R2V0Q29udGV4dChGcmFt
ZSogZnJhbWUpCit7CisgICAgVjhQcm94eSogcHJveHkgPSByZXRyaWV2ZShmcmFtZSk7CisgICAg
aWYgKCFwcm94eSkKKyAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4oKTsKKwor
ICAgIHByb3h5LT5Jbml0Q29udGV4dElmTmVlZGVkKCk7CisgICAgcmV0dXJuIHByb3h5LT5HZXRD
b250ZXh0KCk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6Q29udGV4dD4gVjhQcm94eTo6R2V0Q3VycmVu
dENvbnRleHQoKQoreworICAgIHJldHVybiB2ODo6Q29udGV4dDo6R2V0Q3VycmVudCgpOworfQor
Cit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUgdHlwZSwgdm9pZCogaW1wKQoreworICAgIEFTU0VSVCh0eXBlICE9IFY4
Q2xhc3NJbmRleDo6RVZFTlRMSVNURU5FUik7CisgICAgQVNTRVJUKHR5cGUgIT0gVjhDbGFzc0lu
ZGV4OjpFVkVOVFRBUkdFVCk7CisgICAgQVNTRVJUKHR5cGUgIT0gVjhDbGFzc0luZGV4OjpFVkVO
VCk7CisKKyAgICBib29sIGlzQWN0aXZlRG9tT2JqZWN0ID0gZmFsc2U7CisgICAgc3dpdGNoICh0
eXBlKSB7CisjZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBOQU1FKSBjYXNlIFY4Q2xhc3NJbmRleDo6
VFlQRToKKyAgICAgICAgRE9NX05PREVfVFlQRVMoTUFLRV9DQVNFKQorI2lmIEVOQUJMRShTVkcp
CisgICAgICAgIFNWR19OT0RFX1RZUEVTKE1BS0VfQ0FTRSkKKyNlbmRpZgorICAgICAgICByZXR1
cm4gTm9kZVRvVjhPYmplY3Qoc3RhdGljX2Nhc3Q8Tm9kZSo+KGltcCkpOworICAgIGNhc2UgVjhD
bGFzc0luZGV4OjpDU1NWQUxVRToKKyAgICAgICAgcmV0dXJuIENTU1ZhbHVlVG9WOE9iamVjdChz
dGF0aWNfY2FzdDxDU1NWYWx1ZSo+KGltcCkpOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpDU1NS
VUxFOgorICAgICAgICByZXR1cm4gQ1NTUnVsZVRvVjhPYmplY3Qoc3RhdGljX2Nhc3Q8Q1NTUnVs
ZSo+KGltcCkpOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpTVFlMRVNIRUVUOgorICAgICAgICBy
ZXR1cm4gU3R5bGVTaGVldFRvVjhPYmplY3Qoc3RhdGljX2Nhc3Q8U3R5bGVTaGVldCo+KGltcCkp
OworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpET01XSU5ET1c6CisgICAgICAgIHJldHVybiBXaW5k
b3dUb1Y4T2JqZWN0KHN0YXRpY19jYXN0PERPTVdpbmRvdyo+KGltcCkpOworI2lmIEVOQUJMRShT
VkcpCisgICAgICAgIFNWR19OT05OT0RFX1RZUEVTKE1BS0VfQ0FTRSkKKyAgICAgICAgaWYgKHR5
cGUgPT0gVjhDbGFzc0luZGV4OjpTVkdFTEVNRU5USU5TVEFOQ0UpCisgICAgICAgICAgICByZXR1
cm4gU1ZHRWxlbWVudEluc3RhbmNlVG9WOE9iamVjdChzdGF0aWNfY2FzdDxTVkdFbGVtZW50SW5z
dGFuY2UqPihpbXApKTsKKyAgICAgICAgcmV0dXJuIFNWR09iamVjdFdpdGhDb250ZXh0VG9WOE9i
amVjdCh0eXBlLCBpbXApOworI2VuZGlmCisKKyAgICAgICAgQUNUSVZFX0RPTV9PQkpFQ1RfVFlQ
RVMoTUFLRV9DQVNFKQorICAgICAgICBpc0FjdGl2ZURvbU9iamVjdCA9IHRydWU7CisgICAgICAg
IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICB9CisKKyN1bmRlZiBNQUtF
X0NBU0UKKworICAgIGlmICghaW1wKQorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAg
IC8vIE5vbiBET00gbm9kZQorICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHJlc3VsdCA9
IGlzQWN0aXZlRG9tT2JqZWN0ID8gZ2V0QWN0aXZlRE9NT2JqZWN0TWFwKCkuZ2V0KGltcCkgOiBn
ZXRET01PYmplY3RNYXAoKS5nZXQoaW1wKTsKKyAgICBpZiAocmVzdWx0LklzRW1wdHkoKSkgewor
ICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhvYmogPSBJbnN0YW50aWF0ZVY4T2JqZWN0
KHR5cGUsIHR5cGUsIGltcCk7CisgICAgICAgIGlmICghdjhvYmouSXNFbXB0eSgpKSB7CisgICAg
ICAgICAgICAvLyBHbyB0aHJvdWdoIGJpZyBzd2l0Y2ggc3RhdGVtZW50LCBpdCBoYXMgc29tZSBk
dXBsaWNhdGlvbnMKKyAgICAgICAgICAgIC8vIHRoYXQgd2VyZSBoYW5kbGVkIGJ5IGNvZGUgYWJv
dmUgKHN1Y2ggYXMgQ1NTVkFMVUUsIENTU1JVTEUsIGV0YykuCisgICAgICAgICAgICBzd2l0Y2gg
KHR5cGUpIHsKKyNkZWZpbmUgTUFLRV9DQVNFKFRZUEUsIE5BTUUpIFwKKyAgICAgICAgICAgIGNh
c2UgVjhDbGFzc0luZGV4OjpUWVBFOiBzdGF0aWNfY2FzdDxOQU1FKj4oaW1wKS0+cmVmKCk7IGJy
ZWFrOworICAgICAgICAgICAgICAgIERPTV9PQkpFQ1RfVFlQRVMoTUFLRV9DQVNFKQorI3VuZGVm
IE1BS0VfQ0FTRQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBU1NFUlQo
ZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gdjg6OlBlcnNpc3Rl
bnQ8djg6Ok9iamVjdD46Ok5ldyh2OG9iaik7CisgICAgICAgICAgICBpZiAoaXNBY3RpdmVEb21P
YmplY3QpCisgICAgICAgICAgICAgICAgU2V0SlNXcmFwcGVyRm9yQWN0aXZlRE9NT2JqZWN0KGlt
cCwgcmVzdWx0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBTZXRKU1dyYXBw
ZXJGb3JET01PYmplY3QoaW1wLCByZXN1bHQpOworCisgICAgICAgICAgICAvLyBTcGVjaWFsIGNh
c2UgZm9yIG5vbi1ub2RlIG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIGEKKyAgICAgICAgICAgIC8v
IERPTVdpbmRvdy4gQm90aCBTYWZhcmkgYW5kIEZGIGxldCB0aGUgSlMgd3JhcHBlcnMgZm9yIHRo
ZXNlCisgICAgICAgICAgICAvLyBvYmplY3RzIHN1cnZpdmUgR0MuIFRvIG1pbWljIHRoZWlyIGJl
aGF2aW9yLCBWOCBjcmVhdGVzCisgICAgICAgICAgICAvLyBoaWRkZW4gcmVmZXJlbmNlcyBmcm9t
IHRoZSBET01XaW5kb3cgdG8gdGhlc2Ugd3JhcHBlcgorICAgICAgICAgICAgLy8gb2JqZWN0cy4g
VGhlc2UgcmVmZXJlbmNlcyBnZXQgY2xlYXJlZCB3aGVuIHRoZSBET01XaW5kb3cgaXMKKyAgICAg
ICAgICAgIC8vIHJldXNlZCBieSBhIG5ldyBwYWdlLgorICAgICAgICAgICAgc3dpdGNoICh0eXBl
KSB7CisgICAgICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q09OU09MRToKKyAgICAgICAgICAg
ICAgICBTZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2Uoc3RhdGljX2Nhc3Q8Q29uc29sZSo+KGltcCkt
PmZyYW1lKCksIFY4Q3VzdG9tOjprRE9NV2luZG93Q29uc29sZUluZGV4LCByZXN1bHQpOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhJU1RP
Ulk6CisgICAgICAgICAgICAgICAgU2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKHN0YXRpY19jYXN0
PEhpc3RvcnkqPihpbXApLT5mcmFtZSgpLCBWOEN1c3RvbTo6a0RPTVdpbmRvd0hpc3RvcnlJbmRl
eCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVjhD
bGFzc0luZGV4OjpOQVZJR0FUT1I6CisgICAgICAgICAgICAgICAgU2V0SGlkZGVuV2luZG93UmVm
ZXJlbmNlKHN0YXRpY19jYXN0PE5hdmlnYXRvcio+KGltcCktPmZyYW1lKCksIFY4Q3VzdG9tOjpr
RE9NV2luZG93TmF2aWdhdG9ySW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6U0NSRUVOOgorICAgICAgICAgICAgICAg
IFNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShzdGF0aWNfY2FzdDxTY3JlZW4qPihpbXApLT5mcmFt
ZSgpLCBWOEN1c3RvbTo6a0RPTVdpbmRvd1NjcmVlbkluZGV4LCByZXN1bHQpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OkxPQ0FUSU9OOgor
ICAgICAgICAgICAgICAgIFNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShzdGF0aWNfY2FzdDxMb2Nh
dGlvbio+KGltcCktPmZyYW1lKCksIFY4Q3VzdG9tOjprRE9NV2luZG93TG9jYXRpb25JbmRleCwg
cmVzdWx0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVjhDbGFz
c0luZGV4OjpET01TRUxFQ1RJT046CisgICAgICAgICAgICAgICAgU2V0SGlkZGVuV2luZG93UmVm
ZXJlbmNlKHN0YXRpY19jYXN0PERPTVNlbGVjdGlvbio+KGltcCktPmZyYW1lKCksIFY4Q3VzdG9t
OjprRE9NV2luZG93RE9NU2VsZWN0aW9uSW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6QkFSSU5GTzogeworICAgICAg
ICAgICAgICAgIEJhckluZm8qIGJhcmluZm8gPSBzdGF0aWNfY2FzdDxCYXJJbmZvKj4oaW1wKTsK
KyAgICAgICAgICAgICAgICBGcmFtZSogZnJhbWUgPSBiYXJpbmZvLT5mcmFtZSgpOworICAgICAg
ICAgICAgICAgIHN3aXRjaCAoYmFyaW5mby0+dHlwZSgpKSB7CisgICAgICAgICAgICAgICAgY2Fz
ZSBCYXJJbmZvOjpMb2NhdGlvbmJhcjoKKyAgICAgICAgICAgICAgICAgICAgU2V0SGlkZGVuV2lu
ZG93UmVmZXJlbmNlKGZyYW1lLCBWOEN1c3RvbTo6a0RPTVdpbmRvd0xvY2F0aW9uYmFySW5kZXgs
IHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNh
c2UgQmFySW5mbzo6TWVudWJhcjoKKyAgICAgICAgICAgICAgICAgICAgU2V0SGlkZGVuV2luZG93
UmVmZXJlbmNlKGZyYW1lLCBWOEN1c3RvbTo6a0RPTVdpbmRvd01lbnViYXJJbmRleCwgcmVzdWx0
KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCYXJJ
bmZvOjpQZXJzb25hbGJhcjoKKyAgICAgICAgICAgICAgICAgICAgU2V0SGlkZGVuV2luZG93UmVm
ZXJlbmNlKGZyYW1lLCBWOEN1c3RvbTo6a0RPTVdpbmRvd1BlcnNvbmFsYmFySW5kZXgsIHJlc3Vs
dCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQmFy
SW5mbzo6U2Nyb2xsYmFyczoKKyAgICAgICAgICAgICAgICAgICAgU2V0SGlkZGVuV2luZG93UmVm
ZXJlbmNlKGZyYW1lLCBWOEN1c3RvbTo6a0RPTVdpbmRvd1Njcm9sbGJhcnNJbmRleCwgcmVzdWx0
KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCYXJJ
bmZvOjpTdGF0dXNiYXI6CisgICAgICAgICAgICAgICAgICAgIFNldEhpZGRlbldpbmRvd1JlZmVy
ZW5jZShmcmFtZSwgVjhDdXN0b206OmtET01XaW5kb3dTdGF0dXNiYXJJbmRleCwgcmVzdWx0KTsK
KyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCYXJJbmZv
OjpUb29sYmFyOgorICAgICAgICAgICAgICAgICAgICBTZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2Uo
ZnJhbWUsIFY4Q3VzdG9tOjprRE9NV2luZG93VG9vbGJhckluZGV4LCByZXN1bHQpOworICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBy
ZXN1bHQ7Cit9CisKKwordm9pZCBWOFByb3h5OjpTZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2UoRnJh
bWUqIGZyYW1lLCBjb25zdCBpbnQgaW50ZXJuYWxJbmRleCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0
PiBqc09iamVjdCkKK3sKKyAgICAvLyBHZXQgRE9NV2luZG93CisgICAgaWYgKCFmcmFtZSkKKyAg
ICAgICAgcmV0dXJuOyAgLy8gT2JqZWN0IG1pZ2h0IGJlIGRldGFjaGVkIGZyb20gd2luZG93Cisg
ICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IEdldENvbnRleHQoZnJhbWUpOwor
ICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJU
KGludGVybmFsSW5kZXggPCBWOEN1c3RvbTo6a0RPTVdpbmRvd0ludGVybmFsRmllbGRDb3VudCk7
CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGdsb2JhbCA9IGNvbnRleHQtPkdsb2JhbCgp
OworICAgIC8vIExvb2sgZm9yIHJlYWwgRE9NIHdyYXBwZXIuCisgICAgZ2xvYmFsID0gTG9va3Vw
RE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgZ2xvYmFsKTsKKyAgICBBU1NFUlQo
IWdsb2JhbC5Jc0VtcHR5KCkpOworICAgIEFTU0VSVChnbG9iYWwtPkdldEludGVybmFsRmllbGQo
aW50ZXJuYWxJbmRleCktPklzVW5kZWZpbmVkKCkpOworICAgIGdsb2JhbC0+U2V0SW50ZXJuYWxG
aWVsZChpbnRlcm5hbEluZGV4LCBqc09iamVjdCk7Cit9CisKKworVjhDbGFzc0luZGV4OjpWOFdy
YXBwZXJUeXBlIFY4UHJveHk6OkdldERPTVdyYXBwZXJUeXBlKHY4OjpIYW5kbGU8djg6Ok9iamVj
dD4gb2JqZWN0KQoreworICAgIEFTU0VSVChNYXliZURPTVdyYXBwZXIob2JqZWN0KSk7CisgICAg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IHR5cGUgPSBvYmplY3QtPkdldEludGVybmFsRmllbGQoVjhD
dXN0b206OmtET01XcmFwcGVyVHlwZUluZGV4KTsKKyAgICByZXR1cm4gVjhDbGFzc0luZGV4OjpG
cm9tSW50KHR5cGUtPkludDMyVmFsdWUoKSk7Cit9CisKKwordm9pZCogVjhQcm94eTo6VG9OYXRp
dmVPYmplY3RJbXBsKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gb2JqZWN0KQoreworICAgIC8vIE5hdGl2ZSBldmVudCBsaXN0ZW5lciBpcyBw
ZXIgZnJhbWUsIGl0IGNhbm5vdCBiZSBoYW5kbGVkIGJ5IHRoaXMgZ2VuZXJpYyBmdW5jdGlvbi4K
KyAgICBBU1NFUlQodHlwZSAhPSBWOENsYXNzSW5kZXg6OkVWRU5UTElTVEVORVIpOworICAgIEFT
U0VSVCh0eXBlICE9IFY4Q2xhc3NJbmRleDo6RVZFTlRUQVJHRVQpOworCisgICAgQVNTRVJUKE1h
eWJlRE9NV3JhcHBlcihvYmplY3QpKTsKKworICAgIHN3aXRjaCAodHlwZSkgeworI2RlZmluZSBN
QUtFX0NBU0UoVFlQRSwgTkFNRSkgY2FzZSBWOENsYXNzSW5kZXg6OlRZUEU6CisgICAgICAgIERP
TV9OT0RFX1RZUEVTKE1BS0VfQ0FTRSkKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBTVkdfTk9E
RV9UWVBFUyhNQUtFX0NBU0UpCisjZW5kaWYKKyAgICAgICAgQVNTRVJUKGZhbHNlKTsKKyAgICAg
ICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUOgor
ICAgICAgICByZXR1cm4gRE9NV3JhcHBlclRvTmF0aXZlPFhNTEh0dHBSZXF1ZXN0PihvYmplY3Qp
OworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpFVkVOVDoKKyAgICAgICAgcmV0dXJuIERPTVdyYXBw
ZXJUb05hdGl2ZTxFdmVudD4ob2JqZWN0KTsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q1NTUlVM
RToKKyAgICAgICAgcmV0dXJuIERPTVdyYXBwZXJUb05hdGl2ZTxDU1NSdWxlPihvYmplY3QpOwor
ICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyN1bmRlZiBNQUtFX0NBU0UKKwor
ICAgIHJldHVybiBET01XcmFwcGVyVG9OYXRpdmU8dm9pZD4ob2JqZWN0KTsKK30KKworCit2b2lk
KiBWOFByb3h5OjpUb1NWR1BPRFR5cGVJbXBsKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0
eXBlLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gb2JqZWN0KQoreworICByZXR1cm4gSXNXcmFwcGVy
T2ZUeXBlKG9iamVjdCwgdHlwZSkgPyBET01XcmFwcGVyVG9OYXRpdmU8dm9pZD4ob2JqZWN0KSA6
IE5VTEw7Cit9CisKKwordjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBWOFByb3h5OjpMb29rdXBET01X
cmFwcGVyKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gdmFsdWUpCit7CisgICAgaWYgKHZhbHVlLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
IG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlv
blRlbXBsYXRlPiBkZXNjID0gVjhQcm94eTo6R2V0VGVtcGxhdGUodHlwZSk7CisgICAgd2hpbGUg
KHZhbHVlLT5Jc09iamVjdCgpKSB7CisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2Jq
ZWN0ID0gdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2YWx1ZSk7CisgICAgICAgIGlmIChk
ZXNjLT5IYXNJbnN0YW5jZShvYmplY3QpKQorICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKKwor
ICAgICAgICB2YWx1ZSA9IG9iamVjdC0+R2V0UHJvdG90eXBlKCk7CisgICAgfQorICAgIHJldHVy
biBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworfQorCit2b2lkKiBWOFByb3h5OjpET01XcmFw
cGVyVG9Ob2RlSGVscGVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKK3sKKyAgICBBU1NF
UlQoTWF5YmVET01XcmFwcGVyKHZhbHVlKSk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+
IG9iamVjdCA9IHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodmFsdWUpOworCisgICAgQVNT
RVJUKEdldERPTVdyYXBwZXJUeXBlKG9iamVjdCkgPT0gVjhDbGFzc0luZGV4OjpOT0RFKTsKKwor
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3cmFwcGVyID0gb2JqZWN0LT5HZXRJbnRlcm5hbEZp
ZWxkKFY4Q3VzdG9tOjprRE9NV3JhcHBlck9iamVjdEluZGV4KTsKKyAgICByZXR1cm4gRXh0cmFj
dENQb2ludGVyPE5vZGU+KHdyYXBwZXIpOworfQorCisKK1Bhc3NSZWZQdHI8Tm9kZUZpbHRlcj4g
VjhQcm94eTo6VG9OYXRpdmVOb2RlRmlsdGVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBmaWx0ZXIp
Cit7CisgICAgLy8gQSBOb2RlRmlsdGVyIGlzIHVzZWQgd2hlbiB3YWxraW5nIHRocm91Z2ggYSBE
T00gdHJlZSBvciBpdGVyYXRpbmcgdHJlZQorICAgIC8vIG5vZGVzLgorICAgIC8vIFRPRE86IHdl
IG1heSB3YW50IHRvIGNhY2hlIE5vZGVGaWx0ZXJDb25kaXRpb24gYW5kIE5vZGVGaWx0ZXIKKyAg
ICAvLyBvYmplY3QsIGJ1dCBpdCBpcyBtaW5vci4KKyAgICAvLyBOb2RlRmlsdGVyIGlzIHBhc3Nl
ZCB0byBOb2RlSXRlcmF0b3IgdGhhdCBoYXMgYSByZWYgY291bnRlZCBwb2ludGVyCisgICAgLy8g
dG8gTm9kZUZpbHRlci4gTm9kZUZpbHRlciBoYXMgYSByZWYgY291bnRlZCBwb2ludGVyIHRvIE5v
ZGVGaWx0ZXJDb25kaXRpb24uCisgICAgLy8gSW4gTm9kZUZpbHRlckNvbmRpdGlvbiwgZmlsdGVy
IG9iamVjdCBpcyBwZXJzaXN0ZWQgaW4gaXRzIGNvbnN0cnVjdG9yLAorICAgIC8vIGFuZCBkaXNw
b3NlZCBpbiBpdHMgZGVzdHJ1Y3Rvci4KKyAgICBpZiAoIWZpbHRlci0+SXNGdW5jdGlvbigpKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIE5vZGVGaWx0ZXJDb25kaXRpb24qIGNvbmQgPSBuZXcg
VjhOb2RlRmlsdGVyQ29uZGl0aW9uKGZpbHRlcik7CisgICAgcmV0dXJuIE5vZGVGaWx0ZXI6OmNy
ZWF0ZShjb25kKTsKK30KKworCit2ODo6TG9jYWw8djg6Ok9iamVjdD4gVjhQcm94eTo6SW5zdGFu
dGlhdGVWOE9iamVjdChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgZGVzY1R5cGUsIFY4Q2xh
c3NJbmRleDo6VjhXcmFwcGVyVHlwZSBjcHRyVHlwZSwgdm9pZCogaW1wKQoreworICAgIC8vIE1h
a2UgYSBzcGVjaWFsIGNhc2UgZm9yIGRvY3VtZW50LmFsbAorICAgIGlmIChkZXNjVHlwZSA9PSBW
OENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OICYmIHN0YXRpY19jYXN0PEhUTUxDb2xsZWN0aW9u
Kj4oaW1wKS0+dHlwZSgpID09IERvY0FsbCkKKyAgICAgICAgZGVzY1R5cGUgPSBWOENsYXNzSW5k
ZXg6OlVOREVURUNUQUJMRUhUTUxDT0xMRUNUSU9OOworCisgICAgVjhQcm94eSogcHJveHkgPSBW
OFByb3h5OjpyZXRyaWV2ZSgpOworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBpbnN0YW5jZTsK
KyAgICBpZiAocHJveHkpCisgICAgICAgIGluc3RhbmNlID0gcHJveHktPkNyZWF0ZVdyYXBwZXJG
cm9tQ2FjaGUoZGVzY1R5cGUpOworICAgIGVsc2UgeworICAgICAgICB2ODo6TG9jYWw8djg6OkZ1
bmN0aW9uPiBmdW5jdGlvbiA9IEdldFRlbXBsYXRlKGRlc2NUeXBlKS0+R2V0RnVuY3Rpb24oKTsK
KyAgICAgICAgaW5zdGFuY2UgPSBTYWZlQWxsb2NhdGlvbjo6TmV3SW5zdGFuY2UoZnVuY3Rpb24p
OworICAgIH0KKyAgICBpZiAoIWluc3RhbmNlLklzRW1wdHkoKSkgeworICAgICAgICAvLyBBdm9p
ZCBzZXR0aW5nIHRoZSBET00gd3JhcHBlciBmb3IgZmFpbGVkIGFsbG9jYXRpb25zLgorICAgICAg
ICBTZXRET01XcmFwcGVyKGluc3RhbmNlLCBWOENsYXNzSW5kZXg6OlRvSW50KGNwdHJUeXBlKSwg
aW1wKTsKKyAgICB9CisgICAgcmV0dXJuIGluc3RhbmNlOworfQorCit2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gVjhQcm94eTo6Q2hlY2tOZXdMZWdhbChjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKQor
eworICAgIGlmICghQWxsb3dBbGxvY2F0aW9uOjptX2N1cnJlbnQpCisgICAgICAgIHJldHVybiBU
aHJvd0Vycm9yKFRZUEVfRVJST1IsICJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7CisKKyAgICByZXR1
cm4gYXJncy5UaGlzKCk7Cit9CisKK3ZvaWQgVjhQcm94eTo6U2V0RE9NV3JhcHBlcih2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+IG9iamVjdCwgaW50IHR5cGUsIHZvaWQqIGNwdHIpCit7CisgIEFTU0VS
VChvYmplY3QtPkludGVybmFsRmllbGRDb3VudCgpID49IDIpOworICBvYmplY3QtPlNldEludGVy
bmFsRmllbGQoVjhDdXN0b206OmtET01XcmFwcGVyT2JqZWN0SW5kZXgsIFdyYXBDUG9pbnRlcihj
cHRyKSk7CisgIG9iamVjdC0+U2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RPTVdyYXBwZXJU
eXBlSW5kZXgsIHY4OjpJbnRlZ2VyOjpOZXcodHlwZSkpOworfQorCisKKyNpZm5kZWYgTkRFQlVH
Citib29sIFY4UHJveHk6Ok1heWJlRE9NV3JhcHBlcih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFs
dWUpCit7CisgICAgaWYgKHZhbHVlLklzRW1wdHkoKSB8fCAhdmFsdWUtPklzT2JqZWN0KCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqZWN0
ID0gdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2YWx1ZSk7CisgICAgaWYgKG9iamVjdC0+
SW50ZXJuYWxGaWVsZENvdW50KCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
QVNTRVJUKG9iamVjdC0+SW50ZXJuYWxGaWVsZENvdW50KCkgPj0gVjhDdXN0b206OmtEZWZhdWx0
V3JhcHBlckludGVybmFsRmllbGRDb3VudCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4g
dHlwZSA9IG9iamVjdC0+R2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RPTVdyYXBwZXJUeXBl
SW5kZXgpOworICAgIEFTU0VSVCh0eXBlLT5Jc0ludDMyKCkpOworICAgIEFTU0VSVChWOENsYXNz
SW5kZXg6OklOVkFMSURfQ0xBU1NfSU5ERVggPCB0eXBlLT5JbnQzMlZhbHVlKCkgJiYgdHlwZS0+
SW50MzJWYWx1ZSgpIDwgVjhDbGFzc0luZGV4OjpDTEFTU0lOREVYX0VORCk7CisKKyAgICB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcHBlciA9IG9iamVjdC0+R2V0SW50ZXJuYWxGaWVsZChWOEN1
c3RvbTo6a0RPTVdyYXBwZXJPYmplY3RJbmRleCk7CisgICAgQVNTRVJUKHdyYXBwZXItPklzTnVt
YmVyKCkgfHwgd3JhcHBlci0+SXNFeHRlcm5hbCgpKTsKKworICAgIHJldHVybiB0cnVlOworfQor
I2VuZGlmCisKKworYm9vbCBWOFByb3h5OjpJc0RPTUV2ZW50V3JhcHBlcih2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4gdmFsdWUpCit7CisgICAgLy8gQWxsIGtpbmRzIG9mIGV2ZW50cyB1c2UgRVZFTlQg
YXMgZG9tIHR5cGUgaW4gSlMgd3JhcHBlcnMuCisgICAgLy8gU2VlIEV2ZW50VG9WOE9iamVjdAor
ICAgIHJldHVybiBJc1dyYXBwZXJPZlR5cGUodmFsdWUsIFY4Q2xhc3NJbmRleDo6RVZFTlQpOwor
fQorCitib29sIFY4UHJveHk6OklzV3JhcHBlck9mVHlwZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4g
dmFsdWUsIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBjbGFzc1R5cGUpCit7CisgICAgaWYg
KHZhbHVlLklzRW1wdHkoKSB8fCAhdmFsdWUtPklzT2JqZWN0KCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjg6OkhhbmRsZTx2
ODo6T2JqZWN0Pjo6Q2FzdCh2YWx1ZSk7CisgICAgaWYgKG9iamVjdC0+SW50ZXJuYWxGaWVsZENv
dW50KCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQVNTRVJUKG9iamVjdC0+
SW50ZXJuYWxGaWVsZENvdW50KCkgPj0gVjhDdXN0b206OmtEZWZhdWx0V3JhcHBlckludGVybmFs
RmllbGRDb3VudCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcHBlciA9IG9iamVj
dC0+R2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RPTVdyYXBwZXJPYmplY3RJbmRleCk7Cisg
ICAgQVNTRVJUKHdyYXBwZXItPklzTnVtYmVyKCkgfHwgd3JhcHBlci0+SXNFeHRlcm5hbCgpKTsK
KworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB0eXBlID0gb2JqZWN0LT5HZXRJbnRlcm5hbEZp
ZWxkKFY4Q3VzdG9tOjprRE9NV3JhcHBlclR5cGVJbmRleCk7CisgICAgQVNTRVJUKHR5cGUtPklz
SW50MzIoKSk7CisgICAgQVNTRVJUKFY4Q2xhc3NJbmRleDo6SU5WQUxJRF9DTEFTU19JTkRFWCA8
IHR5cGUtPkludDMyVmFsdWUoKSAmJiB0eXBlLT5JbnQzMlZhbHVlKCkgPCBWOENsYXNzSW5kZXg6
OkNMQVNTSU5ERVhfRU5EKTsKKworICAgIHJldHVybiBWOENsYXNzSW5kZXg6OkZyb21JbnQodHlw
ZS0+SW50MzJWYWx1ZSgpKSA9PSBjbGFzc1R5cGU7Cit9CisKKyNpZiBFTkFCTEUoVklERU8pCisj
ZGVmaW5lIEZPUl9FQUNIX1ZJREVPX1RBRyhtYWNybykgICAgICAgICAgICAgICAgICBcCisgICAg
bWFjcm8oYXVkaW8sIEFVRElPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFj
cm8oc291cmNlLCBTT1VSQ0UpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8o
dmlkZW8sIFZJREVPKQorI2Vsc2UKKyNkZWZpbmUgRk9SX0VBQ0hfVklERU9fVEFHKG1hY3JvKQor
I2VuZGlmCisKKyNkZWZpbmUgRk9SX0VBQ0hfVEFHKG1hY3JvKSAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICBtYWNybyhhLCBBTkNIT1IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICBtYWNybyhhcHBsZXQsIEFQUExFVCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICBtYWNybyhhcmVhLCBBUkVBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICBtYWNybyhiYXNlLCBCQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBt
YWNybyhiYXNlZm9udCwgQkFTRUZPTlQpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNy
byhibG9ja3F1b3RlLCBCTE9DS1FVT1RFKSAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhi
b2R5LCBCT0RZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhiciwg
QlIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhidXR0b24s
IEJVVFRPTikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhjYXB0aW9uLCBU
QUJMRUNBUFRJT04pICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhjb2wsIFRBQkxFQ09M
KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhjb2xncm91cCwgVEFCTEVD
T0wpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhkZWwsIE1PRCkgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhjYW52YXMsIENBTlZBUykgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhkaXIsIERJUkVDVE9SWSkgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhkaXYsIERJVikgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICBtYWNybyhkbCwgRExJU1QpICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFwKKyAgICBtYWNybyhlbWJlZCwgRU1CRUQpICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBtYWNybyhmaWVsZHNldCwgRklFTERTRVQpICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICBtYWNybyhmb250LCBGT05UKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICBtYWNybyhmb3JtLCBGT1JNKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICBtYWNybyhmcmFtZSwgRlJBTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICBtYWNybyhmcmFtZXNldCwgRlJBTUVTRVQpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBt
YWNybyhoMSwgSEVBRElORykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNy
byhoMiwgSEVBRElORykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyho
MywgSEVBRElORykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhoNCwg
SEVBRElORykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhoNSwgSEVB
RElORykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhoNiwgSEVBRElO
RykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhoZWFkLCBIRUFEKSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhociwgSFIpICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhodG1sLCBIVE1MKSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhpbWcsIElNQUdFKSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhpZnJhbWUsIElGUkFNRSkgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhpbWFnZSwgSU1BR0UpICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICBtYWNybyhpbnB1dCwgSU5QVVQpICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFwKKyAgICBtYWNybyhpbnMsIE1PRCkgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBtYWNybyhpc2luZGV4LCBJU0lOREVYKSAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICBtYWNybyhrZXlnZW4sIFNFTEVDVCkgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICBtYWNybyhsYWJlbCwgTEFCRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICBtYWNybyhsZWdlbmQsIExFR0VORCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICBtYWNybyhsaSwgTEkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBt
YWNybyhsaW5rLCBMSU5LKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNy
byhsaXN0aW5nLCBQUkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyht
YXAsIE1BUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhtYXJx
dWVlLCBNQVJRVUVFKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhtZW51LCBN
RU5VKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhtZXRhLCBNRVRB
KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhvYmplY3QsIE9CSkVD
VCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhvbCwgT0xJU1QpICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhvcHRncm91cCwgT1BUR1JPVVAp
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhvcHRpb24sIE9QVElPTikgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhwLCBQQVJBR1JBUEgpICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhwYXJhbSwgUEFSQU0pICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICBtYWNybyhwcmUsIFBSRSkgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFwKKyAgICBtYWNybyhxLCBRVU9URSkgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBtYWNybyhzY3JpcHQsIFNDUklQVCkgICAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICBtYWNybyhzZWxlY3QsIFNFTEVDVCkgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICBtYWNybyhzdHlsZSwgU1RZTEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICBtYWNybyh0YWJsZSwgVEFCTEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICBtYWNybyh0aGVhZCwgVEFCTEVTRUNUSU9OKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBt
YWNybyh0Ym9keSwgVEFCTEVTRUNUSU9OKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNy
byh0Zm9vdCwgVEFCTEVTRUNUSU9OKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0
ZCwgVEFCTEVDRUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0aCwg
VEFCTEVDRUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0ciwgVEFC
TEVST1cpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0ZXh0YXJlYSwg
VEVYVEFSRUEpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0aXRsZSwgVElUTEUp
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh1bCwgVUxJU1QpICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh4bXAsIFBSRSkKKworVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlIFY4UHJveHk6OkdldEhUTUxFbGVtZW50VHlwZShIVE1MRWxl
bWVudCogZWxlbWVudCkKK3sKKyAgICBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFY4Q2xhc3NJbmRl
eDo6VjhXcmFwcGVyVHlwZT4gbWFwOworICAgIGlmIChtYXAuaXNFbXB0eSgpKSB7CisjZGVmaW5l
IEFERF9UT19IQVNIX01BUCh0YWcsIG5hbWUpIFwKKyAgICAgICAgbWFwLnNldCgjdGFnLCBWOENs
YXNzSW5kZXg6OkhUTUwjI25hbWUjI0VMRU1FTlQpOworICAgICAgICBGT1JfRUFDSF9UQUcoQURE
X1RPX0hBU0hfTUFQKQorI2lmIEVOQUJMRShWSURFTykKKyAgICAgICAgaWYgKE1lZGlhUGxheWVy
Ojppc0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICBGT1JfRUFDSF9WSURFT19UQUcoQUREX1RP
X0hBU0hfTUFQKQorICAgICAgICB9CisjZW5kaWYKKyN1bmRlZiBBRERfVE9fSEFTSF9NQVAKKyAg
ICB9CisKKyAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdCA9IG1hcC5nZXQoZWxlbWVu
dC0+bG9jYWxOYW1lKCkuaW1wbCgpKTsKKyAgICBpZiAodCA9PSAwKQorICAgICAgICByZXR1cm4g
VjhDbGFzc0luZGV4OjpIVE1MRUxFTUVOVDsKKyAgICByZXR1cm4gdDsKK30KKyN1bmRlZiBGT1Jf
RUFDSF9UQUcKKworI2lmIEVOQUJMRShTVkcpCisKKyNpZiBFTkFCTEUoU1ZHX0FOSU1BVElPTikK
KyNkZWZpbmUgRk9SX0VBQ0hfQU5JTUFUSU9OX1RBRyhtYWNybykgXAorICAgIG1hY3JvKGFuaW1h
dGVDb2xvciwgQU5JTUFURUNPTE9SKSBcCisgICAgbWFjcm8oYW5pbWF0ZSwgQU5JTUFURSkgXAor
ICAgIG1hY3JvKGFuaW1hdGVUcmFuc2Zvcm0sIEFOSU1BVEVUUkFOU0ZPUk0pIFwKKyAgICBtYWNy
byhzZXQsIFNFVCkKKyNlbHNlCisjZGVmaW5lIEZPUl9FQUNIX0FOSU1BVElPTl9UQUcobWFjcm8p
CisjZW5kaWYKKworI2lmIEVOQUJMRShTVkdfRklMVEVSUykKKyNkZWZpbmUgRk9SX0VBQ0hfRklM
VEVSU19UQUcobWFjcm8pIFwKKyAgICBtYWNybyhmZUJsZW5kLCBGRUJMRU5EKSBcCisgICAgbWFj
cm8oZmVDb2xvck1hdHJpeCwgRkVDT0xPUk1BVFJJWCkgXAorICAgIG1hY3JvKGZlQ29tcG9uZW50
VHJhbnNmZXIsIEZFQ09NUE9ORU5UVFJBTlNGRVIpIFwKKyAgICBtYWNybyhmZUNvbXBvc2l0ZSwg
RkVDT01QT1NJVEUpIFwKKyAgICBtYWNybyhmZURpZmZ1c2VMaWdodGluZywgRkVESUZGVVNFTElH
SFRJTkcpIFwKKyAgICBtYWNybyhmZURpc3BsYWNlbWVudE1hcCwgRkVESVNQTEFDRU1FTlRNQVAp
IFwKKyAgICBtYWNybyhmZURpc3RhbnRMaWdodCwgRkVESVNUQU5UTElHSFQpIFwKKyAgICBtYWNy
byhmZUZsb29kLCBGRUZMT09EKSBcCisgICAgbWFjcm8oZmVGdW5jQSwgRkVGVU5DQSkgXAorICAg
IG1hY3JvKGZlRnVuY0IsIEZFRlVOQ0IpIFwKKyAgICBtYWNybyhmZUZ1bmNHLCBGRUZVTkNHKSBc
CisgICAgbWFjcm8oZmVGdW5jUiwgRkVGVU5DUikgXAorICAgIG1hY3JvKGZlR2F1c3NpYW5CbHVy
LCBGRUdBVVNTSUFOQkxVUikgXAorICAgIG1hY3JvKGZlSW1hZ2UsIEZFSU1BR0UpIFwKKyAgICBt
YWNybyhmZU1lcmdlLCBGRU1FUkdFKSBcCisgICAgbWFjcm8oZmVNZXJnZU5vZGUsIEZFTUVSR0VO
T0RFKSBcCisgICAgbWFjcm8oZmVPZmZzZXQsIEZFT0ZGU0VUKSBcCisgICAgbWFjcm8oZmVQb2lu
dExpZ2h0LCBGRVBPSU5UTElHSFQpIFwKKyAgICBtYWNybyhmZVNwZWN1bGFyTGlnaHRpbmcsIEZF
U1BFQ1VMQVJMSUdIVElORykgXAorICAgIG1hY3JvKGZlU3BvdExpZ2h0LCBGRVNQT1RMSUdIVCkg
XAorICAgIG1hY3JvKGZlVGlsZSwgRkVUSUxFKSBcCisgICAgbWFjcm8oZmVUdXJidWxlbmNlLCBG
RVRVUkJVTEVOQ0UpIFwKKyAgICBtYWNybyhmaWx0ZXIsIEZJTFRFUikKKyNlbHNlCisjZGVmaW5l
IEZPUl9FQUNIX0ZJTFRFUlNfVEFHKG1hY3JvKQorI2VuZGlmCisKKyNpZiBFTkFCTEUoU1ZHX0ZP
TlRTKQorI2RlZmluZSBGT1JfRUFDSF9GT05UU19UQUcobWFjcm8pIFwKKyAgICBtYWNybyhkZWZp
bml0aW9uLXNyYywgREVGSU5JVElPTlNSQykgXAorICAgIG1hY3JvKGZvbnQtZmFjZSwgRk9OVEZB
Q0UpIFwKKyAgICBtYWNybyhmb250LWZhY2UtZm9ybWF0LCBGT05URkFDRUZPUk1BVCkgXAorICAg
IG1hY3JvKGZvbnQtZmFjZS1uYW1lLCBGT05URkFDRU5BTUUpIFwKKyAgICBtYWNybyhmb250LWZh
Y2Utc3JjLCBGT05URkFDRVNSQykgXAorICAgIG1hY3JvKGZvbnQtZmFjZS11cmksIEZPTlRGQUNF
VVJJKQorI2Vsc2UKKyNkZWZpbmUgRk9SX0VBQ0hfRk9OVFNfVEFHKG1hcmNvKQorI2VuZGlmCisK
KyNpZiBFTkFCTEUoU1ZHX0ZPUkVJR05fT0JKRUNUKQorI2RlZmluZSBGT1JfRUFDSF9GT1JFSUdO
X09CSkVDVF9UQUcobWFjcm8pIFwKKyAgICBtYWNybyhmb3JlaWduT2JqZWN0LCBGT1JFSUdOT0JK
RUNUKQorI2Vsc2UKKyNkZWZpbmUgRk9SX0VBQ0hfRk9SRUlHTl9PQkpFQ1RfVEFHKG1hY3JvKQor
I2VuZGlmCisKKyNpZiBFTkFCTEUoU1ZHX1VTRSkKKyNkZWZpbmUgRk9SX0VBQ0hfVVNFX1RBRyht
YWNybykgXAorICAgIG1hY3JvKHVzZSwgVVNFKQorI2Vsc2UKKyNkZWZpbmUgRk9SX0VBQ0hfVVNF
X1RBRyhtYWNybykKKyNlbmRpZgorCisjZGVmaW5lIEZPUl9FQUNIX1RBRyhtYWNybykgXAorICAg
IEZPUl9FQUNIX0FOSU1BVElPTl9UQUcobWFjcm8pIFwKKyAgICBGT1JfRUFDSF9GSUxURVJTX1RB
RyhtYWNybykgXAorICAgIEZPUl9FQUNIX0ZPTlRTX1RBRyhtYWNybykgXAorICAgIEZPUl9FQUNI
X0ZPUkVJR05fT0JKRUNUX1RBRyhtYWNybykgXAorICAgIEZPUl9FQUNIX1VTRV9UQUcobWFjcm8p
IFwKKyAgICBtYWNybyhhLCBBKSBcCisgICAgbWFjcm8oYWx0R2x5cGgsIEFMVEdMWVBIKSBcCisg
ICAgbWFjcm8oY2lyY2xlLCBDSVJDTEUpIFwKKyAgICBtYWNybyhjbGlwUGF0aCwgQ0xJUFBBVEgp
IFwKKyAgICBtYWNybyhjdXJzb3IsIENVUlNPUikgXAorICAgIG1hY3JvKGRlZnMsIERFRlMpIFwK
KyAgICBtYWNybyhkZXNjLCBERVNDKSBcCisgICAgbWFjcm8oZWxsaXBzZSwgRUxMSVBTRSkgXAor
ICAgIG1hY3JvKGcsIEcpIFwKKyAgICBtYWNybyhnbHlwaCwgR0xZUEgpIFwKKyAgICBtYWNybyhp
bWFnZSwgSU1BR0UpIFwKKyAgICBtYWNybyhsaW5lYXJHcmFkaWVudCwgTElORUFSR1JBRElFTlQp
IFwKKyAgICBtYWNybyhsaW5lLCBMSU5FKSBcCisgICAgbWFjcm8obWFya2VyLCBNQVJLRVIpIFwK
KyAgICBtYWNybyhtYXNrLCBNQVNLKSBcCisgICAgbWFjcm8obWV0YWRhdGEsIE1FVEFEQVRBKSBc
CisgICAgbWFjcm8ocGF0aCwgUEFUSCkgXAorICAgIG1hY3JvKHBhdHRlcm4sIFBBVFRFUk4pIFwK
KyAgICBtYWNybyhwb2x5bGluZSwgUE9MWUxJTkUpIFwKKyAgICBtYWNybyhwb2x5Z29uLCBQT0xZ
R09OKSBcCisgICAgbWFjcm8ocmFkaWFsR3JhZGllbnQsIFJBRElBTEdSQURJRU5UKSBcCisgICAg
bWFjcm8ocmVjdCwgUkVDVCkgXAorICAgIG1hY3JvKHNjcmlwdCwgU0NSSVBUKSBcCisgICAgbWFj
cm8oc3RvcCwgU1RPUCkgXAorICAgIG1hY3JvKHN0eWxlLCBTVFlMRSkgXAorICAgIG1hY3JvKHN2
ZywgU1ZHKSBcCisgICAgbWFjcm8oc3dpdGNoLCBTV0lUQ0gpIFwKKyAgICBtYWNybyhzeW1ib2ws
IFNZTUJPTCkgXAorICAgIG1hY3JvKHRleHQsIFRFWFQpIFwKKyAgICBtYWNybyh0ZXh0UGF0aCwg
VEVYVFBBVEgpIFwKKyAgICBtYWNybyh0aXRsZSwgVElUTEUpIFwKKyAgICBtYWNybyh0cmVmLCBU
UkVGKSBcCisgICAgbWFjcm8odHNwYW4sIFRTUEFOKSBcCisgICAgbWFjcm8odmlldywgVklFVykg
XAorICAgIC8vIGVuZCBvZiBtYWNybworCitWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgVjhQ
cm94eTo6R2V0U1ZHRWxlbWVudFR5cGUoU1ZHRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBzdGF0
aWMgSGFzaE1hcDxTdHJpbmcsIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZT4gbWFwOworICAg
IGlmIChtYXAuaXNFbXB0eSgpKSB7CisjZGVmaW5lIEFERF9UT19IQVNIX01BUCh0YWcsIG5hbWUp
IFwKKyAgICAgICAgbWFwLnNldCgjdGFnLCBWOENsYXNzSW5kZXg6OlNWRyMjbmFtZSMjRUxFTUVO
VCk7CisgICAgICAgIEZPUl9FQUNIX1RBRyhBRERfVE9fSEFTSF9NQVApCisjdW5kZWYgQUREX1RP
X0hBU0hfTUFQCisgICAgfQorCisgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHQgPSBt
YXAuZ2V0KGVsZW1lbnQtPmxvY2FsTmFtZSgpLmltcGwoKSk7CisgICAgaWYgKHQgPT0gMCkKKyAg
ICAgICAgcmV0dXJuIFY4Q2xhc3NJbmRleDo6U1ZHRUxFTUVOVDsKKyAgICByZXR1cm4gdDsKK30K
KyN1bmRlZiBGT1JfRUFDSF9UQUcKKworI2VuZGlmICAvLyBFTkFCTEUoU1ZHKQorCisKK3Y4OjpI
YW5kbGU8djg6OlZhbHVlPiBWOFByb3h5OjpFdmVudFRvVjhPYmplY3QoRXZlbnQqIGV2ZW50KQor
eworICAgIGlmICghZXZlbnQpCisgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisgICAgdjg6
OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZ2V0RE9NT2JqZWN0TWFwKCkuZ2V0KGV2ZW50
KTsKKyAgICBpZiAoIXdyYXBwZXIuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gd3JhcHBlcjsK
KworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhDbGFzc0luZGV4OjpF
VkVOVDsKKworICAgIGlmIChldmVudC0+aXNVSUV2ZW50KCkpIHsKKyAgICAgICAgaWYgKGV2ZW50
LT5pc0tleWJvYXJkRXZlbnQoKSkKKyAgICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OktF
WUJPQVJERVZFTlQ7CisgICAgICAgIGVsc2UgaWYgKGV2ZW50LT5pc1RleHRFdmVudCgpKQorICAg
ICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6VEVYVEVWRU5UOworICAgICAgICBlbHNlIGlm
IChldmVudC0+aXNNb3VzZUV2ZW50KCkpCisgICAgICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4
OjpNT1VTRUVWRU5UOworICAgICAgICBlbHNlIGlmIChldmVudC0+aXNXaGVlbEV2ZW50KCkpCisg
ICAgICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpXSEVFTEVWRU5UOworI2lmIEVOQUJMRShT
VkcpCisgICAgICAgIGVsc2UgaWYgKGV2ZW50LT5pc1NWR1pvb21FdmVudCgpKQorICAgICAgICAg
ICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6U1ZHWk9PTUVWRU5UOworI2VuZGlmCisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlVJRVZFTlQ7CisgICAgfSBlbHNl
IGlmIChldmVudC0+aXNNdXRhdGlvbkV2ZW50KCkpCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5k
ZXg6Ok1VVEFUSU9ORVZFTlQ7CisgICAgZWxzZSBpZiAoZXZlbnQtPmlzT3ZlcmZsb3dFdmVudCgp
KQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpPVkVSRkxPV0VWRU5UOworICAgIGVsc2Ug
aWYgKGV2ZW50LT5pc01lc3NhZ2VFdmVudCgpKQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4
OjpNRVNTQUdFRVZFTlQ7CisgICAgZWxzZSBpZiAoZXZlbnQtPmlzUHJvZ3Jlc3NFdmVudCgpKSB7
CisgICAgICAgIGlmIChldmVudC0+aXNYTUxIdHRwUmVxdWVzdFByb2dyZXNzRXZlbnQoKSkKKyAg
ICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUUFJPR1JFU1NFVkVO
VDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6UFJPR1JF
U1NFVkVOVDsKKyAgICB9IGVsc2UgaWYgKGV2ZW50LT5pc1dlYktpdEFuaW1hdGlvbkV2ZW50KCkp
CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OldFQktJVEFOSU1BVElPTkVWRU5UOworICAg
IGVsc2UgaWYgKGV2ZW50LT5pc1dlYktpdFRyYW5zaXRpb25FdmVudCgpKQorICAgICAgICB0eXBl
ID0gVjhDbGFzc0luZGV4OjpXRUJLSVRUUkFOU0lUSU9ORVZFTlQ7CisKKworICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gcmVzdWx0ID0gSW5zdGFudGlhdGVWOE9iamVjdCh0eXBlLCBWOENsYXNz
SW5kZXg6OkVWRU5ULCBldmVudCk7CisgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpIHsKKyAgICAg
ICAgLy8gSW5zdGFudGlhdGlvbiBmYWlsZWQuIEF2b2lkIHVwZGF0aW5nIHRoZSBET00gb2JqZWN0
IG1hcCBhbmQKKyAgICAgICAgLy8gcmV0dXJuIG51bGwgd2hpY2ggaXMgYWxyZWFkeSBoYW5kbGVk
IGJ5IGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbgorICAgICAgICAvLyBpbiBjYXNlIHRoZSBldmVu
dCBpcyBOVUxMLgorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKyAgICB9CisKKyAgICBldmVu
dC0+cmVmKCk7ICAvLyBmYXN0IHJlZgorICAgIFNldEpTV3JhcHBlckZvckRPTU9iamVjdChldmVu
dCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhyZXN1bHQpKTsKKworICAgIHJldHVy
biByZXN1bHQ7Cit9CisKKworLy8gQ2FsbGVyIGNoZWNrcyBub2RlIGlzIG5vdCBudWxsLgordjg6
OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6Ok5vZGVUb1Y4T2JqZWN0KE5vZGUqIG5vZGUpCit7
CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIC8vIEZp
bmQgdGhlIGNvbnRleHQgdG8gd2hpY2ggdGhlIG5vZGUgYmVsb25ncyBhbmQgY3JlYXRlIHRoZSB3
cmFwcGVyCisgICAgLy8gaW4gdGhhdCBjb250ZXh0LiAgSWYgdGhlIG5vZGUgaXMgbm90IGluIGEg
ZG9jdW1lbnQsIHRoZSBjdXJyZW50CisgICAgLy8gY29udGV4dCBpcyB1c2VkLgorICAgIC8vCisg
ICAgLy8gR2V0dGluZyB0aGUgY29udGV4dCBtaWdodCBpbml0aWFsaXplIHRoZSBjb250ZXh0IHdo
aWNoIGNhbiBpbnN0YW50aWF0ZQorICAgIC8vIGEgZG9jdW1lbnQgd3JhcHBlci4gIFRoZXJlZm9y
ZSwgd2UgZ2V0IHRoZSBjb250ZXh0IGJlZm9yZSBjaGVja2luZyBpZgorICAgIC8vIHRoZSBub2Rl
IGFscmVhZHkgaGFzIGEgd3JhcHBlci4KKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRl
eHQ7CisgICAgRG9jdW1lbnQqIGRvYyA9IG5vZGUtPmRvY3VtZW50KCk7CisgICAgaWYgKGRvYykK
KyAgICAgICAgY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQoZG9jLT5mcmFtZSgpKTsKKwor
ICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlciA9IGdldERPTU5vZGVNYXAoKS5nZXQo
bm9kZSk7CisgICAgaWYgKCF3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHdyYXBw
ZXI7CisKKyAgICBib29sIGlzRG9jdW1lbnQgPSBmYWxzZTsgIC8vIGRvY3VtZW50IHR5cGUgbm9k
ZSBoYXMgc3BlY2lhbCBoYW5kbGluZworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0
eXBlOworCisgICAgc3dpdGNoIChub2RlLT5ub2RlVHlwZSgpKSB7CisgICAgY2FzZSBOb2RlOjpF
TEVNRU5UX05PREU6CisgICAgICAgIGlmIChub2RlLT5pc0hUTUxFbGVtZW50KCkpCisgICAgICAg
ICAgICB0eXBlID0gR2V0SFRNTEVsZW1lbnRUeXBlKHN0YXRpY19jYXN0PEhUTUxFbGVtZW50Kj4o
bm9kZSkpOworI2lmIEVOQUJMRShTVkcpCisgICAgICAgIGVsc2UgaWYgKG5vZGUtPmlzU1ZHRWxl
bWVudCgpKQorICAgICAgICAgICAgdHlwZSA9IEdldFNWR0VsZW1lbnRUeXBlKHN0YXRpY19jYXN0
PFNWR0VsZW1lbnQqPihub2RlKSk7CisjZW5kaWYKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
dHlwZSA9IFY4Q2xhc3NJbmRleDo6RUxFTUVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBO
b2RlOjpBVFRSSUJVVEVfTk9ERToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6QVRUUjsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlOjpURVhUX05PREU6CisgICAgICAgIHR5cGUg
PSBWOENsYXNzSW5kZXg6OlRFWFQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6Q0RB
VEFfU0VDVElPTl9OT0RFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDREFUQVNFQ1RJ
T047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6RU5USVRZX05PREU6CisgICAgICAg
IHR5cGUgPSBWOENsYXNzSW5kZXg6OkVOVElUWTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBO
b2RlOjpQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6CisgICAgICAgIHR5cGUgPSBWOENsYXNz
SW5kZXg6OlBST0NFU1NJTkdJTlNUUlVDVElPTjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBO
b2RlOjpDT01NRU5UX05PREU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNPTU1FTlQ7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfTk9ERTogeworICAgICAg
ICBpc0RvY3VtZW50ID0gdHJ1ZTsKKyAgICAgICAgRG9jdW1lbnQqIGRvYyA9IHN0YXRpY19jYXN0
PERvY3VtZW50Kj4obm9kZSk7CisgICAgICAgIGlmIChkb2MtPmlzSFRNTERvY3VtZW50KCkpCisg
ICAgICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpIVE1MRE9DVU1FTlQ7CisjaWYgRU5BQkxF
KFNWRykKKyAgICAgICAgZWxzZSBpZiAoZG9jLT5pc1NWR0RvY3VtZW50KCkpCisgICAgICAgICAg
ICB0eXBlID0gVjhDbGFzc0luZGV4OjpTVkdET0NVTUVOVDsKKyNlbmRpZgorICAgICAgICBlbHNl
CisgICAgICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpET0NVTUVOVDsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfVFlQRV9OT0RFOgorICAgICAgICB0
eXBlID0gVjhDbGFzc0luZGV4OjpET0NVTUVOVFRZUEU7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgTm9kZTo6Tk9UQVRJT05fTk9ERToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Tk9U
QVRJT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfRlJBR01FTlRf
Tk9ERToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6RE9DVU1FTlRGUkFHTUVOVDsKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlOjpFTlRJVFlfUkVGRVJFTkNFX05PREU6CisgICAg
ICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkVOVElUWVJFRkVSRU5DRTsKKyAgICAgICAgYnJlYWs7
CisgICAgZGVmYXVsdDoKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Tk9ERTsKKyAgICB9
CisKKyAgICAvLyBFbnRlciB0aGUgbm9kZSdzIGNvbnRleHQgYW5kIGNyZWF0ZSB0aGUgd3JhcHBl
ciBpbiB0aGF0IGNvbnRleHQuCisgICAgaWYgKCFjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAg
Y29udGV4dC0+RW50ZXIoKTsKKworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiByZXN1bHQgPSBJ
bnN0YW50aWF0ZVY4T2JqZWN0KHR5cGUsIFY4Q2xhc3NJbmRleDo6Tk9ERSwgbm9kZSk7CisKKyAg
ICAvLyBFeGl0IHRoZSBub2RlJ3MgY29udGV4dCBpZiBpdCB3YXMgZW50ZXJlZC4KKyAgICBpZiAo
IWNvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICBjb250ZXh0LT5FeGl0KCk7CisKKyAgICBpZiAo
cmVzdWx0LklzRW1wdHkoKSkgeworICAgICAgICAvLyBJZiBpbnN0YW50aWF0aW9uIGZhaWxlZCBp
dCdzIGltcG9ydGFudCBub3QgdG8gYWRkIHRoZSByZXN1bHQKKyAgICAgICAgLy8gdG8gdGhlIERP
TSBub2RlIG1hcC4gSW5zdGVhZCB3ZSByZXR1cm4gYW4gZW1wdHkgaGFuZGxlLCB3aGljaAorICAg
ICAgICAvLyBzaG91bGQgYWxyZWFkeSBiZSBoYW5kbGVkIGJ5IGNhbGxlcnMgb2YgdGhpcyBmdW5j
dGlvbiBpbiBjYXNlCisgICAgICAgIC8vIHRoZSBub2RlIGlzIE5VTEwuCisgICAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgfQorCisgICAgbm9kZS0+cmVmKCk7CisgICAgU2V0SlNXcmFwcGVyRm9y
RE9NTm9kZShub2RlLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHJlc3VsdCkpOwor
CisgICAgaWYgKGlzRG9jdW1lbnQpIHsKKyAgICAgICAgRG9jdW1lbnQqIGRvYyA9IHN0YXRpY19j
YXN0PERvY3VtZW50Kj4obm9kZSk7CisgICAgICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6
cmV0cmlldmUoZG9jLT5mcmFtZSgpKTsKKyAgICAgICAgaWYgKHByb3h5KQorICAgICAgICAgICAg
cHJveHktPlVwZGF0ZURvY3VtZW50V3JhcHBlcihyZXN1bHQpOworCisgICAgICAgIGlmICh0eXBl
ID09IFY4Q2xhc3NJbmRleDo6SFRNTERPQ1VNRU5UKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUg
bWFya2VyIG9iamVjdCBhbmQgaW5zZXJ0IGl0IGluIHR3byBpbnRlcm5hbCBmaWVsZHMuCisgICAg
ICAgICAgICAvLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRlbXBvcmFyeSBzaGFkb3dpbmcg
b2YKKyAgICAgICAgICAgIC8vIGRvY3VtZW50LmFsbC4KKyAgICAgICAgICAgIEFTU0VSVChyZXN1
bHQtPkludGVybmFsRmllbGRDb3VudCgpID09IFY4Q3VzdG9tOjprSFRNTERvY3VtZW50SW50ZXJu
YWxGaWVsZENvdW50KTsKKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBtYXJrZXIg
PSB2ODo6T2JqZWN0OjpOZXcoKTsKKyAgICAgICAgICAgIHJlc3VsdC0+U2V0SW50ZXJuYWxGaWVs
ZChWOEN1c3RvbTo6a0hUTUxEb2N1bWVudE1hcmtlckluZGV4LCBtYXJrZXIpOworICAgICAgICAg
ICAgcmVzdWx0LT5TZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprSFRNTERvY3VtZW50U2hhZG93
SW5kZXgsIG1hcmtlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0Owor
fQorCisKKy8vIEEgSlMgb2JqZWN0IG9mIHR5cGUgRXZlbnRUYXJnZXQgY2FuIG9ubHkgYmUgdGhl
IGZvbGxvd2luZyBwb3NzaWJsZSB0eXBlczoKKy8vIDEpIEV2ZW50VGFyZ2V0Tm9kZTsgMikgRE9N
V2luZG93IDMpIFhNTEh0dHBSZXF1ZXN0OyA0KSBNZXNzYWdlUG9ydDsKKy8vIDUpIFhNTEh0dHBS
ZXF1ZXN0VXBsb2FkCisvLyBjaGVjayBFdmVudFRhcmdldC5oIGZvciBuZXcgdHlwZSBjb252ZXJz
aW9uIG1ldGhvZHMKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5OjpFdmVudFRhcmdldFRv
VjhPYmplY3QoRXZlbnRUYXJnZXQqIHRhcmdldCkKK3sKKyAgICBpZiAoIXRhcmdldCkKKyAgICAg
ICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgIFNWR0VsZW1lbnRJ
bnN0YW5jZSogaW5zdGFuY2UgPSB0YXJnZXQtPnRvU1ZHRWxlbWVudEluc3RhbmNlKCk7CisgICAg
aWYgKGluc3RhbmNlKQorICAgICAgICByZXR1cm4gVG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNW
R0VMRU1FTlRJTlNUQU5DRSwgaW5zdGFuY2UpOworI2VuZGlmCisKKyNpZiBFTkFCTEUoV09SS0VS
UykKKyAgICBXb3JrZXIqIHdvcmtlciA9IHRhcmdldC0+dG9Xb3JrZXIoKTsKKyAgICBpZiAod29y
a2VyKQorICAgICAgICByZXR1cm4gVG9WOE9iamVjdChWOENsYXNzSW5kZXg6OldPUktFUiwgd29y
a2VyKTsKKyNlbmRpZiAgLy8gV09SS0VSUworCisgICAgTm9kZSogbm9kZSA9IHRhcmdldC0+dG9O
b2RlKCk7CisgICAgaWYgKG5vZGUpCisgICAgICAgIHJldHVybiBOb2RlVG9WOE9iamVjdChub2Rl
KTsKKworICAgIGlmIChET01XaW5kb3cqIGRvbVdpbmRvdyA9IHRhcmdldC0+dG9ET01XaW5kb3co
KSkKKyAgICAgICAgcmV0dXJuIFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGRv
bVdpbmRvdyk7CisKKyAgICAvLyBYTUxIdHRwUmVxdWVzdCBpcyBjcmVhdGVkIHdpdGhpbiBpdHMg
SlMgY291bnRlcnBhcnQuCisgICAgWE1MSHR0cFJlcXVlc3QqIHhociA9IHRhcmdldC0+dG9YTUxI
dHRwUmVxdWVzdCgpOworICAgIGlmICh4aHIpIHsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0PiB3cmFwcGVyID0gZ2V0QWN0aXZlRE9NT2JqZWN0TWFwKCkuZ2V0KHhocik7CisgICAgICAg
IEFTU0VSVCghd3JhcHBlci5Jc0VtcHR5KCkpOworICAgICAgICByZXR1cm4gd3JhcHBlcjsKKyAg
ICB9CisKKyAgICAvLyBNZXNzYWdlUG9ydCBpcyBjcmVhdGVkIHdpdGhpbiBpdHMgSlMgY291bnRl
cnBhcnQKKyAgICBNZXNzYWdlUG9ydCogcG9ydCA9IHRhcmdldC0+dG9NZXNzYWdlUG9ydCgpOwor
ICAgIGlmIChwb3J0KSB7CisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlciA9
IGdldEFjdGl2ZURPTU9iamVjdE1hcCgpLmdldChwb3J0KTsKKyAgICAgICAgQVNTRVJUKCF3cmFw
cGVyLklzRW1wdHkoKSk7CisgICAgICAgIHJldHVybiB3cmFwcGVyOworICAgIH0KKworICAgIFhN
TEh0dHBSZXF1ZXN0VXBsb2FkKiB1cGxvYWQgPSB0YXJnZXQtPnRvWE1MSHR0cFJlcXVlc3RVcGxv
YWQoKTsKKyAgICBpZiAodXBsb2FkKSB7CisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
d3JhcHBlciA9IGdldERPTU9iamVjdE1hcCgpLmdldCh1cGxvYWQpOworICAgICAgICBBU1NFUlQo
IXdyYXBwZXIuSXNFbXB0eSgpKTsKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisgICAgfQorCisg
ICAgQVNTRVJUKDApOworICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworfQor
CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5OjpFdmVudExpc3RlbmVyVG9WOE9iamVj
dChFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikKK3sKKyAgICBpZiAobGlzdGVuZXIgPT0gMCkKKyAg
ICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICAvLyBGSVhNRTogY2FuIGEgdXNlciB0YWtl
IGEgbGF6eSBldmVudCBsaXN0ZW5lciBhbmQgc2V0IHRvIG90aGVyIHBsYWNlcz8KKyAgICBWOEFi
c3RyYWN0RXZlbnRMaXN0ZW5lciogdjhsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4QWJzdHJhY3RF
dmVudExpc3RlbmVyKj4obGlzdGVuZXIpOworICAgIHJldHVybiB2OGxpc3RlbmVyLT5nZXRMaXN0
ZW5lck9iamVjdCgpOworfQorCisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5OjpET01J
bXBsZW1lbnRhdGlvblRvVjhPYmplY3QoRE9NSW1wbGVtZW50YXRpb24qIGltcGwpCit7CisgICAg
djg6OkhhbmRsZTx2ODo6T2JqZWN0PiByZXN1bHQgPSBJbnN0YW50aWF0ZVY4T2JqZWN0KFY4Q2xh
c3NJbmRleDo6RE9NSU1QTEVNRU5UQVRJT04sIFY4Q2xhc3NJbmRleDo6RE9NSU1QTEVNRU5UQVRJ
T04sIGltcGwpOworICAgIGlmIChyZXN1bHQuSXNFbXB0eSgpKSB7CisgICAgICAgIC8vIElmIHRo
ZSBpbnN0YW50aWF0aW9uIGZhaWxlZCwgd2UgaWdub3JlIGl0IGFuZCByZXR1cm4gbnVsbCBpbnN0
ZWFkCisgICAgICAgIC8vIG9mIHJldHVybmluZyBhbiBlbXB0eSBoYW5kbGUuCisgICAgICAgIHJl
dHVybiB2ODo6TnVsbCgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3Y4OjpI
YW5kbGU8djg6OlZhbHVlPiBWOFByb3h5OjpTdHlsZVNoZWV0VG9WOE9iamVjdChTdHlsZVNoZWV0
KiBzaGVldCkKK3sKKyAgICBpZiAoIXNoZWV0KQorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsK
KworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlciA9IGdldERPTU9iamVjdE1hcCgp
LmdldChzaGVldCk7CisgICAgaWYgKCF3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
IHdyYXBwZXI7CisKKyAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IFY4Q2xh
c3NJbmRleDo6U1RZTEVTSEVFVDsKKyAgICBpZiAoc2hlZXQtPmlzQ1NTU3R5bGVTaGVldCgpKQor
ICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDU1NTVFlMRVNIRUVUOworCisgICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiByZXN1bHQgPSBJbnN0YW50aWF0ZVY4T2JqZWN0KHR5cGUsIFY4Q2xh
c3NJbmRleDo6U1RZTEVTSEVFVCwgc2hlZXQpOworICAgIGlmICghcmVzdWx0LklzRW1wdHkoKSkg
eworICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgRE9NIG9iamVjdCBtYXAgaWYgdGhlIHJlc3Vs
dCBpcyBub24tZW1wdHkuCisgICAgICAgIHNoZWV0LT5yZWYoKTsKKyAgICAgICAgU2V0SlNXcmFw
cGVyRm9yRE9NT2JqZWN0KHNoZWV0LCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHJl
c3VsdCkpOworICAgIH0KKworICAgIC8vIEFkZCBhIGhpZGRlbiByZWZlcmVuY2UgZnJvbSBzdHls
ZXNoZWV0IG9iamVjdCB0byBpdHMgb3duZXIgbm9kZS4KKyAgICBOb2RlKiBvd25lck5vZGUgPSBz
aGVldC0+b3duZXJOb2RlKCk7CisgICAgaWYgKG93bmVyTm9kZSkgeworICAgICAgICB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+IG93bmVyID0gdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdChOb2Rl
VG9WOE9iamVjdChvd25lck5vZGUpKTsKKyAgICAgICAgcmVzdWx0LT5TZXRJbnRlcm5hbEZpZWxk
KFY4Q3VzdG9tOjprU3R5bGVTaGVldE93bmVyTm9kZUluZGV4LCBvd25lcik7CisgICAgfQorCisg
ICAgcmV0dXJuIHJlc3VsdDsKK30KKworCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6
Q1NTVmFsdWVUb1Y4T2JqZWN0KENTU1ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAoIXZhbHVlKQor
ICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
d3JhcHBlciA9IGdldERPTU9iamVjdE1hcCgpLmdldCh2YWx1ZSk7CisgICAgaWYgKCF3cmFwcGVy
LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisKKyAgICBWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUgdHlwZTsKKworICAgIGlmICh2YWx1ZS0+aXNXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZSgpKQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpXRUJLSVRDU1NUUkFOU0ZP
Uk1WQUxVRTsKKyAgICBlbHNlIGlmICh2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgdHlw
ZSA9IFY4Q2xhc3NJbmRleDo6Q1NTVkFMVUVMSVNUOworICAgIGVsc2UgaWYgKHZhbHVlLT5pc1By
aW1pdGl2ZVZhbHVlKCkpCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU1BSSU1JVElW
RVZBTFVFOworI2lmIEVOQUJMRShTVkcpCisgICAgZWxzZSBpZiAodmFsdWUtPmlzU1ZHUGFpbnQo
KSkKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6U1ZHUEFJTlQ7CisgICAgZWxzZSBpZiAo
dmFsdWUtPmlzU1ZHQ29sb3IoKSkKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6U1ZHQ09M
T1I7CisjZW5kaWYKKyAgICBlbHNlCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU1ZB
TFVFOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiByZXN1bHQgPSBJbnN0YW50aWF0ZVY4
T2JqZWN0KHR5cGUsIFY4Q2xhc3NJbmRleDo6Q1NTVkFMVUUsIHZhbHVlKTsKKyAgICBpZiAoIXJl
c3VsdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gT25seSB1cGRhdGUgdGhlIERPTSBvYmplY3Qg
bWFwIGlmIHRoZSByZXN1bHQgaXMgbm9uLWVtcHR5LgorICAgICAgICB2YWx1ZS0+cmVmKCk7Cisg
ICAgICAgIFNldEpTV3JhcHBlckZvckRPTU9iamVjdCh2YWx1ZSwgdjg6OlBlcnNpc3RlbnQ8djg6
Ok9iamVjdD46Ok5ldyhyZXN1bHQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQor
CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5OjpDU1NSdWxlVG9WOE9iamVjdChDU1NS
dWxlKiBydWxlKQoreworICAgIGlmICghcnVsZSkgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICB2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRET01PYmplY3RNYXAoKS5nZXQocnVs
ZSk7CisgICAgaWYgKCF3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7
CisKKyAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZTsKKworICAgIHN3aXRjaCAo
cnVsZS0+dHlwZSgpKSB7CisgICAgY2FzZSBDU1NSdWxlOjpTVFlMRV9SVUxFOgorICAgICAgICB0
eXBlID0gVjhDbGFzc0luZGV4OjpDU1NTVFlMRVJVTEU7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgQ1NTUnVsZTo6Q0hBUlNFVF9SVUxFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpD
U1NDSEFSU0VUUlVMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NSdWxlOjpJTVBPUlRf
UlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q1NTSU1QT1JUUlVMRTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBDU1NSdWxlOjpNRURJQV9SVUxFOgorICAgICAgICB0eXBlID0g
VjhDbGFzc0luZGV4OjpDU1NNRURJQVJVTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NT
UnVsZTo6Rk9OVF9GQUNFX1JVTEU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU0ZP
TlRGQUNFUlVMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NSdWxlOjpQQUdFX1JVTEU6
CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU1BBR0VSVUxFOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIENTU1J1bGU6OlZBUklBQkxFU19SVUxFOgorICAgICAgICB0eXBlID0gVjhD
bGFzc0luZGV4OjpDU1NWQVJJQUJMRVNSVUxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENT
U1J1bGU6OldFQktJVF9LRVlGUkFNRV9SVUxFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4
OjpXRUJLSVRDU1NLRVlGUkFNRVJVTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NTUnVs
ZTo6V0VCS0lUX0tFWUZSQU1FU19SVUxFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpX
RUJLSVRDU1NLRVlGUkFNRVNSVUxFOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgLy8g
Q1NTUnVsZTo6VU5LTk9XTl9SVUxFCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU1JV
TEU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
cmVzdWx0ID0gSW5zdGFudGlhdGVWOE9iamVjdCh0eXBlLCBWOENsYXNzSW5kZXg6OkNTU1JVTEUs
IHJ1bGUpOworICAgIGlmICghcmVzdWx0LklzRW1wdHkoKSkgeworICAgICAgICAvLyBPbmx5IHVw
ZGF0ZSB0aGUgRE9NIG9iamVjdCBtYXAgaWYgdGhlIHJlc3VsdCBpcyBub24tZW1wdHkuCisgICAg
ICAgIHJ1bGUtPnJlZigpOworICAgICAgICBTZXRKU1dyYXBwZXJGb3JET01PYmplY3QocnVsZSwg
djg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhyZXN1bHQpKTsKKyAgICB9CisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6OldpbmRvd1Rv
VjhPYmplY3QoRE9NV2luZG93KiB3aW5kb3cpCit7CisgICAgaWYgKCF3aW5kb3cpCisgICAgICAg
IHJldHVybiB2ODo6TnVsbCgpOworICAgIC8vIEluaXRpYWxpemVzIGVudmlyb25tZW50IG9mIGEg
ZnJhbWUsIGFuZCByZXR1cm4gdGhlIGdsb2JhbCBvYmplY3QKKyAgICAvLyBvZiB0aGUgZnJhbWUu
CisgICAgRnJhbWUqIGZyYW1lID0gd2luZG93LT5mcmFtZSgpOworICAgIGlmICghZnJhbWUpCisg
ICAgICAgIHJldHVybiB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+KCk7CisKKyAgICAvLyBTcGVjaWFs
IGNhc2U6IEJlY2F1c2Ugb2YgZXZhbHVhdGVJbk5ld0NvbnRleHQoKSBvbmUgRE9NV2luZG93IGNh
biBoYXZlCisgICAgLy8gbXVsdGlwbGUgY29udGV4dHMgYW5kIG11bHRpcGxlIGdsb2JhbCBvYmpl
Y3RzIGFzc29jaWF0ZWQgd2l0aCBpdC4gV2hlbgorICAgIC8vIGNvZGUgcnVubmluZyBpbiBvbmUg
b2YgdGhvc2UgY29udGV4dHMgYWNjZXNzZXMgdGhlIHdpbmRvdyBvYmplY3QsIHdlCisgICAgLy8g
d2FudCB0byByZXR1cm4gdGhlIGdsb2JhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoYXQgY29u
dGV4dCwgbm90CisgICAgLy8gbmVjZXNzYXJpbHkgdGhlIGZpcnN0IGdsb2JhbCBvYmplY3QgYXNz
b2NpYXRlZCB3aXRoIHRoYXQgRE9NV2luZG93LgorICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+
IGN1cnJlbnRDb250ZXh0ID0gdjg6OkNvbnRleHQ6OkdldEN1cnJlbnQoKTsKKyAgICB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+IGN1cnJlbnRHbG9iYWwgPSBjdXJyZW50Q29udGV4dC0+R2xvYmFsKCk7
CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3aW5kb3dXcmFwcGVyID0gTG9va3VwRE9NV3Jh
cHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgY3VycmVudEdsb2JhbCk7CisgICAgaWYgKCF3
aW5kb3dXcmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAgaWYgKERPTVdyYXBwZXJUb05hdGl2ZTxE
T01XaW5kb3c+KHdpbmRvd1dyYXBwZXIpID09IHdpbmRvdykKKyAgICAgICAgICAgIHJldHVybiBj
dXJyZW50R2xvYmFsOworCisgICAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGdsb2JhbCBvYmpl
Y3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnJhbWUuCisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4
dD4gY29udGV4dCA9IEdldENvbnRleHQoZnJhbWUpOworICAgIGlmIChjb250ZXh0LklzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4oKTsKKworICAgIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsID0gY29udGV4dC0+R2xvYmFsKCk7CisgICAgQVNTRVJU
KCFnbG9iYWwuSXNFbXB0eSgpKTsKKyAgICByZXR1cm4gZ2xvYmFsOworfQorCit2b2lkIFY4UHJv
eHk6OkJpbmRKc09iamVjdFRvV2luZG93KEZyYW1lKiBmcmFtZSwgY29uc3QgY2hhciogbmFtZSwg
aW50IHR5cGUsIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGRlc2MsIHZvaWQqIGlt
cCkKK3sKKyAgICAvLyBHZXQgZW52aXJvbm1lbnQuCisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4
dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQoZnJhbWUpOworICAgIGlmIChjb250ZXh0
LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOyAgLy8gSlMgbm90IGVuYWJsZWQuCisKKyAgICB2
ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0PiBpbnN0YW5jZSA9IGRlc2MtPkdldEZ1bmN0aW9uKCk7CisgICAgU2V0RE9NV3JhcHBlcihp
bnN0YW5jZSwgdHlwZSwgaW1wKTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFs
ID0gY29udGV4dC0+R2xvYmFsKCk7CisgICAgZ2xvYmFsLT5TZXQodjg6OlN0cmluZzo6TmV3KG5h
bWUpLCBpbnN0YW5jZSk7Cit9CisKK3ZvaWQgVjhQcm94eTo6UHJvY2Vzc0NvbnNvbGVNZXNzYWdl
cygpCit7CisgICAgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjpQcm9jZXNzRGVsYXllZE1lc3NhZ2Vz
KCk7Cit9CisKKworLy8gQ3JlYXRlIHRoZSB1dGlsaXR5IGNvbnRleHQgZm9yIGhvbGRpbmcgSmF2
YVNjcmlwdCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5CisvLyB3aGljaCBhcmUgbm90IHZpc2li
bGUgdG8gSmF2YVNjcmlwdCBleGVjdXRpbmcgb24gdGhlIHBhZ2UuCit2b2lkIFY4UHJveHk6OkNy
ZWF0ZVV0aWxpdHlDb250ZXh0KCkgeworICAgIEFTU0VSVChtX3V0aWxpdHlDb250ZXh0LklzRW1w
dHkoKSk7CisKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgdjg6OkhhbmRsZTx2ODo6
T2JqZWN0VGVtcGxhdGU+IGdsb2JhbFRlbXBsYXRlID0gdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXco
KTsKKyAgICBtX3V0aWxpdHlDb250ZXh0ID0gdjg6OkNvbnRleHQ6Ok5ldyhOVUxMLCBnbG9iYWxU
ZW1wbGF0ZSk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRTY29wZShtX3V0aWxpdHlD
b250ZXh0KTsKKworICAgIC8vIENvbXBpbGUgSmF2YVNjcmlwdCBmdW5jdGlvbiBmb3IgcmV0cmll
dmluZyB0aGUgc291cmNlIGxpbmUgb2YgdGhlIHRvcAorICAgIC8vIEphdmFTY3JpcHQgc3RhY2sg
ZnJhbWUuCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGZyYW1lU291cmNlTGluZV9zb3VyY2UgPQor
ICAgICAgICAiZnVuY3Rpb24gZnJhbWVTb3VyY2VMaW5lKGV4ZWNfc3RhdGUpIHsiCisgICAgICAg
ICIgIHJldHVybiBleGVjX3N0YXRlLmZyYW1lKDApLnNvdXJjZUxpbmUoKTsiCisgICAgICAgICJ9
IjsKKyAgICB2ODo6U2NyaXB0OjpDb21waWxlKHY4OjpTdHJpbmc6Ok5ldyhmcmFtZVNvdXJjZUxp
bmVfc291cmNlKSktPlJ1bigpOworCisgICAgLy8gQ29tcGlsZSBKYXZhU2NyaXB0IGZ1bmN0aW9u
IGZvciByZXRyaWV2aW5nIHRoZSBzb3VyY2UgbmFtZSBvZiB0aGUgdG9wCisgICAgLy8gSmF2YVNj
cmlwdCBzdGFjayBmcmFtZS4KKyAgICBzdGF0aWMgY29uc3QgY2hhciogZnJhbWVTb3VyY2VOYW1l
X3NvdXJjZSA9CisgICAgICAgICJmdW5jdGlvbiBmcmFtZVNvdXJjZU5hbWUoZXhlY19zdGF0ZSkg
eyIKKyAgICAgICAgIiAgdmFyIGZyYW1lID0gZXhlY19zdGF0ZS5mcmFtZSgwKTsiCisgICAgICAg
ICIgIGlmIChmcmFtZS5mdW5jKCkucmVzb2x2ZWQoKSAmJiAiCisgICAgICAgICIgICAgICBmcmFt
ZS5mdW5jKCkuc2NyaXB0KCkgJiYgIgorICAgICAgICAiICAgICAgZnJhbWUuZnVuYygpLnNjcmlw
dCgpLm5hbWUoKSkgeyIKKyAgICAgICAgIiAgICByZXR1cm4gZnJhbWUuZnVuYygpLnNjcmlwdCgp
Lm5hbWUoKTsiCisgICAgICAgICIgIH0iCisgICAgICAgICJ9IjsKKyAgICB2ODo6U2NyaXB0OjpD
b21waWxlKHY4OjpTdHJpbmc6Ok5ldyhmcmFtZVNvdXJjZU5hbWVfc291cmNlKSktPlJ1bigpOwor
fQorCisKK2ludCBWOFByb3h5OjpHZXRTb3VyY2VMaW5lTnVtYmVyKCkgeworICAgIHY4OjpIYW5k
bGVTY29wZSBzY29wZTsKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB1dGlsaXR5Q29udGV4
dCA9IFY4UHJveHk6OkdldFV0aWxpdHlDb250ZXh0KCk7CisgICAgaWYgKHV0aWxpdHlDb250ZXh0
LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNv
bnRleHRTY29wZSh1dGlsaXR5Q29udGV4dCk7CisgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+
IGZyYW1lU291cmNlTGluZTsKKyAgICBmcmFtZVNvdXJjZUxpbmUgPSB2ODo6TG9jYWw8djg6OkZ1
bmN0aW9uPjo6Q2FzdCh1dGlsaXR5Q29udGV4dC0+R2xvYmFsKCktPkdldCh2ODo6U3RyaW5nOjpO
ZXcoImZyYW1lU291cmNlTGluZSIpKSk7CisgICAgaWYgKGZyYW1lU291cmNlTGluZS5Jc0VtcHR5
KCkpCisgICAgICAgIHJldHVybiAwOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiByZXN1bHQg
PSB2ODo6RGVidWc6OkNhbGwoZnJhbWVTb3VyY2VMaW5lKTsKKyAgICBpZiAocmVzdWx0LklzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHJlc3VsdC0+SW50MzJWYWx1ZSgp
OworfQorCisKK1N0cmluZyBWOFByb3h5OjpHZXRTb3VyY2VOYW1lKCkgeworICAgIHY4OjpIYW5k
bGVTY29wZSBzY29wZTsKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB1dGlsaXR5Q29udGV4
dCA9IEdldFV0aWxpdHlDb250ZXh0KCk7CisgICAgaWYgKHV0aWxpdHlDb250ZXh0LklzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBjb250
ZXh0U2NvcGUodXRpbGl0eUNvbnRleHQpOworICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiBm
cmFtZVNvdXJjZU5hbWU7CisgICAgZnJhbWVTb3VyY2VOYW1lID0gdjg6OkxvY2FsPHY4OjpGdW5j
dGlvbj46OkNhc3QodXRpbGl0eUNvbnRleHQtPkdsb2JhbCgpLT5HZXQodjg6OlN0cmluZzo6TmV3
KCJmcmFtZVNvdXJjZU5hbWUiKSkpOworICAgIGlmIChmcmFtZVNvdXJjZU5hbWUuSXNFbXB0eSgp
KSB7CisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIFRvV2ViQ29y
ZVN0cmluZyh2ODo6RGVidWc6OkNhbGwoZnJhbWVTb3VyY2VOYW1lKSk7Cit9CisKK3ZvaWQgVjhQ
cm94eTo6UmVnaXN0ZXJFeHRlbnNpb24odjg6OkV4dGVuc2lvbiogZXh0ZW5zaW9uLCBjb25zdCBT
dHJpbmcmIHNjaGVtZVJlc3RyaWN0aW9uKQoreworICAgIHY4OjpSZWdpc3RlckV4dGVuc2lvbihl
eHRlbnNpb24pOworICAgIFY4RXh0ZW5zaW9uSW5mbyBpbmZvID0ge3NjaGVtZVJlc3RyaWN0aW9u
LCBleHRlbnNpb259OworICAgIG1fZXh0ZW5zaW9ucy5wdXNoX2JhY2soaW5mbyk7Cit9CisKK2Jv
b2wgVjhQcm94eTo6U2V0Q29udGV4dERlYnVnSWQoaW50IGRlYnVnSWQpIHsKKyAgICBBU1NFUlQo
ZGVidWdJZCA+IDApOworICAgIGlmIChtX2NvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIGlmICghbV9jb250ZXh0
LT5HZXREYXRhKCktPklzVW5kZWZpbmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gY29udGV4dF9kYXRhID0gdjg6Ok9iamVjdDo6TmV3KCk7
CisgICAgY29udGV4dF9kYXRhLT5TZXQodjg6OlN0cmluZzo6TmV3KGtDb250ZXh0RGVidWdEYXRh
VHlwZSksIHY4OjpTdHJpbmc6Ok5ldygicGFnZSIpKTsKKyAgICBjb250ZXh0X2RhdGEtPlNldCh2
ODo6U3RyaW5nOjpOZXcoa0NvbnRleHREZWJ1Z0RhdGFWYWx1ZSksIHY4OjpJbnRlZ2VyOjpOZXco
ZGVidWdJZCkpOworICAgIG1fY29udGV4dC0+U2V0RGF0YShjb250ZXh0X2RhdGEpOworICAgIHJl
dHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK2ludCBWOFByb3h5OjpHZXRDb250ZXh0RGVidWdJ
ZCh2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0KQoreworICAgIHY4OjpIYW5kbGVTY29w
ZSBzY29wZTsKKyAgICBpZiAoIWNvbnRleHQtPkdldERhdGEoKS0+SXNPYmplY3QoKSkKKyAgICAg
ICAgcmV0dXJuIC0xOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBkYXRhID0gY29udGV4dC0+
R2V0RGF0YSgpLT5Ub09iamVjdCgpLT5HZXQoIHY4OjpTdHJpbmc6Ok5ldyhrQ29udGV4dERlYnVn
RGF0YVZhbHVlKSk7CisgICAgcmV0dXJuIGRhdGEtPklzSW50MzIoKSA/IGRhdGEtPkludDMyVmFs
dWUoKSA6IC0xOworfQorCit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9i
aW5kaW5ncy92OC9TY3JpcHRDb250cm9sbGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L1NjcmlwdENvbnRyb2xsZXIuY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNv
cmUvYmluZGluZ3MvdjgvU2NyaXB0Q29udHJvbGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTcy
LDE3ICs3MiwxNyBAQAogCiBib29sIFNjcmlwdENvbnRyb2xsZXI6OmlzU2FmZVNjcmlwdChGcmFt
ZSogdGFyZ2V0KQogewotICAgIHJldHVybiBWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZSh0YXJnZXQs
IHRydWUpOworICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZSh0YXJnZXQsIHRydWUp
OwogfQogCiB2b2lkIFNjcmlwdENvbnRyb2xsZXI6OmdjUHJvdGVjdEpTV3JhcHBlcih2b2lkKiBk
b21PYmplY3QpCiB7Ci0gICAgVjhQcm94eTo6R0NQcm90ZWN0KGRvbU9iamVjdCk7CisgICAgVjhQ
cm94eTo6Z2NQcm90ZWN0KGRvbU9iamVjdCk7CiB9CiAKIHZvaWQgU2NyaXB0Q29udHJvbGxlcjo6
Z2NVbnByb3RlY3RKU1dyYXBwZXIodm9pZCogZG9tT2JqZWN0KQogewotICAgIFY4UHJveHk6OkdD
VW5wcm90ZWN0KGRvbU9iamVjdCk7CisgICAgVjhQcm94eTo6Z2NVbnByb3RlY3QoZG9tT2JqZWN0
KTsKIH0KIAogU2NyaXB0Q29udHJvbGxlcjo6U2NyaXB0Q29udHJvbGxlcihGcmFtZSogZnJhbWUp
CkBAIC0xNDQsMTggKzE0NCwxOCBAQAogICAgIFY4UHJveHkqIGFjdGl2ZVByb3h5ID0gYWN0aXZl
RnJhbWUtPnNjcmlwdCgpLT5wcm94eSgpOwogCiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNj
b3BlOwotICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5OjpHZXRD
b250ZXh0KGFjdGl2ZUZyYW1lKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB2OENvbnRl
eHQgPSBWOFByb3h5Ojpjb250ZXh0KGFjdGl2ZUZyYW1lKTsKICAgICAvLyBGSVhNRTogZmluZCBh
bGwgY2FzZXMgY29udGV4dCBjYW4gYmUgZW1wdHk6CiAgICAgLy8gIDEpIEpTIGlzIGRpc2FibGVk
OwogICAgIC8vICAyKSBwYWdlIGlzIE5VTEw7Ci0gICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQor
ICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAg
IHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKKyAgICB2ODo6Q29udGV4dDo6U2Nv
cGUgc2NvcGUodjhDb250ZXh0KTsKIAotICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFs
ID0gY29udGV4dC0+R2xvYmFsKCk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwg
PSB2OENvbnRleHQtPkdsb2JhbCgpOwogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBqc0V2ZW50
ID0gZ2xvYmFsLT5HZXQodjg6OlN0cmluZzo6TmV3U3ltYm9sKCJldmVudCIpKTsKLSAgICBFdmVu
dCogZXZlbnQgPSBWOFByb3h5OjpUb05hdGl2ZUV2ZW50KGpzRXZlbnQpOworICAgIEV2ZW50KiBl
dmVudCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZUV2ZW50KGpzRXZlbnQpOwogCiAgICAgLy8g
QmFzZWQgb24gY29kZSBmcm9tIGtqc19iaW5kaW5ncy5jcHAuCiAgICAgLy8gTm90ZTogVGhpcyBp
cyBtb3JlIGxpYmVyYWwgdGhhbiBGaXJlZm94J3MgaW1wbGVtZW50YXRpb24uCkBAIC0xOTQsMTEg
KzE5NCwxMSBAQAogICAgIH0KIAogICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKLSAg
ICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dCht
X3Byb3h5LT5mcmFtZSgpKTsKLSAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgdjg6Okhh
bmRsZTx2ODo6Q29udGV4dD4gdjhDb250ZXh0ID0gVjhQcm94eTo6Y29udGV4dChtX3Byb3h5LT5m
cmFtZSgpKTsKKyAgICBpZiAodjhDb250ZXh0LklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIFNj
cmlwdFZhbHVlKCk7CiAKLSAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7Cisg
ICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKHY4Q29udGV4dCk7CiAKICAgICBSZWZQdHI8RnJh
bWU+IHByb3RlY3QobV9mcmFtZSk7CiAKQEAgLTIxNiw3ICsyMTYsNyBAQAogCiB2b2lkIFNjcmlw
dENvbnRyb2xsZXI6OnNldEV2ZW50SGFuZGxlckxpbmVOdW1iZXIoaW50IGxpbmVOdW1iZXIpCiB7
Ci0gICAgbV9wcm94eS0+c2V0RXZlbnRIYW5kbGVyTGluZW5vKGxpbmVOdW1iZXIpOworICAgIG1f
cHJveHktPnNldEV2ZW50SGFuZGxlckxpbmVOdW1iZXIobGluZU51bWJlcik7CiB9CiAKIHZvaWQg
U2NyaXB0Q29udHJvbGxlcjo6ZmluaXNoZWRXaXRoRXZlbnQoRXZlbnQqIGV2ZW50KQpAQCAtMjI5
LDM0ICsyMjksMzQgQEAKIHsKICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CiAKLSAg
ICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChm
cmFtZSk7Ci0gICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgIHY4OjpIYW5kbGU8djg6OkNv
bnRleHQ+IHY4Q29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQoZnJhbWUpOworICAgIGlmICh2OENv
bnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKLSAgICB2ODo6Q29udGV4dDo6U2Nv
cGUgc2NvcGUoY29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKHY4Q29udGV4
dCk7CiAKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHZhbHVlID0gQ3JlYXRlVjhPYmplY3RG
b3JOUE9iamVjdChvYmplY3QsIDApOwogCiAgICAgLy8gQXR0YWNoIHRvIHRoZSBnbG9iYWwgb2Jq
ZWN0LgotICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsID0gY29udGV4dC0+R2xvYmFs
KCk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwgPSB2OENvbnRleHQtPkdsb2Jh
bCgpOwogICAgIGdsb2JhbC0+U2V0KHY4U3RyaW5nKGtleSksIHZhbHVlKTsKIH0KIAogdm9pZCBT
Y3JpcHRDb250cm9sbGVyOjpjb2xsZWN0R2FyYmFnZSgpCiB7CiAgICAgdjg6OkhhbmRsZVNjb3Bl
IGhhbmRsZVNjb3BlOwotICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFBy
b3h5OjpHZXRDb250ZXh0KG1fcHJveHktPmZyYW1lKCkpOwotICAgIGlmIChjb250ZXh0LklzRW1w
dHkoKSkKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpj
b250ZXh0KG1fcHJveHktPmZyYW1lKCkpOworICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQog
ICAgICAgICByZXR1cm47CiAKLSAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7
CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKHY4Q29udGV4dCk7CiAKICAgICBtX3Byb3h5
LT5ldmFsdWF0ZShTY3JpcHRTb3VyY2VDb2RlKCJpZiAod2luZG93LmdjKSB2b2lkKGdjKCkpOyIp
LCAwKTsKIH0KIAogYm9vbCBTY3JpcHRDb250cm9sbGVyOjpoYXZlSW50ZXJwcmV0ZXIoKSBjb25z
dAogewotICAgIHJldHVybiBtX3Byb3h5LT5Db250ZXh0SW5pdGlhbGl6ZWQoKTsKKyAgICByZXR1
cm4gbV9wcm94eS0+aXNDb250ZXh0SW5pdGlhbGl6ZWQoKTsKIH0KIAogYm9vbCBTY3JpcHRDb250
cm9sbGVyOjppc0VuYWJsZWQoKSBjb25zdApAQCAtMzI2LDEzICszMjYsMTMgQEAKIHN0YXRpYyBO
UE9iamVjdCogY3JlYXRlU2NyaXB0T2JqZWN0KEZyYW1lKiBmcmFtZSkKIHsKICAgICB2ODo6SGFu
ZGxlU2NvcGUgaGFuZGxlU2NvcGU7Ci0gICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4
dCA9IFY4UHJveHk6OkdldENvbnRleHQoZnJhbWUpOwotICAgIGlmIChjb250ZXh0LklzRW1wdHko
KSkKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250
ZXh0KGZyYW1lKTsKKyAgICBpZiAodjhDb250ZXh0LklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJu
IGNyZWF0ZU5vU2NyaXB0T2JqZWN0KCk7CiAKLSAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUo
Y29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKHY4Q29udGV4dCk7CiAgICAg
RE9NV2luZG93KiB3aW5kb3cgPSBmcmFtZS0+ZG9tV2luZG93KCk7Ci0gICAgdjg6OkhhbmRsZTx2
ODo6VmFsdWU+IGdsb2JhbCA9IFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01X
SU5ET1csIHdpbmRvdyk7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGdsb2JhbCA9IFY4UHJv
eHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCB3aW5kb3cpOwog
ICAgIEFTU0VSVChnbG9iYWwtPklzT2JqZWN0KCkpOwogICAgIHJldHVybiBucENyZWF0ZVY4U2Ny
aXB0T2JqZWN0KDAsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QoZ2xvYmFsKSwgd2luZG93
KTsKIH0KQEAgLTM2MywxMyArMzYzLDEzIEBACiAgICAgICAgIHJldHVybiBjcmVhdGVOb1Njcmlw
dE9iamVjdCgpOwogCiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpI
YW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KG1fZnJhbWUp
OwotICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0
PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KG1fZnJhbWUpOworICAgIGlmICh2OENvbnRl
eHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gY3JlYXRlTm9TY3JpcHRPYmplY3QoKTsKLSAg
ICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6OlNj
b3BlIHNjb3BlKHY4Q29udGV4dCk7CiAKICAgICBET01XaW5kb3cqIHdpbmRvdyA9IG1fZnJhbWUt
PmRvbVdpbmRvdygpOwotICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OHBsdWdpbiA9IFY4UHJv
eHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpIVE1MRU1CRURFTEVNRU5ULCBwbHVnaW4pOwor
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OHBsdWdpbiA9IFY4UHJveHk6OmNvbnZlcnRUb1Y4
T2JqZWN0KFY4Q2xhc3NJbmRleDo6SFRNTEVNQkVERUxFTUVOVCwgcGx1Z2luKTsKICAgICBpZiAo
IXY4cGx1Z2luLT5Jc09iamVjdCgpKQogICAgICAgICByZXR1cm4gY3JlYXRlTm9TY3JpcHRPYmpl
Y3QoKTsKIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOENvbGxlY3Rpb24uY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhDb2xsZWN0aW9uLmNwcAkocmV2aXNpb24g
NDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4Q29sbGVjdGlvbi5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTQ4LDE0ICs0OCwxNCBAQAogCiAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdmFsdWUg
aXMgYW4gSFRNTE9wdGlvbkVsZW1lbnQuICBJZiBub3QsIHRocm93IGEgVFlQRV9NSVNNQVRDSF9F
UlIgRE9NRXhjZXB0aW9uLgogICAgIGlmICghVjhIVE1MT3B0aW9uRWxlbWVudDo6SGFzSW5zdGFu
Y2UodmFsdWUpKSB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihUWVBFX01JU01B
VENIX0VSUik7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihUWVBFX01JU01BVENI
X0VSUik7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKLSAgICBIVE1MT3B0aW9uRWxl
bWVudCogZWxlbWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTE9wdGlvbkVsZW1l
bnQ+KHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodmFsdWUpKTsKKyAgICBIVE1MT3B0aW9u
RWxlbWVudCogZWxlbWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxP
cHRpb25FbGVtZW50Pih2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHZhbHVlKSk7CiAgICAg
YmFzZS0+c2V0T3B0aW9uKGluZGV4LCBlbGVtZW50LCBlYyk7CiAKLSAgICBWOFByb3h5OjpTZXRE
T01FeGNlcHRpb24oZWMpOworICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAg
cmV0dXJuIHZhbHVlOwogfQogCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4Tm9kZUZpbHRl
ckNvbmRpdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOE5vZGVG
aWx0ZXJDb25kaXRpb24uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3Mv
djgvVjhOb2RlRmlsdGVyQ29uZGl0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsMTQgKzQ0
LDE0IEBACiAgICAgOiBtX2ZpbHRlcih2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+OjpOZXcoZmls
dGVyKSkKIHsKICNpZm5kZWYgTkRFQlVHCi0gICAgVjhQcm94eTo6UmVnaXN0ZXJHbG9iYWxIYW5k
bGUoTk9ERV9GSUxURVIsIHRoaXMsIG1fZmlsdGVyKTsKKyAgICBWOFByb3h5OjpyZWdpc3Rlckds
b2JhbEhhbmRsZShOT0RFX0ZJTFRFUiwgdGhpcywgbV9maWx0ZXIpOwogI2VuZGlmCiB9CiAKIFY4
Tm9kZUZpbHRlckNvbmRpdGlvbjo6flY4Tm9kZUZpbHRlckNvbmRpdGlvbigpCiB7CiAjaWZuZGVm
IE5ERUJVRwotICAgIFY4UHJveHk6OlVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9maWx0
ZXIpOworICAgIFY4UHJveHk6OnVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9maWx0ZXIp
OwogI2VuZGlmCiAgICAgbV9maWx0ZXIuRGlzcG9zZSgpOwogICAgIG1fZmlsdGVyLkNsZWFyKCk7
CkBAIC02OSwxMiArNjksMTIgQEAKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9
IHY4OjpDb250ZXh0OjpHZXRDdXJyZW50KCktPkdsb2JhbCgpOwogICAgIHY4OjpIYW5kbGU8djg6
OkZ1bmN0aW9uPiBjYWxsYmFjayA9IHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPjo6Q2FzdChtX2Zp
bHRlcik7CiAgICAgT3duQXJyYXlQdHI8djg6OkhhbmRsZTx2ODo6VmFsdWU+ID4gYXJncyhuZXcg
djg6OkhhbmRsZTx2ODo6VmFsdWU+WzFdKTsKLSAgICBhcmdzWzBdID0gVjhQcm94eTo6VG9WOE9i
amVjdChWOENsYXNzSW5kZXg6Ok5PREUsIG5vZGUpOworICAgIGFyZ3NbMF0gPSBWOFByb3h5Ojpj
b252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok5PREUsIG5vZGUpOwogCiAgICAgVjhQcm94
eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZSgpOwogICAgIEFTU0VSVChwcm94eSk7CiAKLSAg
ICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmVzdWx0ID0gcHJveHktPkNhbGxGdW5jdGlvbihjYWxs
YmFjaywgb2JqZWN0LCAxLCBhcmdzLmdldCgpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4g
cmVzdWx0ID0gcHJveHktPmNhbGxGdW5jdGlvbihjYWxsYmFjaywgb2JqZWN0LCAxLCBhcmdzLmdl
dCgpKTsKIAogICAgIGlmIChleGNlcHRpb25DYXRjaGVyLkhhc0NhdWdodCgpKSB7CiAgICAgICAg
IHN0YXRlLT5zZXRFeGNlcHRpb24oZXhjZXB0aW9uQ2F0Y2hlci5FeGNlcHRpb24oKSk7CkluZGV4
OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4SGVscGVycy5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9iaW5kaW5ncy92OC9WOEhlbHBlcnMuY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUv
YmluZGluZ3MvdjgvVjhIZWxwZXJzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDAsMTMgKzQwLDEz
IEBACiAKIHZvaWQgd3JhcE5QT2JqZWN0KHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqZWN0LCBO
UE9iamVjdCogbnBPYmplY3QpCiB7Ci0gICAgVjhQcm94eTo6U2V0RE9NV3JhcHBlcihvYmplY3Qs
IFY4Q2xhc3NJbmRleDo6TlBPQkpFQ1QsIG5wT2JqZWN0KTsKKyAgICBWOFByb3h5OjpzZXRET01X
cmFwcGVyKG9iamVjdCwgVjhDbGFzc0luZGV4OjpOUE9CSkVDVCwgbnBPYmplY3QpOwogfQogCiB2
ODo6TG9jYWw8djg6OkNvbnRleHQ+IHRvVjhDb250ZXh0KE5QUCBucHAsIE5QT2JqZWN0KiBucE9i
amVjdCkKIHsKICAgICBWOE5QT2JqZWN0KiBvYmplY3QgPSByZWludGVycHJldF9jYXN0PFY4TlBP
YmplY3QqPihucE9iamVjdCk7Ci0gICAgcmV0dXJuIFY4UHJveHk6OkdldENvbnRleHQob2JqZWN0
LT5yb290T2JqZWN0LT5mcmFtZSgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udGV4dChvYmpl
Y3QtPnJvb3RPYmplY3QtPmZyYW1lKCkpOwogfQogCiBWOFByb3h5KiB0b1Y4UHJveHkoTlBPYmpl
Y3QqIG5wT2JqZWN0KQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdl
Q2hhbm5lbENvbnN0cnVjdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOE1lc3NhZ2VDaGFubmVsQ29uc3RydWN0b3IuY3BwCShyZXZpc2lvbiA0NTA5NSkK
KysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUNoYW5uZWxDb25zdHJ1Y3Rv
ci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDcgKzQ0LDcgQEAKIENBTExCQUNLX0ZVTkNfREVD
TChNZXNzYWdlQ2hhbm5lbENvbnN0cnVjdG9yKQogewogICAgIElOQ19TVEFUUygiRE9NLk1lc3Nh
Z2VDaGFubmVsLkNvbnN0cnVjdG9yIik7Ci0gICAgLy8gRklYTUU6IFRoZSBsb2dpYyBoZXJlIGlz
IGFsbW9zdCBleGFjdCBkdXBsaWNhdGUgb2YgVjg6OkNvbnN0cnVjdERPTU9iamVjdC4KKyAgICAv
LyBGSVhNRTogVGhlIGxvZ2ljIGhlcmUgaXMgYWxtb3N0IGV4YWN0IGR1cGxpY2F0ZSBvZiBWODo6
Y29uc3RydWN0RE9NT2JqZWN0LgogICAgIC8vIENvbnNpZGVyIHJlZmFjdG9yaW5nIHRvIHJlZHVj
ZSBkdXBsaWNhdGlvbi4KICAgICBpZiAoIWFyZ3MuSXNDb25zdHJ1Y3RDYWxsKCkpCiAgICAgICAg
IHJldHVybiB0aHJvd0Vycm9yKCJET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxs
ZWQgYXMgYSBmdW5jdGlvbi4iKTsKQEAgLTU3LDcgKzU3LDcgQEAKICAgICBEb2N1bWVudCogZG9j
dW1lbnQgPSBmcmFtZS0+ZG9jdW1lbnQoKTsKIAogICAgIC8vIE5vdGU6IGl0J3MgT0sgdG8gbGV0
IHRoaXMgUmVmUHRyIGdvIG91dCBvZiBzY29wZSBiZWNhdXNlIHdlIGFsc28gY2FsbAotICAgIC8v
IFNldERPTVdyYXBwZXIoKSwgd2hpY2ggZWZmZWN0aXZlbHkgaG9sZHMgYSByZWZlcmVuY2UgdG8g
b2JqLgorICAgIC8vIHNldERPTVdyYXBwZXIoKSwgd2hpY2ggZWZmZWN0aXZlbHkgaG9sZHMgYSBy
ZWZlcmVuY2UgdG8gb2JqLgogICAgIFJlZlB0cjxNZXNzYWdlQ2hhbm5lbD4gb2JqID0gTWVzc2Fn
ZUNoYW5uZWw6OmNyZWF0ZShkb2N1bWVudCk7CiAKICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4g
bWVzc2FnZUNoYW5uZWwgPSBhcmdzLkhvbGRlcigpOwpAQCAtNjUsMTEgKzY1LDExIEBACiAgICAg
Ly8gQ3JlYXRlIHJlZmVyZW5jZXMgZnJvbSB0aGUgTWVzc2FnZUNoYW5uZWwgd3JhcHBlciB0byB0
aGUgdHdvCiAgICAgLy8gTWVzc2FnZVBvcnQgd3JhcHBlcnMgdG8gbWFrZSBzdXJlIHRoYXQgdGhl
IE1lc3NhZ2VQb3J0IHdyYXBwZXJzCiAgICAgLy8gc3RheSBhbGl2ZSBhcyBsb25nIGFzIHRoZSBN
ZXNzYWdlQ2hhbm5lbCB3cmFwcGVyIGlzIGFyb3VuZC4KLSAgICBtZXNzYWdlQ2hhbm5lbC0+U2V0
SW50ZXJuYWxGaWVsZChrTWVzc2FnZUNoYW5uZWxQb3J0MUluZGV4LCBWOFByb3h5OjpUb1Y4T2Jq
ZWN0KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIG9iai0+cG9ydDEoKSkpOwotICAgIG1lc3Nh
Z2VDaGFubmVsLT5TZXRJbnRlcm5hbEZpZWxkKGtNZXNzYWdlQ2hhbm5lbFBvcnQySW5kZXgsIFY4
UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgb2JqLT5wb3J0Migp
KSk7CisgICAgbWVzc2FnZUNoYW5uZWwtPlNldEludGVybmFsRmllbGQoa01lc3NhZ2VDaGFubmVs
UG9ydDFJbmRleCwgVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpNRVNT
QUdFUE9SVCwgb2JqLT5wb3J0MSgpKSk7CisgICAgbWVzc2FnZUNoYW5uZWwtPlNldEludGVybmFs
RmllbGQoa01lc3NhZ2VDaGFubmVsUG9ydDJJbmRleCwgVjhQcm94eTo6Y29udmVydFRvVjhPYmpl
Y3QoVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgb2JqLT5wb3J0MigpKSk7CiAKICAgICAvLyBT
ZXR1cCB0aGUgc3RhbmRhcmQgd3JhcHBlciBvYmplY3QgaW50ZXJuYWwgZmllbGRzLgotICAgIFY4
UHJveHk6OlNldERPTVdyYXBwZXIobWVzc2FnZUNoYW5uZWwsIFY4Q2xhc3NJbmRleDo6TUVTU0FH
RUNIQU5ORUwsIG9iai5nZXQoKSk7CisgICAgVjhQcm94eTo6c2V0RE9NV3JhcHBlcihtZXNzYWdl
Q2hhbm5lbCwgVjhDbGFzc0luZGV4OjpNRVNTQUdFQ0hBTk5FTCwgb2JqLmdldCgpKTsKICAgICBy
ZXR1cm4gdG9WOChvYmoucmVsZWFzZSgpLCBtZXNzYWdlQ2hhbm5lbCk7CiB9CiAKSW5kZXg6IFdl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTEZyYW1lRWxlbWVudEN1c3RvbS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MRnJhbWVFbGVtZW50
Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOEhUTUxGcmFtZUVsZW1lbnRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICsz
OSw3IEBACiAKIEFDQ0VTU09SX1NFVFRFUihIVE1MRnJhbWVFbGVtZW50U3JjKQogewotICAgIEhU
TUxGcmFtZUVsZW1lbnQqIGZyYW1lID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MRnJh
bWVFbGVtZW50PihpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MRnJhbWVFbGVtZW50KiBmcmFtZSA9
IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxGcmFtZUVsZW1lbnQ+KGluZm8u
SG9sZGVyKCkpOwogICAgIFN0cmluZyBzcmNWYWx1ZSA9IHRvV2ViQ29yZVN0cmluZ1dpdGhOdWxs
Q2hlY2sodmFsdWUpOwogCiAgICAgaWYgKCFhbGxvd1NldHRpbmdGcmFtZVNyY1RvSmF2YXNjcmlw
dFVybChmcmFtZSwgc3JjVmFsdWUpKQpAQCAtNTAsNyArNTAsNyBAQAogCiBBQ0NFU1NPUl9TRVRU
RVIoSFRNTEZyYW1lRWxlbWVudExvY2F0aW9uKQogewotICAgIEhUTUxGcmFtZUVsZW1lbnQqIGZy
YW1lID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MRnJhbWVFbGVtZW50PihpbmZvLkhv
bGRlcigpKTsKKyAgICBIVE1MRnJhbWVFbGVtZW50KiBmcmFtZSA9IFY4UHJveHk6OmNvbnZlcnRE
T01XcmFwcGVyVG9Ob2RlPEhUTUxGcmFtZUVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIFN0
cmluZyBsb2NhdGlvblZhbHVlID0gdG9XZWJDb3JlU3RyaW5nV2l0aE51bGxDaGVjayh2YWx1ZSk7
CiAKICAgICBpZiAoIWFsbG93U2V0dGluZ0ZyYW1lU3JjVG9KYXZhc2NyaXB0VXJsKGZyYW1lLCBs
b2NhdGlvblZhbHVlKSkKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TmF2aWdh
dG9yQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OE5hdmlnYXRvckN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhOYXZpZ2F0b3JDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MSw3
ICs0MSw3IEBACiB7CiAgICAgSU5DX1NUQVRTKCJET00uTmF2aWdhdG9yLmFwcFZlcnNpb24iKTsK
ICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0gICAg
TmF2aWdhdG9yKiBuYXZpZ2F0b3IgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxOYXZpZ2F0b3I+
KFY4Q2xhc3NJbmRleDo6TkFWSUdBVE9SLCBob2xkZXIpOworICAgIE5hdmlnYXRvciogbmF2aWdh
dG9yID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PE5hdmlnYXRvcj4oVjhDbGFzc0lu
ZGV4OjpOQVZJR0FUT1IsIGhvbGRlcik7CiAgICAgcmV0dXJuIHY4U3RyaW5nT3JVbmRlZmluZWQo
bmF2aWdhdG9yLT5hcHBWZXJzaW9uKCkpOwogfQogCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjay5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxUcmFuc2FjdGlvbkVy
cm9yQ2FsbGJhY2suY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4Q3VzdG9tU1FMVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNTQsMTQgKzU0LDE0IEBACiB7CiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNj
b3BlOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6Okdl
dENvbnRleHQobV9mcmFtZS5nZXQoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29u
dGV4dCA9IFY4UHJveHk6OmNvbnRleHQobV9mcmFtZS5nZXQoKSk7CiAgICAgaWYgKGNvbnRleHQu
SXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2Nv
cGUoY29udGV4dCk7CiAKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJndltdID0gewotICAg
ICAgICBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMRVJST1IsIGVycm9yKQor
ICAgICAgICBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNRTEVSUk9S
LCBlcnJvcikKICAgICB9OwogCiAgICAgLy8gUHJvdGVjdCB0aGUgZnJhbWUgdW50aWwgdGhlIGNh
bGxiYWNrIHJldHVybnMuCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxJ
bnB1dEVsZW1lbnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4SFRNTElucHV0RWxlbWVudEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysg
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MSW5wdXRFbGVtZW50Q3VzdG9tLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNDEsNyArNDEsNyBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkhU
TUxJbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQuX2dldCIpOwogICAgIHY4OjpIYW5kbGU8djg6
Ok9iamVjdD4gaG9sZGVyID0gaW5mby5Ib2xkZXIoKTsKLSAgICBIVE1MSW5wdXRFbGVtZW50KiBp
bXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxJbnB1dEVsZW1lbnQ+KGhvbGRlcik7
CisgICAgSFRNTElucHV0RWxlbWVudCogaW1wID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJU
b05vZGU8SFRNTElucHV0RWxlbWVudD4oaG9sZGVyKTsKIAogICAgIGlmICghaW1wLT5jYW5IYXZl
U2VsZWN0aW9uKCkpCiAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCJBY2Nlc3Npbmcgc2VsZWN0
aW9uU3RhcnQgb24gYW4gaW5wdXQgZWxlbWVudCB0aGF0IGNhbm5vdCBoYXZlIGEgc2VsZWN0aW9u
LiIpOwpAQCAtNTQsNyArNTQsNyBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxJbnB1dEVs
ZW1lbnQuc2VsZWN0aW9uU3RhcnQuX3NldCIpOwogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
aG9sZGVyID0gaW5mby5Ib2xkZXIoKTsKLSAgICBIVE1MSW5wdXRFbGVtZW50KiBpbXAgPSBWOFBy
b3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxJbnB1dEVsZW1lbnQ+KGhvbGRlcik7CisgICAgSFRN
TElucHV0RWxlbWVudCogaW1wID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRN
TElucHV0RWxlbWVudD4oaG9sZGVyKTsKIAogICAgIGlmICghaW1wLT5jYW5IYXZlU2VsZWN0aW9u
KCkpIHsKICAgICAgICAgdGhyb3dFcnJvcigiQWNjZXNzaW5nIHNlbGVjdGlvblN0YXJ0IG9uIGFu
IGlucHV0IGVsZW1lbnQgdGhhdCBjYW5ub3QgaGF2ZSBhIHNlbGVjdGlvbi4iKTsKQEAgLTY3LDcg
KzY3LDcgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MSW5wdXRFbGVtZW50LnNlbGVjdGlv
bkVuZC5fZ2V0Iik7CiAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBpbmZvLkhv
bGRlcigpOwotICAgIEhUTUxJbnB1dEVsZW1lbnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJU
b05vZGU8SFRNTElucHV0RWxlbWVudD4oaG9sZGVyKTsKKyAgICBIVE1MSW5wdXRFbGVtZW50KiBp
bXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MSW5wdXRFbGVtZW50Piho
b2xkZXIpOwogCiAgICAgaWYgKCFpbXAtPmNhbkhhdmVTZWxlY3Rpb24oKSkKICAgICAgICAgcmV0
dXJuIHRocm93RXJyb3IoIkFjY2Vzc2luZyBzZWxlY3Rpb25FbmQgb24gYW4gaW5wdXQgZWxlbWVu
dCB0aGF0IGNhbm5vdCBoYXZlIGEgc2VsZWN0aW9uLiIpOwpAQCAtODAsNyArODAsNyBAQAogewog
ICAgIElOQ19TVEFUUygiRE9NLkhUTUxJbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kLl9zZXQiKTsK
ICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0gICAg
SFRNTElucHV0RWxlbWVudCogaW1wID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MSW5w
dXRFbGVtZW50Pihob2xkZXIpOworICAgIEhUTUxJbnB1dEVsZW1lbnQqIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxJbnB1dEVsZW1lbnQ+KGhvbGRlcik7CiAKICAg
ICBpZiAoIWltcC0+Y2FuSGF2ZVNlbGVjdGlvbigpKSB7CiAgICAgICAgIHRocm93RXJyb3IoIkFj
Y2Vzc2luZyBzZWxlY3Rpb25FbmQgb24gYW4gaW5wdXQgZWxlbWVudCB0aGF0IGNhbm5vdCBoYXZl
IGEgc2VsZWN0aW9uLiIpOwpAQCAtOTQsNyArOTQsNyBAQAogewogICAgIElOQ19TVEFUUygiRE9N
LkhUTUxJbnB1dEVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UiKTsKICAgICB2ODo6SGFuZGxlPHY4
OjpPYmplY3Q+IGhvbGRlciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgSFRNTElucHV0RWxlbWVudCog
aW1wID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MSW5wdXRFbGVtZW50Pihob2xkZXIp
OworICAgIEhUTUxJbnB1dEVsZW1lbnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVy
VG9Ob2RlPEhUTUxJbnB1dEVsZW1lbnQ+KGhvbGRlcik7CiAKICAgICBpZiAoIWltcC0+Y2FuSGF2
ZVNlbGVjdGlvbigpKQogICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigiQ2FsbGluZyBzZXRTZWxl
Y3Rpb25SYW5nZSBvbiBhbiBpbnB1dCBlbGVtZW50IHRoYXQgY2Fubm90IGhhdmUgYSBzZWxlY3Rp
b24uIik7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFN0YXRl
bWVudENhbGxiYWNrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOEN1c3RvbVNRTFN0YXRlbWVudENhbGxiYWNrLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFN0YXRlbWVudENhbGxiYWNrLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNTQsMTUgKzU0LDE1IEBACiB7CiAgICAgdjg6OkhhbmRsZVNj
b3BlIGhhbmRsZVNjb3BlOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9
IFY4UHJveHk6OkdldENvbnRleHQobV9mcmFtZS5nZXQoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6
Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQobV9mcmFtZS5nZXQoKSk7CiAgICAg
aWYgKGNvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKICAgICB2ODo6Q29udGV4
dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CiAKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJn
dltdID0gewotICAgICAgICBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMVFJB
TlNBQ1RJT04sIHRyYW5zYWN0aW9uKSwKLSAgICAgICAgVjhQcm94eTo6VG9WOE9iamVjdChWOENs
YXNzSW5kZXg6OlNRTFJFU1VMVFNFVCwgcmVzdWx0U2V0KQorICAgICAgICBWOFByb3h5Ojpjb252
ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNRTFRSQU5TQUNUSU9OLCB0cmFuc2FjdGlvbiks
CisgICAgICAgIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMUkVT
VUxUU0VULCByZXN1bHRTZXQpCiAgICAgfTsKIAogICAgIC8vIFByb3RlY3QgdGhlIGZyYW1lIHVu
dGlsIHRoZSBjYWxsYmFjayByZXR1cm5zLgpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhIVE1MRm9ybUVsZW1lbnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTEZvcm1FbGVtZW50Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUw
OTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxGb3JtRWxlbWVudEN1c3Rv
bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDE5ICs0MiwxOSBAQAogSU5ERVhFRF9QUk9QRVJU
WV9HRVRURVIoSFRNTEZvcm1FbGVtZW50KQogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxGb3Jt
RWxlbWVudC5JbmRleGVkUHJvcGVydHlHZXR0ZXIiKTsKLSAgICBIVE1MRm9ybUVsZW1lbnQqIGZv
cm0gPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxGb3JtRWxlbWVudD4oaW5mby5Ib2xk
ZXIoKSk7CisgICAgSFRNTEZvcm1FbGVtZW50KiBmb3JtID0gVjhQcm94eTo6Y29udmVydERPTVdy
YXBwZXJUb05vZGU8SFRNTEZvcm1FbGVtZW50PihpbmZvLkhvbGRlcigpKTsKICAgICAKICAgICBS
ZWZQdHI8Tm9kZT4gZm9ybUVsZW1lbnQgPSBmb3JtLT5lbGVtZW50cygpLT5pdGVtKGluZGV4KTsK
ICAgICBpZiAoIWZvcm1FbGVtZW50KQogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJj
ZXB0b3IoKTsKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QoZm9ybUVsZW1lbnQu
Z2V0KCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QoZm9ybUVs
ZW1lbnQuZ2V0KCkpOwogfQogCiAKIE5BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MRm9ybUVsZW1l
bnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTEZvcm1FbGVtZW50Lk5hbWVkUHJvcGVydHlH
ZXR0ZXIiKTsKLSAgICBIVE1MRm9ybUVsZW1lbnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJU
b05vZGU8SFRNTEZvcm1FbGVtZW50PihpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MRm9ybUVsZW1l
bnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxGb3JtRWxlbWVu
dD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgQXRvbWljU3RyaW5nIHYgPSB2OFN0cmluZ1RvQXRvbWlj
V2ViQ29yZVN0cmluZyhuYW1lKTsKIAogICAgIC8vIENhbGwgZ2V0TmFtZWRFbGVtZW50cyB0d2lj
ZSwgZmlyc3QgdGltZSBjaGVjayBpZiBpdCBoYXMgYSB2YWx1ZQpAQCAtNzQsMTUgKzc0LDE1IEBA
CiAgICAgQVNTRVJUKCFlbGVtZW50cy5pc0VtcHR5KCkpOwogCiAgICAgaWYgKGVsZW1lbnRzLnNp
emUoKSA9PSAxKQotICAgICAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QoZWxlbWVu
dHMuYXQoMCkuZ2V0KCkpOworICAgICAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4
T2JqZWN0KGVsZW1lbnRzLmF0KDApLmdldCgpKTsKIAogICAgIE5vZGVMaXN0KiBjb2xsZWN0aW9u
ID0gbmV3IFY4TmFtZWROb2Rlc0NvbGxlY3Rpb24oZWxlbWVudHMpOwotICAgIHJldHVybiBWOFBy
b3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Tk9ERUxJU1QsIGNvbGxlY3Rpb24pOworICAg
IHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok5PREVMSVNU
LCBjb2xsZWN0aW9uKTsKIH0KICAgICAKIENBTExCQUNLX0ZVTkNfREVDTChIVE1MRm9ybUVsZW1l
bnRTdWJtaXQpIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MRm9ybUVsZW1lbnQuc3VibWl0KCki
KTsKLSAgICBIVE1MRm9ybUVsZW1lbnQqIGZvcm0gPSBWOFByb3h5OjpET01XcmFwcGVyVG9OYXRp
dmU8SFRNTEZvcm1FbGVtZW50PihhcmdzLkhvbGRlcigpKTsKKyAgICBIVE1MRm9ybUVsZW1lbnQq
IGZvcm0gPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPEhUTUxGb3JtRWxlbWVu
dD4oYXJncy5Ib2xkZXIoKSk7CiAgICAgZm9ybS0+c3VibWl0KDAsIGZhbHNlLCBmYWxzZSk7CiAg
ICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIH0KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4RGF0YWJhc2VDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGlu
Z3MvdjgvY3VzdG9tL1Y4RGF0YWJhc2VDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RGF0YWJhc2VDdXN0b20uY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0zMiwxNCArMzIsMTMgQEAKIAogI2lmIEVOQUJMRShEQVRBQkFTRSkKIAotI2luY2x1
ZGUgInY4X2JpbmRpbmcuaCIKLSNpbmNsdWRlICJ2OF9wcm94eS5oIgotCiAjaW5jbHVkZSAiRGF0
YWJhc2UuaCIKKyNpbmNsdWRlICJWOEJpbmRpbmcuaCIKICNpbmNsdWRlICJWOEN1c3RvbUJpbmRp
bmcuaCIKICNpbmNsdWRlICJWOEN1c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJhY2suaCIKICNpbmNs
dWRlICJWOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjay5oIgogI2luY2x1ZGUgIlY4
Q3VzdG9tVm9pZENhbGxiYWNrLmgiCisjaW5jbHVkZSAiVjhQcm94eS5oIgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKQEAgLTU0LDE2ICs1MywxNiBAQAogICAgIElOQ19TVEFUUygiRE9NLkRhdGFi
YXNlLnRyYW5zYWN0aW9uKCkiKTsKIAogICAgIGlmIChhcmdzLkxlbmd0aCgpID09IDApIHsKLSAg
ICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpTWU5UQVhfRVJST1IsICJUcmFuc2Fj
dGlvbiBjYWxsYmFjayBpcyByZXF1aXJlZC4iKTsKKyAgICAgICAgVjhQcm94eTo6dGhyb3dFcnJv
cihWOFByb3h5OjpTWU5UQVhfRVJST1IsICJUcmFuc2FjdGlvbiBjYWxsYmFjayBpcyByZXF1aXJl
ZC4iKTsKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKICAgICB9CiAKICAgICBpZiAo
IWFyZ3NbMF0tPklzT2JqZWN0KCkpIHsKLSAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFBy
b3h5OjpUWVBFX0VSUk9SLCAiVHJhbnNhY3Rpb24gY2FsbGJhY2sgbXVzdCBiZSBvZiB2YWxpZCB0
eXBlLiIpOworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlRZUEVfRVJST1Is
ICJUcmFuc2FjdGlvbiBjYWxsYmFjayBtdXN0IGJlIG9mIHZhbGlkIHR5cGUuIik7CiAgICAgICAg
IHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgfQogCi0gICAgRGF0YWJhc2UqIGRhdGFiYXNl
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RGF0YWJhc2U+KFY4Q2xhc3NJbmRleDo6REFUQUJB
U0UsIGFyZ3MuSG9sZGVyKCkpOworICAgIERhdGFiYXNlKiBkYXRhYmFzZSA9IFY4UHJveHk6OmNv
bnZlcnRUb05hdGl2ZU9iamVjdDxEYXRhYmFzZT4oVjhDbGFzc0luZGV4OjpEQVRBQkFTRSwgYXJn
cy5Ib2xkZXIoKSk7CiAKICAgICBGcmFtZSogZnJhbWUgPSBWOFByb3h5OjpyZXRyaWV2ZUZyYW1l
KCk7CiAKQEAgLTcyLDcgKzcxLDcgQEAKICAgICBSZWZQdHI8VjhDdXN0b21TUUxUcmFuc2FjdGlv
bkVycm9yQ2FsbGJhY2s+IGVycm9yQ2FsbGJhY2s7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAx
KSB7CiAgICAgICAgIGlmICghYXJnc1sxXS0+SXNPYmplY3QoKSkgewotICAgICAgICAgICAgVjhQ
cm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiVHJhbnNhY3Rpb24gZXJyb3Ig
Y2FsbGJhY2sgbXVzdCBiZSBvZiB2YWxpZCB0eXBlLiIpOworICAgICAgICAgICAgVjhQcm94eTo6
dGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiVHJhbnNhY3Rpb24gZXJyb3IgY2FsbGJh
Y2sgbXVzdCBiZSBvZiB2YWxpZCB0eXBlLiIpOwogICAgICAgICAgICAgcmV0dXJuIHY4OjpVbmRl
ZmluZWQoKTsKICAgICAgICAgfQogICAgICAgICBlcnJvckNhbGxiYWNrID0gVjhDdXN0b21TUUxU
cmFuc2FjdGlvbkVycm9yQ2FsbGJhY2s6OmNyZWF0ZShhcmdzWzFdLCBmcmFtZSk7CkBAIC04MSw3
ICs4MCw3IEBACiAgICAgUmVmUHRyPFY4Q3VzdG9tVm9pZENhbGxiYWNrPiBzdWNjZXNzQ2FsbGJh
Y2s7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAyKSB7CiAgICAgICAgIGlmICghYXJnc1sxXS0+
SXNPYmplY3QoKSkgewotICAgICAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpU
WVBFX0VSUk9SLCAiVHJhbnNhY3Rpb24gc3VjY2VzcyBjYWxsYmFjayBtdXN0IGJlIG9mIHZhbGlk
IHR5cGUuIik7CisgICAgICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlRZUEVf
RVJST1IsICJUcmFuc2FjdGlvbiBzdWNjZXNzIGNhbGxiYWNrIG11c3QgYmUgb2YgdmFsaWQgdHlw
ZS4iKTsKICAgICAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgICAgIH0KICAg
ICAgICAgc3VjY2Vzc0NhbGxiYWNrID0gVjhDdXN0b21Wb2lkQ2FsbGJhY2s6OmNyZWF0ZShhcmdz
WzJdLCBmcmFtZSk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVBhcnNl
ckNvbnN0cnVjdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOERPTVBhcnNlckNvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVBhcnNlckNvbnN0cnVjdG9yLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzksNyArMzksNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKERPTVBhcnNlckNvbnN0
cnVjdG9yKQogewogICAgIElOQ19TVEFUUygiRE9NLkRPTVBhcnNlci5Db250cnVjdG9yIik7Ci0g
ICAgcmV0dXJuIFY4UHJveHk6OkNvbnN0cnVjdERPTU9iamVjdDxWOENsYXNzSW5kZXg6OkRPTVBB
UlNFUiwgRE9NUGFyc2VyPihhcmdzKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29uc3RydWN0RE9N
T2JqZWN0PFY4Q2xhc3NJbmRleDo6RE9NUEFSU0VSLCBET01QYXJzZXI+KGFyZ3MpOwogfQogCiB9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OERPTVdpbmRvd0N1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhET01XaW5kb3dDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4RE9NV2luZG93Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNjQsMTIgKzY0LDEyIEBACiAgICAgaWYgKGFyZ3VtZW50Q291bnQgPCAxKQogICAgICAgICBy
ZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgRE9NV2luZG93KiBpbXAgPSBWOFByb3h5OjpU
b05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhv
bGRlcigpKTsKKyAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsK
IAogICAgIGlmICghaW1wLT5mcmFtZSgpKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgp
OwogCi0gICAgaWYgKCFWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUp
KQorICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkK
ICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAogICAgIFNjcmlwdEV4ZWN1dGlvbkNv
bnRleHQqIHNjcmlwdENvbnRleHQgPSBzdGF0aWNfY2FzdDxTY3JpcHRFeGVjdXRpb25Db250ZXh0
Kj4oaW1wLT5mcmFtZSgpLT5kb2N1bWVudCgpKTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogc3RhdGlj
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252ZXJ0QmFzZTY0KGNvbnN0IFN0cmluZyYgc3RyLCBi
b29sIGVuY29kZSkKIHsKICAgICBpZiAoIWlzQXNjaWkoc3RyKSkgewotICAgICAgICBWOFByb3h5
OjpTZXRET01FeGNlcHRpb24oSU5WQUxJRF9DSEFSQUNURVJfRVJSKTsKKyAgICAgICAgVjhQcm94
eTo6c2V0RE9NRXhjZXB0aW9uKElOVkFMSURfQ0hBUkFDVEVSX0VSUik7CiAgICAgICAgIHJldHVy
biBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogICAgIH0KIApAQCAtMTYxLDIwICsxNjEsMjAg
QEAKIAogQUNDRVNTT1JfU0VUVEVSKERPTVdpbmRvd0xvY2F0aW9uKQogewotICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gaG9sZGVyID0gVjhQcm94eTo6TG9va3VwRE9NV3JhcHBlcihWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVywgaW5mby5UaGlzKCkpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVj
dD4gaG9sZGVyID0gVjhQcm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJ
TkRPVywgaW5mby5UaGlzKCkpOwogICAgIGlmIChob2xkZXIuSXNFbXB0eSgpKQogICAgICAgICBy
ZXR1cm47CiAKLSAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERP
TVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGhvbGRlcik7CisgICAgRE9NV2luZG93
KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVywgaG9sZGVyKTsKICAgICBXaW5kb3dTZXRMb2NhdGlvbihpbXAsIHRv
V2ViQ29yZVN0cmluZyh2YWx1ZSkpOwogfQogCiAKIEFDQ0VTU09SX1NFVFRFUihET01XaW5kb3dP
cGVuZXIpCiB7Ci0gICAgRE9NV2luZG93KiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxE
T01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLkhvbGRlcigpKTsKKyAgICBE
T01XaW5kb3cqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+
KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLkhvbGRlcigpKTsKIAotICAgIGlmICghVjhQ
cm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKKyAgICBpZiAoIVY4UHJv
eHk6OmNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgdHJ1ZSkpCiAgICAgICAgIHJldHVybjsK
ICAgCiAgICAgLy8gT3BlbmVyIGNhbiBiZSBzaGFkb3dlZCBpZiBpdCBpcyBpbiB0aGUgc2FtZSBk
b21haW4uCkBAIC0xOTcsOSArMTk3LDkgQEAKIENBTExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dB
ZGRFdmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5hZGRFdmVu
dExpc3RlbmVyKCkiKTsKLSAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2Jq
ZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGFyZ3MuSG9sZGVyKCkpOwor
ICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PERPTVdp
bmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGFyZ3MuSG9sZGVyKCkpOwogCi0gICAgaWYg
KCFWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUpKQorICAgIGlmICgh
VjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKICAgICAgICAgcmV0
dXJuIHY4OjpVbmRlZmluZWQoKTsKIAogICAgIGlmICghaW1wLT5mcmFtZSgpKQpAQCAtMjE0LDcg
KzIxNCw3IEBACiAgICAgaWYgKCFwcm94eSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQo
KTsKIAotICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JD
cmVhdGVWOEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExp
c3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIoYXJn
c1sxXSwgZmFsc2UpOwogCiAgICAgaWYgKGxpc3RlbmVyKSB7CiAgICAgICAgIFN0cmluZyBldmVu
dFR5cGUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CkBAIC0yMjksOSArMjI5LDkgQEAKIENB
TExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dSZW1vdmVFdmVudExpc3RlbmVyKQogewogICAgIElO
Q19TVEFUUygiRE9NLkRPTVdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCkiKTsKLSAgICBET01X
aW5kb3cqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0lu
ZGV4OjpET01XSU5ET1csIGFyZ3MuSG9sZGVyKCkpOworICAgIERPTVdpbmRvdyogaW1wID0gVjhQ
cm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01X
SU5ET1csIGFyZ3MuSG9sZGVyKCkpOwogCi0gICAgaWYgKCFWOFByb3h5OjpDYW5BY2Nlc3NGcmFt
ZShpbXAtPmZyYW1lKCksIHRydWUpKQorICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUo
aW1wLT5mcmFtZSgpLCB0cnVlKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAog
ICAgIGlmICghaW1wLT5mcmFtZSgpKQpAQCAtMjQ1LDcgKzI0NSw3IEBACiAgICAgaWYgKCFwcm94
eSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIFJlZlB0cjxFdmVudExp
c3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kVjhFdmVudExpc3RlbmVyKGFyZ3NbMV0sIGZh
bHNlKTsKKyAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+ZmluZFY4
RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAKICAgICBpZiAobGlzdGVuZXIpIHsKICAg
ICAgICAgU3RyaW5nIGV2ZW50VHlwZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKQEAgLTI1
OSw3ICsyNTksNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKERPTVdpbmRvd1Bvc3RNZXNzYWdlKQog
ewogICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5wb3N0TWVzc2FnZSgpIik7Ci0gICAgRE9N
V2luZG93KiB3aW5kb3cgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKKyAgICBET01XaW5kb3cqIHdpbmRv
dyA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRl
eDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIERPTVdpbmRvdyogc291cmNlID0g
VjhQcm94eTo6cmV0cmlldmVGcmFtZUZvckNhbGxpbmdDb250ZXh0KCktPmRvbVdpbmRvdygpOwog
ICAgIEFTU0VSVChzb3VyY2UtPmZyYW1lKCkpOwpAQCAtMjc1LDggKzI3NSw4IEBACiAgICAgLy8g
b3IKICAgICAvLyAgIHBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRhcmdldE9yaWdpbik7CiAgICAgaWYg
KGFyZ3MuTGVuZ3RoKCkgPiAyKSB7Ci0gICAgICAgIGlmIChWOFByb3h5OjpJc1dyYXBwZXJPZlR5
cGUoYXJnc1sxXSwgVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCkpCi0gICAgICAgICAgICBwb3J0
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TWVzc2FnZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVT
U0FHRVBPUlQsIGFyZ3NbMV0pOworICAgICAgICBpZiAoVjhQcm94eTo6aXNXcmFwcGVyT2ZUeXBl
KGFyZ3NbMV0sIFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQpKQorICAgICAgICAgICAgcG9ydCA9
IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxNZXNzYWdlUG9ydD4oVjhDbGFzc0luZGV4
OjpNRVNTQUdFUE9SVCwgYXJnc1sxXSk7CiAgICAgICAgIHRhcmdldE9yaWdpbiA9IHZhbHVlVG9T
dHJpbmdXaXRoTnVsbE9yVW5kZWZpbmVkQ2hlY2soYXJnc1syXSk7CiAgICAgfSBlbHNlIHsKICAg
ICAgICAgdGFyZ2V0T3JpZ2luID0gdmFsdWVUb1N0cmluZ1dpdGhOdWxsT3JVbmRlZmluZWRDaGVj
ayhhcmdzWzFdKTsKQEAgLTI4OCw3ICsyODgsNyBAQAogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAw
OwogICAgIHdpbmRvdy0+cG9zdE1lc3NhZ2UobWVzc2FnZSwgcG9ydCwgdGFyZ2V0T3JpZ2luLCBz
b3VyY2UsIGVjKTsKICAgICBpZiAoZWMpCi0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlv
bihlYyk7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAKICAgICByZXR1
cm4gdjg6OlVuZGVmaW5lZCgpOwogfQpAQCAtMjk2LDkgKzI5Niw5IEBACiBDQUxMQkFDS19GVU5D
X0RFQ0woRE9NV2luZG93QXRvYikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5ET01XaW5kb3cuYXRv
YigpIik7Ci0gICAgRE9NV2luZG93KiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01X
aW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKKyAgICBET01X
aW5kb3cqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4
Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKIAotICAgIGlmICghVjhQcm94
eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKKyAgICBpZiAoIVY4UHJveHk6
OmNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgdHJ1ZSkpCiAgICAgICAgIHJldHVybiB2ODo6
VW5kZWZpbmVkKCk7CiAKICAgICBpZiAoYXJncy5MZW5ndGgoKSA8IDEpCkBAIC0zMTQsOSArMzE0
LDkgQEAKIENBTExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dCdG9hKQogewogICAgIElOQ19TVEFU
UygiRE9NLkRPTVdpbmRvdy5idG9hKCkiKTsKLSAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6
OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGFyZ3Mu
SG9sZGVyKCkpOworICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGFyZ3MuSG9sZGVyKCkp
OwogCi0gICAgaWYgKCFWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUp
KQorICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkK
ICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAogICAgIGlmIChhcmdzLkxlbmd0aCgp
IDwgMSkKQEAgLTM3MywxMSArMzczLDExIEBACiAKIEFDQ0VTU09SX1NFVFRFUihET01XaW5kb3dF
dmVudEhhbmRsZXIpCiB7Ci0gICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFBy
b3h5OjpMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRoaXMo
KSk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5Ojpsb29rdXBE
T01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRoaXMoKSk7CiAgICAgaWYg
KGhvbGRlci5Jc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIERPTVdpbmRvdyogaW1w
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJ
TkRPVywgaG9sZGVyKTsKKyAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOwog
ICAgIGlmICghaW1wLT5mcmFtZSgpKQogICAgICAgICByZXR1cm47CiAKQEAgLTM5Nyw3ICszOTcs
NyBAQAogICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVy
PiBsaXN0ZW5lciA9Ci0gICAgICAgICAgICBwcm94eS0+RmluZE9yQ3JlYXRlVjhFdmVudExpc3Rl
bmVyKHZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgIHByb3h5LT5maW5kT3JDcmVhdGVWOEV2ZW50
TGlzdGVuZXIodmFsdWUsIHRydWUpOwogICAgICAgICBpZiAobGlzdGVuZXIpCiAgICAgICAgICAg
ICBpbXAtPnNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7CiAg
ICAgfQpAQCAtNDA1LDExICs0MDUsMTEgQEAKIAogQUNDRVNTT1JfR0VUVEVSKERPTVdpbmRvd0V2
ZW50SGFuZGxlcikKIHsKLSAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJv
eHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGluZm8uVGhpcygp
KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Omxvb2t1cERP
TVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGluZm8uVGhpcygpKTsKICAgICBpZiAo
aG9sZGVyLklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAg
IERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENs
YXNzSW5kZXg6OkRPTVdJTkRPVywgaG9sZGVyKTsKKyAgICBET01XaW5kb3cqIGltcCA9IFY4UHJv
eHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lO
RE9XLCBob2xkZXIpOwogICAgIGlmICghaW1wLT5mcmFtZSgpKQogICAgICAgICByZXR1cm4gdjg6
OlVuZGVmaW5lZCgpOwogCkBAIC00MjEsNyArNDIxLDcgQEAKICAgICBTdHJpbmcgZXZlbnRUeXBl
ID0gZXZlbnROYW1lRnJvbUF0dHJpYnV0ZU5hbWUoa2V5KTsKIAogICAgIEV2ZW50TGlzdGVuZXIq
IGxpc3RlbmVyID0gaW1wLT5nZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSk7Ci0g
ICAgcmV0dXJuIFY4UHJveHk6OkV2ZW50TGlzdGVuZXJUb1Y4T2JqZWN0KGxpc3RlbmVyKTsKKyAg
ICByZXR1cm4gVjhQcm94eTo6Y29udmVydEV2ZW50TGlzdGVuZXJUb1Y4T2JqZWN0KGxpc3RlbmVy
KTsKIH0KIAogc3RhdGljIGJvb2wgY2FuU2hvd01vZGFsRGlhbG9nTm93KGNvbnN0IEZyYW1lKiBm
cmFtZSkKQEAgLTUxOCw3ICs1MTgsNyBAQAogCiAgICAgLy8gU2V0IGRpYWxvZyBhcmd1bWVudHMg
b24gdGhlIGdsb2JhbCBvYmplY3Qgb2YgdGhlIG5ldyBmcmFtZS4KICAgICBpZiAoIWRpYWxvZ0Fy
Z3MuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9
IFY4UHJveHk6OkdldENvbnRleHQobmV3RnJhbWUpOworICAgICAgICB2ODo6TG9jYWw8djg6OkNv
bnRleHQ+IGNvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KG5ld0ZyYW1lKTsKICAgICAgICAgaWYg
KCFjb250ZXh0LklzRW1wdHkoKSkgewogICAgICAgICAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNj
b3BlKGNvbnRleHQpOwogICAgICAgICAgICAgY29udGV4dC0+R2xvYmFsKCktPlNldCh2ODo6U3Ry
aW5nOjpOZXcoImRpYWxvZ0FyZ3VtZW50cyIpLCBkaWFsb2dBcmdzKTsKQEAgLTU0NCwxMSArNTQ0
LDExIEBACiBDQUxMQkFDS19GVU5DX0RFQ0woRE9NV2luZG93U2hvd01vZGFsRGlhbG9nKQogewog
ICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5zaG93TW9kYWxEaWFsb2coKSIpOwotICAgIERP
TVdpbmRvdyogd2luZG93ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PigKKyAg
ICBET01XaW5kb3cqIHdpbmRvdyA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01X
aW5kb3c+KAogICAgICAgICBWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7
CiAgICAgRnJhbWUqIGZyYW1lID0gd2luZG93LT5mcmFtZSgpOwogCi0gICAgaWYgKCFmcmFtZSB8
fCAhVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoZnJhbWUsIHRydWUpKSAKKyAgICBpZiAoIWZyYW1l
IHx8ICFWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZShmcmFtZSwgdHJ1ZSkpIAogICAgICAgICByZXR1
cm4gdjg6OlVuZGVmaW5lZCgpOwogCiAgICAgRnJhbWUqIGNhbGxpbmdGcmFtZSA9IFY4UHJveHk6
OnJldHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29udGV4dCgpOwpAQCAtNjExLDcgKzYxMSw3IEBACiAK
ICAgICAvLyBIb2xkIG9uIHRvIHRoZSBjb250ZXh0IG9mIHRoZSBkaWFsb2cgd2luZG93IGxvbmcg
ZW5vdWdoIHRvIHJldHJpZXZlIHRoZQogICAgIC8vIHZhbHVlIG9mIHRoZSByZXR1cm4gdmFsdWUg
cHJvcGVydHkuCi0gICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6
R2V0Q29udGV4dChkaWFsb2dGcmFtZSk7CisgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250
ZXh0ID0gVjhQcm94eTo6Y29udGV4dChkaWFsb2dGcmFtZSk7CiAKICAgICAvLyBSdW4gdGhlIGRp
YWxvZy4KICAgICBkaWFsb2dGcmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+cnVuTW9kYWwoKTsKQEAg
LTYzMywxMCArNjMzLDEwIEBACiBDQUxMQkFDS19GVU5DX0RFQ0woRE9NV2luZG93T3BlbikKIHsK
ICAgICBJTkNfU1RBVFMoIkRPTS5ET01XaW5kb3cub3BlbigpIik7Ci0gICAgRE9NV2luZG93KiBw
YXJlbnQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6
RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKKyAgICBET01XaW5kb3cqIHBhcmVudCA9IFY4UHJv
eHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lO
RE9XLCBhcmdzLkhvbGRlcigpKTsKICAgICBGcmFtZSogZnJhbWUgPSBwYXJlbnQtPmZyYW1lKCk7
CiAKLSAgICBpZiAoIWZyYW1lIHx8ICFWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShmcmFtZSwgdHJ1
ZSkpCisgICAgaWYgKCFmcmFtZSB8fCAhVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoZnJhbWUsIHRy
dWUpKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCiAgICAgRnJhbWUqIGNhbGxp
bmdGcmFtZSA9IFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29udGV4dCgpOwpAQCAt
NjkxLDcgKzY5MSw3IEBACiAKICAgICAgICAgICAgIGZyYW1lLT5sb2FkZXIoKS0+c2NoZWR1bGVM
b2NhdGlvbkNoYW5nZShjb21wbGV0ZWRVcmwsIHJlZmVycmVyLCBmYWxzZSwgdXNlckdlc3R1cmUp
OwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJ
bmRleDo6RE9NV0lORE9XLCBmcmFtZS0+ZG9tV2luZG93KCkpOworICAgICAgICByZXR1cm4gVjhQ
cm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGZyYW1lLT5k
b21XaW5kb3coKSk7CiAgICAgfQogCiAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgYSBuYW1lZCBmcmFt
ZSBvciBhIG5ldyB3aW5kb3csIHdlJ2xsIHVzZSB0aGUKQEAgLTc1MSwxOCArNzUxLDE4IEBACiAg
ICAgaWYgKCFmcmFtZSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIHJl
dHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBmcmFtZS0+
ZG9tV2luZG93KCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENs
YXNzSW5kZXg6OkRPTVdJTkRPVywgZnJhbWUtPmRvbVdpbmRvdygpKTsKIH0KIAogCiBJTkRFWEVE
X1BST1BFUlRZX0dFVFRFUihET01XaW5kb3cpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uRE9NV2lu
ZG93LkluZGV4ZWRQcm9wZXJ0eUdldHRlciIpOwotICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
aG9sZGVyID0gVjhQcm94eTo6TG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRP
VywgaW5mby5UaGlzKCkpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gVjhQ
cm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaW5mby5UaGlz
KCkpOwogICAgIGlmIChob2xkZXIuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gbm90SGFuZGxl
ZEJ5SW50ZXJjZXB0b3IoKTsKIAotICAgIERPTVdpbmRvdyogd2luZG93ID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaG9sZGVyKTsK
KyAgICBET01XaW5kb3cqIHdpbmRvdyA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxE
T01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOwogICAgIGlmICghd2lu
ZG93KQogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKIApAQCAtNzcy
LDcgKzc3Miw3IEBACiAKICAgICBGcmFtZSogY2hpbGQgPSBmcmFtZS0+dHJlZSgpLT5jaGlsZChp
bmRleCk7CiAgICAgaWYgKGNoaWxkKQotICAgICAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVj
dChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgY2hpbGQtPmRvbVdpbmRvdygpKTsKKyAgICAgICAg
cmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9X
LCBjaGlsZC0+ZG9tV2luZG93KCkpOwogCiAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2Vw
dG9yKCk7CiB9CkBAIC03ODIsMTEgKzc4MiwxMSBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkRP
TVdpbmRvdy5OYW1lZFByb3BlcnR5R2V0dGVyIik7CiAKLSAgICB2ODo6SGFuZGxlPHY4OjpPYmpl
Y3Q+IGhvbGRlciA9IFY4UHJveHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01X
SU5ET1csIGluZm8uVGhpcygpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9
IFY4UHJveHk6Omxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGluZm8u
VGhpcygpKTsKICAgICBpZiAoaG9sZGVyLklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIG5vdEhh
bmRsZWRCeUludGVyY2VwdG9yKCk7CiAKLSAgICBET01XaW5kb3cqIHdpbmRvdyA9IFY4UHJveHk6
OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGhvbGRl
cik7CisgICAgRE9NV2luZG93KiB3aW5kb3cgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmpl
Y3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaG9sZGVyKTsKICAgICBpZiAo
IXdpbmRvdykKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAKQEAg
LTc5OSw3ICs3OTksNyBAQAogICAgIEF0b21pY1N0cmluZyBwcm9wTmFtZSA9IHY4U3RyaW5nVG9B
dG9taWNXZWJDb3JlU3RyaW5nKG5hbWUpOwogICAgIEZyYW1lKiBjaGlsZCA9IGZyYW1lLT50cmVl
KCktPmNoaWxkKHByb3BOYW1lKTsKICAgICBpZiAoY2hpbGQpCi0gICAgICAgIHJldHVybiBWOFBy
b3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBjaGlsZC0+ZG9tV2luZG93
KCkpOworICAgICAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0lu
ZGV4OjpET01XSU5ET1csIGNoaWxkLT5kb21XaW5kb3coKSk7CiAKICAgICAvLyBTZWFyY2ggSURM
IGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBwcm90b3R5cGUKICAgICB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gcmVzdWx0ID0gaG9sZGVyLT5HZXRSZWFsTmFtZWRQcm9wZXJ0eUluUHJvdG90eXBlQ2hh
aW4obmFtZSk7CkBAIC04MTIsOSArODEyLDkgQEAKICAgICAgICAgUmVmUHRyPEhUTUxDb2xsZWN0
aW9uPiBpdGVtcyA9IGRvYy0+d2luZG93TmFtZWRJdGVtcyhwcm9wTmFtZSk7CiAgICAgICAgIGlm
IChpdGVtcy0+bGVuZ3RoKCkgPj0gMSkgewogICAgICAgICAgICAgaWYgKGl0ZW1zLT5sZW5ndGgo
KSA9PSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChp
dGVtcy0+Zmlyc3RJdGVtKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252
ZXJ0Tm9kZVRvVjhPYmplY3QoaXRlbXMtPmZpcnN0SXRlbSgpKTsKICAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6
OkhUTUxDT0xMRUNUSU9OLCBpdGVtcy5nZXQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFY4
UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGl0
ZW1zLmdldCgpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtODU2LDggKzg1Niw4IEBACiB2b2lk
IFY4Q3VzdG9tOjpDbGVhclRpbWVvdXRJbXBsKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCiB7
CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhvbGRlciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAg
RE9NV2luZG93KiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOwotICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNz
RnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKKyAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9X
LCBob2xkZXIpOworICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgp
LCB0cnVlKSkKICAgICAgICAgcmV0dXJuOwogICAgIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNv
bnRleHQgPSBzdGF0aWNfY2FzdDxTY3JpcHRFeGVjdXRpb25Db250ZXh0Kj4oaW1wLT5mcmFtZSgp
LT5kb2N1bWVudCgpKTsKICAgICBpbnQgaGFuZGxlID0gdG9JbnQzMihhcmdzWzBdKTsKQEAgLTg4
MiwxMSArODgyLDExIEBACiBOQU1FRF9BQ0NFU1NfQ0hFQ0soRE9NV2luZG93KQogewogICAgIEFT
U0VSVChWOENsYXNzSW5kZXg6OkZyb21JbnQoZGF0YS0+SW50MzJWYWx1ZSgpKSA9PSBWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVyk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdpbmRvdyA9IFY4
UHJveHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGhvc3QpOwor
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3aW5kb3cgPSBWOFByb3h5Ojpsb29rdXBET01XcmFw
cGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob3N0KTsKICAgICBpZiAod2luZG93LklzRW1w
dHkoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGZyYW1lIGlzIGdvbmUuCiAKLSAg
ICBET01XaW5kb3cqIHRhcmdldFdpbmRvdyA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdp
bmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIHdpbmRvdyk7CisgICAgRE9NV2luZG93KiB0
YXJnZXRXaW5kb3cgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihW
OENsYXNzSW5kZXg6OkRPTVdJTkRPVywgd2luZG93KTsKIAogICAgIEFTU0VSVCh0YXJnZXRXaW5k
b3cpOwogCkBAIC05MDIsMTcgKzkwMiwxNyBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAg
ICAgfQogCi0gICAgcmV0dXJuIFY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKHRhcmdldCwgZmFsc2Up
OworICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZSh0YXJnZXQsIGZhbHNlKTsKIH0K
IAogSU5ERVhFRF9BQ0NFU1NfQ0hFQ0soRE9NV2luZG93KQogewogICAgIEFTU0VSVChWOENsYXNz
SW5kZXg6OkZyb21JbnQoZGF0YS0+SW50MzJWYWx1ZSgpKSA9PSBWOENsYXNzSW5kZXg6OkRPTVdJ
TkRPVyk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdpbmRvdyA9IFY4UHJveHk6Okxvb2t1
cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGhvc3QpOworICAgIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiB3aW5kb3cgPSBWOFByb3h5Ojpsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJ
bmRleDo6RE9NV0lORE9XLCBob3N0KTsKICAgICBpZiAod2luZG93LklzRW1wdHkoKSkKICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogCi0gICAgRE9NV2luZG93KiB0YXJnZXRXaW5kb3cgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCB3aW5k
b3cpOworICAgIERPTVdpbmRvdyogdGFyZ2V0V2luZG93ID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIHdpbmRvdyk7CiAK
ICAgICBBU1NFUlQodGFyZ2V0V2luZG93KTsKIApAQCAtOTI0LDcgKzkyNCw3IEBACiAgICAgaWYg
KCh0eXBlID09IHY4OjpBQ0NFU1NfR0VUIHx8IHR5cGUgPT0gdjg6OkFDQ0VTU19IQVMpICYmIHRh
cmdldC0+dHJlZSgpLT5jaGlsZChpbmRleCkpCiAgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAg
cmV0dXJuIFY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKHRhcmdldCwgZmFsc2UpOworICAgIHJldHVy
biBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZSh0YXJnZXQsIGZhbHNlKTsKIH0KIAogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21Y
UGF0aE5TUmVzb2x2ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4Q3VzdG9tWFBhdGhOU1Jlc29sdmVyLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVhQYXRoTlNSZXNvbHZlci5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTYxLDcgKzYxLDcgQEAKIAogICAgIGlmIChsb29rdXBOYW1lc3BhY2VVUklG
dW5jLklzRW1wdHkoKSAmJiAhbV9yZXNvbHZlci0+SXNGdW5jdGlvbigpKSB7CiAgICAgICAgIEZy
YW1lKiBmcmFtZSA9IFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JFbnRlcmVkQ29udGV4dCgpOwot
ICAgICAgICBsb2dfaW5mbyhmcmFtZSwgIlhQYXRoTlNSZXNvbHZlciBkb2VzIG5vdCBoYXZlIGEg
bG9va3VwTmFtZXNwYWNlVVJJIG1ldGhvZC4iLCBTdHJpbmcoKSk7CisgICAgICAgIGxvZ0luZm8o
ZnJhbWUsICJYUGF0aE5TUmVzb2x2ZXIgZG9lcyBub3QgaGF2ZSBhIGxvb2t1cE5hbWVzcGFjZVVS
SSBtZXRob2QuIiwgU3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAgICAgfQog
CkBAIC03NCw3ICs3NCw3IEBACiAgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+IGZ1bmN0aW9u
ID0gbG9va3VwTmFtZXNwYWNlVVJJRnVuYy5Jc0VtcHR5KCkgPyB2ODo6SGFuZGxlPHY4OjpGdW5j
dGlvbj46OkNhc3QobV9yZXNvbHZlcikgOiBsb29rdXBOYW1lc3BhY2VVUklGdW5jOwogCiAgICAg
VjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZSgpOwotICAgIHY4OjpIYW5kbGU8djg6
OlZhbHVlPiByZXR2YWwgPSBwcm94eS0+Q2FsbEZ1bmN0aW9uKGZ1bmN0aW9uLCBtX3Jlc29sdmVy
LCBhcmdjLCBhcmd2KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmV0dmFsID0gcHJveHkt
PmNhbGxGdW5jdGlvbihmdW5jdGlvbiwgbV9yZXNvbHZlciwgYXJnYywgYXJndik7CiAKICAgICAv
LyBFYXQgZXhjZXB0aW9ucyBmcm9tIG5hbWVzcGFjZSByZXNvbHZlciBhbmQgcmV0dXJuIGFuIGVt
cHR5IHN0cmluZy4gVGhpcyB3aWxsIG1vc3QgbGlrZWx5IGNhdXNlIE5BTUVTUEFDRV9FUlIuCiAg
ICAgaWYgKHRyeV9jYXRjaC5IYXNDYXVnaHQoKSkKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4V29ya2VyQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOFdvcmtlckN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhXb3JrZXJDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC04Myw3ICs4Myw3IEBACiAgICAgfQogCiAgICAgLy8gQ3JlYXRlIHRoZSB3b3JrZXIgb2JqZWN0
LgotICAgIC8vIE5vdGU6IGl0J3MgT0sgdG8gbGV0IHRoaXMgUmVmUHRyIGdvIG91dCBvZiBzY29w
ZSBiZWNhdXNlIHdlIGFsc28gY2FsbCBTZXRET01XcmFwcGVyKCksIHdoaWNoIGVmZmVjdGl2ZWx5
IGhvbGRzIGEgcmVmZXJlbmNlIHRvIG9iai4KKyAgICAvLyBOb3RlOiBpdCdzIE9LIHRvIGxldCB0
aGlzIFJlZlB0ciBnbyBvdXQgb2Ygc2NvcGUgYmVjYXVzZSB3ZSBhbHNvIGNhbGwgc2V0RE9NV3Jh
cHBlcigpLCB3aGljaCBlZmZlY3RpdmVseSBob2xkcyBhIHJlZmVyZW5jZSB0byBvYmouCiAgICAg
RXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAgUmVmUHRyPFdvcmtlcj4gb2JqID0gV29ya2VyOjpj
cmVhdGUodG9XZWJDb3JlU3RyaW5nKHNjcmlwdFVybCksIGNvbnRleHQsIGVjKTsKIApAQCAtOTIs
MTAgKzkyLDEwIEBACiAKICAgICAvLyBTZXR1cCB0aGUgc3RhbmRhcmQgd3JhcHBlciBvYmplY3Qg
aW50ZXJuYWwgZmllbGRzLgogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlck9iamVj
dCA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgVjhQcm94eTo6U2V0RE9NV3JhcHBlcih3cmFwcGVyT2Jq
ZWN0LCBWOENsYXNzSW5kZXg6OldPUktFUiwgb2JqLmdldCgpKTsKKyAgICBWOFByb3h5OjpzZXRE
T01XcmFwcGVyKHdyYXBwZXJPYmplY3QsIFY4Q2xhc3NJbmRleDo6V09SS0VSLCBvYmouZ2V0KCkp
OwogCiAgICAgb2JqLT5yZWYoKTsKLSAgICBWOFByb3h5OjpTZXRKU1dyYXBwZXJGb3JBY3RpdmVE
T01PYmplY3Qob2JqLmdldCgpLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHdyYXBw
ZXJPYmplY3QpKTsKKyAgICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JBY3RpdmVET01PYmplY3Qo
b2JqLmdldCgpLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHdyYXBwZXJPYmplY3Qp
KTsKIAogICAgIHJldHVybiB3cmFwcGVyT2JqZWN0OwogfQpAQCAtMTEwLDcgKzExMCw3IEBACiAK
ICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKHdvcmtlci0+c2NyaXB0RXhl
Y3V0aW9uQ29udGV4dCgpKTsKICAgICBpZiAocHJveHkpCi0gICAgICAgIHJldHVybiBmaW5kT25s
eSA/IHByb3h5LT5GaW5kT2JqZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2UpIDogcHJveHkt
PkZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKTsKKyAgICAgICAg
cmV0dXJuIGZpbmRPbmx5ID8gcHJveHktPmZpbmRPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBm
YWxzZSkgOiBwcm94eS0+ZmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFs
c2UpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xMTgsNyArMTE4LDcgQEAKIEFDQ0VTU09SX0dF
VFRFUihXb3JrZXJPbm1lc3NhZ2UpCiB7CiAgICAgSU5DX1NUQVRTKEwiRE9NLldvcmtlci5vbm1l
c3NhZ2UuX2dldCIpOwotICAgIFdvcmtlciogd29ya2VyID0gVjhQcm94eTo6VG9OYXRpdmVPYmpl
Y3Q8V29ya2VyPihWOENsYXNzSW5kZXg6OldPUktFUiwgaW5mby5Ib2xkZXIoKSk7CisgICAgV29y
a2VyKiB3b3JrZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8V29ya2VyPihWOENs
YXNzSW5kZXg6OldPUktFUiwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHdvcmtlci0+b25tZXNz
YWdlKCkpIHsKICAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRp
Y19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHdvcmtlci0+b25tZXNzYWdlKCkpOwogICAg
ICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0
ZW5lck9iamVjdCgpOwpAQCAtMTMwLDcgKzEzMCw3IEBACiBBQ0NFU1NPUl9TRVRURVIoV29ya2Vy
T25tZXNzYWdlKQogewogICAgIElOQ19TVEFUUyhMIkRPTS5Xb3JrZXIub25tZXNzYWdlLl9zZXQi
KTsKLSAgICBXb3JrZXIqIHdvcmtlciA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlcj4o
VjhDbGFzc0luZGV4OjpXT1JLRVIsIGluZm8uSG9sZGVyKCkpOworICAgIFdvcmtlciogd29ya2Vy
ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFdvcmtlcj4oVjhDbGFzc0luZGV4OjpX
T1JLRVIsIGluZm8uSG9sZGVyKCkpOwogICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogb2xkTGlz
dGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih3b3JrZXItPm9ubWVz
c2FnZSgpKTsKICAgICBpZiAodmFsdWUtPklzTnVsbCgpKSB7CiAgICAgICAgIGlmIChvbGRMaXN0
ZW5lcikgewpAQCAtMTU3LDcgKzE1Nyw3IEBACiBBQ0NFU1NPUl9HRVRURVIoV29ya2VyT25lcnJv
cikKIHsKICAgICBJTkNfU1RBVFMoTCJET00uV29ya2VyLm9uZXJyb3IuX2dldCIpOwotICAgIFdv
cmtlciogd29ya2VyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8V29ya2VyPihWOENsYXNzSW5k
ZXg6OldPUktFUiwgaW5mby5Ib2xkZXIoKSk7CisgICAgV29ya2VyKiB3b3JrZXIgPSBWOFByb3h5
Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8V29ya2VyPihWOENsYXNzSW5kZXg6OldPUktFUiwgaW5m
by5Ib2xkZXIoKSk7CiAgICAgaWYgKHdvcmtlci0+b25lcnJvcigpKSB7CiAgICAgICAgIFY4T2Jq
ZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlz
dGVuZXIqPih3b3JrZXItPm9uZXJyb3IoKSk7CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0
PiB2OExpc3RlbmVyID0gbGlzdGVuZXItPmdldExpc3RlbmVyT2JqZWN0KCk7CkBAIC0xNjksNyAr
MTY5LDcgQEAKIEFDQ0VTU09SX1NFVFRFUihXb3JrZXJPbmVycm9yKQogewogICAgIElOQ19TVEFU
UyhMIkRPTS5Xb3JrZXIub25lcnJvci5fc2V0Iik7Ci0gICAgV29ya2VyKiB3b3JrZXIgPSBWOFBy
b3h5OjpUb05hdGl2ZU9iamVjdDxXb3JrZXI+KFY4Q2xhc3NJbmRleDo6V09SS0VSLCBpbmZvLkhv
bGRlcigpKTsKKyAgICBXb3JrZXIqIHdvcmtlciA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxXb3JrZXI+KFY4Q2xhc3NJbmRleDo6V09SS0VSLCBpbmZvLkhvbGRlcigpKTsKICAgICBW
OE9iamVjdEV2ZW50TGlzdGVuZXIqIG9sZExpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RF
dmVudExpc3RlbmVyKj4od29ya2VyLT5vbmVycm9yKCkpOwogICAgIGlmICh2YWx1ZS0+SXNOdWxs
KCkpIHsKICAgICAgICAgaWYgKG9sZExpc3RlbmVyKSB7CkBAIC0xOTYsNyArMTk2LDcgQEAKIENB
TExCQUNLX0ZVTkNfREVDTChXb3JrZXJBZGRFdmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFU
UyhMIkRPTS5Xb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcigpIik7Ci0gICAgV29ya2VyKiB3b3JrZXIg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxXb3JrZXI+KFY4Q2xhc3NJbmRleDo6V09SS0VSLCBh
cmdzLkhvbGRlcigpKTsKKyAgICBXb3JrZXIqIHdvcmtlciA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxXb3JrZXI+KFY4Q2xhc3NJbmRleDo6V09SS0VSLCBhcmdzLkhvbGRlcigpKTsK
IAogICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IGdldEV2ZW50TGlzdGVuZXIo
d29ya2VyLCBhcmdzWzFdLCBmYWxzZSk7CiAgICAgaWYgKGxpc3RlbmVyKSB7CkBAIC0yMTIsNyAr
MjEyLDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChXb3JrZXJSZW1vdmVFdmVudExpc3RlbmVyKQog
ewogICAgIElOQ19TVEFUUyhMIkRPTS5Xb3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigpIik7Ci0g
ICAgV29ya2VyKiB3b3JrZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxXb3JrZXI+KFY4Q2xh
c3NJbmRleDo6V09SS0VSLCBhcmdzLkhvbGRlcigpKTsKKyAgICBXb3JrZXIqIHdvcmtlciA9IFY4
UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxXb3JrZXI+KFY4Q2xhc3NJbmRleDo6V09SS0VS
LCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9
IGdldEV2ZW50TGlzdGVuZXIod29ya2VyLCBhcmdzWzFdLCB0cnVlKTsKICAgICBpZiAobGlzdGVu
ZXIpIHsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTENhbnZhc0VsZW1l
bnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
SFRNTENhbnZhc0VsZW1lbnRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTENhbnZhc0VsZW1lbnRDdXN0b20uY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00MCwxMiArNDAsMTIgQEAKIAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEhUTUxDYW52
YXNFbGVtZW50R2V0Q29udGV4dCkKIHsKLSAgICBJTkNfU1RBVFMoIkRPTS5IVE1MQ2FudmFzRWxl
bWVudC5nZXRDb250ZXh0Iik7CisgICAgSU5DX1NUQVRTKCJET00uSFRNTENhbnZhc0VsZW1lbnQu
Y29udGV4dCIpOwogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBob2xkZXIgPSBhcmdzLkhvbGRl
cigpOwotICAgIEhUTUxDYW52YXNFbGVtZW50KiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPEhUTUxDYW52YXNFbGVtZW50Pihob2xkZXIpOworICAgIEhUTUxDYW52YXNFbGVtZW50KiBp
bXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MQ2FudmFzRWxlbWVudD4o
aG9sZGVyKTsKICAgICBTdHJpbmcgY29udGV4dElkID0gVG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0p
OwogICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogcmVzdWx0ID0gaW1wLT5nZXRDb250ZXh0
KGNvbnRleHRJZCk7Ci0gICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4
OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIHJlc3VsdCk7CisgICAgcmV0dXJuIFY4UHJveHk6
OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJE
LCByZXN1bHQpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOFdlYktpdFBvaW50Q29uc3RydWN0b3IuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V2ViS2l0UG9pbnRDb25zdHJ1Y3Rvci5j
cHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhXZWJL
aXRQb2ludENvbnN0cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDAsNyArNDAsNyBAQAog
Q0FMTEJBQ0tfRlVOQ19ERUNMKFdlYktpdFBvaW50Q29uc3RydWN0b3IpCiB7CiAgICAgSU5DX1NU
QVRTKCJET00uV2ViS2l0UG9pbnQuQ29uc3RydWN0b3IiKTsKLSAgICByZXR1cm4gVjhQcm94eTo6
Q29uc3RydWN0RE9NT2JqZWN0PFY4Q2xhc3NJbmRleDo6V0VCS0lUUE9JTlQsIFdlYktpdFBvaW50
PihhcmdzKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29uc3RydWN0RE9NT2JqZWN0PFY4Q2xhc3NJ
bmRleDo6V0VCS0lUUE9JTlQsIFdlYktpdFBvaW50PihhcmdzKTsKIH0KIAogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDYW52YXNQaXhl
bEFycmF5Q3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOENhbnZhc1BpeGVsQXJyYXlDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2FudmFzUGl4ZWxBcnJheUN1c3RvbS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTQxLDcgKzQxLDcgQEAKIElOREVYRURfUFJPUEVSVFlfR0VUVEVSKENhbnZh
c1BpeGVsQXJyYXkpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUGl4ZWxBcnJheS5JbmRl
eGVkUHJvcGVydHlHZXR0ZXIiKTsKLSAgICBDYW52YXNQaXhlbEFycmF5KiBwaXhlbEJ1ZmZlciA9
IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZhc1BpeGVsQXJyYXk+KFY4Q2xhc3NJbmRleDo6
Q0FOVkFTUElYRUxBUlJBWSwgaW5mby5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUGl4ZWxBcnJheSog
cGl4ZWxCdWZmZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2FudmFzUGl4ZWxB
cnJheT4oVjhDbGFzc0luZGV4OjpDQU5WQVNQSVhFTEFSUkFZLCBpbmZvLkhvbGRlcigpKTsKIAog
ICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gcGl4ZWxCdWZmZXItPmxlbmd0aCgpKSkK
ICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKQEAgLTU1LDcgKzU1LDcgQEAKIElOREVY
RURfUFJPUEVSVFlfU0VUVEVSKENhbnZhc1BpeGVsQXJyYXkpCiB7CiAgICAgSU5DX1NUQVRTKCJE
T00uQ2FudmFzUGl4ZWxBcnJheS5JbmRleGVkUHJvcGVydHlTZXR0ZXIiKTsKLSAgICBDYW52YXNQ
aXhlbEFycmF5KiBwaXhlbEJ1ZmZlciA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZhc1Bp
eGVsQXJyYXk+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUElYRUxBUlJBWSwgaW5mby5Ib2xkZXIoKSk7
CisgICAgQ2FudmFzUGl4ZWxBcnJheSogcGl4ZWxCdWZmZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8Q2FudmFzUGl4ZWxBcnJheT4oVjhDbGFzc0luZGV4OjpDQU5WQVNQSVhFTEFS
UkFZLCBpbmZvLkhvbGRlcigpKTsKIAogICAgIGlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwg
cGl4ZWxCdWZmZXItPmxlbmd0aCgpKSkKICAgICAgICAgcGl4ZWxCdWZmZXItPnNldChpbmRleCwg
dmFsdWUtPk51bWJlclZhbHVlKCkpOwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhDdXN0b21Wb2lkQ2FsbGJhY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4Q3VzdG9tVm9pZENhbGxiYWNrLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVZvaWRDYWxsYmFjay5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTUwLDcgKzUwLDcgQEAKIHsKICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxl
U2NvcGU7CiAKLSAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6
R2V0Q29udGV4dChtX2ZyYW1lLmdldCgpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBj
b250ZXh0ID0gVjhQcm94eTo6Y29udGV4dChtX2ZyYW1lLmdldCgpKTsKICAgICBpZiAoY29udGV4
dC5Jc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKIApAQCAtODcsNyArODcsNyBAQAogICAgIFY4
UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUoKTsKICAgICBBU1NFUlQocHJveHkpOwog
Ci0gICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJlc3VsdCA9IHByb3h5LT5DYWxsRnVuY3Rpb24o
Y2FsbGJhY2tGdW5jdGlvbiwgdGhpc09iamVjdCwgYXJnYywgYXJndik7CisgICAgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IHJlc3VsdCA9IHByb3h5LT5jYWxsRnVuY3Rpb24oY2FsbGJhY2tGdW5jdGlv
biwgdGhpc09iamVjdCwgYXJnYywgYXJndik7CiAKICAgICBjYWxsYmFja1JldHVyblZhbHVlID0g
cmVzdWx0LklzRW1wdHkoKSAmJiByZXN1bHQtPklzQm9vbGVhbigpICYmIHJlc3VsdC0+Qm9vbGVh
blZhbHVlKCk7CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V29ya2VyQ29u
dGV4dEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhXb3JrZXJDb250ZXh0Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckNvbnRleHRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC00OSwxNCArNDksMTQgQEAKIEFDQ0VTU09SX0dFVFRFUihXb3JrZXJDb250ZXh0U2VsZikK
IHsKICAgICBJTkNfU1RBVFMoTCJET00uV29ya2VyQ29udGV4dC5zZWxmLl9nZXQiKTsKLSAgICBX
b3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8V29y
a2VyQ29udGV4dD4oVjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhULCBpbmZvLkhvbGRlcigpKTsK
KyAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCwgaW5m
by5Ib2xkZXIoKSk7CiAgICAgcmV0dXJuIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6V29y
a2VyQ29udGV4dFRvVjhPYmplY3Qod29ya2VyQ29udGV4dCk7CiB9CiAKIEFDQ0VTU09SX0dFVFRF
UihXb3JrZXJDb250ZXh0T25tZXNzYWdlKQogewogICAgIElOQ19TVEFUUyhMIkRPTS5Xb3JrZXJD
b250ZXh0Lm9ubWVzc2FnZS5fZ2V0Iik7Ci0gICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4
dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6
V09SS0VSQ09OVEVYVCwgaW5mby5Ib2xkZXIoKSk7CisgICAgV29ya2VyQ29udGV4dCogd29ya2Vy
Q29udGV4dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxXb3JrZXJDb250ZXh0PihW
OENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh3b3Jr
ZXJDb250ZXh0LT5vbm1lc3NhZ2UoKSkgewogICAgICAgICBWOFdvcmtlckNvbnRleHRFdmVudExp
c3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVu
ZXIqPih3b3JrZXJDb250ZXh0LT5vbm1lc3NhZ2UoKSk7CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6
T2JqZWN0PiB2OExpc3RlbmVyID0gbGlzdGVuZXItPmdldExpc3RlbmVyT2JqZWN0KCk7CkBAIC02
OCw3ICs2OCw3IEBACiBBQ0NFU1NPUl9TRVRURVIoV29ya2VyQ29udGV4dE9ubWVzc2FnZSkKIHsK
ICAgICBJTkNfU1RBVFMoTCJET00uV29ya2VyQ29udGV4dC5vbm1lc3NhZ2UuX3NldCIpOwotICAg
IFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxX
b3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGluZm8uSG9sZGVyKCkp
OworICAgIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8V29ya2VyQ29udGV4dD4oVjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhULCBp
bmZvLkhvbGRlcigpKTsKICAgICBWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyKiBvbGRMaXN0
ZW5lciA9IHN0YXRpY19jYXN0PFY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIqPih3b3JrZXJD
b250ZXh0LT5vbm1lc3NhZ2UoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAg
ICBpZiAod29ya2VyQ29udGV4dC0+b25tZXNzYWdlKCkpIHsKQEAgLTk0LDcgKzk0LDcgQEAKIAog
djg6OkhhbmRsZTx2ODo6VmFsdWU+IFNldFRpbWVvdXRPckludGVydmFsKGNvbnN0IHY4OjpBcmd1
bWVudHMmIGFyZ3MsIGJvb2wgc2luZ2xlU2hvdCkKIHsKLSAgICBXb3JrZXJDb250ZXh0KiB3b3Jr
ZXJDb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8V29ya2VyQ29udGV4dD4oVjhDbGFz
c0luZGV4OjpXT1JLRVJDT05URVhULCBhcmdzLkhvbGRlcigpKTsKKyAgICBXb3JrZXJDb250ZXh0
KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFdvcmtlckNv
bnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCwgYXJncy5Ib2xkZXIoKSk7CiAKICAg
ICBpbnQgYXJndW1lbnRDb3VudCA9IGFyZ3MuTGVuZ3RoKCk7CiAgICAgaWYgKGFyZ3VtZW50Q291
bnQgPCAxKQpAQCAtMTMxLDggKzEzMSw4IEBACiAgICAgaWYgKCFhcmdzLkxlbmd0aCgpKQogICAg
ICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgU3RyaW5nIGNhbGxlclVSTCA9IFY4
UHJveHk6OkdldFNvdXJjZU5hbWUoKTsKLSAgICBpbnQgY2FsbGVyTGluZSA9IFY4UHJveHk6Okdl
dFNvdXJjZUxpbmVOdW1iZXIoKSArIDE7CisgICAgU3RyaW5nIGNhbGxlclVSTCA9IFY4UHJveHk6
OnNvdXJjZU5hbWUoKTsKKyAgICBpbnQgY2FsbGVyTGluZSA9IFY4UHJveHk6OnNvdXJjZUxpbmVO
dW1iZXIoKSArIDE7CiAKICAgICBWZWN0b3I8U3RyaW5nPiB1cmxzOwogICAgIGZvciAoaW50IGkg
PSAwOyBpIDwgYXJncy5MZW5ndGgoKTsgaSsrKSB7CkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICAg
ICAgdXJscy5hcHBlbmQodG9XZWJDb3JlU3RyaW5nKHNjcmlwdFVybCkpOwogICAgIH0KIAotICAg
IFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxX
b3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGFyZ3MuSG9sZGVyKCkp
OworICAgIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8V29ya2VyQ29udGV4dD4oVjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhULCBh
cmdzLkhvbGRlcigpKTsKIAogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgIHdvcmtlckNv
bnRleHQtPmltcG9ydFNjcmlwdHModXJscywgY2FsbGVyVVJMLCBjYWxsZXJMaW5lLCBlYyk7CkBA
IC0xNjgsNyArMTY4LDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChXb3JrZXJDb250ZXh0QWRkRXZl
bnRMaXN0ZW5lcikKIHsKICAgICBJTkNfU1RBVFMoTCJET00uV29ya2VyQ29udGV4dC5hZGRFdmVu
dExpc3RlbmVyKCkiKTsKLSAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94
eTo6VG9OYXRpdmVPYmplY3Q8V29ya2VyQ29udGV4dD4oVjhDbGFzc0luZGV4OjpXT1JLRVJDT05U
RVhULCBhcmdzLkhvbGRlcigpKTsKKyAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0g
VjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRl
eDo6V09SS0VSQ09OVEVYVCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBSZWZQdHI8VjhFdmVudExp
c3RlbmVyPiBsaXN0ZW5lciA9IHdvcmtlckNvbnRleHQtPnNjcmlwdCgpLT5wcm94eSgpLT5maW5k
T3JDcmVhdGVFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6Q2FzdChhcmdzWzFd
KSwgZmFsc2UsIGZhbHNlKTsKIApAQCAtMTg1LDcgKzE4NSw3IEBACiBDQUxMQkFDS19GVU5DX0RF
Q0woV29ya2VyQ29udGV4dFJlbW92ZUV2ZW50TGlzdGVuZXIpCiB7CiAgICAgSU5DX1NUQVRTKEwi
RE9NLldvcmtlckNvbnRleHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigpIik7Ci0gICAgV29ya2VyQ29u
dGV4dCogd29ya2VyQ29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRl
eHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCwgYXJncy5Ib2xkZXIoKSk7CisgICAgV29y
a2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVj
dDxXb3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGFyZ3MuSG9sZGVy
KCkpOwogICAgIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eSogcHJveHkgPSB3b3JrZXJDb250
ZXh0LT5zY3JpcHQoKS0+cHJveHkoKTsKIAogICAgIFJlZlB0cjxWOEV2ZW50TGlzdGVuZXI+IGxp
c3RlbmVyID0gcHJveHktPmZpbmRPckNyZWF0ZUV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpP
YmplY3Q+OjpDYXN0KGFyZ3NbMV0pLCBmYWxzZSwgdHJ1ZSk7CkluZGV4OiBXZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOERvY3VtZW50Q3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERvY3VtZW50Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUp
CisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERvY3VtZW50Q3VzdG9tLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNTIsMTYgKzUyLDE2IEBACiB7CiAgICAgSU5DX1NUQVRTKCJET00uRG9j
dW1lbnQuZXZhbHVhdGUoKSIpOwogCi0gICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gVjhQcm94eTo6
RE9NV3JhcHBlclRvTm9kZTxEb2N1bWVudD4oYXJncy5Ib2xkZXIoKSk7CisgICAgRG9jdW1lbnQq
IGRvY3VtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8RG9jdW1lbnQ+KGFy
Z3MuSG9sZGVyKCkpOwogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgIFN0cmluZyBleHBy
ZXNzaW9uID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgIE5vZGUqIGNvbnRleHROb2Rl
ID0gMDsKICAgICBpZiAoVjhOb2RlOjpIYXNJbnN0YW5jZShhcmdzWzFdKSkKLSAgICAgICAgY29u
dGV4dE5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMV0pOworICAg
ICAgICBjb250ZXh0Tm9kZSA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPE5vZGU+
KGFyZ3NbMV0pOwogCiAgICAgWFBhdGhOU1Jlc29sdmVyKiByZXNvbHZlciA9IDA7CiAgICAgaWYg
KFY4WFBhdGhOU1Jlc29sdmVyOjpIYXNJbnN0YW5jZShhcmdzWzJdKSkKLSAgICAgICAgcmVzb2x2
ZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYUGF0aE5TUmVzb2x2ZXI+KFY4Q2xhc3NJbmRl
eDo6WFBBVEhOU1JFU09MVkVSLCBhcmdzWzJdKTsKKyAgICAgICAgcmVzb2x2ZXIgPSBWOFByb3h5
Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WFBhdGhOU1Jlc29sdmVyPihWOENsYXNzSW5kZXg6OlhQ
QVRITlNSRVNPTFZFUiwgYXJnc1syXSk7CiAgICAgZWxzZSBpZiAoYXJnc1syXS0+SXNPYmplY3Qo
KSkKICAgICAgICAgcmVzb2x2ZXIgPSBuZXcgVjhDdXN0b21YUGF0aE5TUmVzb2x2ZXIoYXJnc1sy
XS0+VG9PYmplY3QoKSk7CiAgICAgZWxzZSBpZiAoIWFyZ3NbMl0tPklzTnVsbCgpICYmICFhcmdz
WzJdLT5Jc1VuZGVmaW5lZCgpKQpAQCAtNzAsNyArNzAsNyBAQAogICAgIGludCB0eXBlID0gdG9J
bnQzMihhcmdzWzNdKTsKICAgICBYUGF0aFJlc3VsdCogaW5SZXN1bHQgPSAwOwogICAgIGlmIChW
OFhQYXRoUmVzdWx0OjpIYXNJbnN0YW5jZShhcmdzWzRdKSkKLSAgICAgICAgaW5SZXN1bHQgPSBW
OFByb3h5OjpUb05hdGl2ZU9iamVjdDxYUGF0aFJlc3VsdD4oVjhDbGFzc0luZGV4OjpYUEFUSFJF
U1VMVCwgYXJnc1s0XSk7CisgICAgICAgIGluUmVzdWx0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PFhQYXRoUmVzdWx0PihWOENsYXNzSW5kZXg6OlhQQVRIUkVTVUxULCBhcmdzWzRd
KTsKIAogICAgIHY4OjpUcnlDYXRjaCBleGNlcHRpb25DYXRjaGVyOwogICAgIFJlZlB0cjxYUGF0
aFJlc3VsdD4gcmVzdWx0ID0gZG9jdW1lbnQtPmV2YWx1YXRlKGV4cHJlc3Npb24sIGNvbnRleHRO
b2RlLCByZXNvbHZlciwgdHlwZSwgaW5SZXN1bHQsIGVjKTsKQEAgLTgwLDIwICs4MCwyMCBAQAog
ICAgIGlmIChlYykKICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZWMpOwogCi0gICAgcmV0dXJu
IFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpYUEFUSFJFU1VMVCwgcmVzdWx0Lmdl
dCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4
OjpYUEFUSFJFU1VMVCwgcmVzdWx0LmdldCgpKTsKIH0KIAogQ0FMTEJBQ0tfRlVOQ19ERUNMKERv
Y3VtZW50R2V0Q1NTQ2FudmFzQ29udGV4dCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Eb2N1bWVu
dC5nZXRDU1NDYW52YXNDb250ZXh0Iik7CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhvbGRl
ciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgRG9jdW1lbnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBw
ZXJUb05vZGU8RG9jdW1lbnQ+KGhvbGRlcik7CisgICAgRG9jdW1lbnQqIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPERvY3VtZW50Pihob2xkZXIpOwogICAgIFN0cmluZyBj
b250ZXh0SWQgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgU3RyaW5nIG5hbWUgPSB0
b1dlYkNvcmVTdHJpbmcoYXJnc1sxXSk7CiAgICAgaW50IHdpZHRoID0gdG9JbnQzMihhcmdzWzJd
KTsKICAgICBpbnQgaGVpZ2h0ID0gdG9JbnQzMihhcmdzWzNdKTsKICAgICBDYW52YXNSZW5kZXJp
bmdDb250ZXh0MkQqIHJlc3VsdCA9IGltcC0+Z2V0Q1NTQ2FudmFzQ29udGV4dChjb250ZXh0SWQs
IG5hbWUsIHdpZHRoLCBoZWlnaHQpOwotICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4
Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCByZXN1bHQpOworICAgIHJldHVy
biBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklO
R0NPTlRFWFQyRCwgcmVzdWx0KTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDog
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MQ29sbGVjdGlvbkN1c3RvbS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MQ29sbGVjdGlvbkN1
c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhIVE1MQ29sbGVjdGlvbkN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ3LDEwICs0Nywx
MCBAQAogICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7CiAKICAgICBpZiAo
bmFtZWRJdGVtcy5zaXplKCkgPT0gMSkKLSAgICAgICAgcmV0dXJuIFY4UHJveHk6Ok5vZGVUb1Y4
T2JqZWN0KG5hbWVkSXRlbXMuYXQoMCkuZ2V0KCkpOworICAgICAgICByZXR1cm4gVjhQcm94eTo6
Y29udmVydE5vZGVUb1Y4T2JqZWN0KG5hbWVkSXRlbXMuYXQoMCkuZ2V0KCkpOwogCiAgICAgTm9k
ZUxpc3QqIGxpc3QgPSBuZXcgVjhOYW1lZE5vZGVzQ29sbGVjdGlvbihuYW1lZEl0ZW1zKTsKLSAg
ICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok5PREVMSVNULCBsaXN0
KTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpO
T0RFTElTVCwgbGlzdCk7CiB9CiAKIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZ2V0SXRl
bShIVE1MQ29sbGVjdGlvbiogY29sbGVjdGlvbiwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZ3Vt
ZW50KQpAQCAtNjYsNyArNjYsNyBAQAogICAgIH0KIAogICAgIFJlZlB0cjxOb2RlPiByZXN1bHQg
PSBjb2xsZWN0aW9uLT5pdGVtKGluZGV4LT5VaW50MzJWYWx1ZSgpKTsKLSAgICByZXR1cm4gVjhQ
cm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6
Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAKIE5BTUVEX1BST1BFUlRZ
X0dFVFRFUihIVE1MQ29sbGVjdGlvbikKQEAgLTg0LDIxICs4NCwyMSBAQAogICAgICAgICByZXR1
cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7CiAKICAgICAvLyBGaW5hbGx5LCBzZWFyY2ggdGhl
IERPTSBzdHJ1Y3R1cmUuCi0gICAgSFRNTENvbGxlY3Rpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0
aXZlT2JqZWN0PEhUTUxDb2xsZWN0aW9uPihWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBp
bmZvLkhvbGRlcigpKTsKKyAgICBIVE1MQ29sbGVjdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVy
dFRvTmF0aXZlT2JqZWN0PEhUTUxDb2xsZWN0aW9uPihWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNU
SU9OLCBpbmZvLkhvbGRlcigpKTsKICAgICByZXR1cm4gZ2V0TmFtZWRJdGVtcyhpbXAsIHY4U3Ry
aW5nVG9BdG9taWNXZWJDb3JlU3RyaW5nKG5hbWUpKTsKIH0KIAogQ0FMTEJBQ0tfRlVOQ19ERUNM
KEhUTUxDb2xsZWN0aW9uSXRlbSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MQ29sbGVjdGlv
bi5pdGVtKCkiKTsKLSAgICBIVE1MQ29sbGVjdGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8SFRNTENvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGFyZ3Mu
SG9sZGVyKCkpOworICAgIEhUTUxDb2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8SFRNTENvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04s
IGFyZ3MuSG9sZGVyKCkpOwogICAgIHJldHVybiBnZXRJdGVtKGltcCwgYXJnc1swXSk7CiB9CiAK
IENBTExCQUNLX0ZVTkNfREVDTChIVE1MQ29sbGVjdGlvbk5hbWVkSXRlbSkKIHsKICAgICBJTkNf
U1RBVFMoIkRPTS5IVE1MQ29sbGVjdGlvbi5uYW1lZEl0ZW0oKSIpOwotICAgIEhUTUxDb2xsZWN0
aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIVE1MQ29sbGVjdGlvbj4oVjhDbGFz
c0luZGV4OjpIVE1MQ09MTEVDVElPTiwgYXJncy5Ib2xkZXIoKSk7CisgICAgSFRNTENvbGxlY3Rp
b24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1MQ29sbGVjdGlvbj4o
VjhDbGFzc0luZGV4OjpIVE1MQ09MTEVDVElPTiwgYXJncy5Ib2xkZXIoKSk7CiAgICAgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IHJlc3VsdCA9IGdldE5hbWVkSXRlbXMoaW1wLCB0b1dlYkNvcmVTdHJp
bmcoYXJnc1swXSkpOwogCiAgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpCkBAIC0xMTMsNyArMTEz
LDcgQEAKICAgICBpZiAoYXJncy5MZW5ndGgoKSA8IDEpCiAgICAgICAgIHJldHVybiB2ODo6VW5k
ZWZpbmVkKCk7CiAKLSAgICBIVE1MQ29sbGVjdGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8SFRNTENvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGFyZ3Mu
SG9sZGVyKCkpOworICAgIEhUTUxDb2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8SFRNTENvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04s
IGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPT0gMSkKICAgICAgICAg
cmV0dXJuIGdldEl0ZW0oaW1wLCBhcmdzWzBdKTsKQEAgLTEyOCw3ICsxMjgsNyBAQAogICAgIE5v
ZGUqIG5vZGUgPSBpbXAtPm5hbWVkSXRlbShuYW1lKTsKICAgICB3aGlsZSAobm9kZSkgewogICAg
ICAgICBpZiAoIWN1cnJlbnQpCi0gICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhP
YmplY3Qobm9kZSk7CisgICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4
T2JqZWN0KG5vZGUpOwogCiAgICAgICAgIG5vZGUgPSBpbXAtPm5leHROYW1lZEl0ZW0obmFtZSk7
CiAgICAgICAgIGN1cnJlbnQtLTsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
RXZlbnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4RXZlbnRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4RXZlbnRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MywzOSArNDMs
MzkgQEAKIAogQUNDRVNTT1JfU0VUVEVSKEV2ZW50UmV0dXJuVmFsdWUpCiB7Ci0gICAgRXZlbnQq
IGV2ZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0aXZlPEV2ZW50PihpbmZvLkhvbGRlcigp
KTsKKyAgICBFdmVudCogZXZlbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZl
PEV2ZW50PihpbmZvLkhvbGRlcigpKTsKICAgICBldmVudC0+c2V0RGVmYXVsdFByZXZlbnRlZCgh
dmFsdWUtPkJvb2xlYW5WYWx1ZSgpKTsKIH0KIAogQUNDRVNTT1JfR0VUVEVSKEV2ZW50RGF0YVRy
YW5zZmVyKQogewotICAgIEV2ZW50KiBldmVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05hdGl2
ZTxFdmVudD4oaW5mby5Ib2xkZXIoKSk7CisgICAgRXZlbnQqIGV2ZW50ID0gVjhQcm94eTo6Y29u
dmVydERPTVdyYXBwZXJUb05hdGl2ZTxFdmVudD4oaW5mby5Ib2xkZXIoKSk7CiAKICAgICBpZiAo
ZXZlbnQtPmlzRHJhZ0V2ZW50KCkpCi0gICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZlbnQp
LT5jbGlwYm9hcmQoKSk7CisgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVj
dChWOENsYXNzSW5kZXg6OkNMSVBCT0FSRCwgc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2ZW50
KS0+Y2xpcGJvYXJkKCkpOwogCiAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIH0KIAogQUND
RVNTT1JfR0VUVEVSKEV2ZW50Q2xpcGJvYXJkRGF0YSkKIHsKLSAgICBFdmVudCogZXZlbnQgPSBW
OFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8RXZlbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEV2
ZW50KiBldmVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8RXZlbnQ+KGlu
Zm8uSG9sZGVyKCkpOwogCiAgICAgaWYgKGV2ZW50LT5pc0NsaXBib2FyZEV2ZW50KCkpCi0gICAg
ICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBz
dGF0aWNfY2FzdDxDbGlwYm9hcmRFdmVudCo+KGV2ZW50KS0+Y2xpcGJvYXJkKCkpOworICAgICAg
ICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpDTElQQk9B
UkQsIHN0YXRpY19jYXN0PENsaXBib2FyZEV2ZW50Kj4oZXZlbnQpLT5jbGlwYm9hcmQoKSk7CiAK
ICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogfQogCiBBQ0NFU1NPUl9HRVRURVIoRXZlbnRT
cmNFbGVtZW50KQogewotICAgIEV2ZW50KiBldmVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05h
dGl2ZTxFdmVudD4oaW5mby5Ib2xkZXIoKSk7Ci0gICAgcmV0dXJuIFY4UHJveHk6OkV2ZW50VGFy
Z2V0VG9WOE9iamVjdChldmVudC0+dGFyZ2V0KCkpOworICAgIEV2ZW50KiBldmVudCA9IFY4UHJv
eHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8RXZlbnQ+KGluZm8uSG9sZGVyKCkpOworICAg
IHJldHVybiBWOFByb3h5Ojpjb252ZXJ0RXZlbnRUYXJnZXRUb1Y4T2JqZWN0KGV2ZW50LT50YXJn
ZXQoKSk7CiB9CiAKIEFDQ0VTU09SX0dFVFRFUihFdmVudFJldHVyblZhbHVlKQogewotICAgIEV2
ZW50KiBldmVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05hdGl2ZTxFdmVudD4oaW5mby5Ib2xk
ZXIoKSk7CisgICAgRXZlbnQqIGV2ZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05h
dGl2ZTxFdmVudD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgcmV0dXJuIGV2ZW50LT5kZWZhdWx0UHJl
dmVudGVkKCkgPyB2ODo6RmFsc2UoKSA6IHY4OjpUcnVlKCk7CiB9CiAKSW5kZXg6IFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTE9wdGlvbkVsZW1lbnRDb25zdHJ1Y3Rvci5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MT3B0aW9uRWxlbWVu
dENvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOEhUTUxPcHRpb25FbGVtZW50Q29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC04MSw5ICs4MSw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBWOFByb3h5OjpTZXRE
T01XcmFwcGVyKGFyZ3MuSG9sZGVyKCksIFY4Q2xhc3NJbmRleDo6VG9JbnQoVjhDbGFzc0luZGV4
OjpOT0RFKSwgb3B0aW9uLmdldCgpKTsKKyAgICBWOFByb3h5OjpzZXRET01XcmFwcGVyKGFyZ3Mu
SG9sZGVyKCksIFY4Q2xhc3NJbmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpOT0RFKSwgb3B0aW9u
LmdldCgpKTsKICAgICBvcHRpb24tPnJlZigpOwotICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZv
ckRPTU5vZGUob3B0aW9uLmdldCgpLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGFy
Z3MuSG9sZGVyKCkpKTsKKyAgICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01Ob2RlKG9wdGlv
bi5nZXQoKSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhhcmdzLkhvbGRlcigpKSk7
CiAgICAgcmV0dXJuIGFyZ3MuSG9sZGVyKCk7CiB9CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4U3R5bGVTaGVldExpc3RDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U3R5bGVTaGVldExpc3RDdXN0b20uY3BwCShyZXZpc2lv
biA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U3R5bGVTaGVldExpc3RD
dXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NSwxMiArNDUsMTIgQEAKICAgICAgICAgcmV0
dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAKICAgICAvLyBTZWFyY2ggc3R5bGUgc2hl
ZXQuCi0gICAgU3R5bGVTaGVldExpc3QqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFN0
eWxlU2hlZXRMaXN0PihWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVRMSVNULCBpbmZvLkhvbGRlcigp
KTsKKyAgICBTdHlsZVNoZWV0TGlzdCogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2Jq
ZWN0PFN0eWxlU2hlZXRMaXN0PihWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVRMSVNULCBpbmZvLkhv
bGRlcigpKTsKICAgICBIVE1MU3R5bGVFbGVtZW50KiBpdGVtID0gaW1wLT5nZXROYW1lZEl0ZW0o
dG9XZWJDb3JlU3RyaW5nKG5hbWUpKTsKICAgICBpZiAoIWl0ZW0pCiAgICAgICAgIHJldHVybiBu
b3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogCi0gICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmpl
Y3QoVjhDbGFzc0luZGV4OjpIVE1MU1RZTEVFTEVNRU5ULCBpdGVtKTsKKyAgICByZXR1cm4gVjhQ
cm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpIVE1MU1RZTEVFTEVNRU5ULCBp
dGVtKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhOb2RlQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOE5vZGVDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Tm9kZUN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTQ3LDEzICs0NywxMyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKE5vZGVBZGRFdmVudExpc3RlbmVy
KQogewogICAgIElOQ19TVEFUUygiRE9NLk5vZGUuYWRkRXZlbnRMaXN0ZW5lcigpIik7Ci0gICAg
Tm9kZSogbm9kZSA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJncy5Ib2xkZXIo
KSk7CisgICAgTm9kZSogbm9kZSA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPE5v
ZGU+KGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRy
aWV2ZShub2RlLT5kb2N1bWVudCgpLT5mcmFtZSgpKTsKICAgICBpZiAoIXByb3h5KQogICAgICAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxp
c3RlbmVyID0gcHJveHktPkZpbmRPckNyZWF0ZVY4RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxz
ZSk7CisgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPmZpbmRPckNy
ZWF0ZVY4RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAgICAgaWYgKGxpc3RlbmVyKSB7
CiAgICAgICAgIFN0cmluZyB0eXBlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgICAg
ICBib29sIHVzZUNhcHR1cmUgPSBhcmdzWzJdLT5Cb29sZWFuVmFsdWUoKTsKQEAgLTY1LDcgKzY1
LDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChOb2RlUmVtb3ZlRXZlbnRMaXN0ZW5lcikKIHsKICAg
ICBJTkNfU1RBVFMoIkRPTS5Ob2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoKSIpOwotICAgIE5vZGUq
IG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3MuSG9sZGVyKCkpOwor
ICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihh
cmdzLkhvbGRlcigpKTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUo
bm9kZS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSk7CiAgICAgLy8gSXQgaXMgcG9zc2JpbGUgdGhhdCB0
aGUgb3duZXIgZG9jdW1lbnQgb2YgdGhlIG5vZGUgaXMgZGV0YWNoZWQKQEAgLTc0LDcgKzc0LDcg
QEAKICAgICBpZiAoIXByb3h5KQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0g
ICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPkZpbmRWOEV2ZW50TGlz
dGVuZXIoYXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5l
ciA9IHByb3h5LT5maW5kVjhFdmVudExpc3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsKICAgICBpZiAo
bGlzdGVuZXIpIHsKICAgICAgICAgU3RyaW5nIHR5cGUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1sw
XSk7CiAgICAgICAgIGJvb2wgdXNlQ2FwdHVyZSA9IGFyZ3NbMl0tPkJvb2xlYW5WYWx1ZSgpOwpA
QCAtODksMTMgKzg5LDEzIEBACiB7CiAgICAgSU5DX1NUQVRTKCJET00uTm9kZS5pbnNlcnRCZWZv
cmUiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gaG9sZGVyID0gYXJncy5Ib2xkZXIoKTsK
LSAgICBOb2RlKiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGhvbGRlcik7
CisgICAgTm9kZSogaW1wID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4o
aG9sZGVyKTsKICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBOb2RlKiBuZXdDaGlsZCA9
IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1swXSkgPyBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2Rl
PE5vZGU+KGFyZ3NbMF0pIDogMDsKLSAgICBOb2RlKiByZWZDaGlsZCA9IFY4Tm9kZTo6SGFzSW5z
dGFuY2UoYXJnc1sxXSkgPyBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMV0p
IDogMDsKKyAgICBOb2RlKiBuZXdDaGlsZCA9IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1swXSkg
PyBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKSA6IDA7Cisg
ICAgTm9kZSogcmVmQ2hpbGQgPSBWOE5vZGU6Okhhc0luc3RhbmNlKGFyZ3NbMV0pID8gVjhQcm94
eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJnc1sxXSkgOiAwOwogICAgIGJvb2wg
c3VjY2VzcyA9IGltcC0+aW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCByZWZDaGlsZCwgZWMsIHRydWUp
OwogICAgIGlmIChlYykgewotICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOwor
ICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogICAgICAgICByZXR1cm4gdjg6
OkhhbmRsZTx2ODo6VmFsdWU+KCk7CiAgICAgfQogICAgIGlmIChzdWNjZXNzKQpAQCAtMTA4LDEz
ICsxMDgsMTMgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Ob2RlLnJlcGxhY2VDaGlsZCIpOwog
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBob2xkZXIgPSBhcmdzLkhvbGRlcigpOwotICAgIE5v
ZGUqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8Tm9kZT4oaG9sZGVyKTsKKyAgICBO
b2RlKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihob2xkZXIp
OwogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIE5vZGUqIG5ld0NoaWxkID0gVjhOb2Rl
OjpIYXNJbnN0YW5jZShhcmdzWzBdKSA/IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8Tm9kZT4o
YXJnc1swXSkgOiAwOwotICAgIE5vZGUqIG9sZENoaWxkID0gVjhOb2RlOjpIYXNJbnN0YW5jZShh
cmdzWzFdKSA/IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJnc1sxXSkgOiAwOwor
ICAgIE5vZGUqIG5ld0NoaWxkID0gVjhOb2RlOjpIYXNJbnN0YW5jZShhcmdzWzBdKSA/IFY4UHJv
eHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0pIDogMDsKKyAgICBOb2Rl
KiBvbGRDaGlsZCA9IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1sxXSkgPyBWOFByb3h5Ojpjb252
ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzFdKSA6IDA7CiAgICAgYm9vbCBzdWNjZXNz
ID0gaW1wLT5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQsIG9sZENoaWxkLCBlYywgdHJ1ZSk7CiAgICAg
aWYgKGVjKSB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAg
IFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgIHJldHVybiB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4oKTsKICAgICB9CiAgICAgaWYgKHN1Y2Nlc3MpCkBAIC0xMjYsMTIgKzEyNiwx
MiBAQAogewogICAgIElOQ19TVEFUUygiRE9NLk5vZGUucmVtb3ZlQ2hpbGQiKTsKICAgICB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gaG9sZGVyID0gYXJncy5Ib2xkZXIoKTsKLSAgICBOb2RlKiBpbXAg
PSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGhvbGRlcik7CisgICAgTm9kZSogaW1w
ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oaG9sZGVyKTsKICAgICBF
eGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBOb2RlKiBvbGRDaGlsZCA9IFY4Tm9kZTo6SGFzSW5z
dGFuY2UoYXJnc1swXSkgPyBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0p
IDogMDsKKyAgICBOb2RlKiBvbGRDaGlsZCA9IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1swXSkg
PyBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKSA6IDA7CiAg
ICAgYm9vbCBzdWNjZXNzID0gaW1wLT5yZW1vdmVDaGlsZChvbGRDaGlsZCwgZWMpOwogICAgIGlm
IChlYykgewotICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOworICAgICAgICBW
OFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2
ODo6VmFsdWU+KCk7CiAgICAgfQogICAgIGlmIChzdWNjZXNzKQpAQCAtMTQ0LDEyICsxNDQsMTIg
QEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Ob2RlLmFwcGVuZENoaWxkIik7CiAgICAgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IGhvbGRlciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgTm9kZSogaW1wID0g
VjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxOb2RlPihob2xkZXIpOworICAgIE5vZGUqIGltcCA9
IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGhvbGRlcik7CiAgICAgRXhj
ZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgTm9kZSogbmV3Q2hpbGQgPSBWOE5vZGU6Okhhc0luc3Rh
bmNlKGFyZ3NbMF0pID8gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKSA6
IDA7CisgICAgTm9kZSogbmV3Q2hpbGQgPSBWOE5vZGU6Okhhc0luc3RhbmNlKGFyZ3NbMF0pID8g
VjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJnc1swXSkgOiAwOwogICAg
IGJvb2wgc3VjY2VzcyA9IGltcC0+YXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGVjLCB0cnVlICk7CiAg
ICAgaWYgKGVjKSB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAg
ICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgIHJldHVybiB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4oKTsKICAgICB9CiAgICAgaWYgKHN1Y2Nlc3MpCkluZGV4OiBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE5hbWVkTm9kZU1hcEN1c3RvbS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhOYW1lZE5vZGVNYXBDdXN0b20uY3BwCShy
ZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TmFtZWROb2Rl
TWFwQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDIsMTIgKzQyLDEyIEBACiBJTkRFWEVE
X1BST1BFUlRZX0dFVFRFUihOYW1lZE5vZGVNYXApCiB7CiAgICAgSU5DX1NUQVRTKCJET00uTmFt
ZWROb2RlTWFwLkluZGV4ZWRQcm9wZXJ0eUdldHRlciIpOwotICAgIE5hbWVkTm9kZU1hcCogaW1w
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TmFtZWROb2RlTWFwPihWOENsYXNzSW5kZXg6Ok5B
TUVETk9ERU1BUCwgaW5mby5Ib2xkZXIoKSk7CisgICAgTmFtZWROb2RlTWFwKiBpbXAgPSBWOFBy
b3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TmFtZWROb2RlTWFwPihWOENsYXNzSW5kZXg6Ok5B
TUVETk9ERU1BUCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgUmVmUHRyPE5vZGU+IHJlc3VsdCA9IGlt
cC0+aXRlbShpbmRleCk7CiAgICAgaWYgKCFyZXN1bHQpCiAgICAgICAgIHJldHVybiBub3RIYW5k
bGVkQnlJbnRlcmNlcHRvcigpOwogCi0gICAgcmV0dXJuIFY4UHJveHk6Ok5vZGVUb1Y4T2JqZWN0
KHJlc3VsdC5nZXQoKSk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnROb2RlVG9WOE9iamVj
dChyZXN1bHQuZ2V0KCkpOwogfQogCiBOQU1FRF9QUk9QRVJUWV9HRVRURVIoTmFtZWROb2RlTWFw
KQpAQCAtNjMsMTIgKzYzLDEyIEBACiAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNl
cHRvcigpOwogCiAgICAgLy8gRmluYWxseSwgc2VhcmNoIHRoZSBET00uCi0gICAgTmFtZWROb2Rl
TWFwKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxOYW1lZE5vZGVNYXA+KFY4Q2xhc3NJ
bmRleDo6TkFNRUROT0RFTUFQLCBpbmZvLkhvbGRlcigpKTsKKyAgICBOYW1lZE5vZGVNYXAqIGlt
cCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxOYW1lZE5vZGVNYXA+KFY4Q2xhc3NJ
bmRleDo6TkFNRUROT0RFTUFQLCBpbmZvLkhvbGRlcigpKTsKICAgICBSZWZQdHI8Tm9kZT4gcmVz
dWx0ID0gaW1wLT5nZXROYW1lZEl0ZW0odG9XZWJDb3JlU3RyaW5nKG5hbWUpKTsKICAgICBpZiAo
IXJlc3VsdCkKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAKLSAg
ICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsKKyAgICByZXR1
cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAKIH0g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
Q2xpZW50UmVjdExpc3RDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4Q2xpZW50UmVjdExpc3RDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysr
IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2xpZW50UmVjdExpc3RDdXN0b20uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC00NCwxMiArNDQsMTIgQEAKIElOREVYRURfUFJPUEVSVFlfR0VUVEVS
KENsaWVudFJlY3RMaXN0KQogewogICAgIElOQ19TVEFUUygiRE9NLkNsaWVudFJlY3RMaXN0Lklu
ZGV4ZWRQcm9wZXJ0eUdldHRlciIpOwotICAgIENsaWVudFJlY3RMaXN0KiBpbXAgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxDbGllbnRSZWN0TGlzdD4oVjhDbGFzc0luZGV4OjpDTElFTlRSRUNU
TElTVCwgaW5mby5Ib2xkZXIoKSk7CisgICAgQ2xpZW50UmVjdExpc3QqIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDbGllbnRSZWN0TGlzdD4oVjhDbGFzc0luZGV4OjpDTElF
TlRSRUNUTElTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgUmVmUHRyPENsaWVudFJlY3Q+IHJlc3Vs
dCA9IGltcC0+aXRlbShpbmRleCk7CiAgICAgaWYgKCFyZXN1bHQpCiAgICAgICAgIHJldHVybiBu
b3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogCi0gICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmpl
Y3QoVjhDbGFzc0luZGV4OjpDTElFTlRSRUNULCByZXN1bHQuZ2V0KCkpOworICAgIHJldHVybiBW
OFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNMSUVOVFJFQ1QsIHJlc3Vs
dC5nZXQoKSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTEltYWdlRWxlbWVudENvbnN0cnVjdG9yLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxJbWFnZUVsZW1lbnRDb25z
dHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhIVE1MSW1hZ2VFbGVtZW50Q29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01
NSw3ICs1NSw3IEBACiAKICAgICAvLyBNYWtlIHN1cmUgdGhlIGRvY3VtZW50IGlzIGFkZGVkIHRv
IHRoZSBET00gTm9kZSBtYXAuIE90aGVyd2lzZSwgdGhlIEhUTUxJbWFnZUVsZW1lbnQgaW5zdGFu
Y2UKICAgICAvLyBtYXkgZW5kIHVwIGJlaW5nIHRoZSBvbmx5IG5vZGUgaW4gdGhlIG1hcCBhbmQg
Z2V0IGdhcmJhZ2UtY2NvbGxlY3RlZCBwcmVtYXR1cmVseS4KLSAgICBWOFByb3h5OjpOb2RlVG9W
OE9iamVjdChkb2N1bWVudCk7CisgICAgVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KGRv
Y3VtZW50KTsKIAogICAgIFJlZlB0cjxIVE1MSW1hZ2VFbGVtZW50PiBpbWFnZSA9IG5ldyBIVE1M
SW1hZ2VFbGVtZW50KEhUTUxOYW1lczo6aW1nVGFnLCBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lKCkt
PmRvY3VtZW50KCkpOwogICAgIGlmIChhcmdzLkxlbmd0aCgpID4gMCkgewpAQCAtNjQsOSArNjQs
OSBAQAogICAgICAgICAgICAgaW1hZ2UtPnNldEhlaWdodCh0b0ludDMyKGFyZ3NbMV0pKTsKICAg
ICB9CiAKLSAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKGFyZ3MuSG9sZGVyKCksIFY4Q2xhc3NJ
bmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpOT0RFKSwgaW1hZ2UuZ2V0KCkpOworICAgIFY4UHJv
eHk6OnNldERPTVdyYXBwZXIoYXJncy5Ib2xkZXIoKSwgVjhDbGFzc0luZGV4OjpUb0ludChWOENs
YXNzSW5kZXg6Ok5PREUpLCBpbWFnZS5nZXQoKSk7CiAgICAgaW1hZ2UtPnJlZigpOwotICAgIFY4
UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU5vZGUoaW1hZ2UuZ2V0KCksIHY4OjpQZXJzaXN0ZW50
PHY4OjpPYmplY3Q+OjpOZXcoYXJncy5Ib2xkZXIoKSkpOworICAgIFY4UHJveHk6OnNldEpTV3Jh
cHBlckZvckRPTU5vZGUoaW1hZ2UuZ2V0KCksIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpO
ZXcoYXJncy5Ib2xkZXIoKSkpOwogICAgIHJldHVybiBhcmdzLkhvbGRlcigpOwogfQogCkluZGV4
OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFNRTFJlc3VsdFNldFJvd0xpc3RDdXN0b20u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMUmVzdWx0
U2V0Um93TGlzdEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhTUUxSZXN1bHRTZXRSb3dMaXN0Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzIsMTEgKzMyLDEwIEBACiAKICNpZiBFTkFCTEUoREFUQUJBU0UpCiAKLSNpbmNsdWRl
ICJ2OF9iaW5kaW5nLmgiCi0jaW5jbHVkZSAidjhfcHJveHkuaCIKLQogI2luY2x1ZGUgIlNRTFJl
c3VsdFNldFJvd0xpc3QuaCIKKyNpbmNsdWRlICJWOEJpbmRpbmcuaCIKICNpbmNsdWRlICJWOEN1
c3RvbUJpbmRpbmcuaCIKKyNpbmNsdWRlICJWOFByb3h5LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIApAQCAtNDUsMjAgKzQ0LDIwIEBACiAgICAgSU5DX1NUQVRTKCJET00uU1FMUmVzdWx0U2V0
Um93TGlzdC5pdGVtKCkiKTsKIAogICAgIGlmIChhcmdzLkxlbmd0aCgpID09IDApIHsKLSAgICAg
ICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpTWU5UQVhfRVJST1IsICJJdGVtIGluZGV4
IGlzIHJlcXVpcmVkLiIpOworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlNZ
TlRBWF9FUlJPUiwgIkl0ZW0gaW5kZXggaXMgcmVxdWlyZWQuIik7CiAgICAgICAgIHJldHVybiB2
ODo6VW5kZWZpbmVkKCk7CiAgICAgfQogCiAgICAgaWYgKCFhcmdzWzBdLT5Jc051bWJlcigpKSB7
Ci0gICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgIkl0ZW0g
aW5kZXggbXVzdCBiZSBhIG51bWJlci4iKTsKKyAgICAgICAgVjhQcm94eTo6dGhyb3dFcnJvcihW
OFByb3h5OjpUWVBFX0VSUk9SLCAiSXRlbSBpbmRleCBtdXN0IGJlIGEgbnVtYmVyLiIpOwogICAg
ICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgIH0KIAotICAgIFNRTFJlc3VsdFNldFJv
d0xpc3QqIHJvd0xpc3QgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxTUUxSZXN1bHRTZXRSb3dM
aXN0PihWOENsYXNzSW5kZXg6OlNRTFJFU1VMVFNFVFJPV0xJU1QsIGFyZ3MuSG9sZGVyKCkpOwor
ICAgIFNRTFJlc3VsdFNldFJvd0xpc3QqIHJvd0xpc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRp
dmVPYmplY3Q8U1FMUmVzdWx0U2V0Um93TGlzdD4oVjhDbGFzc0luZGV4OjpTUUxSRVNVTFRTRVRS
T1dMSVNULCBhcmdzLkhvbGRlcigpKTsKIAogICAgIHVuc2lnbmVkIGxvbmcgaW5kZXggPSBhcmdz
WzBdLT5JbnRlZ2VyVmFsdWUoKTsKICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHJvd0xp
c3QtPmxlbmd0aCgpKSB7Ci0gICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6UkFO
R0VfRVJST1IsICJJdGVtIGluZGV4IGlzIG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgVjhQcm94
eTo6dGhyb3dFcnJvcihWOFByb3h5OjpSQU5HRV9FUlJPUiwgIkl0ZW0gaW5kZXggaXMgb3V0IG9m
IHJhbmdlLiIpOwogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgIH0KIApJbmRl
eDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhOb2RlSXRlcmF0b3JDdXN0b20uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Tm9kZUl0ZXJhdG9yQ3Vz
dG9tLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OE5vZGVJdGVyYXRvckN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUzLDEzICs1MywxMyBA
QAogICAgIGlmICghb2JqZWN0KQogICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKIAotICAgIHJl
dHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChvYmplY3QuZ2V0KCkpOworICAgIHJldHVybiBW
OFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3Qob2JqZWN0LmdldCgpKTsKIH0KIAogQ0FMTEJB
Q0tfRlVOQ19ERUNMKE5vZGVJdGVyYXRvck5leHROb2RlKQogewogICAgIElOQ19TVEFUUygiRE9N
Lk5vZGVJdGVyYXRvci5uZXh0Tm9kZSgpIik7Ci0gICAgTm9kZUl0ZXJhdG9yKiBub2RlSXRlcmF0
b3IgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxOb2RlSXRlcmF0b3I+KFY4Q2xhc3NJbmRleDo6
Tk9ERUlURVJBVE9SLCBhcmdzLkhvbGRlcigpKTsKKyAgICBOb2RlSXRlcmF0b3IqIG5vZGVJdGVy
YXRvciA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxOb2RlSXRlcmF0b3I+KFY4Q2xh
c3NJbmRleDo6Tk9ERUlURVJBVE9SLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIEV4Y2VwdGlvbkNv
ZGUgZWMgPSAwOwogICAgIFNjcmlwdFN0YXRlIHN0YXRlOwpAQCAtNzAsNyArNzAsNyBAQAogQ0FM
TEJBQ0tfRlVOQ19ERUNMKE5vZGVJdGVyYXRvclByZXZpb3VzTm9kZSkKIHsKICAgICBJTkNfU1RB
VFMoIkRPTS5Ob2RlSXRlcmF0b3IucHJldmlvdXNOb2RlKCkiKTsKLSAgICBOb2RlSXRlcmF0b3Iq
IG5vZGVJdGVyYXRvciA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PE5vZGVJdGVyYXRvcj4oVjhD
bGFzc0luZGV4OjpOT0RFSVRFUkFUT1IsIGFyZ3MuSG9sZGVyKCkpOworICAgIE5vZGVJdGVyYXRv
ciogbm9kZUl0ZXJhdG9yID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PE5vZGVJdGVy
YXRvcj4oVjhDbGFzc0luZGV4OjpOT0RFSVRFUkFUT1IsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAg
RXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAgU2NyaXB0U3RhdGUgc3RhdGU7CkluZGV4OiBXZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFNWR0xlbmd0aEN1c3RvbS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTVkdMZW5ndGhDdXN0b20uY3BwCShyZXZp
c2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1ZHTGVuZ3RoQ3Vz
dG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsMTcgKzQ0LDE3IEBACiBBQ0NFU1NPUl9HRVRU
RVIoU1ZHTGVuZ3RoVmFsdWUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uU1ZHTGVuZ3RoLnZhbHVl
Iik7Ci0gICAgVjhTVkdQT0RUeXBlV3JhcHBlcjxTVkdMZW5ndGg+KiB3cmFwcGVyID0gVjhQcm94
eTo6VG9OYXRpdmVPYmplY3Q8VjhTVkdQT0RUeXBlV3JhcHBlcjxTVkdMZW5ndGg+ID4oVjhDbGFz
c0luZGV4OjpTVkdMRU5HVEgsIGluZm8uSG9sZGVyKCkpOworICAgIFY4U1ZHUE9EVHlwZVdyYXBw
ZXI8U1ZHTGVuZ3RoPiogd3JhcHBlciA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxW
OFNWR1BPRFR5cGVXcmFwcGVyPFNWR0xlbmd0aD4gPihWOENsYXNzSW5kZXg6OlNWR0xFTkdUSCwg
aW5mby5Ib2xkZXIoKSk7CiAgICAgU1ZHTGVuZ3RoIGltcCA9ICp3cmFwcGVyOwotICAgIHJldHVy
biB2ODo6TnVtYmVyOjpOZXcoaW1wLnZhbHVlKFY4UHJveHk6OkdldFNWR0NvbnRleHQod3JhcHBl
cikpKTsKKyAgICByZXR1cm4gdjg6Ok51bWJlcjo6TmV3KGltcC52YWx1ZShWOFByb3h5OjpzdmdD
b250ZXh0KHdyYXBwZXIpKSk7CiB9CiAKIENBTExCQUNLX0ZVTkNfREVDTChTVkdMZW5ndGhDb252
ZXJ0VG9TcGVjaWZpZWRVbml0cykKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5TVkdMZW5ndGguY29u
dmVydFRvU3BlY2lmaWVkVW5pdHMiKTsKLSAgICBWOFNWR1BPRFR5cGVXcmFwcGVyPFNWR0xlbmd0
aD4qIHdyYXBwZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxWOFNWR1BPRFR5cGVXcmFwcGVy
PFNWR0xlbmd0aD4gPihWOENsYXNzSW5kZXg6OlNWR0xFTkdUSCwgYXJncy5Ib2xkZXIoKSk7Cisg
ICAgVjhTVkdQT0RUeXBlV3JhcHBlcjxTVkdMZW5ndGg+KiB3cmFwcGVyID0gVjhQcm94eTo6Y29u
dmVydFRvTmF0aXZlT2JqZWN0PFY4U1ZHUE9EVHlwZVdyYXBwZXI8U1ZHTGVuZ3RoPiA+KFY4Q2xh
c3NJbmRleDo6U1ZHTEVOR1RILCBhcmdzLkhvbGRlcigpKTsKICAgICBTVkdMZW5ndGggaW1wID0g
KndyYXBwZXI7Ci0gICAgU1ZHRWxlbWVudCogY29udGV4dCA9IFY4UHJveHk6OkdldFNWR0NvbnRl
eHQod3JhcHBlcik7CisgICAgU1ZHRWxlbWVudCogY29udGV4dCA9IFY4UHJveHk6OnN2Z0NvbnRl
eHQod3JhcHBlcik7CiAgICAgaW1wLmNvbnZlcnRUb1NwZWNpZmllZFVuaXRzKHRvSW50MzIoYXJn
c1swXSksIGNvbnRleHQpOwogICAgIHdyYXBwZXItPmNvbW1pdENoYW5nZShpbXAsIGNvbnRleHQp
OwogICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOEhUTUxEb2N1bWVudEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhIVE1MRG9jdW1lbnRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5
NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTERvY3VtZW50Q3VzdG9tLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNzgsNyArNzgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHZh
bHVlOwogICAgIH0KIAotICAgIEhUTUxEb2N1bWVudCogaHRtbERvY3VtZW50ID0gVjhQcm94eTo6
RE9NV3JhcHBlclRvTm9kZTxIVE1MRG9jdW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxE
b2N1bWVudCogaHRtbERvY3VtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8
SFRNTERvY3VtZW50PihpbmZvLkhvbGRlcigpKTsKIAogICAgIC8vIEZhc3QgY2FzZSBmb3IgbmFt
ZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90IHRoZXJlLgogICAgIGlmICghaHRtbERvY3VtZW50LT5o
YXNOYW1lZEl0ZW0oa2V5LmltcGwoKSkgJiYgIWh0bWxEb2N1bWVudC0+aGFzRXh0cmFOYW1lZEl0
ZW0oa2V5LmltcGwoKSkpCkBAIC05MiwxMiArOTIsMTIgQEAKICAgICAgICAgTm9kZSogbm9kZSA9
IGl0ZW1zLT5maXJzdEl0ZW0oKTsKICAgICAgICAgRnJhbWUqIGZyYW1lID0gMDsKICAgICAgICAg
aWYgKG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjppZnJhbWVUYWcpICYmIChmcmFtZSA9IHN0
YXRpY19jYXN0PEhUTUxJRnJhbWVFbGVtZW50Kj4obm9kZSktPmNvbnRlbnRGcmFtZSgpKSkKLSAg
ICAgICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lO
RE9XLCBmcmFtZS0+ZG9tV2luZG93KCkpOworICAgICAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNv
bnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBmcmFtZS0+ZG9tV2luZG93
KCkpOwogCi0gICAgICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChub2RlKTsKKyAg
ICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnROb2RlVG9WOE9iamVjdChub2RlKTsKICAgICB9
CiAKLSAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkhUTUxDT0xM
RUNUSU9OLCBpdGVtcy5nZXQoKSk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2Jq
ZWN0KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGl0ZW1zLmdldCgpKTsKIH0KIAogLy8g
SFRNTERvY3VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTExNyw3ICsxMTcsNyBAQAogQ0FMTEJBQ0tfRlVOQ19E
RUNMKEhUTUxEb2N1bWVudFdyaXRlKQogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxEb2N1bWVu
dC53cml0ZSgpIik7Ci0gICAgSFRNTERvY3VtZW50KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5OjpE
T01XcmFwcGVyVG9Ob2RlPEhUTUxEb2N1bWVudD4oYXJncy5Ib2xkZXIoKSk7CisgICAgSFRNTERv
Y3VtZW50KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxI
VE1MRG9jdW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOwogICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6
OnJldHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29udGV4dCgpOwogICAgIEFTU0VSVChmcmFtZSk7CiAg
ICAgaHRtbERvY3VtZW50LT53cml0ZSh3cml0ZUhlbHBlckdldFN0cmluZyhhcmdzKSwgZnJhbWUt
PmRvY3VtZW50KCkpOwpAQCAtMTI3LDcgKzEyNyw3IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woSFRN
TERvY3VtZW50V3JpdGVsbikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MRG9jdW1lbnQud3Jp
dGVsbigpIik7Ci0gICAgSFRNTERvY3VtZW50KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5OjpET01X
cmFwcGVyVG9Ob2RlPEhUTUxEb2N1bWVudD4oYXJncy5Ib2xkZXIoKSk7CisgICAgSFRNTERvY3Vt
ZW50KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1M
RG9jdW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOwogICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6OnJl
dHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29udGV4dCgpOwogICAgIEFTU0VSVChmcmFtZSk7CiAgICAg
aHRtbERvY3VtZW50LT53cml0ZWxuKHdyaXRlSGVscGVyR2V0U3RyaW5nKGFyZ3MpLCBmcmFtZS0+
ZG9jdW1lbnQoKSk7CkBAIC0xMzcsMTIgKzEzNywxMiBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEhU
TUxEb2N1bWVudE9wZW4pCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTERvY3VtZW50Lm9wZW4o
KSIpOwotICAgIEhUTUxEb2N1bWVudCogaHRtbERvY3VtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBl
clRvTm9kZTxIVE1MRG9jdW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOworICAgIEhUTUxEb2N1bWVudCog
aHRtbERvY3VtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTERvY3Vt
ZW50PihhcmdzLkhvbGRlcigpKTsKIAogICAgIGlmIChhcmdzLkxlbmd0aCgpID4gMikgewogICAg
ICAgICBpZiAoRnJhbWUqIGZyYW1lID0gaHRtbERvY3VtZW50LT5mcmFtZSgpKSB7CiAgICAgICAg
ICAgICAvLyBGZXRjaCB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgdGhlIGZyYW1lLgotICAgICAgICAg
ICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChm
cmFtZSk7CisgICAgICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFBy
b3h5Ojpjb250ZXh0KGZyYW1lKTsKICAgICAgICAgICAgIC8vIEJhaWwgb3V0IGlmIHdlIGNhbm5v
dCBnZXQgdGhlIGNvbnRleHQuCiAgICAgICAgICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCiAg
ICAgICAgICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKQEAgLTE2Miw3ICsxNjIsNyBA
QAogICAgICAgICAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShmcmFtZSk7
CiAgICAgICAgICAgICBBU1NFUlQocHJveHkpOwogCi0gICAgICAgICAgICB2ODo6TG9jYWw8djg6
OlZhbHVlPiByZXN1bHQgPSBwcm94eS0+Q2FsbEZ1bmN0aW9uKHY4OjpMb2NhbDx2ODo6RnVuY3Rp
b24+OjpDYXN0KGZ1bmN0aW9uKSwgZ2xvYmFsLCBhcmdzLkxlbmd0aCgpLCBwYXJhbXMpOworICAg
ICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmVzdWx0ID0gcHJveHktPmNhbGxGdW5jdGlv
bih2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPjo6Q2FzdChmdW5jdGlvbiksIGdsb2JhbCwgYXJncy5M
ZW5ndGgoKSwgcGFyYW1zKTsKICAgICAgICAgICAgIGRlbGV0ZVtdIHBhcmFtczsKICAgICAgICAg
ICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KQEAgLTE3OSw5ICsxNzksOSBAQAogICAgIElO
Q19TVEFUUygiRE9NLkhUTUxEb2N1bWVudC5hbGwuX2dldCIpOwogICAgIHY4OjpIYW5kbGVTY29w
ZSBzY29wZTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9sZGVy
KCk7Ci0gICAgSFRNTERvY3VtZW50KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVy
VG9Ob2RlPEhUTUxEb2N1bWVudD4oaG9sZGVyKTsKKyAgICBIVE1MRG9jdW1lbnQqIGh0bWxEb2N1
bWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxEb2N1bWVudD4oaG9s
ZGVyKTsKICAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb24+IGNvbGxlY3Rpb24gPSBXVEY6OmdldFB0
cihodG1sRG9jdW1lbnQtPmFsbCgpKTsKLSAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChW
OENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBXVEY6OmdldFB0cihjb2xsZWN0aW9uKSk7Cisg
ICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6SFRNTENP
TExFQ1RJT04sIFdURjo6Z2V0UHRyKGNvbGxlY3Rpb24pKTsKIH0KIAogQUNDRVNTT1JfU0VUVEVS
KEhUTUxEb2N1bWVudEFsbCkKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2Fu
dmFzUmVuZGVyaW5nQ29udGV4dDJEQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOENhbnZhc1JlbmRlcmluZ0NvbnRleHQyREN1c3RvbS5jcHAJKHJl
dmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MCwxMCArNTAsMTAg
QEAKIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdG9WOChDYW52YXNTdHlsZSogc3R5bGUp
CiB7CiAgICAgaWYgKHN0eWxlLT5jYW52YXNHcmFkaWVudCgpKQotICAgICAgICByZXR1cm4gVjhQ
cm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNBTlZBU0dSQURJRU5ULCBzdHlsZS0+Y2Fu
dmFzR3JhZGllbnQoKSk7CisgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVj
dChWOENsYXNzSW5kZXg6OkNBTlZBU0dSQURJRU5ULCBzdHlsZS0+Y2FudmFzR3JhZGllbnQoKSk7
CiAKICAgICBpZiAoc3R5bGUtPmNhbnZhc1BhdHRlcm4oKSkKLSAgICAgICAgcmV0dXJuIFY4UHJv
eHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpDQU5WQVNQQVRURVJOLCBzdHlsZS0+Y2FudmFz
UGF0dGVybigpKTsKKyAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4
Q2xhc3NJbmRleDo6Q0FOVkFTUEFUVEVSTiwgc3R5bGUtPmNhbnZhc1BhdHRlcm4oKSk7CiAKICAg
ICByZXR1cm4gdjhTdHJpbmcoc3R5bGUtPmNvbG9yKCkpOwogfQpAQCAtNjQsMzUgKzY0LDM1IEBA
CiAgICAgICAgIHJldHVybiBDYW52YXNTdHlsZTo6Y3JlYXRlKHRvV2ViQ29yZVN0cmluZyh2YWx1
ZSkpOwogCiAgICAgaWYgKFY4Q2FudmFzR3JhZGllbnQ6Okhhc0luc3RhbmNlKHZhbHVlKSkKLSAg
ICAgICAgcmV0dXJuIENhbnZhc1N0eWxlOjpjcmVhdGUoVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0
aXZlPENhbnZhc0dyYWRpZW50Pih2YWx1ZSkpOworICAgICAgICByZXR1cm4gQ2FudmFzU3R5bGU6
OmNyZWF0ZShWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPENhbnZhc0dyYWRpZW50
Pih2YWx1ZSkpOwogCiAgICAgaWYgKFY4Q2FudmFzUGF0dGVybjo6SGFzSW5zdGFuY2UodmFsdWUp
KQotICAgICAgICByZXR1cm4gQ2FudmFzU3R5bGU6OmNyZWF0ZShWOFByb3h5OjpET01XcmFwcGVy
VG9OYXRpdmU8Q2FudmFzUGF0dGVybj4odmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIENhbnZhc1N0
eWxlOjpjcmVhdGUoVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxDYW52YXNQYXR0
ZXJuPih2YWx1ZSkpOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKIEFDQ0VTU09SX0dFVFRFUihDYW52
YXNSZW5kZXJpbmdDb250ZXh0MkRTdHJva2VTdHlsZSkKIHsKLSAgICBDYW52YXNSZW5kZXJpbmdD
b250ZXh0MkQqIGltcGwgPSBWOFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8Q2FudmFzUmVuZGVy
aW5nQ29udGV4dDJEPihpbmZvLkhvbGRlcigpKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkQqIGltcGwgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPENhbnZhc1JlbmRl
cmluZ0NvbnRleHQyRD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgcmV0dXJuIHRvVjgoaW1wbC0+c3Ry
b2tlU3R5bGUoKSk7CiB9CiAKIEFDQ0VTU09SX1NFVFRFUihDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkRTdHJva2VTdHlsZSkKIHsKLSAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGltcGwgPSBW
OFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihpbmZv
LkhvbGRlcigpKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGltcGwgPSBWOFByb3h5
Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oaW5m
by5Ib2xkZXIoKSk7CiAgICAgaW1wbC0+c2V0U3Ryb2tlU3R5bGUodG9DYW52YXNTdHlsZSh2YWx1
ZSkpOwogfQogCiBBQ0NFU1NPUl9HRVRURVIoQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJERmlsbFN0
eWxlKQogewotICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogaW1wbCA9IFY4UHJveHk6OkRP
TVdyYXBwZXJUb05hdGl2ZTxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KGluZm8uSG9sZGVyKCkp
OworICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogaW1wbCA9IFY4UHJveHk6OmNvbnZlcnRE
T01XcmFwcGVyVG9OYXRpdmU8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihpbmZvLkhvbGRlcigp
KTsKICAgICByZXR1cm4gdG9WOChpbXBsLT5maWxsU3R5bGUoKSk7CiB9CiAKIEFDQ0VTU09SX1NF
VFRFUihDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRGaWxsU3R5bGUpCiB7Ci0gICAgQ2FudmFzUmVu
ZGVyaW5nQ29udGV4dDJEKiBpbXBsID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0aXZlPENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRD4oaW5mby5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUmVuZGVyaW5n
Q29udGV4dDJEKiBpbXBsID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxDYW52
YXNSZW5kZXJpbmdDb250ZXh0MkQ+KGluZm8uSG9sZGVyKCkpOwogICAgIGltcGwtPnNldEZpbGxT
dHlsZSh0b0NhbnZhc1N0eWxlKHZhbHVlKSk7CiB9CiAKQEAgLTEwMSw3ICsxMDEsNyBAQAogQ0FM
TEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFNldFN0cm9rZUNvbG9yKQog
ewogICAgIElOQ19TVEFUUygiRE9NLkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5zZXRTdHJva2VD
b2xvcigpIik7Ci0gICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94
eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6
OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUmVu
ZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0
PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdD
T05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOwogICAgIHN3aXRjaCAoYXJncy5MZW5ndGgoKSkgewog
ICAgIGNhc2UgMToKICAgICAgICAgaWYgKGFyZ3NbMF0tPklzU3RyaW5nKCkpCkBAIC0xMjIsNyAr
MTIyLDcgQEAKICAgICAgICAgY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IodG9GbG9hdChhcmdzWzBd
KSwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSwgdG9GbG9hdChhcmdzWzNdKSwg
dG9GbG9hdChhcmdzWzRdKSk7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAg
IFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VSUk9SLCAic2V0U3Ryb2tlQ29s
b3I6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIpOworICAgICAgICBWOFByb3h5Ojp0aHJv
d0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgInNldFN0cm9rZUNvbG9yOiBJbnZhbGlkIG51
bWJlciBvZiBhcmd1bWVudHMiKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiB2
ODo6VW5kZWZpbmVkKCk7CkBAIC0xMzEsNyArMTMxLDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChD
YW52YXNSZW5kZXJpbmdDb250ZXh0MkRTZXRGaWxsQ29sb3IpCiB7CiAgICAgSU5DX1NUQVRTKCJE
T00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnNldEZpbGxDb2xvcigpIik7Ci0gICAgQ2FudmFz
UmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2Fu
dmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRF
WFQyRCwgYXJncy5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250
ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRl
eHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVy
KCkpOwogICAgIHN3aXRjaCAoYXJncy5MZW5ndGgoKSkgewogICAgIGNhc2UgMToKICAgICAgICAg
aWYgKGFyZ3NbMF0tPklzU3RyaW5nKCkpCkBAIC0xNTIsNyArMTUyLDcgQEAKICAgICAgICAgY29u
dGV4dC0+c2V0RmlsbENvbG9yKHRvRmxvYXQoYXJnc1swXSksIHRvRmxvYXQoYXJnc1sxXSksIHRv
RmxvYXQoYXJnc1syXSksIHRvRmxvYXQoYXJnc1szXSksIHRvRmxvYXQoYXJnc1s0XSkpOwogICAg
ICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4
UHJveHk6OlNZTlRBWF9FUlJPUiwgInNldEZpbGxDb2xvcjogSW52YWxpZCBudW1iZXIgb2YgYXJn
dW1lbnRzIik7CisgICAgICAgIFY4UHJveHk6OnRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VS
Uk9SLCAic2V0RmlsbENvbG9yOiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiKTsKICAgICAg
ICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CkBAIC0xNjEsMTMg
KzE2MSwxMyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFN0
cm9rZVJlY3QpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJE
LnN0cm9rZVJlY3QoKSIpOwotICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9
IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFz
c0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOworICAgIENh
bnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2
ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVO
REVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKICAgICBpZiAoYXJncy5MZW5ndGgoKSA9
PSA1KQogICAgICAgICBjb250ZXh0LT5zdHJva2VSZWN0KHRvRmxvYXQoYXJnc1swXSksIHRvRmxv
YXQoYXJnc1sxXSksIHRvRmxvYXQoYXJnc1syXSksIHRvRmxvYXQoYXJnc1szXSksIHRvRmxvYXQo
YXJnc1s0XSkpOwogICAgIGVsc2UgaWYgKGFyZ3MuTGVuZ3RoKCkgPT0gNCkKICAgICAgICAgY29u
dGV4dC0+c3Ryb2tlUmVjdCh0b0Zsb2F0KGFyZ3NbMF0pLCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zs
b2F0KGFyZ3NbMl0pLCB0b0Zsb2F0KGFyZ3NbM10pKTsKICAgICBlbHNlIHsKLSAgICAgICAgVjhQ
cm94eTo6U2V0RE9NRXhjZXB0aW9uKElOREVYX1NJWkVfRVJSKTsKKyAgICAgICAgVjhQcm94eTo6
c2V0RE9NRXhjZXB0aW9uKElOREVYX1NJWkVfRVJSKTsKICAgICAgICAgcmV0dXJuIG5vdEhhbmRs
ZWRCeUludGVyY2VwdG9yKCk7CiAgICAgfQogICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CkBA
IC0xNzYsNyArMTc2LDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkRTZXRTaGFkb3cpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29u
dGV4dDJELnNldFNoYWRvdygpIik7Ci0gICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250
ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihW
OENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7Cisg
ICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRv
TmF0aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5W
QVNSRU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgc3dpdGNoIChhcmdz
Lkxlbmd0aCgpKSB7CiAgICAgY2FzZSAzOgpAQCAtMjAxLDcgKzIwMSw3IEBACiAgICAgICAgIGNv
bnRleHQtPnNldFNoYWRvdyh0b0Zsb2F0KGFyZ3NbMF0pLCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zs
b2F0KGFyZ3NbMl0pLCB0b0Zsb2F0KGFyZ3NbM10pLCB0b0Zsb2F0KGFyZ3NbNF0pLCB0b0Zsb2F0
KGFyZ3NbNV0pLCB0b0Zsb2F0KGFyZ3NbNl0pLCB0b0Zsb2F0KGFyZ3NbN10pKTsKICAgICAgICAg
YnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5
OjpTWU5UQVhfRVJST1IsICJzZXRTaGFkb3c6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIp
OworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgInNl
dFNoYWRvdzogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgIGJyZWFrOwog
ICAgIH0KIApAQCAtMjExLDEzICsyMTEsMTMgQEAKIENBTExCQUNLX0ZVTkNfREVDTChDYW52YXNS
ZW5kZXJpbmdDb250ZXh0MkREcmF3SW1hZ2UpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2FudmFz
UmVuZGVyaW5nQ29udGV4dDJELmRyYXdJbWFnZSgpIik7Ci0gICAgQ2FudmFzUmVuZGVyaW5nQ29u
dGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5n
Q29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5I
b2xkZXIoKSk7CisgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94
eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFz
c0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZyA9IGFyZ3NbMF07CiAKICAgICBpZiAoVjhIVE1MSW1h
Z2VFbGVtZW50OjpIYXNJbnN0YW5jZShhcmcpKSB7CiAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMg
PSAwOwotICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZV9lbGVtZW50ID0gVjhQcm94eTo6
RE9NV3JhcHBlclRvTm9kZTxIVE1MSW1hZ2VFbGVtZW50PihhcmcpOworICAgICAgICBIVE1MSW1h
Z2VFbGVtZW50KiBpbWFnZV9lbGVtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05v
ZGU8SFRNTEltYWdlRWxlbWVudD4oYXJnKTsKICAgICAgICAgc3dpdGNoIChhcmdzLkxlbmd0aCgp
KSB7CiAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZShpbWFn
ZV9lbGVtZW50LCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pKTsKQEAgLTIyNSw3
ICsyMjUsNyBAQAogICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICBjb250ZXh0LT5kcmF3SW1h
Z2UoaW1hZ2VfZWxlbWVudCwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSwgdG9G
bG9hdChhcmdzWzNdKSwgdG9GbG9hdChhcmdzWzRdKSwgZWMpOwogICAgICAgICAgICAgaWYgKGVj
ICE9IDApIHsKLSAgICAgICAgICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOwor
ICAgICAgICAgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgICAg
ICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAgICAgICAgICAgICB9CiAg
ICAgICAgICAgICBicmVhazsKQEAgLTIzNSwxMiArMjM1LDEyIEBACiAgICAgICAgICAgICAgICAg
RmxvYXRSZWN0KHRvRmxvYXQoYXJnc1s1XSksIHRvRmxvYXQoYXJnc1s2XSksIHRvRmxvYXQoYXJn
c1s3XSksIHRvRmxvYXQoYXJnc1s4XSkpLAogICAgICAgICAgICAgICAgIGVjKTsKICAgICAgICAg
ICAgIGlmIChlYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0
aW9uKGVjKTsKKyAgICAgICAgICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwog
ICAgICAgICAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogICAgICAg
ICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAg
ICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgImRyYXdJbWFnZTog
SW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIik7CisgICAgICAgICAgICBWOFByb3h5Ojp0aHJv
d0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgImRyYXdJbWFnZTogSW52YWxpZCBudW1iZXIg
b2YgYXJndW1lbnRzIik7CiAgICAgICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAg
ICAgICB9CiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CkBAIC0yNDksNyArMjQ5LDcg
QEAKICAgICAvLyBIVE1MQ2FudmFzRWxlbWVudAogICAgIGlmIChWOEhUTUxDYW52YXNFbGVtZW50
OjpIYXNJbnN0YW5jZShhcmcpKSB7CiAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAg
ICAgICBIVE1MQ2FudmFzRWxlbWVudCogY2FudmFzX2VsZW1lbnQgPSBWOFByb3h5OjpET01XcmFw
cGVyVG9Ob2RlPEhUTUxDYW52YXNFbGVtZW50PihhcmcpOworICAgICAgICBIVE1MQ2FudmFzRWxl
bWVudCogY2FudmFzX2VsZW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxI
VE1MQ2FudmFzRWxlbWVudD4oYXJnKTsKICAgICAgICAgc3dpdGNoIChhcmdzLkxlbmd0aCgpKSB7
CiAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZShjYW52YXNf
ZWxlbWVudCwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSk7CkBAIC0yNTcsNyAr
MjU3LDcgQEAKICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgY29udGV4dC0+ZHJhd0ltYWdl
KGNhbnZhc19lbGVtZW50LCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pLCB0b0Zs
b2F0KGFyZ3NbM10pLCB0b0Zsb2F0KGFyZ3NbNF0pLCBlYyk7CiAgICAgICAgICAgICBpZiAoZWMg
IT0gMCkgewotICAgICAgICAgICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7Cisg
ICAgICAgICAgICAgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKGVjKTsKICAgICAgICAgICAg
ICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKICAgICAgICAgICAgIH0KICAg
ICAgICAgICAgIGJyZWFrOwpAQCAtMjY3LDMzICsyNjcsMzMgQEAKICAgICAgICAgICAgICAgICBG
bG9hdFJlY3QodG9GbG9hdChhcmdzWzVdKSwgdG9GbG9hdChhcmdzWzZdKSwgdG9GbG9hdChhcmdz
WzddKSwgdG9GbG9hdChhcmdzWzhdKSksCiAgICAgICAgICAgICAgICAgZWMpOwogICAgICAgICAg
ICAgaWYgKGVjICE9IDApIHsKLSAgICAgICAgICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRp
b24oZWMpOworICAgICAgICAgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAg
ICAgICAgICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAgICAgICAg
ICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAg
IFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VSUk9SLCAiZHJhd0ltYWdlOiBJ
bnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgIFY4UHJveHk6OnRocm93
RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VSUk9SLCAiZHJhd0ltYWdlOiBJbnZhbGlkIG51bWJlciBv
ZiBhcmd1bWVudHMiKTsKICAgICAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAg
ICAgIH0KICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKICAgICB9CiAKLSAgICBWOFBy
b3h5OjpTZXRET01FeGNlcHRpb24oVFlQRV9NSVNNQVRDSF9FUlIpOworICAgIFY4UHJveHk6OnNl
dERPTUV4Y2VwdGlvbihUWVBFX01JU01BVENIX0VSUik7CiAgICAgcmV0dXJuIG5vdEhhbmRsZWRC
eUludGVyY2VwdG9yKCk7CiB9CiAKIENBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdD
b250ZXh0MkREcmF3SW1hZ2VGcm9tUmVjdCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5DYW52YXNS
ZW5kZXJpbmdDb250ZXh0MkQuZHJhd0ltYWdlRnJvbVJlY3QoKSIpOwotICAgIENhbnZhc1JlbmRl
cmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZhc1Jl
bmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQs
IGFyZ3MuSG9sZGVyKCkpOworICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9
IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+
KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsK
IAogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmcgPSBhcmdzWzBdOwogCiAgICAgaWYgKFY4
SFRNTEltYWdlRWxlbWVudDo6SGFzSW5zdGFuY2UoYXJnKSkgewotICAgICAgICBIVE1MSW1hZ2VF
bGVtZW50KiBpbWFnZV9lbGVtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MSW1h
Z2VFbGVtZW50PihhcmcpOworICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZV9lbGVtZW50
ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTEltYWdlRWxlbWVudD4oYXJn
KTsKICAgICAgICAgY29udGV4dC0+ZHJhd0ltYWdlRnJvbVJlY3QoaW1hZ2VfZWxlbWVudCwgIHRv
RmxvYXQoYXJnc1sxXSksIHRvRmxvYXQoYXJnc1syXSksIHRvRmxvYXQoYXJnc1szXSksIHRvRmxv
YXQoYXJnc1s0XSksIHRvRmxvYXQoYXJnc1s1XSksIHRvRmxvYXQoYXJnc1s2XSksIHRvRmxvYXQo
YXJnc1s3XSksIHRvRmxvYXQoYXJnc1s4XSksIFRvV2ViQ29yZVN0cmluZyhhcmdzWzldKSk7CiAg
ICAgfSBlbHNlCi0gICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJP
UiwgImRyYXdJbWFnZUZyb21SZWN0OiBJbnZhbGlkIHR5cGUgb2YgYXJndW1lbnRzIik7CisgICAg
ICAgIFY4UHJveHk6OnRocm93RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgImRyYXdJbWFnZUZy
b21SZWN0OiBJbnZhbGlkIHR5cGUgb2YgYXJndW1lbnRzIik7CiAKICAgICByZXR1cm4gdjg6OlVu
ZGVmaW5lZCgpOwogfQpAQCAtMzAxLDMzICszMDEsMzMgQEAKIENBTExCQUNLX0ZVTkNfREVDTChD
YW52YXNSZW5kZXJpbmdDb250ZXh0MkRDcmVhdGVQYXR0ZXJuKQogewogICAgIElOQ19TVEFUUygi
RE9NLkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5jcmVhdGVQYXR0ZXJuKCkiKTsKLSAgICBDYW52
YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxD
YW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09O
VEVYVDJELCBhcmdzLkhvbGRlcigpKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNv
bnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29u
dGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xk
ZXIoKSk7CiAKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJnID0gYXJnc1swXTsKIAogICAg
IGlmIChWOEhUTUxJbWFnZUVsZW1lbnQ6Okhhc0luc3RhbmNlKGFyZykpIHsKLSAgICAgICAgSFRN
TEltYWdlRWxlbWVudCogaW1hZ2VfZWxlbWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8
SFRNTEltYWdlRWxlbWVudD4oYXJnKTsKKyAgICAgICAgSFRNTEltYWdlRWxlbWVudCogaW1hZ2Vf
ZWxlbWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxJbWFnZUVsZW1l
bnQ+KGFyZyk7CiAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgICAgICBSZWZQdHI8
Q2FudmFzUGF0dGVybj4gcGF0dGVybiA9IGNvbnRleHQtPmNyZWF0ZVBhdHRlcm4oaW1hZ2VfZWxl
bWVudCwgdmFsdWVUb1N0cmluZ1dpdGhOdWxsQ2hlY2soYXJnc1sxXSksIGVjKTsKICAgICAgICAg
aWYgKGVjICE9IDApIHsKLSAgICAgICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7
CisgICAgICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogICAgICAgICAgICAg
cmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0
dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpDQU5WQVNQQVRURVJOLCBwYXR0
ZXJuLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4
Q2xhc3NJbmRleDo6Q0FOVkFTUEFUVEVSTiwgcGF0dGVybi5nZXQoKSk7CiAgICAgfQogCiAgICAg
aWYgKFY4SFRNTENhbnZhc0VsZW1lbnQ6Okhhc0luc3RhbmNlKGFyZykpIHsKLSAgICAgICAgSFRN
TENhbnZhc0VsZW1lbnQqIGNhbnZhc19lbGVtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9k
ZTxIVE1MQ2FudmFzRWxlbWVudD4oYXJnKTsKKyAgICAgICAgSFRNTENhbnZhc0VsZW1lbnQqIGNh
bnZhc19lbGVtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTENhbnZh
c0VsZW1lbnQ+KGFyZyk7CiAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgICAgICBS
ZWZQdHI8Q2FudmFzUGF0dGVybj4gcGF0dGVybiA9IGNvbnRleHQtPmNyZWF0ZVBhdHRlcm4oY2Fu
dmFzX2VsZW1lbnQsIHZhbHVlVG9TdHJpbmdXaXRoTnVsbENoZWNrKGFyZ3NbMV0pLCBlYyk7CiAg
ICAgICAgIGlmIChlYyAhPSAwKSB7Ci0gICAgICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRp
b24oZWMpOworICAgICAgICAgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKGVjKTsKICAgICAg
ICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogICAgICAgICB9Ci0gICAg
ICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUEFUVEVS
TiwgcGF0dGVybi5nZXQoKSk7CisgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9i
amVjdChWOENsYXNzSW5kZXg6OkNBTlZBU1BBVFRFUk4sIHBhdHRlcm4uZ2V0KCkpOwogICAgIH0K
IAotICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihUWVBFX01JU01BVENIX0VSUik7CisgICAg
VjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKFRZUEVfTUlTTUFUQ0hfRVJSKTsKICAgICByZXR1cm4g
bm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKIH0KIApAQCAtMzM1LDEzICszMzUsMTMgQEAKIHsK
ICAgICBJTkNfU1RBVFMoIkRPTS5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQuZmlsbFRleHQoKSIp
OwogCi0gICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZB
U1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUmVuZGVyaW5n
Q29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhU
MkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgLy8gVHdvIGZvcm1zOgogICAgIC8vICogZmlsbFRl
eHQodGV4dCwgeCwgeSkKICAgICAvLyAqIGZpbGxUZXh0KHRleHQsIHgsIHksIG1heFdpZHRoKQog
ICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMyB8fCBhcmdzLkxlbmd0aCgpID4gNCkgewotICAgICAg
ICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oU1lOVEFYX0VSUik7CisgICAgICAgIFY4UHJveHk6
OnNldERPTUV4Y2VwdGlvbihTWU5UQVhfRVJSKTsKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRC
eUludGVyY2VwdG9yKCk7CiAgICAgfQogCkBAIC0zNjEsMTMgKzM2MSwxMyBAQAogQ0FMTEJBQ0tf
RlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFN0cm9rZVRleHQpCiB7CiAgICAgSU5D
X1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnN0cm9rZVRleHQoKSIpOwotICAg
IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2Jq
ZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJ
TkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOworICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQy
RCogY29udGV4dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJp
bmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdz
LkhvbGRlcigpKTsKIAogICAgIC8vIFR3byBmb3JtczoKICAgICAvLyAqIHN0cm9rZVRleHQodGV4
dCwgeCwgeSkKICAgICAvLyAqIHN0cm9rZVRleHQodGV4dCwgeCwgeSwgbWF4V2lkdGgpCiAgICAg
aWYgKGFyZ3MuTGVuZ3RoKCkgPCAzIHx8IGFyZ3MuTGVuZ3RoKCkgPiA0KSB7Ci0gICAgICAgIFY4
UHJveHk6OlNldERPTUV4Y2VwdGlvbihTWU5UQVhfRVJSKTsKKyAgICAgICAgVjhQcm94eTo6c2V0
RE9NRXhjZXB0aW9uKFNZTlRBWF9FUlIpOwogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50
ZXJjZXB0b3IoKTsKICAgICB9CiAKQEAgLTM5MiwyMCArMzkyLDIwIEBACiAgICAgLy8gKiBwdXRJ
bWFnZURhdGEoSW1hZ2VEYXRhLCB4LCB5KQogICAgIC8vICogcHV0SW1hZ2VEYXRhKEltYWdlRGF0
YSwgeCwgeSwgZGlydHlYLCBkaXJ0eVksIGRpcnR5V2lkdGgsIGRpcnR5SGVpZ2h0KQogICAgIGlm
IChhcmdzLkxlbmd0aCgpICE9IDMgJiYgYXJncy5MZW5ndGgoKSAhPSA3KSB7Ci0gICAgICAgIFY4
UHJveHk6OlNldERPTUV4Y2VwdGlvbihTWU5UQVhfRVJSKTsKKyAgICAgICAgVjhQcm94eTo6c2V0
RE9NRXhjZXB0aW9uKFNZTlRBWF9FUlIpOwogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50
ZXJjZXB0b3IoKTsKICAgICB9CiAKLSAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRl
eHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4
Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKKyAg
ICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZB
U1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBJbWFnZURhdGEqIGlt
YWdlRGF0YSA9IDA7CiAKICAgICAvLyBOZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGFyZ3VtZW50IGlz
IG9mIHRoZSBjb3JyZWN0IHR5cGUsIHNpbmNlCi0gICAgLy8gVG9OYXRpdmVPYmplY3QoKSBleHBl
Y3RzIGl0IHRvIGJlIGNvcnJlY3QuIElmIHRoZSBhcmd1bWVudCB3YXMgaW5jb3JyZWN0CisgICAg
Ly8gY29udmVydFRvTmF0aXZlT2JqZWN0KCkgZXhwZWN0cyBpdCB0byBiZSBjb3JyZWN0LiBJZiB0
aGUgYXJndW1lbnQgd2FzIGluY29ycmVjdAogICAgIC8vIHdlIGxlYXZlIGl0IG51bGwsIGFuZCBw
dXRJbWFnZURhdGEoKSB3aWxsIHRocm93IHRoZSBjb3JyZWN0IGV4Y2VwdGlvbgogICAgIC8vIChU
WVBFX01JU01BVENIX0VSUikuCi0gICAgaWYgKFY4UHJveHk6OklzV3JhcHBlck9mVHlwZShhcmdz
WzBdLCBWOENsYXNzSW5kZXg6OklNQUdFREFUQSkpCi0gICAgICAgIGltYWdlRGF0YSA9IFY4UHJv
eHk6OlRvTmF0aXZlT2JqZWN0PEltYWdlRGF0YT4oVjhDbGFzc0luZGV4OjpJTUFHRURBVEEsIGFy
Z3NbMF0pOworICAgIGlmIChWOFByb3h5Ojppc1dyYXBwZXJPZlR5cGUoYXJnc1swXSwgVjhDbGFz
c0luZGV4OjpJTUFHRURBVEEpKQorICAgICAgICBpbWFnZURhdGEgPSBWOFByb3h5Ojpjb252ZXJ0
VG9OYXRpdmVPYmplY3Q8SW1hZ2VEYXRhPihWOENsYXNzSW5kZXg6OklNQUdFREFUQSwgYXJnc1sw
XSk7CiAKICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKIApAQCAtNDE1LDcgKzQxNSw3IEBACiAg
ICAgICAgIGNvbnRleHQtPnB1dEltYWdlRGF0YShpbWFnZURhdGEsIHRvRmxvYXQoYXJnc1sxXSks
IHRvRmxvYXQoYXJnc1syXSksIGVjKTsKIAogICAgIGlmIChlYyAhPSAwKSB7Ci0gICAgICAgIFY4
UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2Vw
dGlvbihlYyk7CiAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogICAg
IH0KIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVzdEN1
c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYTUxI
dHRwUmVxdWVzdEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVzdEN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTU0LDcgKzU0LDcgQEAKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUo
eG1sSHR0cFJlcXVlc3QtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSk7CiAgICAgaWYgKHByb3h5
KQotICAgICAgICByZXR1cm4gZmluZE9ubHkgPyBwcm94eS0+RmluZE9iamVjdEV2ZW50TGlzdGVu
ZXIodmFsdWUsIGZhbHNlKSA6IHByb3h5LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVy
KHZhbHVlLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBmaW5kT25seSA/IHByb3h5LT5maW5kT2Jq
ZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2UpIDogcHJveHktPmZpbmRPckNyZWF0ZU9iamVj
dEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKTsKIAogICAgIHJldHVybiBQYXNzUmVmUHRyPEV2
ZW50TGlzdGVuZXI+KCk7CiB9CkBAIC02Miw3ICs2Miw3IEBACiBBQ0NFU1NPUl9HRVRURVIoWE1M
SHR0cFJlcXVlc3RPbmFib3J0KQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0
Lm9uYWJvcnQuX2dldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhU
VFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJl
cXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4
Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh4bWxI
dHRwUmVxdWVzdC0+b25hYm9ydCgpKSB7CiAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciog
bGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVx
dWVzdC0+b25hYm9ydCgpKTsKICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4TGlzdGVu
ZXIgPSBsaXN0ZW5lci0+Z2V0TGlzdGVuZXJPYmplY3QoKTsKQEAgLTc0LDcgKzc0LDcgQEAKIEFD
Q0VTU09SX1NFVFRFUihYTUxIdHRwUmVxdWVzdE9uYWJvcnQpCiB7CiAgICAgSU5DX1NUQVRTKCJE
T00uWE1MSHR0cFJlcXVlc3Qub25hYm9ydC5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHht
bEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4
Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBS
ZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxY
TUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIo
KSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAoeG1sSHR0cFJlcXVl
c3QtPm9uYWJvcnQoKSkgewogICAgICAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0
ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0
LT5vbmFib3J0KCkpOwpAQCAtOTYsNyArOTYsNyBAQAogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBS
ZXF1ZXN0T25lcnJvcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdC5vbmVy
cm9yLl9nZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVR
VUVTVCwgaW5mby5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0
ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNz
SW5kZXg6OlhNTEhUVFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKICAgICBpZiAoeG1sSHR0cFJl
cXVlc3QtPm9uZXJyb3IoKSkgewogICAgICAgICBSZWZQdHI8VjhPYmplY3RFdmVudExpc3RlbmVy
PiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBS
ZXF1ZXN0LT5vbmVycm9yKCkpOwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0
ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMTA4LDcgKzEwOCw3IEBA
CiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RPbmVycm9yKQogewogICAgIElOQ19TVEFU
UygiRE9NLlhNTEh0dHBSZXF1ZXN0Lm9uZXJyb3IuX3NldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0
KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0
PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxI
dHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmpl
Y3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9s
ZGVyKCkpOwogICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsKICAgICAgICAgaWYgKHhtbEh0dHBS
ZXF1ZXN0LT5vbmVycm9yKCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciog
bGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVx
dWVzdC0+b25lcnJvcigpKTsKQEAgLTEzMCw3ICsxMzAsNyBAQAogQUNDRVNTT1JfR0VUVEVSKFhN
TEh0dHBSZXF1ZXN0T25sb2FkKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0
Lm9ubG9hZC5fZ2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQ
cm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRU
UFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVx
dWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhD
bGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHhtbEh0
dHBSZXF1ZXN0LT5vbmxvYWQoKSkgewogICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxp
c3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVl
c3QtPm9ubG9hZCgpKTsKICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4TGlzdGVuZXIg
PSBsaXN0ZW5lci0+Z2V0TGlzdGVuZXJPYmplY3QoKTsKQEAgLTE0Miw3ICsxNDIsNyBAQAogQUND
RVNTT1JfU0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25sb2FkKQogewogICAgIElOQ19TVEFUUygiRE9N
LlhNTEh0dHBSZXF1ZXN0Lm9ubG9hZC5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0
dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xh
c3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1
ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxI
dHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7
CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAoeG1sSHR0cFJlcXVlc3Qt
Pm9ubG9hZCgpKSB7CiAgICAgICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVy
ID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3QtPm9u
bG9hZCgpKTsKQEAgLTE2NCw3ICsxNjQsNyBAQAogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1
ZXN0T25sb2Fkc3RhcnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3Qub25s
b2Fkc3RhcnQuX2dldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhU
VFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJl
cXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4
Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh4bWxI
dHRwUmVxdWVzdC0+b25sb2Fkc3RhcnQoKSkgewogICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVu
ZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0
cFJlcXVlc3QtPm9ubG9hZHN0YXJ0KCkpOwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4g
djhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMTc2LDcgKzE3
Niw3IEBACiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RPbmxvYWRzdGFydCkKIHsKICAg
ICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdC5vbmxvYWRzdGFydC5fc2V0Iik7Ci0gICAg
WE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8
WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVy
KCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZl
cnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVR
VUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAg
ICBpZiAoeG1sSHR0cFJlcXVlc3QtPm9ubG9hZHN0YXJ0KCkpIHsKICAgICAgICAgICAgIFY4T2Jq
ZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlz
dGVuZXIqPih4bWxIdHRwUmVxdWVzdC0+b25sb2Fkc3RhcnQoKSk7CkBAIC0xOTgsNyArMTk4LDcg
QEAKIEFDQ0VTU09SX0dFVFRFUihYTUxIdHRwUmVxdWVzdE9ucHJvZ3Jlc3MpCiB7CiAgICAgSU5D
X1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3Qub25wcm9ncmVzcy5fZ2V0Iik7Ci0gICAgWE1MSHR0
cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0
cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwor
ICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwg
aW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0LT5vbnByb2dyZXNzKCkpIHsK
ICAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4
T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0LT5vbnByb2dyZXNzKCkpOwogICAg
ICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0
ZW5lck9iamVjdCgpOwpAQCAtMjEwLDcgKzIxMCw3IEBACiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0
cFJlcXVlc3RPbnByb2dyZXNzKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0
Lm9ucHJvZ3Jlc3MuX3NldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9
IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhN
TEhUVFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0
cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+
KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh2
YWx1ZS0+SXNOdWxsKCkpIHsKICAgICAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0LT5vbnByb2dyZXNz
KCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0
aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdC0+b25wcm9ncmVz
cygpKTsKQEAgLTIzMiw3ICsyMzIsNyBAQAogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0
T25yZWFkeXN0YXRlY2hhbmdlKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0
Lm9ucmVhZHlzdGF0ZWNoYW5nZS5fZ2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBS
ZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJ
bmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0
KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRw
UmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAg
ICAgaWYgKHhtbEh0dHBSZXF1ZXN0LT5vbnJlYWR5c3RhdGVjaGFuZ2UoKSkgewogICAgICAgICBW
OE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVu
dExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3QtPm9ucmVhZHlzdGF0ZWNoYW5nZSgpKTsKICAgICAg
ICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4TGlzdGVuZXIgPSBsaXN0ZW5lci0+Z2V0TGlzdGVu
ZXJPYmplY3QoKTsKQEAgLTI0NCw3ICsyNDQsNyBAQAogQUNDRVNTT1JfU0VUVEVSKFhNTEh0dHBS
ZXF1ZXN0T25yZWFkeXN0YXRlY2hhbmdlKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBS
ZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZS5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHht
bEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4
Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBS
ZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxY
TUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIo
KSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAoeG1sSHR0cFJlcXVl
c3QtPm9ucmVhZHlzdGF0ZWNoYW5nZSgpKSB7CiAgICAgICAgICAgICBWOE9iamVjdEV2ZW50TGlz
dGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1s
SHR0cFJlcXVlc3QtPm9ucmVhZHlzdGF0ZWNoYW5nZSgpKTsKQEAgLTI2OCwxNCArMjY4LDE0IEBA
CiAgICAgLy8gRklYTUU6IFRoaXMgaXMgb25seSBuZWVkZWQgYmVjYXVzZSB3ZWJraXQgc2V0IHRo
aXMgZ2V0dGVyIGFzIGN1c3RvbS4KICAgICAvLyBTbyB3ZSBuZWVkIGEgY3VzdG9tIG1ldGhvZCB0
byBhdm9pZCBmb3JraW5nIHRoZSBJREwgZmlsZS4KICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRw
UmVxdWVzdC5yZXNwb25zZXRleHQuX2dldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRw
UmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNz
SW5kZXg6OlhNTEhUVFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVz
dCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0
cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwog
ICAgIHJldHVybiB2OFN0cmluZ09yTnVsbCh4bWxIdHRwUmVxdWVzdC0+cmVzcG9uc2VUZXh0KCkp
OwogfQogCiBDQUxMQkFDS19GVU5DX0RFQ0woWE1MSHR0cFJlcXVlc3RBZGRFdmVudExpc3RlbmVy
KQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIo
KSIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0
aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBh
cmdzLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFBy
b3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6
WE1MSFRUUFJFUVVFU1QsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgUmVmUHRyPEV2ZW50TGlzdGVu
ZXI+IGxpc3RlbmVyID0gZ2V0RXZlbnRMaXN0ZW5lcih4bWxIdHRwUmVxdWVzdCwgYXJnc1sxXSwg
ZmFsc2UpOwogICAgIGlmIChsaXN0ZW5lcikgewpAQCAtMjkxLDcgKzI5MSw3IEBACiBDQUxMQkFD
S19GVU5DX0RFQ0woWE1MSHR0cFJlcXVlc3RSZW1vdmVFdmVudExpc3RlbmVyKQogewogICAgIElO
Q19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoKSIpOwotICAg
IFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0
PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBhcmdzLkhvbGRl
cigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252
ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJF
UVVFU1QsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3Rl
bmVyID0gZ2V0RXZlbnRMaXN0ZW5lcih4bWxIdHRwUmVxdWVzdCwgYXJnc1sxXSwgdHJ1ZSk7CiAg
ICAgaWYgKGxpc3RlbmVyKSB7CkBAIC0zMTcsNyArMzE3LDcgQEAKICAgICBpZiAoYXJncy5MZW5n
dGgoKSA8IDIpCiAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCJOb3QgZW5vdWdoIGFyZ3VtZW50
cyIsIFY4UHJveHk6OlNZTlRBWF9FUlJPUik7CiAKLSAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0
cFJlcXVlc3QgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFz
c0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgYXJncy5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJlcXVl
c3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhNTEh0
dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBhcmdzLkhvbGRlcigpKTsK
IAogICAgIFN0cmluZyBtZXRob2QgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgU3Ry
aW5nIHVybHN0cmluZyA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzFdKTsKQEAgLTM3MCw3ICszNzAs
NyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFhNTEh0dHBSZXF1ZXN0U2VuZCkKIHsKICAgICBJTkNf
U1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdC5zZW5kKCkiKTsKLSAgICBYTUxIdHRwUmVxdWVzdCog
eG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4o
VjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgYXJncy5Ib2xkZXIoKSk7CisgICAgWE1MSHR0
cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0
PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBhcmdzLkhvbGRl
cigpKTsKIAogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgIGlmIChhcmdzLkxlbmd0aCgp
IDwgMSkKQEAgLTM4MCw3ICszODAsNyBAQAogICAgICAgICAvLyBGSVhNRTogdXBzdHJlYW0gaGFu
ZGxlcyAiRmlsZSIgb2JqZWN0cyB0b28uCiAgICAgICAgIGlmIChJc0RvY3VtZW50VHlwZShhcmcp
KSB7CiAgICAgICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpIYW5k
bGU8djg6Ok9iamVjdD46OkNhc3QoYXJnKTsKLSAgICAgICAgICAgIERvY3VtZW50KiBkb2N1bWVu
dCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8RG9jdW1lbnQ+KG9iamVjdCk7CisgICAgICAg
ICAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9k
ZTxEb2N1bWVudD4ob2JqZWN0KTsKICAgICAgICAgICAgIEFTU0VSVChkb2N1bWVudCk7CiAgICAg
ICAgICAgICB4bWxIdHRwUmVxdWVzdC0+c2VuZChkb2N1bWVudCwgZWMpOwogICAgICAgICB9IGVs
c2UKQEAgLTM5OCw3ICszOTgsNyBAQAogICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMikKICAgICAg
ICAgcmV0dXJuIHRocm93RXJyb3IoIk5vdCBlbm91Z2ggYXJndW1lbnRzIiwgVjhQcm94eTo6U1lO
VEFYX0VSUk9SKTsKIAotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJv
eHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBS
RVFVRVNULCBhcmdzLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVl
c3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xh
c3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGFyZ3MuSG9sZGVyKCkpOwogICAgIEV4Y2VwdGlvbkNv
ZGUgZWMgPSAwOwogICAgIFN0cmluZyBoZWFkZXIgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7
CiAgICAgU3RyaW5nIHZhbHVlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMV0pOwpAQCAtNDE0LDcg
KzQxNCw3IEBACiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAxKQogICAgICAgICByZXR1cm4gdGhy
b3dFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiLCBWOFByb3h5OjpTWU5UQVhfRVJST1IpOwog
Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGFyZ3Mu
SG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxI
VFRQUkVRVUVTVCwgYXJncy5Ib2xkZXIoKSk7CiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAg
ICAgU3RyaW5nIGhlYWRlciA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKICAgICBTdHJpbmcg
cmVzdWx0ID0geG1sSHR0cFJlcXVlc3QtPmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlciwgZWMpOwpA
QCAtNDI5LDcgKzQyOSw3IEBACiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAxKQogICAgICAgICBy
ZXR1cm4gdGhyb3dFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiLCBWOFByb3h5OjpTWU5UQVhf
RVJST1IpOwogCi0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6
VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVF
U1QsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9
IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0lu
ZGV4OjpYTUxIVFRQUkVRVUVTVCwgYXJncy5Ib2xkZXIoKSk7CiAgICAgU3RyaW5nIHZhbHVlID0g
dG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgIHhtbEh0dHBSZXF1ZXN0LT5vdmVycmlkZU1p
bWVUeXBlKHZhbHVlKTsKICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwpJbmRleDogV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhJbnNwZWN0b3JDb250cm9sbGVyQ3VzdG9tLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEluc3BlY3RvckNvbnRyb2xs
ZXJDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4SW5zcGVjdG9yQ29udHJvbGxlckN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU2
LDExICs1NiwxMSBAQAogICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMSkKICAgICAgICAgcmV0dXJu
IHY4OjpVbmRlZmluZWQoKTsKIAotICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVy
VG9Ob2RlPE5vZGU+KGFyZ3NbMF0pOworICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5Ojpjb252ZXJ0
RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKTsKICAgICBpZiAoIW5vZGUpCiAgICAgICAg
IHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNw
ZWN0b3JDb250cm9sbGVyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SW5zcGVjdG9yQ29udHJv
bGxlcj4oVjhDbGFzc0luZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVSLCBhcmdzLkhvbGRlcigpKTsK
KyAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVyID0gVjhQcm94eTo6
Y29udmVydFRvTmF0aXZlT2JqZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+KFY4Q2xhc3NJbmRleDo6
SU5TUEVDVE9SQ09OVFJPTExFUiwgYXJncy5Ib2xkZXIoKSk7CiAgICAgaW5zcGVjdG9yQ29udHJv
bGxlci0+aGlnaGxpZ2h0KG5vZGUpOwogCiAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKQEAg
LTc4LDcgKzc4LDcgQEAKIAogICAgIHVuc2lnbmVkIGlkZW50aWZpZXIgPSBhcmdzWzFdLT5JbnQz
MlZhbHVlKCk7CiAKLSAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVy
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SW5zcGVjdG9yQ29udHJvbGxlcj4oVjhDbGFzc0lu
ZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVSLCBhcmdzLkhvbGRlcigpKTsKKyAgICBJbnNwZWN0b3JD
b250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+KFY4Q2xhc3NJbmRleDo6SU5TUEVDVE9SQ09OVFJP
TExFUiwgYXJncy5Ib2xkZXIoKSk7CiAgICAgUmVmUHRyPEluc3BlY3RvclJlc291cmNlPiByZXNv
dXJjZSA9IGluc3BlY3RvckNvbnRyb2xsZXItPnJlc291cmNlcygpLmdldChpZGVudGlmaWVyKTsK
ICAgICBBU1NFUlQocmVzb3VyY2UpOwogICAgIGlmICghcmVzb3VyY2UpCkBAIC05MCw3ICs5MCw3
IEBACiAgICAgaWYgKGRvY3VtZW50LT5pc1BsdWdpbkRvY3VtZW50KCkgfHwgZG9jdW1lbnQtPmlz
SW1hZ2VEb2N1bWVudCgpIHx8IGRvY3VtZW50LT5pc01lZGlhRG9jdW1lbnQoKSkKICAgICAgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6RE9DVU1FTlQsIGRvY3VtZW50KTsKKyAgICByZXR1cm4gVjhQcm94eTo6
Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET0NVTUVOVCwgZG9jdW1lbnQpOwogfQog
CiBDQUxMQkFDS19GVU5DX0RFQ0woSW5zcGVjdG9yQ29udHJvbGxlclNlYXJjaCkKQEAgLTEwMCw3
ICsxMDAsNyBAQAogICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMikKICAgICAgICAgcmV0dXJuIHY4
OjpVbmRlZmluZWQoKTsKIAotICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPE5vZGU+KGFyZ3NbMF0pOworICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5Ojpjb252ZXJ0RE9N
V3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKTsKICAgICBpZiAoIW5vZGUpCiAgICAgICAgIHJl
dHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgICAgICBpZiAo
bmV3U3RhcnQgPT0gc3RhcnRWaXNpYmxlUG9zaXRpb24oc2VhcmNoUmFuZ2UuZ2V0KCksIERPV05T
VFJFQU0pKQogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgcmVzdWx0LT5TZXQodjg6Ok51
bWJlcjo6TmV3KGluZGV4KyspLCBWOFByb3h5OjpUb1Y4T2JqZWN0PFJhbmdlPihWOENsYXNzSW5k
ZXg6OlJBTkdFLCByZXN1bHRSYW5nZS5nZXQoKSkpOworICAgICAgICByZXN1bHQtPlNldCh2ODo6
TnVtYmVyOjpOZXcoaW5kZXgrKyksIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0PFJhbmdlPihW
OENsYXNzSW5kZXg6OlJBTkdFLCByZXN1bHRSYW5nZS5nZXQoKSkpOwogCiAgICAgICAgIHNldFN0
YXJ0KHNlYXJjaFJhbmdlLmdldCgpLCBuZXdTdGFydCk7CiAgICAgfSB3aGlsZSAodHJ1ZSk7CkBA
IC0xNDUsOCArMTQ1LDggQEAKIHsKICAgICBJTkNfU1RBVFMoIkluc3BlY3RvckNvbnRyb2xsZXIu
aW5zcGVjdGVkV2luZG93KCkiKTsKIAotICAgIEluc3BlY3RvckNvbnRyb2xsZXIqIGluc3BlY3Rv
ckNvbnRyb2xsZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxJbnNwZWN0b3JDb250cm9sbGVy
PihWOENsYXNzSW5kZXg6OklOU1BFQ1RPUkNPTlRST0xMRVIsIGFyZ3MuSG9sZGVyKCkpOwotICAg
IHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01X
SU5ET1csIGluc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RlZFBhZ2UoKS0+bWFpbkZyYW1lKCkt
PmRvbVdpbmRvdygpKTsKKyAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9s
bGVyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+
KFY4Q2xhc3NJbmRleDo6SU5TUEVDVE9SQ09OVFJPTExFUiwgYXJncy5Ib2xkZXIoKSk7CisgICAg
cmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4
OjpET01XSU5ET1csIGluc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RlZFBhZ2UoKS0+bWFpbkZy
YW1lKCktPmRvbVdpbmRvdygpKTsKIH0KIAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEluc3BlY3RvckNv
bnRyb2xsZXJTZXR0aW5nKQpAQCAtMTYwLDcgKzE2MCw3IEBACiAgICAgaWYgKGtleS5pc0VtcHR5
KCkpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICBJbnNwZWN0b3JDb250
cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SW5z
cGVjdG9yQ29udHJvbGxlcj4oVjhDbGFzc0luZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVSLCBhcmdz
LkhvbGRlcigpKTsKKyAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVy
ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+KFY4
Q2xhc3NJbmRleDo6SU5TUEVDVE9SQ09OVFJPTExFUiwgYXJncy5Ib2xkZXIoKSk7CiAgICAgY29u
c3QgSW5zcGVjdG9yQ29udHJvbGxlcjo6U2V0dGluZyYgc2V0dGluZyA9IGluc3BlY3RvckNvbnRy
b2xsZXIgLT5zZXR0aW5nKGtleSk7CiAKICAgICBzd2l0Y2ggKHNldHRpbmcudHlwZSgpKSB7CkBA
IC0yMjEsNyArMjIxLDcgQEAKICAgICB9IGVsc2UKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmlu
ZWQoKTsKIAotICAgIEluc3BlY3RvckNvbnRyb2xsZXIqIGluc3BlY3RvckNvbnRyb2xsZXIgPSBW
OFByb3h5OjpUb05hdGl2ZU9iamVjdDxJbnNwZWN0b3JDb250cm9sbGVyPihWOENsYXNzSW5kZXg6
OklOU1BFQ1RPUkNPTlRST0xMRVIsIGFyZ3MuSG9sZGVyKCkpOworICAgIEluc3BlY3RvckNvbnRy
b2xsZXIqIGluc3BlY3RvckNvbnRyb2xsZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmpl
Y3Q8SW5zcGVjdG9yQ29udHJvbGxlcj4oVjhDbGFzc0luZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVS
LCBhcmdzLkhvbGRlcigpKTsKICAgICBpbnNwZWN0b3JDb250cm9sbGVyLT5zZXRTZXR0aW5nKGtl
eSwgc2V0dGluZyk7CiAKICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwpJbmRleDogV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDU1NTdHlsZURlY2xhcmF0aW9uQ3VzdG9tLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOENTU1N0eWxlRGVjbGFyYXRp
b25DdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4Q1NTU3R5bGVEZWNsYXJhdGlvbkN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE2
MSw3ICsxNjEsNyBAQAogCiAgICAgLy8gU2VhcmNoIHRoZSBzdHlsZSBkZWNsYXJhdGlvbi4KICAg
ICBDU1NTdHlsZURlY2xhcmF0aW9uKiBpbXAgPQotICAgICAgICBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxDU1NTdHlsZURlY2xhcmF0aW9uPihWOENsYXNzSW5kZXg6OkNTU1NUWUxFREVDTEFSQVRJ
T04sIGluZm8uSG9sZGVyKCkpOworICAgICAgICBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmpl
Y3Q8Q1NTU3R5bGVEZWNsYXJhdGlvbj4oVjhDbGFzc0luZGV4OjpDU1NTVFlMRURFQ0xBUkFUSU9O
LCBpbmZvLkhvbGRlcigpKTsKICAgICBDU1NQcm9wZXJ0eUluZm8qIHByb3BJbmZvID0gY3NzUHJv
cGVydHlJbmZvKG5hbWUpOwogCiAgICAgLy8gRG8gbm90IGhhbmRsZSBub24tcHJvcGVydHkgbmFt
ZXMuCkBAIC0xOTUsNyArMTk1LDcgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5DU1NTdHlsZURl
Y2xhcmF0aW9uLk5hbWVkUHJvcGVydHlTZXR0ZXIiKTsKICAgICBDU1NTdHlsZURlY2xhcmF0aW9u
KiBpbXAgPQotICAgICAgICBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDU1NTdHlsZURlY2xhcmF0
aW9uPigKKyAgICAgICAgVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENTU1N0eWxlRGVj
bGFyYXRpb24+KAogICAgICAgICAgICAgVjhDbGFzc0luZGV4OjpDU1NTVFlMRURFQ0xBUkFUSU9O
LCBpbmZvLkhvbGRlcigpKTsKICAgICBDU1NQcm9wZXJ0eUluZm8qIHByb3BJbmZvID0gY3NzUHJv
cGVydHlJbmZvKG5hbWUpOwogICAgIGlmICghcHJvcEluZm8pCkluZGV4OiBXZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOFNWR01hdHJpeEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTVkdNYXRyaXhDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5
NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1ZHTWF0cml4Q3VzdG9tLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNDYsNyArNDYsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFNWR01h
dHJpeEludmVyc2UpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uU1ZHTWF0cml4LmludmVyc2UoKSIp
OwotICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeCA9ICpWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxWOFNWR1BPRFR5cGVXcmFwcGVyPFRyYW5zZm9ybWF0aW9uTWF0cml4PiA+KFY4Q2xhc3NJ
bmRleDo6U1ZHTUFUUklYLCBhcmdzLkhvbGRlcigpKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCBtYXRyaXggPSAqVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFY4U1ZHUE9EVHlwZVdy
YXBwZXI8VHJhbnNmb3JtYXRpb25NYXRyaXg+ID4oVjhDbGFzc0luZGV4OjpTVkdNQVRSSVgsIGFy
Z3MuSG9sZGVyKCkpOwogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgIFRyYW5zZm9ybWF0
aW9uTWF0cml4IHJlc3VsdCA9IG1hdHJpeC5pbnZlcnNlKCk7CiAKQEAgLTU0LDE3ICs1NCwxNyBA
QAogICAgICAgICBlYyA9IFNWR0V4Y2VwdGlvbjo6U1ZHX01BVFJJWF9OT1RfSU5WRVJUQUJMRTsK
IAogICAgIGlmIChlYyAhPSAwKSB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihl
Yyk7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgIHJldHVy
biB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKTsKICAgICB9CiAKLSAgICByZXR1cm4gVjhQcm94eTo6
VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNWR01BVFJJWCwgbmV3IFY4U1ZHU3RhdGljUE9EVHlw
ZVdyYXBwZXI8VHJhbnNmb3JtYXRpb25NYXRyaXg+KHJlc3VsdCkpOworICAgIHJldHVybiBWOFBy
b3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNWR01BVFJJWCwgbmV3IFY4U1ZH
U3RhdGljUE9EVHlwZVdyYXBwZXI8VHJhbnNmb3JtYXRpb25NYXRyaXg+KHJlc3VsdCkpOwogfQog
CiBDQUxMQkFDS19GVU5DX0RFQ0woU1ZHTWF0cml4Um90YXRlRnJvbVZlY3RvcikKIHsKICAgICBJ
TkNfU1RBVFMoIkRPTS5TVkdNYXRyaXgucm90YXRlRnJvbVZlY3RvcigpIik7Ci0gICAgVHJhbnNm
b3JtYXRpb25NYXRyaXggbWF0cml4ID0gKlY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFY4U1ZHUE9E
VHlwZVdyYXBwZXI8VHJhbnNmb3JtYXRpb25NYXRyaXg+ID4oVjhDbGFzc0luZGV4OjpTVkdNQVRS
SVgsIGFyZ3MuSG9sZGVyKCkpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeCA9ICpW
OFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8VjhTVkdQT0RUeXBlV3JhcHBlcjxUcmFuc2Zv
cm1hdGlvbk1hdHJpeD4gPihWOENsYXNzSW5kZXg6OlNWR01BVFJJWCwgYXJncy5Ib2xkZXIoKSk7
CiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAgZmxvYXQgeCA9IHRvRmxvYXQoYXJnc1sw
XSk7CiAgICAgZmxvYXQgeSA9IHRvRmxvYXQoYXJnc1sxXSk7CkBAIC03NCwxMSArNzQsMTEgQEAK
ICAgICAgICAgZWMgPSBTVkdFeGNlcHRpb246OlNWR19JTlZBTElEX1ZBTFVFX0VSUjsKIAogICAg
IGlmIChlYyAhPSAwKSB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7Cisg
ICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgIHJldHVybiB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4oKTsKICAgICB9CiAKLSAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9i
amVjdChWOENsYXNzSW5kZXg6OlNWR01BVFJJWCwgbmV3IFY4U1ZHU3RhdGljUE9EVHlwZVdyYXBw
ZXI8VHJhbnNmb3JtYXRpb25NYXRyaXg+KHJlc3VsdCkpOworICAgIHJldHVybiBWOFByb3h5Ojpj
b252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNWR01BVFJJWCwgbmV3IFY4U1ZHU3RhdGlj
UE9EVHlwZVdyYXBwZXI8VHJhbnNmb3JtYXRpb25NYXRyaXg+KHJlc3VsdCkpOwogfQogCiB9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEVs
ZW1lbnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4RWxlbWVudEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhFbGVtZW50Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTMsNyAr
NTMsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEVsZW1lbnRTZXRBdHRyaWJ1dGUpCiB7CiAgICAg
SU5DX1NUQVRTKCJET00uRWxlbWVudC5zZXRBdHRyaWJ1dGUoKSIpOwotICAgIEVsZW1lbnQqIGVs
ZW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEVsZW1lbnQ+KGFyZ3MuSG9sZGVyKCkp
OworICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9k
ZTxFbGVtZW50PihhcmdzLkhvbGRlcigpKTsKICAgICBTdHJpbmcgbmFtZSA9IHRvV2ViQ29yZVN0
cmluZyhhcmdzWzBdKTsKICAgICBTdHJpbmcgdmFsdWUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1sx
XSk7CiAKQEAgLTc0LDggKzc0LDggQEAKICAgICBpZiAoIVY4QXR0cjo6SGFzSW5zdGFuY2UoYXJn
c1swXSkpCiAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKFRZUEVfTUlTTUFUQ0hfRVJSKTsKIAot
ICAgIEF0dHIqIG5ld0F0dHIgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEF0dHI+KGFyZ3Nb
MF0pOwotICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEVs
ZW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOworICAgIEF0dHIqIG5ld0F0dHIgPSBWOFByb3h5Ojpjb252
ZXJ0RE9NV3JhcHBlclRvTm9kZTxBdHRyPihhcmdzWzBdKTsKKyAgICBFbGVtZW50KiBlbGVtZW50
ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8RWxlbWVudD4oYXJncy5Ib2xkZXIo
KSk7CiAKICAgICBpZiAoIWFsbG93U2V0dGluZ1NyY1RvSmF2YXNjcmlwdFVSTChlbGVtZW50LCBu
ZXdBdHRyLT5uYW1lKCksIG5ld0F0dHItPnZhbHVlKCkpKQogICAgICAgICByZXR1cm4gdjg6OlVu
ZGVmaW5lZCgpOwpAQCAtODUsMTMgKzg1LDEzIEBACiAgICAgaWYgKGVjKQogICAgICAgICB0aHJv
d0Vycm9yKGVjKTsKIAotICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChyZXN1bHQu
Z2V0KCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QocmVzdWx0
LmdldCgpKTsKIH0KIAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEVsZW1lbnRTZXRBdHRyaWJ1dGVOUykK
IHsKICAgICBJTkNfU1RBVFMoIkRPTS5FbGVtZW50LnNldEF0dHJpYnV0ZU5TKCkiKTsKLSAgICBF
bGVtZW50KiBlbGVtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxFbGVtZW50Pihhcmdz
LkhvbGRlcigpKTsKKyAgICBFbGVtZW50KiBlbGVtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdy
YXBwZXJUb05vZGU8RWxlbWVudD4oYXJncy5Ib2xkZXIoKSk7CiAgICAgU3RyaW5nIG5hbWVzcGFj
ZVVSSSA9IHRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsQ2hlY2soYXJnc1swXSk7CiAgICAgU3RyaW5n
IHF1YWxpZmllZE5hbWUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1sxXSk7CiAgICAgU3RyaW5nIHZh
bHVlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMl0pOwpAQCAtMTEzLDggKzExMyw4IEBACiAgICAg
aWYgKCFWOEF0dHI6Okhhc0luc3RhbmNlKGFyZ3NbMF0pKQogICAgICAgICByZXR1cm4gdGhyb3dF
cnJvcihUWVBFX01JU01BVENIX0VSUik7CiAKLSAgICBBdHRyKiBuZXdBdHRyID0gVjhQcm94eTo6
RE9NV3JhcHBlclRvTm9kZTxBdHRyPihhcmdzWzBdKTsKLSAgICBFbGVtZW50KiBlbGVtZW50ID0g
VjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxFbGVtZW50PihhcmdzLkhvbGRlcigpKTsKKyAgICBB
dHRyKiBuZXdBdHRyID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8QXR0cj4oYXJn
c1swXSk7CisgICAgRWxlbWVudCogZWxlbWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVy
VG9Ob2RlPEVsZW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgaWYgKCFhbGxvd1NldHRpbmdT
cmNUb0phdmFzY3JpcHRVUkwoZWxlbWVudCwgbmV3QXR0ci0+bmFtZSgpLCBuZXdBdHRyLT52YWx1
ZSgpKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKQEAgLTEyNCw3ICsxMjQsNyBA
QAogICAgIGlmIChlYykKICAgICAgICAgdGhyb3dFcnJvcihlYyk7CiAKLSAgICByZXR1cm4gVjhQ
cm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6
Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUg
U3RyaW5nIHRvRXZlbnRUeXBlKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiB2YWx1ZSkKQEAgLTEzNiw3
ICsxMzYsNyBAQAogCiBBQ0NFU1NPUl9TRVRURVIoRWxlbWVudEV2ZW50SGFuZGxlcikKIHsKLSAg
ICBOb2RlKiBub2RlID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxOb2RlPihpbmZvLkhvbGRl
cigpKTsKKyAgICBOb2RlKiBub2RlID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8
Tm9kZT4oaW5mby5Ib2xkZXIoKSk7CiAKICAgICBTdHJpbmcgZXZlbnRUeXBlID0gdG9FdmVudFR5
cGUobmFtZSk7CiAKQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgICAgICBpZiAoIXByb3h5KQogICAg
ICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIGlmIChSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlz
dGVuZXIgPSBwcm94eS0+RmluZE9yQ3JlYXRlVjhFdmVudExpc3RlbmVyKHZhbHVlLCB0cnVlKSkK
KyAgICAgICAgaWYgKFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5k
T3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIodmFsdWUsIHRydWUpKQogICAgICAgICAgICAgbm9kZS0+
c2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKICAgICB9IGVs
c2UKICAgICAgICAgbm9kZS0+Y2xlYXJBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSk7
CkBAIC0xNTksMTAgKzE1OSwxMCBAQAogCiBBQ0NFU1NPUl9HRVRURVIoRWxlbWVudEV2ZW50SGFu
ZGxlcikKIHsKLSAgICBOb2RlKiBub2RlID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxOb2Rl
PihpbmZvLkhvbGRlcigpKTsKKyAgICBOb2RlKiBub2RlID0gVjhQcm94eTo6Y29udmVydERPTVdy
YXBwZXJUb05vZGU8Tm9kZT4oaW5mby5Ib2xkZXIoKSk7CiAKICAgICBFdmVudExpc3RlbmVyKiBs
aXN0ZW5lciA9IG5vZGUtPmdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIodG9FdmVudFR5cGUobmFt
ZSkpOwotICAgIHJldHVybiBWOFByb3h5OjpFdmVudExpc3RlbmVyVG9WOE9iamVjdChsaXN0ZW5l
cik7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRFdmVudExpc3RlbmVyVG9WOE9iamVjdChs
aXN0ZW5lcik7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTFNlbGVjdEVsZW1lbnRDb2xsZWN0aW9uQ3VzdG9tLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxTZWxlY3RFbGVt
ZW50Q29sbGVjdGlvbkN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhIVE1MU2VsZWN0RWxlbWVudENvbGxlY3Rpb25DdXN0b20uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC00Myw3ICs0Myw3IEBACiBOQU1FRF9QUk9QRVJUWV9HRVRURVIoSFRN
TFNlbGVjdEVsZW1lbnRDb2xsZWN0aW9uKQogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxTZWxl
Y3RFbGVtZW50Q29sbGVjdGlvbi5OYW1lZFByb3BlcnR5U2V0dGVyIik7Ci0gICAgSFRNTFNlbGVj
dEVsZW1lbnQqIHNlbGVjdCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTFNlbGVjdEVs
ZW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSBW
OFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MU2VsZWN0RWxlbWVudD4oaW5mby5I
b2xkZXIoKSk7CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlID0gaW5mby5Ib2xkZXIo
KS0+R2V0UmVhbE5hbWVkUHJvcGVydHlJblByb3RvdHlwZUNoYWluKG5hbWUpOwogCiAgICAgaWYg
KCF2YWx1ZS5Jc0VtcHR5KCkpCkBAIC02MiwxNiArNjIsMTYgQEAKICAgICAgICAgcmV0dXJuIG5v
dEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAKICAgICBpZiAoaXRlbXMuc2l6ZSgpID09IDEpCi0g
ICAgICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChpdGVtcy5hdCgwKS5nZXQoKSk7
CisgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QoaXRlbXMuYXQo
MCkuZ2V0KCkpOwogCiAgICAgTm9kZUxpc3QqIGxpc3QgPSBuZXcgVjhOYW1lZE5vZGVzQ29sbGVj
dGlvbihpdGVtcyk7Ci0gICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4
OjpOT0RFTElTVCwgbGlzdCk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6Tk9ERUxJU1QsIGxpc3QpOwogfQogCiBJTkRFWEVEX1BST1BFUlRZX1NF
VFRFUihIVE1MU2VsZWN0RWxlbWVudENvbGxlY3Rpb24pCiB7CiAgICAgSU5DX1NUQVRTKCJET00u
SFRNTFNlbGVjdEVsZW1lbnRDb2xsZWN0aW9uLkluZGV4ZWRQcm9wZXJ0eVNldHRlciIpOwotICAg
IEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhU
TUxTZWxlY3RFbGVtZW50PihpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVudCog
c2VsZWN0ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTFNlbGVjdEVsZW1l
bnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIHJldHVybiB0b09wdGlvbnNDb2xsZWN0aW9uU2V0dGVy
KGluZGV4LCB2YWx1ZSwgc2VsZWN0KTsKIH0KIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhIVE1MT3B0aW9uc0NvbGxlY3Rpb25DdXN0b20uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTE9wdGlvbnNDb2xsZWN0aW9uQ3VzdG9tLmNw
cAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxP
cHRpb25zQ29sbGVjdGlvbkN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ2LDcgKzQ2LDcg
QEAKIENBTExCQUNLX0ZVTkNfREVDTChIVE1MT3B0aW9uc0NvbGxlY3Rpb25SZW1vdmUpCiB7CiAg
ICAgSU5DX1NUQVRTKCJET00uSFRNTE9wdGlvbnNDb2xsZWN0aW9uLnJlbW92ZSgpIik7Ci0gICAg
SFRNTE9wdGlvbnNDb2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIVE1M
T3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBh
cmdzLkhvbGRlcigpKTsKKyAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb24qIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRl
eDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBhcmdzLkhvbGRlcigpKTsKICAgICBIVE1MU2VsZWN0
RWxlbWVudCogYmFzZSA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4oaW1wLT5iYXNl
KCkpOwogICAgIHJldHVybiByZW1vdmVFbGVtZW50KGJhc2UsIGFyZ3MpOwogfQpAQCAtNTUsMTEg
KzU1LDExIEBACiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTE9wdGlvbnNDb2xsZWN0aW9uLmFk
ZCgpIik7CiAgICAgaWYgKCFWOEhUTUxPcHRpb25FbGVtZW50OjpIYXNJbnN0YW5jZShhcmdzWzBd
KSkgewotICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oVFlQRV9NSVNNQVRDSF9FUlIp
OworICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oVFlQRV9NSVNNQVRDSF9FUlIpOwog
ICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgIH0KLSAgICBIVE1MT3B0aW9uc0Nv
bGxlY3Rpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PEhUTUxPcHRpb25zQ29sbGVj
dGlvbj4oVjhDbGFzc0luZGV4OjpIVE1MT1BUSU9OU0NPTExFQ1RJT04sIGFyZ3MuSG9sZGVyKCkp
OwotICAgIEhUTUxPcHRpb25FbGVtZW50KiBvcHRpb24gPSBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPEhUTUxPcHRpb25FbGVtZW50PihhcmdzWzBdKTsKKyAgICBIVE1MT3B0aW9uc0NvbGxlY3Rp
b24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxl
Y3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBhcmdzLkhvbGRlcigp
KTsKKyAgICBIVE1MT3B0aW9uRWxlbWVudCogb3B0aW9uID0gVjhQcm94eTo6Y29udmVydERPTVdy
YXBwZXJUb05vZGU8SFRNTE9wdGlvbkVsZW1lbnQ+KGFyZ3NbMF0pOwogCiAgICAgRXhjZXB0aW9u
Q29kZSBlYyA9IDA7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAyKQpAQCAtNzksNyArNzksNyBA
QAogICAgIH0KIAogICAgIGlmIChlYyAhPSAwKQotICAgICAgICBWOFByb3h5OjpTZXRET01FeGNl
cHRpb24oZWMpOworICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogCiAgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIH0KQEAgLTg3LDcgKzg3LDcgQEAKIEFDQ0VTU09SX0dF
VFRFUihIVE1MT3B0aW9uc0NvbGxlY3Rpb25MZW5ndGgpCiB7CiAgICAgSU5DX1NUQVRTKCJET00u
SFRNTE9wdGlvbnNDb2xsZWN0aW9uLmxlbmd0aC5fZ2V0Iik7Ci0gICAgSFRNTE9wdGlvbnNDb2xs
ZWN0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxlY3Rp
b24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBpbmZvLkhvbGRlcigpKTsK
KyAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2
ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlND
T0xMRUNUSU9OLCBpbmZvLkhvbGRlcigpKTsKICAgICBpbnQgdiA9IGltcC0+bGVuZ3RoKCk7CiAg
ICAgcmV0dXJuIHY4OjpJbnRlZ2VyOjpOZXcodik7CiB9CkBAIC05NSw3ICs5NSw3IEBACiBBQ0NF
U1NPUl9TRVRURVIoSFRNTE9wdGlvbnNDb2xsZWN0aW9uTGVuZ3RoKQogewogICAgIElOQ19TVEFU
UygiRE9NLkhUTUxPcHRpb25zQ29sbGVjdGlvbi5sZW5ndGguX3NldCIpOwotICAgIEhUTUxPcHRp
b25zQ29sbGVjdGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SFRNTE9wdGlvbnND
b2xsZWN0aW9uPihWOENsYXNzSW5kZXg6OkhUTUxPUFRJT05TQ09MTEVDVElPTiwgaW5mby5Ib2xk
ZXIoKSk7CisgICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0
VG9OYXRpdmVPYmplY3Q8SFRNTE9wdGlvbnNDb2xsZWN0aW9uPihWOENsYXNzSW5kZXg6OkhUTUxP
UFRJT05TQ09MTEVDVElPTiwgaW5mby5Ib2xkZXIoKSk7CiAgICAgZG91YmxlIHYgPSB2YWx1ZS0+
TnVtYmVyVmFsdWUoKTsKICAgICB1bnNpZ25lZCBuZXdMZW5ndGggPSAwOwogICAgIEV4Y2VwdGlv
bkNvZGUgZWMgPSAwOwpAQCAtMTEwLDI1ICsxMTAsMjUgQEAKICAgICBpZiAoIWVjKQogICAgICAg
ICBpbXAtPnNldExlbmd0aCh2YWx1ZS0+VWludDMyVmFsdWUoKSwgZWMpOwogCi0gICAgVjhQcm94
eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMp
OwogfQogCiBJTkRFWEVEX1BST1BFUlRZX0dFVFRFUihIVE1MT3B0aW9uc0NvbGxlY3Rpb24pCiB7
CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTE9wdGlvbnNDb2xsZWN0aW9uLkluZGV4ZWRQcm9wZXJ0
eUdldHRlciIpOwotICAgIEhUTUxPcHRpb25zQ29sbGVjdGlvbiogY29sbGVjdGlvbiA9IFY4UHJv
eHk6OlRvTmF0aXZlT2JqZWN0PEhUTUxPcHRpb25zQ29sbGVjdGlvbj4oVjhDbGFzc0luZGV4OjpI
VE1MT1BUSU9OU0NPTExFQ1RJT04sIGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxPcHRpb25zQ29s
bGVjdGlvbiogY29sbGVjdGlvbiA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1M
T3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBp
bmZvLkhvbGRlcigpKTsKIAogICAgIFJlZlB0cjxOb2RlPiByZXN1bHQgPSBjb2xsZWN0aW9uLT5p
dGVtKGluZGV4KTsKICAgICBpZiAoIXJlc3VsdCkKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRC
eUludGVyY2VwdG9yKCk7CiAKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVz
dWx0LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJl
c3VsdC5nZXQoKSk7CiB9CiAKIElOREVYRURfUFJPUEVSVFlfU0VUVEVSKEhUTUxPcHRpb25zQ29s
bGVjdGlvbikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MT3B0aW9uc0NvbGxlY3Rpb24uSW5k
ZXhlZFByb3BlcnR5U2V0dGVyIik7Ci0gICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uKiBjb2xsZWN0
aW9uID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SFRNTE9wdGlvbnNDb2xsZWN0aW9uPihWOENs
YXNzSW5kZXg6OkhUTUxPUFRJT05TQ09MTEVDVElPTiwgaW5mby5Ib2xkZXIoKSk7CisgICAgSFRN
TE9wdGlvbnNDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PEhUTUxPcHRpb25zQ29sbGVjdGlvbj4oVjhDbGFzc0luZGV4OjpIVE1MT1BUSU9OU0NP
TExFQ1RJT04sIGluZm8uSG9sZGVyKCkpOwogICAgIEhUTUxTZWxlY3RFbGVtZW50KiBiYXNlID0g
c3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihjb2xsZWN0aW9uLT5iYXNlKCkpOwogICAg
IHJldHVybiB0b09wdGlvbnNDb2xsZWN0aW9uU2V0dGVyKGluZGV4LCB2YWx1ZSwgYmFzZSk7CiB9
CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOENsaXBib2FyZEN1c3RvbS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDbGlwYm9hcmRDdXN0
b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
Q2xpcGJvYXJkQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDcsNyArNDcsNyBAQAogQUND
RVNTT1JfR0VUVEVSKENsaXBib2FyZFR5cGVzKQogewogICAgIElOQ19TVEFUUygiRE9NLkNsaXBi
b2FyZC50eXBlcygpIik7Ci0gICAgQ2xpcGJvYXJkKiBjbGlwYm9hcmQgPSBWOFByb3h5OjpUb05h
dGl2ZU9iamVjdDxDbGlwYm9hcmQ+KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBpbmZvLkhvbGRl
cigpKTsKKyAgICBDbGlwYm9hcmQqIGNsaXBib2FyZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2
ZU9iamVjdDxDbGlwYm9hcmQ+KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBpbmZvLkhvbGRlcigp
KTsKIAogICAgIEhhc2hTZXQ8U3RyaW5nPiB0eXBlcyA9IGNsaXBib2FyZC0+dHlwZXMoKTsKICAg
ICBpZiAodHlwZXMuaXNFbXB0eSgpKQpAQCAtNjUsNyArNjUsNyBAQAogQ0FMTEJBQ0tfRlVOQ19E
RUNMKENsaXBib2FyZENsZWFyRGF0YSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5DbGlwYm9hcmQu
Y2xlYXJEYXRhKCkiKTsKLSAgICBDbGlwYm9hcmQqIGNsaXBib2FyZCA9IFY4UHJveHk6OlRvTmF0
aXZlT2JqZWN0PENsaXBib2FyZD4oVjhDbGFzc0luZGV4OjpDTElQQk9BUkQsIGFyZ3MuSG9sZGVy
KCkpOworICAgIENsaXBib2FyZCogY2xpcGJvYXJkID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PENsaXBib2FyZD4oVjhDbGFzc0luZGV4OjpDTElQQk9BUkQsIGFyZ3MuSG9sZGVyKCkp
OwogCiAgICAgaWYgKCFhcmdzLkxlbmd0aCgpKSB7CiAgICAgICAgIGNsaXBib2FyZC0+Y2xlYXJB
bGxEYXRhKCk7CkBAIC04Myw3ICs4Myw3IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woQ2xpcGJvYXJk
R2V0RGF0YSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5DbGlwYm9hcmQuZ2V0RGF0YSgpIik7Ci0g
ICAgQ2xpcGJvYXJkKiBjbGlwYm9hcmQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDbGlwYm9h
cmQ+KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBhcmdzLkhvbGRlcigpKTsKKyAgICBDbGlwYm9h
cmQqIGNsaXBib2FyZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDbGlwYm9hcmQ+
KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBhcmdzLkhvbGRlcigpKTsKIAogICAgIGlmIChhcmdz
Lkxlbmd0aCgpICE9IDEpCiAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCJnZXREYXRhOiBJbnZh
bGlkIG51bWJlciBvZiBhcmd1bWVudHMiLCBWOFByb3h5OjpTWU5UQVhfRVJST1IpOwpAQCAtOTks
NyArOTksNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKENsaXBib2FyZFNldERhdGEpCiB7CiAgICAg
SU5DX1NUQVRTKCJET00uQ2xpcGJvYXJkLnNldERhdGEoKSIpOwotICAgIENsaXBib2FyZCogY2xp
cGJvYXJkID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2xpcGJvYXJkPihWOENsYXNzSW5kZXg6
OkNMSVBCT0FSRCwgYXJncy5Ib2xkZXIoKSk7CisgICAgQ2xpcGJvYXJkKiBjbGlwYm9hcmQgPSBW
OFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2xpcGJvYXJkPihWOENsYXNzSW5kZXg6OkNM
SVBCT0FSRCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBpZiAoYXJncy5MZW5ndGgoKSAhPSAyKQog
ICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigic2V0RGF0YTogSW52YWxpZCBudW1iZXIgb2YgYXJn
dW1lbnRzIiwgVjhQcm94eTo6U1lOVEFYX0VSUk9SKTsKQEAgLTExMiw3ICsxMTIsNyBAQAogQ0FM
TEJBQ0tfRlVOQ19ERUNMKENsaXBib2FyZFNldERyYWdJbWFnZSkKIHsKICAgICBJTkNfU1RBVFMo
IkRPTS5DbGlwYm9hcmQuc2V0RHJhZ0ltYWdlKCkiKTsKLSAgICBDbGlwYm9hcmQqIGNsaXBib2Fy
ZCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENsaXBib2FyZD4oVjhDbGFzc0luZGV4OjpDTElQ
Qk9BUkQsIGFyZ3MuSG9sZGVyKCkpOworICAgIENsaXBib2FyZCogY2xpcGJvYXJkID0gVjhQcm94
eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENsaXBib2FyZD4oVjhDbGFzc0luZGV4OjpDTElQQk9B
UkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgaWYgKCFjbGlwYm9hcmQtPmlzRm9yRHJhZ2dpbmco
KSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKQEAgLTEyNSw3ICsxMjUsNyBAQAog
CiAgICAgTm9kZSogbm9kZSA9IDA7CiAgICAgaWYgKFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1sw
XSkpCi0gICAgICAgIG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3Nb
MF0pOworICAgICAgICBub2RlID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9k
ZT4oYXJnc1swXSk7CiAKICAgICBpZiAoIW5vZGUgfHwgIW5vZGUtPmlzRWxlbWVudE5vZGUoKSkK
ICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoInNldERyYWdJbWFnZUZyb21FbGVtZW50OiBJbnZh
bGlkIGZpcnN0IGFyZ3VtZW50Iik7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OEhUTUxGcmFtZVNldEVsZW1lbnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTEZyYW1lU2V0RWxlbWVudEN1c3RvbS5jcHAJKHJldmlzaW9u
IDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MRnJhbWVTZXRFbGVt
ZW50Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDcsMTQgKzQ3LDE0IEBACiBOQU1FRF9Q
Uk9QRVJUWV9HRVRURVIoSFRNTEZyYW1lU2V0RWxlbWVudCkKIHsKICAgICBJTkNfU1RBVFMoIkRP
TS5IVE1MRnJhbWVTZXRFbGVtZW50Lk5hbWVkUHJvcGVydHlHZXR0ZXIiKTsKLSAgICBIVE1MRnJh
bWVTZXRFbGVtZW50KiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxGcmFtZVNl
dEVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxGcmFtZVNldEVsZW1lbnQqIGltcCA9
IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxGcmFtZVNldEVsZW1lbnQ+KGlu
Zm8uSG9sZGVyKCkpOwogICAgIE5vZGUqIGZyYW1lTm9kZSA9IGltcC0+Y2hpbGRyZW4oKS0+bmFt
ZWRJdGVtKHY4U3RyaW5nVG9BdG9taWNXZWJDb3JlU3RyaW5nKG5hbWUpKTsKICAgICBpZiAoZnJh
bWVOb2RlICYmIGZyYW1lTm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmZyYW1lVGFnKSkgewog
ICAgICAgICBEb2N1bWVudCogZG9jID0gc3RhdGljX2Nhc3Q8SFRNTEZyYW1lRWxlbWVudCo+KGZy
YW1lTm9kZSktPmNvbnRlbnREb2N1bWVudCgpOwogICAgICAgICBpZiAoIWRvYykKICAgICAgICAg
ICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBk
b2MtPmZyYW1lKCkpCi0gICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENs
YXNzSW5kZXg6OkRPTVdJTkRPVywgZnJhbWUtPmRvbVdpbmRvdygpKTsKKyAgICAgICAgICAgIHJl
dHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywg
ZnJhbWUtPmRvbVdpbmRvdygpKTsKICAgICB9CiAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVy
Y2VwdG9yKCk7CiB9CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERvY3VtZW50
TG9jYXRpb25DdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4RG9jdW1lbnRMb2NhdGlvbkN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhEb2N1bWVudExvY2F0aW9uQ3VzdG9tLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMzQsMTcgKzM0LDE3IEBACiAKIEFDQ0VTU09SX0dFVFRFUihEb2N1bWVu
dExvY2F0aW9uKQogewotICAgIERvY3VtZW50KiBkb2N1bWVudCA9IFY4UHJveHk6OkRPTVdyYXBw
ZXJUb05hdGl2ZTxEb2N1bWVudD4oaW5mby5Ib2xkZXIoKSk7CisgICAgRG9jdW1lbnQqIGRvY3Vt
ZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxEb2N1bWVudD4oaW5mby5I
b2xkZXIoKSk7CiAgICAgaWYgKCFkb2N1bWVudC0+ZnJhbWUoKSkKICAgICAgICAgcmV0dXJuIHY4
OjpOdWxsKCk7CiAKICAgICBET01XaW5kb3cqIHdpbmRvdyA9IGRvY3VtZW50LT5mcmFtZSgpLT5k
b21XaW5kb3coKTsKLSAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6
OkxPQ0FUSU9OLCB3aW5kb3ctPmxvY2F0aW9uKCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252
ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCB3aW5kb3ctPmxvY2F0aW9uKCkp
OwogfQogCiBBQ0NFU1NPUl9TRVRURVIoRG9jdW1lbnRMb2NhdGlvbikKIHsKLSAgICBEb2N1bWVu
dCogZG9jdW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8RG9jdW1lbnQ+KGluZm8u
SG9sZGVyKCkpOworICAgIERvY3VtZW50KiBkb2N1bWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01X
cmFwcGVyVG9OYXRpdmU8RG9jdW1lbnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIGlmICghZG9jdW1l
bnQtPmZyYW1lKCkpCiAgICAgICAgIHJldHVybjsKIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhMb2NhdGlvbkN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhMb2NhdGlvbkN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysg
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhMb2NhdGlvbkN1c3RvbS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTYyLDcgKzYyLDcgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5o
YXNoLl9zZXQiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9s
ZGVyKCk7Ci0gICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExvY2F0
aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOworICAgIExvY2F0aW9uKiBpbXAg
PSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6
TE9DQVRJT04sIGhvbGRlcik7CiAgICAgU3RyaW5nIGhhc2ggPSB0b1dlYkNvcmVTdHJpbmcodmFs
dWUpOwogCiAgICAgRnJhbWUqIGZyYW1lID0gaW1wLT5mcmFtZSgpOwpAQCAtODUsNyArODUsNyBA
QAogewogICAgIElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLmhvc3QuX3NldCIpOwogICAgIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gaW5mby5Ib2xkZXIoKTsKLSAgICBMb2NhdGlvbiog
aW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9D
QVRJT04sIGhvbGRlcik7CisgICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKICAg
ICBTdHJpbmcgaG9zdCA9IHRvV2ViQ29yZVN0cmluZyh2YWx1ZSk7CiAKICAgICBGcmFtZSogZnJh
bWUgPSBpbXAtPmZyYW1lKCk7CkBAIC0xMDUsNyArMTA1LDcgQEAKIHsKICAgICBJTkNfU1RBVFMo
IkRPTS5Mb2NhdGlvbi5ob3N0bmFtZS5fc2V0Iik7CiAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0
PiBob2xkZXIgPSBpbmZvLkhvbGRlcigpOwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpU
b05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsK
KyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExvY2F0
aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwogICAgIFN0cmluZyBob3N0bmFt
ZSA9IHRvV2ViQ29yZVN0cmluZyh2YWx1ZSk7CiAKICAgICBGcmFtZSogZnJhbWUgPSBpbXAtPmZy
YW1lKCk7CkBAIC0xMjIsNyArMTIyLDcgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlv
bi5ocmVmLl9zZXQiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8u
SG9sZGVyKCk7Ci0gICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExv
Y2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOworICAgIExvY2F0aW9uKiBp
bXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRl
eDo6TE9DQVRJT04sIGhvbGRlcik7CiAKICAgICBGcmFtZSogZnJhbWUgPSBpbXAtPmZyYW1lKCk7
CiAgICAgaWYgKCFmcmFtZSkKQEAgLTE0Miw3ICsxNDIsNyBAQAogewogICAgIElOQ19TVEFUUygi
RE9NLkxvY2F0aW9uLnBhdGhuYW1lLl9zZXQiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+
IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0gICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRv
TmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwor
ICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRp
b24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvbGRlcik7CiAgICAgU3RyaW5nIHBhdGhuYW1l
ID0gdG9XZWJDb3JlU3RyaW5nKHZhbHVlKTsKIAogICAgIEZyYW1lKiBmcmFtZSA9IGltcC0+ZnJh
bWUoKTsKQEAgLTE1OSw3ICsxNTksNyBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkxvY2F0aW9u
LnBvcnQuX3NldCIpOwogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gaW5mby5I
b2xkZXIoKTsKLSAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TG9j
YXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvbGRlcik7CisgICAgTG9jYXRpb24qIGlt
cCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4
OjpMT0NBVElPTiwgaG9sZGVyKTsKICAgICBTdHJpbmcgcG9ydCA9IHRvV2ViQ29yZVN0cmluZyh2
YWx1ZSk7CiAKICAgICBGcmFtZSogZnJhbWUgPSBpbXAtPmZyYW1lKCk7CkBAIC0xNzYsNyArMTc2
LDcgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5wcm90b2NvbC5fc2V0Iik7CiAg
ICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBpbmZvLkhvbGRlcigpOwotICAgIExv
Y2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0lu
ZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29u
dmVydFRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xk
ZXIpOwogICAgIFN0cmluZyBwcm90b2NvbCA9IHRvV2ViQ29yZVN0cmluZyh2YWx1ZSk7CiAKICAg
ICBGcmFtZSogZnJhbWUgPSBpbXAtPmZyYW1lKCk7CkBAIC0xOTMsNyArMTkzLDcgQEAKIHsKICAg
ICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5zZWFyY2guX3NldCIpOwogICAgIHY4OjpIYW5kbGU8
djg6Ok9iamVjdD4gaG9sZGVyID0gaW5mby5Ib2xkZXIoKTsKLSAgICBMb2NhdGlvbiogaW1wID0g
VjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04s
IGhvbGRlcik7CisgICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKICAgICBTdHJp
bmcgcXVlcnkgPSB0b1dlYkNvcmVTdHJpbmcodmFsdWUpOwogCiAgICAgRnJhbWUqIGZyYW1lID0g
aW1wLT5mcmFtZSgpOwpAQCAtMjEwLDE0ICsyMTAsMTQgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRP
TS5Mb2NhdGlvbi5yZWxvYWQuX2dldCIpOwogICAgIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6
RnVuY3Rpb25UZW1wbGF0ZT4gcHJpdmF0ZVRlbXBsYXRlID0gdjg6OlBlcnNpc3RlbnQ8djg6OkZ1
bmN0aW9uVGVtcGxhdGU+OjpOZXcodjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyh2OExvY2F0aW9u
UmVsb2FkQ2FsbGJhY2ssIHY4OjpIYW5kbGU8djg6OlZhbHVlPigpLCB2ODo6U2lnbmF0dXJlOjpO
ZXcoVjhMb2NhdGlvbjo6R2V0UmF3VGVtcGxhdGUoKSkpKTsKLSAgICB2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpM
T0NBVElPTiwgaW5mby5UaGlzKCkpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVy
ID0gVjhQcm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBpbmZv
LlRoaXMoKSk7CiAgICAgaWYgKGhvbGRlci5Jc0VtcHR5KCkpIHsKICAgICAgICAgLy8gY2FuIG9u
bHkgcmVhY2ggaGVyZSBieSAnb2JqZWN0Ll9fcHJvdG9fXy5mdW5jJywgYW5kIGl0IHNob3VsZCBw
YXNzZWQKICAgICAgICAgLy8gZG9tYWluIHNlY3VyaXR5IGNoZWNrIGFscmVhZHkKICAgICAgICAg
cmV0dXJuIHByaXZhdGVUZW1wbGF0ZS0+R2V0RnVuY3Rpb24oKTsKICAgICB9Ci0gICAgTG9jYXRp
b24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6
OkxPQ0FUSU9OLCBob2xkZXIpOwotICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1w
LT5mcmFtZSgpLCBmYWxzZSkpIHsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVy
dFRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIp
OworICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCBmYWxzZSkp
IHsKICAgICAgICAgc3RhdGljIHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBz
aGFyZWRUZW1wbGF0ZSA9IHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3
KHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcodjhMb2NhdGlvblJlbG9hZENhbGxiYWNrLCB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4oKSwgdjg6OlNpZ25hdHVyZTo6TmV3KFY4TG9jYXRpb246OkdldFJh
d1RlbXBsYXRlKCkpKSk7CiAgICAgICAgIHJldHVybiBzaGFyZWRUZW1wbGF0ZS0+R2V0RnVuY3Rp
b24oKTsKICAgICB9IGVsc2UKQEAgLTIyOCwxNCArMjI4LDE0IEBACiB7CiAgICAgSU5DX1NUQVRT
KCJET00uTG9jYXRpb24ucmVwbGFjZS5fZ2V0Iik7CiAgICAgc3RhdGljIHY4OjpQZXJzaXN0ZW50
PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBwcml2YXRlVGVtcGxhdGUgPSB2ODo6UGVyc2lzdGVudDx2
ODo6RnVuY3Rpb25UZW1wbGF0ZT46Ok5ldyh2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KHY4TG9j
YXRpb25SZXBsYWNlQ2FsbGJhY2ssIHY4OjpIYW5kbGU8djg6OlZhbHVlPigpLCB2ODo6U2lnbmF0
dXJlOjpOZXcoVjhMb2NhdGlvbjo6R2V0UmF3VGVtcGxhdGUoKSkpKTsKLSAgICB2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0lu
ZGV4OjpMT0NBVElPTiwgaW5mby5UaGlzKCkpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
aG9sZGVyID0gVjhQcm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkxPQ0FUSU9O
LCBpbmZvLlRoaXMoKSk7CiAgICAgaWYgKGhvbGRlci5Jc0VtcHR5KCkpIHsKICAgICAgICAgLy8g
Y2FuIG9ubHkgcmVhY2ggaGVyZSBieSAnb2JqZWN0Ll9fcHJvdG9fXy5mdW5jJywgYW5kIGl0IHNo
b3VsZCBwYXNzZWQKICAgICAgICAgLy8gZG9tYWluIHNlY3VyaXR5IGNoZWNrIGFscmVhZHkKICAg
ICAgICAgcmV0dXJuIHByaXZhdGVUZW1wbGF0ZS0+R2V0RnVuY3Rpb24oKTsKICAgICB9Ci0gICAg
TG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNz
SW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwotICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNzRnJh
bWUoaW1wLT5mcmFtZSgpLCBmYWxzZSkpIHsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6
Y29udmVydFRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBo
b2xkZXIpOworICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCBm
YWxzZSkpIHsKICAgICAgICAgc3RhdGljIHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBs
YXRlPiBzaGFyZWRUZW1wbGF0ZSA9IHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRl
Pjo6TmV3KHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcodjhMb2NhdGlvblJlcGxhY2VDYWxsYmFj
aywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCksIHY4OjpTaWduYXR1cmU6Ok5ldyhWOExvY2F0aW9u
OjpHZXRSYXdUZW1wbGF0ZSgpKSkpOwogICAgICAgICByZXR1cm4gc2hhcmVkVGVtcGxhdGUtPkdl
dEZ1bmN0aW9uKCk7CiAgICAgfSBlbHNlCkBAIC0yNDcsMTQgKzI0NywxNCBAQAogICAgIElOQ19T
VEFUUygiRE9NLkxvY2F0aW9uLmFzc2lnbi5fZ2V0Iik7CiAgICAgc3RhdGljIHY4OjpQZXJzaXN0
ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBwcml2YXRlVGVtcGxhdGUgPQogICAgIHY4OjpQZXJz
aXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KHY4OjpGdW5jdGlvblRlbXBsYXRlOjpO
ZXcodjhMb2NhdGlvbkFzc2lnbkNhbGxiYWNrLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKSwgdjg6
OlNpZ25hdHVyZTo6TmV3KFY4TG9jYXRpb246OkdldFJhd1RlbXBsYXRlKCkpKSk7Ci0gICAgdjg6
OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5OjpMb29rdXBET01XcmFwcGVyKFY4
Q2xhc3NJbmRleDo6TE9DQVRJT04sIGluZm8uVGhpcygpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Omxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpM
T0NBVElPTiwgaW5mby5UaGlzKCkpOwogICAgIGlmIChob2xkZXIuSXNFbXB0eSgpKSB7CiAgICAg
ICAgIC8vIGNhbiBvbmx5IHJlYWNoIGhlcmUgYnkgJ29iamVjdC5fX3Byb3RvX18uZnVuYycsIGFu
ZCBpdCBzaG91bGQgcGFzc2VkCiAgICAgICAgIC8vIGRvbWFpbiBzZWN1cml0eSBjaGVjayBhbHJl
YWR5CiAgICAgICAgIHJldHVybiBwcml2YXRlVGVtcGxhdGUtPkdldEZ1bmN0aW9uKCk7CiAgICAg
fQotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4o
VjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKLSAgICBpZiAoIVY4UHJveHk6OkNhbkFj
Y2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgZmFsc2UpKSB7CisgICAgTG9jYXRpb24qIGltcCA9IFY4
UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NB
VElPTiwgaG9sZGVyKTsKKyAgICBpZiAoIVY4UHJveHk6OmNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJh
bWUoKSwgZmFsc2UpKSB7CiAgICAgICAgIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rp
b25UZW1wbGF0ZT4gc2hhcmVkVGVtcGxhdGUgPSB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25U
ZW1wbGF0ZT46Ok5ldyh2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KHY4TG9jYXRpb25Bc3NpZ25D
YWxsYmFjaywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCksIHY4OjpTaWduYXR1cmU6Ok5ldyhWOExv
Y2F0aW9uOjpHZXRSYXdUZW1wbGF0ZSgpKSkpOwogICAgICAgICByZXR1cm4gc2hhcmVkVGVtcGxh
dGUtPkdldEZ1bmN0aW9uKCk7CiAgICAgfSBlbHNlCkBAIC0yNjcsNyArMjY3LDcgQEAKIAogICAg
IElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLnJlbG9hZCIpOwogICAgIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBob2xkZXIgPSBhcmdzLkhvbGRlcigpOwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVy
KTsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExv
Y2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwogCiAgICAgRnJhbWUqIGZy
YW1lID0gaW1wLT5mcmFtZSgpOwogICAgIGlmICghZnJhbWUgfHwgIVNjcmlwdENvbnRyb2xsZXI6
OmlzU2FmZVNjcmlwdChmcmFtZSkpCkBAIC0yODIsNyArMjgyLDcgQEAKIHsKICAgICBJTkNfU1RB
VFMoIkRPTS5Mb2NhdGlvbi5yZXBsYWNlIik7CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhv
bGRlciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0
aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOworICAg
IExvY2F0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+
KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvbGRlcik7CiAKICAgICBGcmFtZSogZnJhbWUgPSBp
bXAtPmZyYW1lKCk7CiAgICAgaWYgKCFmcmFtZSkKQEAgLTMwMyw3ICszMDMsNyBAQAogewogICAg
IElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLmFzc2lnbiIpOwogICAgIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBob2xkZXIgPSBhcmdzLkhvbGRlcigpOwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVy
KTsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExv
Y2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwogCiAgICAgRnJhbWUqIGZy
YW1lID0gaW1wLT5mcmFtZSgpOwogICAgIGlmICghZnJhbWUpCkBAIC0zMzQsOCArMzM0LDggQEAK
IHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi50b1N0cmluZyIpOwogICAgIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBob2xkZXIgPSBhcmdzLkhvbGRlcigpOwotICAgIExvY2F0aW9uKiBpbXAg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElP
TiwgaG9sZGVyKTsKLSAgICBpZiAoIVY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUo
KSwgdHJ1ZSkpCisgICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAgICBpZiAo
IVY4UHJveHk6OmNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgdHJ1ZSkpCiAgICAgICAgIHJl
dHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgU3RyaW5nIHJlc3VsdCA9IGltcC0+aHJlZigpOwog
ICAgIHJldHVybiB2OFN0cmluZyhyZXN1bHQpOwpAQCAtMzQ1LDE2ICszNDUsMTYgQEAKIHsKICAg
ICBBU1NFUlQoVjhDbGFzc0luZGV4OjpGcm9tSW50KGRhdGEtPkludDMyVmFsdWUoKSkgPT0gVjhD
bGFzc0luZGV4OjpMT0NBVElPTik7CiAgICAgLy8gT25seSBhbGxvdyBzYW1lIG9yaWdpbiBhY2Nl
c3MKLSAgICBMb2NhdGlvbiogaW1wID0gIFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExvY2F0aW9u
PihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob3N0KTsKLSAgICByZXR1cm4gVjhQcm94eTo6Q2Fu
QWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCBmYWxzZSk7CisgICAgTG9jYXRpb24qIGltcCA9ICBW
OFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9D
QVRJT04sIGhvc3QpOworICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZShpbXAtPmZy
YW1lKCksIGZhbHNlKTsKIH0KIAogTkFNRURfQUNDRVNTX0NIRUNLKExvY2F0aW9uKQogewogICAg
IEFTU0VSVChWOENsYXNzSW5kZXg6OkZyb21JbnQoZGF0YS0+SW50MzJWYWx1ZSgpKSA9PSBWOENs
YXNzSW5kZXg6OkxPQ0FUSU9OKTsKICAgICAvLyBPbmx5IGFsbG93IHNhbWUgb3JpZ2luIGFjY2Vz
cwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4o
VjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9zdCk7Ci0gICAgcmV0dXJuIFY4UHJveHk6OkNhbkFj
Y2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgZmFsc2UpOworICAgIExvY2F0aW9uKiBpbXAgPSBWOFBy
b3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJ
T04sIGhvc3QpOworICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1l
KCksIGZhbHNlKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tQmluZGluZy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21CaW5kaW5nLmNwcAkocmV2aXNpb24gNDUw
OTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbUJpbmRpbmcuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC01MSw3ICs1MSw3IEBACiB7CiAgICAgaWYgKHByb3RvY29sSXMocGFy
c2VVUkwodmFsdWUpLCAiamF2YXNjcmlwdCIpKSB7CiAgICAgICAgIE5vZGUqIGNvbnRlbnREb2Mg
PSBmcmFtZS0+Y29udGVudERvY3VtZW50KCk7Ci0gICAgICAgIGlmIChjb250ZW50RG9jICYmICFW
OFByb3h5OjpDaGVja05vZGVTZWN1cml0eShjb250ZW50RG9jKSkKKyAgICAgICAgaWYgKGNvbnRl
bnREb2MgJiYgIVY4UHJveHk6OmNoZWNrTm9kZVNlY3VyaXR5KGNvbnRlbnREb2MpKQogICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKQEAgLTgyLDggKzgy
LDggQEAKICAgICAgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uOwogCiAgICAgLy8gR2VuZXJhdGUg
YSB3cmFwcGVyLgotICAgIERvY3VtZW50KiBkb2N1bWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJU
b05hdGl2ZTxEb2N1bWVudD4oaW5mby5Ib2xkZXIoKSk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6VmFs
dWU+IHdyYXBwZXIgPSBWOFByb3h5OjpET01JbXBsZW1lbnRhdGlvblRvVjhPYmplY3QoZG9jdW1l
bnQtPmltcGxlbWVudGF0aW9uKCkpOworICAgIERvY3VtZW50KiBkb2N1bWVudCA9IFY4UHJveHk6
OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8RG9jdW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAg
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3cmFwcGVyID0gVjhQcm94eTo6Y29udmVydERPTUltcGxl
bWVudGF0aW9uVG9WOE9iamVjdChkb2N1bWVudC0+aW1wbGVtZW50YXRpb24oKSk7CiAKICAgICAv
LyBTdG9yZSB0aGUgd3JhcHBlciBpbiB0aGUgaW50ZXJuYWwgZmllbGQuCiAgICAgaW5mby5Ib2xk
ZXIoKS0+U2V0SW50ZXJuYWxGaWVsZChrRG9jdW1lbnRJbXBsZW1lbnRhdGlvbkluZGV4LCB3cmFw
cGVyKTsKQEAgLTk2LDE2ICs5NiwxNiBAQAogewogICAgIEFTU0VSVChWOENsYXNzSW5kZXg6OkZy
b21JbnQoZGF0YS0+SW50MzJWYWx1ZSgpKSA9PSBWOENsYXNzSW5kZXg6OkhJU1RPUlkpOwogICAg
IC8vIE9ubHkgYWxsb3cgc2FtZSBvcmlnaW4gYWNjZXNzLgotICAgIEhpc3RvcnkqIGhpc3Rvcnkg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIaXN0b3J5PihWOENsYXNzSW5kZXg6OkhJU1RPUlks
IGhvc3QpOwotICAgIHJldHVybiBWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShoaXN0b3J5LT5mcmFt
ZSgpLCBmYWxzZSk7CisgICAgSGlzdG9yeSogaGlzdG9yeSA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxIaXN0b3J5PihWOENsYXNzSW5kZXg6OkhJU1RPUlksIGhvc3QpOworICAgIHJl
dHVybiBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZShoaXN0b3J5LT5mcmFtZSgpLCBmYWxzZSk7CiB9
CiAKIE5BTUVEX0FDQ0VTU19DSEVDSyhIaXN0b3J5KQogewogICAgIEFTU0VSVChWOENsYXNzSW5k
ZXg6OkZyb21JbnQoZGF0YS0+SW50MzJWYWx1ZSgpKSA9PSBWOENsYXNzSW5kZXg6OkhJU1RPUlkp
OwogICAgIC8vIE9ubHkgYWxsb3cgc2FtZSBvcmlnaW4gYWNjZXNzLgotICAgIEhpc3RvcnkqIGhp
c3RvcnkgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIaXN0b3J5PihWOENsYXNzSW5kZXg6OkhJ
U1RPUlksIGhvc3QpOwotICAgIHJldHVybiBWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShoaXN0b3J5
LT5mcmFtZSgpLCBmYWxzZSk7CisgICAgSGlzdG9yeSogaGlzdG9yeSA9IFY4UHJveHk6OmNvbnZl
cnRUb05hdGl2ZU9iamVjdDxIaXN0b3J5PihWOENsYXNzSW5kZXg6OkhJU1RPUlksIGhvc3QpOwor
ICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZShoaXN0b3J5LT5mcmFtZSgpLCBmYWxz
ZSk7CiB9CiAKICN1bmRlZiBJTkRFWEVEX0FDQ0VTU19DSEVDSwpAQCAtMTE4LDIxICsxMTgsMjEg
QEAKICAgICBGcmFtZSogdGFyZ2V0ID0gMDsKICAgICBzd2l0Y2ggKFY4Q2xhc3NJbmRleDo6RnJv
bUludChkYXRhLT5JbnQzMlZhbHVlKCkpKSB7CiAgICAgY2FzZSBWOENsYXNzSW5kZXg6OkRPTVdJ
TkRPVzogewotICAgICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd2luZG93ID0gVjhQcm94eTo6
TG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaG9zdCk7CisgICAgICAg
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3aW5kb3cgPSBWOFByb3h5Ojpsb29rdXBET01XcmFwcGVy
KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob3N0KTsKICAgICAgICAgaWYgKHdpbmRvdy5Jc0Vt
cHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogCi0gICAgICAgIERPTVdpbmRvdyog
dGFyZ2V0V2luZG93ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVywgd2luZG93KTsKKyAgICAgICAgRE9NV2luZG93KiB0YXJnZXRXaW5k
b3cgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5k
ZXg6OkRPTVdJTkRPVywgd2luZG93KTsKICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0V2luZG93LT5m
cmFtZSgpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBWOENsYXNzSW5kZXg6OkxP
Q0FUSU9OOiB7Ci0gICAgICAgIEhpc3RvcnkqIGhpc3RvcnkgPSBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxIaXN0b3J5PihWOENsYXNzSW5kZXg6OkhJU1RPUlksIGhvc3QpOworICAgICAgICBIaXN0
b3J5KiBoaXN0b3J5ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PEhpc3Rvcnk+KFY4
Q2xhc3NJbmRleDo6SElTVE9SWSwgaG9zdCk7CiAgICAgICAgIHRhcmdldCA9IGhpc3RvcnktPmZy
YW1lKCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SElT
VE9SWTogewotICAgICAgICBMb2NhdGlvbiogbG9jYXRpb24gPSBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9zdCk7CisgICAgICAgIExv
Y2F0aW9uKiBsb2NhdGlvbiA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxMb2NhdGlv
bj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9zdCk7CiAgICAgICAgIHRhcmdldCA9IGxvY2F0
aW9uLT5mcmFtZSgpOwogICAgICAgICBicmVhazsKICAgICB9CkluZGV4OiBXZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOEF0dHJDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4QXR0ckN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhBdHRyQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNDIsNyArNDIsNyBAQAogCiBBQ0NFU1NPUl9TRVRURVIoQXR0clZhbHVlKQogewotICAgIEF0
dHIqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8QXR0cj4oaW5mby5Ib2xkZXIoKSk7
CisgICAgQXR0ciogaW1wID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8QXR0cj4o
aW5mby5Ib2xkZXIoKSk7CiAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IHRvV2ViQ29yZVN0cmluZ1dp
dGhOdWxsQ2hlY2sodmFsdWUpOwogICAgIEVsZW1lbnQqIG93bmVyRWxlbWVudCA9IGltcC0+b3du
ZXJFbGVtZW50KCk7CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTFNl
bGVjdEVsZW1lbnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4SFRNTFNlbGVjdEVsZW1lbnRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysr
IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTFNlbGVjdEVsZW1lbnRDdXN0b20uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC00NCwxNCArNDQsMTQgQEAKIENBTExCQUNLX0ZVTkNfREVDTChI
VE1MU2VsZWN0RWxlbWVudFJlbW92ZSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MU2VsZWN0
RWxlbWVudC5yZW1vdmUiKTsKLSAgICBIVE1MU2VsZWN0RWxlbWVudCogaW1wID0gVjhQcm94eTo6
RE9NV3JhcHBlclRvTm9kZTxIVE1MU2VsZWN0RWxlbWVudD4oYXJncy5Ib2xkZXIoKSk7CisgICAg
SFRNTFNlbGVjdEVsZW1lbnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2Rl
PEhUTUxTZWxlY3RFbGVtZW50PihhcmdzLkhvbGRlcigpKTsKICAgICByZXR1cm4gcmVtb3ZlRWxl
bWVudChpbXAsIGFyZ3MpOwogfQogCiB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmVtb3ZlRWxlbWVu
dChIVE1MU2VsZWN0RWxlbWVudCogaW1wLCBjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKSAKIHsK
ICAgICBpZiAoVjhIVE1MT3B0aW9uRWxlbWVudDo6SGFzSW5zdGFuY2UoYXJnc1swXSkpIHsKLSAg
ICAgICAgSFRNTE9wdGlvbkVsZW1lbnQqIGVsZW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPEhUTUxPcHRpb25FbGVtZW50PihhcmdzWzBdKTsKKyAgICAgICAgSFRNTE9wdGlvbkVsZW1l
bnQqIGVsZW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MT3B0aW9u
RWxlbWVudD4oYXJnc1swXSk7CiAgICAgICAgIGltcC0+cmVtb3ZlKGVsZW1lbnQtPmluZGV4KCkp
OwogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgIH0KSW5kZXg6IFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MSHR0cFJlcXVlc3RVcGxvYWRDdXN0b20uY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MSHR0cFJlcXVlc3RVcGxv
YWRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4WE1MSHR0cFJlcXVlc3RVcGxvYWRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00
Niw3ICs0Niw3IEBACiBBQ0NFU1NPUl9HRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmFib3J0
KQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0VXBsb2FkLm9uYWJvcnQuX2dl
dCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6
OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVz
dFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVP
YmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RV
UExPQUQsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25h
Ym9ydCgpKSB7CiAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0
aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25h
Ym9ydCgpKTsKICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4TGlzdGVuZXIgPSBsaXN0
ZW5lci0+Z2V0TGlzdGVuZXJPYmplY3QoKTsKQEAgLTU4LDcgKzU4LDcgQEAKIEFDQ0VTU09SX1NF
VFRFUihYTUxIdHRwUmVxdWVzdFVwbG9hZE9uYWJvcnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00u
WE1MSHR0cFJlcXVlc3RVcGxvYWQub25hYm9ydC5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3RV
cGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1M
SHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGlu
Zm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVw
bG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9h
ZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7CiAg
ICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAoeG1sSHR0cFJlcXVlc3RVcGxv
YWQtPm9uYWJvcnQoKSkgewogICAgICAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0
ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0
VXBsb2FkLT5vbmFib3J0KCkpOwpAQCAtNzQsNyArNzQsNyBAQAogICAgICAgICBpZiAoIXByb3h5
KQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBs
aXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBm
YWxzZSk7CisgICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5m
aW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBmYWxzZSk7CiAgICAgICAgIGlm
IChsaXN0ZW5lcikgewogICAgICAgICAgICAgeG1sSHR0cFJlcXVlc3RVcGxvYWQtPnNldE9uYWJv
cnQobGlzdGVuZXIpOwogICAgICAgICAgICAgY3JlYXRlSGlkZGVuRGVwZW5kZW5jeShpbmZvLkhv
bGRlcigpLCB2YWx1ZSwgVjhDdXN0b206OmtYTUxIdHRwUmVxdWVzdENhY2hlSW5kZXgpOwpAQCAt
ODUsNyArODUsNyBAQAogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0VXBsb2FkT25lcnJv
cikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdFVwbG9hZC5vbmVycm9yLl9n
ZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBW
OFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4
OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJlcXVl
c3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNU
VVBMT0FELCBpbmZvLkhvbGRlcigpKTsKICAgICBpZiAoeG1sSHR0cFJlcXVlc3RVcGxvYWQtPm9u
ZXJyb3IoKSkgewogICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3Rh
dGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3RVcGxvYWQtPm9u
ZXJyb3IoKSk7CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB2OExpc3RlbmVyID0gbGlz
dGVuZXItPmdldExpc3RlbmVyT2JqZWN0KCk7CkBAIC05Nyw3ICs5Nyw3IEBACiBBQ0NFU1NPUl9T
RVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmVycm9yKQogewogICAgIElOQ19TVEFUUygiRE9N
LlhNTEh0dHBSZXF1ZXN0VXBsb2FkLm9uZXJyb3IuX3NldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0
VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhN
TEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBp
bmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RV
cGxvYWQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxv
YWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9sZGVyKCkpOwog
ICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsKICAgICAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0VXBs
b2FkLT5vbmVycm9yKCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlz
dGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVz
dFVwbG9hZC0+b25lcnJvcigpKTsKQEAgLTExMyw3ICsxMTMsNyBAQAogICAgICAgICBpZiAoIXBy
b3h5KQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVy
PiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVl
LCBmYWxzZSk7CisgICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5
LT5maW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBmYWxzZSk7CiAgICAgICAg
IGlmIChsaXN0ZW5lcikgewogICAgICAgICAgICAgeG1sSHR0cFJlcXVlc3RVcGxvYWQtPnNldE9u
ZXJyb3IobGlzdGVuZXIpOwogICAgICAgICAgICAgY3JlYXRlSGlkZGVuRGVwZW5kZW5jeShpbmZv
LkhvbGRlcigpLCB2YWx1ZSwgVjhDdXN0b206OmtYTUxIdHRwUmVxdWVzdENhY2hlSW5kZXgpOwpA
QCAtMTI0LDcgKzEyNCw3IEBACiBBQ0NFU1NPUl9HRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRP
bmxvYWQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25sb2Fk
Ll9nZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0lu
ZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJl
cXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFV
RVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKICAgICBpZiAoeG1sSHR0cFJlcXVlc3RVcGxvYWQt
Pm9ubG9hZCgpKSB7CiAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBz
dGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdFVwbG9hZC0+
b25sb2FkKCkpOwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxp
c3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMTM2LDcgKzEzNiw3IEBACiBBQ0NFU1NP
Ul9TRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmxvYWQpCiB7CiAgICAgSU5DX1NUQVRTKCJE
T00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25sb2FkLl9zZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVz
dFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxY
TUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwg
aW5mby5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0
VXBsb2FkID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBs
b2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsK
ICAgICBpZiAodmFsdWUtPklzTnVsbCgpKSB7CiAgICAgICAgIGlmICh4bWxIdHRwUmVxdWVzdFVw
bG9hZC0+b25sb2FkKCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlz
dGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVz
dFVwbG9hZC0+b25sb2FkKCkpOwpAQCAtMTUyLDcgKzE1Miw3IEBACiAgICAgICAgIGlmICghcHJv
eHkpCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+
IGxpc3RlbmVyID0gcHJveHktPkZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUs
IGZhbHNlKTsKKyAgICAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHkt
PmZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKTsKICAgICAgICAg
aWYgKGxpc3RlbmVyKSB7CiAgICAgICAgICAgICB4bWxIdHRwUmVxdWVzdFVwbG9hZC0+c2V0T25s
b2FkKGxpc3RlbmVyKTsKICAgICAgICAgICAgIGNyZWF0ZUhpZGRlbkRlcGVuZGVuY3koaW5mby5I
b2xkZXIoKSwgdmFsdWUsIFY4Q3VzdG9tOjprWE1MSHR0cFJlcXVlc3RDYWNoZUluZGV4KTsKQEAg
LTE2Myw3ICsxNjMsNyBAQAogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0VXBsb2FkT25s
b2Fkc3RhcnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25s
b2Fkc3RhcnQuX2dldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVz
dFVwbG9hZCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihW
OENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKKyAgICBY
TUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5Ojpjb252
ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1M
SFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh4bWxIdHRwUmVxdWVz
dFVwbG9hZC0+b25sb2Fkc3RhcnQoKSkgewogICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIq
IGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJl
cXVlc3RVcGxvYWQtPm9ubG9hZHN0YXJ0KCkpOwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVj
dD4gdjhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMTc1LDcg
KzE3NSw3IEBACiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmxvYWRzdGFy
dCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdFVwbG9hZC5vbmxvYWRzdGFy
dC5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2Fk
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJ
bmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBS
ZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVR
VUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewog
ICAgICAgICBpZiAoeG1sSHR0cFJlcXVlc3RVcGxvYWQtPm9ubG9hZHN0YXJ0KCkpIHsKICAgICAg
ICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9i
amVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25sb2Fkc3RhcnQoKSk7
CkBAIC0xOTEsNyArMTkxLDcgQEAKICAgICAgICAgaWYgKCFwcm94eSkKICAgICAgICAgICAgIHJl
dHVybjsKIAotICAgICAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+
RmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2UpOworICAgICAgICBS
ZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+ZmluZE9yQ3JlYXRlT2JqZWN0
RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2UpOwogICAgICAgICBpZiAobGlzdGVuZXIpIHsKICAg
ICAgICAgICAgIHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5zZXRPbmxvYWRzdGFydChsaXN0ZW5lcik7
CiAgICAgICAgICAgICBjcmVhdGVIaWRkZW5EZXBlbmRlbmN5KGluZm8uSG9sZGVyKCksIHZhbHVl
LCBWOEN1c3RvbTo6a1hNTEh0dHBSZXF1ZXN0Q2FjaGVJbmRleCk7CkBAIC0yMDIsNyArMjAyLDcg
QEAKIEFDQ0VTU09SX0dFVFRFUihYTUxIdHRwUmVxdWVzdFVwbG9hZE9ucHJvZ3Jlc3MpCiB7CiAg
ICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25wcm9ncmVzcy5fZ2V0Iik7
Ci0gICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94
eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1M
SFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0VXBs
b2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVj
dDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9B
RCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5vbnByb2dy
ZXNzKCkpIHsKICAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRp
Y19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5vbnBy
b2dyZXNzKCkpOwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxp
c3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMjE0LDcgKzIxNCw3IEBACiBBQ0NFU1NP
Ul9TRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbnByb2dyZXNzKQogewogICAgIElOQ19TVEFU
UygiRE9NLlhNTEh0dHBSZXF1ZXN0VXBsb2FkLm9ucHJvZ3Jlc3MuX3NldCIpOwotICAgIFhNTEh0
dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OlRvTmF0aXZl
T2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNU
VVBMT0FELCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0
cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJl
cXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9s
ZGVyKCkpOwogICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsKICAgICAgICAgaWYgKHhtbEh0dHBS
ZXF1ZXN0VXBsb2FkLT5vbnByb2dyZXNzKCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRM
aXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4
bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25wcm9ncmVzcygpKTsKQEAgLTIzMCw3ICsyMzAsNyBAQAog
ICAgICAgICBpZiAoIXByb3h5KQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIFJlZlB0
cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVu
dExpc3RlbmVyKHZhbHVlLCBmYWxzZSk7CisgICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBs
aXN0ZW5lciA9IHByb3h5LT5maW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBm
YWxzZSk7CiAgICAgICAgIGlmIChsaXN0ZW5lcikgewogICAgICAgICAgICAgeG1sSHR0cFJlcXVl
c3RVcGxvYWQtPnNldE9ucHJvZ3Jlc3MobGlzdGVuZXIpOwogICAgICAgICAgICAgY3JlYXRlSGlk
ZGVuRGVwZW5kZW5jeShpbmZvLkhvbGRlcigpLCB2YWx1ZSwgVjhDdXN0b206OmtYTUxIdHRwUmVx
dWVzdENhY2hlSW5kZXgpOwpAQCAtMjQxLDE0ICsyNDEsMTQgQEAKIENBTExCQUNLX0ZVTkNfREVD
TChYTUxIdHRwUmVxdWVzdFVwbG9hZEFkZEV2ZW50TGlzdGVuZXIpCiB7CiAgICAgSU5DX1NUQVRT
KCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigpIik7Ci0gICAgWE1M
SHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6VG9OYXRp
dmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVF
U1RVUExPQUQsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxI
dHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRw
UmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgYXJncy5I
b2xkZXIoKSk7CiAKICAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSB4bWxIdHRw
UmVxdWVzdFVwbG9hZC0+YXNzb2NpYXRlZFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgVjhQcm94eSog
cHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZSh4bWxIdHRwUmVxdWVzdC0+c2NyaXB0RXhlY3V0aW9u
Q29udGV4dCgpKTsKICAgICBpZiAoIXByb3h5KQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5l
ZCgpOwogCi0gICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPkZpbmRP
ckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxF
dmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5kT3JDcmVhdGVPYmplY3RFdmVudExp
c3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsKICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgU3Ry
aW5nIHR5cGUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgICAgIGJvb2wgdXNlQ2Fw
dHVyZSA9IGFyZ3NbMl0tPkJvb2xlYW5WYWx1ZSgpOwpAQCAtMjYyLDE0ICsyNjIsMTQgQEAKIENB
TExCQUNLX0ZVTkNfREVDTChYTUxIdHRwUmVxdWVzdFVwbG9hZFJlbW92ZUV2ZW50TGlzdGVuZXIp
CiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQucmVtb3ZlRXZlbnRM
aXN0ZW5lcigpIik7Ci0gICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBs
b2FkID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xh
c3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhNTEh0
dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRU
b05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQ
UkVRVUVTVFVQTE9BRCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBYTUxIdHRwUmVxdWVzdCogeG1s
SHR0cFJlcXVlc3QgPSB4bWxIdHRwUmVxdWVzdFVwbG9hZC0+YXNzb2NpYXRlZFhNTEh0dHBSZXF1
ZXN0KCk7CiAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZSh4bWxIdHRwUmVx
dWVzdC0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpKTsKICAgICBpZiAoIXByb3h5KQogICAgICAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOyAvLyBQcm9iYWJseSBsZWFrZWQuCiAKLSAgICBSZWZQ
dHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+RmluZE9iamVjdEV2ZW50TGlzdGVu
ZXIoYXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9
IHByb3h5LT5maW5kT2JqZWN0RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAKICAgICBp
ZiAobGlzdGVuZXIpIHsKICAgICAgICAgU3RyaW5nIHR5cGUgPSB0b1dlYkNvcmVTdHJpbmcoYXJn
c1swXSk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE5vZGVMaXN0Q3VzdG9t
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE5vZGVMaXN0
Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOE5vZGVMaXN0Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDIsNyArNDIsNyBAQAog
TkFNRURfUFJPUEVSVFlfR0VUVEVSKE5vZGVMaXN0KQogewogICAgIElOQ19TVEFUUygiRE9NLk5v
ZGVMaXN0Lk5hbWVkUHJvcGVydHlHZXR0ZXIiKTsKLSAgICBOb2RlTGlzdCogbGlzdCA9IFY4UHJv
eHk6OlRvTmF0aXZlT2JqZWN0PE5vZGVMaXN0PihWOENsYXNzSW5kZXg6Ok5PREVMSVNULCBpbmZv
LkhvbGRlcigpKTsKKyAgICBOb2RlTGlzdCogbGlzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2
ZU9iamVjdDxOb2RlTGlzdD4oVjhDbGFzc0luZGV4OjpOT0RFTElTVCwgaW5mby5Ib2xkZXIoKSk7
CiAgICAgU3RyaW5nIGtleSA9IHRvV2ViQ29yZVN0cmluZyhuYW1lKTsKIAogICAgIC8vIExlbmd0
aCBwcm9wZXJ0eSBjYW5ub3QgYmUgb3ZlcnJpZGRlbi4KQEAgLTUzLDcgKzUzLDcgQEAKICAgICBp
ZiAoIXJlc3VsdCkKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAK
LSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsKKyAgICBy
ZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAK
IH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4WFBhdGhFdmFsdWF0b3JDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhYUGF0aEV2YWx1YXRvckNvbnN0cnVjdG9yLmNwcAkocmV2aXNp
b24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFhQYXRoRXZhbHVhdG9y
Q29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICszOSw3IEBACiBDQUxMQkFD
S19GVU5DX0RFQ0woWFBhdGhFdmFsdWF0b3JDb25zdHJ1Y3RvcikKIHsKICAgICBJTkNfU1RBVFMo
IkRPTS5YUGF0aEV2YWx1YXRvci5Db25zdHJ1Y3RvciIpOwotICAgIHJldHVybiBWOFByb3h5OjpD
b25zdHJ1Y3RET01PYmplY3Q8VjhDbGFzc0luZGV4OjpYUEFUSEVWQUxVQVRPUiwgWFBhdGhFdmFs
dWF0b3I+KGFyZ3MpOworICAgIHJldHVybiBWOFByb3h5Ojpjb25zdHJ1Y3RET01PYmplY3Q8VjhD
bGFzc0luZGV4OjpYUEFUSEVWQUxVQVRPUiwgWFBhdGhFdmFsdWF0b3I+KGFyZ3MpOwogfQogCiB9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OEN1c3RvbUV2ZW50TGlzdGVuZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4Q3VzdG9tRXZlbnRMaXN0ZW5lci5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysg
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21FdmVudExpc3RlbmVyLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNDAsNyArNDAsNyBAQAogewogICAgIG1fbGlzdGVuZXIgPSB2ODo6UGVy
c2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGxpc3RlbmVyKTsKICNpZm5kZWYgTkRFQlVHCi0gICAg
VjhQcm94eTo6UmVnaXN0ZXJHbG9iYWxIYW5kbGUoRVZFTlRfTElTVEVORVIsIHRoaXMsIG1fbGlz
dGVuZXIpOworICAgIFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxlKEVWRU5UX0xJU1RFTkVS
LCB0aGlzLCBtX2xpc3RlbmVyKTsKICNlbmRpZgogfQogCkBAIC00OSw3ICs0OSw3IEBACiAgICAg
aWYgKG1fZnJhbWUpIHsKICAgICAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2
ZShtX2ZyYW1lKTsKICAgICAgICAgaWYgKHByb3h5KQotICAgICAgICAgICAgcHJveHktPlJlbW92
ZVY4RXZlbnRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIHByb3h5LT5yZW1vdmVWOEV2ZW50
TGlzdGVuZXIodGhpcyk7CiAgICAgfQogCiAgICAgZGlzcG9zZUxpc3RlbmVyT2JqZWN0KCk7CkBA
IC04Myw3ICs4Myw3IEBACiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHBhcmFtZXRlcnNbMV0g
PSB7IGpzRXZlbnQgfTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUo
bV9mcmFtZSk7Ci0gICAgcmV0dXJuIHByb3h5LT5DYWxsRnVuY3Rpb24oaGFuZGxlckZ1bmN0aW9u
LCByZWNlaXZlciwgMSwgcGFyYW1ldGVycyk7CisgICAgcmV0dXJuIHByb3h5LT5jYWxsRnVuY3Rp
b24oaGFuZGxlckZ1bmN0aW9uLCByZWNlaXZlciwgMSwgcGFyYW1ldGVycyk7CiB9CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVz
c2FnZVBvcnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4TWVzc2FnZVBvcnRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZVBvcnRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC00MywxNCArNDMsMTQgQEAKIEFDQ0VTU09SX0dFVFRFUihNZXNzYWdlUG9ydE9ubWVzc2Fn
ZSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5NZXNzYWdlUG9ydC5vbm1lc3NhZ2UuX2dldCIpOwot
ICAgIE1lc3NhZ2VQb3J0KiBtZXNzYWdlUG9ydCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PE1l
c3NhZ2VQb3J0PihWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JULCBpbmZvLkhvbGRlcigpKTsKLSAg
ICByZXR1cm4gVjhQcm94eTo6RXZlbnRMaXN0ZW5lclRvVjhPYmplY3QobWVzc2FnZVBvcnQtPm9u
bWVzc2FnZSgpKTsKKyAgICBNZXNzYWdlUG9ydCogbWVzc2FnZVBvcnQgPSBWOFByb3h5Ojpjb252
ZXJ0VG9OYXRpdmVPYmplY3Q8TWVzc2FnZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQs
IGluZm8uSG9sZGVyKCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0RXZlbnRMaXN0ZW5l
clRvVjhPYmplY3QobWVzc2FnZVBvcnQtPm9ubWVzc2FnZSgpKTsKIH0KIAogQUNDRVNTT1JfU0VU
VEVSKE1lc3NhZ2VQb3J0T25tZXNzYWdlKQogewogICAgIElOQ19TVEFUUygiRE9NLk1lc3NhZ2VQ
b3J0Lm9ubWVzc2FnZS5fc2V0Iik7Ci0gICAgTWVzc2FnZVBvcnQqIG1lc3NhZ2VQb3J0ID0gVjhQ
cm94eTo6VG9OYXRpdmVPYmplY3Q8TWVzc2FnZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBP
UlQsIGluZm8uSG9sZGVyKCkpOworICAgIE1lc3NhZ2VQb3J0KiBtZXNzYWdlUG9ydCA9IFY4UHJv
eHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxNZXNzYWdlUG9ydD4oVjhDbGFzc0luZGV4OjpNRVNT
QUdFUE9SVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAg
ICAgICBpZiAobWVzc2FnZVBvcnQtPm9ubWVzc2FnZSgpKSB7CiAgICAgICAgICAgICBWOE9iamVj
dEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3Rl
bmVyKj4obWVzc2FnZVBvcnQtPm9ubWVzc2FnZSgpKTsKQEAgLTY1LDcgKzY1LDcgQEAKICAgICAg
ICAgaWYgKCFwcm94eSkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBSZWZQdHI8RXZl
bnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+RmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0
ZW5lcih2YWx1ZSwgZmFsc2UpOworICAgICAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVu
ZXIgPSBwcm94eS0+ZmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2Up
OwogICAgICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgICAgIG1lc3NhZ2VQb3J0LT5zZXRP
bm1lc3NhZ2UobGlzdGVuZXIpOwogICAgICAgICAgICAgY3JlYXRlSGlkZGVuRGVwZW5kZW5jeShp
bmZvLkhvbGRlcigpLCB2YWx1ZSwgVjhDdXN0b206OmtNZXNzYWdlUG9ydFJlcXVlc3RDYWNoZUlu
ZGV4KTsKQEAgLTc2LDEzICs3NiwxMyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKE1lc3NhZ2VQb3J0
QWRkRXZlbnRMaXN0ZW5lcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5NZXNzYWdlUG9ydC5BZGRF
dmVudExpc3RlbmVyKCkiKTsKLSAgICBNZXNzYWdlUG9ydCogbWVzc2FnZVBvcnQgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxNZXNzYWdlUG9ydD4oVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwg
YXJncy5Ib2xkZXIoKSk7CisgICAgTWVzc2FnZVBvcnQqIG1lc3NhZ2VQb3J0ID0gVjhQcm94eTo6
Y29udmVydFRvTmF0aXZlT2JqZWN0PE1lc3NhZ2VQb3J0PihWOENsYXNzSW5kZXg6Ok1FU1NBR0VQ
T1JULCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0
cmlldmUobWVzc2FnZVBvcnQtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSk7CiAgICAgaWYgKCFw
cm94eSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIFJlZlB0cjxFdmVu
dExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3Rl
bmVyKGFyZ3NbMV0sIGZhbHNlKTsKKyAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIg
PSBwcm94eS0+ZmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7
CiAgICAgaWYgKGxpc3RlbmVyKSB7CiAgICAgICAgIFN0cmluZyB0eXBlID0gdG9XZWJDb3JlU3Ry
aW5nKGFyZ3NbMF0pOwogICAgICAgICBib29sIHVzZUNhcHR1cmUgPSBhcmdzWzJdLT5Cb29sZWFu
VmFsdWUoKTsKQEAgLTk2LDEzICs5NiwxMyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKE1lc3NhZ2VQ
b3J0UmVtb3ZlRXZlbnRMaXN0ZW5lcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5NZXNzYWdlUG9y
dC5SZW1vdmVFdmVudExpc3RlbmVyKCkiKTsKLSAgICBNZXNzYWdlUG9ydCogbWVzc2FnZVBvcnQg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxNZXNzYWdlUG9ydD4oVjhDbGFzc0luZGV4OjpNRVNT
QUdFUE9SVCwgYXJncy5Ib2xkZXIoKSk7CisgICAgTWVzc2FnZVBvcnQqIG1lc3NhZ2VQb3J0ID0g
VjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PE1lc3NhZ2VQb3J0PihWOENsYXNzSW5kZXg6
Ok1FU1NBR0VQT1JULCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQ
cm94eTo6cmV0cmlldmUobWVzc2FnZVBvcnQtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSk7CiAg
ICAgaWYgKCFwcm94eSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsgLy8gcHJvYmFi
bHkgbGVha2VkCiAKLSAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+
RmluZE9iamVjdEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVu
dExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5kT2JqZWN0RXZlbnRMaXN0ZW5lcihhcmdz
WzFdLCBmYWxzZSk7CiAKICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgU3RyaW5nIHR5cGUg
PSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOFhTTFRQcm9jZXNzb3JDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4WFNMVFByb2Nlc3NvckN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1
KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYU0xUUHJvY2Vzc29yQ3VzdG9tLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNDgsNyArNDgsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFhT
TFRQcm9jZXNzb3JDb25zdHJ1Y3RvcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YU0xUUHJvY2Vz
c29yLkNvbnN0cnVjdG9yIik7Ci0gICAgcmV0dXJuIFY4UHJveHk6OkNvbnN0cnVjdERPTU9iamVj
dDxWOENsYXNzSW5kZXg6OlhTTFRQUk9DRVNTT1IsIFhTTFRQcm9jZXNzb3I+KGFyZ3MpOworICAg
IHJldHVybiBWOFByb3h5Ojpjb25zdHJ1Y3RET01PYmplY3Q8VjhDbGFzc0luZGV4OjpYU0xUUFJP
Q0VTU09SLCBYU0xUUHJvY2Vzc29yPihhcmdzKTsKIH0KIAogCkBAIC01OCw5ICs1OCw5IEBACiAg
ICAgaWYgKCFWOE5vZGU6Okhhc0luc3RhbmNlKGFyZ3NbMF0pKQogICAgICAgICByZXR1cm4gdjg6
OlVuZGVmaW5lZCgpOwogCi0gICAgWFNMVFByb2Nlc3NvciogaW1wID0gVjhQcm94eTo6VG9OYXRp
dmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhDbGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SLCBhcmdz
LkhvbGRlcigpKTsKKyAgICBYU0xUUHJvY2Vzc29yKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhDbGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SLCBh
cmdzLkhvbGRlcigpKTsKIAotICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPE5vZGU+KGFyZ3NbMF0pOworICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5Ojpjb252ZXJ0RE9N
V3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKTsKICAgICBpbXAtPmltcG9ydFN0eWxlc2hlZXQo
bm9kZSk7CiAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIH0KQEAgLTcyLDEyICs3MiwxMiBA
QAogICAgIGlmICghVjhOb2RlOjpIYXNJbnN0YW5jZShhcmdzWzBdKSB8fCAhVjhEb2N1bWVudDo6
SGFzSW5zdGFuY2UoYXJnc1sxXSkpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAK
LSAgICBYU0xUUHJvY2Vzc29yKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYU0xUUHJv
Y2Vzc29yPihWOENsYXNzSW5kZXg6OlhTTFRQUk9DRVNTT1IsIGFyZ3MuSG9sZGVyKCkpOworICAg
IFhTTFRQcm9jZXNzb3IqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYU0xU
UHJvY2Vzc29yPihWOENsYXNzSW5kZXg6OlhTTFRQUk9DRVNTT1IsIGFyZ3MuSG9sZGVyKCkpOwog
Ci0gICAgTm9kZSogc291cmNlID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdz
WzBdKTsKLSAgICBEb2N1bWVudCogb3duZXIgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPERv
Y3VtZW50PihhcmdzWzFdKTsKKyAgICBOb2RlKiBzb3VyY2UgPSBWOFByb3h5Ojpjb252ZXJ0RE9N
V3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKTsKKyAgICBEb2N1bWVudCogb3duZXIgPSBWOFBy
b3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxEb2N1bWVudD4oYXJnc1sxXSk7CiAgICAgUmVm
UHRyPERvY3VtZW50RnJhZ21lbnQ+IHJlc3VsdCA9IGltcC0+dHJhbnNmb3JtVG9GcmFnbWVudChz
b3VyY2UsIG93bmVyKTsKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0
LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3Vs
dC5nZXQoKSk7CiB9CiAKIApAQCAtODgsOSArODgsOSBAQAogICAgIGlmICghVjhOb2RlOjpIYXNJ
bnN0YW5jZShhcmdzWzBdKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAg
IFhTTFRQcm9jZXNzb3IqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhTTFRQcm9jZXNz
b3I+KFY4Q2xhc3NJbmRleDo6WFNMVFBST0NFU1NPUiwgYXJncy5Ib2xkZXIoKSk7CisgICAgWFNM
VFByb2Nlc3NvciogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhTTFRQcm9j
ZXNzb3I+KFY4Q2xhc3NJbmRleDo6WFNMVFBST0NFU1NPUiwgYXJncy5Ib2xkZXIoKSk7CiAKLSAg
ICBOb2RlKiBzb3VyY2UgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0p
OworICAgIE5vZGUqIHNvdXJjZSA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPE5v
ZGU+KGFyZ3NbMF0pOwogICAgIGlmICghc291cmNlKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVm
aW5lZCgpOwogCkBAIC05OCw3ICs5OCw3IEBACiAgICAgaWYgKCFyZXN1bHQpCiAgICAgICAgIHJl
dHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmpl
Y3QocmVzdWx0LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2Jq
ZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAKIApAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgaWYgKGlz
VW5kZWZpbmVkT3JOdWxsKGFyZ3NbMV0pIHx8IGlzVW5kZWZpbmVkT3JOdWxsKGFyZ3NbMl0pKQog
ICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgWFNMVFByb2Nlc3NvciogaW1w
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhDbGFzc0luZGV4OjpY
U0xUUFJPQ0VTU09SLCBhcmdzLkhvbGRlcigpKTsKKyAgICBYU0xUUHJvY2Vzc29yKiBpbXAgPSBW
OFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhDbGFzc0luZGV4
OjpYU0xUUFJPQ0VTU09SLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFN0cmluZyBuYW1lc3BhY2VV
UkkgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHRv
V2ViQ29yZVN0cmluZyhhcmdzWzFdKTsKQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgIGlmIChpc1Vu
ZGVmaW5lZE9yTnVsbChhcmdzWzFdKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsK
IAotICAgIFhTTFRQcm9jZXNzb3IqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhTTFRQ
cm9jZXNzb3I+KFY4Q2xhc3NJbmRleDo6WFNMVFBST0NFU1NPUiwgYXJncy5Ib2xkZXIoKSk7Cisg
ICAgWFNMVFByb2Nlc3NvciogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhT
TFRQcm9jZXNzb3I+KFY4Q2xhc3NJbmRleDo6WFNMVFBST0NFU1NPUiwgYXJncy5Ib2xkZXIoKSk7
CiAKICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwog
ICAgIFN0cmluZyBsb2NhbE5hbWUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1sxXSk7CkBAIC0xNDIs
NyArMTQyLDcgQEAKICAgICBpZiAoaXNVbmRlZmluZWRPck51bGwoYXJnc1sxXSkpCiAgICAgICAg
IHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICBYU0xUUHJvY2Vzc29yKiBpbXAgPSBWOFBy
b3h5OjpUb05hdGl2ZU9iamVjdDxYU0xUUHJvY2Vzc29yPihWOENsYXNzSW5kZXg6OlhTTFRQUk9D
RVNTT1IsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhTTFRQcm9jZXNzb3IqIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYU0xUUHJvY2Vzc29yPihWOENsYXNzSW5kZXg6OlhTTFRQ
Uk9DRVNTT1IsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHRv
V2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKICAgICBTdHJpbmcgbG9jYWxOYW1lID0gdG9XZWJDb3Jl
U3RyaW5nKGFyZ3NbMV0pOwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1M
UGx1Z0luRWxlbWVudEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhIVE1MUGx1Z0luRWxlbWVudEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQor
KysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MUGx1Z0luRWxlbWVudEN1c3RvbS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDcgKzQ1LDcgQEAKIE5BTUVEX1BST1BFUlRZX0dFVFRF
UihIVE1MUGx1Z0luRWxlbWVudCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MUGx1Z0luRWxl
bWVudC5OYW1lZFByb3BlcnR5R2V0dGVyIik7Ci0gICAgSFRNTFBsdWdJbkVsZW1lbnQqIGltcCA9
IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTFBsdWdJbkVsZW1lbnQ+KGluZm8uSG9sZGVy
KCkpOworICAgIEhUTUxQbHVnSW5FbGVtZW50KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3Jh
cHBlclRvTm9kZTxIVE1MUGx1Z0luRWxlbWVudD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgU2NyaXB0
SW5zdGFuY2Ugc2NyaXB0SW5zdGFuY2UgPSBpbXAtPmdldEluc3RhbmNlKCk7CiAgICAgaWYgKCFz
Y3JpcHRJbnN0YW5jZSkKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7
CkBAIC02MCw3ICs2MCw3IEBACiBOQU1FRF9QUk9QRVJUWV9TRVRURVIoSFRNTFBsdWdJbkVsZW1l
bnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTFBsdWdJbkVsZW1lbnQuTmFtZWRQcm9wZXJ0
eVNldHRlciIpOwotICAgIEhUTUxQbHVnSW5FbGVtZW50KiBpbXAgPSBWOFByb3h5OjpET01XcmFw
cGVyVG9Ob2RlPEhUTUxQbHVnSW5FbGVtZW50PihpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MUGx1
Z0luRWxlbWVudCogaW1wID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTFBs
dWdJbkVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIFNjcmlwdEluc3RhbmNlIHNjcmlwdElu
c3RhbmNlID0gaW1wLT5nZXRJbnN0YW5jZSgpOwogICAgIGlmICghc2NyaXB0SW5zdGFuY2UpCiAg
ICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwpAQCAtODEsNyArODEsNyBA
QAogSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoSFRNTFBsdWdJbkVsZW1lbnQpCiB7CiAgICAgSU5D
X1NUQVRTKCJET00uSFRNTFBsdWdJbkVsZW1lbnQuSW5kZXhlZFByb3BlcnR5R2V0dGVyIik7Ci0g
ICAgSFRNTFBsdWdJbkVsZW1lbnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRN
TFBsdWdJbkVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxQbHVnSW5FbGVtZW50KiBp
bXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MUGx1Z0luRWxlbWVudD4o
aW5mby5Ib2xkZXIoKSk7CiAgICAgU2NyaXB0SW5zdGFuY2Ugc2NyaXB0SW5zdGFuY2UgPSBpbXAt
PmdldEluc3RhbmNlKCk7CiAgICAgaWYgKCFzY3JpcHRJbnN0YW5jZSkKICAgICAgICAgcmV0dXJu
IG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CkBAIC05Niw3ICs5Niw3IEBACiBJTkRFWEVEX1BS
T1BFUlRZX1NFVFRFUihIVE1MUGx1Z0luRWxlbWVudCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5I
VE1MUGx1Z0luRWxlbWVudC5JbmRleGVkUHJvcGVydHlTZXR0ZXIiKTsKLSAgICBIVE1MUGx1Z0lu
RWxlbWVudCogaW1wID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MUGx1Z0luRWxlbWVu
dD4oaW5mby5Ib2xkZXIoKSk7CisgICAgSFRNTFBsdWdJbkVsZW1lbnQqIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxQbHVnSW5FbGVtZW50PihpbmZvLkhvbGRlcigp
KTsKICAgICBTY3JpcHRJbnN0YW5jZSBzY3JpcHRJbnN0YW5jZSA9IGltcC0+Z2V0SW5zdGFuY2Uo
KTsKICAgICBpZiAoIXNjcmlwdEluc3RhbmNlKQogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5
SW50ZXJjZXB0b3IoKTsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1ZHRWxl
bWVudEluc3RhbmNlQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOFNWR0VsZW1lbnRJbnN0YW5jZUN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQor
KysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTVkdFbGVtZW50SW5zdGFuY2VDdXN0b20u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NywxMyArNDcsMTMgQEAKIENBTExCQUNLX0ZVTkNfREVD
TChTVkdFbGVtZW50SW5zdGFuY2VBZGRFdmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFUUygi
RE9NLlNWR0VsZW1lbnRJbnN0YW5jZS5BZGRFdmVudExpc3RlbmVyKCkiKTsKLSAgICBTVkdFbGVt
ZW50SW5zdGFuY2UqIGluc3RhbmNlID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0aXZlPFNWR0Vs
ZW1lbnRJbnN0YW5jZT4oYXJncy5Ib2xkZXIoKSk7CisgICAgU1ZHRWxlbWVudEluc3RhbmNlKiBp
bnN0YW5jZSA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8U1ZHRWxlbWVudElu
c3RhbmNlPihhcmdzLkhvbGRlcigpKTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6
cmV0cmlldmUoaW5zdGFuY2UtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSk7CiAgICAgaWYgKCFw
cm94eSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIFJlZlB0cjxFdmVu
dExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIo
YXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHBy
b3h5LT5maW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOwogICAgIGlm
IChsaXN0ZW5lcikgewogICAgICAgICBTdHJpbmcgdHlwZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdz
WzBdKTsKICAgICAgICAgYm9vbCB1c2VDYXB0dXJlID0gYXJnc1syXS0+Qm9vbGVhblZhbHVlKCk7
CkBAIC02NiwxMyArNjYsMTMgQEAKIENBTExCQUNLX0ZVTkNfREVDTChTVkdFbGVtZW50SW5zdGFu
Y2VSZW1vdmVFdmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFUUygiRE9NLlNWR0VsZW1lbnRJ
bnN0YW5jZS5SZW1vdmVFdmVudExpc3RlbmVyKCkiKTsKLSAgICBTVkdFbGVtZW50SW5zdGFuY2Uq
IGluc3RhbmNlID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0aXZlPFNWR0VsZW1lbnRJbnN0YW5j
ZT4oYXJncy5Ib2xkZXIoKSk7CisgICAgU1ZHRWxlbWVudEluc3RhbmNlKiBpbnN0YW5jZSA9IFY4
UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8U1ZHRWxlbWVudEluc3RhbmNlPihhcmdz
LkhvbGRlcigpKTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUoaW5z
dGFuY2UtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSk7CiAgICAgaWYgKCFwcm94eSkKICAgICAg
ICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBs
aXN0ZW5lciA9IHByb3h5LT5GaW5kVjhFdmVudExpc3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsKKyAg
ICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+ZmluZFY4RXZlbnRMaXN0
ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAgICAgaWYgKGxpc3RlbmVyKSB7CiAgICAgICAgIFN0cmlu
ZyB0eXBlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgICAgICBib29sIHVzZUNhcHR1
cmUgPSBhcmdzWzJdLT5Cb29sZWFuVmFsdWUoKTsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4V2ViS2l0Q1NTTWF0cml4Q29uc3RydWN0b3IuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V2ViS2l0Q1NTTWF0cml4Q29uc3RydWN0b3IuY3Bw
CShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V2ViS2l0
Q1NTTWF0cml4Q29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw3ICs0Nyw3IEBA
CiBDQUxMQkFDS19GVU5DX0RFQ0woV2ViS2l0Q1NTTWF0cml4Q29uc3RydWN0b3IpCiB7CiAgICAg
SU5DX1NUQVRTKCJET00uV2ViS2l0Q1NTTWF0cml4LkNvbnN0cnVjdG9yIik7Ci0gICAgLy8gRklY
TUU6IFRoZSBsb2dpYyBoZXJlIGlzIGFsbW9zdCBleGFjdCBkdXBsaWNhdGUgb2YgVjg6OkNvbnN0
cnVjdERPTU9iamVjdC4KKyAgICAvLyBGSVhNRTogVGhlIGxvZ2ljIGhlcmUgaXMgYWxtb3N0IGV4
YWN0IGR1cGxpY2F0ZSBvZiBWODo6Y29uc3RydWN0RE9NT2JqZWN0LgogICAgIC8vIENvbnNpZGVy
IHJlZmFjdG9yaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGlvbi4KICAgICBTdHJpbmcgY3NzVmFsdWU7
CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPj0gMSkKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAg
dGhyb3dFcnJvcihlYyk7CiAKICAgICAvLyBUcmFuc2Zvcm0gdGhlIGhvbGRlciBpbnRvIGEgd3Jh
cHBlciBvYmplY3QgZm9yIHRoZSBtYXRyaXguCi0gICAgVjhQcm94eTo6U2V0RE9NV3JhcHBlcihh
cmdzLkhvbGRlcigpLCBWOENsYXNzSW5kZXg6OlRvSW50KFY4Q2xhc3NJbmRleDo6V0VCS0lUQ1NT
TUFUUklYKSwgbWF0cml4LmdldCgpKTsKKyAgICBWOFByb3h5OjpzZXRET01XcmFwcGVyKGFyZ3Mu
SG9sZGVyKCksIFY4Q2xhc3NJbmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpXRUJLSVRDU1NNQVRS
SVgpLCBtYXRyaXguZ2V0KCkpOwogICAgIHJldHVybiB0b1Y4KG1hdHJpeC5yZWxlYXNlKCksIGFy
Z3MuSG9sZGVyKCkpOwogfQogCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhU
TUxJRnJhbWVFbGVtZW50Q3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOEhUTUxJRnJhbWVFbGVtZW50Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUp
CisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxJRnJhbWVFbGVtZW50Q3VzdG9t
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzksNyArMzksNyBAQAogCiBBQ0NFU1NPUl9TRVRURVIo
SFRNTElGcmFtZUVsZW1lbnRTcmMpCiB7Ci0gICAgSFRNTElGcmFtZUVsZW1lbnQqIGlmcmFtZSA9
IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTElGcmFtZUVsZW1lbnQ+KGluZm8uSG9sZGVy
KCkpOworICAgIEhUTUxJRnJhbWVFbGVtZW50KiBpZnJhbWUgPSBWOFByb3h5Ojpjb252ZXJ0RE9N
V3JhcHBlclRvTm9kZTxIVE1MSUZyYW1lRWxlbWVudD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgU3Ry
aW5nIHYgPSB2YWx1ZVRvU3RyaW5nV2l0aE51bGxDaGVjayh2YWx1ZSk7CiAKICAgICBpZiAoIWFs
bG93U2V0dGluZ0ZyYW1lU3JjVG9KYXZhc2NyaXB0VXJsKGlmcmFtZSwgdikpCkluZGV4OiBXZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFRyZWVXYWxrZXJDdXN0b20uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4VHJlZVdhbGtlckN1c3RvbS5jcHAJKHJl
dmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhUcmVlV2Fsa2Vy
Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTEsMTMgKzUxLDEzIEBACiAgICAgaWYgKCFv
YmplY3QpCiAgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOwogCi0gICAgcmV0dXJuIFY4UHJveHk6
Ok5vZGVUb1Y4T2JqZWN0KG9iamVjdC5nZXQoKSk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZl
cnROb2RlVG9WOE9iamVjdChvYmplY3QuZ2V0KCkpOwogfQogCiBDQUxMQkFDS19GVU5DX0RFQ0wo
VHJlZVdhbGtlclBhcmVudE5vZGUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uVHJlZVdhbGtlci5w
YXJlbnROb2RlKCkiKTsKLSAgICBUcmVlV2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0luZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhv
bGRlcigpKTsKKyAgICBUcmVlV2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6Y29udmVydFRv
TmF0aXZlT2JqZWN0PFRyZWVXYWxrZXI+KFY4Q2xhc3NJbmRleDo6VFJFRVdBTEtFUiwgYXJncy5I
b2xkZXIoKSk7CiAKICAgICBTY3JpcHRTdGF0ZSBzdGF0ZTsKICAgICBSZWZQdHI8Tm9kZT4gcmVz
dWx0ID0gdHJlZVdhbGtlci0+cGFyZW50Tm9kZSgmc3RhdGUpOwpAQCAtNjcsNyArNjcsNyBAQAog
Q0FMTEJBQ0tfRlVOQ19ERUNMKFRyZWVXYWxrZXJGaXJzdENoaWxkKQogewogICAgIElOQ19TVEFU
UygiRE9NLlRyZWVXYWxrZXIuZmlyc3RDaGlsZCgpIik7Ci0gICAgVHJlZVdhbGtlciogdHJlZVdh
bGtlciA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFRyZWVXYWxrZXI+KFY4Q2xhc3NJbmRleDo6
VFJFRVdBTEtFUiwgYXJncy5Ib2xkZXIoKSk7CisgICAgVHJlZVdhbGtlciogdHJlZVdhbGtlciA9
IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5kZXg6
OlRSRUVXQUxLRVIsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgU2NyaXB0U3RhdGUgc3RhdGU7CiAg
ICAgUmVmUHRyPE5vZGU+IHJlc3VsdCA9IHRyZWVXYWxrZXItPmZpcnN0Q2hpbGQoJnN0YXRlKTsK
QEAgLTc3LDcgKzc3LDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChUcmVlV2Fsa2VyTGFzdENoaWxk
KQogewogICAgIElOQ19TVEFUUygiRE9NLlRyZWVXYWxrZXIubGFzdENoaWxkKCkiKTsKLSAgICBU
cmVlV2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8VHJlZVdhbGtl
cj4oVjhDbGFzc0luZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKKyAgICBUcmVlV2Fs
a2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFRyZWVXYWxr
ZXI+KFY4Q2xhc3NJbmRleDo6VFJFRVdBTEtFUiwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBTY3Jp
cHRTdGF0ZSBzdGF0ZTsKICAgICBSZWZQdHI8Tm9kZT4gcmVzdWx0ID0gdHJlZVdhbGtlci0+bGFz
dENoaWxkKCZzdGF0ZSk7CkBAIC04Nyw3ICs4Nyw3IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woVHJl
ZVdhbGtlck5leHROb2RlKQogewogICAgIElOQ19TVEFUUygiRE9NLlRyZWVXYWxrZXIubmV4dE5v
ZGUoKSIpOwotICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5kZXg6OlRSRUVXQUxLRVIsIGFyZ3MuSG9sZGVyKCkp
OworICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVP
YmplY3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0luZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigp
KTsKIAogICAgIFNjcmlwdFN0YXRlIHN0YXRlOwogICAgIFJlZlB0cjxOb2RlPiByZXN1bHQgPSB0
cmVlV2Fsa2VyLT5uZXh0Tm9kZSgmc3RhdGUpOwpAQCAtOTcsNyArOTcsNyBAQAogQ0FMTEJBQ0tf
RlVOQ19ERUNMKFRyZWVXYWxrZXJQcmV2aW91c05vZGUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00u
VHJlZVdhbGtlci5wcmV2aW91c05vZGUoKSIpOwotICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5kZXg6OlRSRUVX
QUxLRVIsIGFyZ3MuSG9sZGVyKCkpOworICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIgPSBWOFBy
b3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0luZGV4OjpUUkVF
V0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFNjcmlwdFN0YXRlIHN0YXRlOwogICAgIFJl
ZlB0cjxOb2RlPiByZXN1bHQgPSB0cmVlV2Fsa2VyLT5wcmV2aW91c05vZGUoJnN0YXRlKTsKQEAg
LTEwNyw3ICsxMDcsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFRyZWVXYWxrZXJOZXh0U2libGlu
ZykKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5UcmVlV2Fsa2VyLm5leHRTaWJsaW5nKCkiKTsKLSAg
ICBUcmVlV2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8VHJlZVdh
bGtlcj4oVjhDbGFzc0luZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKKyAgICBUcmVl
V2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFRyZWVX
YWxrZXI+KFY4Q2xhc3NJbmRleDo6VFJFRVdBTEtFUiwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBT
Y3JpcHRTdGF0ZSBzdGF0ZTsKICAgICBSZWZQdHI8Tm9kZT4gcmVzdWx0ID0gdHJlZVdhbGtlci0+
bmV4dFNpYmxpbmcoJnN0YXRlKTsKQEAgLTExNyw3ICsxMTcsNyBAQAogQ0FMTEJBQ0tfRlVOQ19E
RUNMKFRyZWVXYWxrZXJQcmV2aW91c1NpYmxpbmcpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uVHJl
ZVdhbGtlci5wcmV2aW91c1NpYmxpbmcoKSIpOwotICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5kZXg6OlRSRUVX
QUxLRVIsIGFyZ3MuSG9sZGVyKCkpOworICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIgPSBWOFBy
b3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0luZGV4OjpUUkVF
V0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFNjcmlwdFN0YXRlIHN0YXRlOwogICAgIFJl
ZlB0cjxOb2RlPiByZXN1bHQgPSB0cmVlV2Fsa2VyLT5wcmV2aW91c1NpYmxpbmcoJnN0YXRlKTsK
SW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMVHJhbnNhY3Rpb25DdXN0b20u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMVHJhbnNh
Y3Rpb25DdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4U1FMVHJhbnNhY3Rpb25DdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiwx
NCArMzIsMTMgQEAKIAogI2lmIEVOQUJMRShEQVRBQkFTRSkKIAotI2luY2x1ZGUgInY4X2JpbmRp
bmcuaCIKLSNpbmNsdWRlICJ2OF9wcm94eS5oIgotCiAjaW5jbHVkZSAiRGF0YWJhc2UuaCIKICNp
bmNsdWRlICJTUUxWYWx1ZS5oIgorI2luY2x1ZGUgIlY4QmluZGluZy5oIgogI2luY2x1ZGUgIlY4
Q3VzdG9tQmluZGluZy5oIgogI2luY2x1ZGUgIlY4Q3VzdG9tU1FMU3RhdGVtZW50Q2FsbGJhY2su
aCIKICNpbmNsdWRlICJWOEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2suaCIKKyNpbmNs
dWRlICJWOFByb3h5LmgiCiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgogCiB1c2luZyBuYW1lc3Bh
Y2UgV1RGOwpAQCAtNTEsNyArNTAsNyBAQAogICAgIElOQ19TVEFUUygiRE9NLlNRTFRyYW5zYWN0
aW9uLmV4ZWN1dGVTcWwoKSIpOwogCiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPT0gMCkgewotICAg
ICAgICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgIlNRTCBzdGF0
ZW1lbnQgaXMgcmVxdWlyZWQuIik7CisgICAgICAgIFY4UHJveHk6OnRocm93RXJyb3IoVjhQcm94
eTo6U1lOVEFYX0VSUk9SLCAiU1FMIHN0YXRlbWVudCBpcyByZXF1aXJlZC4iKTsKICAgICAgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKICAgICB9CiAKQEAgLTYyLDcgKzYxLDcgQEAKICAgICBp
ZiAoYXJncy5MZW5ndGgoKSA+IDEpIHsKICAgICAgICAgLy8gRklYTUU6IE1ha2UgdGhpcyB3b3Jr
IGZvciB2ODo6QXJyYXlpc2ggb2JqZWN0cywgYXMgd2VsbAogICAgICAgICBpZiAoIWFyZ3NbMV0t
PklzQXJyYXkoKSkgewotICAgICAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpU
WVBFX0VSUk9SLCAiU3RhdGVtZW50IGFyZ3VtZW50cyBtdXN0IGJlIGFuIHY4OjpBcnJheS4iKTsK
KyAgICAgICAgICAgIFY4UHJveHk6OnRocm93RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgIlN0
YXRlbWVudCBhcmd1bWVudHMgbXVzdCBiZSBhbiB2ODo6QXJyYXkuIik7CiAgICAgICAgICAgICBy
ZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgICAgICB9CiAKQEAgLTgwLDE0ICs3OSwxNCBAQAog
ICAgICAgICB9CiAgICAgfQogCi0gICAgU1FMVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uID0gVjhQ
cm94eTo6VG9OYXRpdmVPYmplY3Q8U1FMVHJhbnNhY3Rpb24+KFY4Q2xhc3NJbmRleDo6U1FMVFJB
TlNBQ1RJT04sIGFyZ3MuSG9sZGVyKCkpOworICAgIFNRTFRyYW5zYWN0aW9uKiB0cmFuc2FjdGlv
biA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxTUUxUcmFuc2FjdGlvbj4oVjhDbGFz
c0luZGV4OjpTUUxUUkFOU0FDVElPTiwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBGcmFtZSogZnJh
bWUgPSBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lKCk7CiAKICAgICBSZWZQdHI8U1FMU3RhdGVtZW50
Q2FsbGJhY2s+IGNhbGxiYWNrOwogICAgIGlmIChhcmdzLkxlbmd0aCgpID4gMikgewogICAgICAg
ICBpZiAoIWFyZ3NbMl0tPklzT2JqZWN0KCkpIHsKLSAgICAgICAgICAgIFY4UHJveHk6OlRocm93
RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgIlN0YXRlbWVudCBjYWxsYmFjayBtdXN0IGJlIG9m
IHZhbGlkIHR5cGUuIik7CisgICAgICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6
OlRZUEVfRVJST1IsICJTdGF0ZW1lbnQgY2FsbGJhY2sgbXVzdCBiZSBvZiB2YWxpZCB0eXBlLiIp
OwogICAgICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKICAgICAgICAgfQogCkBAIC05
OCw3ICs5Nyw3IEBACiAgICAgUmVmUHRyPFNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2s+IGVycm9y
Q2FsbGJhY2s7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAzKSB7CiAgICAgICAgIGlmICghYXJn
c1syXS0+SXNPYmplY3QoKSkgewotICAgICAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFBy
b3h5OjpUWVBFX0VSUk9SLCAiU3RhdGVtZW50IGVycm9yIGNhbGxiYWNrIG11c3QgYmUgb2YgdmFs
aWQgdHlwZS4iKTsKKyAgICAgICAgICAgIFY4UHJveHk6OnRocm93RXJyb3IoVjhQcm94eTo6VFlQ
RV9FUlJPUiwgIlN0YXRlbWVudCBlcnJvciBjYWxsYmFjayBtdXN0IGJlIG9mIHZhbGlkIHR5cGUu
Iik7CiAgICAgICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgICAgICB9CiAKQEAg
LTEwOCw3ICsxMDcsNyBAQAogCiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAgdHJhbnNh
Y3Rpb24tPmV4ZWN1dGVTUUwoc3RhdGVtZW50LCBzcWxWYWx1ZXMsIGNhbGxiYWNrLCBlcnJvckNh
bGxiYWNrLCBlYyk7Ci0gICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICBWOFBy
b3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogCiAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsK
IH0KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MU2VyaWFsaXplckNvbnN0
cnVjdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFhN
TFNlcmlhbGl6ZXJDb25zdHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhYTUxTZXJpYWxpemVyQ29uc3RydWN0b3IuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zOSw3ICszOSw3IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woWE1MU2VyaWFsaXpl
ckNvbnN0cnVjdG9yKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTFNlcmlhbGl6ZXIuQ29uc3Ry
dWN0b3IiKTsKLSAgICByZXR1cm4gVjhQcm94eTo6Q29uc3RydWN0RE9NT2JqZWN0PFY4Q2xhc3NJ
bmRleDo6WE1MU0VSSUFMSVpFUiwgWE1MU2VyaWFsaXplcj4oYXJncyk7CisgICAgcmV0dXJuIFY4
UHJveHk6OmNvbnN0cnVjdERPTU9iamVjdDxWOENsYXNzSW5kZXg6OlhNTFNFUklBTElaRVIsIFhN
TFNlcmlhbGl6ZXI+KGFyZ3MpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2FsbGJh
Y2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9t
U1FMU3RhdGVtZW50RXJyb3JDYWxsYmFjay5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNTQsMTUgKzU0LDE1IEBACiB7CiAgICAgdjg6OkhhbmRsZVNj
b3BlIGhhbmRsZVNjb3BlOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9
IFY4UHJveHk6OkdldENvbnRleHQobV9mcmFtZS5nZXQoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6
Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQobV9mcmFtZS5nZXQoKSk7CiAgICAg
aWYgKGNvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIHY4OjpD
b250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKIAogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiBhcmd2W10gPSB7Ci0gICAgICAgIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpT
UUxUUkFOU0FDVElPTiwgdHJhbnNhY3Rpb24pLAotICAgICAgICBWOFByb3h5OjpUb1Y4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6U1FMRVJST1IsIGVycm9yKQorICAgICAgICBWOFByb3h5Ojpjb252ZXJ0
VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNRTFRSQU5TQUNUSU9OLCB0cmFuc2FjdGlvbiksCisg
ICAgICAgIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMRVJST1Is
IGVycm9yKQogICAgIH07CiAKICAgICAvLyBQcm90ZWN0IHRoZSBmcmFtZSB1bnRpbCB0aGUgY2Fs
bGJhY2sgcmV0dXJucy4KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9t
U1FMVHJhbnNhY3Rpb25DYWxsYmFjay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhDdXN0b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrLmNwcAkocmV2aXNpb24g
NDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFRyYW5zYWN0
aW9uQ2FsbGJhY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NSwxNCArNTUsMTQgQEAKIHsKICAg
ICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CiAKLSAgICB2ODo6SGFuZGxlPHY4OjpDb250
ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChtX2ZyYW1lLmdldCgpKTsKKyAgICB2
ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6Y29udGV4dChtX2ZyYW1l
LmdldCgpKTsKICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKIAog
ICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKIAogICAgIHY4OjpIYW5kbGU8
djg6OlZhbHVlPiBhcmd2W10gPSB7Ci0gICAgICAgIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFz
c0luZGV4OjpTUUxUUkFOU0FDVElPTiwgdHJhbnNhY3Rpb24pCisgICAgICAgIFY4UHJveHk6OmNv
bnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMVFJBTlNBQ1RJT04sIHRyYW5zYWN0aW9u
KQogICAgIH07CiAKICAgICAvLyBQcm90ZWN0IHRoZSBmcmFtZSB1bnRpbCB0aGUgY2FsbGJhY2sg
cmV0dXJucy4KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MSHR0cFJlcXVl
c3RDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhYTUxIdHRwUmVxdWVzdENvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFhNTEh0dHBSZXF1ZXN0Q29uc3RydWN0b3IuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC01OSwxMSArNTksMTEgQEAKICNlbmRpZgogICAgICAgICBjb250
ZXh0ID0gVjhQcm94eTo6cmV0cmlldmVGcmFtZSgpLT5kb2N1bWVudCgpOwogICAgIFJlZlB0cjxY
TUxIdHRwUmVxdWVzdD4geG1sSHR0cFJlcXVlc3QgPSBYTUxIdHRwUmVxdWVzdDo6Y3JlYXRlKGNv
bnRleHQpOwotICAgIFY4UHJveHk6OlNldERPTVdyYXBwZXIoYXJncy5Ib2xkZXIoKSwgVjhDbGFz
c0luZGV4OjpUb0ludChWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUKSwgeG1sSHR0cFJlcXVl
c3QuZ2V0KCkpOworICAgIFY4UHJveHk6OnNldERPTVdyYXBwZXIoYXJncy5Ib2xkZXIoKSwgVjhD
bGFzc0luZGV4OjpUb0ludChWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUKSwgeG1sSHR0cFJl
cXVlc3QuZ2V0KCkpOwogCiAgICAgLy8gQWRkIG9iamVjdCB0byB0aGUgd3JhcHBlciBtYXAuCiAg
ICAgeG1sSHR0cFJlcXVlc3QtPnJlZigpOwotICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckFj
dGl2ZURPTU9iamVjdCh4bWxIdHRwUmVxdWVzdC5nZXQoKSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9i
amVjdD46Ok5ldyhhcmdzLkhvbGRlcigpKSk7CisgICAgVjhQcm94eTo6c2V0SlNXcmFwcGVyRm9y
QWN0aXZlRE9NT2JqZWN0KHhtbEh0dHBSZXF1ZXN0LmdldCgpLCB2ODo6UGVyc2lzdGVudDx2ODo6
T2JqZWN0Pjo6TmV3KGFyZ3MuSG9sZGVyKCkpKTsKICAgICByZXR1cm4gYXJncy5Ib2xkZXIoKTsK
IH0KIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOEFic3RyYWN0RXZlbnRMaXN0ZW5lci5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOEFic3RyYWN0RXZlbnRMaXN0
ZW5lci5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOEFic3Ry
YWN0RXZlbnRMaXN0ZW5lci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU1LDcgKzU1LDcgQEAKICAg
ICB9CiB9CiAKLXZvaWQgVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6Omludm9rZUV2ZW50SGFuZGxl
cih2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0LCBFdmVudCogZXZlbnQsIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBqc0V2ZW50LCBib29sIGlzV2luZG93RXZlbnQpCit2b2lkIFY4QWJzdHJh
Y3RFdmVudExpc3RlbmVyOjppbnZva2VFdmVudEhhbmRsZXIodjg6OkhhbmRsZTx2ODo6Q29udGV4
dD4gdjhDb250ZXh0LCBFdmVudCogZXZlbnQsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBqc0V2ZW50
LCBib29sIGlzV2luZG93RXZlbnQpCiB7CiAgICAgLy8gV2UgcHVzaCB0aGUgZXZlbnQgYmVpbmcg
cHJvY2Vzc2VkIGludG8gdGhlIGdsb2JhbCBvYmplY3QsIHNvIHRoYXQgaXQgY2FuIGJlIGV4cG9z
ZWQgYnkgRE9NV2luZG93J3MgYmluZGluZ3MuCiAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGV2
ZW50U3ltYm9sID0gdjg6OlN0cmluZzo6TmV3U3ltYm9sKCJldmVudCIpOwpAQCAtNjcsMTEgKzY3
LDExIEBACiAgICAgICAgIHRyeUNhdGNoLlNldFZlcmJvc2UodHJ1ZSk7CiAKICAgICAgICAgLy8g
U2F2ZSB0aGUgb2xkICdldmVudCcgcHJvcGVydHkgc28gd2UgY2FuIHJlc3RvcmUgaXQgbGF0ZXIu
Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHNhdmVkRXZlbnQgPSBjb250ZXh0LT5HbG9i
YWwoKS0+R2V0SGlkZGVuVmFsdWUoZXZlbnRTeW1ib2wpOworICAgICAgICB2ODo6TG9jYWw8djg6
OlZhbHVlPiBzYXZlZEV2ZW50ID0gdjhDb250ZXh0LT5HbG9iYWwoKS0+R2V0SGlkZGVuVmFsdWUo
ZXZlbnRTeW1ib2wpOwogICAgICAgICB0cnlDYXRjaC5SZXNldCgpOwogCiAgICAgICAgIC8vIE1h
a2UgdGhlIGV2ZW50IGF2YWlsYWJsZSBpbiB0aGUgZ2xvYmFsIG9iamVjdCwgc28gRE9NV2luZG93
IGNhbiBleHBvc2UgaXQuCi0gICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5TZXRIaWRkZW5WYWx1
ZShldmVudFN5bWJvbCwganNFdmVudCk7CisgICAgICAgIHY4Q29udGV4dC0+R2xvYmFsKCktPlNl
dEhpZGRlblZhbHVlKGV2ZW50U3ltYm9sLCBqc0V2ZW50KTsKICAgICAgICAgdHJ5Q2F0Y2guUmVz
ZXQoKTsKIAogICAgICAgICAvLyBDYWxsIHRoZSBldmVudCBoYW5kbGVyLgpAQCAtODAsMTMgKzgw
LDEzIEBACiAKICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb2xkIGV2ZW50LiBUaGlzIG11c3QgYmUg
ZG9uZSBmb3IgYWxsIGV4aXQgcGF0aHMgdGhyb3VnaCB0aGlzIG1ldGhvZC4KICAgICAgICAgaWYg
KHNhdmVkRXZlbnQuSXNFbXB0eSgpKQotICAgICAgICAgICAgY29udGV4dC0+R2xvYmFsKCktPlNl
dEhpZGRlblZhbHVlKGV2ZW50U3ltYm9sLCB2ODo6VW5kZWZpbmVkKCkpOworICAgICAgICAgICAg
djhDb250ZXh0LT5HbG9iYWwoKS0+U2V0SGlkZGVuVmFsdWUoZXZlbnRTeW1ib2wsIHY4OjpVbmRl
ZmluZWQoKSk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5T
ZXRIaWRkZW5WYWx1ZShldmVudFN5bWJvbCwgc2F2ZWRFdmVudCk7CisgICAgICAgICAgICB2OENv
bnRleHQtPkdsb2JhbCgpLT5TZXRIaWRkZW5WYWx1ZShldmVudFN5bWJvbCwgc2F2ZWRFdmVudCk7
CiAgICAgICAgIHRyeUNhdGNoLlJlc2V0KCk7CiAgICAgfQogCi0gICAgQVNTRVJUKCFWOFByb3h5
OjpIYW5kbGVPdXRPZk1lbW9yeSgpIHx8IHJldHVyblZhbHVlLklzRW1wdHkoKSk7CisgICAgQVNT
RVJUKCFWOFByb3h5OjpoYW5kbGVPdXRPZk1lbW9yeSgpIHx8IHJldHVyblZhbHVlLklzRW1wdHko
KSk7CiAKICAgICBpZiAocmV0dXJuVmFsdWUuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CkBA
IC0xMTIsMjAgKzExMiwyMCBAQAogCiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwog
Ci0gICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRl
eHQobV9mcmFtZSk7Ci0gICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgIHY4OjpIYW5kbGU8
djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQobV9mcmFtZSk7CisgICAg
aWYgKHY4Q29udGV4dC5Jc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKIAogICAgIC8vIG1fZnJh
bWUgY2FuIHJlbW92ZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLCBwcm90ZWN0IGl0IHVudGls
IHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zLgogICAgIFJlZlB0cjxGcmFtZT4gcHJvdGVj
dEZyYW1lKG1fZnJhbWUpOwogCiAgICAgLy8gRW50ZXIgdGhlIFY4IGNvbnRleHQgaW4gd2hpY2gg
dG8gcGVyZm9ybSB0aGUgZXZlbnQgaGFuZGxpbmcuCi0gICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNj
b3BlKGNvbnRleHQpOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZSh2OENvbnRleHQpOwog
CiAgICAgLy8gR2V0IHRoZSBWOCB3cmFwcGVyIGZvciB0aGUgZXZlbnQgb2JqZWN0LgotICAgIHY4
OjpIYW5kbGU8djg6OlZhbHVlPiBqc0V2ZW50ID0gVjhQcm94eTo6RXZlbnRUb1Y4T2JqZWN0KGV2
ZW50KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4ganNFdmVudCA9IFY4UHJveHk6OmNvbnZl
cnRFdmVudFRvVjhPYmplY3QoZXZlbnQpOwogCi0gICAgaW52b2tlRXZlbnRIYW5kbGVyKGNvbnRl
eHQsIGV2ZW50LCBqc0V2ZW50LCBpc1dpbmRvd0V2ZW50KTsKKyAgICBpbnZva2VFdmVudEhhbmRs
ZXIodjhDb250ZXh0LCBldmVudCwganNFdmVudCwgaXNXaW5kb3dFdmVudCk7CiAKICAgICBEb2N1
bWVudDo6dXBkYXRlU3R5bGVGb3JBbGxEb2N1bWVudHMoKTsKIH0KQEAgLTEzNCw3ICsxMzQsNyBA
QAogewogICAgIGlmICghbV9saXN0ZW5lci5Jc0VtcHR5KCkpIHsKICNpZm5kZWYgTkRFQlVHCi0g
ICAgICAgIFY4UHJveHk6OlVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9saXN0ZW5lcik7
CisgICAgICAgIFY4UHJveHk6OnVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9saXN0ZW5l
cik7CiAjZW5kaWYKICAgICAgICAgbV9saXN0ZW5lci5EaXNwb3NlKCk7CiAgICAgICAgIG1fbGlz
dGVuZXIuQ2xlYXIoKTsKQEAgLTE1MCw3ICsxNTAsNyBAQAogICAgICAgICByZXR1cm4gdjg6OkNv
bnRleHQ6OkdldEN1cnJlbnQoKS0+R2xvYmFsKCk7CiAKICAgICBFdmVudFRhcmdldCogdGFyZ2V0
ID0gZXZlbnQtPmN1cnJlbnRUYXJnZXQoKTsKLSAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFs
dWUgPSBWOFByb3h5OjpFdmVudFRhcmdldFRvVjhPYmplY3QodGFyZ2V0KTsKKyAgICB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gdmFsdWUgPSBWOFByb3h5Ojpjb252ZXJ0RXZlbnRUYXJnZXRUb1Y4T2Jq
ZWN0KHRhcmdldCk7CiAgICAgaWYgKHZhbHVlLklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIHY4
OjpMb2NhbDx2ODo6T2JqZWN0PigpOwogICAgIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD46
Ok5ldyh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHZhbHVlKSk7CkluZGV4OiBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L1NjcmlwdEluc3RhbmNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L1NjcmlwdEluc3RhbmNlLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L1NjcmlwdEluc3RhbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjIsNyAr
NjIsNyBAQAogICAgIGlmIChtX2luc3RhbmNlLklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwog
I2lmbmRlZiBOREVCVUcKLSAgICBWOFByb3h5OjpVbnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMs
IG1faW5zdGFuY2UpOworICAgIFY4UHJveHk6OnVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywg
bV9pbnN0YW5jZSk7CiAjZW5kaWYKICAgICBtX2luc3RhbmNlLkRpc3Bvc2UoKTsKICAgICBtX2lu
c3RhbmNlLkNsZWFyKCk7CkBAIC03Niw3ICs3Niw3IEBACiAKICAgICBtX2luc3RhbmNlID0gdjg6
OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhpbnN0YW5jZSk7CiAjaWZuZGVmIE5ERUJVRwot
ICAgIFY4UHJveHk6OlJlZ2lzdGVyR2xvYmFsSGFuZGxlKFNDUklQVElOU1RBTkNFLCB0aGlzLCBt
X2luc3RhbmNlKTsKKyAgICBWOFByb3h5OjpyZWdpc3Rlckdsb2JhbEhhbmRsZShTQ1JJUFRJTlNU
QU5DRSwgdGhpcywgbV9pbnN0YW5jZSk7CiAjZW5kaWYKIH0KIApJbmRleDogV2ViQ29yZS9iaW5k
aW5ncy92OC9WOERPTU1hcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9W
OERPTU1hcC5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOERP
TU1hcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0OCw3ICszNDgsNyBAQAogICAgIHY4OjpIYW5k
bGVTY29wZSBzY29wZTsKICAgICBBU1NFUlQodjhPYmplY3QtPklzT2JqZWN0KCkpOwogCi0gICAg
VjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFwcGVy
VHlwZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSk7CisgICAgVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5Ojpkb21XcmFwcGVyVHlwZSh2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSk7CiAKICAgICBUaHJlYWRTcGVjaWZp
Y0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgbWFwID0gc3RhdGljX2Nhc3Q8
VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mPihnZXRE
T01TVkdPYmplY3RXaXRoQ29udGV4dE1hcCgpKTsKICAgICBpZiAobWFwLmNvbnRhaW5zKGRvbU9i
amVjdCkpIHsKQEAgLTQxNSw3ICs0MTUsNyBAQAogICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsK
ICAgICBBU1NFUlQodjhPYmplY3QtPklzT2JqZWN0KCkpOwogCi0gICAgVjhDbGFzc0luZGV4OjpW
OFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFwcGVyVHlwZSh2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSk7CisgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBw
ZXJUeXBlIHR5cGUgPSBWOFByb3h5Ojpkb21XcmFwcGVyVHlwZSh2ODo6SGFuZGxlPHY4OjpPYmpl
Y3Q+OjpDYXN0KHY4T2JqZWN0KSk7CiAKICAgICBUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVy
bmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgbWFwID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNE
T01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mPihnZXRET01PYmplY3RNYXAoKSk7
CiAgICAgaWYgKG1hcC5jb250YWlucyhkb21PYmplY3QpKSB7CkBAIC00NDAsNyArNDQwLDcgQEAK
ICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CiAgICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVj
dCgpKTsKIAotICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6
R2V0RE9NV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkp
OworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6ZG9tV3Jh
cHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOwogCiAgICAg
VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mIG1hcCA9
IHN0YXRpY19jYXN0PFRocmVhZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJuYWxET01XcmFwcGVyTWFw
PHZvaWQ+Jj4oZ2V0QWN0aXZlRE9NT2JqZWN0TWFwKCkpOwogICAgIGlmIChtYXAuY29udGFpbnMo
ZG9tT2JqZWN0KSkgewpAQCAtNTI4LDcgKzUyOCw3IEBACiAgICAgICAgIFQqIGRvbU9iamVjdCA9
IHN0YXRpY19jYXN0PFQqPihpdGVyLT5maXJzdCk7CiAgICAgICAgIHY4OjpQZXJzaXN0ZW50PHY4
OjpPYmplY3Q+IHY4T2JqZWN0KGl0ZXItPnNlY29uZCk7CiAKLSAgICAgICAgVjhDbGFzc0luZGV4
OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFwcGVyVHlwZSh2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSk7CisgICAgICAgIFY4Q2xhc3NJbmRleDo6
VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6ZG9tV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2
ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOwogCiAgICAgICAgIC8vIERlcmVmIHRoZSBET00g
b2JqZWN0LgogICAgICAgICBkZXJlZk9iamVjdCh0eXBlLCBkb21PYmplY3QpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31806</attachid>
            <date>2009-06-24 13:39:19 -0700</date>
            <delta_ts>2009-06-24 16:29:12 -0700</delta_ts>
            <desc>patch3</desc>
            <filename>patch3.txt</filename>
            <type>text/plain</type>
            <size>359318</size>
            <attacher name="Nate Chapin">japhet</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDk5MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMDktMDYtMjQgIE5hdGUgQ2hhcGluICA8amFwaGV0QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBV
cHN0cmVhbSBWOFByb3h5LgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0yNjYyMworCisgICAgICAgICogYmluZGluZ3MvdjgvVjhQcm94eS5jcHA6IFBv
cnRlZCBmcm9tIHN2bi5jaHJvbWl1bS5vcmcgKHNwZWNpZmljIGZ1bmN0aW9uIGVudHJpZXMgcmVt
b3ZlZCBzaW5jZSBpdCdkIGJlIG1hbnkgbGluZXMgb2YgcmVkdW5kYW5jeSkuCisgICAgICAgICog
YmluZGluZ3MvdjgvVjhQcm94eS5oOiBQb3J0ZWQgZnJvbSBzdm4uY2hyb21pdW0ub3JnIChzcGVj
aWZpYyBmdW5jdGlvbiBlbnRyaWVzIHJlbW92ZWQgc2luY2UgaXQnZCBiZSBtYW55IGxpbmVzIG9m
IHJlZHVuZGFuY3kpLgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRp
b25Qcm94eS5jcHA6IENoYW5nZWQgZG9tT2JqZWN0TWFwKCkgcmVmZXJlbmNlcyB0byBnZXRET01P
YmplY3RNYXAoKS4KKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhEYXRhYmFzZUN1c3Rv
bS5jcHA6IFVwZGF0ZWQgI2luY2x1ZGUuCisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4
U1FMUmVzdWx0U2V0Um93TGlzdEN1c3RvbS5jcHA6IFVwZGF0ZWQgI2luY2x1ZGUuCisgICAgICAg
ICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMVHJhbnNhY3Rpb25DdXN0b20uY3BwOiBVcGRhdGVk
ICNpbmNsdWRlLgorCiAyMDA5LTA2LTIzICBFcmljIENhcmxzb24gIDxlcmljLmNhcmxzb25AYXBw
bGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFkbGVyLgpJbmRleDogV2ViQ29y
ZS9iaW5kaW5ncy92OC9TY3JpcHRTY29wZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5k
aW5ncy92OC9TY3JpcHRTY29wZS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5k
aW5ncy92OC9TY3JpcHRTY29wZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQzLDcgKzQzLDcgQEAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogU2NyaXB0U2NvcGU6OlNjcmlwdFNjb3BlKFNjcmlwdFN0
YXRlKiBzY3JpcHRTdGF0ZSwgYm9vbCByZXBvcnRFeGNlcHRpb25zKQotICAgIDogbV9jb250ZXh0
KFY4UHJveHk6OkdldENvbnRleHQoc2NyaXB0U3RhdGUtPmZyYW1lKCkpKQorICAgIDogbV9jb250
ZXh0KFY4UHJveHk6OmNvbnRleHQoc2NyaXB0U3RhdGUtPmZyYW1lKCkpKQogICAgICwgbV9zY29w
ZShtX2NvbnRleHQpCiAgICAgLCBtX3NjcmlwdFN0YXRlKHNjcmlwdFN0YXRlKQogICAgICwgbV9y
ZXBvcnRFeGNlcHRpb25zKHJlcG9ydEV4Y2VwdGlvbnMpCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdz
L3Y4L1Y4VXRpbGl0aWVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOFV0
aWxpdGllcy5oCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhVdGls
aXRpZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMzEsOSArMzEsNiBAQAogI2lmbmRlZiBWOFV0aWxp
dGllc19oCiAjZGVmaW5lIFY4VXRpbGl0aWVzX2gKIAotLy8gRklYTUU6IFJlbW92ZSBvbmNlIGNo
cm9taXVtIGRlcGVuZGVuY2llcyBvbiB2OF91dGlsaXR5LmggYXJlIHJlbW92ZWQuCi0jZGVmaW5l
IFY4VVRJTElUSUVTX0RFRklORUQgMQotCiAjaW5jbHVkZSA8djguaD4KIAogbmFtZXNwYWNlIFdl
YkNvcmUgewpAQCAtNzUsMTEgKzcyLDYgQEAKICAgICAgIHN0YXRpYyBpbmxpbmUgdjg6OkxvY2Fs
PHY4OjpPYmplY3Q+IG5ld0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPik7CiAgICAg
ICBzdGF0aWMgaW5saW5lIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBuZXdJbnN0YW5jZSh2ODo6SGFu
ZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4pOwogICAgICAgc3RhdGljIGlubGluZSB2ODo6TG9jYWw8
djg6Ok9iamVjdD4gbmV3SW5zdGFuY2Uodjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+LCBpbnQgYXJn
Yywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZ3ZbXSk7Ci0KLSAgICAgIC8vIEZJWE1FOiBUaGVz
ZSBOZXdJbnN0YW5jZSBmdW5jdGlvbnMgYXJlIGhlcmUgdG8gZWFzZSB1cHN0cmVhbWluZy4gUmVt
b3ZlIGFsb25nIHdpdGggVjhVVElMSVRJRVNfREVGSU5FRCBvbmNlIGNocm9taXVtIGRlcGVuZGVu
Y2llcyBvbiB2OF91dGlsaXR5LmggYXJlIHJlbW92ZWQuCi0gICAgICBzdGF0aWMgaW5saW5lIHY4
OjpMb2NhbDx2ODo6T2JqZWN0PiBOZXdJbnN0YW5jZSh2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4p
OwotICAgICAgc3RhdGljIGlubGluZSB2ODo6TG9jYWw8djg6Ok9iamVjdD4gTmV3SW5zdGFuY2Uo
djg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+KTsKLSAgICAgIHN0YXRpYyBpbmxpbmUgdjg6
OkxvY2FsPHY4OjpPYmplY3Q+IE5ld0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiwg
aW50IGFyZ2MsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmd2W10pOwogICAgIH07CiAKICAgICB2
ODo6TG9jYWw8djg6Ok9iamVjdD4gU2FmZUFsbG9jYXRpb246Om5ld0luc3RhbmNlKHY4OjpIYW5k
bGU8djg6OkZ1bmN0aW9uPiBmdW5jdGlvbikKQEAgLTEwNiwyMiArOTgsNiBAQAogICAgICAgICBy
ZXR1cm4gZnVuY3Rpb24tPk5ld0luc3RhbmNlKGFyZ2MsIGFyZ3YpOwogICAgIH0KIAotICAgIC8v
IEZJWE1FOiBUaGVzZSBOZXdJbnN0YW5jZSBmdW5jdGlvbnMgYXJlIGhlcmUgdG8gZWFzZSB1cHN0
cmVhbWluZy4gUmVtb3ZlIGFsb25nIHdpdGggVjhVVElMSVRJRVNfREVGSU5FRCBvbmNlIGNocm9t
aXVtIGRlcGVuZGVuY2llcyBvbiB2OF91dGlsaXR5LmggYXJlIHJlbW92ZWQuCi0gICAgdjg6Okxv
Y2FsPHY4OjpPYmplY3Q+IFNhZmVBbGxvY2F0aW9uOjpOZXdJbnN0YW5jZSh2ODo6SGFuZGxlPHY4
OjpGdW5jdGlvbj4gZnVuY3Rpb24pCi0gICAgewotICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2Uo
ZnVuY3Rpb24pOwotICAgIH0KLQotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBTYWZlQWxsb2Nh
dGlvbjo6TmV3SW5zdGFuY2Uodjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+IG9iamVjdFRl
bXBsYXRlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKG9iamVjdFRlbXBsYXRl
KTsKLSAgICB9Ci0KLSAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gU2FmZUFsbG9jYXRpb246Ok5l
d0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiBmdW5jdGlvbiwgaW50IGFyZ2MsIHY4
OjpIYW5kbGU8djg6OlZhbHVlPiBhcmd2W10pCi0gICAgewotICAgICAgICByZXR1cm4gbmV3SW5z
dGFuY2UoZnVuY3Rpb24sIGFyZ2MsIGFyZ3YpOwotICAgIH0KLQogfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQogCiAjZW5kaWYgLy8gVjhVdGlsaXRpZXNfaApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92
OC9WOFByb3h5LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOFByb3h5LmgJ
KHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOFByb3h5LmgJKHdvcmtp
bmcgY29weSkKQEAgLTMxLDEyICszMSw2MTQgQEAKICNpZm5kZWYgVjhQcm94eV9oCiAjZGVmaW5l
IFY4UHJveHlfaAogCi0vLyBGSVhNRTogVGhpcyBpcyBhIHRlbXBvcmFyeSBmb3J3YXJkaW5nIGhl
YWRlciB1bnRpbCBhbGwgYmluZGluZ3MgaGF2ZSBtaWdyYXRlZAotLy8gb3ZlciBhbmQgdjhfcHJv
eHkgYWN0dWFsbHkgYmVjb21lcyBWOFByb3h5LgotI2luY2x1ZGUgInY4X3Byb3h5LmgiCisjaW5j
bHVkZSAiQ2hyb21pdW1CcmlkZ2UuaCIKKyNpbmNsdWRlICJOb2RlLmgiCisjaW5jbHVkZSAiTm9k
ZUZpbHRlci5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiIC8vIGZvciBXZWJDb3JlOjpT
dHJpbmcKKyNpbmNsdWRlICJTY3JpcHRTb3VyY2VDb2RlLmgiIC8vIGZvciBXZWJDb3JlOjpTY3Jp
cHRTb3VyY2VDb2RlCisjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIgLy8gZm9yIFdlYkNvcmU6
OlNlY3VyaXR5T3JpZ2luCisjaW5jbHVkZSAiVjhDdXN0b21CaW5kaW5nLmgiCisjaW5jbHVkZSAi
VjhET01NYXAuaCIKKyNpbmNsdWRlICJWOEV2ZW50TGlzdGVuZXJMaXN0LmgiCisjaW5jbHVkZSAi
VjhJbmRleC5oIgorI2luY2x1ZGUgIlY4VXRpbGl0aWVzLmgiCisjaW5jbHVkZSA8djguaD4KKyNp
bmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+IC8v
IHNvIGdlbmVyYXRlZCBiaW5kaW5ncyBkb24ndCBoYXZlIHRvCisjaW5jbHVkZSA8d3RmL1ZlY3Rv
ci5oPgogCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGlzdD4KKworI2lmZGVmIEVO
QUJMRV9ET01fU1RBVFNfQ09VTlRFUlMKKyNkZWZpbmUgSU5DX1NUQVRTKG5hbWUpIENocm9taXVt
QnJpZGdlOjppbmNyZW1lbnRTdGF0c0NvdW50ZXIobmFtZSkKKyNlbHNlCisjZGVmaW5lIElOQ19T
VEFUUyhuYW1lKQorI2VuZGlmCisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorICAgIGNsYXNzIENT
U1N0eWxlRGVjbGFyYXRpb247CisgICAgY2xhc3MgQ2xpZW50UmVjdExpc3Q7CisgICAgY2xhc3Mg
RE9NSW1wbGVtZW50YXRpb247CisgICAgY2xhc3MgRWxlbWVudDsKKyAgICBjbGFzcyBFdmVudDsK
KyAgICBjbGFzcyBFdmVudExpc3RlbmVyOworICAgIGNsYXNzIEZyYW1lOworICAgIGNsYXNzIEhU
TUxDb2xsZWN0aW9uOworICAgIGNsYXNzIEhUTUxPcHRpb25zQ29sbGVjdGlvbjsKKyAgICBjbGFz
cyBIVE1MRWxlbWVudDsKKyAgICBjbGFzcyBIVE1MRG9jdW1lbnQ7CisgICAgY2xhc3MgTWVkaWFM
aXN0OworICAgIGNsYXNzIE5hbWVkTm9kZU1hcDsKKyAgICBjbGFzcyBOb2RlOworICAgIGNsYXNz
IE5vZGVMaXN0OworICAgIGNsYXNzIFNjcmVlbjsKKyAgICBjbGFzcyBTdHJpbmc7CisgICAgY2xh
c3MgU3R5bGVTaGVldDsKKyAgICBjbGFzcyBTVkdFbGVtZW50OworICAgIGNsYXNzIERPTVdpbmRv
dzsKKyAgICBjbGFzcyBEb2N1bWVudDsKKyAgICBjbGFzcyBFdmVudFRhcmdldDsKKyAgICBjbGFz
cyBFdmVudDsKKyAgICBjbGFzcyBFdmVudExpc3RlbmVyOworICAgIGNsYXNzIE5hdmlnYXRvcjsK
KyAgICBjbGFzcyBNaW1lVHlwZTsKKyAgICBjbGFzcyBNaW1lVHlwZUFycmF5OworICAgIGNsYXNz
IFBsdWdpbjsKKyAgICBjbGFzcyBQbHVnaW5BcnJheTsKKyAgICBjbGFzcyBTdHlsZVNoZWV0TGlz
dDsKKyAgICBjbGFzcyBDU1NWYWx1ZTsKKyAgICBjbGFzcyBDU1NSdWxlOworICAgIGNsYXNzIENT
U1J1bGVMaXN0OworICAgIGNsYXNzIENTU1ZhbHVlTGlzdDsKKyAgICBjbGFzcyBOb2RlRmlsdGVy
OworICAgIGNsYXNzIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ7CisKKyNpZiBFTkFCTEUoRE9NX1NU
T1JBR0UpCisgICAgY2xhc3MgU3RvcmFnZTsKKyAgICBjbGFzcyBTdG9yYWdlRXZlbnQ7CisjZW5k
aWYKKworICNpZiBFTkFCTEUoU1ZHKQorICAgIGNsYXNzIFNWR0VsZW1lbnRJbnN0YW5jZTsKKyAj
ZW5kaWYKKworICAgIGNsYXNzIFY4RXZlbnRMaXN0ZW5lcjsKKyAgICBjbGFzcyBWOE9iamVjdEV2
ZW50TGlzdGVuZXI7CisKKyAgICAvLyBGSVhNRTogdXNlIHN0YW5kYXJkIGxvZ2dpbmcgZmFjaWxp
dGllcyBpbiBXZWJDb3JlLgorICAgIHZvaWQgbG9nSW5mbyhGcmFtZSogZnJhbWUsIGNvbnN0IFN0
cmluZyYgbXNnLCBjb25zdCBTdHJpbmcmIHVybCk7CisKKyNpZm5kZWYgTkRFQlVHCisKKyNkZWZp
bmUgR2xvYmFsSGFuZGxlVHlwZUxpc3QoVikgICBcCisgICAgVihQUk9YWSkgICAgICAgICAgICAg
ICAgICAgICAgXAorICAgIFYoTlBPQkpFQ1QpICAgICAgICAgICAgICAgICAgIFwKKyAgICBWKFND
SEVEVUxFRF9BQ1RJT04pICAgICAgICAgICBcCisgICAgVihFVkVOVF9MSVNURU5FUikgICAgICAg
ICAgICAgXAorICAgIFYoTk9ERV9GSUxURVIpICAgICAgICAgICAgICAgIFwKKyAgICBWKFNDUklQ
VElOU1RBTkNFKSAgICAgICAgICAgICBcCisgICAgVihTQ1JJUFRWQUxVRSkKKworCisgICAgLy8g
SG9zdCBpbmZvcm1hdGlvbiBvZiBwZXJzaXN0ZW50IGhhbmRsZXMuCisgICAgZW51bSBHbG9iYWxI
YW5kbGVUeXBlIHsKKyNkZWZpbmUgRU5VTShuYW1lKSBuYW1lLAorICAgICAgICBHbG9iYWxIYW5k
bGVUeXBlTGlzdChFTlVNKQorI3VuZGVmIEVOVU0KKyAgICB9OworCisKKyAgICBjbGFzcyBHbG9i
YWxIYW5kbGVJbmZvIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEdsb2JhbEhhbmRsZUluZm8odm9p
ZCogaG9zdCwgR2xvYmFsSGFuZGxlVHlwZSB0eXBlKSA6IGhvc3RfKGhvc3QpLCB0eXBlXyh0eXBl
KSB7IH0KKyAgICAgICAgdm9pZCogaG9zdF87CisgICAgICAgIEdsb2JhbEhhbmRsZVR5cGUgdHlw
ZV87CisgICAgfTsKKworI2VuZGlmICAvLyBOREVCVUcKKworICAgIC8vIFRoZSBmb2xsb3dpbmcg
QmF0Y2ggc3RydWN0cyBhbmQgbWV0aG9kcyBhcmUgdXNlZCBmb3Igc2V0dGluZyBtdWx0aXBsZQor
ICAgIC8vIHByb3BlcnRpZXMgb24gYW4gT2JqZWN0VGVtcGxhdGUsIHVzZWQgZnJvbSB0aGUgZ2Vu
ZXJhdGVkIGJpbmRpbmdzCisgICAgLy8gaW5pdGlhbGl6YXRpb24gKENvbmZpZ3VyZVhYWFRlbXBs
YXRlKS4gIFRoaXMgZ3JlYXRseSByZWR1Y2VzIHRoZSBiaW5hcnkKKyAgICAvLyBzaXplIGJ5IG1v
dmluZyBmcm9tIGNvZGUgZHJpdmVuIHNldHVwIHRvIGRhdGEgdGFibGUgZHJpdmVuIHNldHVwLgor
CisgICAgLy8gQmF0Y2hlZEF0dHJpYnV0ZSB0cmFuc2xhdGVzIGludG8gY2FsbHMgdG8gU2V0QWNj
ZXNzb3IoKSBvbiBlaXRoZXIgdGhlCisgICAgLy8gaW5zdGFuY2Ugb3IgdGhlIHByb3RvdHlwZSBP
YmplY3RUZW1wbGF0ZSwgYmFzZWQgb24gfG9uUHJvdG98LgorICAgIHN0cnVjdCBCYXRjaGVkQXR0
cmlidXRlIHsKKyAgICAgICAgY29uc3QgY2hhciogY29uc3QgbmFtZTsKKyAgICAgICAgdjg6OkFj
Y2Vzc29yR2V0dGVyIGdldHRlcjsKKyAgICAgICAgdjg6OkFjY2Vzc29yU2V0dGVyIHNldHRlcjsK
KyAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIGRhdGE7CisgICAgICAgIHY4OjpB
Y2Nlc3NDb250cm9sIHNldHRpbmdzOworICAgICAgICB2ODo6UHJvcGVydHlBdHRyaWJ1dGUgYXR0
cmlidXRlOworICAgICAgICBib29sIG9uUHJvdG87CisgICAgfTsKKworICAgIHZvaWQgYmF0Y2hD
b25maWd1cmVBdHRyaWJ1dGVzKHY4OjpIYW5kbGU8djg6Ok9iamVjdFRlbXBsYXRlPiwgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+LCBjb25zdCBCYXRjaGVkQXR0cmlidXRlKiwgc2l6ZV90
IGF0dHJpYnV0ZUNvdW50KTsKKworICAgIC8vIEJhdGNoZWRDb25zdGFudCB0cmFuc2xhdGVzIGlu
dG8gY2FsbHMgdG8gU2V0KCkgZm9yIHNldHRpbmcgdXAgYW4gb2JqZWN0J3MKKyAgICAvLyBjb25z
dGFudHMuICBJdCBzZXRzIHRoZSBjb25zdGFudCBvbiBib3RoIHRoZSBGdW5jdGlvblRlbXBsYXRl
IGFuZCB0aGUKKyAgICAvLyBPYmplY3RUZW1wbGF0ZS4gIFByb3BlcnR5QXR0cmlidXRlcyBpcyBh
bHdheXMgUmVhZE9ubHkuCisgICAgc3RydWN0IEJhdGNoZWRDb25zdGFudCB7CisgICAgICAgIGNv
bnN0IGNoYXIqIGNvbnN0IG5hbWU7CisgICAgICAgIGludCB2YWx1ZTsKKyAgICB9OworCisgICAg
dm9pZCBiYXRjaENvbmZpZ3VyZUNvbnN0YW50cyh2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBs
YXRlPiwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+LCBjb25zdCBCYXRjaGVkQ29uc3Rh
bnQqLCBzaXplX3QgY29uc3RhbnRDb3VudCk7CisKKyAgICBjb25zdCBpbnQga01heFJlY3Vyc2lv
bkRlcHRoID0gMjA7CisKKyAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhbiBleHRlbnNpb24gdGhh
dCBpcyByZWdpc3RlcmVkIGZvciB1c2Ugd2l0aCBWOC4gSWYgc2NoZW1lCisgICAgLy8gaXMgbm9u
LWVtcHR5LCBpdCBjb250YWlucyB0aGUgVVJMIHNjaGVtZSB0aGUgZXh0ZW5zaW9uIHNob3VsZCBi
ZSB1c2VkIHdpdGguCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgZXh0ZW5zaW9uIGlzIHVzZWQgd2l0
aCBhbGwgc2NoZW1lcy4KKyAgICBzdHJ1Y3QgVjhFeHRlbnNpb25JbmZvIHsKKyAgICAgICAgU3Ry
aW5nIHNjaGVtZTsKKyAgICAgICAgdjg6OkV4dGVuc2lvbiogZXh0ZW5zaW9uOworICAgIH07Cisg
ICAgdHlwZWRlZiBzdGQ6Omxpc3Q8VjhFeHRlbnNpb25JbmZvPiBWOEV4dGVuc2lvbkxpc3Q7CisK
KyAgICBjbGFzcyBWOFByb3h5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8vIFRoZSB0eXBlcyBv
ZiBqYXZhc2NyaXB0IGVycm9ycyB0aGF0IGNhbiBiZSB0aHJvd24uCisgICAgICAgIGVudW0gRXJy
b3JUeXBlIHsKKyAgICAgICAgICAgIFJBTkdFX0VSUk9SLAorICAgICAgICAgICAgUkVGRVJFTkNF
X0VSUk9SLAorICAgICAgICAgICAgU1lOVEFYX0VSUk9SLAorICAgICAgICAgICAgVFlQRV9FUlJP
UiwKKyAgICAgICAgICAgIEdFTkVSQUxfRVJST1IKKyAgICAgICAgfTsKKworICAgICAgICBleHBs
aWNpdCBWOFByb3h5KEZyYW1lKiBmcmFtZSkgOiBtX2ZyYW1lKGZyYW1lKSwgbV9pbmxpbmVDb2Rl
KGZhbHNlKSwgbV90aW1lckNhbGxiYWNrKGZhbHNlKSwgbV9yZWN1cnNpb24oMCkgeyB9CisKKyAg
ICAgICAgflY4UHJveHkoKTsKKworICAgICAgICBGcmFtZSogZnJhbWUoKSB7IHJldHVybiBtX2Zy
YW1lOyB9CisKKyAgICAgICAgLy8gQ2xlYXIgcGFnZS1zcGVjaWZpYyBkYXRhLCBidXQga2VlcCB0
aGUgZ2xvYmFsIG9iamVjdCBpZGVudGlmeS4KKyAgICAgICAgdm9pZCBjbGVhckZvck5hdmlnYXRp
b24oKTsKKworICAgICAgICAvLyBDbGVhciBwYWdlLXNwZWNpZmljIGRhdGEgYmVmb3JlIHNodXR0
aW5nIGRvd24gdGhlIHByb3h5IG9iamVjdC4KKyAgICAgICAgdm9pZCBjbGVhckZvckNsb3NlKCk7
CisKKyAgICAgICAgLy8gVXBkYXRlIGRvY3VtZW50IG9iamVjdCBvZiB0aGUgZnJhbWUuCisgICAg
ICAgIHZvaWQgdXBkYXRlRG9jdW1lbnQoKTsKKworICAgICAgICAvLyBVcGRhdGUgdGhlIHNlY3Vy
aXR5IG9yaWdpbiBvZiBhIGRvY3VtZW50CisgICAgICAgIC8vIChlLmcuLCBhZnRlciBzZXR0aW5n
IGRvY291bWVudC5kb21haW4pLgorICAgICAgICB2b2lkIHVwZGF0ZVNlY3VyaXR5T3JpZ2luKCk7
CisKKyAgICAgICAgLy8gRGVzdHJveSB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgdm9pZCBk
ZXN0cm95R2xvYmFsKCk7CisKKyAgICAgICAgLy8gRklYTUU6IE5lZWQgY29tbWVudC4gIFVzZXIg
R2VzdHVyZSByZWxhdGVkLgorICAgICAgICBib29sIGlubGluZUNvZGUoKSBjb25zdCB7IHJldHVy
biBtX2lubGluZUNvZGU7IH0KKyAgICAgICAgdm9pZCBzZXRJbmxpbmVDb2RlKGJvb2wgdmFsdWUp
IHsgbV9pbmxpbmVDb2RlID0gdmFsdWU7IH0KKworICAgICAgICBib29sIHRpbWVyQ2FsbGJhY2so
KSBjb25zdCB7IHJldHVybiBtX3RpbWVyQ2FsbGJhY2s7IH0KKyAgICAgICAgdm9pZCBzZXRUaW1l
ckNhbGxiYWNrKGJvb2wgdmFsdWUpIHsgbV90aW1lckNhbGxiYWNrID0gdmFsdWU7IH0KKworICAg
ICAgICAvLyBIYXMgdGhlIGNvbnRleHQgZm9yIHRoaXMgcHJveHkgYmVlbiBpbml0aWFsaXplZD8K
KyAgICAgICAgYm9vbCBpc0NvbnRleHRJbml0aWFsaXplZCgpOworCisgICAgICAgIC8vIERpc2Nv
bm5lY3RzIHRoZSBwcm94eSBmcm9tIGl0cyBvd25lciBmcmFtZSwKKyAgICAgICAgLy8gYW5kIGNs
ZWFycyBhbGwgdGltZW91dHMgb24gdGhlIERPTSB3aW5kb3cuCisgICAgICAgIHZvaWQgZGlzY29u
bmVjdEZyYW1lKCk7CisKKyAgICAgICAgYm9vbCBpc0VuYWJsZWQoKTsKKworICAgICAgICAvLyBG
aW5kL0NyZWF0ZS9SZW1vdmUgZXZlbnQgbGlzdGVuZXIgd3JhcHBlcnMuCisgICAgICAgIFBhc3NS
ZWZQdHI8VjhFdmVudExpc3RlbmVyPiBmaW5kVjhFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6
VmFsdWU+IGxpc3RlbmVyLCBib29sIGlzSHRtbCk7CisgICAgICAgIFBhc3NSZWZQdHI8VjhFdmVu
dExpc3RlbmVyPiBmaW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1
ZT4gbGlzdGVuZXIsIGJvb2wgaXNIdG1sKTsKKworICAgICAgICBQYXNzUmVmUHRyPFY4RXZlbnRM
aXN0ZW5lcj4gZmluZE9iamVjdEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1ZT4gbGlz
dGVuZXIsIGJvb2wgaXNIdG1sKTsKKyAgICAgICAgUGFzc1JlZlB0cjxWOEV2ZW50TGlzdGVuZXI+
IGZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1ZT4gbGlz
dGVuZXIsIGJvb2wgaXNIdG1sKTsKKworICAgICAgICB2b2lkIHJlbW92ZVY4RXZlbnRMaXN0ZW5l
cihWOEV2ZW50TGlzdGVuZXIqKTsKKyAgICAgICAgdm9pZCByZW1vdmVPYmplY3RFdmVudExpc3Rl
bmVyKFY4T2JqZWN0RXZlbnRMaXN0ZW5lciopOworCisgICAgICAgIC8vIFByb3RlY3QvVW5wcm90
ZWN0IEpTIHdyYXBwZXJzIG9mIGEgRE9NIG9iamVjdC4KKyAgICAgICAgc3RhdGljIHZvaWQgZ2NQ
cm90ZWN0KHZvaWQqIGRvbU9iamVjdCk7CisgICAgICAgIHN0YXRpYyB2b2lkIGdjVW5wcm90ZWN0
KHZvaWQqIGRvbU9iamVjdCk7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBzdGF0aWMgdm9p
ZCBzZXRTVkdDb250ZXh0KHZvaWQqLCBTVkdFbGVtZW50Kik7CisgICAgICAgIHN0YXRpYyBTVkdF
bGVtZW50KiBzdmdDb250ZXh0KHZvaWQqKTsKKyNlbmRpZgorCisgICAgICAgIHZvaWQgc2V0RXZl
bnRIYW5kbGVyTGluZU51bWJlcihpbnQgbGluZU51bWJlcikgeyBtX2hhbmRsZXJMaW5lbm8gPSBs
aW5lTnVtYmVyOyB9CisgICAgICAgIHZvaWQgZmluaXNoZWRXaXRoRXZlbnQoRXZlbnQqIGV2ZW50
KSB7IH0KKworICAgICAgICAvLyBFdmFsdWF0ZSBKYXZhU2NyaXB0IGluIGEgbmV3IGNvbnRleHQu
IFRoZSBzY3JpcHQgZ2V0cyBpdHMgb3duIGdsb2JhbCBzY29wZQorICAgICAgICAvLyBhbmQgaXRz
IG93biBwcm90b3R5cGVzIGZvciBpbnRyaW5zaWMgSmF2YVNjcmlwdCBvYmplY3RzIChTdHJpbmcs
IEFycmF5LAorICAgICAgICAvLyBhbmQgc28tb24pLiBJdCBzaGFyZXMgdGhlIHdyYXBwZXJzIGZv
ciBhbGwgRE9NIG5vZGVzIGFuZCBET00gY29uc3RydWN0b3JzLgorICAgICAgICB2b2lkIGV2YWx1
YXRlSW5OZXdDb250ZXh0KGNvbnN0IFZlY3RvcjxTY3JpcHRTb3VyY2VDb2RlPiYpOworCisgICAg
ICAgIC8vIEV2YWx1YXRlIGEgc2NyaXB0IGZpbGUgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVu
dmlyb25tZW50LgorICAgICAgICAvLyBUaGUgY2FsbGVyIG11c3QgaG9sZCBhbiBleGVjdXRpb24g
Y29udGV4dC4KKyAgICAgICAgLy8gSWYgY2Fubm90IGV2YWx1dGUgdGhlIHNjcmlwdCwgaXQgcmV0
dXJucyBhbiBlcnJvci4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gZXZhbHVhdGUoY29u
c3QgU2NyaXB0U291cmNlQ29kZSYsIE5vZGUqKTsKKworICAgICAgICAvLyBSdW4gYW4gYWxyZWFk
eSBjb21waWxlZCBzY3JpcHQuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJ1blNjcmlw
dCh2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+LCBib29sIGlzSW5saW5lQ29kZSk7CisKKyAgICAgICAg
Ly8gQ2FsbCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcmVjZWl2ZXIgYW5kIGFyZ3VtZW50
cy4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gY2FsbEZ1bmN0aW9uKHY4OjpIYW5kbGU8
djg6OkZ1bmN0aW9uPiwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiwgaW50IGFyZ2MsIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBhcmd2W10pOworCisgICAgICAgIC8vIENhbGwgdGhlIGZ1bmN0aW9uIGFz
IGNvbnN0cnVjdG9yIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgICAgICAgdjg6OkxvY2Fs
PHY4OjpWYWx1ZT4gbmV3SW5zdGFuY2Uodjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+LCBpbnQgYXJn
Yywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZ3ZbXSk7CisKKyAgICAgICAgLy8gUmV0dXJucyB0
aGUgZG9tIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gbm9kZSB0eXBlLgorICAg
ICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBnZXRDb25zdHJ1Y3RvcihWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUpOworCisgICAgICAgIC8vIFRvIGNyZWF0ZSBKUyBXcmFwcGVyIG9iamVj
dHMsIHdlIGNyZWF0ZSBhIGNhY2hlIG9mIGEgJ2JvaWxlciBwbGF0ZScKKyAgICAgICAgLy8gb2Jq
ZWN0LCBhbmQgdGhlbiBzaW1wbHkgQ2xvbmUgdGhhdCBvYmplY3QgZWFjaCB0aW1lIHdlIG5lZWQg
YSBuZXcgb25lLgorICAgICAgICAvLyBUaGlzIGlzIGZhc3RlciB0aGFuIGdvaW5nIHRocm91Z2gg
dGhlIGZ1bGwgb2JqZWN0IGNyZWF0aW9uIHByb2Nlc3MuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6
T2JqZWN0PiBjcmVhdGVXcmFwcGVyRnJvbUNhY2hlKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlw
ZSk7CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgd2luZG93IG9iamVjdCBvZiB0aGUgY3VycmVu
dGx5IGV4ZWN1dGluZyBjb250ZXh0LgorICAgICAgICBzdGF0aWMgRE9NV2luZG93KiByZXRyaWV2
ZVdpbmRvdygpOworICAgICAgICAvLyBSZXR1cm5zIHRoZSB3aW5kb3cgb2JqZWN0IGFzc29jaWF0
ZWQgd2l0aCBhIGNvbnRleHQuCisgICAgICAgIHN0YXRpYyBET01XaW5kb3cqIHJldHJpZXZlV2lu
ZG93KHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+KTsKKyAgICAgICAgLy8gUmV0dXJucyBWOFByb3h5
IG9iamVjdCBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBjb250ZXh0LgorICAgICAgICBzdGF0
aWMgVjhQcm94eSogcmV0cmlldmUoKTsKKyAgICAgICAgLy8gUmV0dXJucyBWOFByb3h5IG9iamVj
dCBhc3NvY2lhdGVkIHdpdGggYSBmcmFtZS4KKyAgICAgICAgc3RhdGljIFY4UHJveHkqIHJldHJp
ZXZlKEZyYW1lKik7CisgICAgICAgIC8vIFJldHVybnMgVjhQcm94eSBvYmplY3QgYXNzb2NpYXRl
ZCB3aXRoIGEgc2NyaXB0IGV4ZWN1dGlvbiBjb250ZXh0LgorICAgICAgICBzdGF0aWMgVjhQcm94
eSogcmV0cmlldmUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCopOworCisgICAgICAgIC8vIFJldHVy
bnMgdGhlIGZyYW1lIG9iamVjdCBvZiB0aGUgd2luZG93IG9iamVjdCBhc3NvY2lhdGVkCisgICAg
ICAgIC8vIHdpdGggdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgY29udGV4dC4KKyAgICAgICAgc3Rh
dGljIEZyYW1lKiByZXRyaWV2ZUZyYW1lKCk7CisgICAgICAgIC8vIFJldHVybnMgdGhlIGZyYW1l
IG9iamVjdCBvZiB0aGUgd2luZG93IG9iamVjdCBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgLy8g
YSBjb250ZXh0LgorICAgICAgICBzdGF0aWMgRnJhbWUqIHJldHJpZXZlRnJhbWUodjg6OkhhbmRs
ZTx2ODo6Q29udGV4dD4pOworCisKKyAgICAgICAgLy8gVGhlIHRocmVlIGZ1bmN0aW9ucyBiZWxv
dyByZXRyaWV2ZSBXZWJGcmFtZSBpbnN0YW5jZXMgcmVsYXRpbmcgdGhlCisgICAgICAgIC8vIGN1
cnJlbnRseSBleGVjdXRpbmcgSmF2YVNjcmlwdC4gU2luY2UgSmF2YVNjcmlwdCBjYW4gbWFrZSBm
dW5jdGlvbiBjYWxscworICAgICAgICAvLyBhY3Jvc3MgZnJhbWVzLCB0aG91Z2gsIHdlIG5lZWQg
dG8gYmUgbW9yZSBwcmVjaXNlLgorICAgICAgICAvLworICAgICAgICAvLyBGb3IgZXhhbXBsZSwg
aW1hZ2luZSB0aGF0IGEgSlMgZnVuY3Rpb24gaW4gZnJhbWUgQSBjYWxscyBhIGZ1bmN0aW9uIGlu
CisgICAgICAgIC8vIGZyYW1lIEIsIHdoaWNoIGNhbGxzIG5hdGl2ZSBjb2RlLCB3aGljaCB3YW50
cyB0byBrbm93IHdoYXQgdGhlICdhY3RpdmUnCisgICAgICAgIC8vIGZyYW1lIGlzLgorICAgICAg
ICAvLworICAgICAgICAvLyBUaGUgJ2VudGVyZWQgY29udGV4dCcgaXMgdGhlIGNvbnRleHQgd2hl
cmUgZXhlY3V0aW9uIGZpcnN0IGVudGVyZWQgdGhlCisgICAgICAgIC8vIHNjcmlwdCBlbmdpbmU7
IHRoZSBjb250ZXh0IHRoYXQgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgSlMgZnVuY3Rpb24gc3Rh
Y2suCisgICAgICAgIC8vIFJldHJpZXZlRnJhbWVGb3JFbnRlcmVkQ29udGV4dCgpIHdvdWxkIHJl
dHVybiBGcmFtZSBBIGluIG91ciBleGFtcGxlLgorICAgICAgICAvLyBUaGlzIGZyYW1lIGlzIG9m
dGVuIHJlZmVycmVkIHRvIGFzIHRoZSAiZHluYW1pYyBnbG9iYWwgb2JqZWN0LiIKKyAgICAgICAg
Ly8KKyAgICAgICAgLy8gVGhlICdjdXJyZW50IGNvbnRleHQnIGlzIHRoZSBjb250ZXh0IHRoZSBK
UyBlbmdpbmUgaXMgY3VycmVudGx5IGluc2lkZSBvZjsKKyAgICAgICAgLy8gdGhlIGNvbnRleHQg
dGhhdCBpcyBhdCB0aGUgdG9wIG9mIHRoZSBKUyBmdW5jdGlvbiBzdGFjay4KKyAgICAgICAgLy8g
UmV0cmlldmVGcmFtZUZvckN1cnJlbnRDb250ZXh0KCkgd291bGQgcmV0dXJuIEZyYW1lIEIgaW4g
b3VyIGV4YW1wbGUuCisgICAgICAgIC8vIFRoaXMgZnJhbWUgaXMgb2Z0ZW4gcmVmZXJyZWQgdG8g
YXMgdGhlICJsZXhpY2FsIGdsb2JhbCBvYmplY3QuIgorICAgICAgICAvLworICAgICAgICAvLyBG
aW5hbGx5LCB0aGUgJ2NhbGxpbmcgY29udGV4dCcgaXMgdGhlIGNvbnRleHQgb25lIGJlbG93IHRo
ZSBjdXJyZW50CisgICAgICAgIC8vIGNvbnRleHQgb24gdGhlIEpTIGZ1bmN0aW9uIHN0YWNrLiAg
Rm9yIGV4YW1wbGUsIGlmIGZ1bmN0aW9uIGYgY2FsbHMKKyAgICAgICAgLy8gZnVuY3Rpb24gZywg
dGhlbiB0aGUgY2FsbGluZyBjb250ZXh0IHdpbGwgYmUgdGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3
aXRoCisgICAgICAgIC8vIGYuICBUaGlzIGNvbnRleHQgaXMgY29tbW9ubHkgdXNlZCBieSBET00g
c2VjdXJpdHkgY2hlY2tzIGJlY2F1c2UgdGhleSB3YW50CisgICAgICAgIC8vIHRvIGtub3cgd2hv
IGNhbGxlZCB0aGVtLgorICAgICAgICAvLworICAgICAgICAvLyBJZiB5b3UgYXJlIHVuc3VyZSB3
aGljaCBvZiB0aGVzZSBmdW5jdGlvbnMgdG8gdXNlLCBhc2sgYWJhcnRoLgorICAgICAgICAvLwor
ICAgICAgICAvLyBOT1RFOiBUaGVzZSBjYW5ub3QgYmUgZGVjbGFyZWQgYXMgaW5saW5lIGZ1bmN0
aW9uLCBiZWNhdXNlIFZTIGNvbXBsYWlucyBhdAorICAgICAgICAvLyBsaW5raW5nIHRpbWUuCisg
ICAgICAgIHN0YXRpYyBGcmFtZSogcmV0cmlldmVGcmFtZUZvckVudGVyZWRDb250ZXh0KCk7Cisg
ICAgICAgIHN0YXRpYyBGcmFtZSogcmV0cmlldmVGcmFtZUZvckN1cnJlbnRDb250ZXh0KCk7Cisg
ICAgICAgIHN0YXRpYyBGcmFtZSogcmV0cmlldmVGcmFtZUZvckNhbGxpbmdDb250ZXh0KCk7CisK
KyAgICAgICAgLy8gUmV0dXJucyBWOCBDb250ZXh0IG9mIGEgZnJhbWUuIElmIG5vbmUgZXhpc3Rz
LCBjcmVhdGVzCisgICAgICAgIC8vIGEgbmV3IGNvbnRleHQuICBJdCBpcyBwb3RlbnRpYWxseSBz
bG93IGFuZCBjb25zdW1lcyBtZW1vcnkuCisgICAgICAgIHN0YXRpYyB2ODo6TG9jYWw8djg6OkNv
bnRleHQ+IGNvbnRleHQoRnJhbWUqKTsKKyAgICAgICAgc3RhdGljIHY4OjpMb2NhbDx2ODo6Q29u
dGV4dD4gY3VycmVudENvbnRleHQoKTsKKworICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBjb250
ZXh0IGNhdXNlcyBvdXQgb2YgbWVtb3J5LCBKYXZhU2NyaXB0IHNldHRpbmcKKyAgICAgICAgLy8g
aXMgZGlzYWJsZWQgYW5kIGl0IHJldHVybnMgdHJ1ZS4KKyAgICAgICAgc3RhdGljIGJvb2wgaGFu
ZGxlT3V0T2ZNZW1vcnkoKTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aXZlIGV4ZWN1
dGlvbiBjb250ZXh0IGNhbiBhY2Nlc3MgdGhlIHRhcmdldCBmcmFtZS4KKyAgICAgICAgc3RhdGlj
IGJvb2wgY2FuQWNjZXNzRnJhbWUoRnJhbWUqLCBib29sIHJlcG9ydEVycm9yKTsKKworICAgICAg
ICAvLyBDaGVjayBpZiBpdCBpcyBzYWZlIHRvIGFjY2VzcyB0aGUgZ2l2ZW4gbm9kZSBmcm9tIHRo
ZQorICAgICAgICAvLyBjdXJyZW50IHNlY3VyaXR5IGNvbnRleHQuCisgICAgICAgIHN0YXRpYyBi
b29sIGNoZWNrTm9kZVNlY3VyaXR5KE5vZGUqKTsKKworICAgICAgICBzdGF0aWMgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IGNoZWNrTmV3TGVnYWwoY29uc3Qgdjg6OkFyZ3VtZW50cyYpOworCisgICAg
ICAgIC8vIENyZWF0ZSBhIFY4IHdyYXBwZXIgZm9yIGEgQyBwb2ludGVyCisgICAgICAgIHN0YXRp
YyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcENQb2ludGVyKHZvaWQqIGNwdHIpCisgICAgICAg
IHsKKyAgICAgICAgICAgIC8vIFJlcHJlc2VudCB2b2lkKiBhcyBpbnQKKyAgICAgICAgICAgIGlu
dCBhZGRyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQ+KGNwdHIpOworICAgICAgICAgICAgQVNTRVJU
KCEoYWRkciAmIDB4MDEpKTsgIC8vIHRoZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZC4KKyAgICAg
ICAgICAgIHJldHVybiB2ODo6SW50ZWdlcjo6TmV3KGFkZHIgPj4gMSk7CisgICAgICAgIH0KKwor
ICAgICAgICAvLyBUYWtlIEMgcG9pbnRlciBvdXQgb2YgYSB2OCB3cmFwcGVyCisgICAgICAgIHRl
bXBsYXRlIDxjbGFzcyBDPgorICAgICAgICBzdGF0aWMgQyogZXh0cmFjdENQb2ludGVyKHY4OjpI
YW5kbGU8djg6OlZhbHVlPiBvYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxDKj4oZXh0cmFjdENQb2ludGVySW1wbChvYmopKTsKKyAgICAgICAgfQorCisgICAg
ICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IGNvbXBpbGVTY3JpcHQodjg6OkhhbmRs
ZTx2ODo6U3RyaW5nPiBjb2RlLCBjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBpbnQgYmFzZUxpbmUp
OworCisjaWZuZGVmIE5ERUJVRworICAgICAgICAvLyBDaGVja3MgaWYgYSB2OCB2YWx1ZSBjYW4g
YmUgYSBET00gd3JhcHBlcgorICAgICAgICBzdGF0aWMgYm9vbCBtYXliZURPTVdyYXBwZXIodjg6
OkhhbmRsZTx2ODo6VmFsdWU+KTsKKyNlbmRpZgorCisgICAgICAgIC8vIFNldHMgY29udGVudHMg
b2YgYSBET00gd3JhcHBlci4KKyAgICAgICAgc3RhdGljIHZvaWQgc2V0RE9NV3JhcHBlcih2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+LCBpbnQgdHlwZSwgdm9pZCogcHRyKTsKKworICAgICAgICBzdGF0
aWMgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6
VjhXcmFwcGVyVHlwZSwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KTsKKworICAgICAgICAvLyBBIGhl
bHBlciBmdW5jdGlvbiBleHRyYWN0IG5hdGl2ZSBvYmplY3QgcG9pbnRlciBmcm9tIGEgRE9NIHdy
YXBwZXIKKyAgICAgICAgLy8gYW5kIGNhc3QgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAg
ICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KKyAgICAgICAgc3RhdGljIEMqIGNvbnZlcnRET01XcmFwcGVy
VG9OYXRpdmUodjg6OkhhbmRsZTx2ODo6VmFsdWU+IG9iamVjdCkKKyAgICAgICAgeworICAgICAg
ICAgICAgQVNTRVJUKG1heWJlRE9NV3JhcHBlcihvYmplY3QpKTsKKyAgICAgICAgICAgIHY4OjpI
YW5kbGU8djg6OlZhbHVlPiBwdHIgPSB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KG9iamVj
dCktPkdldEludGVybmFsRmllbGQoVjhDdXN0b206OmtET01XcmFwcGVyT2JqZWN0SW5kZXgpOwor
ICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RDUG9pbnRlcjxDPihwdHIpOworICAgICAgICB9CisK
KyAgICAgICAgLy8gQSBoZWxwIGZ1bmN0aW9uIGV4dHJhY3QgYSBub2RlIHR5cGUgcG9pbnRlciBm
cm9tIGEgRE9NIHdyYXBwZXIuCisgICAgICAgIC8vIFdyYXBwZWQgcG9pbnRlciBtdXN0IGJlIGNh
c3QgdG8gTm9kZSogZmlyc3QuCisgICAgICAgIHN0YXRpYyB2b2lkKiBjb252ZXJ0RE9NV3JhcHBl
clRvTm9kZUhlbHBlcih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4pOworCisgICAgICAgIHRlbXBsYXRl
IDxjbGFzcyBDPgorICAgICAgICBzdGF0aWMgQyogY29udmVydERPTVdyYXBwZXJUb05vZGUodjg6
OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8Qyo+KGNvbnZlcnRET01XcmFwcGVyVG9Ob2RlSGVscGVyKHZhbHVlKSk7Cisg
ICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhX
cmFwcGVyVHlwZSB0eXBlLCBQYXNzUmVmUHRyPFQ+IGltcCkKKyAgICAgICAgeworICAgICAgICAg
IHJldHVybiBjb252ZXJ0VG9WOE9iamVjdCh0eXBlLCBpbXAuZ2V0KCkpOworICAgICAgICB9CisK
KyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252ZXJ0VG9WOE9iamVjdChW
OENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUsIHZvaWQqKTsKKworICAgICAgICAvLyBGYXN0LXBh
dGggZm9yIE5vZGUgb2JqZWN0cy4KKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiBjb252ZXJ0Tm9kZVRvVjhPYmplY3QoTm9kZSopOworCisgICAgICAgIHRlbXBsYXRlIDxjbGFz
cyBDPgorICAgICAgICBzdGF0aWMgQyogY29udmVydFRvTmF0aXZlT2JqZWN0KFY4Q2xhc3NJbmRl
eDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gb2JqZWN0KQorICAg
ICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Qyo+KGNvbnZlcnRUb05hdGl2
ZU9iamVjdEltcGwodHlwZSwgb2JqZWN0KSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMg
VjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIGRvbVdyYXBwZXJUeXBlKHY4OjpIYW5kbGU8djg6
Ok9iamVjdD4pOworCisgICAgICAgIC8vIElmIHRoZSBleGNlcHRpb24gY29kZSBpcyBkaWZmZXJl
bnQgZnJvbSB6ZXJvLCBhIERPTSBleGNlcHRpb24gaXMKKyAgICAgICAgLy8gc2NoZWR1bGUgdG8g
YmUgdGhyb3duLgorICAgICAgICBzdGF0aWMgdm9pZCBzZXRET01FeGNlcHRpb24oaW50IGV4Y2Vw
dGlvbkNvZGUpOworCisgICAgICAgIC8vIFNjaGVkdWxlIGFuIGVycm9yIG9iamVjdCB0byBiZSB0
aHJvd24uCisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdGhyb3dFcnJvcihF
cnJvclR5cGUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworCisgICAgICAgIC8vIENyZWF0ZSBhbiBp
bnN0YW5jZSBvZiBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IgYW5kIHNldCB0byB0aGUgZ2xvYmFsIG9i
amVjdAorICAgICAgICAvLyBhcyBhIG5hbWVkIHByb3BlcnR5LiBVc2VkIGJ5IHY4X3Rlc3Rfc2hl
bGwuCisgICAgICAgIHN0YXRpYyB2b2lkIGJpbmRKc09iamVjdFRvV2luZG93KEZyYW1lKiwgY29u
c3QgY2hhciogbmFtZSwgaW50IHR5cGUsIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+
LCB2b2lkKik7CisKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252ZXJ0
RXZlbnRUb1Y4T2JqZWN0KEV2ZW50Kik7CisKKyAgICAgICAgc3RhdGljIEV2ZW50KiBjb252ZXJ0
VG9OYXRpdmVFdmVudCh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4ganNFdmVudCkKKyAgICAgICAgewor
ICAgICAgICAgICAgaWYgKCFpc0RPTUV2ZW50V3JhcHBlcihqc0V2ZW50KSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0RE9NV3JhcHBlclRvTmF0
aXZlPEV2ZW50Pihqc0V2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gY29udmVydEV2ZW50VGFyZ2V0VG9WOE9iamVjdChFdmVudFRhcmdldCop
OworICAgICAgICAvLyBXcmFwIGFuZCB1bndyYXAgSlMgZXZlbnQgbGlzdGVuZXJzCisgICAgICAg
IHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVydEV2ZW50TGlzdGVuZXJUb1Y4T2Jq
ZWN0KEV2ZW50TGlzdGVuZXIqKTsKKworICAgICAgICAvLyBET01JbXBsZW1lbnRhdGlvbiBpcyBh
IHNpbmdsZXRvbiBhbmQgaXQgaXMgaGFuZGxlZCBpbiBhIHNwZWNpYWwKKyAgICAgICAgLy8gd2F5
LiAgQSB3cmFwcGVyIGlzIGdlbmVyYXRlZCBwZXIgZG9jdW1lbnQgYW5kIHN0b3JlZCBpbiBhbgor
ICAgICAgICAvLyBpbnRlcm5hbCBmaWVsZCBvZiB0aGUgZG9jdW1lbnQuCisgICAgICAgIHN0YXRp
YyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVydERPTUltcGxlbWVudGF0aW9uVG9WOE9iamVj
dChET01JbXBsZW1lbnRhdGlvbiopOworCisgICAgICAgIC8vIFdyYXAgSlMgbm9kZSBmaWx0ZXIg
aW4gQysrCisgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPE5vZGVGaWx0ZXI+IHdyYXBOYXRpdmVO
b2RlRmlsdGVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPik7CisKKyAgICAgICAgc3RhdGljIHY4OjpQ
ZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBnZXRUZW1wbGF0ZShWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUpOworCisgICAgICAgIHRlbXBsYXRlIDxpbnQgdGFnLCB0eXBlbmFtZSBU
PgorICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnN0cnVjdERPTU9iamVj
dChjb25zdCB2ODo6QXJndW1lbnRzJik7CisKKyAgICAgICAgLy8gQ2hlY2tzIHdoZXRoZXIgYSBE
T00gb2JqZWN0IGhhcyBhIEpTIHdyYXBwZXIuCisgICAgICAgIHN0YXRpYyBib29sIGRvbU9iamVj
dEhhc0pTV3JhcHBlcih2b2lkKik7CisgICAgICAgIC8vIFNldCBKUyB3cmFwcGVyIG9mIGEgRE9N
IG9iamVjdCwgdGhlIGNhbGxlciBpbiBjaGFyZ2Ugb2YgaW5jcmVhc2UgcmVmLgorICAgICAgICBz
dGF0aWMgdm9pZCBzZXRKU1dyYXBwZXJGb3JET01PYmplY3Qodm9pZCosIHY4OjpQZXJzaXN0ZW50
PHY4OjpPYmplY3Q+KTsKKyAgICAgICAgc3RhdGljIHZvaWQgc2V0SlNXcmFwcGVyRm9yQWN0aXZl
RE9NT2JqZWN0KHZvaWQqLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pik7CisgICAgICAgIHN0
YXRpYyB2b2lkIHNldEpTV3JhcHBlckZvckRPTU5vZGUoTm9kZSosIHY4OjpQZXJzaXN0ZW50PHY4
OjpPYmplY3Q+KTsKKworICAgICAgICAvLyBQcm9jZXNzIGFueSBwZW5kaW5nIEphdmFTY3JpcHQg
Y29uc29sZSBtZXNzYWdlcy4KKyAgICAgICAgc3RhdGljIHZvaWQgcHJvY2Vzc0NvbnNvbGVNZXNz
YWdlcygpOworCisjaWZuZGVmIE5ERUJVRworICAgICAgICAvLyBGb3IgZGVidWdnaW5nIGFuZCBs
ZWFrIGRldGVjdGlvbiBwdXJwb3NlCisgICAgICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyR2xvYmFs
SGFuZGxlKEdsb2JhbEhhbmRsZVR5cGUsIHZvaWQqLCB2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+
KTsKKyAgICAgICAgc3RhdGljIHZvaWQgdW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh2b2lkKiwgdjg6
OlBlcnNpc3RlbnQ8djg6OlZhbHVlPik7CisjZW5kaWYKKworICAgICAgICAvLyBDaGVjayB3aGV0
aGVyIGEgVjggdmFsdWUgaXMgYSB3cmFwcGVyIG9mIHR5cGUgfGNsYXNzVHlwZXwuCisgICAgICAg
IHN0YXRpYyBib29sIGlzV3JhcHBlck9mVHlwZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4sIFY4Q2xh
c3NJbmRleDo6VjhXcmFwcGVyVHlwZSk7CisKKyAgICAgICAgLy8gRnVuY3Rpb24gZm9yIHJldHJp
ZXZpbmcgdGhlIGxpbmUgbnVtYmVyIGFuZCBzb3VyY2UgbmFtZSBmb3IgdGhlIHRvcAorICAgICAg
ICAvLyBKYXZhU2NyaXB0IHN0YWNrIGZyYW1lLgorICAgICAgICBzdGF0aWMgaW50IHNvdXJjZUxp
bmVOdW1iZXIoKTsKKyAgICAgICAgc3RhdGljIFN0cmluZyBzb3VyY2VOYW1lKCk7CisKKworICAg
ICAgICAvLyBSZXR1cm5zIGEgbG9jYWwgaGFuZGxlIG9mIHRoZSBjb250ZXh0LgorICAgICAgICB2
ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQoKQorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KG1fY29udGV4dCk7CisgICAgICAgIH0K
KworICAgICAgICBib29sIHNldENvbnRleHREZWJ1Z0lkKGludCBpZCk7CisgICAgICAgIHN0YXRp
YyBpbnQgY29udGV4dERlYnVnSWQodjg6OkhhbmRsZTx2ODo6Q29udGV4dD4pOworCisgICAgICAg
IC8vIFJlZ2lzdGVycyBhbiBleHRlbnNpb24gdG8gYmUgYXZhaWxhYmxlIG9uIHdlYnBhZ2VzIHdp
dGggYSBwYXJ0aWN1bGFyIHNjaGVtZQorICAgICAgICAvLyBJZiB0aGUgc2NoZW1lIGFyZ3VtZW50
IGlzIGVtcHR5LCB0aGUgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZSBvbiBhbGwgcGFnZXMuCisgICAg
ICAgIC8vIFdpbGwgb25seSBhZmZlY3QgdjggY29udGV4dHMgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhp
cyBjYWxsLiBUYWtlcyBvd25lcnNoaXAKKyAgICAgICAgLy8gb2YgdGhlIHY4OjpFeHRlbnNpb24g
b2JqZWN0IHBhc3NlZC4KKyAgICAgICAgc3RhdGljIHZvaWQgcmVnaXN0ZXJFeHRlbnNpb24odjg6
OkV4dGVuc2lvbiosIGNvbnN0IFN0cmluZyYgc2NoZW1lUmVzdHJpY3Rpb24pOworCisgICAgICAg
IHN0YXRpYyB2b2lkKiBjb252ZXJ0VG9TVkdQT0RUeXBlSW1wbChWOENsYXNzSW5kZXg6OlY4V3Jh
cHBlclR5cGUsIHY4OjpIYW5kbGU8djg6OlZhbHVlPik7CisKKyAgICBwcml2YXRlOgorICAgICAg
ICBzdGF0aWMgY29uc3QgY2hhcioga0NvbnRleHREZWJ1Z0RhdGFUeXBlOworICAgICAgICBzdGF0
aWMgY29uc3QgY2hhcioga0NvbnRleHREZWJ1Z0RhdGFWYWx1ZTsKKworICAgICAgICB2ODo6UGVy
c2lzdGVudDx2ODo6Q29udGV4dD4gY3JlYXRlTmV3Q29udGV4dCh2ODo6SGFuZGxlPHY4OjpPYmpl
Y3Q+IGdsb2JhbCk7CisgICAgICAgIHZvaWQgaW5pdENvbnRleHRJZk5lZWRlZCgpOworICAgICAg
ICB2b2lkIGRpc2Nvbm5lY3RFdmVudExpc3RlbmVycygpOworICAgICAgICB2b2lkIHNldFNlY3Vy
aXR5VG9rZW4oKTsKKyAgICAgICAgdm9pZCBjbGVhckRvY3VtZW50V3JhcHBlcigpOworICAgICAg
ICB2b2lkIHVwZGF0ZURvY3VtZW50V3JhcHBlcih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcHBl
cik7CisKKyAgICAgICAgLy8gVGhlIEphdmFTY3JpcHQgd3JhcHBlciBmb3IgdGhlIGRvY3VtZW50
IG9iamVjdCBpcyBjYWNoZWQgb24gdGhlIGdsb2JhbAorICAgICAgICAvLyBvYmplY3QgZm9yIGZh
c3QgYWNjZXNzLiAgVXBkYXRlRG9jdW1lbnRXcmFwcGVyQ2FjaGUgc2V0cyB0aGUgd3JhcHBlcgor
ICAgICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQgb24gdGhlIGdsb2JhbCBvYmplY3Qu
ICBDbGVhckRvY3VtZW50V3JhcHBlckNhY2hlCisgICAgICAgIC8vIGRlbGV0ZXMgdGhlIGRvY3Vt
ZW50IHdyYXBwZXIgZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgdm9pZCB1cGRhdGVE
b2N1bWVudFdyYXBwZXJDYWNoZSgpOworICAgICAgICB2b2lkIGNsZWFyRG9jdW1lbnRXcmFwcGVy
Q2FjaGUoKTsKKworICAgICAgICAvLyBEaXNwb3NlIGdsb2JhbCBoYW5kbGVzIG9mIG1fY29udGV4
dHMgYW5kIGZyaWVuZHMuCisgICAgICAgIHZvaWQgZGlzcG9zZUNvbnRleHRIYW5kbGVzKCk7CisK
KyAgICAgICAgc3RhdGljIGJvb2wgY2FuQWNjZXNzUHJpdmF0ZShET01XaW5kb3cqKTsKKworICAg
ICAgICAvLyBDaGVjayB3aGV0aGVyIGEgVjggdmFsdWUgaXMgYSBET00gRXZlbnQgd3JhcHBlcgor
ICAgICAgICBzdGF0aWMgYm9vbCBpc0RPTUV2ZW50V3JhcHBlcih2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4pOworCisgICAgICAgIHN0YXRpYyB2b2lkKiBjb252ZXJ0VG9OYXRpdmVPYmplY3RJbXBsKFY4
Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KTsKKworICAg
ICAgICAvLyBUYWtlIEMgcG9pbnRlciBvdXQgb2YgYSB2OCB3cmFwcGVyCisgICAgICAgIHN0YXRp
YyB2b2lkKiBleHRyYWN0Q1BvaW50ZXJJbXBsKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBvYmplY3Qp
CisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChvYmplY3QtPklzTnVtYmVyKCkpOworICAg
ICAgICAgICAgaW50IGFkZHIgPSBvYmplY3QtPkludDMyVmFsdWUoKTsKKyAgICAgICAgICAgIHJl
dHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPihhZGRyIDw8IDEpOworICAgICAgICB9CisKKwor
ICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnRTdHlsZVNoZWV0VG9W
OE9iamVjdChTdHlsZVNoZWV0Kik7CisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gY29udmVydENTU1ZhbHVlVG9WOE9iamVjdChDU1NWYWx1ZSopOworICAgICAgICBzdGF0aWMg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnRDU1NSdWxlVG9WOE9iamVjdChDU1NSdWxlKik7
CisgICAgICAgIC8vIFJldHVybnMgdGhlIEpTIHdyYXBwZXIgb2YgYSB3aW5kb3cgb2JqZWN0LCBp
bml0aWFsaXplcyB0aGUgZW52aXJvbm1lbnQKKyAgICAgICAgLy8gb2YgdGhlIHdpbmRvdyBmcmFt
ZSBpZiBuZWVkZWQuCisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVy
dFdpbmRvd1RvVjhPYmplY3QoRE9NV2luZG93Kik7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAg
ICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnRTVkdFbGVtZW50SW5zdGFuY2VU
b1Y4T2JqZWN0KFNWR0VsZW1lbnRJbnN0YW5jZSopOworICAgICAgICBzdGF0aWMgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IGNvbnZlcnRTVkdPYmplY3RXaXRoQ29udGV4dFRvVjhPYmplY3QoVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlLCB2b2lkKik7CisjZW5kaWYKKworICAgICAgICAvLyBTZXQg
aGlkZGVuIHJlZmVyZW5jZXMgaW4gYSBET01XaW5kb3cgb2JqZWN0IG9mIGEgZnJhbWUuCisgICAg
ICAgIHN0YXRpYyB2b2lkIHNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShGcmFtZSosIGNvbnN0IGlu
dCBpbnRlcm5hbEluZGV4LCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+KTsKKworICAgICAgICBzdGF0
aWMgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIGh0bWxFbGVtZW50VHlwZShIVE1MRWxlbWVu
dCopOworCisgICAgICAgIC8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIsIGRlc2NfdHlwZSwgc3BlY2lm
aWVzIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yCisgICAgICAgIC8vIHVzZWQgdG8gY3JlYXRlIEpT
IG9iamVjdC4gVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGNwdHJfdHlwZSwgc3BlY2lmaWVzCisgICAg
ICAgIC8vIHRoZSB0eXBlIG9mIHRoaXJkIHBhcmFtZXRlciwgaW1wbCwgZm9yIHR5cGUgY2FzdGlu
Zy4KKyAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGEgSFRNTCBlbGVtZW50IGhhcyBIVE1MRUxFTUVO
VCBkZXNjX3R5cGUsIGJ1dCBhbHdheXMKKyAgICAgICAgLy8gdXNlIE5PREUgYXMgY3B0cl90eXBl
LiBKUyB3cmFwcGVyIHN0b3JlcyBjcHRyX3R5cGUgYW5kIGltcGwgYXMKKyAgICAgICAgLy8gaW50
ZXJuYWwgZmllbGRzLgorICAgICAgICBzdGF0aWMgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGluc3Rh
bnRpYXRlVjhPYmplY3QoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlLCBWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUsIHZvaWQqKTsKKworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogcmFu
Z2VFeGNlcHRpb25OYW1lKGludCBleGNlcHRpb25Db2RlKTsKKyAgICAgICAgc3RhdGljIGNvbnN0
IGNoYXIqIGV2ZW50RXhjZXB0aW9uTmFtZShpbnQgZXhjZXB0aW9uQ29kZSk7CisgICAgICAgIHN0
YXRpYyBjb25zdCBjaGFyKiB4bWxIdHRwUmVxdWVzdEV4Y2VwdGlvbk5hbWUoaW50IGV4Y2VwdGlv
bkNvZGUpOworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogZG9tRXhjZXB0aW9uTmFtZShpbnQg
ZXhjZXB0aW9uQ29kZSk7CisKKyNpZiBFTkFCTEUoWFBBVEgpCisgICAgICAgIHN0YXRpYyBjb25z
dCBjaGFyKiB4cGF0aEV4Y2VwdGlvbk5hbWUoaW50IGV4Y2VwdGlvbkNvZGUpOworI2VuZGlmCisK
KyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBzdGF0aWMgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJU
eXBlIHN2Z0VsZW1lbnRUeXBlKFNWR0VsZW1lbnQqKTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNo
YXIqIHN2Z0V4Y2VwdGlvbk5hbWUoaW50IGV4Y2VwdGlvbkNvZGUpOworI2VuZGlmCisKKyAgICAg
ICAgc3RhdGljIHZvaWQgY3JlYXRlVXRpbGl0eUNvbnRleHQoKTsKKworICAgICAgICAvLyBSZXR1
cm5zIGEgbG9jYWwgaGFuZGxlIG9mIHRoZSB1dGlsaXR5IGNvbnRleHQuCisgICAgICAgIHN0YXRp
YyB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHV0aWxpdHlDb250ZXh0KCkKKyAgICAgICAgeworICAg
ICAgICAgIGlmIChtX3V0aWxpdHlDb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgICAgICAgY3Jl
YXRlVXRpbGl0eUNvbnRleHQoKTsKKyAgICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250
ZXh0Pjo6TmV3KG1fdXRpbGl0eUNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgRnJhbWUq
IG1fZnJhbWU7CisKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IG1fY29udGV4
dDsKKyAgICAgICAgLy8gRm9yIGVhY2ggcG9zc2libGUgdHlwZSBvZiB3cmFwcGVyLCB3ZSBrZWVw
IGEgYm9pbGVycGxhdGUgb2JqZWN0LgorICAgICAgICAvLyBUaGUgYm9pbGVycGxhdGUgaXMgdXNl
ZCB0byBjcmVhdGUgYWRkaXRpb25hbCB3cmFwcGVycyBvZiB0aGUgc2FtZSB0eXBlLgorICAgICAg
ICAvLyBXZSBrZWVwIGEgc2luZ2xlIHBlcnNpc3RlbnQgaGFuZGxlIHRvIGFuIGFycmF5IG9mIHRo
ZSBhY3RpdmF0ZWQKKyAgICAgICAgLy8gYm9pbGVycGxhdGVzLgorICAgICAgICB2ODo6UGVyc2lz
dGVudDx2ODo6QXJyYXk+IG1fd3JhcHBlckJvaWxlcnBsYXRlczsKKyAgICAgICAgdjg6OlBlcnNp
c3RlbnQ8djg6OlZhbHVlPiBtX29iamVjdFByb3RvdHlwZTsKKworICAgICAgICB2ODo6UGVyc2lz
dGVudDx2ODo6T2JqZWN0PiBtX2dsb2JhbDsKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6OlZh
bHVlPiBtX2RvY3VtZW50OworCisgICAgICAgIC8vIFV0aWxpdHkgY29udGV4dCBob2xkaW5nIEph
dmFTY3JpcHQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseS4KKyAgICAgICAgc3RhdGljIHY4OjpQ
ZXJzaXN0ZW50PHY4OjpDb250ZXh0PiBtX3V0aWxpdHlDb250ZXh0OworCisgICAgICAgIGludCBt
X2hhbmRsZXJMaW5lbm87CisKKyAgICAgICAgLy8gQSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyBj
cmVhdGVkIGZvciB0aGlzIGZyYW1lLAorICAgICAgICAvLyB0aGUgbGlzdCBnZXRzIGNsZWFyZWQg
d2hlbiByZW1vdmluZyBhbGwgdGltZW91dHMuCisgICAgICAgIFY4RXZlbnRMaXN0ZW5lckxpc3Qg
bV9ldmVudExpc3RlbmVyczsKKworICAgICAgICAvLyBBIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJz
IGNyZWF0ZSBmb3IgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0IGZvciB0aGlzIGZyYW1lLAorICAgICAg
ICAvLyB0aGUgbGlzdCBnZXRzIGNsZWFyZWQgd2hlbiByZW1vdmluZyBhbGwgdGltZW91dHMuCisg
ICAgICAgIFY4RXZlbnRMaXN0ZW5lckxpc3QgbV94aHJMaXN0ZW5lcnM7CisKKyAgICAgICAgLy8g
VHJ1ZSBmb3IgPGEgaHJlZj0iamF2YXNjcmlwdDpmb28oKSI+IGFuZCBmYWxzZSBmb3IgPHNjcmlw
dD5mb28oKTwvc2NyaXB0Pi4KKyAgICAgICAgLy8gT25seSB2YWxpZCBkdXJpbmcgZXhlY3V0aW9u
LgorICAgICAgICBib29sIG1faW5saW5lQ29kZTsKKworICAgICAgICAvLyBUcnVlIHdoZW4gZXhl
Y3V0aW5nIGZyb20gd2l0aGluIGEgdGltZXIgY2FsbGJhY2suICBPbmx5IHZhbGlkIGR1cmluZwor
ICAgICAgICAvLyBleGVjdXRpb24uCisgICAgICAgIGJvb2wgbV90aW1lckNhbGxiYWNrOworCisg
ICAgICAgIC8vIFRyYWNrIHRoZSByZWN1cnNpb24gZGVwdGggdG8gYmUgYWJsZSB0byBhdm9pZCB0
b28gZGVlcCByZWN1cnNpb24uIFRoZSBWOAorICAgICAgICAvLyBlbmdpbmUgYWxsb3dzIG11Y2gg
bW9yZSByZWN1cnNpb24gdGhhbiBLSlMgZG9lcyBzbyB3ZSBuZWVkIHRvIGd1YXJkIGFnYWluc3QK
KyAgICAgICAgLy8gZXhjZXNzaXZlIHJlY3Vyc2lvbiBpbiB0aGUgYmluZGluZyBsYXllci4KKyAg
ICAgICAgaW50IG1fcmVjdXJzaW9uOworCisgICAgICAgIC8vIExpc3Qgb2YgZXh0ZW5zaW9ucyBy
ZWdpc3RlcmVkIHdpdGggdGhlIGNvbnRleHQuCisgICAgICAgIHN0YXRpYyBWOEV4dGVuc2lvbkxp
c3QgbV9leHRlbnNpb25zOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8aW50IHRhZywgdHlwZW5h
bWUgVD4KKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y29uc3RydWN0RE9NT2Jq
ZWN0KGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCisgICAgeworICAgICAgICBpZiAoIWFyZ3Mu
SXNDb25zdHJ1Y3RDYWxsKCkpIHsKKyAgICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJv
eHk6OlRZUEVfRVJST1IsICJET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQg
YXMgYSBmdW5jdGlvbi4iKTsKKyAgICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworICAg
ICAgICB9CisKKyAgICAgICAgLy8gTm90ZTogaXQncyBPSyB0byBsZXQgdGhpcyBSZWZQdHIgZ28g
b3V0IG9mIHNjb3BlIGJlY2F1c2Ugd2UgYWxzbyBjYWxsCisgICAgICAgIC8vIFNldERPTVdyYXBw
ZXIoKSwgd2hpY2ggZWZmZWN0aXZlbHkgaG9sZHMgYSByZWZlcmVuY2UgdG8gb2JqLgorICAgICAg
ICBSZWZQdHI8VD4gb2JqID0gVDo6Y3JlYXRlKCk7CisgICAgICAgIFY4UHJveHk6OnNldERPTVdy
YXBwZXIoYXJncy5Ib2xkZXIoKSwgdGFnLCBvYmouZ2V0KCkpOworICAgICAgICBvYmotPnJlZigp
OworICAgICAgICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01PYmplY3Qob2JqLmdldCgpLCB2
ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGFyZ3MuSG9sZGVyKCkpKTsKKyAgICAgICAg
cmV0dXJuIGFyZ3MuSG9sZGVyKCk7CisgICAgfQorCisKICAgICAvLyBVc2VkIGJ5IGFuIGludGVy
Y2VwdG9yIGNhbGxiYWNrIHRoYXQgaXQgaGFzbid0IGZvdW5kIGFueXRoaW5nIHRvCiAgICAgLy8g
aW50ZXJjZXB0LgogICAgIGlubGluZSBzdGF0aWMgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG5vdEhh
bmRsZWRCeUludGVyY2VwdG9yKCkKQEAgLTQ4LDIyICs2NTAsMTUgQEAKICAgICB7CiAgICAgICAg
IHJldHVybiB2ODo6TG9jYWw8djg6OkJvb2xlYW4+KCk7CiAgICAgfQotCi0gICAgLy8gRklYTUU6
IFJlbW92ZSBvbmNlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZS4KLSAgICBpbmxpbmUgc3RhdGljIERP
TVdyYXBwZXJNYXA8dm9pZD4mIGRvbU9iamVjdE1hcCgpCi0gICAgewotICAgICAgICByZXR1cm4g
R2V0RE9NT2JqZWN0TWFwKCk7Ci0gICAgfQotCiAgICAgaW5saW5lIHY4OjpIYW5kbGU8djg6OlBy
aW1pdGl2ZT4gdGhyb3dFcnJvcihjb25zdCBjaGFyKiBtZXNzYWdlLCBWOFByb3h5OjpFcnJvclR5
cGUgdHlwZSA9IFY4UHJveHk6OlRZUEVfRVJST1IpCiAgICAgewotICAgICAgICBWOFByb3h5OjpU
aHJvd0Vycm9yKHR5cGUsIG1lc3NhZ2UpOworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKHR5
cGUsIG1lc3NhZ2UpOwogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgIH0KIAog
ICAgIGlubGluZSB2ODo6SGFuZGxlPHY4OjpQcmltaXRpdmU+IHRocm93RXJyb3IoRXhjZXB0aW9u
Q29kZSBlYykKICAgICB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7Cisg
ICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgIHJldHVybiB2ODo6
VW5kZWZpbmVkKCk7CiAgICAgfQogCkBAIC03Niw3ICs2NzEsNyBAQAogICAgIHRlbXBsYXRlIDxj
bGFzcyBUPiBpbmxpbmUgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB0b1Y4KFBhc3NSZWZQdHI8VD4g
b2JqZWN0LCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaG9sZGVyKQogICAgIHsKICAgICAgICAgb2Jq
ZWN0LT5yZWYoKTsKLSAgICAgICAgVjhQcm94eTo6U2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KG9i
amVjdC5nZXQoKSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhob2xkZXIpKTsKKyAg
ICAgICAgVjhQcm94eTo6c2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KG9iamVjdC5nZXQoKSwgdjg6
OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhob2xkZXIpKTsKICAgICAgICAgcmV0dXJuIGhv
bGRlcjsKICAgICB9CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4
ZWN1dGlvblByb3h5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtl
ckNvbnRleHRFeGVjdXRpb25Qcm94eS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9i
aW5kaW5ncy92OC9Xb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zNSwxMyArMzUsMTMgQEAKIAogI2luY2x1ZGUgIldvcmtlckNvbnRleHRFeGVjdXRpb25Q
cm94eS5oIgogCi0jaW5jbHVkZSAiVjhCaW5kaW5nLmgiCi0jaW5jbHVkZSAiVjhQcm94eS5oIgog
I2luY2x1ZGUgIkRPTUNvcmVFeGNlcHRpb24uaCIKICNpbmNsdWRlICJFdmVudC5oIgogI2luY2x1
ZGUgIkV2ZW50RXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiUmFuZ2VFeGNlcHRpb24uaCIKLSNpbmNs
dWRlICJYTUxIdHRwUmVxdWVzdEV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgIlY4QmluZGluZy5oIgor
I2luY2x1ZGUgIlY4RE9NTWFwLmgiCisjaW5jbHVkZSAiVjhQcm94eS5oIgogI2luY2x1ZGUgIlY4
V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIuaCIKICNpbmNsdWRlICJWOFdvcmtlckNvbnRleHRP
YmplY3RFdmVudExpc3RlbmVyLmgiCiAjaW5jbHVkZSAiV29ya2VyLmgiCkBAIC00OSw2ICs0OSw3
IEBACiAjaW5jbHVkZSAiV29ya2VyTG9jYXRpb24uaCIKICNpbmNsdWRlICJXb3JrZXJOYXZpZ2F0
b3IuaCIKICNpbmNsdWRlICJXb3JrZXJTY3JpcHRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiWE1M
SHR0cFJlcXVlc3RFeGNlcHRpb24uaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC0xMzMs
MTEgKzEzNCwxMSBAQAogewogICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2
ODo6Q29udGV4dDo6R2V0Q3VycmVudCgpOwogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xv
YmFsID0gY29udGV4dC0+R2xvYmFsKCk7Ci0gICAgZ2xvYmFsID0gVjhQcm94eTo6TG9va3VwRE9N
V3JhcHBlcihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGdsb2JhbCk7CisgICAgZ2xvYmFs
ID0gVjhQcm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQs
IGdsb2JhbCk7CiAgICAgLy8gUmV0dXJuIDAgaWYgdGhlIGN1cnJlbnQgZXhlY3V0aW5nIGNvbnRl
eHQgaXMgbm90IHRoZSB3b3JrZXIgY29udGV4dC4KICAgICBpZiAoZ2xvYmFsLklzRW1wdHkoKSkK
ICAgICAgICAgcmV0dXJuIDA7Ci0gICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VS
Q09OVEVYVCwgZ2xvYmFsKTsKKyAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQ
cm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6
V09SS0VSQ09OVEVYVCwgZ2xvYmFsKTsKICAgICByZXR1cm4gd29ya2VyQ29udGV4dC0+c2NyaXB0
KCktPnByb3h5KCk7CiB9CiAKQEAgLTE4NSw5ICsxODYsOSBAQAogICAgIH0KIAogICAgIC8vIFdy
YXAgdGhlIG9iamVjdC4KLSAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKGpzV29ya2VyQ29udGV4
dCwgVjhDbGFzc0luZGV4OjpUb0ludChWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQpLCBtX3dv
cmtlckNvbnRleHQpOworICAgIFY4UHJveHk6OnNldERPTVdyYXBwZXIoanNXb3JrZXJDb250ZXh0
LCBWOENsYXNzSW5kZXg6OlRvSW50KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCksIG1fd29y
a2VyQ29udGV4dCk7CiAKLSAgICBWOFByb3h5OjpTZXRKU1dyYXBwZXJGb3JET01PYmplY3QobV93
b3JrZXJDb250ZXh0LCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGpzV29ya2VyQ29u
dGV4dCkpOworICAgIFY4UHJveHk6OnNldEpTV3JhcHBlckZvckRPTU9iamVjdChtX3dvcmtlckNv
bnRleHQsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcoanNXb3JrZXJDb250ZXh0KSk7
CiAgICAgbV93b3JrZXJDb250ZXh0LT5yZWYoKTsKIAogICAgIC8vIEluc2VydCB0aGUgb2JqZWN0
IGluc3RhbmNlIGFzIHRoZSBwcm90b3R5cGUgb2YgdGhlIHNoYWRvdyBvYmplY3QuCkBAIC0yMDIs
NyArMjAzLDcgQEAKICAgICAvLyBFbnRlciB0aGUgY29udGV4dCBvZiB0aGUgcHJveHkgdG8gbWFr
ZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGlzCiAgICAgLy8gY29uc3RydWN0ZWQgaW4gdGhlIGNv
bnRleHQgY29ycmVzcG9uZGluZyB0byB0aGlzIHByb3h5LgogICAgIHY4OjpDb250ZXh0OjpTY29w
ZSBzY29wZShtX2NvbnRleHQpOwotICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+
IGZ1bmN0aW9uVGVtcGxhdGUgPSBWOFByb3h5OjpHZXRUZW1wbGF0ZSh0eXBlKTsKKyAgICB2ODo6
SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBmdW5jdGlvblRlbXBsYXRlID0gVjhQcm94eTo6
Z2V0VGVtcGxhdGUodHlwZSk7CiAKICAgICAvLyBHZXR0aW5nIHRoZSBmdW5jdGlvbiBtaWdodCBm
YWlsIGlmIHdlJ3JlIHJ1bm5pbmcgb3V0IG9mIHN0YWNrIG9yIG1lbW9yeS4KICAgICB2ODo6VHJ5
Q2F0Y2ggdHJ5Q2F0Y2g7CkBAIC0yMzAsMTIgKzIzMSwxMiBAQAogICAgICAgICBpZiAoIW9iamVj
dC5Jc0VtcHR5KCkpCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxXb3JrZXIqPihpbXBsKS0+cmVm
KCk7CiAgICAgICAgIHJlc3VsdCA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcob2Jq
ZWN0KTsKLSAgICAgICAgVjhQcm94eTo6U2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KGltcGwsIHJl
c3VsdCk7CisgICAgICAgIFY4UHJveHk6OnNldEpTV3JhcHBlckZvckRPTU9iamVjdChpbXBsLCBy
ZXN1bHQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8vIE5vbiBET00g
bm9kZQotICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHJlc3VsdCA9IGRvbU9iamVjdE1h
cCgpLmdldChpbXBsKTsKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiByZXN1bHQgPSBn
ZXRET01PYmplY3RNYXAoKS5nZXQoaW1wbCk7CiAgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpIHsK
ICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IHRvVjgodHlwZSwgdHlwZSwg
aW1wbCk7CiAgICAgICAgIGlmICghb2JqZWN0LklzRW1wdHkoKSkgewpAQCAtMjYyLDcgKzI2Myw3
IEBACiAgICAgICAgICAgICAgICAgQVNTRVJUKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAg
ICAgICAgIHJlc3VsdCA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcob2JqZWN0KTsK
LSAgICAgICAgICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU9iamVjdChpbXBsLCByZXN1
bHQpOworICAgICAgICAgICAgVjhQcm94eTo6c2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KGltcGws
IHJlc3VsdCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTI3Myw3
ICsyNzQsNyBAQAogICAgIGlmICghZXZlbnQpCiAgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOwog
Ci0gICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZG9tT2JqZWN0TWFwKCkuZ2V0
KGV2ZW50KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRET01PYmpl
Y3RNYXAoKS5nZXQoZXZlbnQpOwogICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpCiAgICAgICAg
IHJldHVybiB3cmFwcGVyOwogCkBAIC0yOTAsNyArMjkxLDcgQEAKICAgICB9CiAKICAgICBldmVu
dC0+cmVmKCk7ICAvLyBmYXN0IHJlZgotICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU9i
amVjdChldmVudCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhyZXN1bHQpKTsKKyAg
ICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01PYmplY3QoZXZlbnQsIHY4OjpQZXJzaXN0ZW50
PHY4OjpPYmplY3Q+OjpOZXcocmVzdWx0KSk7CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAt
MzM2LDIwICszMzcsMjAgQEAKICAgICBpZiAocHJveHkpCiAgICAgICAgIGZ1bmN0aW9uID0gcHJv
eHktPkdldENvbnN0cnVjdG9yKGRlc2NUeXBlKTsKICAgICBlbHNlCi0gICAgICAgIGZ1bmN0aW9u
ID0gVjhQcm94eTo6R2V0VGVtcGxhdGUoZGVzY1R5cGUpLT5HZXRGdW5jdGlvbigpOworICAgICAg
ICBmdW5jdGlvbiA9IFY4UHJveHk6OmdldFRlbXBsYXRlKGRlc2NUeXBlKS0+R2V0RnVuY3Rpb24o
KTsKIAogICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBpbnN0YW5jZSA9IFNhZmVBbGxvY2F0aW9u
OjpuZXdJbnN0YW5jZShmdW5jdGlvbik7CiAgICAgaWYgKCFpbnN0YW5jZS5Jc0VtcHR5KCkpIHsK
ICAgICAgICAgLy8gQXZvaWQgc2V0dGluZyB0aGUgRE9NIHdyYXBwZXIgZm9yIGZhaWxlZCBhbGxv
Y2F0aW9ucy4KLSAgICAgICAgVjhQcm94eTo6U2V0RE9NV3JhcHBlcihpbnN0YW5jZSwgVjhDbGFz
c0luZGV4OjpUb0ludChjcHRyVHlwZSksIGltcGwpOworICAgICAgICBWOFByb3h5OjpzZXRET01X
cmFwcGVyKGluc3RhbmNlLCBWOENsYXNzSW5kZXg6OlRvSW50KGNwdHJUeXBlKSwgaW1wbCk7CiAg
ICAgfQogICAgIHJldHVybiBpbnN0YW5jZTsKIH0KIAogYm9vbCBXb3JrZXJDb250ZXh0RXhlY3V0
aW9uUHJveHk6OmZvcmdldFY4RXZlbnRPYmplY3QoRXZlbnQqIGV2ZW50KQogewotICAgIGlmIChk
b21PYmplY3RNYXAoKS5jb250YWlucyhldmVudCkpIHsKLSAgICAgICAgZG9tT2JqZWN0TWFwKCku
Zm9yZ2V0KGV2ZW50KTsKKyAgICBpZiAoZ2V0RE9NT2JqZWN0TWFwKCkuY29udGFpbnMoZXZlbnQp
KSB7CisgICAgICAgIGdldERPTU9iamVjdE1hcCgpLmZvcmdldChldmVudCk7CiAgICAgICAgIHJl
dHVybiB0cnVlOwogICAgIH0gZWxzZQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0zNjMsNyAr
MzY0LDcgQEAKICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUobV9jb250ZXh0KTsKIAogICAg
IHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBzY3JpcHRTdHJpbmcgPSB2OEV4dGVybmFsU3RyaW5nKHNj
cmlwdCk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6U2NyaXB0PiBjb21waWxlZFNjcmlwdCA9IFY4UHJv
eHk6OkNvbXBpbGVTY3JpcHQoc2NyaXB0U3RyaW5nLCBmaWxlTmFtZSwgYmFzZUxpbmUpOworICAg
IHY4OjpIYW5kbGU8djg6OlNjcmlwdD4gY29tcGlsZWRTY3JpcHQgPSBWOFByb3h5Ojpjb21waWxl
U2NyaXB0KHNjcmlwdFN0cmluZywgZmlsZU5hbWUsIGJhc2VMaW5lKTsKICAgICByZXR1cm4gcnVu
U2NyaXB0KGNvbXBpbGVkU2NyaXB0KTsKIH0KIApAQCAtMzc1LDEwICszNzYsMTAgQEAKICAgICAv
LyBDb21wdXRlIHRoZSBzb3VyY2Ugc3RyaW5nIGFuZCBwcmV2ZW50IGFnYWluc3QgaW5maW5pdGUg
cmVjdXJzaW9uLgogICAgIGlmIChtX3JlY3Vyc2lvbiA+PSBrTWF4UmVjdXJzaW9uRGVwdGgpIHsK
ICAgICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGNvZGUgPSB2OEV4dGVybmFsU3RyaW5nKCJ0
aHJvdyBSYW5nZUVycm9yKCdSZWN1cnNpb24gdG9vIGRlZXAnKSIpOwotICAgICAgICBzY3JpcHQg
PSBWOFByb3h5OjpDb21waWxlU2NyaXB0KGNvZGUsICIiLCAwKTsKKyAgICAgICAgc2NyaXB0ID0g
VjhQcm94eTo6Y29tcGlsZVNjcmlwdChjb2RlLCAiIiwgMCk7CiAgICAgfQogCi0gICAgaWYgKFY4
UHJveHk6OkhhbmRsZU91dE9mTWVtb3J5KCkpCisgICAgaWYgKFY4UHJveHk6OmhhbmRsZU91dE9m
TWVtb3J5KCkpCiAgICAgICAgIEFTU0VSVChzY3JpcHQuSXNFbXB0eSgpKTsKIAogICAgIGlmIChz
Y3JpcHQuSXNFbXB0eSgpKQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOExhenlFdmVudExp
c3RlbmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4TGF6eUV2ZW50
TGlzdGVuZXIuY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhM
YXp5RXZlbnRMaXN0ZW5lci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU0LDcgKzU0LDcgQEAKICAg
ICAvLyBEaXNwb3NlIHdyYXBwZWQgZnVuY3Rpb24KICAgICBpZiAoIW1fd3JhcHBlZEZ1bmN0aW9u
LklzRW1wdHkoKSkgewogI2lmbmRlZiBOREVCVUcKLSAgICAgICAgVjhQcm94eTo6VW5yZWdpc3Rl
ckdsb2JhbEhhbmRsZSh0aGlzLCBtX3dyYXBwZWRGdW5jdGlvbik7CisgICAgICAgIFY4UHJveHk6
OnVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV93cmFwcGVkRnVuY3Rpb24pOwogI2VuZGlm
CiAgICAgICAgIG1fd3JhcHBlZEZ1bmN0aW9uLkRpc3Bvc2UoKTsKICAgICAgICAgbV93cmFwcGVk
RnVuY3Rpb24uQ2xlYXIoKTsKQEAgLTc3LDEyICs3NywxMiBAQAogICAgICAgICB2ODo6SGFuZGxl
U2NvcGUgaGFuZGxlU2NvcGU7CiAKICAgICAgICAgLy8gVXNlIHRoZSBvdXRlciBzY29wZSB0byBo
b2xkIGNvbnRleHQuCi0gICAgICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBW
OFByb3h5OjpHZXRDb250ZXh0KG1fZnJhbWUpOworICAgICAgICB2ODo6SGFuZGxlPHY4OjpDb250
ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KG1fZnJhbWUpOwogICAgICAgICAvLyBC
YWlsIG91dCBpZiB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBjb250ZXh0LgotICAgICAgICBpZiAoY29u
dGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQogICAgICAg
ICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+KCk7CiAKLSAgICAgICAgdjg6OkNv
bnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUg
c2NvcGUodjhDb250ZXh0KTsKIAogICAgICAgICAvLyBXcmFwIGZ1bmN0aW9uIGFyb3VuZCB0aGUg
ZXZlbnQgY29kZS4gIFRoZSBwYXJlbnRoZXNpcyBhcm91bmQgdGhlIGZ1bmN0aW9uIGFyZSBuZWVk
ZWQgc28gdGhhdCBldmFsdWF0aW5nIHRoZSBjb2RlIHlpZWxkcwogICAgICAgICAvLyB0aGUgZnVu
Y3Rpb24gdmFsdWUuICBXaXRob3V0IHRoZSBwYXJlbnRoZXNpcyB0aGUgZnVuY3Rpb24gdmFsdWUg
aXMgdGhyb3duIGF3YXkuCkBAIC0xMDIsMTEgKzEwMiwxMSBAQAogICAgICAgICBjb2RlLmFwcGVu
ZCgiXG59KSIpOwogCiAgICAgICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gY29kZUV4dGVybmFs
U3RyaW5nID0gdjhFeHRlcm5hbFN0cmluZyhjb2RlKTsKLSAgICAgICAgdjg6OkhhbmRsZTx2ODo6
U2NyaXB0PiBzY3JpcHQgPSBWOFByb3h5OjpDb21waWxlU2NyaXB0KGNvZGVFeHRlcm5hbFN0cmlu
ZywgbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCksIG1fbGluZU51bWJlciAtIDEpOworICAgICAg
ICB2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IHNjcmlwdCA9IFY4UHJveHk6OmNvbXBpbGVTY3JpcHQo
Y29kZUV4dGVybmFsU3RyaW5nLCBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSwgbV9saW5lTnVt
YmVyIC0gMSk7CiAgICAgICAgIGlmICghc2NyaXB0LklzRW1wdHkoKSkgewogICAgICAgICAgICAg
VjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShtX2ZyYW1lKTsKICAgICAgICAgICAg
IEFTU0VSVChwcm94eSk7Ci0gICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSA9
IHByb3h5LT5SdW5TY3JpcHQoc2NyaXB0LCBmYWxzZSk7CisgICAgICAgICAgICB2ODo6TG9jYWw8
djg6OlZhbHVlPiB2YWx1ZSA9IHByb3h5LT5ydW5TY3JpcHQoc2NyaXB0LCBmYWxzZSk7CiAgICAg
ICAgICAgICBpZiAoIXZhbHVlLklzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIEFTU0VSVCh2
YWx1ZS0+SXNGdW5jdGlvbigpKTsKICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0
aW9uPiBsaXN0ZW5lckZ1bmN0aW9uID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj46OkNhc3QodmFs
dWUpOwpAQCAtMTE0LDcgKzExNCw3IEBACiAKICAgICAgICAgICAgICAgICBtX2xpc3RlbmVyID0g
djg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uPjo6TmV3KGxpc3RlbmVyRnVuY3Rpb24pOwogI2lm
bmRlZiBOREVCVUcKLSAgICAgICAgICAgICAgICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhhbmRs
ZShFVkVOVF9MSVNURU5FUiwgdGhpcywgbV9saXN0ZW5lcik7CisgICAgICAgICAgICAgICAgVjhQ
cm94eTo6cmVnaXN0ZXJHbG9iYWxIYW5kbGUoRVZFTlRfTElTVEVORVIsIHRoaXMsIG1fbGlzdGVu
ZXIpOwogI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEzNCw3ICsxMzQsNyBA
QAogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBwYXJhbWV0ZXJzWzFdID0geyBqc0V2ZW50IH07
CiAKICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKG1fZnJhbWUpOwotICAg
IHJldHVybiBwcm94eS0+Q2FsbEZ1bmN0aW9uKGhhbmRsZXJGdW5jdGlvbiwgcmVjZWl2ZXIsIDEs
IHBhcmFtZXRlcnMpOworICAgIHJldHVybiBwcm94eS0+Y2FsbEZ1bmN0aW9uKGhhbmRsZXJGdW5j
dGlvbiwgcmVjZWl2ZXIsIDEsIHBhcmFtZXRlcnMpOwogfQogCiAKQEAgLTE1OCwxMiArMTU4LDEy
IEBACiAgICAgICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKIAogICAgICAgICAvLyBV
c2UgdGhlIG91dGVyIHNjb3BlIHRvIGhvbGQgY29udGV4dC4KLSAgICAgICAgdjg6OkhhbmRsZTx2
ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQobV9mcmFtZSk7CisgICAg
ICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQo
bV9mcmFtZSk7CiAgICAgICAgIC8vIEJhaWwgb3V0IGlmIHdlIGNhbm5vdCBnZXQgdGhlIGNvbnRl
eHQuCi0gICAgICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgaWYgKHY4Q29udGV4
dC5Jc0VtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4o
KTsKIAotICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisgICAgICAg
IHY4OjpDb250ZXh0OjpTY29wZSBzY29wZSh2OENvbnRleHQpOwogCiAgICAgICAgIC8vIEZJWE1F
OiBjYWNoZSB0aGUgd3JhcHBlciBmdW5jdGlvbi4KIApAQCAtMTg0LDExICsxODQsMTEgQEAKICAg
ICAgICAgLy8gSW5zZXJ0ICdcbicgb3RoZXJ3aXNlIC8vLXN0eWxlIGNvbW1lbnRzIGNvdWxkIGJy
ZWFrIHRoZSBoYW5kbGVyLgogICAgICAgICBjb2RlLmFwcGVuZCggICJcbn0pLmNhbGwodGhpcywg
ZXZ0KTt9fX19KSIpOwogICAgICAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IGNvZGVFeHRlcm5h
bFN0cmluZyA9IHY4RXh0ZXJuYWxTdHJpbmcoY29kZSk7Ci0gICAgICAgIHY4OjpIYW5kbGU8djg6
OlNjcmlwdD4gc2NyaXB0ID0gVjhQcm94eTo6Q29tcGlsZVNjcmlwdChjb2RlRXh0ZXJuYWxTdHJp
bmcsIG1fZnJhbWUtPmRvY3VtZW50KCktPnVybCgpLCBtX2xpbmVOdW1iZXIpOworICAgICAgICB2
ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IHNjcmlwdCA9IFY4UHJveHk6OmNvbXBpbGVTY3JpcHQoY29k
ZUV4dGVybmFsU3RyaW5nLCBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSwgbV9saW5lTnVtYmVy
KTsKICAgICAgICAgaWYgKCFzY3JpcHQuSXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBWOFByb3h5
KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKG1fZnJhbWUpOwogICAgICAgICAgICAgQVNTRVJU
KHByb3h5KTsKLSAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlID0gcHJveHkt
PlJ1blNjcmlwdChzY3JpcHQsIGZhbHNlKTsKKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFs
dWU+IHZhbHVlID0gcHJveHktPnJ1blNjcmlwdChzY3JpcHQsIGZhbHNlKTsKICAgICAgICAgICAg
IGlmICghdmFsdWUuSXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgQVNTRVJUKHZhbHVlLT5J
c0Z1bmN0aW9uKCkpOwogCkBAIC0yMTgsNyArMjE4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAK
ICNpZm5kZWYgTkRFQlVHCi0gICAgICAgICAgICAgICAgVjhQcm94eTo6UmVnaXN0ZXJHbG9iYWxI
YW5kbGUoRVZFTlRfTElTVEVORVIsIHRoaXMsIG1fd3JhcHBlZEZ1bmN0aW9uKTsKKyAgICAgICAg
ICAgICAgICBWOFByb3h5OjpyZWdpc3Rlckdsb2JhbEhhbmRsZShFVkVOVF9MSVNURU5FUiwgdGhp
cywgbV93cmFwcGVkRnVuY3Rpb24pOwogI2VuZGlmCiAgICAgICAgICAgICAgICAgbV93cmFwcGVk
RnVuY3Rpb24tPlNldE5hbWUodjg6OlN0cmluZzo6TmV3KGZyb21XZWJDb3JlU3RyaW5nKG1fZnVu
Y3Rpb25OYW1lKSwgbV9mdW5jdGlvbk5hbWUubGVuZ3RoKCkpKTsKICAgICAgICAgICAgIH0KSW5k
ZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvU2NyaXB0VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL2JpbmRpbmdzL3Y4L1NjcmlwdFZhbHVlLmgJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29y
ZS9iaW5kaW5ncy92OC9TY3JpcHRWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC01Myw3ICs1Myw3
IEBACiAKICAgICAgICAgbV92YWx1ZSA9IHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT46Ok5ldyh2
YWx1ZSk7CiAjaWZuZGVmIE5ERUJVRwotICAgICAgICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhh
bmRsZShTQ1JJUFRWQUxVRSwgdGhpcywgbV92YWx1ZSk7CisgICAgICAgIFY4UHJveHk6OnJlZ2lz
dGVyR2xvYmFsSGFuZGxlKFNDUklQVFZBTFVFLCB0aGlzLCBtX3ZhbHVlKTsKICNlbmRpZgogICAg
IH0KIApAQCAtNjQsNyArNjQsNyBAQAogCiAgICAgICAgIG1fdmFsdWUgPSB2ODo6UGVyc2lzdGVu
dDx2ODo6VmFsdWU+OjpOZXcodmFsdWUubV92YWx1ZSk7CiAjaWZuZGVmIE5ERUJVRwotICAgICAg
ICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhhbmRsZShTQ1JJUFRWQUxVRSwgdGhpcywgbV92YWx1
ZSk7CisgICAgICAgIFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxlKFNDUklQVFZBTFVFLCB0
aGlzLCBtX3ZhbHVlKTsKICNlbmRpZgogICAgIH0KIApAQCAtODAsNyArODAsNyBAQAogCiAgICAg
ICAgIG1fdmFsdWUgPSB2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+OjpOZXcodmFsdWUubV92YWx1
ZSk7CiAjaWZuZGVmIE5ERUJVRwotICAgICAgICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhhbmRs
ZShTQ1JJUFRWQUxVRSwgdGhpcywgbV92YWx1ZSk7CisgICAgICAgIFY4UHJveHk6OnJlZ2lzdGVy
R2xvYmFsSGFuZGxlKFNDUklQVFZBTFVFLCB0aGlzLCBtX3ZhbHVlKTsKICNlbmRpZgogCiAgICAg
ICAgIHJldHVybiAqdGhpczsKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgICAgICAgICAgcmV0dXJu
OwogCiAjaWZuZGVmIE5ERUJVRwotICAgICAgICBWOFByb3h5OjpVbnJlZ2lzdGVyR2xvYmFsSGFu
ZGxlKHRoaXMsIG1fdmFsdWUpOworICAgICAgICBWOFByb3h5Ojp1bnJlZ2lzdGVyR2xvYmFsSGFu
ZGxlKHRoaXMsIG1fdmFsdWUpOwogI2VuZGlmCiAgICAgICAgIG1fdmFsdWUuRGlzcG9zZSgpOwog
ICAgICAgICBtX3ZhbHVlLkNsZWFyKCk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4Q29s
bGVjdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhDb2xsZWN0aW9u
LmgJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOENvbGxlY3Rpb24u
aAkod29ya2luZyBjb3B5KQpAQCAtNDcsOCArNDcsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHY4
OjpIYW5kbGU8djg6OlZhbHVlPigpOwogICAgICAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5
cGUgdHlwZSA9IFY4Q2xhc3NJbmRleDo6RnJvbUludChpbXBsZW1lbnRhdGlvblR5cGUtPkludDMy
VmFsdWUoKSk7CiAgICAgICAgIGlmICh0eXBlID09IFY4Q2xhc3NJbmRleDo6Tk9ERSkKLSAgICAg
ICAgICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChzdGF0aWNfY2FzdDxOb2RlKj4o
aW1wbGVtZW50YXRpb24pKTsKLSAgICAgICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QodHlw
ZSwgaW1wbGVtZW50YXRpb24pOworICAgICAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRO
b2RlVG9WOE9iamVjdChzdGF0aWNfY2FzdDxOb2RlKj4oaW1wbGVtZW50YXRpb24pKTsKKyAgICAg
ICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KHR5cGUsIGltcGxlbWVudGF0aW9u
KTsKICAgICB9CiAKICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IGdldFY4T2JqZWN0KFBhc3NSZWZQdHI8VD4gaW1wbGVtZW50YXRpb24sIHY4OjpMb2Nh
bDx2ODo6VmFsdWU+IGltcGxlbWVudGF0aW9uVHlwZSkKQEAgLTYxLDEwICs2MSwxMCBAQAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4
OjpWYWx1ZT4gaW1wbGVtZW50YXRpb25UeXBlKQogICAgIHsKICAgICAgICAgLy8gRklYTUU6IGFz
c2VydCBvYmplY3QgaXMgYSBjb2xsZWN0aW9uIHR5cGUKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6
Ok1heWJlRE9NV3JhcHBlcihvYmplY3QpKTsKLSAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBw
ZXJUeXBlIHdyYXBwZXJUeXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUob2JqZWN0KTsK
KyAgICAgICAgQVNTRVJUKFY4UHJveHk6Om1heWJlRE9NV3JhcHBlcihvYmplY3QpKTsKKyAgICAg
ICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHdyYXBwZXJUeXBlID0gVjhQcm94eTo6ZG9t
V3JhcHBlclR5cGUob2JqZWN0KTsKICAgICAgICAgQVNTRVJUKHdyYXBwZXJUeXBlICE9IFY4Q2xh
c3NJbmRleDo6Tk9ERSk7Ci0gICAgICAgIENvbGxlY3Rpb24qIGNvbGxlY3Rpb24gPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgb2JqZWN0KTsKKyAgICAg
ICAgQ29sbGVjdGlvbiogY29sbGVjdGlvbiA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVj
dDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgb2JqZWN0KTsKICAgICAgICAgU3RyaW5nIHByb3Bl
cnR5TmFtZSA9IHRvV2ViQ29yZVN0cmluZyhuYW1lKTsKICAgICAgICAgcmV0dXJuIGdldFY4T2Jq
ZWN0PEl0ZW1UeXBlPihjb2xsZWN0aW9uLT5uYW1lZEl0ZW0ocHJvcGVydHlOYW1lKSwgaW1wbGVt
ZW50YXRpb25UeXBlKTsKICAgICB9CkBAIC04Nyw4ICs4Nyw4IEBACiAgICAgLy8gQSB0ZW1wbGF0
ZSBvZiBuYW1lZCBwcm9wZXJ0eSBhY2Nlc3NvciBvZiBIVE1MU2VsZWN0RWxlbWVudCBhbmQgSFRN
TEZvcm1FbGVtZW50LgogICAgIHRlbXBsYXRlPGNsYXNzIENvbGxlY3Rpb24+IHN0YXRpYyB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gbm9kZUNvbGxlY3Rpb25OYW1lZFByb3BlcnR5R2V0dGVyKHY4OjpM
b2NhbDx2ODo6U3RyaW5nPiBuYW1lLCBjb25zdCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZvKQogICAg
IHsKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6Ok1heWJlRE9NV3JhcHBlcihpbmZvLkhvbGRlcigp
KSk7Ci0gICAgICAgIEFTU0VSVChWOFByb3h5OjpHZXRET01XcmFwcGVyVHlwZShpbmZvLkhvbGRl
cigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOworICAgICAgICBBU1NFUlQoVjhQcm94eTo6bWF5
YmVET01XcmFwcGVyKGluZm8uSG9sZGVyKCkpKTsKKyAgICAgICAgQVNTRVJUKFY4UHJveHk6OmRv
bVdyYXBwZXJUeXBlKGluZm8uSG9sZGVyKCkpID09IFY4Q2xhc3NJbmRleDo6Tk9ERSk7CiAgICAg
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSA9IGluZm8uSG9sZGVyKCktPkdldFJlYWxO
YW1lZFByb3BlcnR5SW5Qcm90b3R5cGVDaGFpbihuYW1lKTsKIAogICAgICAgICBpZiAoIXZhbHVl
LklzRW1wdHkoKSkKQEAgLTEwOSwxMCArMTA5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGltcGxlbWVu
dGF0aW9uVHlwZSkKICAgICB7CiAgICAgICAgIC8vIEZJWE1FOiBBc3NlcnQgdGhhdCBvYmplY3Qg
bXVzdCBiZSBhIGNvbGxlY3Rpb24gdHlwZS4KLSAgICAgICAgQVNTRVJUKFY4UHJveHk6Ok1heWJl
RE9NV3JhcHBlcihvYmplY3QpKTsKLSAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBl
IHdyYXBwZXJUeXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUob2JqZWN0KTsKKyAgICAg
ICAgQVNTRVJUKFY4UHJveHk6Om1heWJlRE9NV3JhcHBlcihvYmplY3QpKTsKKyAgICAgICAgVjhD
bGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHdyYXBwZXJUeXBlID0gVjhQcm94eTo6ZG9tV3JhcHBl
clR5cGUob2JqZWN0KTsKICAgICAgICAgQVNTRVJUKHdyYXBwZXJUeXBlICE9IFY4Q2xhc3NJbmRl
eDo6Tk9ERSk7Ci0gICAgICAgIENvbGxlY3Rpb24qIGNvbGxlY3Rpb24gPSBWOFByb3h5OjpUb05h
dGl2ZU9iamVjdDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgb2JqZWN0KTsKKyAgICAgICAgQ29s
bGVjdGlvbiogY29sbGVjdGlvbiA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDb2xs
ZWN0aW9uPih3cmFwcGVyVHlwZSwgb2JqZWN0KTsKICAgICAgICAgcmV0dXJuIGdldFY4T2JqZWN0
PEl0ZW1UeXBlPihjb2xsZWN0aW9uLT5pdGVtKGluZGV4KSwgaW1wbGVtZW50YXRpb25UeXBlKTsK
ICAgICB9CiAKQEAgLTEyNSw5ICsxMjUsOSBAQAogICAgIC8vIEEgdGVtcGxhdGUgb2YgaW5kZXgg
aW50ZXJjZXB0b3Igb2YgSFRNTFNlbGVjdEVsZW1lbnQgYW5kIEhUTUxGb3JtRWxlbWVudC4KICAg
ICB0ZW1wbGF0ZTxjbGFzcyBDb2xsZWN0aW9uPiBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+
IG5vZGVDb2xsZWN0aW9uSW5kZXhlZFByb3BlcnR5R2V0dGVyKHVpbnQzMl90IGluZGV4LCBjb25z
dCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZvKQogICAgIHsKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6
Ok1heWJlRE9NV3JhcHBlcihpbmZvLkhvbGRlcigpKSk7Ci0gICAgICAgIEFTU0VSVChWOFByb3h5
OjpHZXRET01XcmFwcGVyVHlwZShpbmZvLkhvbGRlcigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUp
OwotICAgICAgICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6RE9NV3JhcHBlclRv
Tm9kZTxDb2xsZWN0aW9uPihpbmZvLkhvbGRlcigpKTsKKyAgICAgICAgQVNTRVJUKFY4UHJveHk6
Om1heWJlRE9NV3JhcHBlcihpbmZvLkhvbGRlcigpKSk7CisgICAgICAgIEFTU0VSVChWOFByb3h5
Ojpkb21XcmFwcGVyVHlwZShpbmZvLkhvbGRlcigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOwor
ICAgICAgICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBw
ZXJUb05vZGU8Q29sbGVjdGlvbj4oaW5mby5Ib2xkZXIoKSk7CiAgICAgICAgIHZvaWQqIGltcGxl
bWVudGF0aW9uID0gY29sbGVjdGlvbi0+aXRlbShpbmRleCk7CiAgICAgICAgIHJldHVybiBnZXRW
OE9iamVjdChpbXBsZW1lbnRhdGlvbiwgaW5mby5EYXRhKCkpOwogICAgIH0KQEAgLTEzNSw5ICsx
MzUsOSBAQAogICAgIC8vIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBpbmRl
eGVkIHByb3BlcnRpZXMgb2YgSFRNTFNlbGVjdEVsZW1lbnQgYW5kIEhUTUxGb3JtRWxlbWVudC4K
ICAgICB0ZW1wbGF0ZTxjbGFzcyBDb2xsZWN0aW9uPiBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6QXJy
YXk+IG5vZGVDb2xsZWN0aW9uSW5kZXhlZFByb3BlcnR5RW51bWVyYXRvcihjb25zdCB2ODo6QWNj
ZXNzb3JJbmZvJiBpbmZvKQogICAgIHsKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6Ok1heWJlRE9N
V3JhcHBlcihpbmZvLkhvbGRlcigpKSk7Ci0gICAgICAgIEFTU0VSVChWOFByb3h5OjpHZXRET01X
cmFwcGVyVHlwZShpbmZvLkhvbGRlcigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOwotICAgICAg
ICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxDb2xs
ZWN0aW9uPihpbmZvLkhvbGRlcigpKTsKKyAgICAgICAgQVNTRVJUKFY4UHJveHk6Om1heWJlRE9N
V3JhcHBlcihpbmZvLkhvbGRlcigpKSk7CisgICAgICAgIEFTU0VSVChWOFByb3h5Ojpkb21XcmFw
cGVyVHlwZShpbmZvLkhvbGRlcigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOworICAgICAgICBD
b2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8
Q29sbGVjdGlvbj4oaW5mby5Ib2xkZXIoKSk7CiAgICAgICAgIGludCBsZW5ndGggPSBjb2xsZWN0
aW9uLT5sZW5ndGgoKTsKICAgICAgICAgdjg6OkhhbmRsZTx2ODo6QXJyYXk+IHByb3BlcnRpZXMg
PSB2ODo6QXJyYXk6Ok5ldyhsZW5ndGgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxl
bmd0aDsgKytpKSB7CkBAIC0xNTEsOSArMTUxLDkgQEAKICAgICAvLyBHZXQgYW4gYXJyYXkgY29u
dGFpbmluZyB0aGUgbmFtZXMgb2YgaW5kZXhlZCBwcm9wZXJ0aWVzIGluIGEgY29sbGVjdGlvbi4K
ICAgICB0ZW1wbGF0ZTxjbGFzcyBDb2xsZWN0aW9uPiBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6QXJy
YXk+IGNvbGxlY3Rpb25JbmRleGVkUHJvcGVydHlFbnVtZXJhdG9yKGNvbnN0IHY4OjpBY2Nlc3Nv
ckluZm8mIGluZm8pCiAgICAgewotICAgICAgICBBU1NFUlQoVjhQcm94eTo6TWF5YmVET01XcmFw
cGVyKGluZm8uSG9sZGVyKCkpKTsKLSAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBl
IHdyYXBwZXJUeXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUoaW5mby5Ib2xkZXIoKSk7
Ci0gICAgICAgIENvbGxlY3Rpb24qIGNvbGxlY3Rpb24gPSBWOFByb3h5OjpUb05hdGl2ZU9iamVj
dDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgaW5mby5Ib2xkZXIoKSk7CisgICAgICAgIEFTU0VS
VChWOFByb3h5OjptYXliZURPTVdyYXBwZXIoaW5mby5Ib2xkZXIoKSkpOworICAgICAgICBWOENs
YXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgd3JhcHBlclR5cGUgPSBWOFByb3h5Ojpkb21XcmFwcGVy
VHlwZShpbmZvLkhvbGRlcigpKTsKKyAgICAgICAgQ29sbGVjdGlvbiogY29sbGVjdGlvbiA9IFY4
UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgaW5m
by5Ib2xkZXIoKSk7CiAgICAgICAgIGludCBsZW5ndGggPSBjb2xsZWN0aW9uLT5sZW5ndGgoKTsK
ICAgICAgICAgdjg6OkhhbmRsZTx2ODo6QXJyYXk+IHByb3BlcnRpZXMgPSB2ODo6QXJyYXk6Ok5l
dyhsZW5ndGgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CkBA
IC0xNjksOSArMTY5LDkgQEAKICAgICB0ZW1wbGF0ZTxjbGFzcyBDb2xsZWN0aW9uPiBzdGF0aWMg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbGxlY3Rpb25TdHJpbmdPck51bGxJbmRleGVkUHJvcGVy
dHlHZXR0ZXIodWludDMyX3QgaW5kZXgsIGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pCiAg
ICAgewogICAgICAgICAvLyBGSVhNRTogYXNzZXJ0IHRoYXQgb2JqZWN0IG11c3QgYmUgYSBjb2xs
ZWN0aW9uIHR5cGUKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6Ok1heWJlRE9NV3JhcHBlcihpbmZv
LkhvbGRlcigpKSk7Ci0gICAgICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB3cmFwcGVy
VHlwZSA9IFY4UHJveHk6OkdldERPTVdyYXBwZXJUeXBlKGluZm8uSG9sZGVyKCkpOwotICAgICAg
ICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q29sbGVj
dGlvbj4od3JhcHBlclR5cGUsIGluZm8uSG9sZGVyKCkpOworICAgICAgICBBU1NFUlQoVjhQcm94
eTo6bWF5YmVET01XcmFwcGVyKGluZm8uSG9sZGVyKCkpKTsKKyAgICAgICAgVjhDbGFzc0luZGV4
OjpWOFdyYXBwZXJUeXBlIHdyYXBwZXJUeXBlID0gVjhQcm94eTo6ZG9tV3JhcHBlclR5cGUoaW5m
by5Ib2xkZXIoKSk7CisgICAgICAgIENvbGxlY3Rpb24qIGNvbGxlY3Rpb24gPSBWOFByb3h5Ojpj
b252ZXJ0VG9OYXRpdmVPYmplY3Q8Q29sbGVjdGlvbj4od3JhcHBlclR5cGUsIGluZm8uSG9sZGVy
KCkpOwogICAgICAgICBTdHJpbmcgcmVzdWx0ID0gY29sbGVjdGlvbi0+aXRlbShpbmRleCk7CiAg
ICAgICAgIHJldHVybiB2OFN0cmluZ09yTnVsbChyZXN1bHQpOwogICAgIH0KSW5kZXg6IFdlYkNv
cmUvYmluZGluZ3MvdjgvU2NyaXB0T2JqZWN0UXVhcmFudGluZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9iaW5kaW5ncy92OC9TY3JpcHRPYmplY3RRdWFyYW50aW5lLmNwcAkocmV2aXNpb24g
NDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjcmlwdE9iamVjdFF1YXJhbnRpbmUuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC03NywxMCArNzcsMTAgQEAKICAgICBBU1NFUlQobm9kZSk7CiAK
ICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7Ci0gICAgdjg6OkxvY2FsPHY4OjpDb250
ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChub2RlLT5kb2N1bWVudCgpLT5wYWdl
KCktPm1haW5GcmFtZSgpKTsKKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBW
OFByb3h5Ojpjb250ZXh0KG5vZGUtPmRvY3VtZW50KCktPnBhZ2UoKS0+bWFpbkZyYW1lKCkpOwog
ICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKIAotICAgIHY4OjpIYW5kbGU8
djg6OlZhbHVlPiB2OE5vZGUgPSBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChub2RlKTsKKyAgICB2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdjhOb2RlID0gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2Jq
ZWN0KG5vZGUpOwogICAgIHF1YXJhbnRpbmVkT2JqZWN0ID0gU2NyaXB0T2JqZWN0KHY4OjpMb2Nh
bDx2ODo6T2JqZWN0Pih2ODo6T2JqZWN0OjpDYXN0KCp2OE5vZGUpKSk7CiAKICAgICByZXR1cm4g
dHJ1ZTsKQEAgLTkxLDEwICs5MSwxMCBAQAogICAgIEFTU0VSVChkb21XaW5kb3cpOwogCiAgICAg
djg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4g
Y29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQoZG9tV2luZG93LT5mcmFtZSgpKTsKKyAgICB2
ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KGRvbVdpbmRv
dy0+ZnJhbWUoKSk7CiAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOwogCi0g
ICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHY4RG9tV2luZG93ID0gVjhQcm94eTo6VG9WOE9iamVj
dChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgZG9tV2luZG93KTsKKyAgICB2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4gdjhEb21XaW5kb3cgPSBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVywgZG9tV2luZG93KTsKICAgICBxdWFyYW50aW5lZE9iamVjdCA9IFNj
cmlwdE9iamVjdCh2ODo6TG9jYWw8djg6Ok9iamVjdD4odjg6Ok9iamVjdDo6Q2FzdCgqdjhEb21X
aW5kb3cpKSk7CiAKICAgICByZXR1cm4gdHJ1ZTsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mvdjgv
U2NyaXB0Q2FsbFN0YWNrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Nj
cmlwdENhbGxTdGFjay5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92
OC9TY3JpcHRDYWxsU3RhY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICszOSw3IEBACiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKIFNjcmlwdENhbGxTdGFjazo6U2NyaXB0Q2FsbFN0YWNrKGNv
bnN0IHY4OjpBcmd1bWVudHMmIGFyZ3VtZW50cywgdW5zaWduZWQgc2tpcEFyZ3VtZW50Q291bnQp
Ci0gICAgOiBtX2xhc3RDYWxsZXIoU3RyaW5nKCksIFY4UHJveHk6OkdldFNvdXJjZU5hbWUoKSwg
VjhQcm94eTo6R2V0U291cmNlTGluZU51bWJlcigpICsgMSwgYXJndW1lbnRzLCBza2lwQXJndW1l
bnRDb3VudCkKKyAgICA6IG1fbGFzdENhbGxlcihTdHJpbmcoKSwgVjhQcm94eTo6c291cmNlTmFt
ZSgpLCBWOFByb3h5Ojpzb3VyY2VMaW5lTnVtYmVyKCkgKyAxLCBhcmd1bWVudHMsIHNraXBBcmd1
bWVudENvdW50KQogICAgICwgbV9zY3JpcHRTdGF0ZShuZXcgU2NyaXB0U3RhdGUoVjhQcm94eTo6
cmV0cmlldmVGcmFtZSgpKSkKIHsKIH0KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvU2NyaXB0
T2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjcmlwdE9iamVj
dC5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9TY3JpcHRPYmpl
Y3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTksNyArMTE5LDcgQEAKIGJvb2wgU2NyaXB0R2xv
YmFsT2JqZWN0OjpzZXQoU2NyaXB0U3RhdGUqIHNjcmlwdFN0YXRlLCBjb25zdCBjaGFyKiBuYW1l
LCBJbnNwZWN0b3JDb250cm9sbGVyKiB2YWx1ZSkKIHsKICAgICBTY3JpcHRTY29wZSBzY29wZShz
Y3JpcHRTdGF0ZSk7Ci0gICAgc2NvcGUuZ2xvYmFsKCktPlNldCh2ODo6U3RyaW5nOjpOZXcobmFt
ZSksIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVS
LCB2YWx1ZSkpOworICAgIHNjb3BlLmdsb2JhbCgpLT5TZXQodjg6OlN0cmluZzo6TmV3KG5hbWUp
LCBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OklOU1BFQ1RPUkNPTlRS
T0xMRVIsIHZhbHVlKSk7CiAgICAgcmV0dXJuIHNjb3BlLnN1Y2Nlc3MoKTsKIH0KIApJbmRleDog
V2ViQ29yZS9iaW5kaW5ncy92OC9WOE9iamVjdEV2ZW50TGlzdGVuZXIuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhPYmplY3RFdmVudExpc3RlbmVyLmNwcAkocmV2aXNp
b24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4T2JqZWN0RXZlbnRMaXN0ZW5lci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICBpZiAoZnJhbWUpIHsKICAg
ICAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShmcmFtZSk7CiAgICAgICAg
IGlmIChwcm94eSkKLSAgICAgICAgICAgIHByb3h5LT5SZW1vdmVPYmplY3RFdmVudExpc3RlbmVy
KGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHByb3h5LT5yZW1vdmVPYmplY3RFdmVudExpc3RlbmVy
KGxpc3RlbmVyKTsKIAogICAgICAgICAvLyBCZWNhdXNlIHRoZSBsaXN0ZW5lciBpcyBubyBsb25n
ZXIgaW4gdGhlIGxpc3QsIGl0IG11c3QgYmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIGZyYW1lIHRv
IGF2b2lkIGRhbmdsaW5nIGZyYW1lIHBvaW50ZXIKICAgICAgICAgLy8gaW4gdGhlIGRlc3RydWN0
b3IuCkBAIC02Niw3ICs2Niw3IEBACiAgICAgICAgIEFTU0VSVCghbV9saXN0ZW5lci5Jc0VtcHR5
KCkpOwogICAgICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKG1fZnJhbWUp
OwogICAgICAgICBpZiAocHJveHkpCi0gICAgICAgICAgICBwcm94eS0+UmVtb3ZlT2JqZWN0RXZl
bnRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIHByb3h5LT5yZW1vdmVPYmplY3RFdmVudExp
c3RlbmVyKHRoaXMpOwogICAgIH0KIAogICAgIGRpc3Bvc2VMaXN0ZW5lck9iamVjdCgpOwpJbmRl
eDogV2ViQ29yZS9iaW5kaW5ncy92OC9TY2hlZHVsZWRBY3Rpb24uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvYmluZGluZ3MvdjgvU2NoZWR1bGVkQWN0aW9uLmNwcAkocmV2aXNpb24gNDUwOTUp
CisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjaGVkdWxlZEFjdGlvbi5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTUwLDcgKzUwLDcgQEAKICAgICBtX2Z1bmN0aW9uID0gdjg6OlBlcnNpc3RlbnQ8djg6
OkZ1bmN0aW9uPjo6TmV3KGZ1bmMpOwogCiAjaWZuZGVmIE5ERUJVRwotICAgIFY4UHJveHk6OlJl
Z2lzdGVyR2xvYmFsSGFuZGxlKFNDSEVEVUxFRF9BQ1RJT04sIHRoaXMsIG1fZnVuY3Rpb24pOwor
ICAgIFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxlKFNDSEVEVUxFRF9BQ1RJT04sIHRoaXMs
IG1fZnVuY3Rpb24pOwogI2VuZGlmCiAKICAgICBtX2FyZ2MgPSBhcmdjOwpAQCAtNjAsNyArNjAs
NyBAQAogICAgICAgICAgICAgbV9hcmd2W2ldID0gdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPjo6
TmV3KGFyZ3ZbaV0pOwogCiAjaWZuZGVmIE5ERUJVRwotICAgIFY4UHJveHk6OlJlZ2lzdGVyR2xv
YmFsSGFuZGxlKFNDSEVEVUxFRF9BQ1RJT04sIHRoaXMsIG1fYXJndltpXSk7CisgICAgVjhQcm94
eTo6cmVnaXN0ZXJHbG9iYWxIYW5kbGUoU0NIRURVTEVEX0FDVElPTiwgdGhpcywgbV9hcmd2W2ld
KTsKICNlbmRpZgogICAgICAgICB9CiAgICAgfSBlbHNlCkBAIC03MywxMyArNzMsMTMgQEAKICAg
ICAgICAgcmV0dXJuOwogCiAjaWZuZGVmIE5ERUJVRwotICAgIFY4UHJveHk6OlVucmVnaXN0ZXJH
bG9iYWxIYW5kbGUodGhpcywgbV9mdW5jdGlvbik7CisgICAgVjhQcm94eTo6dW5yZWdpc3Rlckds
b2JhbEhhbmRsZSh0aGlzLCBtX2Z1bmN0aW9uKTsKICNlbmRpZgogICAgIG1fZnVuY3Rpb24uRGlz
cG9zZSgpOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2FyZ2M7IGkrKykgewogI2lmbmRl
ZiBOREVCVUcKLSAgICAgICAgVjhQcm94eTo6VW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBt
X2FyZ3ZbaV0pOworICAgICAgICBWOFByb3h5Ojp1bnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMs
IG1fYXJndltpXSk7CiAjZW5kaWYKICAgICAgICAgbV9hcmd2W2ldLkRpc3Bvc2UoKTsKICAgICB9
CkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICBBU1NFUlQocHJveHkpOwogCiAgICAgdjg6OkhhbmRs
ZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gdjhDb250ZXh0
ID0gcHJveHktPkdldENvbnRleHQoKTsKKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHY4Q29u
dGV4dCA9IHByb3h5LT5jb250ZXh0KCk7CiAgICAgaWYgKHY4Q29udGV4dC5Jc0VtcHR5KCkpCiAg
ICAgICAgIHJldHVybjsgLy8gSlMgbWF5IG5vdCBiZSBlbmFibGVkLgogCkBAIC0xMTYsNyArMTE2
LDcgQEAKIAogICAgIC8vIEZJWE1FOiBOZWVkIHRvIGltcGxlbWVudCB0aW1lb3V0cyBmb3IgcHJl
ZW1wdGluZyBhIGxvbmctcnVubmluZyBzY3JpcHQuCiAgICAgaWYgKCFtX2Z1bmN0aW9uLklzRW1w
dHkoKSAmJiBtX2Z1bmN0aW9uLT5Jc0Z1bmN0aW9uKCkpIHsKLSAgICAgICAgcHJveHktPkNhbGxG
dW5jdGlvbih2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+OjpDYXN0KG1fZnVuY3Rpb24pLCB2
OENvbnRleHQtPkdsb2JhbCgpLCBtX2FyZ2MsIG1fYXJndik7CisgICAgICAgIHByb3h5LT5jYWxs
RnVuY3Rpb24odjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uPjo6Q2FzdChtX2Z1bmN0aW9uKSwg
djhDb250ZXh0LT5HbG9iYWwoKSwgbV9hcmdjLCBtX2FyZ3YpOwogICAgICAgICBEb2N1bWVudDo6
dXBkYXRlU3R5bGVGb3JBbGxEb2N1bWVudHMoKTsKICAgICB9IGVsc2UKICAgICAgICAgcHJveHkt
PmV2YWx1YXRlKG1fY29kZSwgMCk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4UHJveHku
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhQcm94eS5jcHAJKHJldmlz
aW9uIDApCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4UHJveHkuY3BwCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDMxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisg
KiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0
aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250
cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2
ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
VjhQcm94eS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxpdHk+Cisj
aW5jbHVkZSA8djguaD4KKyNpbmNsdWRlIDx2OC1kZWJ1Zy5oPgorI2luY2x1ZGUgPHd0Zi9Bc3Nl
cnRpb25zLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9V
bnVzZWRQYXJhbS5oPgorCisjaW5jbHVkZSAiQ2hyb21pdW1CcmlkZ2UuaCIKKyNpbmNsdWRlICJD
U1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbi5oIgorI2luY2x1ZGUgIkRPTU9iamVjdHNJbmNsdWRl
LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJTY3JpcHRDb250cm9s
bGVyLmgiCisjaW5jbHVkZSAiVjhCaW5kaW5nLmgiCisjaW5jbHVkZSAiVjhDb2xsZWN0aW9uLmgi
CisjaW5jbHVkZSAiVjhDdXN0b21CaW5kaW5nLmgiCisjaW5jbHVkZSAiVjhET01NYXAuaCIKKyNp
bmNsdWRlICJWOERPTVdpbmRvdy5oIgorI2luY2x1ZGUgIlY4SW5kZXguaCIKKyNpbmNsdWRlICJX
b3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisv
LyBTdGF0aWMgdXRpbGl0eSBjb250ZXh0Lgordjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IFY4
UHJveHk6Om1fdXRpbGl0eUNvbnRleHQ7CisKKy8vIFN0YXRpYyBsaXN0IG9mIHJlZ2lzdGVyZWQg
ZXh0ZW5zaW9ucworVjhFeHRlbnNpb25MaXN0IFY4UHJveHk6Om1fZXh0ZW5zaW9uczsKKworY29u
c3QgY2hhciogVjhQcm94eTo6a0NvbnRleHREZWJ1Z0RhdGFUeXBlID0gInR5cGUiOworY29uc3Qg
Y2hhciogVjhQcm94eTo6a0NvbnRleHREZWJ1Z0RhdGFWYWx1ZSA9ICJ2YWx1ZSI7CisKKyNpZm5k
ZWYgTkRFQlVHCisvLyBLZWVwcyB0cmFjayBvZiBnbG9iYWwgaGFuZGxlcyBjcmVhdGVkIChub3Qg
SlMgd3JhcHBlcnMKKy8vIG9mIERPTSBvYmplY3RzKS4gT2Z0ZW4gdGhlc2UgZ2xvYmFsIGhhbmRs
ZXMgYXJlIHNvdXJjZQorLy8gb2YgbGVha3MuCisvLworLy8gSWYgeW91IHdhbnQgdG8gbGV0IGEg
QysrIG9iamVjdCBob2xkIGEgcGVyc2lzdGVudCBoYW5kbGUKKy8vIHRvIGEgSlMgb2JqZWN0LCB5
b3Ugc2hvdWxkIHJlZ2lzdGVyIHRoZSBoYW5kbGUgaGVyZSB0bworLy8ga2VlcCB0cmFjayBvZiBs
ZWFrcy4KKy8vCisvLyBXaGVuIGNyZWF0aW5nIGEgcGVyc2lzdGVudCBoYW5kbGUsIGNhbGw6Cisv
LworLy8gI2lmbmRlZiBOREVCVUcKKy8vICAgIFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxl
KHR5cGUsIGhvc3QsIGhhbmRsZSk7CisvLyAjZW5kaWYKKy8vCisvLyBXaGVuIHJlbGVhc2luZyB0
aGUgaGFuZGxlLCBjYWxsOgorLy8KKy8vICNpZm5kZWYgTkRFQlVHCisvLyAgICBWOFByb3h5Ojp1
bnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHR5cGUsIGhvc3QsIGhhbmRsZSk7CisvLyAjZW5kaWYKKy8v
Cit0eXBlZGVmIEhhc2hNYXA8djg6OlZhbHVlKiwgR2xvYmFsSGFuZGxlSW5mbyo+IEdsb2JhbEhh
bmRsZU1hcDsKKworc3RhdGljIEdsb2JhbEhhbmRsZU1hcCYgZ2xvYmFsSGFuZGxlTWFwKCkKK3sK
KyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEdsb2JhbEhhbmRsZU1hcCwgc3RhdGljR2xvYmFsSGFu
ZGxlTWFwLCAoKSk7CisgICAgcmV0dXJuIHN0YXRpY0dsb2JhbEhhbmRsZU1hcDsKK30KKworLy8g
VGhlIGZ1bmN0aW9uIGlzIHRoZSBwbGFjZSB0byBzZXQgdGhlIGJyZWFrIHBvaW50IHRvIGluc3Bl
Y3QKKy8vIGxpdmUgZ2xvYmFsIGhhbmRsZXMuIExlYWtzIGFyZSBvZnRlbiBjb21lIGZyb20gbGVh
a2VkIGdsb2JhbCBoYW5kbGVzLgorc3RhdGljIHZvaWQgZW51bWVyYXRlR2xvYmFsSGFuZGxlcygp
Cit7CisgICAgZm9yIChHbG9iYWxIYW5kbGVNYXA6Oml0ZXJhdG9yIGl0ID0gZ2xvYmFsSGFuZGxl
TWFwKCkuYmVnaW4oKSwgZW5kID0gZ2xvYmFsSGFuZGxlTWFwKCkuZW5kKCk7IGl0ICE9IGVuZDsg
KytpdCkgeworICAgICAgICBHbG9iYWxIYW5kbGVJbmZvKiBpbmZvID0gaXQtPnNlY29uZDsKKyAg
ICAgICAgVU5VU0VEX1BBUkFNKGluZm8pOworICAgICAgICB2ODo6VmFsdWUqIGhhbmRsZSA9IGl0
LT5maXJzdDsKKyAgICAgICAgVU5VU0VEX1BBUkFNKGhhbmRsZSk7CisgICAgfQorfQorCit2b2lk
IFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxlKEdsb2JhbEhhbmRsZVR5cGUgdHlwZSwgdm9p
ZCogaG9zdCwgdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiBoYW5kbGUpCit7CisgICAgQVNTRVJU
KCFnbG9iYWxIYW5kbGVNYXAoKS5jb250YWlucygqaGFuZGxlKSk7CisgICAgZ2xvYmFsSGFuZGxl
TWFwKCkuc2V0KCpoYW5kbGUsIG5ldyBHbG9iYWxIYW5kbGVJbmZvKGhvc3QsIHR5cGUpKTsKK30K
Kwordm9pZCBWOFByb3h5Ojp1bnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHZvaWQqIGhvc3QsIHY4OjpQ
ZXJzaXN0ZW50PHY4OjpWYWx1ZT4gaGFuZGxlKQoreworICAgIEFTU0VSVChnbG9iYWxIYW5kbGVN
YXAoKS5jb250YWlucygqaGFuZGxlKSk7CisgICAgR2xvYmFsSGFuZGxlSW5mbyogaW5mbyA9IGds
b2JhbEhhbmRsZU1hcCgpLnRha2UoKmhhbmRsZSk7CisgICAgQVNTRVJUKGluZm8tPmhvc3RfID09
IGhvc3QpOworICAgIGRlbGV0ZSBpbmZvOworfQorI2VuZGlmIC8vIGlmbmRlZiBOREVCVUcKKwor
dm9pZCBiYXRjaENvbmZpZ3VyZUF0dHJpYnV0ZXModjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxh
dGU+IGluc3RhbmNlLCB2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4gcHJvdG8sIGNvbnN0
IEJhdGNoZWRBdHRyaWJ1dGUqIGF0dHJpYnV0ZXMsIHNpemVfdCBhdHRyaWJ1dGVDb3VudCkKK3sK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF0dHJpYnV0ZUNvdW50OyArK2kpIHsKKyAgICAg
ICAgY29uc3QgQmF0Y2hlZEF0dHJpYnV0ZSogYXR0cmlidXRlID0gJmF0dHJpYnV0ZXNbaV07Cisg
ICAgICAgIChhdHRyaWJ1dGUtPm9uUHJvdG8gPyBwcm90byA6IGluc3RhbmNlKS0+U2V0QWNjZXNz
b3Iodjg6OlN0cmluZzo6TmV3KGF0dHJpYnV0ZS0+bmFtZSksCisgICAgICAgICAgICBhdHRyaWJ1
dGUtPmdldHRlciwKKyAgICAgICAgICAgIGF0dHJpYnV0ZS0+c2V0dGVyLAorICAgICAgICAgICAg
YXR0cmlidXRlLT5kYXRhID09IFY4Q2xhc3NJbmRleDo6SU5WQUxJRF9DTEFTU19JTkRFWCA/IHY4
OjpIYW5kbGU8djg6OlZhbHVlPigpIDogdjg6OkludGVnZXI6Ok5ldyhWOENsYXNzSW5kZXg6OlRv
SW50KGF0dHJpYnV0ZS0+ZGF0YSkpLAorICAgICAgICAgICAgYXR0cmlidXRlLT5zZXR0aW5ncywK
KyAgICAgICAgICAgIGF0dHJpYnV0ZS0+YXR0cmlidXRlKTsKKyAgICB9Cit9CisKK3ZvaWQgYmF0
Y2hDb25maWd1cmVDb25zdGFudHModjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gZnVu
Y3Rpb25EZXNjcmlwdG9yLCB2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4gcHJvdG8sIGNv
bnN0IEJhdGNoZWRDb25zdGFudCogY29uc3RhbnRzLCBzaXplX3QgY29uc3RhbnRDb3VudCkKK3sK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbnN0YW50Q291bnQ7ICsraSkgeworICAgICAg
ICBjb25zdCBCYXRjaGVkQ29uc3RhbnQqIGNvbnN0YW50ID0gJmNvbnN0YW50c1tpXTsKKyAgICAg
ICAgZnVuY3Rpb25EZXNjcmlwdG9yLT5TZXQodjg6OlN0cmluZzo6TmV3KGNvbnN0YW50LT5uYW1l
KSwgdjg6OkludGVnZXI6Ok5ldyhjb25zdGFudC0+dmFsdWUpLCB2ODo6UmVhZE9ubHkpOworICAg
ICAgICBwcm90by0+U2V0KHY4OjpTdHJpbmc6Ok5ldyhjb25zdGFudC0+bmFtZSksIHY4OjpJbnRl
Z2VyOjpOZXcoY29uc3RhbnQtPnZhbHVlKSwgdjg6OlJlYWRPbmx5KTsKKyAgICB9Cit9CisKK3R5
cGVkZWYgSGFzaE1hcDxOb2RlKiwgdjg6Ok9iamVjdCo+IERPTU5vZGVNYXA7Cit0eXBlZGVmIEhh
c2hNYXA8dm9pZCosIHY4OjpPYmplY3QqPiBET01PYmplY3RNYXA7CisKKyNpZm5kZWYgTkRFQlVH
CitzdGF0aWMgdm9pZCBlbnVtZXJhdGVET01PYmplY3RNYXAoRE9NT2JqZWN0TWFwJiB3cmFwcGVy
TWFwKQoreworICAgIGZvciAoRE9NT2JqZWN0TWFwOjppdGVyYXRvciBpdCA9IHdyYXBwZXJNYXAu
YmVnaW4oKSwgZW5kID0gd3JhcHBlck1hcC5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAg
ICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdyYXBwZXIoaXQtPnNlY29uZCk7CisgICAg
ICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6ZG9tV3JhcHBl
clR5cGUod3JhcHBlcik7CisgICAgICAgIHZvaWQqIG9iamVjdCA9IGl0LT5maXJzdDsKKyAgICAg
ICAgVU5VU0VEX1BBUkFNKHR5cGUpOworICAgICAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAg
ICB9Cit9CisKKworc3RhdGljIHZvaWQgZW51bWVyYXRlRE9NTm9kZU1hcChET01Ob2RlTWFwJiBu
b2RlTWFwKQoreworICAgIGZvciAoRE9NTm9kZU1hcDo6aXRlcmF0b3IgaXQgPSBub2RlTWFwLmJl
Z2luKCksIGVuZCA9IG5vZGVNYXAuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBO
b2RlKiBub2RlID0gaXQtPmZpcnN0OworICAgICAgICBVTlVTRURfUEFSQU0obm9kZSk7CisgICAg
ICAgIEFTU0VSVCh2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PihpdC0+c2Vjb25kKS5Jc1dlYWso
KSk7CisgICAgfQorfQorI2VuZGlmIC8vIE5ERUJVRworCisjaWYgRU5BQkxFKFNWRykKK3Y4OjpI
YW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpjb252ZXJ0U1ZHRWxlbWVudEluc3RhbmNlVG9WOE9i
amVjdChTVkdFbGVtZW50SW5zdGFuY2UqIGluc3RhbmNlKQoreworICAgIGlmICghaW5zdGFuY2Up
CisgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0
PiBleGlzdGluZ0luc3RhbmNlID0gZ2V0RE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwKCkuZ2V0KGlu
c3RhbmNlKTsKKyAgICBpZiAoIWV4aXN0aW5nSW5zdGFuY2UuSXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gZXhpc3RpbmdJbnN0YW5jZTsKKworICAgIGluc3RhbmNlLT5yZWYoKTsKKworICAgIC8v
IEluc3RhbnRpYXRlIHRoZSBWOCBvYmplY3QgYW5kIHJlbWVtYmVyIGl0CisgICAgdjg6OkhhbmRs
ZTx2ODo6T2JqZWN0PiByZXN1bHQgPSBpbnN0YW50aWF0ZVY4T2JqZWN0KFY4Q2xhc3NJbmRleDo6
U1ZHRUxFTUVOVElOU1RBTkNFLCBWOENsYXNzSW5kZXg6OlNWR0VMRU1FTlRJTlNUQU5DRSwgaW5z
dGFuY2UpOworICAgIGlmICghcmVzdWx0LklzRW1wdHkoKSkgeworICAgICAgICAvLyBPbmx5IHVw
ZGF0ZSB0aGUgRE9NIFNWRyBlbGVtZW50IG1hcCBpZiB0aGUgcmVzdWx0IGlzIG5vbi1lbXB0eS4K
KyAgICAgICAgZ2V0RE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwKCkuc2V0KGluc3RhbmNlLCB2ODo6
UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHJlc3VsdCkpOworICAgIH0KKyAgICByZXR1cm4g
cmVzdWx0OworfQorCisvLyBNYXAgb2YgU1ZHIG9iamVjdHMgd2l0aCBjb250ZXh0cyB0byB0aGVp
ciBjb250ZXh0cworc3RhdGljIEhhc2hNYXA8dm9pZCosIFNWR0VsZW1lbnQqPiYgc3ZnT2JqZWN0
VG9Db250ZXh0TWFwKCkKK3sKKyAgICB0eXBlZGVmIEhhc2hNYXA8dm9pZCosIFNWR0VsZW1lbnQq
PiBTdmdPYmplY3RUb0NvbnRleHRNYXA7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdmdPYmpl
Y3RUb0NvbnRleHRNYXAsIHN0YXRpY1N2Z09iamVjdFRvQ29udGV4dE1hcCwgKCkpOworICAgIHJl
dHVybiBzdGF0aWNTdmdPYmplY3RUb0NvbnRleHRNYXA7Cit9CisKK3Y4OjpIYW5kbGU8djg6OlZh
bHVlPiBWOFByb3h5Ojpjb252ZXJ0U1ZHT2JqZWN0V2l0aENvbnRleHRUb1Y4T2JqZWN0KFY4Q2xh
c3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBvYmplY3QpCit7CisgICAgaWYgKCFv
YmplY3QpCisgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisgICAgdjg6OlBlcnNpc3RlbnQ8
djg6Ok9iamVjdD4gcmVzdWx0ID0gZ2V0RE9NU1ZHT2JqZWN0V2l0aENvbnRleHRNYXAoKS5nZXQo
b2JqZWN0KTsKKyAgICBpZiAoIXJlc3VsdC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiByZXN1
bHQ7CisKKyAgICAvLyBTcGVjaWFsIGNhc2U6IFNWR1BhdGhTZWdzIG5lZWQgdG8gYmUgZG93bmNh
c3QgdG8gdGhlaXIgcmVhbCB0eXBlCisgICAgaWYgKHR5cGUgPT0gVjhDbGFzc0luZGV4OjpTVkdQ
QVRIU0VHKQorICAgICAgICB0eXBlID0gVjhDdXN0b206OkRvd25jYXN0U1ZHUGF0aFNlZyhvYmpl
Y3QpOworCisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4T2JqZWN0ID0gaW5zdGFudGlhdGVW
OE9iamVjdCh0eXBlLCB0eXBlLCBvYmplY3QpOworICAgIGlmICghdjhPYmplY3QuSXNFbXB0eSgp
KSB7CisgICAgICByZXN1bHQgPSB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHY4T2Jq
ZWN0KTsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworI2RlZmluZSBNQUtFX0NBU0UoVFlQRSwgTkFN
RSkgICAgIFwKKyAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpUWVBFOiBzdGF0aWNfY2FzdDxOQU1F
Kj4ob2JqZWN0KS0+cmVmKCk7IGJyZWFrOworICAgICAgU1ZHX09CSkVDVF9UWVBFUyhNQUtFX0NB
U0UpCisjdW5kZWYgTUFLRV9DQVNFCisjZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBOQU1FKSAgICAg
XAorICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OlRZUEU6ICAgIFwKKyAgICAgICAgICBzdGF0aWNf
Y2FzdDxWOFNWR1BPRFR5cGVXcmFwcGVyPE5BTUU+Kj4ob2JqZWN0KS0+cmVmKCk7IGJyZWFrOwor
ICAgICAgU1ZHX1BPRF9OQVRJVkVfVFlQRVMoTUFLRV9DQVNFKQorI3VuZGVmIE1BS0VfQ0FTRQor
ICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgIH0K
KyAgICAgIGdldERPTVNWR09iamVjdFdpdGhDb250ZXh0TWFwKCkuc2V0KG9iamVjdCwgcmVzdWx0
KTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgVjhQcm94eTo6c2V0U1ZHQ29u
dGV4dCh2b2lkKiBvYmplY3QsIFNWR0VsZW1lbnQqIGNvbnRleHQpCit7CisgICAgaWYgKCFvYmpl
Y3QpCisgICAgICAgIHJldHVybjsKKworICAgIFNWR0VsZW1lbnQqIG9sZENvbnRleHQgPSBzdmdP
YmplY3RUb0NvbnRleHRNYXAoKS5nZXQob2JqZWN0KTsKKworICAgIGlmIChvbGRDb250ZXh0ID09
IGNvbnRleHQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChvbGRDb250ZXh0KQorICAgICAg
ICBvbGRDb250ZXh0LT5kZXJlZigpOworCisgICAgaWYgKGNvbnRleHQpCisgICAgICAgIGNvbnRl
eHQtPnJlZigpOworCisgICAgc3ZnT2JqZWN0VG9Db250ZXh0TWFwKCkuc2V0KG9iamVjdCwgY29u
dGV4dCk7Cit9CisKK1NWR0VsZW1lbnQqIFY4UHJveHk6OnN2Z0NvbnRleHQodm9pZCogb2JqZWN0
KQoreworICAgIHJldHVybiBzdmdPYmplY3RUb0NvbnRleHRNYXAoKS5nZXQob2JqZWN0KTsKK30K
KworI2VuZGlmCisKKy8vIEEgbWFwIGZyb20gYSBET00gbm9kZSB0byBpdHMgSlMgd3JhcHBlciwg
dGhlIHdyYXBwZXIKKy8vIGlzIGtlcHQgYXMgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHN1cnZpdmUg
R0NzLgorc3RhdGljIERPTU9iamVjdE1hcCYgZ2NQcm90ZWN0ZWRNYXAoKSB7CisgICAgREVGSU5F
X1NUQVRJQ19MT0NBTChET01PYmplY3RNYXAsIHN0YXRpY0djUHJvdGVjdGVkTWFwLCAoKSk7Cisg
ICAgcmV0dXJuIHN0YXRpY0djUHJvdGVjdGVkTWFwOworfQorCit2b2lkIFY4UHJveHk6OmdjUHJv
dGVjdCh2b2lkKiBkb21PYmplY3QpCit7CisgICAgaWYgKCFkb21PYmplY3QpCisgICAgICAgIHJl
dHVybjsKKyAgICBpZiAoZ2NQcm90ZWN0ZWRNYXAoKS5jb250YWlucyhkb21PYmplY3QpKQorICAg
ICAgICByZXR1cm47CisgICAgaWYgKCFnZXRET01PYmplY3RNYXAoKS5jb250YWlucyhkb21PYmpl
Y3QpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgKHN0cm9uZykgcGVy
c2lzdGVudCBoYW5kbGUgZm9yIHRoZSBvYmplY3QuCisgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9i
amVjdD4gd3JhcHBlciA9IGdldERPTU9iamVjdE1hcCgpLmdldChkb21PYmplY3QpOworICAgIGlm
ICh3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZ2NQcm90ZWN0ZWRN
YXAoKS5zZXQoZG9tT2JqZWN0LCAqdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyh3cmFw
cGVyKSk7Cit9CisKK3ZvaWQgVjhQcm94eTo6Z2NVbnByb3RlY3Qodm9pZCogZG9tT2JqZWN0KQor
eworICAgIGlmICghZG9tT2JqZWN0KQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFnY1Byb3Rl
Y3RlZE1hcCgpLmNvbnRhaW5zKGRvbU9iamVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8v
IERpc3Bvc2UgdGhlIHN0cm9uZyByZWZlcmVuY2UuCisgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9i
amVjdD4gd3JhcHBlcihnY1Byb3RlY3RlZE1hcCgpLnRha2UoZG9tT2JqZWN0KSk7CisgICAgd3Jh
cHBlci5EaXNwb3NlKCk7Cit9CisKKy8vIENyZWF0ZSBvYmplY3QgZ3JvdXBzIGZvciBET00gdHJl
ZSBub2Rlcy4KK3N0YXRpYyB2b2lkIGdjUHJvbG9ndWUoKQoreworICAgIHY4OjpIYW5kbGVTY29w
ZSBzY29wZTsKKworI2lmbmRlZiBOREVCVUcKKyAgICBlbnVtZXJhdGVET01PYmplY3RNYXAoZ2V0
RE9NT2JqZWN0TWFwKCkuaW1wbCgpKTsKKyNlbmRpZgorCisgICAgLy8gUnVuIHRocm91Z2ggYWxs
IG9iamVjdHMgd2l0aCBwb3NzaWJsZSBwZW5kaW5nIGFjdGl2aXR5IG1ha2luZyB0aGVpcgorICAg
IC8vIHdyYXBwZXJzIG5vbiB3ZWFrIGlmIHRoZXJlIGlzIHBlbmRpbmcgYWN0aXZpdHkuCisgICAg
RE9NT2JqZWN0TWFwIGFjdGl2ZU1hcCA9IGdldEFjdGl2ZURPTU9iamVjdE1hcCgpLmltcGwoKTsK
KyAgICBmb3IgKERPTU9iamVjdE1hcDo6aXRlcmF0b3IgaXQgPSBhY3RpdmVNYXAuYmVnaW4oKSwg
ZW5kID0gYWN0aXZlTWFwLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgdm9pZCog
b2JqZWN0ID0gaXQtPmZpcnN0OworICAgICAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiB3
cmFwcGVyID0gdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4oaXQtPnNlY29uZCk7CisgICAgICAg
IEFTU0VSVCh3cmFwcGVyLklzV2VhaygpKTsKKyAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBw
ZXJUeXBlIHR5cGUgPSBWOFByb3h5Ojpkb21XcmFwcGVyVHlwZSh3cmFwcGVyKTsKKyAgICAgICAg
c3dpdGNoICh0eXBlKSB7CisjZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBOQU1FKSAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpUWVBFOiB7ICAgICAg
ICAgICAgICAgICAgICBcCisgICAgICAgICAgICBOQU1FKiBpbXBsID0gc3RhdGljX2Nhc3Q8TkFN
RSo+KG9iamVjdCk7ICBcCisgICAgICAgICAgICBpZiAoaW1wbC0+aGFzUGVuZGluZ0FjdGl2aXR5
KCkpICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd3JhcHBlci5DbGVhcldlYWsoKTsgICAg
ICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgICAgIH0KKyAgICAgICAgQUNUSVZFX0RPTV9PQkpFQ1RfVFlQ
RVMoTUFLRV9DQVNFKQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisjdW5kZWYgTUFLRV9DQVNFCisgICAgICAgIH0KKworICAgICAgICAvLyBBZGRp
dGlvbmFsIGhhbmRsaW5nIG9mIG1lc3NhZ2UgcG9ydCBlbnN1cmluZyB0aGF0IGVudGFuZ2xlZCBw
b3J0cyBhbHNvCisgICAgICAgIC8vIGhhdmUgdGhlaXIgd3JhcHBlcnMgZW50YW5nbGVkLiBUaGlz
IHNob3VsZCBpZGVhbGx5IGJlIGhhbmRsZWQgd2hlbiB0aGUKKyAgICAgICAgLy8gcG9ydHMgYXJl
IGFjdHVhbGx5IGVudGFuZ2xlZCBpbiBNZXNzYWdlUG9ydDo6ZW50YW5nbGUsIGJ1dCB0byBhdm9p
ZAorICAgICAgICAvLyBmb3JraW5nIE1lc3NhZ2VQb3J0LiogdGhpcyBpcyBwb3N0cG9uZWQgdG8g
R0MgdGltZS4gSGF2aW5nIHRoaXMgcG9zdHBvbmVkCisgICAgICAgIC8vIGhhcyB0aGUgZHJhd2Jh
Y2sgdGhhdCB0aGUgd3JhcHBlcnMgYXJlICJlbnRhbmdsZWQvdW5lbnRhbmdsZWQiIGZvciBlYWNo
CisgICAgICAgIC8vIEdDIGV2ZW4gdGhvdWdoIHRoZWlyIGVudGFnbGVtZW50IG1vc3QgbGlrZWx5
IGlzIHN0aWxsIHRoZSBzYW1lLgorICAgICAgICBpZiAodHlwZSA9PSBWOENsYXNzSW5kZXg6Ok1F
U1NBR0VQT1JUKSB7CisgICAgICAgICAgICAvLyBHZXQgdGhlIHBvcnQgYW5kIGl0cyBlbnRhbmds
ZWQgcG9ydC4KKyAgICAgICAgICAgIE1lc3NhZ2VQb3J0KiBwb3J0MSA9IHN0YXRpY19jYXN0PE1l
c3NhZ2VQb3J0Kj4ob2JqZWN0KTsKKyAgICAgICAgICAgIE1lc3NhZ2VQb3J0KiBwb3J0MiA9IHBv
cnQxLT5sb2NhbGx5RW50YW5nbGVkUG9ydCgpOw0KKw0KKyAgICAgICAgICAgIC8vIElmIHdlIGFy
ZSByZW1vdGVseSBlbnRhbmdsZWQsIHRoZW4gbWFyayB0aGlzIG9iamVjdCBhcyByZWFjaGFibGUN
CisgICAgICAgICAgICAvLyAod2UgY2FuJ3QgZGV0ZXJtaW5lIHJlYWNoYWJpbGl0eSBkaXJlY3Rs
eSBhcyB0aGUgcmVtb3RlIG9iamVjdCBpcw0KKyAgICAgICAgICAgIC8vIG91dC1vZi1wcm9jKS4N
CisgICAgICAgICAgICBpZiAocG9ydDEtPmlzRW50YW5nbGVkKCkgJiYgIXBvcnQyKQ0KKyAgICAg
ICAgICAgICAgICB3cmFwcGVyLkNsZWFyV2VhaygpOworCisgICAgICAgICAgICBpZiAoIXBvcnQy
KSB7CisgICAgICAgICAgICAgICAgLy8gQXMgcG9ydHMgYXJlIGFsd2F5cyBlbnRhbmdsZWQgaW4g
cGFpcnMgb25seSBwZXJmb3JtIHRoZSBlbnRhbmdsZW1lbnQKKyAgICAgICAgICAgICAgICAvLyBv
bmNlIGZvciBlYWNoIHBhaXIgKHNlZSBBU1NFUlQgaW4gTWVzc2FnZVBvcnQ6OnVuZW50YW5nbGUo
KSkuCisgICAgICAgICAgICAgICAgaWYgKHBvcnQxIDwgcG9ydDIpIHsKKyAgICAgICAgICAgICAg
ICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHBvcnQxV3JhcHBlciA9IFY4UHJveHk6OmNvbnZl
cnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIHBvcnQxKTsKKyAgICAgICAg
ICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHBvcnQyV3JhcHBlciA9IFY4UHJveHk6
OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIHBvcnQyKTsKKyAg
ICAgICAgICAgICAgICAgICAgQVNTRVJUKHBvcnQxV3JhcHBlci0+SXNPYmplY3QoKSk7CisgICAg
ICAgICAgICAgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QocG9ydDFXcmFwcGVy
KS0+U2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a01lc3NhZ2VQb3J0RW50YW5nbGVkUG9ydElu
ZGV4LCBwb3J0MldyYXBwZXIpOworICAgICAgICAgICAgICAgICAgICBBU1NFUlQocG9ydDJXcmFw
cGVyLT5Jc09iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0Pjo6Q2FzdChwb3J0MldyYXBwZXIpLT5TZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprTWVz
c2FnZVBvcnRFbnRhbmdsZWRQb3J0SW5kZXgsIHBvcnQxV3JhcHBlcik7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhl
IHdyYXBwZXIgZW50YW5nbGVtZW50IHdoZW4gYSBwb3J0IGlzIG5vdCBlbnRhbmdsZWQuCisgICAg
ICAgICAgICAgICAgaWYgKFY4UHJveHk6OmRvbU9iamVjdEhhc0pTV3JhcHBlcihwb3J0MSkpIHsK
KyAgICAgICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdyYXBwZXIgPSBWOFBy
b3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JULCBwb3J0MSk7
CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVCh3cmFwcGVyLT5Jc09iamVjdCgpKTsKKyAgICAg
ICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh3cmFwcGVyKS0+U2V0
SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a01lc3NhZ2VQb3J0RW50YW5nbGVkUG9ydEluZGV4LCB2
ODo6VW5kZWZpbmVkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0KKworICAgIC8vIENyZWF0ZSBvYmplY3QgZ3JvdXBzLgorICAgIHR5cGVkZWYg
c3RkOjpwYWlyPHVpbnRwdHJfdCwgTm9kZSo+IEdyb3VwZXJQYWlyOworICAgIHR5cGVkZWYgVmVj
dG9yPEdyb3VwZXJQYWlyPiBHcm91cGVyTGlzdDsKKworICAgIERPTU5vZGVNYXAgbm9kZU1hcCA9
IGdldERPTU5vZGVNYXAoKS5pbXBsKCk7CisgICAgR3JvdXBlckxpc3QgZ3JvdXBlcjsKKyAgICBn
cm91cGVyLnJlc2VydmVDYXBhY2l0eShub2RlTWFwLnNpemUoKSk7CisKKyAgICBmb3IgKERPTU5v
ZGVNYXA6Oml0ZXJhdG9yIGl0ID0gbm9kZU1hcC5iZWdpbigpLCBlbmQgPSBub2RlTWFwLmVuZCgp
OyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgTm9kZSogbm9kZSA9IGl0LT5maXJzdDsKKwor
ICAgICAgICAvLyBJZiB0aGUgbm9kZSBpcyBpbiBkb2N1bWVudCwgcHV0IGl0IGluIHRoZSBvd25l
ckRvY3VtZW50J3Mgb2JqZWN0IGdyb3VwLgorICAgICAgICAvLworICAgICAgICAvLyBJZiBhbiBp
bWFnZSBlbGVtZW50IHdhcyBjcmVhdGVkIGJ5IEphdmFTY3JpcHQgIm5ldyBJbWFnZSIsCisgICAg
ICAgIC8vIGl0IGlzIG5vdCBpbiBhIGRvY3VtZW50LiBIb3dldmVyLCBpZiB0aGUgbG9hZCBldmVu
dCBoYXMgbm90CisgICAgICAgIC8vIGJlZW4gZmlyZWQgKHN0aWxsIG9ubG9hZGluZyksIGl0IGlz
IHRyZWF0ZWQgYXMgaW4gdGhlIGRvY3VtZW50LgorICAgICAgICAvLworICAgICAgICAvLyBPdGhl
cndpc2UsIHRoZSBub2RlIGlzIHB1dCBpbiBhbiBvYmplY3QgZ3JvdXAgaWRlbnRpZmllZCBieSB0
aGUgcm9vdAorICAgICAgICAvLyBlbG1lbnQgb2YgdGhlIHRyZWUgdG8gd2hpY2ggaXQgYmVsb25n
cy4KKyAgICAgICAgdWludHB0cl90IGdyb3VwSWQ7CisgICAgICAgIGlmIChub2RlLT5pbkRvY3Vt
ZW50KCkgfHwgKG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjppbWdUYWcpICYmICFzdGF0aWNf
Y2FzdDxIVE1MSW1hZ2VFbGVtZW50Kj4obm9kZSktPmhhdmVGaXJlZExvYWRFdmVudCgpKSkgewor
ICAgICAgICAgICAgZ3JvdXBJZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihub2RlLT5k
b2N1bWVudCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE5vZGUqIHJvb3QgPSBu
b2RlOworICAgICAgICAgICAgd2hpbGUgKHJvb3QtPnBhcmVudCgpKQorICAgICAgICAgICAgICAg
IHJvb3QgPSByb290LT5wYXJlbnQoKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMg
YWxvbmUgaW4gaXRzIERPTSB0cmVlIChkb2Vzbid0IGhhdmUgYSBwYXJlbnQgb3IgYW55CisgICAg
ICAgICAgICAvLyBjaGlsZHJlbikgdGhlbiB0aGUgZ3JvdXAgd2lsbCBiZSBmaWx0ZXJlZCBvdXQg
bGF0ZXIgYW55d2F5LgorICAgICAgICAgICAgaWYgKHJvb3QgPT0gbm9kZSAmJiAhbm9kZS0+aGFz
Q2hpbGROb2RlcygpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBn
cm91cElkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHJvb3QpOworICAgICAgICB9Cisg
ICAgICAgIGdyb3VwZXIuYXBwZW5kKEdyb3VwZXJQYWlyKGdyb3VwSWQsIG5vZGUpKTsKKyAgICB9
CisKKyAgICAvLyBHcm91cCBieSBzb3J0aW5nIGJ5IHRoZSBncm91cCBpZC4gIFRoaXMgd2lsbCB1
c2UgdGhlIHN0ZDo6cGFpciBvcGVyYXRvcjwsCisgICAgLy8gd2hpY2ggd2lsbCByZWFsbHkgc29y
dCBieSBib3RoIHRoZSBncm91cCBpZCBhbmQgdGhlIE5vZGUqLiAgSG93ZXZlciB0aGUKKyAgICAv
LyBOb2RlKiBpcyBvbmx5IGludm9sdmVkIHRvIHNvcnQgd2l0aGluIGEgZ3JvdXAgaWQsIHNvIGl0
IHdpbGwgYmUgZmluZS4KKyAgICBzdGQ6OnNvcnQoZ3JvdXBlci5iZWdpbigpLCBncm91cGVyLmVu
ZCgpKTsKKworICAgIC8vIEZJWE1FOiBTaG91bGQgcHJvYmFibHkgd29yayBpbiBpdGVyYXRvcnMg
aGVyZSwgYnV0IGluZGV4ZXMgd2VyZQorICAgIC8vIGVhc2llciBmb3IgbXkgc2ltcGxlIG1pbmQu
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBncm91cGVyLnNpemUoKTsgKSB7CisgICAgICAg
IC8vIFNlZWsgdG8gdGhlIG5leHQga2V5IChvciB0aGUgZW5kIG9mIHRoZSBsaXN0KS4KKyAgICAg
ICAgc2l6ZV90IG5leHRLZXlJbmRleCA9IGdyb3VwZXIuc2l6ZSgpOworICAgICAgICBmb3IgKHNp
emVfdCBqID0gaTsgaiA8IGdyb3VwZXIuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIGlmIChn
cm91cGVyW2ldLmZpcnN0ICE9IGdyb3VwZXJbal0uZmlyc3QpIHsKKyAgICAgICAgICAgICAgbmV4
dEtleUluZGV4ID0gajsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKworICAgICAgICBBU1NFUlQobmV4dEtleUluZGV4ID4gaSk7CisKKyAgICAgICAgLy8g
V2Ugb25seSBjYXJlIGFib3V0IGEgZ3JvdXAgaWYgaXQgaGFzIG1vcmUgdGhhbiBvbmUgb2JqZWN0
LiAgSWYgaXQgb25seQorICAgICAgICAvLyBoYXMgb25lIG9iamVjdCwgaXQgaGFzIG5vdGhpbmcg
ZWxzZSB0aGF0IG5lZWRzIHRvIGJlIGtlcHQgYWxpdmUuCisgICAgICAgIGlmIChuZXh0S2V5SW5k
ZXggLSBpIDw9IDEpIHsKKyAgICAgICAgICAgIGkgPSBuZXh0S2V5SW5kZXg7CisgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIFZlY3Rvcjx2ODo6UGVyc2lzdGVudDx2
ODo6VmFsdWU+ID4gZ3JvdXA7CisgICAgICAgIGdyb3VwLnJlc2VydmVDYXBhY2l0eShuZXh0S2V5
SW5kZXggLSBpKTsKKyAgICAgICAgZm9yICg7IGkgPCBuZXh0S2V5SW5kZXg7ICsraSkgeworICAg
ICAgICAgICAgTm9kZSogbm9kZSA9IGdyb3VwZXJbaV0uc2Vjb25kOworICAgICAgICAgICAgdjg6
OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB3cmFwcGVyID0gZ2V0RE9NTm9kZU1hcCgpLmdldChub2Rl
KTsKKyAgICAgICAgICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpCisgICAgICAgICAgICAgICAg
Z3JvdXAuYXBwZW5kKHdyYXBwZXIpOworICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgc3R5
bGVkIGFuZCB0aGVyZSBpcyBhIHdyYXBwZXIgZm9yIHRoZSBpbmxpbmUKKyAgICAgICAgICAgIC8v
IHN0eWxlIGRlY2xhcmF0aW9uLCB3ZSBuZWVkIHRvIGtlZXAgdGhhdCBzdHlsZSBkZWNsYXJhdGlv
bgorICAgICAgICAgICAgLy8gd3JhcHBlciBhbGl2ZSBhcyB3ZWxsLCBzbyB3ZSBhZGQgaXQgdG8g
dGhlIG9iamVjdCBncm91cC4KKyAgICAgICAgICAgIGlmIChub2RlLT5pc1N0eWxlZEVsZW1lbnQo
KSkgeworICAgICAgICAgICAgICAgIFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQgPSByZWludGVycHJl
dF9jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKTsKKyAgICAgICAgICAgICAgICBDU1NTdHlsZURl
Y2xhcmF0aW9uKiBzdHlsZSA9IGVsZW1lbnQtPmlubGluZVN0eWxlRGVjbCgpOworICAgICAgICAg
ICAgICAgIGlmICghc3R5bGUpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JhcHBlciA9IGdldERP
TU9iamVjdE1hcCgpLmdldChzdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghd3JhcHBl
ci5Jc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cC5hcHBlbmQod3JhcHBl
cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgaWYgKGdyb3VwLnNpemUoKSA+IDEpCisgICAgICAgICAgICB2ODo6Vjg6OkFkZE9iamVjdEdy
b3VwKCZncm91cFswXSwgZ3JvdXAuc2l6ZSgpKTsKKworICAgICAgICBBU1NFUlQoaSA9PSBuZXh0
S2V5SW5kZXgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2NFcGlsb2d1ZSgpCit7CisgICAg
djg6OkhhbmRsZVNjb3BlIHNjb3BlOworCisgICAgLy8gUnVuIHRocm91Z2ggYWxsIG9iamVjdHMg
d2l0aCBwZW5kaW5nIGFjdGl2aXR5IG1ha2luZyB0aGVpciB3cmFwcGVycyB3ZWFrIGFnYWluLgor
ICAgIERPTU9iamVjdE1hcCBhY3RpdmVNYXAgPSBnZXRBY3RpdmVET01PYmplY3RNYXAoKS5pbXBs
KCk7CisgICAgZm9yIChET01PYmplY3RNYXA6Oml0ZXJhdG9yIGl0ID0gYWN0aXZlTWFwLmJlZ2lu
KCksIGVuZCA9IGFjdGl2ZU1hcC5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIHZv
aWQqIG9iaiA9IGl0LT5maXJzdDsKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4g
d3JhcHBlciA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+KGl0LT5zZWNvbmQpOworICAgICAg
ICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IFY4UHJveHk6OmRvbVdyYXBwZXJU
eXBlKHdyYXBwZXIpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyNkZWZpbmUgTUFLRV9DQVNF
KFRZUEUsIE5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpUWVBFOiB7ICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXAorICAgICAgICAgICAgTkFNRSogaW1wbCA9IHN0YXRpY19jYXN0PE5BTUUq
PihvYmopOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChpbXBsLT5oYXNQ
ZW5kaW5nQWN0aXZpdHkoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAg
ICAgICAgQVNTRVJUKCF3cmFwcGVyLklzV2VhaygpKTsgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICAgICAgICAgICAgICAgIHdyYXBwZXIuTWFrZVdlYWsoaW1wbCwgJndlYWtBY3RpdmVE
T01PYmplY3RDYWxsYmFjayk7IFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAg
ICAgICB9CisgICAgICAgIEFDVElWRV9ET01fT0JKRUNUX1RZUEVTKE1BS0VfQ0FTRSkKKyAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworI3VuZGVmIE1B
S0VfQ0FTRQorICAgICAgICB9CisgICAgfQorCisjaWZuZGVmIE5ERUJVRworICAgIC8vIENoZWNr
IGFsbCBzdXJ2aXZhbHMgYXJlIHdlYWsuCisgICAgZW51bWVyYXRlRE9NT2JqZWN0TWFwKGdldERP
TU9iamVjdE1hcCgpLmltcGwoKSk7CisgICAgZW51bWVyYXRlRE9NTm9kZU1hcChnZXRET01Ob2Rl
TWFwKCkuaW1wbCgpKTsKKyAgICBlbnVtZXJhdGVET01PYmplY3RNYXAoZ2NQcm90ZWN0ZWRNYXAo
KSk7CisgICAgZW51bWVyYXRlR2xvYmFsSGFuZGxlcygpOworI2VuZGlmCit9CisKK3R5cGVkZWYg
SGFzaE1hcDxpbnQsIHY4OjpGdW5jdGlvblRlbXBsYXRlKj4gRnVuY3Rpb25UZW1wbGF0ZU1hcDsK
KworYm9vbCBBbGxvd0FsbG9jYXRpb246Om1fY3VycmVudCA9IGZhbHNlOworCisvLyBKYXZhU2Ny
aXB0Q29uc29sZU1lc3NhZ2VzIGVuY2Fwc3VsYXRlIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvCisvLyBs
b2cgbWVzc2FnZXMgb3JpZ2luYXRpbmcgZnJvbSBKYXZhU2NyaXB0IHRvIHRoZSBDaHJvbWUgY29u
c29sZS4KK2NsYXNzIEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZSB7CitwdWJsaWM6CisgICAgSmF2
YVNjcmlwdENvbnNvbGVNZXNzYWdlKGNvbnN0IFN0cmluZyYgc3RyaW5nLCBjb25zdCBTdHJpbmcm
IHNvdXJjZUlELCB1bnNpZ25lZCBsaW5lTnVtYmVyKQorICAgICAgICA6IG1fc3RyaW5nKHN0cmlu
ZykKKyAgICAgICAgLCBtX3NvdXJjZUlEKHNvdXJjZUlEKQorICAgICAgICAsIG1fbGluZU51bWJl
cihsaW5lTnVtYmVyKSB7IH0KKworICAgIHZvaWQgYWRkVG9QYWdlKFBhZ2UqKSBjb25zdDsKKwor
cHJpdmF0ZToKKyAgICBjb25zdCBTdHJpbmcgbV9zdHJpbmc7CisgICAgY29uc3QgU3RyaW5nIG1f
c291cmNlSUQ7CisgICAgY29uc3QgdW5zaWduZWQgbV9saW5lTnVtYmVyOworfTsKKwordm9pZCBK
YXZhU2NyaXB0Q29uc29sZU1lc3NhZ2U6OmFkZFRvUGFnZShQYWdlKiBwYWdlKSBjb25zdAorewor
ICAgIEFTU0VSVChwYWdlKTsKKyAgICBDb25zb2xlKiBjb25zb2xlID0gcGFnZS0+bWFpbkZyYW1l
KCktPmRvbVdpbmRvdygpLT5jb25zb2xlKCk7CisgICAgY29uc29sZS0+YWRkTWVzc2FnZShKU01l
c3NhZ2VTb3VyY2UsIEVycm9yTWVzc2FnZUxldmVsLCBtX3N0cmluZywgbV9saW5lTnVtYmVyLCBt
X3NvdXJjZUlEKTsKK30KKworLy8gVGhlIENvbnNvbGVNZXNzYWdlTWFuYWdlciBoYW5kbGVzIGFs
bCBjb25zb2xlIG1lc3NhZ2VzIHRoYXQgc3RlbQorLy8gZnJvbSBKYXZhU2NyaXB0LiBJdCBrZWVw
cyBhIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCBoYXZlIGJlZW4gZGVsYXllZCBidXQKKy8vIGl0IG1h
a2VzIHN1cmUgdG8gYWRkIGFsbCBtZXNzYWdlcyB0byB0aGUgY29uc29sZSBpbiB0aGUgcmlnaHQg
b3JkZXIuCitjbGFzcyBDb25zb2xlTWVzc2FnZU1hbmFnZXIgeworcHVibGljOgorICAgIC8vIEFk
ZCBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUuIE1heSBlbmQgdXAgY2FsbGluZyBKYXZhU2NyaXB0
IGNvZGUKKyAgICAvLyBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIGluc3BlY3RvciBzbyBvbmx5IGNh
bGwgdGhpcyBmdW5jdGlvbiB3aGVuCisgICAgLy8gaXQgaXMgc2FmZSB0byBkbyBhbGxvY2F0aW9u
cy4KKyAgICBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKFBhZ2UqLCBjb25zdCBKYXZhU2NyaXB0Q29u
c29sZU1lc3NhZ2UmKTsKKworICAgIC8vIEFkZCBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUgYnV0
IGRlbGF5IHRoZSByZXBvcnRpbmcgdW50aWwgaXQKKyAgICAvLyBpcyBzYWZlIHRvIGRvIHNvOiBF
aXRoZXIgd2hlbiB3ZSBsZWF2ZSBKYXZhU2NyaXB0IGV4ZWN1dGlvbiBvcgorICAgIC8vIHdoZW4g
YWRkaW5nIG90aGVyIGNvbnNvbGUgbWVzc2FnZXMuIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhp
cworICAgIC8vIG1ldGhvZCBpcyB0byBhdm9pZCBjYWxsaW5nIGludG8gVjggdG8gaGFuZGxlIGNv
bnNvbGUgbWVzc2FnZXMKKyAgICAvLyB3aGVuIHRoZSBWTSBpcyBpbiBhIHN0YXRlIHRoYXQgZG9l
cyBub3Qgc3VwcG9ydCBHQ3Mgb3IgYWxsb2NhdGlvbnMuCisgICAgLy8gRGVsYXllZCBtZXNzYWdl
cyBhcmUgYWx3YXlzIHJlcG9ydGVkIGluIHRoZSBwYWdlIGNvcnJlc3BvbmRpbmcKKyAgICAvLyB0
byB0aGUgYWN0aXZlIGNvbnRleHQuCisgICAgc3RhdGljIHZvaWQgYWRkRGVsYXllZE1lc3NhZ2Uo
Y29uc3QgSmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlJik7CisKKyAgICAvLyBQcm9jZXNzIGFueSBk
ZWxheWVkIG1lc3NhZ2VzLiBNYXkgZW5kIHVwIGNhbGxpbmcgSmF2YVNjcmlwdCBjb2RlCisgICAg
Ly8gaW5kaXJlY3RseSB0aHJvdWdoIHRoZSBpbnNwZWN0b3Igc28gb25seSBjYWxsIHRoaXMgZnVu
Y3Rpb24gd2hlbgorICAgIC8vIGl0IGlzIHNhZmUgdG8gZG8gYWxsb2NhdGlvbnMuCisgICAgc3Rh
dGljIHZvaWQgcHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpOworCitwcml2YXRlOgorICAgIC8vIEFs
bCBkZWxheWVkIG1lc3NhZ2VzIGFyZSBzdG9yZWQgaW4gdGhpcyB2ZWN0b3IuIElmIHRoZSB2ZWN0
b3IKKyAgICAvLyBpcyBOVUxMLCB0aGVyZSBhcmUgbm8gZGVsYXllZCBtZXNzYWdlcy4KKyAgICBz
dGF0aWMgVmVjdG9yPEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZT4qIG1fZGVsYXllZDsKK307CisK
K1ZlY3RvcjxKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2U+KiBDb25zb2xlTWVzc2FnZU1hbmFnZXI6
Om1fZGVsYXllZCA9IDA7CisKK3ZvaWQgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjphZGRNZXNzYWdl
KFBhZ2UqIHBhZ2UsIGNvbnN0IEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZSYgbWVzc2FnZSkKK3sK
KyAgICAvLyBQcm9jZXNzIGFueSBkZWxheWVkIG1lc3NhZ2VzIHRvIG1ha2Ugc3VyZSB0aGF0IG1l
c3NhZ2VzCisgICAgLy8gYXBwZWFyIGluIHRoZSByaWdodCBvcmRlciBpbiB0aGUgY29uc29sZS4K
KyAgICBwcm9jZXNzRGVsYXllZE1lc3NhZ2VzKCk7CisgICAgbWVzc2FnZS5hZGRUb1BhZ2UocGFn
ZSk7Cit9CisKK3ZvaWQgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjphZGREZWxheWVkTWVzc2FnZShj
b25zdCBKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UmIG1lc3NhZ2UpCit7CisgICAgaWYgKCFtX2Rl
bGF5ZWQpIHsKKyAgICAgICAgLy8gQWxsb2NhdGUgYSB2ZWN0b3IgZm9yIHRoZSBkZWxheWVkIG1l
c3NhZ2VzLiBXaWxsIGJlCisgICAgICAgIC8vIGRlYWxsb2NhdGVkIHdoZW4gdGhlIGRlbGF5ZWQg
bWVzc2FnZXMgYXJlIHByb2Nlc3NlZAorICAgICAgICAvLyBpbiBwcm9jZXNzRGVsYXllZE1lc3Nh
Z2VzKCkuCisgICAgICAgIG1fZGVsYXllZCA9IG5ldyBWZWN0b3I8SmF2YVNjcmlwdENvbnNvbGVN
ZXNzYWdlPigpOworICAgIH0KKyAgICBtX2RlbGF5ZWQtPmFwcGVuZChtZXNzYWdlKTsKK30KKwor
dm9pZCBDb25zb2xlTWVzc2FnZU1hbmFnZXI6OnByb2Nlc3NEZWxheWVkTWVzc2FnZXMoKQorewor
ICAgIC8vIElmIHdlIGhhdmUgYSBkZWxheWVkIHZlY3RvciBpdCBjYW5ub3QgYmUgZW1wdHkuCisg
ICAgaWYgKCFtX2RlbGF5ZWQpCisgICAgICAgIHJldHVybjsKKyAgICBBU1NFUlQoIW1fZGVsYXll
ZC0+aXNFbXB0eSgpKTsKKworICAgIC8vIEFkZCB0aGUgZGVsYXllZCBtZXNzYWdlcyB0byB0aGUg
cGFnZSBvZiB0aGUgYWN0aXZlCisgICAgLy8gY29udGV4dC4gSWYgdGhhdCBmb3Igc29tZSBiaXph
cnJlIHJlYXNvbiBkb2VzIG5vdAorICAgIC8vIGV4aXN0LCB3ZSBjbGVhciB0aGUgbGlzdCBvZiBk
ZWxheWVkIG1lc3NhZ2VzIHRvIGF2b2lkCisgICAgLy8gcG9zdGluZyBtZXNzYWdlcy4gV2Ugc3Rp
bGwgZGVhbGxvY2F0ZSB0aGUgdmVjdG9yLgorICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6OnJl
dHJpZXZlRnJhbWVGb3JFbnRlcmVkQ29udGV4dCgpOworICAgIFBhZ2UqIHBhZ2UgPSAwOworICAg
IGlmIChmcmFtZSkKKyAgICAgICAgcGFnZSA9IGZyYW1lLT5wYWdlKCk7CisgICAgaWYgKCFwYWdl
KQorICAgICAgICBtX2RlbGF5ZWQtPmNsZWFyKCk7CisKKyAgICAvLyBJdGVyYXRlIHRocm91Z2gg
YWxsIHRoZSBkZWxheWVkIG1lc3NhZ2VzIGFuZCBhZGQgdGhlbQorICAgIC8vIHRvIHRoZSBjb25z
b2xlLgorICAgIGNvbnN0IGludCBzaXplID0gbV9kZWxheWVkLT5zaXplKCk7CisgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgbV9kZWxheWVkLT5hdChpKS5hZGRU
b1BhZ2UocGFnZSk7CisgICAgfQorCisgICAgLy8gRGVhbGxvY2F0ZSB0aGUgZGVsYXllZCB2ZWN0
b3IuCisgICAgZGVsZXRlIG1fZGVsYXllZDsKKyAgICBtX2RlbGF5ZWQgPSAwOworfQorCisvLyBD
b252ZW5pZW5jZSBjbGFzcyBmb3IgZW5zdXJpbmcgdGhhdCBkZWxheWVkIG1lc3NhZ2VzIGluIHRo
ZQorLy8gQ29uc29sZU1lc3NhZ2VNYW5hZ2VyIGFyZSBwcm9jZXNzZWQgcXVpY2tseS4KK2NsYXNz
IENvbnNvbGVNZXNzYWdlU2NvcGUgeworcHVibGljOgorICAgIENvbnNvbGVNZXNzYWdlU2NvcGUo
KSB7IENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6cHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpOyB9Cisg
ICAgfkNvbnNvbGVNZXNzYWdlU2NvcGUoKSB7IENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6cHJvY2Vz
c0RlbGF5ZWRNZXNzYWdlcygpOyB9Cit9OworCit2b2lkIGxvZ0luZm8oRnJhbWUqIGZyYW1lLCBj
b25zdCBTdHJpbmcmIG1lc3NhZ2UsIGNvbnN0IFN0cmluZyYgdXJsKQ0KK3sNCisgICAgUGFnZSog
cGFnZSA9IGZyYW1lLT5wYWdlKCk7DQorICAgIGlmICghcGFnZSkNCisgICAgICAgIHJldHVybjsN
CisgICAgSmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlIGNvbnNvbGVNZXNzYWdlKG1lc3NhZ2UsIHVy
bCwgMCk7DQorICAgIENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6YWRkTWVzc2FnZShwYWdlLCBjb25z
b2xlTWVzc2FnZSk7DQorfQorCitzdGF0aWMgdm9pZCBoYW5kbGVDb25zb2xlTWVzc2FnZSh2ODo6
SGFuZGxlPHY4OjpNZXNzYWdlPiBtZXNzYWdlLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZGF0YSkK
K3sKKyAgICAvLyBVc2UgdGhlIGZyYW1lIHdoZXJlIEphdmFTY3JpcHQgaXMgY2FsbGVkIGZyb20u
CisgICAgRnJhbWUqIGZyYW1lID0gVjhQcm94eTo6cmV0cmlldmVGcmFtZUZvckVudGVyZWRDb250
ZXh0KCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUGFnZSogcGFn
ZSA9IGZyYW1lLT5wYWdlKCk7CisgICAgaWYgKCFwYWdlKQorICAgICAgICByZXR1cm47CisKKyAg
ICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IGVycm9yTWVzc2FnZVN0cmluZyA9IG1lc3NhZ2UtPkdl
dCgpOworICAgIEFTU0VSVCghZXJyb3JNZXNzYWdlU3RyaW5nLklzRW1wdHkoKSk7CisgICAgU3Ry
aW5nIGVycm9yTWVzc2FnZSA9IFRvV2ViQ29yZVN0cmluZyhlcnJvck1lc3NhZ2VTdHJpbmcpOwor
CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJlc291cmNlTmFtZSA9IG1lc3NhZ2UtPkdldFNj
cmlwdFJlc291cmNlTmFtZSgpOworICAgIGJvb2wgdXNlVVJMID0gKHJlc291cmNlTmFtZS5Jc0Vt
cHR5KCkgfHwgIXJlc291cmNlTmFtZS0+SXNTdHJpbmcoKSk7CisgICAgU3RyaW5nIHJlc291cmNl
TmFtZVN0cmluZyA9ICh1c2VVUkwpID8gZnJhbWUtPmRvY3VtZW50KCktPnVybCgpIDogVG9XZWJD
b3JlU3RyaW5nKHJlc291cmNlTmFtZSk7CisgICAgSmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlIGNv
bnNvbGVNZXNzYWdlKGVycm9yTWVzc2FnZSwgcmVzb3VyY2VOYW1lU3RyaW5nLCBtZXNzYWdlLT5H
ZXRMaW5lTnVtYmVyKCkpOworICAgIENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6YWRkTWVzc2FnZShw
YWdlLCBjb25zb2xlTWVzc2FnZSk7Cit9CisKK2VudW0gRGVsYXlSZXBvcnRpbmcgeworICAgIFJF
UE9SVF9MQVRFUiwKKyAgICBSRVBPUlRfTk9XCit9OworCitzdGF0aWMgdm9pZCByZXBvcnRVbnNh
ZmVBY2Nlc3NUbyhGcmFtZSogdGFyZ2V0LCBEZWxheVJlcG9ydGluZyBkZWxheSkKK3sKKyAgICBB
U1NFUlQodGFyZ2V0KTsKKyAgICBEb2N1bWVudCogdGFyZ2V0RG9jdW1lbnQgPSB0YXJnZXQtPmRv
Y3VtZW50KCk7CisgICAgaWYgKCF0YXJnZXREb2N1bWVudCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgRnJhbWUqIHNvdXJjZSA9IFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JFbnRlcmVkQ29udGV4
dCgpOworICAgIGlmICghc291cmNlIHx8ICFzb3VyY2UtPmRvY3VtZW50KCkpCisgICAgICAgIHJl
dHVybjsgIC8vIElnbm9yZSBlcnJvciBpZiB0aGUgc291cmNlIGRvY3VtZW50IGlzIGdvbmUuCisK
KyAgICBEb2N1bWVudCogc291cmNlRG9jdW1lbnQgPSBzb3VyY2UtPmRvY3VtZW50KCk7CisKKyAg
ICAvLyBGSVhNRTogVGhpcyBlcnJvciBtZXNzYWdlIHNob3VsZCBjb250YWluIG1vcmUgc3BlY2lm
aWNzIG9mIHdoeSB0aGUgc2FtZQorICAgIC8vIG9yaWdpbiBjaGVjayBoYXMgZmFpbGVkLgorICAg
IFN0cmluZyBzdHIgPSBTdHJpbmc6OmZvcm1hdCgiVW5zYWZlIEphdmFTY3JpcHQgYXR0ZW1wdCB0
byBhY2Nlc3MgZnJhbWUgIgorICAgICAgICAid2l0aCBVUkwgJXMgZnJvbSBmcmFtZSB3aXRoIFVS
TCAlcy4gIgorICAgICAgICAiRG9tYWlucywgcHJvdG9jb2xzIGFuZCBwb3J0cyBtdXN0IG1hdGNo
LlxuIiwKKyAgICAgICAgdGFyZ2V0RG9jdW1lbnQtPnVybCgpLnN0cmluZygpLnV0ZjgoKS5kYXRh
KCksCisgICAgICAgIHNvdXJjZURvY3VtZW50LT51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgp
KTsKKworICAgIC8vIEJ1aWxkIGEgY29uc29sZSBtZXNzYWdlIHdpdGggZmFrZSBzb3VyY2UgSUQg
YW5kIGxpbmUgbnVtYmVyLgorICAgIGNvbnN0IFN0cmluZyBrU291cmNlSUQgPSAiIjsKKyAgICBj
b25zdCBpbnQga0xpbmVOdW1iZXIgPSAxOworICAgIEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZSBt
ZXNzYWdlKHN0ciwga1NvdXJjZUlELCBrTGluZU51bWJlcik7CisKKyAgICBpZiAoZGVsYXkgPT0g
UkVQT1JUX05PVykgeworICAgICAgICAvLyBOT1RFKHRjKTogQXBwbGUgcHJpbnRzIHRoZSBtZXNz
YWdlIGluIHRoZSB0YXJnZXQgcGFnZSwgYnV0IGl0IHNlZW1zIGxpa2UKKyAgICAgICAgLy8gaXQg
c2hvdWxkIGJlIGluIHRoZSBzb3VyY2UgcGFnZS4gRXZlbiBmb3IgZGVsYXllZCBtZXNzYWdlcywg
d2UgcHV0IGl0IGluCisgICAgICAgIC8vIHRoZSBzb3VyY2UgcGFnZTsgc2VlIENvbnNvbGVNZXNz
YWdlTWFuYWdlcjo6cHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpLgorICAgICAgICBDb25zb2xlTWVz
c2FnZU1hbmFnZXI6OmFkZE1lc3NhZ2Uoc291cmNlLT5wYWdlKCksIG1lc3NhZ2UpOworCisgICAg
fSBlbHNlIHsKKyAgICAgICAgQVNTRVJUKGRlbGF5ID09IFJFUE9SVF9MQVRFUik7CisgICAgICAg
IC8vIFdlIGNhbm5vdCBzYWZlbHkgcmVwb3J0IHRoZSBtZXNzYWdlIGVhZ2VybHksIGJlY2F1c2Ug
dGhpcyBtYXkgY2F1c2UKKyAgICAgICAgLy8gYWxsb2NhdGlvbnMgYW5kIEdDcyBpbnRlcm5hbGx5
IGluIFY4IGFuZCB3ZSBjYW5ub3QgaGFuZGxlIHRoYXQgYXQgdGhpcworICAgICAgICAvLyBwb2lu
dC4gVGhlcmVmb3JlIHdlIGRlbGF5IHRoZSByZXBvcnRpbmcuCisgICAgICAgIENvbnNvbGVNZXNz
YWdlTWFuYWdlcjo6YWRkRGVsYXllZE1lc3NhZ2UobWVzc2FnZSk7CisgICAgfQorfQorCitzdGF0
aWMgdm9pZCByZXBvcnRVbnNhZmVKYXZhU2NyaXB0QWNjZXNzKHY4OjpMb2NhbDx2ODo6T2JqZWN0
PiBob3N0LCB2ODo6QWNjZXNzVHlwZSB0eXBlLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBkYXRhKQor
eworICAgIEZyYW1lKiB0YXJnZXQgPSBWOEN1c3RvbTo6R2V0VGFyZ2V0RnJhbWUoaG9zdCwgZGF0
YSk7CisgICAgaWYgKHRhcmdldCkKKyAgICAgICAgcmVwb3J0VW5zYWZlQWNjZXNzVG8odGFyZ2V0
LCBSRVBPUlRfTEFURVIpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVGYXRhbEVycm9ySW5WOCgp
Cit7CisgICAgLy8gRklYTUU6IFdlIHRlbXBvcmFyaWx5IGRlYWwgd2l0aCBWOCBpbnRlcm5hbCBl
cnJvciBzaXR1YXRpb25zCisgICAgLy8gc3VjaCBhcyBvdXQtb2YtbWVtb3J5IGJ5IGNyYXNoaW5n
IHRoZSByZW5kZXJlci4KKyAgICBDUkFTSCgpOworfQorCitzdGF0aWMgdm9pZCByZXBvcnRGYXRh
bEVycm9ySW5WOChjb25zdCBjaGFyKiBsb2NhdGlvbiwgY29uc3QgY2hhciogbWVzc2FnZSkKK3sK
KyAgICAvLyBWOCBpcyBzaHV0ZG93biwgd2UgY2Fubm90IHVzZSBWOCBhcGkuCisgICAgLy8gVGhl
IG9ubHkgdGhpbmcgd2UgY2FuIGRvIGlzIHRvIGRpc2FibGUgSmF2YVNjcmlwdC4KKyAgICAvLyBG
SVhNRTogY2xlYW4gdXAgVjhQcm94eSBhbmQgZGlzYWJsZSBKYXZhU2NyaXB0LgorICAgIHByaW50
ZigiVjggZXJyb3I6ICVzICglcylcbiIsIG1lc3NhZ2UsIGxvY2F0aW9uKTsKKyAgICBoYW5kbGVG
YXRhbEVycm9ySW5WOCgpOworfQorCitWOFByb3h5Ojp+VjhQcm94eSgpCit7CisgICAgY2xlYXJG
b3JDbG9zZSgpOworICAgIGRlc3Ryb3lHbG9iYWwoKTsKK30KKwordm9pZCBWOFByb3h5OjpkZXN0
cm95R2xvYmFsKCkKK3sKKyAgICBpZiAoIW1fZ2xvYmFsLklzRW1wdHkoKSkgeworI2lmbmRlZiBO
REVCVUcKKyAgICAgICAgdW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBtX2dsb2JhbCk7Cisj
ZW5kaWYKKyAgICAgICAgbV9nbG9iYWwuRGlzcG9zZSgpOworICAgICAgICBtX2dsb2JhbC5DbGVh
cigpOworICAgIH0KK30KKworCitib29sIFY4UHJveHk6OmRvbU9iamVjdEhhc0pTV3JhcHBlcih2
b2lkKiBvYmplY3QpIHsKKyAgICByZXR1cm4gZ2V0RE9NT2JqZWN0TWFwKCkuY29udGFpbnMob2Jq
ZWN0KSB8fCBnZXRBY3RpdmVET01PYmplY3RNYXAoKS5jb250YWlucyhvYmplY3QpOworfQorCisv
LyBUaGUgY2FsbGVyIG11c3QgaGF2ZSBpbmNyZWFzZWQgb2JqJ3MgcmVmIGNvdW50Lgordm9pZCBW
OFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01PYmplY3Qodm9pZCogb2JqZWN0LCB2ODo6UGVyc2lz
dGVudDx2ODo6T2JqZWN0PiB3cmFwcGVyKQoreworICAgIEFTU0VSVChtYXliZURPTVdyYXBwZXIo
d3JhcHBlcikpOworI2lmbmRlZiBOREVCVUcKKyAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5
cGUgdHlwZSA9IFY4UHJveHk6OmRvbVdyYXBwZXJUeXBlKHdyYXBwZXIpOworICAgIHN3aXRjaCAo
dHlwZSkgeworI2RlZmluZSBNQUtFX0NBU0UoVFlQRSwgTkFNRSkgY2FzZSBWOENsYXNzSW5kZXg6
OlRZUEU6CisgICAgICAgIEFDVElWRV9ET01fT0JKRUNUX1RZUEVTKE1BS0VfQ0FTRSkKKyAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisjdW5kZWYgTUFLRV9DQVNFCisgICAgZGVmYXVsdDoK
KyAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmCisgICAgZ2V0RE9NT2JqZWN0TWFwKCkuc2V0
KG9iamVjdCwgd3JhcHBlcik7Cit9CisKKy8vIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGluY3JlYXNl
ZCBvYmoncyByZWYgY291bnQuCit2b2lkIFY4UHJveHk6OnNldEpTV3JhcHBlckZvckFjdGl2ZURP
TU9iamVjdCh2b2lkKiBvYmplY3QsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdyYXBwZXIp
Cit7CisgICAgQVNTRVJUKG1heWJlRE9NV3JhcHBlcih3cmFwcGVyKSk7CisjaWZuZGVmIE5ERUJV
RworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6ZG9tV3Jh
cHBlclR5cGUod3JhcHBlcik7CisgICAgc3dpdGNoICh0eXBlKSB7CisjZGVmaW5lIE1BS0VfQ0FT
RShUWVBFLCBOQU1FKSBjYXNlIFY4Q2xhc3NJbmRleDo6VFlQRTogYnJlYWs7CisgICAgICAgIEFD
VElWRV9ET01fT0JKRUNUX1RZUEVTKE1BS0VfQ0FTRSkKKyAgICBkZWZhdWx0OiAKKyAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisjdW5kZWYgTUFLRV9DQVNFCisgICAgfQorI2VuZGlmCisg
ICAgZ2V0QWN0aXZlRE9NT2JqZWN0TWFwKCkuc2V0KG9iamVjdCwgd3JhcHBlcik7Cit9CisKKy8v
IFRoZSBjYWxsZXIgbXVzdCBoYXZlIGluY3JlYXNlZCBub2RlJ3MgcmVmIGNvdW50Lgordm9pZCBW
OFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01Ob2RlKE5vZGUqIG5vZGUsIHY4OjpQZXJzaXN0ZW50
PHY4OjpPYmplY3Q+IHdyYXBwZXIpCit7CisgICAgQVNTRVJUKG1heWJlRE9NV3JhcHBlcih3cmFw
cGVyKSk7CisgICAgZ2V0RE9NTm9kZU1hcCgpLnNldChub2RlLCB3cmFwcGVyKTsKK30KKworLy8g
RXZlbnQgbGlzdGVuZXJzCisKK3N0YXRpYyBWOEV2ZW50TGlzdGVuZXIqIGZpbmRFdmVudExpc3Rl
bmVySW5MaXN0KFY4RXZlbnRMaXN0ZW5lckxpc3QmIGxpc3QsIHY4OjpMb2NhbDx2ODo6VmFsdWU+
IGxpc3RlbmVyLCBib29sIGlzSW5saW5lKQoreworICAgIEFTU0VSVCh2ODo6Q29udGV4dDo6SW5D
b250ZXh0KCkpOworCisgICAgaWYgKCFsaXN0ZW5lci0+SXNPYmplY3QoKSkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICByZXR1cm4gbGlzdC5maW5kKGxpc3RlbmVyLT5Ub09iamVjdCgpLCBpc0lu
bGluZSk7Cit9CisKKy8vIEZpbmQgYW4gZXhpc3Rpbmcgd3JhcHBlciBmb3IgYSBKUyBldmVudCBs
aXN0ZW5lciBpbiB0aGUgbWFwLgorUGFzc1JlZlB0cjxWOEV2ZW50TGlzdGVuZXI+IFY4UHJveHk6
OmZpbmRWOEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1ZT4gbGlzdGVuZXIsIGJvb2wg
aXNJbmxpbmUpCit7CisgICAgcmV0dXJuIGZpbmRFdmVudExpc3RlbmVySW5MaXN0KG1fZXZlbnRM
aXN0ZW5lcnMsIGxpc3RlbmVyLCBpc0lubGluZSk7Cit9CisKK1Bhc3NSZWZQdHI8VjhFdmVudExp
c3RlbmVyPiBWOFByb3h5OjpmaW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4
OjpWYWx1ZT4gb2JqZWN0LCBib29sIGlzSW5saW5lKQoreworICAgIEFTU0VSVCh2ODo6Q29udGV4
dDo6SW5Db250ZXh0KCkpOworCisgICAgaWYgKCFvYmplY3QtPklzT2JqZWN0KCkpCisgICAgICAg
IHJldHVybiAwOworCisgICAgVjhFdmVudExpc3RlbmVyKiB3cmFwcGVyID0gZmluZEV2ZW50TGlz
dGVuZXJJbkxpc3QobV9ldmVudExpc3RlbmVycywgb2JqZWN0LCBpc0lubGluZSk7CisgICAgaWYg
KHdyYXBwZXIpCisgICAgICAgIHJldHVybiB3cmFwcGVyOworCisgICAgLy8gQ3JlYXRlIGEgbmV3
IG9uZSwgYW5kIGFkZCB0byBjYWNoZS4KKyAgICBSZWZQdHI8VjhFdmVudExpc3RlbmVyPiBuZXdM
aXN0ZW5lciA9IFY4RXZlbnRMaXN0ZW5lcjo6Y3JlYXRlKG1fZnJhbWUsIHY4OjpMb2NhbDx2ODo6
T2JqZWN0Pjo6Q2FzdChvYmplY3QpLCBpc0lubGluZSk7CisgICAgbV9ldmVudExpc3RlbmVycy5h
ZGQobmV3TGlzdGVuZXIuZ2V0KCkpOworCisgICAgcmV0dXJuIG5ld0xpc3RlbmVyOworfQorCisv
LyBPYmplY3QgZXZlbnQgbGlzdGVuZXJzIChzdWNoIGFzIFhtbEh0dHBSZXF1ZXN0IGFuZCBNZXNz
YWdlUG9ydCkgYXJlCisvLyBkaWZmZXJlbnQgZnJvbSBsaXN0ZW5lcnMgb24gRE9NIG5vZGVzLiBB
biBvYmplY3QgZXZlbnQgbGlzdGVuZXIgd3JhcHBlcgorLy8gb25seSBob2xkcyBhIHdlYWsgcmVm
ZXJlbmNlIHRvIHRoZSBKUyBmdW5jdGlvbi4gQSBzdHJvbmcgcmVmZXJlbmNlIGNhbgorLy8gY3Jl
YXRlIGEgY3ljbGUuCisvLworLy8gVGhlIGxpZmV0aW1lIG9mIHRoZXNlIG9iamVjdHMgaXMgYm91
bmRlZCBieSB0aGUgbGlmZSB0aW1lIG9mIGl0cyBKUworLy8gd3JhcHBlci4gU28gd2UgY2FuIGNy
ZWF0ZSBhIGhpZGRlbiByZWZlcmVuY2UgZnJvbSB0aGUgSlMgd3JhcHBlciB0bworLy8gdG8gaXRz
IEpTIGZ1bmN0aW9uLgorLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAobWFwKQorLy8g
ICAgICAgICAgICAgIFhIUiAgICAgIDwtLS0tLS0tLS0tICBKU193cmFwcGVyCisvLyAgICAgICAg
ICAgICAgIHwgICAgICAgICAgICAgKGhpZGRlbikgOiAgXgorLy8gICAgICAgICAgICAgICBWICAg
ICAgICAgICAgICAgICAgICAgIFYgIDogKG1heSByZWFjaGFibGUgYnkgY2xvc3VyZSkKKy8vICAg
ICAgICAgICBWOF9saXN0ZW5lciAgLS0tLS0tLS0+IEpTX2Z1bmN0aW9uCisvLyAgICAgICAgICAg
ICAgICAgICAgICAgICAod2VhaykgIDwtLSBtYXkgY3JlYXRlIGEgY3ljbGUgaWYgaXQgaXMgc3Ry
b25nCisvLworLy8gVGhlIHBlcnNpc3RlbnQgcmVmZXJlbmNlIGlzIG1hZGUgd2VhayBpbiB0aGUg
Y29uc3RydWN0b3IKKy8vIG9mIFY4T2JqZWN0RXZlbnRMaXN0ZW5lci4KKworUGFzc1JlZlB0cjxW
OEV2ZW50TGlzdGVuZXI+IFY4UHJveHk6OmZpbmRPYmplY3RFdmVudExpc3RlbmVyKCB2ODo6TG9j
YWw8djg6OlZhbHVlPiBsaXN0ZW5lciwgYm9vbCBpc0lubGluZSkKK3sKKyAgICByZXR1cm4gZmlu
ZEV2ZW50TGlzdGVuZXJJbkxpc3QobV94aHJMaXN0ZW5lcnMsIGxpc3RlbmVyLCBpc0lubGluZSk7
Cit9CisKK1Bhc3NSZWZQdHI8VjhFdmVudExpc3RlbmVyPiBWOFByb3h5OjpmaW5kT3JDcmVhdGVP
YmplY3RFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6VmFsdWU+IG9iamVjdCwgYm9vbCBpc0lu
bGluZSkKK3sKKyAgICBBU1NFUlQodjg6OkNvbnRleHQ6OkluQ29udGV4dCgpKTsKKworICAgIGlm
ICghb2JqZWN0LT5Jc09iamVjdCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFY4RXZlbnRM
aXN0ZW5lciogd3JhcHBlciA9IGZpbmRFdmVudExpc3RlbmVySW5MaXN0KG1feGhyTGlzdGVuZXJz
LCBvYmplY3QsIGlzSW5saW5lKTsKKyAgICBpZiAod3JhcHBlcikKKyAgICAgICAgcmV0dXJuIHdy
YXBwZXI7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgb25lLCBhbmQgYWRkIHRvIGNhY2hlLgorICAg
IFJlZlB0cjxWOEV2ZW50TGlzdGVuZXI+IG5ld0xpc3RlbmVyID0gVjhPYmplY3RFdmVudExpc3Rl
bmVyOjpjcmVhdGUobV9mcmFtZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpDYXN0KG9iamVjdCks
IGlzSW5saW5lKTsKKyAgICBtX3hockxpc3RlbmVycy5hZGQobmV3TGlzdGVuZXIuZ2V0KCkpOwor
CisgICAgcmV0dXJuIG5ld0xpc3RlbmVyLnJlbGVhc2UoKTsKK30KKworCitzdGF0aWMgdm9pZCBy
ZW1vdmVFdmVudExpc3RlbmVyRnJvbUxpc3QoVjhFdmVudExpc3RlbmVyTGlzdCYgbGlzdCwgVjhF
dmVudExpc3RlbmVyKiBsaXN0ZW5lcikKK3sKKyAgICBsaXN0LnJlbW92ZShsaXN0ZW5lcik7Cit9
CisKK3ZvaWQgVjhQcm94eTo6cmVtb3ZlVjhFdmVudExpc3RlbmVyKFY4RXZlbnRMaXN0ZW5lciog
bGlzdGVuZXIpCit7CisgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21MaXN0KG1fZXZlbnRMaXN0
ZW5lcnMsIGxpc3RlbmVyKTsKK30KKworCit2b2lkIFY4UHJveHk6OnJlbW92ZU9iamVjdEV2ZW50
TGlzdGVuZXIoVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikKK3sKKyAgICByZW1vdmVF
dmVudExpc3RlbmVyRnJvbUxpc3QobV94aHJMaXN0ZW5lcnMsIGxpc3RlbmVyKTsKK30KKworc3Rh
dGljIHZvaWQgZGlzY29ubmVjdEV2ZW50TGlzdGVuZXJzSW5MaXN0KFY4RXZlbnRMaXN0ZW5lckxp
c3QmIGxpc3QpCit7CisgICAgVjhFdmVudExpc3RlbmVyTGlzdDo6aXRlcmF0b3IgaXQgPSBsaXN0
LmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IGxpc3QuZW5kKCkpIHsKKyAgICAgICAgKCppdCkt
PmRpc2Nvbm5lY3RGcmFtZSgpOworICAgICAgICArK2l0OworICAgIH0KKyAgICBsaXN0LmNsZWFy
KCk7Cit9CisKKwordm9pZCBWOFByb3h5OjpkaXNjb25uZWN0RXZlbnRMaXN0ZW5lcnMoKQorewor
ICAgIGRpc2Nvbm5lY3RFdmVudExpc3RlbmVyc0luTGlzdChtX2V2ZW50TGlzdGVuZXJzKTsKKyAg
ICBkaXNjb25uZWN0RXZlbnRMaXN0ZW5lcnNJbkxpc3QobV94aHJMaXN0ZW5lcnMpOworfQorCisK
K3Y4OjpIYW5kbGU8djg6OlNjcmlwdD4gVjhQcm94eTo6Y29tcGlsZVNjcmlwdCh2ODo6SGFuZGxl
PHY4OjpTdHJpbmc+IGNvZGUsIGNvbnN0IFN0cmluZyYgZmlsZU5hbWUsIGludCBiYXNlTGluZSkK
K3sKKyAgICBjb25zdCB1aW50MTZfdCogZmlsZU5hbWVTdHJpbmcgPSBGcm9tV2ViQ29yZVN0cmlu
ZyhmaWxlTmFtZSk7CisgICAgdjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBuYW1lID0gdjg6OlN0cmlu
Zzo6TmV3KGZpbGVOYW1lU3RyaW5nLCBmaWxlTmFtZS5sZW5ndGgoKSk7CisgICAgdjg6OkhhbmRs
ZTx2ODo6SW50ZWdlcj4gbGluZSA9IHY4OjpJbnRlZ2VyOjpOZXcoYmFzZUxpbmUpOworICAgIHY4
OjpTY3JpcHRPcmlnaW4gb3JpZ2luKG5hbWUsIGxpbmUpOworICAgIHY4OjpIYW5kbGU8djg6OlNj
cmlwdD4gc2NyaXB0ID0gdjg6OlNjcmlwdDo6Q29tcGlsZShjb2RlLCAmb3JpZ2luKTsKKyAgICBy
ZXR1cm4gc2NyaXB0OworfQorCitib29sIFY4UHJveHk6OmhhbmRsZU91dE9mTWVtb3J5KCkKK3sK
KyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2ODo6Q29udGV4dDo6R2V0Q3Vy
cmVudCgpOworCisgICAgaWYgKCFjb250ZXh0LT5IYXNPdXRPZk1lbW9yeUV4Y2VwdGlvbigpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBXYXJuaW5nLCBlcnJvciwgZGlzYWJsZSBK
UyBmb3IgdGhpcyBmcmFtZT8KKyAgICBGcmFtZSogZnJhbWUgPSBWOFByb3h5OjpyZXRyaWV2ZUZy
YW1lKGNvbnRleHQpOworCisgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShm
cmFtZSk7CisgICAgaWYgKHByb3h5KSB7CisgICAgICAgIC8vIENsZWFuIG1fY29udGV4dCwgYW5k
IGV2ZW50IGhhbmRsZXJzLgorICAgICAgICBwcm94eS0+Y2xlYXJGb3JDbG9zZSgpOworICAgICAg
ICAvLyBEZXN0cm95IHRoZSBnbG9iYWwgb2JqZWN0LgorICAgICAgICBwcm94eS0+ZGVzdHJveUds
b2JhbCgpOworICAgIH0KKworICAgIENocm9taXVtQnJpZGdlOjpub3RpZnlKU091dE9mTWVtb3J5
KGZyYW1lKTsKKworICAgIC8vIERpc2FibGUgSlMuCisgICAgU2V0dGluZ3MqIHNldHRpbmdzID0g
ZnJhbWUtPnNldHRpbmdzKCk7CisgICAgQVNTRVJUKHNldHRpbmdzKTsKKyAgICBzZXR0aW5ncy0+
c2V0SmF2YVNjcmlwdEVuYWJsZWQoZmFsc2UpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3Zv
aWQgVjhQcm94eTo6ZXZhbHVhdGVJbk5ld0NvbnRleHQoY29uc3QgVmVjdG9yPFNjcmlwdFNvdXJj
ZUNvZGU+JiBzb3VyY2VzKQoreworICAgIGluaXRDb250ZXh0SWZOZWVkZWQoKTsKKworICAgIHY4
OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKworICAgIC8vIFNldCB1cCB0aGUgRE9NIHdpbmRv
dyBhcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBuZXcgZ2xvYmFsIG9iamVjdC4KKyAgICB2ODo6SGFu
ZGxlPHY4OjpDb250ZXh0PiB3aW5kb3dDb250ZXh0ID0gbV9jb250ZXh0OworICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gd2luZG93R2xvYmFsID0gd2luZG93Q29udGV4dC0+R2xvYmFsKCk7Cisg
ICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdpbmRvd1dyYXBwZXIgPSBWOFByb3h5Ojpsb29rdXBE
T01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCB3aW5kb3dHbG9iYWwpOworCisgICAg
QVNTRVJUKFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8RE9NV2luZG93Pih3aW5k
b3dXcmFwcGVyKSA9PSBtX2ZyYW1lLT5kb21XaW5kb3coKSk7CisKKyAgICB2ODo6UGVyc2lzdGVu
dDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGNyZWF0ZU5ld0NvbnRleHQodjg6OkhhbmRsZTx2ODo6
T2JqZWN0PigpKTsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dFNjb3BlKGNvbnRleHQp
OworCisgICAgLy8gU2V0dXAgY29udGV4dCBpZCBmb3IgSlMgZGVidWdnZXIuCisgICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiBjb250ZXh0RGF0YSA9IHY4OjpPYmplY3Q6Ok5ldygpOworICAgIHY4
OjpIYW5kbGU8djg6OlZhbHVlPiB3aW5kb3dDb250ZXh0RGF0YSA9IHdpbmRvd0NvbnRleHQtPkdl
dERhdGEoKTsKKyAgICBpZiAod2luZG93Q29udGV4dERhdGEtPklzT2JqZWN0KCkpIHsKKyAgICAg
ICAgdjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBwcm9wZXJ0eU5hbWUgPSB2ODo6U3RyaW5nOjpOZXco
a0NvbnRleHREZWJ1Z0RhdGFWYWx1ZSk7CisgICAgICAgIGNvbnRleHREYXRhLT5TZXQocHJvcGVy
dHlOYW1lLCB2ODo6T2JqZWN0OjpDYXN0KCp3aW5kb3dDb250ZXh0RGF0YSktPkdldChwcm9wZXJ0
eU5hbWUpKTsKKyAgICB9CisgICAgY29udGV4dERhdGEtPlNldCh2ODo6U3RyaW5nOjpOZXcoa0Nv
bnRleHREZWJ1Z0RhdGFUeXBlKSwgdjg6OlN0cmluZzo6TmV3KCJpbmplY3RlZCIpKTsKKyAgICBj
b250ZXh0LT5TZXREYXRhKGNvbnRleHREYXRhKTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVj
dD4gZ2xvYmFsID0gY29udGV4dC0+R2xvYmFsKCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpTdHJp
bmc+IGltcGxpY2l0UHJvdG9TdHJpbmcgPSB2ODo6U3RyaW5nOjpOZXcoIl9fcHJvdG9fXyIpOwor
ICAgIGdsb2JhbC0+U2V0KGltcGxpY2l0UHJvdG9TdHJpbmcsIHdpbmRvd1dyYXBwZXIpOworCisg
ICAgLy8gR2l2ZSB0aGUgY29kZSBydW5uaW5nIGluIHRoZSBuZXcgY29udGV4dCBhIHdheSB0byBn
ZXQgYWNjZXNzIHRvIHRoZQorICAgIC8vIG9yaWdpbmFsIGNvbnRleHQuCisgICAgZ2xvYmFsLT5T
ZXQodjg6OlN0cmluZzo6TmV3KCJjb250ZW50V2luZG93IiksIHdpbmRvd0dsb2JhbCk7CisKKyAg
ICAvLyBSdW4gY29kZSBpbiB0aGUgbmV3IGNvbnRleHQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBzb3VyY2VzLnNpemUoKTsgKytpKQorICAgICAgICBldmFsdWF0ZShzb3VyY2VzW2ldLCAw
KTsKKworICAgIC8vIFVzaW5nIHRoZSBkZWZhdWx0IHNlY3VyaXR5IHRva2VuIG1lYW5zIHRoYXQg
dGhlIGNhbkFjY2VzcyBpcyBhbHdheXMKKyAgICAvLyBjYWxsZWQsIHdoaWNoIGlzIHNsb3cuCisg
ICAgLy8gRklYTUU6IFVzZSB0b2tlbnMgd2hlcmUgcG9zc2libGUuIFRoaXMgd2lsbCBtZWFuIGtl
ZXBpbmcgdHJhY2sgb2YgYWxsCisgICAgLy8gY3JlYXRlZCBjb250ZXh0cyBzbyB0aGF0IHRoZXkg
Y2FuIGFsbCBiZSB1cGRhdGVkIHdoZW4gdGhlIGRvY3VtZW50IGRvbWFpbgorICAgIC8vIGNoYW5n
ZXMuCisgICAgY29udGV4dC0+VXNlRGVmYXVsdFNlY3VyaXR5VG9rZW4oKTsKKyAgICBjb250ZXh0
LkRpc3Bvc2UoKTsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gVjhQcm94eTo6ZXZhbHVhdGUo
Y29uc3QgU2NyaXB0U291cmNlQ29kZSYgc291cmNlLCBOb2RlKiBub2RlKQoreworICAgIEFTU0VS
VCh2ODo6Q29udGV4dDo6SW5Db250ZXh0KCkpOworCisgICAgLy8gQ29tcGlsZSB0aGUgc2NyaXB0
LgorICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBjb2RlID0gdjhFeHRlcm5hbFN0cmluZyhzb3Vy
Y2Uuc291cmNlKCkpOworICAgIENocm9taXVtQnJpZGdlOjp0cmFjZUV2ZW50QmVnaW4oInY4LmNv
bXBpbGUiLCBub2RlLCAiIik7CisKKyAgICAvLyBOT1RFOiBGb3IgY29tcGF0aWJpbGl0eSB3aXRo
IFdlYkNvcmUsIFNjcmlwdFNvdXJjZUNvZGUncyBsaW5lIHN0YXJ0cyBhdAorICAgIC8vIDEsIHdo
ZXJlYXMgdjggc3RhcnRzIGF0IDAuCisgICAgdjg6OkhhbmRsZTx2ODo6U2NyaXB0PiBzY3JpcHQg
PSBjb21waWxlU2NyaXB0KGNvZGUsIHNvdXJjZS51cmwoKSwgc291cmNlLnN0YXJ0TGluZSgpIC0g
MSk7CisgICAgQ2hyb21pdW1CcmlkZ2U6OnRyYWNlRXZlbnRFbmQoInY4LmNvbXBpbGUiLCBub2Rl
LCAiIik7CisKKyAgICBDaHJvbWl1bUJyaWRnZTo6dHJhY2VFdmVudEJlZ2luKCJ2OC5ydW4iLCBu
b2RlLCAiIik7CisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmVzdWx0OworICAgIHsKKyAgICAg
ICAgLy8gSXNvbGF0ZSBleGNlcHRpb25zIHRoYXQgb2NjdXIgd2hlbiBleGVjdXRpbmcgdGhlIGNv
ZGUuICBUaGVzZQorICAgICAgICAvLyBleGNlcHRpb25zIHNob3VsZCBub3QgaW50ZXJmZXJlIHdp
dGggamF2YXNjcmlwdCBjb2RlIHdlIG1pZ2h0CisgICAgICAgIC8vIGV2YWx1YXRlIGZyb20gQysr
IHdoZW4gcmV0dXJuaW5nIGZyb20gaGVyZQorICAgICAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7
CisgICAgICAgIHRyeUNhdGNoLlNldFZlcmJvc2UodHJ1ZSk7CisKKyAgICAgICAgLy8gU2V0IGlu
bGluZUNvZGUgdG8gdHJ1ZSBmb3IgPGEgaHJlZj0iamF2YXNjcmlwdDpkb1NvbWV0aGluZygpIj4K
KyAgICAgICAgLy8gYW5kIGZhbHNlIGZvciA8c2NyaXB0PmRvU29tZXRoaW5nPC9zY3JpcHQ+LiBX
ZSBtYWtlIGEgcm91Z2ggZ3Vlc3MgYXQKKyAgICAgICAgLy8gdGhpcyBiYXNlZCBvbiB3aGV0aGVy
IHRoZSBzY3JpcHQgc291cmNlIGhhcyBhIFVSTC4KKyAgICAgICAgcmVzdWx0ID0gcnVuU2NyaXB0
KHNjcmlwdCwgc291cmNlLnVybCgpLnN0cmluZygpLmlzTnVsbCgpKTsKKyAgICB9CisgICAgQ2hy
b21pdW1CcmlkZ2U6OnRyYWNlRXZlbnRFbmQoInY4LnJ1biIsIG5vZGUsICIiKTsKKyAgICByZXR1
cm4gcmVzdWx0OworfQorCit2ODo6TG9jYWw8djg6OlZhbHVlPiBWOFByb3h5OjpydW5TY3JpcHQo
djg6OkhhbmRsZTx2ODo6U2NyaXB0PiBzY3JpcHQsIGJvb2wgaXNJbmxpbmVDb2RlKQoreworICAg
IGlmIChzY3JpcHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJj
ZXB0b3IoKTsKKworICAgIC8vIENvbXB1dGUgdGhlIHNvdXJjZSBzdHJpbmcgYW5kIHByZXZlbnQg
YWdhaW5zdCBpbmZpbml0ZSByZWN1cnNpb24uCisgICAgaWYgKG1fcmVjdXJzaW9uID49IGtNYXhS
ZWN1cnNpb25EZXB0aCkgeworICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gY29kZSA9IHY4
RXh0ZXJuYWxTdHJpbmcoInRocm93IFJhbmdlRXJyb3IoJ1JlY3Vyc2lvbiB0b28gZGVlcCcpIik7
CisgICAgICAgIC8vIEZJWE1FOiBJZGVhbGx5LCB3ZSBzaG91bGQgYmUgYWJsZSB0byByZS11c2Ug
dGhlIG9yaWdpbiBvZiB0aGUKKyAgICAgICAgLy8gc2NyaXB0IHBhc3NlZCB0byB1cyBhcyB0aGUg
YXJndW1lbnQgaW5zdGVhZCBvZiB1c2luZyBhbiBlbXB0eSBzdHJpbmcKKyAgICAgICAgLy8gYW5k
IDAgYmFzZUxpbmUuCisgICAgICAgIHNjcmlwdCA9IGNvbXBpbGVTY3JpcHQoY29kZSwgIiIsIDAp
OworICAgIH0KKworICAgIGlmIChoYW5kbGVPdXRPZk1lbW9yeSgpKQorICAgICAgICBBU1NFUlQo
c2NyaXB0LklzRW1wdHkoKSk7CisKKyAgICBpZiAoc2NyaXB0LklzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CisKKyAgICAvLyBTYXZlIHRoZSBwcmV2
aW91cyB2YWx1ZSBvZiB0aGUgaW5saW5lQ29kZSBmbGFnIGFuZCB1cGRhdGUgdGhlIGZsYWcgZm9y
CisgICAgLy8gdGhlIGR1cmF0aW9uIG9mIHRoZSBzY3JpcHQgaW52b2NhdGlvbi4KKyAgICBib29s
IHByZXZpb3VzSW5saW5lQ29kZSA9IGlubGluZUNvZGUoKTsKKyAgICBzZXRJbmxpbmVDb2RlKGlz
SW5saW5lQ29kZSk7CisKKyAgICAvLyBSdW4gdGhlIHNjcmlwdCBhbmQga2VlcCB0cmFjayBvZiB0
aGUgY3VycmVudCByZWN1cnNpb24gZGVwdGguCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmVz
dWx0OworICAgIHsKKyAgICAgICAgQ29uc29sZU1lc3NhZ2VTY29wZSBzY29wZTsKKyAgICAgICAg
bV9yZWN1cnNpb24rKzsKKworICAgICAgICAvLyBFdmFsdWF0aW5nIHRoZSBKYXZhU2NyaXB0IGNv
dWxkIGNhdXNlIHRoZSBmcmFtZSB0byBiZSBkZWFsbG9jYXRlZCwKKyAgICAgICAgLy8gc28gd2Ug
c3RhcnQgdGhlIGtlZXAgYWxpdmUgdGltZXIgaGVyZS4KKyAgICAgICAgLy8gRnJhbWU6OmtlZXBB
bGl2ZSBtZXRob2QgYWRkcyB0aGUgcmVmIGNvdW50IG9mIHRoZSBmcmFtZSBhbmQgc2V0cyBhCisg
ICAgICAgIC8vIHRpbWVyIHRvIGRlY3JlYXNlIHRoZSByZWYgY291bnQuIEl0IGFzc3VtZXMgdGhh
dCB0aGUgY3VycmVudCBKYXZhU2NyaXB0CisgICAgICAgIC8vIGV4ZWN1dGlvbiBmaW5pc2hzIGJl
Zm9yZSBmaXJpbmcgdGhlIHRpbWVyLgorICAgICAgICAvLyBTZWUgaXNzdWUgMTIxODc1NiBhbmQg
OTE0NDMwLgorICAgICAgICBtX2ZyYW1lLT5rZWVwQWxpdmUoKTsKKworICAgICAgICByZXN1bHQg
PSBzY3JpcHQtPlJ1bigpOworICAgICAgICBtX3JlY3Vyc2lvbi0tOworICAgIH0KKworICAgIGlm
IChoYW5kbGVPdXRPZk1lbW9yeSgpKQorICAgICAgICBBU1NFUlQocmVzdWx0LklzRW1wdHkoKSk7
CisKKyAgICAvLyBIYW5kbGUgVjggaW50ZXJuYWwgZXJyb3Igc2l0dWF0aW9uIChPdXQtb2YtbWVt
b3J5KS4KKyAgICBpZiAocmVzdWx0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIG5vdEhhbmRs
ZWRCeUludGVyY2VwdG9yKCk7CisKKyAgICAvLyBSZXN0b3JlIGlubGluZUNvZGUgZmxhZy4KKyAg
ICBzZXRJbmxpbmVDb2RlKHByZXZpb3VzSW5saW5lQ29kZSk7CisKKyAgICBpZiAodjg6OlY4OjpJ
c0RlYWQoKSkKKyAgICAgICAgaGFuZGxlRmF0YWxFcnJvckluVjgoKTsKKworICAgIHJldHVybiBy
ZXN1bHQ7Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFY4UHJveHk6OmNhbGxGdW5jdGlvbih2
ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4gZnVuY3Rpb24sIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
cmVjZWl2ZXIsIGludCBhcmdjLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJnc1tdKQoreworICAg
IC8vIEZvciBub3csIHdlIGRvbid0IHB1dCBhbnkgYXJ0aWZpY2lhbCBsaW1pdGF0aW9ucyBvbiB0
aGUgZGVwdGgKKyAgICAvLyBvZiByZWN1cnNpb24gdGhhdCBzdGVtcyBmcm9tIGNhbGxpbmcgZnVu
Y3Rpb25zLiBUaGlzIGlzIGluCisgICAgLy8gY29udHJhc3QgdG8gdGhlIHNjcmlwdCBldmFsdWF0
aW9ucy4KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQ7CisgICAgeworICAgICAgICBD
b25zb2xlTWVzc2FnZVNjb3BlIHNjb3BlOworCisgICAgICAgIC8vIEV2YWx1YXRpbmcgdGhlIEph
dmFTY3JpcHQgY291bGQgY2F1c2UgdGhlIGZyYW1lIHRvIGJlIGRlYWxsb2NhdGVkLAorICAgICAg
ICAvLyBzbyB3ZSBzdGFydCB0aGUga2VlcCBhbGl2ZSB0aW1lciBoZXJlLgorICAgICAgICAvLyBG
cmFtZTo6a2VlcEFsaXZlIG1ldGhvZCBhZGRzIHRoZSByZWYgY291bnQgb2YgdGhlIGZyYW1lIGFu
ZCBzZXRzIGEKKyAgICAgICAgLy8gdGltZXIgdG8gZGVjcmVhc2UgdGhlIHJlZiBjb3VudC4gSXQg
YXNzdW1lcyB0aGF0IHRoZSBjdXJyZW50IEphdmFTY3JpcHQKKyAgICAgICAgLy8gZXhlY3V0aW9u
IGZpbmlzaHMgYmVmb3JlIGZpcmluZyB0aGUgdGltZXIuCisgICAgICAgIC8vIFNlZSBpc3N1ZSAx
MjE4NzU2IGFuZCA5MTQ0MzAuCisgICAgICAgIG1fZnJhbWUtPmtlZXBBbGl2ZSgpOworCisgICAg
ICAgIHJlc3VsdCA9IGZ1bmN0aW9uLT5DYWxsKHJlY2VpdmVyLCBhcmdjLCBhcmdzKTsKKyAgICB9
CisKKyAgICBpZiAodjg6OlY4OjpJc0RlYWQoKSkKKyAgICAgICAgaGFuZGxlRmF0YWxFcnJvcklu
VjgoKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFY4
UHJveHk6Om5ld0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiBjb25zdHJ1Y3Rvciwg
aW50IGFyZ2MsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmdzW10pCit7CisgICAgLy8gTm8gYXJ0
aWZpY2lhbCBsaW1pdGF0aW9ucyBvbiB0aGUgZGVwdGggb2YgcmVjdXJzaW9uLCBzZWUgY29tbWVu
dCBpbgorICAgIC8vIFY4UHJveHk6OmNhbGxGdW5jdGlvbi4KKyAgICB2ODo6TG9jYWw8djg6OlZh
bHVlPiByZXN1bHQ7CisgICAgeworICAgICAgICBDb25zb2xlTWVzc2FnZVNjb3BlIHNjb3BlOwor
CisgICAgICAgIC8vIFNlZSBjb21tZW50IGluIFY4UHJveHk6OmNhbGxGdW5jdGlvbi4KKyAgICAg
ICAgbV9mcmFtZS0+a2VlcEFsaXZlKCk7CisKKyAgICAgICAgcmVzdWx0ID0gY29uc3RydWN0b3It
Pk5ld0luc3RhbmNlKGFyZ2MsIGFyZ3MpOworICAgIH0KKworICAgIGlmICh2ODo6Vjg6OklzRGVh
ZCgpKQorICAgICAgICBoYW5kbGVGYXRhbEVycm9ySW5WOCgpOworCisgICAgcmV0dXJuIHJlc3Vs
dDsKK30KKwordjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gVjhQcm94eTo6Z2V0Q29uc3RydWN0b3Io
VjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUpCit7CisgICAgLy8gQSBET00gY29uc3Ry
dWN0b3IgaXMgYSBmdW5jdGlvbiBpbnN0YW5jZSBjcmVhdGVkIGZyb20gYSBET00gY29uc3RydWN0
b3IKKyAgICAvLyB0ZW1wbGF0ZS4gVGhlcmUgaXMgb25lIGluc3RhbmNlIHBlciBjb250ZXh0LiBB
IERPTSBjb25zdHJ1Y3RvciBpcworICAgIC8vIGRpZmZlcmVudCBmcm9tIGEgbm9ybWFsIGZ1bmN0
aW9uIGluIHR3byB3YXlzOgorICAgIC8vICAgMSkgaXQgY2Fubm90IGJlIGNhbGxlZCBhcyBjb25z
dHJ1Y3RvciAoYWthLCB1c2VkIHRvIGNyZWF0ZSBhIERPTSBvYmplY3QpCisgICAgLy8gICAyKSBp
dHMgX19wcm90b19fIHBvaW50cyB0byBPYmplY3QucHJvdG90eXBlIHJhdGhlciB0aGFuCisgICAg
Ly8gICAgICBGdW5jdGlvbi5wcm90b3R5cGUuCisgICAgLy8gVGhlIHJlYXNvbiBmb3IgMikgaXMg
dGhhdCwgaW4gU2FmYXJpLCBhIERPTSBjb25zdHJ1Y3RvciBpcyBhIG5vcm1hbCBKUworICAgIC8v
IG9iamVjdCwgYnV0IG5vdCBhIGZ1bmN0aW9uLiBIb3RtYWlsIHJlbGllcyBvbiB0aGUgZmFjdCB0
aGF0LCBpbiBTYWZhcmksCisgICAgLy8gSFRNTEVsZW1lbnQuX19wcm90b19fID09IE9iamVjdC5w
cm90b3R5cGUuCisgICAgLy8KKyAgICAvLyBtX29iamVjdFByb3RvdHlwZSBpcyBhIGNhY2hlIG9m
IHRoZSBvcmlnaW5hbCBPYmplY3QucHJvdG90eXBlLgorCisgICAgQVNTRVJUKGlzQ29udGV4dElu
aXRpYWxpemVkKCkpOworICAgIC8vIEVudGVyIHRoZSBjb250ZXh0IG9mIHRoZSBwcm94eSB0byBt
YWtlIHN1cmUgdGhhdCB0aGUKKyAgICAvLyBmdW5jdGlvbiBpcyBjb25zdHJ1Y3RlZCBpbiB0aGUg
Y29udGV4dCBjb3JyZXNwb25kaW5nIHRvCisgICAgLy8gdGhpcyBwcm94eS4KKyAgICB2ODo6Q29u
dGV4dDo6U2NvcGUgc2NvcGUobV9jb250ZXh0KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlv
blRlbXBsYXRlPiBmdW5jdGlvblRlbXBsYXRlID0gZ2V0VGVtcGxhdGUodHlwZSk7CisgICAgLy8g
R2V0dGluZyB0aGUgZnVuY3Rpb24gbWlnaHQgZmFpbCBpZiB3ZSdyZSBydW5uaW5nIG91dCBvZgor
ICAgIC8vIHN0YWNrIG9yIG1lbW9yeS4KKyAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7CisgICAg
djg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gdmFsdWUgPSBmdW5jdGlvblRlbXBsYXRlLT5HZXRGdW5j
dGlvbigpOworICAgIGlmICh2YWx1ZS5Jc0VtcHR5KCkpCisgICAgICByZXR1cm4gdjg6OkxvY2Fs
PHY4OjpGdW5jdGlvbj4oKTsKKyAgICAvLyBIb3RtYWlsIGZpeCwgc2VlIGNvbW1lbnRzIGFib3Zl
LgorICAgIHZhbHVlLT5TZXQodjg6OlN0cmluZzo6TmV3KCJfX3Byb3RvX18iKSwgbV9vYmplY3RQ
cm90b3R5cGUpOworICAgIHJldHVybiB2YWx1ZTsKK30KKwordjg6OkxvY2FsPHY4OjpPYmplY3Q+
IFY4UHJveHk6OmNyZWF0ZVdyYXBwZXJGcm9tQ2FjaGUoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJU
eXBlIHR5cGUpCit7CisgICAgaW50IGNsYXNzSW5kZXggPSBWOENsYXNzSW5kZXg6OlRvSW50KHR5
cGUpOworICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGNhY2hlZE9iamVjdCA9IG1fd3JhcHBlckJv
aWxlcnBsYXRlcy0+R2V0KHY4OjpJbnRlZ2VyOjpOZXcoY2xhc3NJbmRleCkpOworICAgIGlmIChj
YWNoZWRPYmplY3QtPklzT2JqZWN0KCkpIHsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+
IG9iamVjdCA9IHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6Q2FzdChjYWNoZWRPYmplY3QpOworICAg
ICAgICByZXR1cm4gb2JqZWN0LT5DbG9uZSgpOworICAgIH0KKworICAgIC8vIE5vdCBpbiBjYWNo
ZS4KKyAgICBpbml0Q29udGV4dElmTmVlZGVkKCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNj
b3BlKG1fY29udGV4dCk7CisgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gZnVuY3Rpb24gPSBn
ZXRDb25zdHJ1Y3Rvcih0eXBlKTsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaW5zdGFuY2Ug
PSBTYWZlQWxsb2NhdGlvbjo6bmV3SW5zdGFuY2UoZnVuY3Rpb24pOworICAgIGlmICghaW5zdGFu
Y2UuSXNFbXB0eSgpKSB7CisgICAgICAgIG1fd3JhcHBlckJvaWxlcnBsYXRlcy0+U2V0KHY4OjpJ
bnRlZ2VyOjpOZXcoY2xhc3NJbmRleCksIGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIGluc3Rh
bmNlLT5DbG9uZSgpOworICAgIH0KKyAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3Io
KTsKK30KKworLy8gR2V0IHRoZSBzdHJpbmcgJ3RvU3RyaW5nJy4KK3N0YXRpYyB2ODo6UGVyc2lz
dGVudDx2ODo6U3RyaW5nPiBHZXRUb1N0cmluZ05hbWUoKQoreworICAgIERFRklORV9TVEFUSUNf
TE9DQUwodjg6OlBlcnNpc3RlbnQ8djg6OlN0cmluZz4sIHZhbHVlLCAoKSk7CisgICAgaWYgKHZh
bHVlLklzRW1wdHkoKSkKKyAgICAgICAgdmFsdWUgPSB2ODo6UGVyc2lzdGVudDx2ODo6U3RyaW5n
Pjo6TmV3KHY4OjpTdHJpbmc6Ok5ldygidG9TdHJpbmciKSk7CisgICAgcmV0dXJuIHZhbHVlOwor
fQorCitzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IENvbnN0cnVjdG9yVG9TdHJpbmcoY29u
c3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICAvLyBUaGUgRE9NIGNvbnN0cnVjdG9ycycg
dG9TdHJpbmcgZnVuY3Rpb25zIGdyYWIgdGhlIGN1cnJlbnQgdG9TdHJpbmcKKyAgICAvLyBmb3Ig
RnVuY3Rpb25zIGJ5IHRha2luZyB0aGUgdG9TdHJpbmcgZnVuY3Rpb24gb2YgaXRzZWxmIGFuZCB0
aGVuCisgICAgLy8gY2FsbGluZyBpdCB3aXRoIHRoZSBjb25zdHJ1Y3RvciBhcyBpdHMgcmVjZWl2
ZXIuICBUaGlzIG1lYW5zIHRoYXQKKyAgICAvLyBjaGFuZ2VzIHRvIHRoZSBGdW5jdGlvbiBwcm90
b3R5cGUgY2hhaW4gb3IgdG9TdHJpbmcgZnVuY3Rpb24gYXJlCisgICAgLy8gcmVmbGVjdGVkIHdo
ZW4gcHJpbnRpbmcgRE9NIGNvbnN0cnVjdG9ycy4gIFRoZSBvbmx5IHdhcnQgaXMgdGhhdAorICAg
IC8vIGNoYW5nZXMgdG8gYSBET00gY29uc3RydWN0b3IncyB0b1N0cmluZydzIHRvU3RyaW5nIHdp
bGwgY2F1c2UgdGhlCisgICAgLy8gdG9TdHJpbmcgb2YgdGhlIERPTSBjb25zdHJ1Y3RvciBpdHNl
bGYgdG8gY2hhbmdlLiAgVGhpcyBpcyBleHRyZW1lbHkKKyAgICAvLyBvYnNjdXJlIGFuZCB1bmxp
a2VseSB0byBiZSBhIHByb2JsZW0uCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlID0g
YXJncy5DYWxsZWUoKS0+R2V0KEdldFRvU3RyaW5nTmFtZSgpKTsKKyAgICBpZiAoIXZhbHVlLT5J
c0Z1bmN0aW9uKCkpIAorICAgICAgICByZXR1cm4gdjg6OlN0cmluZzo6TmV3KCIiKTsKKyAgICBy
ZXR1cm4gdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+OjpDYXN0KHZhbHVlKS0+Q2FsbChhcmdzLlRo
aXMoKSwgMCwgMCk7Cit9CisKK3Y4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBW
OFByb3h5OjpnZXRUZW1wbGF0ZShWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSkKK3sK
KyAgICB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4qIGNhY2hlQ2VsbCA9IFY4
Q2xhc3NJbmRleDo6R2V0Q2FjaGUodHlwZSk7CisgICAgaWYgKCEoKmNhY2hlQ2VsbCkuSXNFbXB0
eSgpKQorICAgICAgICByZXR1cm4gKmNhY2hlQ2VsbDsKKworICAgIC8vIG5vdCBmb3VuZAorICAg
IEZ1bmN0aW9uVGVtcGxhdGVGYWN0b3J5IGZhY3RvcnkgPSBWOENsYXNzSW5kZXg6OkdldEZhY3Rv
cnkodHlwZSk7CisgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGRlc2Ny
aXB0b3IgPSBmYWN0b3J5KCk7CisgICAgLy8gRE9NIGNvbnN0cnVjdG9ycyBhcmUgZnVuY3Rpb25z
IGFuZCBzaG91bGQgcHJpbnQgdGhlbXNlbHZlcyBhcyBzdWNoLgorICAgIC8vIEhvd2V2ZXIsIHdl
IHdpbGwgbGF0ZXIgcmVwbGFjZSB0aGVpciBwcm90b3R5cGVzIHdpdGggT2JqZWN0CisgICAgLy8g
cHJvdG90eXBlcyBzbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgb3ZlcnJpZGUgdG9TdHJpbmcgb24g
dGhlCisgICAgLy8gaW5zdGFuY2UgaXRzZWxmLiAgSWYgd2UgbGF0ZXIgbWFrZSBET00gY29uc3Ry
dWN0b3JzIGZ1bGwgb2JqZWN0cworICAgIC8vIHdlIGNhbiBnaXZlIHRoZW0gY2xhc3MgbmFtZXMg
aW5zdGVhZCBhbmQgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZworICAgIC8vIHdpbGwgd29yayBz
byB3ZSBjYW4gcmVtb3ZlIHRoaXMgY29kZS4KKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKHY4OjpQ
ZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiwgdG9TdHJpbmdUZW1wbGF0ZSwgKCkpOwor
ICAgIGlmICh0b1N0cmluZ1RlbXBsYXRlLklzRW1wdHkoKSkKKyAgICAgICAgdG9TdHJpbmdUZW1w
bGF0ZSA9IHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KHY4OjpGdW5j
dGlvblRlbXBsYXRlOjpOZXcoQ29uc3RydWN0b3JUb1N0cmluZykpOworICAgIGRlc2NyaXB0b3It
PlNldChHZXRUb1N0cmluZ05hbWUoKSwgdG9TdHJpbmdUZW1wbGF0ZSk7CisgICAgc3dpdGNoICh0
eXBlKSB7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkNTU1NUWUxFREVDTEFSQVRJT046CisgICAg
ICAgIC8vIFRoZSBuYW1lZCBwcm9wZXJ0eSBoYW5kbGVyIGZvciBzdHlsZSBkZWNsYXJhdGlvbnMg
aGFzIGEKKyAgICAgICAgLy8gc2V0dGVyLiAgVGhlcmVmb3JlLCB0aGUgaW50ZXJjZXB0b3IgaGFz
IHRvIGJlIG9uIHRoZSBvYmplY3QKKyAgICAgICAgLy8gaXRzZWxmIGFuZCBub3Qgb24gdGhlIHBy
b3RvdHlwZSBvYmplY3QuCisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+
U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoIFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoQ1NTU3R5
bGVEZWNsYXJhdGlvbiksIFVTRV9OQU1FRF9QUk9QRVJUWV9TRVRURVIoQ1NTU3R5bGVEZWNsYXJh
dGlvbikpOworICAgICAgICBzZXRDb2xsZWN0aW9uU3RyaW5nT3JOdWxsSW5kZXhlZEdldHRlcjxD
U1NTdHlsZURlY2xhcmF0aW9uPihkZXNjcmlwdG9yKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBWOENsYXNzSW5kZXg6OkNTU1JVTEVMSVNUOgorICAgICAgICBzZXRDb2xsZWN0aW9uSW5kZXhl
ZEdldHRlcjxDU1NSdWxlTGlzdCwgQ1NTUnVsZT4oZGVzY3JpcHRvciwgIFY4Q2xhc3NJbmRleDo6
Q1NTUlVMRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpDU1NWQUxV
RUxJU1Q6CisgICAgICAgIHNldENvbGxlY3Rpb25JbmRleGVkR2V0dGVyPENTU1ZhbHVlTGlzdCwg
Q1NTVmFsdWU+KGRlc2NyaXB0b3IsIFY4Q2xhc3NJbmRleDo6Q1NTVkFMVUUpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q1NTVkFSSUFCTEVTREVDTEFSQVRJT046Cisg
ICAgICAgIHNldENvbGxlY3Rpb25TdHJpbmdPck51bGxJbmRleGVkR2V0dGVyPENTU1ZhcmlhYmxl
c0RlY2xhcmF0aW9uPihkZXNjcmlwdG9yKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENs
YXNzSW5kZXg6OldFQktJVENTU1RSQU5TRk9STVZBTFVFOgorICAgICAgICBzZXRDb2xsZWN0aW9u
SW5kZXhlZEdldHRlcjxXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSwgQ1NTVmFsdWU+KGRlc2NyaXB0
b3IsIFY4Q2xhc3NJbmRleDo6Q1NTVkFMVUUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4
Q2xhc3NJbmRleDo6VU5ERVRFQ1RBQkxFSFRNTENPTExFQ1RJT046CisgICAgICAgIGRlc2NyaXB0
b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+TWFya0FzVW5kZXRlY3RhYmxlKCk7ICAvLyBmYWxsIHRo
cm91Z2gKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT046CisgICAgICAgIGRl
c2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNF
X05BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MQ29sbGVjdGlvbikpOworICAgICAgICBkZXNjcmlw
dG9yLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldENhbGxBc0Z1bmN0aW9uSGFuZGxlcihVU0VfQ0FM
TEJBQ0soSFRNTENvbGxlY3Rpb25DYWxsQXNGdW5jdGlvbikpOworICAgICAgICBzZXRDb2xsZWN0
aW9uSW5kZXhlZEdldHRlcjxIVE1MQ29sbGVjdGlvbiwgTm9kZT4oZGVzY3JpcHRvciwgVjhDbGFz
c0luZGV4OjpOT0RFKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhU
TUxPUFRJT05TQ09MTEVDVElPTjoKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0
ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhU
TUxDb2xsZWN0aW9uKSk7CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+
U2V0SW5kZXhlZFByb3BlcnR5SGFuZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoSFRN
TE9wdGlvbnNDb2xsZWN0aW9uKSwgVVNFX0lOREVYRURfUFJPUEVSVFlfU0VUVEVSKEhUTUxPcHRp
b25zQ29sbGVjdGlvbikpOworICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCkt
PlNldENhbGxBc0Z1bmN0aW9uSGFuZGxlcihVU0VfQ0FMTEJBQ0soSFRNTENvbGxlY3Rpb25DYWxs
QXNGdW5jdGlvbikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRN
TFNFTEVDVEVMRU1FTlQ6CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+
U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MU2Vs
ZWN0RWxlbWVudENvbGxlY3Rpb24pKTsKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1w
bGF0ZSgpLT5TZXRJbmRleGVkUHJvcGVydHlIYW5kbGVyKG5vZGVDb2xsZWN0aW9uSW5kZXhlZFBy
b3BlcnR5R2V0dGVyPEhUTUxTZWxlY3RFbGVtZW50PiwgVVNFX0lOREVYRURfUFJPUEVSVFlfU0VU
VEVSKEhUTUxTZWxlY3RFbGVtZW50Q29sbGVjdGlvbiksCisgICAgICAgICAgICAwLCAwLCBub2Rl
Q29sbGVjdGlvbkluZGV4ZWRQcm9wZXJ0eUVudW1lcmF0b3I8SFRNTFNlbGVjdEVsZW1lbnQ+LCB2
ODo6SW50ZWdlcjo6TmV3KFY4Q2xhc3NJbmRleDo6Tk9ERSkpOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTERPQ1VNRU5UOiB7CisgICAgICAgIGRlc2NyaXB0b3It
Pkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BS
T1BFUlRZX0dFVFRFUihIVE1MRG9jdW1lbnQpLCAwLCAwLCBVU0VfTkFNRURfUFJPUEVSVFlfREVM
RVRFUihIVE1MRG9jdW1lbnQpKTsKKworICAgICAgICAvLyBXZSBhZGQgYW4gZXh0cmEgaW50ZXJu
YWwgZmllbGQgdG8gYWxsIERvY3VtZW50IHdyYXBwZXJzIGZvcgorICAgICAgICAvLyBzdG9yaW5n
IGEgcGVyIGRvY3VtZW50IERPTUltcGxlbWVudGF0aW9uIHdyYXBwZXIuCisgICAgICAgIC8vCisg
ICAgICAgIC8vIEFkZGl0aW9uYWxseSwgd2UgYWRkIHR3byBleHRyYSBpbnRlcm5hbCBmaWVsZHMg
Zm9yCisgICAgICAgIC8vIEhUTUxEb2N1bWVudHMgdG8gaW1wbGVtZW50IHRlbXBvcmFyeSBzaGFk
b3dpbmcgb2YKKyAgICAgICAgLy8gZG9jdW1lbnQuYWxsLiAgT25lIGZpZWxkIGhvbGRzIGFuIG9i
amVjdCB0aGF0IGlzIHVzZWQgYXMgYQorICAgICAgICAvLyBtYXJrZXIuICBUaGUgb3RoZXIgZmll
bGQgaG9sZHMgdGhlIG1hcmtlciBvYmplY3QgaWYKKyAgICAgICAgLy8gZG9jdW1lbnQuYWxsIGlz
IG5vdCBzaGFkb3dlZCBhbmQgc29tZSBvdGhlciB2YWx1ZSBpZgorICAgICAgICAvLyBkb2N1bWVu
dC5hbGwgaXMgc2hhZG93ZWQuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+
IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAg
ICAgIEFTU0VSVChpbnN0YW5jZVRlbXBsYXRlLT5JbnRlcm5hbEZpZWxkQ291bnQoKSA9PSBWOEN1
c3RvbTo6a0RlZmF1bHRXcmFwcGVySW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgaW5zdGFu
Y2VUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9tOjprSFRNTERvY3VtZW50
SW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorI2lmIEVOQUJMRShT
VkcpCisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlNWR0RPQ1VNRU5UOiAgLy8gZmFsbCB0aHJvdWdo
CisjZW5kaWYKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6RE9DVU1FTlQ6IHsKKyAgICAgICAgLy8g
V2UgYWRkIGFuIGV4dHJhIGludGVybmFsIGZpZWxkIHRvIGFsbCBEb2N1bWVudCB3cmFwcGVycyBm
b3IKKyAgICAgICAgLy8gc3RvcmluZyBhIHBlciBkb2N1bWVudCBET01JbXBsZW1lbnRhdGlvbiB3
cmFwcGVyLgorICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBpbnN0YW5jZVRl
bXBsYXRlID0gZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBBU1NFUlQo
aW5zdGFuY2VUZW1wbGF0ZS0+SW50ZXJuYWxGaWVsZENvdW50KCkgPT0gVjhDdXN0b206OmtEZWZh
dWx0V3JhcHBlckludGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUt
PlNldEludGVybmFsRmllbGRDb3VudCggVjhDdXN0b206OmtEb2N1bWVudE1pbmltdW1JbnRlcm5h
bEZpZWxkQ291bnQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWOENsYXNzSW5k
ZXg6OkhUTUxBUFBMRVRFTEVNRU5UOiAgLy8gZmFsbCB0aHJvdWdoCisgICAgY2FzZSBWOENsYXNz
SW5kZXg6OkhUTUxFTUJFREVMRU1FTlQ6ICAvLyBmYWxsIHRocm91Z2gKKyAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6SFRNTE9CSkVDVEVMRU1FTlQ6CisgICAgICAgIC8vIEhUTUxBcHBsZXRFbGVtZW50
LCBIVE1MRW1iZWRFbGVtZW50IGFuZCBIVE1MT2JqZWN0RWxlbWVudCBhcmUKKyAgICAgICAgLy8g
aW5oZXJpdGVkIGZyb20gSFRNTFBsdWdJbkVsZW1lbnQsIGFuZCB0aGV5IHNoYXJlIHRoZSBzYW1l
IHByb3BlcnR5CisgICAgICAgIC8vIGhhbmRsaW5nIGNvZGUuCisgICAgICAgIGRlc2NyaXB0b3It
Pkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BS
T1BFUlRZX0dFVFRFUihIVE1MUGx1Z0luRWxlbWVudCksIFVTRV9OQU1FRF9QUk9QRVJUWV9TRVRU
RVIoSFRNTFBsdWdJbkVsZW1lbnQpKTsKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1w
bGF0ZSgpLT5TZXRJbmRleGVkUHJvcGVydHlIYW5kbGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZX0dF
VFRFUihIVE1MUGx1Z0luRWxlbWVudCksIFVTRV9JTkRFWEVEX1BST1BFUlRZX1NFVFRFUihIVE1M
UGx1Z0luRWxlbWVudCkpOworICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCkt
PlNldENhbGxBc0Z1bmN0aW9uSGFuZGxlcihVU0VfQ0FMTEJBQ0soSFRNTFBsdWdJbkVsZW1lbnQp
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhUTUxGUkFNRVNFVEVM
RU1FTlQ6CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQ
cm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MRnJhbWVTZXRFbGVt
ZW50KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpIVE1MRk9STUVM
RU1FTlQ6CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQ
cm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MRm9ybUVsZW1lbnQp
KTsKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRJbmRleGVkUHJv
cGVydHlIYW5kbGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZX0dFVFRFUihIVE1MRm9ybUVsZW1lbnQp
LCAwLCAwLCAwLCBub2RlQ29sbGVjdGlvbkluZGV4ZWRQcm9wZXJ0eUVudW1lcmF0b3I8SFRNTEZv
cm1FbGVtZW50Piwgdjg6OkludGVnZXI6Ok5ldyhWOENsYXNzSW5kZXg6Ok5PREUpKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkNBTlZBU1BJWEVMQVJSQVk6CisgICAg
ICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0SW5kZXhlZFByb3BlcnR5SGFu
ZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoQ2FudmFzUGl4ZWxBcnJheSksIFVTRV9J
TkRFWEVEX1BST1BFUlRZX1NFVFRFUihDYW52YXNQaXhlbEFycmF5KSk7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpTVFlMRVNIRUVUOiAgLy8gZmFsbCB0aHJvdWdoCisg
ICAgY2FzZSBWOENsYXNzSW5kZXg6OkNTU1NUWUxFU0hFRVQ6IHsKKyAgICAgICAgLy8gV2UgYWRk
IGFuIGV4dHJhIGludGVybmFsIGZpZWxkIHRvIGhvbGQgYSByZWZlcmVuY2UgdG8KKyAgICAgICAg
Ly8gdGhlIG93bmVyIG5vZGUuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+
IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAg
ICAgIEFTU0VSVChpbnN0YW5jZVRlbXBsYXRlLT5JbnRlcm5hbEZpZWxkQ291bnQoKSA9PSBWOEN1
c3RvbTo6a0RlZmF1bHRXcmFwcGVySW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgaW5zdGFu
Y2VUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9tOjprU3R5bGVTaGVldElu
dGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6TUVESUFMSVNUOgorICAgICAgICBzZXRDb2xsZWN0aW9uU3RyaW5nT3JOdWxsSW5k
ZXhlZEdldHRlcjxNZWRpYUxpc3Q+KGRlc2NyaXB0b3IpOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIFY4Q2xhc3NJbmRleDo6TUlNRVRZUEVBUlJBWToKKyAgICAgICAgc2V0Q29sbGVjdGlvbklu
ZGV4ZWRBbmROYW1lZEdldHRlcnM8TWltZVR5cGVBcnJheSwgTWltZVR5cGU+KGRlc2NyaXB0b3Is
IFY4Q2xhc3NJbmRleDo6TUlNRVRZUEUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6TkFNRUROT0RFTUFQOgorICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBs
YXRlKCktPlNldE5hbWVkUHJvcGVydHlIYW5kbGVyKFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIo
TmFtZWROb2RlTWFwKSk7CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+
U2V0SW5kZXhlZFByb3BlcnR5SGFuZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoTmFt
ZWROb2RlTWFwKSwgMCwgMCwgMCwgY29sbGVjdGlvbkluZGV4ZWRQcm9wZXJ0eUVudW1lcmF0b3I8
TmFtZWROb2RlTWFwPiwgdjg6OkludGVnZXI6Ok5ldyhWOENsYXNzSW5kZXg6Ok5PREUpKTsKKyAg
ICAgICAgYnJlYWs7CisjaWYgRU5BQkxFKERPTV9TVE9SQUdFKQ0KKyAgICBjYXNlIFY4Q2xhc3NJ
bmRleDo6U1RPUkFHRToNCisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+
U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihTdG9yYWdl
KSwgVVNFX05BTUVEX1BST1BFUlRZX1NFVFRFUihTdG9yYWdlKSwgMCwgVVNFX05BTUVEX1BST1BF
UlRZX0RFTEVURVIoU3RvcmFnZSksIFY4Q3VzdG9tOjp2OFN0b3JhZ2VOYW1lZFByb3BlcnR5RW51
bWVyYXRvcik7DQorICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldElu
ZGV4ZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX0lOREVYRURfUFJPUEVSVFlfR0VUVEVSKFN0b3JhZ2Up
LCBVU0VfSU5ERVhFRF9QUk9QRVJUWV9TRVRURVIoU3RvcmFnZSksIDAsIFVTRV9JTkRFWEVEX1BS
T1BFUlRZX0RFTEVURVIoU3RvcmFnZSkpOw0KKyAgICAgICAgYnJlYWs7DQorI2VuZGlmCisgICAg
Y2FzZSBWOENsYXNzSW5kZXg6Ok5PREVMSVNUOgorICAgICAgICBzZXRDb2xsZWN0aW9uSW5kZXhl
ZEdldHRlcjxOb2RlTGlzdCwgTm9kZT4oZGVzY3JpcHRvciwgVjhDbGFzc0luZGV4OjpOT0RFKTsK
KyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5
SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKE5vZGVMaXN0KSk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpQTFVHSU46CisgICAgICAgIHNldENvbGxlY3Rp
b25JbmRleGVkQW5kTmFtZWRHZXR0ZXJzPFBsdWdpbiwgTWltZVR5cGU+KGRlc2NyaXB0b3IsIFY4
Q2xhc3NJbmRleDo6TUlNRVRZUEUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJ
bmRleDo6UExVR0lOQVJSQVk6CisgICAgICAgIHNldENvbGxlY3Rpb25JbmRleGVkQW5kTmFtZWRH
ZXR0ZXJzPFBsdWdpbkFycmF5LCBQbHVnaW4+KGRlc2NyaXB0b3IsIFY4Q2xhc3NJbmRleDo6UExV
R0lOKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVRM
SVNUOgorICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldE5hbWVkUHJv
cGVydHlIYW5kbGVyKFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoU3R5bGVTaGVldExpc3QpKTsK
KyAgICAgICAgc2V0Q29sbGVjdGlvbkluZGV4ZWRHZXR0ZXI8U3R5bGVTaGVldExpc3QsIFN0eWxl
U2hlZXQ+KGRlc2NyaXB0b3IsIFY4Q2xhc3NJbmRleDo6U1RZTEVTSEVFVCk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpET01XSU5ET1c6IHsKKyAgICAgICAgdjg6Okxv
Y2FsPHY4OjpTaWduYXR1cmU+IGRlZmF1bHRTaWduYXR1cmUgPSB2ODo6U2lnbmF0dXJlOjpOZXco
ZGVzY3JpcHRvcik7CisKKyAgICAgICAgZGVzY3JpcHRvci0+UHJvdG90eXBlVGVtcGxhdGUoKS0+
U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihET01XaW5k
b3cpKTsKKyAgICAgICAgZGVzY3JpcHRvci0+UHJvdG90eXBlVGVtcGxhdGUoKS0+U2V0SW5kZXhl
ZFByb3BlcnR5SGFuZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoRE9NV2luZG93KSk7
CisKKyAgICAgICAgZGVzY3JpcHRvci0+U2V0SGlkZGVuUHJvdG90eXBlKHRydWUpOworCisgICAg
ICAgIC8vIFJlc2VydmUgc3BhY2VzIGZvciByZWZlcmVuY2VzIHRvIGxvY2F0aW9uLCBoaXN0b3J5
IGFuZAorICAgICAgICAvLyBuYXZpZ2F0b3Igb2JqZWN0cy4KKyAgICAgICAgdjg6OkxvY2FsPHY4
OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2NyaXB0b3ItPkluc3RhbmNl
VGVtcGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2VUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENv
dW50KFY4Q3VzdG9tOjprRE9NV2luZG93SW50ZXJuYWxGaWVsZENvdW50KTsKKworICAgICAgICAv
LyBTZXQgYWNjZXNzIGNoZWNrIGNhbGxiYWNrcywgYnV0IHR1cm5lZCBvZmYgaW5pdGlhbGx5Lgor
ICAgICAgICAvLyBXaGVuIGEgY29udGV4dCBpcyBkZXRhY2hlZCBmcm9tIGEgZnJhbWUsIHR1cm4g
b24gdGhlIGFjY2VzcyBjaGVjay4KKyAgICAgICAgLy8gVHVybmluZyBvbiBjaGVja3MgYWxzbyBp
bnZhbGlkYXRlcyBpbmxpbmUgY2FjaGVzIG9mIHRoZSBvYmplY3QuCisgICAgICAgIGluc3RhbmNl
VGVtcGxhdGUtPlNldEFjY2Vzc0NoZWNrQ2FsbGJhY2tzKFY4Q3VzdG9tOjp2OERPTVdpbmRvd05h
bWVkU2VjdXJpdHlDaGVjaywgVjhDdXN0b206OnY4RE9NV2luZG93SW5kZXhlZFNlY3VyaXR5Q2hl
Y2ssIHY4OjpJbnRlZ2VyOjpOZXcoVjhDbGFzc0luZGV4OjpET01XSU5ET1cpLCBmYWxzZSk7Cisg
ICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6TE9DQVRJT046IHsK
KyAgICAgICAgLy8gRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgb24g
dGhlIGluc3RhbmNlCisgICAgICAgIC8vIGluc3RlYWQgb2Ygb24gdGhlIHByb3RvdHlwZSBvYmpl
Y3QgdG8gaW5zdXJlIHRoYXQgdGhleSBjYW5ub3QKKyAgICAgICAgLy8gYmUgb3ZlcndyaXR0ZW4u
CisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlID0gZGVzY3Jp
cHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBpbnN0YW5jZS0+U2V0QWNjZXNzb3Io
djg6OlN0cmluZzo6TmV3KCJyZWxvYWQiKSwgVjhDdXN0b206OnY4TG9jYXRpb25SZWxvYWRBY2Nl
c3NvckdldHRlciwgMCwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCksIHY4OjpBTExfQ0FOX1JFQUQs
IHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OkRvbnREZWxldGUgfCB2ODo6
UmVhZE9ubHkpKTsKKyAgICAgICAgaW5zdGFuY2UtPlNldEFjY2Vzc29yKHY4OjpTdHJpbmc6Ok5l
dygicmVwbGFjZSIpLCBWOEN1c3RvbTo6djhMb2NhdGlvblJlcGxhY2VBY2Nlc3NvckdldHRlciwg
MCwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCksIHY4OjpBTExfQ0FOX1JFQUQsIHN0YXRpY19jYXN0
PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OkRvbnREZWxldGUgfCB2ODo6UmVhZE9ubHkpKTsK
KyAgICAgICAgaW5zdGFuY2UtPlNldEFjY2Vzc29yKHY4OjpTdHJpbmc6Ok5ldygiYXNzaWduIiks
IFY4Q3VzdG9tOjp2OExvY2F0aW9uQXNzaWduQWNjZXNzb3JHZXR0ZXIsIDAsIHY4OjpIYW5kbGU8
djg6OlZhbHVlPigpLCB2ODo6QUxMX0NBTl9SRUFELCBzdGF0aWNfY2FzdDx2ODo6UHJvcGVydHlB
dHRyaWJ1dGU+KHY4OjpEb250RGVsZXRlIHwgdjg6OlJlYWRPbmx5KSk7CisgICAgICAgIGJyZWFr
OworICAgIH0KKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SElTVE9SWToKKyAgICAgICAgYnJlYWs7
CisKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6TUVTU0FHRUNIQU5ORUw6IHsKKyAgICAgICAgLy8g
UmVzZXJ2ZSB0d28gbW9yZSBpbnRlcm5hbCBmaWVsZHMgZm9yIHJlZmVyZW5jaW5nIHRoZSBwb3J0
MQorICAgICAgICAvLyBhbmQgcG9ydDIgd3JhcHBlcnMuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUg
cG9ydCB3cmFwcGVycyBhcmUKKyAgICAgICAgLy8ga2VwdCBhbGl2ZSB3aGVuIHRoZSBjaGFubmVs
IHdyYXBwZXIgaXMuCisgICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5kbGVyKFVTRV9DQUxM
QkFDSyhNZXNzYWdlQ2hhbm5lbENvbnN0cnVjdG9yKSk7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6
T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjcmlwdG9yLT5JbnN0YW5jZVRl
bXBsYXRlKCk7CisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUtPlNldEludGVybmFsRmllbGRDb3Vu
dChWOEN1c3RvbTo6a01lc3NhZ2VDaGFubmVsSW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAg
YnJlYWs7CisgICAgfQorCisgICAgY2FzZSBWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JUOiB7Cisg
ICAgICAgIC8vIFJlc2VydmUgb25lIG1vcmUgaW50ZXJuYWwgZmllbGQgZm9yIGtlZXBpbmcgZXZl
bnQgbGlzdGVuZXJzLgorICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBpbnN0
YW5jZVRlbXBsYXRlID0gZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBp
bnN0YW5jZVRlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoVjhDdXN0b206OmtNZXNzYWdl
UG9ydEludGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmIEVO
QUJMRShXT1JLRVJTKQorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpXT1JLRVI6IHsKKyAgICAgICAg
Ly8gUmVzZXJ2ZSBvbmUgbW9yZSBpbnRlcm5hbCBmaWVsZCBmb3Iga2VlcGluZyBldmVudCBsaXN0
ZW5lcnMuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVt
cGxhdGUgPSBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAgICAgIGluc3RhbmNl
VGVtcGxhdGUtPlNldEludGVybmFsRmllbGRDb3VudChWOEN1c3RvbTo6a1dvcmtlckludGVybmFs
RmllbGRDb3VudCk7CisgICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5kbGVyKFVTRV9DQUxM
QkFDSyhXb3JrZXJDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBj
YXNlIFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVDogeworICAgICAgICAvLyBSZXNlcnZlIG9u
ZSBtb3JlIGludGVybmFsIGZpZWxkIGZvciBrZWVwaW5nIGV2ZW50IGxpc3RlbmVycy4KKyAgICAg
ICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2Ny
aXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2VUZW1wbGF0ZS0+U2V0
SW50ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9tOjprV29ya2VyQ29udGV4dEludGVybmFsRmllbGRD
b3VudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvLyBXT1JLRVJTCisKKyAgICAv
LyBUaGUgZm9sbG93aW5nIG9iamVjdHMgYXJlIGNyZWF0ZWQgZnJvbSBKYXZhU2NyaXB0LgorICAg
IGNhc2UgVjhDbGFzc0luZGV4OjpET01QQVJTRVI6CisgICAgICAgIGRlc2NyaXB0b3ItPlNldENh
bGxIYW5kbGVyKFVTRV9DQUxMQkFDSyhET01QYXJzZXJDb25zdHJ1Y3RvcikpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTElNQUdFRUxFTUVOVDoKKyAgICAgICAg
ZGVzY3JpcHRvci0+U2V0Q2FsbEhhbmRsZXIoVVNFX0NBTExCQUNLKEhUTUxJbWFnZUVsZW1lbnRD
b25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRN
TE9QVElPTkVMRU1FTlQ6CisgICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5kbGVyKFVTRV9D
QUxMQkFDSyhIVE1MT3B0aW9uRWxlbWVudENvbnN0cnVjdG9yKSk7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgVjhDbGFzc0luZGV4OjpXRUJLSVRDU1NNQVRSSVg6CisgICAgICAgIGRlc2NyaXB0
b3ItPlNldENhbGxIYW5kbGVyKFVTRV9DQUxMQkFDSyhXZWJLaXRDU1NNYXRyaXhDb25zdHJ1Y3Rv
cikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6V0VCS0lUUE9JTlQ6
CisgICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5kbGVyKFVTRV9DQUxMQkFDSyhXZWJLaXRQ
b2ludENvbnN0cnVjdG9yKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4
OjpYTUxTRVJJQUxJWkVSOgorICAgICAgICBkZXNjcmlwdG9yLT5TZXRDYWxsSGFuZGxlcihVU0Vf
Q0FMTEJBQ0soWE1MU2VyaWFsaXplckNvbnN0cnVjdG9yKSk7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVDogeworICAgICAgICAvLyBSZXNlcnZl
IG9uZSBtb3JlIGludGVybmFsIGZpZWxkIGZvciBrZWVwaW5nIGV2ZW50IGxpc3RlbmVycy4KKyAg
ICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRl
c2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2VUZW1wbGF0ZS0+
U2V0SW50ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9tOjprWE1MSHR0cFJlcXVlc3RJbnRlcm5hbEZp
ZWxkQ291bnQpOworICAgICAgICBkZXNjcmlwdG9yLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJB
Q0soWE1MSHR0cFJlcXVlc3RDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICB9Cisg
ICAgY2FzZSBWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FEOiB7CisgICAgICAgIC8v
IFJlc2VydmUgb25lIG1vcmUgaW50ZXJuYWwgZmllbGQgZm9yIGtlZXBpbmcgZXZlbnQgbGlzdGVu
ZXJzLgorICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBpbnN0YW5jZVRlbXBs
YXRlID0gZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBpbnN0YW5jZVRl
bXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoVjhDdXN0b206OmtYTUxIdHRwUmVxdWVzdElu
dGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6WFBBVEhFVkFMVUFUT1I6CisgICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5k
bGVyKFVTRV9DQUxMQkFDSyhYUGF0aEV2YWx1YXRvckNvbnN0cnVjdG9yKSk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SOgorICAgICAgICBkZXNj
cmlwdG9yLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJBQ0soWFNMVFByb2Nlc3NvckNvbnN0cnVj
dG9yKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpDTElFTlRSRUNU
TElTVDoKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRJbmRleGVk
UHJvcGVydHlIYW5kbGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZX0dFVFRFUihDbGllbnRSZWN0TGlz
dCkpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9
CisKKyAgICAqY2FjaGVDZWxsID0gZGVzY3JpcHRvcjsKKyAgICByZXR1cm4gZGVzY3JpcHRvcjsK
K30KKworYm9vbCBWOFByb3h5Ojppc0NvbnRleHRJbml0aWFsaXplZCgpCit7CisgICAgLy8gbV9j
b250ZXh0LCBtX2dsb2JhbCwgbV9vYmplY3RQcm90b3R5cGUgYW5kIG1fd3JhcHBlckJvaWxlcnBs
YXRlcyBzaG91bGQKKyAgICAvLyBhbGwgYmUgbm9uLWVtcHR5IGlmIGlmIG1fY29udGV4dCBpcyBu
b24tZW1wdHkuCisgICAgQVNTRVJUKG1fY29udGV4dC5Jc0VtcHR5KCkgfHwgIW1fZ2xvYmFsLklz
RW1wdHkoKSk7CisgICAgQVNTRVJUKG1fY29udGV4dC5Jc0VtcHR5KCkgfHwgIW1fb2JqZWN0UHJv
dG90eXBlLklzRW1wdHkoKSk7CisgICAgQVNTRVJUKG1fY29udGV4dC5Jc0VtcHR5KCkgfHwgIW1f
d3JhcHBlckJvaWxlcnBsYXRlcy5Jc0VtcHR5KCkpOworICAgIHJldHVybiAhbV9jb250ZXh0Lklz
RW1wdHkoKTsKK30KKworRE9NV2luZG93KiBWOFByb3h5OjpyZXRyaWV2ZVdpbmRvdygpCit7Cisg
ICAgLy8gRklYTUU6IFRoaXMgc2VlbXMgdmVyeSBmcmFnaWxlLiBIb3cgZG8gd2Uga25vdyB0aGF0
IHRoZSBnbG9iYWwgb2JqZWN0CisgICAgLy8gZnJvbSB0aGUgY3VycmVudCBjb250ZXh0IGlzIHNv
bWV0aGluZyBzZW5zaWJsZT8gRG8gd2UgbmVlZCB0byB1c2UgdGhlCisgICAgLy8gbGFzdCBlbnRl
cmVkIGhlcmU/IFdobyBjYWxscyB0aGlzPworICAgIHJldHVybiByZXRyaWV2ZVdpbmRvdyh2ODo6
Q29udGV4dDo6R2V0Q3VycmVudCgpKTsKK30KKworRE9NV2luZG93KiBWOFByb3h5OjpyZXRyaWV2
ZVdpbmRvdyh2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0KQoreworICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gZ2xvYmFsID0gY29udGV4dC0+R2xvYmFsKCk7CisgICAgQVNTRVJUKCFn
bG9iYWwuSXNFbXB0eSgpKTsKKyAgICBnbG9iYWwgPSBsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJ
bmRleDo6RE9NV0lORE9XLCBnbG9iYWwpOworICAgIEFTU0VSVCghZ2xvYmFsLklzRW1wdHkoKSk7
CisgICAgcmV0dXJuIGNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRl
eDo6RE9NV0lORE9XLCBnbG9iYWwpOworfQorCitGcmFtZSogVjhQcm94eTo6cmV0cmlldmVGcmFt
ZSh2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0KQoreworICAgIHJldHVybiByZXRyaWV2
ZVdpbmRvdyhjb250ZXh0KS0+ZnJhbWUoKTsKK30KKworRnJhbWUqIFY4UHJveHk6OnJldHJpZXZl
RnJhbWVGb3JFbnRlcmVkQ29udGV4dCgpCit7CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4g
Y29udGV4dCA9IHY4OjpDb250ZXh0OjpHZXRFbnRlcmVkKCk7CisgICAgaWYgKGNvbnRleHQuSXNF
bXB0eSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcmV0cmlldmVGcmFtZShjb250
ZXh0KTsKK30KKworRnJhbWUqIFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JDdXJyZW50Q29udGV4
dCgpCit7CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0
OjpHZXRDdXJyZW50KCk7CisgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1
cm4gMDsKKyAgICByZXR1cm4gcmV0cmlldmVGcmFtZShjb250ZXh0KTsKK30KKworRnJhbWUqIFY4
UHJveHk6OnJldHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29udGV4dCgpCit7CisgICAgdjg6OkhhbmRs
ZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0OjpHZXRDYWxsaW5nKCk7CisgICAg
aWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcmV0
cmlldmVGcmFtZShjb250ZXh0KTsKK30KKworRnJhbWUqIFY4UHJveHk6OnJldHJpZXZlRnJhbWUo
KQoreworICAgIERPTVdpbmRvdyogd2luZG93ID0gcmV0cmlldmVXaW5kb3coKTsKKyAgICByZXR1
cm4gd2luZG93ID8gd2luZG93LT5mcmFtZSgpIDogMDsKK30KKworVjhQcm94eSogVjhQcm94eTo6
cmV0cmlldmUoKQoreworICAgIERPTVdpbmRvdyogd2luZG93ID0gcmV0cmlldmVXaW5kb3coKTsK
KyAgICBBU1NFUlQod2luZG93KTsKKyAgICByZXR1cm4gcmV0cmlldmUod2luZG93LT5mcmFtZSgp
KTsKK30KKworVjhQcm94eSogVjhQcm94eTo6cmV0cmlldmUoRnJhbWUqIGZyYW1lKQoreworICAg
IGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBmcmFtZS0+c2NyaXB0
KCktPmlzRW5hYmxlZCgpID8gZnJhbWUtPnNjcmlwdCgpLT5wcm94eSgpIDogMDsKK30KKworVjhQ
cm94eSogVjhQcm94eTo6cmV0cmlldmUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCkK
K3sKKyAgICBpZiAoIWNvbnRleHQtPmlzRG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgcmV0dXJuIHJldHJpZXZlKHN0YXRpY19jYXN0PERvY3VtZW50Kj4oY29udGV4dCktPmZyYW1l
KCkpOworfQorCit2b2lkIFY4UHJveHk6OmRpc2Nvbm5lY3RGcmFtZSgpCit7CisgICAgZGlzY29u
bmVjdEV2ZW50TGlzdGVuZXJzKCk7Cit9CisKK2Jvb2wgVjhQcm94eTo6aXNFbmFibGVkKCkKK3sK
KyAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBtX2ZyYW1lLT5zZXR0aW5ncygpOworICAgIGlmICgh
c2V0dGluZ3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEluIHRoZSBjb21tb24g
Y2FzZSwgSmF2YVNjcmlwdCBpcyBlbmFibGVkIGFuZCB3ZSdyZSBkb25lLgorICAgIGlmIChzZXR0
aW5ncy0+aXNKYXZhU2NyaXB0RW5hYmxlZCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAg
IC8vIElmIEphdmFTY3JpcHQgaGFzIGJlZW4gZGlzYWJsZWQsIHdlIG5lZWQgdG8gbG9vayBhdCB0
aGUgZnJhbWUgdG8gdGVsbAorICAgIC8vIHdoZXRoZXIgdGhpcyBzY3JpcHQgY2FtZSBmcm9tIHRo
ZSB3ZWIgb3IgdGhlIGVtYmVkZGVyLiBTY3JpcHRzIGZyb20gdGhlCisgICAgLy8gZW1iZWRkZXIg
YXJlIHNhZmUgdG8gcnVuLCBidXQgc2NyaXB0cyBmcm9tIHRoZSBvdGhlciBzb3VyY2VzIGFyZQor
ICAgIC8vIGRpc2FsbG93ZWQuCisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gbV9mcmFtZS0+ZG9j
dW1lbnQoKTsKKyAgICBpZiAoIWRvY3VtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBTZWN1cml0eU9yaWdpbiogb3JpZ2luID0gZG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCk7Cisg
ICAgaWYgKG9yaWdpbi0+cHJvdG9jb2woKS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsgIC8vIFVuaW5pdGlhbGl6ZWQgZG9jdW1lbnQKKworICAgIGlmIChvcmlnaW4tPnByb3RvY29s
KCkgPT0gImh0dHAiIHx8IG9yaWdpbi0+cHJvdG9jb2woKSA9PSAiaHR0cHMiKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7ICAvLyBXZWIgc2l0ZQorCisgICAgLy8gRklYTUU6IHRoZSBmb2xsb3dpbmcg
YXJlIGFwcGxpY2F0aW9uIGRlY2lzaW9ucywgYW5kIHRoZXkgc2hvdWxkCisgICAgLy8gbm90IGJl
IG1hZGUgYXQgdGhpcyBsYXllci4gIGluc3RlYWQsIHdlIHNob3VsZCBicmlkZ2Ugb3V0IHRvIHRo
ZQorICAgIC8vIGVtYmVkZGVyIHRvIGFsbG93IHRoZW0gdG8gb3ZlcnJpZGUgcG9saWN5IGhlcmUu
CisKKyAgICBpZiAob3JpZ2luLT5wcm90b2NvbCgpID09IENocm9taXVtQnJpZGdlOjp1aVJlc291
cmNlUHJvdG9jb2woKSkKKyAgICAgICAgcmV0dXJuIHRydWU7ICAgLy8gRW1iZWRkZXIncyBzY3Jp
cHRzIGFyZSBvayB0byBydW4KKworICAgIC8vIElmIHRoZSBzY2hlbWUgaXMgZnRwOiBvciBmaWxl
OiwgYW4gZW1wdHkgZmlsZSBuYW1lIGluZGljYXRlcyBhIGRpcmVjdG9yeQorICAgIC8vIGxpc3Rp
bmcsIHdoaWNoIHJlcXVpcmVzIEphdmFTY3JpcHQgdG8gZnVuY3Rpb24gcHJvcGVybHkuCisgICAg
Y29uc3QgY2hhcioga0RpclByb3RvY29sc1tdID0geyAiZnRwIiwgImZpbGUiIH07CisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoa0RpclByb3RvY29scyk7ICsraSkgeworICAg
ICAgICBpZiAob3JpZ2luLT5wcm90b2NvbCgpID09IGtEaXJQcm90b2NvbHNbaV0pIHsKKyAgICAg
ICAgICAgIGNvbnN0IEtVUkwmIHVybCA9IGRvY3VtZW50LT51cmwoKTsKKyAgICAgICAgICAgIHJl
dHVybiB1cmwucGF0aEFmdGVyTGFzdFNsYXNoKCkgPT0gdXJsLnBhdGhFbmQoKTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsgIC8vIE90aGVyIHByb3RvY29scyBmYWxsIHRo
cm91Z2ggdG8gaGVyZQorfQorCit2b2lkIFY4UHJveHk6OnVwZGF0ZURvY3VtZW50V3JhcHBlcih2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcHBlcikKK3sKKyAgICBjbGVhckRvY3VtZW50V3JhcHBl
cigpOworCisgICAgQVNTRVJUKG1fZG9jdW1lbnQuSXNFbXB0eSgpKTsKKyAgICBtX2RvY3VtZW50
ID0gdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPjo6TmV3KHdyYXBwZXIpOworI2lmbmRlZiBOREVC
VUcKKyAgICByZWdpc3Rlckdsb2JhbEhhbmRsZShQUk9YWSwgdGhpcywgbV9kb2N1bWVudCk7Cisj
ZW5kaWYKK30KKwordm9pZCBWOFByb3h5OjpjbGVhckRvY3VtZW50V3JhcHBlcigpCit7CisgICAg
aWYgKCFtX2RvY3VtZW50LklzRW1wdHkoKSkgeworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgdW5y
ZWdpc3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBtX2RvY3VtZW50KTsKKyNlbmRpZgorICAgICAgICBt
X2RvY3VtZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgbV9kb2N1bWVudC5DbGVhcigpOworICAgIH0K
K30KKwordm9pZCBWOFByb3h5Ojp1cGRhdGVEb2N1bWVudFdyYXBwZXJDYWNoZSgpCit7CisgICAg
djg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBjb250
ZXh0U2NvcGUoY29udGV4dCgpKTsKKworICAgIC8vIElmIHRoZSBkb2N1bWVudCBoYXMgbm8gZnJh
bWUsIE5vZGVUb1Y4T2JqZWN0IG1pZ2h0IGdldCB0aGUKKyAgICAvLyBkb2N1bWVudCB3cmFwcGVy
IGZvciBhIGRvY3VtZW50IHRoYXQgaXMgYWJvdXQgdG8gYmUgZGVsZXRlZC4KKyAgICAvLyBJZiB0
aGUgRm9yY2VTZXQgYmVsb3cgY2F1c2VzIGEgZ2FyYmFnZSBjb2xsZWN0aW9uLCB0aGUgZG9jdW1l
bnQKKyAgICAvLyBtaWdodCBnZXQgZGVsZXRlZCBhbmQgdGhlIGdsb2JhbCBoYW5kbGUgZm9yIHRo
ZSBkb2N1bWVudAorICAgIC8vIHdyYXBwZXIgY2xlYXJlZC4gVXNpbmcgdGhlIGNsZWFyZWQgZ2xv
YmFsIGhhbmRsZSB3aWxsIGxlYWQgdG8KKyAgICAvLyBjcmFzaGVzLiAgSW4gdGhpcyBjYXNlIHdl
IGNsZWFyIHRoZSBjYWNoZSBhbmQgbGV0IHRoZSBET01XaW5kb3cKKyAgICAvLyBhY2Nlc3NvciBo
YW5kbGUgYWNjZXNzIHRvIHRoZSBkb2N1bWVudC4KKyAgICBpZiAoIW1fZnJhbWUtPmRvY3VtZW50
KCktPmZyYW1lKCkpIHsKKyAgICAgICAgY2xlYXJEb2N1bWVudFdyYXBwZXJDYWNoZSgpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGRvY3VtZW50
V3JhcHBlciA9IGNvbnZlcnROb2RlVG9WOE9iamVjdChtX2ZyYW1lLT5kb2N1bWVudCgpKTsKKwor
ICAgIC8vIElmIGluc3RhbnRpYXRpb24gb2YgdGhlIGRvY3VtZW50IHdyYXBwZXIgZmFpbHMsIGNs
ZWFyIHRoZSBjYWNoZQ0KKyAgICAvLyBhbmQgbGV0IHRoZSBET01XaW5kb3cgYWNjZXNzb3IgaGFu
ZGxlIGFjY2VzcyB0byB0aGUgZG9jdW1lbnQuDQorICAgIGlmIChkb2N1bWVudFdyYXBwZXIuSXNF
bXB0eSgpKSB7DQorICAgICAgICBjbGVhckRvY3VtZW50V3JhcHBlckNhY2hlKCk7DQorICAgICAg
ICByZXR1cm47DQorICAgIH0KKyAgICBtX2NvbnRleHQtPkdsb2JhbCgpLT5Gb3JjZVNldCh2ODo6
U3RyaW5nOjpOZXcoImRvY3VtZW50IiksIGRvY3VtZW50V3JhcHBlciwgc3RhdGljX2Nhc3Q8djg6
OlByb3BlcnR5QXR0cmlidXRlPih2ODo6UmVhZE9ubHkgfCB2ODo6RG9udERlbGV0ZSkpOworfQor
Cit2b2lkIFY4UHJveHk6OmNsZWFyRG9jdW1lbnRXcmFwcGVyQ2FjaGUoKQoreworICAgIEFTU0VS
VCghbV9jb250ZXh0LklzRW1wdHkoKSk7CisgICAgbV9jb250ZXh0LT5HbG9iYWwoKS0+Rm9yY2VE
ZWxldGUodjg6OlN0cmluZzo6TmV3KCJkb2N1bWVudCIpKTsKK30KKwordm9pZCBWOFByb3h5Ojpk
aXNwb3NlQ29udGV4dEhhbmRsZXMoKQoreworICAgIGlmICghbV9jb250ZXh0LklzRW1wdHkoKSkg
eworICAgICAgICBtX2NvbnRleHQuRGlzcG9zZSgpOworICAgICAgICBtX2NvbnRleHQuQ2xlYXIo
KTsKKyAgICB9CisKKyAgICBpZiAoIW1fd3JhcHBlckJvaWxlcnBsYXRlcy5Jc0VtcHR5KCkpIHsK
KyNpZm5kZWYgTkRFQlVHCisgICAgICAgIHVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV93
cmFwcGVyQm9pbGVycGxhdGVzKTsKKyNlbmRpZgorICAgICAgICBtX3dyYXBwZXJCb2lsZXJwbGF0
ZXMuRGlzcG9zZSgpOworICAgICAgICBtX3dyYXBwZXJCb2lsZXJwbGF0ZXMuQ2xlYXIoKTsKKyAg
ICB9CisKKyAgICBpZiAoIW1fb2JqZWN0UHJvdG90eXBlLklzRW1wdHkoKSkgeworI2lmbmRlZiBO
REVCVUcKKyAgICAgICAgdW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBtX29iamVjdFByb3Rv
dHlwZSk7CisjZW5kaWYKKyAgICAgICAgbV9vYmplY3RQcm90b3R5cGUuRGlzcG9zZSgpOworICAg
ICAgICBtX29iamVjdFByb3RvdHlwZS5DbGVhcigpOworICAgIH0KK30KKwordm9pZCBWOFByb3h5
OjpjbGVhckZvckNsb3NlKCkKK3sKKyAgICBpZiAoIW1fY29udGV4dC5Jc0VtcHR5KCkpIHsKKyAg
ICAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworCisgICAgICAgIGNsZWFyRG9jdW1l
bnRXcmFwcGVyKCk7CisgICAgICAgIGRpc3Bvc2VDb250ZXh0SGFuZGxlcygpOworICAgIH0KK30K
Kwordm9pZCBWOFByb3h5OjpjbGVhckZvck5hdmlnYXRpb24oKQoreworICAgIC8vIGRpc2Nvbm5l
Y3QgYWxsIGV2ZW50IGxpc3RlbmVycworICAgIGRpc2Nvbm5lY3RFdmVudExpc3RlbmVycygpOwor
CisgICAgaWYgKCFtX2NvbnRleHQuSXNFbXB0eSgpKSB7CisgICAgICAgIHY4OjpIYW5kbGVTY29w
ZSBoYW5kbGU7CisgICAgICAgIGNsZWFyRG9jdW1lbnRXcmFwcGVyKCk7CisKKyAgICAgICAgdjg6
OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRTY29wZShtX2NvbnRleHQpOworCisgICAgICAgIC8vIENs
ZWFyIHRoZSBkb2N1bWVudCB3cmFwcGVyIGNhY2hlIGJlZm9yZSB0dXJuaW5nIG9uIGFjY2VzcyBj
aGVja3Mgb24KKyAgICAgICAgLy8gdGhlIG9sZCBET01XaW5kb3cgd3JhcHBlci4gIFRoaXMgd2F5
LCBhY2Nlc3MgdG8gdGhlIGRvY3VtZW50IHdyYXBwZXIKKyAgICAgICAgLy8gd2lsbCBiZSBwcm90
ZWN0ZWQgYnkgdGhlIHNlY3VyaXR5IGNoZWNrcyBvbiB0aGUgRE9NV2luZG93IHdyYXBwZXIuCisg
ICAgICAgIGNsZWFyRG9jdW1lbnRXcmFwcGVyQ2FjaGUoKTsKKworICAgICAgICAvLyBUdXJuIG9u
IGFjY2VzcyBjaGVjayBvbiB0aGUgb2xkIERPTVdpbmRvdyB3cmFwcGVyLgorICAgICAgICB2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRl
eDo6RE9NV0lORE9XLCBtX2dsb2JhbCk7CisgICAgICAgIEFTU0VSVCghd3JhcHBlci5Jc0VtcHR5
KCkpOworICAgICAgICB3cmFwcGVyLT5UdXJuT25BY2Nlc3NDaGVjaygpOworCisgICAgICAgIC8v
IFNlcGFyYXRlIHRoZSBjb250ZXh0IGZyb20gaXRzIGdsb2JhbCBvYmplY3QuCisgICAgICAgIG1f
Y29udGV4dC0+RGV0YWNoR2xvYmFsKCk7CisKKyAgICAgICAgZGlzcG9zZUNvbnRleHRIYW5kbGVz
KCk7CisKKyAgICAgICAgLy8gUmVpbml0aWFsaXplIHRoZSBjb250ZXh0IHNvIHRoZSBnbG9iYWwg
b2JqZWN0IHBvaW50cyB0bworICAgICAgICAvLyB0aGUgbmV3IERPTSB3aW5kb3cuCisgICAgICAg
IGluaXRDb250ZXh0SWZOZWVkZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgVjhQcm94eTo6c2V0U2Vj
dXJpdHlUb2tlbigpCit7CisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gbV9mcmFtZS0+ZG9jdW1l
bnQoKTsKKyAgICAvLyBTZXR1cCBzZWN1cml0eSBvcmlnaW4gYW5kIHNlY3VyaXR5IHRva2VuCisg
ICAgaWYgKCFkb2N1bWVudCkgeworICAgICAgICBtX2NvbnRleHQtPlVzZURlZmF1bHRTZWN1cml0
eVRva2VuKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBBc2sgdGhlIGRvY3Vt
ZW50J3MgU2VjdXJpdHlPcmlnaW4gdG8gZ2VuZXJhdGUgYSBzZWN1cml0eSB0b2tlbi4KKyAgICAv
LyBJZiB0d28gdG9rZW5zIGFyZSBlcXVhbCwgdGhlbiB0aGUgU2VjdXJpdHlPcmlnaW5zIGNhbkFj
Y2VzcyBlYWNoIG90aGVyLgorICAgIC8vIElmIHR3byB0b2tlbnMgYXJlIG5vdCBlcXVhbCwgdGhl
biB3ZSBoYXZlIHRvIGNhbGwgY2FuQWNjZXNzLgorICAgIC8vIE5vdGU6IHdlIGNhbid0IHVzZSB0
aGUgSFRUUE9yaWdpbiBpZiBpdCB3YXMgc2V0IGZyb20gdGhlIERPTS4KKyAgICBTZWN1cml0eU9y
aWdpbiogb3JpZ2luID0gZG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCk7CisgICAgU3RyaW5nIHRv
a2VuOworICAgIGlmICghb3JpZ2luLT5kb21haW5XYXNTZXRJbkRPTSgpKQorICAgICAgICB0b2tl
biA9IGRvY3VtZW50LT5zZWN1cml0eU9yaWdpbigpLT50b1N0cmluZygpOworCisgICAgLy8gQW4g
ZW1wdHkgb3IgIm51bGwiIHRva2VuIG1lYW5zIHdlIGFsd2F5cyBoYXZlIHRvIGNhbGwKKyAgICAv
LyBjYW5BY2Nlc3MuICBUaGUgdG9TdHJpbmcgbWV0aG9kIG9uIHNlY3VyaXR5T3JpZ2lucyByZXR1
cm5zIHRoZQorICAgIC8vIHN0cmluZyAibnVsbCIgZm9yIGVtcHR5IHNlY3VyaXR5IG9yaWdpbnMg
YW5kIGZvciBzZWN1cml0eQorICAgIC8vIG9yaWdpbnMgdGhhdCBzaG91bGQgb25seSBhbGxvdyBh
Y2Nlc3MgdG8gdGhlbXNlbHZlcy4gIEluIHRoaXMKKyAgICAvLyBjYXNlLCB3ZSB1c2UgdGhlIGds
b2JhbCBvYmplY3QgYXMgdGhlIHNlY3VyaXR5IHRva2VuIHRvIGF2b2lkCisgICAgLy8gY2FsbGlu
ZyBjYW5BY2Nlc3Mgd2hlbiBhIHNjcmlwdCBhY2Nlc3NlcyBpdHMgb3duIG9iamVjdHMuCisgICAg
aWYgKHRva2VuLmlzRW1wdHkoKSB8fCB0b2tlbiA9PSAibnVsbCIpIHsKKyAgICAgICAgbV9jb250
ZXh0LT5Vc2VEZWZhdWx0U2VjdXJpdHlUb2tlbigpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgQ1N0cmluZyB1dGY4VG9rZW4gPSB0b2tlbi51dGY4KCk7CisgICAgLy8gTk9URTogVjgg
ZG9lcyBpZGVudGl0eSBjb21wYXJpc29uIGluIGZhc3QgcGF0aCwgbXVzdCB1c2UgYSBzeW1ib2wK
KyAgICAvLyBhcyB0aGUgc2VjdXJpdHkgdG9rZW4uCisgICAgbV9jb250ZXh0LT5TZXRTZWN1cml0
eVRva2VuKHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCh1dGY4VG9rZW4uZGF0YSgpLCB1dGY4VG9rZW4u
bGVuZ3RoKCkpKTsKK30KKwordm9pZCBWOFByb3h5Ojp1cGRhdGVEb2N1bWVudCgpCit7CisgICAg
aWYgKCFtX2ZyYW1lLT5kb2N1bWVudCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobV9n
bG9iYWwuSXNFbXB0eSgpKSB7CisgICAgICAgIEFTU0VSVChtX2NvbnRleHQuSXNFbXB0eSgpKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdlIGhhdmUgYSBuZXcgZG9jdW1lbnQg
YW5kIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBjYWNoZS4KKyAgICB1cGRhdGVEb2N1bWVudFdyYXBw
ZXJDYWNoZSgpOworCisgICAgdXBkYXRlU2VjdXJpdHlPcmlnaW4oKTsKK30KKwordm9pZCBWOFBy
b3h5Ojp1cGRhdGVTZWN1cml0eU9yaWdpbigpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3Bl
OworICAgIHNldFNlY3VyaXR5VG9rZW4oKTsKK30KKworLy8gU2FtZSBvcmlnaW4gcG9saWN5IGlt
cGxlbWVudGF0aW9uOgorLy8KKy8vIFNhbWUgb3JpZ2luIHBvbGljeSBwcmV2ZW50cyBKUyBjb2Rl
IGZyb20gZG9tYWluIEEgYWNjZXNzIEpTICYgRE9NIG9iamVjdHMKKy8vIGluIGEgZGlmZmVyZW50
IGRvbWFpbiBCLiBUaGVyZSBhcmUgZXhjZXB0aW9ucyBhbmQgc2V2ZXJhbCBvYmplY3RzIGFyZQor
Ly8gYWNjZXNzaWJsZSBieSBjcm9zcy1kb21haW4gY29kZS4gRm9yIGV4YW1wbGUsIHRoZSB3aW5k
b3cuZnJhbWVzIG9iamVjdCBpcworLy8gYWNjZXNzaWJsZSBieSBjb2RlIGZyb20gYSBkaWZmZXJl
bnQgZG9tYWluLCBidXQgd2luZG93LmRvY3VtZW50IGlzIG5vdC4KKy8vCisvLyBUaGUgYmluZGlu
ZyBjb2RlIHNldHMgc2VjdXJpdHkgY2hlY2sgY2FsbGJhY2tzIG9uIGEgZnVuY3Rpb24gdGVtcGxh
dGUsCisvLyBhbmQgYWNjZXNzaW5nIGluc3RhbmNlcyBvZiB0aGUgdGVtcGxhdGUgY2FsbHMgdGhl
IGNhbGxiYWNrIGZ1bmN0aW9uLgorLy8gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGNoZWNrcyBzYW1l
IG9yaWdpbiBwb2xpY3kuCisvLworLy8gQ2FsbGJhY2sgZnVuY3Rpb25zIGFyZSBleHBlbnNpdmUu
IFY4IHVzZXMgYSBzZWN1cml0eSB0b2tlbiBzdHJpbmcgdG8gZG8KKy8vIGZhc3QgYWNjZXNzIGNo
ZWNrcyBmb3IgdGhlIGNvbW1vbiBjYXNlIHdoZXJlIHNvdXJjZSBhbmQgdGFyZ2V0IGFyZSBpbiB0
aGUKKy8vIHNhbWUgZG9tYWluLiBBIHNlY3VyaXR5IHRva2VuIGlzIGEgc3RyaW5nIG9iamVjdCB0
aGF0IHJlcHJlc2VudHMKKy8vIHRoZSBwcm90b2NvbC91cmwvcG9ydCBvZiBhIGRvbWFpbi4KKy8v
CisvLyBUaGVyZSBhcmUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhIHNlY3VyaXR5IHRva2VuIG1hdGNo
aW5nIGlzIG5vdCBlbm91Z2guCisvLyBGb3IgZXhhbXBsZSwgSmF2YVNjcmlwdCBjYW4gc2V0IGl0
cyBkb21haW4gdG8gYSBzdXBlciBkb21haW4gYnkgY2FsbGluZworLy8gZG9jdW1lbnQuc2V0RG9t
YWluKC4uLikuIEluIHRoZXNlIGNhc2VzLCB0aGUgYmluZGluZyBjb2RlIGNhbiByZXNldAorLy8g
YSBjb250ZXh0J3Mgc2VjdXJpdHkgdG9rZW4gdG8gaXRzIGdsb2JhbCBvYmplY3Qgc28gdGhhdCB0
aGUgZmFzdCBhY2Nlc3MKKy8vIGNoZWNrIHdpbGwgYWx3YXlzIGZhaWwuCisKKy8vIENoZWNrIGlm
IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0IGNhbiBhY2Nlc3MgYSB0YXJnZXQgZnJhbWUu
CisvLyBGaXJzdCBpdCBjaGVja3Mgc2FtZSBkb21haW4gcG9saWN5IHVzaW5nIHRoZSBsZXhpY2Fs
IGNvbnRleHQKKy8vCisvLyBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gS0pTOjpXaW5kb3c6OmFsbG93
c0FjY2Vzc0Zyb20oRXhlY1N0YXRlKiwgU3RyaW5nJikuCitib29sIFY4UHJveHk6OmNhbkFjY2Vz
c1ByaXZhdGUoRE9NV2luZG93KiB0YXJnZXRXaW5kb3cpCit7CisgICAgQVNTRVJUKHRhcmdldFdp
bmRvdyk7CisKKyAgICBTdHJpbmcgbWVzc2FnZTsKKworICAgIERPTVdpbmRvdyogb3JpZ2luV2lu
ZG93ID0gcmV0cmlldmVXaW5kb3coKTsKKyAgICBpZiAob3JpZ2luV2luZG93ID09IHRhcmdldFdp
bmRvdykKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoIW9yaWdpbldpbmRvdykKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29uc3QgU2VjdXJpdHlPcmlnaW4qIGFjdGl2ZVNl
Y3VyaXR5T3JpZ2luID0gb3JpZ2luV2luZG93LT5zZWN1cml0eU9yaWdpbigpOworICAgIGNvbnN0
IFNlY3VyaXR5T3JpZ2luKiB0YXJnZXRTZWN1cml0eU9yaWdpbiA9IHRhcmdldFdpbmRvdy0+c2Vj
dXJpdHlPcmlnaW4oKTsKKworICAgIC8vIFdlIGhhdmUgc2VlbiBjcmFzaGVzIHdlcmUgdGhlIHNl
Y3VyaXR5IG9yaWdpbiBvZiB0aGUgdGFyZ2V0IGhhcyBub3QgYmVlbgorICAgIC8vIGluaXRpYWxp
emVkLiAgRGVmZW5kIGFnYWluc3QgdGhhdC4KKyAgICBpZiAoIXRhcmdldFNlY3VyaXR5T3JpZ2lu
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoYWN0aXZlU2VjdXJpdHlPcmlnaW4t
PmNhbkFjY2Vzcyh0YXJnZXRTZWN1cml0eU9yaWdpbikpCisgICAgICAgIHJldHVybiB0cnVlOwor
CisgICAgLy8gQWxsb3cgYWNjZXNzIHRvIGEgImFib3V0OmJsYW5rIiBwYWdlIGlmIHRoZSBkeW5h
bWljIGNvbnRleHQgaXMgYQorICAgIC8vIGRldGFjaGVkIGNvbnRleHQgb2YgdGhlIHNhbWUgZnJh
bWUgYXMgdGhlIGJsYW5rIHBhZ2UuCisgICAgaWYgKHRhcmdldFNlY3VyaXR5T3JpZ2luLT5pc0Vt
cHR5KCkgJiYgb3JpZ2luV2luZG93LT5mcmFtZSgpID09IHRhcmdldFdpbmRvdy0+ZnJhbWUoKSkK
KyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVjhQ
cm94eTo6Y2FuQWNjZXNzRnJhbWUoRnJhbWUqIHRhcmdldCwgYm9vbCByZXBvcnRFcnJvcikKK3sK
KyAgICAvLyBUaGUgc3ViamVjdCBpcyBkZXRhY2hlZCBmcm9tIGEgZnJhbWUsIGRlbnkgYWNjZXNz
ZXMuCisgICAgaWYgKCF0YXJnZXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICgh
Y2FuQWNjZXNzUHJpdmF0ZSh0YXJnZXQtPmRvbVdpbmRvdygpKSkgeworICAgICAgICBpZiAocmVw
b3J0RXJyb3IpCisgICAgICAgICAgICByZXBvcnRVbnNhZmVBY2Nlc3NUbyh0YXJnZXQsIFJFUE9S
VF9OT1cpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOwor
fQorCitib29sIFY4UHJveHk6OmNoZWNrTm9kZVNlY3VyaXR5KE5vZGUqIG5vZGUpCit7CisgICAg
aWYgKCFub2RlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBGcmFtZSogdGFyZ2V0ID0g
bm9kZS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKKworICAgIGlmICghdGFyZ2V0KQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gY2FuQWNjZXNzRnJhbWUodGFyZ2V0LCB0cnVlKTsK
K30KKwordjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IFY4UHJveHk6OmNyZWF0ZU5ld0NvbnRl
eHQodjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwpCit7CisgICAgdjg6OlBlcnNpc3RlbnQ8
djg6OkNvbnRleHQ+IHJlc3VsdDsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBlbnZpcm9ubWVudCB1
c2luZyBhbiBlbXB0eSB0ZW1wbGF0ZSBmb3IgdGhlIHNoYWRvdworICAgIC8vIG9iamVjdC4gIFJl
dXNlIHRoZSBnbG9iYWwgb2JqZWN0IGlmIG9uZSBoYXMgYmVlbiBjcmVhdGVkIGVhcmxpZXIuCisg
ICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdFRlbXBsYXRlPiBnbG9iYWxUZW1wbGF0ZSA9IFY4
RE9NV2luZG93OjpHZXRTaGFkb3dPYmplY3RUZW1wbGF0ZSgpOworICAgIGlmIChnbG9iYWxUZW1w
bGF0ZS5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAvLyBJbnN0YWxs
IGEgc2VjdXJpdHkgaGFuZGxlciB3aXRoIFY4LgorICAgIGdsb2JhbFRlbXBsYXRlLT5TZXRBY2Nl
c3NDaGVja0NhbGxiYWNrcyhWOEN1c3RvbTo6djhET01XaW5kb3dOYW1lZFNlY3VyaXR5Q2hlY2ss
IFY4Q3VzdG9tOjp2OERPTVdpbmRvd0luZGV4ZWRTZWN1cml0eUNoZWNrLCB2ODo6SW50ZWdlcjo6
TmV3KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XKSk7CisKKyAgICAvLyBEeW5hbWljYWxseSB0ZWxs
IHY4IGFib3V0IG91ciBleHRlbnNpb25zIG5vdy4KKyAgICBjb25zdCBjaGFyKiogZXh0ZW5zaW9u
TmFtZXMgPSBuZXcgY29uc3QgY2hhcipbbV9leHRlbnNpb25zLnNpemUoKV07CisgICAgaW50IGlu
ZGV4ID0gMDsKKyAgICBmb3IgKFY4RXh0ZW5zaW9uTGlzdDo6aXRlcmF0b3IgaXQgPSBtX2V4dGVu
c2lvbnMuYmVnaW4oKTsgaXQgIT0gbV9leHRlbnNpb25zLmVuZCgpOyArK2l0KSB7CisgICAgICAg
IC8vIE5vdGU6IHdlIGNoZWNrIHRoZSBsb2FkZXIgVVJMIGhlcmUgaW5zdGVhZCBvZiB0aGUgZG9j
dW1lbnQgVVJMCisgICAgICAgIC8vIGJlY2F1c2Ugd2UgbWlnaHQgYmUgY3VycmVudGx5IGxvYWRp
bmcgYW4gVVJMIGludG8gYSBibGFuayBwYWdlLgorICAgICAgICAvLyBTZWUgaHR0cDovL2NvZGUu
Z29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTA5MjQKKyAgICAgICAgaWYg
KGl0LT5zY2hlbWUubGVuZ3RoKCkgPiAwICYmIChpdC0+c2NoZW1lICE9IG1fZnJhbWUtPmxvYWRl
cigpLT5hY3RpdmVEb2N1bWVudExvYWRlcigpLT51cmwoKS5wcm90b2NvbCgpIHx8IGl0LT5zY2hl
bWUgIT0gbV9mcmFtZS0+cGFnZSgpLT5tYWluRnJhbWUoKS0+bG9hZGVyKCktPmFjdGl2ZURvY3Vt
ZW50TG9hZGVyKCktPnVybCgpLnByb3RvY29sKCkpKQorICAgICAgICAgICAgY29udGludWU7CisK
KyAgICAgICAgZXh0ZW5zaW9uTmFtZXNbaW5kZXgrK10gPSBpdC0+ZXh0ZW5zaW9uLT5uYW1lKCk7
CisgICAgfQorICAgIHY4OjpFeHRlbnNpb25Db25maWd1cmF0aW9uIGV4dGVuc2lvbnMoaW5kZXgs
IGV4dGVuc2lvbk5hbWVzKTsKKyAgICByZXN1bHQgPSB2ODo6Q29udGV4dDo6TmV3KCZleHRlbnNp
b25zLCBnbG9iYWxUZW1wbGF0ZSwgZ2xvYmFsKTsKKyAgICBkZWxldGVbXSBleHRlbnNpb25OYW1l
czsKKyAgICBleHRlbnNpb25OYW1lcyA9IDA7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisv
LyBDcmVhdGUgYSBuZXcgZW52aXJvbm1lbnQgYW5kIHNldHVwIHRoZSBnbG9iYWwgb2JqZWN0Lgor
Ly8KKy8vIFRoZSBnbG9iYWwgb2JqZWN0IGNvcnJlc3BvbmRzIHRvIGEgRE9NV2luZG93IGluc3Rh
bmNlLiAgSG93ZXZlciwgdG8KKy8vIGFsbG93IHByb3BlcnRpZXMgb2YgdGhlIEpTIERPTVdpbmRv
dyBpbnN0YW5jZSB0byBiZSBzaGFkb3dlZCwgd2UKKy8vIHVzZSBhIHNoYWRvdyBvYmplY3QgYXMg
dGhlIGdsb2JhbCBvYmplY3QgYW5kIHVzZSB0aGUgSlMgRE9NV2luZG93CisvLyBpbnN0YW5jZSBh
cyB0aGUgcHJvdG90eXBlIGZvciB0aGF0IHNoYWRvdyBvYmplY3QuICBUaGUgSlMgRE9NV2luZG93
CisvLyBpbnN0YW5jZSBpcyB1bmRldGVjdGFibGUgZnJvbSBqYXZhc2NyaXB0IGNvZGUgYmVjYXVz
ZSB0aGUgX19wcm90b19fCisvLyBhY2Nlc3NvcnMgc2tpcCB0aGF0IG9iamVjdC4KKy8vCisvLyBU
aGUgc2hhZG93IG9iamVjdCBhbmQgdGhlIERPTVdpbmRvdyBpbnN0YW5jZSBhcmUgc2VlbiBhcyBv
bmUgb2JqZWN0CisvLyBmcm9tIGphdmFzY3JpcHQuICBUaGUgamF2YXNjcmlwdCBvYmplY3QgdGhh
dCBjb3JyZXNwb25kcyB0byBhCisvLyBET01XaW5kb3cgaW5zdGFuY2UgaXMgdGhlIHNoYWRvdyBv
YmplY3QuICBXaGVuIG1hcHBpbmcgYSBET01XaW5kb3cKKy8vIGluc3RhbmNlIHRvIGEgVjggb2Jq
ZWN0LCB3ZSByZXR1cm4gdGhlIHNoYWRvdyBvYmplY3QuCisvLworLy8gVG8gaW1wbGVtZW50IHNw
bGl0LXdpbmRvdywgc2VlCisvLyAgIDEpIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0xNzI0OQorLy8gICAyKSBodHRwczovL3dpa2kubW96aWxsYS5vcmcvR2Vja286U3Bs
aXRXaW5kb3cKKy8vICAgMykgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9Mjk2NjM5CisvLyB3ZSBuZWVkIHRvIHNwbGl0IHRoZSBzaGFkb3cgb2JqZWN0IGZ1cnRo
ZXIgaW50byB0d28gb2JqZWN0czoKKy8vIGFuIG91dGVyIHdpbmRvdyBhbmQgYW4gaW5uZXIgd2lu
ZG93LiBUaGUgaW5uZXIgd2luZG93IGlzIHRoZSBoaWRkZW4KKy8vIHByb3RvdHlwZSBvZiB0aGUg
b3V0ZXIgd2luZG93LiBUaGUgaW5uZXIgd2luZG93IGlzIHRoZSBkZWZhdWx0CisvLyBnbG9iYWwg
b2JqZWN0IG9mIHRoZSBjb250ZXh0LiBBIHZhcmlhYmxlIGRlY2xhcmVkIGluIHRoZSBnbG9iYWwK
Ky8vIHNjb3BlIGlzIGEgcHJvcGVydHkgb2YgdGhlIGlubmVyIHdpbmRvdy4KKy8vCisvLyBUaGUg
b3V0ZXIgd2luZG93IHN0aWNrcyB0byBhIEZyYW1lLCBpdCBpcyBleHBvc2VkIHRvIEphdmFTY3Jp
cHQKKy8vIHZpYSB3aW5kb3cud2luZG93LCB3aW5kb3cuc2VsZiwgd2luZG93LnBhcmVudCwgZXRj
LiBUaGUgb3V0ZXIgd2luZG93CisvLyBoYXMgYSBzZWN1cml0eSB0b2tlbiB3aGljaCBpcyB0aGUg
ZG9tYWluLiBUaGUgb3V0ZXIgd2luZG93IGNhbm5vdAorLy8gaGF2ZSBpdHMgb3duIHByb3BlcnRp
ZXMuIHdpbmRvdy5mb28gPSAneCcgaXMgZGVsZWdhdGVkIHRvIHRoZQorLy8gaW5uZXIgd2luZG93
LgorLy8KKy8vIFdoZW4gYSBmcmFtZSBuYXZpZ2F0ZXMgdG8gYSBuZXcgcGFnZSwgdGhlIGlubmVy
IHdpbmRvdyBpcyBjdXQgb2ZmCisvLyB0aGUgb3V0ZXIgd2luZG93LCBhbmQgdGhlIG91dGVyIHdp
bmRvdyBpZGVudGlmeSBpcyBwcmVzZXJ2ZWQgZm9yCisvLyB0aGUgZnJhbWUuIEhvd2V2ZXIsIGEg
bmV3IGlubmVyIHdpbmRvdyBpcyBjcmVhdGVkIGZvciB0aGUgbmV3IHBhZ2UuCisvLyBJZiB0aGVy
ZSBhcmUgSlMgY29kZSBob2xkcyBhIGNsb3N1cmUgdG8gdGhlIG9sZCBpbm5lciB3aW5kb3csCisv
LyBpdCB3b24ndCBiZSBhYmxlIHRvIHJlYWNoIHRoZSBvdXRlciB3aW5kb3cgdmlhIGl0cyBnbG9i
YWwgb2JqZWN0Lgordm9pZCBWOFByb3h5Ojppbml0Q29udGV4dElmTmVlZGVkKCkKK3sKKyAgICAv
LyBCYWlsIG91dCBpZiB0aGUgY29udGV4dCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgor
ICAgIGlmICghbV9jb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8g
Q3JlYXRlIGEgaGFuZGxlIHNjb3BlIGZvciBhbGwgbG9jYWwgaGFuZGxlcy4KKyAgICB2ODo6SGFu
ZGxlU2NvcGUgaGFuZGxlU2NvcGU7CisKKyAgICAvLyBTZXR1cCB0aGUgc2VjdXJpdHkgaGFuZGxl
cnMgYW5kIG1lc3NhZ2UgbGlzdGVuZXIuICBUaGlzIG9ubHkgaGFzCisgICAgLy8gdG8gYmUgZG9u
ZSBvbmNlLgorICAgIERFRklORV9TVEFUSUNfTE9DQUwoYm9vbCwgaXNWOEluaXRpYWxpemVkLCAo
ZmFsc2UpKTsKKyAgICBpZiAoIWlzVjhJbml0aWFsaXplZCkgeworICAgICAgICAvLyBUZWxscyBW
OCBub3QgdG8gY2FsbCB0aGUgZGVmYXVsdCBPT00gaGFuZGxlciwgYmluZGluZyBjb2RlCisgICAg
ICAgIC8vIHdpbGwgaGFuZGxlIGl0LgorICAgICAgICB2ODo6Vjg6Oklnbm9yZU91dE9mTWVtb3J5
RXhjZXB0aW9uKCk7CisgICAgICAgIHY4OjpWODo6U2V0RmF0YWxFcnJvckhhbmRsZXIocmVwb3J0
RmF0YWxFcnJvckluVjgpOworCisgICAgICAgIHY4OjpWODo6U2V0R2xvYmFsR0NQcm9sb2d1ZUNh
bGxiYWNrKCZnY1Byb2xvZ3VlKTsKKyAgICAgICAgdjg6OlY4OjpTZXRHbG9iYWxHQ0VwaWxvZ3Vl
Q2FsbGJhY2soJmdjRXBpbG9ndWUpOworCisgICAgICAgIHY4OjpWODo6QWRkTWVzc2FnZUxpc3Rl
bmVyKGhhbmRsZUNvbnNvbGVNZXNzYWdlKTsKKworICAgICAgICB2ODo6Vjg6OlNldEZhaWxlZEFj
Y2Vzc0NoZWNrQ2FsbGJhY2tGdW5jdGlvbihyZXBvcnRVbnNhZmVKYXZhU2NyaXB0QWNjZXNzKTsK
KworICAgICAgICBpc1Y4SW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIG1fY29udGV4
dCA9IGNyZWF0ZU5ld0NvbnRleHQobV9nbG9iYWwpOworICAgIGlmIChtX2NvbnRleHQuSXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBTdGFydGluZyBmcm9tIG5vdywgdXNlIGxv
Y2FsIGNvbnRleHQgb25seS4KKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9
IGNvbnRleHQoKTsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dFNjb3BlKHY4Q29udGV4
dCk7CisKKyAgICAvLyBTdG9yZSB0aGUgZmlyc3QgZ2xvYmFsIG9iamVjdCBjcmVhdGVkIHNvIHdl
IGNhbiByZXVzZSBpdC4KKyAgICBpZiAobV9nbG9iYWwuSXNFbXB0eSgpKSB7CisgICAgICAgIG1f
Z2xvYmFsID0gdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyh2OENvbnRleHQtPkdsb2Jh
bCgpKTsKKyAgICAgICAgLy8gQmFpbCBvdXQgaWYgYWxsb2NhdGlvbiBvZiB0aGUgZmlyc3QgZ2xv
YmFsIG9iamVjdHMgZmFpbHMuCisgICAgICAgIGlmIChtX2dsb2JhbC5Jc0VtcHR5KCkpIHsKKyAg
ICAgICAgICBkaXNwb3NlQ29udGV4dEhhbmRsZXMoKTsKKyAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIHJlZ2lzdGVyR2xvYmFsSGFuZGxlKFBST1hZ
LCB0aGlzLCBtX2dsb2JhbCk7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSBzdHJp
bmdzIHVzZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICAgIHY4OjpIYW5kbGU8djg6OlN0cmlu
Zz4gb2JqZWN0U3RyaW5nID0gdjg6OlN0cmluZzo6TmV3KCJPYmplY3QiKTsKKyAgICB2ODo6SGFu
ZGxlPHY4OjpTdHJpbmc+IHByb3RvdHlwZVN0cmluZyA9IHY4OjpTdHJpbmc6Ok5ldygicHJvdG90
eXBlIik7CisgICAgdjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBpbXBsaWNpdFByb3RvU3RyaW5nID0g
djg6OlN0cmluZzo6TmV3KCJfX3Byb3RvX18iKTsKKyAgICAvLyBCYWlsIG91dCBpZiBhbGxvY2F0
aW9uIGZhaWxlZC4KKyAgICBpZiAob2JqZWN0U3RyaW5nLklzRW1wdHkoKSB8fCBwcm90b3R5cGVT
dHJpbmcuSXNFbXB0eSgpIHx8IGltcGxpY2l0UHJvdG9TdHJpbmcuSXNFbXB0eSgpKSB7CisgICAg
ICAgIGRpc3Bvc2VDb250ZXh0SGFuZGxlcygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgLy8gQWxsb2NhdGUgY2xvbmUgY2FjaGUgYW5kIHByZS1hbGxvY2F0ZWQgb2JqZWN0cworICAg
IHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6
Q2FzdChtX2dsb2JhbC0+R2V0KG9iamVjdFN0cmluZykpOworICAgIG1fb2JqZWN0UHJvdG90eXBl
ID0gdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPjo6TmV3KG9iamVjdC0+R2V0KHByb3RvdHlwZVN0
cmluZykpOworICAgIG1fd3JhcHBlckJvaWxlcnBsYXRlcyA9IHY4OjpQZXJzaXN0ZW50PHY4OjpB
cnJheT46Ok5ldyh2ODo6QXJyYXk6Ok5ldyhWOENsYXNzSW5kZXg6OldSQVBQRVJfVFlQRV9DT1VO
VCkpOworICAgIC8vIEJhaWwgb3V0IGlmIGFsbG9jYXRpb24gZmFpbGVkLgorICAgIGlmIChtX29i
amVjdFByb3RvdHlwZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgZGlzcG9zZUNvbnRleHRIYW5kbGVz
KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWZuZGVmIE5ERUJVRworICAgIHJlZ2lzdGVy
R2xvYmFsSGFuZGxlKFBST1hZLCB0aGlzLCBtX29iamVjdFByb3RvdHlwZSk7CisgICAgcmVnaXN0
ZXJHbG9iYWxIYW5kbGUoUFJPWFksIHRoaXMsIG1fd3JhcHBlckJvaWxlcnBsYXRlcyk7CisjZW5k
aWYKKworICAgIC8vIENyZWF0ZSBhIG5ldyBKUyB3aW5kb3cgb2JqZWN0IGFuZCB1c2UgaXQgYXMg
dGhlIHByb3RvdHlwZSBmb3IgdGhlCisgICAgLy8gc2hhZG93IGdsb2JhbCBvYmplY3QuCisgICAg
djg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+IHdpbmRvd0NvbnN0cnVjdG9yID0gZ2V0Q29uc3RydWN0
b3IoVjhDbGFzc0luZGV4OjpET01XSU5ET1cpOworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBq
c1dpbmRvdyA9IFNhZmVBbGxvY2F0aW9uOjpuZXdJbnN0YW5jZSh3aW5kb3dDb25zdHJ1Y3Rvcik7
CisgICAgLy8gQmFpbCBvdXQgaWYgYWxsb2NhdGlvbiBmYWlsZWQuCisgICAgaWYgKGpzV2luZG93
LklzRW1wdHkoKSkgeworICAgICAgICBkaXNwb3NlQ29udGV4dEhhbmRsZXMoKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIERPTVdpbmRvdyogd2luZG93ID0gbV9mcmFtZS0+ZG9tV2lu
ZG93KCk7CisKKyAgICAvLyBXcmFwIHRoZSB3aW5kb3cuCisgICAgc2V0RE9NV3JhcHBlcihqc1dp
bmRvdywgVjhDbGFzc0luZGV4OjpUb0ludChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVyksIHdpbmRv
dyk7CisKKyAgICB3aW5kb3ctPnJlZigpOworICAgIFY4UHJveHk6OnNldEpTV3JhcHBlckZvckRP
TU9iamVjdCh3aW5kb3csIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcoanNXaW5kb3cp
KTsKKworICAgIC8vIEluc2VydCB0aGUgd2luZG93IGluc3RhbmNlIGFzIHRoZSBwcm90b3R5cGUg
b2YgdGhlIHNoYWRvdyBvYmplY3QuCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB2OF9nbG9i
YWwgPSB2OENvbnRleHQtPkdsb2JhbCgpOworICAgIHY4X2dsb2JhbC0+U2V0KGltcGxpY2l0UHJv
dG9TdHJpbmcsIGpzV2luZG93KTsKKworICAgIHVwZGF0ZURvY3VtZW50KCk7CisKKyAgICBzZXRT
ZWN1cml0eVRva2VuKCk7CisKKyAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+ZGlzcGF0Y2hXaW5kb3dP
YmplY3RBdmFpbGFibGUoKTsKK30KKworCit2b2lkIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihp
bnQgZXhjZXB0aW9uQ29kZSkKK3sKKyAgICBpZiAoZXhjZXB0aW9uQ29kZSA8PSAwKQorICAgICAg
ICByZXR1cm47CisKKyAgICBFeGNlcHRpb25Db2RlRGVzY3JpcHRpb24gZGVzY3JpcHRpb247Cisg
ICAgZ2V0RXhjZXB0aW9uQ29kZURlc2NyaXB0aW9uKGV4Y2VwdGlvbkNvZGUsIGRlc2NyaXB0aW9u
KTsKKworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBleGNlcHRpb247CisgICAgc3dpdGNoIChk
ZXNjcmlwdGlvbi50eXBlKSB7CisgICAgY2FzZSBET01FeGNlcHRpb25UeXBlOgorICAgICAgICBz
ZXRET01FeGNlcHRpb25IZWxwZXIoVjhDbGFzc0luZGV4OjpET01DT1JFRVhDRVBUSU9OLCBET01D
b3JlRXhjZXB0aW9uOjpjcmVhdGUoZGVzY3JpcHRpb24pKTsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBSYW5nZUV4Y2VwdGlvblR5cGU6CisgICAgICAgIHNldERPTUV4Y2VwdGlvbkhlbHBlcihW
OENsYXNzSW5kZXg6OlJBTkdFRVhDRVBUSU9OLCBSYW5nZUV4Y2VwdGlvbjo6Y3JlYXRlKGRlc2Ny
aXB0aW9uKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXZlbnRFeGNlcHRpb25UeXBlOgor
ICAgICAgICBzZXRET01FeGNlcHRpb25IZWxwZXIoVjhDbGFzc0luZGV4OjpFVkVOVEVYQ0VQVElP
TiwgRXZlbnRFeGNlcHRpb246OmNyZWF0ZShkZXNjcmlwdGlvbikpOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIFhNTEh0dHBSZXF1ZXN0RXhjZXB0aW9uVHlwZToKKyAgICAgICAgc2V0RE9NRXhj
ZXB0aW9uSGVscGVyKFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RFWENFUFRJT04sIFhNTEh0
dHBSZXF1ZXN0RXhjZXB0aW9uOjpjcmVhdGUoZGVzY3JpcHRpb24pKTsKKyAgICAgICAgYnJlYWs7
CisjaWYgRU5BQkxFKFNWRykKKyAgICBjYXNlIFNWR0V4Y2VwdGlvblR5cGU6CisgICAgICAgIHNl
dERPTUV4Y2VwdGlvbkhlbHBlcihWOENsYXNzSW5kZXg6OlNWR0VYQ0VQVElPTiwgU1ZHRXhjZXB0
aW9uOjpjcmVhdGUoZGVzY3JpcHRpb24pKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBk
ZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7Cisj
aWYgRU5BQkxFKFhQQVRIKQorICAgIGNhc2UgWFBhdGhFeGNlcHRpb25UeXBlOgorICAgICAgICBl
eGNlcHRpb24gPSBjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlhQQVRIRVhDRVBUSU9O
LCBYUGF0aEV4Y2VwdGlvbjo6Y3JlYXRlKGRlc2NyaXB0aW9uKSk7CisgICAgICAgIGJyZWFrOwor
I2VuZGlmCisgICAgfQorCisgICAgQVNTRVJUKCFleGNlcHRpb24uSXNFbXB0eSgpKTsKKyAgICB2
ODo6VGhyb3dFeGNlcHRpb24oZXhjZXB0aW9uKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+
IFY4UHJveHk6OnRocm93RXJyb3IoRXJyb3JUeXBlIHR5cGUsIGNvbnN0IGNoYXIqIG1lc3NhZ2Up
Cit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBSQU5HRV9FUlJPUjoKKyAgICAgICAg
cmV0dXJuIHY4OjpUaHJvd0V4Y2VwdGlvbih2ODo6RXhjZXB0aW9uOjpSYW5nZUVycm9yKHY4U3Ry
aW5nKG1lc3NhZ2UpKSk7CisgICAgY2FzZSBSRUZFUkVOQ0VfRVJST1I6CisgICAgICAgIHJldHVy
biB2ODo6VGhyb3dFeGNlcHRpb24odjg6OkV4Y2VwdGlvbjo6UmVmZXJlbmNlRXJyb3IodjhTdHJp
bmcobWVzc2FnZSkpKTsKKyAgICBjYXNlIFNZTlRBWF9FUlJPUjoKKyAgICAgICAgcmV0dXJuIHY4
OjpUaHJvd0V4Y2VwdGlvbih2ODo6RXhjZXB0aW9uOjpTeW50YXhFcnJvcih2OFN0cmluZyhtZXNz
YWdlKSkpOworICAgIGNhc2UgVFlQRV9FUlJPUjoKKyAgICAgICAgcmV0dXJuIHY4OjpUaHJvd0V4
Y2VwdGlvbih2ODo6RXhjZXB0aW9uOjpUeXBlRXJyb3IodjhTdHJpbmcobWVzc2FnZSkpKTsKKyAg
ICBjYXNlIEdFTkVSQUxfRVJST1I6CisgICAgICAgIHJldHVybiB2ODo6VGhyb3dFeGNlcHRpb24o
djg6OkV4Y2VwdGlvbjo6RXJyb3IodjhTdHJpbmcobWVzc2FnZSkpKTsKKyAgICBkZWZhdWx0Ogor
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRC
eUludGVyY2VwdG9yKCk7CisgICAgfQorfQorCit2ODo6TG9jYWw8djg6OkNvbnRleHQ+IFY4UHJv
eHk6OmNvbnRleHQoRnJhbWUqIGZyYW1lKQoreworICAgIFY4UHJveHkqIHByb3h5ID0gcmV0cmll
dmUoZnJhbWUpOworICAgIGlmICghcHJveHkpCisgICAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6
OkNvbnRleHQ+KCk7CisKKyAgICBwcm94eS0+aW5pdENvbnRleHRJZk5lZWRlZCgpOworICAgIHJl
dHVybiBwcm94eS0+Y29udGV4dCgpOworfQorCit2ODo6TG9jYWw8djg6OkNvbnRleHQ+IFY4UHJv
eHk6OmN1cnJlbnRDb250ZXh0KCkKK3sKKyAgICByZXR1cm4gdjg6OkNvbnRleHQ6OkdldEN1cnJl
bnQoKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6OmNvbnZlcnRUb1Y4T2Jq
ZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBpbXBsKQoreworICAg
IEFTU0VSVCh0eXBlICE9IFY4Q2xhc3NJbmRleDo6RVZFTlRMSVNURU5FUik7CisgICAgQVNTRVJU
KHR5cGUgIT0gVjhDbGFzc0luZGV4OjpFVkVOVFRBUkdFVCk7CisgICAgQVNTRVJUKHR5cGUgIT0g
VjhDbGFzc0luZGV4OjpFVkVOVCk7CisKKyAgICBib29sIGlzQWN0aXZlRG9tT2JqZWN0ID0gZmFs
c2U7CisgICAgc3dpdGNoICh0eXBlKSB7CisjZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBOQU1FKSBj
YXNlIFY4Q2xhc3NJbmRleDo6VFlQRToKKyAgICAgICAgRE9NX05PREVfVFlQRVMoTUFLRV9DQVNF
KQorI2lmIEVOQUJMRShTVkcpCisgICAgICAgIFNWR19OT0RFX1RZUEVTKE1BS0VfQ0FTRSkKKyNl
bmRpZgorICAgICAgICByZXR1cm4gY29udmVydE5vZGVUb1Y4T2JqZWN0KHN0YXRpY19jYXN0PE5v
ZGUqPihpbXBsKSk7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkNTU1ZBTFVFOgorICAgICAgICBy
ZXR1cm4gY29udmVydENTU1ZhbHVlVG9WOE9iamVjdChzdGF0aWNfY2FzdDxDU1NWYWx1ZSo+KGlt
cGwpKTsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q1NTUlVMRToKKyAgICAgICAgcmV0dXJuIGNv
bnZlcnRDU1NSdWxlVG9WOE9iamVjdChzdGF0aWNfY2FzdDxDU1NSdWxlKj4oaW1wbCkpOworICAg
IGNhc2UgVjhDbGFzc0luZGV4OjpTVFlMRVNIRUVUOgorICAgICAgICByZXR1cm4gY29udmVydFN0
eWxlU2hlZXRUb1Y4T2JqZWN0KHN0YXRpY19jYXN0PFN0eWxlU2hlZXQqPihpbXBsKSk7CisgICAg
Y2FzZSBWOENsYXNzSW5kZXg6OkRPTVdJTkRPVzoKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRXaW5k
b3dUb1Y4T2JqZWN0KHN0YXRpY19jYXN0PERPTVdpbmRvdyo+KGltcGwpKTsKKyNpZiBFTkFCTEUo
U1ZHKQorICAgICAgICBTVkdfTk9OTk9ERV9UWVBFUyhNQUtFX0NBU0UpCisgICAgICAgIGlmICh0
eXBlID09IFY4Q2xhc3NJbmRleDo6U1ZHRUxFTUVOVElOU1RBTkNFKQorICAgICAgICAgICAgcmV0
dXJuIGNvbnZlcnRTVkdFbGVtZW50SW5zdGFuY2VUb1Y4T2JqZWN0KHN0YXRpY19jYXN0PFNWR0Vs
ZW1lbnRJbnN0YW5jZSo+KGltcGwpKTsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRTVkdPYmplY3RX
aXRoQ29udGV4dFRvVjhPYmplY3QodHlwZSwgaW1wbCk7CisjZW5kaWYKKworICAgICAgICBBQ1RJ
VkVfRE9NX09CSkVDVF9UWVBFUyhNQUtFX0NBU0UpCisgICAgICAgIGlzQWN0aXZlRG9tT2JqZWN0
ID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7Cisg
IH0KKworI3VuZGVmIE1BS0VfQ0FTRQorCisgICAgaWYgKCFpbXBsKQorICAgICAgICByZXR1cm4g
djg6Ok51bGwoKTsKKworICAgIC8vIE5vbiBET00gbm9kZQorICAgIHY4OjpQZXJzaXN0ZW50PHY4
OjpPYmplY3Q+IHJlc3VsdCA9IGlzQWN0aXZlRG9tT2JqZWN0ID8gZ2V0QWN0aXZlRE9NT2JqZWN0
TWFwKCkuZ2V0KGltcGwpIDogZ2V0RE9NT2JqZWN0TWFwKCkuZ2V0KGltcGwpOworICAgIGlmIChy
ZXN1bHQuSXNFbXB0eSgpKSB7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB2OE9iamVj
dCA9IGluc3RhbnRpYXRlVjhPYmplY3QodHlwZSwgdHlwZSwgaW1wbCk7CisgICAgICAgIGlmICgh
djhPYmplY3QuSXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBHbyB0aHJvdWdoIGJpZyBzd2l0
Y2ggc3RhdGVtZW50LCBpdCBoYXMgc29tZSBkdXBsaWNhdGlvbnMKKyAgICAgICAgICAgIC8vIHRo
YXQgd2VyZSBoYW5kbGVkIGJ5IGNvZGUgYWJvdmUgKHN1Y2ggYXMgQ1NTVkFMVUUsIENTU1JVTEUs
IGV0YykuCisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyNkZWZpbmUgTUFLRV9DQVNFKFRZ
UEUsIE5BTUUpIFwKKyAgICAgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpUWVBFOiBzdGF0aWNf
Y2FzdDxOQU1FKj4oaW1wbCktPnJlZigpOyBicmVhazsKKyAgICAgICAgICAgICAgICBET01fT0JK
RUNUX1RZUEVTKE1BS0VfQ0FTRSkKKyN1bmRlZiBNQUtFX0NBU0UKKyAgICAgICAgICAgIGRlZmF1
bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICByZXN1bHQgPSB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHY4
T2JqZWN0KTsKKyAgICAgICAgICAgIGlmIChpc0FjdGl2ZURvbU9iamVjdCkKKyAgICAgICAgICAg
ICAgICBzZXRKU1dyYXBwZXJGb3JBY3RpdmVET01PYmplY3QoaW1wbCwgcmVzdWx0KTsKKyAgICAg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzZXRKU1dyYXBwZXJGb3JET01PYmplY3QoaW1w
bCwgcmVzdWx0KTsKKworICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBub24tbm9kZSBv
YmplY3RzIGFzc29jaWF0ZWQgd2l0aCBhCisgICAgICAgICAgICAvLyBET01XaW5kb3cuIEJvdGgg
U2FmYXJpIGFuZCBGRiBsZXQgdGhlIEpTIHdyYXBwZXJzIGZvciB0aGVzZQorICAgICAgICAgICAg
Ly8gb2JqZWN0cyBzdXJ2aXZlIEdDLiBUbyBtaW1pYyB0aGVpciBiZWhhdmlvciwgVjggY3JlYXRl
cworICAgICAgICAgICAgLy8gaGlkZGVuIHJlZmVyZW5jZXMgZnJvbSB0aGUgRE9NV2luZG93IHRv
IHRoZXNlIHdyYXBwZXIKKyAgICAgICAgICAgIC8vIG9iamVjdHMuIFRoZXNlIHJlZmVyZW5jZXMg
Z2V0IGNsZWFyZWQgd2hlbiB0aGUgRE9NV2luZG93IGlzCisgICAgICAgICAgICAvLyByZXVzZWQg
YnkgYSBuZXcgcGFnZS4KKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAg
Y2FzZSBWOENsYXNzSW5kZXg6OkNPTlNPTEU6CisgICAgICAgICAgICAgICAgc2V0SGlkZGVuV2lu
ZG93UmVmZXJlbmNlKHN0YXRpY19jYXN0PENvbnNvbGUqPihpbXBsKS0+ZnJhbWUoKSwgVjhDdXN0
b206OmtET01XaW5kb3dDb25zb2xlSW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SElTVE9SWToKKyAgICAgICAgICAg
ICAgICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2Uoc3RhdGljX2Nhc3Q8SGlzdG9yeSo+KGltcGwp
LT5mcmFtZSgpLCBWOEN1c3RvbTo6a0RPTVdpbmRvd0hpc3RvcnlJbmRleCwgcmVzdWx0KTsKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpOQVZJ
R0FUT1I6CisgICAgICAgICAgICAgICAgc2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKHN0YXRpY19j
YXN0PE5hdmlnYXRvcio+KGltcGwpLT5mcmFtZSgpLCBWOEN1c3RvbTo6a0RPTVdpbmRvd05hdmln
YXRvckluZGV4LCByZXN1bHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
Y2FzZSBWOENsYXNzSW5kZXg6OlNDUkVFTjoKKyAgICAgICAgICAgICAgICBzZXRIaWRkZW5XaW5k
b3dSZWZlcmVuY2Uoc3RhdGljX2Nhc3Q8U2NyZWVuKj4oaW1wbCktPmZyYW1lKCksIFY4Q3VzdG9t
OjprRE9NV2luZG93U2NyZWVuSW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6TE9DQVRJT046CisgICAgICAgICAgICAg
ICAgc2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKHN0YXRpY19jYXN0PExvY2F0aW9uKj4oaW1wbCkt
PmZyYW1lKCksIFY4Q3VzdG9tOjprRE9NV2luZG93TG9jYXRpb25JbmRleCwgcmVzdWx0KTsKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpET01T
RUxFQ1RJT046CisgICAgICAgICAgICAgICAgc2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKHN0YXRp
Y19jYXN0PERPTVNlbGVjdGlvbio+KGltcGwpLT5mcmFtZSgpLCBWOEN1c3RvbTo6a0RPTVdpbmRv
d0RPTVNlbGVjdGlvbkluZGV4LCByZXN1bHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OkJBUklORk86IHsKKyAgICAgICAgICAgICAgICBC
YXJJbmZvKiBiYXJJbmZvID0gc3RhdGljX2Nhc3Q8QmFySW5mbyo+KGltcGwpOworICAgICAgICAg
ICAgICAgIEZyYW1lKiBmcmFtZSA9IGJhckluZm8tPmZyYW1lKCk7CisgICAgICAgICAgICAgICAg
c3dpdGNoIChiYXJJbmZvLT50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJhckluZm86
OkxvY2F0aW9uYmFyOgorICAgICAgICAgICAgICAgICAgICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVu
Y2UoZnJhbWUsIFY4Q3VzdG9tOjprRE9NV2luZG93TG9jYXRpb25iYXJJbmRleCwgcmVzdWx0KTsK
KyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCYXJJbmZv
OjpNZW51YmFyOgorICAgICAgICAgICAgICAgICAgICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2Uo
ZnJhbWUsIFY4Q3VzdG9tOjprRE9NV2luZG93TWVudWJhckluZGV4LCByZXN1bHQpOworICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJhckluZm86OlBlcnNv
bmFsYmFyOgorICAgICAgICAgICAgICAgICAgICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2UoZnJh
bWUsIFY4Q3VzdG9tOjprRE9NV2luZG93UGVyc29uYWxiYXJJbmRleCwgcmVzdWx0KTsKKyAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCYXJJbmZvOjpTY3Jv
bGxiYXJzOgorICAgICAgICAgICAgICAgICAgICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2UoZnJh
bWUsIFY4Q3VzdG9tOjprRE9NV2luZG93U2Nyb2xsYmFyc0luZGV4LCByZXN1bHQpOworICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJhckluZm86OlN0YXR1
c2JhcjoKKyAgICAgICAgICAgICAgICAgICAgc2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKGZyYW1l
LCBWOEN1c3RvbTo6a0RPTVdpbmRvd1N0YXR1c2JhckluZGV4LCByZXN1bHQpOworICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJhckluZm86OlRvb2xiYXI6
CisgICAgICAgICAgICAgICAgICAgIHNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShmcmFtZSwgVjhD
dXN0b206OmtET01XaW5kb3dUb29sYmFySW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30K
Kwordm9pZCBWOFByb3h5OjpzZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2UoRnJhbWUqIGZyYW1lLCBj
b25zdCBpbnQgaW50ZXJuYWxJbmRleCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBqc09iamVjdCkK
K3sKKyAgICAvLyBHZXQgRE9NV2luZG93CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJu
OyAgLy8gT2JqZWN0IG1pZ2h0IGJlIGRldGFjaGVkIGZyb20gd2luZG93CisgICAgdjg6OkhhbmRs
ZTx2ODo6Q29udGV4dD4gdjhDb250ZXh0ID0gY29udGV4dChmcmFtZSk7CisgICAgaWYgKHY4Q29u
dGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVChpbnRlcm5hbElu
ZGV4IDwgVjhDdXN0b206OmtET01XaW5kb3dJbnRlcm5hbEZpZWxkQ291bnQpOworCisgICAgdjg6
OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwgPSB2OENvbnRleHQtPkdsb2JhbCgpOworICAgIC8v
IExvb2sgZm9yIHJlYWwgRE9NIHdyYXBwZXIuCisgICAgZ2xvYmFsID0gbG9va3VwRE9NV3JhcHBl
cihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgZ2xvYmFsKTsKKyAgICBBU1NFUlQoIWdsb2JhbC5J
c0VtcHR5KCkpOworICAgIEFTU0VSVChnbG9iYWwtPkdldEludGVybmFsRmllbGQoaW50ZXJuYWxJ
bmRleCktPklzVW5kZWZpbmVkKCkpOworICAgIGdsb2JhbC0+U2V0SW50ZXJuYWxGaWVsZChpbnRl
cm5hbEluZGV4LCBqc09iamVjdCk7Cit9CisKK1Y4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBW
OFByb3h5Ojpkb21XcmFwcGVyVHlwZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCkKK3sK
KyAgICBBU1NFUlQobWF5YmVET01XcmFwcGVyKG9iamVjdCkpOworICAgIHY4OjpIYW5kbGU8djg6
OlZhbHVlPiB0eXBlID0gb2JqZWN0LT5HZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprRE9NV3Jh
cHBlclR5cGVJbmRleCk7CisgICAgcmV0dXJuIFY4Q2xhc3NJbmRleDo6RnJvbUludCh0eXBlLT5J
bnQzMlZhbHVlKCkpOworfQorCit2b2lkKiBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3RJ
bXBsKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gb2JqZWN0KQoreworICAgIC8vIE5hdGl2ZSBldmVudCBsaXN0ZW5lciBpcyBwZXIgZnJhbWUs
IGl0IGNhbm5vdCBiZSBoYW5kbGVkIGJ5IHRoaXMgZ2VuZXJpYyBmdW5jdGlvbi4KKyAgICBBU1NF
UlQodHlwZSAhPSBWOENsYXNzSW5kZXg6OkVWRU5UTElTVEVORVIpOworICAgIEFTU0VSVCh0eXBl
ICE9IFY4Q2xhc3NJbmRleDo6RVZFTlRUQVJHRVQpOworCisgICAgQVNTRVJUKG1heWJlRE9NV3Jh
cHBlcihvYmplY3QpKTsKKworICAgIHN3aXRjaCAodHlwZSkgeworI2RlZmluZSBNQUtFX0NBU0Uo
VFlQRSwgTkFNRSkgY2FzZSBWOENsYXNzSW5kZXg6OlRZUEU6CisgICAgICAgIERPTV9OT0RFX1RZ
UEVTKE1BS0VfQ0FTRSkKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBTVkdfTk9ERV9UWVBFUyhN
QUtFX0NBU0UpCisjZW5kaWYKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAg
IHJldHVybiAwOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVDoKKyAgICAg
ICAgcmV0dXJuIGNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8WE1MSHR0cFJlcXVlc3Q+KG9iamVj
dCk7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkVWRU5UOgorICAgICAgICByZXR1cm4gY29udmVy
dERPTVdyYXBwZXJUb05hdGl2ZTxFdmVudD4ob2JqZWN0KTsKKyAgICBjYXNlIFY4Q2xhc3NJbmRl
eDo6Q1NTUlVMRToKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8Q1NT
UnVsZT4ob2JqZWN0KTsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisjdW5k
ZWYgTUFLRV9DQVNFCisKKyAgICByZXR1cm4gY29udmVydERPTVdyYXBwZXJUb05hdGl2ZTx2b2lk
PihvYmplY3QpOworfQorCisKK3ZvaWQqIFY4UHJveHk6OmNvbnZlcnRUb1NWR1BPRFR5cGVJbXBs
KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4g
b2JqZWN0KQoreworICAgIHJldHVybiBpc1dyYXBwZXJPZlR5cGUob2JqZWN0LCB0eXBlKSA/IGNv
bnZlcnRET01XcmFwcGVyVG9OYXRpdmU8dm9pZD4ob2JqZWN0KSA6IDA7Cit9CisKK3Y4OjpIYW5k
bGU8djg6Ok9iamVjdD4gVjhQcm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OlY4
V3JhcHBlclR5cGUgdHlwZSwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQoreworICAgIGlm
ICh2YWx1ZS5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRv
cigpOworCisgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gZGVzY3JpcHRvciA9
IFY4UHJveHk6OmdldFRlbXBsYXRlKHR5cGUpOworICAgIHdoaWxlICh2YWx1ZS0+SXNPYmplY3Qo
KSkgeworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpIYW5kbGU8
djg6Ok9iamVjdD46OkNhc3QodmFsdWUpOworICAgICAgICBpZiAoZGVzY3JpcHRvci0+SGFzSW5z
dGFuY2Uob2JqZWN0KSkKKyAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CisKKyAgICAgICAgdmFs
dWUgPSBvYmplY3QtPkdldFByb3RvdHlwZSgpOworICAgIH0KKyAgICByZXR1cm4gbm90SGFuZGxl
ZEJ5SW50ZXJjZXB0b3IoKTsKK30gCisKK3ZvaWQqIFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVy
VG9Ob2RlSGVscGVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKK3sKKyAgICBBU1NFUlQo
bWF5YmVET01XcmFwcGVyKHZhbHVlKSk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9i
amVjdCA9IHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodmFsdWUpOworCisgICAgQVNTRVJU
KGRvbVdyYXBwZXJUeXBlKG9iamVjdCkgPT0gVjhDbGFzc0luZGV4OjpOT0RFKTsKKworICAgIHY4
OjpIYW5kbGU8djg6OlZhbHVlPiB3cmFwcGVyID0gb2JqZWN0LT5HZXRJbnRlcm5hbEZpZWxkKFY4
Q3VzdG9tOjprRE9NV3JhcHBlck9iamVjdEluZGV4KTsKKyAgICByZXR1cm4gZXh0cmFjdENQb2lu
dGVyPE5vZGU+KHdyYXBwZXIpOworfQorCitQYXNzUmVmUHRyPE5vZGVGaWx0ZXI+IFY4UHJveHk6
OndyYXBOYXRpdmVOb2RlRmlsdGVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBmaWx0ZXIpCit7Cisg
ICAgLy8gQSBOb2RlRmlsdGVyIGlzIHVzZWQgd2hlbiB3YWxraW5nIHRocm91Z2ggYSBET00gdHJl
ZSBvciBpdGVyYXRpbmcgdHJlZQorICAgIC8vIG5vZGVzLgorICAgIC8vIEZJWE1FOiB3ZSBtYXkg
d2FudCB0byBjYWNoZSBOb2RlRmlsdGVyQ29uZGl0aW9uIGFuZCBOb2RlRmlsdGVyCisgICAgLy8g
b2JqZWN0LCBidXQgaXQgaXMgbWlub3IuCisgICAgLy8gTm9kZUZpbHRlciBpcyBwYXNzZWQgdG8g
Tm9kZUl0ZXJhdG9yIHRoYXQgaGFzIGEgcmVmIGNvdW50ZWQgcG9pbnRlcgorICAgIC8vIHRvIE5v
ZGVGaWx0ZXIuIE5vZGVGaWx0ZXIgaGFzIGEgcmVmIGNvdW50ZWQgcG9pbnRlciB0byBOb2RlRmls
dGVyQ29uZGl0aW9uLgorICAgIC8vIEluIE5vZGVGaWx0ZXJDb25kaXRpb24sIGZpbHRlciBvYmpl
Y3QgaXMgcGVyc2lzdGVkIGluIGl0cyBjb25zdHJ1Y3RvciwKKyAgICAvLyBhbmQgZGlzcG9zZWQg
aW4gaXRzIGRlc3RydWN0b3IuCisgICAgaWYgKCFmaWx0ZXItPklzRnVuY3Rpb24oKSkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBOb2RlRmlsdGVyQ29uZGl0aW9uKiBjb25kaXRpb24gPSBuZXcg
VjhOb2RlRmlsdGVyQ29uZGl0aW9uKGZpbHRlcik7CisgICAgcmV0dXJuIE5vZGVGaWx0ZXI6OmNy
ZWF0ZShjb25kaXRpb24pOworfQorCit2ODo6TG9jYWw8djg6Ok9iamVjdD4gVjhQcm94eTo6aW5z
dGFudGlhdGVWOE9iamVjdChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgZGVzY3JpcHRvclR5
cGUsIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBjcHRyVHlwZSwgdm9pZCogaW1wbCkKK3sK
KyAgICAvLyBNYWtlIGEgc3BlY2lhbCBjYXNlIGZvciBkb2N1bWVudC5hbGwKKyAgICBpZiAoZGVz
Y3JpcHRvclR5cGUgPT0gVjhDbGFzc0luZGV4OjpIVE1MQ09MTEVDVElPTiAmJiBzdGF0aWNfY2Fz
dDxIVE1MQ29sbGVjdGlvbio+KGltcGwpLT50eXBlKCkgPT0gRG9jQWxsKQorICAgICAgICBkZXNj
cmlwdG9yVHlwZSA9IFY4Q2xhc3NJbmRleDo6VU5ERVRFQ1RBQkxFSFRNTENPTExFQ1RJT047CisK
KyAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKCk7CisgICAgdjg6OkxvY2Fs
PHY4OjpPYmplY3Q+IGluc3RhbmNlOworICAgIGlmIChwcm94eSkKKyAgICAgICAgaW5zdGFuY2Ug
PSBwcm94eS0+Y3JlYXRlV3JhcHBlckZyb21DYWNoZShkZXNjcmlwdG9yVHlwZSk7CisgICAgZWxz
ZSB7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IGZ1bmN0aW9uID0gZ2V0VGVtcGxh
dGUoZGVzY3JpcHRvclR5cGUpLT5HZXRGdW5jdGlvbigpOworICAgICAgICBpbnN0YW5jZSA9IFNh
ZmVBbGxvY2F0aW9uOjpuZXdJbnN0YW5jZShmdW5jdGlvbik7CisgICAgfQorICAgIGlmICghaW5z
dGFuY2UuSXNFbXB0eSgpKSB7CisgICAgICAgIC8vIEF2b2lkIHNldHRpbmcgdGhlIERPTSB3cmFw
cGVyIGZvciBmYWlsZWQgYWxsb2NhdGlvbnMuCisgICAgICAgIHNldERPTVdyYXBwZXIoaW5zdGFu
Y2UsIFY4Q2xhc3NJbmRleDo6VG9JbnQoY3B0clR5cGUpLCBpbXBsKTsKKyAgICB9CisgICAgcmV0
dXJuIGluc3RhbmNlOworfQorCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y2hlY2tO
ZXdMZWdhbChjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKQoreworICAgIGlmICghQWxsb3dBbGxv
Y2F0aW9uOjptX2N1cnJlbnQpCisgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKFRZUEVfRVJST1Is
ICJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7CisKKyAgICByZXR1cm4gYXJncy5UaGlzKCk7Cit9CisK
K3ZvaWQgVjhQcm94eTo6c2V0RE9NV3JhcHBlcih2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVj
dCwgaW50IHR5cGUsIHZvaWQqIGNwdHIpCit7CisgICAgQVNTRVJUKG9iamVjdC0+SW50ZXJuYWxG
aWVsZENvdW50KCkgPj0gMik7CisgICAgb2JqZWN0LT5TZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9t
OjprRE9NV3JhcHBlck9iamVjdEluZGV4LCB3cmFwQ1BvaW50ZXIoY3B0cikpOworICAgIG9iamVj
dC0+U2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RPTVdyYXBwZXJUeXBlSW5kZXgsIHY4OjpJ
bnRlZ2VyOjpOZXcodHlwZSkpOworfQorCisjaWZuZGVmIE5ERUJVRworYm9vbCBWOFByb3h5Ojpt
YXliZURPTVdyYXBwZXIodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQoreworICAgIGlmICh2
YWx1ZS5Jc0VtcHR5KCkgfHwgIXZhbHVlLT5Jc09iamVjdCgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpIYW5kbGU8djg6
Ok9iamVjdD46OkNhc3QodmFsdWUpOworICAgIGlmICghb2JqZWN0LT5JbnRlcm5hbEZpZWxkQ291
bnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQVNTRVJUKG9iamVjdC0+SW50ZXJu
YWxGaWVsZENvdW50KCkgPj0gVjhDdXN0b206OmtEZWZhdWx0V3JhcHBlckludGVybmFsRmllbGRD
b3VudCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdHlwZSA9IG9iamVjdC0+R2V0SW50
ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RPTVdyYXBwZXJUeXBlSW5kZXgpOworICAgIEFTU0VSVCh0
eXBlLT5Jc0ludDMyKCkpOworICAgIEFTU0VSVChWOENsYXNzSW5kZXg6OklOVkFMSURfQ0xBU1Nf
SU5ERVggPCB0eXBlLT5JbnQzMlZhbHVlKCkgJiYgdHlwZS0+SW50MzJWYWx1ZSgpIDwgVjhDbGFz
c0luZGV4OjpDTEFTU0lOREVYX0VORCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3Jh
cHBlciA9IG9iamVjdC0+R2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RPTVdyYXBwZXJPYmpl
Y3RJbmRleCk7CisgICAgQVNTRVJUKHdyYXBwZXItPklzTnVtYmVyKCkgfHwgd3JhcHBlci0+SXNF
eHRlcm5hbCgpKTsKKworICAgIHJldHVybiB0cnVlOworfQorI2VuZGlmCisKK2Jvb2wgVjhQcm94
eTo6aXNET01FdmVudFdyYXBwZXIodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQoreworICAg
IC8vIEFsbCBraW5kcyBvZiBldmVudHMgdXNlIEVWRU5UIGFzIGRvbSB0eXBlIGluIEpTIHdyYXBw
ZXJzLgorICAgIC8vIFNlZSBFdmVudFRvVjhPYmplY3QKKyAgICByZXR1cm4gaXNXcmFwcGVyT2ZU
eXBlKHZhbHVlLCBWOENsYXNzSW5kZXg6OkVWRU5UKTsKK30KKworYm9vbCBWOFByb3h5Ojppc1dy
YXBwZXJPZlR5cGUodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlLCBWOENsYXNzSW5kZXg6OlY4
V3JhcHBlclR5cGUgY2xhc3NUeXBlKQoreworICAgIGlmICh2YWx1ZS5Jc0VtcHR5KCkgfHwgIXZh
bHVlLT5Jc09iamVjdCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodmFsdWUp
OworICAgIGlmICghb2JqZWN0LT5JbnRlcm5hbEZpZWxkQ291bnQoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgQVNTRVJUKG9iamVjdC0+SW50ZXJuYWxGaWVsZENvdW50KCkgPj0gVjhD
dXN0b206OmtEZWZhdWx0V3JhcHBlckludGVybmFsRmllbGRDb3VudCk7CisKKyAgICB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gd3JhcHBlciA9IG9iamVjdC0+R2V0SW50ZXJuYWxGaWVsZChWOEN1c3Rv
bTo6a0RPTVdyYXBwZXJPYmplY3RJbmRleCk7CisgICAgQVNTRVJUKHdyYXBwZXItPklzTnVtYmVy
KCkgfHwgd3JhcHBlci0+SXNFeHRlcm5hbCgpKTsKKworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiB0eXBlID0gb2JqZWN0LT5HZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprRE9NV3JhcHBlclR5
cGVJbmRleCk7CisgICAgQVNTRVJUKHR5cGUtPklzSW50MzIoKSk7CisgICAgQVNTRVJUKFY4Q2xh
c3NJbmRleDo6SU5WQUxJRF9DTEFTU19JTkRFWCA8IHR5cGUtPkludDMyVmFsdWUoKSAmJiB0eXBl
LT5JbnQzMlZhbHVlKCkgPCBWOENsYXNzSW5kZXg6OkNMQVNTSU5ERVhfRU5EKTsKKworICAgIHJl
dHVybiBWOENsYXNzSW5kZXg6OkZyb21JbnQodHlwZS0+SW50MzJWYWx1ZSgpKSA9PSBjbGFzc1R5
cGU7Cit9CisKKyNpZiBFTkFCTEUoVklERU8pCisjZGVmaW5lIEZPUl9FQUNIX1ZJREVPX1RBRyht
YWNybykgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYXVkaW8sIEFVRElPKSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oc291cmNlLCBTT1VSQ0UpICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odmlkZW8sIFZJREVPKQorI2Vsc2UKKyNkZWZp
bmUgRk9SX0VBQ0hfVklERU9fVEFHKG1hY3JvKQorI2VuZGlmCisKKyNkZWZpbmUgRk9SX0VBQ0hf
VEFHKG1hY3JvKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhhLCBBTkNIT1Ip
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhhcHBsZXQsIEFQUExF
VCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhhcmVhLCBBUkVBKSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhiYXNlLCBCQVNFKSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhiYXNlZm9udCwgQkFTRUZPTlQpICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhibG9ja3F1b3RlLCBCTE9DS1FVT1RFKSAg
ICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhib2R5LCBCT0RZKSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICBtYWNybyhiciwgQlIpICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFwKKyAgICBtYWNybyhidXR0b24sIEJVVFRPTikgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBtYWNybyhjYXB0aW9uLCBUQUJMRUNBUFRJT04pICAgICAgICAgICAgICAg
ICAgIFwKKyAgICBtYWNybyhjb2wsIFRBQkxFQ09MKSAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICBtYWNybyhjb2xncm91cCwgVEFCTEVDT0wpICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICBtYWNybyhkZWwsIE1PRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICBtYWNybyhjYW52YXMsIENBTlZBUykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBt
YWNybyhkaXIsIERJUkVDVE9SWSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNy
byhkaXYsIERJVikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhk
bCwgRExJU1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhlbWJl
ZCwgRU1CRUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhmaWVsZHNl
dCwgRklFTERTRVQpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhmb250LCBGT05U
KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhmb3JtLCBGT1JNKSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhmcmFtZSwgRlJBTUUpICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhmcmFtZXNldCwgRlJBTUVTRVQp
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhoMSwgSEVBRElORykgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhoMiwgSEVBRElORykgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhoMywgSEVBRElORykgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICBtYWNybyhoNCwgSEVBRElORykgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFwKKyAgICBtYWNybyhoNSwgSEVBRElORykgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBtYWNybyhoNiwgSEVBRElORykgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICBtYWNybyhoZWFkLCBIRUFEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICBtYWNybyhociwgSFIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICBtYWNybyhodG1sLCBIVE1MKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICBtYWNybyhpbWcsIElNQUdFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBt
YWNybyhpZnJhbWUsIElGUkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNy
byhpbWFnZSwgSU1BR0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhp
bnB1dCwgSU5QVVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhpbnMs
IE1PRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhpc2luZGV4
LCBJU0lOREVYKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhrZXlnZW4sIFNF
TEVDVCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhsYWJlbCwgTEFCRUwp
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhsZWdlbmQsIExFR0VORCkg
ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhsaSwgTEkpICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhsaW5rLCBMSU5LKSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhsaXN0aW5nLCBQUkUpICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhtYXAsIE1BUCkgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICBtYWNybyhtYXJxdWVlLCBNQVJRVUVFKSAgICAgICAgICAgICAg
ICAgICAgICAgIFwKKyAgICBtYWNybyhtZW51LCBNRU5VKSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBtYWNybyhtZXRhLCBNRVRBKSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICBtYWNybyhvYmplY3QsIE9CSkVDVCkgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICBtYWNybyhvbCwgT0xJU1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICBtYWNybyhvcHRncm91cCwgT1BUR1JPVVApICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICBtYWNybyhvcHRpb24sIE9QVElPTikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBt
YWNybyhwLCBQQVJBR1JBUEgpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNy
byhwYXJhbSwgUEFSQU0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhw
cmUsIFBSRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhxLCBR
VU9URSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhzY3JpcHQs
IFNDUklQVCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhzZWxlY3QsIFNF
TEVDVCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhzdHlsZSwgU1RZTEUp
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0YWJsZSwgVEFCTEUpICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0aGVhZCwgVEFCTEVTRUNUSU9O
KSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0Ym9keSwgVEFCTEVTRUNUSU9OKSAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0Zm9vdCwgVEFCTEVTRUNUSU9OKSAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0ZCwgVEFCTEVDRUxMKSAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0aCwgVEFCTEVDRUxMKSAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFwKKyAgICBtYWNybyh0ciwgVEFCTEVST1cpICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBtYWNybyh0ZXh0YXJlYSwgVEVYVEFSRUEpICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICBtYWNybyh0aXRsZSwgVElUTEUpICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICBtYWNybyh1bCwgVUxJU1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICBtYWNybyh4bXAsIFBSRSkKKworVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIFY4UHJv
eHk6Omh0bWxFbGVtZW50VHlwZShIVE1MRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICB0eXBlZGVm
IEhhc2hNYXA8U3RyaW5nLCBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGU+IFdyYXBwZXJUeXBl
TWFwOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoV3JhcHBlclR5cGVNYXAsIHdyYXBwZXJUeXBl
TWFwLCAoKSk7CisgICAgaWYgKHdyYXBwZXJUeXBlTWFwLmlzRW1wdHkoKSkgeworI2RlZmluZSBB
RERfVE9fSEFTSF9NQVAodGFnLCBuYW1lKSBcCisgICAgICAgIHdyYXBwZXJUeXBlTWFwLnNldCgj
dGFnLCBWOENsYXNzSW5kZXg6OkhUTUwjI25hbWUjI0VMRU1FTlQpOworICAgICAgICBGT1JfRUFD
SF9UQUcoQUREX1RPX0hBU0hfTUFQKQorI2lmIEVOQUJMRShWSURFTykKKyAgICAgICAgaWYgKE1l
ZGlhUGxheWVyOjppc0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICBGT1JfRUFDSF9WSURFT19U
QUcoQUREX1RPX0hBU0hfTUFQKQorICAgICAgICB9CisjZW5kaWYKKyN1bmRlZiBBRERfVE9fSEFT
SF9NQVAKKyAgICB9CisKKyAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IHdy
YXBwZXJUeXBlTWFwLmdldChlbGVtZW50LT5sb2NhbE5hbWUoKS5pbXBsKCkpOworICAgIGlmICgh
dHlwZSkKKyAgICAgICAgcmV0dXJuIFY4Q2xhc3NJbmRleDo6SFRNTEVMRU1FTlQ7CisgICAgcmV0
dXJuIHR5cGU7Cit9CisjdW5kZWYgRk9SX0VBQ0hfVEFHCisKKyNpZiBFTkFCTEUoU1ZHKQorCisj
aWYgRU5BQkxFKFNWR19BTklNQVRJT04pCisjZGVmaW5lIEZPUl9FQUNIX0FOSU1BVElPTl9UQUco
bWFjcm8pIFwKKyAgICBtYWNybyhhbmltYXRlQ29sb3IsIEFOSU1BVEVDT0xPUikgXAorICAgIG1h
Y3JvKGFuaW1hdGUsIEFOSU1BVEUpIFwKKyAgICBtYWNybyhhbmltYXRlVHJhbnNmb3JtLCBBTklN
QVRFVFJBTlNGT1JNKSBcCisgICAgbWFjcm8oc2V0LCBTRVQpCisjZWxzZQorI2RlZmluZSBGT1Jf
RUFDSF9BTklNQVRJT05fVEFHKG1hY3JvKQorI2VuZGlmCisKKyNpZiBFTkFCTEUoU1ZHX0ZJTFRF
UlMpCisjZGVmaW5lIEZPUl9FQUNIX0ZJTFRFUlNfVEFHKG1hY3JvKSBcCisgICAgbWFjcm8oZmVC
bGVuZCwgRkVCTEVORCkgXAorICAgIG1hY3JvKGZlQ29sb3JNYXRyaXgsIEZFQ09MT1JNQVRSSVgp
IFwKKyAgICBtYWNybyhmZUNvbXBvbmVudFRyYW5zZmVyLCBGRUNPTVBPTkVOVFRSQU5TRkVSKSBc
CisgICAgbWFjcm8oZmVDb21wb3NpdGUsIEZFQ09NUE9TSVRFKSBcCisgICAgbWFjcm8oZmVEaWZm
dXNlTGlnaHRpbmcsIEZFRElGRlVTRUxJR0hUSU5HKSBcCisgICAgbWFjcm8oZmVEaXNwbGFjZW1l
bnRNYXAsIEZFRElTUExBQ0VNRU5UTUFQKSBcCisgICAgbWFjcm8oZmVEaXN0YW50TGlnaHQsIEZF
RElTVEFOVExJR0hUKSBcCisgICAgbWFjcm8oZmVGbG9vZCwgRkVGTE9PRCkgXAorICAgIG1hY3Jv
KGZlRnVuY0EsIEZFRlVOQ0EpIFwKKyAgICBtYWNybyhmZUZ1bmNCLCBGRUZVTkNCKSBcCisgICAg
bWFjcm8oZmVGdW5jRywgRkVGVU5DRykgXAorICAgIG1hY3JvKGZlRnVuY1IsIEZFRlVOQ1IpIFwK
KyAgICBtYWNybyhmZUdhdXNzaWFuQmx1ciwgRkVHQVVTU0lBTkJMVVIpIFwKKyAgICBtYWNybyhm
ZUltYWdlLCBGRUlNQUdFKSBcCisgICAgbWFjcm8oZmVNZXJnZSwgRkVNRVJHRSkgXAorICAgIG1h
Y3JvKGZlTWVyZ2VOb2RlLCBGRU1FUkdFTk9ERSkgXAorICAgIG1hY3JvKGZlT2Zmc2V0LCBGRU9G
RlNFVCkgXAorICAgIG1hY3JvKGZlUG9pbnRMaWdodCwgRkVQT0lOVExJR0hUKSBcCisgICAgbWFj
cm8oZmVTcGVjdWxhckxpZ2h0aW5nLCBGRVNQRUNVTEFSTElHSFRJTkcpIFwKKyAgICBtYWNybyhm
ZVNwb3RMaWdodCwgRkVTUE9UTElHSFQpIFwKKyAgICBtYWNybyhmZVRpbGUsIEZFVElMRSkgXAor
ICAgIG1hY3JvKGZlVHVyYnVsZW5jZSwgRkVUVVJCVUxFTkNFKSBcCisgICAgbWFjcm8oZmlsdGVy
LCBGSUxURVIpCisjZWxzZQorI2RlZmluZSBGT1JfRUFDSF9GSUxURVJTX1RBRyhtYWNybykKKyNl
bmRpZgorCisjaWYgRU5BQkxFKFNWR19GT05UUykKKyNkZWZpbmUgRk9SX0VBQ0hfRk9OVFNfVEFH
KG1hY3JvKSBcCisgICAgbWFjcm8oZGVmaW5pdGlvbi1zcmMsIERFRklOSVRJT05TUkMpIFwKKyAg
ICBtYWNybyhmb250LWZhY2UsIEZPTlRGQUNFKSBcCisgICAgbWFjcm8oZm9udC1mYWNlLWZvcm1h
dCwgRk9OVEZBQ0VGT1JNQVQpIFwKKyAgICBtYWNybyhmb250LWZhY2UtbmFtZSwgRk9OVEZBQ0VO
QU1FKSBcCisgICAgbWFjcm8oZm9udC1mYWNlLXNyYywgRk9OVEZBQ0VTUkMpIFwKKyAgICBtYWNy
byhmb250LWZhY2UtdXJpLCBGT05URkFDRVVSSSkKKyNlbHNlCisjZGVmaW5lIEZPUl9FQUNIX0ZP
TlRTX1RBRyhtYXJjbykKKyNlbmRpZgorCisjaWYgRU5BQkxFKFNWR19GT1JFSUdOX09CSkVDVCkK
KyNkZWZpbmUgRk9SX0VBQ0hfRk9SRUlHTl9PQkpFQ1RfVEFHKG1hY3JvKSBcCisgICAgbWFjcm8o
Zm9yZWlnbk9iamVjdCwgRk9SRUlHTk9CSkVDVCkKKyNlbHNlCisjZGVmaW5lIEZPUl9FQUNIX0ZP
UkVJR05fT0JKRUNUX1RBRyhtYWNybykKKyNlbmRpZgorCisjaWYgRU5BQkxFKFNWR19VU0UpCisj
ZGVmaW5lIEZPUl9FQUNIX1VTRV9UQUcobWFjcm8pIFwKKyAgICBtYWNybyh1c2UsIFVTRSkKKyNl
bHNlCisjZGVmaW5lIEZPUl9FQUNIX1VTRV9UQUcobWFjcm8pCisjZW5kaWYKKworI2RlZmluZSBG
T1JfRUFDSF9UQUcobWFjcm8pIFwKKyAgICBGT1JfRUFDSF9BTklNQVRJT05fVEFHKG1hY3JvKSBc
CisgICAgRk9SX0VBQ0hfRklMVEVSU19UQUcobWFjcm8pIFwKKyAgICBGT1JfRUFDSF9GT05UU19U
QUcobWFjcm8pIFwKKyAgICBGT1JfRUFDSF9GT1JFSUdOX09CSkVDVF9UQUcobWFjcm8pIFwKKyAg
ICBGT1JfRUFDSF9VU0VfVEFHKG1hY3JvKSBcCisgICAgbWFjcm8oYSwgQSkgXAorICAgIG1hY3Jv
KGFsdEdseXBoLCBBTFRHTFlQSCkgXAorICAgIG1hY3JvKGNpcmNsZSwgQ0lSQ0xFKSBcCisgICAg
bWFjcm8oY2xpcFBhdGgsIENMSVBQQVRIKSBcCisgICAgbWFjcm8oY3Vyc29yLCBDVVJTT1IpIFwK
KyAgICBtYWNybyhkZWZzLCBERUZTKSBcCisgICAgbWFjcm8oZGVzYywgREVTQykgXAorICAgIG1h
Y3JvKGVsbGlwc2UsIEVMTElQU0UpIFwKKyAgICBtYWNybyhnLCBHKSBcCisgICAgbWFjcm8oZ2x5
cGgsIEdMWVBIKSBcCisgICAgbWFjcm8oaW1hZ2UsIElNQUdFKSBcCisgICAgbWFjcm8obGluZWFy
R3JhZGllbnQsIExJTkVBUkdSQURJRU5UKSBcCisgICAgbWFjcm8obGluZSwgTElORSkgXAorICAg
IG1hY3JvKG1hcmtlciwgTUFSS0VSKSBcCisgICAgbWFjcm8obWFzaywgTUFTSykgXAorICAgIG1h
Y3JvKG1ldGFkYXRhLCBNRVRBREFUQSkgXAorICAgIG1hY3JvKHBhdGgsIFBBVEgpIFwKKyAgICBt
YWNybyhwYXR0ZXJuLCBQQVRURVJOKSBcCisgICAgbWFjcm8ocG9seWxpbmUsIFBPTFlMSU5FKSBc
CisgICAgbWFjcm8ocG9seWdvbiwgUE9MWUdPTikgXAorICAgIG1hY3JvKHJhZGlhbEdyYWRpZW50
LCBSQURJQUxHUkFESUVOVCkgXAorICAgIG1hY3JvKHJlY3QsIFJFQ1QpIFwKKyAgICBtYWNybyhz
Y3JpcHQsIFNDUklQVCkgXAorICAgIG1hY3JvKHN0b3AsIFNUT1ApIFwKKyAgICBtYWNybyhzdHls
ZSwgU1RZTEUpIFwKKyAgICBtYWNybyhzdmcsIFNWRykgXAorICAgIG1hY3JvKHN3aXRjaCwgU1dJ
VENIKSBcCisgICAgbWFjcm8oc3ltYm9sLCBTWU1CT0wpIFwKKyAgICBtYWNybyh0ZXh0LCBURVhU
KSBcCisgICAgbWFjcm8odGV4dFBhdGgsIFRFWFRQQVRIKSBcCisgICAgbWFjcm8odGl0bGUsIFRJ
VExFKSBcCisgICAgbWFjcm8odHJlZiwgVFJFRikgXAorICAgIG1hY3JvKHRzcGFuLCBUU1BBTikg
XAorICAgIG1hY3JvKHZpZXcsIFZJRVcpIFwKKyAgICAvLyBlbmQgb2YgbWFjcm8KKworVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlIFY4UHJveHk6OnN2Z0VsZW1lbnRUeXBlKFNWR0VsZW1lbnQq
IGVsZW1lbnQpCit7CisgICAgdHlwZWRlZiBIYXNoTWFwPFN0cmluZywgVjhDbGFzc0luZGV4OjpW
OFdyYXBwZXJUeXBlPiBXcmFwcGVyVHlwZU1hcDsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFdy
YXBwZXJUeXBlTWFwLCB3cmFwcGVyVHlwZU1hcCwgKCkpOworICAgIGlmICh3cmFwcGVyVHlwZU1h
cC5pc0VtcHR5KCkpIHsKKyNkZWZpbmUgQUREX1RPX0hBU0hfTUFQKHRhZywgbmFtZSkgXAorICAg
ICAgICB3cmFwcGVyVHlwZU1hcC5zZXQoI3RhZywgVjhDbGFzc0luZGV4OjpTVkcjI25hbWUjI0VM
RU1FTlQpOworICAgICAgICBGT1JfRUFDSF9UQUcoQUREX1RPX0hBU0hfTUFQKQorI3VuZGVmIEFE
RF9UT19IQVNIX01BUAorICAgIH0KKworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0
eXBlID0gd3JhcHBlclR5cGVNYXAuZ2V0KGVsZW1lbnQtPmxvY2FsTmFtZSgpLmltcGwoKSk7Cisg
ICAgaWYgKCF0eXBlKQorICAgICAgICByZXR1cm4gVjhDbGFzc0luZGV4OjpTVkdFTEVNRU5UOwor
ICAgIHJldHVybiB0eXBlOworfQorI3VuZGVmIEZPUl9FQUNIX1RBRworCisjZW5kaWYgLy8gRU5B
QkxFKFNWRykKKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6OmNvbnZlcnRFdmVudFRv
VjhPYmplY3QoRXZlbnQqIGV2ZW50KQoreworICAgIGlmICghZXZlbnQpCisgICAgICAgIHJldHVy
biB2ODo6TnVsbCgpOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZ2V0
RE9NT2JqZWN0TWFwKCkuZ2V0KGV2ZW50KTsKKyAgICBpZiAoIXdyYXBwZXIuSXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm4gd3JhcHBlcjsKKworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlw
ZSB0eXBlID0gVjhDbGFzc0luZGV4OjpFVkVOVDsKKworICAgIGlmIChldmVudC0+aXNVSUV2ZW50
KCkpIHsKKyAgICAgICAgaWYgKGV2ZW50LT5pc0tleWJvYXJkRXZlbnQoKSkKKyAgICAgICAgICAg
IHR5cGUgPSBWOENsYXNzSW5kZXg6OktFWUJPQVJERVZFTlQ7CisgICAgICAgIGVsc2UgaWYgKGV2
ZW50LT5pc1RleHRFdmVudCgpKQorICAgICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6VEVY
VEVWRU5UOworICAgICAgICBlbHNlIGlmIChldmVudC0+aXNNb3VzZUV2ZW50KCkpCisgICAgICAg
ICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpNT1VTRUVWRU5UOworICAgICAgICBlbHNlIGlmIChl
dmVudC0+aXNXaGVlbEV2ZW50KCkpCisgICAgICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpX
SEVFTEVWRU5UOworI2lmIEVOQUJMRShTVkcpCisgICAgICAgIGVsc2UgaWYgKGV2ZW50LT5pc1NW
R1pvb21FdmVudCgpKQorICAgICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6U1ZHWk9PTUVW
RU5UOworI2VuZGlmCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5k
ZXg6OlVJRVZFTlQ7CisgICAgfSBlbHNlIGlmIChldmVudC0+aXNNdXRhdGlvbkV2ZW50KCkpCisg
ICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6Ok1VVEFUSU9ORVZFTlQ7CisgICAgZWxzZSBpZiAo
ZXZlbnQtPmlzT3ZlcmZsb3dFdmVudCgpKQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpP
VkVSRkxPV0VWRU5UOworICAgIGVsc2UgaWYgKGV2ZW50LT5pc01lc3NhZ2VFdmVudCgpKQorICAg
ICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpNRVNTQUdFRVZFTlQ7CisgICAgZWxzZSBpZiAoZXZl
bnQtPmlzUHJvZ3Jlc3NFdmVudCgpKSB7CisgICAgICAgIGlmIChldmVudC0+aXNYTUxIdHRwUmVx
dWVzdFByb2dyZXNzRXZlbnQoKSkKKyAgICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlhN
TEhUVFBSRVFVRVNUUFJPR1JFU1NFVkVOVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlw
ZSA9IFY4Q2xhc3NJbmRleDo6UFJPR1JFU1NFVkVOVDsKKyAgICB9IGVsc2UgaWYgKGV2ZW50LT5p
c1dlYktpdEFuaW1hdGlvbkV2ZW50KCkpCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OldF
QktJVEFOSU1BVElPTkVWRU5UOworICAgIGVsc2UgaWYgKGV2ZW50LT5pc1dlYktpdFRyYW5zaXRp
b25FdmVudCgpKQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpXRUJLSVRUUkFOU0lUSU9O
RVZFTlQ7CisKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gcmVzdWx0ID0gaW5zdGFudGlh
dGVWOE9iamVjdCh0eXBlLCBWOENsYXNzSW5kZXg6OkVWRU5ULCBldmVudCk7CisgICAgaWYgKHJl
c3VsdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gSW5zdGFudGlhdGlvbiBmYWlsZWQuIEF2b2lk
IHVwZGF0aW5nIHRoZSBET00gb2JqZWN0IG1hcCBhbmQKKyAgICAgICAgLy8gcmV0dXJuIG51bGwg
d2hpY2ggaXMgYWxyZWFkeSBoYW5kbGVkIGJ5IGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbgorICAg
ICAgICAvLyBpbiBjYXNlIHRoZSBldmVudCBpcyBOVUxMLgorICAgICAgICByZXR1cm4gdjg6Ok51
bGwoKTsKKyAgICB9CisKKyAgICBldmVudC0+cmVmKCk7ICAvLyBmYXN0IHJlZgorICAgIHNldEpT
V3JhcHBlckZvckRPTU9iamVjdChldmVudCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5l
dyhyZXN1bHQpKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIENhbGxlciBjaGVja3Mg
bm9kZSBpcyBub3QgbnVsbC4KK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpjb252ZXJ0
Tm9kZVRvVjhPYmplY3QoTm9kZSogbm9kZSkKK3sKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJl
dHVybiB2ODo6TnVsbCgpOworCisgICAgLy8gRmluZCB0aGUgY29udGV4dCB0byB3aGljaCB0aGUg
bm9kZSBiZWxvbmdzIGFuZCBjcmVhdGUgdGhlIHdyYXBwZXIKKyAgICAvLyBpbiB0aGF0IGNvbnRl
eHQuICBJZiB0aGUgbm9kZSBpcyBub3QgaW4gYSBkb2N1bWVudCwgdGhlIGN1cnJlbnQKKyAgICAv
LyBjb250ZXh0IGlzIHVzZWQuCisgICAgLy8KKyAgICAvLyBHZXR0aW5nIHRoZSBjb250ZXh0IG1p
Z2h0IGluaXRpYWxpemUgdGhlIGNvbnRleHQgd2hpY2ggY2FuIGluc3RhbnRpYXRlCisgICAgLy8g
YSBkb2N1bWVudCB3cmFwcGVyLiAgVGhlcmVmb3JlLCB3ZSBnZXQgdGhlIGNvbnRleHQgYmVmb3Jl
IGNoZWNraW5nIGlmCisgICAgLy8gdGhlIG5vZGUgYWxyZWFkeSBoYXMgYSB3cmFwcGVyLgorICAg
IHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gdjhDb250ZXh0OworICAgIERvY3VtZW50KiBkb2N1bWVu
dCA9IG5vZGUtPmRvY3VtZW50KCk7CisgICAgaWYgKGRvY3VtZW50KQorICAgICAgICB2OENvbnRl
eHQgPSBWOFByb3h5Ojpjb250ZXh0KGRvY3VtZW50LT5mcmFtZSgpKTsKKworICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gd3JhcHBlciA9IGdldERPTU5vZGVNYXAoKS5nZXQobm9kZSk7CisgICAg
aWYgKCF3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisKKyAgICBi
b29sIGlzRG9jdW1lbnQgPSBmYWxzZTsgIC8vIGRvY3VtZW50IHR5cGUgbm9kZSBoYXMgc3BlY2lh
bCBoYW5kbGluZworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlOworCisgICAg
c3dpdGNoIChub2RlLT5ub2RlVHlwZSgpKSB7CisgICAgY2FzZSBOb2RlOjpFTEVNRU5UX05PREU6
CisgICAgICAgIGlmIChub2RlLT5pc0hUTUxFbGVtZW50KCkpCisgICAgICAgICAgICB0eXBlID0g
aHRtbEVsZW1lbnRUeXBlKHN0YXRpY19jYXN0PEhUTUxFbGVtZW50Kj4obm9kZSkpOworI2lmIEVO
QUJMRShTVkcpCisgICAgICAgIGVsc2UgaWYgKG5vZGUtPmlzU1ZHRWxlbWVudCgpKQorICAgICAg
ICAgICAgdHlwZSA9IHN2Z0VsZW1lbnRUeXBlKHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihub2Rl
KSk7CisjZW5kaWYKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRl
eDo6RUxFTUVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlOjpBVFRSSUJVVEVfTk9E
RToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6QVRUUjsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBOb2RlOjpURVhUX05PREU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlRF
WFQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFOgor
ICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDREFUQVNFQ1RJT047CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgTm9kZTo6RU5USVRZX05PREU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5k
ZXg6OkVOVElUWTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlOjpQUk9DRVNTSU5HX0lO
U1RSVUNUSU9OX05PREU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlBST0NFU1NJTkdJ
TlNUUlVDVElPTjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlOjpDT01NRU5UX05PREU6
CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNPTU1FTlQ7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfTk9ERTogeworICAgICAgICBpc0RvY3VtZW50ID0gdHJ1
ZTsKKyAgICAgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gc3RhdGljX2Nhc3Q8RG9jdW1lbnQqPihu
b2RlKTsKKyAgICAgICAgaWYgKGRvY3VtZW50LT5pc0hUTUxEb2N1bWVudCgpKQorICAgICAgICAg
ICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6SFRNTERPQ1VNRU5UOworI2lmIEVOQUJMRShTVkcpCisg
ICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LT5pc1NWR0RvY3VtZW50KCkpCisgICAgICAgICAgICB0
eXBlID0gVjhDbGFzc0luZGV4OjpTVkdET0NVTUVOVDsKKyNlbmRpZgorICAgICAgICBlbHNlCisg
ICAgICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpET0NVTUVOVDsKKyAgICAgICAgYnJlYWs7
CisgICAgfQorICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfVFlQRV9OT0RFOgorICAgICAgICB0eXBl
ID0gVjhDbGFzc0luZGV4OjpET0NVTUVOVFRZUEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
Tm9kZTo6Tk9UQVRJT05fTk9ERToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Tk9UQVRJ
T047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfRlJBR01FTlRfTk9E
RToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6RE9DVU1FTlRGUkFHTUVOVDsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBOb2RlOjpFTlRJVFlfUkVGRVJFTkNFX05PREU6CisgICAgICAg
IHR5cGUgPSBWOENsYXNzSW5kZXg6OkVOVElUWVJFRkVSRU5DRTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgZGVmYXVsdDoKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Tk9ERTsKKyAgICB9CisK
KyAgICAvLyBFbnRlciB0aGUgbm9kZSdzIGNvbnRleHQgYW5kIGNyZWF0ZSB0aGUgd3JhcHBlciBp
biB0aGF0IGNvbnRleHQuCisgICAgaWYgKCF2OENvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICB2
OENvbnRleHQtPkVudGVyKCk7CisKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcmVzdWx0ID0g
aW5zdGFudGlhdGVWOE9iamVjdCh0eXBlLCBWOENsYXNzSW5kZXg6Ok5PREUsIG5vZGUpOworCisg
ICAgLy8gRXhpdCB0aGUgbm9kZSdzIGNvbnRleHQgaWYgaXQgd2FzIGVudGVyZWQuCisgICAgaWYg
KCF2OENvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICB2OENvbnRleHQtPkV4aXQoKTsKKworICAg
IGlmIChyZXN1bHQuSXNFbXB0eSgpKSB7CisgICAgICAgIC8vIElmIGluc3RhbnRpYXRpb24gZmFp
bGVkIGl0J3MgaW1wb3J0YW50IG5vdCB0byBhZGQgdGhlIHJlc3VsdAorICAgICAgICAvLyB0byB0
aGUgRE9NIG5vZGUgbWFwLiBJbnN0ZWFkIHdlIHJldHVybiBhbiBlbXB0eSBoYW5kbGUsIHdoaWNo
CisgICAgICAgIC8vIHNob3VsZCBhbHJlYWR5IGJlIGhhbmRsZWQgYnkgY2FsbGVycyBvZiB0aGlz
IGZ1bmN0aW9uIGluIGNhc2UKKyAgICAgICAgLy8gdGhlIG5vZGUgaXMgTlVMTC4KKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBub2RlLT5yZWYoKTsKKyAgICBzZXRKU1dyYXBw
ZXJGb3JET01Ob2RlKG5vZGUsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcocmVzdWx0
KSk7CisKKyAgICBpZiAoaXNEb2N1bWVudCkgeworICAgICAgICBEb2N1bWVudCogZG9jdW1lbnQg
PSBzdGF0aWNfY2FzdDxEb2N1bWVudCo+KG5vZGUpOworICAgICAgICBWOFByb3h5KiBwcm94eSA9
IFY4UHJveHk6OnJldHJpZXZlKGRvY3VtZW50LT5mcmFtZSgpKTsKKyAgICAgICAgaWYgKHByb3h5
KQorICAgICAgICAgICAgcHJveHktPnVwZGF0ZURvY3VtZW50V3JhcHBlcihyZXN1bHQpOworCisg
ICAgICAgIGlmICh0eXBlID09IFY4Q2xhc3NJbmRleDo6SFRNTERPQ1VNRU5UKSB7CisgICAgICAg
ICAgICAvLyBDcmVhdGUgbWFya2VyIG9iamVjdCBhbmQgaW5zZXJ0IGl0IGluIHR3byBpbnRlcm5h
bCBmaWVsZHMuCisgICAgICAgICAgICAvLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRlbXBv
cmFyeSBzaGFkb3dpbmcgb2YKKyAgICAgICAgICAgIC8vIGRvY3VtZW50LmFsbC4KKyAgICAgICAg
ICAgIEFTU0VSVChyZXN1bHQtPkludGVybmFsRmllbGRDb3VudCgpID09IFY4Q3VzdG9tOjprSFRN
TERvY3VtZW50SW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6
T2JqZWN0PiBtYXJrZXIgPSB2ODo6T2JqZWN0OjpOZXcoKTsKKyAgICAgICAgICAgIHJlc3VsdC0+
U2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0hUTUxEb2N1bWVudE1hcmtlckluZGV4LCBtYXJr
ZXIpOworICAgICAgICAgICAgcmVzdWx0LT5TZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprSFRN
TERvY3VtZW50U2hhZG93SW5kZXgsIG1hcmtlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBy
ZXR1cm4gcmVzdWx0OworfQorCisvLyBBIEpTIG9iamVjdCBvZiB0eXBlIEV2ZW50VGFyZ2V0IGNh
biBvbmx5IGJlIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgdHlwZXM6CisvLyAxKSBFdmVudFRhcmdl
dE5vZGU7IDIpIERPTVdpbmRvdyAzKSBYTUxIdHRwUmVxdWVzdDsgNCkgTWVzc2FnZVBvcnQ7Cisv
LyA1KSBYTUxIdHRwUmVxdWVzdFVwbG9hZAorLy8gY2hlY2sgRXZlbnRUYXJnZXQuaCBmb3IgbmV3
IHR5cGUgY29udmVyc2lvbiBtZXRob2RzCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6
Y29udmVydEV2ZW50VGFyZ2V0VG9WOE9iamVjdChFdmVudFRhcmdldCogdGFyZ2V0KQoreworICAg
IGlmICghdGFyZ2V0KQorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworI2lmIEVOQUJMRShT
VkcpCisgICAgU1ZHRWxlbWVudEluc3RhbmNlKiBpbnN0YW5jZSA9IHRhcmdldC0+dG9TVkdFbGVt
ZW50SW5zdGFuY2UoKTsKKyAgICBpZiAoaW5zdGFuY2UpCisgICAgICAgIHJldHVybiBjb252ZXJ0
VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNWR0VMRU1FTlRJTlNUQU5DRSwgaW5zdGFuY2UpOwor
I2VuZGlmCisKKyNpZiBFTkFCTEUoV09SS0VSUykKKyAgICBXb3JrZXIqIHdvcmtlciA9IHRhcmdl
dC0+dG9Xb3JrZXIoKTsKKyAgICBpZiAod29ya2VyKQorICAgICAgICByZXR1cm4gY29udmVydFRv
VjhPYmplY3QoVjhDbGFzc0luZGV4OjpXT1JLRVIsIHdvcmtlcik7CisjZW5kaWYgLy8gV09SS0VS
UworCisgICAgTm9kZSogbm9kZSA9IHRhcmdldC0+dG9Ob2RlKCk7CisgICAgaWYgKG5vZGUpCisg
ICAgICAgIHJldHVybiBjb252ZXJ0Tm9kZVRvVjhPYmplY3Qobm9kZSk7CisKKyAgICBpZiAoRE9N
V2luZG93KiBkb21XaW5kb3cgPSB0YXJnZXQtPnRvRE9NV2luZG93KCkpCisgICAgICAgIHJldHVy
biBjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgZG9tV2luZG93KTsK
KworICAgIC8vIFhNTEh0dHBSZXF1ZXN0IGlzIGNyZWF0ZWQgd2l0aGluIGl0cyBKUyBjb3VudGVy
cGFydC4KKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSB0YXJnZXQtPnRvWE1M
SHR0cFJlcXVlc3QoKTsKKyAgICBpZiAoeG1sSHR0cFJlcXVlc3QpIHsKKyAgICAgICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZ2V0QWN0aXZlRE9NT2JqZWN0TWFwKCkuZ2V0KHht
bEh0dHBSZXF1ZXN0KTsKKyAgICAgICAgQVNTRVJUKCF3cmFwcGVyLklzRW1wdHkoKSk7CisgICAg
ICAgIHJldHVybiB3cmFwcGVyOworICAgIH0KKworICAgIC8vIE1lc3NhZ2VQb3J0IGlzIGNyZWF0
ZWQgd2l0aGluIGl0cyBKUyBjb3VudGVycGFydAorICAgIE1lc3NhZ2VQb3J0KiBwb3J0ID0gdGFy
Z2V0LT50b01lc3NhZ2VQb3J0KCk7CisgICAgaWYgKHBvcnQpIHsKKyAgICAgICAgdjg6OkhhbmRs
ZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZ2V0QWN0aXZlRE9NT2JqZWN0TWFwKCkuZ2V0KHBvcnQp
OworICAgICAgICBBU1NFUlQoIXdyYXBwZXIuSXNFbXB0eSgpKTsKKyAgICAgICAgcmV0dXJuIHdy
YXBwZXI7CisgICAgfQorCisgICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHVwbG9hZCA9IHRhcmdl
dC0+dG9YTUxIdHRwUmVxdWVzdFVwbG9hZCgpOworICAgIGlmICh1cGxvYWQpIHsKKyAgICAgICAg
djg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZ2V0RE9NT2JqZWN0TWFwKCkuZ2V0KHVw
bG9hZCk7CisgICAgICAgIEFTU0VSVCghd3JhcHBlci5Jc0VtcHR5KCkpOworICAgICAgICByZXR1
cm4gd3JhcHBlcjsKKyAgICB9CisKKyAgICBBU1NFUlQoMCk7CisgICAgcmV0dXJuIG5vdEhhbmRs
ZWRCeUludGVyY2VwdG9yKCk7Cit9CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpj
b252ZXJ0RXZlbnRMaXN0ZW5lclRvVjhPYmplY3QoRXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpCit7
CisgICAgaWYgKCFsaXN0ZW5lcikKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICAv
LyBGSVhNRTogY2FuIGEgdXNlciB0YWtlIGEgbGF6eSBldmVudCBsaXN0ZW5lciBhbmQgc2V0IHRv
IG90aGVyIHBsYWNlcz8KKyAgICBWOEFic3RyYWN0RXZlbnRMaXN0ZW5lciogdjhsaXN0ZW5lciA9
IHN0YXRpY19jYXN0PFY4QWJzdHJhY3RFdmVudExpc3RlbmVyKj4obGlzdGVuZXIpOworICAgIHJl
dHVybiB2OGxpc3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOworfQorCit2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4gVjhQcm94eTo6Y29udmVydERPTUltcGxlbWVudGF0aW9uVG9WOE9iamVjdChET01J
bXBsZW1lbnRhdGlvbiogaW1wbCkKK3sKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJlc3Vs
dCA9IGluc3RhbnRpYXRlVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01JTVBMRU1FTlRBVElPTiwg
VjhDbGFzc0luZGV4OjpET01JTVBMRU1FTlRBVElPTiwgaW1wbCk7CisgICAgaWYgKHJlc3VsdC5J
c0VtcHR5KCkpIHsKKyAgICAgICAgLy8gSWYgdGhlIGluc3RhbnRpYXRpb24gZmFpbGVkLCB3ZSBp
Z25vcmUgaXQgYW5kIHJldHVybiBudWxsIGluc3RlYWQKKyAgICAgICAgLy8gb2YgcmV0dXJuaW5n
IGFuIGVtcHR5IGhhbmRsZS4KKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisgICAgfQorICAg
IHJldHVybiByZXN1bHQ7Cit9CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpjb252
ZXJ0U3R5bGVTaGVldFRvVjhPYmplY3QoU3R5bGVTaGVldCogc2hlZXQpCit7CisgICAgaWYgKCFz
aGVldCkKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+IHdyYXBwZXIgPSBnZXRET01PYmplY3RNYXAoKS5nZXQoc2hlZXQpOworICAgIGlmICgh
d3JhcHBlci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB3cmFwcGVyOworCisgICAgVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVQ7Cisg
ICAgaWYgKHNoZWV0LT5pc0NTU1N0eWxlU2hlZXQoKSkKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJ
bmRleDo6Q1NTU1RZTEVTSEVFVDsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gcmVzdWx0
ID0gaW5zdGFudGlhdGVWOE9iamVjdCh0eXBlLCBWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVQsIHNo
ZWV0KTsKKyAgICBpZiAoIXJlc3VsdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gT25seSB1cGRh
dGUgdGhlIERPTSBvYmplY3QgbWFwIGlmIHRoZSByZXN1bHQgaXMgbm9uLWVtcHR5LgorICAgICAg
ICBzaGVldC0+cmVmKCk7CisgICAgICAgIHNldEpTV3JhcHBlckZvckRPTU9iamVjdChzaGVldCwg
djg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhyZXN1bHQpKTsKKyAgICB9CisKKyAgICAv
LyBBZGQgYSBoaWRkZW4gcmVmZXJlbmNlIGZyb20gc3R5bGVzaGVldCBvYmplY3QgdG8gaXRzIG93
bmVyIG5vZGUuCisgICAgTm9kZSogb3duZXJOb2RlID0gc2hlZXQtPm93bmVyTm9kZSgpOworICAg
IGlmIChvd25lck5vZGUpIHsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvd25lciA9
IHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QoY29udmVydE5vZGVUb1Y4T2JqZWN0KG93bmVy
Tm9kZSkpOworICAgICAgICByZXN1bHQtPlNldEludGVybmFsRmllbGQoVjhDdXN0b206OmtTdHls
ZVNoZWV0T3duZXJOb2RlSW5kZXgsIG93bmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0
OworfQorCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y29udmVydENTU1ZhbHVlVG9W
OE9iamVjdChDU1NWYWx1ZSogdmFsdWUpCit7CisgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgcmV0
dXJuIHY4OjpOdWxsKCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBn
ZXRET01PYmplY3RNYXAoKS5nZXQodmFsdWUpOworICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkp
CisgICAgICAgIHJldHVybiB3cmFwcGVyOworCisgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJU
eXBlIHR5cGU7CisKKyAgICBpZiAodmFsdWUtPmlzV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUoKSkK
KyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6V0VCS0lUQ1NTVFJBTlNGT1JNVkFMVUU7Cisg
ICAgZWxzZSBpZiAodmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgIHR5cGUgPSBWOENsYXNz
SW5kZXg6OkNTU1ZBTFVFTElTVDsKKyAgICBlbHNlIGlmICh2YWx1ZS0+aXNQcmltaXRpdmVWYWx1
ZSgpKQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDU1NQUklNSVRJVkVWQUxVRTsKKyNp
ZiBFTkFCTEUoU1ZHKQorICAgIGVsc2UgaWYgKHZhbHVlLT5pc1NWR1BhaW50KCkpCisgICAgICAg
IHR5cGUgPSBWOENsYXNzSW5kZXg6OlNWR1BBSU5UOworICAgIGVsc2UgaWYgKHZhbHVlLT5pc1NW
R0NvbG9yKCkpCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlNWR0NPTE9SOworI2VuZGlm
CisgICAgZWxzZQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDU1NWQUxVRTsKKworICAg
IHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gcmVzdWx0ID0gaW5zdGFudGlhdGVWOE9iamVjdCh0eXBl
LCBWOENsYXNzSW5kZXg6OkNTU1ZBTFVFLCB2YWx1ZSk7CisgICAgaWYgKCFyZXN1bHQuSXNFbXB0
eSgpKSB7CisgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBET00gb2JqZWN0IG1hcCBpZiB0aGUg
cmVzdWx0IGlzIG5vbi1lbXB0eS4KKyAgICAgICAgdmFsdWUtPnJlZigpOworICAgICAgICBzZXRK
U1dyYXBwZXJGb3JET01PYmplY3QodmFsdWUsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpO
ZXcocmVzdWx0KSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IFY4UHJveHk6OmNvbnZlcnRDU1NSdWxlVG9WOE9iamVjdChDU1NSdWxlKiBy
dWxlKQoreworICAgIGlmICghcnVsZSkgCisgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisg
ICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZ2V0RE9NT2JqZWN0TWFwKCkuZ2V0
KHJ1bGUpOworICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB3cmFw
cGVyOworCisgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGU7CisKKyAgICBzd2l0
Y2ggKHJ1bGUtPnR5cGUoKSkgeworICAgIGNhc2UgQ1NTUnVsZTo6U1RZTEVfUlVMRToKKyAgICAg
ICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q1NTU1RZTEVSVUxFOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIENTU1J1bGU6OkNIQVJTRVRfUlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRl
eDo6Q1NTQ0hBUlNFVFJVTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NTUnVsZTo6SU1Q
T1JUX1JVTEU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU0lNUE9SVFJVTEU7Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NTUnVsZTo6TUVESUFfUlVMRToKKyAgICAgICAgdHlw
ZSA9IFY4Q2xhc3NJbmRleDo6Q1NTTUVESUFSVUxFOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IENTU1J1bGU6OkZPTlRfRkFDRV9SVUxFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpD
U1NGT05URkFDRVJVTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NTUnVsZTo6UEFHRV9S
VUxFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDU1NQQUdFUlVMRTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBDU1NSdWxlOjpWQVJJQUJMRVNfUlVMRToKKyAgICAgICAgdHlwZSA9
IFY4Q2xhc3NJbmRleDo6Q1NTVkFSSUFCTEVTUlVMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBDU1NSdWxlOjpXRUJLSVRfS0VZRlJBTUVfUlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJ
bmRleDo6V0VCS0lUQ1NTS0VZRlJBTUVSVUxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENT
U1J1bGU6OldFQktJVF9LRVlGUkFNRVNfUlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRl
eDo6V0VCS0lUQ1NTS0VZRlJBTUVTUlVMRTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDog
IC8vIENTU1J1bGU6OlVOS05PV05fUlVMRQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpD
U1NSVUxFOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmpl
Y3Q+IHJlc3VsdCA9IGluc3RhbnRpYXRlVjhPYmplY3QodHlwZSwgVjhDbGFzc0luZGV4OjpDU1NS
VUxFLCBydWxlKTsKKyAgICBpZiAoIXJlc3VsdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gT25s
eSB1cGRhdGUgdGhlIERPTSBvYmplY3QgbWFwIGlmIHRoZSByZXN1bHQgaXMgbm9uLWVtcHR5Lgor
ICAgICAgICBydWxlLT5yZWYoKTsKKyAgICAgICAgc2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KHJ1
bGUsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcocmVzdWx0KSk7CisgICAgfQorICAg
IHJldHVybiByZXN1bHQ7Cit9CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpjb252
ZXJ0V2luZG93VG9WOE9iamVjdChET01XaW5kb3cqIHdpbmRvdykKK3sKKyAgICBpZiAoIXdpbmRv
dykKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisgICAgLy8gSW5pdGlhbGl6ZXMgZW52aXJv
bm1lbnQgb2YgYSBmcmFtZSwgYW5kIHJldHVybiB0aGUgZ2xvYmFsIG9iamVjdAorICAgIC8vIG9m
IHRoZSBmcmFtZS4KKyAgICBGcmFtZSogZnJhbWUgPSB3aW5kb3ctPmZyYW1lKCk7CisgICAgaWYg
KCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4oKTsKKworICAg
IC8vIFNwZWNpYWwgY2FzZTogQmVjYXVzZSBvZiBldmFsdWF0ZUluTmV3Q29udGV4dCgpIG9uZSBE
T01XaW5kb3cgY2FuIGhhdmUKKyAgICAvLyBtdWx0aXBsZSBjb250ZXh0cyBhbmQgbXVsdGlwbGUg
Z2xvYmFsIG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIGl0LiBXaGVuCisgICAgLy8gY29kZSBydW5u
aW5nIGluIG9uZSBvZiB0aG9zZSBjb250ZXh0cyBhY2Nlc3NlcyB0aGUgd2luZG93IG9iamVjdCwg
d2UKKyAgICAvLyB3YW50IHRvIHJldHVybiB0aGUgZ2xvYmFsIG9iamVjdCBhc3NvY2lhdGVkIHdp
dGggdGhhdCBjb250ZXh0LCBub3QKKyAgICAvLyBuZWNlc3NhcmlseSB0aGUgZmlyc3QgZ2xvYmFs
IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhhdCBET01XaW5kb3cuCisgICAgdjg6OkhhbmRsZTx2
ODo6Q29udGV4dD4gY3VycmVudENvbnRleHQgPSB2ODo6Q29udGV4dDo6R2V0Q3VycmVudCgpOwor
ICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gY3VycmVudEdsb2JhbCA9IGN1cnJlbnRDb250ZXh0
LT5HbG9iYWwoKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdpbmRvd1dyYXBwZXIgPSBs
b29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBjdXJyZW50R2xvYmFsKTsK
KyAgICBpZiAoIXdpbmRvd1dyYXBwZXIuSXNFbXB0eSgpKSB7CisgICAgICAgIGlmIChjb252ZXJ0
RE9NV3JhcHBlclRvTmF0aXZlPERPTVdpbmRvdz4od2luZG93V3JhcHBlcikgPT0gd2luZG93KQor
ICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRHbG9iYWw7CisgICAgfQorCisgICAgLy8gT3RoZXJ3
aXNlLCByZXR1cm4gdGhlIGdsb2JhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnJhbWUu
CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gdjhDb250ZXh0ID0gY29udGV4dChmcmFtZSk7
CisgICAgaWYgKHY4Q29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+KCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGdsb2JhbCA9IHY4
Q29udGV4dC0+R2xvYmFsKCk7CisgICAgQVNTRVJUKCFnbG9iYWwuSXNFbXB0eSgpKTsKKyAgICBy
ZXR1cm4gZ2xvYmFsOworfQorCit2b2lkIFY4UHJveHk6OmJpbmRKc09iamVjdFRvV2luZG93KEZy
YW1lKiBmcmFtZSwgY29uc3QgY2hhciogbmFtZSwgaW50IHR5cGUsIHY4OjpIYW5kbGU8djg6OkZ1
bmN0aW9uVGVtcGxhdGU+IGRlc2NyaXB0b3IsIHZvaWQqIGltcGwpCit7CisgICAgLy8gR2V0IGVu
dmlyb25tZW50LgorICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9IFY4UHJv
eHk6OmNvbnRleHQoZnJhbWUpOworICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm47ICAvLyBKUyBub3QgZW5hYmxlZC4KKworICAgIHY4OjpDb250ZXh0OjpTY29wZSBz
Y29wZSh2OENvbnRleHQpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaW5zdGFuY2UgPSBk
ZXNjcmlwdG9yLT5HZXRGdW5jdGlvbigpOworICAgIHNldERPTVdyYXBwZXIoaW5zdGFuY2UsIHR5
cGUsIGltcGwpOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwgPSB2OENvbnRl
eHQtPkdsb2JhbCgpOworICAgIGdsb2JhbC0+U2V0KHY4OjpTdHJpbmc6Ok5ldyhuYW1lKSwgaW5z
dGFuY2UpOworfQorCit2b2lkIFY4UHJveHk6OnByb2Nlc3NDb25zb2xlTWVzc2FnZXMoKQorewor
ICAgIENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6cHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpOworfQor
CisvLyBDcmVhdGUgdGhlIHV0aWxpdHkgY29udGV4dCBmb3IgaG9sZGluZyBKYXZhU2NyaXB0IGZ1
bmN0aW9ucyB1c2VkIGludGVybmFsbHkKKy8vIHdoaWNoIGFyZSBub3QgdmlzaWJsZSB0byBKYXZh
U2NyaXB0IGV4ZWN1dGluZyBvbiB0aGUgcGFnZS4KK3ZvaWQgVjhQcm94eTo6Y3JlYXRlVXRpbGl0
eUNvbnRleHQoKQoreworICAgIEFTU0VSVChtX3V0aWxpdHlDb250ZXh0LklzRW1wdHkoKSk7CisK
KyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVt
cGxhdGU+IGdsb2JhbFRlbXBsYXRlID0gdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcoKTsKKyAgICBt
X3V0aWxpdHlDb250ZXh0ID0gdjg6OkNvbnRleHQ6Ok5ldygwLCBnbG9iYWxUZW1wbGF0ZSk7Cisg
ICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRTY29wZShtX3V0aWxpdHlDb250ZXh0KTsKKwor
ICAgIC8vIENvbXBpbGUgSmF2YVNjcmlwdCBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgc291
cmNlIGxpbmUgb2YgdGhlIHRvcAorICAgIC8vIEphdmFTY3JpcHQgc3RhY2sgZnJhbWUuCisgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBjaGFyKiwgZnJhbWVTb3VyY2VMaW5lU291cmNlLAor
ICAgICAgICAoImZ1bmN0aW9uIGZyYW1lU291cmNlTGluZShleGVjX3N0YXRlKSB7IgorICAgICAg
ICAiICByZXR1cm4gZXhlY19zdGF0ZS5mcmFtZSgwKS5zb3VyY2VMaW5lKCk7IgorICAgICAgICAi
fSIpKTsKKyAgICB2ODo6U2NyaXB0OjpDb21waWxlKHY4OjpTdHJpbmc6Ok5ldyhmcmFtZVNvdXJj
ZUxpbmVTb3VyY2UpKS0+UnVuKCk7CisKKyAgICAvLyBDb21waWxlIEphdmFTY3JpcHQgZnVuY3Rp
b24gZm9yIHJldHJpZXZpbmcgdGhlIHNvdXJjZSBuYW1lIG9mIHRoZSB0b3AKKyAgICAvLyBKYXZh
U2NyaXB0IHN0YWNrIGZyYW1lLgorICAgIERFRklORV9TVEFUSUNfTE9DQUwoY29uc3QgY2hhcios
IGZyYW1lU291cmNlTmFtZVNvdXJjZSwKKyAgICAgICAgKCJmdW5jdGlvbiBmcmFtZVNvdXJjZU5h
bWUoZXhlY19zdGF0ZSkgeyIKKyAgICAgICAgIiAgdmFyIGZyYW1lID0gZXhlY19zdGF0ZS5mcmFt
ZSgwKTsiCisgICAgICAgICIgIGlmIChmcmFtZS5mdW5jKCkucmVzb2x2ZWQoKSAmJiAiCisgICAg
ICAgICIgICAgICBmcmFtZS5mdW5jKCkuc2NyaXB0KCkgJiYgIgorICAgICAgICAiICAgICAgZnJh
bWUuZnVuYygpLnNjcmlwdCgpLm5hbWUoKSkgeyIKKyAgICAgICAgIiAgICByZXR1cm4gZnJhbWUu
ZnVuYygpLnNjcmlwdCgpLm5hbWUoKTsiCisgICAgICAgICIgIH0iCisgICAgICAgICJ9IikpOwor
ICAgIHY4OjpTY3JpcHQ6OkNvbXBpbGUodjg6OlN0cmluZzo6TmV3KGZyYW1lU291cmNlTmFtZVNv
dXJjZSkpLT5SdW4oKTsKK30KKworaW50IFY4UHJveHk6OnNvdXJjZUxpbmVOdW1iZXIoKQorewor
ICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB2
OFV0aWxpdHlDb250ZXh0ID0gVjhQcm94eTo6dXRpbGl0eUNvbnRleHQoKTsKKyAgICBpZiAodjhV
dGlsaXR5Q29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAwOworICAgIHY4OjpDb250
ZXh0OjpTY29wZSBjb250ZXh0U2NvcGUodjhVdGlsaXR5Q29udGV4dCk7CisgICAgdjg6OkhhbmRs
ZTx2ODo6RnVuY3Rpb24+IGZyYW1lU291cmNlTGluZTsKKyAgICBmcmFtZVNvdXJjZUxpbmUgPSB2
ODo6TG9jYWw8djg6OkZ1bmN0aW9uPjo6Q2FzdCh2OFV0aWxpdHlDb250ZXh0LT5HbG9iYWwoKS0+
R2V0KHY4OjpTdHJpbmc6Ok5ldygiZnJhbWVTb3VyY2VMaW5lIikpKTsKKyAgICBpZiAoZnJhbWVT
b3VyY2VMaW5lLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdjg6OkhhbmRsZTx2
ODo6VmFsdWU+IHJlc3VsdCA9IHY4OjpEZWJ1Zzo6Q2FsbChmcmFtZVNvdXJjZUxpbmUpOworICAg
IGlmIChyZXN1bHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcmVz
dWx0LT5JbnQzMlZhbHVlKCk7Cit9CisKK1N0cmluZyBWOFByb3h5Ojpzb3VyY2VOYW1lKCkKK3sK
KyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4g
djhVdGlsaXR5Q29udGV4dCA9IHV0aWxpdHlDb250ZXh0KCk7CisgICAgaWYgKHY4VXRpbGl0eUNv
bnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgdjg6OkNvbnRl
eHQ6OlNjb3BlIGNvbnRleHRTY29wZSh2OFV0aWxpdHlDb250ZXh0KTsKKyAgICB2ODo6SGFuZGxl
PHY4OjpGdW5jdGlvbj4gZnJhbWVTb3VyY2VOYW1lOworICAgIGZyYW1lU291cmNlTmFtZSA9IHY4
OjpMb2NhbDx2ODo6RnVuY3Rpb24+OjpDYXN0KHY4VXRpbGl0eUNvbnRleHQtPkdsb2JhbCgpLT5H
ZXQodjg6OlN0cmluZzo6TmV3KCJmcmFtZVNvdXJjZU5hbWUiKSkpOworICAgIGlmIChmcmFtZVNv
dXJjZU5hbWUuSXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICB9Cisg
ICAgcmV0dXJuIFRvV2ViQ29yZVN0cmluZyh2ODo6RGVidWc6OkNhbGwoZnJhbWVTb3VyY2VOYW1l
KSk7Cit9CisKK3ZvaWQgVjhQcm94eTo6cmVnaXN0ZXJFeHRlbnNpb24odjg6OkV4dGVuc2lvbiog
ZXh0ZW5zaW9uLCBjb25zdCBTdHJpbmcmIHNjaGVtZVJlc3RyaWN0aW9uKQoreworICAgIHY4OjpS
ZWdpc3RlckV4dGVuc2lvbihleHRlbnNpb24pOworICAgIFY4RXh0ZW5zaW9uSW5mbyBpbmZvID0g
e3NjaGVtZVJlc3RyaWN0aW9uLCBleHRlbnNpb259OworICAgIG1fZXh0ZW5zaW9ucy5wdXNoX2Jh
Y2soaW5mbyk7Cit9CisKK2Jvb2wgVjhQcm94eTo6c2V0Q29udGV4dERlYnVnSWQoaW50IGRlYnVn
SWQpIHsKKyAgICBBU1NFUlQoZGVidWdJZCA+IDApOworICAgIGlmIChtX2NvbnRleHQuSXNFbXB0
eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwor
ICAgIGlmICghbV9jb250ZXh0LT5HZXREYXRhKCktPklzVW5kZWZpbmVkKCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gY29udGV4dERhdGEgPSB2
ODo6T2JqZWN0OjpOZXcoKTsKKyAgICBjb250ZXh0RGF0YS0+U2V0KHY4OjpTdHJpbmc6Ok5ldyhr
Q29udGV4dERlYnVnRGF0YVR5cGUpLCB2ODo6U3RyaW5nOjpOZXcoInBhZ2UiKSk7CisgICAgY29u
dGV4dERhdGEtPlNldCh2ODo6U3RyaW5nOjpOZXcoa0NvbnRleHREZWJ1Z0RhdGFWYWx1ZSksIHY4
OjpJbnRlZ2VyOjpOZXcoZGVidWdJZCkpOworICAgIG1fY29udGV4dC0+U2V0RGF0YShjb250ZXh0
RGF0YSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBWOFByb3h5Ojpjb250ZXh0RGVidWdJ
ZCh2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0KQoreworICAgIHY4OjpIYW5kbGVTY29w
ZSBzY29wZTsKKyAgICBpZiAoIWNvbnRleHQtPkdldERhdGEoKS0+SXNPYmplY3QoKSkKKyAgICAg
ICAgcmV0dXJuIC0xOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBkYXRhID0gY29udGV4dC0+
R2V0RGF0YSgpLT5Ub09iamVjdCgpLT5HZXQoIHY4OjpTdHJpbmc6Ok5ldyhrQ29udGV4dERlYnVn
RGF0YVZhbHVlKSk7CisgICAgcmV0dXJuIGRhdGEtPklzSW50MzIoKSA/IGRhdGEtPkludDMyVmFs
dWUoKSA6IC0xOworfQorCit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9i
aW5kaW5ncy92OC9TY3JpcHRDb250cm9sbGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L1NjcmlwdENvbnRyb2xsZXIuY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNv
cmUvYmluZGluZ3MvdjgvU2NyaXB0Q29udHJvbGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTcy
LDE3ICs3MiwxNyBAQAogCiBib29sIFNjcmlwdENvbnRyb2xsZXI6OmlzU2FmZVNjcmlwdChGcmFt
ZSogdGFyZ2V0KQogewotICAgIHJldHVybiBWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZSh0YXJnZXQs
IHRydWUpOworICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZSh0YXJnZXQsIHRydWUp
OwogfQogCiB2b2lkIFNjcmlwdENvbnRyb2xsZXI6OmdjUHJvdGVjdEpTV3JhcHBlcih2b2lkKiBk
b21PYmplY3QpCiB7Ci0gICAgVjhQcm94eTo6R0NQcm90ZWN0KGRvbU9iamVjdCk7CisgICAgVjhQ
cm94eTo6Z2NQcm90ZWN0KGRvbU9iamVjdCk7CiB9CiAKIHZvaWQgU2NyaXB0Q29udHJvbGxlcjo6
Z2NVbnByb3RlY3RKU1dyYXBwZXIodm9pZCogZG9tT2JqZWN0KQogewotICAgIFY4UHJveHk6OkdD
VW5wcm90ZWN0KGRvbU9iamVjdCk7CisgICAgVjhQcm94eTo6Z2NVbnByb3RlY3QoZG9tT2JqZWN0
KTsKIH0KIAogU2NyaXB0Q29udHJvbGxlcjo6U2NyaXB0Q29udHJvbGxlcihGcmFtZSogZnJhbWUp
CkBAIC0xNDQsMTggKzE0NCwxOCBAQAogICAgIFY4UHJveHkqIGFjdGl2ZVByb3h5ID0gYWN0aXZl
RnJhbWUtPnNjcmlwdCgpLT5wcm94eSgpOwogCiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNj
b3BlOwotICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5OjpHZXRD
b250ZXh0KGFjdGl2ZUZyYW1lKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB2OENvbnRl
eHQgPSBWOFByb3h5Ojpjb250ZXh0KGFjdGl2ZUZyYW1lKTsKICAgICAvLyBGSVhNRTogZmluZCBh
bGwgY2FzZXMgY29udGV4dCBjYW4gYmUgZW1wdHk6CiAgICAgLy8gIDEpIEpTIGlzIGRpc2FibGVk
OwogICAgIC8vICAyKSBwYWdlIGlzIE5VTEw7Ci0gICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQor
ICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAg
IHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKKyAgICB2ODo6Q29udGV4dDo6U2Nv
cGUgc2NvcGUodjhDb250ZXh0KTsKIAotICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFs
ID0gY29udGV4dC0+R2xvYmFsKCk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwg
PSB2OENvbnRleHQtPkdsb2JhbCgpOwogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBqc0V2ZW50
ID0gZ2xvYmFsLT5HZXQodjg6OlN0cmluZzo6TmV3U3ltYm9sKCJldmVudCIpKTsKLSAgICBFdmVu
dCogZXZlbnQgPSBWOFByb3h5OjpUb05hdGl2ZUV2ZW50KGpzRXZlbnQpOworICAgIEV2ZW50KiBl
dmVudCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZUV2ZW50KGpzRXZlbnQpOwogCiAgICAgLy8g
QmFzZWQgb24gY29kZSBmcm9tIGtqc19iaW5kaW5ncy5jcHAuCiAgICAgLy8gTm90ZTogVGhpcyBp
cyBtb3JlIGxpYmVyYWwgdGhhbiBGaXJlZm94J3MgaW1wbGVtZW50YXRpb24uCkBAIC0xOTQsMTEg
KzE5NCwxMSBAQAogICAgIH0KIAogICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKLSAg
ICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dCht
X3Byb3h5LT5mcmFtZSgpKTsKLSAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgdjg6Okhh
bmRsZTx2ODo6Q29udGV4dD4gdjhDb250ZXh0ID0gVjhQcm94eTo6Y29udGV4dChtX3Byb3h5LT5m
cmFtZSgpKTsKKyAgICBpZiAodjhDb250ZXh0LklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIFNj
cmlwdFZhbHVlKCk7CiAKLSAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7Cisg
ICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKHY4Q29udGV4dCk7CiAKICAgICBSZWZQdHI8RnJh
bWU+IHByb3RlY3QobV9mcmFtZSk7CiAKQEAgLTIxNiw3ICsyMTYsNyBAQAogCiB2b2lkIFNjcmlw
dENvbnRyb2xsZXI6OnNldEV2ZW50SGFuZGxlckxpbmVOdW1iZXIoaW50IGxpbmVOdW1iZXIpCiB7
Ci0gICAgbV9wcm94eS0+c2V0RXZlbnRIYW5kbGVyTGluZW5vKGxpbmVOdW1iZXIpOworICAgIG1f
cHJveHktPnNldEV2ZW50SGFuZGxlckxpbmVOdW1iZXIobGluZU51bWJlcik7CiB9CiAKIHZvaWQg
U2NyaXB0Q29udHJvbGxlcjo6ZmluaXNoZWRXaXRoRXZlbnQoRXZlbnQqIGV2ZW50KQpAQCAtMjI5
LDM0ICsyMjksMzQgQEAKIHsKICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CiAKLSAg
ICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChm
cmFtZSk7Ci0gICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgIHY4OjpIYW5kbGU8djg6OkNv
bnRleHQ+IHY4Q29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQoZnJhbWUpOworICAgIGlmICh2OENv
bnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKLSAgICB2ODo6Q29udGV4dDo6U2Nv
cGUgc2NvcGUoY29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKHY4Q29udGV4
dCk7CiAKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHZhbHVlID0gQ3JlYXRlVjhPYmplY3RG
b3JOUE9iamVjdChvYmplY3QsIDApOwogCiAgICAgLy8gQXR0YWNoIHRvIHRoZSBnbG9iYWwgb2Jq
ZWN0LgotICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsID0gY29udGV4dC0+R2xvYmFs
KCk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwgPSB2OENvbnRleHQtPkdsb2Jh
bCgpOwogICAgIGdsb2JhbC0+U2V0KHY4U3RyaW5nKGtleSksIHZhbHVlKTsKIH0KIAogdm9pZCBT
Y3JpcHRDb250cm9sbGVyOjpjb2xsZWN0R2FyYmFnZSgpCiB7CiAgICAgdjg6OkhhbmRsZVNjb3Bl
IGhhbmRsZVNjb3BlOwotICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFBy
b3h5OjpHZXRDb250ZXh0KG1fcHJveHktPmZyYW1lKCkpOwotICAgIGlmIChjb250ZXh0LklzRW1w
dHkoKSkKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpj
b250ZXh0KG1fcHJveHktPmZyYW1lKCkpOworICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQog
ICAgICAgICByZXR1cm47CiAKLSAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7
CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKHY4Q29udGV4dCk7CiAKICAgICBtX3Byb3h5
LT5ldmFsdWF0ZShTY3JpcHRTb3VyY2VDb2RlKCJpZiAod2luZG93LmdjKSB2b2lkKGdjKCkpOyIp
LCAwKTsKIH0KIAogYm9vbCBTY3JpcHRDb250cm9sbGVyOjpoYXZlSW50ZXJwcmV0ZXIoKSBjb25z
dAogewotICAgIHJldHVybiBtX3Byb3h5LT5Db250ZXh0SW5pdGlhbGl6ZWQoKTsKKyAgICByZXR1
cm4gbV9wcm94eS0+aXNDb250ZXh0SW5pdGlhbGl6ZWQoKTsKIH0KIAogYm9vbCBTY3JpcHRDb250
cm9sbGVyOjppc0VuYWJsZWQoKSBjb25zdApAQCAtMzI2LDEzICszMjYsMTMgQEAKIHN0YXRpYyBO
UE9iamVjdCogY3JlYXRlU2NyaXB0T2JqZWN0KEZyYW1lKiBmcmFtZSkKIHsKICAgICB2ODo6SGFu
ZGxlU2NvcGUgaGFuZGxlU2NvcGU7Ci0gICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4
dCA9IFY4UHJveHk6OkdldENvbnRleHQoZnJhbWUpOwotICAgIGlmIChjb250ZXh0LklzRW1wdHko
KSkKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250
ZXh0KGZyYW1lKTsKKyAgICBpZiAodjhDb250ZXh0LklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJu
IGNyZWF0ZU5vU2NyaXB0T2JqZWN0KCk7CiAKLSAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUo
Y29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKHY4Q29udGV4dCk7CiAgICAg
RE9NV2luZG93KiB3aW5kb3cgPSBmcmFtZS0+ZG9tV2luZG93KCk7Ci0gICAgdjg6OkhhbmRsZTx2
ODo6VmFsdWU+IGdsb2JhbCA9IFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01X
SU5ET1csIHdpbmRvdyk7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGdsb2JhbCA9IFY4UHJv
eHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCB3aW5kb3cpOwog
ICAgIEFTU0VSVChnbG9iYWwtPklzT2JqZWN0KCkpOwogICAgIHJldHVybiBucENyZWF0ZVY4U2Ny
aXB0T2JqZWN0KDAsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QoZ2xvYmFsKSwgd2luZG93
KTsKIH0KQEAgLTM2MywxMyArMzYzLDEzIEBACiAgICAgICAgIHJldHVybiBjcmVhdGVOb1Njcmlw
dE9iamVjdCgpOwogCiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpI
YW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KG1fZnJhbWUp
OwotICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0
PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KG1fZnJhbWUpOworICAgIGlmICh2OENvbnRl
eHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gY3JlYXRlTm9TY3JpcHRPYmplY3QoKTsKLSAg
ICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6OlNj
b3BlIHNjb3BlKHY4Q29udGV4dCk7CiAKICAgICBET01XaW5kb3cqIHdpbmRvdyA9IG1fZnJhbWUt
PmRvbVdpbmRvdygpOwotICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OHBsdWdpbiA9IFY4UHJv
eHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpIVE1MRU1CRURFTEVNRU5ULCBwbHVnaW4pOwor
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OHBsdWdpbiA9IFY4UHJveHk6OmNvbnZlcnRUb1Y4
T2JqZWN0KFY4Q2xhc3NJbmRleDo6SFRNTEVNQkVERUxFTUVOVCwgcGx1Z2luKTsKICAgICBpZiAo
IXY4cGx1Z2luLT5Jc09iamVjdCgpKQogICAgICAgICByZXR1cm4gY3JlYXRlTm9TY3JpcHRPYmpl
Y3QoKTsKIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOENvbGxlY3Rpb24uY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhDb2xsZWN0aW9uLmNwcAkocmV2aXNpb24g
NDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4Q29sbGVjdGlvbi5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTQ4LDE0ICs0OCwxNCBAQAogCiAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdmFsdWUg
aXMgYW4gSFRNTE9wdGlvbkVsZW1lbnQuICBJZiBub3QsIHRocm93IGEgVFlQRV9NSVNNQVRDSF9F
UlIgRE9NRXhjZXB0aW9uLgogICAgIGlmICghVjhIVE1MT3B0aW9uRWxlbWVudDo6SGFzSW5zdGFu
Y2UodmFsdWUpKSB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihUWVBFX01JU01B
VENIX0VSUik7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihUWVBFX01JU01BVENI
X0VSUik7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKLSAgICBIVE1MT3B0aW9uRWxl
bWVudCogZWxlbWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTE9wdGlvbkVsZW1l
bnQ+KHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodmFsdWUpKTsKKyAgICBIVE1MT3B0aW9u
RWxlbWVudCogZWxlbWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxP
cHRpb25FbGVtZW50Pih2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHZhbHVlKSk7CiAgICAg
YmFzZS0+c2V0T3B0aW9uKGluZGV4LCBlbGVtZW50LCBlYyk7CiAKLSAgICBWOFByb3h5OjpTZXRE
T01FeGNlcHRpb24oZWMpOworICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAg
cmV0dXJuIHZhbHVlOwogfQogCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4Tm9kZUZpbHRl
ckNvbmRpdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOE5vZGVG
aWx0ZXJDb25kaXRpb24uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3Mv
djgvVjhOb2RlRmlsdGVyQ29uZGl0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsMTQgKzQ0
LDE0IEBACiAgICAgOiBtX2ZpbHRlcih2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+OjpOZXcoZmls
dGVyKSkKIHsKICNpZm5kZWYgTkRFQlVHCi0gICAgVjhQcm94eTo6UmVnaXN0ZXJHbG9iYWxIYW5k
bGUoTk9ERV9GSUxURVIsIHRoaXMsIG1fZmlsdGVyKTsKKyAgICBWOFByb3h5OjpyZWdpc3Rlckds
b2JhbEhhbmRsZShOT0RFX0ZJTFRFUiwgdGhpcywgbV9maWx0ZXIpOwogI2VuZGlmCiB9CiAKIFY4
Tm9kZUZpbHRlckNvbmRpdGlvbjo6flY4Tm9kZUZpbHRlckNvbmRpdGlvbigpCiB7CiAjaWZuZGVm
IE5ERUJVRwotICAgIFY4UHJveHk6OlVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9maWx0
ZXIpOworICAgIFY4UHJveHk6OnVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9maWx0ZXIp
OwogI2VuZGlmCiAgICAgbV9maWx0ZXIuRGlzcG9zZSgpOwogICAgIG1fZmlsdGVyLkNsZWFyKCk7
CkBAIC02OSwxMiArNjksMTIgQEAKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9
IHY4OjpDb250ZXh0OjpHZXRDdXJyZW50KCktPkdsb2JhbCgpOwogICAgIHY4OjpIYW5kbGU8djg6
OkZ1bmN0aW9uPiBjYWxsYmFjayA9IHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPjo6Q2FzdChtX2Zp
bHRlcik7CiAgICAgT3duQXJyYXlQdHI8djg6OkhhbmRsZTx2ODo6VmFsdWU+ID4gYXJncyhuZXcg
djg6OkhhbmRsZTx2ODo6VmFsdWU+WzFdKTsKLSAgICBhcmdzWzBdID0gVjhQcm94eTo6VG9WOE9i
amVjdChWOENsYXNzSW5kZXg6Ok5PREUsIG5vZGUpOworICAgIGFyZ3NbMF0gPSBWOFByb3h5Ojpj
b252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok5PREUsIG5vZGUpOwogCiAgICAgVjhQcm94
eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZSgpOwogICAgIEFTU0VSVChwcm94eSk7CiAKLSAg
ICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmVzdWx0ID0gcHJveHktPkNhbGxGdW5jdGlvbihjYWxs
YmFjaywgb2JqZWN0LCAxLCBhcmdzLmdldCgpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4g
cmVzdWx0ID0gcHJveHktPmNhbGxGdW5jdGlvbihjYWxsYmFjaywgb2JqZWN0LCAxLCBhcmdzLmdl
dCgpKTsKIAogICAgIGlmIChleGNlcHRpb25DYXRjaGVyLkhhc0NhdWdodCgpKSB7CiAgICAgICAg
IHN0YXRlLT5zZXRFeGNlcHRpb24oZXhjZXB0aW9uQ2F0Y2hlci5FeGNlcHRpb24oKSk7CkluZGV4
OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4SGVscGVycy5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9iaW5kaW5ncy92OC9WOEhlbHBlcnMuY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUv
YmluZGluZ3MvdjgvVjhIZWxwZXJzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDAsMTMgKzQwLDEz
IEBACiAKIHZvaWQgd3JhcE5QT2JqZWN0KHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqZWN0LCBO
UE9iamVjdCogbnBPYmplY3QpCiB7Ci0gICAgVjhQcm94eTo6U2V0RE9NV3JhcHBlcihvYmplY3Qs
IFY4Q2xhc3NJbmRleDo6TlBPQkpFQ1QsIG5wT2JqZWN0KTsKKyAgICBWOFByb3h5OjpzZXRET01X
cmFwcGVyKG9iamVjdCwgVjhDbGFzc0luZGV4OjpOUE9CSkVDVCwgbnBPYmplY3QpOwogfQogCiB2
ODo6TG9jYWw8djg6OkNvbnRleHQ+IHRvVjhDb250ZXh0KE5QUCBucHAsIE5QT2JqZWN0KiBucE9i
amVjdCkKIHsKICAgICBWOE5QT2JqZWN0KiBvYmplY3QgPSByZWludGVycHJldF9jYXN0PFY4TlBP
YmplY3QqPihucE9iamVjdCk7Ci0gICAgcmV0dXJuIFY4UHJveHk6OkdldENvbnRleHQob2JqZWN0
LT5yb290T2JqZWN0LT5mcmFtZSgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udGV4dChvYmpl
Y3QtPnJvb3RPYmplY3QtPmZyYW1lKCkpOwogfQogCiBWOFByb3h5KiB0b1Y4UHJveHkoTlBPYmpl
Y3QqIG5wT2JqZWN0KQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdl
Q2hhbm5lbENvbnN0cnVjdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOE1lc3NhZ2VDaGFubmVsQ29uc3RydWN0b3IuY3BwCShyZXZpc2lvbiA0NTA5NSkK
KysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUNoYW5uZWxDb25zdHJ1Y3Rv
ci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDcgKzQ0LDcgQEAKIENBTExCQUNLX0ZVTkNfREVD
TChNZXNzYWdlQ2hhbm5lbENvbnN0cnVjdG9yKQogewogICAgIElOQ19TVEFUUygiRE9NLk1lc3Nh
Z2VDaGFubmVsLkNvbnN0cnVjdG9yIik7Ci0gICAgLy8gRklYTUU6IFRoZSBsb2dpYyBoZXJlIGlz
IGFsbW9zdCBleGFjdCBkdXBsaWNhdGUgb2YgVjg6OkNvbnN0cnVjdERPTU9iamVjdC4KKyAgICAv
LyBGSVhNRTogVGhlIGxvZ2ljIGhlcmUgaXMgYWxtb3N0IGV4YWN0IGR1cGxpY2F0ZSBvZiBWODo6
Y29uc3RydWN0RE9NT2JqZWN0LgogICAgIC8vIENvbnNpZGVyIHJlZmFjdG9yaW5nIHRvIHJlZHVj
ZSBkdXBsaWNhdGlvbi4KICAgICBpZiAoIWFyZ3MuSXNDb25zdHJ1Y3RDYWxsKCkpCiAgICAgICAg
IHJldHVybiB0aHJvd0Vycm9yKCJET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxs
ZWQgYXMgYSBmdW5jdGlvbi4iKTsKQEAgLTU3LDcgKzU3LDcgQEAKICAgICBEb2N1bWVudCogZG9j
dW1lbnQgPSBmcmFtZS0+ZG9jdW1lbnQoKTsKIAogICAgIC8vIE5vdGU6IGl0J3MgT0sgdG8gbGV0
IHRoaXMgUmVmUHRyIGdvIG91dCBvZiBzY29wZSBiZWNhdXNlIHdlIGFsc28gY2FsbAotICAgIC8v
IFNldERPTVdyYXBwZXIoKSwgd2hpY2ggZWZmZWN0aXZlbHkgaG9sZHMgYSByZWZlcmVuY2UgdG8g
b2JqLgorICAgIC8vIHNldERPTVdyYXBwZXIoKSwgd2hpY2ggZWZmZWN0aXZlbHkgaG9sZHMgYSBy
ZWZlcmVuY2UgdG8gb2JqLgogICAgIFJlZlB0cjxNZXNzYWdlQ2hhbm5lbD4gb2JqID0gTWVzc2Fn
ZUNoYW5uZWw6OmNyZWF0ZShkb2N1bWVudCk7CiAKICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4g
bWVzc2FnZUNoYW5uZWwgPSBhcmdzLkhvbGRlcigpOwpAQCAtNjUsMTEgKzY1LDExIEBACiAgICAg
Ly8gQ3JlYXRlIHJlZmVyZW5jZXMgZnJvbSB0aGUgTWVzc2FnZUNoYW5uZWwgd3JhcHBlciB0byB0
aGUgdHdvCiAgICAgLy8gTWVzc2FnZVBvcnQgd3JhcHBlcnMgdG8gbWFrZSBzdXJlIHRoYXQgdGhl
IE1lc3NhZ2VQb3J0IHdyYXBwZXJzCiAgICAgLy8gc3RheSBhbGl2ZSBhcyBsb25nIGFzIHRoZSBN
ZXNzYWdlQ2hhbm5lbCB3cmFwcGVyIGlzIGFyb3VuZC4KLSAgICBtZXNzYWdlQ2hhbm5lbC0+U2V0
SW50ZXJuYWxGaWVsZChrTWVzc2FnZUNoYW5uZWxQb3J0MUluZGV4LCBWOFByb3h5OjpUb1Y4T2Jq
ZWN0KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIG9iai0+cG9ydDEoKSkpOwotICAgIG1lc3Nh
Z2VDaGFubmVsLT5TZXRJbnRlcm5hbEZpZWxkKGtNZXNzYWdlQ2hhbm5lbFBvcnQySW5kZXgsIFY4
UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgb2JqLT5wb3J0Migp
KSk7CisgICAgbWVzc2FnZUNoYW5uZWwtPlNldEludGVybmFsRmllbGQoa01lc3NhZ2VDaGFubmVs
UG9ydDFJbmRleCwgVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpNRVNT
QUdFUE9SVCwgb2JqLT5wb3J0MSgpKSk7CisgICAgbWVzc2FnZUNoYW5uZWwtPlNldEludGVybmFs
RmllbGQoa01lc3NhZ2VDaGFubmVsUG9ydDJJbmRleCwgVjhQcm94eTo6Y29udmVydFRvVjhPYmpl
Y3QoVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgb2JqLT5wb3J0MigpKSk7CiAKICAgICAvLyBT
ZXR1cCB0aGUgc3RhbmRhcmQgd3JhcHBlciBvYmplY3QgaW50ZXJuYWwgZmllbGRzLgotICAgIFY4
UHJveHk6OlNldERPTVdyYXBwZXIobWVzc2FnZUNoYW5uZWwsIFY4Q2xhc3NJbmRleDo6TUVTU0FH
RUNIQU5ORUwsIG9iai5nZXQoKSk7CisgICAgVjhQcm94eTo6c2V0RE9NV3JhcHBlcihtZXNzYWdl
Q2hhbm5lbCwgVjhDbGFzc0luZGV4OjpNRVNTQUdFQ0hBTk5FTCwgb2JqLmdldCgpKTsKICAgICBy
ZXR1cm4gdG9WOChvYmoucmVsZWFzZSgpLCBtZXNzYWdlQ2hhbm5lbCk7CiB9CiAKSW5kZXg6IFdl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTEZyYW1lRWxlbWVudEN1c3RvbS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MRnJhbWVFbGVtZW50
Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOEhUTUxGcmFtZUVsZW1lbnRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICsz
OSw3IEBACiAKIEFDQ0VTU09SX1NFVFRFUihIVE1MRnJhbWVFbGVtZW50U3JjKQogewotICAgIEhU
TUxGcmFtZUVsZW1lbnQqIGZyYW1lID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MRnJh
bWVFbGVtZW50PihpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MRnJhbWVFbGVtZW50KiBmcmFtZSA9
IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxGcmFtZUVsZW1lbnQ+KGluZm8u
SG9sZGVyKCkpOwogICAgIFN0cmluZyBzcmNWYWx1ZSA9IHRvV2ViQ29yZVN0cmluZ1dpdGhOdWxs
Q2hlY2sodmFsdWUpOwogCiAgICAgaWYgKCFhbGxvd1NldHRpbmdGcmFtZVNyY1RvSmF2YXNjcmlw
dFVybChmcmFtZSwgc3JjVmFsdWUpKQpAQCAtNTAsNyArNTAsNyBAQAogCiBBQ0NFU1NPUl9TRVRU
RVIoSFRNTEZyYW1lRWxlbWVudExvY2F0aW9uKQogewotICAgIEhUTUxGcmFtZUVsZW1lbnQqIGZy
YW1lID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MRnJhbWVFbGVtZW50PihpbmZvLkhv
bGRlcigpKTsKKyAgICBIVE1MRnJhbWVFbGVtZW50KiBmcmFtZSA9IFY4UHJveHk6OmNvbnZlcnRE
T01XcmFwcGVyVG9Ob2RlPEhUTUxGcmFtZUVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIFN0
cmluZyBsb2NhdGlvblZhbHVlID0gdG9XZWJDb3JlU3RyaW5nV2l0aE51bGxDaGVjayh2YWx1ZSk7
CiAKICAgICBpZiAoIWFsbG93U2V0dGluZ0ZyYW1lU3JjVG9KYXZhc2NyaXB0VXJsKGZyYW1lLCBs
b2NhdGlvblZhbHVlKSkKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TmF2aWdh
dG9yQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OE5hdmlnYXRvckN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhOYXZpZ2F0b3JDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MSw3
ICs0MSw3IEBACiB7CiAgICAgSU5DX1NUQVRTKCJET00uTmF2aWdhdG9yLmFwcFZlcnNpb24iKTsK
ICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0gICAg
TmF2aWdhdG9yKiBuYXZpZ2F0b3IgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxOYXZpZ2F0b3I+
KFY4Q2xhc3NJbmRleDo6TkFWSUdBVE9SLCBob2xkZXIpOworICAgIE5hdmlnYXRvciogbmF2aWdh
dG9yID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PE5hdmlnYXRvcj4oVjhDbGFzc0lu
ZGV4OjpOQVZJR0FUT1IsIGhvbGRlcik7CiAgICAgcmV0dXJuIHY4U3RyaW5nT3JVbmRlZmluZWQo
bmF2aWdhdG9yLT5hcHBWZXJzaW9uKCkpOwogfQogCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjay5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxUcmFuc2FjdGlvbkVy
cm9yQ2FsbGJhY2suY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4Q3VzdG9tU1FMVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNTQsMTQgKzU0LDE0IEBACiB7CiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNj
b3BlOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6Okdl
dENvbnRleHQobV9mcmFtZS5nZXQoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29u
dGV4dCA9IFY4UHJveHk6OmNvbnRleHQobV9mcmFtZS5nZXQoKSk7CiAgICAgaWYgKGNvbnRleHQu
SXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2Nv
cGUoY29udGV4dCk7CiAKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJndltdID0gewotICAg
ICAgICBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMRVJST1IsIGVycm9yKQor
ICAgICAgICBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNRTEVSUk9S
LCBlcnJvcikKICAgICB9OwogCiAgICAgLy8gUHJvdGVjdCB0aGUgZnJhbWUgdW50aWwgdGhlIGNh
bGxiYWNrIHJldHVybnMuCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxJ
bnB1dEVsZW1lbnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4SFRNTElucHV0RWxlbWVudEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysg
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MSW5wdXRFbGVtZW50Q3VzdG9tLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNDEsNyArNDEsNyBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkhU
TUxJbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQuX2dldCIpOwogICAgIHY4OjpIYW5kbGU8djg6
Ok9iamVjdD4gaG9sZGVyID0gaW5mby5Ib2xkZXIoKTsKLSAgICBIVE1MSW5wdXRFbGVtZW50KiBp
bXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxJbnB1dEVsZW1lbnQ+KGhvbGRlcik7
CisgICAgSFRNTElucHV0RWxlbWVudCogaW1wID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJU
b05vZGU8SFRNTElucHV0RWxlbWVudD4oaG9sZGVyKTsKIAogICAgIGlmICghaW1wLT5jYW5IYXZl
U2VsZWN0aW9uKCkpCiAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCJBY2Nlc3Npbmcgc2VsZWN0
aW9uU3RhcnQgb24gYW4gaW5wdXQgZWxlbWVudCB0aGF0IGNhbm5vdCBoYXZlIGEgc2VsZWN0aW9u
LiIpOwpAQCAtNTQsNyArNTQsNyBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxJbnB1dEVs
ZW1lbnQuc2VsZWN0aW9uU3RhcnQuX3NldCIpOwogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
aG9sZGVyID0gaW5mby5Ib2xkZXIoKTsKLSAgICBIVE1MSW5wdXRFbGVtZW50KiBpbXAgPSBWOFBy
b3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxJbnB1dEVsZW1lbnQ+KGhvbGRlcik7CisgICAgSFRN
TElucHV0RWxlbWVudCogaW1wID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRN
TElucHV0RWxlbWVudD4oaG9sZGVyKTsKIAogICAgIGlmICghaW1wLT5jYW5IYXZlU2VsZWN0aW9u
KCkpIHsKICAgICAgICAgdGhyb3dFcnJvcigiQWNjZXNzaW5nIHNlbGVjdGlvblN0YXJ0IG9uIGFu
IGlucHV0IGVsZW1lbnQgdGhhdCBjYW5ub3QgaGF2ZSBhIHNlbGVjdGlvbi4iKTsKQEAgLTY3LDcg
KzY3LDcgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MSW5wdXRFbGVtZW50LnNlbGVjdGlv
bkVuZC5fZ2V0Iik7CiAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBpbmZvLkhv
bGRlcigpOwotICAgIEhUTUxJbnB1dEVsZW1lbnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJU
b05vZGU8SFRNTElucHV0RWxlbWVudD4oaG9sZGVyKTsKKyAgICBIVE1MSW5wdXRFbGVtZW50KiBp
bXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MSW5wdXRFbGVtZW50Piho
b2xkZXIpOwogCiAgICAgaWYgKCFpbXAtPmNhbkhhdmVTZWxlY3Rpb24oKSkKICAgICAgICAgcmV0
dXJuIHRocm93RXJyb3IoIkFjY2Vzc2luZyBzZWxlY3Rpb25FbmQgb24gYW4gaW5wdXQgZWxlbWVu
dCB0aGF0IGNhbm5vdCBoYXZlIGEgc2VsZWN0aW9uLiIpOwpAQCAtODAsNyArODAsNyBAQAogewog
ICAgIElOQ19TVEFUUygiRE9NLkhUTUxJbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kLl9zZXQiKTsK
ICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0gICAg
SFRNTElucHV0RWxlbWVudCogaW1wID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MSW5w
dXRFbGVtZW50Pihob2xkZXIpOworICAgIEhUTUxJbnB1dEVsZW1lbnQqIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxJbnB1dEVsZW1lbnQ+KGhvbGRlcik7CiAKICAg
ICBpZiAoIWltcC0+Y2FuSGF2ZVNlbGVjdGlvbigpKSB7CiAgICAgICAgIHRocm93RXJyb3IoIkFj
Y2Vzc2luZyBzZWxlY3Rpb25FbmQgb24gYW4gaW5wdXQgZWxlbWVudCB0aGF0IGNhbm5vdCBoYXZl
IGEgc2VsZWN0aW9uLiIpOwpAQCAtOTQsNyArOTQsNyBAQAogewogICAgIElOQ19TVEFUUygiRE9N
LkhUTUxJbnB1dEVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UiKTsKICAgICB2ODo6SGFuZGxlPHY4
OjpPYmplY3Q+IGhvbGRlciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgSFRNTElucHV0RWxlbWVudCog
aW1wID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MSW5wdXRFbGVtZW50Pihob2xkZXIp
OworICAgIEhUTUxJbnB1dEVsZW1lbnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVy
VG9Ob2RlPEhUTUxJbnB1dEVsZW1lbnQ+KGhvbGRlcik7CiAKICAgICBpZiAoIWltcC0+Y2FuSGF2
ZVNlbGVjdGlvbigpKQogICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigiQ2FsbGluZyBzZXRTZWxl
Y3Rpb25SYW5nZSBvbiBhbiBpbnB1dCBlbGVtZW50IHRoYXQgY2Fubm90IGhhdmUgYSBzZWxlY3Rp
b24uIik7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFN0YXRl
bWVudENhbGxiYWNrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOEN1c3RvbVNRTFN0YXRlbWVudENhbGxiYWNrLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFN0YXRlbWVudENhbGxiYWNrLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNTQsMTUgKzU0LDE1IEBACiB7CiAgICAgdjg6OkhhbmRsZVNj
b3BlIGhhbmRsZVNjb3BlOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9
IFY4UHJveHk6OkdldENvbnRleHQobV9mcmFtZS5nZXQoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6
Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQobV9mcmFtZS5nZXQoKSk7CiAgICAg
aWYgKGNvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKICAgICB2ODo6Q29udGV4
dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CiAKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJn
dltdID0gewotICAgICAgICBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMVFJB
TlNBQ1RJT04sIHRyYW5zYWN0aW9uKSwKLSAgICAgICAgVjhQcm94eTo6VG9WOE9iamVjdChWOENs
YXNzSW5kZXg6OlNRTFJFU1VMVFNFVCwgcmVzdWx0U2V0KQorICAgICAgICBWOFByb3h5Ojpjb252
ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNRTFRSQU5TQUNUSU9OLCB0cmFuc2FjdGlvbiks
CisgICAgICAgIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMUkVT
VUxUU0VULCByZXN1bHRTZXQpCiAgICAgfTsKIAogICAgIC8vIFByb3RlY3QgdGhlIGZyYW1lIHVu
dGlsIHRoZSBjYWxsYmFjayByZXR1cm5zLgpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhIVE1MRm9ybUVsZW1lbnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTEZvcm1FbGVtZW50Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUw
OTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxGb3JtRWxlbWVudEN1c3Rv
bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDE5ICs0MiwxOSBAQAogSU5ERVhFRF9QUk9QRVJU
WV9HRVRURVIoSFRNTEZvcm1FbGVtZW50KQogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxGb3Jt
RWxlbWVudC5JbmRleGVkUHJvcGVydHlHZXR0ZXIiKTsKLSAgICBIVE1MRm9ybUVsZW1lbnQqIGZv
cm0gPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxGb3JtRWxlbWVudD4oaW5mby5Ib2xk
ZXIoKSk7CisgICAgSFRNTEZvcm1FbGVtZW50KiBmb3JtID0gVjhQcm94eTo6Y29udmVydERPTVdy
YXBwZXJUb05vZGU8SFRNTEZvcm1FbGVtZW50PihpbmZvLkhvbGRlcigpKTsKICAgICAKICAgICBS
ZWZQdHI8Tm9kZT4gZm9ybUVsZW1lbnQgPSBmb3JtLT5lbGVtZW50cygpLT5pdGVtKGluZGV4KTsK
ICAgICBpZiAoIWZvcm1FbGVtZW50KQogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJj
ZXB0b3IoKTsKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QoZm9ybUVsZW1lbnQu
Z2V0KCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QoZm9ybUVs
ZW1lbnQuZ2V0KCkpOwogfQogCiAKIE5BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MRm9ybUVsZW1l
bnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTEZvcm1FbGVtZW50Lk5hbWVkUHJvcGVydHlH
ZXR0ZXIiKTsKLSAgICBIVE1MRm9ybUVsZW1lbnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJU
b05vZGU8SFRNTEZvcm1FbGVtZW50PihpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MRm9ybUVsZW1l
bnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxGb3JtRWxlbWVu
dD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgQXRvbWljU3RyaW5nIHYgPSB2OFN0cmluZ1RvQXRvbWlj
V2ViQ29yZVN0cmluZyhuYW1lKTsKIAogICAgIC8vIENhbGwgZ2V0TmFtZWRFbGVtZW50cyB0d2lj
ZSwgZmlyc3QgdGltZSBjaGVjayBpZiBpdCBoYXMgYSB2YWx1ZQpAQCAtNzQsMTUgKzc0LDE1IEBA
CiAgICAgQVNTRVJUKCFlbGVtZW50cy5pc0VtcHR5KCkpOwogCiAgICAgaWYgKGVsZW1lbnRzLnNp
emUoKSA9PSAxKQotICAgICAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QoZWxlbWVu
dHMuYXQoMCkuZ2V0KCkpOworICAgICAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4
T2JqZWN0KGVsZW1lbnRzLmF0KDApLmdldCgpKTsKIAogICAgIE5vZGVMaXN0KiBjb2xsZWN0aW9u
ID0gbmV3IFY4TmFtZWROb2Rlc0NvbGxlY3Rpb24oZWxlbWVudHMpOwotICAgIHJldHVybiBWOFBy
b3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Tk9ERUxJU1QsIGNvbGxlY3Rpb24pOworICAg
IHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok5PREVMSVNU
LCBjb2xsZWN0aW9uKTsKIH0KICAgICAKIENBTExCQUNLX0ZVTkNfREVDTChIVE1MRm9ybUVsZW1l
bnRTdWJtaXQpIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MRm9ybUVsZW1lbnQuc3VibWl0KCki
KTsKLSAgICBIVE1MRm9ybUVsZW1lbnQqIGZvcm0gPSBWOFByb3h5OjpET01XcmFwcGVyVG9OYXRp
dmU8SFRNTEZvcm1FbGVtZW50PihhcmdzLkhvbGRlcigpKTsKKyAgICBIVE1MRm9ybUVsZW1lbnQq
IGZvcm0gPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPEhUTUxGb3JtRWxlbWVu
dD4oYXJncy5Ib2xkZXIoKSk7CiAgICAgZm9ybS0+c3VibWl0KDAsIGZhbHNlLCBmYWxzZSk7CiAg
ICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIH0KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4RGF0YWJhc2VDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGlu
Z3MvdjgvY3VzdG9tL1Y4RGF0YWJhc2VDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RGF0YWJhc2VDdXN0b20uY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0zMiwxNCArMzIsMTMgQEAKIAogI2lmIEVOQUJMRShEQVRBQkFTRSkKIAotI2luY2x1
ZGUgInY4X2JpbmRpbmcuaCIKLSNpbmNsdWRlICJ2OF9wcm94eS5oIgotCiAjaW5jbHVkZSAiRGF0
YWJhc2UuaCIKKyNpbmNsdWRlICJWOEJpbmRpbmcuaCIKICNpbmNsdWRlICJWOEN1c3RvbUJpbmRp
bmcuaCIKICNpbmNsdWRlICJWOEN1c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJhY2suaCIKICNpbmNs
dWRlICJWOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjay5oIgogI2luY2x1ZGUgIlY4
Q3VzdG9tVm9pZENhbGxiYWNrLmgiCisjaW5jbHVkZSAiVjhQcm94eS5oIgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKQEAgLTU0LDE2ICs1MywxNiBAQAogICAgIElOQ19TVEFUUygiRE9NLkRhdGFi
YXNlLnRyYW5zYWN0aW9uKCkiKTsKIAogICAgIGlmIChhcmdzLkxlbmd0aCgpID09IDApIHsKLSAg
ICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpTWU5UQVhfRVJST1IsICJUcmFuc2Fj
dGlvbiBjYWxsYmFjayBpcyByZXF1aXJlZC4iKTsKKyAgICAgICAgVjhQcm94eTo6dGhyb3dFcnJv
cihWOFByb3h5OjpTWU5UQVhfRVJST1IsICJUcmFuc2FjdGlvbiBjYWxsYmFjayBpcyByZXF1aXJl
ZC4iKTsKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKICAgICB9CiAKICAgICBpZiAo
IWFyZ3NbMF0tPklzT2JqZWN0KCkpIHsKLSAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFBy
b3h5OjpUWVBFX0VSUk9SLCAiVHJhbnNhY3Rpb24gY2FsbGJhY2sgbXVzdCBiZSBvZiB2YWxpZCB0
eXBlLiIpOworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlRZUEVfRVJST1Is
ICJUcmFuc2FjdGlvbiBjYWxsYmFjayBtdXN0IGJlIG9mIHZhbGlkIHR5cGUuIik7CiAgICAgICAg
IHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgfQogCi0gICAgRGF0YWJhc2UqIGRhdGFiYXNl
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RGF0YWJhc2U+KFY4Q2xhc3NJbmRleDo6REFUQUJB
U0UsIGFyZ3MuSG9sZGVyKCkpOworICAgIERhdGFiYXNlKiBkYXRhYmFzZSA9IFY4UHJveHk6OmNv
bnZlcnRUb05hdGl2ZU9iamVjdDxEYXRhYmFzZT4oVjhDbGFzc0luZGV4OjpEQVRBQkFTRSwgYXJn
cy5Ib2xkZXIoKSk7CiAKICAgICBGcmFtZSogZnJhbWUgPSBWOFByb3h5OjpyZXRyaWV2ZUZyYW1l
KCk7CiAKQEAgLTcyLDcgKzcxLDcgQEAKICAgICBSZWZQdHI8VjhDdXN0b21TUUxUcmFuc2FjdGlv
bkVycm9yQ2FsbGJhY2s+IGVycm9yQ2FsbGJhY2s7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAx
KSB7CiAgICAgICAgIGlmICghYXJnc1sxXS0+SXNPYmplY3QoKSkgewotICAgICAgICAgICAgVjhQ
cm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiVHJhbnNhY3Rpb24gZXJyb3Ig
Y2FsbGJhY2sgbXVzdCBiZSBvZiB2YWxpZCB0eXBlLiIpOworICAgICAgICAgICAgVjhQcm94eTo6
dGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiVHJhbnNhY3Rpb24gZXJyb3IgY2FsbGJh
Y2sgbXVzdCBiZSBvZiB2YWxpZCB0eXBlLiIpOwogICAgICAgICAgICAgcmV0dXJuIHY4OjpVbmRl
ZmluZWQoKTsKICAgICAgICAgfQogICAgICAgICBlcnJvckNhbGxiYWNrID0gVjhDdXN0b21TUUxU
cmFuc2FjdGlvbkVycm9yQ2FsbGJhY2s6OmNyZWF0ZShhcmdzWzFdLCBmcmFtZSk7CkBAIC04MSw3
ICs4MCw3IEBACiAgICAgUmVmUHRyPFY4Q3VzdG9tVm9pZENhbGxiYWNrPiBzdWNjZXNzQ2FsbGJh
Y2s7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAyKSB7CiAgICAgICAgIGlmICghYXJnc1sxXS0+
SXNPYmplY3QoKSkgewotICAgICAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpU
WVBFX0VSUk9SLCAiVHJhbnNhY3Rpb24gc3VjY2VzcyBjYWxsYmFjayBtdXN0IGJlIG9mIHZhbGlk
IHR5cGUuIik7CisgICAgICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlRZUEVf
RVJST1IsICJUcmFuc2FjdGlvbiBzdWNjZXNzIGNhbGxiYWNrIG11c3QgYmUgb2YgdmFsaWQgdHlw
ZS4iKTsKICAgICAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgICAgIH0KICAg
ICAgICAgc3VjY2Vzc0NhbGxiYWNrID0gVjhDdXN0b21Wb2lkQ2FsbGJhY2s6OmNyZWF0ZShhcmdz
WzJdLCBmcmFtZSk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVBhcnNl
ckNvbnN0cnVjdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOERPTVBhcnNlckNvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVBhcnNlckNvbnN0cnVjdG9yLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzksNyArMzksNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKERPTVBhcnNlckNvbnN0
cnVjdG9yKQogewogICAgIElOQ19TVEFUUygiRE9NLkRPTVBhcnNlci5Db250cnVjdG9yIik7Ci0g
ICAgcmV0dXJuIFY4UHJveHk6OkNvbnN0cnVjdERPTU9iamVjdDxWOENsYXNzSW5kZXg6OkRPTVBB
UlNFUiwgRE9NUGFyc2VyPihhcmdzKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29uc3RydWN0RE9N
T2JqZWN0PFY4Q2xhc3NJbmRleDo6RE9NUEFSU0VSLCBET01QYXJzZXI+KGFyZ3MpOwogfQogCiB9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OERPTVdpbmRvd0N1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhET01XaW5kb3dDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4RE9NV2luZG93Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNjQsMTIgKzY0LDEyIEBACiAgICAgaWYgKGFyZ3VtZW50Q291bnQgPCAxKQogICAgICAgICBy
ZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgRE9NV2luZG93KiBpbXAgPSBWOFByb3h5OjpU
b05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhv
bGRlcigpKTsKKyAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsK
IAogICAgIGlmICghaW1wLT5mcmFtZSgpKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgp
OwogCi0gICAgaWYgKCFWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUp
KQorICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkK
ICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAogICAgIFNjcmlwdEV4ZWN1dGlvbkNv
bnRleHQqIHNjcmlwdENvbnRleHQgPSBzdGF0aWNfY2FzdDxTY3JpcHRFeGVjdXRpb25Db250ZXh0
Kj4oaW1wLT5mcmFtZSgpLT5kb2N1bWVudCgpKTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogc3RhdGlj
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252ZXJ0QmFzZTY0KGNvbnN0IFN0cmluZyYgc3RyLCBi
b29sIGVuY29kZSkKIHsKICAgICBpZiAoIWlzQXNjaWkoc3RyKSkgewotICAgICAgICBWOFByb3h5
OjpTZXRET01FeGNlcHRpb24oSU5WQUxJRF9DSEFSQUNURVJfRVJSKTsKKyAgICAgICAgVjhQcm94
eTo6c2V0RE9NRXhjZXB0aW9uKElOVkFMSURfQ0hBUkFDVEVSX0VSUik7CiAgICAgICAgIHJldHVy
biBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogICAgIH0KIApAQCAtMTYxLDIwICsxNjEsMjAg
QEAKIAogQUNDRVNTT1JfU0VUVEVSKERPTVdpbmRvd0xvY2F0aW9uKQogewotICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gaG9sZGVyID0gVjhQcm94eTo6TG9va3VwRE9NV3JhcHBlcihWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVywgaW5mby5UaGlzKCkpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVj
dD4gaG9sZGVyID0gVjhQcm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJ
TkRPVywgaW5mby5UaGlzKCkpOwogICAgIGlmIChob2xkZXIuSXNFbXB0eSgpKQogICAgICAgICBy
ZXR1cm47CiAKLSAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERP
TVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGhvbGRlcik7CisgICAgRE9NV2luZG93
KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVywgaG9sZGVyKTsKICAgICBXaW5kb3dTZXRMb2NhdGlvbihpbXAsIHRv
V2ViQ29yZVN0cmluZyh2YWx1ZSkpOwogfQogCiAKIEFDQ0VTU09SX1NFVFRFUihET01XaW5kb3dP
cGVuZXIpCiB7Ci0gICAgRE9NV2luZG93KiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxE
T01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLkhvbGRlcigpKTsKKyAgICBE
T01XaW5kb3cqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+
KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLkhvbGRlcigpKTsKIAotICAgIGlmICghVjhQ
cm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKKyAgICBpZiAoIVY4UHJv
eHk6OmNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgdHJ1ZSkpCiAgICAgICAgIHJldHVybjsK
ICAgCiAgICAgLy8gT3BlbmVyIGNhbiBiZSBzaGFkb3dlZCBpZiBpdCBpcyBpbiB0aGUgc2FtZSBk
b21haW4uCkBAIC0xOTcsOSArMTk3LDkgQEAKIENBTExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dB
ZGRFdmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5hZGRFdmVu
dExpc3RlbmVyKCkiKTsKLSAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2Jq
ZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGFyZ3MuSG9sZGVyKCkpOwor
ICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PERPTVdp
bmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGFyZ3MuSG9sZGVyKCkpOwogCi0gICAgaWYg
KCFWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUpKQorICAgIGlmICgh
VjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKICAgICAgICAgcmV0
dXJuIHY4OjpVbmRlZmluZWQoKTsKIAogICAgIGlmICghaW1wLT5mcmFtZSgpKQpAQCAtMjE0LDcg
KzIxNCw3IEBACiAgICAgaWYgKCFwcm94eSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQo
KTsKIAotICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JD
cmVhdGVWOEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExp
c3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIoYXJn
c1sxXSwgZmFsc2UpOwogCiAgICAgaWYgKGxpc3RlbmVyKSB7CiAgICAgICAgIFN0cmluZyBldmVu
dFR5cGUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CkBAIC0yMjksOSArMjI5LDkgQEAKIENB
TExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dSZW1vdmVFdmVudExpc3RlbmVyKQogewogICAgIElO
Q19TVEFUUygiRE9NLkRPTVdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCkiKTsKLSAgICBET01X
aW5kb3cqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0lu
ZGV4OjpET01XSU5ET1csIGFyZ3MuSG9sZGVyKCkpOworICAgIERPTVdpbmRvdyogaW1wID0gVjhQ
cm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01X
SU5ET1csIGFyZ3MuSG9sZGVyKCkpOwogCi0gICAgaWYgKCFWOFByb3h5OjpDYW5BY2Nlc3NGcmFt
ZShpbXAtPmZyYW1lKCksIHRydWUpKQorICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUo
aW1wLT5mcmFtZSgpLCB0cnVlKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAog
ICAgIGlmICghaW1wLT5mcmFtZSgpKQpAQCAtMjQ1LDcgKzI0NSw3IEBACiAgICAgaWYgKCFwcm94
eSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIFJlZlB0cjxFdmVudExp
c3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kVjhFdmVudExpc3RlbmVyKGFyZ3NbMV0sIGZh
bHNlKTsKKyAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+ZmluZFY4
RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAKICAgICBpZiAobGlzdGVuZXIpIHsKICAg
ICAgICAgU3RyaW5nIGV2ZW50VHlwZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKQEAgLTI1
OSw3ICsyNTksNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKERPTVdpbmRvd1Bvc3RNZXNzYWdlKQog
ewogICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5wb3N0TWVzc2FnZSgpIik7Ci0gICAgRE9N
V2luZG93KiB3aW5kb3cgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKKyAgICBET01XaW5kb3cqIHdpbmRv
dyA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRl
eDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIERPTVdpbmRvdyogc291cmNlID0g
VjhQcm94eTo6cmV0cmlldmVGcmFtZUZvckNhbGxpbmdDb250ZXh0KCktPmRvbVdpbmRvdygpOwog
ICAgIEFTU0VSVChzb3VyY2UtPmZyYW1lKCkpOwpAQCAtMjc1LDggKzI3NSw4IEBACiAgICAgLy8g
b3IKICAgICAvLyAgIHBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRhcmdldE9yaWdpbik7CiAgICAgaWYg
KGFyZ3MuTGVuZ3RoKCkgPiAyKSB7Ci0gICAgICAgIGlmIChWOFByb3h5OjpJc1dyYXBwZXJPZlR5
cGUoYXJnc1sxXSwgVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCkpCi0gICAgICAgICAgICBwb3J0
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TWVzc2FnZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVT
U0FHRVBPUlQsIGFyZ3NbMV0pOworICAgICAgICBpZiAoVjhQcm94eTo6aXNXcmFwcGVyT2ZUeXBl
KGFyZ3NbMV0sIFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQpKQorICAgICAgICAgICAgcG9ydCA9
IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxNZXNzYWdlUG9ydD4oVjhDbGFzc0luZGV4
OjpNRVNTQUdFUE9SVCwgYXJnc1sxXSk7CiAgICAgICAgIHRhcmdldE9yaWdpbiA9IHZhbHVlVG9T
dHJpbmdXaXRoTnVsbE9yVW5kZWZpbmVkQ2hlY2soYXJnc1syXSk7CiAgICAgfSBlbHNlIHsKICAg
ICAgICAgdGFyZ2V0T3JpZ2luID0gdmFsdWVUb1N0cmluZ1dpdGhOdWxsT3JVbmRlZmluZWRDaGVj
ayhhcmdzWzFdKTsKQEAgLTI4OCw3ICsyODgsNyBAQAogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAw
OwogICAgIHdpbmRvdy0+cG9zdE1lc3NhZ2UobWVzc2FnZSwgcG9ydCwgdGFyZ2V0T3JpZ2luLCBz
b3VyY2UsIGVjKTsKICAgICBpZiAoZWMpCi0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlv
bihlYyk7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAKICAgICByZXR1
cm4gdjg6OlVuZGVmaW5lZCgpOwogfQpAQCAtMjk2LDkgKzI5Niw5IEBACiBDQUxMQkFDS19GVU5D
X0RFQ0woRE9NV2luZG93QXRvYikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5ET01XaW5kb3cuYXRv
YigpIik7Ci0gICAgRE9NV2luZG93KiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01X
aW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKKyAgICBET01X
aW5kb3cqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4
Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKIAotICAgIGlmICghVjhQcm94
eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKKyAgICBpZiAoIVY4UHJveHk6
OmNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgdHJ1ZSkpCiAgICAgICAgIHJldHVybiB2ODo6
VW5kZWZpbmVkKCk7CiAKICAgICBpZiAoYXJncy5MZW5ndGgoKSA8IDEpCkBAIC0zMTQsOSArMzE0
LDkgQEAKIENBTExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dCdG9hKQogewogICAgIElOQ19TVEFU
UygiRE9NLkRPTVdpbmRvdy5idG9hKCkiKTsKLSAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6
OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGFyZ3Mu
SG9sZGVyKCkpOworICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGFyZ3MuSG9sZGVyKCkp
OwogCi0gICAgaWYgKCFWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUp
KQorICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkK
ICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAogICAgIGlmIChhcmdzLkxlbmd0aCgp
IDwgMSkKQEAgLTM3MywxMSArMzczLDExIEBACiAKIEFDQ0VTU09SX1NFVFRFUihET01XaW5kb3dF
dmVudEhhbmRsZXIpCiB7Ci0gICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFBy
b3h5OjpMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRoaXMo
KSk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5Ojpsb29rdXBE
T01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRoaXMoKSk7CiAgICAgaWYg
KGhvbGRlci5Jc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIERPTVdpbmRvdyogaW1w
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJ
TkRPVywgaG9sZGVyKTsKKyAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOwog
ICAgIGlmICghaW1wLT5mcmFtZSgpKQogICAgICAgICByZXR1cm47CiAKQEAgLTM5Nyw3ICszOTcs
NyBAQAogICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVy
PiBsaXN0ZW5lciA9Ci0gICAgICAgICAgICBwcm94eS0+RmluZE9yQ3JlYXRlVjhFdmVudExpc3Rl
bmVyKHZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgIHByb3h5LT5maW5kT3JDcmVhdGVWOEV2ZW50
TGlzdGVuZXIodmFsdWUsIHRydWUpOwogICAgICAgICBpZiAobGlzdGVuZXIpCiAgICAgICAgICAg
ICBpbXAtPnNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7CiAg
ICAgfQpAQCAtNDA1LDExICs0MDUsMTEgQEAKIAogQUNDRVNTT1JfR0VUVEVSKERPTVdpbmRvd0V2
ZW50SGFuZGxlcikKIHsKLSAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJv
eHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGluZm8uVGhpcygp
KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Omxvb2t1cERP
TVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGluZm8uVGhpcygpKTsKICAgICBpZiAo
aG9sZGVyLklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAg
IERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENs
YXNzSW5kZXg6OkRPTVdJTkRPVywgaG9sZGVyKTsKKyAgICBET01XaW5kb3cqIGltcCA9IFY4UHJv
eHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lO
RE9XLCBob2xkZXIpOwogICAgIGlmICghaW1wLT5mcmFtZSgpKQogICAgICAgICByZXR1cm4gdjg6
OlVuZGVmaW5lZCgpOwogCkBAIC00MjEsNyArNDIxLDcgQEAKICAgICBTdHJpbmcgZXZlbnRUeXBl
ID0gZXZlbnROYW1lRnJvbUF0dHJpYnV0ZU5hbWUoa2V5KTsKIAogICAgIEV2ZW50TGlzdGVuZXIq
IGxpc3RlbmVyID0gaW1wLT5nZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSk7Ci0g
ICAgcmV0dXJuIFY4UHJveHk6OkV2ZW50TGlzdGVuZXJUb1Y4T2JqZWN0KGxpc3RlbmVyKTsKKyAg
ICByZXR1cm4gVjhQcm94eTo6Y29udmVydEV2ZW50TGlzdGVuZXJUb1Y4T2JqZWN0KGxpc3RlbmVy
KTsKIH0KIAogc3RhdGljIGJvb2wgY2FuU2hvd01vZGFsRGlhbG9nTm93KGNvbnN0IEZyYW1lKiBm
cmFtZSkKQEAgLTUxOCw3ICs1MTgsNyBAQAogCiAgICAgLy8gU2V0IGRpYWxvZyBhcmd1bWVudHMg
b24gdGhlIGdsb2JhbCBvYmplY3Qgb2YgdGhlIG5ldyBmcmFtZS4KICAgICBpZiAoIWRpYWxvZ0Fy
Z3MuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9
IFY4UHJveHk6OkdldENvbnRleHQobmV3RnJhbWUpOworICAgICAgICB2ODo6TG9jYWw8djg6OkNv
bnRleHQ+IGNvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KG5ld0ZyYW1lKTsKICAgICAgICAgaWYg
KCFjb250ZXh0LklzRW1wdHkoKSkgewogICAgICAgICAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNj
b3BlKGNvbnRleHQpOwogICAgICAgICAgICAgY29udGV4dC0+R2xvYmFsKCktPlNldCh2ODo6U3Ry
aW5nOjpOZXcoImRpYWxvZ0FyZ3VtZW50cyIpLCBkaWFsb2dBcmdzKTsKQEAgLTU0NCwxMSArNTQ0
LDExIEBACiBDQUxMQkFDS19GVU5DX0RFQ0woRE9NV2luZG93U2hvd01vZGFsRGlhbG9nKQogewog
ICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5zaG93TW9kYWxEaWFsb2coKSIpOwotICAgIERP
TVdpbmRvdyogd2luZG93ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PigKKyAg
ICBET01XaW5kb3cqIHdpbmRvdyA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01X
aW5kb3c+KAogICAgICAgICBWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7
CiAgICAgRnJhbWUqIGZyYW1lID0gd2luZG93LT5mcmFtZSgpOwogCi0gICAgaWYgKCFmcmFtZSB8
fCAhVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoZnJhbWUsIHRydWUpKSAKKyAgICBpZiAoIWZyYW1l
IHx8ICFWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZShmcmFtZSwgdHJ1ZSkpIAogICAgICAgICByZXR1
cm4gdjg6OlVuZGVmaW5lZCgpOwogCiAgICAgRnJhbWUqIGNhbGxpbmdGcmFtZSA9IFY4UHJveHk6
OnJldHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29udGV4dCgpOwpAQCAtNjExLDcgKzYxMSw3IEBACiAK
ICAgICAvLyBIb2xkIG9uIHRvIHRoZSBjb250ZXh0IG9mIHRoZSBkaWFsb2cgd2luZG93IGxvbmcg
ZW5vdWdoIHRvIHJldHJpZXZlIHRoZQogICAgIC8vIHZhbHVlIG9mIHRoZSByZXR1cm4gdmFsdWUg
cHJvcGVydHkuCi0gICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6
R2V0Q29udGV4dChkaWFsb2dGcmFtZSk7CisgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250
ZXh0ID0gVjhQcm94eTo6Y29udGV4dChkaWFsb2dGcmFtZSk7CiAKICAgICAvLyBSdW4gdGhlIGRp
YWxvZy4KICAgICBkaWFsb2dGcmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+cnVuTW9kYWwoKTsKQEAg
LTYzMywxMCArNjMzLDEwIEBACiBDQUxMQkFDS19GVU5DX0RFQ0woRE9NV2luZG93T3BlbikKIHsK
ICAgICBJTkNfU1RBVFMoIkRPTS5ET01XaW5kb3cub3BlbigpIik7Ci0gICAgRE9NV2luZG93KiBw
YXJlbnQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6
RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKKyAgICBET01XaW5kb3cqIHBhcmVudCA9IFY4UHJv
eHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lO
RE9XLCBhcmdzLkhvbGRlcigpKTsKICAgICBGcmFtZSogZnJhbWUgPSBwYXJlbnQtPmZyYW1lKCk7
CiAKLSAgICBpZiAoIWZyYW1lIHx8ICFWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShmcmFtZSwgdHJ1
ZSkpCisgICAgaWYgKCFmcmFtZSB8fCAhVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoZnJhbWUsIHRy
dWUpKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCiAgICAgRnJhbWUqIGNhbGxp
bmdGcmFtZSA9IFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29udGV4dCgpOwpAQCAt
NjkxLDcgKzY5MSw3IEBACiAKICAgICAgICAgICAgIGZyYW1lLT5sb2FkZXIoKS0+c2NoZWR1bGVM
b2NhdGlvbkNoYW5nZShjb21wbGV0ZWRVcmwsIHJlZmVycmVyLCBmYWxzZSwgdXNlckdlc3R1cmUp
OwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJ
bmRleDo6RE9NV0lORE9XLCBmcmFtZS0+ZG9tV2luZG93KCkpOworICAgICAgICByZXR1cm4gVjhQ
cm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGZyYW1lLT5k
b21XaW5kb3coKSk7CiAgICAgfQogCiAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgYSBuYW1lZCBmcmFt
ZSBvciBhIG5ldyB3aW5kb3csIHdlJ2xsIHVzZSB0aGUKQEAgLTc1MSwxOCArNzUxLDE4IEBACiAg
ICAgaWYgKCFmcmFtZSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIHJl
dHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBmcmFtZS0+
ZG9tV2luZG93KCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENs
YXNzSW5kZXg6OkRPTVdJTkRPVywgZnJhbWUtPmRvbVdpbmRvdygpKTsKIH0KIAogCiBJTkRFWEVE
X1BST1BFUlRZX0dFVFRFUihET01XaW5kb3cpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uRE9NV2lu
ZG93LkluZGV4ZWRQcm9wZXJ0eUdldHRlciIpOwotICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
aG9sZGVyID0gVjhQcm94eTo6TG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRP
VywgaW5mby5UaGlzKCkpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gVjhQ
cm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaW5mby5UaGlz
KCkpOwogICAgIGlmIChob2xkZXIuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gbm90SGFuZGxl
ZEJ5SW50ZXJjZXB0b3IoKTsKIAotICAgIERPTVdpbmRvdyogd2luZG93ID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaG9sZGVyKTsK
KyAgICBET01XaW5kb3cqIHdpbmRvdyA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxE
T01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOwogICAgIGlmICghd2lu
ZG93KQogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKIApAQCAtNzcy
LDcgKzc3Miw3IEBACiAKICAgICBGcmFtZSogY2hpbGQgPSBmcmFtZS0+dHJlZSgpLT5jaGlsZChp
bmRleCk7CiAgICAgaWYgKGNoaWxkKQotICAgICAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVj
dChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgY2hpbGQtPmRvbVdpbmRvdygpKTsKKyAgICAgICAg
cmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9X
LCBjaGlsZC0+ZG9tV2luZG93KCkpOwogCiAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2Vw
dG9yKCk7CiB9CkBAIC03ODIsMTEgKzc4MiwxMSBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkRP
TVdpbmRvdy5OYW1lZFByb3BlcnR5R2V0dGVyIik7CiAKLSAgICB2ODo6SGFuZGxlPHY4OjpPYmpl
Y3Q+IGhvbGRlciA9IFY4UHJveHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01X
SU5ET1csIGluZm8uVGhpcygpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9
IFY4UHJveHk6Omxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGluZm8u
VGhpcygpKTsKICAgICBpZiAoaG9sZGVyLklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIG5vdEhh
bmRsZWRCeUludGVyY2VwdG9yKCk7CiAKLSAgICBET01XaW5kb3cqIHdpbmRvdyA9IFY4UHJveHk6
OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGhvbGRl
cik7CisgICAgRE9NV2luZG93KiB3aW5kb3cgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmpl
Y3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaG9sZGVyKTsKICAgICBpZiAo
IXdpbmRvdykKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAKQEAg
LTc5OSw3ICs3OTksNyBAQAogICAgIEF0b21pY1N0cmluZyBwcm9wTmFtZSA9IHY4U3RyaW5nVG9B
dG9taWNXZWJDb3JlU3RyaW5nKG5hbWUpOwogICAgIEZyYW1lKiBjaGlsZCA9IGZyYW1lLT50cmVl
KCktPmNoaWxkKHByb3BOYW1lKTsKICAgICBpZiAoY2hpbGQpCi0gICAgICAgIHJldHVybiBWOFBy
b3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBjaGlsZC0+ZG9tV2luZG93
KCkpOworICAgICAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0lu
ZGV4OjpET01XSU5ET1csIGNoaWxkLT5kb21XaW5kb3coKSk7CiAKICAgICAvLyBTZWFyY2ggSURM
IGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBwcm90b3R5cGUKICAgICB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gcmVzdWx0ID0gaG9sZGVyLT5HZXRSZWFsTmFtZWRQcm9wZXJ0eUluUHJvdG90eXBlQ2hh
aW4obmFtZSk7CkBAIC04MTIsOSArODEyLDkgQEAKICAgICAgICAgUmVmUHRyPEhUTUxDb2xsZWN0
aW9uPiBpdGVtcyA9IGRvYy0+d2luZG93TmFtZWRJdGVtcyhwcm9wTmFtZSk7CiAgICAgICAgIGlm
IChpdGVtcy0+bGVuZ3RoKCkgPj0gMSkgewogICAgICAgICAgICAgaWYgKGl0ZW1zLT5sZW5ndGgo
KSA9PSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChp
dGVtcy0+Zmlyc3RJdGVtKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252
ZXJ0Tm9kZVRvVjhPYmplY3QoaXRlbXMtPmZpcnN0SXRlbSgpKTsKICAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6
OkhUTUxDT0xMRUNUSU9OLCBpdGVtcy5nZXQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFY4
UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGl0
ZW1zLmdldCgpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtODU2LDggKzg1Niw4IEBACiB2b2lk
IFY4Q3VzdG9tOjpDbGVhclRpbWVvdXRJbXBsKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCiB7
CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhvbGRlciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAg
RE9NV2luZG93KiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOwotICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNz
RnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKKyAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9X
LCBob2xkZXIpOworICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgp
LCB0cnVlKSkKICAgICAgICAgcmV0dXJuOwogICAgIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNv
bnRleHQgPSBzdGF0aWNfY2FzdDxTY3JpcHRFeGVjdXRpb25Db250ZXh0Kj4oaW1wLT5mcmFtZSgp
LT5kb2N1bWVudCgpKTsKICAgICBpbnQgaGFuZGxlID0gdG9JbnQzMihhcmdzWzBdKTsKQEAgLTg4
MiwxMSArODgyLDExIEBACiBOQU1FRF9BQ0NFU1NfQ0hFQ0soRE9NV2luZG93KQogewogICAgIEFT
U0VSVChWOENsYXNzSW5kZXg6OkZyb21JbnQoZGF0YS0+SW50MzJWYWx1ZSgpKSA9PSBWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVyk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdpbmRvdyA9IFY4
UHJveHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGhvc3QpOwor
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3aW5kb3cgPSBWOFByb3h5Ojpsb29rdXBET01XcmFw
cGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob3N0KTsKICAgICBpZiAod2luZG93LklzRW1w
dHkoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGZyYW1lIGlzIGdvbmUuCiAKLSAg
ICBET01XaW5kb3cqIHRhcmdldFdpbmRvdyA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdp
bmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIHdpbmRvdyk7CisgICAgRE9NV2luZG93KiB0
YXJnZXRXaW5kb3cgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihW
OENsYXNzSW5kZXg6OkRPTVdJTkRPVywgd2luZG93KTsKIAogICAgIEFTU0VSVCh0YXJnZXRXaW5k
b3cpOwogCkBAIC05MDIsMTcgKzkwMiwxNyBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAg
ICAgfQogCi0gICAgcmV0dXJuIFY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKHRhcmdldCwgZmFsc2Up
OworICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZSh0YXJnZXQsIGZhbHNlKTsKIH0K
IAogSU5ERVhFRF9BQ0NFU1NfQ0hFQ0soRE9NV2luZG93KQogewogICAgIEFTU0VSVChWOENsYXNz
SW5kZXg6OkZyb21JbnQoZGF0YS0+SW50MzJWYWx1ZSgpKSA9PSBWOENsYXNzSW5kZXg6OkRPTVdJ
TkRPVyk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdpbmRvdyA9IFY4UHJveHk6Okxvb2t1
cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGhvc3QpOworICAgIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiB3aW5kb3cgPSBWOFByb3h5Ojpsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJ
bmRleDo6RE9NV0lORE9XLCBob3N0KTsKICAgICBpZiAod2luZG93LklzRW1wdHkoKSkKICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogCi0gICAgRE9NV2luZG93KiB0YXJnZXRXaW5kb3cgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCB3aW5k
b3cpOworICAgIERPTVdpbmRvdyogdGFyZ2V0V2luZG93ID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIHdpbmRvdyk7CiAK
ICAgICBBU1NFUlQodGFyZ2V0V2luZG93KTsKIApAQCAtOTI0LDcgKzkyNCw3IEBACiAgICAgaWYg
KCh0eXBlID09IHY4OjpBQ0NFU1NfR0VUIHx8IHR5cGUgPT0gdjg6OkFDQ0VTU19IQVMpICYmIHRh
cmdldC0+dHJlZSgpLT5jaGlsZChpbmRleCkpCiAgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAg
cmV0dXJuIFY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKHRhcmdldCwgZmFsc2UpOworICAgIHJldHVy
biBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZSh0YXJnZXQsIGZhbHNlKTsKIH0KIAogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21Y
UGF0aE5TUmVzb2x2ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4Q3VzdG9tWFBhdGhOU1Jlc29sdmVyLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVhQYXRoTlNSZXNvbHZlci5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTYxLDcgKzYxLDcgQEAKIAogICAgIGlmIChsb29rdXBOYW1lc3BhY2VVUklG
dW5jLklzRW1wdHkoKSAmJiAhbV9yZXNvbHZlci0+SXNGdW5jdGlvbigpKSB7CiAgICAgICAgIEZy
YW1lKiBmcmFtZSA9IFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JFbnRlcmVkQ29udGV4dCgpOwot
ICAgICAgICBsb2dfaW5mbyhmcmFtZSwgIlhQYXRoTlNSZXNvbHZlciBkb2VzIG5vdCBoYXZlIGEg
bG9va3VwTmFtZXNwYWNlVVJJIG1ldGhvZC4iLCBTdHJpbmcoKSk7CisgICAgICAgIGxvZ0luZm8o
ZnJhbWUsICJYUGF0aE5TUmVzb2x2ZXIgZG9lcyBub3QgaGF2ZSBhIGxvb2t1cE5hbWVzcGFjZVVS
SSBtZXRob2QuIiwgU3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAgICAgfQog
CkBAIC03NCw3ICs3NCw3IEBACiAgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+IGZ1bmN0aW9u
ID0gbG9va3VwTmFtZXNwYWNlVVJJRnVuYy5Jc0VtcHR5KCkgPyB2ODo6SGFuZGxlPHY4OjpGdW5j
dGlvbj46OkNhc3QobV9yZXNvbHZlcikgOiBsb29rdXBOYW1lc3BhY2VVUklGdW5jOwogCiAgICAg
VjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZSgpOwotICAgIHY4OjpIYW5kbGU8djg6
OlZhbHVlPiByZXR2YWwgPSBwcm94eS0+Q2FsbEZ1bmN0aW9uKGZ1bmN0aW9uLCBtX3Jlc29sdmVy
LCBhcmdjLCBhcmd2KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmV0dmFsID0gcHJveHkt
PmNhbGxGdW5jdGlvbihmdW5jdGlvbiwgbV9yZXNvbHZlciwgYXJnYywgYXJndik7CiAKICAgICAv
LyBFYXQgZXhjZXB0aW9ucyBmcm9tIG5hbWVzcGFjZSByZXNvbHZlciBhbmQgcmV0dXJuIGFuIGVt
cHR5IHN0cmluZy4gVGhpcyB3aWxsIG1vc3QgbGlrZWx5IGNhdXNlIE5BTUVTUEFDRV9FUlIuCiAg
ICAgaWYgKHRyeV9jYXRjaC5IYXNDYXVnaHQoKSkKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4V29ya2VyQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOFdvcmtlckN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhXb3JrZXJDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC04Myw3ICs4Myw3IEBACiAgICAgfQogCiAgICAgLy8gQ3JlYXRlIHRoZSB3b3JrZXIgb2JqZWN0
LgotICAgIC8vIE5vdGU6IGl0J3MgT0sgdG8gbGV0IHRoaXMgUmVmUHRyIGdvIG91dCBvZiBzY29w
ZSBiZWNhdXNlIHdlIGFsc28gY2FsbCBTZXRET01XcmFwcGVyKCksIHdoaWNoIGVmZmVjdGl2ZWx5
IGhvbGRzIGEgcmVmZXJlbmNlIHRvIG9iai4KKyAgICAvLyBOb3RlOiBpdCdzIE9LIHRvIGxldCB0
aGlzIFJlZlB0ciBnbyBvdXQgb2Ygc2NvcGUgYmVjYXVzZSB3ZSBhbHNvIGNhbGwgc2V0RE9NV3Jh
cHBlcigpLCB3aGljaCBlZmZlY3RpdmVseSBob2xkcyBhIHJlZmVyZW5jZSB0byBvYmouCiAgICAg
RXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAgUmVmUHRyPFdvcmtlcj4gb2JqID0gV29ya2VyOjpj
cmVhdGUodG9XZWJDb3JlU3RyaW5nKHNjcmlwdFVybCksIGNvbnRleHQsIGVjKTsKIApAQCAtOTIs
MTAgKzkyLDEwIEBACiAKICAgICAvLyBTZXR1cCB0aGUgc3RhbmRhcmQgd3JhcHBlciBvYmplY3Qg
aW50ZXJuYWwgZmllbGRzLgogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlck9iamVj
dCA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgVjhQcm94eTo6U2V0RE9NV3JhcHBlcih3cmFwcGVyT2Jq
ZWN0LCBWOENsYXNzSW5kZXg6OldPUktFUiwgb2JqLmdldCgpKTsKKyAgICBWOFByb3h5OjpzZXRE
T01XcmFwcGVyKHdyYXBwZXJPYmplY3QsIFY4Q2xhc3NJbmRleDo6V09SS0VSLCBvYmouZ2V0KCkp
OwogCiAgICAgb2JqLT5yZWYoKTsKLSAgICBWOFByb3h5OjpTZXRKU1dyYXBwZXJGb3JBY3RpdmVE
T01PYmplY3Qob2JqLmdldCgpLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHdyYXBw
ZXJPYmplY3QpKTsKKyAgICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JBY3RpdmVET01PYmplY3Qo
b2JqLmdldCgpLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHdyYXBwZXJPYmplY3Qp
KTsKIAogICAgIHJldHVybiB3cmFwcGVyT2JqZWN0OwogfQpAQCAtMTEwLDcgKzExMCw3IEBACiAK
ICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKHdvcmtlci0+c2NyaXB0RXhl
Y3V0aW9uQ29udGV4dCgpKTsKICAgICBpZiAocHJveHkpCi0gICAgICAgIHJldHVybiBmaW5kT25s
eSA/IHByb3h5LT5GaW5kT2JqZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2UpIDogcHJveHkt
PkZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKTsKKyAgICAgICAg
cmV0dXJuIGZpbmRPbmx5ID8gcHJveHktPmZpbmRPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBm
YWxzZSkgOiBwcm94eS0+ZmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFs
c2UpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xMTgsNyArMTE4LDcgQEAKIEFDQ0VTU09SX0dF
VFRFUihXb3JrZXJPbm1lc3NhZ2UpCiB7CiAgICAgSU5DX1NUQVRTKEwiRE9NLldvcmtlci5vbm1l
c3NhZ2UuX2dldCIpOwotICAgIFdvcmtlciogd29ya2VyID0gVjhQcm94eTo6VG9OYXRpdmVPYmpl
Y3Q8V29ya2VyPihWOENsYXNzSW5kZXg6OldPUktFUiwgaW5mby5Ib2xkZXIoKSk7CisgICAgV29y
a2VyKiB3b3JrZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8V29ya2VyPihWOENs
YXNzSW5kZXg6OldPUktFUiwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHdvcmtlci0+b25tZXNz
YWdlKCkpIHsKICAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRp
Y19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHdvcmtlci0+b25tZXNzYWdlKCkpOwogICAg
ICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0
ZW5lck9iamVjdCgpOwpAQCAtMTMwLDcgKzEzMCw3IEBACiBBQ0NFU1NPUl9TRVRURVIoV29ya2Vy
T25tZXNzYWdlKQogewogICAgIElOQ19TVEFUUyhMIkRPTS5Xb3JrZXIub25tZXNzYWdlLl9zZXQi
KTsKLSAgICBXb3JrZXIqIHdvcmtlciA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlcj4o
VjhDbGFzc0luZGV4OjpXT1JLRVIsIGluZm8uSG9sZGVyKCkpOworICAgIFdvcmtlciogd29ya2Vy
ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFdvcmtlcj4oVjhDbGFzc0luZGV4OjpX
T1JLRVIsIGluZm8uSG9sZGVyKCkpOwogICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogb2xkTGlz
dGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih3b3JrZXItPm9ubWVz
c2FnZSgpKTsKICAgICBpZiAodmFsdWUtPklzTnVsbCgpKSB7CiAgICAgICAgIGlmIChvbGRMaXN0
ZW5lcikgewpAQCAtMTU3LDcgKzE1Nyw3IEBACiBBQ0NFU1NPUl9HRVRURVIoV29ya2VyT25lcnJv
cikKIHsKICAgICBJTkNfU1RBVFMoTCJET00uV29ya2VyLm9uZXJyb3IuX2dldCIpOwotICAgIFdv
cmtlciogd29ya2VyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8V29ya2VyPihWOENsYXNzSW5k
ZXg6OldPUktFUiwgaW5mby5Ib2xkZXIoKSk7CisgICAgV29ya2VyKiB3b3JrZXIgPSBWOFByb3h5
Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8V29ya2VyPihWOENsYXNzSW5kZXg6OldPUktFUiwgaW5m
by5Ib2xkZXIoKSk7CiAgICAgaWYgKHdvcmtlci0+b25lcnJvcigpKSB7CiAgICAgICAgIFY4T2Jq
ZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlz
dGVuZXIqPih3b3JrZXItPm9uZXJyb3IoKSk7CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0
PiB2OExpc3RlbmVyID0gbGlzdGVuZXItPmdldExpc3RlbmVyT2JqZWN0KCk7CkBAIC0xNjksNyAr
MTY5LDcgQEAKIEFDQ0VTU09SX1NFVFRFUihXb3JrZXJPbmVycm9yKQogewogICAgIElOQ19TVEFU
UyhMIkRPTS5Xb3JrZXIub25lcnJvci5fc2V0Iik7Ci0gICAgV29ya2VyKiB3b3JrZXIgPSBWOFBy
b3h5OjpUb05hdGl2ZU9iamVjdDxXb3JrZXI+KFY4Q2xhc3NJbmRleDo6V09SS0VSLCBpbmZvLkhv
bGRlcigpKTsKKyAgICBXb3JrZXIqIHdvcmtlciA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxXb3JrZXI+KFY4Q2xhc3NJbmRleDo6V09SS0VSLCBpbmZvLkhvbGRlcigpKTsKICAgICBW
OE9iamVjdEV2ZW50TGlzdGVuZXIqIG9sZExpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RF
dmVudExpc3RlbmVyKj4od29ya2VyLT5vbmVycm9yKCkpOwogICAgIGlmICh2YWx1ZS0+SXNOdWxs
KCkpIHsKICAgICAgICAgaWYgKG9sZExpc3RlbmVyKSB7CkBAIC0xOTYsNyArMTk2LDcgQEAKIENB
TExCQUNLX0ZVTkNfREVDTChXb3JrZXJBZGRFdmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFU
UyhMIkRPTS5Xb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcigpIik7Ci0gICAgV29ya2VyKiB3b3JrZXIg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxXb3JrZXI+KFY4Q2xhc3NJbmRleDo6V09SS0VSLCBh
cmdzLkhvbGRlcigpKTsKKyAgICBXb3JrZXIqIHdvcmtlciA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxXb3JrZXI+KFY4Q2xhc3NJbmRleDo6V09SS0VSLCBhcmdzLkhvbGRlcigpKTsK
IAogICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IGdldEV2ZW50TGlzdGVuZXIo
d29ya2VyLCBhcmdzWzFdLCBmYWxzZSk7CiAgICAgaWYgKGxpc3RlbmVyKSB7CkBAIC0yMTIsNyAr
MjEyLDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChXb3JrZXJSZW1vdmVFdmVudExpc3RlbmVyKQog
ewogICAgIElOQ19TVEFUUyhMIkRPTS5Xb3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigpIik7Ci0g
ICAgV29ya2VyKiB3b3JrZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxXb3JrZXI+KFY4Q2xh
c3NJbmRleDo6V09SS0VSLCBhcmdzLkhvbGRlcigpKTsKKyAgICBXb3JrZXIqIHdvcmtlciA9IFY4
UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxXb3JrZXI+KFY4Q2xhc3NJbmRleDo6V09SS0VS
LCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9
IGdldEV2ZW50TGlzdGVuZXIod29ya2VyLCBhcmdzWzFdLCB0cnVlKTsKICAgICBpZiAobGlzdGVu
ZXIpIHsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTENhbnZhc0VsZW1l
bnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
SFRNTENhbnZhc0VsZW1lbnRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTENhbnZhc0VsZW1lbnRDdXN0b20uY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00MCwxMiArNDAsMTIgQEAKIAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEhUTUxDYW52
YXNFbGVtZW50R2V0Q29udGV4dCkKIHsKLSAgICBJTkNfU1RBVFMoIkRPTS5IVE1MQ2FudmFzRWxl
bWVudC5nZXRDb250ZXh0Iik7CisgICAgSU5DX1NUQVRTKCJET00uSFRNTENhbnZhc0VsZW1lbnQu
Y29udGV4dCIpOwogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBob2xkZXIgPSBhcmdzLkhvbGRl
cigpOwotICAgIEhUTUxDYW52YXNFbGVtZW50KiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPEhUTUxDYW52YXNFbGVtZW50Pihob2xkZXIpOworICAgIEhUTUxDYW52YXNFbGVtZW50KiBp
bXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MQ2FudmFzRWxlbWVudD4o
aG9sZGVyKTsKICAgICBTdHJpbmcgY29udGV4dElkID0gVG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0p
OwogICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogcmVzdWx0ID0gaW1wLT5nZXRDb250ZXh0
KGNvbnRleHRJZCk7Ci0gICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4
OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIHJlc3VsdCk7CisgICAgcmV0dXJuIFY4UHJveHk6
OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJE
LCByZXN1bHQpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOFdlYktpdFBvaW50Q29uc3RydWN0b3IuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V2ViS2l0UG9pbnRDb25zdHJ1Y3Rvci5j
cHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhXZWJL
aXRQb2ludENvbnN0cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDAsNyArNDAsNyBAQAog
Q0FMTEJBQ0tfRlVOQ19ERUNMKFdlYktpdFBvaW50Q29uc3RydWN0b3IpCiB7CiAgICAgSU5DX1NU
QVRTKCJET00uV2ViS2l0UG9pbnQuQ29uc3RydWN0b3IiKTsKLSAgICByZXR1cm4gVjhQcm94eTo6
Q29uc3RydWN0RE9NT2JqZWN0PFY4Q2xhc3NJbmRleDo6V0VCS0lUUE9JTlQsIFdlYktpdFBvaW50
PihhcmdzKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29uc3RydWN0RE9NT2JqZWN0PFY4Q2xhc3NJ
bmRleDo6V0VCS0lUUE9JTlQsIFdlYktpdFBvaW50PihhcmdzKTsKIH0KIAogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDYW52YXNQaXhl
bEFycmF5Q3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOENhbnZhc1BpeGVsQXJyYXlDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2FudmFzUGl4ZWxBcnJheUN1c3RvbS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTQxLDcgKzQxLDcgQEAKIElOREVYRURfUFJPUEVSVFlfR0VUVEVSKENhbnZh
c1BpeGVsQXJyYXkpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUGl4ZWxBcnJheS5JbmRl
eGVkUHJvcGVydHlHZXR0ZXIiKTsKLSAgICBDYW52YXNQaXhlbEFycmF5KiBwaXhlbEJ1ZmZlciA9
IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZhc1BpeGVsQXJyYXk+KFY4Q2xhc3NJbmRleDo6
Q0FOVkFTUElYRUxBUlJBWSwgaW5mby5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUGl4ZWxBcnJheSog
cGl4ZWxCdWZmZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2FudmFzUGl4ZWxB
cnJheT4oVjhDbGFzc0luZGV4OjpDQU5WQVNQSVhFTEFSUkFZLCBpbmZvLkhvbGRlcigpKTsKIAog
ICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gcGl4ZWxCdWZmZXItPmxlbmd0aCgpKSkK
ICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKQEAgLTU1LDcgKzU1LDcgQEAKIElOREVY
RURfUFJPUEVSVFlfU0VUVEVSKENhbnZhc1BpeGVsQXJyYXkpCiB7CiAgICAgSU5DX1NUQVRTKCJE
T00uQ2FudmFzUGl4ZWxBcnJheS5JbmRleGVkUHJvcGVydHlTZXR0ZXIiKTsKLSAgICBDYW52YXNQ
aXhlbEFycmF5KiBwaXhlbEJ1ZmZlciA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZhc1Bp
eGVsQXJyYXk+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUElYRUxBUlJBWSwgaW5mby5Ib2xkZXIoKSk7
CisgICAgQ2FudmFzUGl4ZWxBcnJheSogcGl4ZWxCdWZmZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8Q2FudmFzUGl4ZWxBcnJheT4oVjhDbGFzc0luZGV4OjpDQU5WQVNQSVhFTEFS
UkFZLCBpbmZvLkhvbGRlcigpKTsKIAogICAgIGlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwg
cGl4ZWxCdWZmZXItPmxlbmd0aCgpKSkKICAgICAgICAgcGl4ZWxCdWZmZXItPnNldChpbmRleCwg
dmFsdWUtPk51bWJlclZhbHVlKCkpOwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhDdXN0b21Wb2lkQ2FsbGJhY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4Q3VzdG9tVm9pZENhbGxiYWNrLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVZvaWRDYWxsYmFjay5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTUwLDcgKzUwLDcgQEAKIHsKICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxl
U2NvcGU7CiAKLSAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6
R2V0Q29udGV4dChtX2ZyYW1lLmdldCgpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBj
b250ZXh0ID0gVjhQcm94eTo6Y29udGV4dChtX2ZyYW1lLmdldCgpKTsKICAgICBpZiAoY29udGV4
dC5Jc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKIApAQCAtODcsNyArODcsNyBAQAogICAgIFY4
UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUoKTsKICAgICBBU1NFUlQocHJveHkpOwog
Ci0gICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJlc3VsdCA9IHByb3h5LT5DYWxsRnVuY3Rpb24o
Y2FsbGJhY2tGdW5jdGlvbiwgdGhpc09iamVjdCwgYXJnYywgYXJndik7CisgICAgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IHJlc3VsdCA9IHByb3h5LT5jYWxsRnVuY3Rpb24oY2FsbGJhY2tGdW5jdGlv
biwgdGhpc09iamVjdCwgYXJnYywgYXJndik7CiAKICAgICBjYWxsYmFja1JldHVyblZhbHVlID0g
cmVzdWx0LklzRW1wdHkoKSAmJiByZXN1bHQtPklzQm9vbGVhbigpICYmIHJlc3VsdC0+Qm9vbGVh
blZhbHVlKCk7CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V29ya2VyQ29u
dGV4dEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhXb3JrZXJDb250ZXh0Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckNvbnRleHRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC00OSwxNCArNDksMTQgQEAKIEFDQ0VTU09SX0dFVFRFUihXb3JrZXJDb250ZXh0U2VsZikK
IHsKICAgICBJTkNfU1RBVFMoTCJET00uV29ya2VyQ29udGV4dC5zZWxmLl9nZXQiKTsKLSAgICBX
b3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8V29y
a2VyQ29udGV4dD4oVjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhULCBpbmZvLkhvbGRlcigpKTsK
KyAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCwgaW5m
by5Ib2xkZXIoKSk7CiAgICAgcmV0dXJuIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6V29y
a2VyQ29udGV4dFRvVjhPYmplY3Qod29ya2VyQ29udGV4dCk7CiB9CiAKIEFDQ0VTU09SX0dFVFRF
UihXb3JrZXJDb250ZXh0T25tZXNzYWdlKQogewogICAgIElOQ19TVEFUUyhMIkRPTS5Xb3JrZXJD
b250ZXh0Lm9ubWVzc2FnZS5fZ2V0Iik7Ci0gICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4
dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6
V09SS0VSQ09OVEVYVCwgaW5mby5Ib2xkZXIoKSk7CisgICAgV29ya2VyQ29udGV4dCogd29ya2Vy
Q29udGV4dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxXb3JrZXJDb250ZXh0PihW
OENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh3b3Jr
ZXJDb250ZXh0LT5vbm1lc3NhZ2UoKSkgewogICAgICAgICBWOFdvcmtlckNvbnRleHRFdmVudExp
c3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVu
ZXIqPih3b3JrZXJDb250ZXh0LT5vbm1lc3NhZ2UoKSk7CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6
T2JqZWN0PiB2OExpc3RlbmVyID0gbGlzdGVuZXItPmdldExpc3RlbmVyT2JqZWN0KCk7CkBAIC02
OCw3ICs2OCw3IEBACiBBQ0NFU1NPUl9TRVRURVIoV29ya2VyQ29udGV4dE9ubWVzc2FnZSkKIHsK
ICAgICBJTkNfU1RBVFMoTCJET00uV29ya2VyQ29udGV4dC5vbm1lc3NhZ2UuX3NldCIpOwotICAg
IFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxX
b3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGluZm8uSG9sZGVyKCkp
OworICAgIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8V29ya2VyQ29udGV4dD4oVjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhULCBp
bmZvLkhvbGRlcigpKTsKICAgICBWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyKiBvbGRMaXN0
ZW5lciA9IHN0YXRpY19jYXN0PFY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIqPih3b3JrZXJD
b250ZXh0LT5vbm1lc3NhZ2UoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAg
ICBpZiAod29ya2VyQ29udGV4dC0+b25tZXNzYWdlKCkpIHsKQEAgLTk0LDcgKzk0LDcgQEAKIAog
djg6OkhhbmRsZTx2ODo6VmFsdWU+IFNldFRpbWVvdXRPckludGVydmFsKGNvbnN0IHY4OjpBcmd1
bWVudHMmIGFyZ3MsIGJvb2wgc2luZ2xlU2hvdCkKIHsKLSAgICBXb3JrZXJDb250ZXh0KiB3b3Jr
ZXJDb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8V29ya2VyQ29udGV4dD4oVjhDbGFz
c0luZGV4OjpXT1JLRVJDT05URVhULCBhcmdzLkhvbGRlcigpKTsKKyAgICBXb3JrZXJDb250ZXh0
KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFdvcmtlckNv
bnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCwgYXJncy5Ib2xkZXIoKSk7CiAKICAg
ICBpbnQgYXJndW1lbnRDb3VudCA9IGFyZ3MuTGVuZ3RoKCk7CiAgICAgaWYgKGFyZ3VtZW50Q291
bnQgPCAxKQpAQCAtMTMxLDggKzEzMSw4IEBACiAgICAgaWYgKCFhcmdzLkxlbmd0aCgpKQogICAg
ICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgU3RyaW5nIGNhbGxlclVSTCA9IFY4
UHJveHk6OkdldFNvdXJjZU5hbWUoKTsKLSAgICBpbnQgY2FsbGVyTGluZSA9IFY4UHJveHk6Okdl
dFNvdXJjZUxpbmVOdW1iZXIoKSArIDE7CisgICAgU3RyaW5nIGNhbGxlclVSTCA9IFY4UHJveHk6
OnNvdXJjZU5hbWUoKTsKKyAgICBpbnQgY2FsbGVyTGluZSA9IFY4UHJveHk6OnNvdXJjZUxpbmVO
dW1iZXIoKSArIDE7CiAKICAgICBWZWN0b3I8U3RyaW5nPiB1cmxzOwogICAgIGZvciAoaW50IGkg
PSAwOyBpIDwgYXJncy5MZW5ndGgoKTsgaSsrKSB7CkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICAg
ICAgdXJscy5hcHBlbmQodG9XZWJDb3JlU3RyaW5nKHNjcmlwdFVybCkpOwogICAgIH0KIAotICAg
IFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxX
b3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGFyZ3MuSG9sZGVyKCkp
OworICAgIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8V29ya2VyQ29udGV4dD4oVjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhULCBh
cmdzLkhvbGRlcigpKTsKIAogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgIHdvcmtlckNv
bnRleHQtPmltcG9ydFNjcmlwdHModXJscywgY2FsbGVyVVJMLCBjYWxsZXJMaW5lLCBlYyk7CkBA
IC0xNjgsNyArMTY4LDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChXb3JrZXJDb250ZXh0QWRkRXZl
bnRMaXN0ZW5lcikKIHsKICAgICBJTkNfU1RBVFMoTCJET00uV29ya2VyQ29udGV4dC5hZGRFdmVu
dExpc3RlbmVyKCkiKTsKLSAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94
eTo6VG9OYXRpdmVPYmplY3Q8V29ya2VyQ29udGV4dD4oVjhDbGFzc0luZGV4OjpXT1JLRVJDT05U
RVhULCBhcmdzLkhvbGRlcigpKTsKKyAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0g
VjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRl
eDo6V09SS0VSQ09OVEVYVCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBSZWZQdHI8VjhFdmVudExp
c3RlbmVyPiBsaXN0ZW5lciA9IHdvcmtlckNvbnRleHQtPnNjcmlwdCgpLT5wcm94eSgpLT5maW5k
T3JDcmVhdGVFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6Q2FzdChhcmdzWzFd
KSwgZmFsc2UsIGZhbHNlKTsKIApAQCAtMTg1LDcgKzE4NSw3IEBACiBDQUxMQkFDS19GVU5DX0RF
Q0woV29ya2VyQ29udGV4dFJlbW92ZUV2ZW50TGlzdGVuZXIpCiB7CiAgICAgSU5DX1NUQVRTKEwi
RE9NLldvcmtlckNvbnRleHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigpIik7Ci0gICAgV29ya2VyQ29u
dGV4dCogd29ya2VyQ29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRl
eHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCwgYXJncy5Ib2xkZXIoKSk7CisgICAgV29y
a2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVj
dDxXb3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGFyZ3MuSG9sZGVy
KCkpOwogICAgIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eSogcHJveHkgPSB3b3JrZXJDb250
ZXh0LT5zY3JpcHQoKS0+cHJveHkoKTsKIAogICAgIFJlZlB0cjxWOEV2ZW50TGlzdGVuZXI+IGxp
c3RlbmVyID0gcHJveHktPmZpbmRPckNyZWF0ZUV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpP
YmplY3Q+OjpDYXN0KGFyZ3NbMV0pLCBmYWxzZSwgdHJ1ZSk7CkluZGV4OiBXZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOERvY3VtZW50Q3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERvY3VtZW50Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUp
CisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERvY3VtZW50Q3VzdG9tLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNTIsMTYgKzUyLDE2IEBACiB7CiAgICAgSU5DX1NUQVRTKCJET00uRG9j
dW1lbnQuZXZhbHVhdGUoKSIpOwogCi0gICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gVjhQcm94eTo6
RE9NV3JhcHBlclRvTm9kZTxEb2N1bWVudD4oYXJncy5Ib2xkZXIoKSk7CisgICAgRG9jdW1lbnQq
IGRvY3VtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8RG9jdW1lbnQ+KGFy
Z3MuSG9sZGVyKCkpOwogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgIFN0cmluZyBleHBy
ZXNzaW9uID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgIE5vZGUqIGNvbnRleHROb2Rl
ID0gMDsKICAgICBpZiAoVjhOb2RlOjpIYXNJbnN0YW5jZShhcmdzWzFdKSkKLSAgICAgICAgY29u
dGV4dE5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMV0pOworICAg
ICAgICBjb250ZXh0Tm9kZSA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPE5vZGU+
KGFyZ3NbMV0pOwogCiAgICAgWFBhdGhOU1Jlc29sdmVyKiByZXNvbHZlciA9IDA7CiAgICAgaWYg
KFY4WFBhdGhOU1Jlc29sdmVyOjpIYXNJbnN0YW5jZShhcmdzWzJdKSkKLSAgICAgICAgcmVzb2x2
ZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYUGF0aE5TUmVzb2x2ZXI+KFY4Q2xhc3NJbmRl
eDo6WFBBVEhOU1JFU09MVkVSLCBhcmdzWzJdKTsKKyAgICAgICAgcmVzb2x2ZXIgPSBWOFByb3h5
Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WFBhdGhOU1Jlc29sdmVyPihWOENsYXNzSW5kZXg6OlhQ
QVRITlNSRVNPTFZFUiwgYXJnc1syXSk7CiAgICAgZWxzZSBpZiAoYXJnc1syXS0+SXNPYmplY3Qo
KSkKICAgICAgICAgcmVzb2x2ZXIgPSBuZXcgVjhDdXN0b21YUGF0aE5TUmVzb2x2ZXIoYXJnc1sy
XS0+VG9PYmplY3QoKSk7CiAgICAgZWxzZSBpZiAoIWFyZ3NbMl0tPklzTnVsbCgpICYmICFhcmdz
WzJdLT5Jc1VuZGVmaW5lZCgpKQpAQCAtNzAsNyArNzAsNyBAQAogICAgIGludCB0eXBlID0gdG9J
bnQzMihhcmdzWzNdKTsKICAgICBYUGF0aFJlc3VsdCogaW5SZXN1bHQgPSAwOwogICAgIGlmIChW
OFhQYXRoUmVzdWx0OjpIYXNJbnN0YW5jZShhcmdzWzRdKSkKLSAgICAgICAgaW5SZXN1bHQgPSBW
OFByb3h5OjpUb05hdGl2ZU9iamVjdDxYUGF0aFJlc3VsdD4oVjhDbGFzc0luZGV4OjpYUEFUSFJF
U1VMVCwgYXJnc1s0XSk7CisgICAgICAgIGluUmVzdWx0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PFhQYXRoUmVzdWx0PihWOENsYXNzSW5kZXg6OlhQQVRIUkVTVUxULCBhcmdzWzRd
KTsKIAogICAgIHY4OjpUcnlDYXRjaCBleGNlcHRpb25DYXRjaGVyOwogICAgIFJlZlB0cjxYUGF0
aFJlc3VsdD4gcmVzdWx0ID0gZG9jdW1lbnQtPmV2YWx1YXRlKGV4cHJlc3Npb24sIGNvbnRleHRO
b2RlLCByZXNvbHZlciwgdHlwZSwgaW5SZXN1bHQsIGVjKTsKQEAgLTgwLDIwICs4MCwyMCBAQAog
ICAgIGlmIChlYykKICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZWMpOwogCi0gICAgcmV0dXJu
IFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpYUEFUSFJFU1VMVCwgcmVzdWx0Lmdl
dCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4
OjpYUEFUSFJFU1VMVCwgcmVzdWx0LmdldCgpKTsKIH0KIAogQ0FMTEJBQ0tfRlVOQ19ERUNMKERv
Y3VtZW50R2V0Q1NTQ2FudmFzQ29udGV4dCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Eb2N1bWVu
dC5nZXRDU1NDYW52YXNDb250ZXh0Iik7CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhvbGRl
ciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgRG9jdW1lbnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBw
ZXJUb05vZGU8RG9jdW1lbnQ+KGhvbGRlcik7CisgICAgRG9jdW1lbnQqIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPERvY3VtZW50Pihob2xkZXIpOwogICAgIFN0cmluZyBj
b250ZXh0SWQgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgU3RyaW5nIG5hbWUgPSB0
b1dlYkNvcmVTdHJpbmcoYXJnc1sxXSk7CiAgICAgaW50IHdpZHRoID0gdG9JbnQzMihhcmdzWzJd
KTsKICAgICBpbnQgaGVpZ2h0ID0gdG9JbnQzMihhcmdzWzNdKTsKICAgICBDYW52YXNSZW5kZXJp
bmdDb250ZXh0MkQqIHJlc3VsdCA9IGltcC0+Z2V0Q1NTQ2FudmFzQ29udGV4dChjb250ZXh0SWQs
IG5hbWUsIHdpZHRoLCBoZWlnaHQpOwotICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4
Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCByZXN1bHQpOworICAgIHJldHVy
biBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklO
R0NPTlRFWFQyRCwgcmVzdWx0KTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDog
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MQ29sbGVjdGlvbkN1c3RvbS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MQ29sbGVjdGlvbkN1
c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhIVE1MQ29sbGVjdGlvbkN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ3LDEwICs0Nywx
MCBAQAogICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7CiAKICAgICBpZiAo
bmFtZWRJdGVtcy5zaXplKCkgPT0gMSkKLSAgICAgICAgcmV0dXJuIFY4UHJveHk6Ok5vZGVUb1Y4
T2JqZWN0KG5hbWVkSXRlbXMuYXQoMCkuZ2V0KCkpOworICAgICAgICByZXR1cm4gVjhQcm94eTo6
Y29udmVydE5vZGVUb1Y4T2JqZWN0KG5hbWVkSXRlbXMuYXQoMCkuZ2V0KCkpOwogCiAgICAgTm9k
ZUxpc3QqIGxpc3QgPSBuZXcgVjhOYW1lZE5vZGVzQ29sbGVjdGlvbihuYW1lZEl0ZW1zKTsKLSAg
ICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok5PREVMSVNULCBsaXN0
KTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpO
T0RFTElTVCwgbGlzdCk7CiB9CiAKIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZ2V0SXRl
bShIVE1MQ29sbGVjdGlvbiogY29sbGVjdGlvbiwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZ3Vt
ZW50KQpAQCAtNjYsNyArNjYsNyBAQAogICAgIH0KIAogICAgIFJlZlB0cjxOb2RlPiByZXN1bHQg
PSBjb2xsZWN0aW9uLT5pdGVtKGluZGV4LT5VaW50MzJWYWx1ZSgpKTsKLSAgICByZXR1cm4gVjhQ
cm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6
Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAKIE5BTUVEX1BST1BFUlRZ
X0dFVFRFUihIVE1MQ29sbGVjdGlvbikKQEAgLTg0LDIxICs4NCwyMSBAQAogICAgICAgICByZXR1
cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7CiAKICAgICAvLyBGaW5hbGx5LCBzZWFyY2ggdGhl
IERPTSBzdHJ1Y3R1cmUuCi0gICAgSFRNTENvbGxlY3Rpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0
aXZlT2JqZWN0PEhUTUxDb2xsZWN0aW9uPihWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBp
bmZvLkhvbGRlcigpKTsKKyAgICBIVE1MQ29sbGVjdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVy
dFRvTmF0aXZlT2JqZWN0PEhUTUxDb2xsZWN0aW9uPihWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNU
SU9OLCBpbmZvLkhvbGRlcigpKTsKICAgICByZXR1cm4gZ2V0TmFtZWRJdGVtcyhpbXAsIHY4U3Ry
aW5nVG9BdG9taWNXZWJDb3JlU3RyaW5nKG5hbWUpKTsKIH0KIAogQ0FMTEJBQ0tfRlVOQ19ERUNM
KEhUTUxDb2xsZWN0aW9uSXRlbSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MQ29sbGVjdGlv
bi5pdGVtKCkiKTsKLSAgICBIVE1MQ29sbGVjdGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8SFRNTENvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGFyZ3Mu
SG9sZGVyKCkpOworICAgIEhUTUxDb2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8SFRNTENvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04s
IGFyZ3MuSG9sZGVyKCkpOwogICAgIHJldHVybiBnZXRJdGVtKGltcCwgYXJnc1swXSk7CiB9CiAK
IENBTExCQUNLX0ZVTkNfREVDTChIVE1MQ29sbGVjdGlvbk5hbWVkSXRlbSkKIHsKICAgICBJTkNf
U1RBVFMoIkRPTS5IVE1MQ29sbGVjdGlvbi5uYW1lZEl0ZW0oKSIpOwotICAgIEhUTUxDb2xsZWN0
aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIVE1MQ29sbGVjdGlvbj4oVjhDbGFz
c0luZGV4OjpIVE1MQ09MTEVDVElPTiwgYXJncy5Ib2xkZXIoKSk7CisgICAgSFRNTENvbGxlY3Rp
b24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1MQ29sbGVjdGlvbj4o
VjhDbGFzc0luZGV4OjpIVE1MQ09MTEVDVElPTiwgYXJncy5Ib2xkZXIoKSk7CiAgICAgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IHJlc3VsdCA9IGdldE5hbWVkSXRlbXMoaW1wLCB0b1dlYkNvcmVTdHJp
bmcoYXJnc1swXSkpOwogCiAgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpCkBAIC0xMTMsNyArMTEz
LDcgQEAKICAgICBpZiAoYXJncy5MZW5ndGgoKSA8IDEpCiAgICAgICAgIHJldHVybiB2ODo6VW5k
ZWZpbmVkKCk7CiAKLSAgICBIVE1MQ29sbGVjdGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8SFRNTENvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGFyZ3Mu
SG9sZGVyKCkpOworICAgIEhUTUxDb2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8SFRNTENvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04s
IGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPT0gMSkKICAgICAgICAg
cmV0dXJuIGdldEl0ZW0oaW1wLCBhcmdzWzBdKTsKQEAgLTEyOCw3ICsxMjgsNyBAQAogICAgIE5v
ZGUqIG5vZGUgPSBpbXAtPm5hbWVkSXRlbShuYW1lKTsKICAgICB3aGlsZSAobm9kZSkgewogICAg
ICAgICBpZiAoIWN1cnJlbnQpCi0gICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhP
YmplY3Qobm9kZSk7CisgICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4
T2JqZWN0KG5vZGUpOwogCiAgICAgICAgIG5vZGUgPSBpbXAtPm5leHROYW1lZEl0ZW0obmFtZSk7
CiAgICAgICAgIGN1cnJlbnQtLTsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
RXZlbnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4RXZlbnRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4RXZlbnRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MywzOSArNDMs
MzkgQEAKIAogQUNDRVNTT1JfU0VUVEVSKEV2ZW50UmV0dXJuVmFsdWUpCiB7Ci0gICAgRXZlbnQq
IGV2ZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0aXZlPEV2ZW50PihpbmZvLkhvbGRlcigp
KTsKKyAgICBFdmVudCogZXZlbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZl
PEV2ZW50PihpbmZvLkhvbGRlcigpKTsKICAgICBldmVudC0+c2V0RGVmYXVsdFByZXZlbnRlZCgh
dmFsdWUtPkJvb2xlYW5WYWx1ZSgpKTsKIH0KIAogQUNDRVNTT1JfR0VUVEVSKEV2ZW50RGF0YVRy
YW5zZmVyKQogewotICAgIEV2ZW50KiBldmVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05hdGl2
ZTxFdmVudD4oaW5mby5Ib2xkZXIoKSk7CisgICAgRXZlbnQqIGV2ZW50ID0gVjhQcm94eTo6Y29u
dmVydERPTVdyYXBwZXJUb05hdGl2ZTxFdmVudD4oaW5mby5Ib2xkZXIoKSk7CiAKICAgICBpZiAo
ZXZlbnQtPmlzRHJhZ0V2ZW50KCkpCi0gICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZlbnQp
LT5jbGlwYm9hcmQoKSk7CisgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVj
dChWOENsYXNzSW5kZXg6OkNMSVBCT0FSRCwgc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2ZW50
KS0+Y2xpcGJvYXJkKCkpOwogCiAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIH0KIAogQUND
RVNTT1JfR0VUVEVSKEV2ZW50Q2xpcGJvYXJkRGF0YSkKIHsKLSAgICBFdmVudCogZXZlbnQgPSBW
OFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8RXZlbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEV2
ZW50KiBldmVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8RXZlbnQ+KGlu
Zm8uSG9sZGVyKCkpOwogCiAgICAgaWYgKGV2ZW50LT5pc0NsaXBib2FyZEV2ZW50KCkpCi0gICAg
ICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBz
dGF0aWNfY2FzdDxDbGlwYm9hcmRFdmVudCo+KGV2ZW50KS0+Y2xpcGJvYXJkKCkpOworICAgICAg
ICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpDTElQQk9B
UkQsIHN0YXRpY19jYXN0PENsaXBib2FyZEV2ZW50Kj4oZXZlbnQpLT5jbGlwYm9hcmQoKSk7CiAK
ICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogfQogCiBBQ0NFU1NPUl9HRVRURVIoRXZlbnRT
cmNFbGVtZW50KQogewotICAgIEV2ZW50KiBldmVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05h
dGl2ZTxFdmVudD4oaW5mby5Ib2xkZXIoKSk7Ci0gICAgcmV0dXJuIFY4UHJveHk6OkV2ZW50VGFy
Z2V0VG9WOE9iamVjdChldmVudC0+dGFyZ2V0KCkpOworICAgIEV2ZW50KiBldmVudCA9IFY4UHJv
eHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8RXZlbnQ+KGluZm8uSG9sZGVyKCkpOworICAg
IHJldHVybiBWOFByb3h5Ojpjb252ZXJ0RXZlbnRUYXJnZXRUb1Y4T2JqZWN0KGV2ZW50LT50YXJn
ZXQoKSk7CiB9CiAKIEFDQ0VTU09SX0dFVFRFUihFdmVudFJldHVyblZhbHVlKQogewotICAgIEV2
ZW50KiBldmVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05hdGl2ZTxFdmVudD4oaW5mby5Ib2xk
ZXIoKSk7CisgICAgRXZlbnQqIGV2ZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05h
dGl2ZTxFdmVudD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgcmV0dXJuIGV2ZW50LT5kZWZhdWx0UHJl
dmVudGVkKCkgPyB2ODo6RmFsc2UoKSA6IHY4OjpUcnVlKCk7CiB9CiAKSW5kZXg6IFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTE9wdGlvbkVsZW1lbnRDb25zdHJ1Y3Rvci5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MT3B0aW9uRWxlbWVu
dENvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOEhUTUxPcHRpb25FbGVtZW50Q29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC04MSw5ICs4MSw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBWOFByb3h5OjpTZXRE
T01XcmFwcGVyKGFyZ3MuSG9sZGVyKCksIFY4Q2xhc3NJbmRleDo6VG9JbnQoVjhDbGFzc0luZGV4
OjpOT0RFKSwgb3B0aW9uLmdldCgpKTsKKyAgICBWOFByb3h5OjpzZXRET01XcmFwcGVyKGFyZ3Mu
SG9sZGVyKCksIFY4Q2xhc3NJbmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpOT0RFKSwgb3B0aW9u
LmdldCgpKTsKICAgICBvcHRpb24tPnJlZigpOwotICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZv
ckRPTU5vZGUob3B0aW9uLmdldCgpLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGFy
Z3MuSG9sZGVyKCkpKTsKKyAgICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01Ob2RlKG9wdGlv
bi5nZXQoKSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhhcmdzLkhvbGRlcigpKSk7
CiAgICAgcmV0dXJuIGFyZ3MuSG9sZGVyKCk7CiB9CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4U3R5bGVTaGVldExpc3RDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U3R5bGVTaGVldExpc3RDdXN0b20uY3BwCShyZXZpc2lv
biA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U3R5bGVTaGVldExpc3RD
dXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NSwxMiArNDUsMTIgQEAKICAgICAgICAgcmV0
dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAKICAgICAvLyBTZWFyY2ggc3R5bGUgc2hl
ZXQuCi0gICAgU3R5bGVTaGVldExpc3QqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFN0
eWxlU2hlZXRMaXN0PihWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVRMSVNULCBpbmZvLkhvbGRlcigp
KTsKKyAgICBTdHlsZVNoZWV0TGlzdCogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2Jq
ZWN0PFN0eWxlU2hlZXRMaXN0PihWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVRMSVNULCBpbmZvLkhv
bGRlcigpKTsKICAgICBIVE1MU3R5bGVFbGVtZW50KiBpdGVtID0gaW1wLT5nZXROYW1lZEl0ZW0o
dG9XZWJDb3JlU3RyaW5nKG5hbWUpKTsKICAgICBpZiAoIWl0ZW0pCiAgICAgICAgIHJldHVybiBu
b3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogCi0gICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmpl
Y3QoVjhDbGFzc0luZGV4OjpIVE1MU1RZTEVFTEVNRU5ULCBpdGVtKTsKKyAgICByZXR1cm4gVjhQ
cm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpIVE1MU1RZTEVFTEVNRU5ULCBp
dGVtKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhOb2RlQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOE5vZGVDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Tm9kZUN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTQ3LDEzICs0NywxMyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKE5vZGVBZGRFdmVudExpc3RlbmVy
KQogewogICAgIElOQ19TVEFUUygiRE9NLk5vZGUuYWRkRXZlbnRMaXN0ZW5lcigpIik7Ci0gICAg
Tm9kZSogbm9kZSA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJncy5Ib2xkZXIo
KSk7CisgICAgTm9kZSogbm9kZSA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPE5v
ZGU+KGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRy
aWV2ZShub2RlLT5kb2N1bWVudCgpLT5mcmFtZSgpKTsKICAgICBpZiAoIXByb3h5KQogICAgICAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxp
c3RlbmVyID0gcHJveHktPkZpbmRPckNyZWF0ZVY4RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxz
ZSk7CisgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPmZpbmRPckNy
ZWF0ZVY4RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAgICAgaWYgKGxpc3RlbmVyKSB7
CiAgICAgICAgIFN0cmluZyB0eXBlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgICAg
ICBib29sIHVzZUNhcHR1cmUgPSBhcmdzWzJdLT5Cb29sZWFuVmFsdWUoKTsKQEAgLTY1LDcgKzY1
LDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChOb2RlUmVtb3ZlRXZlbnRMaXN0ZW5lcikKIHsKICAg
ICBJTkNfU1RBVFMoIkRPTS5Ob2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoKSIpOwotICAgIE5vZGUq
IG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3MuSG9sZGVyKCkpOwor
ICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihh
cmdzLkhvbGRlcigpKTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUo
bm9kZS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSk7CiAgICAgLy8gSXQgaXMgcG9zc2JpbGUgdGhhdCB0
aGUgb3duZXIgZG9jdW1lbnQgb2YgdGhlIG5vZGUgaXMgZGV0YWNoZWQKQEAgLTc0LDcgKzc0LDcg
QEAKICAgICBpZiAoIXByb3h5KQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0g
ICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPkZpbmRWOEV2ZW50TGlz
dGVuZXIoYXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5l
ciA9IHByb3h5LT5maW5kVjhFdmVudExpc3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsKICAgICBpZiAo
bGlzdGVuZXIpIHsKICAgICAgICAgU3RyaW5nIHR5cGUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1sw
XSk7CiAgICAgICAgIGJvb2wgdXNlQ2FwdHVyZSA9IGFyZ3NbMl0tPkJvb2xlYW5WYWx1ZSgpOwpA
QCAtODksMTMgKzg5LDEzIEBACiB7CiAgICAgSU5DX1NUQVRTKCJET00uTm9kZS5pbnNlcnRCZWZv
cmUiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gaG9sZGVyID0gYXJncy5Ib2xkZXIoKTsK
LSAgICBOb2RlKiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGhvbGRlcik7
CisgICAgTm9kZSogaW1wID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4o
aG9sZGVyKTsKICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBOb2RlKiBuZXdDaGlsZCA9
IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1swXSkgPyBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2Rl
PE5vZGU+KGFyZ3NbMF0pIDogMDsKLSAgICBOb2RlKiByZWZDaGlsZCA9IFY4Tm9kZTo6SGFzSW5z
dGFuY2UoYXJnc1sxXSkgPyBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMV0p
IDogMDsKKyAgICBOb2RlKiBuZXdDaGlsZCA9IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1swXSkg
PyBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKSA6IDA7Cisg
ICAgTm9kZSogcmVmQ2hpbGQgPSBWOE5vZGU6Okhhc0luc3RhbmNlKGFyZ3NbMV0pID8gVjhQcm94
eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJnc1sxXSkgOiAwOwogICAgIGJvb2wg
c3VjY2VzcyA9IGltcC0+aW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCByZWZDaGlsZCwgZWMsIHRydWUp
OwogICAgIGlmIChlYykgewotICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOwor
ICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogICAgICAgICByZXR1cm4gdjg6
OkhhbmRsZTx2ODo6VmFsdWU+KCk7CiAgICAgfQogICAgIGlmIChzdWNjZXNzKQpAQCAtMTA4LDEz
ICsxMDgsMTMgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Ob2RlLnJlcGxhY2VDaGlsZCIpOwog
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBob2xkZXIgPSBhcmdzLkhvbGRlcigpOwotICAgIE5v
ZGUqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8Tm9kZT4oaG9sZGVyKTsKKyAgICBO
b2RlKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihob2xkZXIp
OwogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIE5vZGUqIG5ld0NoaWxkID0gVjhOb2Rl
OjpIYXNJbnN0YW5jZShhcmdzWzBdKSA/IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8Tm9kZT4o
YXJnc1swXSkgOiAwOwotICAgIE5vZGUqIG9sZENoaWxkID0gVjhOb2RlOjpIYXNJbnN0YW5jZShh
cmdzWzFdKSA/IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJnc1sxXSkgOiAwOwor
ICAgIE5vZGUqIG5ld0NoaWxkID0gVjhOb2RlOjpIYXNJbnN0YW5jZShhcmdzWzBdKSA/IFY4UHJv
eHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0pIDogMDsKKyAgICBOb2Rl
KiBvbGRDaGlsZCA9IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1sxXSkgPyBWOFByb3h5Ojpjb252
ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzFdKSA6IDA7CiAgICAgYm9vbCBzdWNjZXNz
ID0gaW1wLT5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQsIG9sZENoaWxkLCBlYywgdHJ1ZSk7CiAgICAg
aWYgKGVjKSB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAg
IFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgIHJldHVybiB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4oKTsKICAgICB9CiAgICAgaWYgKHN1Y2Nlc3MpCkBAIC0xMjYsMTIgKzEyNiwx
MiBAQAogewogICAgIElOQ19TVEFUUygiRE9NLk5vZGUucmVtb3ZlQ2hpbGQiKTsKICAgICB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gaG9sZGVyID0gYXJncy5Ib2xkZXIoKTsKLSAgICBOb2RlKiBpbXAg
PSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGhvbGRlcik7CisgICAgTm9kZSogaW1w
ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oaG9sZGVyKTsKICAgICBF
eGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBOb2RlKiBvbGRDaGlsZCA9IFY4Tm9kZTo6SGFzSW5z
dGFuY2UoYXJnc1swXSkgPyBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0p
IDogMDsKKyAgICBOb2RlKiBvbGRDaGlsZCA9IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1swXSkg
PyBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKSA6IDA7CiAg
ICAgYm9vbCBzdWNjZXNzID0gaW1wLT5yZW1vdmVDaGlsZChvbGRDaGlsZCwgZWMpOwogICAgIGlm
IChlYykgewotICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOworICAgICAgICBW
OFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2
ODo6VmFsdWU+KCk7CiAgICAgfQogICAgIGlmIChzdWNjZXNzKQpAQCAtMTQ0LDEyICsxNDQsMTIg
QEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Ob2RlLmFwcGVuZENoaWxkIik7CiAgICAgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IGhvbGRlciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgTm9kZSogaW1wID0g
VjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxOb2RlPihob2xkZXIpOworICAgIE5vZGUqIGltcCA9
IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGhvbGRlcik7CiAgICAgRXhj
ZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgTm9kZSogbmV3Q2hpbGQgPSBWOE5vZGU6Okhhc0luc3Rh
bmNlKGFyZ3NbMF0pID8gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKSA6
IDA7CisgICAgTm9kZSogbmV3Q2hpbGQgPSBWOE5vZGU6Okhhc0luc3RhbmNlKGFyZ3NbMF0pID8g
VjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJnc1swXSkgOiAwOwogICAg
IGJvb2wgc3VjY2VzcyA9IGltcC0+YXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGVjLCB0cnVlICk7CiAg
ICAgaWYgKGVjKSB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAg
ICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgIHJldHVybiB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4oKTsKICAgICB9CiAgICAgaWYgKHN1Y2Nlc3MpCkluZGV4OiBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE5hbWVkTm9kZU1hcEN1c3RvbS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhOYW1lZE5vZGVNYXBDdXN0b20uY3BwCShy
ZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TmFtZWROb2Rl
TWFwQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDIsMTIgKzQyLDEyIEBACiBJTkRFWEVE
X1BST1BFUlRZX0dFVFRFUihOYW1lZE5vZGVNYXApCiB7CiAgICAgSU5DX1NUQVRTKCJET00uTmFt
ZWROb2RlTWFwLkluZGV4ZWRQcm9wZXJ0eUdldHRlciIpOwotICAgIE5hbWVkTm9kZU1hcCogaW1w
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TmFtZWROb2RlTWFwPihWOENsYXNzSW5kZXg6Ok5B
TUVETk9ERU1BUCwgaW5mby5Ib2xkZXIoKSk7CisgICAgTmFtZWROb2RlTWFwKiBpbXAgPSBWOFBy
b3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TmFtZWROb2RlTWFwPihWOENsYXNzSW5kZXg6Ok5B
TUVETk9ERU1BUCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgUmVmUHRyPE5vZGU+IHJlc3VsdCA9IGlt
cC0+aXRlbShpbmRleCk7CiAgICAgaWYgKCFyZXN1bHQpCiAgICAgICAgIHJldHVybiBub3RIYW5k
bGVkQnlJbnRlcmNlcHRvcigpOwogCi0gICAgcmV0dXJuIFY4UHJveHk6Ok5vZGVUb1Y4T2JqZWN0
KHJlc3VsdC5nZXQoKSk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnROb2RlVG9WOE9iamVj
dChyZXN1bHQuZ2V0KCkpOwogfQogCiBOQU1FRF9QUk9QRVJUWV9HRVRURVIoTmFtZWROb2RlTWFw
KQpAQCAtNjMsMTIgKzYzLDEyIEBACiAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNl
cHRvcigpOwogCiAgICAgLy8gRmluYWxseSwgc2VhcmNoIHRoZSBET00uCi0gICAgTmFtZWROb2Rl
TWFwKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxOYW1lZE5vZGVNYXA+KFY4Q2xhc3NJ
bmRleDo6TkFNRUROT0RFTUFQLCBpbmZvLkhvbGRlcigpKTsKKyAgICBOYW1lZE5vZGVNYXAqIGlt
cCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxOYW1lZE5vZGVNYXA+KFY4Q2xhc3NJ
bmRleDo6TkFNRUROT0RFTUFQLCBpbmZvLkhvbGRlcigpKTsKICAgICBSZWZQdHI8Tm9kZT4gcmVz
dWx0ID0gaW1wLT5nZXROYW1lZEl0ZW0odG9XZWJDb3JlU3RyaW5nKG5hbWUpKTsKICAgICBpZiAo
IXJlc3VsdCkKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAKLSAg
ICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsKKyAgICByZXR1
cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAKIH0g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
Q2xpZW50UmVjdExpc3RDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4Q2xpZW50UmVjdExpc3RDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysr
IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2xpZW50UmVjdExpc3RDdXN0b20uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC00NCwxMiArNDQsMTIgQEAKIElOREVYRURfUFJPUEVSVFlfR0VUVEVS
KENsaWVudFJlY3RMaXN0KQogewogICAgIElOQ19TVEFUUygiRE9NLkNsaWVudFJlY3RMaXN0Lklu
ZGV4ZWRQcm9wZXJ0eUdldHRlciIpOwotICAgIENsaWVudFJlY3RMaXN0KiBpbXAgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxDbGllbnRSZWN0TGlzdD4oVjhDbGFzc0luZGV4OjpDTElFTlRSRUNU
TElTVCwgaW5mby5Ib2xkZXIoKSk7CisgICAgQ2xpZW50UmVjdExpc3QqIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDbGllbnRSZWN0TGlzdD4oVjhDbGFzc0luZGV4OjpDTElF
TlRSRUNUTElTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgUmVmUHRyPENsaWVudFJlY3Q+IHJlc3Vs
dCA9IGltcC0+aXRlbShpbmRleCk7CiAgICAgaWYgKCFyZXN1bHQpCiAgICAgICAgIHJldHVybiBu
b3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogCi0gICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmpl
Y3QoVjhDbGFzc0luZGV4OjpDTElFTlRSRUNULCByZXN1bHQuZ2V0KCkpOworICAgIHJldHVybiBW
OFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNMSUVOVFJFQ1QsIHJlc3Vs
dC5nZXQoKSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTEltYWdlRWxlbWVudENvbnN0cnVjdG9yLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxJbWFnZUVsZW1lbnRDb25z
dHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhIVE1MSW1hZ2VFbGVtZW50Q29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01
NSw3ICs1NSw3IEBACiAKICAgICAvLyBNYWtlIHN1cmUgdGhlIGRvY3VtZW50IGlzIGFkZGVkIHRv
IHRoZSBET00gTm9kZSBtYXAuIE90aGVyd2lzZSwgdGhlIEhUTUxJbWFnZUVsZW1lbnQgaW5zdGFu
Y2UKICAgICAvLyBtYXkgZW5kIHVwIGJlaW5nIHRoZSBvbmx5IG5vZGUgaW4gdGhlIG1hcCBhbmQg
Z2V0IGdhcmJhZ2UtY2NvbGxlY3RlZCBwcmVtYXR1cmVseS4KLSAgICBWOFByb3h5OjpOb2RlVG9W
OE9iamVjdChkb2N1bWVudCk7CisgICAgVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KGRv
Y3VtZW50KTsKIAogICAgIFJlZlB0cjxIVE1MSW1hZ2VFbGVtZW50PiBpbWFnZSA9IG5ldyBIVE1M
SW1hZ2VFbGVtZW50KEhUTUxOYW1lczo6aW1nVGFnLCBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lKCkt
PmRvY3VtZW50KCkpOwogICAgIGlmIChhcmdzLkxlbmd0aCgpID4gMCkgewpAQCAtNjQsOSArNjQs
OSBAQAogICAgICAgICAgICAgaW1hZ2UtPnNldEhlaWdodCh0b0ludDMyKGFyZ3NbMV0pKTsKICAg
ICB9CiAKLSAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKGFyZ3MuSG9sZGVyKCksIFY4Q2xhc3NJ
bmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpOT0RFKSwgaW1hZ2UuZ2V0KCkpOworICAgIFY4UHJv
eHk6OnNldERPTVdyYXBwZXIoYXJncy5Ib2xkZXIoKSwgVjhDbGFzc0luZGV4OjpUb0ludChWOENs
YXNzSW5kZXg6Ok5PREUpLCBpbWFnZS5nZXQoKSk7CiAgICAgaW1hZ2UtPnJlZigpOwotICAgIFY4
UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU5vZGUoaW1hZ2UuZ2V0KCksIHY4OjpQZXJzaXN0ZW50
PHY4OjpPYmplY3Q+OjpOZXcoYXJncy5Ib2xkZXIoKSkpOworICAgIFY4UHJveHk6OnNldEpTV3Jh
cHBlckZvckRPTU5vZGUoaW1hZ2UuZ2V0KCksIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpO
ZXcoYXJncy5Ib2xkZXIoKSkpOwogICAgIHJldHVybiBhcmdzLkhvbGRlcigpOwogfQogCkluZGV4
OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFNRTFJlc3VsdFNldFJvd0xpc3RDdXN0b20u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMUmVzdWx0
U2V0Um93TGlzdEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhTUUxSZXN1bHRTZXRSb3dMaXN0Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzIsMTEgKzMyLDEwIEBACiAKICNpZiBFTkFCTEUoREFUQUJBU0UpCiAKLSNpbmNsdWRl
ICJ2OF9iaW5kaW5nLmgiCi0jaW5jbHVkZSAidjhfcHJveHkuaCIKLQogI2luY2x1ZGUgIlNRTFJl
c3VsdFNldFJvd0xpc3QuaCIKKyNpbmNsdWRlICJWOEJpbmRpbmcuaCIKICNpbmNsdWRlICJWOEN1
c3RvbUJpbmRpbmcuaCIKKyNpbmNsdWRlICJWOFByb3h5LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIApAQCAtNDUsMjAgKzQ0LDIwIEBACiAgICAgSU5DX1NUQVRTKCJET00uU1FMUmVzdWx0U2V0
Um93TGlzdC5pdGVtKCkiKTsKIAogICAgIGlmIChhcmdzLkxlbmd0aCgpID09IDApIHsKLSAgICAg
ICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpTWU5UQVhfRVJST1IsICJJdGVtIGluZGV4
IGlzIHJlcXVpcmVkLiIpOworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlNZ
TlRBWF9FUlJPUiwgIkl0ZW0gaW5kZXggaXMgcmVxdWlyZWQuIik7CiAgICAgICAgIHJldHVybiB2
ODo6VW5kZWZpbmVkKCk7CiAgICAgfQogCiAgICAgaWYgKCFhcmdzWzBdLT5Jc051bWJlcigpKSB7
Ci0gICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgIkl0ZW0g
aW5kZXggbXVzdCBiZSBhIG51bWJlci4iKTsKKyAgICAgICAgVjhQcm94eTo6dGhyb3dFcnJvcihW
OFByb3h5OjpUWVBFX0VSUk9SLCAiSXRlbSBpbmRleCBtdXN0IGJlIGEgbnVtYmVyLiIpOwogICAg
ICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgIH0KIAotICAgIFNRTFJlc3VsdFNldFJv
d0xpc3QqIHJvd0xpc3QgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxTUUxSZXN1bHRTZXRSb3dM
aXN0PihWOENsYXNzSW5kZXg6OlNRTFJFU1VMVFNFVFJPV0xJU1QsIGFyZ3MuSG9sZGVyKCkpOwor
ICAgIFNRTFJlc3VsdFNldFJvd0xpc3QqIHJvd0xpc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRp
dmVPYmplY3Q8U1FMUmVzdWx0U2V0Um93TGlzdD4oVjhDbGFzc0luZGV4OjpTUUxSRVNVTFRTRVRS
T1dMSVNULCBhcmdzLkhvbGRlcigpKTsKIAogICAgIHVuc2lnbmVkIGxvbmcgaW5kZXggPSBhcmdz
WzBdLT5JbnRlZ2VyVmFsdWUoKTsKICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHJvd0xp
c3QtPmxlbmd0aCgpKSB7Ci0gICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6UkFO
R0VfRVJST1IsICJJdGVtIGluZGV4IGlzIG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgVjhQcm94
eTo6dGhyb3dFcnJvcihWOFByb3h5OjpSQU5HRV9FUlJPUiwgIkl0ZW0gaW5kZXggaXMgb3V0IG9m
IHJhbmdlLiIpOwogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgIH0KIApJbmRl
eDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhOb2RlSXRlcmF0b3JDdXN0b20uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Tm9kZUl0ZXJhdG9yQ3Vz
dG9tLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OE5vZGVJdGVyYXRvckN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUzLDEzICs1MywxMyBA
QAogICAgIGlmICghb2JqZWN0KQogICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKIAotICAgIHJl
dHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChvYmplY3QuZ2V0KCkpOworICAgIHJldHVybiBW
OFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3Qob2JqZWN0LmdldCgpKTsKIH0KIAogQ0FMTEJB
Q0tfRlVOQ19ERUNMKE5vZGVJdGVyYXRvck5leHROb2RlKQogewogICAgIElOQ19TVEFUUygiRE9N
Lk5vZGVJdGVyYXRvci5uZXh0Tm9kZSgpIik7Ci0gICAgTm9kZUl0ZXJhdG9yKiBub2RlSXRlcmF0
b3IgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxOb2RlSXRlcmF0b3I+KFY4Q2xhc3NJbmRleDo6
Tk9ERUlURVJBVE9SLCBhcmdzLkhvbGRlcigpKTsKKyAgICBOb2RlSXRlcmF0b3IqIG5vZGVJdGVy
YXRvciA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxOb2RlSXRlcmF0b3I+KFY4Q2xh
c3NJbmRleDo6Tk9ERUlURVJBVE9SLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIEV4Y2VwdGlvbkNv
ZGUgZWMgPSAwOwogICAgIFNjcmlwdFN0YXRlIHN0YXRlOwpAQCAtNzAsNyArNzAsNyBAQAogQ0FM
TEJBQ0tfRlVOQ19ERUNMKE5vZGVJdGVyYXRvclByZXZpb3VzTm9kZSkKIHsKICAgICBJTkNfU1RB
VFMoIkRPTS5Ob2RlSXRlcmF0b3IucHJldmlvdXNOb2RlKCkiKTsKLSAgICBOb2RlSXRlcmF0b3Iq
IG5vZGVJdGVyYXRvciA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PE5vZGVJdGVyYXRvcj4oVjhD
bGFzc0luZGV4OjpOT0RFSVRFUkFUT1IsIGFyZ3MuSG9sZGVyKCkpOworICAgIE5vZGVJdGVyYXRv
ciogbm9kZUl0ZXJhdG9yID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PE5vZGVJdGVy
YXRvcj4oVjhDbGFzc0luZGV4OjpOT0RFSVRFUkFUT1IsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAg
RXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAgU2NyaXB0U3RhdGUgc3RhdGU7CkluZGV4OiBXZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFNWR0xlbmd0aEN1c3RvbS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTVkdMZW5ndGhDdXN0b20uY3BwCShyZXZp
c2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1ZHTGVuZ3RoQ3Vz
dG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsMTcgKzQ0LDE3IEBACiBBQ0NFU1NPUl9HRVRU
RVIoU1ZHTGVuZ3RoVmFsdWUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uU1ZHTGVuZ3RoLnZhbHVl
Iik7Ci0gICAgVjhTVkdQT0RUeXBlV3JhcHBlcjxTVkdMZW5ndGg+KiB3cmFwcGVyID0gVjhQcm94
eTo6VG9OYXRpdmVPYmplY3Q8VjhTVkdQT0RUeXBlV3JhcHBlcjxTVkdMZW5ndGg+ID4oVjhDbGFz
c0luZGV4OjpTVkdMRU5HVEgsIGluZm8uSG9sZGVyKCkpOworICAgIFY4U1ZHUE9EVHlwZVdyYXBw
ZXI8U1ZHTGVuZ3RoPiogd3JhcHBlciA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxW
OFNWR1BPRFR5cGVXcmFwcGVyPFNWR0xlbmd0aD4gPihWOENsYXNzSW5kZXg6OlNWR0xFTkdUSCwg
aW5mby5Ib2xkZXIoKSk7CiAgICAgU1ZHTGVuZ3RoIGltcCA9ICp3cmFwcGVyOwotICAgIHJldHVy
biB2ODo6TnVtYmVyOjpOZXcoaW1wLnZhbHVlKFY4UHJveHk6OkdldFNWR0NvbnRleHQod3JhcHBl
cikpKTsKKyAgICByZXR1cm4gdjg6Ok51bWJlcjo6TmV3KGltcC52YWx1ZShWOFByb3h5OjpzdmdD
b250ZXh0KHdyYXBwZXIpKSk7CiB9CiAKIENBTExCQUNLX0ZVTkNfREVDTChTVkdMZW5ndGhDb252
ZXJ0VG9TcGVjaWZpZWRVbml0cykKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5TVkdMZW5ndGguY29u
dmVydFRvU3BlY2lmaWVkVW5pdHMiKTsKLSAgICBWOFNWR1BPRFR5cGVXcmFwcGVyPFNWR0xlbmd0
aD4qIHdyYXBwZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxWOFNWR1BPRFR5cGVXcmFwcGVy
PFNWR0xlbmd0aD4gPihWOENsYXNzSW5kZXg6OlNWR0xFTkdUSCwgYXJncy5Ib2xkZXIoKSk7Cisg
ICAgVjhTVkdQT0RUeXBlV3JhcHBlcjxTVkdMZW5ndGg+KiB3cmFwcGVyID0gVjhQcm94eTo6Y29u
dmVydFRvTmF0aXZlT2JqZWN0PFY4U1ZHUE9EVHlwZVdyYXBwZXI8U1ZHTGVuZ3RoPiA+KFY4Q2xh
c3NJbmRleDo6U1ZHTEVOR1RILCBhcmdzLkhvbGRlcigpKTsKICAgICBTVkdMZW5ndGggaW1wID0g
KndyYXBwZXI7Ci0gICAgU1ZHRWxlbWVudCogY29udGV4dCA9IFY4UHJveHk6OkdldFNWR0NvbnRl
eHQod3JhcHBlcik7CisgICAgU1ZHRWxlbWVudCogY29udGV4dCA9IFY4UHJveHk6OnN2Z0NvbnRl
eHQod3JhcHBlcik7CiAgICAgaW1wLmNvbnZlcnRUb1NwZWNpZmllZFVuaXRzKHRvSW50MzIoYXJn
c1swXSksIGNvbnRleHQpOwogICAgIHdyYXBwZXItPmNvbW1pdENoYW5nZShpbXAsIGNvbnRleHQp
OwogICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOEhUTUxEb2N1bWVudEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhIVE1MRG9jdW1lbnRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5
NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTERvY3VtZW50Q3VzdG9tLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNzgsNyArNzgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHZh
bHVlOwogICAgIH0KIAotICAgIEhUTUxEb2N1bWVudCogaHRtbERvY3VtZW50ID0gVjhQcm94eTo6
RE9NV3JhcHBlclRvTm9kZTxIVE1MRG9jdW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxE
b2N1bWVudCogaHRtbERvY3VtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8
SFRNTERvY3VtZW50PihpbmZvLkhvbGRlcigpKTsKIAogICAgIC8vIEZhc3QgY2FzZSBmb3IgbmFt
ZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90IHRoZXJlLgogICAgIGlmICghaHRtbERvY3VtZW50LT5o
YXNOYW1lZEl0ZW0oa2V5LmltcGwoKSkgJiYgIWh0bWxEb2N1bWVudC0+aGFzRXh0cmFOYW1lZEl0
ZW0oa2V5LmltcGwoKSkpCkBAIC05MiwxMiArOTIsMTIgQEAKICAgICAgICAgTm9kZSogbm9kZSA9
IGl0ZW1zLT5maXJzdEl0ZW0oKTsKICAgICAgICAgRnJhbWUqIGZyYW1lID0gMDsKICAgICAgICAg
aWYgKG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjppZnJhbWVUYWcpICYmIChmcmFtZSA9IHN0
YXRpY19jYXN0PEhUTUxJRnJhbWVFbGVtZW50Kj4obm9kZSktPmNvbnRlbnRGcmFtZSgpKSkKLSAg
ICAgICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lO
RE9XLCBmcmFtZS0+ZG9tV2luZG93KCkpOworICAgICAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNv
bnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBmcmFtZS0+ZG9tV2luZG93
KCkpOwogCi0gICAgICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChub2RlKTsKKyAg
ICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnROb2RlVG9WOE9iamVjdChub2RlKTsKICAgICB9
CiAKLSAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkhUTUxDT0xM
RUNUSU9OLCBpdGVtcy5nZXQoKSk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2Jq
ZWN0KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGl0ZW1zLmdldCgpKTsKIH0KIAogLy8g
SFRNTERvY3VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTExNyw3ICsxMTcsNyBAQAogQ0FMTEJBQ0tfRlVOQ19E
RUNMKEhUTUxEb2N1bWVudFdyaXRlKQogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxEb2N1bWVu
dC53cml0ZSgpIik7Ci0gICAgSFRNTERvY3VtZW50KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5OjpE
T01XcmFwcGVyVG9Ob2RlPEhUTUxEb2N1bWVudD4oYXJncy5Ib2xkZXIoKSk7CisgICAgSFRNTERv
Y3VtZW50KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxI
VE1MRG9jdW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOwogICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6
OnJldHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29udGV4dCgpOwogICAgIEFTU0VSVChmcmFtZSk7CiAg
ICAgaHRtbERvY3VtZW50LT53cml0ZSh3cml0ZUhlbHBlckdldFN0cmluZyhhcmdzKSwgZnJhbWUt
PmRvY3VtZW50KCkpOwpAQCAtMTI3LDcgKzEyNyw3IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woSFRN
TERvY3VtZW50V3JpdGVsbikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MRG9jdW1lbnQud3Jp
dGVsbigpIik7Ci0gICAgSFRNTERvY3VtZW50KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5OjpET01X
cmFwcGVyVG9Ob2RlPEhUTUxEb2N1bWVudD4oYXJncy5Ib2xkZXIoKSk7CisgICAgSFRNTERvY3Vt
ZW50KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1M
RG9jdW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOwogICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6OnJl
dHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29udGV4dCgpOwogICAgIEFTU0VSVChmcmFtZSk7CiAgICAg
aHRtbERvY3VtZW50LT53cml0ZWxuKHdyaXRlSGVscGVyR2V0U3RyaW5nKGFyZ3MpLCBmcmFtZS0+
ZG9jdW1lbnQoKSk7CkBAIC0xMzcsMTIgKzEzNywxMiBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEhU
TUxEb2N1bWVudE9wZW4pCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTERvY3VtZW50Lm9wZW4o
KSIpOwotICAgIEhUTUxEb2N1bWVudCogaHRtbERvY3VtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBl
clRvTm9kZTxIVE1MRG9jdW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOworICAgIEhUTUxEb2N1bWVudCog
aHRtbERvY3VtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTERvY3Vt
ZW50PihhcmdzLkhvbGRlcigpKTsKIAogICAgIGlmIChhcmdzLkxlbmd0aCgpID4gMikgewogICAg
ICAgICBpZiAoRnJhbWUqIGZyYW1lID0gaHRtbERvY3VtZW50LT5mcmFtZSgpKSB7CiAgICAgICAg
ICAgICAvLyBGZXRjaCB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgdGhlIGZyYW1lLgotICAgICAgICAg
ICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChm
cmFtZSk7CisgICAgICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFBy
b3h5Ojpjb250ZXh0KGZyYW1lKTsKICAgICAgICAgICAgIC8vIEJhaWwgb3V0IGlmIHdlIGNhbm5v
dCBnZXQgdGhlIGNvbnRleHQuCiAgICAgICAgICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCiAg
ICAgICAgICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKQEAgLTE2Miw3ICsxNjIsNyBA
QAogICAgICAgICAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShmcmFtZSk7
CiAgICAgICAgICAgICBBU1NFUlQocHJveHkpOwogCi0gICAgICAgICAgICB2ODo6TG9jYWw8djg6
OlZhbHVlPiByZXN1bHQgPSBwcm94eS0+Q2FsbEZ1bmN0aW9uKHY4OjpMb2NhbDx2ODo6RnVuY3Rp
b24+OjpDYXN0KGZ1bmN0aW9uKSwgZ2xvYmFsLCBhcmdzLkxlbmd0aCgpLCBwYXJhbXMpOworICAg
ICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmVzdWx0ID0gcHJveHktPmNhbGxGdW5jdGlv
bih2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPjo6Q2FzdChmdW5jdGlvbiksIGdsb2JhbCwgYXJncy5M
ZW5ndGgoKSwgcGFyYW1zKTsKICAgICAgICAgICAgIGRlbGV0ZVtdIHBhcmFtczsKICAgICAgICAg
ICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KQEAgLTE3OSw5ICsxNzksOSBAQAogICAgIElO
Q19TVEFUUygiRE9NLkhUTUxEb2N1bWVudC5hbGwuX2dldCIpOwogICAgIHY4OjpIYW5kbGVTY29w
ZSBzY29wZTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9sZGVy
KCk7Ci0gICAgSFRNTERvY3VtZW50KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVy
VG9Ob2RlPEhUTUxEb2N1bWVudD4oaG9sZGVyKTsKKyAgICBIVE1MRG9jdW1lbnQqIGh0bWxEb2N1
bWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxEb2N1bWVudD4oaG9s
ZGVyKTsKICAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb24+IGNvbGxlY3Rpb24gPSBXVEY6OmdldFB0
cihodG1sRG9jdW1lbnQtPmFsbCgpKTsKLSAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChW
OENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBXVEY6OmdldFB0cihjb2xsZWN0aW9uKSk7Cisg
ICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6SFRNTENP
TExFQ1RJT04sIFdURjo6Z2V0UHRyKGNvbGxlY3Rpb24pKTsKIH0KIAogQUNDRVNTT1JfU0VUVEVS
KEhUTUxEb2N1bWVudEFsbCkKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2Fu
dmFzUmVuZGVyaW5nQ29udGV4dDJEQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOENhbnZhc1JlbmRlcmluZ0NvbnRleHQyREN1c3RvbS5jcHAJKHJl
dmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MCwxMCArNTAsMTAg
QEAKIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdG9WOChDYW52YXNTdHlsZSogc3R5bGUp
CiB7CiAgICAgaWYgKHN0eWxlLT5jYW52YXNHcmFkaWVudCgpKQotICAgICAgICByZXR1cm4gVjhQ
cm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNBTlZBU0dSQURJRU5ULCBzdHlsZS0+Y2Fu
dmFzR3JhZGllbnQoKSk7CisgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVj
dChWOENsYXNzSW5kZXg6OkNBTlZBU0dSQURJRU5ULCBzdHlsZS0+Y2FudmFzR3JhZGllbnQoKSk7
CiAKICAgICBpZiAoc3R5bGUtPmNhbnZhc1BhdHRlcm4oKSkKLSAgICAgICAgcmV0dXJuIFY4UHJv
eHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpDQU5WQVNQQVRURVJOLCBzdHlsZS0+Y2FudmFz
UGF0dGVybigpKTsKKyAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4
Q2xhc3NJbmRleDo6Q0FOVkFTUEFUVEVSTiwgc3R5bGUtPmNhbnZhc1BhdHRlcm4oKSk7CiAKICAg
ICByZXR1cm4gdjhTdHJpbmcoc3R5bGUtPmNvbG9yKCkpOwogfQpAQCAtNjQsMzUgKzY0LDM1IEBA
CiAgICAgICAgIHJldHVybiBDYW52YXNTdHlsZTo6Y3JlYXRlKHRvV2ViQ29yZVN0cmluZyh2YWx1
ZSkpOwogCiAgICAgaWYgKFY4Q2FudmFzR3JhZGllbnQ6Okhhc0luc3RhbmNlKHZhbHVlKSkKLSAg
ICAgICAgcmV0dXJuIENhbnZhc1N0eWxlOjpjcmVhdGUoVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0
aXZlPENhbnZhc0dyYWRpZW50Pih2YWx1ZSkpOworICAgICAgICByZXR1cm4gQ2FudmFzU3R5bGU6
OmNyZWF0ZShWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPENhbnZhc0dyYWRpZW50
Pih2YWx1ZSkpOwogCiAgICAgaWYgKFY4Q2FudmFzUGF0dGVybjo6SGFzSW5zdGFuY2UodmFsdWUp
KQotICAgICAgICByZXR1cm4gQ2FudmFzU3R5bGU6OmNyZWF0ZShWOFByb3h5OjpET01XcmFwcGVy
VG9OYXRpdmU8Q2FudmFzUGF0dGVybj4odmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIENhbnZhc1N0
eWxlOjpjcmVhdGUoVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxDYW52YXNQYXR0
ZXJuPih2YWx1ZSkpOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKIEFDQ0VTU09SX0dFVFRFUihDYW52
YXNSZW5kZXJpbmdDb250ZXh0MkRTdHJva2VTdHlsZSkKIHsKLSAgICBDYW52YXNSZW5kZXJpbmdD
b250ZXh0MkQqIGltcGwgPSBWOFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8Q2FudmFzUmVuZGVy
aW5nQ29udGV4dDJEPihpbmZvLkhvbGRlcigpKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkQqIGltcGwgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPENhbnZhc1JlbmRl
cmluZ0NvbnRleHQyRD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgcmV0dXJuIHRvVjgoaW1wbC0+c3Ry
b2tlU3R5bGUoKSk7CiB9CiAKIEFDQ0VTU09SX1NFVFRFUihDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkRTdHJva2VTdHlsZSkKIHsKLSAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGltcGwgPSBW
OFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihpbmZv
LkhvbGRlcigpKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGltcGwgPSBWOFByb3h5
Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oaW5m
by5Ib2xkZXIoKSk7CiAgICAgaW1wbC0+c2V0U3Ryb2tlU3R5bGUodG9DYW52YXNTdHlsZSh2YWx1
ZSkpOwogfQogCiBBQ0NFU1NPUl9HRVRURVIoQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJERmlsbFN0
eWxlKQogewotICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogaW1wbCA9IFY4UHJveHk6OkRP
TVdyYXBwZXJUb05hdGl2ZTxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KGluZm8uSG9sZGVyKCkp
OworICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogaW1wbCA9IFY4UHJveHk6OmNvbnZlcnRE
T01XcmFwcGVyVG9OYXRpdmU8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihpbmZvLkhvbGRlcigp
KTsKICAgICByZXR1cm4gdG9WOChpbXBsLT5maWxsU3R5bGUoKSk7CiB9CiAKIEFDQ0VTU09SX1NF
VFRFUihDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRGaWxsU3R5bGUpCiB7Ci0gICAgQ2FudmFzUmVu
ZGVyaW5nQ29udGV4dDJEKiBpbXBsID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0aXZlPENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRD4oaW5mby5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUmVuZGVyaW5n
Q29udGV4dDJEKiBpbXBsID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxDYW52
YXNSZW5kZXJpbmdDb250ZXh0MkQ+KGluZm8uSG9sZGVyKCkpOwogICAgIGltcGwtPnNldEZpbGxT
dHlsZSh0b0NhbnZhc1N0eWxlKHZhbHVlKSk7CiB9CiAKQEAgLTEwMSw3ICsxMDEsNyBAQAogQ0FM
TEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFNldFN0cm9rZUNvbG9yKQog
ewogICAgIElOQ19TVEFUUygiRE9NLkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5zZXRTdHJva2VD
b2xvcigpIik7Ci0gICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94
eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6
OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUmVu
ZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0
PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdD
T05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOwogICAgIHN3aXRjaCAoYXJncy5MZW5ndGgoKSkgewog
ICAgIGNhc2UgMToKICAgICAgICAgaWYgKGFyZ3NbMF0tPklzU3RyaW5nKCkpCkBAIC0xMjIsNyAr
MTIyLDcgQEAKICAgICAgICAgY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IodG9GbG9hdChhcmdzWzBd
KSwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSwgdG9GbG9hdChhcmdzWzNdKSwg
dG9GbG9hdChhcmdzWzRdKSk7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAg
IFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VSUk9SLCAic2V0U3Ryb2tlQ29s
b3I6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIpOworICAgICAgICBWOFByb3h5Ojp0aHJv
d0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgInNldFN0cm9rZUNvbG9yOiBJbnZhbGlkIG51
bWJlciBvZiBhcmd1bWVudHMiKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiB2
ODo6VW5kZWZpbmVkKCk7CkBAIC0xMzEsNyArMTMxLDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChD
YW52YXNSZW5kZXJpbmdDb250ZXh0MkRTZXRGaWxsQ29sb3IpCiB7CiAgICAgSU5DX1NUQVRTKCJE
T00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnNldEZpbGxDb2xvcigpIik7Ci0gICAgQ2FudmFz
UmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2Fu
dmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRF
WFQyRCwgYXJncy5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250
ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRl
eHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVy
KCkpOwogICAgIHN3aXRjaCAoYXJncy5MZW5ndGgoKSkgewogICAgIGNhc2UgMToKICAgICAgICAg
aWYgKGFyZ3NbMF0tPklzU3RyaW5nKCkpCkBAIC0xNTIsNyArMTUyLDcgQEAKICAgICAgICAgY29u
dGV4dC0+c2V0RmlsbENvbG9yKHRvRmxvYXQoYXJnc1swXSksIHRvRmxvYXQoYXJnc1sxXSksIHRv
RmxvYXQoYXJnc1syXSksIHRvRmxvYXQoYXJnc1szXSksIHRvRmxvYXQoYXJnc1s0XSkpOwogICAg
ICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4
UHJveHk6OlNZTlRBWF9FUlJPUiwgInNldEZpbGxDb2xvcjogSW52YWxpZCBudW1iZXIgb2YgYXJn
dW1lbnRzIik7CisgICAgICAgIFY4UHJveHk6OnRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VS
Uk9SLCAic2V0RmlsbENvbG9yOiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiKTsKICAgICAg
ICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CkBAIC0xNjEsMTMg
KzE2MSwxMyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFN0
cm9rZVJlY3QpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJE
LnN0cm9rZVJlY3QoKSIpOwotICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9
IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFz
c0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOworICAgIENh
bnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2
ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVO
REVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKICAgICBpZiAoYXJncy5MZW5ndGgoKSA9
PSA1KQogICAgICAgICBjb250ZXh0LT5zdHJva2VSZWN0KHRvRmxvYXQoYXJnc1swXSksIHRvRmxv
YXQoYXJnc1sxXSksIHRvRmxvYXQoYXJnc1syXSksIHRvRmxvYXQoYXJnc1szXSksIHRvRmxvYXQo
YXJnc1s0XSkpOwogICAgIGVsc2UgaWYgKGFyZ3MuTGVuZ3RoKCkgPT0gNCkKICAgICAgICAgY29u
dGV4dC0+c3Ryb2tlUmVjdCh0b0Zsb2F0KGFyZ3NbMF0pLCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zs
b2F0KGFyZ3NbMl0pLCB0b0Zsb2F0KGFyZ3NbM10pKTsKICAgICBlbHNlIHsKLSAgICAgICAgVjhQ
cm94eTo6U2V0RE9NRXhjZXB0aW9uKElOREVYX1NJWkVfRVJSKTsKKyAgICAgICAgVjhQcm94eTo6
c2V0RE9NRXhjZXB0aW9uKElOREVYX1NJWkVfRVJSKTsKICAgICAgICAgcmV0dXJuIG5vdEhhbmRs
ZWRCeUludGVyY2VwdG9yKCk7CiAgICAgfQogICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CkBA
IC0xNzYsNyArMTc2LDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkRTZXRTaGFkb3cpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29u
dGV4dDJELnNldFNoYWRvdygpIik7Ci0gICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250
ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihW
OENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7Cisg
ICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRv
TmF0aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5W
QVNSRU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgc3dpdGNoIChhcmdz
Lkxlbmd0aCgpKSB7CiAgICAgY2FzZSAzOgpAQCAtMjAxLDcgKzIwMSw3IEBACiAgICAgICAgIGNv
bnRleHQtPnNldFNoYWRvdyh0b0Zsb2F0KGFyZ3NbMF0pLCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zs
b2F0KGFyZ3NbMl0pLCB0b0Zsb2F0KGFyZ3NbM10pLCB0b0Zsb2F0KGFyZ3NbNF0pLCB0b0Zsb2F0
KGFyZ3NbNV0pLCB0b0Zsb2F0KGFyZ3NbNl0pLCB0b0Zsb2F0KGFyZ3NbN10pKTsKICAgICAgICAg
YnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5
OjpTWU5UQVhfRVJST1IsICJzZXRTaGFkb3c6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIp
OworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgInNl
dFNoYWRvdzogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgIGJyZWFrOwog
ICAgIH0KIApAQCAtMjExLDEzICsyMTEsMTMgQEAKIENBTExCQUNLX0ZVTkNfREVDTChDYW52YXNS
ZW5kZXJpbmdDb250ZXh0MkREcmF3SW1hZ2UpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2FudmFz
UmVuZGVyaW5nQ29udGV4dDJELmRyYXdJbWFnZSgpIik7Ci0gICAgQ2FudmFzUmVuZGVyaW5nQ29u
dGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5n
Q29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5I
b2xkZXIoKSk7CisgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94
eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFz
c0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZyA9IGFyZ3NbMF07CiAKICAgICBpZiAoVjhIVE1MSW1h
Z2VFbGVtZW50OjpIYXNJbnN0YW5jZShhcmcpKSB7CiAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMg
PSAwOwotICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZV9lbGVtZW50ID0gVjhQcm94eTo6
RE9NV3JhcHBlclRvTm9kZTxIVE1MSW1hZ2VFbGVtZW50PihhcmcpOworICAgICAgICBIVE1MSW1h
Z2VFbGVtZW50KiBpbWFnZV9lbGVtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05v
ZGU8SFRNTEltYWdlRWxlbWVudD4oYXJnKTsKICAgICAgICAgc3dpdGNoIChhcmdzLkxlbmd0aCgp
KSB7CiAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZShpbWFn
ZV9lbGVtZW50LCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pKTsKQEAgLTIyNSw3
ICsyMjUsNyBAQAogICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICBjb250ZXh0LT5kcmF3SW1h
Z2UoaW1hZ2VfZWxlbWVudCwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSwgdG9G
bG9hdChhcmdzWzNdKSwgdG9GbG9hdChhcmdzWzRdKSwgZWMpOwogICAgICAgICAgICAgaWYgKGVj
ICE9IDApIHsKLSAgICAgICAgICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOwor
ICAgICAgICAgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgICAg
ICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAgICAgICAgICAgICB9CiAg
ICAgICAgICAgICBicmVhazsKQEAgLTIzNSwxMiArMjM1LDEyIEBACiAgICAgICAgICAgICAgICAg
RmxvYXRSZWN0KHRvRmxvYXQoYXJnc1s1XSksIHRvRmxvYXQoYXJnc1s2XSksIHRvRmxvYXQoYXJn
c1s3XSksIHRvRmxvYXQoYXJnc1s4XSkpLAogICAgICAgICAgICAgICAgIGVjKTsKICAgICAgICAg
ICAgIGlmIChlYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0
aW9uKGVjKTsKKyAgICAgICAgICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwog
ICAgICAgICAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogICAgICAg
ICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAg
ICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgImRyYXdJbWFnZTog
SW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIik7CisgICAgICAgICAgICBWOFByb3h5Ojp0aHJv
d0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgImRyYXdJbWFnZTogSW52YWxpZCBudW1iZXIg
b2YgYXJndW1lbnRzIik7CiAgICAgICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAg
ICAgICB9CiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CkBAIC0yNDksNyArMjQ5LDcg
QEAKICAgICAvLyBIVE1MQ2FudmFzRWxlbWVudAogICAgIGlmIChWOEhUTUxDYW52YXNFbGVtZW50
OjpIYXNJbnN0YW5jZShhcmcpKSB7CiAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAg
ICAgICBIVE1MQ2FudmFzRWxlbWVudCogY2FudmFzX2VsZW1lbnQgPSBWOFByb3h5OjpET01XcmFw
cGVyVG9Ob2RlPEhUTUxDYW52YXNFbGVtZW50PihhcmcpOworICAgICAgICBIVE1MQ2FudmFzRWxl
bWVudCogY2FudmFzX2VsZW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxI
VE1MQ2FudmFzRWxlbWVudD4oYXJnKTsKICAgICAgICAgc3dpdGNoIChhcmdzLkxlbmd0aCgpKSB7
CiAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZShjYW52YXNf
ZWxlbWVudCwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSk7CkBAIC0yNTcsNyAr
MjU3LDcgQEAKICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgY29udGV4dC0+ZHJhd0ltYWdl
KGNhbnZhc19lbGVtZW50LCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pLCB0b0Zs
b2F0KGFyZ3NbM10pLCB0b0Zsb2F0KGFyZ3NbNF0pLCBlYyk7CiAgICAgICAgICAgICBpZiAoZWMg
IT0gMCkgewotICAgICAgICAgICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7Cisg
ICAgICAgICAgICAgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKGVjKTsKICAgICAgICAgICAg
ICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKICAgICAgICAgICAgIH0KICAg
ICAgICAgICAgIGJyZWFrOwpAQCAtMjY3LDMzICsyNjcsMzMgQEAKICAgICAgICAgICAgICAgICBG
bG9hdFJlY3QodG9GbG9hdChhcmdzWzVdKSwgdG9GbG9hdChhcmdzWzZdKSwgdG9GbG9hdChhcmdz
WzddKSwgdG9GbG9hdChhcmdzWzhdKSksCiAgICAgICAgICAgICAgICAgZWMpOwogICAgICAgICAg
ICAgaWYgKGVjICE9IDApIHsKLSAgICAgICAgICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRp
b24oZWMpOworICAgICAgICAgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAg
ICAgICAgICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAgICAgICAg
ICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAg
IFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VSUk9SLCAiZHJhd0ltYWdlOiBJ
bnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgIFY4UHJveHk6OnRocm93
RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VSUk9SLCAiZHJhd0ltYWdlOiBJbnZhbGlkIG51bWJlciBv
ZiBhcmd1bWVudHMiKTsKICAgICAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAg
ICAgIH0KICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKICAgICB9CiAKLSAgICBWOFBy
b3h5OjpTZXRET01FeGNlcHRpb24oVFlQRV9NSVNNQVRDSF9FUlIpOworICAgIFY4UHJveHk6OnNl
dERPTUV4Y2VwdGlvbihUWVBFX01JU01BVENIX0VSUik7CiAgICAgcmV0dXJuIG5vdEhhbmRsZWRC
eUludGVyY2VwdG9yKCk7CiB9CiAKIENBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdD
b250ZXh0MkREcmF3SW1hZ2VGcm9tUmVjdCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5DYW52YXNS
ZW5kZXJpbmdDb250ZXh0MkQuZHJhd0ltYWdlRnJvbVJlY3QoKSIpOwotICAgIENhbnZhc1JlbmRl
cmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZhc1Jl
bmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQs
IGFyZ3MuSG9sZGVyKCkpOworICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9
IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+
KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsK
IAogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmcgPSBhcmdzWzBdOwogCiAgICAgaWYgKFY4
SFRNTEltYWdlRWxlbWVudDo6SGFzSW5zdGFuY2UoYXJnKSkgewotICAgICAgICBIVE1MSW1hZ2VF
bGVtZW50KiBpbWFnZV9lbGVtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MSW1h
Z2VFbGVtZW50PihhcmcpOworICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZV9lbGVtZW50
ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTEltYWdlRWxlbWVudD4oYXJn
KTsKICAgICAgICAgY29udGV4dC0+ZHJhd0ltYWdlRnJvbVJlY3QoaW1hZ2VfZWxlbWVudCwgIHRv
RmxvYXQoYXJnc1sxXSksIHRvRmxvYXQoYXJnc1syXSksIHRvRmxvYXQoYXJnc1szXSksIHRvRmxv
YXQoYXJnc1s0XSksIHRvRmxvYXQoYXJnc1s1XSksIHRvRmxvYXQoYXJnc1s2XSksIHRvRmxvYXQo
YXJnc1s3XSksIHRvRmxvYXQoYXJnc1s4XSksIFRvV2ViQ29yZVN0cmluZyhhcmdzWzldKSk7CiAg
ICAgfSBlbHNlCi0gICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJP
UiwgImRyYXdJbWFnZUZyb21SZWN0OiBJbnZhbGlkIHR5cGUgb2YgYXJndW1lbnRzIik7CisgICAg
ICAgIFY4UHJveHk6OnRocm93RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgImRyYXdJbWFnZUZy
b21SZWN0OiBJbnZhbGlkIHR5cGUgb2YgYXJndW1lbnRzIik7CiAKICAgICByZXR1cm4gdjg6OlVu
ZGVmaW5lZCgpOwogfQpAQCAtMzAxLDMzICszMDEsMzMgQEAKIENBTExCQUNLX0ZVTkNfREVDTChD
YW52YXNSZW5kZXJpbmdDb250ZXh0MkRDcmVhdGVQYXR0ZXJuKQogewogICAgIElOQ19TVEFUUygi
RE9NLkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5jcmVhdGVQYXR0ZXJuKCkiKTsKLSAgICBDYW52
YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxD
YW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09O
VEVYVDJELCBhcmdzLkhvbGRlcigpKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNv
bnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29u
dGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xk
ZXIoKSk7CiAKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJnID0gYXJnc1swXTsKIAogICAg
IGlmIChWOEhUTUxJbWFnZUVsZW1lbnQ6Okhhc0luc3RhbmNlKGFyZykpIHsKLSAgICAgICAgSFRN
TEltYWdlRWxlbWVudCogaW1hZ2VfZWxlbWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8
SFRNTEltYWdlRWxlbWVudD4oYXJnKTsKKyAgICAgICAgSFRNTEltYWdlRWxlbWVudCogaW1hZ2Vf
ZWxlbWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxJbWFnZUVsZW1l
bnQ+KGFyZyk7CiAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgICAgICBSZWZQdHI8
Q2FudmFzUGF0dGVybj4gcGF0dGVybiA9IGNvbnRleHQtPmNyZWF0ZVBhdHRlcm4oaW1hZ2VfZWxl
bWVudCwgdmFsdWVUb1N0cmluZ1dpdGhOdWxsQ2hlY2soYXJnc1sxXSksIGVjKTsKICAgICAgICAg
aWYgKGVjICE9IDApIHsKLSAgICAgICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7
CisgICAgICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogICAgICAgICAgICAg
cmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0
dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpDQU5WQVNQQVRURVJOLCBwYXR0
ZXJuLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4
Q2xhc3NJbmRleDo6Q0FOVkFTUEFUVEVSTiwgcGF0dGVybi5nZXQoKSk7CiAgICAgfQogCiAgICAg
aWYgKFY4SFRNTENhbnZhc0VsZW1lbnQ6Okhhc0luc3RhbmNlKGFyZykpIHsKLSAgICAgICAgSFRN
TENhbnZhc0VsZW1lbnQqIGNhbnZhc19lbGVtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9k
ZTxIVE1MQ2FudmFzRWxlbWVudD4oYXJnKTsKKyAgICAgICAgSFRNTENhbnZhc0VsZW1lbnQqIGNh
bnZhc19lbGVtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTENhbnZh
c0VsZW1lbnQ+KGFyZyk7CiAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgICAgICBS
ZWZQdHI8Q2FudmFzUGF0dGVybj4gcGF0dGVybiA9IGNvbnRleHQtPmNyZWF0ZVBhdHRlcm4oY2Fu
dmFzX2VsZW1lbnQsIHZhbHVlVG9TdHJpbmdXaXRoTnVsbENoZWNrKGFyZ3NbMV0pLCBlYyk7CiAg
ICAgICAgIGlmIChlYyAhPSAwKSB7Ci0gICAgICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRp
b24oZWMpOworICAgICAgICAgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKGVjKTsKICAgICAg
ICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogICAgICAgICB9Ci0gICAg
ICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUEFUVEVS
TiwgcGF0dGVybi5nZXQoKSk7CisgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9i
amVjdChWOENsYXNzSW5kZXg6OkNBTlZBU1BBVFRFUk4sIHBhdHRlcm4uZ2V0KCkpOwogICAgIH0K
IAotICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihUWVBFX01JU01BVENIX0VSUik7CisgICAg
VjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKFRZUEVfTUlTTUFUQ0hfRVJSKTsKICAgICByZXR1cm4g
bm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKIH0KIApAQCAtMzM1LDEzICszMzUsMTMgQEAKIHsK
ICAgICBJTkNfU1RBVFMoIkRPTS5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQuZmlsbFRleHQoKSIp
OwogCi0gICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZB
U1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUmVuZGVyaW5n
Q29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhU
MkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgLy8gVHdvIGZvcm1zOgogICAgIC8vICogZmlsbFRl
eHQodGV4dCwgeCwgeSkKICAgICAvLyAqIGZpbGxUZXh0KHRleHQsIHgsIHksIG1heFdpZHRoKQog
ICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMyB8fCBhcmdzLkxlbmd0aCgpID4gNCkgewotICAgICAg
ICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oU1lOVEFYX0VSUik7CisgICAgICAgIFY4UHJveHk6
OnNldERPTUV4Y2VwdGlvbihTWU5UQVhfRVJSKTsKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRC
eUludGVyY2VwdG9yKCk7CiAgICAgfQogCkBAIC0zNjEsMTMgKzM2MSwxMyBAQAogQ0FMTEJBQ0tf
RlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFN0cm9rZVRleHQpCiB7CiAgICAgSU5D
X1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnN0cm9rZVRleHQoKSIpOwotICAg
IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2Jq
ZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJ
TkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOworICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQy
RCogY29udGV4dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJp
bmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdz
LkhvbGRlcigpKTsKIAogICAgIC8vIFR3byBmb3JtczoKICAgICAvLyAqIHN0cm9rZVRleHQodGV4
dCwgeCwgeSkKICAgICAvLyAqIHN0cm9rZVRleHQodGV4dCwgeCwgeSwgbWF4V2lkdGgpCiAgICAg
aWYgKGFyZ3MuTGVuZ3RoKCkgPCAzIHx8IGFyZ3MuTGVuZ3RoKCkgPiA0KSB7Ci0gICAgICAgIFY4
UHJveHk6OlNldERPTUV4Y2VwdGlvbihTWU5UQVhfRVJSKTsKKyAgICAgICAgVjhQcm94eTo6c2V0
RE9NRXhjZXB0aW9uKFNZTlRBWF9FUlIpOwogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50
ZXJjZXB0b3IoKTsKICAgICB9CiAKQEAgLTM5MiwyMCArMzkyLDIwIEBACiAgICAgLy8gKiBwdXRJ
bWFnZURhdGEoSW1hZ2VEYXRhLCB4LCB5KQogICAgIC8vICogcHV0SW1hZ2VEYXRhKEltYWdlRGF0
YSwgeCwgeSwgZGlydHlYLCBkaXJ0eVksIGRpcnR5V2lkdGgsIGRpcnR5SGVpZ2h0KQogICAgIGlm
IChhcmdzLkxlbmd0aCgpICE9IDMgJiYgYXJncy5MZW5ndGgoKSAhPSA3KSB7Ci0gICAgICAgIFY4
UHJveHk6OlNldERPTUV4Y2VwdGlvbihTWU5UQVhfRVJSKTsKKyAgICAgICAgVjhQcm94eTo6c2V0
RE9NRXhjZXB0aW9uKFNZTlRBWF9FUlIpOwogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50
ZXJjZXB0b3IoKTsKICAgICB9CiAKLSAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRl
eHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4
Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKKyAg
ICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZB
U1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBJbWFnZURhdGEqIGlt
YWdlRGF0YSA9IDA7CiAKICAgICAvLyBOZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGFyZ3VtZW50IGlz
IG9mIHRoZSBjb3JyZWN0IHR5cGUsIHNpbmNlCi0gICAgLy8gVG9OYXRpdmVPYmplY3QoKSBleHBl
Y3RzIGl0IHRvIGJlIGNvcnJlY3QuIElmIHRoZSBhcmd1bWVudCB3YXMgaW5jb3JyZWN0CisgICAg
Ly8gY29udmVydFRvTmF0aXZlT2JqZWN0KCkgZXhwZWN0cyBpdCB0byBiZSBjb3JyZWN0LiBJZiB0
aGUgYXJndW1lbnQgd2FzIGluY29ycmVjdAogICAgIC8vIHdlIGxlYXZlIGl0IG51bGwsIGFuZCBw
dXRJbWFnZURhdGEoKSB3aWxsIHRocm93IHRoZSBjb3JyZWN0IGV4Y2VwdGlvbgogICAgIC8vIChU
WVBFX01JU01BVENIX0VSUikuCi0gICAgaWYgKFY4UHJveHk6OklzV3JhcHBlck9mVHlwZShhcmdz
WzBdLCBWOENsYXNzSW5kZXg6OklNQUdFREFUQSkpCi0gICAgICAgIGltYWdlRGF0YSA9IFY4UHJv
eHk6OlRvTmF0aXZlT2JqZWN0PEltYWdlRGF0YT4oVjhDbGFzc0luZGV4OjpJTUFHRURBVEEsIGFy
Z3NbMF0pOworICAgIGlmIChWOFByb3h5Ojppc1dyYXBwZXJPZlR5cGUoYXJnc1swXSwgVjhDbGFz
c0luZGV4OjpJTUFHRURBVEEpKQorICAgICAgICBpbWFnZURhdGEgPSBWOFByb3h5Ojpjb252ZXJ0
VG9OYXRpdmVPYmplY3Q8SW1hZ2VEYXRhPihWOENsYXNzSW5kZXg6OklNQUdFREFUQSwgYXJnc1sw
XSk7CiAKICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKIApAQCAtNDE1LDcgKzQxNSw3IEBACiAg
ICAgICAgIGNvbnRleHQtPnB1dEltYWdlRGF0YShpbWFnZURhdGEsIHRvRmxvYXQoYXJnc1sxXSks
IHRvRmxvYXQoYXJnc1syXSksIGVjKTsKIAogICAgIGlmIChlYyAhPSAwKSB7Ci0gICAgICAgIFY4
UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2Vw
dGlvbihlYyk7CiAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogICAg
IH0KIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVzdEN1
c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYTUxI
dHRwUmVxdWVzdEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVzdEN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTU0LDcgKzU0LDcgQEAKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUo
eG1sSHR0cFJlcXVlc3QtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSk7CiAgICAgaWYgKHByb3h5
KQotICAgICAgICByZXR1cm4gZmluZE9ubHkgPyBwcm94eS0+RmluZE9iamVjdEV2ZW50TGlzdGVu
ZXIodmFsdWUsIGZhbHNlKSA6IHByb3h5LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVy
KHZhbHVlLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBmaW5kT25seSA/IHByb3h5LT5maW5kT2Jq
ZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2UpIDogcHJveHktPmZpbmRPckNyZWF0ZU9iamVj
dEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKTsKIAogICAgIHJldHVybiBQYXNzUmVmUHRyPEV2
ZW50TGlzdGVuZXI+KCk7CiB9CkBAIC02Miw3ICs2Miw3IEBACiBBQ0NFU1NPUl9HRVRURVIoWE1M
SHR0cFJlcXVlc3RPbmFib3J0KQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0
Lm9uYWJvcnQuX2dldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhU
VFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJl
cXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4
Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh4bWxI
dHRwUmVxdWVzdC0+b25hYm9ydCgpKSB7CiAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciog
bGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVx
dWVzdC0+b25hYm9ydCgpKTsKICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4TGlzdGVu
ZXIgPSBsaXN0ZW5lci0+Z2V0TGlzdGVuZXJPYmplY3QoKTsKQEAgLTc0LDcgKzc0LDcgQEAKIEFD
Q0VTU09SX1NFVFRFUihYTUxIdHRwUmVxdWVzdE9uYWJvcnQpCiB7CiAgICAgSU5DX1NUQVRTKCJE
T00uWE1MSHR0cFJlcXVlc3Qub25hYm9ydC5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHht
bEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4
Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBS
ZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxY
TUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIo
KSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAoeG1sSHR0cFJlcXVl
c3QtPm9uYWJvcnQoKSkgewogICAgICAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0
ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0
LT5vbmFib3J0KCkpOwpAQCAtOTYsNyArOTYsNyBAQAogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBS
ZXF1ZXN0T25lcnJvcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdC5vbmVy
cm9yLl9nZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVR
VUVTVCwgaW5mby5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0
ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNz
SW5kZXg6OlhNTEhUVFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKICAgICBpZiAoeG1sSHR0cFJl
cXVlc3QtPm9uZXJyb3IoKSkgewogICAgICAgICBSZWZQdHI8VjhPYmplY3RFdmVudExpc3RlbmVy
PiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBS
ZXF1ZXN0LT5vbmVycm9yKCkpOwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0
ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMTA4LDcgKzEwOCw3IEBA
CiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RPbmVycm9yKQogewogICAgIElOQ19TVEFU
UygiRE9NLlhNTEh0dHBSZXF1ZXN0Lm9uZXJyb3IuX3NldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0
KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0
PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxI
dHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmpl
Y3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9s
ZGVyKCkpOwogICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsKICAgICAgICAgaWYgKHhtbEh0dHBS
ZXF1ZXN0LT5vbmVycm9yKCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciog
bGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVx
dWVzdC0+b25lcnJvcigpKTsKQEAgLTEzMCw3ICsxMzAsNyBAQAogQUNDRVNTT1JfR0VUVEVSKFhN
TEh0dHBSZXF1ZXN0T25sb2FkKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0
Lm9ubG9hZC5fZ2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQ
cm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRU
UFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVx
dWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhD
bGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHhtbEh0
dHBSZXF1ZXN0LT5vbmxvYWQoKSkgewogICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxp
c3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVl
c3QtPm9ubG9hZCgpKTsKICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4TGlzdGVuZXIg
PSBsaXN0ZW5lci0+Z2V0TGlzdGVuZXJPYmplY3QoKTsKQEAgLTE0Miw3ICsxNDIsNyBAQAogQUND
RVNTT1JfU0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25sb2FkKQogewogICAgIElOQ19TVEFUUygiRE9N
LlhNTEh0dHBSZXF1ZXN0Lm9ubG9hZC5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0
dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xh
c3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1
ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxI
dHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7
CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAoeG1sSHR0cFJlcXVlc3Qt
Pm9ubG9hZCgpKSB7CiAgICAgICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVy
ID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3QtPm9u
bG9hZCgpKTsKQEAgLTE2NCw3ICsxNjQsNyBAQAogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1
ZXN0T25sb2Fkc3RhcnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3Qub25s
b2Fkc3RhcnQuX2dldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhU
VFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJl
cXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4
Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh4bWxI
dHRwUmVxdWVzdC0+b25sb2Fkc3RhcnQoKSkgewogICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVu
ZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0
cFJlcXVlc3QtPm9ubG9hZHN0YXJ0KCkpOwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4g
djhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMTc2LDcgKzE3
Niw3IEBACiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RPbmxvYWRzdGFydCkKIHsKICAg
ICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdC5vbmxvYWRzdGFydC5fc2V0Iik7Ci0gICAg
WE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8
WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVy
KCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZl
cnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVR
VUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAg
ICBpZiAoeG1sSHR0cFJlcXVlc3QtPm9ubG9hZHN0YXJ0KCkpIHsKICAgICAgICAgICAgIFY4T2Jq
ZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlz
dGVuZXIqPih4bWxIdHRwUmVxdWVzdC0+b25sb2Fkc3RhcnQoKSk7CkBAIC0xOTgsNyArMTk4LDcg
QEAKIEFDQ0VTU09SX0dFVFRFUihYTUxIdHRwUmVxdWVzdE9ucHJvZ3Jlc3MpCiB7CiAgICAgSU5D
X1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3Qub25wcm9ncmVzcy5fZ2V0Iik7Ci0gICAgWE1MSHR0
cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0
cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwor
ICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwg
aW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0LT5vbnByb2dyZXNzKCkpIHsK
ICAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4
T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0LT5vbnByb2dyZXNzKCkpOwogICAg
ICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0
ZW5lck9iamVjdCgpOwpAQCAtMjEwLDcgKzIxMCw3IEBACiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0
cFJlcXVlc3RPbnByb2dyZXNzKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0
Lm9ucHJvZ3Jlc3MuX3NldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9
IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhN
TEhUVFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0
cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+
KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh2
YWx1ZS0+SXNOdWxsKCkpIHsKICAgICAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0LT5vbnByb2dyZXNz
KCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0
aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdC0+b25wcm9ncmVz
cygpKTsKQEAgLTIzMiw3ICsyMzIsNyBAQAogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0
T25yZWFkeXN0YXRlY2hhbmdlKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0
Lm9ucmVhZHlzdGF0ZWNoYW5nZS5fZ2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBS
ZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJ
bmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0
KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRw
UmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAg
ICAgaWYgKHhtbEh0dHBSZXF1ZXN0LT5vbnJlYWR5c3RhdGVjaGFuZ2UoKSkgewogICAgICAgICBW
OE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVu
dExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3QtPm9ucmVhZHlzdGF0ZWNoYW5nZSgpKTsKICAgICAg
ICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4TGlzdGVuZXIgPSBsaXN0ZW5lci0+Z2V0TGlzdGVu
ZXJPYmplY3QoKTsKQEAgLTI0NCw3ICsyNDQsNyBAQAogQUNDRVNTT1JfU0VUVEVSKFhNTEh0dHBS
ZXF1ZXN0T25yZWFkeXN0YXRlY2hhbmdlKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBS
ZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZS5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHht
bEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4
Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBS
ZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxY
TUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIo
KSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAoeG1sSHR0cFJlcXVl
c3QtPm9ucmVhZHlzdGF0ZWNoYW5nZSgpKSB7CiAgICAgICAgICAgICBWOE9iamVjdEV2ZW50TGlz
dGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1s
SHR0cFJlcXVlc3QtPm9ucmVhZHlzdGF0ZWNoYW5nZSgpKTsKQEAgLTI2OCwxNCArMjY4LDE0IEBA
CiAgICAgLy8gRklYTUU6IFRoaXMgaXMgb25seSBuZWVkZWQgYmVjYXVzZSB3ZWJraXQgc2V0IHRo
aXMgZ2V0dGVyIGFzIGN1c3RvbS4KICAgICAvLyBTbyB3ZSBuZWVkIGEgY3VzdG9tIG1ldGhvZCB0
byBhdm9pZCBmb3JraW5nIHRoZSBJREwgZmlsZS4KICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRw
UmVxdWVzdC5yZXNwb25zZXRleHQuX2dldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRw
UmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNz
SW5kZXg6OlhNTEhUVFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVz
dCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0
cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwog
ICAgIHJldHVybiB2OFN0cmluZ09yTnVsbCh4bWxIdHRwUmVxdWVzdC0+cmVzcG9uc2VUZXh0KCkp
OwogfQogCiBDQUxMQkFDS19GVU5DX0RFQ0woWE1MSHR0cFJlcXVlc3RBZGRFdmVudExpc3RlbmVy
KQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIo
KSIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0
aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBh
cmdzLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFBy
b3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6
WE1MSFRUUFJFUVVFU1QsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgUmVmUHRyPEV2ZW50TGlzdGVu
ZXI+IGxpc3RlbmVyID0gZ2V0RXZlbnRMaXN0ZW5lcih4bWxIdHRwUmVxdWVzdCwgYXJnc1sxXSwg
ZmFsc2UpOwogICAgIGlmIChsaXN0ZW5lcikgewpAQCAtMjkxLDcgKzI5MSw3IEBACiBDQUxMQkFD
S19GVU5DX0RFQ0woWE1MSHR0cFJlcXVlc3RSZW1vdmVFdmVudExpc3RlbmVyKQogewogICAgIElO
Q19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoKSIpOwotICAg
IFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0
PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBhcmdzLkhvbGRl
cigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252
ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJF
UVVFU1QsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3Rl
bmVyID0gZ2V0RXZlbnRMaXN0ZW5lcih4bWxIdHRwUmVxdWVzdCwgYXJnc1sxXSwgdHJ1ZSk7CiAg
ICAgaWYgKGxpc3RlbmVyKSB7CkBAIC0zMTcsNyArMzE3LDcgQEAKICAgICBpZiAoYXJncy5MZW5n
dGgoKSA8IDIpCiAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCJOb3QgZW5vdWdoIGFyZ3VtZW50
cyIsIFY4UHJveHk6OlNZTlRBWF9FUlJPUik7CiAKLSAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0
cFJlcXVlc3QgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFz
c0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgYXJncy5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJlcXVl
c3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhNTEh0
dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBhcmdzLkhvbGRlcigpKTsK
IAogICAgIFN0cmluZyBtZXRob2QgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgU3Ry
aW5nIHVybHN0cmluZyA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzFdKTsKQEAgLTM3MCw3ICszNzAs
NyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFhNTEh0dHBSZXF1ZXN0U2VuZCkKIHsKICAgICBJTkNf
U1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdC5zZW5kKCkiKTsKLSAgICBYTUxIdHRwUmVxdWVzdCog
eG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4o
VjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgYXJncy5Ib2xkZXIoKSk7CisgICAgWE1MSHR0
cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0
PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBhcmdzLkhvbGRl
cigpKTsKIAogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgIGlmIChhcmdzLkxlbmd0aCgp
IDwgMSkKQEAgLTM4MCw3ICszODAsNyBAQAogICAgICAgICAvLyBGSVhNRTogdXBzdHJlYW0gaGFu
ZGxlcyAiRmlsZSIgb2JqZWN0cyB0b28uCiAgICAgICAgIGlmIChJc0RvY3VtZW50VHlwZShhcmcp
KSB7CiAgICAgICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpIYW5k
bGU8djg6Ok9iamVjdD46OkNhc3QoYXJnKTsKLSAgICAgICAgICAgIERvY3VtZW50KiBkb2N1bWVu
dCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8RG9jdW1lbnQ+KG9iamVjdCk7CisgICAgICAg
ICAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9k
ZTxEb2N1bWVudD4ob2JqZWN0KTsKICAgICAgICAgICAgIEFTU0VSVChkb2N1bWVudCk7CiAgICAg
ICAgICAgICB4bWxIdHRwUmVxdWVzdC0+c2VuZChkb2N1bWVudCwgZWMpOwogICAgICAgICB9IGVs
c2UKQEAgLTM5OCw3ICszOTgsNyBAQAogICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMikKICAgICAg
ICAgcmV0dXJuIHRocm93RXJyb3IoIk5vdCBlbm91Z2ggYXJndW1lbnRzIiwgVjhQcm94eTo6U1lO
VEFYX0VSUk9SKTsKIAotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJv
eHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBS
RVFVRVNULCBhcmdzLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVl
c3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xh
c3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGFyZ3MuSG9sZGVyKCkpOwogICAgIEV4Y2VwdGlvbkNv
ZGUgZWMgPSAwOwogICAgIFN0cmluZyBoZWFkZXIgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7
CiAgICAgU3RyaW5nIHZhbHVlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMV0pOwpAQCAtNDE0LDcg
KzQxNCw3IEBACiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAxKQogICAgICAgICByZXR1cm4gdGhy
b3dFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiLCBWOFByb3h5OjpTWU5UQVhfRVJST1IpOwog
Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGFyZ3Mu
SG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxI
VFRQUkVRVUVTVCwgYXJncy5Ib2xkZXIoKSk7CiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAg
ICAgU3RyaW5nIGhlYWRlciA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKICAgICBTdHJpbmcg
cmVzdWx0ID0geG1sSHR0cFJlcXVlc3QtPmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlciwgZWMpOwpA
QCAtNDI5LDcgKzQyOSw3IEBACiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAxKQogICAgICAgICBy
ZXR1cm4gdGhyb3dFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiLCBWOFByb3h5OjpTWU5UQVhf
RVJST1IpOwogCi0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6
VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVF
U1QsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9
IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0lu
ZGV4OjpYTUxIVFRQUkVRVUVTVCwgYXJncy5Ib2xkZXIoKSk7CiAgICAgU3RyaW5nIHZhbHVlID0g
dG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgIHhtbEh0dHBSZXF1ZXN0LT5vdmVycmlkZU1p
bWVUeXBlKHZhbHVlKTsKICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwpJbmRleDogV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhJbnNwZWN0b3JDb250cm9sbGVyQ3VzdG9tLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEluc3BlY3RvckNvbnRyb2xs
ZXJDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4SW5zcGVjdG9yQ29udHJvbGxlckN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU2
LDExICs1NiwxMSBAQAogICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMSkKICAgICAgICAgcmV0dXJu
IHY4OjpVbmRlZmluZWQoKTsKIAotICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVy
VG9Ob2RlPE5vZGU+KGFyZ3NbMF0pOworICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5Ojpjb252ZXJ0
RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKTsKICAgICBpZiAoIW5vZGUpCiAgICAgICAg
IHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNw
ZWN0b3JDb250cm9sbGVyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SW5zcGVjdG9yQ29udHJv
bGxlcj4oVjhDbGFzc0luZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVSLCBhcmdzLkhvbGRlcigpKTsK
KyAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVyID0gVjhQcm94eTo6
Y29udmVydFRvTmF0aXZlT2JqZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+KFY4Q2xhc3NJbmRleDo6
SU5TUEVDVE9SQ09OVFJPTExFUiwgYXJncy5Ib2xkZXIoKSk7CiAgICAgaW5zcGVjdG9yQ29udHJv
bGxlci0+aGlnaGxpZ2h0KG5vZGUpOwogCiAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKQEAg
LTc4LDcgKzc4LDcgQEAKIAogICAgIHVuc2lnbmVkIGlkZW50aWZpZXIgPSBhcmdzWzFdLT5JbnQz
MlZhbHVlKCk7CiAKLSAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVy
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SW5zcGVjdG9yQ29udHJvbGxlcj4oVjhDbGFzc0lu
ZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVSLCBhcmdzLkhvbGRlcigpKTsKKyAgICBJbnNwZWN0b3JD
b250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+KFY4Q2xhc3NJbmRleDo6SU5TUEVDVE9SQ09OVFJP
TExFUiwgYXJncy5Ib2xkZXIoKSk7CiAgICAgUmVmUHRyPEluc3BlY3RvclJlc291cmNlPiByZXNv
dXJjZSA9IGluc3BlY3RvckNvbnRyb2xsZXItPnJlc291cmNlcygpLmdldChpZGVudGlmaWVyKTsK
ICAgICBBU1NFUlQocmVzb3VyY2UpOwogICAgIGlmICghcmVzb3VyY2UpCkBAIC05MCw3ICs5MCw3
IEBACiAgICAgaWYgKGRvY3VtZW50LT5pc1BsdWdpbkRvY3VtZW50KCkgfHwgZG9jdW1lbnQtPmlz
SW1hZ2VEb2N1bWVudCgpIHx8IGRvY3VtZW50LT5pc01lZGlhRG9jdW1lbnQoKSkKICAgICAgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6RE9DVU1FTlQsIGRvY3VtZW50KTsKKyAgICByZXR1cm4gVjhQcm94eTo6
Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET0NVTUVOVCwgZG9jdW1lbnQpOwogfQog
CiBDQUxMQkFDS19GVU5DX0RFQ0woSW5zcGVjdG9yQ29udHJvbGxlclNlYXJjaCkKQEAgLTEwMCw3
ICsxMDAsNyBAQAogICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMikKICAgICAgICAgcmV0dXJuIHY4
OjpVbmRlZmluZWQoKTsKIAotICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPE5vZGU+KGFyZ3NbMF0pOworICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5Ojpjb252ZXJ0RE9N
V3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKTsKICAgICBpZiAoIW5vZGUpCiAgICAgICAgIHJl
dHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgICAgICBpZiAo
bmV3U3RhcnQgPT0gc3RhcnRWaXNpYmxlUG9zaXRpb24oc2VhcmNoUmFuZ2UuZ2V0KCksIERPV05T
VFJFQU0pKQogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgcmVzdWx0LT5TZXQodjg6Ok51
bWJlcjo6TmV3KGluZGV4KyspLCBWOFByb3h5OjpUb1Y4T2JqZWN0PFJhbmdlPihWOENsYXNzSW5k
ZXg6OlJBTkdFLCByZXN1bHRSYW5nZS5nZXQoKSkpOworICAgICAgICByZXN1bHQtPlNldCh2ODo6
TnVtYmVyOjpOZXcoaW5kZXgrKyksIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0PFJhbmdlPihW
OENsYXNzSW5kZXg6OlJBTkdFLCByZXN1bHRSYW5nZS5nZXQoKSkpOwogCiAgICAgICAgIHNldFN0
YXJ0KHNlYXJjaFJhbmdlLmdldCgpLCBuZXdTdGFydCk7CiAgICAgfSB3aGlsZSAodHJ1ZSk7CkBA
IC0xNDUsOCArMTQ1LDggQEAKIHsKICAgICBJTkNfU1RBVFMoIkluc3BlY3RvckNvbnRyb2xsZXIu
aW5zcGVjdGVkV2luZG93KCkiKTsKIAotICAgIEluc3BlY3RvckNvbnRyb2xsZXIqIGluc3BlY3Rv
ckNvbnRyb2xsZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxJbnNwZWN0b3JDb250cm9sbGVy
PihWOENsYXNzSW5kZXg6OklOU1BFQ1RPUkNPTlRST0xMRVIsIGFyZ3MuSG9sZGVyKCkpOwotICAg
IHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01X
SU5ET1csIGluc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RlZFBhZ2UoKS0+bWFpbkZyYW1lKCkt
PmRvbVdpbmRvdygpKTsKKyAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9s
bGVyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+
KFY4Q2xhc3NJbmRleDo6SU5TUEVDVE9SQ09OVFJPTExFUiwgYXJncy5Ib2xkZXIoKSk7CisgICAg
cmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4
OjpET01XSU5ET1csIGluc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RlZFBhZ2UoKS0+bWFpbkZy
YW1lKCktPmRvbVdpbmRvdygpKTsKIH0KIAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEluc3BlY3RvckNv
bnRyb2xsZXJTZXR0aW5nKQpAQCAtMTYwLDcgKzE2MCw3IEBACiAgICAgaWYgKGtleS5pc0VtcHR5
KCkpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICBJbnNwZWN0b3JDb250
cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SW5z
cGVjdG9yQ29udHJvbGxlcj4oVjhDbGFzc0luZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVSLCBhcmdz
LkhvbGRlcigpKTsKKyAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVy
ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+KFY4
Q2xhc3NJbmRleDo6SU5TUEVDVE9SQ09OVFJPTExFUiwgYXJncy5Ib2xkZXIoKSk7CiAgICAgY29u
c3QgSW5zcGVjdG9yQ29udHJvbGxlcjo6U2V0dGluZyYgc2V0dGluZyA9IGluc3BlY3RvckNvbnRy
b2xsZXIgLT5zZXR0aW5nKGtleSk7CiAKICAgICBzd2l0Y2ggKHNldHRpbmcudHlwZSgpKSB7CkBA
IC0yMjEsNyArMjIxLDcgQEAKICAgICB9IGVsc2UKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmlu
ZWQoKTsKIAotICAgIEluc3BlY3RvckNvbnRyb2xsZXIqIGluc3BlY3RvckNvbnRyb2xsZXIgPSBW
OFByb3h5OjpUb05hdGl2ZU9iamVjdDxJbnNwZWN0b3JDb250cm9sbGVyPihWOENsYXNzSW5kZXg6
OklOU1BFQ1RPUkNPTlRST0xMRVIsIGFyZ3MuSG9sZGVyKCkpOworICAgIEluc3BlY3RvckNvbnRy
b2xsZXIqIGluc3BlY3RvckNvbnRyb2xsZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmpl
Y3Q8SW5zcGVjdG9yQ29udHJvbGxlcj4oVjhDbGFzc0luZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVS
LCBhcmdzLkhvbGRlcigpKTsKICAgICBpbnNwZWN0b3JDb250cm9sbGVyLT5zZXRTZXR0aW5nKGtl
eSwgc2V0dGluZyk7CiAKICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwpJbmRleDogV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDU1NTdHlsZURlY2xhcmF0aW9uQ3VzdG9tLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOENTU1N0eWxlRGVjbGFyYXRp
b25DdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4Q1NTU3R5bGVEZWNsYXJhdGlvbkN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE2
MSw3ICsxNjEsNyBAQAogCiAgICAgLy8gU2VhcmNoIHRoZSBzdHlsZSBkZWNsYXJhdGlvbi4KICAg
ICBDU1NTdHlsZURlY2xhcmF0aW9uKiBpbXAgPQotICAgICAgICBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxDU1NTdHlsZURlY2xhcmF0aW9uPihWOENsYXNzSW5kZXg6OkNTU1NUWUxFREVDTEFSQVRJ
T04sIGluZm8uSG9sZGVyKCkpOworICAgICAgICBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmpl
Y3Q8Q1NTU3R5bGVEZWNsYXJhdGlvbj4oVjhDbGFzc0luZGV4OjpDU1NTVFlMRURFQ0xBUkFUSU9O
LCBpbmZvLkhvbGRlcigpKTsKICAgICBDU1NQcm9wZXJ0eUluZm8qIHByb3BJbmZvID0gY3NzUHJv
cGVydHlJbmZvKG5hbWUpOwogCiAgICAgLy8gRG8gbm90IGhhbmRsZSBub24tcHJvcGVydHkgbmFt
ZXMuCkBAIC0xOTUsNyArMTk1LDcgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5DU1NTdHlsZURl
Y2xhcmF0aW9uLk5hbWVkUHJvcGVydHlTZXR0ZXIiKTsKICAgICBDU1NTdHlsZURlY2xhcmF0aW9u
KiBpbXAgPQotICAgICAgICBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDU1NTdHlsZURlY2xhcmF0
aW9uPigKKyAgICAgICAgVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENTU1N0eWxlRGVj
bGFyYXRpb24+KAogICAgICAgICAgICAgVjhDbGFzc0luZGV4OjpDU1NTVFlMRURFQ0xBUkFUSU9O
LCBpbmZvLkhvbGRlcigpKTsKICAgICBDU1NQcm9wZXJ0eUluZm8qIHByb3BJbmZvID0gY3NzUHJv
cGVydHlJbmZvKG5hbWUpOwogICAgIGlmICghcHJvcEluZm8pCkluZGV4OiBXZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOFNWR01hdHJpeEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTVkdNYXRyaXhDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5
NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1ZHTWF0cml4Q3VzdG9tLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNDYsNyArNDYsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFNWR01h
dHJpeEludmVyc2UpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uU1ZHTWF0cml4LmludmVyc2UoKSIp
OwotICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeCA9ICpWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxWOFNWR1BPRFR5cGVXcmFwcGVyPFRyYW5zZm9ybWF0aW9uTWF0cml4PiA+KFY4Q2xhc3NJ
bmRleDo6U1ZHTUFUUklYLCBhcmdzLkhvbGRlcigpKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCBtYXRyaXggPSAqVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFY4U1ZHUE9EVHlwZVdy
YXBwZXI8VHJhbnNmb3JtYXRpb25NYXRyaXg+ID4oVjhDbGFzc0luZGV4OjpTVkdNQVRSSVgsIGFy
Z3MuSG9sZGVyKCkpOwogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgIFRyYW5zZm9ybWF0
aW9uTWF0cml4IHJlc3VsdCA9IG1hdHJpeC5pbnZlcnNlKCk7CiAKQEAgLTU0LDE3ICs1NCwxNyBA
QAogICAgICAgICBlYyA9IFNWR0V4Y2VwdGlvbjo6U1ZHX01BVFJJWF9OT1RfSU5WRVJUQUJMRTsK
IAogICAgIGlmIChlYyAhPSAwKSB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihl
Yyk7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgIHJldHVy
biB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKTsKICAgICB9CiAKLSAgICByZXR1cm4gVjhQcm94eTo6
VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNWR01BVFJJWCwgbmV3IFY4U1ZHU3RhdGljUE9EVHlw
ZVdyYXBwZXI8VHJhbnNmb3JtYXRpb25NYXRyaXg+KHJlc3VsdCkpOworICAgIHJldHVybiBWOFBy
b3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNWR01BVFJJWCwgbmV3IFY4U1ZH
U3RhdGljUE9EVHlwZVdyYXBwZXI8VHJhbnNmb3JtYXRpb25NYXRyaXg+KHJlc3VsdCkpOwogfQog
CiBDQUxMQkFDS19GVU5DX0RFQ0woU1ZHTWF0cml4Um90YXRlRnJvbVZlY3RvcikKIHsKICAgICBJ
TkNfU1RBVFMoIkRPTS5TVkdNYXRyaXgucm90YXRlRnJvbVZlY3RvcigpIik7Ci0gICAgVHJhbnNm
b3JtYXRpb25NYXRyaXggbWF0cml4ID0gKlY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFY4U1ZHUE9E
VHlwZVdyYXBwZXI8VHJhbnNmb3JtYXRpb25NYXRyaXg+ID4oVjhDbGFzc0luZGV4OjpTVkdNQVRS
SVgsIGFyZ3MuSG9sZGVyKCkpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeCA9ICpW
OFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8VjhTVkdQT0RUeXBlV3JhcHBlcjxUcmFuc2Zv
cm1hdGlvbk1hdHJpeD4gPihWOENsYXNzSW5kZXg6OlNWR01BVFJJWCwgYXJncy5Ib2xkZXIoKSk7
CiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAgZmxvYXQgeCA9IHRvRmxvYXQoYXJnc1sw
XSk7CiAgICAgZmxvYXQgeSA9IHRvRmxvYXQoYXJnc1sxXSk7CkBAIC03NCwxMSArNzQsMTEgQEAK
ICAgICAgICAgZWMgPSBTVkdFeGNlcHRpb246OlNWR19JTlZBTElEX1ZBTFVFX0VSUjsKIAogICAg
IGlmIChlYyAhPSAwKSB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7Cisg
ICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgIHJldHVybiB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4oKTsKICAgICB9CiAKLSAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9i
amVjdChWOENsYXNzSW5kZXg6OlNWR01BVFJJWCwgbmV3IFY4U1ZHU3RhdGljUE9EVHlwZVdyYXBw
ZXI8VHJhbnNmb3JtYXRpb25NYXRyaXg+KHJlc3VsdCkpOworICAgIHJldHVybiBWOFByb3h5Ojpj
b252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNWR01BVFJJWCwgbmV3IFY4U1ZHU3RhdGlj
UE9EVHlwZVdyYXBwZXI8VHJhbnNmb3JtYXRpb25NYXRyaXg+KHJlc3VsdCkpOwogfQogCiB9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEVs
ZW1lbnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4RWxlbWVudEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhFbGVtZW50Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTMsNyAr
NTMsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEVsZW1lbnRTZXRBdHRyaWJ1dGUpCiB7CiAgICAg
SU5DX1NUQVRTKCJET00uRWxlbWVudC5zZXRBdHRyaWJ1dGUoKSIpOwotICAgIEVsZW1lbnQqIGVs
ZW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEVsZW1lbnQ+KGFyZ3MuSG9sZGVyKCkp
OworICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9k
ZTxFbGVtZW50PihhcmdzLkhvbGRlcigpKTsKICAgICBTdHJpbmcgbmFtZSA9IHRvV2ViQ29yZVN0
cmluZyhhcmdzWzBdKTsKICAgICBTdHJpbmcgdmFsdWUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1sx
XSk7CiAKQEAgLTc0LDggKzc0LDggQEAKICAgICBpZiAoIVY4QXR0cjo6SGFzSW5zdGFuY2UoYXJn
c1swXSkpCiAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKFRZUEVfTUlTTUFUQ0hfRVJSKTsKIAot
ICAgIEF0dHIqIG5ld0F0dHIgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEF0dHI+KGFyZ3Nb
MF0pOwotICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEVs
ZW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOworICAgIEF0dHIqIG5ld0F0dHIgPSBWOFByb3h5Ojpjb252
ZXJ0RE9NV3JhcHBlclRvTm9kZTxBdHRyPihhcmdzWzBdKTsKKyAgICBFbGVtZW50KiBlbGVtZW50
ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8RWxlbWVudD4oYXJncy5Ib2xkZXIo
KSk7CiAKICAgICBpZiAoIWFsbG93U2V0dGluZ1NyY1RvSmF2YXNjcmlwdFVSTChlbGVtZW50LCBu
ZXdBdHRyLT5uYW1lKCksIG5ld0F0dHItPnZhbHVlKCkpKQogICAgICAgICByZXR1cm4gdjg6OlVu
ZGVmaW5lZCgpOwpAQCAtODUsMTMgKzg1LDEzIEBACiAgICAgaWYgKGVjKQogICAgICAgICB0aHJv
d0Vycm9yKGVjKTsKIAotICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChyZXN1bHQu
Z2V0KCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QocmVzdWx0
LmdldCgpKTsKIH0KIAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEVsZW1lbnRTZXRBdHRyaWJ1dGVOUykK
IHsKICAgICBJTkNfU1RBVFMoIkRPTS5FbGVtZW50LnNldEF0dHJpYnV0ZU5TKCkiKTsKLSAgICBF
bGVtZW50KiBlbGVtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxFbGVtZW50Pihhcmdz
LkhvbGRlcigpKTsKKyAgICBFbGVtZW50KiBlbGVtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdy
YXBwZXJUb05vZGU8RWxlbWVudD4oYXJncy5Ib2xkZXIoKSk7CiAgICAgU3RyaW5nIG5hbWVzcGFj
ZVVSSSA9IHRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsQ2hlY2soYXJnc1swXSk7CiAgICAgU3RyaW5n
IHF1YWxpZmllZE5hbWUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1sxXSk7CiAgICAgU3RyaW5nIHZh
bHVlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMl0pOwpAQCAtMTEzLDggKzExMyw4IEBACiAgICAg
aWYgKCFWOEF0dHI6Okhhc0luc3RhbmNlKGFyZ3NbMF0pKQogICAgICAgICByZXR1cm4gdGhyb3dF
cnJvcihUWVBFX01JU01BVENIX0VSUik7CiAKLSAgICBBdHRyKiBuZXdBdHRyID0gVjhQcm94eTo6
RE9NV3JhcHBlclRvTm9kZTxBdHRyPihhcmdzWzBdKTsKLSAgICBFbGVtZW50KiBlbGVtZW50ID0g
VjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxFbGVtZW50PihhcmdzLkhvbGRlcigpKTsKKyAgICBB
dHRyKiBuZXdBdHRyID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8QXR0cj4oYXJn
c1swXSk7CisgICAgRWxlbWVudCogZWxlbWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVy
VG9Ob2RlPEVsZW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgaWYgKCFhbGxvd1NldHRpbmdT
cmNUb0phdmFzY3JpcHRVUkwoZWxlbWVudCwgbmV3QXR0ci0+bmFtZSgpLCBuZXdBdHRyLT52YWx1
ZSgpKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKQEAgLTEyNCw3ICsxMjQsNyBA
QAogICAgIGlmIChlYykKICAgICAgICAgdGhyb3dFcnJvcihlYyk7CiAKLSAgICByZXR1cm4gVjhQ
cm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6
Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUg
U3RyaW5nIHRvRXZlbnRUeXBlKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiB2YWx1ZSkKQEAgLTEzNiw3
ICsxMzYsNyBAQAogCiBBQ0NFU1NPUl9TRVRURVIoRWxlbWVudEV2ZW50SGFuZGxlcikKIHsKLSAg
ICBOb2RlKiBub2RlID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxOb2RlPihpbmZvLkhvbGRl
cigpKTsKKyAgICBOb2RlKiBub2RlID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8
Tm9kZT4oaW5mby5Ib2xkZXIoKSk7CiAKICAgICBTdHJpbmcgZXZlbnRUeXBlID0gdG9FdmVudFR5
cGUobmFtZSk7CiAKQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgICAgICBpZiAoIXByb3h5KQogICAg
ICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIGlmIChSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlz
dGVuZXIgPSBwcm94eS0+RmluZE9yQ3JlYXRlVjhFdmVudExpc3RlbmVyKHZhbHVlLCB0cnVlKSkK
KyAgICAgICAgaWYgKFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5k
T3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIodmFsdWUsIHRydWUpKQogICAgICAgICAgICAgbm9kZS0+
c2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKICAgICB9IGVs
c2UKICAgICAgICAgbm9kZS0+Y2xlYXJBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSk7
CkBAIC0xNTksMTAgKzE1OSwxMCBAQAogCiBBQ0NFU1NPUl9HRVRURVIoRWxlbWVudEV2ZW50SGFu
ZGxlcikKIHsKLSAgICBOb2RlKiBub2RlID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxOb2Rl
PihpbmZvLkhvbGRlcigpKTsKKyAgICBOb2RlKiBub2RlID0gVjhQcm94eTo6Y29udmVydERPTVdy
YXBwZXJUb05vZGU8Tm9kZT4oaW5mby5Ib2xkZXIoKSk7CiAKICAgICBFdmVudExpc3RlbmVyKiBs
aXN0ZW5lciA9IG5vZGUtPmdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIodG9FdmVudFR5cGUobmFt
ZSkpOwotICAgIHJldHVybiBWOFByb3h5OjpFdmVudExpc3RlbmVyVG9WOE9iamVjdChsaXN0ZW5l
cik7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRFdmVudExpc3RlbmVyVG9WOE9iamVjdChs
aXN0ZW5lcik7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTFNlbGVjdEVsZW1lbnRDb2xsZWN0aW9uQ3VzdG9tLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxTZWxlY3RFbGVt
ZW50Q29sbGVjdGlvbkN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhIVE1MU2VsZWN0RWxlbWVudENvbGxlY3Rpb25DdXN0b20uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC00Myw3ICs0Myw3IEBACiBOQU1FRF9QUk9QRVJUWV9HRVRURVIoSFRN
TFNlbGVjdEVsZW1lbnRDb2xsZWN0aW9uKQogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxTZWxl
Y3RFbGVtZW50Q29sbGVjdGlvbi5OYW1lZFByb3BlcnR5U2V0dGVyIik7Ci0gICAgSFRNTFNlbGVj
dEVsZW1lbnQqIHNlbGVjdCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTFNlbGVjdEVs
ZW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSBW
OFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MU2VsZWN0RWxlbWVudD4oaW5mby5I
b2xkZXIoKSk7CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlID0gaW5mby5Ib2xkZXIo
KS0+R2V0UmVhbE5hbWVkUHJvcGVydHlJblByb3RvdHlwZUNoYWluKG5hbWUpOwogCiAgICAgaWYg
KCF2YWx1ZS5Jc0VtcHR5KCkpCkBAIC02MiwxNiArNjIsMTYgQEAKICAgICAgICAgcmV0dXJuIG5v
dEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAKICAgICBpZiAoaXRlbXMuc2l6ZSgpID09IDEpCi0g
ICAgICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChpdGVtcy5hdCgwKS5nZXQoKSk7
CisgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QoaXRlbXMuYXQo
MCkuZ2V0KCkpOwogCiAgICAgTm9kZUxpc3QqIGxpc3QgPSBuZXcgVjhOYW1lZE5vZGVzQ29sbGVj
dGlvbihpdGVtcyk7Ci0gICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4
OjpOT0RFTElTVCwgbGlzdCk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6Tk9ERUxJU1QsIGxpc3QpOwogfQogCiBJTkRFWEVEX1BST1BFUlRZX1NF
VFRFUihIVE1MU2VsZWN0RWxlbWVudENvbGxlY3Rpb24pCiB7CiAgICAgSU5DX1NUQVRTKCJET00u
SFRNTFNlbGVjdEVsZW1lbnRDb2xsZWN0aW9uLkluZGV4ZWRQcm9wZXJ0eVNldHRlciIpOwotICAg
IEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhU
TUxTZWxlY3RFbGVtZW50PihpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVudCog
c2VsZWN0ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTFNlbGVjdEVsZW1l
bnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIHJldHVybiB0b09wdGlvbnNDb2xsZWN0aW9uU2V0dGVy
KGluZGV4LCB2YWx1ZSwgc2VsZWN0KTsKIH0KIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhIVE1MT3B0aW9uc0NvbGxlY3Rpb25DdXN0b20uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTE9wdGlvbnNDb2xsZWN0aW9uQ3VzdG9tLmNw
cAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxP
cHRpb25zQ29sbGVjdGlvbkN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ2LDcgKzQ2LDcg
QEAKIENBTExCQUNLX0ZVTkNfREVDTChIVE1MT3B0aW9uc0NvbGxlY3Rpb25SZW1vdmUpCiB7CiAg
ICAgSU5DX1NUQVRTKCJET00uSFRNTE9wdGlvbnNDb2xsZWN0aW9uLnJlbW92ZSgpIik7Ci0gICAg
SFRNTE9wdGlvbnNDb2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIVE1M
T3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBh
cmdzLkhvbGRlcigpKTsKKyAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb24qIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRl
eDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBhcmdzLkhvbGRlcigpKTsKICAgICBIVE1MU2VsZWN0
RWxlbWVudCogYmFzZSA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4oaW1wLT5iYXNl
KCkpOwogICAgIHJldHVybiByZW1vdmVFbGVtZW50KGJhc2UsIGFyZ3MpOwogfQpAQCAtNTUsMTEg
KzU1LDExIEBACiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTE9wdGlvbnNDb2xsZWN0aW9uLmFk
ZCgpIik7CiAgICAgaWYgKCFWOEhUTUxPcHRpb25FbGVtZW50OjpIYXNJbnN0YW5jZShhcmdzWzBd
KSkgewotICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oVFlQRV9NSVNNQVRDSF9FUlIp
OworICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oVFlQRV9NSVNNQVRDSF9FUlIpOwog
ICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgIH0KLSAgICBIVE1MT3B0aW9uc0Nv
bGxlY3Rpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PEhUTUxPcHRpb25zQ29sbGVj
dGlvbj4oVjhDbGFzc0luZGV4OjpIVE1MT1BUSU9OU0NPTExFQ1RJT04sIGFyZ3MuSG9sZGVyKCkp
OwotICAgIEhUTUxPcHRpb25FbGVtZW50KiBvcHRpb24gPSBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPEhUTUxPcHRpb25FbGVtZW50PihhcmdzWzBdKTsKKyAgICBIVE1MT3B0aW9uc0NvbGxlY3Rp
b24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxl
Y3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBhcmdzLkhvbGRlcigp
KTsKKyAgICBIVE1MT3B0aW9uRWxlbWVudCogb3B0aW9uID0gVjhQcm94eTo6Y29udmVydERPTVdy
YXBwZXJUb05vZGU8SFRNTE9wdGlvbkVsZW1lbnQ+KGFyZ3NbMF0pOwogCiAgICAgRXhjZXB0aW9u
Q29kZSBlYyA9IDA7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAyKQpAQCAtNzksNyArNzksNyBA
QAogICAgIH0KIAogICAgIGlmIChlYyAhPSAwKQotICAgICAgICBWOFByb3h5OjpTZXRET01FeGNl
cHRpb24oZWMpOworICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogCiAgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIH0KQEAgLTg3LDcgKzg3LDcgQEAKIEFDQ0VTU09SX0dF
VFRFUihIVE1MT3B0aW9uc0NvbGxlY3Rpb25MZW5ndGgpCiB7CiAgICAgSU5DX1NUQVRTKCJET00u
SFRNTE9wdGlvbnNDb2xsZWN0aW9uLmxlbmd0aC5fZ2V0Iik7Ci0gICAgSFRNTE9wdGlvbnNDb2xs
ZWN0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxlY3Rp
b24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBpbmZvLkhvbGRlcigpKTsK
KyAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2
ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlND
T0xMRUNUSU9OLCBpbmZvLkhvbGRlcigpKTsKICAgICBpbnQgdiA9IGltcC0+bGVuZ3RoKCk7CiAg
ICAgcmV0dXJuIHY4OjpJbnRlZ2VyOjpOZXcodik7CiB9CkBAIC05NSw3ICs5NSw3IEBACiBBQ0NF
U1NPUl9TRVRURVIoSFRNTE9wdGlvbnNDb2xsZWN0aW9uTGVuZ3RoKQogewogICAgIElOQ19TVEFU
UygiRE9NLkhUTUxPcHRpb25zQ29sbGVjdGlvbi5sZW5ndGguX3NldCIpOwotICAgIEhUTUxPcHRp
b25zQ29sbGVjdGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SFRNTE9wdGlvbnND
b2xsZWN0aW9uPihWOENsYXNzSW5kZXg6OkhUTUxPUFRJT05TQ09MTEVDVElPTiwgaW5mby5Ib2xk
ZXIoKSk7CisgICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0
VG9OYXRpdmVPYmplY3Q8SFRNTE9wdGlvbnNDb2xsZWN0aW9uPihWOENsYXNzSW5kZXg6OkhUTUxP
UFRJT05TQ09MTEVDVElPTiwgaW5mby5Ib2xkZXIoKSk7CiAgICAgZG91YmxlIHYgPSB2YWx1ZS0+
TnVtYmVyVmFsdWUoKTsKICAgICB1bnNpZ25lZCBuZXdMZW5ndGggPSAwOwogICAgIEV4Y2VwdGlv
bkNvZGUgZWMgPSAwOwpAQCAtMTEwLDI1ICsxMTAsMjUgQEAKICAgICBpZiAoIWVjKQogICAgICAg
ICBpbXAtPnNldExlbmd0aCh2YWx1ZS0+VWludDMyVmFsdWUoKSwgZWMpOwogCi0gICAgVjhQcm94
eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMp
OwogfQogCiBJTkRFWEVEX1BST1BFUlRZX0dFVFRFUihIVE1MT3B0aW9uc0NvbGxlY3Rpb24pCiB7
CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTE9wdGlvbnNDb2xsZWN0aW9uLkluZGV4ZWRQcm9wZXJ0
eUdldHRlciIpOwotICAgIEhUTUxPcHRpb25zQ29sbGVjdGlvbiogY29sbGVjdGlvbiA9IFY4UHJv
eHk6OlRvTmF0aXZlT2JqZWN0PEhUTUxPcHRpb25zQ29sbGVjdGlvbj4oVjhDbGFzc0luZGV4OjpI
VE1MT1BUSU9OU0NPTExFQ1RJT04sIGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxPcHRpb25zQ29s
bGVjdGlvbiogY29sbGVjdGlvbiA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1M
T3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBp
bmZvLkhvbGRlcigpKTsKIAogICAgIFJlZlB0cjxOb2RlPiByZXN1bHQgPSBjb2xsZWN0aW9uLT5p
dGVtKGluZGV4KTsKICAgICBpZiAoIXJlc3VsdCkKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRC
eUludGVyY2VwdG9yKCk7CiAKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVz
dWx0LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJl
c3VsdC5nZXQoKSk7CiB9CiAKIElOREVYRURfUFJPUEVSVFlfU0VUVEVSKEhUTUxPcHRpb25zQ29s
bGVjdGlvbikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MT3B0aW9uc0NvbGxlY3Rpb24uSW5k
ZXhlZFByb3BlcnR5U2V0dGVyIik7Ci0gICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uKiBjb2xsZWN0
aW9uID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SFRNTE9wdGlvbnNDb2xsZWN0aW9uPihWOENs
YXNzSW5kZXg6OkhUTUxPUFRJT05TQ09MTEVDVElPTiwgaW5mby5Ib2xkZXIoKSk7CisgICAgSFRN
TE9wdGlvbnNDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PEhUTUxPcHRpb25zQ29sbGVjdGlvbj4oVjhDbGFzc0luZGV4OjpIVE1MT1BUSU9OU0NP
TExFQ1RJT04sIGluZm8uSG9sZGVyKCkpOwogICAgIEhUTUxTZWxlY3RFbGVtZW50KiBiYXNlID0g
c3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihjb2xsZWN0aW9uLT5iYXNlKCkpOwogICAg
IHJldHVybiB0b09wdGlvbnNDb2xsZWN0aW9uU2V0dGVyKGluZGV4LCB2YWx1ZSwgYmFzZSk7CiB9
CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOENsaXBib2FyZEN1c3RvbS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDbGlwYm9hcmRDdXN0
b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
Q2xpcGJvYXJkQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDcsNyArNDcsNyBAQAogQUND
RVNTT1JfR0VUVEVSKENsaXBib2FyZFR5cGVzKQogewogICAgIElOQ19TVEFUUygiRE9NLkNsaXBi
b2FyZC50eXBlcygpIik7Ci0gICAgQ2xpcGJvYXJkKiBjbGlwYm9hcmQgPSBWOFByb3h5OjpUb05h
dGl2ZU9iamVjdDxDbGlwYm9hcmQ+KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBpbmZvLkhvbGRl
cigpKTsKKyAgICBDbGlwYm9hcmQqIGNsaXBib2FyZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2
ZU9iamVjdDxDbGlwYm9hcmQ+KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBpbmZvLkhvbGRlcigp
KTsKIAogICAgIEhhc2hTZXQ8U3RyaW5nPiB0eXBlcyA9IGNsaXBib2FyZC0+dHlwZXMoKTsKICAg
ICBpZiAodHlwZXMuaXNFbXB0eSgpKQpAQCAtNjUsNyArNjUsNyBAQAogQ0FMTEJBQ0tfRlVOQ19E
RUNMKENsaXBib2FyZENsZWFyRGF0YSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5DbGlwYm9hcmQu
Y2xlYXJEYXRhKCkiKTsKLSAgICBDbGlwYm9hcmQqIGNsaXBib2FyZCA9IFY4UHJveHk6OlRvTmF0
aXZlT2JqZWN0PENsaXBib2FyZD4oVjhDbGFzc0luZGV4OjpDTElQQk9BUkQsIGFyZ3MuSG9sZGVy
KCkpOworICAgIENsaXBib2FyZCogY2xpcGJvYXJkID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PENsaXBib2FyZD4oVjhDbGFzc0luZGV4OjpDTElQQk9BUkQsIGFyZ3MuSG9sZGVyKCkp
OwogCiAgICAgaWYgKCFhcmdzLkxlbmd0aCgpKSB7CiAgICAgICAgIGNsaXBib2FyZC0+Y2xlYXJB
bGxEYXRhKCk7CkBAIC04Myw3ICs4Myw3IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woQ2xpcGJvYXJk
R2V0RGF0YSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5DbGlwYm9hcmQuZ2V0RGF0YSgpIik7Ci0g
ICAgQ2xpcGJvYXJkKiBjbGlwYm9hcmQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDbGlwYm9h
cmQ+KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBhcmdzLkhvbGRlcigpKTsKKyAgICBDbGlwYm9h
cmQqIGNsaXBib2FyZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDbGlwYm9hcmQ+
KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBhcmdzLkhvbGRlcigpKTsKIAogICAgIGlmIChhcmdz
Lkxlbmd0aCgpICE9IDEpCiAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCJnZXREYXRhOiBJbnZh
bGlkIG51bWJlciBvZiBhcmd1bWVudHMiLCBWOFByb3h5OjpTWU5UQVhfRVJST1IpOwpAQCAtOTks
NyArOTksNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKENsaXBib2FyZFNldERhdGEpCiB7CiAgICAg
SU5DX1NUQVRTKCJET00uQ2xpcGJvYXJkLnNldERhdGEoKSIpOwotICAgIENsaXBib2FyZCogY2xp
cGJvYXJkID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2xpcGJvYXJkPihWOENsYXNzSW5kZXg6
OkNMSVBCT0FSRCwgYXJncy5Ib2xkZXIoKSk7CisgICAgQ2xpcGJvYXJkKiBjbGlwYm9hcmQgPSBW
OFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2xpcGJvYXJkPihWOENsYXNzSW5kZXg6OkNM
SVBCT0FSRCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBpZiAoYXJncy5MZW5ndGgoKSAhPSAyKQog
ICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigic2V0RGF0YTogSW52YWxpZCBudW1iZXIgb2YgYXJn
dW1lbnRzIiwgVjhQcm94eTo6U1lOVEFYX0VSUk9SKTsKQEAgLTExMiw3ICsxMTIsNyBAQAogQ0FM
TEJBQ0tfRlVOQ19ERUNMKENsaXBib2FyZFNldERyYWdJbWFnZSkKIHsKICAgICBJTkNfU1RBVFMo
IkRPTS5DbGlwYm9hcmQuc2V0RHJhZ0ltYWdlKCkiKTsKLSAgICBDbGlwYm9hcmQqIGNsaXBib2Fy
ZCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENsaXBib2FyZD4oVjhDbGFzc0luZGV4OjpDTElQ
Qk9BUkQsIGFyZ3MuSG9sZGVyKCkpOworICAgIENsaXBib2FyZCogY2xpcGJvYXJkID0gVjhQcm94
eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENsaXBib2FyZD4oVjhDbGFzc0luZGV4OjpDTElQQk9B
UkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgaWYgKCFjbGlwYm9hcmQtPmlzRm9yRHJhZ2dpbmco
KSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKQEAgLTEyNSw3ICsxMjUsNyBAQAog
CiAgICAgTm9kZSogbm9kZSA9IDA7CiAgICAgaWYgKFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1sw
XSkpCi0gICAgICAgIG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3Nb
MF0pOworICAgICAgICBub2RlID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9k
ZT4oYXJnc1swXSk7CiAKICAgICBpZiAoIW5vZGUgfHwgIW5vZGUtPmlzRWxlbWVudE5vZGUoKSkK
ICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoInNldERyYWdJbWFnZUZyb21FbGVtZW50OiBJbnZh
bGlkIGZpcnN0IGFyZ3VtZW50Iik7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OEhUTUxGcmFtZVNldEVsZW1lbnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTEZyYW1lU2V0RWxlbWVudEN1c3RvbS5jcHAJKHJldmlzaW9u
IDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MRnJhbWVTZXRFbGVt
ZW50Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDcsMTQgKzQ3LDE0IEBACiBOQU1FRF9Q
Uk9QRVJUWV9HRVRURVIoSFRNTEZyYW1lU2V0RWxlbWVudCkKIHsKICAgICBJTkNfU1RBVFMoIkRP
TS5IVE1MRnJhbWVTZXRFbGVtZW50Lk5hbWVkUHJvcGVydHlHZXR0ZXIiKTsKLSAgICBIVE1MRnJh
bWVTZXRFbGVtZW50KiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxGcmFtZVNl
dEVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxGcmFtZVNldEVsZW1lbnQqIGltcCA9
IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxGcmFtZVNldEVsZW1lbnQ+KGlu
Zm8uSG9sZGVyKCkpOwogICAgIE5vZGUqIGZyYW1lTm9kZSA9IGltcC0+Y2hpbGRyZW4oKS0+bmFt
ZWRJdGVtKHY4U3RyaW5nVG9BdG9taWNXZWJDb3JlU3RyaW5nKG5hbWUpKTsKICAgICBpZiAoZnJh
bWVOb2RlICYmIGZyYW1lTm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmZyYW1lVGFnKSkgewog
ICAgICAgICBEb2N1bWVudCogZG9jID0gc3RhdGljX2Nhc3Q8SFRNTEZyYW1lRWxlbWVudCo+KGZy
YW1lTm9kZSktPmNvbnRlbnREb2N1bWVudCgpOwogICAgICAgICBpZiAoIWRvYykKICAgICAgICAg
ICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBk
b2MtPmZyYW1lKCkpCi0gICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENs
YXNzSW5kZXg6OkRPTVdJTkRPVywgZnJhbWUtPmRvbVdpbmRvdygpKTsKKyAgICAgICAgICAgIHJl
dHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywg
ZnJhbWUtPmRvbVdpbmRvdygpKTsKICAgICB9CiAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVy
Y2VwdG9yKCk7CiB9CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERvY3VtZW50
TG9jYXRpb25DdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4RG9jdW1lbnRMb2NhdGlvbkN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhEb2N1bWVudExvY2F0aW9uQ3VzdG9tLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMzQsMTcgKzM0LDE3IEBACiAKIEFDQ0VTU09SX0dFVFRFUihEb2N1bWVu
dExvY2F0aW9uKQogewotICAgIERvY3VtZW50KiBkb2N1bWVudCA9IFY4UHJveHk6OkRPTVdyYXBw
ZXJUb05hdGl2ZTxEb2N1bWVudD4oaW5mby5Ib2xkZXIoKSk7CisgICAgRG9jdW1lbnQqIGRvY3Vt
ZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxEb2N1bWVudD4oaW5mby5I
b2xkZXIoKSk7CiAgICAgaWYgKCFkb2N1bWVudC0+ZnJhbWUoKSkKICAgICAgICAgcmV0dXJuIHY4
OjpOdWxsKCk7CiAKICAgICBET01XaW5kb3cqIHdpbmRvdyA9IGRvY3VtZW50LT5mcmFtZSgpLT5k
b21XaW5kb3coKTsKLSAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6
OkxPQ0FUSU9OLCB3aW5kb3ctPmxvY2F0aW9uKCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252
ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCB3aW5kb3ctPmxvY2F0aW9uKCkp
OwogfQogCiBBQ0NFU1NPUl9TRVRURVIoRG9jdW1lbnRMb2NhdGlvbikKIHsKLSAgICBEb2N1bWVu
dCogZG9jdW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8RG9jdW1lbnQ+KGluZm8u
SG9sZGVyKCkpOworICAgIERvY3VtZW50KiBkb2N1bWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01X
cmFwcGVyVG9OYXRpdmU8RG9jdW1lbnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIGlmICghZG9jdW1l
bnQtPmZyYW1lKCkpCiAgICAgICAgIHJldHVybjsKIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhMb2NhdGlvbkN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhMb2NhdGlvbkN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysg
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhMb2NhdGlvbkN1c3RvbS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTYyLDcgKzYyLDcgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5o
YXNoLl9zZXQiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9s
ZGVyKCk7Ci0gICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExvY2F0
aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOworICAgIExvY2F0aW9uKiBpbXAg
PSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6
TE9DQVRJT04sIGhvbGRlcik7CiAgICAgU3RyaW5nIGhhc2ggPSB0b1dlYkNvcmVTdHJpbmcodmFs
dWUpOwogCiAgICAgRnJhbWUqIGZyYW1lID0gaW1wLT5mcmFtZSgpOwpAQCAtODUsNyArODUsNyBA
QAogewogICAgIElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLmhvc3QuX3NldCIpOwogICAgIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gaW5mby5Ib2xkZXIoKTsKLSAgICBMb2NhdGlvbiog
aW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9D
QVRJT04sIGhvbGRlcik7CisgICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKICAg
ICBTdHJpbmcgaG9zdCA9IHRvV2ViQ29yZVN0cmluZyh2YWx1ZSk7CiAKICAgICBGcmFtZSogZnJh
bWUgPSBpbXAtPmZyYW1lKCk7CkBAIC0xMDUsNyArMTA1LDcgQEAKIHsKICAgICBJTkNfU1RBVFMo
IkRPTS5Mb2NhdGlvbi5ob3N0bmFtZS5fc2V0Iik7CiAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0
PiBob2xkZXIgPSBpbmZvLkhvbGRlcigpOwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpU
b05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsK
KyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExvY2F0
aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwogICAgIFN0cmluZyBob3N0bmFt
ZSA9IHRvV2ViQ29yZVN0cmluZyh2YWx1ZSk7CiAKICAgICBGcmFtZSogZnJhbWUgPSBpbXAtPmZy
YW1lKCk7CkBAIC0xMjIsNyArMTIyLDcgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlv
bi5ocmVmLl9zZXQiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8u
SG9sZGVyKCk7Ci0gICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExv
Y2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOworICAgIExvY2F0aW9uKiBp
bXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRl
eDo6TE9DQVRJT04sIGhvbGRlcik7CiAKICAgICBGcmFtZSogZnJhbWUgPSBpbXAtPmZyYW1lKCk7
CiAgICAgaWYgKCFmcmFtZSkKQEAgLTE0Miw3ICsxNDIsNyBAQAogewogICAgIElOQ19TVEFUUygi
RE9NLkxvY2F0aW9uLnBhdGhuYW1lLl9zZXQiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+
IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0gICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRv
TmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwor
ICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRp
b24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvbGRlcik7CiAgICAgU3RyaW5nIHBhdGhuYW1l
ID0gdG9XZWJDb3JlU3RyaW5nKHZhbHVlKTsKIAogICAgIEZyYW1lKiBmcmFtZSA9IGltcC0+ZnJh
bWUoKTsKQEAgLTE1OSw3ICsxNTksNyBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkxvY2F0aW9u
LnBvcnQuX3NldCIpOwogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gaW5mby5I
b2xkZXIoKTsKLSAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TG9j
YXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvbGRlcik7CisgICAgTG9jYXRpb24qIGlt
cCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4
OjpMT0NBVElPTiwgaG9sZGVyKTsKICAgICBTdHJpbmcgcG9ydCA9IHRvV2ViQ29yZVN0cmluZyh2
YWx1ZSk7CiAKICAgICBGcmFtZSogZnJhbWUgPSBpbXAtPmZyYW1lKCk7CkBAIC0xNzYsNyArMTc2
LDcgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5wcm90b2NvbC5fc2V0Iik7CiAg
ICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBpbmZvLkhvbGRlcigpOwotICAgIExv
Y2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0lu
ZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29u
dmVydFRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xk
ZXIpOwogICAgIFN0cmluZyBwcm90b2NvbCA9IHRvV2ViQ29yZVN0cmluZyh2YWx1ZSk7CiAKICAg
ICBGcmFtZSogZnJhbWUgPSBpbXAtPmZyYW1lKCk7CkBAIC0xOTMsNyArMTkzLDcgQEAKIHsKICAg
ICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5zZWFyY2guX3NldCIpOwogICAgIHY4OjpIYW5kbGU8
djg6Ok9iamVjdD4gaG9sZGVyID0gaW5mby5Ib2xkZXIoKTsKLSAgICBMb2NhdGlvbiogaW1wID0g
VjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04s
IGhvbGRlcik7CisgICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKICAgICBTdHJp
bmcgcXVlcnkgPSB0b1dlYkNvcmVTdHJpbmcodmFsdWUpOwogCiAgICAgRnJhbWUqIGZyYW1lID0g
aW1wLT5mcmFtZSgpOwpAQCAtMjEwLDE0ICsyMTAsMTQgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRP
TS5Mb2NhdGlvbi5yZWxvYWQuX2dldCIpOwogICAgIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6
RnVuY3Rpb25UZW1wbGF0ZT4gcHJpdmF0ZVRlbXBsYXRlID0gdjg6OlBlcnNpc3RlbnQ8djg6OkZ1
bmN0aW9uVGVtcGxhdGU+OjpOZXcodjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyh2OExvY2F0aW9u
UmVsb2FkQ2FsbGJhY2ssIHY4OjpIYW5kbGU8djg6OlZhbHVlPigpLCB2ODo6U2lnbmF0dXJlOjpO
ZXcoVjhMb2NhdGlvbjo6R2V0UmF3VGVtcGxhdGUoKSkpKTsKLSAgICB2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpM
T0NBVElPTiwgaW5mby5UaGlzKCkpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVy
ID0gVjhQcm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBpbmZv
LlRoaXMoKSk7CiAgICAgaWYgKGhvbGRlci5Jc0VtcHR5KCkpIHsKICAgICAgICAgLy8gY2FuIG9u
bHkgcmVhY2ggaGVyZSBieSAnb2JqZWN0Ll9fcHJvdG9fXy5mdW5jJywgYW5kIGl0IHNob3VsZCBw
YXNzZWQKICAgICAgICAgLy8gZG9tYWluIHNlY3VyaXR5IGNoZWNrIGFscmVhZHkKICAgICAgICAg
cmV0dXJuIHByaXZhdGVUZW1wbGF0ZS0+R2V0RnVuY3Rpb24oKTsKICAgICB9Ci0gICAgTG9jYXRp
b24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6
OkxPQ0FUSU9OLCBob2xkZXIpOwotICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1w
LT5mcmFtZSgpLCBmYWxzZSkpIHsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVy
dFRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIp
OworICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCBmYWxzZSkp
IHsKICAgICAgICAgc3RhdGljIHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBz
aGFyZWRUZW1wbGF0ZSA9IHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3
KHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcodjhMb2NhdGlvblJlbG9hZENhbGxiYWNrLCB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4oKSwgdjg6OlNpZ25hdHVyZTo6TmV3KFY4TG9jYXRpb246OkdldFJh
d1RlbXBsYXRlKCkpKSk7CiAgICAgICAgIHJldHVybiBzaGFyZWRUZW1wbGF0ZS0+R2V0RnVuY3Rp
b24oKTsKICAgICB9IGVsc2UKQEAgLTIyOCwxNCArMjI4LDE0IEBACiB7CiAgICAgSU5DX1NUQVRT
KCJET00uTG9jYXRpb24ucmVwbGFjZS5fZ2V0Iik7CiAgICAgc3RhdGljIHY4OjpQZXJzaXN0ZW50
PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBwcml2YXRlVGVtcGxhdGUgPSB2ODo6UGVyc2lzdGVudDx2
ODo6RnVuY3Rpb25UZW1wbGF0ZT46Ok5ldyh2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KHY4TG9j
YXRpb25SZXBsYWNlQ2FsbGJhY2ssIHY4OjpIYW5kbGU8djg6OlZhbHVlPigpLCB2ODo6U2lnbmF0
dXJlOjpOZXcoVjhMb2NhdGlvbjo6R2V0UmF3VGVtcGxhdGUoKSkpKTsKLSAgICB2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0lu
ZGV4OjpMT0NBVElPTiwgaW5mby5UaGlzKCkpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
aG9sZGVyID0gVjhQcm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkxPQ0FUSU9O
LCBpbmZvLlRoaXMoKSk7CiAgICAgaWYgKGhvbGRlci5Jc0VtcHR5KCkpIHsKICAgICAgICAgLy8g
Y2FuIG9ubHkgcmVhY2ggaGVyZSBieSAnb2JqZWN0Ll9fcHJvdG9fXy5mdW5jJywgYW5kIGl0IHNo
b3VsZCBwYXNzZWQKICAgICAgICAgLy8gZG9tYWluIHNlY3VyaXR5IGNoZWNrIGFscmVhZHkKICAg
ICAgICAgcmV0dXJuIHByaXZhdGVUZW1wbGF0ZS0+R2V0RnVuY3Rpb24oKTsKICAgICB9Ci0gICAg
TG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNz
SW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwotICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNzRnJh
bWUoaW1wLT5mcmFtZSgpLCBmYWxzZSkpIHsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6
Y29udmVydFRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBo
b2xkZXIpOworICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCBm
YWxzZSkpIHsKICAgICAgICAgc3RhdGljIHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBs
YXRlPiBzaGFyZWRUZW1wbGF0ZSA9IHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRl
Pjo6TmV3KHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcodjhMb2NhdGlvblJlcGxhY2VDYWxsYmFj
aywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCksIHY4OjpTaWduYXR1cmU6Ok5ldyhWOExvY2F0aW9u
OjpHZXRSYXdUZW1wbGF0ZSgpKSkpOwogICAgICAgICByZXR1cm4gc2hhcmVkVGVtcGxhdGUtPkdl
dEZ1bmN0aW9uKCk7CiAgICAgfSBlbHNlCkBAIC0yNDcsMTQgKzI0NywxNCBAQAogICAgIElOQ19T
VEFUUygiRE9NLkxvY2F0aW9uLmFzc2lnbi5fZ2V0Iik7CiAgICAgc3RhdGljIHY4OjpQZXJzaXN0
ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBwcml2YXRlVGVtcGxhdGUgPQogICAgIHY4OjpQZXJz
aXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KHY4OjpGdW5jdGlvblRlbXBsYXRlOjpO
ZXcodjhMb2NhdGlvbkFzc2lnbkNhbGxiYWNrLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKSwgdjg6
OlNpZ25hdHVyZTo6TmV3KFY4TG9jYXRpb246OkdldFJhd1RlbXBsYXRlKCkpKSk7Ci0gICAgdjg6
OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5OjpMb29rdXBET01XcmFwcGVyKFY4
Q2xhc3NJbmRleDo6TE9DQVRJT04sIGluZm8uVGhpcygpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Omxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpM
T0NBVElPTiwgaW5mby5UaGlzKCkpOwogICAgIGlmIChob2xkZXIuSXNFbXB0eSgpKSB7CiAgICAg
ICAgIC8vIGNhbiBvbmx5IHJlYWNoIGhlcmUgYnkgJ29iamVjdC5fX3Byb3RvX18uZnVuYycsIGFu
ZCBpdCBzaG91bGQgcGFzc2VkCiAgICAgICAgIC8vIGRvbWFpbiBzZWN1cml0eSBjaGVjayBhbHJl
YWR5CiAgICAgICAgIHJldHVybiBwcml2YXRlVGVtcGxhdGUtPkdldEZ1bmN0aW9uKCk7CiAgICAg
fQotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4o
VjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKLSAgICBpZiAoIVY4UHJveHk6OkNhbkFj
Y2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgZmFsc2UpKSB7CisgICAgTG9jYXRpb24qIGltcCA9IFY4
UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NB
VElPTiwgaG9sZGVyKTsKKyAgICBpZiAoIVY4UHJveHk6OmNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJh
bWUoKSwgZmFsc2UpKSB7CiAgICAgICAgIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rp
b25UZW1wbGF0ZT4gc2hhcmVkVGVtcGxhdGUgPSB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25U
ZW1wbGF0ZT46Ok5ldyh2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KHY4TG9jYXRpb25Bc3NpZ25D
YWxsYmFjaywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCksIHY4OjpTaWduYXR1cmU6Ok5ldyhWOExv
Y2F0aW9uOjpHZXRSYXdUZW1wbGF0ZSgpKSkpOwogICAgICAgICByZXR1cm4gc2hhcmVkVGVtcGxh
dGUtPkdldEZ1bmN0aW9uKCk7CiAgICAgfSBlbHNlCkBAIC0yNjcsNyArMjY3LDcgQEAKIAogICAg
IElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLnJlbG9hZCIpOwogICAgIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBob2xkZXIgPSBhcmdzLkhvbGRlcigpOwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVy
KTsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExv
Y2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwogCiAgICAgRnJhbWUqIGZy
YW1lID0gaW1wLT5mcmFtZSgpOwogICAgIGlmICghZnJhbWUgfHwgIVNjcmlwdENvbnRyb2xsZXI6
OmlzU2FmZVNjcmlwdChmcmFtZSkpCkBAIC0yODIsNyArMjgyLDcgQEAKIHsKICAgICBJTkNfU1RB
VFMoIkRPTS5Mb2NhdGlvbi5yZXBsYWNlIik7CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhv
bGRlciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0
aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOworICAg
IExvY2F0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+
KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvbGRlcik7CiAKICAgICBGcmFtZSogZnJhbWUgPSBp
bXAtPmZyYW1lKCk7CiAgICAgaWYgKCFmcmFtZSkKQEAgLTMwMyw3ICszMDMsNyBAQAogewogICAg
IElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLmFzc2lnbiIpOwogICAgIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBob2xkZXIgPSBhcmdzLkhvbGRlcigpOwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVy
KTsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExv
Y2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwogCiAgICAgRnJhbWUqIGZy
YW1lID0gaW1wLT5mcmFtZSgpOwogICAgIGlmICghZnJhbWUpCkBAIC0zMzQsOCArMzM0LDggQEAK
IHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi50b1N0cmluZyIpOwogICAgIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBob2xkZXIgPSBhcmdzLkhvbGRlcigpOwotICAgIExvY2F0aW9uKiBpbXAg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElP
TiwgaG9sZGVyKTsKLSAgICBpZiAoIVY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUo
KSwgdHJ1ZSkpCisgICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAgICBpZiAo
IVY4UHJveHk6OmNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgdHJ1ZSkpCiAgICAgICAgIHJl
dHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgU3RyaW5nIHJlc3VsdCA9IGltcC0+aHJlZigpOwog
ICAgIHJldHVybiB2OFN0cmluZyhyZXN1bHQpOwpAQCAtMzQ1LDE2ICszNDUsMTYgQEAKIHsKICAg
ICBBU1NFUlQoVjhDbGFzc0luZGV4OjpGcm9tSW50KGRhdGEtPkludDMyVmFsdWUoKSkgPT0gVjhD
bGFzc0luZGV4OjpMT0NBVElPTik7CiAgICAgLy8gT25seSBhbGxvdyBzYW1lIG9yaWdpbiBhY2Nl
c3MKLSAgICBMb2NhdGlvbiogaW1wID0gIFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExvY2F0aW9u
PihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob3N0KTsKLSAgICByZXR1cm4gVjhQcm94eTo6Q2Fu
QWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCBmYWxzZSk7CisgICAgTG9jYXRpb24qIGltcCA9ICBW
OFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9D
QVRJT04sIGhvc3QpOworICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZShpbXAtPmZy
YW1lKCksIGZhbHNlKTsKIH0KIAogTkFNRURfQUNDRVNTX0NIRUNLKExvY2F0aW9uKQogewogICAg
IEFTU0VSVChWOENsYXNzSW5kZXg6OkZyb21JbnQoZGF0YS0+SW50MzJWYWx1ZSgpKSA9PSBWOENs
YXNzSW5kZXg6OkxPQ0FUSU9OKTsKICAgICAvLyBPbmx5IGFsbG93IHNhbWUgb3JpZ2luIGFjY2Vz
cwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4o
VjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9zdCk7Ci0gICAgcmV0dXJuIFY4UHJveHk6OkNhbkFj
Y2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgZmFsc2UpOworICAgIExvY2F0aW9uKiBpbXAgPSBWOFBy
b3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJ
T04sIGhvc3QpOworICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1l
KCksIGZhbHNlKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tQmluZGluZy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21CaW5kaW5nLmNwcAkocmV2aXNpb24gNDUw
OTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbUJpbmRpbmcuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC01MSw3ICs1MSw3IEBACiB7CiAgICAgaWYgKHByb3RvY29sSXMocGFy
c2VVUkwodmFsdWUpLCAiamF2YXNjcmlwdCIpKSB7CiAgICAgICAgIE5vZGUqIGNvbnRlbnREb2Mg
PSBmcmFtZS0+Y29udGVudERvY3VtZW50KCk7Ci0gICAgICAgIGlmIChjb250ZW50RG9jICYmICFW
OFByb3h5OjpDaGVja05vZGVTZWN1cml0eShjb250ZW50RG9jKSkKKyAgICAgICAgaWYgKGNvbnRl
bnREb2MgJiYgIVY4UHJveHk6OmNoZWNrTm9kZVNlY3VyaXR5KGNvbnRlbnREb2MpKQogICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKQEAgLTgyLDggKzgy
LDggQEAKICAgICAgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uOwogCiAgICAgLy8gR2VuZXJhdGUg
YSB3cmFwcGVyLgotICAgIERvY3VtZW50KiBkb2N1bWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJU
b05hdGl2ZTxEb2N1bWVudD4oaW5mby5Ib2xkZXIoKSk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6VmFs
dWU+IHdyYXBwZXIgPSBWOFByb3h5OjpET01JbXBsZW1lbnRhdGlvblRvVjhPYmplY3QoZG9jdW1l
bnQtPmltcGxlbWVudGF0aW9uKCkpOworICAgIERvY3VtZW50KiBkb2N1bWVudCA9IFY4UHJveHk6
OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8RG9jdW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAg
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3cmFwcGVyID0gVjhQcm94eTo6Y29udmVydERPTUltcGxl
bWVudGF0aW9uVG9WOE9iamVjdChkb2N1bWVudC0+aW1wbGVtZW50YXRpb24oKSk7CiAKICAgICAv
LyBTdG9yZSB0aGUgd3JhcHBlciBpbiB0aGUgaW50ZXJuYWwgZmllbGQuCiAgICAgaW5mby5Ib2xk
ZXIoKS0+U2V0SW50ZXJuYWxGaWVsZChrRG9jdW1lbnRJbXBsZW1lbnRhdGlvbkluZGV4LCB3cmFw
cGVyKTsKQEAgLTk2LDE2ICs5NiwxNiBAQAogewogICAgIEFTU0VSVChWOENsYXNzSW5kZXg6OkZy
b21JbnQoZGF0YS0+SW50MzJWYWx1ZSgpKSA9PSBWOENsYXNzSW5kZXg6OkhJU1RPUlkpOwogICAg
IC8vIE9ubHkgYWxsb3cgc2FtZSBvcmlnaW4gYWNjZXNzLgotICAgIEhpc3RvcnkqIGhpc3Rvcnkg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIaXN0b3J5PihWOENsYXNzSW5kZXg6OkhJU1RPUlks
IGhvc3QpOwotICAgIHJldHVybiBWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShoaXN0b3J5LT5mcmFt
ZSgpLCBmYWxzZSk7CisgICAgSGlzdG9yeSogaGlzdG9yeSA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxIaXN0b3J5PihWOENsYXNzSW5kZXg6OkhJU1RPUlksIGhvc3QpOworICAgIHJl
dHVybiBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZShoaXN0b3J5LT5mcmFtZSgpLCBmYWxzZSk7CiB9
CiAKIE5BTUVEX0FDQ0VTU19DSEVDSyhIaXN0b3J5KQogewogICAgIEFTU0VSVChWOENsYXNzSW5k
ZXg6OkZyb21JbnQoZGF0YS0+SW50MzJWYWx1ZSgpKSA9PSBWOENsYXNzSW5kZXg6OkhJU1RPUlkp
OwogICAgIC8vIE9ubHkgYWxsb3cgc2FtZSBvcmlnaW4gYWNjZXNzLgotICAgIEhpc3RvcnkqIGhp
c3RvcnkgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIaXN0b3J5PihWOENsYXNzSW5kZXg6OkhJ
U1RPUlksIGhvc3QpOwotICAgIHJldHVybiBWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShoaXN0b3J5
LT5mcmFtZSgpLCBmYWxzZSk7CisgICAgSGlzdG9yeSogaGlzdG9yeSA9IFY4UHJveHk6OmNvbnZl
cnRUb05hdGl2ZU9iamVjdDxIaXN0b3J5PihWOENsYXNzSW5kZXg6OkhJU1RPUlksIGhvc3QpOwor
ICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZShoaXN0b3J5LT5mcmFtZSgpLCBmYWxz
ZSk7CiB9CiAKICN1bmRlZiBJTkRFWEVEX0FDQ0VTU19DSEVDSwpAQCAtMTE4LDIxICsxMTgsMjEg
QEAKICAgICBGcmFtZSogdGFyZ2V0ID0gMDsKICAgICBzd2l0Y2ggKFY4Q2xhc3NJbmRleDo6RnJv
bUludChkYXRhLT5JbnQzMlZhbHVlKCkpKSB7CiAgICAgY2FzZSBWOENsYXNzSW5kZXg6OkRPTVdJ
TkRPVzogewotICAgICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd2luZG93ID0gVjhQcm94eTo6
TG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaG9zdCk7CisgICAgICAg
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3aW5kb3cgPSBWOFByb3h5Ojpsb29rdXBET01XcmFwcGVy
KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob3N0KTsKICAgICAgICAgaWYgKHdpbmRvdy5Jc0Vt
cHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogCi0gICAgICAgIERPTVdpbmRvdyog
dGFyZ2V0V2luZG93ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVywgd2luZG93KTsKKyAgICAgICAgRE9NV2luZG93KiB0YXJnZXRXaW5k
b3cgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5k
ZXg6OkRPTVdJTkRPVywgd2luZG93KTsKICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0V2luZG93LT5m
cmFtZSgpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBWOENsYXNzSW5kZXg6OkxP
Q0FUSU9OOiB7Ci0gICAgICAgIEhpc3RvcnkqIGhpc3RvcnkgPSBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxIaXN0b3J5PihWOENsYXNzSW5kZXg6OkhJU1RPUlksIGhvc3QpOworICAgICAgICBIaXN0
b3J5KiBoaXN0b3J5ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PEhpc3Rvcnk+KFY4
Q2xhc3NJbmRleDo6SElTVE9SWSwgaG9zdCk7CiAgICAgICAgIHRhcmdldCA9IGhpc3RvcnktPmZy
YW1lKCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SElT
VE9SWTogewotICAgICAgICBMb2NhdGlvbiogbG9jYXRpb24gPSBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9zdCk7CisgICAgICAgIExv
Y2F0aW9uKiBsb2NhdGlvbiA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxMb2NhdGlv
bj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9zdCk7CiAgICAgICAgIHRhcmdldCA9IGxvY2F0
aW9uLT5mcmFtZSgpOwogICAgICAgICBicmVhazsKICAgICB9CkluZGV4OiBXZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOEF0dHJDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4QXR0ckN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhBdHRyQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNDIsNyArNDIsNyBAQAogCiBBQ0NFU1NPUl9TRVRURVIoQXR0clZhbHVlKQogewotICAgIEF0
dHIqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8QXR0cj4oaW5mby5Ib2xkZXIoKSk7
CisgICAgQXR0ciogaW1wID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8QXR0cj4o
aW5mby5Ib2xkZXIoKSk7CiAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IHRvV2ViQ29yZVN0cmluZ1dp
dGhOdWxsQ2hlY2sodmFsdWUpOwogICAgIEVsZW1lbnQqIG93bmVyRWxlbWVudCA9IGltcC0+b3du
ZXJFbGVtZW50KCk7CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTFNl
bGVjdEVsZW1lbnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4SFRNTFNlbGVjdEVsZW1lbnRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysr
IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTFNlbGVjdEVsZW1lbnRDdXN0b20uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC00NCwxNCArNDQsMTQgQEAKIENBTExCQUNLX0ZVTkNfREVDTChI
VE1MU2VsZWN0RWxlbWVudFJlbW92ZSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MU2VsZWN0
RWxlbWVudC5yZW1vdmUiKTsKLSAgICBIVE1MU2VsZWN0RWxlbWVudCogaW1wID0gVjhQcm94eTo6
RE9NV3JhcHBlclRvTm9kZTxIVE1MU2VsZWN0RWxlbWVudD4oYXJncy5Ib2xkZXIoKSk7CisgICAg
SFRNTFNlbGVjdEVsZW1lbnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2Rl
PEhUTUxTZWxlY3RFbGVtZW50PihhcmdzLkhvbGRlcigpKTsKICAgICByZXR1cm4gcmVtb3ZlRWxl
bWVudChpbXAsIGFyZ3MpOwogfQogCiB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmVtb3ZlRWxlbWVu
dChIVE1MU2VsZWN0RWxlbWVudCogaW1wLCBjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKSAKIHsK
ICAgICBpZiAoVjhIVE1MT3B0aW9uRWxlbWVudDo6SGFzSW5zdGFuY2UoYXJnc1swXSkpIHsKLSAg
ICAgICAgSFRNTE9wdGlvbkVsZW1lbnQqIGVsZW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPEhUTUxPcHRpb25FbGVtZW50PihhcmdzWzBdKTsKKyAgICAgICAgSFRNTE9wdGlvbkVsZW1l
bnQqIGVsZW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MT3B0aW9u
RWxlbWVudD4oYXJnc1swXSk7CiAgICAgICAgIGltcC0+cmVtb3ZlKGVsZW1lbnQtPmluZGV4KCkp
OwogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgIH0KSW5kZXg6IFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MSHR0cFJlcXVlc3RVcGxvYWRDdXN0b20uY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MSHR0cFJlcXVlc3RVcGxv
YWRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4WE1MSHR0cFJlcXVlc3RVcGxvYWRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00
Niw3ICs0Niw3IEBACiBBQ0NFU1NPUl9HRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmFib3J0
KQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0VXBsb2FkLm9uYWJvcnQuX2dl
dCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6
OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVz
dFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVP
YmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RV
UExPQUQsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25h
Ym9ydCgpKSB7CiAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0
aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25h
Ym9ydCgpKTsKICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4TGlzdGVuZXIgPSBsaXN0
ZW5lci0+Z2V0TGlzdGVuZXJPYmplY3QoKTsKQEAgLTU4LDcgKzU4LDcgQEAKIEFDQ0VTU09SX1NF
VFRFUihYTUxIdHRwUmVxdWVzdFVwbG9hZE9uYWJvcnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00u
WE1MSHR0cFJlcXVlc3RVcGxvYWQub25hYm9ydC5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3RV
cGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1M
SHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGlu
Zm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVw
bG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9h
ZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7CiAg
ICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAoeG1sSHR0cFJlcXVlc3RVcGxv
YWQtPm9uYWJvcnQoKSkgewogICAgICAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0
ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0
VXBsb2FkLT5vbmFib3J0KCkpOwpAQCAtNzQsNyArNzQsNyBAQAogICAgICAgICBpZiAoIXByb3h5
KQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBs
aXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBm
YWxzZSk7CisgICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5m
aW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBmYWxzZSk7CiAgICAgICAgIGlm
IChsaXN0ZW5lcikgewogICAgICAgICAgICAgeG1sSHR0cFJlcXVlc3RVcGxvYWQtPnNldE9uYWJv
cnQobGlzdGVuZXIpOwogICAgICAgICAgICAgY3JlYXRlSGlkZGVuRGVwZW5kZW5jeShpbmZvLkhv
bGRlcigpLCB2YWx1ZSwgVjhDdXN0b206OmtYTUxIdHRwUmVxdWVzdENhY2hlSW5kZXgpOwpAQCAt
ODUsNyArODUsNyBAQAogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0VXBsb2FkT25lcnJv
cikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdFVwbG9hZC5vbmVycm9yLl9n
ZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBW
OFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4
OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJlcXVl
c3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNU
VVBMT0FELCBpbmZvLkhvbGRlcigpKTsKICAgICBpZiAoeG1sSHR0cFJlcXVlc3RVcGxvYWQtPm9u
ZXJyb3IoKSkgewogICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3Rh
dGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3RVcGxvYWQtPm9u
ZXJyb3IoKSk7CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB2OExpc3RlbmVyID0gbGlz
dGVuZXItPmdldExpc3RlbmVyT2JqZWN0KCk7CkBAIC05Nyw3ICs5Nyw3IEBACiBBQ0NFU1NPUl9T
RVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmVycm9yKQogewogICAgIElOQ19TVEFUUygiRE9N
LlhNTEh0dHBSZXF1ZXN0VXBsb2FkLm9uZXJyb3IuX3NldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0
VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhN
TEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBp
bmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RV
cGxvYWQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxv
YWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9sZGVyKCkpOwog
ICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsKICAgICAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0VXBs
b2FkLT5vbmVycm9yKCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlz
dGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVz
dFVwbG9hZC0+b25lcnJvcigpKTsKQEAgLTExMyw3ICsxMTMsNyBAQAogICAgICAgICBpZiAoIXBy
b3h5KQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVy
PiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVl
LCBmYWxzZSk7CisgICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5
LT5maW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBmYWxzZSk7CiAgICAgICAg
IGlmIChsaXN0ZW5lcikgewogICAgICAgICAgICAgeG1sSHR0cFJlcXVlc3RVcGxvYWQtPnNldE9u
ZXJyb3IobGlzdGVuZXIpOwogICAgICAgICAgICAgY3JlYXRlSGlkZGVuRGVwZW5kZW5jeShpbmZv
LkhvbGRlcigpLCB2YWx1ZSwgVjhDdXN0b206OmtYTUxIdHRwUmVxdWVzdENhY2hlSW5kZXgpOwpA
QCAtMTI0LDcgKzEyNCw3IEBACiBBQ0NFU1NPUl9HRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRP
bmxvYWQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25sb2Fk
Ll9nZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0lu
ZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJl
cXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFV
RVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKICAgICBpZiAoeG1sSHR0cFJlcXVlc3RVcGxvYWQt
Pm9ubG9hZCgpKSB7CiAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBz
dGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdFVwbG9hZC0+
b25sb2FkKCkpOwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxp
c3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMTM2LDcgKzEzNiw3IEBACiBBQ0NFU1NP
Ul9TRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmxvYWQpCiB7CiAgICAgSU5DX1NUQVRTKCJE
T00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25sb2FkLl9zZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVz
dFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxY
TUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwg
aW5mby5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0
VXBsb2FkID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBs
b2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsK
ICAgICBpZiAodmFsdWUtPklzTnVsbCgpKSB7CiAgICAgICAgIGlmICh4bWxIdHRwUmVxdWVzdFVw
bG9hZC0+b25sb2FkKCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlz
dGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVz
dFVwbG9hZC0+b25sb2FkKCkpOwpAQCAtMTUyLDcgKzE1Miw3IEBACiAgICAgICAgIGlmICghcHJv
eHkpCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+
IGxpc3RlbmVyID0gcHJveHktPkZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUs
IGZhbHNlKTsKKyAgICAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHkt
PmZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKTsKICAgICAgICAg
aWYgKGxpc3RlbmVyKSB7CiAgICAgICAgICAgICB4bWxIdHRwUmVxdWVzdFVwbG9hZC0+c2V0T25s
b2FkKGxpc3RlbmVyKTsKICAgICAgICAgICAgIGNyZWF0ZUhpZGRlbkRlcGVuZGVuY3koaW5mby5I
b2xkZXIoKSwgdmFsdWUsIFY4Q3VzdG9tOjprWE1MSHR0cFJlcXVlc3RDYWNoZUluZGV4KTsKQEAg
LTE2Myw3ICsxNjMsNyBAQAogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0VXBsb2FkT25s
b2Fkc3RhcnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25s
b2Fkc3RhcnQuX2dldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVz
dFVwbG9hZCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihW
OENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKKyAgICBY
TUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5Ojpjb252
ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1M
SFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh4bWxIdHRwUmVxdWVz
dFVwbG9hZC0+b25sb2Fkc3RhcnQoKSkgewogICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIq
IGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJl
cXVlc3RVcGxvYWQtPm9ubG9hZHN0YXJ0KCkpOwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVj
dD4gdjhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMTc1LDcg
KzE3NSw3IEBACiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmxvYWRzdGFy
dCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdFVwbG9hZC5vbmxvYWRzdGFy
dC5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2Fk
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJ
bmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBS
ZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVR
VUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewog
ICAgICAgICBpZiAoeG1sSHR0cFJlcXVlc3RVcGxvYWQtPm9ubG9hZHN0YXJ0KCkpIHsKICAgICAg
ICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9i
amVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25sb2Fkc3RhcnQoKSk7
CkBAIC0xOTEsNyArMTkxLDcgQEAKICAgICAgICAgaWYgKCFwcm94eSkKICAgICAgICAgICAgIHJl
dHVybjsKIAotICAgICAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+
RmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2UpOworICAgICAgICBS
ZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+ZmluZE9yQ3JlYXRlT2JqZWN0
RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2UpOwogICAgICAgICBpZiAobGlzdGVuZXIpIHsKICAg
ICAgICAgICAgIHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5zZXRPbmxvYWRzdGFydChsaXN0ZW5lcik7
CiAgICAgICAgICAgICBjcmVhdGVIaWRkZW5EZXBlbmRlbmN5KGluZm8uSG9sZGVyKCksIHZhbHVl
LCBWOEN1c3RvbTo6a1hNTEh0dHBSZXF1ZXN0Q2FjaGVJbmRleCk7CkBAIC0yMDIsNyArMjAyLDcg
QEAKIEFDQ0VTU09SX0dFVFRFUihYTUxIdHRwUmVxdWVzdFVwbG9hZE9ucHJvZ3Jlc3MpCiB7CiAg
ICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25wcm9ncmVzcy5fZ2V0Iik7
Ci0gICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94
eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1M
SFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0VXBs
b2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVj
dDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9B
RCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5vbnByb2dy
ZXNzKCkpIHsKICAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRp
Y19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5vbnBy
b2dyZXNzKCkpOwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxp
c3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMjE0LDcgKzIxNCw3IEBACiBBQ0NFU1NP
Ul9TRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbnByb2dyZXNzKQogewogICAgIElOQ19TVEFU
UygiRE9NLlhNTEh0dHBSZXF1ZXN0VXBsb2FkLm9ucHJvZ3Jlc3MuX3NldCIpOwotICAgIFhNTEh0
dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OlRvTmF0aXZl
T2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNU
VVBMT0FELCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0
cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJl
cXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9s
ZGVyKCkpOwogICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsKICAgICAgICAgaWYgKHhtbEh0dHBS
ZXF1ZXN0VXBsb2FkLT5vbnByb2dyZXNzKCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRM
aXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4
bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25wcm9ncmVzcygpKTsKQEAgLTIzMCw3ICsyMzAsNyBAQAog
ICAgICAgICBpZiAoIXByb3h5KQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIFJlZlB0
cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVu
dExpc3RlbmVyKHZhbHVlLCBmYWxzZSk7CisgICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBs
aXN0ZW5lciA9IHByb3h5LT5maW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBm
YWxzZSk7CiAgICAgICAgIGlmIChsaXN0ZW5lcikgewogICAgICAgICAgICAgeG1sSHR0cFJlcXVl
c3RVcGxvYWQtPnNldE9ucHJvZ3Jlc3MobGlzdGVuZXIpOwogICAgICAgICAgICAgY3JlYXRlSGlk
ZGVuRGVwZW5kZW5jeShpbmZvLkhvbGRlcigpLCB2YWx1ZSwgVjhDdXN0b206OmtYTUxIdHRwUmVx
dWVzdENhY2hlSW5kZXgpOwpAQCAtMjQxLDE0ICsyNDEsMTQgQEAKIENBTExCQUNLX0ZVTkNfREVD
TChYTUxIdHRwUmVxdWVzdFVwbG9hZEFkZEV2ZW50TGlzdGVuZXIpCiB7CiAgICAgSU5DX1NUQVRT
KCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigpIik7Ci0gICAgWE1M
SHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6VG9OYXRp
dmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVF
U1RVUExPQUQsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxI
dHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRw
UmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgYXJncy5I
b2xkZXIoKSk7CiAKICAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSB4bWxIdHRw
UmVxdWVzdFVwbG9hZC0+YXNzb2NpYXRlZFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgVjhQcm94eSog
cHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZSh4bWxIdHRwUmVxdWVzdC0+c2NyaXB0RXhlY3V0aW9u
Q29udGV4dCgpKTsKICAgICBpZiAoIXByb3h5KQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5l
ZCgpOwogCi0gICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPkZpbmRP
ckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxF
dmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5kT3JDcmVhdGVPYmplY3RFdmVudExp
c3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsKICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgU3Ry
aW5nIHR5cGUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgICAgIGJvb2wgdXNlQ2Fw
dHVyZSA9IGFyZ3NbMl0tPkJvb2xlYW5WYWx1ZSgpOwpAQCAtMjYyLDE0ICsyNjIsMTQgQEAKIENB
TExCQUNLX0ZVTkNfREVDTChYTUxIdHRwUmVxdWVzdFVwbG9hZFJlbW92ZUV2ZW50TGlzdGVuZXIp
CiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQucmVtb3ZlRXZlbnRM
aXN0ZW5lcigpIik7Ci0gICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBs
b2FkID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xh
c3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhNTEh0
dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRU
b05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQ
UkVRVUVTVFVQTE9BRCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBYTUxIdHRwUmVxdWVzdCogeG1s
SHR0cFJlcXVlc3QgPSB4bWxIdHRwUmVxdWVzdFVwbG9hZC0+YXNzb2NpYXRlZFhNTEh0dHBSZXF1
ZXN0KCk7CiAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZSh4bWxIdHRwUmVx
dWVzdC0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpKTsKICAgICBpZiAoIXByb3h5KQogICAgICAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOyAvLyBQcm9iYWJseSBsZWFrZWQuCiAKLSAgICBSZWZQ
dHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+RmluZE9iamVjdEV2ZW50TGlzdGVu
ZXIoYXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9
IHByb3h5LT5maW5kT2JqZWN0RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAKICAgICBp
ZiAobGlzdGVuZXIpIHsKICAgICAgICAgU3RyaW5nIHR5cGUgPSB0b1dlYkNvcmVTdHJpbmcoYXJn
c1swXSk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE5vZGVMaXN0Q3VzdG9t
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE5vZGVMaXN0
Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOE5vZGVMaXN0Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDIsNyArNDIsNyBAQAog
TkFNRURfUFJPUEVSVFlfR0VUVEVSKE5vZGVMaXN0KQogewogICAgIElOQ19TVEFUUygiRE9NLk5v
ZGVMaXN0Lk5hbWVkUHJvcGVydHlHZXR0ZXIiKTsKLSAgICBOb2RlTGlzdCogbGlzdCA9IFY4UHJv
eHk6OlRvTmF0aXZlT2JqZWN0PE5vZGVMaXN0PihWOENsYXNzSW5kZXg6Ok5PREVMSVNULCBpbmZv
LkhvbGRlcigpKTsKKyAgICBOb2RlTGlzdCogbGlzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2
ZU9iamVjdDxOb2RlTGlzdD4oVjhDbGFzc0luZGV4OjpOT0RFTElTVCwgaW5mby5Ib2xkZXIoKSk7
CiAgICAgU3RyaW5nIGtleSA9IHRvV2ViQ29yZVN0cmluZyhuYW1lKTsKIAogICAgIC8vIExlbmd0
aCBwcm9wZXJ0eSBjYW5ub3QgYmUgb3ZlcnJpZGRlbi4KQEAgLTUzLDcgKzUzLDcgQEAKICAgICBp
ZiAoIXJlc3VsdCkKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAK
LSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsKKyAgICBy
ZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAK
IH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4WFBhdGhFdmFsdWF0b3JDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhYUGF0aEV2YWx1YXRvckNvbnN0cnVjdG9yLmNwcAkocmV2aXNp
b24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFhQYXRoRXZhbHVhdG9y
Q29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICszOSw3IEBACiBDQUxMQkFD
S19GVU5DX0RFQ0woWFBhdGhFdmFsdWF0b3JDb25zdHJ1Y3RvcikKIHsKICAgICBJTkNfU1RBVFMo
IkRPTS5YUGF0aEV2YWx1YXRvci5Db25zdHJ1Y3RvciIpOwotICAgIHJldHVybiBWOFByb3h5OjpD
b25zdHJ1Y3RET01PYmplY3Q8VjhDbGFzc0luZGV4OjpYUEFUSEVWQUxVQVRPUiwgWFBhdGhFdmFs
dWF0b3I+KGFyZ3MpOworICAgIHJldHVybiBWOFByb3h5Ojpjb25zdHJ1Y3RET01PYmplY3Q8VjhD
bGFzc0luZGV4OjpYUEFUSEVWQUxVQVRPUiwgWFBhdGhFdmFsdWF0b3I+KGFyZ3MpOwogfQogCiB9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OEN1c3RvbUV2ZW50TGlzdGVuZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4Q3VzdG9tRXZlbnRMaXN0ZW5lci5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysg
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21FdmVudExpc3RlbmVyLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNDAsNyArNDAsNyBAQAogewogICAgIG1fbGlzdGVuZXIgPSB2ODo6UGVy
c2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGxpc3RlbmVyKTsKICNpZm5kZWYgTkRFQlVHCi0gICAg
VjhQcm94eTo6UmVnaXN0ZXJHbG9iYWxIYW5kbGUoRVZFTlRfTElTVEVORVIsIHRoaXMsIG1fbGlz
dGVuZXIpOworICAgIFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxlKEVWRU5UX0xJU1RFTkVS
LCB0aGlzLCBtX2xpc3RlbmVyKTsKICNlbmRpZgogfQogCkBAIC00OSw3ICs0OSw3IEBACiAgICAg
aWYgKG1fZnJhbWUpIHsKICAgICAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2
ZShtX2ZyYW1lKTsKICAgICAgICAgaWYgKHByb3h5KQotICAgICAgICAgICAgcHJveHktPlJlbW92
ZVY4RXZlbnRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIHByb3h5LT5yZW1vdmVWOEV2ZW50
TGlzdGVuZXIodGhpcyk7CiAgICAgfQogCiAgICAgZGlzcG9zZUxpc3RlbmVyT2JqZWN0KCk7CkBA
IC04Myw3ICs4Myw3IEBACiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHBhcmFtZXRlcnNbMV0g
PSB7IGpzRXZlbnQgfTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUo
bV9mcmFtZSk7Ci0gICAgcmV0dXJuIHByb3h5LT5DYWxsRnVuY3Rpb24oaGFuZGxlckZ1bmN0aW9u
LCByZWNlaXZlciwgMSwgcGFyYW1ldGVycyk7CisgICAgcmV0dXJuIHByb3h5LT5jYWxsRnVuY3Rp
b24oaGFuZGxlckZ1bmN0aW9uLCByZWNlaXZlciwgMSwgcGFyYW1ldGVycyk7CiB9CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVz
c2FnZVBvcnRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4TWVzc2FnZVBvcnRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZVBvcnRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC00MywxNCArNDMsMTQgQEAKIEFDQ0VTU09SX0dFVFRFUihNZXNzYWdlUG9ydE9ubWVzc2Fn
ZSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5NZXNzYWdlUG9ydC5vbm1lc3NhZ2UuX2dldCIpOwot
ICAgIE1lc3NhZ2VQb3J0KiBtZXNzYWdlUG9ydCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PE1l
c3NhZ2VQb3J0PihWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JULCBpbmZvLkhvbGRlcigpKTsKLSAg
ICByZXR1cm4gVjhQcm94eTo6RXZlbnRMaXN0ZW5lclRvVjhPYmplY3QobWVzc2FnZVBvcnQtPm9u
bWVzc2FnZSgpKTsKKyAgICBNZXNzYWdlUG9ydCogbWVzc2FnZVBvcnQgPSBWOFByb3h5Ojpjb252
ZXJ0VG9OYXRpdmVPYmplY3Q8TWVzc2FnZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQs
IGluZm8uSG9sZGVyKCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0RXZlbnRMaXN0ZW5l
clRvVjhPYmplY3QobWVzc2FnZVBvcnQtPm9ubWVzc2FnZSgpKTsKIH0KIAogQUNDRVNTT1JfU0VU
VEVSKE1lc3NhZ2VQb3J0T25tZXNzYWdlKQogewogICAgIElOQ19TVEFUUygiRE9NLk1lc3NhZ2VQ
b3J0Lm9ubWVzc2FnZS5fc2V0Iik7Ci0gICAgTWVzc2FnZVBvcnQqIG1lc3NhZ2VQb3J0ID0gVjhQ
cm94eTo6VG9OYXRpdmVPYmplY3Q8TWVzc2FnZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBP
UlQsIGluZm8uSG9sZGVyKCkpOworICAgIE1lc3NhZ2VQb3J0KiBtZXNzYWdlUG9ydCA9IFY4UHJv
eHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxNZXNzYWdlUG9ydD4oVjhDbGFzc0luZGV4OjpNRVNT
QUdFUE9SVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAg
ICAgICBpZiAobWVzc2FnZVBvcnQtPm9ubWVzc2FnZSgpKSB7CiAgICAgICAgICAgICBWOE9iamVj
dEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3Rl
bmVyKj4obWVzc2FnZVBvcnQtPm9ubWVzc2FnZSgpKTsKQEAgLTY1LDcgKzY1LDcgQEAKICAgICAg
ICAgaWYgKCFwcm94eSkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBSZWZQdHI8RXZl
bnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+RmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0
ZW5lcih2YWx1ZSwgZmFsc2UpOworICAgICAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVu
ZXIgPSBwcm94eS0+ZmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2Up
OwogICAgICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgICAgIG1lc3NhZ2VQb3J0LT5zZXRP
bm1lc3NhZ2UobGlzdGVuZXIpOwogICAgICAgICAgICAgY3JlYXRlSGlkZGVuRGVwZW5kZW5jeShp
bmZvLkhvbGRlcigpLCB2YWx1ZSwgVjhDdXN0b206OmtNZXNzYWdlUG9ydFJlcXVlc3RDYWNoZUlu
ZGV4KTsKQEAgLTc2LDEzICs3NiwxMyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKE1lc3NhZ2VQb3J0
QWRkRXZlbnRMaXN0ZW5lcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5NZXNzYWdlUG9ydC5BZGRF
dmVudExpc3RlbmVyKCkiKTsKLSAgICBNZXNzYWdlUG9ydCogbWVzc2FnZVBvcnQgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxNZXNzYWdlUG9ydD4oVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwg
YXJncy5Ib2xkZXIoKSk7CisgICAgTWVzc2FnZVBvcnQqIG1lc3NhZ2VQb3J0ID0gVjhQcm94eTo6
Y29udmVydFRvTmF0aXZlT2JqZWN0PE1lc3NhZ2VQb3J0PihWOENsYXNzSW5kZXg6Ok1FU1NBR0VQ
T1JULCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0
cmlldmUobWVzc2FnZVBvcnQtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSk7CiAgICAgaWYgKCFw
cm94eSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIFJlZlB0cjxFdmVu
dExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3Rl
bmVyKGFyZ3NbMV0sIGZhbHNlKTsKKyAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIg
PSBwcm94eS0+ZmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7
CiAgICAgaWYgKGxpc3RlbmVyKSB7CiAgICAgICAgIFN0cmluZyB0eXBlID0gdG9XZWJDb3JlU3Ry
aW5nKGFyZ3NbMF0pOwogICAgICAgICBib29sIHVzZUNhcHR1cmUgPSBhcmdzWzJdLT5Cb29sZWFu
VmFsdWUoKTsKQEAgLTk2LDEzICs5NiwxMyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKE1lc3NhZ2VQ
b3J0UmVtb3ZlRXZlbnRMaXN0ZW5lcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5NZXNzYWdlUG9y
dC5SZW1vdmVFdmVudExpc3RlbmVyKCkiKTsKLSAgICBNZXNzYWdlUG9ydCogbWVzc2FnZVBvcnQg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxNZXNzYWdlUG9ydD4oVjhDbGFzc0luZGV4OjpNRVNT
QUdFUE9SVCwgYXJncy5Ib2xkZXIoKSk7CisgICAgTWVzc2FnZVBvcnQqIG1lc3NhZ2VQb3J0ID0g
VjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PE1lc3NhZ2VQb3J0PihWOENsYXNzSW5kZXg6
Ok1FU1NBR0VQT1JULCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQ
cm94eTo6cmV0cmlldmUobWVzc2FnZVBvcnQtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSk7CiAg
ICAgaWYgKCFwcm94eSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsgLy8gcHJvYmFi
bHkgbGVha2VkCiAKLSAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+
RmluZE9iamVjdEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVu
dExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5kT2JqZWN0RXZlbnRMaXN0ZW5lcihhcmdz
WzFdLCBmYWxzZSk7CiAKICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgU3RyaW5nIHR5cGUg
PSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOFhTTFRQcm9jZXNzb3JDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4WFNMVFByb2Nlc3NvckN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1
KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYU0xUUHJvY2Vzc29yQ3VzdG9tLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNDgsNyArNDgsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFhT
TFRQcm9jZXNzb3JDb25zdHJ1Y3RvcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YU0xUUHJvY2Vz
c29yLkNvbnN0cnVjdG9yIik7Ci0gICAgcmV0dXJuIFY4UHJveHk6OkNvbnN0cnVjdERPTU9iamVj
dDxWOENsYXNzSW5kZXg6OlhTTFRQUk9DRVNTT1IsIFhTTFRQcm9jZXNzb3I+KGFyZ3MpOworICAg
IHJldHVybiBWOFByb3h5Ojpjb25zdHJ1Y3RET01PYmplY3Q8VjhDbGFzc0luZGV4OjpYU0xUUFJP
Q0VTU09SLCBYU0xUUHJvY2Vzc29yPihhcmdzKTsKIH0KIAogCkBAIC01OCw5ICs1OCw5IEBACiAg
ICAgaWYgKCFWOE5vZGU6Okhhc0luc3RhbmNlKGFyZ3NbMF0pKQogICAgICAgICByZXR1cm4gdjg6
OlVuZGVmaW5lZCgpOwogCi0gICAgWFNMVFByb2Nlc3NvciogaW1wID0gVjhQcm94eTo6VG9OYXRp
dmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhDbGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SLCBhcmdz
LkhvbGRlcigpKTsKKyAgICBYU0xUUHJvY2Vzc29yKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhDbGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SLCBh
cmdzLkhvbGRlcigpKTsKIAotICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPE5vZGU+KGFyZ3NbMF0pOworICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5Ojpjb252ZXJ0RE9N
V3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKTsKICAgICBpbXAtPmltcG9ydFN0eWxlc2hlZXQo
bm9kZSk7CiAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIH0KQEAgLTcyLDEyICs3MiwxMiBA
QAogICAgIGlmICghVjhOb2RlOjpIYXNJbnN0YW5jZShhcmdzWzBdKSB8fCAhVjhEb2N1bWVudDo6
SGFzSW5zdGFuY2UoYXJnc1sxXSkpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAK
LSAgICBYU0xUUHJvY2Vzc29yKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYU0xUUHJv
Y2Vzc29yPihWOENsYXNzSW5kZXg6OlhTTFRQUk9DRVNTT1IsIGFyZ3MuSG9sZGVyKCkpOworICAg
IFhTTFRQcm9jZXNzb3IqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYU0xU
UHJvY2Vzc29yPihWOENsYXNzSW5kZXg6OlhTTFRQUk9DRVNTT1IsIGFyZ3MuSG9sZGVyKCkpOwog
Ci0gICAgTm9kZSogc291cmNlID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdz
WzBdKTsKLSAgICBEb2N1bWVudCogb3duZXIgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPERv
Y3VtZW50PihhcmdzWzFdKTsKKyAgICBOb2RlKiBzb3VyY2UgPSBWOFByb3h5Ojpjb252ZXJ0RE9N
V3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKTsKKyAgICBEb2N1bWVudCogb3duZXIgPSBWOFBy
b3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxEb2N1bWVudD4oYXJnc1sxXSk7CiAgICAgUmVm
UHRyPERvY3VtZW50RnJhZ21lbnQ+IHJlc3VsdCA9IGltcC0+dHJhbnNmb3JtVG9GcmFnbWVudChz
b3VyY2UsIG93bmVyKTsKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0
LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3Vs
dC5nZXQoKSk7CiB9CiAKIApAQCAtODgsOSArODgsOSBAQAogICAgIGlmICghVjhOb2RlOjpIYXNJ
bnN0YW5jZShhcmdzWzBdKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAg
IFhTTFRQcm9jZXNzb3IqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhTTFRQcm9jZXNz
b3I+KFY4Q2xhc3NJbmRleDo6WFNMVFBST0NFU1NPUiwgYXJncy5Ib2xkZXIoKSk7CisgICAgWFNM
VFByb2Nlc3NvciogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhTTFRQcm9j
ZXNzb3I+KFY4Q2xhc3NJbmRleDo6WFNMVFBST0NFU1NPUiwgYXJncy5Ib2xkZXIoKSk7CiAKLSAg
ICBOb2RlKiBzb3VyY2UgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0p
OworICAgIE5vZGUqIHNvdXJjZSA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPE5v
ZGU+KGFyZ3NbMF0pOwogICAgIGlmICghc291cmNlKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVm
aW5lZCgpOwogCkBAIC05OCw3ICs5OCw3IEBACiAgICAgaWYgKCFyZXN1bHQpCiAgICAgICAgIHJl
dHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmpl
Y3QocmVzdWx0LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2Jq
ZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAKIApAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgaWYgKGlz
VW5kZWZpbmVkT3JOdWxsKGFyZ3NbMV0pIHx8IGlzVW5kZWZpbmVkT3JOdWxsKGFyZ3NbMl0pKQog
ICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgWFNMVFByb2Nlc3NvciogaW1w
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhDbGFzc0luZGV4OjpY
U0xUUFJPQ0VTU09SLCBhcmdzLkhvbGRlcigpKTsKKyAgICBYU0xUUHJvY2Vzc29yKiBpbXAgPSBW
OFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhDbGFzc0luZGV4
OjpYU0xUUFJPQ0VTU09SLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFN0cmluZyBuYW1lc3BhY2VV
UkkgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHRv
V2ViQ29yZVN0cmluZyhhcmdzWzFdKTsKQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgIGlmIChpc1Vu
ZGVmaW5lZE9yTnVsbChhcmdzWzFdKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsK
IAotICAgIFhTTFRQcm9jZXNzb3IqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhTTFRQ
cm9jZXNzb3I+KFY4Q2xhc3NJbmRleDo6WFNMVFBST0NFU1NPUiwgYXJncy5Ib2xkZXIoKSk7Cisg
ICAgWFNMVFByb2Nlc3NvciogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhT
TFRQcm9jZXNzb3I+KFY4Q2xhc3NJbmRleDo6WFNMVFBST0NFU1NPUiwgYXJncy5Ib2xkZXIoKSk7
CiAKICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwog
ICAgIFN0cmluZyBsb2NhbE5hbWUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1sxXSk7CkBAIC0xNDIs
NyArMTQyLDcgQEAKICAgICBpZiAoaXNVbmRlZmluZWRPck51bGwoYXJnc1sxXSkpCiAgICAgICAg
IHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICBYU0xUUHJvY2Vzc29yKiBpbXAgPSBWOFBy
b3h5OjpUb05hdGl2ZU9iamVjdDxYU0xUUHJvY2Vzc29yPihWOENsYXNzSW5kZXg6OlhTTFRQUk9D
RVNTT1IsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhTTFRQcm9jZXNzb3IqIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYU0xUUHJvY2Vzc29yPihWOENsYXNzSW5kZXg6OlhTTFRQ
Uk9DRVNTT1IsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHRv
V2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKICAgICBTdHJpbmcgbG9jYWxOYW1lID0gdG9XZWJDb3Jl
U3RyaW5nKGFyZ3NbMV0pOwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1M
UGx1Z0luRWxlbWVudEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhIVE1MUGx1Z0luRWxlbWVudEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQor
KysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MUGx1Z0luRWxlbWVudEN1c3RvbS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDcgKzQ1LDcgQEAKIE5BTUVEX1BST1BFUlRZX0dFVFRF
UihIVE1MUGx1Z0luRWxlbWVudCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MUGx1Z0luRWxl
bWVudC5OYW1lZFByb3BlcnR5R2V0dGVyIik7Ci0gICAgSFRNTFBsdWdJbkVsZW1lbnQqIGltcCA9
IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTFBsdWdJbkVsZW1lbnQ+KGluZm8uSG9sZGVy
KCkpOworICAgIEhUTUxQbHVnSW5FbGVtZW50KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3Jh
cHBlclRvTm9kZTxIVE1MUGx1Z0luRWxlbWVudD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgU2NyaXB0
SW5zdGFuY2Ugc2NyaXB0SW5zdGFuY2UgPSBpbXAtPmdldEluc3RhbmNlKCk7CiAgICAgaWYgKCFz
Y3JpcHRJbnN0YW5jZSkKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7
CkBAIC02MCw3ICs2MCw3IEBACiBOQU1FRF9QUk9QRVJUWV9TRVRURVIoSFRNTFBsdWdJbkVsZW1l
bnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTFBsdWdJbkVsZW1lbnQuTmFtZWRQcm9wZXJ0
eVNldHRlciIpOwotICAgIEhUTUxQbHVnSW5FbGVtZW50KiBpbXAgPSBWOFByb3h5OjpET01XcmFw
cGVyVG9Ob2RlPEhUTUxQbHVnSW5FbGVtZW50PihpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MUGx1
Z0luRWxlbWVudCogaW1wID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTFBs
dWdJbkVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIFNjcmlwdEluc3RhbmNlIHNjcmlwdElu
c3RhbmNlID0gaW1wLT5nZXRJbnN0YW5jZSgpOwogICAgIGlmICghc2NyaXB0SW5zdGFuY2UpCiAg
ICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwpAQCAtODEsNyArODEsNyBA
QAogSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoSFRNTFBsdWdJbkVsZW1lbnQpCiB7CiAgICAgSU5D
X1NUQVRTKCJET00uSFRNTFBsdWdJbkVsZW1lbnQuSW5kZXhlZFByb3BlcnR5R2V0dGVyIik7Ci0g
ICAgSFRNTFBsdWdJbkVsZW1lbnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRN
TFBsdWdJbkVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxQbHVnSW5FbGVtZW50KiBp
bXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MUGx1Z0luRWxlbWVudD4o
aW5mby5Ib2xkZXIoKSk7CiAgICAgU2NyaXB0SW5zdGFuY2Ugc2NyaXB0SW5zdGFuY2UgPSBpbXAt
PmdldEluc3RhbmNlKCk7CiAgICAgaWYgKCFzY3JpcHRJbnN0YW5jZSkKICAgICAgICAgcmV0dXJu
IG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CkBAIC05Niw3ICs5Niw3IEBACiBJTkRFWEVEX1BS
T1BFUlRZX1NFVFRFUihIVE1MUGx1Z0luRWxlbWVudCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5I
VE1MUGx1Z0luRWxlbWVudC5JbmRleGVkUHJvcGVydHlTZXR0ZXIiKTsKLSAgICBIVE1MUGx1Z0lu
RWxlbWVudCogaW1wID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MUGx1Z0luRWxlbWVu
dD4oaW5mby5Ib2xkZXIoKSk7CisgICAgSFRNTFBsdWdJbkVsZW1lbnQqIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxQbHVnSW5FbGVtZW50PihpbmZvLkhvbGRlcigp
KTsKICAgICBTY3JpcHRJbnN0YW5jZSBzY3JpcHRJbnN0YW5jZSA9IGltcC0+Z2V0SW5zdGFuY2Uo
KTsKICAgICBpZiAoIXNjcmlwdEluc3RhbmNlKQogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5
SW50ZXJjZXB0b3IoKTsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1ZHRWxl
bWVudEluc3RhbmNlQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOFNWR0VsZW1lbnRJbnN0YW5jZUN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQor
KysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTVkdFbGVtZW50SW5zdGFuY2VDdXN0b20u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NywxMyArNDcsMTMgQEAKIENBTExCQUNLX0ZVTkNfREVD
TChTVkdFbGVtZW50SW5zdGFuY2VBZGRFdmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFUUygi
RE9NLlNWR0VsZW1lbnRJbnN0YW5jZS5BZGRFdmVudExpc3RlbmVyKCkiKTsKLSAgICBTVkdFbGVt
ZW50SW5zdGFuY2UqIGluc3RhbmNlID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0aXZlPFNWR0Vs
ZW1lbnRJbnN0YW5jZT4oYXJncy5Ib2xkZXIoKSk7CisgICAgU1ZHRWxlbWVudEluc3RhbmNlKiBp
bnN0YW5jZSA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8U1ZHRWxlbWVudElu
c3RhbmNlPihhcmdzLkhvbGRlcigpKTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6
cmV0cmlldmUoaW5zdGFuY2UtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSk7CiAgICAgaWYgKCFw
cm94eSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIFJlZlB0cjxFdmVu
dExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIo
YXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHBy
b3h5LT5maW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOwogICAgIGlm
IChsaXN0ZW5lcikgewogICAgICAgICBTdHJpbmcgdHlwZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdz
WzBdKTsKICAgICAgICAgYm9vbCB1c2VDYXB0dXJlID0gYXJnc1syXS0+Qm9vbGVhblZhbHVlKCk7
CkBAIC02NiwxMyArNjYsMTMgQEAKIENBTExCQUNLX0ZVTkNfREVDTChTVkdFbGVtZW50SW5zdGFu
Y2VSZW1vdmVFdmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFUUygiRE9NLlNWR0VsZW1lbnRJ
bnN0YW5jZS5SZW1vdmVFdmVudExpc3RlbmVyKCkiKTsKLSAgICBTVkdFbGVtZW50SW5zdGFuY2Uq
IGluc3RhbmNlID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0aXZlPFNWR0VsZW1lbnRJbnN0YW5j
ZT4oYXJncy5Ib2xkZXIoKSk7CisgICAgU1ZHRWxlbWVudEluc3RhbmNlKiBpbnN0YW5jZSA9IFY4
UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8U1ZHRWxlbWVudEluc3RhbmNlPihhcmdz
LkhvbGRlcigpKTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUoaW5z
dGFuY2UtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSk7CiAgICAgaWYgKCFwcm94eSkKICAgICAg
ICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBs
aXN0ZW5lciA9IHByb3h5LT5GaW5kVjhFdmVudExpc3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsKKyAg
ICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+ZmluZFY4RXZlbnRMaXN0
ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAgICAgaWYgKGxpc3RlbmVyKSB7CiAgICAgICAgIFN0cmlu
ZyB0eXBlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgICAgICBib29sIHVzZUNhcHR1
cmUgPSBhcmdzWzJdLT5Cb29sZWFuVmFsdWUoKTsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4V2ViS2l0Q1NTTWF0cml4Q29uc3RydWN0b3IuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V2ViS2l0Q1NTTWF0cml4Q29uc3RydWN0b3IuY3Bw
CShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V2ViS2l0
Q1NTTWF0cml4Q29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw3ICs0Nyw3IEBA
CiBDQUxMQkFDS19GVU5DX0RFQ0woV2ViS2l0Q1NTTWF0cml4Q29uc3RydWN0b3IpCiB7CiAgICAg
SU5DX1NUQVRTKCJET00uV2ViS2l0Q1NTTWF0cml4LkNvbnN0cnVjdG9yIik7Ci0gICAgLy8gRklY
TUU6IFRoZSBsb2dpYyBoZXJlIGlzIGFsbW9zdCBleGFjdCBkdXBsaWNhdGUgb2YgVjg6OkNvbnN0
cnVjdERPTU9iamVjdC4KKyAgICAvLyBGSVhNRTogVGhlIGxvZ2ljIGhlcmUgaXMgYWxtb3N0IGV4
YWN0IGR1cGxpY2F0ZSBvZiBWODo6Y29uc3RydWN0RE9NT2JqZWN0LgogICAgIC8vIENvbnNpZGVy
IHJlZmFjdG9yaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGlvbi4KICAgICBTdHJpbmcgY3NzVmFsdWU7
CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPj0gMSkKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAg
dGhyb3dFcnJvcihlYyk7CiAKICAgICAvLyBUcmFuc2Zvcm0gdGhlIGhvbGRlciBpbnRvIGEgd3Jh
cHBlciBvYmplY3QgZm9yIHRoZSBtYXRyaXguCi0gICAgVjhQcm94eTo6U2V0RE9NV3JhcHBlcihh
cmdzLkhvbGRlcigpLCBWOENsYXNzSW5kZXg6OlRvSW50KFY4Q2xhc3NJbmRleDo6V0VCS0lUQ1NT
TUFUUklYKSwgbWF0cml4LmdldCgpKTsKKyAgICBWOFByb3h5OjpzZXRET01XcmFwcGVyKGFyZ3Mu
SG9sZGVyKCksIFY4Q2xhc3NJbmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpXRUJLSVRDU1NNQVRS
SVgpLCBtYXRyaXguZ2V0KCkpOwogICAgIHJldHVybiB0b1Y4KG1hdHJpeC5yZWxlYXNlKCksIGFy
Z3MuSG9sZGVyKCkpOwogfQogCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhU
TUxJRnJhbWVFbGVtZW50Q3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOEhUTUxJRnJhbWVFbGVtZW50Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUp
CisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxJRnJhbWVFbGVtZW50Q3VzdG9t
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzksNyArMzksNyBAQAogCiBBQ0NFU1NPUl9TRVRURVIo
SFRNTElGcmFtZUVsZW1lbnRTcmMpCiB7Ci0gICAgSFRNTElGcmFtZUVsZW1lbnQqIGlmcmFtZSA9
IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTElGcmFtZUVsZW1lbnQ+KGluZm8uSG9sZGVy
KCkpOworICAgIEhUTUxJRnJhbWVFbGVtZW50KiBpZnJhbWUgPSBWOFByb3h5Ojpjb252ZXJ0RE9N
V3JhcHBlclRvTm9kZTxIVE1MSUZyYW1lRWxlbWVudD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgU3Ry
aW5nIHYgPSB2YWx1ZVRvU3RyaW5nV2l0aE51bGxDaGVjayh2YWx1ZSk7CiAKICAgICBpZiAoIWFs
bG93U2V0dGluZ0ZyYW1lU3JjVG9KYXZhc2NyaXB0VXJsKGlmcmFtZSwgdikpCkluZGV4OiBXZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFRyZWVXYWxrZXJDdXN0b20uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4VHJlZVdhbGtlckN1c3RvbS5jcHAJKHJl
dmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhUcmVlV2Fsa2Vy
Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTEsMTMgKzUxLDEzIEBACiAgICAgaWYgKCFv
YmplY3QpCiAgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOwogCi0gICAgcmV0dXJuIFY4UHJveHk6
Ok5vZGVUb1Y4T2JqZWN0KG9iamVjdC5nZXQoKSk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZl
cnROb2RlVG9WOE9iamVjdChvYmplY3QuZ2V0KCkpOwogfQogCiBDQUxMQkFDS19GVU5DX0RFQ0wo
VHJlZVdhbGtlclBhcmVudE5vZGUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uVHJlZVdhbGtlci5w
YXJlbnROb2RlKCkiKTsKLSAgICBUcmVlV2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0luZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhv
bGRlcigpKTsKKyAgICBUcmVlV2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6Y29udmVydFRv
TmF0aXZlT2JqZWN0PFRyZWVXYWxrZXI+KFY4Q2xhc3NJbmRleDo6VFJFRVdBTEtFUiwgYXJncy5I
b2xkZXIoKSk7CiAKICAgICBTY3JpcHRTdGF0ZSBzdGF0ZTsKICAgICBSZWZQdHI8Tm9kZT4gcmVz
dWx0ID0gdHJlZVdhbGtlci0+cGFyZW50Tm9kZSgmc3RhdGUpOwpAQCAtNjcsNyArNjcsNyBAQAog
Q0FMTEJBQ0tfRlVOQ19ERUNMKFRyZWVXYWxrZXJGaXJzdENoaWxkKQogewogICAgIElOQ19TVEFU
UygiRE9NLlRyZWVXYWxrZXIuZmlyc3RDaGlsZCgpIik7Ci0gICAgVHJlZVdhbGtlciogdHJlZVdh
bGtlciA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFRyZWVXYWxrZXI+KFY4Q2xhc3NJbmRleDo6
VFJFRVdBTEtFUiwgYXJncy5Ib2xkZXIoKSk7CisgICAgVHJlZVdhbGtlciogdHJlZVdhbGtlciA9
IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5kZXg6
OlRSRUVXQUxLRVIsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgU2NyaXB0U3RhdGUgc3RhdGU7CiAg
ICAgUmVmUHRyPE5vZGU+IHJlc3VsdCA9IHRyZWVXYWxrZXItPmZpcnN0Q2hpbGQoJnN0YXRlKTsK
QEAgLTc3LDcgKzc3LDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChUcmVlV2Fsa2VyTGFzdENoaWxk
KQogewogICAgIElOQ19TVEFUUygiRE9NLlRyZWVXYWxrZXIubGFzdENoaWxkKCkiKTsKLSAgICBU
cmVlV2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8VHJlZVdhbGtl
cj4oVjhDbGFzc0luZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKKyAgICBUcmVlV2Fs
a2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFRyZWVXYWxr
ZXI+KFY4Q2xhc3NJbmRleDo6VFJFRVdBTEtFUiwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBTY3Jp
cHRTdGF0ZSBzdGF0ZTsKICAgICBSZWZQdHI8Tm9kZT4gcmVzdWx0ID0gdHJlZVdhbGtlci0+bGFz
dENoaWxkKCZzdGF0ZSk7CkBAIC04Nyw3ICs4Nyw3IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woVHJl
ZVdhbGtlck5leHROb2RlKQogewogICAgIElOQ19TVEFUUygiRE9NLlRyZWVXYWxrZXIubmV4dE5v
ZGUoKSIpOwotICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5kZXg6OlRSRUVXQUxLRVIsIGFyZ3MuSG9sZGVyKCkp
OworICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVP
YmplY3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0luZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigp
KTsKIAogICAgIFNjcmlwdFN0YXRlIHN0YXRlOwogICAgIFJlZlB0cjxOb2RlPiByZXN1bHQgPSB0
cmVlV2Fsa2VyLT5uZXh0Tm9kZSgmc3RhdGUpOwpAQCAtOTcsNyArOTcsNyBAQAogQ0FMTEJBQ0tf
RlVOQ19ERUNMKFRyZWVXYWxrZXJQcmV2aW91c05vZGUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00u
VHJlZVdhbGtlci5wcmV2aW91c05vZGUoKSIpOwotICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5kZXg6OlRSRUVX
QUxLRVIsIGFyZ3MuSG9sZGVyKCkpOworICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIgPSBWOFBy
b3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0luZGV4OjpUUkVF
V0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFNjcmlwdFN0YXRlIHN0YXRlOwogICAgIFJl
ZlB0cjxOb2RlPiByZXN1bHQgPSB0cmVlV2Fsa2VyLT5wcmV2aW91c05vZGUoJnN0YXRlKTsKQEAg
LTEwNyw3ICsxMDcsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFRyZWVXYWxrZXJOZXh0U2libGlu
ZykKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5UcmVlV2Fsa2VyLm5leHRTaWJsaW5nKCkiKTsKLSAg
ICBUcmVlV2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8VHJlZVdh
bGtlcj4oVjhDbGFzc0luZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKKyAgICBUcmVl
V2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFRyZWVX
YWxrZXI+KFY4Q2xhc3NJbmRleDo6VFJFRVdBTEtFUiwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBT
Y3JpcHRTdGF0ZSBzdGF0ZTsKICAgICBSZWZQdHI8Tm9kZT4gcmVzdWx0ID0gdHJlZVdhbGtlci0+
bmV4dFNpYmxpbmcoJnN0YXRlKTsKQEAgLTExNyw3ICsxMTcsNyBAQAogQ0FMTEJBQ0tfRlVOQ19E
RUNMKFRyZWVXYWxrZXJQcmV2aW91c1NpYmxpbmcpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uVHJl
ZVdhbGtlci5wcmV2aW91c1NpYmxpbmcoKSIpOwotICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5kZXg6OlRSRUVX
QUxLRVIsIGFyZ3MuSG9sZGVyKCkpOworICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIgPSBWOFBy
b3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0luZGV4OjpUUkVF
V0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFNjcmlwdFN0YXRlIHN0YXRlOwogICAgIFJl
ZlB0cjxOb2RlPiByZXN1bHQgPSB0cmVlV2Fsa2VyLT5wcmV2aW91c1NpYmxpbmcoJnN0YXRlKTsK
SW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMVHJhbnNhY3Rpb25DdXN0b20u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMVHJhbnNh
Y3Rpb25DdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4U1FMVHJhbnNhY3Rpb25DdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiwx
NCArMzIsMTMgQEAKIAogI2lmIEVOQUJMRShEQVRBQkFTRSkKIAotI2luY2x1ZGUgInY4X2JpbmRp
bmcuaCIKLSNpbmNsdWRlICJ2OF9wcm94eS5oIgotCiAjaW5jbHVkZSAiRGF0YWJhc2UuaCIKICNp
bmNsdWRlICJTUUxWYWx1ZS5oIgorI2luY2x1ZGUgIlY4QmluZGluZy5oIgogI2luY2x1ZGUgIlY4
Q3VzdG9tQmluZGluZy5oIgogI2luY2x1ZGUgIlY4Q3VzdG9tU1FMU3RhdGVtZW50Q2FsbGJhY2su
aCIKICNpbmNsdWRlICJWOEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2suaCIKKyNpbmNs
dWRlICJWOFByb3h5LmgiCiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgogCiB1c2luZyBuYW1lc3Bh
Y2UgV1RGOwpAQCAtNTEsNyArNTAsNyBAQAogICAgIElOQ19TVEFUUygiRE9NLlNRTFRyYW5zYWN0
aW9uLmV4ZWN1dGVTcWwoKSIpOwogCiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPT0gMCkgewotICAg
ICAgICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgIlNRTCBzdGF0
ZW1lbnQgaXMgcmVxdWlyZWQuIik7CisgICAgICAgIFY4UHJveHk6OnRocm93RXJyb3IoVjhQcm94
eTo6U1lOVEFYX0VSUk9SLCAiU1FMIHN0YXRlbWVudCBpcyByZXF1aXJlZC4iKTsKICAgICAgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKICAgICB9CiAKQEAgLTYyLDcgKzYxLDcgQEAKICAgICBp
ZiAoYXJncy5MZW5ndGgoKSA+IDEpIHsKICAgICAgICAgLy8gRklYTUU6IE1ha2UgdGhpcyB3b3Jr
IGZvciB2ODo6QXJyYXlpc2ggb2JqZWN0cywgYXMgd2VsbAogICAgICAgICBpZiAoIWFyZ3NbMV0t
PklzQXJyYXkoKSkgewotICAgICAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpU
WVBFX0VSUk9SLCAiU3RhdGVtZW50IGFyZ3VtZW50cyBtdXN0IGJlIGFuIHY4OjpBcnJheS4iKTsK
KyAgICAgICAgICAgIFY4UHJveHk6OnRocm93RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgIlN0
YXRlbWVudCBhcmd1bWVudHMgbXVzdCBiZSBhbiB2ODo6QXJyYXkuIik7CiAgICAgICAgICAgICBy
ZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgICAgICB9CiAKQEAgLTgwLDE0ICs3OSwxNCBAQAog
ICAgICAgICB9CiAgICAgfQogCi0gICAgU1FMVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uID0gVjhQ
cm94eTo6VG9OYXRpdmVPYmplY3Q8U1FMVHJhbnNhY3Rpb24+KFY4Q2xhc3NJbmRleDo6U1FMVFJB
TlNBQ1RJT04sIGFyZ3MuSG9sZGVyKCkpOworICAgIFNRTFRyYW5zYWN0aW9uKiB0cmFuc2FjdGlv
biA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxTUUxUcmFuc2FjdGlvbj4oVjhDbGFz
c0luZGV4OjpTUUxUUkFOU0FDVElPTiwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBGcmFtZSogZnJh
bWUgPSBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lKCk7CiAKICAgICBSZWZQdHI8U1FMU3RhdGVtZW50
Q2FsbGJhY2s+IGNhbGxiYWNrOwogICAgIGlmIChhcmdzLkxlbmd0aCgpID4gMikgewogICAgICAg
ICBpZiAoIWFyZ3NbMl0tPklzT2JqZWN0KCkpIHsKLSAgICAgICAgICAgIFY4UHJveHk6OlRocm93
RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgIlN0YXRlbWVudCBjYWxsYmFjayBtdXN0IGJlIG9m
IHZhbGlkIHR5cGUuIik7CisgICAgICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6
OlRZUEVfRVJST1IsICJTdGF0ZW1lbnQgY2FsbGJhY2sgbXVzdCBiZSBvZiB2YWxpZCB0eXBlLiIp
OwogICAgICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKICAgICAgICAgfQogCkBAIC05
OCw3ICs5Nyw3IEBACiAgICAgUmVmUHRyPFNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2s+IGVycm9y
Q2FsbGJhY2s7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAzKSB7CiAgICAgICAgIGlmICghYXJn
c1syXS0+SXNPYmplY3QoKSkgewotICAgICAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFBy
b3h5OjpUWVBFX0VSUk9SLCAiU3RhdGVtZW50IGVycm9yIGNhbGxiYWNrIG11c3QgYmUgb2YgdmFs
aWQgdHlwZS4iKTsKKyAgICAgICAgICAgIFY4UHJveHk6OnRocm93RXJyb3IoVjhQcm94eTo6VFlQ
RV9FUlJPUiwgIlN0YXRlbWVudCBlcnJvciBjYWxsYmFjayBtdXN0IGJlIG9mIHZhbGlkIHR5cGUu
Iik7CiAgICAgICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgICAgICB9CiAKQEAg
LTEwOCw3ICsxMDcsNyBAQAogCiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAgdHJhbnNh
Y3Rpb24tPmV4ZWN1dGVTUUwoc3RhdGVtZW50LCBzcWxWYWx1ZXMsIGNhbGxiYWNrLCBlcnJvckNh
bGxiYWNrLCBlYyk7Ci0gICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICBWOFBy
b3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogCiAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsK
IH0KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MU2VyaWFsaXplckNvbnN0
cnVjdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFhN
TFNlcmlhbGl6ZXJDb25zdHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhYTUxTZXJpYWxpemVyQ29uc3RydWN0b3IuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zOSw3ICszOSw3IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woWE1MU2VyaWFsaXpl
ckNvbnN0cnVjdG9yKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTFNlcmlhbGl6ZXIuQ29uc3Ry
dWN0b3IiKTsKLSAgICByZXR1cm4gVjhQcm94eTo6Q29uc3RydWN0RE9NT2JqZWN0PFY4Q2xhc3NJ
bmRleDo6WE1MU0VSSUFMSVpFUiwgWE1MU2VyaWFsaXplcj4oYXJncyk7CisgICAgcmV0dXJuIFY4
UHJveHk6OmNvbnN0cnVjdERPTU9iamVjdDxWOENsYXNzSW5kZXg6OlhNTFNFUklBTElaRVIsIFhN
TFNlcmlhbGl6ZXI+KGFyZ3MpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2FsbGJh
Y2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9t
U1FMU3RhdGVtZW50RXJyb3JDYWxsYmFjay5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNTQsMTUgKzU0LDE1IEBACiB7CiAgICAgdjg6OkhhbmRsZVNj
b3BlIGhhbmRsZVNjb3BlOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9
IFY4UHJveHk6OkdldENvbnRleHQobV9mcmFtZS5nZXQoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6
Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQobV9mcmFtZS5nZXQoKSk7CiAgICAg
aWYgKGNvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIHY4OjpD
b250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKIAogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiBhcmd2W10gPSB7Ci0gICAgICAgIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpT
UUxUUkFOU0FDVElPTiwgdHJhbnNhY3Rpb24pLAotICAgICAgICBWOFByb3h5OjpUb1Y4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6U1FMRVJST1IsIGVycm9yKQorICAgICAgICBWOFByb3h5Ojpjb252ZXJ0
VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNRTFRSQU5TQUNUSU9OLCB0cmFuc2FjdGlvbiksCisg
ICAgICAgIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMRVJST1Is
IGVycm9yKQogICAgIH07CiAKICAgICAvLyBQcm90ZWN0IHRoZSBmcmFtZSB1bnRpbCB0aGUgY2Fs
bGJhY2sgcmV0dXJucy4KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9t
U1FMVHJhbnNhY3Rpb25DYWxsYmFjay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhDdXN0b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrLmNwcAkocmV2aXNpb24g
NDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFRyYW5zYWN0
aW9uQ2FsbGJhY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NSwxNCArNTUsMTQgQEAKIHsKICAg
ICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CiAKLSAgICB2ODo6SGFuZGxlPHY4OjpDb250
ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChtX2ZyYW1lLmdldCgpKTsKKyAgICB2
ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6Y29udGV4dChtX2ZyYW1l
LmdldCgpKTsKICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKIAog
ICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKIAogICAgIHY4OjpIYW5kbGU8
djg6OlZhbHVlPiBhcmd2W10gPSB7Ci0gICAgICAgIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFz
c0luZGV4OjpTUUxUUkFOU0FDVElPTiwgdHJhbnNhY3Rpb24pCisgICAgICAgIFY4UHJveHk6OmNv
bnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMVFJBTlNBQ1RJT04sIHRyYW5zYWN0aW9u
KQogICAgIH07CiAKICAgICAvLyBQcm90ZWN0IHRoZSBmcmFtZSB1bnRpbCB0aGUgY2FsbGJhY2sg
cmV0dXJucy4KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MSHR0cFJlcXVl
c3RDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhYTUxIdHRwUmVxdWVzdENvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFhNTEh0dHBSZXF1ZXN0Q29uc3RydWN0b3IuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC01OSwxMSArNTksMTEgQEAKICNlbmRpZgogICAgICAgICBjb250
ZXh0ID0gVjhQcm94eTo6cmV0cmlldmVGcmFtZSgpLT5kb2N1bWVudCgpOwogICAgIFJlZlB0cjxY
TUxIdHRwUmVxdWVzdD4geG1sSHR0cFJlcXVlc3QgPSBYTUxIdHRwUmVxdWVzdDo6Y3JlYXRlKGNv
bnRleHQpOwotICAgIFY4UHJveHk6OlNldERPTVdyYXBwZXIoYXJncy5Ib2xkZXIoKSwgVjhDbGFz
c0luZGV4OjpUb0ludChWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUKSwgeG1sSHR0cFJlcXVl
c3QuZ2V0KCkpOworICAgIFY4UHJveHk6OnNldERPTVdyYXBwZXIoYXJncy5Ib2xkZXIoKSwgVjhD
bGFzc0luZGV4OjpUb0ludChWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUKSwgeG1sSHR0cFJl
cXVlc3QuZ2V0KCkpOwogCiAgICAgLy8gQWRkIG9iamVjdCB0byB0aGUgd3JhcHBlciBtYXAuCiAg
ICAgeG1sSHR0cFJlcXVlc3QtPnJlZigpOwotICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckFj
dGl2ZURPTU9iamVjdCh4bWxIdHRwUmVxdWVzdC5nZXQoKSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9i
amVjdD46Ok5ldyhhcmdzLkhvbGRlcigpKSk7CisgICAgVjhQcm94eTo6c2V0SlNXcmFwcGVyRm9y
QWN0aXZlRE9NT2JqZWN0KHhtbEh0dHBSZXF1ZXN0LmdldCgpLCB2ODo6UGVyc2lzdGVudDx2ODo6
T2JqZWN0Pjo6TmV3KGFyZ3MuSG9sZGVyKCkpKTsKICAgICByZXR1cm4gYXJncy5Ib2xkZXIoKTsK
IH0KIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOEFic3RyYWN0RXZlbnRMaXN0ZW5lci5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOEFic3RyYWN0RXZlbnRMaXN0
ZW5lci5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOEFic3Ry
YWN0RXZlbnRMaXN0ZW5lci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU1LDcgKzU1LDcgQEAKICAg
ICB9CiB9CiAKLXZvaWQgVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6Omludm9rZUV2ZW50SGFuZGxl
cih2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0LCBFdmVudCogZXZlbnQsIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBqc0V2ZW50LCBib29sIGlzV2luZG93RXZlbnQpCit2b2lkIFY4QWJzdHJh
Y3RFdmVudExpc3RlbmVyOjppbnZva2VFdmVudEhhbmRsZXIodjg6OkhhbmRsZTx2ODo6Q29udGV4
dD4gdjhDb250ZXh0LCBFdmVudCogZXZlbnQsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBqc0V2ZW50
LCBib29sIGlzV2luZG93RXZlbnQpCiB7CiAgICAgLy8gV2UgcHVzaCB0aGUgZXZlbnQgYmVpbmcg
cHJvY2Vzc2VkIGludG8gdGhlIGdsb2JhbCBvYmplY3QsIHNvIHRoYXQgaXQgY2FuIGJlIGV4cG9z
ZWQgYnkgRE9NV2luZG93J3MgYmluZGluZ3MuCiAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGV2
ZW50U3ltYm9sID0gdjg6OlN0cmluZzo6TmV3U3ltYm9sKCJldmVudCIpOwpAQCAtNjcsMTEgKzY3
LDExIEBACiAgICAgICAgIHRyeUNhdGNoLlNldFZlcmJvc2UodHJ1ZSk7CiAKICAgICAgICAgLy8g
U2F2ZSB0aGUgb2xkICdldmVudCcgcHJvcGVydHkgc28gd2UgY2FuIHJlc3RvcmUgaXQgbGF0ZXIu
Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHNhdmVkRXZlbnQgPSBjb250ZXh0LT5HbG9i
YWwoKS0+R2V0SGlkZGVuVmFsdWUoZXZlbnRTeW1ib2wpOworICAgICAgICB2ODo6TG9jYWw8djg6
OlZhbHVlPiBzYXZlZEV2ZW50ID0gdjhDb250ZXh0LT5HbG9iYWwoKS0+R2V0SGlkZGVuVmFsdWUo
ZXZlbnRTeW1ib2wpOwogICAgICAgICB0cnlDYXRjaC5SZXNldCgpOwogCiAgICAgICAgIC8vIE1h
a2UgdGhlIGV2ZW50IGF2YWlsYWJsZSBpbiB0aGUgZ2xvYmFsIG9iamVjdCwgc28gRE9NV2luZG93
IGNhbiBleHBvc2UgaXQuCi0gICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5TZXRIaWRkZW5WYWx1
ZShldmVudFN5bWJvbCwganNFdmVudCk7CisgICAgICAgIHY4Q29udGV4dC0+R2xvYmFsKCktPlNl
dEhpZGRlblZhbHVlKGV2ZW50U3ltYm9sLCBqc0V2ZW50KTsKICAgICAgICAgdHJ5Q2F0Y2guUmVz
ZXQoKTsKIAogICAgICAgICAvLyBDYWxsIHRoZSBldmVudCBoYW5kbGVyLgpAQCAtODAsMTMgKzgw
LDEzIEBACiAKICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb2xkIGV2ZW50LiBUaGlzIG11c3QgYmUg
ZG9uZSBmb3IgYWxsIGV4aXQgcGF0aHMgdGhyb3VnaCB0aGlzIG1ldGhvZC4KICAgICAgICAgaWYg
KHNhdmVkRXZlbnQuSXNFbXB0eSgpKQotICAgICAgICAgICAgY29udGV4dC0+R2xvYmFsKCktPlNl
dEhpZGRlblZhbHVlKGV2ZW50U3ltYm9sLCB2ODo6VW5kZWZpbmVkKCkpOworICAgICAgICAgICAg
djhDb250ZXh0LT5HbG9iYWwoKS0+U2V0SGlkZGVuVmFsdWUoZXZlbnRTeW1ib2wsIHY4OjpVbmRl
ZmluZWQoKSk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5T
ZXRIaWRkZW5WYWx1ZShldmVudFN5bWJvbCwgc2F2ZWRFdmVudCk7CisgICAgICAgICAgICB2OENv
bnRleHQtPkdsb2JhbCgpLT5TZXRIaWRkZW5WYWx1ZShldmVudFN5bWJvbCwgc2F2ZWRFdmVudCk7
CiAgICAgICAgIHRyeUNhdGNoLlJlc2V0KCk7CiAgICAgfQogCi0gICAgQVNTRVJUKCFWOFByb3h5
OjpIYW5kbGVPdXRPZk1lbW9yeSgpIHx8IHJldHVyblZhbHVlLklzRW1wdHkoKSk7CisgICAgQVNT
RVJUKCFWOFByb3h5OjpoYW5kbGVPdXRPZk1lbW9yeSgpIHx8IHJldHVyblZhbHVlLklzRW1wdHko
KSk7CiAKICAgICBpZiAocmV0dXJuVmFsdWUuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CkBA
IC0xMTIsMjAgKzExMiwyMCBAQAogCiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwog
Ci0gICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRl
eHQobV9mcmFtZSk7Ci0gICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgIHY4OjpIYW5kbGU8
djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQobV9mcmFtZSk7CisgICAg
aWYgKHY4Q29udGV4dC5Jc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKIAogICAgIC8vIG1fZnJh
bWUgY2FuIHJlbW92ZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLCBwcm90ZWN0IGl0IHVudGls
IHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zLgogICAgIFJlZlB0cjxGcmFtZT4gcHJvdGVj
dEZyYW1lKG1fZnJhbWUpOwogCiAgICAgLy8gRW50ZXIgdGhlIFY4IGNvbnRleHQgaW4gd2hpY2gg
dG8gcGVyZm9ybSB0aGUgZXZlbnQgaGFuZGxpbmcuCi0gICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNj
b3BlKGNvbnRleHQpOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZSh2OENvbnRleHQpOwog
CiAgICAgLy8gR2V0IHRoZSBWOCB3cmFwcGVyIGZvciB0aGUgZXZlbnQgb2JqZWN0LgotICAgIHY4
OjpIYW5kbGU8djg6OlZhbHVlPiBqc0V2ZW50ID0gVjhQcm94eTo6RXZlbnRUb1Y4T2JqZWN0KGV2
ZW50KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4ganNFdmVudCA9IFY4UHJveHk6OmNvbnZl
cnRFdmVudFRvVjhPYmplY3QoZXZlbnQpOwogCi0gICAgaW52b2tlRXZlbnRIYW5kbGVyKGNvbnRl
eHQsIGV2ZW50LCBqc0V2ZW50LCBpc1dpbmRvd0V2ZW50KTsKKyAgICBpbnZva2VFdmVudEhhbmRs
ZXIodjhDb250ZXh0LCBldmVudCwganNFdmVudCwgaXNXaW5kb3dFdmVudCk7CiAKICAgICBEb2N1
bWVudDo6dXBkYXRlU3R5bGVGb3JBbGxEb2N1bWVudHMoKTsKIH0KQEAgLTEzNCw3ICsxMzQsNyBA
QAogewogICAgIGlmICghbV9saXN0ZW5lci5Jc0VtcHR5KCkpIHsKICNpZm5kZWYgTkRFQlVHCi0g
ICAgICAgIFY4UHJveHk6OlVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9saXN0ZW5lcik7
CisgICAgICAgIFY4UHJveHk6OnVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9saXN0ZW5l
cik7CiAjZW5kaWYKICAgICAgICAgbV9saXN0ZW5lci5EaXNwb3NlKCk7CiAgICAgICAgIG1fbGlz
dGVuZXIuQ2xlYXIoKTsKQEAgLTE1MCw3ICsxNTAsNyBAQAogICAgICAgICByZXR1cm4gdjg6OkNv
bnRleHQ6OkdldEN1cnJlbnQoKS0+R2xvYmFsKCk7CiAKICAgICBFdmVudFRhcmdldCogdGFyZ2V0
ID0gZXZlbnQtPmN1cnJlbnRUYXJnZXQoKTsKLSAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFs
dWUgPSBWOFByb3h5OjpFdmVudFRhcmdldFRvVjhPYmplY3QodGFyZ2V0KTsKKyAgICB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gdmFsdWUgPSBWOFByb3h5Ojpjb252ZXJ0RXZlbnRUYXJnZXRUb1Y4T2Jq
ZWN0KHRhcmdldCk7CiAgICAgaWYgKHZhbHVlLklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIHY4
OjpMb2NhbDx2ODo6T2JqZWN0PigpOwogICAgIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD46
Ok5ldyh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHZhbHVlKSk7CkluZGV4OiBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L1NjcmlwdEluc3RhbmNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L1NjcmlwdEluc3RhbmNlLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L1NjcmlwdEluc3RhbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjIsNyAr
NjIsNyBAQAogICAgIGlmIChtX2luc3RhbmNlLklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwog
I2lmbmRlZiBOREVCVUcKLSAgICBWOFByb3h5OjpVbnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMs
IG1faW5zdGFuY2UpOworICAgIFY4UHJveHk6OnVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywg
bV9pbnN0YW5jZSk7CiAjZW5kaWYKICAgICBtX2luc3RhbmNlLkRpc3Bvc2UoKTsKICAgICBtX2lu
c3RhbmNlLkNsZWFyKCk7CkBAIC03Niw3ICs3Niw3IEBACiAKICAgICBtX2luc3RhbmNlID0gdjg6
OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhpbnN0YW5jZSk7CiAjaWZuZGVmIE5ERUJVRwot
ICAgIFY4UHJveHk6OlJlZ2lzdGVyR2xvYmFsSGFuZGxlKFNDUklQVElOU1RBTkNFLCB0aGlzLCBt
X2luc3RhbmNlKTsKKyAgICBWOFByb3h5OjpyZWdpc3Rlckdsb2JhbEhhbmRsZShTQ1JJUFRJTlNU
QU5DRSwgdGhpcywgbV9pbnN0YW5jZSk7CiAjZW5kaWYKIH0KIApJbmRleDogV2ViQ29yZS9iaW5k
aW5ncy92OC9WOERPTU1hcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9W
OERPTU1hcC5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOERP
TU1hcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0OCw3ICszNDgsNyBAQAogICAgIHY4OjpIYW5k
bGVTY29wZSBzY29wZTsKICAgICBBU1NFUlQodjhPYmplY3QtPklzT2JqZWN0KCkpOwogCi0gICAg
VjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFwcGVy
VHlwZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSk7CisgICAgVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5Ojpkb21XcmFwcGVyVHlwZSh2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSk7CiAKICAgICBUaHJlYWRTcGVjaWZp
Y0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgbWFwID0gc3RhdGljX2Nhc3Q8
VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mPihnZXRE
T01TVkdPYmplY3RXaXRoQ29udGV4dE1hcCgpKTsKICAgICBpZiAobWFwLmNvbnRhaW5zKGRvbU9i
amVjdCkpIHsKQEAgLTQxNSw3ICs0MTUsNyBAQAogICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsK
ICAgICBBU1NFUlQodjhPYmplY3QtPklzT2JqZWN0KCkpOwogCi0gICAgVjhDbGFzc0luZGV4OjpW
OFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFwcGVyVHlwZSh2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSk7CisgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBw
ZXJUeXBlIHR5cGUgPSBWOFByb3h5Ojpkb21XcmFwcGVyVHlwZSh2ODo6SGFuZGxlPHY4OjpPYmpl
Y3Q+OjpDYXN0KHY4T2JqZWN0KSk7CiAKICAgICBUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVy
bmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgbWFwID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNE
T01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mPihnZXRET01PYmplY3RNYXAoKSk7
CiAgICAgaWYgKG1hcC5jb250YWlucyhkb21PYmplY3QpKSB7CkBAIC00NDAsNyArNDQwLDcgQEAK
ICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CiAgICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVj
dCgpKTsKIAotICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6
R2V0RE9NV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkp
OworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6ZG9tV3Jh
cHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOwogCiAgICAg
VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mIG1hcCA9
IHN0YXRpY19jYXN0PFRocmVhZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJuYWxET01XcmFwcGVyTWFw
PHZvaWQ+Jj4oZ2V0QWN0aXZlRE9NT2JqZWN0TWFwKCkpOwogICAgIGlmIChtYXAuY29udGFpbnMo
ZG9tT2JqZWN0KSkgewpAQCAtNTI4LDcgKzUyOCw3IEBACiAgICAgICAgIFQqIGRvbU9iamVjdCA9
IHN0YXRpY19jYXN0PFQqPihpdGVyLT5maXJzdCk7CiAgICAgICAgIHY4OjpQZXJzaXN0ZW50PHY4
OjpPYmplY3Q+IHY4T2JqZWN0KGl0ZXItPnNlY29uZCk7CiAKLSAgICAgICAgVjhDbGFzc0luZGV4
OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFwcGVyVHlwZSh2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSk7CisgICAgICAgIFY4Q2xhc3NJbmRleDo6
VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6ZG9tV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2
ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOwogCiAgICAgICAgIC8vIERlcmVmIHRoZSBET00g
b2JqZWN0LgogICAgICAgICBkZXJlZk9iamVjdCh0eXBlLCBkb21PYmplY3QpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31815</attachid>
            <date>2009-06-24 16:29:12 -0700</date>
            <delta_ts>2009-06-25 17:21:59 -0700</delta_ts>
            <desc>patch4</desc>
            <filename>patch4.txt</filename>
            <type>text/plain</type>
            <size>359918</size>
            <attacher name="Nate Chapin">japhet</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDk5MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMDktMDYtMjQgIE5hdGUgQ2hhcGluICA8amFwaGV0QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBV
cHN0cmVhbSBWOFByb3h5LgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0yNjYyMworCisgICAgICAgICogYmluZGluZ3MvdjgvVjhQcm94eS5jcHA6IFBv
cnRlZCBmcm9tIHN2bi5jaHJvbWl1bS5vcmcgKHNwZWNpZmljIGZ1bmN0aW9uIGVudHJpZXMgcmVt
b3ZlZCBzaW5jZSBpdCdkIGJlIG1hbnkgbGluZXMgb2YgcmVkdW5kYW5jeSkuCisgICAgICAgICog
YmluZGluZ3MvdjgvVjhQcm94eS5oOiBQb3J0ZWQgZnJvbSBzdm4uY2hyb21pdW0ub3JnIChzcGVj
aWZpYyBmdW5jdGlvbiBlbnRyaWVzIHJlbW92ZWQgc2luY2UgaXQnZCBiZSBtYW55IGxpbmVzIG9m
IHJlZHVuZGFuY3kpLgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRp
b25Qcm94eS5jcHA6IENoYW5nZWQgZG9tT2JqZWN0TWFwKCkgcmVmZXJlbmNlcyB0byBnZXRET01P
YmplY3RNYXAoKS4KKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhEYXRhYmFzZUN1c3Rv
bS5jcHA6IFVwZGF0ZWQgI2luY2x1ZGUuCisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4
U1FMUmVzdWx0U2V0Um93TGlzdEN1c3RvbS5jcHA6IFVwZGF0ZWQgI2luY2x1ZGUuCisgICAgICAg
ICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMVHJhbnNhY3Rpb25DdXN0b20uY3BwOiBVcGRhdGVk
ICNpbmNsdWRlLgorCiAyMDA5LTA2LTIzICBFcmljIENhcmxzb24gIDxlcmljLmNhcmxzb25AYXBw
bGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFkbGVyLgpJbmRleDogV2ViQ29y
ZS9iaW5kaW5ncy92OC9TY3JpcHRTY29wZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5k
aW5ncy92OC9TY3JpcHRTY29wZS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5k
aW5ncy92OC9TY3JpcHRTY29wZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQzLDcgKzQzLDcgQEAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogU2NyaXB0U2NvcGU6OlNjcmlwdFNjb3BlKFNjcmlwdFN0
YXRlKiBzY3JpcHRTdGF0ZSwgYm9vbCByZXBvcnRFeGNlcHRpb25zKQotICAgIDogbV9jb250ZXh0
KFY4UHJveHk6OkdldENvbnRleHQoc2NyaXB0U3RhdGUtPmZyYW1lKCkpKQorICAgIDogbV9jb250
ZXh0KFY4UHJveHk6OmNvbnRleHQoc2NyaXB0U3RhdGUtPmZyYW1lKCkpKQogICAgICwgbV9zY29w
ZShtX2NvbnRleHQpCiAgICAgLCBtX3NjcmlwdFN0YXRlKHNjcmlwdFN0YXRlKQogICAgICwgbV9y
ZXBvcnRFeGNlcHRpb25zKHJlcG9ydEV4Y2VwdGlvbnMpCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdz
L3Y4L1Y4VXRpbGl0aWVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOFV0
aWxpdGllcy5oCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhVdGls
aXRpZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMzEsOSArMzEsNiBAQAogI2lmbmRlZiBWOFV0aWxp
dGllc19oCiAjZGVmaW5lIFY4VXRpbGl0aWVzX2gKIAotLy8gRklYTUU6IFJlbW92ZSBvbmNlIGNo
cm9taXVtIGRlcGVuZGVuY2llcyBvbiB2OF91dGlsaXR5LmggYXJlIHJlbW92ZWQuCi0jZGVmaW5l
IFY4VVRJTElUSUVTX0RFRklORUQgMQotCiAjaW5jbHVkZSA8djguaD4KIAogbmFtZXNwYWNlIFdl
YkNvcmUgewpAQCAtNzUsMTEgKzcyLDYgQEAKICAgICAgIHN0YXRpYyBpbmxpbmUgdjg6OkxvY2Fs
PHY4OjpPYmplY3Q+IG5ld0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPik7CiAgICAg
ICBzdGF0aWMgaW5saW5lIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBuZXdJbnN0YW5jZSh2ODo6SGFu
ZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4pOwogICAgICAgc3RhdGljIGlubGluZSB2ODo6TG9jYWw8
djg6Ok9iamVjdD4gbmV3SW5zdGFuY2Uodjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+LCBpbnQgYXJn
Yywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZ3ZbXSk7Ci0KLSAgICAgIC8vIEZJWE1FOiBUaGVz
ZSBOZXdJbnN0YW5jZSBmdW5jdGlvbnMgYXJlIGhlcmUgdG8gZWFzZSB1cHN0cmVhbWluZy4gUmVt
b3ZlIGFsb25nIHdpdGggVjhVVElMSVRJRVNfREVGSU5FRCBvbmNlIGNocm9taXVtIGRlcGVuZGVu
Y2llcyBvbiB2OF91dGlsaXR5LmggYXJlIHJlbW92ZWQuCi0gICAgICBzdGF0aWMgaW5saW5lIHY4
OjpMb2NhbDx2ODo6T2JqZWN0PiBOZXdJbnN0YW5jZSh2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4p
OwotICAgICAgc3RhdGljIGlubGluZSB2ODo6TG9jYWw8djg6Ok9iamVjdD4gTmV3SW5zdGFuY2Uo
djg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+KTsKLSAgICAgIHN0YXRpYyBpbmxpbmUgdjg6
OkxvY2FsPHY4OjpPYmplY3Q+IE5ld0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiwg
aW50IGFyZ2MsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmd2W10pOwogICAgIH07CiAKICAgICB2
ODo6TG9jYWw8djg6Ok9iamVjdD4gU2FmZUFsbG9jYXRpb246Om5ld0luc3RhbmNlKHY4OjpIYW5k
bGU8djg6OkZ1bmN0aW9uPiBmdW5jdGlvbikKQEAgLTEwNiwyMiArOTgsNiBAQAogICAgICAgICBy
ZXR1cm4gZnVuY3Rpb24tPk5ld0luc3RhbmNlKGFyZ2MsIGFyZ3YpOwogICAgIH0KIAotICAgIC8v
IEZJWE1FOiBUaGVzZSBOZXdJbnN0YW5jZSBmdW5jdGlvbnMgYXJlIGhlcmUgdG8gZWFzZSB1cHN0
cmVhbWluZy4gUmVtb3ZlIGFsb25nIHdpdGggVjhVVElMSVRJRVNfREVGSU5FRCBvbmNlIGNocm9t
aXVtIGRlcGVuZGVuY2llcyBvbiB2OF91dGlsaXR5LmggYXJlIHJlbW92ZWQuCi0gICAgdjg6Okxv
Y2FsPHY4OjpPYmplY3Q+IFNhZmVBbGxvY2F0aW9uOjpOZXdJbnN0YW5jZSh2ODo6SGFuZGxlPHY4
OjpGdW5jdGlvbj4gZnVuY3Rpb24pCi0gICAgewotICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2Uo
ZnVuY3Rpb24pOwotICAgIH0KLQotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBTYWZlQWxsb2Nh
dGlvbjo6TmV3SW5zdGFuY2Uodjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+IG9iamVjdFRl
bXBsYXRlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKG9iamVjdFRlbXBsYXRl
KTsKLSAgICB9Ci0KLSAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gU2FmZUFsbG9jYXRpb246Ok5l
d0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiBmdW5jdGlvbiwgaW50IGFyZ2MsIHY4
OjpIYW5kbGU8djg6OlZhbHVlPiBhcmd2W10pCi0gICAgewotICAgICAgICByZXR1cm4gbmV3SW5z
dGFuY2UoZnVuY3Rpb24sIGFyZ2MsIGFyZ3YpOwotICAgIH0KLQogfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQogCiAjZW5kaWYgLy8gVjhVdGlsaXRpZXNfaApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92
OC9WOFByb3h5LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOFByb3h5LmgJ
KHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOFByb3h5LmgJKHdvcmtp
bmcgY29weSkKQEAgLTMxLDEyICszMSw2MTQgQEAKICNpZm5kZWYgVjhQcm94eV9oCiAjZGVmaW5l
IFY4UHJveHlfaAogCi0vLyBGSVhNRTogVGhpcyBpcyBhIHRlbXBvcmFyeSBmb3J3YXJkaW5nIGhl
YWRlciB1bnRpbCBhbGwgYmluZGluZ3MgaGF2ZSBtaWdyYXRlZAotLy8gb3ZlciBhbmQgdjhfcHJv
eHkgYWN0dWFsbHkgYmVjb21lcyBWOFByb3h5LgotI2luY2x1ZGUgInY4X3Byb3h5LmgiCisjaW5j
bHVkZSAiQ2hyb21pdW1CcmlkZ2UuaCIKKyNpbmNsdWRlICJOb2RlLmgiCisjaW5jbHVkZSAiTm9k
ZUZpbHRlci5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiIC8vIGZvciBXZWJDb3JlOjpT
dHJpbmcKKyNpbmNsdWRlICJTY3JpcHRTb3VyY2VDb2RlLmgiIC8vIGZvciBXZWJDb3JlOjpTY3Jp
cHRTb3VyY2VDb2RlCisjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIgLy8gZm9yIFdlYkNvcmU6
OlNlY3VyaXR5T3JpZ2luCisjaW5jbHVkZSAiVjhDdXN0b21CaW5kaW5nLmgiCisjaW5jbHVkZSAi
VjhET01NYXAuaCIKKyNpbmNsdWRlICJWOEV2ZW50TGlzdGVuZXJMaXN0LmgiCisjaW5jbHVkZSAi
VjhJbmRleC5oIgorI2luY2x1ZGUgIlY4VXRpbGl0aWVzLmgiCisjaW5jbHVkZSA8djguaD4KKyNp
bmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+IC8v
IHNvIGdlbmVyYXRlZCBiaW5kaW5ncyBkb24ndCBoYXZlIHRvCisjaW5jbHVkZSA8d3RmL1ZlY3Rv
ci5oPgogCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGlzdD4KKworI2lmZGVmIEVO
QUJMRV9ET01fU1RBVFNfQ09VTlRFUlMKKyNkZWZpbmUgSU5DX1NUQVRTKG5hbWUpIENocm9taXVt
QnJpZGdlOjppbmNyZW1lbnRTdGF0c0NvdW50ZXIobmFtZSkKKyNlbHNlCisjZGVmaW5lIElOQ19T
VEFUUyhuYW1lKQorI2VuZGlmCisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorICAgIGNsYXNzIENT
U1N0eWxlRGVjbGFyYXRpb247CisgICAgY2xhc3MgQ2xpZW50UmVjdExpc3Q7CisgICAgY2xhc3Mg
RE9NSW1wbGVtZW50YXRpb247CisgICAgY2xhc3MgRWxlbWVudDsKKyAgICBjbGFzcyBFdmVudDsK
KyAgICBjbGFzcyBFdmVudExpc3RlbmVyOworICAgIGNsYXNzIEZyYW1lOworICAgIGNsYXNzIEhU
TUxDb2xsZWN0aW9uOworICAgIGNsYXNzIEhUTUxPcHRpb25zQ29sbGVjdGlvbjsKKyAgICBjbGFz
cyBIVE1MRWxlbWVudDsKKyAgICBjbGFzcyBIVE1MRG9jdW1lbnQ7CisgICAgY2xhc3MgTWVkaWFM
aXN0OworICAgIGNsYXNzIE5hbWVkTm9kZU1hcDsKKyAgICBjbGFzcyBOb2RlOworICAgIGNsYXNz
IE5vZGVMaXN0OworICAgIGNsYXNzIFNjcmVlbjsKKyAgICBjbGFzcyBTdHJpbmc7CisgICAgY2xh
c3MgU3R5bGVTaGVldDsKKyAgICBjbGFzcyBTVkdFbGVtZW50OworICAgIGNsYXNzIERPTVdpbmRv
dzsKKyAgICBjbGFzcyBEb2N1bWVudDsKKyAgICBjbGFzcyBFdmVudFRhcmdldDsKKyAgICBjbGFz
cyBFdmVudDsKKyAgICBjbGFzcyBFdmVudExpc3RlbmVyOworICAgIGNsYXNzIE5hdmlnYXRvcjsK
KyAgICBjbGFzcyBNaW1lVHlwZTsKKyAgICBjbGFzcyBNaW1lVHlwZUFycmF5OworICAgIGNsYXNz
IFBsdWdpbjsKKyAgICBjbGFzcyBQbHVnaW5BcnJheTsKKyAgICBjbGFzcyBTdHlsZVNoZWV0TGlz
dDsKKyAgICBjbGFzcyBDU1NWYWx1ZTsKKyAgICBjbGFzcyBDU1NSdWxlOworICAgIGNsYXNzIENT
U1J1bGVMaXN0OworICAgIGNsYXNzIENTU1ZhbHVlTGlzdDsKKyAgICBjbGFzcyBOb2RlRmlsdGVy
OworICAgIGNsYXNzIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ7CisKKyNpZiBFTkFCTEUoRE9NX1NU
T1JBR0UpCisgICAgY2xhc3MgU3RvcmFnZTsKKyAgICBjbGFzcyBTdG9yYWdlRXZlbnQ7CisjZW5k
aWYKKworICNpZiBFTkFCTEUoU1ZHKQorICAgIGNsYXNzIFNWR0VsZW1lbnRJbnN0YW5jZTsKKyAj
ZW5kaWYKKworICAgIGNsYXNzIFY4RXZlbnRMaXN0ZW5lcjsKKyAgICBjbGFzcyBWOE9iamVjdEV2
ZW50TGlzdGVuZXI7CisKKyAgICAvLyBGSVhNRTogdXNlIHN0YW5kYXJkIGxvZ2dpbmcgZmFjaWxp
dGllcyBpbiBXZWJDb3JlLgorICAgIHZvaWQgbG9nSW5mbyhGcmFtZSogZnJhbWUsIGNvbnN0IFN0
cmluZyYgbXNnLCBjb25zdCBTdHJpbmcmIHVybCk7CisKKyNpZm5kZWYgTkRFQlVHCisKKyNkZWZp
bmUgR2xvYmFsSGFuZGxlVHlwZUxpc3QoVikgICBcCisgICAgVihQUk9YWSkgICAgICAgICAgICAg
ICAgICAgICAgXAorICAgIFYoTlBPQkpFQ1QpICAgICAgICAgICAgICAgICAgIFwKKyAgICBWKFND
SEVEVUxFRF9BQ1RJT04pICAgICAgICAgICBcCisgICAgVihFVkVOVF9MSVNURU5FUikgICAgICAg
ICAgICAgXAorICAgIFYoTk9ERV9GSUxURVIpICAgICAgICAgICAgICAgIFwKKyAgICBWKFNDUklQ
VElOU1RBTkNFKSAgICAgICAgICAgICBcCisgICAgVihTQ1JJUFRWQUxVRSkKKworCisgICAgLy8g
SG9zdCBpbmZvcm1hdGlvbiBvZiBwZXJzaXN0ZW50IGhhbmRsZXMuCisgICAgZW51bSBHbG9iYWxI
YW5kbGVUeXBlIHsKKyNkZWZpbmUgRU5VTShuYW1lKSBuYW1lLAorICAgICAgICBHbG9iYWxIYW5k
bGVUeXBlTGlzdChFTlVNKQorI3VuZGVmIEVOVU0KKyAgICB9OworCisKKyAgICBjbGFzcyBHbG9i
YWxIYW5kbGVJbmZvIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEdsb2JhbEhhbmRsZUluZm8odm9p
ZCogaG9zdCwgR2xvYmFsSGFuZGxlVHlwZSB0eXBlKSA6IGhvc3RfKGhvc3QpLCB0eXBlXyh0eXBl
KSB7IH0KKyAgICAgICAgdm9pZCogaG9zdF87CisgICAgICAgIEdsb2JhbEhhbmRsZVR5cGUgdHlw
ZV87CisgICAgfTsKKworI2VuZGlmICAvLyBOREVCVUcKKworICAgIC8vIFRoZSBmb2xsb3dpbmcg
QmF0Y2ggc3RydWN0cyBhbmQgbWV0aG9kcyBhcmUgdXNlZCBmb3Igc2V0dGluZyBtdWx0aXBsZQor
ICAgIC8vIHByb3BlcnRpZXMgb24gYW4gT2JqZWN0VGVtcGxhdGUsIHVzZWQgZnJvbSB0aGUgZ2Vu
ZXJhdGVkIGJpbmRpbmdzCisgICAgLy8gaW5pdGlhbGl6YXRpb24gKENvbmZpZ3VyZVhYWFRlbXBs
YXRlKS4gIFRoaXMgZ3JlYXRseSByZWR1Y2VzIHRoZSBiaW5hcnkKKyAgICAvLyBzaXplIGJ5IG1v
dmluZyBmcm9tIGNvZGUgZHJpdmVuIHNldHVwIHRvIGRhdGEgdGFibGUgZHJpdmVuIHNldHVwLgor
CisgICAgLy8gQmF0Y2hlZEF0dHJpYnV0ZSB0cmFuc2xhdGVzIGludG8gY2FsbHMgdG8gU2V0QWNj
ZXNzb3IoKSBvbiBlaXRoZXIgdGhlCisgICAgLy8gaW5zdGFuY2Ugb3IgdGhlIHByb3RvdHlwZSBP
YmplY3RUZW1wbGF0ZSwgYmFzZWQgb24gfG9uUHJvdG98LgorICAgIHN0cnVjdCBCYXRjaGVkQXR0
cmlidXRlIHsKKyAgICAgICAgY29uc3QgY2hhciogY29uc3QgbmFtZTsKKyAgICAgICAgdjg6OkFj
Y2Vzc29yR2V0dGVyIGdldHRlcjsKKyAgICAgICAgdjg6OkFjY2Vzc29yU2V0dGVyIHNldHRlcjsK
KyAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIGRhdGE7CisgICAgICAgIHY4OjpB
Y2Nlc3NDb250cm9sIHNldHRpbmdzOworICAgICAgICB2ODo6UHJvcGVydHlBdHRyaWJ1dGUgYXR0
cmlidXRlOworICAgICAgICBib29sIG9uUHJvdG87CisgICAgfTsKKworICAgIHZvaWQgYmF0Y2hD
b25maWd1cmVBdHRyaWJ1dGVzKHY4OjpIYW5kbGU8djg6Ok9iamVjdFRlbXBsYXRlPiwgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+LCBjb25zdCBCYXRjaGVkQXR0cmlidXRlKiwgc2l6ZV90
IGF0dHJpYnV0ZUNvdW50KTsKKworICAgIC8vIEJhdGNoZWRDb25zdGFudCB0cmFuc2xhdGVzIGlu
dG8gY2FsbHMgdG8gU2V0KCkgZm9yIHNldHRpbmcgdXAgYW4gb2JqZWN0J3MKKyAgICAvLyBjb25z
dGFudHMuICBJdCBzZXRzIHRoZSBjb25zdGFudCBvbiBib3RoIHRoZSBGdW5jdGlvblRlbXBsYXRl
IGFuZCB0aGUKKyAgICAvLyBPYmplY3RUZW1wbGF0ZS4gIFByb3BlcnR5QXR0cmlidXRlcyBpcyBh
bHdheXMgUmVhZE9ubHkuCisgICAgc3RydWN0IEJhdGNoZWRDb25zdGFudCB7CisgICAgICAgIGNv
bnN0IGNoYXIqIGNvbnN0IG5hbWU7CisgICAgICAgIGludCB2YWx1ZTsKKyAgICB9OworCisgICAg
dm9pZCBiYXRjaENvbmZpZ3VyZUNvbnN0YW50cyh2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBs
YXRlPiwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+LCBjb25zdCBCYXRjaGVkQ29uc3Rh
bnQqLCBzaXplX3QgY29uc3RhbnRDb3VudCk7CisKKyAgICBjb25zdCBpbnQga01heFJlY3Vyc2lv
bkRlcHRoID0gMjA7CisKKyAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhbiBleHRlbnNpb24gdGhh
dCBpcyByZWdpc3RlcmVkIGZvciB1c2Ugd2l0aCBWOC4gSWYgc2NoZW1lCisgICAgLy8gaXMgbm9u
LWVtcHR5LCBpdCBjb250YWlucyB0aGUgVVJMIHNjaGVtZSB0aGUgZXh0ZW5zaW9uIHNob3VsZCBi
ZSB1c2VkIHdpdGguCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgZXh0ZW5zaW9uIGlzIHVzZWQgd2l0
aCBhbGwgc2NoZW1lcy4KKyAgICBzdHJ1Y3QgVjhFeHRlbnNpb25JbmZvIHsKKyAgICAgICAgU3Ry
aW5nIHNjaGVtZTsKKyAgICAgICAgdjg6OkV4dGVuc2lvbiogZXh0ZW5zaW9uOworICAgIH07Cisg
ICAgdHlwZWRlZiBzdGQ6Omxpc3Q8VjhFeHRlbnNpb25JbmZvPiBWOEV4dGVuc2lvbkxpc3Q7CisK
KyAgICBjbGFzcyBWOFByb3h5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8vIFRoZSB0eXBlcyBv
ZiBqYXZhc2NyaXB0IGVycm9ycyB0aGF0IGNhbiBiZSB0aHJvd24uCisgICAgICAgIGVudW0gRXJy
b3JUeXBlIHsKKyAgICAgICAgICAgIFJBTkdFX0VSUk9SLAorICAgICAgICAgICAgUkVGRVJFTkNF
X0VSUk9SLAorICAgICAgICAgICAgU1lOVEFYX0VSUk9SLAorICAgICAgICAgICAgVFlQRV9FUlJP
UiwKKyAgICAgICAgICAgIEdFTkVSQUxfRVJST1IKKyAgICAgICAgfTsKKworICAgICAgICBleHBs
aWNpdCBWOFByb3h5KEZyYW1lKiBmcmFtZSkgOiBtX2ZyYW1lKGZyYW1lKSwgbV9pbmxpbmVDb2Rl
KGZhbHNlKSwgbV90aW1lckNhbGxiYWNrKGZhbHNlKSwgbV9yZWN1cnNpb24oMCkgeyB9CisKKyAg
ICAgICAgflY4UHJveHkoKTsKKworICAgICAgICBGcmFtZSogZnJhbWUoKSB7IHJldHVybiBtX2Zy
YW1lOyB9CisKKyAgICAgICAgLy8gQ2xlYXIgcGFnZS1zcGVjaWZpYyBkYXRhLCBidXQga2VlcCB0
aGUgZ2xvYmFsIG9iamVjdCBpZGVudGlmeS4KKyAgICAgICAgdm9pZCBjbGVhckZvck5hdmlnYXRp
b24oKTsKKworICAgICAgICAvLyBDbGVhciBwYWdlLXNwZWNpZmljIGRhdGEgYmVmb3JlIHNodXR0
aW5nIGRvd24gdGhlIHByb3h5IG9iamVjdC4KKyAgICAgICAgdm9pZCBjbGVhckZvckNsb3NlKCk7
CisKKyAgICAgICAgLy8gVXBkYXRlIGRvY3VtZW50IG9iamVjdCBvZiB0aGUgZnJhbWUuCisgICAg
ICAgIHZvaWQgdXBkYXRlRG9jdW1lbnQoKTsKKworICAgICAgICAvLyBVcGRhdGUgdGhlIHNlY3Vy
aXR5IG9yaWdpbiBvZiBhIGRvY3VtZW50CisgICAgICAgIC8vIChlLmcuLCBhZnRlciBzZXR0aW5n
IGRvY291bWVudC5kb21haW4pLgorICAgICAgICB2b2lkIHVwZGF0ZVNlY3VyaXR5T3JpZ2luKCk7
CisKKyAgICAgICAgLy8gRGVzdHJveSB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgdm9pZCBk
ZXN0cm95R2xvYmFsKCk7CisKKyAgICAgICAgLy8gRklYTUU6IE5lZWQgY29tbWVudC4gIFVzZXIg
R2VzdHVyZSByZWxhdGVkLgorICAgICAgICBib29sIGlubGluZUNvZGUoKSBjb25zdCB7IHJldHVy
biBtX2lubGluZUNvZGU7IH0KKyAgICAgICAgdm9pZCBzZXRJbmxpbmVDb2RlKGJvb2wgdmFsdWUp
IHsgbV9pbmxpbmVDb2RlID0gdmFsdWU7IH0KKworICAgICAgICBib29sIHRpbWVyQ2FsbGJhY2so
KSBjb25zdCB7IHJldHVybiBtX3RpbWVyQ2FsbGJhY2s7IH0KKyAgICAgICAgdm9pZCBzZXRUaW1l
ckNhbGxiYWNrKGJvb2wgdmFsdWUpIHsgbV90aW1lckNhbGxiYWNrID0gdmFsdWU7IH0KKworICAg
ICAgICAvLyBIYXMgdGhlIGNvbnRleHQgZm9yIHRoaXMgcHJveHkgYmVlbiBpbml0aWFsaXplZD8K
KyAgICAgICAgYm9vbCBpc0NvbnRleHRJbml0aWFsaXplZCgpOworCisgICAgICAgIC8vIERpc2Nv
bm5lY3RzIHRoZSBwcm94eSBmcm9tIGl0cyBvd25lciBmcmFtZSwKKyAgICAgICAgLy8gYW5kIGNs
ZWFycyBhbGwgdGltZW91dHMgb24gdGhlIERPTSB3aW5kb3cuCisgICAgICAgIHZvaWQgZGlzY29u
bmVjdEZyYW1lKCk7CisKKyAgICAgICAgYm9vbCBpc0VuYWJsZWQoKTsKKworICAgICAgICAvLyBG
aW5kL0NyZWF0ZS9SZW1vdmUgZXZlbnQgbGlzdGVuZXIgd3JhcHBlcnMuCisgICAgICAgIFBhc3NS
ZWZQdHI8VjhFdmVudExpc3RlbmVyPiBmaW5kVjhFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6
VmFsdWU+IGxpc3RlbmVyLCBib29sIGlzSHRtbCk7CisgICAgICAgIFBhc3NSZWZQdHI8VjhFdmVu
dExpc3RlbmVyPiBmaW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1
ZT4gbGlzdGVuZXIsIGJvb2wgaXNIdG1sKTsKKworICAgICAgICBQYXNzUmVmUHRyPFY4RXZlbnRM
aXN0ZW5lcj4gZmluZE9iamVjdEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1ZT4gbGlz
dGVuZXIsIGJvb2wgaXNIdG1sKTsKKyAgICAgICAgUGFzc1JlZlB0cjxWOEV2ZW50TGlzdGVuZXI+
IGZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1ZT4gbGlz
dGVuZXIsIGJvb2wgaXNIdG1sKTsKKworICAgICAgICB2b2lkIHJlbW92ZVY4RXZlbnRMaXN0ZW5l
cihWOEV2ZW50TGlzdGVuZXIqKTsKKyAgICAgICAgdm9pZCByZW1vdmVPYmplY3RFdmVudExpc3Rl
bmVyKFY4T2JqZWN0RXZlbnRMaXN0ZW5lciopOworCisgICAgICAgIC8vIFByb3RlY3QvVW5wcm90
ZWN0IEpTIHdyYXBwZXJzIG9mIGEgRE9NIG9iamVjdC4KKyAgICAgICAgc3RhdGljIHZvaWQgZ2NQ
cm90ZWN0KHZvaWQqIGRvbU9iamVjdCk7CisgICAgICAgIHN0YXRpYyB2b2lkIGdjVW5wcm90ZWN0
KHZvaWQqIGRvbU9iamVjdCk7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBzdGF0aWMgdm9p
ZCBzZXRTVkdDb250ZXh0KHZvaWQqLCBTVkdFbGVtZW50Kik7CisgICAgICAgIHN0YXRpYyBTVkdF
bGVtZW50KiBzdmdDb250ZXh0KHZvaWQqKTsKKyNlbmRpZgorCisgICAgICAgIHZvaWQgc2V0RXZl
bnRIYW5kbGVyTGluZU51bWJlcihpbnQgbGluZU51bWJlcikgeyBtX2hhbmRsZXJMaW5lbm8gPSBs
aW5lTnVtYmVyOyB9CisgICAgICAgIHZvaWQgZmluaXNoZWRXaXRoRXZlbnQoRXZlbnQqIGV2ZW50
KSB7IH0KKworICAgICAgICAvLyBFdmFsdWF0ZSBKYXZhU2NyaXB0IGluIGEgbmV3IGNvbnRleHQu
IFRoZSBzY3JpcHQgZ2V0cyBpdHMgb3duIGdsb2JhbCBzY29wZQorICAgICAgICAvLyBhbmQgaXRz
IG93biBwcm90b3R5cGVzIGZvciBpbnRyaW5zaWMgSmF2YVNjcmlwdCBvYmplY3RzIChTdHJpbmcs
IEFycmF5LAorICAgICAgICAvLyBhbmQgc28tb24pLiBJdCBzaGFyZXMgdGhlIHdyYXBwZXJzIGZv
ciBhbGwgRE9NIG5vZGVzIGFuZCBET00gY29uc3RydWN0b3JzLgorICAgICAgICB2b2lkIGV2YWx1
YXRlSW5OZXdDb250ZXh0KGNvbnN0IFZlY3RvcjxTY3JpcHRTb3VyY2VDb2RlPiYpOworCisgICAg
ICAgIC8vIEV2YWx1YXRlIGEgc2NyaXB0IGZpbGUgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVu
dmlyb25tZW50LgorICAgICAgICAvLyBUaGUgY2FsbGVyIG11c3QgaG9sZCBhbiBleGVjdXRpb24g
Y29udGV4dC4KKyAgICAgICAgLy8gSWYgY2Fubm90IGV2YWx1dGUgdGhlIHNjcmlwdCwgaXQgcmV0
dXJucyBhbiBlcnJvci4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gZXZhbHVhdGUoY29u
c3QgU2NyaXB0U291cmNlQ29kZSYsIE5vZGUqKTsKKworICAgICAgICAvLyBSdW4gYW4gYWxyZWFk
eSBjb21waWxlZCBzY3JpcHQuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJ1blNjcmlw
dCh2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+LCBib29sIGlzSW5saW5lQ29kZSk7CisKKyAgICAgICAg
Ly8gQ2FsbCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcmVjZWl2ZXIgYW5kIGFyZ3VtZW50
cy4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gY2FsbEZ1bmN0aW9uKHY4OjpIYW5kbGU8
djg6OkZ1bmN0aW9uPiwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiwgaW50IGFyZ2MsIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBhcmd2W10pOworCisgICAgICAgIC8vIENhbGwgdGhlIGZ1bmN0aW9uIGFz
IGNvbnN0cnVjdG9yIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgICAgICAgdjg6OkxvY2Fs
PHY4OjpWYWx1ZT4gbmV3SW5zdGFuY2Uodjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+LCBpbnQgYXJn
Yywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZ3ZbXSk7CisKKyAgICAgICAgLy8gUmV0dXJucyB0
aGUgZG9tIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gbm9kZSB0eXBlLgorICAg
ICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBnZXRDb25zdHJ1Y3RvcihWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUpOworCisgICAgICAgIC8vIFRvIGNyZWF0ZSBKUyBXcmFwcGVyIG9iamVj
dHMsIHdlIGNyZWF0ZSBhIGNhY2hlIG9mIGEgJ2JvaWxlciBwbGF0ZScKKyAgICAgICAgLy8gb2Jq
ZWN0LCBhbmQgdGhlbiBzaW1wbHkgQ2xvbmUgdGhhdCBvYmplY3QgZWFjaCB0aW1lIHdlIG5lZWQg
YSBuZXcgb25lLgorICAgICAgICAvLyBUaGlzIGlzIGZhc3RlciB0aGFuIGdvaW5nIHRocm91Z2gg
dGhlIGZ1bGwgb2JqZWN0IGNyZWF0aW9uIHByb2Nlc3MuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6
T2JqZWN0PiBjcmVhdGVXcmFwcGVyRnJvbUNhY2hlKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlw
ZSk7CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgd2luZG93IG9iamVjdCBvZiB0aGUgY3VycmVu
dGx5IGV4ZWN1dGluZyBjb250ZXh0LgorICAgICAgICBzdGF0aWMgRE9NV2luZG93KiByZXRyaWV2
ZVdpbmRvdygpOworICAgICAgICAvLyBSZXR1cm5zIHRoZSB3aW5kb3cgb2JqZWN0IGFzc29jaWF0
ZWQgd2l0aCBhIGNvbnRleHQuCisgICAgICAgIHN0YXRpYyBET01XaW5kb3cqIHJldHJpZXZlV2lu
ZG93KHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+KTsKKyAgICAgICAgLy8gUmV0dXJucyBWOFByb3h5
IG9iamVjdCBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBjb250ZXh0LgorICAgICAgICBzdGF0
aWMgVjhQcm94eSogcmV0cmlldmUoKTsKKyAgICAgICAgLy8gUmV0dXJucyBWOFByb3h5IG9iamVj
dCBhc3NvY2lhdGVkIHdpdGggYSBmcmFtZS4KKyAgICAgICAgc3RhdGljIFY4UHJveHkqIHJldHJp
ZXZlKEZyYW1lKik7CisgICAgICAgIC8vIFJldHVybnMgVjhQcm94eSBvYmplY3QgYXNzb2NpYXRl
ZCB3aXRoIGEgc2NyaXB0IGV4ZWN1dGlvbiBjb250ZXh0LgorICAgICAgICBzdGF0aWMgVjhQcm94
eSogcmV0cmlldmUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCopOworCisgICAgICAgIC8vIFJldHVy
bnMgdGhlIGZyYW1lIG9iamVjdCBvZiB0aGUgd2luZG93IG9iamVjdCBhc3NvY2lhdGVkCisgICAg
ICAgIC8vIHdpdGggdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgY29udGV4dC4KKyAgICAgICAgc3Rh
dGljIEZyYW1lKiByZXRyaWV2ZUZyYW1lKCk7CisgICAgICAgIC8vIFJldHVybnMgdGhlIGZyYW1l
IG9iamVjdCBvZiB0aGUgd2luZG93IG9iamVjdCBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgLy8g
YSBjb250ZXh0LgorICAgICAgICBzdGF0aWMgRnJhbWUqIHJldHJpZXZlRnJhbWUodjg6OkhhbmRs
ZTx2ODo6Q29udGV4dD4pOworCisKKyAgICAgICAgLy8gVGhlIHRocmVlIGZ1bmN0aW9ucyBiZWxv
dyByZXRyaWV2ZSBXZWJGcmFtZSBpbnN0YW5jZXMgcmVsYXRpbmcgdGhlCisgICAgICAgIC8vIGN1
cnJlbnRseSBleGVjdXRpbmcgSmF2YVNjcmlwdC4gU2luY2UgSmF2YVNjcmlwdCBjYW4gbWFrZSBm
dW5jdGlvbiBjYWxscworICAgICAgICAvLyBhY3Jvc3MgZnJhbWVzLCB0aG91Z2gsIHdlIG5lZWQg
dG8gYmUgbW9yZSBwcmVjaXNlLgorICAgICAgICAvLworICAgICAgICAvLyBGb3IgZXhhbXBsZSwg
aW1hZ2luZSB0aGF0IGEgSlMgZnVuY3Rpb24gaW4gZnJhbWUgQSBjYWxscyBhIGZ1bmN0aW9uIGlu
CisgICAgICAgIC8vIGZyYW1lIEIsIHdoaWNoIGNhbGxzIG5hdGl2ZSBjb2RlLCB3aGljaCB3YW50
cyB0byBrbm93IHdoYXQgdGhlICdhY3RpdmUnCisgICAgICAgIC8vIGZyYW1lIGlzLgorICAgICAg
ICAvLworICAgICAgICAvLyBUaGUgJ2VudGVyZWQgY29udGV4dCcgaXMgdGhlIGNvbnRleHQgd2hl
cmUgZXhlY3V0aW9uIGZpcnN0IGVudGVyZWQgdGhlCisgICAgICAgIC8vIHNjcmlwdCBlbmdpbmU7
IHRoZSBjb250ZXh0IHRoYXQgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgSlMgZnVuY3Rpb24gc3Rh
Y2suCisgICAgICAgIC8vIFJldHJpZXZlRnJhbWVGb3JFbnRlcmVkQ29udGV4dCgpIHdvdWxkIHJl
dHVybiBGcmFtZSBBIGluIG91ciBleGFtcGxlLgorICAgICAgICAvLyBUaGlzIGZyYW1lIGlzIG9m
dGVuIHJlZmVycmVkIHRvIGFzIHRoZSAiZHluYW1pYyBnbG9iYWwgb2JqZWN0LiIKKyAgICAgICAg
Ly8KKyAgICAgICAgLy8gVGhlICdjdXJyZW50IGNvbnRleHQnIGlzIHRoZSBjb250ZXh0IHRoZSBK
UyBlbmdpbmUgaXMgY3VycmVudGx5IGluc2lkZSBvZjsKKyAgICAgICAgLy8gdGhlIGNvbnRleHQg
dGhhdCBpcyBhdCB0aGUgdG9wIG9mIHRoZSBKUyBmdW5jdGlvbiBzdGFjay4KKyAgICAgICAgLy8g
UmV0cmlldmVGcmFtZUZvckN1cnJlbnRDb250ZXh0KCkgd291bGQgcmV0dXJuIEZyYW1lIEIgaW4g
b3VyIGV4YW1wbGUuCisgICAgICAgIC8vIFRoaXMgZnJhbWUgaXMgb2Z0ZW4gcmVmZXJyZWQgdG8g
YXMgdGhlICJsZXhpY2FsIGdsb2JhbCBvYmplY3QuIgorICAgICAgICAvLworICAgICAgICAvLyBG
aW5hbGx5LCB0aGUgJ2NhbGxpbmcgY29udGV4dCcgaXMgdGhlIGNvbnRleHQgb25lIGJlbG93IHRo
ZSBjdXJyZW50CisgICAgICAgIC8vIGNvbnRleHQgb24gdGhlIEpTIGZ1bmN0aW9uIHN0YWNrLiAg
Rm9yIGV4YW1wbGUsIGlmIGZ1bmN0aW9uIGYgY2FsbHMKKyAgICAgICAgLy8gZnVuY3Rpb24gZywg
dGhlbiB0aGUgY2FsbGluZyBjb250ZXh0IHdpbGwgYmUgdGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3
aXRoCisgICAgICAgIC8vIGYuICBUaGlzIGNvbnRleHQgaXMgY29tbW9ubHkgdXNlZCBieSBET00g
c2VjdXJpdHkgY2hlY2tzIGJlY2F1c2UgdGhleSB3YW50CisgICAgICAgIC8vIHRvIGtub3cgd2hv
IGNhbGxlZCB0aGVtLgorICAgICAgICAvLworICAgICAgICAvLyBJZiB5b3UgYXJlIHVuc3VyZSB3
aGljaCBvZiB0aGVzZSBmdW5jdGlvbnMgdG8gdXNlLCBhc2sgYWJhcnRoLgorICAgICAgICAvLwor
ICAgICAgICAvLyBOT1RFOiBUaGVzZSBjYW5ub3QgYmUgZGVjbGFyZWQgYXMgaW5saW5lIGZ1bmN0
aW9uLCBiZWNhdXNlIFZTIGNvbXBsYWlucyBhdAorICAgICAgICAvLyBsaW5raW5nIHRpbWUuCisg
ICAgICAgIHN0YXRpYyBGcmFtZSogcmV0cmlldmVGcmFtZUZvckVudGVyZWRDb250ZXh0KCk7Cisg
ICAgICAgIHN0YXRpYyBGcmFtZSogcmV0cmlldmVGcmFtZUZvckN1cnJlbnRDb250ZXh0KCk7Cisg
ICAgICAgIHN0YXRpYyBGcmFtZSogcmV0cmlldmVGcmFtZUZvckNhbGxpbmdDb250ZXh0KCk7CisK
KyAgICAgICAgLy8gUmV0dXJucyBWOCBDb250ZXh0IG9mIGEgZnJhbWUuIElmIG5vbmUgZXhpc3Rz
LCBjcmVhdGVzCisgICAgICAgIC8vIGEgbmV3IGNvbnRleHQuICBJdCBpcyBwb3RlbnRpYWxseSBz
bG93IGFuZCBjb25zdW1lcyBtZW1vcnkuCisgICAgICAgIHN0YXRpYyB2ODo6TG9jYWw8djg6OkNv
bnRleHQ+IGNvbnRleHQoRnJhbWUqKTsKKyAgICAgICAgc3RhdGljIHY4OjpMb2NhbDx2ODo6Q29u
dGV4dD4gY3VycmVudENvbnRleHQoKTsKKworICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBjb250
ZXh0IGNhdXNlcyBvdXQgb2YgbWVtb3J5LCBKYXZhU2NyaXB0IHNldHRpbmcKKyAgICAgICAgLy8g
aXMgZGlzYWJsZWQgYW5kIGl0IHJldHVybnMgdHJ1ZS4KKyAgICAgICAgc3RhdGljIGJvb2wgaGFu
ZGxlT3V0T2ZNZW1vcnkoKTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aXZlIGV4ZWN1
dGlvbiBjb250ZXh0IGNhbiBhY2Nlc3MgdGhlIHRhcmdldCBmcmFtZS4KKyAgICAgICAgc3RhdGlj
IGJvb2wgY2FuQWNjZXNzRnJhbWUoRnJhbWUqLCBib29sIHJlcG9ydEVycm9yKTsKKworICAgICAg
ICAvLyBDaGVjayBpZiBpdCBpcyBzYWZlIHRvIGFjY2VzcyB0aGUgZ2l2ZW4gbm9kZSBmcm9tIHRo
ZQorICAgICAgICAvLyBjdXJyZW50IHNlY3VyaXR5IGNvbnRleHQuCisgICAgICAgIHN0YXRpYyBi
b29sIGNoZWNrTm9kZVNlY3VyaXR5KE5vZGUqKTsKKworICAgICAgICBzdGF0aWMgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IGNoZWNrTmV3TGVnYWwoY29uc3Qgdjg6OkFyZ3VtZW50cyYpOworCisgICAg
ICAgIC8vIENyZWF0ZSBhIFY4IHdyYXBwZXIgZm9yIGEgQyBwb2ludGVyCisgICAgICAgIHN0YXRp
YyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcENQb2ludGVyKHZvaWQqIGNwdHIpCisgICAgICAg
IHsKKyAgICAgICAgICAgIC8vIFJlcHJlc2VudCB2b2lkKiBhcyBpbnQKKyAgICAgICAgICAgIGlu
dCBhZGRyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQ+KGNwdHIpOworICAgICAgICAgICAgQVNTRVJU
KCEoYWRkciAmIDB4MDEpKTsgIC8vIHRoZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZC4KKyAgICAg
ICAgICAgIHJldHVybiB2ODo6SW50ZWdlcjo6TmV3KGFkZHIgPj4gMSk7CisgICAgICAgIH0KKwor
ICAgICAgICAvLyBUYWtlIEMgcG9pbnRlciBvdXQgb2YgYSB2OCB3cmFwcGVyCisgICAgICAgIHRl
bXBsYXRlIDxjbGFzcyBDPgorICAgICAgICBzdGF0aWMgQyogZXh0cmFjdENQb2ludGVyKHY4OjpI
YW5kbGU8djg6OlZhbHVlPiBvYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxDKj4oZXh0cmFjdENQb2ludGVySW1wbChvYmopKTsKKyAgICAgICAgfQorCisgICAg
ICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IGNvbXBpbGVTY3JpcHQodjg6OkhhbmRs
ZTx2ODo6U3RyaW5nPiBjb2RlLCBjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBpbnQgYmFzZUxpbmUp
OworCisjaWZuZGVmIE5ERUJVRworICAgICAgICAvLyBDaGVja3MgaWYgYSB2OCB2YWx1ZSBjYW4g
YmUgYSBET00gd3JhcHBlcgorICAgICAgICBzdGF0aWMgYm9vbCBtYXliZURPTVdyYXBwZXIodjg6
OkhhbmRsZTx2ODo6VmFsdWU+KTsKKyNlbmRpZgorCisgICAgICAgIC8vIFNldHMgY29udGVudHMg
b2YgYSBET00gd3JhcHBlci4KKyAgICAgICAgc3RhdGljIHZvaWQgc2V0RE9NV3JhcHBlcih2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+LCBpbnQgdHlwZSwgdm9pZCogcHRyKTsKKworICAgICAgICBzdGF0
aWMgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6
VjhXcmFwcGVyVHlwZSwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KTsKKworICAgICAgICAvLyBBIGhl
bHBlciBmdW5jdGlvbiBleHRyYWN0IG5hdGl2ZSBvYmplY3QgcG9pbnRlciBmcm9tIGEgRE9NIHdy
YXBwZXIKKyAgICAgICAgLy8gYW5kIGNhc3QgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAg
ICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KKyAgICAgICAgc3RhdGljIEMqIGNvbnZlcnRET01XcmFwcGVy
VG9OYXRpdmUodjg6OkhhbmRsZTx2ODo6VmFsdWU+IG9iamVjdCkKKyAgICAgICAgeworICAgICAg
ICAgICAgQVNTRVJUKG1heWJlRE9NV3JhcHBlcihvYmplY3QpKTsKKyAgICAgICAgICAgIHY4OjpI
YW5kbGU8djg6OlZhbHVlPiBwdHIgPSB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KG9iamVj
dCktPkdldEludGVybmFsRmllbGQoVjhDdXN0b206OmtET01XcmFwcGVyT2JqZWN0SW5kZXgpOwor
ICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RDUG9pbnRlcjxDPihwdHIpOworICAgICAgICB9CisK
KyAgICAgICAgLy8gQSBoZWxwIGZ1bmN0aW9uIGV4dHJhY3QgYSBub2RlIHR5cGUgcG9pbnRlciBm
cm9tIGEgRE9NIHdyYXBwZXIuCisgICAgICAgIC8vIFdyYXBwZWQgcG9pbnRlciBtdXN0IGJlIGNh
c3QgdG8gTm9kZSogZmlyc3QuCisgICAgICAgIHN0YXRpYyB2b2lkKiBjb252ZXJ0RE9NV3JhcHBl
clRvTm9kZUhlbHBlcih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4pOworCisgICAgICAgIHRlbXBsYXRl
IDxjbGFzcyBDPgorICAgICAgICBzdGF0aWMgQyogY29udmVydERPTVdyYXBwZXJUb05vZGUodjg6
OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8Qyo+KGNvbnZlcnRET01XcmFwcGVyVG9Ob2RlSGVscGVyKHZhbHVlKSk7Cisg
ICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhX
cmFwcGVyVHlwZSB0eXBlLCBQYXNzUmVmUHRyPFQ+IGltcCkKKyAgICAgICAgeworICAgICAgICAg
IHJldHVybiBjb252ZXJ0VG9WOE9iamVjdCh0eXBlLCBpbXAuZ2V0KCkpOworICAgICAgICB9CisK
KyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252ZXJ0VG9WOE9iamVjdChW
OENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUsIHZvaWQqKTsKKworICAgICAgICAvLyBGYXN0LXBh
dGggZm9yIE5vZGUgb2JqZWN0cy4KKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiBjb252ZXJ0Tm9kZVRvVjhPYmplY3QoTm9kZSopOworCisgICAgICAgIHRlbXBsYXRlIDxjbGFz
cyBDPgorICAgICAgICBzdGF0aWMgQyogY29udmVydFRvTmF0aXZlT2JqZWN0KFY4Q2xhc3NJbmRl
eDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gb2JqZWN0KQorICAg
ICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Qyo+KGNvbnZlcnRUb05hdGl2
ZU9iamVjdEltcGwodHlwZSwgb2JqZWN0KSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMg
VjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIGRvbVdyYXBwZXJUeXBlKHY4OjpIYW5kbGU8djg6
Ok9iamVjdD4pOworCisgICAgICAgIC8vIElmIHRoZSBleGNlcHRpb24gY29kZSBpcyBkaWZmZXJl
bnQgZnJvbSB6ZXJvLCBhIERPTSBleGNlcHRpb24gaXMKKyAgICAgICAgLy8gc2NoZWR1bGUgdG8g
YmUgdGhyb3duLgorICAgICAgICBzdGF0aWMgdm9pZCBzZXRET01FeGNlcHRpb24oaW50IGV4Y2Vw
dGlvbkNvZGUpOworCisgICAgICAgIC8vIFNjaGVkdWxlIGFuIGVycm9yIG9iamVjdCB0byBiZSB0
aHJvd24uCisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdGhyb3dFcnJvcihF
cnJvclR5cGUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworCisgICAgICAgIC8vIENyZWF0ZSBhbiBp
bnN0YW5jZSBvZiBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IgYW5kIHNldCB0byB0aGUgZ2xvYmFsIG9i
amVjdAorICAgICAgICAvLyBhcyBhIG5hbWVkIHByb3BlcnR5LiBVc2VkIGJ5IHY4X3Rlc3Rfc2hl
bGwuCisgICAgICAgIHN0YXRpYyB2b2lkIGJpbmRKc09iamVjdFRvV2luZG93KEZyYW1lKiwgY29u
c3QgY2hhciogbmFtZSwgaW50IHR5cGUsIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+
LCB2b2lkKik7CisKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252ZXJ0
RXZlbnRUb1Y4T2JqZWN0KEV2ZW50Kik7CisKKyAgICAgICAgc3RhdGljIEV2ZW50KiBjb252ZXJ0
VG9OYXRpdmVFdmVudCh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4ganNFdmVudCkKKyAgICAgICAgewor
ICAgICAgICAgICAgaWYgKCFpc0RPTUV2ZW50V3JhcHBlcihqc0V2ZW50KSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0RE9NV3JhcHBlclRvTmF0
aXZlPEV2ZW50Pihqc0V2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gY29udmVydEV2ZW50VGFyZ2V0VG9WOE9iamVjdChFdmVudFRhcmdldCop
OworICAgICAgICAvLyBXcmFwIGFuZCB1bndyYXAgSlMgZXZlbnQgbGlzdGVuZXJzCisgICAgICAg
IHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVydEV2ZW50TGlzdGVuZXJUb1Y4T2Jq
ZWN0KEV2ZW50TGlzdGVuZXIqKTsKKworICAgICAgICAvLyBET01JbXBsZW1lbnRhdGlvbiBpcyBh
IHNpbmdsZXRvbiBhbmQgaXQgaXMgaGFuZGxlZCBpbiBhIHNwZWNpYWwKKyAgICAgICAgLy8gd2F5
LiAgQSB3cmFwcGVyIGlzIGdlbmVyYXRlZCBwZXIgZG9jdW1lbnQgYW5kIHN0b3JlZCBpbiBhbgor
ICAgICAgICAvLyBpbnRlcm5hbCBmaWVsZCBvZiB0aGUgZG9jdW1lbnQuCisgICAgICAgIHN0YXRp
YyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVydERPTUltcGxlbWVudGF0aW9uVG9WOE9iamVj
dChET01JbXBsZW1lbnRhdGlvbiopOworCisgICAgICAgIC8vIFdyYXAgSlMgbm9kZSBmaWx0ZXIg
aW4gQysrCisgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPE5vZGVGaWx0ZXI+IHdyYXBOYXRpdmVO
b2RlRmlsdGVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPik7CisKKyAgICAgICAgc3RhdGljIHY4OjpQ
ZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBnZXRUZW1wbGF0ZShWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUpOworCisgICAgICAgIHRlbXBsYXRlIDxpbnQgdGFnLCB0eXBlbmFtZSBU
PgorICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnN0cnVjdERPTU9iamVj
dChjb25zdCB2ODo6QXJndW1lbnRzJik7CisKKyAgICAgICAgLy8gQ2hlY2tzIHdoZXRoZXIgYSBE
T00gb2JqZWN0IGhhcyBhIEpTIHdyYXBwZXIuCisgICAgICAgIHN0YXRpYyBib29sIGRvbU9iamVj
dEhhc0pTV3JhcHBlcih2b2lkKik7CisgICAgICAgIC8vIFNldCBKUyB3cmFwcGVyIG9mIGEgRE9N
IG9iamVjdCwgdGhlIGNhbGxlciBpbiBjaGFyZ2Ugb2YgaW5jcmVhc2UgcmVmLgorICAgICAgICBz
dGF0aWMgdm9pZCBzZXRKU1dyYXBwZXJGb3JET01PYmplY3Qodm9pZCosIHY4OjpQZXJzaXN0ZW50
PHY4OjpPYmplY3Q+KTsKKyAgICAgICAgc3RhdGljIHZvaWQgc2V0SlNXcmFwcGVyRm9yQWN0aXZl
RE9NT2JqZWN0KHZvaWQqLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pik7CisgICAgICAgIHN0
YXRpYyB2b2lkIHNldEpTV3JhcHBlckZvckRPTU5vZGUoTm9kZSosIHY4OjpQZXJzaXN0ZW50PHY4
OjpPYmplY3Q+KTsKKworICAgICAgICAvLyBQcm9jZXNzIGFueSBwZW5kaW5nIEphdmFTY3JpcHQg
Y29uc29sZSBtZXNzYWdlcy4KKyAgICAgICAgc3RhdGljIHZvaWQgcHJvY2Vzc0NvbnNvbGVNZXNz
YWdlcygpOworCisjaWZuZGVmIE5ERUJVRworICAgICAgICAvLyBGb3IgZGVidWdnaW5nIGFuZCBs
ZWFrIGRldGVjdGlvbiBwdXJwb3NlCisgICAgICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyR2xvYmFs
SGFuZGxlKEdsb2JhbEhhbmRsZVR5cGUsIHZvaWQqLCB2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+
KTsKKyAgICAgICAgc3RhdGljIHZvaWQgdW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh2b2lkKiwgdjg6
OlBlcnNpc3RlbnQ8djg6OlZhbHVlPik7CisjZW5kaWYKKworICAgICAgICAvLyBDaGVjayB3aGV0
aGVyIGEgVjggdmFsdWUgaXMgYSB3cmFwcGVyIG9mIHR5cGUgfGNsYXNzVHlwZXwuCisgICAgICAg
IHN0YXRpYyBib29sIGlzV3JhcHBlck9mVHlwZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4sIFY4Q2xh
c3NJbmRleDo6VjhXcmFwcGVyVHlwZSk7CisKKyAgICAgICAgLy8gRnVuY3Rpb24gZm9yIHJldHJp
ZXZpbmcgdGhlIGxpbmUgbnVtYmVyIGFuZCBzb3VyY2UgbmFtZSBmb3IgdGhlIHRvcAorICAgICAg
ICAvLyBKYXZhU2NyaXB0IHN0YWNrIGZyYW1lLgorICAgICAgICBzdGF0aWMgaW50IHNvdXJjZUxp
bmVOdW1iZXIoKTsKKyAgICAgICAgc3RhdGljIFN0cmluZyBzb3VyY2VOYW1lKCk7CisKKworICAg
ICAgICAvLyBSZXR1cm5zIGEgbG9jYWwgaGFuZGxlIG9mIHRoZSBjb250ZXh0LgorICAgICAgICB2
ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQoKQorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KG1fY29udGV4dCk7CisgICAgICAgIH0K
KworICAgICAgICBib29sIHNldENvbnRleHREZWJ1Z0lkKGludCBpZCk7CisgICAgICAgIHN0YXRp
YyBpbnQgY29udGV4dERlYnVnSWQodjg6OkhhbmRsZTx2ODo6Q29udGV4dD4pOworCisgICAgICAg
IC8vIFJlZ2lzdGVycyBhbiBleHRlbnNpb24gdG8gYmUgYXZhaWxhYmxlIG9uIHdlYnBhZ2VzIHdp
dGggYSBwYXJ0aWN1bGFyIHNjaGVtZQorICAgICAgICAvLyBJZiB0aGUgc2NoZW1lIGFyZ3VtZW50
IGlzIGVtcHR5LCB0aGUgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZSBvbiBhbGwgcGFnZXMuCisgICAg
ICAgIC8vIFdpbGwgb25seSBhZmZlY3QgdjggY29udGV4dHMgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhp
cyBjYWxsLiBUYWtlcyBvd25lcnNoaXAKKyAgICAgICAgLy8gb2YgdGhlIHY4OjpFeHRlbnNpb24g
b2JqZWN0IHBhc3NlZC4KKyAgICAgICAgc3RhdGljIHZvaWQgcmVnaXN0ZXJFeHRlbnNpb24odjg6
OkV4dGVuc2lvbiosIGNvbnN0IFN0cmluZyYgc2NoZW1lUmVzdHJpY3Rpb24pOworCisgICAgICAg
IHN0YXRpYyB2b2lkKiBjb252ZXJ0VG9TVkdQT0RUeXBlSW1wbChWOENsYXNzSW5kZXg6OlY4V3Jh
cHBlclR5cGUsIHY4OjpIYW5kbGU8djg6OlZhbHVlPik7CisKKyAgICBwcml2YXRlOgorICAgICAg
ICBzdGF0aWMgY29uc3QgY2hhcioga0NvbnRleHREZWJ1Z0RhdGFUeXBlOworICAgICAgICBzdGF0
aWMgY29uc3QgY2hhcioga0NvbnRleHREZWJ1Z0RhdGFWYWx1ZTsKKworICAgICAgICB2ODo6UGVy
c2lzdGVudDx2ODo6Q29udGV4dD4gY3JlYXRlTmV3Q29udGV4dCh2ODo6SGFuZGxlPHY4OjpPYmpl
Y3Q+IGdsb2JhbCk7CisgICAgICAgIHZvaWQgaW5pdENvbnRleHRJZk5lZWRlZCgpOworICAgICAg
ICB2b2lkIGRpc2Nvbm5lY3RFdmVudExpc3RlbmVycygpOworICAgICAgICB2b2lkIHNldFNlY3Vy
aXR5VG9rZW4oKTsKKyAgICAgICAgdm9pZCBjbGVhckRvY3VtZW50V3JhcHBlcigpOworICAgICAg
ICB2b2lkIHVwZGF0ZURvY3VtZW50V3JhcHBlcih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcHBl
cik7CisKKyAgICAgICAgLy8gVGhlIEphdmFTY3JpcHQgd3JhcHBlciBmb3IgdGhlIGRvY3VtZW50
IG9iamVjdCBpcyBjYWNoZWQgb24gdGhlIGdsb2JhbAorICAgICAgICAvLyBvYmplY3QgZm9yIGZh
c3QgYWNjZXNzLiAgVXBkYXRlRG9jdW1lbnRXcmFwcGVyQ2FjaGUgc2V0cyB0aGUgd3JhcHBlcgor
ICAgICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQgb24gdGhlIGdsb2JhbCBvYmplY3Qu
ICBDbGVhckRvY3VtZW50V3JhcHBlckNhY2hlCisgICAgICAgIC8vIGRlbGV0ZXMgdGhlIGRvY3Vt
ZW50IHdyYXBwZXIgZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgdm9pZCB1cGRhdGVE
b2N1bWVudFdyYXBwZXJDYWNoZSgpOworICAgICAgICB2b2lkIGNsZWFyRG9jdW1lbnRXcmFwcGVy
Q2FjaGUoKTsKKworICAgICAgICAvLyBEaXNwb3NlIGdsb2JhbCBoYW5kbGVzIG9mIG1fY29udGV4
dHMgYW5kIGZyaWVuZHMuCisgICAgICAgIHZvaWQgZGlzcG9zZUNvbnRleHRIYW5kbGVzKCk7CisK
KyAgICAgICAgc3RhdGljIGJvb2wgY2FuQWNjZXNzUHJpdmF0ZShET01XaW5kb3cqKTsKKworICAg
ICAgICAvLyBDaGVjayB3aGV0aGVyIGEgVjggdmFsdWUgaXMgYSBET00gRXZlbnQgd3JhcHBlcgor
ICAgICAgICBzdGF0aWMgYm9vbCBpc0RPTUV2ZW50V3JhcHBlcih2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4pOworCisgICAgICAgIHN0YXRpYyB2b2lkKiBjb252ZXJ0VG9OYXRpdmVPYmplY3RJbXBsKFY4
Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KTsKKworICAg
ICAgICAvLyBUYWtlIEMgcG9pbnRlciBvdXQgb2YgYSB2OCB3cmFwcGVyCisgICAgICAgIHN0YXRp
YyB2b2lkKiBleHRyYWN0Q1BvaW50ZXJJbXBsKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBvYmplY3Qp
CisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChvYmplY3QtPklzTnVtYmVyKCkpOworICAg
ICAgICAgICAgaW50IGFkZHIgPSBvYmplY3QtPkludDMyVmFsdWUoKTsKKyAgICAgICAgICAgIHJl
dHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPihhZGRyIDw8IDEpOworICAgICAgICB9CisKKwor
ICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnRTdHlsZVNoZWV0VG9W
OE9iamVjdChTdHlsZVNoZWV0Kik7CisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gY29udmVydENTU1ZhbHVlVG9WOE9iamVjdChDU1NWYWx1ZSopOworICAgICAgICBzdGF0aWMg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnRDU1NSdWxlVG9WOE9iamVjdChDU1NSdWxlKik7
CisgICAgICAgIC8vIFJldHVybnMgdGhlIEpTIHdyYXBwZXIgb2YgYSB3aW5kb3cgb2JqZWN0LCBp
bml0aWFsaXplcyB0aGUgZW52aXJvbm1lbnQKKyAgICAgICAgLy8gb2YgdGhlIHdpbmRvdyBmcmFt
ZSBpZiBuZWVkZWQuCisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVy
dFdpbmRvd1RvVjhPYmplY3QoRE9NV2luZG93Kik7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAg
ICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnRTVkdFbGVtZW50SW5zdGFuY2VU
b1Y4T2JqZWN0KFNWR0VsZW1lbnRJbnN0YW5jZSopOworICAgICAgICBzdGF0aWMgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IGNvbnZlcnRTVkdPYmplY3RXaXRoQ29udGV4dFRvVjhPYmplY3QoVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlLCB2b2lkKik7CisjZW5kaWYKKworICAgICAgICAvLyBTZXQg
aGlkZGVuIHJlZmVyZW5jZXMgaW4gYSBET01XaW5kb3cgb2JqZWN0IG9mIGEgZnJhbWUuCisgICAg
ICAgIHN0YXRpYyB2b2lkIHNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShGcmFtZSosIGNvbnN0IGlu
dCBpbnRlcm5hbEluZGV4LCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+KTsKKworICAgICAgICBzdGF0
aWMgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIGh0bWxFbGVtZW50VHlwZShIVE1MRWxlbWVu
dCopOworCisgICAgICAgIC8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIsIGRlc2NfdHlwZSwgc3BlY2lm
aWVzIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yCisgICAgICAgIC8vIHVzZWQgdG8gY3JlYXRlIEpT
IG9iamVjdC4gVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGNwdHJfdHlwZSwgc3BlY2lmaWVzCisgICAg
ICAgIC8vIHRoZSB0eXBlIG9mIHRoaXJkIHBhcmFtZXRlciwgaW1wbCwgZm9yIHR5cGUgY2FzdGlu
Zy4KKyAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGEgSFRNTCBlbGVtZW50IGhhcyBIVE1MRUxFTUVO
VCBkZXNjX3R5cGUsIGJ1dCBhbHdheXMKKyAgICAgICAgLy8gdXNlIE5PREUgYXMgY3B0cl90eXBl
LiBKUyB3cmFwcGVyIHN0b3JlcyBjcHRyX3R5cGUgYW5kIGltcGwgYXMKKyAgICAgICAgLy8gaW50
ZXJuYWwgZmllbGRzLgorICAgICAgICBzdGF0aWMgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGluc3Rh
bnRpYXRlVjhPYmplY3QoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlLCBWOENsYXNzSW5kZXg6
OlY4V3JhcHBlclR5cGUsIHZvaWQqKTsKKworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogcmFu
Z2VFeGNlcHRpb25OYW1lKGludCBleGNlcHRpb25Db2RlKTsKKyAgICAgICAgc3RhdGljIGNvbnN0
IGNoYXIqIGV2ZW50RXhjZXB0aW9uTmFtZShpbnQgZXhjZXB0aW9uQ29kZSk7CisgICAgICAgIHN0
YXRpYyBjb25zdCBjaGFyKiB4bWxIdHRwUmVxdWVzdEV4Y2VwdGlvbk5hbWUoaW50IGV4Y2VwdGlv
bkNvZGUpOworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogZG9tRXhjZXB0aW9uTmFtZShpbnQg
ZXhjZXB0aW9uQ29kZSk7CisKKyNpZiBFTkFCTEUoWFBBVEgpCisgICAgICAgIHN0YXRpYyBjb25z
dCBjaGFyKiB4cGF0aEV4Y2VwdGlvbk5hbWUoaW50IGV4Y2VwdGlvbkNvZGUpOworI2VuZGlmCisK
KyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBzdGF0aWMgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJU
eXBlIHN2Z0VsZW1lbnRUeXBlKFNWR0VsZW1lbnQqKTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNo
YXIqIHN2Z0V4Y2VwdGlvbk5hbWUoaW50IGV4Y2VwdGlvbkNvZGUpOworI2VuZGlmCisKKyAgICAg
ICAgc3RhdGljIHZvaWQgY3JlYXRlVXRpbGl0eUNvbnRleHQoKTsKKworICAgICAgICAvLyBSZXR1
cm5zIGEgbG9jYWwgaGFuZGxlIG9mIHRoZSB1dGlsaXR5IGNvbnRleHQuCisgICAgICAgIHN0YXRp
YyB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHV0aWxpdHlDb250ZXh0KCkKKyAgICAgICAgeworICAg
ICAgICAgIGlmIChtX3V0aWxpdHlDb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgICAgICAgY3Jl
YXRlVXRpbGl0eUNvbnRleHQoKTsKKyAgICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250
ZXh0Pjo6TmV3KG1fdXRpbGl0eUNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgRnJhbWUq
IG1fZnJhbWU7CisKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IG1fY29udGV4
dDsKKyAgICAgICAgLy8gRm9yIGVhY2ggcG9zc2libGUgdHlwZSBvZiB3cmFwcGVyLCB3ZSBrZWVw
IGEgYm9pbGVycGxhdGUgb2JqZWN0LgorICAgICAgICAvLyBUaGUgYm9pbGVycGxhdGUgaXMgdXNl
ZCB0byBjcmVhdGUgYWRkaXRpb25hbCB3cmFwcGVycyBvZiB0aGUgc2FtZSB0eXBlLgorICAgICAg
ICAvLyBXZSBrZWVwIGEgc2luZ2xlIHBlcnNpc3RlbnQgaGFuZGxlIHRvIGFuIGFycmF5IG9mIHRo
ZSBhY3RpdmF0ZWQKKyAgICAgICAgLy8gYm9pbGVycGxhdGVzLgorICAgICAgICB2ODo6UGVyc2lz
dGVudDx2ODo6QXJyYXk+IG1fd3JhcHBlckJvaWxlcnBsYXRlczsKKyAgICAgICAgdjg6OlBlcnNp
c3RlbnQ8djg6OlZhbHVlPiBtX29iamVjdFByb3RvdHlwZTsKKworICAgICAgICB2ODo6UGVyc2lz
dGVudDx2ODo6T2JqZWN0PiBtX2dsb2JhbDsKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6OlZh
bHVlPiBtX2RvY3VtZW50OworCisgICAgICAgIC8vIFV0aWxpdHkgY29udGV4dCBob2xkaW5nIEph
dmFTY3JpcHQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseS4KKyAgICAgICAgc3RhdGljIHY4OjpQ
ZXJzaXN0ZW50PHY4OjpDb250ZXh0PiBtX3V0aWxpdHlDb250ZXh0OworCisgICAgICAgIGludCBt
X2hhbmRsZXJMaW5lbm87CisKKyAgICAgICAgLy8gQSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyBj
cmVhdGVkIGZvciB0aGlzIGZyYW1lLAorICAgICAgICAvLyB0aGUgbGlzdCBnZXRzIGNsZWFyZWQg
d2hlbiByZW1vdmluZyBhbGwgdGltZW91dHMuCisgICAgICAgIFY4RXZlbnRMaXN0ZW5lckxpc3Qg
bV9ldmVudExpc3RlbmVyczsKKworICAgICAgICAvLyBBIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJz
IGNyZWF0ZSBmb3IgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0IGZvciB0aGlzIGZyYW1lLAorICAgICAg
ICAvLyB0aGUgbGlzdCBnZXRzIGNsZWFyZWQgd2hlbiByZW1vdmluZyBhbGwgdGltZW91dHMuCisg
ICAgICAgIFY4RXZlbnRMaXN0ZW5lckxpc3QgbV94aHJMaXN0ZW5lcnM7CisKKyAgICAgICAgLy8g
VHJ1ZSBmb3IgPGEgaHJlZj0iamF2YXNjcmlwdDpmb28oKSI+IGFuZCBmYWxzZSBmb3IgPHNjcmlw
dD5mb28oKTwvc2NyaXB0Pi4KKyAgICAgICAgLy8gT25seSB2YWxpZCBkdXJpbmcgZXhlY3V0aW9u
LgorICAgICAgICBib29sIG1faW5saW5lQ29kZTsKKworICAgICAgICAvLyBUcnVlIHdoZW4gZXhl
Y3V0aW5nIGZyb20gd2l0aGluIGEgdGltZXIgY2FsbGJhY2suICBPbmx5IHZhbGlkIGR1cmluZwor
ICAgICAgICAvLyBleGVjdXRpb24uCisgICAgICAgIGJvb2wgbV90aW1lckNhbGxiYWNrOworCisg
ICAgICAgIC8vIFRyYWNrIHRoZSByZWN1cnNpb24gZGVwdGggdG8gYmUgYWJsZSB0byBhdm9pZCB0
b28gZGVlcCByZWN1cnNpb24uIFRoZSBWOAorICAgICAgICAvLyBlbmdpbmUgYWxsb3dzIG11Y2gg
bW9yZSByZWN1cnNpb24gdGhhbiBLSlMgZG9lcyBzbyB3ZSBuZWVkIHRvIGd1YXJkIGFnYWluc3QK
KyAgICAgICAgLy8gZXhjZXNzaXZlIHJlY3Vyc2lvbiBpbiB0aGUgYmluZGluZyBsYXllci4KKyAg
ICAgICAgaW50IG1fcmVjdXJzaW9uOworCisgICAgICAgIC8vIExpc3Qgb2YgZXh0ZW5zaW9ucyBy
ZWdpc3RlcmVkIHdpdGggdGhlIGNvbnRleHQuCisgICAgICAgIHN0YXRpYyBWOEV4dGVuc2lvbkxp
c3QgbV9leHRlbnNpb25zOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8aW50IHRhZywgdHlwZW5h
bWUgVD4KKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y29uc3RydWN0RE9NT2Jq
ZWN0KGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCisgICAgeworICAgICAgICBpZiAoIWFyZ3Mu
SXNDb25zdHJ1Y3RDYWxsKCkpIHsKKyAgICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJv
eHk6OlRZUEVfRVJST1IsICJET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQg
YXMgYSBmdW5jdGlvbi4iKTsKKyAgICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworICAg
ICAgICB9CisKKyAgICAgICAgLy8gTm90ZTogaXQncyBPSyB0byBsZXQgdGhpcyBSZWZQdHIgZ28g
b3V0IG9mIHNjb3BlIGJlY2F1c2Ugd2UgYWxzbyBjYWxsCisgICAgICAgIC8vIFNldERPTVdyYXBw
ZXIoKSwgd2hpY2ggZWZmZWN0aXZlbHkgaG9sZHMgYSByZWZlcmVuY2UgdG8gb2JqLgorICAgICAg
ICBSZWZQdHI8VD4gb2JqID0gVDo6Y3JlYXRlKCk7CisgICAgICAgIFY4UHJveHk6OnNldERPTVdy
YXBwZXIoYXJncy5Ib2xkZXIoKSwgdGFnLCBvYmouZ2V0KCkpOworICAgICAgICBvYmotPnJlZigp
OworICAgICAgICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01PYmplY3Qob2JqLmdldCgpLCB2
ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGFyZ3MuSG9sZGVyKCkpKTsKKyAgICAgICAg
cmV0dXJuIGFyZ3MuSG9sZGVyKCk7CisgICAgfQorCisKICAgICAvLyBVc2VkIGJ5IGFuIGludGVy
Y2VwdG9yIGNhbGxiYWNrIHRoYXQgaXQgaGFzbid0IGZvdW5kIGFueXRoaW5nIHRvCiAgICAgLy8g
aW50ZXJjZXB0LgogICAgIGlubGluZSBzdGF0aWMgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG5vdEhh
bmRsZWRCeUludGVyY2VwdG9yKCkKQEAgLTQ4LDIyICs2NTAsMTUgQEAKICAgICB7CiAgICAgICAg
IHJldHVybiB2ODo6TG9jYWw8djg6OkJvb2xlYW4+KCk7CiAgICAgfQotCi0gICAgLy8gRklYTUU6
IFJlbW92ZSBvbmNlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZS4KLSAgICBpbmxpbmUgc3RhdGljIERP
TVdyYXBwZXJNYXA8dm9pZD4mIGRvbU9iamVjdE1hcCgpCi0gICAgewotICAgICAgICByZXR1cm4g
R2V0RE9NT2JqZWN0TWFwKCk7Ci0gICAgfQotCiAgICAgaW5saW5lIHY4OjpIYW5kbGU8djg6OlBy
aW1pdGl2ZT4gdGhyb3dFcnJvcihjb25zdCBjaGFyKiBtZXNzYWdlLCBWOFByb3h5OjpFcnJvclR5
cGUgdHlwZSA9IFY4UHJveHk6OlRZUEVfRVJST1IpCiAgICAgewotICAgICAgICBWOFByb3h5OjpU
aHJvd0Vycm9yKHR5cGUsIG1lc3NhZ2UpOworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKHR5
cGUsIG1lc3NhZ2UpOwogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgIH0KIAog
ICAgIGlubGluZSB2ODo6SGFuZGxlPHY4OjpQcmltaXRpdmU+IHRocm93RXJyb3IoRXhjZXB0aW9u
Q29kZSBlYykKICAgICB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7Cisg
ICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgIHJldHVybiB2ODo6
VW5kZWZpbmVkKCk7CiAgICAgfQogCkBAIC03Niw3ICs2NzEsNyBAQAogICAgIHRlbXBsYXRlIDxj
bGFzcyBUPiBpbmxpbmUgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB0b1Y4KFBhc3NSZWZQdHI8VD4g
b2JqZWN0LCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaG9sZGVyKQogICAgIHsKICAgICAgICAgb2Jq
ZWN0LT5yZWYoKTsKLSAgICAgICAgVjhQcm94eTo6U2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KG9i
amVjdC5nZXQoKSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhob2xkZXIpKTsKKyAg
ICAgICAgVjhQcm94eTo6c2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KG9iamVjdC5nZXQoKSwgdjg6
OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhob2xkZXIpKTsKICAgICAgICAgcmV0dXJuIGhv
bGRlcjsKICAgICB9CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4
ZWN1dGlvblByb3h5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtl
ckNvbnRleHRFeGVjdXRpb25Qcm94eS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9i
aW5kaW5ncy92OC9Xb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zNSwxMyArMzUsMTMgQEAKIAogI2luY2x1ZGUgIldvcmtlckNvbnRleHRFeGVjdXRpb25Q
cm94eS5oIgogCi0jaW5jbHVkZSAiVjhCaW5kaW5nLmgiCi0jaW5jbHVkZSAiVjhQcm94eS5oIgog
I2luY2x1ZGUgIkRPTUNvcmVFeGNlcHRpb24uaCIKICNpbmNsdWRlICJFdmVudC5oIgogI2luY2x1
ZGUgIkV2ZW50RXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiUmFuZ2VFeGNlcHRpb24uaCIKLSNpbmNs
dWRlICJYTUxIdHRwUmVxdWVzdEV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgIlY4QmluZGluZy5oIgor
I2luY2x1ZGUgIlY4RE9NTWFwLmgiCisjaW5jbHVkZSAiVjhQcm94eS5oIgogI2luY2x1ZGUgIlY4
V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIuaCIKICNpbmNsdWRlICJWOFdvcmtlckNvbnRleHRP
YmplY3RFdmVudExpc3RlbmVyLmgiCiAjaW5jbHVkZSAiV29ya2VyLmgiCkBAIC00OSw2ICs0OSw3
IEBACiAjaW5jbHVkZSAiV29ya2VyTG9jYXRpb24uaCIKICNpbmNsdWRlICJXb3JrZXJOYXZpZ2F0
b3IuaCIKICNpbmNsdWRlICJXb3JrZXJTY3JpcHRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiWE1M
SHR0cFJlcXVlc3RFeGNlcHRpb24uaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC0xMzMs
MTEgKzEzNCwxMSBAQAogewogICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2
ODo6Q29udGV4dDo6R2V0Q3VycmVudCgpOwogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xv
YmFsID0gY29udGV4dC0+R2xvYmFsKCk7Ci0gICAgZ2xvYmFsID0gVjhQcm94eTo6TG9va3VwRE9N
V3JhcHBlcihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGdsb2JhbCk7CisgICAgZ2xvYmFs
ID0gVjhQcm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQs
IGdsb2JhbCk7CiAgICAgLy8gUmV0dXJuIDAgaWYgdGhlIGN1cnJlbnQgZXhlY3V0aW5nIGNvbnRl
eHQgaXMgbm90IHRoZSB3b3JrZXIgY29udGV4dC4KICAgICBpZiAoZ2xvYmFsLklzRW1wdHkoKSkK
ICAgICAgICAgcmV0dXJuIDA7Ci0gICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VS
Q09OVEVYVCwgZ2xvYmFsKTsKKyAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQ
cm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6
V09SS0VSQ09OVEVYVCwgZ2xvYmFsKTsKICAgICByZXR1cm4gd29ya2VyQ29udGV4dC0+c2NyaXB0
KCktPnByb3h5KCk7CiB9CiAKQEAgLTE4NSw5ICsxODYsOSBAQAogICAgIH0KIAogICAgIC8vIFdy
YXAgdGhlIG9iamVjdC4KLSAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKGpzV29ya2VyQ29udGV4
dCwgVjhDbGFzc0luZGV4OjpUb0ludChWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQpLCBtX3dv
cmtlckNvbnRleHQpOworICAgIFY4UHJveHk6OnNldERPTVdyYXBwZXIoanNXb3JrZXJDb250ZXh0
LCBWOENsYXNzSW5kZXg6OlRvSW50KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCksIG1fd29y
a2VyQ29udGV4dCk7CiAKLSAgICBWOFByb3h5OjpTZXRKU1dyYXBwZXJGb3JET01PYmplY3QobV93
b3JrZXJDb250ZXh0LCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGpzV29ya2VyQ29u
dGV4dCkpOworICAgIFY4UHJveHk6OnNldEpTV3JhcHBlckZvckRPTU9iamVjdChtX3dvcmtlckNv
bnRleHQsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcoanNXb3JrZXJDb250ZXh0KSk7
CiAgICAgbV93b3JrZXJDb250ZXh0LT5yZWYoKTsKIAogICAgIC8vIEluc2VydCB0aGUgb2JqZWN0
IGluc3RhbmNlIGFzIHRoZSBwcm90b3R5cGUgb2YgdGhlIHNoYWRvdyBvYmplY3QuCkBAIC0yMDIs
NyArMjAzLDcgQEAKICAgICAvLyBFbnRlciB0aGUgY29udGV4dCBvZiB0aGUgcHJveHkgdG8gbWFr
ZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGlzCiAgICAgLy8gY29uc3RydWN0ZWQgaW4gdGhlIGNv
bnRleHQgY29ycmVzcG9uZGluZyB0byB0aGlzIHByb3h5LgogICAgIHY4OjpDb250ZXh0OjpTY29w
ZSBzY29wZShtX2NvbnRleHQpOwotICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+
IGZ1bmN0aW9uVGVtcGxhdGUgPSBWOFByb3h5OjpHZXRUZW1wbGF0ZSh0eXBlKTsKKyAgICB2ODo6
SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBmdW5jdGlvblRlbXBsYXRlID0gVjhQcm94eTo6
Z2V0VGVtcGxhdGUodHlwZSk7CiAKICAgICAvLyBHZXR0aW5nIHRoZSBmdW5jdGlvbiBtaWdodCBm
YWlsIGlmIHdlJ3JlIHJ1bm5pbmcgb3V0IG9mIHN0YWNrIG9yIG1lbW9yeS4KICAgICB2ODo6VHJ5
Q2F0Y2ggdHJ5Q2F0Y2g7CkBAIC0yMzAsMTIgKzIzMSwxMiBAQAogICAgICAgICBpZiAoIW9iamVj
dC5Jc0VtcHR5KCkpCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxXb3JrZXIqPihpbXBsKS0+cmVm
KCk7CiAgICAgICAgIHJlc3VsdCA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcob2Jq
ZWN0KTsKLSAgICAgICAgVjhQcm94eTo6U2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KGltcGwsIHJl
c3VsdCk7CisgICAgICAgIFY4UHJveHk6OnNldEpTV3JhcHBlckZvckRPTU9iamVjdChpbXBsLCBy
ZXN1bHQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8vIE5vbiBET00g
bm9kZQotICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHJlc3VsdCA9IGRvbU9iamVjdE1h
cCgpLmdldChpbXBsKTsKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiByZXN1bHQgPSBn
ZXRET01PYmplY3RNYXAoKS5nZXQoaW1wbCk7CiAgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpIHsK
ICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IHRvVjgodHlwZSwgdHlwZSwg
aW1wbCk7CiAgICAgICAgIGlmICghb2JqZWN0LklzRW1wdHkoKSkgewpAQCAtMjYyLDcgKzI2Myw3
IEBACiAgICAgICAgICAgICAgICAgQVNTRVJUKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAg
ICAgICAgIHJlc3VsdCA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcob2JqZWN0KTsK
LSAgICAgICAgICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU9iamVjdChpbXBsLCByZXN1
bHQpOworICAgICAgICAgICAgVjhQcm94eTo6c2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KGltcGws
IHJlc3VsdCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTI3Myw3
ICsyNzQsNyBAQAogICAgIGlmICghZXZlbnQpCiAgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOwog
Ci0gICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZG9tT2JqZWN0TWFwKCkuZ2V0
KGV2ZW50KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRET01PYmpl
Y3RNYXAoKS5nZXQoZXZlbnQpOwogICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpCiAgICAgICAg
IHJldHVybiB3cmFwcGVyOwogCkBAIC0yOTAsNyArMjkxLDcgQEAKICAgICB9CiAKICAgICBldmVu
dC0+cmVmKCk7ICAvLyBmYXN0IHJlZgotICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU9i
amVjdChldmVudCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhyZXN1bHQpKTsKKyAg
ICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01PYmplY3QoZXZlbnQsIHY4OjpQZXJzaXN0ZW50
PHY4OjpPYmplY3Q+OjpOZXcocmVzdWx0KSk7CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAt
MzM2LDIwICszMzcsMjAgQEAKICAgICBpZiAocHJveHkpCiAgICAgICAgIGZ1bmN0aW9uID0gcHJv
eHktPkdldENvbnN0cnVjdG9yKGRlc2NUeXBlKTsKICAgICBlbHNlCi0gICAgICAgIGZ1bmN0aW9u
ID0gVjhQcm94eTo6R2V0VGVtcGxhdGUoZGVzY1R5cGUpLT5HZXRGdW5jdGlvbigpOworICAgICAg
ICBmdW5jdGlvbiA9IFY4UHJveHk6OmdldFRlbXBsYXRlKGRlc2NUeXBlKS0+R2V0RnVuY3Rpb24o
KTsKIAogICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBpbnN0YW5jZSA9IFNhZmVBbGxvY2F0aW9u
OjpuZXdJbnN0YW5jZShmdW5jdGlvbik7CiAgICAgaWYgKCFpbnN0YW5jZS5Jc0VtcHR5KCkpIHsK
ICAgICAgICAgLy8gQXZvaWQgc2V0dGluZyB0aGUgRE9NIHdyYXBwZXIgZm9yIGZhaWxlZCBhbGxv
Y2F0aW9ucy4KLSAgICAgICAgVjhQcm94eTo6U2V0RE9NV3JhcHBlcihpbnN0YW5jZSwgVjhDbGFz
c0luZGV4OjpUb0ludChjcHRyVHlwZSksIGltcGwpOworICAgICAgICBWOFByb3h5OjpzZXRET01X
cmFwcGVyKGluc3RhbmNlLCBWOENsYXNzSW5kZXg6OlRvSW50KGNwdHJUeXBlKSwgaW1wbCk7CiAg
ICAgfQogICAgIHJldHVybiBpbnN0YW5jZTsKIH0KIAogYm9vbCBXb3JrZXJDb250ZXh0RXhlY3V0
aW9uUHJveHk6OmZvcmdldFY4RXZlbnRPYmplY3QoRXZlbnQqIGV2ZW50KQogewotICAgIGlmIChk
b21PYmplY3RNYXAoKS5jb250YWlucyhldmVudCkpIHsKLSAgICAgICAgZG9tT2JqZWN0TWFwKCku
Zm9yZ2V0KGV2ZW50KTsKKyAgICBpZiAoZ2V0RE9NT2JqZWN0TWFwKCkuY29udGFpbnMoZXZlbnQp
KSB7CisgICAgICAgIGdldERPTU9iamVjdE1hcCgpLmZvcmdldChldmVudCk7CiAgICAgICAgIHJl
dHVybiB0cnVlOwogICAgIH0gZWxzZQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0zNjMsNyAr
MzY0LDcgQEAKICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUobV9jb250ZXh0KTsKIAogICAg
IHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBzY3JpcHRTdHJpbmcgPSB2OEV4dGVybmFsU3RyaW5nKHNj
cmlwdCk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6U2NyaXB0PiBjb21waWxlZFNjcmlwdCA9IFY4UHJv
eHk6OkNvbXBpbGVTY3JpcHQoc2NyaXB0U3RyaW5nLCBmaWxlTmFtZSwgYmFzZUxpbmUpOworICAg
IHY4OjpIYW5kbGU8djg6OlNjcmlwdD4gY29tcGlsZWRTY3JpcHQgPSBWOFByb3h5Ojpjb21waWxl
U2NyaXB0KHNjcmlwdFN0cmluZywgZmlsZU5hbWUsIGJhc2VMaW5lKTsKICAgICByZXR1cm4gcnVu
U2NyaXB0KGNvbXBpbGVkU2NyaXB0KTsKIH0KIApAQCAtMzc1LDEwICszNzYsMTAgQEAKICAgICAv
LyBDb21wdXRlIHRoZSBzb3VyY2Ugc3RyaW5nIGFuZCBwcmV2ZW50IGFnYWluc3QgaW5maW5pdGUg
cmVjdXJzaW9uLgogICAgIGlmIChtX3JlY3Vyc2lvbiA+PSBrTWF4UmVjdXJzaW9uRGVwdGgpIHsK
ICAgICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGNvZGUgPSB2OEV4dGVybmFsU3RyaW5nKCJ0
aHJvdyBSYW5nZUVycm9yKCdSZWN1cnNpb24gdG9vIGRlZXAnKSIpOwotICAgICAgICBzY3JpcHQg
PSBWOFByb3h5OjpDb21waWxlU2NyaXB0KGNvZGUsICIiLCAwKTsKKyAgICAgICAgc2NyaXB0ID0g
VjhQcm94eTo6Y29tcGlsZVNjcmlwdChjb2RlLCAiIiwgMCk7CiAgICAgfQogCi0gICAgaWYgKFY4
UHJveHk6OkhhbmRsZU91dE9mTWVtb3J5KCkpCisgICAgaWYgKFY4UHJveHk6OmhhbmRsZU91dE9m
TWVtb3J5KCkpCiAgICAgICAgIEFTU0VSVChzY3JpcHQuSXNFbXB0eSgpKTsKIAogICAgIGlmIChz
Y3JpcHQuSXNFbXB0eSgpKQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOExhenlFdmVudExp
c3RlbmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4TGF6eUV2ZW50
TGlzdGVuZXIuY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhM
YXp5RXZlbnRMaXN0ZW5lci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU0LDcgKzU0LDcgQEAKICAg
ICAvLyBEaXNwb3NlIHdyYXBwZWQgZnVuY3Rpb24KICAgICBpZiAoIW1fd3JhcHBlZEZ1bmN0aW9u
LklzRW1wdHkoKSkgewogI2lmbmRlZiBOREVCVUcKLSAgICAgICAgVjhQcm94eTo6VW5yZWdpc3Rl
ckdsb2JhbEhhbmRsZSh0aGlzLCBtX3dyYXBwZWRGdW5jdGlvbik7CisgICAgICAgIFY4UHJveHk6
OnVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV93cmFwcGVkRnVuY3Rpb24pOwogI2VuZGlm
CiAgICAgICAgIG1fd3JhcHBlZEZ1bmN0aW9uLkRpc3Bvc2UoKTsKICAgICAgICAgbV93cmFwcGVk
RnVuY3Rpb24uQ2xlYXIoKTsKQEAgLTc3LDEyICs3NywxMiBAQAogICAgICAgICB2ODo6SGFuZGxl
U2NvcGUgaGFuZGxlU2NvcGU7CiAKICAgICAgICAgLy8gVXNlIHRoZSBvdXRlciBzY29wZSB0byBo
b2xkIGNvbnRleHQuCi0gICAgICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBW
OFByb3h5OjpHZXRDb250ZXh0KG1fZnJhbWUpOworICAgICAgICB2ODo6SGFuZGxlPHY4OjpDb250
ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KG1fZnJhbWUpOwogICAgICAgICAvLyBC
YWlsIG91dCBpZiB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBjb250ZXh0LgotICAgICAgICBpZiAoY29u
dGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQogICAgICAg
ICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+KCk7CiAKLSAgICAgICAgdjg6OkNv
bnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUg
c2NvcGUodjhDb250ZXh0KTsKIAogICAgICAgICAvLyBXcmFwIGZ1bmN0aW9uIGFyb3VuZCB0aGUg
ZXZlbnQgY29kZS4gIFRoZSBwYXJlbnRoZXNpcyBhcm91bmQgdGhlIGZ1bmN0aW9uIGFyZSBuZWVk
ZWQgc28gdGhhdCBldmFsdWF0aW5nIHRoZSBjb2RlIHlpZWxkcwogICAgICAgICAvLyB0aGUgZnVu
Y3Rpb24gdmFsdWUuICBXaXRob3V0IHRoZSBwYXJlbnRoZXNpcyB0aGUgZnVuY3Rpb24gdmFsdWUg
aXMgdGhyb3duIGF3YXkuCkBAIC0xMDIsMTEgKzEwMiwxMSBAQAogICAgICAgICBjb2RlLmFwcGVu
ZCgiXG59KSIpOwogCiAgICAgICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gY29kZUV4dGVybmFs
U3RyaW5nID0gdjhFeHRlcm5hbFN0cmluZyhjb2RlKTsKLSAgICAgICAgdjg6OkhhbmRsZTx2ODo6
U2NyaXB0PiBzY3JpcHQgPSBWOFByb3h5OjpDb21waWxlU2NyaXB0KGNvZGVFeHRlcm5hbFN0cmlu
ZywgbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCksIG1fbGluZU51bWJlciAtIDEpOworICAgICAg
ICB2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IHNjcmlwdCA9IFY4UHJveHk6OmNvbXBpbGVTY3JpcHQo
Y29kZUV4dGVybmFsU3RyaW5nLCBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSwgbV9saW5lTnVt
YmVyIC0gMSk7CiAgICAgICAgIGlmICghc2NyaXB0LklzRW1wdHkoKSkgewogICAgICAgICAgICAg
VjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShtX2ZyYW1lKTsKICAgICAgICAgICAg
IEFTU0VSVChwcm94eSk7Ci0gICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSA9
IHByb3h5LT5SdW5TY3JpcHQoc2NyaXB0LCBmYWxzZSk7CisgICAgICAgICAgICB2ODo6TG9jYWw8
djg6OlZhbHVlPiB2YWx1ZSA9IHByb3h5LT5ydW5TY3JpcHQoc2NyaXB0LCBmYWxzZSk7CiAgICAg
ICAgICAgICBpZiAoIXZhbHVlLklzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIEFTU0VSVCh2
YWx1ZS0+SXNGdW5jdGlvbigpKTsKICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0
aW9uPiBsaXN0ZW5lckZ1bmN0aW9uID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj46OkNhc3QodmFs
dWUpOwpAQCAtMTE0LDcgKzExNCw3IEBACiAKICAgICAgICAgICAgICAgICBtX2xpc3RlbmVyID0g
djg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uPjo6TmV3KGxpc3RlbmVyRnVuY3Rpb24pOwogI2lm
bmRlZiBOREVCVUcKLSAgICAgICAgICAgICAgICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhhbmRs
ZShFVkVOVF9MSVNURU5FUiwgdGhpcywgbV9saXN0ZW5lcik7CisgICAgICAgICAgICAgICAgVjhQ
cm94eTo6cmVnaXN0ZXJHbG9iYWxIYW5kbGUoRVZFTlRfTElTVEVORVIsIHRoaXMsIG1fbGlzdGVu
ZXIpOwogI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEzNCw3ICsxMzQsNyBA
QAogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBwYXJhbWV0ZXJzWzFdID0geyBqc0V2ZW50IH07
CiAKICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKG1fZnJhbWUpOwotICAg
IHJldHVybiBwcm94eS0+Q2FsbEZ1bmN0aW9uKGhhbmRsZXJGdW5jdGlvbiwgcmVjZWl2ZXIsIDEs
IHBhcmFtZXRlcnMpOworICAgIHJldHVybiBwcm94eS0+Y2FsbEZ1bmN0aW9uKGhhbmRsZXJGdW5j
dGlvbiwgcmVjZWl2ZXIsIDEsIHBhcmFtZXRlcnMpOwogfQogCiAKQEAgLTE1OCwxMiArMTU4LDEy
IEBACiAgICAgICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKIAogICAgICAgICAvLyBV
c2UgdGhlIG91dGVyIHNjb3BlIHRvIGhvbGQgY29udGV4dC4KLSAgICAgICAgdjg6OkhhbmRsZTx2
ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQobV9mcmFtZSk7CisgICAg
ICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQo
bV9mcmFtZSk7CiAgICAgICAgIC8vIEJhaWwgb3V0IGlmIHdlIGNhbm5vdCBnZXQgdGhlIGNvbnRl
eHQuCi0gICAgICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgaWYgKHY4Q29udGV4
dC5Jc0VtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4o
KTsKIAotICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisgICAgICAg
IHY4OjpDb250ZXh0OjpTY29wZSBzY29wZSh2OENvbnRleHQpOwogCiAgICAgICAgIC8vIEZJWE1F
OiBjYWNoZSB0aGUgd3JhcHBlciBmdW5jdGlvbi4KIApAQCAtMTg0LDExICsxODQsMTEgQEAKICAg
ICAgICAgLy8gSW5zZXJ0ICdcbicgb3RoZXJ3aXNlIC8vLXN0eWxlIGNvbW1lbnRzIGNvdWxkIGJy
ZWFrIHRoZSBoYW5kbGVyLgogICAgICAgICBjb2RlLmFwcGVuZCggICJcbn0pLmNhbGwodGhpcywg
ZXZ0KTt9fX19KSIpOwogICAgICAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IGNvZGVFeHRlcm5h
bFN0cmluZyA9IHY4RXh0ZXJuYWxTdHJpbmcoY29kZSk7Ci0gICAgICAgIHY4OjpIYW5kbGU8djg6
OlNjcmlwdD4gc2NyaXB0ID0gVjhQcm94eTo6Q29tcGlsZVNjcmlwdChjb2RlRXh0ZXJuYWxTdHJp
bmcsIG1fZnJhbWUtPmRvY3VtZW50KCktPnVybCgpLCBtX2xpbmVOdW1iZXIpOworICAgICAgICB2
ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IHNjcmlwdCA9IFY4UHJveHk6OmNvbXBpbGVTY3JpcHQoY29k
ZUV4dGVybmFsU3RyaW5nLCBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSwgbV9saW5lTnVtYmVy
KTsKICAgICAgICAgaWYgKCFzY3JpcHQuSXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBWOFByb3h5
KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKG1fZnJhbWUpOwogICAgICAgICAgICAgQVNTRVJU
KHByb3h5KTsKLSAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlID0gcHJveHkt
PlJ1blNjcmlwdChzY3JpcHQsIGZhbHNlKTsKKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFs
dWU+IHZhbHVlID0gcHJveHktPnJ1blNjcmlwdChzY3JpcHQsIGZhbHNlKTsKICAgICAgICAgICAg
IGlmICghdmFsdWUuSXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgQVNTRVJUKHZhbHVlLT5J
c0Z1bmN0aW9uKCkpOwogCkBAIC0yMTgsNyArMjE4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAK
ICNpZm5kZWYgTkRFQlVHCi0gICAgICAgICAgICAgICAgVjhQcm94eTo6UmVnaXN0ZXJHbG9iYWxI
YW5kbGUoRVZFTlRfTElTVEVORVIsIHRoaXMsIG1fd3JhcHBlZEZ1bmN0aW9uKTsKKyAgICAgICAg
ICAgICAgICBWOFByb3h5OjpyZWdpc3Rlckdsb2JhbEhhbmRsZShFVkVOVF9MSVNURU5FUiwgdGhp
cywgbV93cmFwcGVkRnVuY3Rpb24pOwogI2VuZGlmCiAgICAgICAgICAgICAgICAgbV93cmFwcGVk
RnVuY3Rpb24tPlNldE5hbWUodjg6OlN0cmluZzo6TmV3KGZyb21XZWJDb3JlU3RyaW5nKG1fZnVu
Y3Rpb25OYW1lKSwgbV9mdW5jdGlvbk5hbWUubGVuZ3RoKCkpKTsKICAgICAgICAgICAgIH0KSW5k
ZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvU2NyaXB0VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL2JpbmRpbmdzL3Y4L1NjcmlwdFZhbHVlLmgJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29y
ZS9iaW5kaW5ncy92OC9TY3JpcHRWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC01Myw3ICs1Myw3
IEBACiAKICAgICAgICAgbV92YWx1ZSA9IHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT46Ok5ldyh2
YWx1ZSk7CiAjaWZuZGVmIE5ERUJVRwotICAgICAgICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhh
bmRsZShTQ1JJUFRWQUxVRSwgdGhpcywgbV92YWx1ZSk7CisgICAgICAgIFY4UHJveHk6OnJlZ2lz
dGVyR2xvYmFsSGFuZGxlKFNDUklQVFZBTFVFLCB0aGlzLCBtX3ZhbHVlKTsKICNlbmRpZgogICAg
IH0KIApAQCAtNjQsNyArNjQsNyBAQAogCiAgICAgICAgIG1fdmFsdWUgPSB2ODo6UGVyc2lzdGVu
dDx2ODo6VmFsdWU+OjpOZXcodmFsdWUubV92YWx1ZSk7CiAjaWZuZGVmIE5ERUJVRwotICAgICAg
ICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhhbmRsZShTQ1JJUFRWQUxVRSwgdGhpcywgbV92YWx1
ZSk7CisgICAgICAgIFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxlKFNDUklQVFZBTFVFLCB0
aGlzLCBtX3ZhbHVlKTsKICNlbmRpZgogICAgIH0KIApAQCAtODAsNyArODAsNyBAQAogCiAgICAg
ICAgIG1fdmFsdWUgPSB2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+OjpOZXcodmFsdWUubV92YWx1
ZSk7CiAjaWZuZGVmIE5ERUJVRwotICAgICAgICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhhbmRs
ZShTQ1JJUFRWQUxVRSwgdGhpcywgbV92YWx1ZSk7CisgICAgICAgIFY4UHJveHk6OnJlZ2lzdGVy
R2xvYmFsSGFuZGxlKFNDUklQVFZBTFVFLCB0aGlzLCBtX3ZhbHVlKTsKICNlbmRpZgogCiAgICAg
ICAgIHJldHVybiAqdGhpczsKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgICAgICAgICAgcmV0dXJu
OwogCiAjaWZuZGVmIE5ERUJVRwotICAgICAgICBWOFByb3h5OjpVbnJlZ2lzdGVyR2xvYmFsSGFu
ZGxlKHRoaXMsIG1fdmFsdWUpOworICAgICAgICBWOFByb3h5Ojp1bnJlZ2lzdGVyR2xvYmFsSGFu
ZGxlKHRoaXMsIG1fdmFsdWUpOwogI2VuZGlmCiAgICAgICAgIG1fdmFsdWUuRGlzcG9zZSgpOwog
ICAgICAgICBtX3ZhbHVlLkNsZWFyKCk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4Q29s
bGVjdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhDb2xsZWN0aW9u
LmgJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOENvbGxlY3Rpb24u
aAkod29ya2luZyBjb3B5KQpAQCAtNDcsOCArNDcsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHY4
OjpIYW5kbGU8djg6OlZhbHVlPigpOwogICAgICAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5
cGUgdHlwZSA9IFY4Q2xhc3NJbmRleDo6RnJvbUludChpbXBsZW1lbnRhdGlvblR5cGUtPkludDMy
VmFsdWUoKSk7CiAgICAgICAgIGlmICh0eXBlID09IFY4Q2xhc3NJbmRleDo6Tk9ERSkKLSAgICAg
ICAgICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChzdGF0aWNfY2FzdDxOb2RlKj4o
aW1wbGVtZW50YXRpb24pKTsKLSAgICAgICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QodHlw
ZSwgaW1wbGVtZW50YXRpb24pOworICAgICAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRO
b2RlVG9WOE9iamVjdChzdGF0aWNfY2FzdDxOb2RlKj4oaW1wbGVtZW50YXRpb24pKTsKKyAgICAg
ICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KHR5cGUsIGltcGxlbWVudGF0aW9u
KTsKICAgICB9CiAKICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IGdldFY4T2JqZWN0KFBhc3NSZWZQdHI8VD4gaW1wbGVtZW50YXRpb24sIHY4OjpMb2Nh
bDx2ODo6VmFsdWU+IGltcGxlbWVudGF0aW9uVHlwZSkKQEAgLTYxLDEwICs2MSwxMCBAQAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4
OjpWYWx1ZT4gaW1wbGVtZW50YXRpb25UeXBlKQogICAgIHsKICAgICAgICAgLy8gRklYTUU6IGFz
c2VydCBvYmplY3QgaXMgYSBjb2xsZWN0aW9uIHR5cGUKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6
Ok1heWJlRE9NV3JhcHBlcihvYmplY3QpKTsKLSAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBw
ZXJUeXBlIHdyYXBwZXJUeXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUob2JqZWN0KTsK
KyAgICAgICAgQVNTRVJUKFY4UHJveHk6Om1heWJlRE9NV3JhcHBlcihvYmplY3QpKTsKKyAgICAg
ICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHdyYXBwZXJUeXBlID0gVjhQcm94eTo6ZG9t
V3JhcHBlclR5cGUob2JqZWN0KTsKICAgICAgICAgQVNTRVJUKHdyYXBwZXJUeXBlICE9IFY4Q2xh
c3NJbmRleDo6Tk9ERSk7Ci0gICAgICAgIENvbGxlY3Rpb24qIGNvbGxlY3Rpb24gPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgb2JqZWN0KTsKKyAgICAg
ICAgQ29sbGVjdGlvbiogY29sbGVjdGlvbiA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVj
dDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgb2JqZWN0KTsKICAgICAgICAgU3RyaW5nIHByb3Bl
cnR5TmFtZSA9IHRvV2ViQ29yZVN0cmluZyhuYW1lKTsKICAgICAgICAgcmV0dXJuIGdldFY4T2Jq
ZWN0PEl0ZW1UeXBlPihjb2xsZWN0aW9uLT5uYW1lZEl0ZW0ocHJvcGVydHlOYW1lKSwgaW1wbGVt
ZW50YXRpb25UeXBlKTsKICAgICB9CkBAIC04Nyw4ICs4Nyw4IEBACiAgICAgLy8gQSB0ZW1wbGF0
ZSBvZiBuYW1lZCBwcm9wZXJ0eSBhY2Nlc3NvciBvZiBIVE1MU2VsZWN0RWxlbWVudCBhbmQgSFRN
TEZvcm1FbGVtZW50LgogICAgIHRlbXBsYXRlPGNsYXNzIENvbGxlY3Rpb24+IHN0YXRpYyB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gbm9kZUNvbGxlY3Rpb25OYW1lZFByb3BlcnR5R2V0dGVyKHY4OjpM
b2NhbDx2ODo6U3RyaW5nPiBuYW1lLCBjb25zdCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZvKQogICAg
IHsKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6Ok1heWJlRE9NV3JhcHBlcihpbmZvLkhvbGRlcigp
KSk7Ci0gICAgICAgIEFTU0VSVChWOFByb3h5OjpHZXRET01XcmFwcGVyVHlwZShpbmZvLkhvbGRl
cigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOworICAgICAgICBBU1NFUlQoVjhQcm94eTo6bWF5
YmVET01XcmFwcGVyKGluZm8uSG9sZGVyKCkpKTsKKyAgICAgICAgQVNTRVJUKFY4UHJveHk6OmRv
bVdyYXBwZXJUeXBlKGluZm8uSG9sZGVyKCkpID09IFY4Q2xhc3NJbmRleDo6Tk9ERSk7CiAgICAg
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSA9IGluZm8uSG9sZGVyKCktPkdldFJlYWxO
YW1lZFByb3BlcnR5SW5Qcm90b3R5cGVDaGFpbihuYW1lKTsKIAogICAgICAgICBpZiAoIXZhbHVl
LklzRW1wdHkoKSkKQEAgLTEwOSwxMCArMTA5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGltcGxlbWVu
dGF0aW9uVHlwZSkKICAgICB7CiAgICAgICAgIC8vIEZJWE1FOiBBc3NlcnQgdGhhdCBvYmplY3Qg
bXVzdCBiZSBhIGNvbGxlY3Rpb24gdHlwZS4KLSAgICAgICAgQVNTRVJUKFY4UHJveHk6Ok1heWJl
RE9NV3JhcHBlcihvYmplY3QpKTsKLSAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBl
IHdyYXBwZXJUeXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUob2JqZWN0KTsKKyAgICAg
ICAgQVNTRVJUKFY4UHJveHk6Om1heWJlRE9NV3JhcHBlcihvYmplY3QpKTsKKyAgICAgICAgVjhD
bGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHdyYXBwZXJUeXBlID0gVjhQcm94eTo6ZG9tV3JhcHBl
clR5cGUob2JqZWN0KTsKICAgICAgICAgQVNTRVJUKHdyYXBwZXJUeXBlICE9IFY4Q2xhc3NJbmRl
eDo6Tk9ERSk7Ci0gICAgICAgIENvbGxlY3Rpb24qIGNvbGxlY3Rpb24gPSBWOFByb3h5OjpUb05h
dGl2ZU9iamVjdDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgb2JqZWN0KTsKKyAgICAgICAgQ29s
bGVjdGlvbiogY29sbGVjdGlvbiA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDb2xs
ZWN0aW9uPih3cmFwcGVyVHlwZSwgb2JqZWN0KTsKICAgICAgICAgcmV0dXJuIGdldFY4T2JqZWN0
PEl0ZW1UeXBlPihjb2xsZWN0aW9uLT5pdGVtKGluZGV4KSwgaW1wbGVtZW50YXRpb25UeXBlKTsK
ICAgICB9CiAKQEAgLTEyNSw5ICsxMjUsOSBAQAogICAgIC8vIEEgdGVtcGxhdGUgb2YgaW5kZXgg
aW50ZXJjZXB0b3Igb2YgSFRNTFNlbGVjdEVsZW1lbnQgYW5kIEhUTUxGb3JtRWxlbWVudC4KICAg
ICB0ZW1wbGF0ZTxjbGFzcyBDb2xsZWN0aW9uPiBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+
IG5vZGVDb2xsZWN0aW9uSW5kZXhlZFByb3BlcnR5R2V0dGVyKHVpbnQzMl90IGluZGV4LCBjb25z
dCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZvKQogICAgIHsKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6
Ok1heWJlRE9NV3JhcHBlcihpbmZvLkhvbGRlcigpKSk7Ci0gICAgICAgIEFTU0VSVChWOFByb3h5
OjpHZXRET01XcmFwcGVyVHlwZShpbmZvLkhvbGRlcigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUp
OwotICAgICAgICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6RE9NV3JhcHBlclRv
Tm9kZTxDb2xsZWN0aW9uPihpbmZvLkhvbGRlcigpKTsKKyAgICAgICAgQVNTRVJUKFY4UHJveHk6
Om1heWJlRE9NV3JhcHBlcihpbmZvLkhvbGRlcigpKSk7CisgICAgICAgIEFTU0VSVChWOFByb3h5
Ojpkb21XcmFwcGVyVHlwZShpbmZvLkhvbGRlcigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOwor
ICAgICAgICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBw
ZXJUb05vZGU8Q29sbGVjdGlvbj4oaW5mby5Ib2xkZXIoKSk7CiAgICAgICAgIHZvaWQqIGltcGxl
bWVudGF0aW9uID0gY29sbGVjdGlvbi0+aXRlbShpbmRleCk7CiAgICAgICAgIHJldHVybiBnZXRW
OE9iamVjdChpbXBsZW1lbnRhdGlvbiwgaW5mby5EYXRhKCkpOwogICAgIH0KQEAgLTEzNSw5ICsx
MzUsOSBAQAogICAgIC8vIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBpbmRl
eGVkIHByb3BlcnRpZXMgb2YgSFRNTFNlbGVjdEVsZW1lbnQgYW5kIEhUTUxGb3JtRWxlbWVudC4K
ICAgICB0ZW1wbGF0ZTxjbGFzcyBDb2xsZWN0aW9uPiBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6QXJy
YXk+IG5vZGVDb2xsZWN0aW9uSW5kZXhlZFByb3BlcnR5RW51bWVyYXRvcihjb25zdCB2ODo6QWNj
ZXNzb3JJbmZvJiBpbmZvKQogICAgIHsKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6Ok1heWJlRE9N
V3JhcHBlcihpbmZvLkhvbGRlcigpKSk7Ci0gICAgICAgIEFTU0VSVChWOFByb3h5OjpHZXRET01X
cmFwcGVyVHlwZShpbmZvLkhvbGRlcigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOwotICAgICAg
ICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxDb2xs
ZWN0aW9uPihpbmZvLkhvbGRlcigpKTsKKyAgICAgICAgQVNTRVJUKFY4UHJveHk6Om1heWJlRE9N
V3JhcHBlcihpbmZvLkhvbGRlcigpKSk7CisgICAgICAgIEFTU0VSVChWOFByb3h5Ojpkb21XcmFw
cGVyVHlwZShpbmZvLkhvbGRlcigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOworICAgICAgICBD
b2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8
Q29sbGVjdGlvbj4oaW5mby5Ib2xkZXIoKSk7CiAgICAgICAgIGludCBsZW5ndGggPSBjb2xsZWN0
aW9uLT5sZW5ndGgoKTsKICAgICAgICAgdjg6OkhhbmRsZTx2ODo6QXJyYXk+IHByb3BlcnRpZXMg
PSB2ODo6QXJyYXk6Ok5ldyhsZW5ndGgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxl
bmd0aDsgKytpKSB7CkBAIC0xNTEsOSArMTUxLDkgQEAKICAgICAvLyBHZXQgYW4gYXJyYXkgY29u
dGFpbmluZyB0aGUgbmFtZXMgb2YgaW5kZXhlZCBwcm9wZXJ0aWVzIGluIGEgY29sbGVjdGlvbi4K
ICAgICB0ZW1wbGF0ZTxjbGFzcyBDb2xsZWN0aW9uPiBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6QXJy
YXk+IGNvbGxlY3Rpb25JbmRleGVkUHJvcGVydHlFbnVtZXJhdG9yKGNvbnN0IHY4OjpBY2Nlc3Nv
ckluZm8mIGluZm8pCiAgICAgewotICAgICAgICBBU1NFUlQoVjhQcm94eTo6TWF5YmVET01XcmFw
cGVyKGluZm8uSG9sZGVyKCkpKTsKLSAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBl
IHdyYXBwZXJUeXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUoaW5mby5Ib2xkZXIoKSk7
Ci0gICAgICAgIENvbGxlY3Rpb24qIGNvbGxlY3Rpb24gPSBWOFByb3h5OjpUb05hdGl2ZU9iamVj
dDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgaW5mby5Ib2xkZXIoKSk7CisgICAgICAgIEFTU0VS
VChWOFByb3h5OjptYXliZURPTVdyYXBwZXIoaW5mby5Ib2xkZXIoKSkpOworICAgICAgICBWOENs
YXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgd3JhcHBlclR5cGUgPSBWOFByb3h5Ojpkb21XcmFwcGVy
VHlwZShpbmZvLkhvbGRlcigpKTsKKyAgICAgICAgQ29sbGVjdGlvbiogY29sbGVjdGlvbiA9IFY4
UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDb2xsZWN0aW9uPih3cmFwcGVyVHlwZSwgaW5m
by5Ib2xkZXIoKSk7CiAgICAgICAgIGludCBsZW5ndGggPSBjb2xsZWN0aW9uLT5sZW5ndGgoKTsK
ICAgICAgICAgdjg6OkhhbmRsZTx2ODo6QXJyYXk+IHByb3BlcnRpZXMgPSB2ODo6QXJyYXk6Ok5l
dyhsZW5ndGgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CkBA
IC0xNjksOSArMTY5LDkgQEAKICAgICB0ZW1wbGF0ZTxjbGFzcyBDb2xsZWN0aW9uPiBzdGF0aWMg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbGxlY3Rpb25TdHJpbmdPck51bGxJbmRleGVkUHJvcGVy
dHlHZXR0ZXIodWludDMyX3QgaW5kZXgsIGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pCiAg
ICAgewogICAgICAgICAvLyBGSVhNRTogYXNzZXJ0IHRoYXQgb2JqZWN0IG11c3QgYmUgYSBjb2xs
ZWN0aW9uIHR5cGUKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6Ok1heWJlRE9NV3JhcHBlcihpbmZv
LkhvbGRlcigpKSk7Ci0gICAgICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB3cmFwcGVy
VHlwZSA9IFY4UHJveHk6OkdldERPTVdyYXBwZXJUeXBlKGluZm8uSG9sZGVyKCkpOwotICAgICAg
ICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q29sbGVj
dGlvbj4od3JhcHBlclR5cGUsIGluZm8uSG9sZGVyKCkpOworICAgICAgICBBU1NFUlQoVjhQcm94
eTo6bWF5YmVET01XcmFwcGVyKGluZm8uSG9sZGVyKCkpKTsKKyAgICAgICAgVjhDbGFzc0luZGV4
OjpWOFdyYXBwZXJUeXBlIHdyYXBwZXJUeXBlID0gVjhQcm94eTo6ZG9tV3JhcHBlclR5cGUoaW5m
by5Ib2xkZXIoKSk7CisgICAgICAgIENvbGxlY3Rpb24qIGNvbGxlY3Rpb24gPSBWOFByb3h5Ojpj
b252ZXJ0VG9OYXRpdmVPYmplY3Q8Q29sbGVjdGlvbj4od3JhcHBlclR5cGUsIGluZm8uSG9sZGVy
KCkpOwogICAgICAgICBTdHJpbmcgcmVzdWx0ID0gY29sbGVjdGlvbi0+aXRlbShpbmRleCk7CiAg
ICAgICAgIHJldHVybiB2OFN0cmluZ09yTnVsbChyZXN1bHQpOwogICAgIH0KSW5kZXg6IFdlYkNv
cmUvYmluZGluZ3MvdjgvU2NyaXB0T2JqZWN0UXVhcmFudGluZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9iaW5kaW5ncy92OC9TY3JpcHRPYmplY3RRdWFyYW50aW5lLmNwcAkocmV2aXNpb24g
NDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjcmlwdE9iamVjdFF1YXJhbnRpbmUuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC03NywxMCArNzcsMTAgQEAKICAgICBBU1NFUlQobm9kZSk7CiAK
ICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7Ci0gICAgdjg6OkxvY2FsPHY4OjpDb250
ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChub2RlLT5kb2N1bWVudCgpLT5wYWdl
KCktPm1haW5GcmFtZSgpKTsKKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBW
OFByb3h5Ojpjb250ZXh0KG5vZGUtPmRvY3VtZW50KCktPnBhZ2UoKS0+bWFpbkZyYW1lKCkpOwog
ICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKIAotICAgIHY4OjpIYW5kbGU8
djg6OlZhbHVlPiB2OE5vZGUgPSBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChub2RlKTsKKyAgICB2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdjhOb2RlID0gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2Jq
ZWN0KG5vZGUpOwogICAgIHF1YXJhbnRpbmVkT2JqZWN0ID0gU2NyaXB0T2JqZWN0KHY4OjpMb2Nh
bDx2ODo6T2JqZWN0Pih2ODo6T2JqZWN0OjpDYXN0KCp2OE5vZGUpKSk7CiAKICAgICByZXR1cm4g
dHJ1ZTsKQEAgLTkxLDEwICs5MSwxMCBAQAogICAgIEFTU0VSVChkb21XaW5kb3cpOwogCiAgICAg
djg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4g
Y29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQoZG9tV2luZG93LT5mcmFtZSgpKTsKKyAgICB2
ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KGRvbVdpbmRv
dy0+ZnJhbWUoKSk7CiAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOwogCi0g
ICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHY4RG9tV2luZG93ID0gVjhQcm94eTo6VG9WOE9iamVj
dChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgZG9tV2luZG93KTsKKyAgICB2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4gdjhEb21XaW5kb3cgPSBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVywgZG9tV2luZG93KTsKICAgICBxdWFyYW50aW5lZE9iamVjdCA9IFNj
cmlwdE9iamVjdCh2ODo6TG9jYWw8djg6Ok9iamVjdD4odjg6Ok9iamVjdDo6Q2FzdCgqdjhEb21X
aW5kb3cpKSk7CiAKICAgICByZXR1cm4gdHJ1ZTsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mvdjgv
U2NyaXB0Q2FsbFN0YWNrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Nj
cmlwdENhbGxTdGFjay5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92
OC9TY3JpcHRDYWxsU3RhY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICszOSw3IEBACiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKIFNjcmlwdENhbGxTdGFjazo6U2NyaXB0Q2FsbFN0YWNrKGNv
bnN0IHY4OjpBcmd1bWVudHMmIGFyZ3VtZW50cywgdW5zaWduZWQgc2tpcEFyZ3VtZW50Q291bnQp
Ci0gICAgOiBtX2xhc3RDYWxsZXIoU3RyaW5nKCksIFY4UHJveHk6OkdldFNvdXJjZU5hbWUoKSwg
VjhQcm94eTo6R2V0U291cmNlTGluZU51bWJlcigpICsgMSwgYXJndW1lbnRzLCBza2lwQXJndW1l
bnRDb3VudCkKKyAgICA6IG1fbGFzdENhbGxlcihTdHJpbmcoKSwgVjhQcm94eTo6c291cmNlTmFt
ZSgpLCBWOFByb3h5Ojpzb3VyY2VMaW5lTnVtYmVyKCkgKyAxLCBhcmd1bWVudHMsIHNraXBBcmd1
bWVudENvdW50KQogICAgICwgbV9zY3JpcHRTdGF0ZShuZXcgU2NyaXB0U3RhdGUoVjhQcm94eTo6
cmV0cmlldmVGcmFtZSgpKSkKIHsKIH0KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvU2NyaXB0
T2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjcmlwdE9iamVj
dC5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9TY3JpcHRPYmpl
Y3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTksNyArMTE5LDcgQEAKIGJvb2wgU2NyaXB0R2xv
YmFsT2JqZWN0OjpzZXQoU2NyaXB0U3RhdGUqIHNjcmlwdFN0YXRlLCBjb25zdCBjaGFyKiBuYW1l
LCBJbnNwZWN0b3JDb250cm9sbGVyKiB2YWx1ZSkKIHsKICAgICBTY3JpcHRTY29wZSBzY29wZShz
Y3JpcHRTdGF0ZSk7Ci0gICAgc2NvcGUuZ2xvYmFsKCktPlNldCh2ODo6U3RyaW5nOjpOZXcobmFt
ZSksIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVS
LCB2YWx1ZSkpOworICAgIHNjb3BlLmdsb2JhbCgpLT5TZXQodjg6OlN0cmluZzo6TmV3KG5hbWUp
LCBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OklOU1BFQ1RPUkNPTlRS
T0xMRVIsIHZhbHVlKSk7CiAgICAgcmV0dXJuIHNjb3BlLnN1Y2Nlc3MoKTsKIH0KIApJbmRleDog
V2ViQ29yZS9iaW5kaW5ncy92OC9WOE9iamVjdEV2ZW50TGlzdGVuZXIuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhPYmplY3RFdmVudExpc3RlbmVyLmNwcAkocmV2aXNp
b24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4T2JqZWN0RXZlbnRMaXN0ZW5lci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICBpZiAoZnJhbWUpIHsKICAg
ICAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShmcmFtZSk7CiAgICAgICAg
IGlmIChwcm94eSkKLSAgICAgICAgICAgIHByb3h5LT5SZW1vdmVPYmplY3RFdmVudExpc3RlbmVy
KGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHByb3h5LT5yZW1vdmVPYmplY3RFdmVudExpc3RlbmVy
KGxpc3RlbmVyKTsKIAogICAgICAgICAvLyBCZWNhdXNlIHRoZSBsaXN0ZW5lciBpcyBubyBsb25n
ZXIgaW4gdGhlIGxpc3QsIGl0IG11c3QgYmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIGZyYW1lIHRv
IGF2b2lkIGRhbmdsaW5nIGZyYW1lIHBvaW50ZXIKICAgICAgICAgLy8gaW4gdGhlIGRlc3RydWN0
b3IuCkBAIC02Niw3ICs2Niw3IEBACiAgICAgICAgIEFTU0VSVCghbV9saXN0ZW5lci5Jc0VtcHR5
KCkpOwogICAgICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKG1fZnJhbWUp
OwogICAgICAgICBpZiAocHJveHkpCi0gICAgICAgICAgICBwcm94eS0+UmVtb3ZlT2JqZWN0RXZl
bnRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIHByb3h5LT5yZW1vdmVPYmplY3RFdmVudExp
c3RlbmVyKHRoaXMpOwogICAgIH0KIAogICAgIGRpc3Bvc2VMaXN0ZW5lck9iamVjdCgpOwpJbmRl
eDogV2ViQ29yZS9iaW5kaW5ncy92OC9TY2hlZHVsZWRBY3Rpb24uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvYmluZGluZ3MvdjgvU2NoZWR1bGVkQWN0aW9uLmNwcAkocmV2aXNpb24gNDUwOTUp
CisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjaGVkdWxlZEFjdGlvbi5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTUwLDcgKzUwLDcgQEAKICAgICBtX2Z1bmN0aW9uID0gdjg6OlBlcnNpc3RlbnQ8djg6
OkZ1bmN0aW9uPjo6TmV3KGZ1bmMpOwogCiAjaWZuZGVmIE5ERUJVRwotICAgIFY4UHJveHk6OlJl
Z2lzdGVyR2xvYmFsSGFuZGxlKFNDSEVEVUxFRF9BQ1RJT04sIHRoaXMsIG1fZnVuY3Rpb24pOwor
ICAgIFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxlKFNDSEVEVUxFRF9BQ1RJT04sIHRoaXMs
IG1fZnVuY3Rpb24pOwogI2VuZGlmCiAKICAgICBtX2FyZ2MgPSBhcmdjOwpAQCAtNjAsNyArNjAs
NyBAQAogICAgICAgICAgICAgbV9hcmd2W2ldID0gdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPjo6
TmV3KGFyZ3ZbaV0pOwogCiAjaWZuZGVmIE5ERUJVRwotICAgIFY4UHJveHk6OlJlZ2lzdGVyR2xv
YmFsSGFuZGxlKFNDSEVEVUxFRF9BQ1RJT04sIHRoaXMsIG1fYXJndltpXSk7CisgICAgVjhQcm94
eTo6cmVnaXN0ZXJHbG9iYWxIYW5kbGUoU0NIRURVTEVEX0FDVElPTiwgdGhpcywgbV9hcmd2W2ld
KTsKICNlbmRpZgogICAgICAgICB9CiAgICAgfSBlbHNlCkBAIC03MywxMyArNzMsMTMgQEAKICAg
ICAgICAgcmV0dXJuOwogCiAjaWZuZGVmIE5ERUJVRwotICAgIFY4UHJveHk6OlVucmVnaXN0ZXJH
bG9iYWxIYW5kbGUodGhpcywgbV9mdW5jdGlvbik7CisgICAgVjhQcm94eTo6dW5yZWdpc3Rlckds
b2JhbEhhbmRsZSh0aGlzLCBtX2Z1bmN0aW9uKTsKICNlbmRpZgogICAgIG1fZnVuY3Rpb24uRGlz
cG9zZSgpOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2FyZ2M7IGkrKykgewogI2lmbmRl
ZiBOREVCVUcKLSAgICAgICAgVjhQcm94eTo6VW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBt
X2FyZ3ZbaV0pOworICAgICAgICBWOFByb3h5Ojp1bnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMs
IG1fYXJndltpXSk7CiAjZW5kaWYKICAgICAgICAgbV9hcmd2W2ldLkRpc3Bvc2UoKTsKICAgICB9
CkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICBBU1NFUlQocHJveHkpOwogCiAgICAgdjg6OkhhbmRs
ZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gdjhDb250ZXh0
ID0gcHJveHktPkdldENvbnRleHQoKTsKKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHY4Q29u
dGV4dCA9IHByb3h5LT5jb250ZXh0KCk7CiAgICAgaWYgKHY4Q29udGV4dC5Jc0VtcHR5KCkpCiAg
ICAgICAgIHJldHVybjsgLy8gSlMgbWF5IG5vdCBiZSBlbmFibGVkLgogCkBAIC0xMTYsNyArMTE2
LDcgQEAKIAogICAgIC8vIEZJWE1FOiBOZWVkIHRvIGltcGxlbWVudCB0aW1lb3V0cyBmb3IgcHJl
ZW1wdGluZyBhIGxvbmctcnVubmluZyBzY3JpcHQuCiAgICAgaWYgKCFtX2Z1bmN0aW9uLklzRW1w
dHkoKSAmJiBtX2Z1bmN0aW9uLT5Jc0Z1bmN0aW9uKCkpIHsKLSAgICAgICAgcHJveHktPkNhbGxG
dW5jdGlvbih2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+OjpDYXN0KG1fZnVuY3Rpb24pLCB2
OENvbnRleHQtPkdsb2JhbCgpLCBtX2FyZ2MsIG1fYXJndik7CisgICAgICAgIHByb3h5LT5jYWxs
RnVuY3Rpb24odjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uPjo6Q2FzdChtX2Z1bmN0aW9uKSwg
djhDb250ZXh0LT5HbG9iYWwoKSwgbV9hcmdjLCBtX2FyZ3YpOwogICAgICAgICBEb2N1bWVudDo6
dXBkYXRlU3R5bGVGb3JBbGxEb2N1bWVudHMoKTsKICAgICB9IGVsc2UKICAgICAgICAgcHJveHkt
PmV2YWx1YXRlKG1fY29kZSwgMCk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4UHJveHku
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhQcm94eS5jcHAJKHJldmlz
aW9uIDApCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4UHJveHkuY3BwCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDMxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisg
KiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0
aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250
cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2
ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
VjhQcm94eS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxpdHk+Cisj
aW5jbHVkZSA8djguaD4KKyNpbmNsdWRlIDx2OC1kZWJ1Zy5oPgorI2luY2x1ZGUgPHd0Zi9Bc3Nl
cnRpb25zLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9V
bnVzZWRQYXJhbS5oPgorCisjaW5jbHVkZSAiQ2hyb21pdW1CcmlkZ2UuaCIKKyNpbmNsdWRlICJD
U1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbi5oIgorI2luY2x1ZGUgIkRPTU9iamVjdHNJbmNsdWRl
LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJTY3JpcHRDb250cm9s
bGVyLmgiCisjaW5jbHVkZSAiVjhCaW5kaW5nLmgiCisjaW5jbHVkZSAiVjhDb2xsZWN0aW9uLmgi
CisjaW5jbHVkZSAiVjhDdXN0b21CaW5kaW5nLmgiCisjaW5jbHVkZSAiVjhET01NYXAuaCIKKyNp
bmNsdWRlICJWOERPTVdpbmRvdy5oIgorI2luY2x1ZGUgIlY4SW5kZXguaCIKKyNpbmNsdWRlICJX
b3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisv
LyBTdGF0aWMgdXRpbGl0eSBjb250ZXh0Lgordjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IFY4
UHJveHk6Om1fdXRpbGl0eUNvbnRleHQ7CisKKy8vIFN0YXRpYyBsaXN0IG9mIHJlZ2lzdGVyZWQg
ZXh0ZW5zaW9ucworVjhFeHRlbnNpb25MaXN0IFY4UHJveHk6Om1fZXh0ZW5zaW9uczsKKworY29u
c3QgY2hhciogVjhQcm94eTo6a0NvbnRleHREZWJ1Z0RhdGFUeXBlID0gInR5cGUiOworY29uc3Qg
Y2hhciogVjhQcm94eTo6a0NvbnRleHREZWJ1Z0RhdGFWYWx1ZSA9ICJ2YWx1ZSI7CisKKyNpZm5k
ZWYgTkRFQlVHCisvLyBLZWVwcyB0cmFjayBvZiBnbG9iYWwgaGFuZGxlcyBjcmVhdGVkIChub3Qg
SlMgd3JhcHBlcnMKKy8vIG9mIERPTSBvYmplY3RzKS4gT2Z0ZW4gdGhlc2UgZ2xvYmFsIGhhbmRs
ZXMgYXJlIHNvdXJjZQorLy8gb2YgbGVha3MuCisvLworLy8gSWYgeW91IHdhbnQgdG8gbGV0IGEg
QysrIG9iamVjdCBob2xkIGEgcGVyc2lzdGVudCBoYW5kbGUKKy8vIHRvIGEgSlMgb2JqZWN0LCB5
b3Ugc2hvdWxkIHJlZ2lzdGVyIHRoZSBoYW5kbGUgaGVyZSB0bworLy8ga2VlcCB0cmFjayBvZiBs
ZWFrcy4KKy8vCisvLyBXaGVuIGNyZWF0aW5nIGEgcGVyc2lzdGVudCBoYW5kbGUsIGNhbGw6Cisv
LworLy8gI2lmbmRlZiBOREVCVUcKKy8vICAgIFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxl
KHR5cGUsIGhvc3QsIGhhbmRsZSk7CisvLyAjZW5kaWYKKy8vCisvLyBXaGVuIHJlbGVhc2luZyB0
aGUgaGFuZGxlLCBjYWxsOgorLy8KKy8vICNpZm5kZWYgTkRFQlVHCisvLyAgICBWOFByb3h5Ojp1
bnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHR5cGUsIGhvc3QsIGhhbmRsZSk7CisvLyAjZW5kaWYKKy8v
Cit0eXBlZGVmIEhhc2hNYXA8djg6OlZhbHVlKiwgR2xvYmFsSGFuZGxlSW5mbyo+IEdsb2JhbEhh
bmRsZU1hcDsKKworc3RhdGljIEdsb2JhbEhhbmRsZU1hcCYgZ2xvYmFsSGFuZGxlTWFwKCkKK3sK
KyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEdsb2JhbEhhbmRsZU1hcCwgc3RhdGljR2xvYmFsSGFu
ZGxlTWFwLCAoKSk7CisgICAgcmV0dXJuIHN0YXRpY0dsb2JhbEhhbmRsZU1hcDsKK30KKworLy8g
VGhlIGZ1bmN0aW9uIGlzIHRoZSBwbGFjZSB0byBzZXQgdGhlIGJyZWFrIHBvaW50IHRvIGluc3Bl
Y3QKKy8vIGxpdmUgZ2xvYmFsIGhhbmRsZXMuIExlYWtzIGFyZSBvZnRlbiBjb21lIGZyb20gbGVh
a2VkIGdsb2JhbCBoYW5kbGVzLgorc3RhdGljIHZvaWQgZW51bWVyYXRlR2xvYmFsSGFuZGxlcygp
Cit7CisgICAgZm9yIChHbG9iYWxIYW5kbGVNYXA6Oml0ZXJhdG9yIGl0ID0gZ2xvYmFsSGFuZGxl
TWFwKCkuYmVnaW4oKSwgZW5kID0gZ2xvYmFsSGFuZGxlTWFwKCkuZW5kKCk7IGl0ICE9IGVuZDsg
KytpdCkgeworICAgICAgICBHbG9iYWxIYW5kbGVJbmZvKiBpbmZvID0gaXQtPnNlY29uZDsKKyAg
ICAgICAgVU5VU0VEX1BBUkFNKGluZm8pOworICAgICAgICB2ODo6VmFsdWUqIGhhbmRsZSA9IGl0
LT5maXJzdDsKKyAgICAgICAgVU5VU0VEX1BBUkFNKGhhbmRsZSk7CisgICAgfQorfQorCit2b2lk
IFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxlKEdsb2JhbEhhbmRsZVR5cGUgdHlwZSwgdm9p
ZCogaG9zdCwgdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiBoYW5kbGUpCit7CisgICAgQVNTRVJU
KCFnbG9iYWxIYW5kbGVNYXAoKS5jb250YWlucygqaGFuZGxlKSk7CisgICAgZ2xvYmFsSGFuZGxl
TWFwKCkuc2V0KCpoYW5kbGUsIG5ldyBHbG9iYWxIYW5kbGVJbmZvKGhvc3QsIHR5cGUpKTsKK30K
Kwordm9pZCBWOFByb3h5Ojp1bnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHZvaWQqIGhvc3QsIHY4OjpQ
ZXJzaXN0ZW50PHY4OjpWYWx1ZT4gaGFuZGxlKQoreworICAgIEFTU0VSVChnbG9iYWxIYW5kbGVN
YXAoKS5jb250YWlucygqaGFuZGxlKSk7CisgICAgR2xvYmFsSGFuZGxlSW5mbyogaW5mbyA9IGds
b2JhbEhhbmRsZU1hcCgpLnRha2UoKmhhbmRsZSk7CisgICAgQVNTRVJUKGluZm8tPmhvc3RfID09
IGhvc3QpOworICAgIGRlbGV0ZSBpbmZvOworfQorI2VuZGlmIC8vIGlmbmRlZiBOREVCVUcKKwor
dm9pZCBiYXRjaENvbmZpZ3VyZUF0dHJpYnV0ZXModjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxh
dGU+IGluc3RhbmNlLCB2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4gcHJvdG8sIGNvbnN0
IEJhdGNoZWRBdHRyaWJ1dGUqIGF0dHJpYnV0ZXMsIHNpemVfdCBhdHRyaWJ1dGVDb3VudCkKK3sK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF0dHJpYnV0ZUNvdW50OyArK2kpIHsKKyAgICAg
ICAgY29uc3QgQmF0Y2hlZEF0dHJpYnV0ZSogYXR0cmlidXRlID0gJmF0dHJpYnV0ZXNbaV07Cisg
ICAgICAgIChhdHRyaWJ1dGUtPm9uUHJvdG8gPyBwcm90byA6IGluc3RhbmNlKS0+U2V0QWNjZXNz
b3Iodjg6OlN0cmluZzo6TmV3KGF0dHJpYnV0ZS0+bmFtZSksCisgICAgICAgICAgICBhdHRyaWJ1
dGUtPmdldHRlciwKKyAgICAgICAgICAgIGF0dHJpYnV0ZS0+c2V0dGVyLAorICAgICAgICAgICAg
YXR0cmlidXRlLT5kYXRhID09IFY4Q2xhc3NJbmRleDo6SU5WQUxJRF9DTEFTU19JTkRFWCA/IHY4
OjpIYW5kbGU8djg6OlZhbHVlPigpIDogdjg6OkludGVnZXI6Ok5ldyhWOENsYXNzSW5kZXg6OlRv
SW50KGF0dHJpYnV0ZS0+ZGF0YSkpLAorICAgICAgICAgICAgYXR0cmlidXRlLT5zZXR0aW5ncywK
KyAgICAgICAgICAgIGF0dHJpYnV0ZS0+YXR0cmlidXRlKTsKKyAgICB9Cit9CisKK3ZvaWQgYmF0
Y2hDb25maWd1cmVDb25zdGFudHModjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gZnVu
Y3Rpb25EZXNjcmlwdG9yLCB2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4gcHJvdG8sIGNv
bnN0IEJhdGNoZWRDb25zdGFudCogY29uc3RhbnRzLCBzaXplX3QgY29uc3RhbnRDb3VudCkKK3sK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbnN0YW50Q291bnQ7ICsraSkgeworICAgICAg
ICBjb25zdCBCYXRjaGVkQ29uc3RhbnQqIGNvbnN0YW50ID0gJmNvbnN0YW50c1tpXTsKKyAgICAg
ICAgZnVuY3Rpb25EZXNjcmlwdG9yLT5TZXQodjg6OlN0cmluZzo6TmV3KGNvbnN0YW50LT5uYW1l
KSwgdjg6OkludGVnZXI6Ok5ldyhjb25zdGFudC0+dmFsdWUpLCB2ODo6UmVhZE9ubHkpOworICAg
ICAgICBwcm90by0+U2V0KHY4OjpTdHJpbmc6Ok5ldyhjb25zdGFudC0+bmFtZSksIHY4OjpJbnRl
Z2VyOjpOZXcoY29uc3RhbnQtPnZhbHVlKSwgdjg6OlJlYWRPbmx5KTsKKyAgICB9Cit9CisKK3R5
cGVkZWYgSGFzaE1hcDxOb2RlKiwgdjg6Ok9iamVjdCo+IERPTU5vZGVNYXA7Cit0eXBlZGVmIEhh
c2hNYXA8dm9pZCosIHY4OjpPYmplY3QqPiBET01PYmplY3RNYXA7CisKKyNpZm5kZWYgTkRFQlVH
CitzdGF0aWMgdm9pZCBlbnVtZXJhdGVET01PYmplY3RNYXAoRE9NT2JqZWN0TWFwJiB3cmFwcGVy
TWFwKQoreworICAgIGZvciAoRE9NT2JqZWN0TWFwOjppdGVyYXRvciBpdCA9IHdyYXBwZXJNYXAu
YmVnaW4oKSwgZW5kID0gd3JhcHBlck1hcC5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAg
ICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdyYXBwZXIoaXQtPnNlY29uZCk7CisgICAg
ICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6ZG9tV3JhcHBl
clR5cGUod3JhcHBlcik7CisgICAgICAgIHZvaWQqIG9iamVjdCA9IGl0LT5maXJzdDsKKyAgICAg
ICAgVU5VU0VEX1BBUkFNKHR5cGUpOworICAgICAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAg
ICB9Cit9CisKKworc3RhdGljIHZvaWQgZW51bWVyYXRlRE9NTm9kZU1hcChET01Ob2RlTWFwJiBu
b2RlTWFwKQoreworICAgIGZvciAoRE9NTm9kZU1hcDo6aXRlcmF0b3IgaXQgPSBub2RlTWFwLmJl
Z2luKCksIGVuZCA9IG5vZGVNYXAuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBO
b2RlKiBub2RlID0gaXQtPmZpcnN0OworICAgICAgICBVTlVTRURfUEFSQU0obm9kZSk7CisgICAg
ICAgIEFTU0VSVCh2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PihpdC0+c2Vjb25kKS5Jc1dlYWso
KSk7CisgICAgfQorfQorI2VuZGlmIC8vIE5ERUJVRworCisjaWYgRU5BQkxFKFNWRykKK3Y4OjpI
YW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpjb252ZXJ0U1ZHRWxlbWVudEluc3RhbmNlVG9WOE9i
amVjdChTVkdFbGVtZW50SW5zdGFuY2UqIGluc3RhbmNlKQoreworICAgIGlmICghaW5zdGFuY2Up
CisgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0
PiBleGlzdGluZ0luc3RhbmNlID0gZ2V0RE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwKCkuZ2V0KGlu
c3RhbmNlKTsKKyAgICBpZiAoIWV4aXN0aW5nSW5zdGFuY2UuSXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gZXhpc3RpbmdJbnN0YW5jZTsKKworICAgIGluc3RhbmNlLT5yZWYoKTsKKworICAgIC8v
IEluc3RhbnRpYXRlIHRoZSBWOCBvYmplY3QgYW5kIHJlbWVtYmVyIGl0CisgICAgdjg6OkhhbmRs
ZTx2ODo6T2JqZWN0PiByZXN1bHQgPSBpbnN0YW50aWF0ZVY4T2JqZWN0KFY4Q2xhc3NJbmRleDo6
U1ZHRUxFTUVOVElOU1RBTkNFLCBWOENsYXNzSW5kZXg6OlNWR0VMRU1FTlRJTlNUQU5DRSwgaW5z
dGFuY2UpOworICAgIGlmICghcmVzdWx0LklzRW1wdHkoKSkgeworICAgICAgICAvLyBPbmx5IHVw
ZGF0ZSB0aGUgRE9NIFNWRyBlbGVtZW50IG1hcCBpZiB0aGUgcmVzdWx0IGlzIG5vbi1lbXB0eS4K
KyAgICAgICAgZ2V0RE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwKCkuc2V0KGluc3RhbmNlLCB2ODo6
UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHJlc3VsdCkpOworICAgIH0KKyAgICByZXR1cm4g
cmVzdWx0OworfQorCisvLyBNYXAgb2YgU1ZHIG9iamVjdHMgd2l0aCBjb250ZXh0cyB0byB0aGVp
ciBjb250ZXh0cworc3RhdGljIEhhc2hNYXA8dm9pZCosIFNWR0VsZW1lbnQqPiYgc3ZnT2JqZWN0
VG9Db250ZXh0TWFwKCkKK3sKKyAgICB0eXBlZGVmIEhhc2hNYXA8dm9pZCosIFNWR0VsZW1lbnQq
PiBTdmdPYmplY3RUb0NvbnRleHRNYXA7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdmdPYmpl
Y3RUb0NvbnRleHRNYXAsIHN0YXRpY1N2Z09iamVjdFRvQ29udGV4dE1hcCwgKCkpOworICAgIHJl
dHVybiBzdGF0aWNTdmdPYmplY3RUb0NvbnRleHRNYXA7Cit9CisKK3Y4OjpIYW5kbGU8djg6OlZh
bHVlPiBWOFByb3h5Ojpjb252ZXJ0U1ZHT2JqZWN0V2l0aENvbnRleHRUb1Y4T2JqZWN0KFY4Q2xh
c3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBvYmplY3QpCit7CisgICAgaWYgKCFv
YmplY3QpCisgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisgICAgdjg6OlBlcnNpc3RlbnQ8
djg6Ok9iamVjdD4gcmVzdWx0ID0gZ2V0RE9NU1ZHT2JqZWN0V2l0aENvbnRleHRNYXAoKS5nZXQo
b2JqZWN0KTsKKyAgICBpZiAoIXJlc3VsdC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiByZXN1
bHQ7CisKKyAgICAvLyBTcGVjaWFsIGNhc2U6IFNWR1BhdGhTZWdzIG5lZWQgdG8gYmUgZG93bmNh
c3QgdG8gdGhlaXIgcmVhbCB0eXBlCisgICAgaWYgKHR5cGUgPT0gVjhDbGFzc0luZGV4OjpTVkdQ
QVRIU0VHKQorICAgICAgICB0eXBlID0gVjhDdXN0b206OkRvd25jYXN0U1ZHUGF0aFNlZyhvYmpl
Y3QpOworCisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4T2JqZWN0ID0gaW5zdGFudGlhdGVW
OE9iamVjdCh0eXBlLCB0eXBlLCBvYmplY3QpOworICAgIGlmICghdjhPYmplY3QuSXNFbXB0eSgp
KSB7CisgICAgICByZXN1bHQgPSB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHY4T2Jq
ZWN0KTsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworI2RlZmluZSBNQUtFX0NBU0UoVFlQRSwgTkFN
RSkgICAgIFwKKyAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpUWVBFOiBzdGF0aWNfY2FzdDxOQU1F
Kj4ob2JqZWN0KS0+cmVmKCk7IGJyZWFrOworICAgICAgU1ZHX09CSkVDVF9UWVBFUyhNQUtFX0NB
U0UpCisjdW5kZWYgTUFLRV9DQVNFCisjZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBOQU1FKSAgICAg
XAorICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OlRZUEU6ICAgIFwKKyAgICAgICAgICBzdGF0aWNf
Y2FzdDxWOFNWR1BPRFR5cGVXcmFwcGVyPE5BTUU+Kj4ob2JqZWN0KS0+cmVmKCk7IGJyZWFrOwor
ICAgICAgU1ZHX1BPRF9OQVRJVkVfVFlQRVMoTUFLRV9DQVNFKQorI3VuZGVmIE1BS0VfQ0FTRQor
ICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgIH0K
KyAgICAgIGdldERPTVNWR09iamVjdFdpdGhDb250ZXh0TWFwKCkuc2V0KG9iamVjdCwgcmVzdWx0
KTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgVjhQcm94eTo6c2V0U1ZHQ29u
dGV4dCh2b2lkKiBvYmplY3QsIFNWR0VsZW1lbnQqIGNvbnRleHQpCit7CisgICAgaWYgKCFvYmpl
Y3QpCisgICAgICAgIHJldHVybjsKKworICAgIFNWR0VsZW1lbnQqIG9sZENvbnRleHQgPSBzdmdP
YmplY3RUb0NvbnRleHRNYXAoKS5nZXQob2JqZWN0KTsKKworICAgIGlmIChvbGRDb250ZXh0ID09
IGNvbnRleHQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChvbGRDb250ZXh0KQorICAgICAg
ICBvbGRDb250ZXh0LT5kZXJlZigpOworCisgICAgaWYgKGNvbnRleHQpCisgICAgICAgIGNvbnRl
eHQtPnJlZigpOworCisgICAgc3ZnT2JqZWN0VG9Db250ZXh0TWFwKCkuc2V0KG9iamVjdCwgY29u
dGV4dCk7Cit9CisKK1NWR0VsZW1lbnQqIFY4UHJveHk6OnN2Z0NvbnRleHQodm9pZCogb2JqZWN0
KQoreworICAgIHJldHVybiBzdmdPYmplY3RUb0NvbnRleHRNYXAoKS5nZXQob2JqZWN0KTsKK30K
KworI2VuZGlmCisKKy8vIEEgbWFwIGZyb20gYSBET00gbm9kZSB0byBpdHMgSlMgd3JhcHBlciwg
dGhlIHdyYXBwZXIKKy8vIGlzIGtlcHQgYXMgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHN1cnZpdmUg
R0NzLgorc3RhdGljIERPTU9iamVjdE1hcCYgZ2NQcm90ZWN0ZWRNYXAoKSB7CisgICAgREVGSU5F
X1NUQVRJQ19MT0NBTChET01PYmplY3RNYXAsIHN0YXRpY0djUHJvdGVjdGVkTWFwLCAoKSk7Cisg
ICAgcmV0dXJuIHN0YXRpY0djUHJvdGVjdGVkTWFwOworfQorCit2b2lkIFY4UHJveHk6OmdjUHJv
dGVjdCh2b2lkKiBkb21PYmplY3QpCit7CisgICAgaWYgKCFkb21PYmplY3QpCisgICAgICAgIHJl
dHVybjsKKyAgICBpZiAoZ2NQcm90ZWN0ZWRNYXAoKS5jb250YWlucyhkb21PYmplY3QpKQorICAg
ICAgICByZXR1cm47CisgICAgaWYgKCFnZXRET01PYmplY3RNYXAoKS5jb250YWlucyhkb21PYmpl
Y3QpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgKHN0cm9uZykgcGVy
c2lzdGVudCBoYW5kbGUgZm9yIHRoZSBvYmplY3QuCisgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9i
amVjdD4gd3JhcHBlciA9IGdldERPTU9iamVjdE1hcCgpLmdldChkb21PYmplY3QpOworICAgIGlm
ICh3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZ2NQcm90ZWN0ZWRN
YXAoKS5zZXQoZG9tT2JqZWN0LCAqdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyh3cmFw
cGVyKSk7Cit9CisKK3ZvaWQgVjhQcm94eTo6Z2NVbnByb3RlY3Qodm9pZCogZG9tT2JqZWN0KQor
eworICAgIGlmICghZG9tT2JqZWN0KQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFnY1Byb3Rl
Y3RlZE1hcCgpLmNvbnRhaW5zKGRvbU9iamVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8v
IERpc3Bvc2UgdGhlIHN0cm9uZyByZWZlcmVuY2UuCisgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9i
amVjdD4gd3JhcHBlcihnY1Byb3RlY3RlZE1hcCgpLnRha2UoZG9tT2JqZWN0KSk7CisgICAgd3Jh
cHBlci5EaXNwb3NlKCk7Cit9CisKKy8vIENyZWF0ZSBvYmplY3QgZ3JvdXBzIGZvciBET00gdHJl
ZSBub2Rlcy4KK3N0YXRpYyB2b2lkIGdjUHJvbG9ndWUoKQoreworICAgIHY4OjpIYW5kbGVTY29w
ZSBzY29wZTsKKworI2lmbmRlZiBOREVCVUcKKyAgICBlbnVtZXJhdGVET01PYmplY3RNYXAoZ2V0
RE9NT2JqZWN0TWFwKCkuaW1wbCgpKTsKKyNlbmRpZgorCisgICAgLy8gUnVuIHRocm91Z2ggYWxs
IG9iamVjdHMgd2l0aCBwb3NzaWJsZSBwZW5kaW5nIGFjdGl2aXR5IG1ha2luZyB0aGVpcgorICAg
IC8vIHdyYXBwZXJzIG5vbiB3ZWFrIGlmIHRoZXJlIGlzIHBlbmRpbmcgYWN0aXZpdHkuCisgICAg
RE9NT2JqZWN0TWFwIGFjdGl2ZU1hcCA9IGdldEFjdGl2ZURPTU9iamVjdE1hcCgpLmltcGwoKTsK
KyAgICBmb3IgKERPTU9iamVjdE1hcDo6aXRlcmF0b3IgaXQgPSBhY3RpdmVNYXAuYmVnaW4oKSwg
ZW5kID0gYWN0aXZlTWFwLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgdm9pZCog
b2JqZWN0ID0gaXQtPmZpcnN0OworICAgICAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiB3
cmFwcGVyID0gdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4oaXQtPnNlY29uZCk7CisgICAgICAg
IEFTU0VSVCh3cmFwcGVyLklzV2VhaygpKTsKKyAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBw
ZXJUeXBlIHR5cGUgPSBWOFByb3h5Ojpkb21XcmFwcGVyVHlwZSh3cmFwcGVyKTsKKyAgICAgICAg
c3dpdGNoICh0eXBlKSB7CisjZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBOQU1FKSAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpUWVBFOiB7ICAgICAg
ICAgICAgICAgICAgICBcCisgICAgICAgICAgICBOQU1FKiBpbXBsID0gc3RhdGljX2Nhc3Q8TkFN
RSo+KG9iamVjdCk7ICBcCisgICAgICAgICAgICBpZiAoaW1wbC0+aGFzUGVuZGluZ0FjdGl2aXR5
KCkpICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd3JhcHBlci5DbGVhcldlYWsoKTsgICAg
ICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgICAgIH0KKyAgICAgICAgQUNUSVZFX0RPTV9PQkpFQ1RfVFlQ
RVMoTUFLRV9DQVNFKQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisjdW5kZWYgTUFLRV9DQVNFCisgICAgICAgIH0KKworICAgICAgICAvLyBBZGRp
dGlvbmFsIGhhbmRsaW5nIG9mIG1lc3NhZ2UgcG9ydCBlbnN1cmluZyB0aGF0IGVudGFuZ2xlZCBw
b3J0cyBhbHNvCisgICAgICAgIC8vIGhhdmUgdGhlaXIgd3JhcHBlcnMgZW50YW5nbGVkLiBUaGlz
IHNob3VsZCBpZGVhbGx5IGJlIGhhbmRsZWQgd2hlbiB0aGUKKyAgICAgICAgLy8gcG9ydHMgYXJl
IGFjdHVhbGx5IGVudGFuZ2xlZCBpbiBNZXNzYWdlUG9ydDo6ZW50YW5nbGUsIGJ1dCB0byBhdm9p
ZAorICAgICAgICAvLyBmb3JraW5nIE1lc3NhZ2VQb3J0LiogdGhpcyBpcyBwb3N0cG9uZWQgdG8g
R0MgdGltZS4gSGF2aW5nIHRoaXMgcG9zdHBvbmVkCisgICAgICAgIC8vIGhhcyB0aGUgZHJhd2Jh
Y2sgdGhhdCB0aGUgd3JhcHBlcnMgYXJlICJlbnRhbmdsZWQvdW5lbnRhbmdsZWQiIGZvciBlYWNo
CisgICAgICAgIC8vIEdDIGV2ZW4gdGhvdWdoIHRoZWlyIGVudGFnbGVtZW50IG1vc3QgbGlrZWx5
IGlzIHN0aWxsIHRoZSBzYW1lLgorICAgICAgICBpZiAodHlwZSA9PSBWOENsYXNzSW5kZXg6Ok1F
U1NBR0VQT1JUKSB7CisgICAgICAgICAgICAvLyBHZXQgdGhlIHBvcnQgYW5kIGl0cyBlbnRhbmds
ZWQgcG9ydC4KKyAgICAgICAgICAgIE1lc3NhZ2VQb3J0KiBwb3J0MSA9IHN0YXRpY19jYXN0PE1l
c3NhZ2VQb3J0Kj4ob2JqZWN0KTsKKyAgICAgICAgICAgIE1lc3NhZ2VQb3J0KiBwb3J0MiA9IHBv
cnQxLT5sb2NhbGx5RW50YW5nbGVkUG9ydCgpOw0KKw0KKyAgICAgICAgICAgIC8vIElmIHdlIGFy
ZSByZW1vdGVseSBlbnRhbmdsZWQsIHRoZW4gbWFyayB0aGlzIG9iamVjdCBhcyByZWFjaGFibGUN
CisgICAgICAgICAgICAvLyAod2UgY2FuJ3QgZGV0ZXJtaW5lIHJlYWNoYWJpbGl0eSBkaXJlY3Rs
eSBhcyB0aGUgcmVtb3RlIG9iamVjdCBpcw0KKyAgICAgICAgICAgIC8vIG91dC1vZi1wcm9jKS4N
CisgICAgICAgICAgICBpZiAocG9ydDEtPmlzRW50YW5nbGVkKCkgJiYgIXBvcnQyKQ0KKyAgICAg
ICAgICAgICAgICB3cmFwcGVyLkNsZWFyV2VhaygpOworCisgICAgICAgICAgICBpZiAoIXBvcnQy
KSB7CisgICAgICAgICAgICAgICAgLy8gQXMgcG9ydHMgYXJlIGFsd2F5cyBlbnRhbmdsZWQgaW4g
cGFpcnMgb25seSBwZXJmb3JtIHRoZSBlbnRhbmdsZW1lbnQKKyAgICAgICAgICAgICAgICAvLyBv
bmNlIGZvciBlYWNoIHBhaXIgKHNlZSBBU1NFUlQgaW4gTWVzc2FnZVBvcnQ6OnVuZW50YW5nbGUo
KSkuCisgICAgICAgICAgICAgICAgaWYgKHBvcnQxIDwgcG9ydDIpIHsKKyAgICAgICAgICAgICAg
ICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHBvcnQxV3JhcHBlciA9IFY4UHJveHk6OmNvbnZl
cnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIHBvcnQxKTsKKyAgICAgICAg
ICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHBvcnQyV3JhcHBlciA9IFY4UHJveHk6
OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIHBvcnQyKTsKKyAg
ICAgICAgICAgICAgICAgICAgQVNTRVJUKHBvcnQxV3JhcHBlci0+SXNPYmplY3QoKSk7CisgICAg
ICAgICAgICAgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QocG9ydDFXcmFwcGVy
KS0+U2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a01lc3NhZ2VQb3J0RW50YW5nbGVkUG9ydElu
ZGV4LCBwb3J0MldyYXBwZXIpOworICAgICAgICAgICAgICAgICAgICBBU1NFUlQocG9ydDJXcmFw
cGVyLT5Jc09iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0Pjo6Q2FzdChwb3J0MldyYXBwZXIpLT5TZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprTWVz
c2FnZVBvcnRFbnRhbmdsZWRQb3J0SW5kZXgsIHBvcnQxV3JhcHBlcik7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhl
IHdyYXBwZXIgZW50YW5nbGVtZW50IHdoZW4gYSBwb3J0IGlzIG5vdCBlbnRhbmdsZWQuCisgICAg
ICAgICAgICAgICAgaWYgKFY4UHJveHk6OmRvbU9iamVjdEhhc0pTV3JhcHBlcihwb3J0MSkpIHsK
KyAgICAgICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdyYXBwZXIgPSBWOFBy
b3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JULCBwb3J0MSk7
CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVCh3cmFwcGVyLT5Jc09iamVjdCgpKTsKKyAgICAg
ICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh3cmFwcGVyKS0+U2V0
SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a01lc3NhZ2VQb3J0RW50YW5nbGVkUG9ydEluZGV4LCB2
ODo6VW5kZWZpbmVkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0KKworICAgIC8vIENyZWF0ZSBvYmplY3QgZ3JvdXBzLgorICAgIHR5cGVkZWYg
c3RkOjpwYWlyPHVpbnRwdHJfdCwgTm9kZSo+IEdyb3VwZXJQYWlyOworICAgIHR5cGVkZWYgVmVj
dG9yPEdyb3VwZXJQYWlyPiBHcm91cGVyTGlzdDsKKworICAgIERPTU5vZGVNYXAgbm9kZU1hcCA9
IGdldERPTU5vZGVNYXAoKS5pbXBsKCk7CisgICAgR3JvdXBlckxpc3QgZ3JvdXBlcjsKKyAgICBn
cm91cGVyLnJlc2VydmVDYXBhY2l0eShub2RlTWFwLnNpemUoKSk7CisKKyAgICBmb3IgKERPTU5v
ZGVNYXA6Oml0ZXJhdG9yIGl0ID0gbm9kZU1hcC5iZWdpbigpLCBlbmQgPSBub2RlTWFwLmVuZCgp
OyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgTm9kZSogbm9kZSA9IGl0LT5maXJzdDsKKwor
ICAgICAgICAvLyBJZiB0aGUgbm9kZSBpcyBpbiBkb2N1bWVudCwgcHV0IGl0IGluIHRoZSBvd25l
ckRvY3VtZW50J3Mgb2JqZWN0IGdyb3VwLgorICAgICAgICAvLworICAgICAgICAvLyBJZiBhbiBp
bWFnZSBlbGVtZW50IHdhcyBjcmVhdGVkIGJ5IEphdmFTY3JpcHQgIm5ldyBJbWFnZSIsCisgICAg
ICAgIC8vIGl0IGlzIG5vdCBpbiBhIGRvY3VtZW50LiBIb3dldmVyLCBpZiB0aGUgbG9hZCBldmVu
dCBoYXMgbm90CisgICAgICAgIC8vIGJlZW4gZmlyZWQgKHN0aWxsIG9ubG9hZGluZyksIGl0IGlz
IHRyZWF0ZWQgYXMgaW4gdGhlIGRvY3VtZW50LgorICAgICAgICAvLworICAgICAgICAvLyBPdGhl
cndpc2UsIHRoZSBub2RlIGlzIHB1dCBpbiBhbiBvYmplY3QgZ3JvdXAgaWRlbnRpZmllZCBieSB0
aGUgcm9vdAorICAgICAgICAvLyBlbG1lbnQgb2YgdGhlIHRyZWUgdG8gd2hpY2ggaXQgYmVsb25n
cy4KKyAgICAgICAgdWludHB0cl90IGdyb3VwSWQ7CisgICAgICAgIGlmIChub2RlLT5pbkRvY3Vt
ZW50KCkgfHwgKG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjppbWdUYWcpICYmICFzdGF0aWNf
Y2FzdDxIVE1MSW1hZ2VFbGVtZW50Kj4obm9kZSktPmhhdmVGaXJlZExvYWRFdmVudCgpKSkgewor
ICAgICAgICAgICAgZ3JvdXBJZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihub2RlLT5k
b2N1bWVudCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE5vZGUqIHJvb3QgPSBu
b2RlOworICAgICAgICAgICAgd2hpbGUgKHJvb3QtPnBhcmVudCgpKQorICAgICAgICAgICAgICAg
IHJvb3QgPSByb290LT5wYXJlbnQoKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMg
YWxvbmUgaW4gaXRzIERPTSB0cmVlIChkb2Vzbid0IGhhdmUgYSBwYXJlbnQgb3IgYW55CisgICAg
ICAgICAgICAvLyBjaGlsZHJlbikgdGhlbiB0aGUgZ3JvdXAgd2lsbCBiZSBmaWx0ZXJlZCBvdXQg
bGF0ZXIgYW55d2F5LgorICAgICAgICAgICAgaWYgKHJvb3QgPT0gbm9kZSAmJiAhbm9kZS0+aGFz
Q2hpbGROb2RlcygpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBn
cm91cElkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHJvb3QpOworICAgICAgICB9Cisg
ICAgICAgIGdyb3VwZXIuYXBwZW5kKEdyb3VwZXJQYWlyKGdyb3VwSWQsIG5vZGUpKTsKKyAgICB9
CisKKyAgICAvLyBHcm91cCBieSBzb3J0aW5nIGJ5IHRoZSBncm91cCBpZC4gIFRoaXMgd2lsbCB1
c2UgdGhlIHN0ZDo6cGFpciBvcGVyYXRvcjwsCisgICAgLy8gd2hpY2ggd2lsbCByZWFsbHkgc29y
dCBieSBib3RoIHRoZSBncm91cCBpZCBhbmQgdGhlIE5vZGUqLiAgSG93ZXZlciB0aGUKKyAgICAv
LyBOb2RlKiBpcyBvbmx5IGludm9sdmVkIHRvIHNvcnQgd2l0aGluIGEgZ3JvdXAgaWQsIHNvIGl0
IHdpbGwgYmUgZmluZS4KKyAgICBzdGQ6OnNvcnQoZ3JvdXBlci5iZWdpbigpLCBncm91cGVyLmVu
ZCgpKTsKKworICAgIC8vIEZJWE1FOiBTaG91bGQgcHJvYmFibHkgd29yayBpbiBpdGVyYXRvcnMg
aGVyZSwgYnV0IGluZGV4ZXMgd2VyZQorICAgIC8vIGVhc2llciBmb3IgbXkgc2ltcGxlIG1pbmQu
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBncm91cGVyLnNpemUoKTsgKSB7CisgICAgICAg
IC8vIFNlZWsgdG8gdGhlIG5leHQga2V5IChvciB0aGUgZW5kIG9mIHRoZSBsaXN0KS4KKyAgICAg
ICAgc2l6ZV90IG5leHRLZXlJbmRleCA9IGdyb3VwZXIuc2l6ZSgpOworICAgICAgICBmb3IgKHNp
emVfdCBqID0gaTsgaiA8IGdyb3VwZXIuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIGlmIChn
cm91cGVyW2ldLmZpcnN0ICE9IGdyb3VwZXJbal0uZmlyc3QpIHsKKyAgICAgICAgICAgICAgbmV4
dEtleUluZGV4ID0gajsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKworICAgICAgICBBU1NFUlQobmV4dEtleUluZGV4ID4gaSk7CisKKyAgICAgICAgLy8g
V2Ugb25seSBjYXJlIGFib3V0IGEgZ3JvdXAgaWYgaXQgaGFzIG1vcmUgdGhhbiBvbmUgb2JqZWN0
LiAgSWYgaXQgb25seQorICAgICAgICAvLyBoYXMgb25lIG9iamVjdCwgaXQgaGFzIG5vdGhpbmcg
ZWxzZSB0aGF0IG5lZWRzIHRvIGJlIGtlcHQgYWxpdmUuCisgICAgICAgIGlmIChuZXh0S2V5SW5k
ZXggLSBpIDw9IDEpIHsKKyAgICAgICAgICAgIGkgPSBuZXh0S2V5SW5kZXg7CisgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIFZlY3Rvcjx2ODo6UGVyc2lzdGVudDx2
ODo6VmFsdWU+ID4gZ3JvdXA7CisgICAgICAgIGdyb3VwLnJlc2VydmVDYXBhY2l0eShuZXh0S2V5
SW5kZXggLSBpKTsKKyAgICAgICAgZm9yICg7IGkgPCBuZXh0S2V5SW5kZXg7ICsraSkgeworICAg
ICAgICAgICAgTm9kZSogbm9kZSA9IGdyb3VwZXJbaV0uc2Vjb25kOworICAgICAgICAgICAgdjg6
OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB3cmFwcGVyID0gZ2V0RE9NTm9kZU1hcCgpLmdldChub2Rl
KTsKKyAgICAgICAgICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpCisgICAgICAgICAgICAgICAg
Z3JvdXAuYXBwZW5kKHdyYXBwZXIpOworICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgc3R5
bGVkIGFuZCB0aGVyZSBpcyBhIHdyYXBwZXIgZm9yIHRoZSBpbmxpbmUKKyAgICAgICAgICAgIC8v
IHN0eWxlIGRlY2xhcmF0aW9uLCB3ZSBuZWVkIHRvIGtlZXAgdGhhdCBzdHlsZSBkZWNsYXJhdGlv
bgorICAgICAgICAgICAgLy8gd3JhcHBlciBhbGl2ZSBhcyB3ZWxsLCBzbyB3ZSBhZGQgaXQgdG8g
dGhlIG9iamVjdCBncm91cC4KKyAgICAgICAgICAgIGlmIChub2RlLT5pc1N0eWxlZEVsZW1lbnQo
KSkgeworICAgICAgICAgICAgICAgIFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQgPSByZWludGVycHJl
dF9jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKTsKKyAgICAgICAgICAgICAgICBDU1NTdHlsZURl
Y2xhcmF0aW9uKiBzdHlsZSA9IGVsZW1lbnQtPmlubGluZVN0eWxlRGVjbCgpOworICAgICAgICAg
ICAgICAgIGlmICghc3R5bGUpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JhcHBlciA9IGdldERP
TU9iamVjdE1hcCgpLmdldChzdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghd3JhcHBl
ci5Jc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cC5hcHBlbmQod3JhcHBl
cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgaWYgKGdyb3VwLnNpemUoKSA+IDEpCisgICAgICAgICAgICB2ODo6Vjg6OkFkZE9iamVjdEdy
b3VwKCZncm91cFswXSwgZ3JvdXAuc2l6ZSgpKTsKKworICAgICAgICBBU1NFUlQoaSA9PSBuZXh0
S2V5SW5kZXgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2NFcGlsb2d1ZSgpCit7CisgICAg
djg6OkhhbmRsZVNjb3BlIHNjb3BlOworCisgICAgLy8gUnVuIHRocm91Z2ggYWxsIG9iamVjdHMg
d2l0aCBwZW5kaW5nIGFjdGl2aXR5IG1ha2luZyB0aGVpciB3cmFwcGVycyB3ZWFrIGFnYWluLgor
ICAgIERPTU9iamVjdE1hcCBhY3RpdmVNYXAgPSBnZXRBY3RpdmVET01PYmplY3RNYXAoKS5pbXBs
KCk7CisgICAgZm9yIChET01PYmplY3RNYXA6Oml0ZXJhdG9yIGl0ID0gYWN0aXZlTWFwLmJlZ2lu
KCksIGVuZCA9IGFjdGl2ZU1hcC5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIHZv
aWQqIG9iaiA9IGl0LT5maXJzdDsKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4g
d3JhcHBlciA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+KGl0LT5zZWNvbmQpOworICAgICAg
ICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IFY4UHJveHk6OmRvbVdyYXBwZXJU
eXBlKHdyYXBwZXIpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyNkZWZpbmUgTUFLRV9DQVNF
KFRZUEUsIE5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpUWVBFOiB7ICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXAorICAgICAgICAgICAgTkFNRSogaW1wbCA9IHN0YXRpY19jYXN0PE5BTUUq
PihvYmopOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChpbXBsLT5oYXNQ
ZW5kaW5nQWN0aXZpdHkoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAg
ICAgICAgQVNTRVJUKCF3cmFwcGVyLklzV2VhaygpKTsgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICAgICAgICAgICAgICAgIHdyYXBwZXIuTWFrZVdlYWsoaW1wbCwgJndlYWtBY3RpdmVE
T01PYmplY3RDYWxsYmFjayk7IFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAg
ICAgICB9CisgICAgICAgIEFDVElWRV9ET01fT0JKRUNUX1RZUEVTKE1BS0VfQ0FTRSkKKyAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworI3VuZGVmIE1B
S0VfQ0FTRQorICAgICAgICB9CisgICAgfQorCisjaWZuZGVmIE5ERUJVRworICAgIC8vIENoZWNr
IGFsbCBzdXJ2aXZhbHMgYXJlIHdlYWsuCisgICAgZW51bWVyYXRlRE9NT2JqZWN0TWFwKGdldERP
TU9iamVjdE1hcCgpLmltcGwoKSk7CisgICAgZW51bWVyYXRlRE9NTm9kZU1hcChnZXRET01Ob2Rl
TWFwKCkuaW1wbCgpKTsKKyAgICBlbnVtZXJhdGVET01PYmplY3RNYXAoZ2NQcm90ZWN0ZWRNYXAo
KSk7CisgICAgZW51bWVyYXRlR2xvYmFsSGFuZGxlcygpOworI2VuZGlmCit9CisKK3R5cGVkZWYg
SGFzaE1hcDxpbnQsIHY4OjpGdW5jdGlvblRlbXBsYXRlKj4gRnVuY3Rpb25UZW1wbGF0ZU1hcDsK
KworYm9vbCBBbGxvd0FsbG9jYXRpb246Om1fY3VycmVudCA9IGZhbHNlOworCisvLyBKYXZhU2Ny
aXB0Q29uc29sZU1lc3NhZ2VzIGVuY2Fwc3VsYXRlIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvCisvLyBs
b2cgbWVzc2FnZXMgb3JpZ2luYXRpbmcgZnJvbSBKYXZhU2NyaXB0IHRvIHRoZSBDaHJvbWUgY29u
c29sZS4KK2NsYXNzIEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZSB7CitwdWJsaWM6CisgICAgSmF2
YVNjcmlwdENvbnNvbGVNZXNzYWdlKGNvbnN0IFN0cmluZyYgc3RyaW5nLCBjb25zdCBTdHJpbmcm
IHNvdXJjZUlELCB1bnNpZ25lZCBsaW5lTnVtYmVyKQorICAgICAgICA6IG1fc3RyaW5nKHN0cmlu
ZykKKyAgICAgICAgLCBtX3NvdXJjZUlEKHNvdXJjZUlEKQorICAgICAgICAsIG1fbGluZU51bWJl
cihsaW5lTnVtYmVyKSB7IH0KKworICAgIHZvaWQgYWRkVG9QYWdlKFBhZ2UqKSBjb25zdDsKKwor
cHJpdmF0ZToKKyAgICBjb25zdCBTdHJpbmcgbV9zdHJpbmc7CisgICAgY29uc3QgU3RyaW5nIG1f
c291cmNlSUQ7CisgICAgY29uc3QgdW5zaWduZWQgbV9saW5lTnVtYmVyOworfTsKKwordm9pZCBK
YXZhU2NyaXB0Q29uc29sZU1lc3NhZ2U6OmFkZFRvUGFnZShQYWdlKiBwYWdlKSBjb25zdAorewor
ICAgIEFTU0VSVChwYWdlKTsKKyAgICBDb25zb2xlKiBjb25zb2xlID0gcGFnZS0+bWFpbkZyYW1l
KCktPmRvbVdpbmRvdygpLT5jb25zb2xlKCk7CisgICAgY29uc29sZS0+YWRkTWVzc2FnZShKU01l
c3NhZ2VTb3VyY2UsIEVycm9yTWVzc2FnZUxldmVsLCBtX3N0cmluZywgbV9saW5lTnVtYmVyLCBt
X3NvdXJjZUlEKTsKK30KKworLy8gVGhlIENvbnNvbGVNZXNzYWdlTWFuYWdlciBoYW5kbGVzIGFs
bCBjb25zb2xlIG1lc3NhZ2VzIHRoYXQgc3RlbQorLy8gZnJvbSBKYXZhU2NyaXB0LiBJdCBrZWVw
cyBhIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCBoYXZlIGJlZW4gZGVsYXllZCBidXQKKy8vIGl0IG1h
a2VzIHN1cmUgdG8gYWRkIGFsbCBtZXNzYWdlcyB0byB0aGUgY29uc29sZSBpbiB0aGUgcmlnaHQg
b3JkZXIuCitjbGFzcyBDb25zb2xlTWVzc2FnZU1hbmFnZXIgeworcHVibGljOgorICAgIC8vIEFk
ZCBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUuIE1heSBlbmQgdXAgY2FsbGluZyBKYXZhU2NyaXB0
IGNvZGUKKyAgICAvLyBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIGluc3BlY3RvciBzbyBvbmx5IGNh
bGwgdGhpcyBmdW5jdGlvbiB3aGVuCisgICAgLy8gaXQgaXMgc2FmZSB0byBkbyBhbGxvY2F0aW9u
cy4KKyAgICBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKFBhZ2UqLCBjb25zdCBKYXZhU2NyaXB0Q29u
c29sZU1lc3NhZ2UmKTsKKworICAgIC8vIEFkZCBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUgYnV0
IGRlbGF5IHRoZSByZXBvcnRpbmcgdW50aWwgaXQKKyAgICAvLyBpcyBzYWZlIHRvIGRvIHNvOiBF
aXRoZXIgd2hlbiB3ZSBsZWF2ZSBKYXZhU2NyaXB0IGV4ZWN1dGlvbiBvcgorICAgIC8vIHdoZW4g
YWRkaW5nIG90aGVyIGNvbnNvbGUgbWVzc2FnZXMuIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhp
cworICAgIC8vIG1ldGhvZCBpcyB0byBhdm9pZCBjYWxsaW5nIGludG8gVjggdG8gaGFuZGxlIGNv
bnNvbGUgbWVzc2FnZXMKKyAgICAvLyB3aGVuIHRoZSBWTSBpcyBpbiBhIHN0YXRlIHRoYXQgZG9l
cyBub3Qgc3VwcG9ydCBHQ3Mgb3IgYWxsb2NhdGlvbnMuCisgICAgLy8gRGVsYXllZCBtZXNzYWdl
cyBhcmUgYWx3YXlzIHJlcG9ydGVkIGluIHRoZSBwYWdlIGNvcnJlc3BvbmRpbmcKKyAgICAvLyB0
byB0aGUgYWN0aXZlIGNvbnRleHQuCisgICAgc3RhdGljIHZvaWQgYWRkRGVsYXllZE1lc3NhZ2Uo
Y29uc3QgSmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlJik7CisKKyAgICAvLyBQcm9jZXNzIGFueSBk
ZWxheWVkIG1lc3NhZ2VzLiBNYXkgZW5kIHVwIGNhbGxpbmcgSmF2YVNjcmlwdCBjb2RlCisgICAg
Ly8gaW5kaXJlY3RseSB0aHJvdWdoIHRoZSBpbnNwZWN0b3Igc28gb25seSBjYWxsIHRoaXMgZnVu
Y3Rpb24gd2hlbgorICAgIC8vIGl0IGlzIHNhZmUgdG8gZG8gYWxsb2NhdGlvbnMuCisgICAgc3Rh
dGljIHZvaWQgcHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpOworCitwcml2YXRlOgorICAgIC8vIEFs
bCBkZWxheWVkIG1lc3NhZ2VzIGFyZSBzdG9yZWQgaW4gdGhpcyB2ZWN0b3IuIElmIHRoZSB2ZWN0
b3IKKyAgICAvLyBpcyBOVUxMLCB0aGVyZSBhcmUgbm8gZGVsYXllZCBtZXNzYWdlcy4KKyAgICBz
dGF0aWMgVmVjdG9yPEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZT4qIG1fZGVsYXllZDsKK307CisK
K1ZlY3RvcjxKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2U+KiBDb25zb2xlTWVzc2FnZU1hbmFnZXI6
Om1fZGVsYXllZCA9IDA7CisKK3ZvaWQgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjphZGRNZXNzYWdl
KFBhZ2UqIHBhZ2UsIGNvbnN0IEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZSYgbWVzc2FnZSkKK3sK
KyAgICAvLyBQcm9jZXNzIGFueSBkZWxheWVkIG1lc3NhZ2VzIHRvIG1ha2Ugc3VyZSB0aGF0IG1l
c3NhZ2VzCisgICAgLy8gYXBwZWFyIGluIHRoZSByaWdodCBvcmRlciBpbiB0aGUgY29uc29sZS4K
KyAgICBwcm9jZXNzRGVsYXllZE1lc3NhZ2VzKCk7CisgICAgbWVzc2FnZS5hZGRUb1BhZ2UocGFn
ZSk7Cit9CisKK3ZvaWQgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjphZGREZWxheWVkTWVzc2FnZShj
b25zdCBKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UmIG1lc3NhZ2UpCit7CisgICAgaWYgKCFtX2Rl
bGF5ZWQpIHsKKyAgICAgICAgLy8gQWxsb2NhdGUgYSB2ZWN0b3IgZm9yIHRoZSBkZWxheWVkIG1l
c3NhZ2VzLiBXaWxsIGJlCisgICAgICAgIC8vIGRlYWxsb2NhdGVkIHdoZW4gdGhlIGRlbGF5ZWQg
bWVzc2FnZXMgYXJlIHByb2Nlc3NlZAorICAgICAgICAvLyBpbiBwcm9jZXNzRGVsYXllZE1lc3Nh
Z2VzKCkuCisgICAgICAgIG1fZGVsYXllZCA9IG5ldyBWZWN0b3I8SmF2YVNjcmlwdENvbnNvbGVN
ZXNzYWdlPigpOworICAgIH0KKyAgICBtX2RlbGF5ZWQtPmFwcGVuZChtZXNzYWdlKTsKK30KKwor
dm9pZCBDb25zb2xlTWVzc2FnZU1hbmFnZXI6OnByb2Nlc3NEZWxheWVkTWVzc2FnZXMoKQorewor
ICAgIC8vIElmIHdlIGhhdmUgYSBkZWxheWVkIHZlY3RvciBpdCBjYW5ub3QgYmUgZW1wdHkuCisg
ICAgaWYgKCFtX2RlbGF5ZWQpCisgICAgICAgIHJldHVybjsKKyAgICBBU1NFUlQoIW1fZGVsYXll
ZC0+aXNFbXB0eSgpKTsKKworICAgIC8vIEFkZCB0aGUgZGVsYXllZCBtZXNzYWdlcyB0byB0aGUg
cGFnZSBvZiB0aGUgYWN0aXZlCisgICAgLy8gY29udGV4dC4gSWYgdGhhdCBmb3Igc29tZSBiaXph
cnJlIHJlYXNvbiBkb2VzIG5vdAorICAgIC8vIGV4aXN0LCB3ZSBjbGVhciB0aGUgbGlzdCBvZiBk
ZWxheWVkIG1lc3NhZ2VzIHRvIGF2b2lkCisgICAgLy8gcG9zdGluZyBtZXNzYWdlcy4gV2Ugc3Rp
bGwgZGVhbGxvY2F0ZSB0aGUgdmVjdG9yLgorICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6OnJl
dHJpZXZlRnJhbWVGb3JFbnRlcmVkQ29udGV4dCgpOworICAgIFBhZ2UqIHBhZ2UgPSAwOworICAg
IGlmIChmcmFtZSkKKyAgICAgICAgcGFnZSA9IGZyYW1lLT5wYWdlKCk7CisgICAgaWYgKCFwYWdl
KQorICAgICAgICBtX2RlbGF5ZWQtPmNsZWFyKCk7CisKKyAgICAvLyBJdGVyYXRlIHRocm91Z2gg
YWxsIHRoZSBkZWxheWVkIG1lc3NhZ2VzIGFuZCBhZGQgdGhlbQorICAgIC8vIHRvIHRoZSBjb25z
b2xlLgorICAgIGNvbnN0IGludCBzaXplID0gbV9kZWxheWVkLT5zaXplKCk7CisgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgbV9kZWxheWVkLT5hdChpKS5hZGRU
b1BhZ2UocGFnZSk7CisgICAgfQorCisgICAgLy8gRGVhbGxvY2F0ZSB0aGUgZGVsYXllZCB2ZWN0
b3IuCisgICAgZGVsZXRlIG1fZGVsYXllZDsKKyAgICBtX2RlbGF5ZWQgPSAwOworfQorCisvLyBD
b252ZW5pZW5jZSBjbGFzcyBmb3IgZW5zdXJpbmcgdGhhdCBkZWxheWVkIG1lc3NhZ2VzIGluIHRo
ZQorLy8gQ29uc29sZU1lc3NhZ2VNYW5hZ2VyIGFyZSBwcm9jZXNzZWQgcXVpY2tseS4KK2NsYXNz
IENvbnNvbGVNZXNzYWdlU2NvcGUgeworcHVibGljOgorICAgIENvbnNvbGVNZXNzYWdlU2NvcGUo
KSB7IENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6cHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpOyB9Cisg
ICAgfkNvbnNvbGVNZXNzYWdlU2NvcGUoKSB7IENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6cHJvY2Vz
c0RlbGF5ZWRNZXNzYWdlcygpOyB9Cit9OworCit2b2lkIGxvZ0luZm8oRnJhbWUqIGZyYW1lLCBj
b25zdCBTdHJpbmcmIG1lc3NhZ2UsIGNvbnN0IFN0cmluZyYgdXJsKQ0KK3sNCisgICAgUGFnZSog
cGFnZSA9IGZyYW1lLT5wYWdlKCk7DQorICAgIGlmICghcGFnZSkNCisgICAgICAgIHJldHVybjsN
CisgICAgSmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlIGNvbnNvbGVNZXNzYWdlKG1lc3NhZ2UsIHVy
bCwgMCk7DQorICAgIENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6YWRkTWVzc2FnZShwYWdlLCBjb25z
b2xlTWVzc2FnZSk7DQorfQorCitzdGF0aWMgdm9pZCBoYW5kbGVDb25zb2xlTWVzc2FnZSh2ODo6
SGFuZGxlPHY4OjpNZXNzYWdlPiBtZXNzYWdlLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZGF0YSkK
K3sKKyAgICAvLyBVc2UgdGhlIGZyYW1lIHdoZXJlIEphdmFTY3JpcHQgaXMgY2FsbGVkIGZyb20u
CisgICAgRnJhbWUqIGZyYW1lID0gVjhQcm94eTo6cmV0cmlldmVGcmFtZUZvckVudGVyZWRDb250
ZXh0KCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUGFnZSogcGFn
ZSA9IGZyYW1lLT5wYWdlKCk7CisgICAgaWYgKCFwYWdlKQorICAgICAgICByZXR1cm47CisKKyAg
ICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IGVycm9yTWVzc2FnZVN0cmluZyA9IG1lc3NhZ2UtPkdl
dCgpOworICAgIEFTU0VSVCghZXJyb3JNZXNzYWdlU3RyaW5nLklzRW1wdHkoKSk7CisgICAgU3Ry
aW5nIGVycm9yTWVzc2FnZSA9IFRvV2ViQ29yZVN0cmluZyhlcnJvck1lc3NhZ2VTdHJpbmcpOwor
CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJlc291cmNlTmFtZSA9IG1lc3NhZ2UtPkdldFNj
cmlwdFJlc291cmNlTmFtZSgpOworICAgIGJvb2wgdXNlVVJMID0gKHJlc291cmNlTmFtZS5Jc0Vt
cHR5KCkgfHwgIXJlc291cmNlTmFtZS0+SXNTdHJpbmcoKSk7CisgICAgU3RyaW5nIHJlc291cmNl
TmFtZVN0cmluZyA9ICh1c2VVUkwpID8gZnJhbWUtPmRvY3VtZW50KCktPnVybCgpIDogVG9XZWJD
b3JlU3RyaW5nKHJlc291cmNlTmFtZSk7CisgICAgSmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlIGNv
bnNvbGVNZXNzYWdlKGVycm9yTWVzc2FnZSwgcmVzb3VyY2VOYW1lU3RyaW5nLCBtZXNzYWdlLT5H
ZXRMaW5lTnVtYmVyKCkpOworICAgIENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6YWRkTWVzc2FnZShw
YWdlLCBjb25zb2xlTWVzc2FnZSk7Cit9CisKK2VudW0gRGVsYXlSZXBvcnRpbmcgeworICAgIFJF
UE9SVF9MQVRFUiwKKyAgICBSRVBPUlRfTk9XCit9OworCitzdGF0aWMgdm9pZCByZXBvcnRVbnNh
ZmVBY2Nlc3NUbyhGcmFtZSogdGFyZ2V0LCBEZWxheVJlcG9ydGluZyBkZWxheSkKK3sKKyAgICBB
U1NFUlQodGFyZ2V0KTsKKyAgICBEb2N1bWVudCogdGFyZ2V0RG9jdW1lbnQgPSB0YXJnZXQtPmRv
Y3VtZW50KCk7CisgICAgaWYgKCF0YXJnZXREb2N1bWVudCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgRnJhbWUqIHNvdXJjZSA9IFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JFbnRlcmVkQ29udGV4
dCgpOworICAgIGlmICghc291cmNlIHx8ICFzb3VyY2UtPmRvY3VtZW50KCkpCisgICAgICAgIHJl
dHVybjsgIC8vIElnbm9yZSBlcnJvciBpZiB0aGUgc291cmNlIGRvY3VtZW50IGlzIGdvbmUuCisK
KyAgICBEb2N1bWVudCogc291cmNlRG9jdW1lbnQgPSBzb3VyY2UtPmRvY3VtZW50KCk7CisKKyAg
ICAvLyBGSVhNRTogVGhpcyBlcnJvciBtZXNzYWdlIHNob3VsZCBjb250YWluIG1vcmUgc3BlY2lm
aWNzIG9mIHdoeSB0aGUgc2FtZQorICAgIC8vIG9yaWdpbiBjaGVjayBoYXMgZmFpbGVkLgorICAg
IFN0cmluZyBzdHIgPSBTdHJpbmc6OmZvcm1hdCgiVW5zYWZlIEphdmFTY3JpcHQgYXR0ZW1wdCB0
byBhY2Nlc3MgZnJhbWUgIgorICAgICAgICAid2l0aCBVUkwgJXMgZnJvbSBmcmFtZSB3aXRoIFVS
TCAlcy4gIgorICAgICAgICAiRG9tYWlucywgcHJvdG9jb2xzIGFuZCBwb3J0cyBtdXN0IG1hdGNo
LlxuIiwKKyAgICAgICAgdGFyZ2V0RG9jdW1lbnQtPnVybCgpLnN0cmluZygpLnV0ZjgoKS5kYXRh
KCksCisgICAgICAgIHNvdXJjZURvY3VtZW50LT51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgp
KTsKKworICAgIC8vIEJ1aWxkIGEgY29uc29sZSBtZXNzYWdlIHdpdGggZmFrZSBzb3VyY2UgSUQg
YW5kIGxpbmUgbnVtYmVyLgorICAgIGNvbnN0IFN0cmluZyBrU291cmNlSUQgPSAiIjsKKyAgICBj
b25zdCBpbnQga0xpbmVOdW1iZXIgPSAxOworICAgIEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZSBt
ZXNzYWdlKHN0ciwga1NvdXJjZUlELCBrTGluZU51bWJlcik7CisKKyAgICBpZiAoZGVsYXkgPT0g
UkVQT1JUX05PVykgeworICAgICAgICAvLyBOT1RFKHRjKTogQXBwbGUgcHJpbnRzIHRoZSBtZXNz
YWdlIGluIHRoZSB0YXJnZXQgcGFnZSwgYnV0IGl0IHNlZW1zIGxpa2UKKyAgICAgICAgLy8gaXQg
c2hvdWxkIGJlIGluIHRoZSBzb3VyY2UgcGFnZS4gRXZlbiBmb3IgZGVsYXllZCBtZXNzYWdlcywg
d2UgcHV0IGl0IGluCisgICAgICAgIC8vIHRoZSBzb3VyY2UgcGFnZTsgc2VlIENvbnNvbGVNZXNz
YWdlTWFuYWdlcjo6cHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpLgorICAgICAgICBDb25zb2xlTWVz
c2FnZU1hbmFnZXI6OmFkZE1lc3NhZ2Uoc291cmNlLT5wYWdlKCksIG1lc3NhZ2UpOworCisgICAg
fSBlbHNlIHsKKyAgICAgICAgQVNTRVJUKGRlbGF5ID09IFJFUE9SVF9MQVRFUik7CisgICAgICAg
IC8vIFdlIGNhbm5vdCBzYWZlbHkgcmVwb3J0IHRoZSBtZXNzYWdlIGVhZ2VybHksIGJlY2F1c2Ug
dGhpcyBtYXkgY2F1c2UKKyAgICAgICAgLy8gYWxsb2NhdGlvbnMgYW5kIEdDcyBpbnRlcm5hbGx5
IGluIFY4IGFuZCB3ZSBjYW5ub3QgaGFuZGxlIHRoYXQgYXQgdGhpcworICAgICAgICAvLyBwb2lu
dC4gVGhlcmVmb3JlIHdlIGRlbGF5IHRoZSByZXBvcnRpbmcuCisgICAgICAgIENvbnNvbGVNZXNz
YWdlTWFuYWdlcjo6YWRkRGVsYXllZE1lc3NhZ2UobWVzc2FnZSk7CisgICAgfQorfQorCitzdGF0
aWMgdm9pZCByZXBvcnRVbnNhZmVKYXZhU2NyaXB0QWNjZXNzKHY4OjpMb2NhbDx2ODo6T2JqZWN0
PiBob3N0LCB2ODo6QWNjZXNzVHlwZSB0eXBlLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBkYXRhKQor
eworICAgIEZyYW1lKiB0YXJnZXQgPSBWOEN1c3RvbTo6R2V0VGFyZ2V0RnJhbWUoaG9zdCwgZGF0
YSk7CisgICAgaWYgKHRhcmdldCkKKyAgICAgICAgcmVwb3J0VW5zYWZlQWNjZXNzVG8odGFyZ2V0
LCBSRVBPUlRfTEFURVIpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVGYXRhbEVycm9ySW5WOCgp
Cit7CisgICAgLy8gRklYTUU6IFdlIHRlbXBvcmFyaWx5IGRlYWwgd2l0aCBWOCBpbnRlcm5hbCBl
cnJvciBzaXR1YXRpb25zCisgICAgLy8gc3VjaCBhcyBvdXQtb2YtbWVtb3J5IGJ5IGNyYXNoaW5n
IHRoZSByZW5kZXJlci4KKyAgICBDUkFTSCgpOworfQorCitzdGF0aWMgdm9pZCByZXBvcnRGYXRh
bEVycm9ySW5WOChjb25zdCBjaGFyKiBsb2NhdGlvbiwgY29uc3QgY2hhciogbWVzc2FnZSkKK3sK
KyAgICAvLyBWOCBpcyBzaHV0ZG93biwgd2UgY2Fubm90IHVzZSBWOCBhcGkuCisgICAgLy8gVGhl
IG9ubHkgdGhpbmcgd2UgY2FuIGRvIGlzIHRvIGRpc2FibGUgSmF2YVNjcmlwdC4KKyAgICAvLyBG
SVhNRTogY2xlYW4gdXAgVjhQcm94eSBhbmQgZGlzYWJsZSBKYXZhU2NyaXB0LgorICAgIHByaW50
ZigiVjggZXJyb3I6ICVzICglcylcbiIsIG1lc3NhZ2UsIGxvY2F0aW9uKTsKKyAgICBoYW5kbGVG
YXRhbEVycm9ySW5WOCgpOworfQorCitWOFByb3h5Ojp+VjhQcm94eSgpCit7CisgICAgY2xlYXJG
b3JDbG9zZSgpOworICAgIGRlc3Ryb3lHbG9iYWwoKTsKK30KKwordm9pZCBWOFByb3h5OjpkZXN0
cm95R2xvYmFsKCkKK3sKKyAgICBpZiAoIW1fZ2xvYmFsLklzRW1wdHkoKSkgeworI2lmbmRlZiBO
REVCVUcKKyAgICAgICAgdW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBtX2dsb2JhbCk7Cisj
ZW5kaWYKKyAgICAgICAgbV9nbG9iYWwuRGlzcG9zZSgpOworICAgICAgICBtX2dsb2JhbC5DbGVh
cigpOworICAgIH0KK30KKworCitib29sIFY4UHJveHk6OmRvbU9iamVjdEhhc0pTV3JhcHBlcih2
b2lkKiBvYmplY3QpIHsKKyAgICByZXR1cm4gZ2V0RE9NT2JqZWN0TWFwKCkuY29udGFpbnMob2Jq
ZWN0KSB8fCBnZXRBY3RpdmVET01PYmplY3RNYXAoKS5jb250YWlucyhvYmplY3QpOworfQorCisv
LyBUaGUgY2FsbGVyIG11c3QgaGF2ZSBpbmNyZWFzZWQgb2JqJ3MgcmVmIGNvdW50Lgordm9pZCBW
OFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01PYmplY3Qodm9pZCogb2JqZWN0LCB2ODo6UGVyc2lz
dGVudDx2ODo6T2JqZWN0PiB3cmFwcGVyKQoreworICAgIEFTU0VSVChtYXliZURPTVdyYXBwZXIo
d3JhcHBlcikpOworI2lmbmRlZiBOREVCVUcKKyAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5
cGUgdHlwZSA9IFY4UHJveHk6OmRvbVdyYXBwZXJUeXBlKHdyYXBwZXIpOworICAgIHN3aXRjaCAo
dHlwZSkgeworI2RlZmluZSBNQUtFX0NBU0UoVFlQRSwgTkFNRSkgY2FzZSBWOENsYXNzSW5kZXg6
OlRZUEU6CisgICAgICAgIEFDVElWRV9ET01fT0JKRUNUX1RZUEVTKE1BS0VfQ0FTRSkKKyAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisjdW5kZWYgTUFLRV9DQVNFCisgICAgZGVmYXVsdDoK
KyAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmCisgICAgZ2V0RE9NT2JqZWN0TWFwKCkuc2V0
KG9iamVjdCwgd3JhcHBlcik7Cit9CisKKy8vIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGluY3JlYXNl
ZCBvYmoncyByZWYgY291bnQuCit2b2lkIFY4UHJveHk6OnNldEpTV3JhcHBlckZvckFjdGl2ZURP
TU9iamVjdCh2b2lkKiBvYmplY3QsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdyYXBwZXIp
Cit7CisgICAgQVNTRVJUKG1heWJlRE9NV3JhcHBlcih3cmFwcGVyKSk7CisjaWZuZGVmIE5ERUJV
RworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6ZG9tV3Jh
cHBlclR5cGUod3JhcHBlcik7CisgICAgc3dpdGNoICh0eXBlKSB7CisjZGVmaW5lIE1BS0VfQ0FT
RShUWVBFLCBOQU1FKSBjYXNlIFY4Q2xhc3NJbmRleDo6VFlQRTogYnJlYWs7CisgICAgICAgIEFD
VElWRV9ET01fT0JKRUNUX1RZUEVTKE1BS0VfQ0FTRSkKKyAgICBkZWZhdWx0OiAKKyAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisjdW5kZWYgTUFLRV9DQVNFCisgICAgfQorI2VuZGlmCisg
ICAgZ2V0QWN0aXZlRE9NT2JqZWN0TWFwKCkuc2V0KG9iamVjdCwgd3JhcHBlcik7Cit9CisKKy8v
IFRoZSBjYWxsZXIgbXVzdCBoYXZlIGluY3JlYXNlZCBub2RlJ3MgcmVmIGNvdW50Lgordm9pZCBW
OFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01Ob2RlKE5vZGUqIG5vZGUsIHY4OjpQZXJzaXN0ZW50
PHY4OjpPYmplY3Q+IHdyYXBwZXIpCit7CisgICAgQVNTRVJUKG1heWJlRE9NV3JhcHBlcih3cmFw
cGVyKSk7CisgICAgZ2V0RE9NTm9kZU1hcCgpLnNldChub2RlLCB3cmFwcGVyKTsKK30KKworLy8g
RXZlbnQgbGlzdGVuZXJzCisKK3N0YXRpYyBWOEV2ZW50TGlzdGVuZXIqIGZpbmRFdmVudExpc3Rl
bmVySW5MaXN0KFY4RXZlbnRMaXN0ZW5lckxpc3QmIGxpc3QsIHY4OjpMb2NhbDx2ODo6VmFsdWU+
IGxpc3RlbmVyLCBib29sIGlzSW5saW5lKQoreworICAgIEFTU0VSVCh2ODo6Q29udGV4dDo6SW5D
b250ZXh0KCkpOworCisgICAgaWYgKCFsaXN0ZW5lci0+SXNPYmplY3QoKSkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICByZXR1cm4gbGlzdC5maW5kKGxpc3RlbmVyLT5Ub09iamVjdCgpLCBpc0lu
bGluZSk7Cit9CisKKy8vIEZpbmQgYW4gZXhpc3Rpbmcgd3JhcHBlciBmb3IgYSBKUyBldmVudCBs
aXN0ZW5lciBpbiB0aGUgbWFwLgorUGFzc1JlZlB0cjxWOEV2ZW50TGlzdGVuZXI+IFY4UHJveHk6
OmZpbmRWOEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1ZT4gbGlzdGVuZXIsIGJvb2wg
aXNJbmxpbmUpCit7CisgICAgcmV0dXJuIGZpbmRFdmVudExpc3RlbmVySW5MaXN0KG1fZXZlbnRM
aXN0ZW5lcnMsIGxpc3RlbmVyLCBpc0lubGluZSk7Cit9CisKK1Bhc3NSZWZQdHI8VjhFdmVudExp
c3RlbmVyPiBWOFByb3h5OjpmaW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4
OjpWYWx1ZT4gb2JqZWN0LCBib29sIGlzSW5saW5lKQoreworICAgIEFTU0VSVCh2ODo6Q29udGV4
dDo6SW5Db250ZXh0KCkpOworCisgICAgaWYgKCFvYmplY3QtPklzT2JqZWN0KCkpCisgICAgICAg
IHJldHVybiAwOworCisgICAgVjhFdmVudExpc3RlbmVyKiB3cmFwcGVyID0gZmluZEV2ZW50TGlz
dGVuZXJJbkxpc3QobV9ldmVudExpc3RlbmVycywgb2JqZWN0LCBpc0lubGluZSk7CisgICAgaWYg
KHdyYXBwZXIpCisgICAgICAgIHJldHVybiB3cmFwcGVyOworCisgICAgLy8gQ3JlYXRlIGEgbmV3
IG9uZSwgYW5kIGFkZCB0byBjYWNoZS4KKyAgICBSZWZQdHI8VjhFdmVudExpc3RlbmVyPiBuZXdM
aXN0ZW5lciA9IFY4RXZlbnRMaXN0ZW5lcjo6Y3JlYXRlKG1fZnJhbWUsIHY4OjpMb2NhbDx2ODo6
T2JqZWN0Pjo6Q2FzdChvYmplY3QpLCBpc0lubGluZSk7CisgICAgbV9ldmVudExpc3RlbmVycy5h
ZGQobmV3TGlzdGVuZXIuZ2V0KCkpOworCisgICAgcmV0dXJuIG5ld0xpc3RlbmVyOworfQorCisv
LyBPYmplY3QgZXZlbnQgbGlzdGVuZXJzIChzdWNoIGFzIFhtbEh0dHBSZXF1ZXN0IGFuZCBNZXNz
YWdlUG9ydCkgYXJlCisvLyBkaWZmZXJlbnQgZnJvbSBsaXN0ZW5lcnMgb24gRE9NIG5vZGVzLiBB
biBvYmplY3QgZXZlbnQgbGlzdGVuZXIgd3JhcHBlcgorLy8gb25seSBob2xkcyBhIHdlYWsgcmVm
ZXJlbmNlIHRvIHRoZSBKUyBmdW5jdGlvbi4gQSBzdHJvbmcgcmVmZXJlbmNlIGNhbgorLy8gY3Jl
YXRlIGEgY3ljbGUuCisvLworLy8gVGhlIGxpZmV0aW1lIG9mIHRoZXNlIG9iamVjdHMgaXMgYm91
bmRlZCBieSB0aGUgbGlmZSB0aW1lIG9mIGl0cyBKUworLy8gd3JhcHBlci4gU28gd2UgY2FuIGNy
ZWF0ZSBhIGhpZGRlbiByZWZlcmVuY2UgZnJvbSB0aGUgSlMgd3JhcHBlciB0bworLy8gdG8gaXRz
IEpTIGZ1bmN0aW9uLgorLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAobWFwKQorLy8g
ICAgICAgICAgICAgIFhIUiAgICAgIDwtLS0tLS0tLS0tICBKU193cmFwcGVyCisvLyAgICAgICAg
ICAgICAgIHwgICAgICAgICAgICAgKGhpZGRlbikgOiAgXgorLy8gICAgICAgICAgICAgICBWICAg
ICAgICAgICAgICAgICAgICAgIFYgIDogKG1heSByZWFjaGFibGUgYnkgY2xvc3VyZSkKKy8vICAg
ICAgICAgICBWOF9saXN0ZW5lciAgLS0tLS0tLS0+IEpTX2Z1bmN0aW9uCisvLyAgICAgICAgICAg
ICAgICAgICAgICAgICAod2VhaykgIDwtLSBtYXkgY3JlYXRlIGEgY3ljbGUgaWYgaXQgaXMgc3Ry
b25nCisvLworLy8gVGhlIHBlcnNpc3RlbnQgcmVmZXJlbmNlIGlzIG1hZGUgd2VhayBpbiB0aGUg
Y29uc3RydWN0b3IKKy8vIG9mIFY4T2JqZWN0RXZlbnRMaXN0ZW5lci4KKworUGFzc1JlZlB0cjxW
OEV2ZW50TGlzdGVuZXI+IFY4UHJveHk6OmZpbmRPYmplY3RFdmVudExpc3RlbmVyKCB2ODo6TG9j
YWw8djg6OlZhbHVlPiBsaXN0ZW5lciwgYm9vbCBpc0lubGluZSkKK3sKKyAgICByZXR1cm4gZmlu
ZEV2ZW50TGlzdGVuZXJJbkxpc3QobV94aHJMaXN0ZW5lcnMsIGxpc3RlbmVyLCBpc0lubGluZSk7
Cit9CisKK1Bhc3NSZWZQdHI8VjhFdmVudExpc3RlbmVyPiBWOFByb3h5OjpmaW5kT3JDcmVhdGVP
YmplY3RFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6VmFsdWU+IG9iamVjdCwgYm9vbCBpc0lu
bGluZSkKK3sKKyAgICBBU1NFUlQodjg6OkNvbnRleHQ6OkluQ29udGV4dCgpKTsKKworICAgIGlm
ICghb2JqZWN0LT5Jc09iamVjdCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFY4RXZlbnRM
aXN0ZW5lciogd3JhcHBlciA9IGZpbmRFdmVudExpc3RlbmVySW5MaXN0KG1feGhyTGlzdGVuZXJz
LCBvYmplY3QsIGlzSW5saW5lKTsKKyAgICBpZiAod3JhcHBlcikKKyAgICAgICAgcmV0dXJuIHdy
YXBwZXI7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgb25lLCBhbmQgYWRkIHRvIGNhY2hlLgorICAg
IFJlZlB0cjxWOEV2ZW50TGlzdGVuZXI+IG5ld0xpc3RlbmVyID0gVjhPYmplY3RFdmVudExpc3Rl
bmVyOjpjcmVhdGUobV9mcmFtZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpDYXN0KG9iamVjdCks
IGlzSW5saW5lKTsKKyAgICBtX3hockxpc3RlbmVycy5hZGQobmV3TGlzdGVuZXIuZ2V0KCkpOwor
CisgICAgcmV0dXJuIG5ld0xpc3RlbmVyLnJlbGVhc2UoKTsKK30KKworCitzdGF0aWMgdm9pZCBy
ZW1vdmVFdmVudExpc3RlbmVyRnJvbUxpc3QoVjhFdmVudExpc3RlbmVyTGlzdCYgbGlzdCwgVjhF
dmVudExpc3RlbmVyKiBsaXN0ZW5lcikKK3sKKyAgICBsaXN0LnJlbW92ZShsaXN0ZW5lcik7Cit9
CisKK3ZvaWQgVjhQcm94eTo6cmVtb3ZlVjhFdmVudExpc3RlbmVyKFY4RXZlbnRMaXN0ZW5lciog
bGlzdGVuZXIpCit7CisgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21MaXN0KG1fZXZlbnRMaXN0
ZW5lcnMsIGxpc3RlbmVyKTsKK30KKworCit2b2lkIFY4UHJveHk6OnJlbW92ZU9iamVjdEV2ZW50
TGlzdGVuZXIoVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikKK3sKKyAgICByZW1vdmVF
dmVudExpc3RlbmVyRnJvbUxpc3QobV94aHJMaXN0ZW5lcnMsIGxpc3RlbmVyKTsKK30KKworc3Rh
dGljIHZvaWQgZGlzY29ubmVjdEV2ZW50TGlzdGVuZXJzSW5MaXN0KFY4RXZlbnRMaXN0ZW5lckxp
c3QmIGxpc3QpCit7CisgICAgVjhFdmVudExpc3RlbmVyTGlzdDo6aXRlcmF0b3IgaXQgPSBsaXN0
LmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IGxpc3QuZW5kKCkpIHsKKyAgICAgICAgKCppdCkt
PmRpc2Nvbm5lY3RGcmFtZSgpOworICAgICAgICArK2l0OworICAgIH0KKyAgICBsaXN0LmNsZWFy
KCk7Cit9CisKKwordm9pZCBWOFByb3h5OjpkaXNjb25uZWN0RXZlbnRMaXN0ZW5lcnMoKQorewor
ICAgIGRpc2Nvbm5lY3RFdmVudExpc3RlbmVyc0luTGlzdChtX2V2ZW50TGlzdGVuZXJzKTsKKyAg
ICBkaXNjb25uZWN0RXZlbnRMaXN0ZW5lcnNJbkxpc3QobV94aHJMaXN0ZW5lcnMpOworfQorCisK
K3Y4OjpIYW5kbGU8djg6OlNjcmlwdD4gVjhQcm94eTo6Y29tcGlsZVNjcmlwdCh2ODo6SGFuZGxl
PHY4OjpTdHJpbmc+IGNvZGUsIGNvbnN0IFN0cmluZyYgZmlsZU5hbWUsIGludCBiYXNlTGluZSkK
K3sKKyAgICBjb25zdCB1aW50MTZfdCogZmlsZU5hbWVTdHJpbmcgPSBGcm9tV2ViQ29yZVN0cmlu
ZyhmaWxlTmFtZSk7CisgICAgdjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBuYW1lID0gdjg6OlN0cmlu
Zzo6TmV3KGZpbGVOYW1lU3RyaW5nLCBmaWxlTmFtZS5sZW5ndGgoKSk7CisgICAgdjg6OkhhbmRs
ZTx2ODo6SW50ZWdlcj4gbGluZSA9IHY4OjpJbnRlZ2VyOjpOZXcoYmFzZUxpbmUpOworICAgIHY4
OjpTY3JpcHRPcmlnaW4gb3JpZ2luKG5hbWUsIGxpbmUpOworICAgIHY4OjpIYW5kbGU8djg6OlNj
cmlwdD4gc2NyaXB0ID0gdjg6OlNjcmlwdDo6Q29tcGlsZShjb2RlLCAmb3JpZ2luKTsKKyAgICBy
ZXR1cm4gc2NyaXB0OworfQorCitib29sIFY4UHJveHk6OmhhbmRsZU91dE9mTWVtb3J5KCkKK3sK
KyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2ODo6Q29udGV4dDo6R2V0Q3Vy
cmVudCgpOworCisgICAgaWYgKCFjb250ZXh0LT5IYXNPdXRPZk1lbW9yeUV4Y2VwdGlvbigpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBXYXJuaW5nLCBlcnJvciwgZGlzYWJsZSBK
UyBmb3IgdGhpcyBmcmFtZT8KKyAgICBGcmFtZSogZnJhbWUgPSBWOFByb3h5OjpyZXRyaWV2ZUZy
YW1lKGNvbnRleHQpOworCisgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShm
cmFtZSk7CisgICAgaWYgKHByb3h5KSB7CisgICAgICAgIC8vIENsZWFuIG1fY29udGV4dCwgYW5k
IGV2ZW50IGhhbmRsZXJzLgorICAgICAgICBwcm94eS0+Y2xlYXJGb3JDbG9zZSgpOworICAgICAg
ICAvLyBEZXN0cm95IHRoZSBnbG9iYWwgb2JqZWN0LgorICAgICAgICBwcm94eS0+ZGVzdHJveUds
b2JhbCgpOworICAgIH0KKworICAgIENocm9taXVtQnJpZGdlOjpub3RpZnlKU091dE9mTWVtb3J5
KGZyYW1lKTsKKworICAgIC8vIERpc2FibGUgSlMuCisgICAgU2V0dGluZ3MqIHNldHRpbmdzID0g
ZnJhbWUtPnNldHRpbmdzKCk7CisgICAgQVNTRVJUKHNldHRpbmdzKTsKKyAgICBzZXR0aW5ncy0+
c2V0SmF2YVNjcmlwdEVuYWJsZWQoZmFsc2UpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3Zv
aWQgVjhQcm94eTo6ZXZhbHVhdGVJbk5ld0NvbnRleHQoY29uc3QgVmVjdG9yPFNjcmlwdFNvdXJj
ZUNvZGU+JiBzb3VyY2VzKQoreworICAgIGluaXRDb250ZXh0SWZOZWVkZWQoKTsKKworICAgIHY4
OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKworICAgIC8vIFNldCB1cCB0aGUgRE9NIHdpbmRv
dyBhcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBuZXcgZ2xvYmFsIG9iamVjdC4KKyAgICB2ODo6SGFu
ZGxlPHY4OjpDb250ZXh0PiB3aW5kb3dDb250ZXh0ID0gbV9jb250ZXh0OworICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gd2luZG93R2xvYmFsID0gd2luZG93Q29udGV4dC0+R2xvYmFsKCk7Cisg
ICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdpbmRvd1dyYXBwZXIgPSBWOFByb3h5Ojpsb29rdXBE
T01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCB3aW5kb3dHbG9iYWwpOworCisgICAg
QVNTRVJUKFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8RE9NV2luZG93Pih3aW5k
b3dXcmFwcGVyKSA9PSBtX2ZyYW1lLT5kb21XaW5kb3coKSk7CisKKyAgICB2ODo6UGVyc2lzdGVu
dDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGNyZWF0ZU5ld0NvbnRleHQodjg6OkhhbmRsZTx2ODo6
T2JqZWN0PigpKTsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dFNjb3BlKGNvbnRleHQp
OworCisgICAgLy8gU2V0dXAgY29udGV4dCBpZCBmb3IgSlMgZGVidWdnZXIuCisgICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiBjb250ZXh0RGF0YSA9IHY4OjpPYmplY3Q6Ok5ldygpOworICAgIHY4
OjpIYW5kbGU8djg6OlZhbHVlPiB3aW5kb3dDb250ZXh0RGF0YSA9IHdpbmRvd0NvbnRleHQtPkdl
dERhdGEoKTsKKyAgICBpZiAod2luZG93Q29udGV4dERhdGEtPklzT2JqZWN0KCkpIHsKKyAgICAg
ICAgdjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBwcm9wZXJ0eU5hbWUgPSB2ODo6U3RyaW5nOjpOZXco
a0NvbnRleHREZWJ1Z0RhdGFWYWx1ZSk7CisgICAgICAgIGNvbnRleHREYXRhLT5TZXQocHJvcGVy
dHlOYW1lLCB2ODo6T2JqZWN0OjpDYXN0KCp3aW5kb3dDb250ZXh0RGF0YSktPkdldChwcm9wZXJ0
eU5hbWUpKTsKKyAgICB9CisgICAgY29udGV4dERhdGEtPlNldCh2ODo6U3RyaW5nOjpOZXcoa0Nv
bnRleHREZWJ1Z0RhdGFUeXBlKSwgdjg6OlN0cmluZzo6TmV3KCJpbmplY3RlZCIpKTsKKyAgICBj
b250ZXh0LT5TZXREYXRhKGNvbnRleHREYXRhKTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVj
dD4gZ2xvYmFsID0gY29udGV4dC0+R2xvYmFsKCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpTdHJp
bmc+IGltcGxpY2l0UHJvdG9TdHJpbmcgPSB2ODo6U3RyaW5nOjpOZXcoIl9fcHJvdG9fXyIpOwor
ICAgIGdsb2JhbC0+U2V0KGltcGxpY2l0UHJvdG9TdHJpbmcsIHdpbmRvd1dyYXBwZXIpOworCisg
ICAgLy8gR2l2ZSB0aGUgY29kZSBydW5uaW5nIGluIHRoZSBuZXcgY29udGV4dCBhIHdheSB0byBn
ZXQgYWNjZXNzIHRvIHRoZQorICAgIC8vIG9yaWdpbmFsIGNvbnRleHQuCisgICAgZ2xvYmFsLT5T
ZXQodjg6OlN0cmluZzo6TmV3KCJjb250ZW50V2luZG93IiksIHdpbmRvd0dsb2JhbCk7CisKKyAg
ICAvLyBSdW4gY29kZSBpbiB0aGUgbmV3IGNvbnRleHQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBzb3VyY2VzLnNpemUoKTsgKytpKQorICAgICAgICBldmFsdWF0ZShzb3VyY2VzW2ldLCAw
KTsKKworICAgIC8vIFVzaW5nIHRoZSBkZWZhdWx0IHNlY3VyaXR5IHRva2VuIG1lYW5zIHRoYXQg
dGhlIGNhbkFjY2VzcyBpcyBhbHdheXMKKyAgICAvLyBjYWxsZWQsIHdoaWNoIGlzIHNsb3cuCisg
ICAgLy8gRklYTUU6IFVzZSB0b2tlbnMgd2hlcmUgcG9zc2libGUuIFRoaXMgd2lsbCBtZWFuIGtl
ZXBpbmcgdHJhY2sgb2YgYWxsCisgICAgLy8gY3JlYXRlZCBjb250ZXh0cyBzbyB0aGF0IHRoZXkg
Y2FuIGFsbCBiZSB1cGRhdGVkIHdoZW4gdGhlIGRvY3VtZW50IGRvbWFpbgorICAgIC8vIGNoYW5n
ZXMuCisgICAgY29udGV4dC0+VXNlRGVmYXVsdFNlY3VyaXR5VG9rZW4oKTsKKyAgICBjb250ZXh0
LkRpc3Bvc2UoKTsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gVjhQcm94eTo6ZXZhbHVhdGUo
Y29uc3QgU2NyaXB0U291cmNlQ29kZSYgc291cmNlLCBOb2RlKiBub2RlKQoreworICAgIEFTU0VS
VCh2ODo6Q29udGV4dDo6SW5Db250ZXh0KCkpOworCisgICAgLy8gQ29tcGlsZSB0aGUgc2NyaXB0
LgorICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBjb2RlID0gdjhFeHRlcm5hbFN0cmluZyhzb3Vy
Y2Uuc291cmNlKCkpOworICAgIENocm9taXVtQnJpZGdlOjp0cmFjZUV2ZW50QmVnaW4oInY4LmNv
bXBpbGUiLCBub2RlLCAiIik7CisKKyAgICAvLyBOT1RFOiBGb3IgY29tcGF0aWJpbGl0eSB3aXRo
IFdlYkNvcmUsIFNjcmlwdFNvdXJjZUNvZGUncyBsaW5lIHN0YXJ0cyBhdAorICAgIC8vIDEsIHdo
ZXJlYXMgdjggc3RhcnRzIGF0IDAuCisgICAgdjg6OkhhbmRsZTx2ODo6U2NyaXB0PiBzY3JpcHQg
PSBjb21waWxlU2NyaXB0KGNvZGUsIHNvdXJjZS51cmwoKSwgc291cmNlLnN0YXJ0TGluZSgpIC0g
MSk7CisgICAgQ2hyb21pdW1CcmlkZ2U6OnRyYWNlRXZlbnRFbmQoInY4LmNvbXBpbGUiLCBub2Rl
LCAiIik7CisKKyAgICBDaHJvbWl1bUJyaWRnZTo6dHJhY2VFdmVudEJlZ2luKCJ2OC5ydW4iLCBu
b2RlLCAiIik7CisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmVzdWx0OworICAgIHsKKyAgICAg
ICAgLy8gSXNvbGF0ZSBleGNlcHRpb25zIHRoYXQgb2NjdXIgd2hlbiBleGVjdXRpbmcgdGhlIGNv
ZGUuICBUaGVzZQorICAgICAgICAvLyBleGNlcHRpb25zIHNob3VsZCBub3QgaW50ZXJmZXJlIHdp
dGggamF2YXNjcmlwdCBjb2RlIHdlIG1pZ2h0CisgICAgICAgIC8vIGV2YWx1YXRlIGZyb20gQysr
IHdoZW4gcmV0dXJuaW5nIGZyb20gaGVyZQorICAgICAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7
CisgICAgICAgIHRyeUNhdGNoLlNldFZlcmJvc2UodHJ1ZSk7CisKKyAgICAgICAgLy8gU2V0IGlu
bGluZUNvZGUgdG8gdHJ1ZSBmb3IgPGEgaHJlZj0iamF2YXNjcmlwdDpkb1NvbWV0aGluZygpIj4K
KyAgICAgICAgLy8gYW5kIGZhbHNlIGZvciA8c2NyaXB0PmRvU29tZXRoaW5nPC9zY3JpcHQ+LiBX
ZSBtYWtlIGEgcm91Z2ggZ3Vlc3MgYXQKKyAgICAgICAgLy8gdGhpcyBiYXNlZCBvbiB3aGV0aGVy
IHRoZSBzY3JpcHQgc291cmNlIGhhcyBhIFVSTC4KKyAgICAgICAgcmVzdWx0ID0gcnVuU2NyaXB0
KHNjcmlwdCwgc291cmNlLnVybCgpLnN0cmluZygpLmlzTnVsbCgpKTsKKyAgICB9CisgICAgQ2hy
b21pdW1CcmlkZ2U6OnRyYWNlRXZlbnRFbmQoInY4LnJ1biIsIG5vZGUsICIiKTsKKyAgICByZXR1
cm4gcmVzdWx0OworfQorCit2ODo6TG9jYWw8djg6OlZhbHVlPiBWOFByb3h5OjpydW5TY3JpcHQo
djg6OkhhbmRsZTx2ODo6U2NyaXB0PiBzY3JpcHQsIGJvb2wgaXNJbmxpbmVDb2RlKQoreworICAg
IGlmIChzY3JpcHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJj
ZXB0b3IoKTsKKworICAgIC8vIENvbXB1dGUgdGhlIHNvdXJjZSBzdHJpbmcgYW5kIHByZXZlbnQg
YWdhaW5zdCBpbmZpbml0ZSByZWN1cnNpb24uCisgICAgaWYgKG1fcmVjdXJzaW9uID49IGtNYXhS
ZWN1cnNpb25EZXB0aCkgeworICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gY29kZSA9IHY4
RXh0ZXJuYWxTdHJpbmcoInRocm93IFJhbmdlRXJyb3IoJ1JlY3Vyc2lvbiB0b28gZGVlcCcpIik7
CisgICAgICAgIC8vIEZJWE1FOiBJZGVhbGx5LCB3ZSBzaG91bGQgYmUgYWJsZSB0byByZS11c2Ug
dGhlIG9yaWdpbiBvZiB0aGUKKyAgICAgICAgLy8gc2NyaXB0IHBhc3NlZCB0byB1cyBhcyB0aGUg
YXJndW1lbnQgaW5zdGVhZCBvZiB1c2luZyBhbiBlbXB0eSBzdHJpbmcKKyAgICAgICAgLy8gYW5k
IDAgYmFzZUxpbmUuCisgICAgICAgIHNjcmlwdCA9IGNvbXBpbGVTY3JpcHQoY29kZSwgIiIsIDAp
OworICAgIH0KKworICAgIGlmIChoYW5kbGVPdXRPZk1lbW9yeSgpKQorICAgICAgICBBU1NFUlQo
c2NyaXB0LklzRW1wdHkoKSk7CisKKyAgICBpZiAoc2NyaXB0LklzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CisKKyAgICAvLyBTYXZlIHRoZSBwcmV2
aW91cyB2YWx1ZSBvZiB0aGUgaW5saW5lQ29kZSBmbGFnIGFuZCB1cGRhdGUgdGhlIGZsYWcgZm9y
CisgICAgLy8gdGhlIGR1cmF0aW9uIG9mIHRoZSBzY3JpcHQgaW52b2NhdGlvbi4KKyAgICBib29s
IHByZXZpb3VzSW5saW5lQ29kZSA9IGlubGluZUNvZGUoKTsKKyAgICBzZXRJbmxpbmVDb2RlKGlz
SW5saW5lQ29kZSk7CisKKyAgICAvLyBSdW4gdGhlIHNjcmlwdCBhbmQga2VlcCB0cmFjayBvZiB0
aGUgY3VycmVudCByZWN1cnNpb24gZGVwdGguCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmVz
dWx0OworICAgIHsKKyAgICAgICAgQ29uc29sZU1lc3NhZ2VTY29wZSBzY29wZTsKKyAgICAgICAg
bV9yZWN1cnNpb24rKzsKKworICAgICAgICAvLyBFdmFsdWF0aW5nIHRoZSBKYXZhU2NyaXB0IGNv
dWxkIGNhdXNlIHRoZSBmcmFtZSB0byBiZSBkZWFsbG9jYXRlZCwKKyAgICAgICAgLy8gc28gd2Ug
c3RhcnQgdGhlIGtlZXAgYWxpdmUgdGltZXIgaGVyZS4KKyAgICAgICAgLy8gRnJhbWU6OmtlZXBB
bGl2ZSBtZXRob2QgYWRkcyB0aGUgcmVmIGNvdW50IG9mIHRoZSBmcmFtZSBhbmQgc2V0cyBhCisg
ICAgICAgIC8vIHRpbWVyIHRvIGRlY3JlYXNlIHRoZSByZWYgY291bnQuIEl0IGFzc3VtZXMgdGhh
dCB0aGUgY3VycmVudCBKYXZhU2NyaXB0CisgICAgICAgIC8vIGV4ZWN1dGlvbiBmaW5pc2hzIGJl
Zm9yZSBmaXJpbmcgdGhlIHRpbWVyLgorICAgICAgICAvLyBTZWUgaXNzdWUgMTIxODc1NiBhbmQg
OTE0NDMwLgorICAgICAgICBtX2ZyYW1lLT5rZWVwQWxpdmUoKTsKKworICAgICAgICByZXN1bHQg
PSBzY3JpcHQtPlJ1bigpOworICAgICAgICBtX3JlY3Vyc2lvbi0tOworICAgIH0KKworICAgIGlm
IChoYW5kbGVPdXRPZk1lbW9yeSgpKQorICAgICAgICBBU1NFUlQocmVzdWx0LklzRW1wdHkoKSk7
CisKKyAgICAvLyBIYW5kbGUgVjggaW50ZXJuYWwgZXJyb3Igc2l0dWF0aW9uIChPdXQtb2YtbWVt
b3J5KS4KKyAgICBpZiAocmVzdWx0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIG5vdEhhbmRs
ZWRCeUludGVyY2VwdG9yKCk7CisKKyAgICAvLyBSZXN0b3JlIGlubGluZUNvZGUgZmxhZy4KKyAg
ICBzZXRJbmxpbmVDb2RlKHByZXZpb3VzSW5saW5lQ29kZSk7CisKKyAgICBpZiAodjg6OlY4OjpJ
c0RlYWQoKSkKKyAgICAgICAgaGFuZGxlRmF0YWxFcnJvckluVjgoKTsKKworICAgIHJldHVybiBy
ZXN1bHQ7Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFY4UHJveHk6OmNhbGxGdW5jdGlvbih2
ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4gZnVuY3Rpb24sIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
cmVjZWl2ZXIsIGludCBhcmdjLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJnc1tdKQoreworICAg
IC8vIEZvciBub3csIHdlIGRvbid0IHB1dCBhbnkgYXJ0aWZpY2lhbCBsaW1pdGF0aW9ucyBvbiB0
aGUgZGVwdGgKKyAgICAvLyBvZiByZWN1cnNpb24gdGhhdCBzdGVtcyBmcm9tIGNhbGxpbmcgZnVu
Y3Rpb25zLiBUaGlzIGlzIGluCisgICAgLy8gY29udHJhc3QgdG8gdGhlIHNjcmlwdCBldmFsdWF0
aW9ucy4KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQ7CisgICAgeworICAgICAgICBD
b25zb2xlTWVzc2FnZVNjb3BlIHNjb3BlOworCisgICAgICAgIC8vIEV2YWx1YXRpbmcgdGhlIEph
dmFTY3JpcHQgY291bGQgY2F1c2UgdGhlIGZyYW1lIHRvIGJlIGRlYWxsb2NhdGVkLAorICAgICAg
ICAvLyBzbyB3ZSBzdGFydCB0aGUga2VlcCBhbGl2ZSB0aW1lciBoZXJlLgorICAgICAgICAvLyBG
cmFtZTo6a2VlcEFsaXZlIG1ldGhvZCBhZGRzIHRoZSByZWYgY291bnQgb2YgdGhlIGZyYW1lIGFu
ZCBzZXRzIGEKKyAgICAgICAgLy8gdGltZXIgdG8gZGVjcmVhc2UgdGhlIHJlZiBjb3VudC4gSXQg
YXNzdW1lcyB0aGF0IHRoZSBjdXJyZW50IEphdmFTY3JpcHQKKyAgICAgICAgLy8gZXhlY3V0aW9u
IGZpbmlzaHMgYmVmb3JlIGZpcmluZyB0aGUgdGltZXIuCisgICAgICAgIC8vIFNlZSBpc3N1ZSAx
MjE4NzU2IGFuZCA5MTQ0MzAuCisgICAgICAgIG1fZnJhbWUtPmtlZXBBbGl2ZSgpOworCisgICAg
ICAgIHJlc3VsdCA9IGZ1bmN0aW9uLT5DYWxsKHJlY2VpdmVyLCBhcmdjLCBhcmdzKTsKKyAgICB9
CisKKyAgICBpZiAodjg6OlY4OjpJc0RlYWQoKSkKKyAgICAgICAgaGFuZGxlRmF0YWxFcnJvcklu
VjgoKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFY4
UHJveHk6Om5ld0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiBjb25zdHJ1Y3Rvciwg
aW50IGFyZ2MsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmdzW10pCit7CisgICAgLy8gTm8gYXJ0
aWZpY2lhbCBsaW1pdGF0aW9ucyBvbiB0aGUgZGVwdGggb2YgcmVjdXJzaW9uLCBzZWUgY29tbWVu
dCBpbgorICAgIC8vIFY4UHJveHk6OmNhbGxGdW5jdGlvbi4KKyAgICB2ODo6TG9jYWw8djg6OlZh
bHVlPiByZXN1bHQ7CisgICAgeworICAgICAgICBDb25zb2xlTWVzc2FnZVNjb3BlIHNjb3BlOwor
CisgICAgICAgIC8vIFNlZSBjb21tZW50IGluIFY4UHJveHk6OmNhbGxGdW5jdGlvbi4KKyAgICAg
ICAgbV9mcmFtZS0+a2VlcEFsaXZlKCk7CisKKyAgICAgICAgcmVzdWx0ID0gY29uc3RydWN0b3It
Pk5ld0luc3RhbmNlKGFyZ2MsIGFyZ3MpOworICAgIH0KKworICAgIGlmICh2ODo6Vjg6OklzRGVh
ZCgpKQorICAgICAgICBoYW5kbGVGYXRhbEVycm9ySW5WOCgpOworCisgICAgcmV0dXJuIHJlc3Vs
dDsKK30KKwordjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gVjhQcm94eTo6Z2V0Q29uc3RydWN0b3Io
VjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUpCit7CisgICAgLy8gQSBET00gY29uc3Ry
dWN0b3IgaXMgYSBmdW5jdGlvbiBpbnN0YW5jZSBjcmVhdGVkIGZyb20gYSBET00gY29uc3RydWN0
b3IKKyAgICAvLyB0ZW1wbGF0ZS4gVGhlcmUgaXMgb25lIGluc3RhbmNlIHBlciBjb250ZXh0LiBB
IERPTSBjb25zdHJ1Y3RvciBpcworICAgIC8vIGRpZmZlcmVudCBmcm9tIGEgbm9ybWFsIGZ1bmN0
aW9uIGluIHR3byB3YXlzOgorICAgIC8vICAgMSkgaXQgY2Fubm90IGJlIGNhbGxlZCBhcyBjb25z
dHJ1Y3RvciAoYWthLCB1c2VkIHRvIGNyZWF0ZSBhIERPTSBvYmplY3QpCisgICAgLy8gICAyKSBp
dHMgX19wcm90b19fIHBvaW50cyB0byBPYmplY3QucHJvdG90eXBlIHJhdGhlciB0aGFuCisgICAg
Ly8gICAgICBGdW5jdGlvbi5wcm90b3R5cGUuCisgICAgLy8gVGhlIHJlYXNvbiBmb3IgMikgaXMg
dGhhdCwgaW4gU2FmYXJpLCBhIERPTSBjb25zdHJ1Y3RvciBpcyBhIG5vcm1hbCBKUworICAgIC8v
IG9iamVjdCwgYnV0IG5vdCBhIGZ1bmN0aW9uLiBIb3RtYWlsIHJlbGllcyBvbiB0aGUgZmFjdCB0
aGF0LCBpbiBTYWZhcmksCisgICAgLy8gSFRNTEVsZW1lbnQuX19wcm90b19fID09IE9iamVjdC5w
cm90b3R5cGUuCisgICAgLy8KKyAgICAvLyBtX29iamVjdFByb3RvdHlwZSBpcyBhIGNhY2hlIG9m
IHRoZSBvcmlnaW5hbCBPYmplY3QucHJvdG90eXBlLgorCisgICAgQVNTRVJUKGlzQ29udGV4dElu
aXRpYWxpemVkKCkpOworICAgIC8vIEVudGVyIHRoZSBjb250ZXh0IG9mIHRoZSBwcm94eSB0byBt
YWtlIHN1cmUgdGhhdCB0aGUKKyAgICAvLyBmdW5jdGlvbiBpcyBjb25zdHJ1Y3RlZCBpbiB0aGUg
Y29udGV4dCBjb3JyZXNwb25kaW5nIHRvCisgICAgLy8gdGhpcyBwcm94eS4KKyAgICB2ODo6Q29u
dGV4dDo6U2NvcGUgc2NvcGUobV9jb250ZXh0KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlv
blRlbXBsYXRlPiBmdW5jdGlvblRlbXBsYXRlID0gZ2V0VGVtcGxhdGUodHlwZSk7CisgICAgLy8g
R2V0dGluZyB0aGUgZnVuY3Rpb24gbWlnaHQgZmFpbCBpZiB3ZSdyZSBydW5uaW5nIG91dCBvZgor
ICAgIC8vIHN0YWNrIG9yIG1lbW9yeS4KKyAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7CisgICAg
djg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gdmFsdWUgPSBmdW5jdGlvblRlbXBsYXRlLT5HZXRGdW5j
dGlvbigpOworICAgIGlmICh2YWx1ZS5Jc0VtcHR5KCkpCisgICAgICByZXR1cm4gdjg6OkxvY2Fs
PHY4OjpGdW5jdGlvbj4oKTsKKyAgICAvLyBIb3RtYWlsIGZpeCwgc2VlIGNvbW1lbnRzIGFib3Zl
LgorICAgIHZhbHVlLT5TZXQodjg6OlN0cmluZzo6TmV3KCJfX3Byb3RvX18iKSwgbV9vYmplY3RQ
cm90b3R5cGUpOworICAgIHJldHVybiB2YWx1ZTsKK30KKwordjg6OkxvY2FsPHY4OjpPYmplY3Q+
IFY4UHJveHk6OmNyZWF0ZVdyYXBwZXJGcm9tQ2FjaGUoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJU
eXBlIHR5cGUpCit7CisgICAgaW50IGNsYXNzSW5kZXggPSBWOENsYXNzSW5kZXg6OlRvSW50KHR5
cGUpOworICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGNhY2hlZE9iamVjdCA9IG1fd3JhcHBlckJv
aWxlcnBsYXRlcy0+R2V0KHY4OjpJbnRlZ2VyOjpOZXcoY2xhc3NJbmRleCkpOworICAgIGlmIChj
YWNoZWRPYmplY3QtPklzT2JqZWN0KCkpIHsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+
IG9iamVjdCA9IHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6Q2FzdChjYWNoZWRPYmplY3QpOworICAg
ICAgICByZXR1cm4gb2JqZWN0LT5DbG9uZSgpOworICAgIH0KKworICAgIC8vIE5vdCBpbiBjYWNo
ZS4KKyAgICBpbml0Q29udGV4dElmTmVlZGVkKCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNj
b3BlKG1fY29udGV4dCk7CisgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gZnVuY3Rpb24gPSBn
ZXRDb25zdHJ1Y3Rvcih0eXBlKTsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaW5zdGFuY2Ug
PSBTYWZlQWxsb2NhdGlvbjo6bmV3SW5zdGFuY2UoZnVuY3Rpb24pOworICAgIGlmICghaW5zdGFu
Y2UuSXNFbXB0eSgpKSB7CisgICAgICAgIG1fd3JhcHBlckJvaWxlcnBsYXRlcy0+U2V0KHY4OjpJ
bnRlZ2VyOjpOZXcoY2xhc3NJbmRleCksIGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIGluc3Rh
bmNlLT5DbG9uZSgpOworICAgIH0KKyAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3Io
KTsKK30KKworLy8gR2V0IHRoZSBzdHJpbmcgJ3RvU3RyaW5nJy4KK3N0YXRpYyB2ODo6UGVyc2lz
dGVudDx2ODo6U3RyaW5nPiBHZXRUb1N0cmluZ05hbWUoKQoreworICAgIERFRklORV9TVEFUSUNf
TE9DQUwodjg6OlBlcnNpc3RlbnQ8djg6OlN0cmluZz4sIHZhbHVlLCAoKSk7CisgICAgaWYgKHZh
bHVlLklzRW1wdHkoKSkKKyAgICAgICAgdmFsdWUgPSB2ODo6UGVyc2lzdGVudDx2ODo6U3RyaW5n
Pjo6TmV3KHY4OjpTdHJpbmc6Ok5ldygidG9TdHJpbmciKSk7CisgICAgcmV0dXJuIHZhbHVlOwor
fQorCitzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IENvbnN0cnVjdG9yVG9TdHJpbmcoY29u
c3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICAvLyBUaGUgRE9NIGNvbnN0cnVjdG9ycycg
dG9TdHJpbmcgZnVuY3Rpb25zIGdyYWIgdGhlIGN1cnJlbnQgdG9TdHJpbmcKKyAgICAvLyBmb3Ig
RnVuY3Rpb25zIGJ5IHRha2luZyB0aGUgdG9TdHJpbmcgZnVuY3Rpb24gb2YgaXRzZWxmIGFuZCB0
aGVuCisgICAgLy8gY2FsbGluZyBpdCB3aXRoIHRoZSBjb25zdHJ1Y3RvciBhcyBpdHMgcmVjZWl2
ZXIuICBUaGlzIG1lYW5zIHRoYXQKKyAgICAvLyBjaGFuZ2VzIHRvIHRoZSBGdW5jdGlvbiBwcm90
b3R5cGUgY2hhaW4gb3IgdG9TdHJpbmcgZnVuY3Rpb24gYXJlCisgICAgLy8gcmVmbGVjdGVkIHdo
ZW4gcHJpbnRpbmcgRE9NIGNvbnN0cnVjdG9ycy4gIFRoZSBvbmx5IHdhcnQgaXMgdGhhdAorICAg
IC8vIGNoYW5nZXMgdG8gYSBET00gY29uc3RydWN0b3IncyB0b1N0cmluZydzIHRvU3RyaW5nIHdp
bGwgY2F1c2UgdGhlCisgICAgLy8gdG9TdHJpbmcgb2YgdGhlIERPTSBjb25zdHJ1Y3RvciBpdHNl
bGYgdG8gY2hhbmdlLiAgVGhpcyBpcyBleHRyZW1lbHkKKyAgICAvLyBvYnNjdXJlIGFuZCB1bmxp
a2VseSB0byBiZSBhIHByb2JsZW0uCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlID0g
YXJncy5DYWxsZWUoKS0+R2V0KEdldFRvU3RyaW5nTmFtZSgpKTsKKyAgICBpZiAoIXZhbHVlLT5J
c0Z1bmN0aW9uKCkpIAorICAgICAgICByZXR1cm4gdjg6OlN0cmluZzo6TmV3KCIiKTsKKyAgICBy
ZXR1cm4gdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+OjpDYXN0KHZhbHVlKS0+Q2FsbChhcmdzLlRo
aXMoKSwgMCwgMCk7Cit9CisKK3Y4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBW
OFByb3h5OjpnZXRUZW1wbGF0ZShWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSkKK3sK
KyAgICB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4qIGNhY2hlQ2VsbCA9IFY4
Q2xhc3NJbmRleDo6R2V0Q2FjaGUodHlwZSk7CisgICAgaWYgKCEoKmNhY2hlQ2VsbCkuSXNFbXB0
eSgpKQorICAgICAgICByZXR1cm4gKmNhY2hlQ2VsbDsKKworICAgIC8vIG5vdCBmb3VuZAorICAg
IEZ1bmN0aW9uVGVtcGxhdGVGYWN0b3J5IGZhY3RvcnkgPSBWOENsYXNzSW5kZXg6OkdldEZhY3Rv
cnkodHlwZSk7CisgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGRlc2Ny
aXB0b3IgPSBmYWN0b3J5KCk7CisgICAgLy8gRE9NIGNvbnN0cnVjdG9ycyBhcmUgZnVuY3Rpb25z
IGFuZCBzaG91bGQgcHJpbnQgdGhlbXNlbHZlcyBhcyBzdWNoLgorICAgIC8vIEhvd2V2ZXIsIHdl
IHdpbGwgbGF0ZXIgcmVwbGFjZSB0aGVpciBwcm90b3R5cGVzIHdpdGggT2JqZWN0CisgICAgLy8g
cHJvdG90eXBlcyBzbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgb3ZlcnJpZGUgdG9TdHJpbmcgb24g
dGhlCisgICAgLy8gaW5zdGFuY2UgaXRzZWxmLiAgSWYgd2UgbGF0ZXIgbWFrZSBET00gY29uc3Ry
dWN0b3JzIGZ1bGwgb2JqZWN0cworICAgIC8vIHdlIGNhbiBnaXZlIHRoZW0gY2xhc3MgbmFtZXMg
aW5zdGVhZCBhbmQgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZworICAgIC8vIHdpbGwgd29yayBz
byB3ZSBjYW4gcmVtb3ZlIHRoaXMgY29kZS4KKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKHY4OjpQ
ZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiwgdG9TdHJpbmdUZW1wbGF0ZSwgKCkpOwor
ICAgIGlmICh0b1N0cmluZ1RlbXBsYXRlLklzRW1wdHkoKSkKKyAgICAgICAgdG9TdHJpbmdUZW1w
bGF0ZSA9IHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KHY4OjpGdW5j
dGlvblRlbXBsYXRlOjpOZXcoQ29uc3RydWN0b3JUb1N0cmluZykpOworICAgIGRlc2NyaXB0b3It
PlNldChHZXRUb1N0cmluZ05hbWUoKSwgdG9TdHJpbmdUZW1wbGF0ZSk7CisgICAgc3dpdGNoICh0
eXBlKSB7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkNTU1NUWUxFREVDTEFSQVRJT046CisgICAg
ICAgIC8vIFRoZSBuYW1lZCBwcm9wZXJ0eSBoYW5kbGVyIGZvciBzdHlsZSBkZWNsYXJhdGlvbnMg
aGFzIGEKKyAgICAgICAgLy8gc2V0dGVyLiAgVGhlcmVmb3JlLCB0aGUgaW50ZXJjZXB0b3IgaGFz
IHRvIGJlIG9uIHRoZSBvYmplY3QKKyAgICAgICAgLy8gaXRzZWxmIGFuZCBub3Qgb24gdGhlIHBy
b3RvdHlwZSBvYmplY3QuCisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+
U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoIFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoQ1NTU3R5
bGVEZWNsYXJhdGlvbiksIFVTRV9OQU1FRF9QUk9QRVJUWV9TRVRURVIoQ1NTU3R5bGVEZWNsYXJh
dGlvbikpOworICAgICAgICBzZXRDb2xsZWN0aW9uU3RyaW5nT3JOdWxsSW5kZXhlZEdldHRlcjxD
U1NTdHlsZURlY2xhcmF0aW9uPihkZXNjcmlwdG9yKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBWOENsYXNzSW5kZXg6OkNTU1JVTEVMSVNUOgorICAgICAgICBzZXRDb2xsZWN0aW9uSW5kZXhl
ZEdldHRlcjxDU1NSdWxlTGlzdCwgQ1NTUnVsZT4oZGVzY3JpcHRvciwgIFY4Q2xhc3NJbmRleDo6
Q1NTUlVMRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpDU1NWQUxV
RUxJU1Q6CisgICAgICAgIHNldENvbGxlY3Rpb25JbmRleGVkR2V0dGVyPENTU1ZhbHVlTGlzdCwg
Q1NTVmFsdWU+KGRlc2NyaXB0b3IsIFY4Q2xhc3NJbmRleDo6Q1NTVkFMVUUpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q1NTVkFSSUFCTEVTREVDTEFSQVRJT046Cisg
ICAgICAgIHNldENvbGxlY3Rpb25TdHJpbmdPck51bGxJbmRleGVkR2V0dGVyPENTU1ZhcmlhYmxl
c0RlY2xhcmF0aW9uPihkZXNjcmlwdG9yKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENs
YXNzSW5kZXg6OldFQktJVENTU1RSQU5TRk9STVZBTFVFOgorICAgICAgICBzZXRDb2xsZWN0aW9u
SW5kZXhlZEdldHRlcjxXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSwgQ1NTVmFsdWU+KGRlc2NyaXB0
b3IsIFY4Q2xhc3NJbmRleDo6Q1NTVkFMVUUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4
Q2xhc3NJbmRleDo6VU5ERVRFQ1RBQkxFSFRNTENPTExFQ1RJT046CisgICAgICAgIGRlc2NyaXB0
b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+TWFya0FzVW5kZXRlY3RhYmxlKCk7ICAvLyBmYWxsIHRo
cm91Z2gKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT046CisgICAgICAgIGRl
c2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNF
X05BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MQ29sbGVjdGlvbikpOworICAgICAgICBkZXNjcmlw
dG9yLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldENhbGxBc0Z1bmN0aW9uSGFuZGxlcihVU0VfQ0FM
TEJBQ0soSFRNTENvbGxlY3Rpb25DYWxsQXNGdW5jdGlvbikpOworICAgICAgICBzZXRDb2xsZWN0
aW9uSW5kZXhlZEdldHRlcjxIVE1MQ29sbGVjdGlvbiwgTm9kZT4oZGVzY3JpcHRvciwgVjhDbGFz
c0luZGV4OjpOT0RFKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhU
TUxPUFRJT05TQ09MTEVDVElPTjoKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0
ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhU
TUxDb2xsZWN0aW9uKSk7CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+
U2V0SW5kZXhlZFByb3BlcnR5SGFuZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoSFRN
TE9wdGlvbnNDb2xsZWN0aW9uKSwgVVNFX0lOREVYRURfUFJPUEVSVFlfU0VUVEVSKEhUTUxPcHRp
b25zQ29sbGVjdGlvbikpOworICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCkt
PlNldENhbGxBc0Z1bmN0aW9uSGFuZGxlcihVU0VfQ0FMTEJBQ0soSFRNTENvbGxlY3Rpb25DYWxs
QXNGdW5jdGlvbikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRN
TFNFTEVDVEVMRU1FTlQ6CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+
U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MU2Vs
ZWN0RWxlbWVudENvbGxlY3Rpb24pKTsKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1w
bGF0ZSgpLT5TZXRJbmRleGVkUHJvcGVydHlIYW5kbGVyKG5vZGVDb2xsZWN0aW9uSW5kZXhlZFBy
b3BlcnR5R2V0dGVyPEhUTUxTZWxlY3RFbGVtZW50PiwgVVNFX0lOREVYRURfUFJPUEVSVFlfU0VU
VEVSKEhUTUxTZWxlY3RFbGVtZW50Q29sbGVjdGlvbiksCisgICAgICAgICAgICAwLCAwLCBub2Rl
Q29sbGVjdGlvbkluZGV4ZWRQcm9wZXJ0eUVudW1lcmF0b3I8SFRNTFNlbGVjdEVsZW1lbnQ+LCB2
ODo6SW50ZWdlcjo6TmV3KFY4Q2xhc3NJbmRleDo6Tk9ERSkpOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTERPQ1VNRU5UOiB7CisgICAgICAgIGRlc2NyaXB0b3It
Pkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BS
T1BFUlRZX0dFVFRFUihIVE1MRG9jdW1lbnQpLCAwLCAwLCBVU0VfTkFNRURfUFJPUEVSVFlfREVM
RVRFUihIVE1MRG9jdW1lbnQpKTsKKworICAgICAgICAvLyBXZSBhZGQgYW4gZXh0cmEgaW50ZXJu
YWwgZmllbGQgdG8gYWxsIERvY3VtZW50IHdyYXBwZXJzIGZvcgorICAgICAgICAvLyBzdG9yaW5n
IGEgcGVyIGRvY3VtZW50IERPTUltcGxlbWVudGF0aW9uIHdyYXBwZXIuCisgICAgICAgIC8vCisg
ICAgICAgIC8vIEFkZGl0aW9uYWxseSwgd2UgYWRkIHR3byBleHRyYSBpbnRlcm5hbCBmaWVsZHMg
Zm9yCisgICAgICAgIC8vIEhUTUxEb2N1bWVudHMgdG8gaW1wbGVtZW50IHRlbXBvcmFyeSBzaGFk
b3dpbmcgb2YKKyAgICAgICAgLy8gZG9jdW1lbnQuYWxsLiAgT25lIGZpZWxkIGhvbGRzIGFuIG9i
amVjdCB0aGF0IGlzIHVzZWQgYXMgYQorICAgICAgICAvLyBtYXJrZXIuICBUaGUgb3RoZXIgZmll
bGQgaG9sZHMgdGhlIG1hcmtlciBvYmplY3QgaWYKKyAgICAgICAgLy8gZG9jdW1lbnQuYWxsIGlz
IG5vdCBzaGFkb3dlZCBhbmQgc29tZSBvdGhlciB2YWx1ZSBpZgorICAgICAgICAvLyBkb2N1bWVu
dC5hbGwgaXMgc2hhZG93ZWQuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+
IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAg
ICAgIEFTU0VSVChpbnN0YW5jZVRlbXBsYXRlLT5JbnRlcm5hbEZpZWxkQ291bnQoKSA9PSBWOEN1
c3RvbTo6a0RlZmF1bHRXcmFwcGVySW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgaW5zdGFu
Y2VUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9tOjprSFRNTERvY3VtZW50
SW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorI2lmIEVOQUJMRShT
VkcpCisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlNWR0RPQ1VNRU5UOiAgLy8gZmFsbCB0aHJvdWdo
CisjZW5kaWYKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6RE9DVU1FTlQ6IHsKKyAgICAgICAgLy8g
V2UgYWRkIGFuIGV4dHJhIGludGVybmFsIGZpZWxkIHRvIGFsbCBEb2N1bWVudCB3cmFwcGVycyBm
b3IKKyAgICAgICAgLy8gc3RvcmluZyBhIHBlciBkb2N1bWVudCBET01JbXBsZW1lbnRhdGlvbiB3
cmFwcGVyLgorICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBpbnN0YW5jZVRl
bXBsYXRlID0gZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBBU1NFUlQo
aW5zdGFuY2VUZW1wbGF0ZS0+SW50ZXJuYWxGaWVsZENvdW50KCkgPT0gVjhDdXN0b206OmtEZWZh
dWx0V3JhcHBlckludGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUt
PlNldEludGVybmFsRmllbGRDb3VudCggVjhDdXN0b206OmtEb2N1bWVudE1pbmltdW1JbnRlcm5h
bEZpZWxkQ291bnQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWOENsYXNzSW5k
ZXg6OkhUTUxBUFBMRVRFTEVNRU5UOiAgLy8gZmFsbCB0aHJvdWdoCisgICAgY2FzZSBWOENsYXNz
SW5kZXg6OkhUTUxFTUJFREVMRU1FTlQ6ICAvLyBmYWxsIHRocm91Z2gKKyAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6SFRNTE9CSkVDVEVMRU1FTlQ6CisgICAgICAgIC8vIEhUTUxBcHBsZXRFbGVtZW50
LCBIVE1MRW1iZWRFbGVtZW50IGFuZCBIVE1MT2JqZWN0RWxlbWVudCBhcmUKKyAgICAgICAgLy8g
aW5oZXJpdGVkIGZyb20gSFRNTFBsdWdJbkVsZW1lbnQsIGFuZCB0aGV5IHNoYXJlIHRoZSBzYW1l
IHByb3BlcnR5CisgICAgICAgIC8vIGhhbmRsaW5nIGNvZGUuCisgICAgICAgIGRlc2NyaXB0b3It
Pkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BS
T1BFUlRZX0dFVFRFUihIVE1MUGx1Z0luRWxlbWVudCksIFVTRV9OQU1FRF9QUk9QRVJUWV9TRVRU
RVIoSFRNTFBsdWdJbkVsZW1lbnQpKTsKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1w
bGF0ZSgpLT5TZXRJbmRleGVkUHJvcGVydHlIYW5kbGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZX0dF
VFRFUihIVE1MUGx1Z0luRWxlbWVudCksIFVTRV9JTkRFWEVEX1BST1BFUlRZX1NFVFRFUihIVE1M
UGx1Z0luRWxlbWVudCkpOworICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCkt
PlNldENhbGxBc0Z1bmN0aW9uSGFuZGxlcihVU0VfQ0FMTEJBQ0soSFRNTFBsdWdJbkVsZW1lbnQp
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhUTUxGUkFNRVNFVEVM
RU1FTlQ6CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQ
cm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MRnJhbWVTZXRFbGVt
ZW50KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpIVE1MRk9STUVM
RU1FTlQ6CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQ
cm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MRm9ybUVsZW1lbnQp
KTsKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRJbmRleGVkUHJv
cGVydHlIYW5kbGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZX0dFVFRFUihIVE1MRm9ybUVsZW1lbnQp
LCAwLCAwLCAwLCBub2RlQ29sbGVjdGlvbkluZGV4ZWRQcm9wZXJ0eUVudW1lcmF0b3I8SFRNTEZv
cm1FbGVtZW50Piwgdjg6OkludGVnZXI6Ok5ldyhWOENsYXNzSW5kZXg6Ok5PREUpKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkNBTlZBU1BJWEVMQVJSQVk6CisgICAg
ICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0SW5kZXhlZFByb3BlcnR5SGFu
ZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoQ2FudmFzUGl4ZWxBcnJheSksIFVTRV9J
TkRFWEVEX1BST1BFUlRZX1NFVFRFUihDYW52YXNQaXhlbEFycmF5KSk7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpTVFlMRVNIRUVUOiAgLy8gZmFsbCB0aHJvdWdoCisg
ICAgY2FzZSBWOENsYXNzSW5kZXg6OkNTU1NUWUxFU0hFRVQ6IHsKKyAgICAgICAgLy8gV2UgYWRk
IGFuIGV4dHJhIGludGVybmFsIGZpZWxkIHRvIGhvbGQgYSByZWZlcmVuY2UgdG8KKyAgICAgICAg
Ly8gdGhlIG93bmVyIG5vZGUuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+
IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAg
ICAgIEFTU0VSVChpbnN0YW5jZVRlbXBsYXRlLT5JbnRlcm5hbEZpZWxkQ291bnQoKSA9PSBWOEN1
c3RvbTo6a0RlZmF1bHRXcmFwcGVySW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgaW5zdGFu
Y2VUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9tOjprU3R5bGVTaGVldElu
dGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6TUVESUFMSVNUOgorICAgICAgICBzZXRDb2xsZWN0aW9uU3RyaW5nT3JOdWxsSW5k
ZXhlZEdldHRlcjxNZWRpYUxpc3Q+KGRlc2NyaXB0b3IpOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIFY4Q2xhc3NJbmRleDo6TUlNRVRZUEVBUlJBWToKKyAgICAgICAgc2V0Q29sbGVjdGlvbklu
ZGV4ZWRBbmROYW1lZEdldHRlcnM8TWltZVR5cGVBcnJheSwgTWltZVR5cGU+KGRlc2NyaXB0b3Is
IFY4Q2xhc3NJbmRleDo6TUlNRVRZUEUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6TkFNRUROT0RFTUFQOgorICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBs
YXRlKCktPlNldE5hbWVkUHJvcGVydHlIYW5kbGVyKFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIo
TmFtZWROb2RlTWFwKSk7CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+
U2V0SW5kZXhlZFByb3BlcnR5SGFuZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoTmFt
ZWROb2RlTWFwKSwgMCwgMCwgMCwgY29sbGVjdGlvbkluZGV4ZWRQcm9wZXJ0eUVudW1lcmF0b3I8
TmFtZWROb2RlTWFwPiwgdjg6OkludGVnZXI6Ok5ldyhWOENsYXNzSW5kZXg6Ok5PREUpKTsKKyAg
ICAgICAgYnJlYWs7CisjaWYgRU5BQkxFKERPTV9TVE9SQUdFKQ0KKyAgICBjYXNlIFY4Q2xhc3NJ
bmRleDo6U1RPUkFHRToNCisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+
U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihTdG9yYWdl
KSwgVVNFX05BTUVEX1BST1BFUlRZX1NFVFRFUihTdG9yYWdlKSwgMCwgVVNFX05BTUVEX1BST1BF
UlRZX0RFTEVURVIoU3RvcmFnZSksIFY4Q3VzdG9tOjp2OFN0b3JhZ2VOYW1lZFByb3BlcnR5RW51
bWVyYXRvcik7DQorICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldElu
ZGV4ZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX0lOREVYRURfUFJPUEVSVFlfR0VUVEVSKFN0b3JhZ2Up
LCBVU0VfSU5ERVhFRF9QUk9QRVJUWV9TRVRURVIoU3RvcmFnZSksIDAsIFVTRV9JTkRFWEVEX1BS
T1BFUlRZX0RFTEVURVIoU3RvcmFnZSkpOw0KKyAgICAgICAgYnJlYWs7DQorI2VuZGlmCisgICAg
Y2FzZSBWOENsYXNzSW5kZXg6Ok5PREVMSVNUOgorICAgICAgICBzZXRDb2xsZWN0aW9uSW5kZXhl
ZEdldHRlcjxOb2RlTGlzdCwgTm9kZT4oZGVzY3JpcHRvciwgVjhDbGFzc0luZGV4OjpOT0RFKTsK
KyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5
SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKE5vZGVMaXN0KSk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpQTFVHSU46CisgICAgICAgIHNldENvbGxlY3Rp
b25JbmRleGVkQW5kTmFtZWRHZXR0ZXJzPFBsdWdpbiwgTWltZVR5cGU+KGRlc2NyaXB0b3IsIFY4
Q2xhc3NJbmRleDo6TUlNRVRZUEUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJ
bmRleDo6UExVR0lOQVJSQVk6CisgICAgICAgIHNldENvbGxlY3Rpb25JbmRleGVkQW5kTmFtZWRH
ZXR0ZXJzPFBsdWdpbkFycmF5LCBQbHVnaW4+KGRlc2NyaXB0b3IsIFY4Q2xhc3NJbmRleDo6UExV
R0lOKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVRM
SVNUOgorICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldE5hbWVkUHJv
cGVydHlIYW5kbGVyKFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoU3R5bGVTaGVldExpc3QpKTsK
KyAgICAgICAgc2V0Q29sbGVjdGlvbkluZGV4ZWRHZXR0ZXI8U3R5bGVTaGVldExpc3QsIFN0eWxl
U2hlZXQ+KGRlc2NyaXB0b3IsIFY4Q2xhc3NJbmRleDo6U1RZTEVTSEVFVCk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpET01XSU5ET1c6IHsKKyAgICAgICAgdjg6Okxv
Y2FsPHY4OjpTaWduYXR1cmU+IGRlZmF1bHRTaWduYXR1cmUgPSB2ODo6U2lnbmF0dXJlOjpOZXco
ZGVzY3JpcHRvcik7CisKKyAgICAgICAgZGVzY3JpcHRvci0+UHJvdG90eXBlVGVtcGxhdGUoKS0+
U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihET01XaW5k
b3cpKTsKKyAgICAgICAgZGVzY3JpcHRvci0+UHJvdG90eXBlVGVtcGxhdGUoKS0+U2V0SW5kZXhl
ZFByb3BlcnR5SGFuZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoRE9NV2luZG93KSk7
CisKKyAgICAgICAgZGVzY3JpcHRvci0+U2V0SGlkZGVuUHJvdG90eXBlKHRydWUpOworCisgICAg
ICAgIC8vIFJlc2VydmUgc3BhY2VzIGZvciByZWZlcmVuY2VzIHRvIGxvY2F0aW9uLCBoaXN0b3J5
IGFuZAorICAgICAgICAvLyBuYXZpZ2F0b3Igb2JqZWN0cy4KKyAgICAgICAgdjg6OkxvY2FsPHY4
OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2NyaXB0b3ItPkluc3RhbmNl
VGVtcGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2VUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENv
dW50KFY4Q3VzdG9tOjprRE9NV2luZG93SW50ZXJuYWxGaWVsZENvdW50KTsKKworICAgICAgICAv
LyBTZXQgYWNjZXNzIGNoZWNrIGNhbGxiYWNrcywgYnV0IHR1cm5lZCBvZmYgaW5pdGlhbGx5Lgor
ICAgICAgICAvLyBXaGVuIGEgY29udGV4dCBpcyBkZXRhY2hlZCBmcm9tIGEgZnJhbWUsIHR1cm4g
b24gdGhlIGFjY2VzcyBjaGVjay4KKyAgICAgICAgLy8gVHVybmluZyBvbiBjaGVja3MgYWxzbyBp
bnZhbGlkYXRlcyBpbmxpbmUgY2FjaGVzIG9mIHRoZSBvYmplY3QuCisgICAgICAgIGluc3RhbmNl
VGVtcGxhdGUtPlNldEFjY2Vzc0NoZWNrQ2FsbGJhY2tzKFY4Q3VzdG9tOjp2OERPTVdpbmRvd05h
bWVkU2VjdXJpdHlDaGVjaywgVjhDdXN0b206OnY4RE9NV2luZG93SW5kZXhlZFNlY3VyaXR5Q2hl
Y2ssIHY4OjpJbnRlZ2VyOjpOZXcoVjhDbGFzc0luZGV4OjpET01XSU5ET1cpLCBmYWxzZSk7Cisg
ICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6TE9DQVRJT046IHsK
KyAgICAgICAgLy8gRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgb24g
dGhlIGluc3RhbmNlCisgICAgICAgIC8vIGluc3RlYWQgb2Ygb24gdGhlIHByb3RvdHlwZSBvYmpl
Y3QgdG8gaW5zdXJlIHRoYXQgdGhleSBjYW5ub3QKKyAgICAgICAgLy8gYmUgb3ZlcndyaXR0ZW4u
CisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlID0gZGVzY3Jp
cHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBpbnN0YW5jZS0+U2V0QWNjZXNzb3Io
djg6OlN0cmluZzo6TmV3KCJyZWxvYWQiKSwgVjhDdXN0b206OnY4TG9jYXRpb25SZWxvYWRBY2Nl
c3NvckdldHRlciwgMCwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCksIHY4OjpBTExfQ0FOX1JFQUQs
IHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OkRvbnREZWxldGUgfCB2ODo6
UmVhZE9ubHkpKTsKKyAgICAgICAgaW5zdGFuY2UtPlNldEFjY2Vzc29yKHY4OjpTdHJpbmc6Ok5l
dygicmVwbGFjZSIpLCBWOEN1c3RvbTo6djhMb2NhdGlvblJlcGxhY2VBY2Nlc3NvckdldHRlciwg
MCwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCksIHY4OjpBTExfQ0FOX1JFQUQsIHN0YXRpY19jYXN0
PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OkRvbnREZWxldGUgfCB2ODo6UmVhZE9ubHkpKTsK
KyAgICAgICAgaW5zdGFuY2UtPlNldEFjY2Vzc29yKHY4OjpTdHJpbmc6Ok5ldygiYXNzaWduIiks
IFY4Q3VzdG9tOjp2OExvY2F0aW9uQXNzaWduQWNjZXNzb3JHZXR0ZXIsIDAsIHY4OjpIYW5kbGU8
djg6OlZhbHVlPigpLCB2ODo6QUxMX0NBTl9SRUFELCBzdGF0aWNfY2FzdDx2ODo6UHJvcGVydHlB
dHRyaWJ1dGU+KHY4OjpEb250RGVsZXRlIHwgdjg6OlJlYWRPbmx5KSk7CisgICAgICAgIGJyZWFr
OworICAgIH0KKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SElTVE9SWToKKyAgICAgICAgYnJlYWs7
CisKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6TUVTU0FHRUNIQU5ORUw6IHsKKyAgICAgICAgLy8g
UmVzZXJ2ZSB0d28gbW9yZSBpbnRlcm5hbCBmaWVsZHMgZm9yIHJlZmVyZW5jaW5nIHRoZSBwb3J0
MQorICAgICAgICAvLyBhbmQgcG9ydDIgd3JhcHBlcnMuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUg
cG9ydCB3cmFwcGVycyBhcmUKKyAgICAgICAgLy8ga2VwdCBhbGl2ZSB3aGVuIHRoZSBjaGFubmVs
IHdyYXBwZXIgaXMuCisgICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5kbGVyKFVTRV9DQUxM
QkFDSyhNZXNzYWdlQ2hhbm5lbENvbnN0cnVjdG9yKSk7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6
T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjcmlwdG9yLT5JbnN0YW5jZVRl
bXBsYXRlKCk7CisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUtPlNldEludGVybmFsRmllbGRDb3Vu
dChWOEN1c3RvbTo6a01lc3NhZ2VDaGFubmVsSW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAg
YnJlYWs7CisgICAgfQorCisgICAgY2FzZSBWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JUOiB7Cisg
ICAgICAgIC8vIFJlc2VydmUgb25lIG1vcmUgaW50ZXJuYWwgZmllbGQgZm9yIGtlZXBpbmcgZXZl
bnQgbGlzdGVuZXJzLgorICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBpbnN0
YW5jZVRlbXBsYXRlID0gZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBp
bnN0YW5jZVRlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoVjhDdXN0b206OmtNZXNzYWdl
UG9ydEludGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmIEVO
QUJMRShXT1JLRVJTKQorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpXT1JLRVI6IHsKKyAgICAgICAg
Ly8gUmVzZXJ2ZSBvbmUgbW9yZSBpbnRlcm5hbCBmaWVsZCBmb3Iga2VlcGluZyBldmVudCBsaXN0
ZW5lcnMuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVt
cGxhdGUgPSBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAgICAgIGluc3RhbmNl
VGVtcGxhdGUtPlNldEludGVybmFsRmllbGRDb3VudChWOEN1c3RvbTo6a1dvcmtlckludGVybmFs
RmllbGRDb3VudCk7CisgICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5kbGVyKFVTRV9DQUxM
QkFDSyhXb3JrZXJDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBj
YXNlIFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVDogeworICAgICAgICAvLyBSZXNlcnZlIG9u
ZSBtb3JlIGludGVybmFsIGZpZWxkIGZvciBrZWVwaW5nIGV2ZW50IGxpc3RlbmVycy4KKyAgICAg
ICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2Ny
aXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2VUZW1wbGF0ZS0+U2V0
SW50ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9tOjprV29ya2VyQ29udGV4dEludGVybmFsRmllbGRD
b3VudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvLyBXT1JLRVJTCisKKyAgICAv
LyBUaGUgZm9sbG93aW5nIG9iamVjdHMgYXJlIGNyZWF0ZWQgZnJvbSBKYXZhU2NyaXB0LgorICAg
IGNhc2UgVjhDbGFzc0luZGV4OjpET01QQVJTRVI6CisgICAgICAgIGRlc2NyaXB0b3ItPlNldENh
bGxIYW5kbGVyKFVTRV9DQUxMQkFDSyhET01QYXJzZXJDb25zdHJ1Y3RvcikpOworICAgICAgICBi
cmVhazsKKyNpZiBFTkFCTEUoVklERU8pDQorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpIVE1MQVVE
SU9FTEVNRU5UOg0KKyAgICAgICAgZGVzY3JpcHRvci0+U2V0Q2FsbEhhbmRsZXIoVVNFX0NBTExC
QUNLKEhUTUxBdWRpb0VsZW1lbnRDb25zdHJ1Y3RvcikpOw0KKyAgICAgICAgYnJlYWs7DQorI2Vu
ZGlmCisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhUTUxJTUFHRUVMRU1FTlQ6CisgICAgICAgIGRl
c2NyaXB0b3ItPlNldENhbGxIYW5kbGVyKFVTRV9DQUxMQkFDSyhIVE1MSW1hZ2VFbGVtZW50Q29u
c3RydWN0b3IpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhUTUxP
UFRJT05FTEVNRU5UOgorICAgICAgICBkZXNjcmlwdG9yLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FM
TEJBQ0soSFRNTE9wdGlvbkVsZW1lbnRDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIFY4Q2xhc3NJbmRleDo6V0VCS0lUQ1NTTUFUUklYOgorICAgICAgICBkZXNjcmlwdG9y
LT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJBQ0soV2ViS2l0Q1NTTWF0cml4Q29uc3RydWN0b3Ip
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OldFQktJVFBPSU5UOgor
ICAgICAgICBkZXNjcmlwdG9yLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJBQ0soV2ViS2l0UG9p
bnRDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6
WE1MU0VSSUFMSVpFUjoKKyAgICAgICAgZGVzY3JpcHRvci0+U2V0Q2FsbEhhbmRsZXIoVVNFX0NB
TExCQUNLKFhNTFNlcmlhbGl6ZXJDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1Q6IHsKKyAgICAgICAgLy8gUmVzZXJ2ZSBv
bmUgbW9yZSBpbnRlcm5hbCBmaWVsZCBmb3Iga2VlcGluZyBldmVudCBsaXN0ZW5lcnMuCisgICAg
ICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNj
cmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUtPlNl
dEludGVybmFsRmllbGRDb3VudChWOEN1c3RvbTo6a1hNTEh0dHBSZXF1ZXN0SW50ZXJuYWxGaWVs
ZENvdW50KTsKKyAgICAgICAgZGVzY3JpcHRvci0+U2V0Q2FsbEhhbmRsZXIoVVNFX0NBTExCQUNL
KFhNTEh0dHBSZXF1ZXN0Q29uc3RydWN0b3IpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAg
IGNhc2UgVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRDogeworICAgICAgICAvLyBS
ZXNlcnZlIG9uZSBtb3JlIGludGVybmFsIGZpZWxkIGZvciBrZWVwaW5nIGV2ZW50IGxpc3RlbmVy
cy4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0
ZSA9IGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2VUZW1w
bGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KFY4Q3VzdG9tOjprWE1MSHR0cFJlcXVlc3RJbnRl
cm5hbEZpZWxkQ291bnQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWOENsYXNz
SW5kZXg6OlhQQVRIRVZBTFVBVE9SOgorICAgICAgICBkZXNjcmlwdG9yLT5TZXRDYWxsSGFuZGxl
cihVU0VfQ0FMTEJBQ0soWFBhdGhFdmFsdWF0b3JDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6WFNMVFBST0NFU1NPUjoKKyAgICAgICAgZGVzY3Jp
cHRvci0+U2V0Q2FsbEhhbmRsZXIoVVNFX0NBTExCQUNLKFhTTFRQcm9jZXNzb3JDb25zdHJ1Y3Rv
cikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q0xJRU5UUkVDVExJ
U1Q6CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0SW5kZXhlZFBy
b3BlcnR5SGFuZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoQ2xpZW50UmVjdExpc3Qp
KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQor
CisgICAgKmNhY2hlQ2VsbCA9IGRlc2NyaXB0b3I7CisgICAgcmV0dXJuIGRlc2NyaXB0b3I7Cit9
CisKK2Jvb2wgVjhQcm94eTo6aXNDb250ZXh0SW5pdGlhbGl6ZWQoKQoreworICAgIC8vIG1fY29u
dGV4dCwgbV9nbG9iYWwsIG1fb2JqZWN0UHJvdG90eXBlIGFuZCBtX3dyYXBwZXJCb2lsZXJwbGF0
ZXMgc2hvdWxkCisgICAgLy8gYWxsIGJlIG5vbi1lbXB0eSBpZiBpZiBtX2NvbnRleHQgaXMgbm9u
LWVtcHR5LgorICAgIEFTU0VSVChtX2NvbnRleHQuSXNFbXB0eSgpIHx8ICFtX2dsb2JhbC5Jc0Vt
cHR5KCkpOworICAgIEFTU0VSVChtX2NvbnRleHQuSXNFbXB0eSgpIHx8ICFtX29iamVjdFByb3Rv
dHlwZS5Jc0VtcHR5KCkpOworICAgIEFTU0VSVChtX2NvbnRleHQuSXNFbXB0eSgpIHx8ICFtX3dy
YXBwZXJCb2lsZXJwbGF0ZXMuSXNFbXB0eSgpKTsKKyAgICByZXR1cm4gIW1fY29udGV4dC5Jc0Vt
cHR5KCk7Cit9CisKK0RPTVdpbmRvdyogVjhQcm94eTo6cmV0cmlldmVXaW5kb3coKQoreworICAg
IC8vIEZJWE1FOiBUaGlzIHNlZW1zIHZlcnkgZnJhZ2lsZS4gSG93IGRvIHdlIGtub3cgdGhhdCB0
aGUgZ2xvYmFsIG9iamVjdAorICAgIC8vIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCBpcyBzb21l
dGhpbmcgc2Vuc2libGU/IERvIHdlIG5lZWQgdG8gdXNlIHRoZQorICAgIC8vIGxhc3QgZW50ZXJl
ZCBoZXJlPyBXaG8gY2FsbHMgdGhpcz8KKyAgICByZXR1cm4gcmV0cmlldmVXaW5kb3codjg6OkNv
bnRleHQ6OkdldEN1cnJlbnQoKSk7Cit9CisKK0RPTVdpbmRvdyogVjhQcm94eTo6cmV0cmlldmVX
aW5kb3codjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCkKK3sKKyAgICB2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+IGdsb2JhbCA9IGNvbnRleHQtPkdsb2JhbCgpOworICAgIEFTU0VSVCghZ2xv
YmFsLklzRW1wdHkoKSk7CisgICAgZ2xvYmFsID0gbG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5k
ZXg6OkRPTVdJTkRPVywgZ2xvYmFsKTsKKyAgICBBU1NFUlQoIWdsb2JhbC5Jc0VtcHR5KCkpOwor
ICAgIHJldHVybiBjb252ZXJ0VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6
OkRPTVdJTkRPVywgZ2xvYmFsKTsKK30KKworRnJhbWUqIFY4UHJveHk6OnJldHJpZXZlRnJhbWUo
djg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCkKK3sKKyAgICByZXR1cm4gcmV0cmlldmVX
aW5kb3coY29udGV4dCktPmZyYW1lKCk7Cit9CisKK0ZyYW1lKiBWOFByb3h5OjpyZXRyaWV2ZUZy
YW1lRm9yRW50ZXJlZENvbnRleHQoKQoreworICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNv
bnRleHQgPSB2ODo6Q29udGV4dDo6R2V0RW50ZXJlZCgpOworICAgIGlmIChjb250ZXh0LklzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHJldHJpZXZlRnJhbWUoY29udGV4
dCk7Cit9CisKK0ZyYW1lKiBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lRm9yQ3VycmVudENvbnRleHQo
KQoreworICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2ODo6Q29udGV4dDo6
R2V0Q3VycmVudCgpOworICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgcmV0dXJuIHJldHJpZXZlRnJhbWUoY29udGV4dCk7Cit9CisKK0ZyYW1lKiBWOFBy
b3h5OjpyZXRyaWV2ZUZyYW1lRm9yQ2FsbGluZ0NvbnRleHQoKQoreworICAgIHY4OjpIYW5kbGU8
djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2ODo6Q29udGV4dDo6R2V0Q2FsbGluZygpOworICAgIGlm
IChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHJldHJp
ZXZlRnJhbWUoY29udGV4dCk7Cit9CisKK0ZyYW1lKiBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lKCkK
K3sKKyAgICBET01XaW5kb3cqIHdpbmRvdyA9IHJldHJpZXZlV2luZG93KCk7CisgICAgcmV0dXJu
IHdpbmRvdyA/IHdpbmRvdy0+ZnJhbWUoKSA6IDA7Cit9CisKK1Y4UHJveHkqIFY4UHJveHk6OnJl
dHJpZXZlKCkKK3sKKyAgICBET01XaW5kb3cqIHdpbmRvdyA9IHJldHJpZXZlV2luZG93KCk7Cisg
ICAgQVNTRVJUKHdpbmRvdyk7CisgICAgcmV0dXJuIHJldHJpZXZlKHdpbmRvdy0+ZnJhbWUoKSk7
Cit9CisKK1Y4UHJveHkqIFY4UHJveHk6OnJldHJpZXZlKEZyYW1lKiBmcmFtZSkKK3sKKyAgICBp
ZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZnJhbWUtPnNjcmlwdCgp
LT5pc0VuYWJsZWQoKSA/IGZyYW1lLT5zY3JpcHQoKS0+cHJveHkoKSA6IDA7Cit9CisKK1Y4UHJv
eHkqIFY4UHJveHk6OnJldHJpZXZlKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQpCit7
CisgICAgaWYgKCFjb250ZXh0LT5pc0RvY3VtZW50KCkpCisgICAgICAgIHJldHVybiAwOworICAg
IHJldHVybiByZXRyaWV2ZShzdGF0aWNfY2FzdDxEb2N1bWVudCo+KGNvbnRleHQpLT5mcmFtZSgp
KTsKK30KKwordm9pZCBWOFByb3h5OjpkaXNjb25uZWN0RnJhbWUoKQoreworICAgIGRpc2Nvbm5l
Y3RFdmVudExpc3RlbmVycygpOworfQorCitib29sIFY4UHJveHk6OmlzRW5hYmxlZCgpCit7Cisg
ICAgU2V0dGluZ3MqIHNldHRpbmdzID0gbV9mcmFtZS0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXNl
dHRpbmdzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJbiB0aGUgY29tbW9uIGNh
c2UsIEphdmFTY3JpcHQgaXMgZW5hYmxlZCBhbmQgd2UncmUgZG9uZS4KKyAgICBpZiAoc2V0dGlu
Z3MtPmlzSmF2YVNjcmlwdEVuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAv
LyBJZiBKYXZhU2NyaXB0IGhhcyBiZWVuIGRpc2FibGVkLCB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhl
IGZyYW1lIHRvIHRlbGwKKyAgICAvLyB3aGV0aGVyIHRoaXMgc2NyaXB0IGNhbWUgZnJvbSB0aGUg
d2ViIG9yIHRoZSBlbWJlZGRlci4gU2NyaXB0cyBmcm9tIHRoZQorICAgIC8vIGVtYmVkZGVyIGFy
ZSBzYWZlIHRvIHJ1biwgYnV0IHNjcmlwdHMgZnJvbSB0aGUgb3RoZXIgc291cmNlcyBhcmUKKyAg
ICAvLyBkaXNhbGxvd2VkLgorICAgIERvY3VtZW50KiBkb2N1bWVudCA9IG1fZnJhbWUtPmRvY3Vt
ZW50KCk7CisgICAgaWYgKCFkb2N1bWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
U2VjdXJpdHlPcmlnaW4qIG9yaWdpbiA9IGRvY3VtZW50LT5zZWN1cml0eU9yaWdpbigpOworICAg
IGlmIChvcmlnaW4tPnByb3RvY29sKCkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
ICAvLyBVbmluaXRpYWxpemVkIGRvY3VtZW50CisKKyAgICBpZiAob3JpZ2luLT5wcm90b2NvbCgp
ID09ICJodHRwIiB8fCBvcmlnaW4tPnByb3RvY29sKCkgPT0gImh0dHBzIikKKyAgICAgICAgcmV0
dXJuIGZhbHNlOyAgLy8gV2ViIHNpdGUKKworICAgIC8vIEZJWE1FOiB0aGUgZm9sbG93aW5nIGFy
ZSBhcHBsaWNhdGlvbiBkZWNpc2lvbnMsIGFuZCB0aGV5IHNob3VsZAorICAgIC8vIG5vdCBiZSBt
YWRlIGF0IHRoaXMgbGF5ZXIuICBpbnN0ZWFkLCB3ZSBzaG91bGQgYnJpZGdlIG91dCB0byB0aGUK
KyAgICAvLyBlbWJlZGRlciB0byBhbGxvdyB0aGVtIHRvIG92ZXJyaWRlIHBvbGljeSBoZXJlLgor
CisgICAgaWYgKG9yaWdpbi0+cHJvdG9jb2woKSA9PSBDaHJvbWl1bUJyaWRnZTo6dWlSZXNvdXJj
ZVByb3RvY29sKCkpCisgICAgICAgIHJldHVybiB0cnVlOyAgIC8vIEVtYmVkZGVyJ3Mgc2NyaXB0
cyBhcmUgb2sgdG8gcnVuCisKKyAgICAvLyBJZiB0aGUgc2NoZW1lIGlzIGZ0cDogb3IgZmlsZTos
IGFuIGVtcHR5IGZpbGUgbmFtZSBpbmRpY2F0ZXMgYSBkaXJlY3RvcnkKKyAgICAvLyBsaXN0aW5n
LCB3aGljaCByZXF1aXJlcyBKYXZhU2NyaXB0IHRvIGZ1bmN0aW9uIHByb3Blcmx5LgorICAgIGNv
bnN0IGNoYXIqIGtEaXJQcm90b2NvbHNbXSA9IHsgImZ0cCIsICJmaWxlIiB9OworICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlzaXplKGtEaXJQcm90b2NvbHMpOyArK2kpIHsKKyAgICAg
ICAgaWYgKG9yaWdpbi0+cHJvdG9jb2woKSA9PSBrRGlyUHJvdG9jb2xzW2ldKSB7CisgICAgICAg
ICAgICBjb25zdCBLVVJMJiB1cmwgPSBkb2N1bWVudC0+dXJsKCk7CisgICAgICAgICAgICByZXR1
cm4gdXJsLnBhdGhBZnRlckxhc3RTbGFzaCgpID09IHVybC5wYXRoRW5kKCk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7ICAvLyBPdGhlciBwcm90b2NvbHMgZmFsbCB0aHJv
dWdoIHRvIGhlcmUKK30KKwordm9pZCBWOFByb3h5Ojp1cGRhdGVEb2N1bWVudFdyYXBwZXIodjg6
OkhhbmRsZTx2ODo6VmFsdWU+IHdyYXBwZXIpCit7CisgICAgY2xlYXJEb2N1bWVudFdyYXBwZXIo
KTsKKworICAgIEFTU0VSVChtX2RvY3VtZW50LklzRW1wdHkoKSk7CisgICAgbV9kb2N1bWVudCA9
IHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT46Ok5ldyh3cmFwcGVyKTsKKyNpZm5kZWYgTkRFQlVH
CisgICAgcmVnaXN0ZXJHbG9iYWxIYW5kbGUoUFJPWFksIHRoaXMsIG1fZG9jdW1lbnQpOworI2Vu
ZGlmCit9CisKK3ZvaWQgVjhQcm94eTo6Y2xlYXJEb2N1bWVudFdyYXBwZXIoKQoreworICAgIGlm
ICghbV9kb2N1bWVudC5Jc0VtcHR5KCkpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIHVucmVn
aXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9kb2N1bWVudCk7CisjZW5kaWYKKyAgICAgICAgbV9k
b2N1bWVudC5EaXNwb3NlKCk7CisgICAgICAgIG1fZG9jdW1lbnQuQ2xlYXIoKTsKKyAgICB9Cit9
CisKK3ZvaWQgVjhQcm94eTo6dXBkYXRlRG9jdW1lbnRXcmFwcGVyQ2FjaGUoKQoreworICAgIHY4
OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4
dFNjb3BlKGNvbnRleHQoKSk7CisKKyAgICAvLyBJZiB0aGUgZG9jdW1lbnQgaGFzIG5vIGZyYW1l
LCBOb2RlVG9WOE9iamVjdCBtaWdodCBnZXQgdGhlCisgICAgLy8gZG9jdW1lbnQgd3JhcHBlciBm
b3IgYSBkb2N1bWVudCB0aGF0IGlzIGFib3V0IHRvIGJlIGRlbGV0ZWQuCisgICAgLy8gSWYgdGhl
IEZvcmNlU2V0IGJlbG93IGNhdXNlcyBhIGdhcmJhZ2UgY29sbGVjdGlvbiwgdGhlIGRvY3VtZW50
CisgICAgLy8gbWlnaHQgZ2V0IGRlbGV0ZWQgYW5kIHRoZSBnbG9iYWwgaGFuZGxlIGZvciB0aGUg
ZG9jdW1lbnQKKyAgICAvLyB3cmFwcGVyIGNsZWFyZWQuIFVzaW5nIHRoZSBjbGVhcmVkIGdsb2Jh
bCBoYW5kbGUgd2lsbCBsZWFkIHRvCisgICAgLy8gY3Jhc2hlcy4gIEluIHRoaXMgY2FzZSB3ZSBj
bGVhciB0aGUgY2FjaGUgYW5kIGxldCB0aGUgRE9NV2luZG93CisgICAgLy8gYWNjZXNzb3IgaGFu
ZGxlIGFjY2VzcyB0byB0aGUgZG9jdW1lbnQuCisgICAgaWYgKCFtX2ZyYW1lLT5kb2N1bWVudCgp
LT5mcmFtZSgpKSB7CisgICAgICAgIGNsZWFyRG9jdW1lbnRXcmFwcGVyQ2FjaGUoKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBkb2N1bWVudFdy
YXBwZXIgPSBjb252ZXJ0Tm9kZVRvVjhPYmplY3QobV9mcmFtZS0+ZG9jdW1lbnQoKSk7CisKKyAg
ICAvLyBJZiBpbnN0YW50aWF0aW9uIG9mIHRoZSBkb2N1bWVudCB3cmFwcGVyIGZhaWxzLCBjbGVh
ciB0aGUgY2FjaGUNCisgICAgLy8gYW5kIGxldCB0aGUgRE9NV2luZG93IGFjY2Vzc29yIGhhbmRs
ZSBhY2Nlc3MgdG8gdGhlIGRvY3VtZW50Lg0KKyAgICBpZiAoZG9jdW1lbnRXcmFwcGVyLklzRW1w
dHkoKSkgew0KKyAgICAgICAgY2xlYXJEb2N1bWVudFdyYXBwZXJDYWNoZSgpOw0KKyAgICAgICAg
cmV0dXJuOw0KKyAgICB9CisgICAgbV9jb250ZXh0LT5HbG9iYWwoKS0+Rm9yY2VTZXQodjg6OlN0
cmluZzo6TmV3KCJkb2N1bWVudCIpLCBkb2N1bWVudFdyYXBwZXIsIHN0YXRpY19jYXN0PHY4OjpQ
cm9wZXJ0eUF0dHJpYnV0ZT4odjg6OlJlYWRPbmx5IHwgdjg6OkRvbnREZWxldGUpKTsKK30KKwor
dm9pZCBWOFByb3h5OjpjbGVhckRvY3VtZW50V3JhcHBlckNhY2hlKCkKK3sKKyAgICBBU1NFUlQo
IW1fY29udGV4dC5Jc0VtcHR5KCkpOworICAgIG1fY29udGV4dC0+R2xvYmFsKCktPkZvcmNlRGVs
ZXRlKHY4OjpTdHJpbmc6Ok5ldygiZG9jdW1lbnQiKSk7Cit9CisKK3ZvaWQgVjhQcm94eTo6ZGlz
cG9zZUNvbnRleHRIYW5kbGVzKCkKK3sKKyAgICBpZiAoIW1fY29udGV4dC5Jc0VtcHR5KCkpIHsK
KyAgICAgICAgbV9jb250ZXh0LkRpc3Bvc2UoKTsKKyAgICAgICAgbV9jb250ZXh0LkNsZWFyKCk7
CisgICAgfQorCisgICAgaWYgKCFtX3dyYXBwZXJCb2lsZXJwbGF0ZXMuSXNFbXB0eSgpKSB7Cisj
aWZuZGVmIE5ERUJVRworICAgICAgICB1bnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMsIG1fd3Jh
cHBlckJvaWxlcnBsYXRlcyk7CisjZW5kaWYKKyAgICAgICAgbV93cmFwcGVyQm9pbGVycGxhdGVz
LkRpc3Bvc2UoKTsKKyAgICAgICAgbV93cmFwcGVyQm9pbGVycGxhdGVzLkNsZWFyKCk7CisgICAg
fQorCisgICAgaWYgKCFtX29iamVjdFByb3RvdHlwZS5Jc0VtcHR5KCkpIHsKKyNpZm5kZWYgTkRF
QlVHCisgICAgICAgIHVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9vYmplY3RQcm90b3R5
cGUpOworI2VuZGlmCisgICAgICAgIG1fb2JqZWN0UHJvdG90eXBlLkRpc3Bvc2UoKTsKKyAgICAg
ICAgbV9vYmplY3RQcm90b3R5cGUuQ2xlYXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgVjhQcm94eTo6
Y2xlYXJGb3JDbG9zZSgpCit7CisgICAgaWYgKCFtX2NvbnRleHQuSXNFbXB0eSgpKSB7CisgICAg
ICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKworICAgICAgICBjbGVhckRvY3VtZW50
V3JhcHBlcigpOworICAgICAgICBkaXNwb3NlQ29udGV4dEhhbmRsZXMoKTsKKyAgICB9Cit9CisK
K3ZvaWQgVjhQcm94eTo6Y2xlYXJGb3JOYXZpZ2F0aW9uKCkKK3sKKyAgICAvLyBkaXNjb25uZWN0
IGFsbCBldmVudCBsaXN0ZW5lcnMKKyAgICBkaXNjb25uZWN0RXZlbnRMaXN0ZW5lcnMoKTsKKwor
ICAgIGlmICghbV9jb250ZXh0LklzRW1wdHkoKSkgeworICAgICAgICB2ODo6SGFuZGxlU2NvcGUg
aGFuZGxlOworICAgICAgICBjbGVhckRvY3VtZW50V3JhcHBlcigpOworCisgICAgICAgIHY4OjpD
b250ZXh0OjpTY29wZSBjb250ZXh0U2NvcGUobV9jb250ZXh0KTsKKworICAgICAgICAvLyBDbGVh
ciB0aGUgZG9jdW1lbnQgd3JhcHBlciBjYWNoZSBiZWZvcmUgdHVybmluZyBvbiBhY2Nlc3MgY2hl
Y2tzIG9uCisgICAgICAgIC8vIHRoZSBvbGQgRE9NV2luZG93IHdyYXBwZXIuICBUaGlzIHdheSwg
YWNjZXNzIHRvIHRoZSBkb2N1bWVudCB3cmFwcGVyCisgICAgICAgIC8vIHdpbGwgYmUgcHJvdGVj
dGVkIGJ5IHRoZSBzZWN1cml0eSBjaGVja3Mgb24gdGhlIERPTVdpbmRvdyB3cmFwcGVyLgorICAg
ICAgICBjbGVhckRvY3VtZW50V3JhcHBlckNhY2hlKCk7CisKKyAgICAgICAgLy8gVHVybiBvbiBh
Y2Nlc3MgY2hlY2sgb24gdGhlIG9sZCBET01XaW5kb3cgd3JhcHBlci4KKyAgICAgICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gbG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6
OkRPTVdJTkRPVywgbV9nbG9iYWwpOworICAgICAgICBBU1NFUlQoIXdyYXBwZXIuSXNFbXB0eSgp
KTsKKyAgICAgICAgd3JhcHBlci0+VHVybk9uQWNjZXNzQ2hlY2soKTsKKworICAgICAgICAvLyBT
ZXBhcmF0ZSB0aGUgY29udGV4dCBmcm9tIGl0cyBnbG9iYWwgb2JqZWN0LgorICAgICAgICBtX2Nv
bnRleHQtPkRldGFjaEdsb2JhbCgpOworCisgICAgICAgIGRpc3Bvc2VDb250ZXh0SGFuZGxlcygp
OworCisgICAgICAgIC8vIFJlaW5pdGlhbGl6ZSB0aGUgY29udGV4dCBzbyB0aGUgZ2xvYmFsIG9i
amVjdCBwb2ludHMgdG8KKyAgICAgICAgLy8gdGhlIG5ldyBET00gd2luZG93LgorICAgICAgICBp
bml0Q29udGV4dElmTmVlZGVkKCk7CisgICAgfQorfQorCit2b2lkIFY4UHJveHk6OnNldFNlY3Vy
aXR5VG9rZW4oKQoreworICAgIERvY3VtZW50KiBkb2N1bWVudCA9IG1fZnJhbWUtPmRvY3VtZW50
KCk7CisgICAgLy8gU2V0dXAgc2VjdXJpdHkgb3JpZ2luIGFuZCBzZWN1cml0eSB0b2tlbgorICAg
IGlmICghZG9jdW1lbnQpIHsKKyAgICAgICAgbV9jb250ZXh0LT5Vc2VEZWZhdWx0U2VjdXJpdHlU
b2tlbigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQXNrIHRoZSBkb2N1bWVu
dCdzIFNlY3VyaXR5T3JpZ2luIHRvIGdlbmVyYXRlIGEgc2VjdXJpdHkgdG9rZW4uCisgICAgLy8g
SWYgdHdvIHRva2VucyBhcmUgZXF1YWwsIHRoZW4gdGhlIFNlY3VyaXR5T3JpZ2lucyBjYW5BY2Nl
c3MgZWFjaCBvdGhlci4KKyAgICAvLyBJZiB0d28gdG9rZW5zIGFyZSBub3QgZXF1YWwsIHRoZW4g
d2UgaGF2ZSB0byBjYWxsIGNhbkFjY2Vzcy4KKyAgICAvLyBOb3RlOiB3ZSBjYW4ndCB1c2UgdGhl
IEhUVFBPcmlnaW4gaWYgaXQgd2FzIHNldCBmcm9tIHRoZSBET00uCisgICAgU2VjdXJpdHlPcmln
aW4qIG9yaWdpbiA9IGRvY3VtZW50LT5zZWN1cml0eU9yaWdpbigpOworICAgIFN0cmluZyB0b2tl
bjsKKyAgICBpZiAoIW9yaWdpbi0+ZG9tYWluV2FzU2V0SW5ET00oKSkKKyAgICAgICAgdG9rZW4g
PSBkb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKS0+dG9TdHJpbmcoKTsKKworICAgIC8vIEFuIGVt
cHR5IG9yICJudWxsIiB0b2tlbiBtZWFucyB3ZSBhbHdheXMgaGF2ZSB0byBjYWxsCisgICAgLy8g
Y2FuQWNjZXNzLiAgVGhlIHRvU3RyaW5nIG1ldGhvZCBvbiBzZWN1cml0eU9yaWdpbnMgcmV0dXJu
cyB0aGUKKyAgICAvLyBzdHJpbmcgIm51bGwiIGZvciBlbXB0eSBzZWN1cml0eSBvcmlnaW5zIGFu
ZCBmb3Igc2VjdXJpdHkKKyAgICAvLyBvcmlnaW5zIHRoYXQgc2hvdWxkIG9ubHkgYWxsb3cgYWNj
ZXNzIHRvIHRoZW1zZWx2ZXMuICBJbiB0aGlzCisgICAgLy8gY2FzZSwgd2UgdXNlIHRoZSBnbG9i
YWwgb2JqZWN0IGFzIHRoZSBzZWN1cml0eSB0b2tlbiB0byBhdm9pZAorICAgIC8vIGNhbGxpbmcg
Y2FuQWNjZXNzIHdoZW4gYSBzY3JpcHQgYWNjZXNzZXMgaXRzIG93biBvYmplY3RzLgorICAgIGlm
ICh0b2tlbi5pc0VtcHR5KCkgfHwgdG9rZW4gPT0gIm51bGwiKSB7CisgICAgICAgIG1fY29udGV4
dC0+VXNlRGVmYXVsdFNlY3VyaXR5VG9rZW4oKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIENTdHJpbmcgdXRmOFRva2VuID0gdG9rZW4udXRmOCgpOworICAgIC8vIE5PVEU6IFY4IGRv
ZXMgaWRlbnRpdHkgY29tcGFyaXNvbiBpbiBmYXN0IHBhdGgsIG11c3QgdXNlIGEgc3ltYm9sCisg
ICAgLy8gYXMgdGhlIHNlY3VyaXR5IHRva2VuLgorICAgIG1fY29udGV4dC0+U2V0U2VjdXJpdHlU
b2tlbih2ODo6U3RyaW5nOjpOZXdTeW1ib2wodXRmOFRva2VuLmRhdGEoKSwgdXRmOFRva2VuLmxl
bmd0aCgpKSk7Cit9CisKK3ZvaWQgVjhQcm94eTo6dXBkYXRlRG9jdW1lbnQoKQoreworICAgIGlm
ICghbV9mcmFtZS0+ZG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fZ2xv
YmFsLklzRW1wdHkoKSkgeworICAgICAgICBBU1NFUlQobV9jb250ZXh0LklzRW1wdHkoKSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBXZSBoYXZlIGEgbmV3IGRvY3VtZW50IGFu
ZCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgY2FjaGUuCisgICAgdXBkYXRlRG9jdW1lbnRXcmFwcGVy
Q2FjaGUoKTsKKworICAgIHVwZGF0ZVNlY3VyaXR5T3JpZ2luKCk7Cit9CisKK3ZvaWQgVjhQcm94
eTo6dXBkYXRlU2VjdXJpdHlPcmlnaW4oKQoreworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsK
KyAgICBzZXRTZWN1cml0eVRva2VuKCk7Cit9CisKKy8vIFNhbWUgb3JpZ2luIHBvbGljeSBpbXBs
ZW1lbnRhdGlvbjoKKy8vCisvLyBTYW1lIG9yaWdpbiBwb2xpY3kgcHJldmVudHMgSlMgY29kZSBm
cm9tIGRvbWFpbiBBIGFjY2VzcyBKUyAmIERPTSBvYmplY3RzCisvLyBpbiBhIGRpZmZlcmVudCBk
b21haW4gQi4gVGhlcmUgYXJlIGV4Y2VwdGlvbnMgYW5kIHNldmVyYWwgb2JqZWN0cyBhcmUKKy8v
IGFjY2Vzc2libGUgYnkgY3Jvc3MtZG9tYWluIGNvZGUuIEZvciBleGFtcGxlLCB0aGUgd2luZG93
LmZyYW1lcyBvYmplY3QgaXMKKy8vIGFjY2Vzc2libGUgYnkgY29kZSBmcm9tIGEgZGlmZmVyZW50
IGRvbWFpbiwgYnV0IHdpbmRvdy5kb2N1bWVudCBpcyBub3QuCisvLworLy8gVGhlIGJpbmRpbmcg
Y29kZSBzZXRzIHNlY3VyaXR5IGNoZWNrIGNhbGxiYWNrcyBvbiBhIGZ1bmN0aW9uIHRlbXBsYXRl
LAorLy8gYW5kIGFjY2Vzc2luZyBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRlIGNhbGxzIHRoZSBj
YWxsYmFjayBmdW5jdGlvbi4KKy8vIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBjaGVja3Mgc2FtZSBv
cmlnaW4gcG9saWN5LgorLy8KKy8vIENhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgZXhwZW5zaXZlLiBW
OCB1c2VzIGEgc2VjdXJpdHkgdG9rZW4gc3RyaW5nIHRvIGRvCisvLyBmYXN0IGFjY2VzcyBjaGVj
a3MgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSBzb3VyY2UgYW5kIHRhcmdldCBhcmUgaW4gdGhl
CisvLyBzYW1lIGRvbWFpbi4gQSBzZWN1cml0eSB0b2tlbiBpcyBhIHN0cmluZyBvYmplY3QgdGhh
dCByZXByZXNlbnRzCisvLyB0aGUgcHJvdG9jb2wvdXJsL3BvcnQgb2YgYSBkb21haW4uCisvLwor
Ly8gVGhlcmUgYXJlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYSBzZWN1cml0eSB0b2tlbiBtYXRjaGlu
ZyBpcyBub3QgZW5vdWdoLgorLy8gRm9yIGV4YW1wbGUsIEphdmFTY3JpcHQgY2FuIHNldCBpdHMg
ZG9tYWluIHRvIGEgc3VwZXIgZG9tYWluIGJ5IGNhbGxpbmcKKy8vIGRvY3VtZW50LnNldERvbWFp
biguLi4pLiBJbiB0aGVzZSBjYXNlcywgdGhlIGJpbmRpbmcgY29kZSBjYW4gcmVzZXQKKy8vIGEg
Y29udGV4dCdzIHNlY3VyaXR5IHRva2VuIHRvIGl0cyBnbG9iYWwgb2JqZWN0IHNvIHRoYXQgdGhl
IGZhc3QgYWNjZXNzCisvLyBjaGVjayB3aWxsIGFsd2F5cyBmYWlsLgorCisvLyBDaGVjayBpZiB0
aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dCBjYW4gYWNjZXNzIGEgdGFyZ2V0IGZyYW1lLgor
Ly8gRmlyc3QgaXQgY2hlY2tzIHNhbWUgZG9tYWluIHBvbGljeSB1c2luZyB0aGUgbGV4aWNhbCBj
b250ZXh0CisvLworLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIEtKUzo6V2luZG93OjphbGxvd3NB
Y2Nlc3NGcm9tKEV4ZWNTdGF0ZSosIFN0cmluZyYpLgorYm9vbCBWOFByb3h5OjpjYW5BY2Nlc3NQ
cml2YXRlKERPTVdpbmRvdyogdGFyZ2V0V2luZG93KQoreworICAgIEFTU0VSVCh0YXJnZXRXaW5k
b3cpOworCisgICAgU3RyaW5nIG1lc3NhZ2U7CisKKyAgICBET01XaW5kb3cqIG9yaWdpbldpbmRv
dyA9IHJldHJpZXZlV2luZG93KCk7CisgICAgaWYgKG9yaWdpbldpbmRvdyA9PSB0YXJnZXRXaW5k
b3cpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFvcmlnaW5XaW5kb3cpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IFNlY3VyaXR5T3JpZ2luKiBhY3RpdmVTZWN1
cml0eU9yaWdpbiA9IG9yaWdpbldpbmRvdy0+c2VjdXJpdHlPcmlnaW4oKTsKKyAgICBjb25zdCBT
ZWN1cml0eU9yaWdpbiogdGFyZ2V0U2VjdXJpdHlPcmlnaW4gPSB0YXJnZXRXaW5kb3ctPnNlY3Vy
aXR5T3JpZ2luKCk7CisKKyAgICAvLyBXZSBoYXZlIHNlZW4gY3Jhc2hlcyB3ZXJlIHRoZSBzZWN1
cml0eSBvcmlnaW4gb2YgdGhlIHRhcmdldCBoYXMgbm90IGJlZW4KKyAgICAvLyBpbml0aWFsaXpl
ZC4gIERlZmVuZCBhZ2FpbnN0IHRoYXQuCisgICAgaWYgKCF0YXJnZXRTZWN1cml0eU9yaWdpbikK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGFjdGl2ZVNlY3VyaXR5T3JpZ2luLT5j
YW5BY2Nlc3ModGFyZ2V0U2VjdXJpdHlPcmlnaW4pKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKwor
ICAgIC8vIEFsbG93IGFjY2VzcyB0byBhICJhYm91dDpibGFuayIgcGFnZSBpZiB0aGUgZHluYW1p
YyBjb250ZXh0IGlzIGEKKyAgICAvLyBkZXRhY2hlZCBjb250ZXh0IG9mIHRoZSBzYW1lIGZyYW1l
IGFzIHRoZSBibGFuayBwYWdlLgorICAgIGlmICh0YXJnZXRTZWN1cml0eU9yaWdpbi0+aXNFbXB0
eSgpICYmIG9yaWdpbldpbmRvdy0+ZnJhbWUoKSA9PSB0YXJnZXRXaW5kb3ctPmZyYW1lKCkpCisg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFY4UHJv
eHk6OmNhbkFjY2Vzc0ZyYW1lKEZyYW1lKiB0YXJnZXQsIGJvb2wgcmVwb3J0RXJyb3IpCit7Cisg
ICAgLy8gVGhlIHN1YmplY3QgaXMgZGV0YWNoZWQgZnJvbSBhIGZyYW1lLCBkZW55IGFjY2Vzc2Vz
LgorICAgIGlmICghdGFyZ2V0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWNh
bkFjY2Vzc1ByaXZhdGUodGFyZ2V0LT5kb21XaW5kb3coKSkpIHsKKyAgICAgICAgaWYgKHJlcG9y
dEVycm9yKQorICAgICAgICAgICAgcmVwb3J0VW5zYWZlQWNjZXNzVG8odGFyZ2V0LCBSRVBPUlRf
Tk9XKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworYm9vbCBWOFByb3h5OjpjaGVja05vZGVTZWN1cml0eShOb2RlKiBub2RlKQoreworICAgIGlm
ICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgRnJhbWUqIHRhcmdldCA9IG5v
ZGUtPmRvY3VtZW50KCktPmZyYW1lKCk7CisKKyAgICBpZiAoIXRhcmdldCkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGNhbkFjY2Vzc0ZyYW1lKHRhcmdldCwgdHJ1ZSk7Cit9
CisKK3Y4OjpQZXJzaXN0ZW50PHY4OjpDb250ZXh0PiBWOFByb3h5OjpjcmVhdGVOZXdDb250ZXh0
KHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsKQoreworICAgIHY4OjpQZXJzaXN0ZW50PHY4
OjpDb250ZXh0PiByZXN1bHQ7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgZW52aXJvbm1lbnQgdXNp
bmcgYW4gZW1wdHkgdGVtcGxhdGUgZm9yIHRoZSBzaGFkb3cKKyAgICAvLyBvYmplY3QuICBSZXVz
ZSB0aGUgZ2xvYmFsIG9iamVjdCBpZiBvbmUgaGFzIGJlZW4gY3JlYXRlZCBlYXJsaWVyLgorICAg
IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3RUZW1wbGF0ZT4gZ2xvYmFsVGVtcGxhdGUgPSBWOERP
TVdpbmRvdzo6R2V0U2hhZG93T2JqZWN0VGVtcGxhdGUoKTsKKyAgICBpZiAoZ2xvYmFsVGVtcGxh
dGUuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgLy8gSW5zdGFsbCBh
IHNlY3VyaXR5IGhhbmRsZXIgd2l0aCBWOC4KKyAgICBnbG9iYWxUZW1wbGF0ZS0+U2V0QWNjZXNz
Q2hlY2tDYWxsYmFja3MoVjhDdXN0b206OnY4RE9NV2luZG93TmFtZWRTZWN1cml0eUNoZWNrLCBW
OEN1c3RvbTo6djhET01XaW5kb3dJbmRleGVkU2VjdXJpdHlDaGVjaywgdjg6OkludGVnZXI6Ok5l
dyhWOENsYXNzSW5kZXg6OkRPTVdJTkRPVykpOworCisgICAgLy8gRHluYW1pY2FsbHkgdGVsbCB2
OCBhYm91dCBvdXIgZXh0ZW5zaW9ucyBub3cuCisgICAgY29uc3QgY2hhcioqIGV4dGVuc2lvbk5h
bWVzID0gbmV3IGNvbnN0IGNoYXIqW21fZXh0ZW5zaW9ucy5zaXplKCldOworICAgIGludCBpbmRl
eCA9IDA7CisgICAgZm9yIChWOEV4dGVuc2lvbkxpc3Q6Oml0ZXJhdG9yIGl0ID0gbV9leHRlbnNp
b25zLmJlZ2luKCk7IGl0ICE9IG1fZXh0ZW5zaW9ucy5lbmQoKTsgKytpdCkgeworICAgICAgICAv
LyBOb3RlOiB3ZSBjaGVjayB0aGUgbG9hZGVyIFVSTCBoZXJlIGluc3RlYWQgb2YgdGhlIGRvY3Vt
ZW50IFVSTAorICAgICAgICAvLyBiZWNhdXNlIHdlIG1pZ2h0IGJlIGN1cnJlbnRseSBsb2FkaW5n
IGFuIFVSTCBpbnRvIGEgYmxhbmsgcGFnZS4KKyAgICAgICAgLy8gU2VlIGh0dHA6Ly9jb2RlLmdv
b2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEwOTI0CisgICAgICAgIGlmIChp
dC0+c2NoZW1lLmxlbmd0aCgpID4gMCAmJiAoaXQtPnNjaGVtZSAhPSBtX2ZyYW1lLT5sb2FkZXIo
KS0+YWN0aXZlRG9jdW1lbnRMb2FkZXIoKS0+dXJsKCkucHJvdG9jb2woKSB8fCBpdC0+c2NoZW1l
ICE9IG1fZnJhbWUtPnBhZ2UoKS0+bWFpbkZyYW1lKCktPmxvYWRlcigpLT5hY3RpdmVEb2N1bWVu
dExvYWRlcigpLT51cmwoKS5wcm90b2NvbCgpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgIGV4dGVuc2lvbk5hbWVzW2luZGV4KytdID0gaXQtPmV4dGVuc2lvbi0+bmFtZSgpOwor
ICAgIH0KKyAgICB2ODo6RXh0ZW5zaW9uQ29uZmlndXJhdGlvbiBleHRlbnNpb25zKGluZGV4LCBl
eHRlbnNpb25OYW1lcyk7CisgICAgcmVzdWx0ID0gdjg6OkNvbnRleHQ6Ok5ldygmZXh0ZW5zaW9u
cywgZ2xvYmFsVGVtcGxhdGUsIGdsb2JhbCk7CisgICAgZGVsZXRlW10gZXh0ZW5zaW9uTmFtZXM7
CisgICAgZXh0ZW5zaW9uTmFtZXMgPSAwOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8g
Q3JlYXRlIGEgbmV3IGVudmlyb25tZW50IGFuZCBzZXR1cCB0aGUgZ2xvYmFsIG9iamVjdC4KKy8v
CisvLyBUaGUgZ2xvYmFsIG9iamVjdCBjb3JyZXNwb25kcyB0byBhIERPTVdpbmRvdyBpbnN0YW5j
ZS4gIEhvd2V2ZXIsIHRvCisvLyBhbGxvdyBwcm9wZXJ0aWVzIG9mIHRoZSBKUyBET01XaW5kb3cg
aW5zdGFuY2UgdG8gYmUgc2hhZG93ZWQsIHdlCisvLyB1c2UgYSBzaGFkb3cgb2JqZWN0IGFzIHRo
ZSBnbG9iYWwgb2JqZWN0IGFuZCB1c2UgdGhlIEpTIERPTVdpbmRvdworLy8gaW5zdGFuY2UgYXMg
dGhlIHByb3RvdHlwZSBmb3IgdGhhdCBzaGFkb3cgb2JqZWN0LiAgVGhlIEpTIERPTVdpbmRvdwor
Ly8gaW5zdGFuY2UgaXMgdW5kZXRlY3RhYmxlIGZyb20gamF2YXNjcmlwdCBjb2RlIGJlY2F1c2Ug
dGhlIF9fcHJvdG9fXworLy8gYWNjZXNzb3JzIHNraXAgdGhhdCBvYmplY3QuCisvLworLy8gVGhl
IHNoYWRvdyBvYmplY3QgYW5kIHRoZSBET01XaW5kb3cgaW5zdGFuY2UgYXJlIHNlZW4gYXMgb25l
IG9iamVjdAorLy8gZnJvbSBqYXZhc2NyaXB0LiAgVGhlIGphdmFzY3JpcHQgb2JqZWN0IHRoYXQg
Y29ycmVzcG9uZHMgdG8gYQorLy8gRE9NV2luZG93IGluc3RhbmNlIGlzIHRoZSBzaGFkb3cgb2Jq
ZWN0LiAgV2hlbiBtYXBwaW5nIGEgRE9NV2luZG93CisvLyBpbnN0YW5jZSB0byBhIFY4IG9iamVj
dCwgd2UgcmV0dXJuIHRoZSBzaGFkb3cgb2JqZWN0LgorLy8KKy8vIFRvIGltcGxlbWVudCBzcGxp
dC13aW5kb3csIHNlZQorLy8gICAxKSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTcyNDkKKy8vICAgMikgaHR0cHM6Ly93aWtpLm1vemlsbGEub3JnL0dlY2tvOlNwbGl0
V2luZG93CisvLyAgIDMpIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dp
P2lkPTI5NjYzOQorLy8gd2UgbmVlZCB0byBzcGxpdCB0aGUgc2hhZG93IG9iamVjdCBmdXJ0aGVy
IGludG8gdHdvIG9iamVjdHM6CisvLyBhbiBvdXRlciB3aW5kb3cgYW5kIGFuIGlubmVyIHdpbmRv
dy4gVGhlIGlubmVyIHdpbmRvdyBpcyB0aGUgaGlkZGVuCisvLyBwcm90b3R5cGUgb2YgdGhlIG91
dGVyIHdpbmRvdy4gVGhlIGlubmVyIHdpbmRvdyBpcyB0aGUgZGVmYXVsdAorLy8gZ2xvYmFsIG9i
amVjdCBvZiB0aGUgY29udGV4dC4gQSB2YXJpYWJsZSBkZWNsYXJlZCBpbiB0aGUgZ2xvYmFsCisv
LyBzY29wZSBpcyBhIHByb3BlcnR5IG9mIHRoZSBpbm5lciB3aW5kb3cuCisvLworLy8gVGhlIG91
dGVyIHdpbmRvdyBzdGlja3MgdG8gYSBGcmFtZSwgaXQgaXMgZXhwb3NlZCB0byBKYXZhU2NyaXB0
CisvLyB2aWEgd2luZG93LndpbmRvdywgd2luZG93LnNlbGYsIHdpbmRvdy5wYXJlbnQsIGV0Yy4g
VGhlIG91dGVyIHdpbmRvdworLy8gaGFzIGEgc2VjdXJpdHkgdG9rZW4gd2hpY2ggaXMgdGhlIGRv
bWFpbi4gVGhlIG91dGVyIHdpbmRvdyBjYW5ub3QKKy8vIGhhdmUgaXRzIG93biBwcm9wZXJ0aWVz
LiB3aW5kb3cuZm9vID0gJ3gnIGlzIGRlbGVnYXRlZCB0byB0aGUKKy8vIGlubmVyIHdpbmRvdy4K
Ky8vCisvLyBXaGVuIGEgZnJhbWUgbmF2aWdhdGVzIHRvIGEgbmV3IHBhZ2UsIHRoZSBpbm5lciB3
aW5kb3cgaXMgY3V0IG9mZgorLy8gdGhlIG91dGVyIHdpbmRvdywgYW5kIHRoZSBvdXRlciB3aW5k
b3cgaWRlbnRpZnkgaXMgcHJlc2VydmVkIGZvcgorLy8gdGhlIGZyYW1lLiBIb3dldmVyLCBhIG5l
dyBpbm5lciB3aW5kb3cgaXMgY3JlYXRlZCBmb3IgdGhlIG5ldyBwYWdlLgorLy8gSWYgdGhlcmUg
YXJlIEpTIGNvZGUgaG9sZHMgYSBjbG9zdXJlIHRvIHRoZSBvbGQgaW5uZXIgd2luZG93LAorLy8g
aXQgd29uJ3QgYmUgYWJsZSB0byByZWFjaCB0aGUgb3V0ZXIgd2luZG93IHZpYSBpdHMgZ2xvYmFs
IG9iamVjdC4KK3ZvaWQgVjhQcm94eTo6aW5pdENvbnRleHRJZk5lZWRlZCgpCit7CisgICAgLy8g
QmFpbCBvdXQgaWYgdGhlIGNvbnRleHQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KKyAg
ICBpZiAoIW1fY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIENy
ZWF0ZSBhIGhhbmRsZSBzY29wZSBmb3IgYWxsIGxvY2FsIGhhbmRsZXMuCisgICAgdjg6OkhhbmRs
ZVNjb3BlIGhhbmRsZVNjb3BlOworCisgICAgLy8gU2V0dXAgdGhlIHNlY3VyaXR5IGhhbmRsZXJz
IGFuZCBtZXNzYWdlIGxpc3RlbmVyLiAgVGhpcyBvbmx5IGhhcworICAgIC8vIHRvIGJlIGRvbmUg
b25jZS4KKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGJvb2wsIGlzVjhJbml0aWFsaXplZCwgKGZh
bHNlKSk7CisgICAgaWYgKCFpc1Y4SW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgLy8gVGVsbHMgVjgg
bm90IHRvIGNhbGwgdGhlIGRlZmF1bHQgT09NIGhhbmRsZXIsIGJpbmRpbmcgY29kZQorICAgICAg
ICAvLyB3aWxsIGhhbmRsZSBpdC4KKyAgICAgICAgdjg6OlY4OjpJZ25vcmVPdXRPZk1lbW9yeUV4
Y2VwdGlvbigpOworICAgICAgICB2ODo6Vjg6OlNldEZhdGFsRXJyb3JIYW5kbGVyKHJlcG9ydEZh
dGFsRXJyb3JJblY4KTsKKworICAgICAgICB2ODo6Vjg6OlNldEdsb2JhbEdDUHJvbG9ndWVDYWxs
YmFjaygmZ2NQcm9sb2d1ZSk7CisgICAgICAgIHY4OjpWODo6U2V0R2xvYmFsR0NFcGlsb2d1ZUNh
bGxiYWNrKCZnY0VwaWxvZ3VlKTsKKworICAgICAgICB2ODo6Vjg6OkFkZE1lc3NhZ2VMaXN0ZW5l
cihoYW5kbGVDb25zb2xlTWVzc2FnZSk7CisKKyAgICAgICAgdjg6OlY4OjpTZXRGYWlsZWRBY2Nl
c3NDaGVja0NhbGxiYWNrRnVuY3Rpb24ocmVwb3J0VW5zYWZlSmF2YVNjcmlwdEFjY2Vzcyk7CisK
KyAgICAgICAgaXNWOEluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBtX2NvbnRleHQg
PSBjcmVhdGVOZXdDb250ZXh0KG1fZ2xvYmFsKTsKKyAgICBpZiAobV9jb250ZXh0LklzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gU3RhcnRpbmcgZnJvbSBub3csIHVzZSBsb2Nh
bCBjb250ZXh0IG9ubHkuCisgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSBj
b250ZXh0KCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRTY29wZSh2OENvbnRleHQp
OworCisgICAgLy8gU3RvcmUgdGhlIGZpcnN0IGdsb2JhbCBvYmplY3QgY3JlYXRlZCBzbyB3ZSBj
YW4gcmV1c2UgaXQuCisgICAgaWYgKG1fZ2xvYmFsLklzRW1wdHkoKSkgeworICAgICAgICBtX2ds
b2JhbCA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcodjhDb250ZXh0LT5HbG9iYWwo
KSk7CisgICAgICAgIC8vIEJhaWwgb3V0IGlmIGFsbG9jYXRpb24gb2YgdGhlIGZpcnN0IGdsb2Jh
bCBvYmplY3RzIGZhaWxzLgorICAgICAgICBpZiAobV9nbG9iYWwuSXNFbXB0eSgpKSB7CisgICAg
ICAgICAgZGlzcG9zZUNvbnRleHRIYW5kbGVzKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisjaWZuZGVmIE5ERUJVRworICAgICAgICByZWdpc3Rlckdsb2JhbEhhbmRsZShQUk9YWSwg
dGhpcywgbV9nbG9iYWwpOworI2VuZGlmCisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgc3RyaW5n
cyB1c2VkIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+
IG9iamVjdFN0cmluZyA9IHY4OjpTdHJpbmc6Ok5ldygiT2JqZWN0Iik7CisgICAgdjg6OkhhbmRs
ZTx2ODo6U3RyaW5nPiBwcm90b3R5cGVTdHJpbmcgPSB2ODo6U3RyaW5nOjpOZXcoInByb3RvdHlw
ZSIpOworICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gaW1wbGljaXRQcm90b1N0cmluZyA9IHY4
OjpTdHJpbmc6Ok5ldygiX19wcm90b19fIik7CisgICAgLy8gQmFpbCBvdXQgaWYgYWxsb2NhdGlv
biBmYWlsZWQuCisgICAgaWYgKG9iamVjdFN0cmluZy5Jc0VtcHR5KCkgfHwgcHJvdG90eXBlU3Ry
aW5nLklzRW1wdHkoKSB8fCBpbXBsaWNpdFByb3RvU3RyaW5nLklzRW1wdHkoKSkgeworICAgICAg
ICBkaXNwb3NlQ29udGV4dEhhbmRsZXMoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IC8vIEFsbG9jYXRlIGNsb25lIGNhY2hlIGFuZCBwcmUtYWxsb2NhdGVkIG9iamVjdHMKKyAgICB2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNh
c3QobV9nbG9iYWwtPkdldChvYmplY3RTdHJpbmcpKTsKKyAgICBtX29iamVjdFByb3RvdHlwZSA9
IHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT46Ok5ldyhvYmplY3QtPkdldChwcm90b3R5cGVTdHJp
bmcpKTsKKyAgICBtX3dyYXBwZXJCb2lsZXJwbGF0ZXMgPSB2ODo6UGVyc2lzdGVudDx2ODo6QXJy
YXk+OjpOZXcodjg6OkFycmF5OjpOZXcoVjhDbGFzc0luZGV4OjpXUkFQUEVSX1RZUEVfQ09VTlQp
KTsKKyAgICAvLyBCYWlsIG91dCBpZiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAgICBpZiAobV9vYmpl
Y3RQcm90b3R5cGUuSXNFbXB0eSgpKSB7CisgICAgICAgIGRpc3Bvc2VDb250ZXh0SGFuZGxlcygp
OworICAgICAgICByZXR1cm47CisgICAgfQorI2lmbmRlZiBOREVCVUcKKyAgICByZWdpc3Rlckds
b2JhbEhhbmRsZShQUk9YWSwgdGhpcywgbV9vYmplY3RQcm90b3R5cGUpOworICAgIHJlZ2lzdGVy
R2xvYmFsSGFuZGxlKFBST1hZLCB0aGlzLCBtX3dyYXBwZXJCb2lsZXJwbGF0ZXMpOworI2VuZGlm
CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgSlMgd2luZG93IG9iamVjdCBhbmQgdXNlIGl0IGFzIHRo
ZSBwcm90b3R5cGUgZm9yIHRoZQorICAgIC8vIHNoYWRvdyBnbG9iYWwgb2JqZWN0LgorICAgIHY4
OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiB3aW5kb3dDb25zdHJ1Y3RvciA9IGdldENvbnN0cnVjdG9y
KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XKTsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4ganNX
aW5kb3cgPSBTYWZlQWxsb2NhdGlvbjo6bmV3SW5zdGFuY2Uod2luZG93Q29uc3RydWN0b3IpOwor
ICAgIC8vIEJhaWwgb3V0IGlmIGFsbG9jYXRpb24gZmFpbGVkLgorICAgIGlmIChqc1dpbmRvdy5J
c0VtcHR5KCkpIHsKKyAgICAgICAgZGlzcG9zZUNvbnRleHRIYW5kbGVzKCk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBET01XaW5kb3cqIHdpbmRvdyA9IG1fZnJhbWUtPmRvbVdpbmRv
dygpOworCisgICAgLy8gV3JhcCB0aGUgd2luZG93LgorICAgIHNldERPTVdyYXBwZXIoanNXaW5k
b3csIFY4Q2xhc3NJbmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpET01XSU5ET1cpLCB3aW5kb3cp
OworCisgICAgd2luZG93LT5yZWYoKTsKKyAgICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01P
YmplY3Qod2luZG93LCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGpzV2luZG93KSk7
CisKKyAgICAvLyBJbnNlcnQgdGhlIHdpbmRvdyBpbnN0YW5jZSBhcyB0aGUgcHJvdG90eXBlIG9m
IHRoZSBzaGFkb3cgb2JqZWN0LgorICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gdjhfZ2xvYmFs
ID0gdjhDb250ZXh0LT5HbG9iYWwoKTsKKyAgICB2OF9nbG9iYWwtPlNldChpbXBsaWNpdFByb3Rv
U3RyaW5nLCBqc1dpbmRvdyk7CisKKyAgICB1cGRhdGVEb2N1bWVudCgpOworCisgICAgc2V0U2Vj
dXJpdHlUb2tlbigpOworCisgICAgbV9mcmFtZS0+bG9hZGVyKCktPmRpc3BhdGNoV2luZG93T2Jq
ZWN0QXZhaWxhYmxlKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPg0KK3ZvaWQgc2V0RE9NRXhj
ZXB0aW9uSGVscGVyKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCBQYXNzUmVmUHRy
PFQ+IGV4Y2VwdGlvbikNCit7DQorICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OEV4Y2VwdGlv
bjsNCisgICAgaWYgKFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6cmV0cmlldmUoKSkNCisg
ICAgICAgIHY4RXhjZXB0aW9uID0gV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5Ojpjb252ZXJ0
VG9WOE9iamVjdCh0eXBlLCBleGNlcHRpb24uZ2V0KCkpOw0KKyAgICBlbHNlDQorICAgICAgICB2
OEV4Y2VwdGlvbiA9IFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KHR5cGUsIGV4Y2VwdGlvbi5n
ZXQoKSk7DQorDQorICAgIHY4OjpUaHJvd0V4Y2VwdGlvbih2OEV4Y2VwdGlvbik7DQorfQorCit2
b2lkIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihpbnQgZXhjZXB0aW9uQ29kZSkKK3sKKyAgICBp
ZiAoZXhjZXB0aW9uQ29kZSA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBFeGNlcHRpb25D
b2RlRGVzY3JpcHRpb24gZGVzY3JpcHRpb247CisgICAgZ2V0RXhjZXB0aW9uQ29kZURlc2NyaXB0
aW9uKGV4Y2VwdGlvbkNvZGUsIGRlc2NyaXB0aW9uKTsKKworICAgIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBleGNlcHRpb247CisgICAgc3dpdGNoIChkZXNjcmlwdGlvbi50eXBlKSB7CisgICAgY2Fz
ZSBET01FeGNlcHRpb25UeXBlOgorICAgICAgICBzZXRET01FeGNlcHRpb25IZWxwZXIoVjhDbGFz
c0luZGV4OjpET01DT1JFRVhDRVBUSU9OLCBET01Db3JlRXhjZXB0aW9uOjpjcmVhdGUoZGVzY3Jp
cHRpb24pKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSYW5nZUV4Y2VwdGlvblR5cGU6Cisg
ICAgICAgIHNldERPTUV4Y2VwdGlvbkhlbHBlcihWOENsYXNzSW5kZXg6OlJBTkdFRVhDRVBUSU9O
LCBSYW5nZUV4Y2VwdGlvbjo6Y3JlYXRlKGRlc2NyaXB0aW9uKSk7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgRXZlbnRFeGNlcHRpb25UeXBlOgorICAgICAgICBzZXRET01FeGNlcHRpb25IZWxw
ZXIoVjhDbGFzc0luZGV4OjpFVkVOVEVYQ0VQVElPTiwgRXZlbnRFeGNlcHRpb246OmNyZWF0ZShk
ZXNjcmlwdGlvbikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFhNTEh0dHBSZXF1ZXN0RXhj
ZXB0aW9uVHlwZToKKyAgICAgICAgc2V0RE9NRXhjZXB0aW9uSGVscGVyKFY4Q2xhc3NJbmRleDo6
WE1MSFRUUFJFUVVFU1RFWENFUFRJT04sIFhNTEh0dHBSZXF1ZXN0RXhjZXB0aW9uOjpjcmVhdGUo
ZGVzY3JpcHRpb24pKTsKKyAgICAgICAgYnJlYWs7CisjaWYgRU5BQkxFKFNWRykKKyAgICBjYXNl
IFNWR0V4Y2VwdGlvblR5cGU6CisgICAgICAgIHNldERPTUV4Y2VwdGlvbkhlbHBlcihWOENsYXNz
SW5kZXg6OlNWR0VYQ0VQVElPTiwgU1ZHRXhjZXB0aW9uOjpjcmVhdGUoZGVzY3JpcHRpb24pKTsK
KyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisjaWYgRU5BQkxFKFhQQVRIKQorICAgIGNhc2Ug
WFBhdGhFeGNlcHRpb25UeXBlOgorICAgICAgICBleGNlcHRpb24gPSBjb252ZXJ0VG9WOE9iamVj
dChWOENsYXNzSW5kZXg6OlhQQVRIRVhDRVBUSU9OLCBYUGF0aEV4Y2VwdGlvbjo6Y3JlYXRlKGRl
c2NyaXB0aW9uKSk7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorCisgICAgQVNTRVJU
KCFleGNlcHRpb24uSXNFbXB0eSgpKTsKKyAgICB2ODo6VGhyb3dFeGNlcHRpb24oZXhjZXB0aW9u
KTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6OnRocm93RXJyb3IoRXJyb3JU
eXBlIHR5cGUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpCit7CisgICAgc3dpdGNoICh0eXBlKSB7Cisg
ICAgY2FzZSBSQU5HRV9FUlJPUjoKKyAgICAgICAgcmV0dXJuIHY4OjpUaHJvd0V4Y2VwdGlvbih2
ODo6RXhjZXB0aW9uOjpSYW5nZUVycm9yKHY4U3RyaW5nKG1lc3NhZ2UpKSk7CisgICAgY2FzZSBS
RUZFUkVOQ0VfRVJST1I6CisgICAgICAgIHJldHVybiB2ODo6VGhyb3dFeGNlcHRpb24odjg6OkV4
Y2VwdGlvbjo6UmVmZXJlbmNlRXJyb3IodjhTdHJpbmcobWVzc2FnZSkpKTsKKyAgICBjYXNlIFNZ
TlRBWF9FUlJPUjoKKyAgICAgICAgcmV0dXJuIHY4OjpUaHJvd0V4Y2VwdGlvbih2ODo6RXhjZXB0
aW9uOjpTeW50YXhFcnJvcih2OFN0cmluZyhtZXNzYWdlKSkpOworICAgIGNhc2UgVFlQRV9FUlJP
UjoKKyAgICAgICAgcmV0dXJuIHY4OjpUaHJvd0V4Y2VwdGlvbih2ODo6RXhjZXB0aW9uOjpUeXBl
RXJyb3IodjhTdHJpbmcobWVzc2FnZSkpKTsKKyAgICBjYXNlIEdFTkVSQUxfRVJST1I6CisgICAg
ICAgIHJldHVybiB2ODo6VGhyb3dFeGNlcHRpb24odjg6OkV4Y2VwdGlvbjo6RXJyb3IodjhTdHJp
bmcobWVzc2FnZSkpKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsKKyAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CisgICAgfQorfQor
Cit2ODo6TG9jYWw8djg6OkNvbnRleHQ+IFY4UHJveHk6OmNvbnRleHQoRnJhbWUqIGZyYW1lKQor
eworICAgIFY4UHJveHkqIHByb3h5ID0gcmV0cmlldmUoZnJhbWUpOworICAgIGlmICghcHJveHkp
CisgICAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6OkNvbnRleHQ+KCk7CisKKyAgICBwcm94eS0+
aW5pdENvbnRleHRJZk5lZWRlZCgpOworICAgIHJldHVybiBwcm94eS0+Y29udGV4dCgpOworfQor
Cit2ODo6TG9jYWw8djg6OkNvbnRleHQ+IFY4UHJveHk6OmN1cnJlbnRDb250ZXh0KCkKK3sKKyAg
ICByZXR1cm4gdjg6OkNvbnRleHQ6OkdldEN1cnJlbnQoKTsKK30KKwordjg6OkhhbmRsZTx2ODo6
VmFsdWU+IFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVy
VHlwZSB0eXBlLCB2b2lkKiBpbXBsKQoreworICAgIEFTU0VSVCh0eXBlICE9IFY4Q2xhc3NJbmRl
eDo6RVZFTlRMSVNURU5FUik7CisgICAgQVNTRVJUKHR5cGUgIT0gVjhDbGFzc0luZGV4OjpFVkVO
VFRBUkdFVCk7CisgICAgQVNTRVJUKHR5cGUgIT0gVjhDbGFzc0luZGV4OjpFVkVOVCk7CisKKyAg
ICBib29sIGlzQWN0aXZlRG9tT2JqZWN0ID0gZmFsc2U7CisgICAgc3dpdGNoICh0eXBlKSB7Cisj
ZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBOQU1FKSBjYXNlIFY4Q2xhc3NJbmRleDo6VFlQRToKKyAg
ICAgICAgRE9NX05PREVfVFlQRVMoTUFLRV9DQVNFKQorI2lmIEVOQUJMRShTVkcpCisgICAgICAg
IFNWR19OT0RFX1RZUEVTKE1BS0VfQ0FTRSkKKyNlbmRpZgorICAgICAgICByZXR1cm4gY29udmVy
dE5vZGVUb1Y4T2JqZWN0KHN0YXRpY19jYXN0PE5vZGUqPihpbXBsKSk7CisgICAgY2FzZSBWOENs
YXNzSW5kZXg6OkNTU1ZBTFVFOgorICAgICAgICByZXR1cm4gY29udmVydENTU1ZhbHVlVG9WOE9i
amVjdChzdGF0aWNfY2FzdDxDU1NWYWx1ZSo+KGltcGwpKTsKKyAgICBjYXNlIFY4Q2xhc3NJbmRl
eDo6Q1NTUlVMRToKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRDU1NSdWxlVG9WOE9iamVjdChzdGF0
aWNfY2FzdDxDU1NSdWxlKj4oaW1wbCkpOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpTVFlMRVNI
RUVUOgorICAgICAgICByZXR1cm4gY29udmVydFN0eWxlU2hlZXRUb1Y4T2JqZWN0KHN0YXRpY19j
YXN0PFN0eWxlU2hlZXQqPihpbXBsKSk7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkRPTVdJTkRP
VzoKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRXaW5kb3dUb1Y4T2JqZWN0KHN0YXRpY19jYXN0PERP
TVdpbmRvdyo+KGltcGwpKTsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBTVkdfTk9OTk9ERV9U
WVBFUyhNQUtFX0NBU0UpCisgICAgICAgIGlmICh0eXBlID09IFY4Q2xhc3NJbmRleDo6U1ZHRUxF
TUVOVElOU1RBTkNFKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRTVkdFbGVtZW50SW5zdGFu
Y2VUb1Y4T2JqZWN0KHN0YXRpY19jYXN0PFNWR0VsZW1lbnRJbnN0YW5jZSo+KGltcGwpKTsKKyAg
ICAgICAgcmV0dXJuIGNvbnZlcnRTVkdPYmplY3RXaXRoQ29udGV4dFRvVjhPYmplY3QodHlwZSwg
aW1wbCk7CisjZW5kaWYKKworICAgICAgICBBQ1RJVkVfRE9NX09CSkVDVF9UWVBFUyhNQUtFX0NB
U0UpCisgICAgICAgIGlzQWN0aXZlRG9tT2JqZWN0ID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgIH0KKworI3VuZGVmIE1BS0VfQ0FTRQorCisg
ICAgaWYgKCFpbXBsKQorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIC8vIE5vbiBE
T00gbm9kZQorICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHJlc3VsdCA9IGlzQWN0aXZl
RG9tT2JqZWN0ID8gZ2V0QWN0aXZlRE9NT2JqZWN0TWFwKCkuZ2V0KGltcGwpIDogZ2V0RE9NT2Jq
ZWN0TWFwKCkuZ2V0KGltcGwpOworICAgIGlmIChyZXN1bHQuSXNFbXB0eSgpKSB7CisgICAgICAg
IHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB2OE9iamVjdCA9IGluc3RhbnRpYXRlVjhPYmplY3QodHlw
ZSwgdHlwZSwgaW1wbCk7CisgICAgICAgIGlmICghdjhPYmplY3QuSXNFbXB0eSgpKSB7CisgICAg
ICAgICAgICAvLyBHbyB0aHJvdWdoIGJpZyBzd2l0Y2ggc3RhdGVtZW50LCBpdCBoYXMgc29tZSBk
dXBsaWNhdGlvbnMKKyAgICAgICAgICAgIC8vIHRoYXQgd2VyZSBoYW5kbGVkIGJ5IGNvZGUgYWJv
dmUgKHN1Y2ggYXMgQ1NTVkFMVUUsIENTU1JVTEUsIGV0YykuCisgICAgICAgICAgICBzd2l0Y2gg
KHR5cGUpIHsKKyNkZWZpbmUgTUFLRV9DQVNFKFRZUEUsIE5BTUUpIFwKKyAgICAgICAgICAgIGNh
c2UgVjhDbGFzc0luZGV4OjpUWVBFOiBzdGF0aWNfY2FzdDxOQU1FKj4oaW1wbCktPnJlZigpOyBi
cmVhazsKKyAgICAgICAgICAgICAgICBET01fT0JKRUNUX1RZUEVTKE1BS0VfQ0FTRSkKKyN1bmRl
ZiBNQUtFX0NBU0UKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSB2ODo6
UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHY4T2JqZWN0KTsKKyAgICAgICAgICAgIGlmIChp
c0FjdGl2ZURvbU9iamVjdCkKKyAgICAgICAgICAgICAgICBzZXRKU1dyYXBwZXJGb3JBY3RpdmVE
T01PYmplY3QoaW1wbCwgcmVzdWx0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICBzZXRKU1dyYXBwZXJGb3JET01PYmplY3QoaW1wbCwgcmVzdWx0KTsKKworICAgICAgICAgICAg
Ly8gU3BlY2lhbCBjYXNlIGZvciBub24tbm9kZSBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCBhCisg
ICAgICAgICAgICAvLyBET01XaW5kb3cuIEJvdGggU2FmYXJpIGFuZCBGRiBsZXQgdGhlIEpTIHdy
YXBwZXJzIGZvciB0aGVzZQorICAgICAgICAgICAgLy8gb2JqZWN0cyBzdXJ2aXZlIEdDLiBUbyBt
aW1pYyB0aGVpciBiZWhhdmlvciwgVjggY3JlYXRlcworICAgICAgICAgICAgLy8gaGlkZGVuIHJl
ZmVyZW5jZXMgZnJvbSB0aGUgRE9NV2luZG93IHRvIHRoZXNlIHdyYXBwZXIKKyAgICAgICAgICAg
IC8vIG9iamVjdHMuIFRoZXNlIHJlZmVyZW5jZXMgZ2V0IGNsZWFyZWQgd2hlbiB0aGUgRE9NV2lu
ZG93IGlzCisgICAgICAgICAgICAvLyByZXVzZWQgYnkgYSBuZXcgcGFnZS4KKyAgICAgICAgICAg
IHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OkNPTlNPTEU6
CisgICAgICAgICAgICAgICAgc2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKHN0YXRpY19jYXN0PENv
bnNvbGUqPihpbXBsKS0+ZnJhbWUoKSwgVjhDdXN0b206OmtET01XaW5kb3dDb25zb2xlSW5kZXgs
IHJlc3VsdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6SElTVE9SWToKKyAgICAgICAgICAgICAgICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVu
Y2Uoc3RhdGljX2Nhc3Q8SGlzdG9yeSo+KGltcGwpLT5mcmFtZSgpLCBWOEN1c3RvbTo6a0RPTVdp
bmRvd0hpc3RvcnlJbmRleCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpOQVZJR0FUT1I6CisgICAgICAgICAgICAgICAgc2V0
SGlkZGVuV2luZG93UmVmZXJlbmNlKHN0YXRpY19jYXN0PE5hdmlnYXRvcio+KGltcGwpLT5mcmFt
ZSgpLCBWOEN1c3RvbTo6a0RPTVdpbmRvd05hdmlnYXRvckluZGV4LCByZXN1bHQpOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OlNDUkVFTjoK
KyAgICAgICAgICAgICAgICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2Uoc3RhdGljX2Nhc3Q8U2Ny
ZWVuKj4oaW1wbCktPmZyYW1lKCksIFY4Q3VzdG9tOjprRE9NV2luZG93U2NyZWVuSW5kZXgsIHJl
c3VsdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFY4Q2xhc3NJ
bmRleDo6TE9DQVRJT046CisgICAgICAgICAgICAgICAgc2V0SGlkZGVuV2luZG93UmVmZXJlbmNl
KHN0YXRpY19jYXN0PExvY2F0aW9uKj4oaW1wbCktPmZyYW1lKCksIFY4Q3VzdG9tOjprRE9NV2lu
ZG93TG9jYXRpb25JbmRleCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpET01TRUxFQ1RJT046CisgICAgICAgICAgICAgICAg
c2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKHN0YXRpY19jYXN0PERPTVNlbGVjdGlvbio+KGltcGwp
LT5mcmFtZSgpLCBWOEN1c3RvbTo6a0RPTVdpbmRvd0RPTVNlbGVjdGlvbkluZGV4LCByZXN1bHQp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6
OkJBUklORk86IHsKKyAgICAgICAgICAgICAgICBCYXJJbmZvKiBiYXJJbmZvID0gc3RhdGljX2Nh
c3Q8QmFySW5mbyo+KGltcGwpOworICAgICAgICAgICAgICAgIEZyYW1lKiBmcmFtZSA9IGJhcklu
Zm8tPmZyYW1lKCk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChiYXJJbmZvLT50eXBlKCkpIHsK
KyAgICAgICAgICAgICAgICBjYXNlIEJhckluZm86OkxvY2F0aW9uYmFyOgorICAgICAgICAgICAg
ICAgICAgICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2UoZnJhbWUsIFY4Q3VzdG9tOjprRE9NV2lu
ZG93TG9jYXRpb25iYXJJbmRleCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgY2FzZSBCYXJJbmZvOjpNZW51YmFyOgorICAgICAgICAgICAgICAg
ICAgICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2UoZnJhbWUsIFY4Q3VzdG9tOjprRE9NV2luZG93
TWVudWJhckluZGV4LCByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICBjYXNlIEJhckluZm86OlBlcnNvbmFsYmFyOgorICAgICAgICAgICAgICAgICAg
ICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2UoZnJhbWUsIFY4Q3VzdG9tOjprRE9NV2luZG93UGVy
c29uYWxiYXJJbmRleCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAgICAgY2FzZSBCYXJJbmZvOjpTY3JvbGxiYXJzOgorICAgICAgICAgICAgICAgICAg
ICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2UoZnJhbWUsIFY4Q3VzdG9tOjprRE9NV2luZG93U2Ny
b2xsYmFyc0luZGV4LCByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICBjYXNlIEJhckluZm86OlN0YXR1c2JhcjoKKyAgICAgICAgICAgICAgICAgICAg
c2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKGZyYW1lLCBWOEN1c3RvbTo6a0RPTVdpbmRvd1N0YXR1
c2JhckluZGV4LCByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICAgICBjYXNlIEJhckluZm86OlRvb2xiYXI6CisgICAgICAgICAgICAgICAgICAgIHNldEhp
ZGRlbldpbmRvd1JlZmVyZW5jZShmcmFtZSwgVjhDdXN0b206OmtET01XaW5kb3dUb29sYmFySW5k
ZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRl
ZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBWOFByb3h5OjpzZXRIaWRkZW5X
aW5kb3dSZWZlcmVuY2UoRnJhbWUqIGZyYW1lLCBjb25zdCBpbnQgaW50ZXJuYWxJbmRleCwgdjg6
OkhhbmRsZTx2ODo6T2JqZWN0PiBqc09iamVjdCkKK3sKKyAgICAvLyBHZXQgRE9NV2luZG93Cisg
ICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOyAgLy8gT2JqZWN0IG1pZ2h0IGJlIGRldGFj
aGVkIGZyb20gd2luZG93CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gdjhDb250ZXh0ID0g
Y29udGV4dChmcmFtZSk7CisgICAgaWYgKHY4Q29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIEFTU0VSVChpbnRlcm5hbEluZGV4IDwgVjhDdXN0b206OmtET01XaW5kb3dJ
bnRlcm5hbEZpZWxkQ291bnQpOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwg
PSB2OENvbnRleHQtPkdsb2JhbCgpOworICAgIC8vIExvb2sgZm9yIHJlYWwgRE9NIHdyYXBwZXIu
CisgICAgZ2xvYmFsID0gbG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywg
Z2xvYmFsKTsKKyAgICBBU1NFUlQoIWdsb2JhbC5Jc0VtcHR5KCkpOworICAgIEFTU0VSVChnbG9i
YWwtPkdldEludGVybmFsRmllbGQoaW50ZXJuYWxJbmRleCktPklzVW5kZWZpbmVkKCkpOworICAg
IGdsb2JhbC0+U2V0SW50ZXJuYWxGaWVsZChpbnRlcm5hbEluZGV4LCBqc09iamVjdCk7Cit9CisK
K1Y4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBWOFByb3h5Ojpkb21XcmFwcGVyVHlwZSh2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCkKK3sKKyAgICBBU1NFUlQobWF5YmVET01XcmFwcGVy
KG9iamVjdCkpOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB0eXBlID0gb2JqZWN0LT5HZXRJ
bnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprRE9NV3JhcHBlclR5cGVJbmRleCk7CisgICAgcmV0dXJu
IFY4Q2xhc3NJbmRleDo6RnJvbUludCh0eXBlLT5JbnQzMlZhbHVlKCkpOworfQorCit2b2lkKiBW
OFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3RJbXBsKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVy
VHlwZSB0eXBlLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gb2JqZWN0KQoreworICAgIC8vIE5hdGl2
ZSBldmVudCBsaXN0ZW5lciBpcyBwZXIgZnJhbWUsIGl0IGNhbm5vdCBiZSBoYW5kbGVkIGJ5IHRo
aXMgZ2VuZXJpYyBmdW5jdGlvbi4KKyAgICBBU1NFUlQodHlwZSAhPSBWOENsYXNzSW5kZXg6OkVW
RU5UTElTVEVORVIpOworICAgIEFTU0VSVCh0eXBlICE9IFY4Q2xhc3NJbmRleDo6RVZFTlRUQVJH
RVQpOworCisgICAgQVNTRVJUKG1heWJlRE9NV3JhcHBlcihvYmplY3QpKTsKKworICAgIHN3aXRj
aCAodHlwZSkgeworI2RlZmluZSBNQUtFX0NBU0UoVFlQRSwgTkFNRSkgY2FzZSBWOENsYXNzSW5k
ZXg6OlRZUEU6CisgICAgICAgIERPTV9OT0RFX1RZUEVTKE1BS0VfQ0FTRSkKKyNpZiBFTkFCTEUo
U1ZHKQorICAgICAgICBTVkdfTk9ERV9UWVBFUyhNQUtFX0NBU0UpCisjZW5kaWYKKyAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgVjhDbGFz
c0luZGV4OjpYTUxIVFRQUkVRVUVTVDoKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRET01XcmFwcGVy
VG9OYXRpdmU8WE1MSHR0cFJlcXVlc3Q+KG9iamVjdCk7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6
OkVWRU5UOgorICAgICAgICByZXR1cm4gY29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxFdmVudD4o
b2JqZWN0KTsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q1NTUlVMRToKKyAgICAgICAgcmV0dXJu
IGNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8Q1NTUnVsZT4ob2JqZWN0KTsKKyAgICBkZWZhdWx0
OgorICAgICAgICBicmVhazsKKyAgICB9CisjdW5kZWYgTUFLRV9DQVNFCisKKyAgICByZXR1cm4g
Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTx2b2lkPihvYmplY3QpOworfQorCisKK3ZvaWQqIFY4
UHJveHk6OmNvbnZlcnRUb1NWR1BPRFR5cGVJbXBsKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlw
ZSB0eXBlLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gb2JqZWN0KQoreworICAgIHJldHVybiBpc1dy
YXBwZXJPZlR5cGUob2JqZWN0LCB0eXBlKSA/IGNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8dm9p
ZD4ob2JqZWN0KSA6IDA7Cit9CisKK3Y4OjpIYW5kbGU8djg6Ok9iamVjdD4gVjhQcm94eTo6bG9v
a3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSwgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IHZhbHVlKQoreworICAgIGlmICh2YWx1ZS5Jc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworCisgICAgdjg6OkhhbmRsZTx2ODo6
RnVuY3Rpb25UZW1wbGF0ZT4gZGVzY3JpcHRvciA9IFY4UHJveHk6OmdldFRlbXBsYXRlKHR5cGUp
OworICAgIHdoaWxlICh2YWx1ZS0+SXNPYmplY3QoKSkgeworICAgICAgICB2ODo6SGFuZGxlPHY4
OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodmFsdWUpOwor
ICAgICAgICBpZiAoZGVzY3JpcHRvci0+SGFzSW5zdGFuY2Uob2JqZWN0KSkKKyAgICAgICAgICAg
IHJldHVybiBvYmplY3Q7CisKKyAgICAgICAgdmFsdWUgPSBvYmplY3QtPkdldFByb3RvdHlwZSgp
OworICAgIH0KKyAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKK30gCisKK3Zv
aWQqIFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlSGVscGVyKHY4OjpIYW5kbGU8djg6
OlZhbHVlPiB2YWx1ZSkKK3sKKyAgICBBU1NFUlQobWF5YmVET01XcmFwcGVyKHZhbHVlKSk7CisK
KyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpIYW5kbGU8djg6Ok9iamVj
dD46OkNhc3QodmFsdWUpOworCisgICAgQVNTRVJUKGRvbVdyYXBwZXJUeXBlKG9iamVjdCkgPT0g
VjhDbGFzc0luZGV4OjpOT0RFKTsKKworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3cmFwcGVy
ID0gb2JqZWN0LT5HZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprRE9NV3JhcHBlck9iamVjdElu
ZGV4KTsKKyAgICByZXR1cm4gZXh0cmFjdENQb2ludGVyPE5vZGU+KHdyYXBwZXIpOworfQorCitQ
YXNzUmVmUHRyPE5vZGVGaWx0ZXI+IFY4UHJveHk6OndyYXBOYXRpdmVOb2RlRmlsdGVyKHY4OjpI
YW5kbGU8djg6OlZhbHVlPiBmaWx0ZXIpCit7CisgICAgLy8gQSBOb2RlRmlsdGVyIGlzIHVzZWQg
d2hlbiB3YWxraW5nIHRocm91Z2ggYSBET00gdHJlZSBvciBpdGVyYXRpbmcgdHJlZQorICAgIC8v
IG5vZGVzLgorICAgIC8vIEZJWE1FOiB3ZSBtYXkgd2FudCB0byBjYWNoZSBOb2RlRmlsdGVyQ29u
ZGl0aW9uIGFuZCBOb2RlRmlsdGVyCisgICAgLy8gb2JqZWN0LCBidXQgaXQgaXMgbWlub3IuCisg
ICAgLy8gTm9kZUZpbHRlciBpcyBwYXNzZWQgdG8gTm9kZUl0ZXJhdG9yIHRoYXQgaGFzIGEgcmVm
IGNvdW50ZWQgcG9pbnRlcgorICAgIC8vIHRvIE5vZGVGaWx0ZXIuIE5vZGVGaWx0ZXIgaGFzIGEg
cmVmIGNvdW50ZWQgcG9pbnRlciB0byBOb2RlRmlsdGVyQ29uZGl0aW9uLgorICAgIC8vIEluIE5v
ZGVGaWx0ZXJDb25kaXRpb24sIGZpbHRlciBvYmplY3QgaXMgcGVyc2lzdGVkIGluIGl0cyBjb25z
dHJ1Y3RvciwKKyAgICAvLyBhbmQgZGlzcG9zZWQgaW4gaXRzIGRlc3RydWN0b3IuCisgICAgaWYg
KCFmaWx0ZXItPklzRnVuY3Rpb24oKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBOb2RlRmls
dGVyQ29uZGl0aW9uKiBjb25kaXRpb24gPSBuZXcgVjhOb2RlRmlsdGVyQ29uZGl0aW9uKGZpbHRl
cik7CisgICAgcmV0dXJuIE5vZGVGaWx0ZXI6OmNyZWF0ZShjb25kaXRpb24pOworfQorCit2ODo6
TG9jYWw8djg6Ok9iamVjdD4gVjhQcm94eTo6aW5zdGFudGlhdGVWOE9iamVjdChWOENsYXNzSW5k
ZXg6OlY4V3JhcHBlclR5cGUgZGVzY3JpcHRvclR5cGUsIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVy
VHlwZSBjcHRyVHlwZSwgdm9pZCogaW1wbCkKK3sKKyAgICAvLyBNYWtlIGEgc3BlY2lhbCBjYXNl
IGZvciBkb2N1bWVudC5hbGwKKyAgICBpZiAoZGVzY3JpcHRvclR5cGUgPT0gVjhDbGFzc0luZGV4
OjpIVE1MQ09MTEVDVElPTiAmJiBzdGF0aWNfY2FzdDxIVE1MQ29sbGVjdGlvbio+KGltcGwpLT50
eXBlKCkgPT0gRG9jQWxsKQorICAgICAgICBkZXNjcmlwdG9yVHlwZSA9IFY4Q2xhc3NJbmRleDo6
VU5ERVRFQ1RBQkxFSFRNTENPTExFQ1RJT047CisKKyAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJv
eHk6OnJldHJpZXZlKCk7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGluc3RhbmNlOworICAg
IGlmIChwcm94eSkKKyAgICAgICAgaW5zdGFuY2UgPSBwcm94eS0+Y3JlYXRlV3JhcHBlckZyb21D
YWNoZShkZXNjcmlwdG9yVHlwZSk7CisgICAgZWxzZSB7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6
RnVuY3Rpb24+IGZ1bmN0aW9uID0gZ2V0VGVtcGxhdGUoZGVzY3JpcHRvclR5cGUpLT5HZXRGdW5j
dGlvbigpOworICAgICAgICBpbnN0YW5jZSA9IFNhZmVBbGxvY2F0aW9uOjpuZXdJbnN0YW5jZShm
dW5jdGlvbik7CisgICAgfQorICAgIGlmICghaW5zdGFuY2UuSXNFbXB0eSgpKSB7CisgICAgICAg
IC8vIEF2b2lkIHNldHRpbmcgdGhlIERPTSB3cmFwcGVyIGZvciBmYWlsZWQgYWxsb2NhdGlvbnMu
CisgICAgICAgIHNldERPTVdyYXBwZXIoaW5zdGFuY2UsIFY4Q2xhc3NJbmRleDo6VG9JbnQoY3B0
clR5cGUpLCBpbXBsKTsKKyAgICB9CisgICAgcmV0dXJuIGluc3RhbmNlOworfQorCit2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y2hlY2tOZXdMZWdhbChjb25zdCB2ODo6QXJndW1lbnRz
JiBhcmdzKQoreworICAgIGlmICghQWxsb3dBbGxvY2F0aW9uOjptX2N1cnJlbnQpCisgICAgICAg
IHJldHVybiB0aHJvd0Vycm9yKFRZUEVfRVJST1IsICJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7CisK
KyAgICByZXR1cm4gYXJncy5UaGlzKCk7Cit9CisKK3ZvaWQgVjhQcm94eTo6c2V0RE9NV3JhcHBl
cih2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCwgaW50IHR5cGUsIHZvaWQqIGNwdHIpCit7
CisgICAgQVNTRVJUKG9iamVjdC0+SW50ZXJuYWxGaWVsZENvdW50KCkgPj0gMik7CisgICAgb2Jq
ZWN0LT5TZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprRE9NV3JhcHBlck9iamVjdEluZGV4LCB3
cmFwQ1BvaW50ZXIoY3B0cikpOworICAgIG9iamVjdC0+U2V0SW50ZXJuYWxGaWVsZChWOEN1c3Rv
bTo6a0RPTVdyYXBwZXJUeXBlSW5kZXgsIHY4OjpJbnRlZ2VyOjpOZXcodHlwZSkpOworfQorCisj
aWZuZGVmIE5ERUJVRworYm9vbCBWOFByb3h5OjptYXliZURPTVdyYXBwZXIodjg6OkhhbmRsZTx2
ODo6VmFsdWU+IHZhbHVlKQoreworICAgIGlmICh2YWx1ZS5Jc0VtcHR5KCkgfHwgIXZhbHVlLT5J
c09iamVjdCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+IG9iamVjdCA9IHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodmFsdWUpOworICAg
IGlmICghb2JqZWN0LT5JbnRlcm5hbEZpZWxkQ291bnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgQVNTRVJUKG9iamVjdC0+SW50ZXJuYWxGaWVsZENvdW50KCkgPj0gVjhDdXN0b206
OmtEZWZhdWx0V3JhcHBlckludGVybmFsRmllbGRDb3VudCk7CisKKyAgICB2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4gdHlwZSA9IG9iamVjdC0+R2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RPTVdy
YXBwZXJUeXBlSW5kZXgpOworICAgIEFTU0VSVCh0eXBlLT5Jc0ludDMyKCkpOworICAgIEFTU0VS
VChWOENsYXNzSW5kZXg6OklOVkFMSURfQ0xBU1NfSU5ERVggPCB0eXBlLT5JbnQzMlZhbHVlKCkg
JiYgdHlwZS0+SW50MzJWYWx1ZSgpIDwgVjhDbGFzc0luZGV4OjpDTEFTU0lOREVYX0VORCk7CisK
KyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcHBlciA9IG9iamVjdC0+R2V0SW50ZXJuYWxG
aWVsZChWOEN1c3RvbTo6a0RPTVdyYXBwZXJPYmplY3RJbmRleCk7CisgICAgQVNTRVJUKHdyYXBw
ZXItPklzTnVtYmVyKCkgfHwgd3JhcHBlci0+SXNFeHRlcm5hbCgpKTsKKworICAgIHJldHVybiB0
cnVlOworfQorI2VuZGlmCisKK2Jvb2wgVjhQcm94eTo6aXNET01FdmVudFdyYXBwZXIodjg6Okhh
bmRsZTx2ODo6VmFsdWU+IHZhbHVlKQoreworICAgIC8vIEFsbCBraW5kcyBvZiBldmVudHMgdXNl
IEVWRU5UIGFzIGRvbSB0eXBlIGluIEpTIHdyYXBwZXJzLgorICAgIC8vIFNlZSBFdmVudFRvVjhP
YmplY3QKKyAgICByZXR1cm4gaXNXcmFwcGVyT2ZUeXBlKHZhbHVlLCBWOENsYXNzSW5kZXg6OkVW
RU5UKTsKK30KKworYm9vbCBWOFByb3h5Ojppc1dyYXBwZXJPZlR5cGUodjg6OkhhbmRsZTx2ODo6
VmFsdWU+IHZhbHVlLCBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgY2xhc3NUeXBlKQorewor
ICAgIGlmICh2YWx1ZS5Jc0VtcHR5KCkgfHwgIXZhbHVlLT5Jc09iamVjdCgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpI
YW5kbGU8djg6Ok9iamVjdD46OkNhc3QodmFsdWUpOworICAgIGlmICghb2JqZWN0LT5JbnRlcm5h
bEZpZWxkQ291bnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQVNTRVJUKG9iamVj
dC0+SW50ZXJuYWxGaWVsZENvdW50KCkgPj0gVjhDdXN0b206OmtEZWZhdWx0V3JhcHBlckludGVy
bmFsRmllbGRDb3VudCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcHBlciA9IG9i
amVjdC0+R2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RPTVdyYXBwZXJPYmplY3RJbmRleCk7
CisgICAgQVNTRVJUKHdyYXBwZXItPklzTnVtYmVyKCkgfHwgd3JhcHBlci0+SXNFeHRlcm5hbCgp
KTsKKworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB0eXBlID0gb2JqZWN0LT5HZXRJbnRlcm5h
bEZpZWxkKFY4Q3VzdG9tOjprRE9NV3JhcHBlclR5cGVJbmRleCk7CisgICAgQVNTRVJUKHR5cGUt
PklzSW50MzIoKSk7CisgICAgQVNTRVJUKFY4Q2xhc3NJbmRleDo6SU5WQUxJRF9DTEFTU19JTkRF
WCA8IHR5cGUtPkludDMyVmFsdWUoKSAmJiB0eXBlLT5JbnQzMlZhbHVlKCkgPCBWOENsYXNzSW5k
ZXg6OkNMQVNTSU5ERVhfRU5EKTsKKworICAgIHJldHVybiBWOENsYXNzSW5kZXg6OkZyb21JbnQo
dHlwZS0+SW50MzJWYWx1ZSgpKSA9PSBjbGFzc1R5cGU7Cit9CisKKyNpZiBFTkFCTEUoVklERU8p
CisjZGVmaW5lIEZPUl9FQUNIX1ZJREVPX1RBRyhtYWNybykgICAgICAgICAgICAgICAgICBcCisg
ICAgbWFjcm8oYXVkaW8sIEFVRElPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
bWFjcm8oc291cmNlLCBTT1VSQ0UpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFj
cm8odmlkZW8sIFZJREVPKQorI2Vsc2UKKyNkZWZpbmUgRk9SX0VBQ0hfVklERU9fVEFHKG1hY3Jv
KQorI2VuZGlmCisKKyNkZWZpbmUgRk9SX0VBQ0hfVEFHKG1hY3JvKSAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBtYWNybyhhLCBBTkNIT1IpICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICBtYWNybyhhcHBsZXQsIEFQUExFVCkgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICBtYWNybyhhcmVhLCBBUkVBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICBtYWNybyhiYXNlLCBCQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICBtYWNybyhiYXNlZm9udCwgQkFTRUZPTlQpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBt
YWNybyhibG9ja3F1b3RlLCBCTE9DS1FVT1RFKSAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNy
byhib2R5LCBCT0RZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhi
ciwgQlIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhidXR0
b24sIEJVVFRPTikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhjYXB0aW9u
LCBUQUJMRUNBUFRJT04pICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhjb2wsIFRBQkxF
Q09MKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhjb2xncm91cCwgVEFC
TEVDT0wpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhkZWwsIE1PRCkgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhjYW52YXMsIENBTlZBUykgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhkaXIsIERJUkVDVE9SWSkgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhkaXYsIERJVikgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhkbCwgRExJU1QpICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICBtYWNybyhlbWJlZCwgRU1CRUQpICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFwKKyAgICBtYWNybyhmaWVsZHNldCwgRklFTERTRVQpICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBtYWNybyhmb250LCBGT05UKSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICBtYWNybyhmb3JtLCBGT1JNKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICBtYWNybyhmcmFtZSwgRlJBTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICBtYWNybyhmcmFtZXNldCwgRlJBTUVTRVQpICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICBtYWNybyhoMSwgSEVBRElORykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBt
YWNybyhoMiwgSEVBRElORykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNy
byhoMywgSEVBRElORykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyho
NCwgSEVBRElORykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhoNSwg
SEVBRElORykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhoNiwgSEVB
RElORykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhoZWFkLCBIRUFE
KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhociwgSFIpICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhodG1sLCBIVE1MKSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhpbWcsIElNQUdFKSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhpZnJhbWUsIElGUkFNRSkgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhpbWFnZSwgSU1BR0UpICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhpbnB1dCwgSU5QVVQpICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICBtYWNybyhpbnMsIE1PRCkgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFwKKyAgICBtYWNybyhpc2luZGV4LCBJU0lOREVYKSAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBtYWNybyhrZXlnZW4sIFNFTEVDVCkgICAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICBtYWNybyhsYWJlbCwgTEFCRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICBtYWNybyhsZWdlbmQsIExFR0VORCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICBtYWNybyhsaSwgTEkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICBtYWNybyhsaW5rLCBMSU5LKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBt
YWNybyhsaXN0aW5nLCBQUkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNy
byhtYXAsIE1BUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyht
YXJxdWVlLCBNQVJRVUVFKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhtZW51
LCBNRU5VKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhtZXRhLCBN
RVRBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhvYmplY3QsIE9C
SkVDVCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhvbCwgT0xJU1QpICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhvcHRncm91cCwgT1BUR1JP
VVApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhvcHRpb24sIE9QVElPTikgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhwLCBQQVJBR1JBUEgpICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhwYXJhbSwgUEFSQU0pICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhwcmUsIFBSRSkgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICBtYWNybyhxLCBRVU9URSkgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFwKKyAgICBtYWNybyhzY3JpcHQsIFNDUklQVCkgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBtYWNybyhzZWxlY3QsIFNFTEVDVCkgICAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICBtYWNybyhzdHlsZSwgU1RZTEUpICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICBtYWNybyh0YWJsZSwgVEFCTEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICBtYWNybyh0aGVhZCwgVEFCTEVTRUNUSU9OKSAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICBtYWNybyh0Ym9keSwgVEFCTEVTRUNUSU9OKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBt
YWNybyh0Zm9vdCwgVEFCTEVTRUNUSU9OKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNy
byh0ZCwgVEFCTEVDRUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0
aCwgVEFCTEVDRUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0ciwg
VEFCTEVST1cpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0ZXh0YXJl
YSwgVEVYVEFSRUEpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh0aXRsZSwgVElU
TEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh1bCwgVUxJU1QpICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyh4bXAsIFBSRSkKKworVjhD
bGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIFY4UHJveHk6Omh0bWxFbGVtZW50VHlwZShIVE1MRWxl
bWVudCogZWxlbWVudCkKK3sKKyAgICB0eXBlZGVmIEhhc2hNYXA8U3RyaW5nLCBWOENsYXNzSW5k
ZXg6OlY4V3JhcHBlclR5cGU+IFdyYXBwZXJUeXBlTWFwOworICAgIERFRklORV9TVEFUSUNfTE9D
QUwoV3JhcHBlclR5cGVNYXAsIHdyYXBwZXJUeXBlTWFwLCAoKSk7CisgICAgaWYgKHdyYXBwZXJU
eXBlTWFwLmlzRW1wdHkoKSkgeworI2RlZmluZSBBRERfVE9fSEFTSF9NQVAodGFnLCBuYW1lKSBc
CisgICAgICAgIHdyYXBwZXJUeXBlTWFwLnNldCgjdGFnLCBWOENsYXNzSW5kZXg6OkhUTUwjI25h
bWUjI0VMRU1FTlQpOworICAgICAgICBGT1JfRUFDSF9UQUcoQUREX1RPX0hBU0hfTUFQKQorI2lm
IEVOQUJMRShWSURFTykKKyAgICAgICAgaWYgKE1lZGlhUGxheWVyOjppc0F2YWlsYWJsZSgpKSB7
CisgICAgICAgICAgICBGT1JfRUFDSF9WSURFT19UQUcoQUREX1RPX0hBU0hfTUFQKQorICAgICAg
ICB9CisjZW5kaWYKKyN1bmRlZiBBRERfVE9fSEFTSF9NQVAKKyAgICB9CisKKyAgICBWOENsYXNz
SW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IHdyYXBwZXJUeXBlTWFwLmdldChlbGVtZW50LT5s
b2NhbE5hbWUoKS5pbXBsKCkpOworICAgIGlmICghdHlwZSkKKyAgICAgICAgcmV0dXJuIFY4Q2xh
c3NJbmRleDo6SFRNTEVMRU1FTlQ7CisgICAgcmV0dXJuIHR5cGU7Cit9CisjdW5kZWYgRk9SX0VB
Q0hfVEFHCisKKyNpZiBFTkFCTEUoU1ZHKQorCisjaWYgRU5BQkxFKFNWR19BTklNQVRJT04pCisj
ZGVmaW5lIEZPUl9FQUNIX0FOSU1BVElPTl9UQUcobWFjcm8pIFwKKyAgICBtYWNybyhhbmltYXRl
Q29sb3IsIEFOSU1BVEVDT0xPUikgXAorICAgIG1hY3JvKGFuaW1hdGUsIEFOSU1BVEUpIFwKKyAg
ICBtYWNybyhhbmltYXRlVHJhbnNmb3JtLCBBTklNQVRFVFJBTlNGT1JNKSBcCisgICAgbWFjcm8o
c2V0LCBTRVQpCisjZWxzZQorI2RlZmluZSBGT1JfRUFDSF9BTklNQVRJT05fVEFHKG1hY3JvKQor
I2VuZGlmCisKKyNpZiBFTkFCTEUoU1ZHX0ZJTFRFUlMpCisjZGVmaW5lIEZPUl9FQUNIX0ZJTFRF
UlNfVEFHKG1hY3JvKSBcCisgICAgbWFjcm8oZmVCbGVuZCwgRkVCTEVORCkgXAorICAgIG1hY3Jv
KGZlQ29sb3JNYXRyaXgsIEZFQ09MT1JNQVRSSVgpIFwKKyAgICBtYWNybyhmZUNvbXBvbmVudFRy
YW5zZmVyLCBGRUNPTVBPTkVOVFRSQU5TRkVSKSBcCisgICAgbWFjcm8oZmVDb21wb3NpdGUsIEZF
Q09NUE9TSVRFKSBcCisgICAgbWFjcm8oZmVEaWZmdXNlTGlnaHRpbmcsIEZFRElGRlVTRUxJR0hU
SU5HKSBcCisgICAgbWFjcm8oZmVEaXNwbGFjZW1lbnRNYXAsIEZFRElTUExBQ0VNRU5UTUFQKSBc
CisgICAgbWFjcm8oZmVEaXN0YW50TGlnaHQsIEZFRElTVEFOVExJR0hUKSBcCisgICAgbWFjcm8o
ZmVGbG9vZCwgRkVGTE9PRCkgXAorICAgIG1hY3JvKGZlRnVuY0EsIEZFRlVOQ0EpIFwKKyAgICBt
YWNybyhmZUZ1bmNCLCBGRUZVTkNCKSBcCisgICAgbWFjcm8oZmVGdW5jRywgRkVGVU5DRykgXAor
ICAgIG1hY3JvKGZlRnVuY1IsIEZFRlVOQ1IpIFwKKyAgICBtYWNybyhmZUdhdXNzaWFuQmx1ciwg
RkVHQVVTU0lBTkJMVVIpIFwKKyAgICBtYWNybyhmZUltYWdlLCBGRUlNQUdFKSBcCisgICAgbWFj
cm8oZmVNZXJnZSwgRkVNRVJHRSkgXAorICAgIG1hY3JvKGZlTWVyZ2VOb2RlLCBGRU1FUkdFTk9E
RSkgXAorICAgIG1hY3JvKGZlT2Zmc2V0LCBGRU9GRlNFVCkgXAorICAgIG1hY3JvKGZlUG9pbnRM
aWdodCwgRkVQT0lOVExJR0hUKSBcCisgICAgbWFjcm8oZmVTcGVjdWxhckxpZ2h0aW5nLCBGRVNQ
RUNVTEFSTElHSFRJTkcpIFwKKyAgICBtYWNybyhmZVNwb3RMaWdodCwgRkVTUE9UTElHSFQpIFwK
KyAgICBtYWNybyhmZVRpbGUsIEZFVElMRSkgXAorICAgIG1hY3JvKGZlVHVyYnVsZW5jZSwgRkVU
VVJCVUxFTkNFKSBcCisgICAgbWFjcm8oZmlsdGVyLCBGSUxURVIpCisjZWxzZQorI2RlZmluZSBG
T1JfRUFDSF9GSUxURVJTX1RBRyhtYWNybykKKyNlbmRpZgorCisjaWYgRU5BQkxFKFNWR19GT05U
UykKKyNkZWZpbmUgRk9SX0VBQ0hfRk9OVFNfVEFHKG1hY3JvKSBcCisgICAgbWFjcm8oZGVmaW5p
dGlvbi1zcmMsIERFRklOSVRJT05TUkMpIFwKKyAgICBtYWNybyhmb250LWZhY2UsIEZPTlRGQUNF
KSBcCisgICAgbWFjcm8oZm9udC1mYWNlLWZvcm1hdCwgRk9OVEZBQ0VGT1JNQVQpIFwKKyAgICBt
YWNybyhmb250LWZhY2UtbmFtZSwgRk9OVEZBQ0VOQU1FKSBcCisgICAgbWFjcm8oZm9udC1mYWNl
LXNyYywgRk9OVEZBQ0VTUkMpIFwKKyAgICBtYWNybyhmb250LWZhY2UtdXJpLCBGT05URkFDRVVS
SSkKKyNlbHNlCisjZGVmaW5lIEZPUl9FQUNIX0ZPTlRTX1RBRyhtYXJjbykKKyNlbmRpZgorCisj
aWYgRU5BQkxFKFNWR19GT1JFSUdOX09CSkVDVCkKKyNkZWZpbmUgRk9SX0VBQ0hfRk9SRUlHTl9P
QkpFQ1RfVEFHKG1hY3JvKSBcCisgICAgbWFjcm8oZm9yZWlnbk9iamVjdCwgRk9SRUlHTk9CSkVD
VCkKKyNlbHNlCisjZGVmaW5lIEZPUl9FQUNIX0ZPUkVJR05fT0JKRUNUX1RBRyhtYWNybykKKyNl
bmRpZgorCisjaWYgRU5BQkxFKFNWR19VU0UpCisjZGVmaW5lIEZPUl9FQUNIX1VTRV9UQUcobWFj
cm8pIFwKKyAgICBtYWNybyh1c2UsIFVTRSkKKyNlbHNlCisjZGVmaW5lIEZPUl9FQUNIX1VTRV9U
QUcobWFjcm8pCisjZW5kaWYKKworI2RlZmluZSBGT1JfRUFDSF9UQUcobWFjcm8pIFwKKyAgICBG
T1JfRUFDSF9BTklNQVRJT05fVEFHKG1hY3JvKSBcCisgICAgRk9SX0VBQ0hfRklMVEVSU19UQUco
bWFjcm8pIFwKKyAgICBGT1JfRUFDSF9GT05UU19UQUcobWFjcm8pIFwKKyAgICBGT1JfRUFDSF9G
T1JFSUdOX09CSkVDVF9UQUcobWFjcm8pIFwKKyAgICBGT1JfRUFDSF9VU0VfVEFHKG1hY3JvKSBc
CisgICAgbWFjcm8oYSwgQSkgXAorICAgIG1hY3JvKGFsdEdseXBoLCBBTFRHTFlQSCkgXAorICAg
IG1hY3JvKGNpcmNsZSwgQ0lSQ0xFKSBcCisgICAgbWFjcm8oY2xpcFBhdGgsIENMSVBQQVRIKSBc
CisgICAgbWFjcm8oY3Vyc29yLCBDVVJTT1IpIFwKKyAgICBtYWNybyhkZWZzLCBERUZTKSBcCisg
ICAgbWFjcm8oZGVzYywgREVTQykgXAorICAgIG1hY3JvKGVsbGlwc2UsIEVMTElQU0UpIFwKKyAg
ICBtYWNybyhnLCBHKSBcCisgICAgbWFjcm8oZ2x5cGgsIEdMWVBIKSBcCisgICAgbWFjcm8oaW1h
Z2UsIElNQUdFKSBcCisgICAgbWFjcm8obGluZWFyR3JhZGllbnQsIExJTkVBUkdSQURJRU5UKSBc
CisgICAgbWFjcm8obGluZSwgTElORSkgXAorICAgIG1hY3JvKG1hcmtlciwgTUFSS0VSKSBcCisg
ICAgbWFjcm8obWFzaywgTUFTSykgXAorICAgIG1hY3JvKG1ldGFkYXRhLCBNRVRBREFUQSkgXAor
ICAgIG1hY3JvKHBhdGgsIFBBVEgpIFwKKyAgICBtYWNybyhwYXR0ZXJuLCBQQVRURVJOKSBcCisg
ICAgbWFjcm8ocG9seWxpbmUsIFBPTFlMSU5FKSBcCisgICAgbWFjcm8ocG9seWdvbiwgUE9MWUdP
TikgXAorICAgIG1hY3JvKHJhZGlhbEdyYWRpZW50LCBSQURJQUxHUkFESUVOVCkgXAorICAgIG1h
Y3JvKHJlY3QsIFJFQ1QpIFwKKyAgICBtYWNybyhzY3JpcHQsIFNDUklQVCkgXAorICAgIG1hY3Jv
KHN0b3AsIFNUT1ApIFwKKyAgICBtYWNybyhzdHlsZSwgU1RZTEUpIFwKKyAgICBtYWNybyhzdmcs
IFNWRykgXAorICAgIG1hY3JvKHN3aXRjaCwgU1dJVENIKSBcCisgICAgbWFjcm8oc3ltYm9sLCBT
WU1CT0wpIFwKKyAgICBtYWNybyh0ZXh0LCBURVhUKSBcCisgICAgbWFjcm8odGV4dFBhdGgsIFRF
WFRQQVRIKSBcCisgICAgbWFjcm8odGl0bGUsIFRJVExFKSBcCisgICAgbWFjcm8odHJlZiwgVFJF
RikgXAorICAgIG1hY3JvKHRzcGFuLCBUU1BBTikgXAorICAgIG1hY3JvKHZpZXcsIFZJRVcpIFwK
KyAgICAvLyBlbmQgb2YgbWFjcm8KKworVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIFY4UHJv
eHk6OnN2Z0VsZW1lbnRUeXBlKFNWR0VsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgdHlwZWRlZiBI
YXNoTWFwPFN0cmluZywgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlPiBXcmFwcGVyVHlwZU1h
cDsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFdyYXBwZXJUeXBlTWFwLCB3cmFwcGVyVHlwZU1h
cCwgKCkpOworICAgIGlmICh3cmFwcGVyVHlwZU1hcC5pc0VtcHR5KCkpIHsKKyNkZWZpbmUgQURE
X1RPX0hBU0hfTUFQKHRhZywgbmFtZSkgXAorICAgICAgICB3cmFwcGVyVHlwZU1hcC5zZXQoI3Rh
ZywgVjhDbGFzc0luZGV4OjpTVkcjI25hbWUjI0VMRU1FTlQpOworICAgICAgICBGT1JfRUFDSF9U
QUcoQUREX1RPX0hBU0hfTUFQKQorI3VuZGVmIEFERF9UT19IQVNIX01BUAorICAgIH0KKworICAg
IFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gd3JhcHBlclR5cGVNYXAuZ2V0KGVs
ZW1lbnQtPmxvY2FsTmFtZSgpLmltcGwoKSk7CisgICAgaWYgKCF0eXBlKQorICAgICAgICByZXR1
cm4gVjhDbGFzc0luZGV4OjpTVkdFTEVNRU5UOworICAgIHJldHVybiB0eXBlOworfQorI3VuZGVm
IEZPUl9FQUNIX1RBRworCisjZW5kaWYgLy8gRU5BQkxFKFNWRykKKwordjg6OkhhbmRsZTx2ODo6
VmFsdWU+IFY4UHJveHk6OmNvbnZlcnRFdmVudFRvVjhPYmplY3QoRXZlbnQqIGV2ZW50KQorewor
ICAgIGlmICghZXZlbnQpCisgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisgICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZ2V0RE9NT2JqZWN0TWFwKCkuZ2V0KGV2ZW50KTsK
KyAgICBpZiAoIXdyYXBwZXIuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gd3JhcHBlcjsKKwor
ICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhDbGFzc0luZGV4OjpFVkVO
VDsKKworICAgIGlmIChldmVudC0+aXNVSUV2ZW50KCkpIHsKKyAgICAgICAgaWYgKGV2ZW50LT5p
c0tleWJvYXJkRXZlbnQoKSkKKyAgICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OktFWUJP
QVJERVZFTlQ7CisgICAgICAgIGVsc2UgaWYgKGV2ZW50LT5pc1RleHRFdmVudCgpKQorICAgICAg
ICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6VEVYVEVWRU5UOworICAgICAgICBlbHNlIGlmIChl
dmVudC0+aXNNb3VzZUV2ZW50KCkpCisgICAgICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpN
T1VTRUVWRU5UOworICAgICAgICBlbHNlIGlmIChldmVudC0+aXNXaGVlbEV2ZW50KCkpCisgICAg
ICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpXSEVFTEVWRU5UOworI2lmIEVOQUJMRShTVkcp
CisgICAgICAgIGVsc2UgaWYgKGV2ZW50LT5pc1NWR1pvb21FdmVudCgpKQorICAgICAgICAgICAg
dHlwZSA9IFY4Q2xhc3NJbmRleDo6U1ZHWk9PTUVWRU5UOworI2VuZGlmCisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlVJRVZFTlQ7CisgICAgfSBlbHNlIGlm
IChldmVudC0+aXNNdXRhdGlvbkV2ZW50KCkpCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6
Ok1VVEFUSU9ORVZFTlQ7CisgICAgZWxzZSBpZiAoZXZlbnQtPmlzT3ZlcmZsb3dFdmVudCgpKQor
ICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpPVkVSRkxPV0VWRU5UOworICAgIGVsc2UgaWYg
KGV2ZW50LT5pc01lc3NhZ2VFdmVudCgpKQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpN
RVNTQUdFRVZFTlQ7CisgICAgZWxzZSBpZiAoZXZlbnQtPmlzUHJvZ3Jlc3NFdmVudCgpKSB7Cisg
ICAgICAgIGlmIChldmVudC0+aXNYTUxIdHRwUmVxdWVzdFByb2dyZXNzRXZlbnQoKSkKKyAgICAg
ICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUUFJPR1JFU1NFVkVOVDsK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6UFJPR1JFU1NF
VkVOVDsKKyAgICB9IGVsc2UgaWYgKGV2ZW50LT5pc1dlYktpdEFuaW1hdGlvbkV2ZW50KCkpCisg
ICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OldFQktJVEFOSU1BVElPTkVWRU5UOworICAgIGVs
c2UgaWYgKGV2ZW50LT5pc1dlYktpdFRyYW5zaXRpb25FdmVudCgpKQorICAgICAgICB0eXBlID0g
VjhDbGFzc0luZGV4OjpXRUJLSVRUUkFOU0lUSU9ORVZFTlQ7CisKKworICAgIHY4OjpIYW5kbGU8
djg6Ok9iamVjdD4gcmVzdWx0ID0gaW5zdGFudGlhdGVWOE9iamVjdCh0eXBlLCBWOENsYXNzSW5k
ZXg6OkVWRU5ULCBldmVudCk7CisgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAg
Ly8gSW5zdGFudGlhdGlvbiBmYWlsZWQuIEF2b2lkIHVwZGF0aW5nIHRoZSBET00gb2JqZWN0IG1h
cCBhbmQKKyAgICAgICAgLy8gcmV0dXJuIG51bGwgd2hpY2ggaXMgYWxyZWFkeSBoYW5kbGVkIGJ5
IGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbgorICAgICAgICAvLyBpbiBjYXNlIHRoZSBldmVudCBp
cyBOVUxMLgorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKyAgICB9CisKKyAgICBldmVudC0+
cmVmKCk7ICAvLyBmYXN0IHJlZgorICAgIHNldEpTV3JhcHBlckZvckRPTU9iamVjdChldmVudCwg
djg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhyZXN1bHQpKTsKKworICAgIHJldHVybiBy
ZXN1bHQ7Cit9CisKKy8vIENhbGxlciBjaGVja3Mgbm9kZSBpcyBub3QgbnVsbC4KK3Y4OjpIYW5k
bGU8djg6OlZhbHVlPiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QoTm9kZSogbm9kZSkK
K3sKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisgICAgLy8g
RmluZCB0aGUgY29udGV4dCB0byB3aGljaCB0aGUgbm9kZSBiZWxvbmdzIGFuZCBjcmVhdGUgdGhl
IHdyYXBwZXIKKyAgICAvLyBpbiB0aGF0IGNvbnRleHQuICBJZiB0aGUgbm9kZSBpcyBub3QgaW4g
YSBkb2N1bWVudCwgdGhlIGN1cnJlbnQKKyAgICAvLyBjb250ZXh0IGlzIHVzZWQuCisgICAgLy8K
KyAgICAvLyBHZXR0aW5nIHRoZSBjb250ZXh0IG1pZ2h0IGluaXRpYWxpemUgdGhlIGNvbnRleHQg
d2hpY2ggY2FuIGluc3RhbnRpYXRlCisgICAgLy8gYSBkb2N1bWVudCB3cmFwcGVyLiAgVGhlcmVm
b3JlLCB3ZSBnZXQgdGhlIGNvbnRleHQgYmVmb3JlIGNoZWNraW5nIGlmCisgICAgLy8gdGhlIG5v
ZGUgYWxyZWFkeSBoYXMgYSB3cmFwcGVyLgorICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gdjhD
b250ZXh0OworICAgIERvY3VtZW50KiBkb2N1bWVudCA9IG5vZGUtPmRvY3VtZW50KCk7CisgICAg
aWYgKGRvY3VtZW50KQorICAgICAgICB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KGRvY3Vt
ZW50LT5mcmFtZSgpKTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlciA9IGdl
dERPTU5vZGVNYXAoKS5nZXQobm9kZSk7CisgICAgaWYgKCF3cmFwcGVyLklzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuIHdyYXBwZXI7CisKKyAgICBib29sIGlzRG9jdW1lbnQgPSBmYWxzZTsgIC8v
IGRvY3VtZW50IHR5cGUgbm9kZSBoYXMgc3BlY2lhbCBoYW5kbGluZworICAgIFY4Q2xhc3NJbmRl
eDo6VjhXcmFwcGVyVHlwZSB0eXBlOworCisgICAgc3dpdGNoIChub2RlLT5ub2RlVHlwZSgpKSB7
CisgICAgY2FzZSBOb2RlOjpFTEVNRU5UX05PREU6CisgICAgICAgIGlmIChub2RlLT5pc0hUTUxF
bGVtZW50KCkpCisgICAgICAgICAgICB0eXBlID0gaHRtbEVsZW1lbnRUeXBlKHN0YXRpY19jYXN0
PEhUTUxFbGVtZW50Kj4obm9kZSkpOworI2lmIEVOQUJMRShTVkcpCisgICAgICAgIGVsc2UgaWYg
KG5vZGUtPmlzU1ZHRWxlbWVudCgpKQorICAgICAgICAgICAgdHlwZSA9IHN2Z0VsZW1lbnRUeXBl
KHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihub2RlKSk7CisjZW5kaWYKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6RUxFTUVOVDsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBOb2RlOjpBVFRSSUJVVEVfTk9ERToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJ
bmRleDo6QVRUUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlOjpURVhUX05PREU6Cisg
ICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlRFWFQ7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgTm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4
OjpDREFUQVNFQ1RJT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6RU5USVRZX05P
REU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkVOVElUWTsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBOb2RlOjpQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6CisgICAgICAgIHR5
cGUgPSBWOENsYXNzSW5kZXg6OlBST0NFU1NJTkdJTlNUUlVDVElPTjsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBOb2RlOjpDT01NRU5UX05PREU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5k
ZXg6OkNPTU1FTlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfTk9E
RTogeworICAgICAgICBpc0RvY3VtZW50ID0gdHJ1ZTsKKyAgICAgICAgRG9jdW1lbnQqIGRvY3Vt
ZW50ID0gc3RhdGljX2Nhc3Q8RG9jdW1lbnQqPihub2RlKTsKKyAgICAgICAgaWYgKGRvY3VtZW50
LT5pc0hUTUxEb2N1bWVudCgpKQorICAgICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6SFRN
TERPQ1VNRU5UOworI2lmIEVOQUJMRShTVkcpCisgICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LT5p
c1NWR0RvY3VtZW50KCkpCisgICAgICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpTVkdET0NV
TUVOVDsKKyNlbmRpZgorICAgICAgICBlbHNlCisgICAgICAgICAgICB0eXBlID0gVjhDbGFzc0lu
ZGV4OjpET0NVTUVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTm9kZTo6RE9D
VU1FTlRfVFlQRV9OT0RFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpET0NVTUVOVFRZ
UEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6Tk9UQVRJT05fTk9ERToKKyAgICAg
ICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Tk9UQVRJT047CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgTm9kZTo6RE9DVU1FTlRfRlJBR01FTlRfTk9ERToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJ
bmRleDo6RE9DVU1FTlRGUkFHTUVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlOjpF
TlRJVFlfUkVGRVJFTkNFX05PREU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkVOVElU
WVJFRkVSRU5DRTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgdHlwZSA9
IFY4Q2xhc3NJbmRleDo6Tk9ERTsKKyAgICB9CisKKyAgICAvLyBFbnRlciB0aGUgbm9kZSdzIGNv
bnRleHQgYW5kIGNyZWF0ZSB0aGUgd3JhcHBlciBpbiB0aGF0IGNvbnRleHQuCisgICAgaWYgKCF2
OENvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICB2OENvbnRleHQtPkVudGVyKCk7CisKKyAgICB2
ODo6TG9jYWw8djg6Ok9iamVjdD4gcmVzdWx0ID0gaW5zdGFudGlhdGVWOE9iamVjdCh0eXBlLCBW
OENsYXNzSW5kZXg6Ok5PREUsIG5vZGUpOworCisgICAgLy8gRXhpdCB0aGUgbm9kZSdzIGNvbnRl
eHQgaWYgaXQgd2FzIGVudGVyZWQuCisgICAgaWYgKCF2OENvbnRleHQuSXNFbXB0eSgpKQorICAg
ICAgICB2OENvbnRleHQtPkV4aXQoKTsKKworICAgIGlmIChyZXN1bHQuSXNFbXB0eSgpKSB7Cisg
ICAgICAgIC8vIElmIGluc3RhbnRpYXRpb24gZmFpbGVkIGl0J3MgaW1wb3J0YW50IG5vdCB0byBh
ZGQgdGhlIHJlc3VsdAorICAgICAgICAvLyB0byB0aGUgRE9NIG5vZGUgbWFwLiBJbnN0ZWFkIHdl
IHJldHVybiBhbiBlbXB0eSBoYW5kbGUsIHdoaWNoCisgICAgICAgIC8vIHNob3VsZCBhbHJlYWR5
IGJlIGhhbmRsZWQgYnkgY2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uIGluIGNhc2UKKyAgICAgICAg
Ly8gdGhlIG5vZGUgaXMgTlVMTC4KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAg
ICBub2RlLT5yZWYoKTsKKyAgICBzZXRKU1dyYXBwZXJGb3JET01Ob2RlKG5vZGUsIHY4OjpQZXJz
aXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcocmVzdWx0KSk7CisKKyAgICBpZiAoaXNEb2N1bWVudCkg
eworICAgICAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxEb2N1bWVudCo+KG5v
ZGUpOworICAgICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKGRvY3VtZW50
LT5mcmFtZSgpKTsKKyAgICAgICAgaWYgKHByb3h5KQorICAgICAgICAgICAgcHJveHktPnVwZGF0
ZURvY3VtZW50V3JhcHBlcihyZXN1bHQpOworCisgICAgICAgIGlmICh0eXBlID09IFY4Q2xhc3NJ
bmRleDo6SFRNTERPQ1VNRU5UKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgbWFya2VyIG9iamVj
dCBhbmQgaW5zZXJ0IGl0IGluIHR3byBpbnRlcm5hbCBmaWVsZHMuCisgICAgICAgICAgICAvLyBU
aGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRlbXBvcmFyeSBzaGFkb3dpbmcgb2YKKyAgICAgICAg
ICAgIC8vIGRvY3VtZW50LmFsbC4KKyAgICAgICAgICAgIEFTU0VSVChyZXN1bHQtPkludGVybmFs
RmllbGRDb3VudCgpID09IFY4Q3VzdG9tOjprSFRNTERvY3VtZW50SW50ZXJuYWxGaWVsZENvdW50
KTsKKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBtYXJrZXIgPSB2ODo6T2JqZWN0
OjpOZXcoKTsKKyAgICAgICAgICAgIHJlc3VsdC0+U2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6
a0hUTUxEb2N1bWVudE1hcmtlckluZGV4LCBtYXJrZXIpOworICAgICAgICAgICAgcmVzdWx0LT5T
ZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprSFRNTERvY3VtZW50U2hhZG93SW5kZXgsIG1hcmtl
cik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBBIEpT
IG9iamVjdCBvZiB0eXBlIEV2ZW50VGFyZ2V0IGNhbiBvbmx5IGJlIHRoZSBmb2xsb3dpbmcgcG9z
c2libGUgdHlwZXM6CisvLyAxKSBFdmVudFRhcmdldE5vZGU7IDIpIERPTVdpbmRvdyAzKSBYTUxI
dHRwUmVxdWVzdDsgNCkgTWVzc2FnZVBvcnQ7CisvLyA1KSBYTUxIdHRwUmVxdWVzdFVwbG9hZAor
Ly8gY2hlY2sgRXZlbnRUYXJnZXQuaCBmb3IgbmV3IHR5cGUgY29udmVyc2lvbiBtZXRob2RzCit2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y29udmVydEV2ZW50VGFyZ2V0VG9WOE9iamVj
dChFdmVudFRhcmdldCogdGFyZ2V0KQoreworICAgIGlmICghdGFyZ2V0KQorICAgICAgICByZXR1
cm4gdjg6Ok51bGwoKTsKKworI2lmIEVOQUJMRShTVkcpCisgICAgU1ZHRWxlbWVudEluc3RhbmNl
KiBpbnN0YW5jZSA9IHRhcmdldC0+dG9TVkdFbGVtZW50SW5zdGFuY2UoKTsKKyAgICBpZiAoaW5z
dGFuY2UpCisgICAgICAgIHJldHVybiBjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNW
R0VMRU1FTlRJTlNUQU5DRSwgaW5zdGFuY2UpOworI2VuZGlmCisKKyNpZiBFTkFCTEUoV09SS0VS
UykKKyAgICBXb3JrZXIqIHdvcmtlciA9IHRhcmdldC0+dG9Xb3JrZXIoKTsKKyAgICBpZiAod29y
a2VyKQorICAgICAgICByZXR1cm4gY29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpXT1JL
RVIsIHdvcmtlcik7CisjZW5kaWYgLy8gV09SS0VSUworCisgICAgTm9kZSogbm9kZSA9IHRhcmdl
dC0+dG9Ob2RlKCk7CisgICAgaWYgKG5vZGUpCisgICAgICAgIHJldHVybiBjb252ZXJ0Tm9kZVRv
VjhPYmplY3Qobm9kZSk7CisKKyAgICBpZiAoRE9NV2luZG93KiBkb21XaW5kb3cgPSB0YXJnZXQt
PnRvRE9NV2luZG93KCkpCisgICAgICAgIHJldHVybiBjb252ZXJ0VG9WOE9iamVjdChWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVywgZG9tV2luZG93KTsKKworICAgIC8vIFhNTEh0dHBSZXF1ZXN0IGlz
IGNyZWF0ZWQgd2l0aGluIGl0cyBKUyBjb3VudGVycGFydC4KKyAgICBYTUxIdHRwUmVxdWVzdCog
eG1sSHR0cFJlcXVlc3QgPSB0YXJnZXQtPnRvWE1MSHR0cFJlcXVlc3QoKTsKKyAgICBpZiAoeG1s
SHR0cFJlcXVlc3QpIHsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0g
Z2V0QWN0aXZlRE9NT2JqZWN0TWFwKCkuZ2V0KHhtbEh0dHBSZXF1ZXN0KTsKKyAgICAgICAgQVNT
RVJUKCF3cmFwcGVyLklzRW1wdHkoKSk7CisgICAgICAgIHJldHVybiB3cmFwcGVyOworICAgIH0K
KworICAgIC8vIE1lc3NhZ2VQb3J0IGlzIGNyZWF0ZWQgd2l0aGluIGl0cyBKUyBjb3VudGVycGFy
dAorICAgIE1lc3NhZ2VQb3J0KiBwb3J0ID0gdGFyZ2V0LT50b01lc3NhZ2VQb3J0KCk7CisgICAg
aWYgKHBvcnQpIHsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZ2V0
QWN0aXZlRE9NT2JqZWN0TWFwKCkuZ2V0KHBvcnQpOworICAgICAgICBBU1NFUlQoIXdyYXBwZXIu
SXNFbXB0eSgpKTsKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisgICAgfQorCisgICAgWE1MSHR0
cFJlcXVlc3RVcGxvYWQqIHVwbG9hZCA9IHRhcmdldC0+dG9YTUxIdHRwUmVxdWVzdFVwbG9hZCgp
OworICAgIGlmICh1cGxvYWQpIHsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFw
cGVyID0gZ2V0RE9NT2JqZWN0TWFwKCkuZ2V0KHVwbG9hZCk7CisgICAgICAgIEFTU0VSVCghd3Jh
cHBlci5Jc0VtcHR5KCkpOworICAgICAgICByZXR1cm4gd3JhcHBlcjsKKyAgICB9CisKKyAgICBB
U1NFUlQoMCk7CisgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7Cit9CisKK3Y4
OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpjb252ZXJ0RXZlbnRMaXN0ZW5lclRvVjhPYmpl
Y3QoRXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpCit7CisgICAgaWYgKCFsaXN0ZW5lcikKKyAgICAg
ICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICAvLyBGSVhNRTogY2FuIGEgdXNlciB0YWtlIGEg
bGF6eSBldmVudCBsaXN0ZW5lciBhbmQgc2V0IHRvIG90aGVyIHBsYWNlcz8KKyAgICBWOEFic3Ry
YWN0RXZlbnRMaXN0ZW5lciogdjhsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4QWJzdHJhY3RFdmVu
dExpc3RlbmVyKj4obGlzdGVuZXIpOworICAgIHJldHVybiB2OGxpc3RlbmVyLT5nZXRMaXN0ZW5l
ck9iamVjdCgpOworfQorCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y29udmVydERP
TUltcGxlbWVudGF0aW9uVG9WOE9iamVjdChET01JbXBsZW1lbnRhdGlvbiogaW1wbCkKK3sKKyAg
ICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJlc3VsdCA9IGluc3RhbnRpYXRlVjhPYmplY3QoVjhD
bGFzc0luZGV4OjpET01JTVBMRU1FTlRBVElPTiwgVjhDbGFzc0luZGV4OjpET01JTVBMRU1FTlRB
VElPTiwgaW1wbCk7CisgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gSWYg
dGhlIGluc3RhbnRpYXRpb24gZmFpbGVkLCB3ZSBpZ25vcmUgaXQgYW5kIHJldHVybiBudWxsIGlu
c3RlYWQKKyAgICAgICAgLy8gb2YgcmV0dXJuaW5nIGFuIGVtcHR5IGhhbmRsZS4KKyAgICAgICAg
cmV0dXJuIHY4OjpOdWxsKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Y4OjpI
YW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpjb252ZXJ0U3R5bGVTaGVldFRvVjhPYmplY3QoU3R5
bGVTaGVldCogc2hlZXQpCit7CisgICAgaWYgKCFzaGVldCkKKyAgICAgICAgcmV0dXJuIHY4OjpO
dWxsKCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRET01PYmpl
Y3RNYXAoKS5nZXQoc2hlZXQpOworICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiB3cmFwcGVyOworCisgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUg
PSBWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVQ7CisgICAgaWYgKHNoZWV0LT5pc0NTU1N0eWxlU2hl
ZXQoKSkKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q1NTU1RZTEVTSEVFVDsKKworICAg
IHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gcmVzdWx0ID0gaW5zdGFudGlhdGVWOE9iamVjdCh0eXBl
LCBWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVQsIHNoZWV0KTsKKyAgICBpZiAoIXJlc3VsdC5Jc0Vt
cHR5KCkpIHsKKyAgICAgICAgLy8gT25seSB1cGRhdGUgdGhlIERPTSBvYmplY3QgbWFwIGlmIHRo
ZSByZXN1bHQgaXMgbm9uLWVtcHR5LgorICAgICAgICBzaGVldC0+cmVmKCk7CisgICAgICAgIHNl
dEpTV3JhcHBlckZvckRPTU9iamVjdChzaGVldCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46
Ok5ldyhyZXN1bHQpKTsKKyAgICB9CisKKyAgICAvLyBBZGQgYSBoaWRkZW4gcmVmZXJlbmNlIGZy
b20gc3R5bGVzaGVldCBvYmplY3QgdG8gaXRzIG93bmVyIG5vZGUuCisgICAgTm9kZSogb3duZXJO
b2RlID0gc2hlZXQtPm93bmVyTm9kZSgpOworICAgIGlmIChvd25lck5vZGUpIHsKKyAgICAgICAg
djg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvd25lciA9IHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNh
c3QoY29udmVydE5vZGVUb1Y4T2JqZWN0KG93bmVyTm9kZSkpOworICAgICAgICByZXN1bHQtPlNl
dEludGVybmFsRmllbGQoVjhDdXN0b206OmtTdHlsZVNoZWV0T3duZXJOb2RlSW5kZXgsIG93bmVy
KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gVjhQcm94eTo6Y29udmVydENTU1ZhbHVlVG9WOE9iamVjdChDU1NWYWx1ZSogdmFsdWUpCit7
CisgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICB2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRET01PYmplY3RNYXAoKS5nZXQodmFsdWUp
OworICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB3cmFwcGVyOwor
CisgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGU7CisKKyAgICBpZiAodmFsdWUt
PmlzV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUoKSkKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRl
eDo6V0VCS0lUQ1NTVFJBTlNGT1JNVkFMVUU7CisgICAgZWxzZSBpZiAodmFsdWUtPmlzVmFsdWVM
aXN0KCkpCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU1ZBTFVFTElTVDsKKyAgICBl
bHNlIGlmICh2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAgICB0eXBlID0gVjhDbGFz
c0luZGV4OjpDU1NQUklNSVRJVkVWQUxVRTsKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGVsc2UgaWYg
KHZhbHVlLT5pc1NWR1BhaW50KCkpCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlNWR1BB
SU5UOworICAgIGVsc2UgaWYgKHZhbHVlLT5pc1NWR0NvbG9yKCkpCisgICAgICAgIHR5cGUgPSBW
OENsYXNzSW5kZXg6OlNWR0NPTE9SOworI2VuZGlmCisgICAgZWxzZQorICAgICAgICB0eXBlID0g
VjhDbGFzc0luZGV4OjpDU1NWQUxVRTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gcmVz
dWx0ID0gaW5zdGFudGlhdGVWOE9iamVjdCh0eXBlLCBWOENsYXNzSW5kZXg6OkNTU1ZBTFVFLCB2
YWx1ZSk7CisgICAgaWYgKCFyZXN1bHQuSXNFbXB0eSgpKSB7CisgICAgICAgIC8vIE9ubHkgdXBk
YXRlIHRoZSBET00gb2JqZWN0IG1hcCBpZiB0aGUgcmVzdWx0IGlzIG5vbi1lbXB0eS4KKyAgICAg
ICAgdmFsdWUtPnJlZigpOworICAgICAgICBzZXRKU1dyYXBwZXJGb3JET01PYmplY3QodmFsdWUs
IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcocmVzdWx0KSk7CisgICAgfQorCisgICAg
cmV0dXJuIHJlc3VsdDsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6OmNvbnZl
cnRDU1NSdWxlVG9WOE9iamVjdChDU1NSdWxlKiBydWxlKQoreworICAgIGlmICghcnVsZSkgCisg
ICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3
cmFwcGVyID0gZ2V0RE9NT2JqZWN0TWFwKCkuZ2V0KHJ1bGUpOworICAgIGlmICghd3JhcHBlci5J
c0VtcHR5KCkpCisgICAgICAgIHJldHVybiB3cmFwcGVyOworCisgICAgVjhDbGFzc0luZGV4OjpW
OFdyYXBwZXJUeXBlIHR5cGU7CisKKyAgICBzd2l0Y2ggKHJ1bGUtPnR5cGUoKSkgeworICAgIGNh
c2UgQ1NTUnVsZTo6U1RZTEVfUlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q1NT
U1RZTEVSVUxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1J1bGU6OkNIQVJTRVRfUlVM
RToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q1NTQ0hBUlNFVFJVTEU7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgQ1NTUnVsZTo6SU1QT1JUX1JVTEU6CisgICAgICAgIHR5cGUgPSBW
OENsYXNzSW5kZXg6OkNTU0lNUE9SVFJVTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NT
UnVsZTo6TUVESUFfUlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q1NTTUVESUFS
VUxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1J1bGU6OkZPTlRfRkFDRV9SVUxFOgor
ICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDU1NGT05URkFDRVJVTEU7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgQ1NTUnVsZTo6UEFHRV9SVUxFOgorICAgICAgICB0eXBlID0gVjhDbGFz
c0luZGV4OjpDU1NQQUdFUlVMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NSdWxlOjpW
QVJJQUJMRVNfUlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q1NTVkFSSUFCTEVT
UlVMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NSdWxlOjpXRUJLSVRfS0VZRlJBTUVf
UlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6V0VCS0lUQ1NTS0VZRlJBTUVSVUxF
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1J1bGU6OldFQktJVF9LRVlGUkFNRVNfUlVM
RToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6V0VCS0lUQ1NTS0VZRlJBTUVTUlVMRTsK
KyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogIC8vIENTU1J1bGU6OlVOS05PV05fUlVMRQor
ICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDU1NSVUxFOworICAgICAgICBicmVhazsKKyAg
ICB9CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJlc3VsdCA9IGluc3RhbnRpYXRlVjhP
YmplY3QodHlwZSwgVjhDbGFzc0luZGV4OjpDU1NSVUxFLCBydWxlKTsKKyAgICBpZiAoIXJlc3Vs
dC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gT25seSB1cGRhdGUgdGhlIERPTSBvYmplY3QgbWFw
IGlmIHRoZSByZXN1bHQgaXMgbm9uLWVtcHR5LgorICAgICAgICBydWxlLT5yZWYoKTsKKyAgICAg
ICAgc2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KHJ1bGUsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmpl
Y3Q+OjpOZXcocmVzdWx0KSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Y4OjpI
YW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpjb252ZXJ0V2luZG93VG9WOE9iamVjdChET01XaW5k
b3cqIHdpbmRvdykKK3sKKyAgICBpZiAoIXdpbmRvdykKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxs
KCk7CisgICAgLy8gSW5pdGlhbGl6ZXMgZW52aXJvbm1lbnQgb2YgYSBmcmFtZSwgYW5kIHJldHVy
biB0aGUgZ2xvYmFsIG9iamVjdAorICAgIC8vIG9mIHRoZSBmcmFtZS4KKyAgICBGcmFtZSogZnJh
bWUgPSB3aW5kb3ctPmZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIHY4
OjpIYW5kbGU8djg6Ok9iamVjdD4oKTsKKworICAgIC8vIFNwZWNpYWwgY2FzZTogQmVjYXVzZSBv
ZiBldmFsdWF0ZUluTmV3Q29udGV4dCgpIG9uZSBET01XaW5kb3cgY2FuIGhhdmUKKyAgICAvLyBt
dWx0aXBsZSBjb250ZXh0cyBhbmQgbXVsdGlwbGUgZ2xvYmFsIG9iamVjdHMgYXNzb2NpYXRlZCB3
aXRoIGl0LiBXaGVuCisgICAgLy8gY29kZSBydW5uaW5nIGluIG9uZSBvZiB0aG9zZSBjb250ZXh0
cyBhY2Nlc3NlcyB0aGUgd2luZG93IG9iamVjdCwgd2UKKyAgICAvLyB3YW50IHRvIHJldHVybiB0
aGUgZ2xvYmFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhhdCBjb250ZXh0LCBub3QKKyAgICAv
LyBuZWNlc3NhcmlseSB0aGUgZmlyc3QgZ2xvYmFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhh
dCBET01XaW5kb3cuCisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY3VycmVudENvbnRleHQg
PSB2ODo6Q29udGV4dDo6R2V0Q3VycmVudCgpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
Y3VycmVudEdsb2JhbCA9IGN1cnJlbnRDb250ZXh0LT5HbG9iYWwoKTsKKyAgICB2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+IHdpbmRvd1dyYXBwZXIgPSBsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRl
eDo6RE9NV0lORE9XLCBjdXJyZW50R2xvYmFsKTsKKyAgICBpZiAoIXdpbmRvd1dyYXBwZXIuSXNF
bXB0eSgpKSB7CisgICAgICAgIGlmIChjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPERPTVdpbmRv
dz4od2luZG93V3JhcHBlcikgPT0gd2luZG93KQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRH
bG9iYWw7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGdsb2JhbCBvYmpl
Y3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnJhbWUuCisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4
dD4gdjhDb250ZXh0ID0gY29udGV4dChmcmFtZSk7CisgICAgaWYgKHY4Q29udGV4dC5Jc0VtcHR5
KCkpCisgICAgICAgIHJldHVybiB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+KCk7CisKKyAgICB2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+IGdsb2JhbCA9IHY4Q29udGV4dC0+R2xvYmFsKCk7CisgICAgQVNT
RVJUKCFnbG9iYWwuSXNFbXB0eSgpKTsKKyAgICByZXR1cm4gZ2xvYmFsOworfQorCit2b2lkIFY4
UHJveHk6OmJpbmRKc09iamVjdFRvV2luZG93KEZyYW1lKiBmcmFtZSwgY29uc3QgY2hhciogbmFt
ZSwgaW50IHR5cGUsIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGRlc2NyaXB0b3Is
IHZvaWQqIGltcGwpCit7CisgICAgLy8gR2V0IGVudmlyb25tZW50LgorICAgIHY4OjpIYW5kbGU8
djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQoZnJhbWUpOworICAgIGlm
ICh2OENvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm47ICAvLyBKUyBub3QgZW5hYmxl
ZC4KKworICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZSh2OENvbnRleHQpOworICAgIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4gaW5zdGFuY2UgPSBkZXNjcmlwdG9yLT5HZXRGdW5jdGlvbigpOwor
ICAgIHNldERPTVdyYXBwZXIoaW5zdGFuY2UsIHR5cGUsIGltcGwpOworCisgICAgdjg6OkhhbmRs
ZTx2ODo6T2JqZWN0PiBnbG9iYWwgPSB2OENvbnRleHQtPkdsb2JhbCgpOworICAgIGdsb2JhbC0+
U2V0KHY4OjpTdHJpbmc6Ok5ldyhuYW1lKSwgaW5zdGFuY2UpOworfQorCit2b2lkIFY4UHJveHk6
OnByb2Nlc3NDb25zb2xlTWVzc2FnZXMoKQoreworICAgIENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6
cHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpOworfQorCisvLyBDcmVhdGUgdGhlIHV0aWxpdHkgY29u
dGV4dCBmb3IgaG9sZGluZyBKYXZhU2NyaXB0IGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkKKy8v
IHdoaWNoIGFyZSBub3QgdmlzaWJsZSB0byBKYXZhU2NyaXB0IGV4ZWN1dGluZyBvbiB0aGUgcGFn
ZS4KK3ZvaWQgVjhQcm94eTo6Y3JlYXRlVXRpbGl0eUNvbnRleHQoKQoreworICAgIEFTU0VSVCht
X3V0aWxpdHlDb250ZXh0LklzRW1wdHkoKSk7CisKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7
CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+IGdsb2JhbFRlbXBsYXRlID0gdjg6
Ok9iamVjdFRlbXBsYXRlOjpOZXcoKTsKKyAgICBtX3V0aWxpdHlDb250ZXh0ID0gdjg6OkNvbnRl
eHQ6Ok5ldygwLCBnbG9iYWxUZW1wbGF0ZSk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRl
eHRTY29wZShtX3V0aWxpdHlDb250ZXh0KTsKKworICAgIC8vIENvbXBpbGUgSmF2YVNjcmlwdCBm
dW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgc291cmNlIGxpbmUgb2YgdGhlIHRvcAorICAgIC8v
IEphdmFTY3JpcHQgc3RhY2sgZnJhbWUuCisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBj
aGFyKiwgZnJhbWVTb3VyY2VMaW5lU291cmNlLAorICAgICAgICAoImZ1bmN0aW9uIGZyYW1lU291
cmNlTGluZShleGVjX3N0YXRlKSB7IgorICAgICAgICAiICByZXR1cm4gZXhlY19zdGF0ZS5mcmFt
ZSgwKS5zb3VyY2VMaW5lKCk7IgorICAgICAgICAifSIpKTsKKyAgICB2ODo6U2NyaXB0OjpDb21w
aWxlKHY4OjpTdHJpbmc6Ok5ldyhmcmFtZVNvdXJjZUxpbmVTb3VyY2UpKS0+UnVuKCk7CisKKyAg
ICAvLyBDb21waWxlIEphdmFTY3JpcHQgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHNvdXJj
ZSBuYW1lIG9mIHRoZSB0b3AKKyAgICAvLyBKYXZhU2NyaXB0IHN0YWNrIGZyYW1lLgorICAgIERF
RklORV9TVEFUSUNfTE9DQUwoY29uc3QgY2hhciosIGZyYW1lU291cmNlTmFtZVNvdXJjZSwKKyAg
ICAgICAgKCJmdW5jdGlvbiBmcmFtZVNvdXJjZU5hbWUoZXhlY19zdGF0ZSkgeyIKKyAgICAgICAg
IiAgdmFyIGZyYW1lID0gZXhlY19zdGF0ZS5mcmFtZSgwKTsiCisgICAgICAgICIgIGlmIChmcmFt
ZS5mdW5jKCkucmVzb2x2ZWQoKSAmJiAiCisgICAgICAgICIgICAgICBmcmFtZS5mdW5jKCkuc2Ny
aXB0KCkgJiYgIgorICAgICAgICAiICAgICAgZnJhbWUuZnVuYygpLnNjcmlwdCgpLm5hbWUoKSkg
eyIKKyAgICAgICAgIiAgICByZXR1cm4gZnJhbWUuZnVuYygpLnNjcmlwdCgpLm5hbWUoKTsiCisg
ICAgICAgICIgIH0iCisgICAgICAgICJ9IikpOworICAgIHY4OjpTY3JpcHQ6OkNvbXBpbGUodjg6
OlN0cmluZzo6TmV3KGZyYW1lU291cmNlTmFtZVNvdXJjZSkpLT5SdW4oKTsKK30KKworaW50IFY4
UHJveHk6OnNvdXJjZUxpbmVOdW1iZXIoKQoreworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsK
KyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB2OFV0aWxpdHlDb250ZXh0ID0gVjhQcm94eTo6
dXRpbGl0eUNvbnRleHQoKTsKKyAgICBpZiAodjhVdGlsaXR5Q29udGV4dC5Jc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybiAwOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0U2NvcGUodjhV
dGlsaXR5Q29udGV4dCk7CisgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+IGZyYW1lU291cmNl
TGluZTsKKyAgICBmcmFtZVNvdXJjZUxpbmUgPSB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPjo6Q2Fz
dCh2OFV0aWxpdHlDb250ZXh0LT5HbG9iYWwoKS0+R2V0KHY4OjpTdHJpbmc6Ok5ldygiZnJhbWVT
b3VyY2VMaW5lIikpKTsKKyAgICBpZiAoZnJhbWVTb3VyY2VMaW5lLklzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJlc3VsdCA9IHY4OjpEZWJ1
Zzo6Q2FsbChmcmFtZVNvdXJjZUxpbmUpOworICAgIGlmIChyZXN1bHQuSXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcmVzdWx0LT5JbnQzMlZhbHVlKCk7Cit9CisKK1N0
cmluZyBWOFByb3h5Ojpzb3VyY2VOYW1lKCkKK3sKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7
CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gdjhVdGlsaXR5Q29udGV4dCA9IHV0aWxpdHlD
b250ZXh0KCk7CisgICAgaWYgKHY4VXRpbGl0eUNvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gU3RyaW5nKCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRTY29wZSh2OFV0
aWxpdHlDb250ZXh0KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4gZnJhbWVTb3VyY2VO
YW1lOworICAgIGZyYW1lU291cmNlTmFtZSA9IHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+OjpDYXN0
KHY4VXRpbGl0eUNvbnRleHQtPkdsb2JhbCgpLT5HZXQodjg6OlN0cmluZzo6TmV3KCJmcmFtZVNv
dXJjZU5hbWUiKSkpOworICAgIGlmIChmcmFtZVNvdXJjZU5hbWUuSXNFbXB0eSgpKSB7CisgICAg
ICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIFRvV2ViQ29yZVN0cmluZyh2
ODo6RGVidWc6OkNhbGwoZnJhbWVTb3VyY2VOYW1lKSk7Cit9CisKK3ZvaWQgVjhQcm94eTo6cmVn
aXN0ZXJFeHRlbnNpb24odjg6OkV4dGVuc2lvbiogZXh0ZW5zaW9uLCBjb25zdCBTdHJpbmcmIHNj
aGVtZVJlc3RyaWN0aW9uKQoreworICAgIHY4OjpSZWdpc3RlckV4dGVuc2lvbihleHRlbnNpb24p
OworICAgIFY4RXh0ZW5zaW9uSW5mbyBpbmZvID0ge3NjaGVtZVJlc3RyaWN0aW9uLCBleHRlbnNp
b259OworICAgIG1fZXh0ZW5zaW9ucy5wdXNoX2JhY2soaW5mbyk7Cit9CisKK2Jvb2wgVjhQcm94
eTo6c2V0Q29udGV4dERlYnVnSWQoaW50IGRlYnVnSWQpIHsKKyAgICBBU1NFUlQoZGVidWdJZCA+
IDApOworICAgIGlmIChtX2NvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIGlmICghbV9jb250ZXh0LT5HZXREYXRh
KCktPklzVW5kZWZpbmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gY29udGV4dERhdGEgPSB2ODo6T2JqZWN0OjpOZXcoKTsKKyAgICBjb250
ZXh0RGF0YS0+U2V0KHY4OjpTdHJpbmc6Ok5ldyhrQ29udGV4dERlYnVnRGF0YVR5cGUpLCB2ODo6
U3RyaW5nOjpOZXcoInBhZ2UiKSk7CisgICAgY29udGV4dERhdGEtPlNldCh2ODo6U3RyaW5nOjpO
ZXcoa0NvbnRleHREZWJ1Z0RhdGFWYWx1ZSksIHY4OjpJbnRlZ2VyOjpOZXcoZGVidWdJZCkpOwor
ICAgIG1fY29udGV4dC0+U2V0RGF0YShjb250ZXh0RGF0YSk7CisgICAgcmV0dXJuIHRydWU7Cit9
CisKK2ludCBWOFByb3h5Ojpjb250ZXh0RGVidWdJZCh2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBj
b250ZXh0KQoreworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKyAgICBpZiAoIWNvbnRleHQt
PkdldERhdGEoKS0+SXNPYmplY3QoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBkYXRhID0gY29udGV4dC0+R2V0RGF0YSgpLT5Ub09iamVjdCgpLT5HZXQo
IHY4OjpTdHJpbmc6Ok5ldyhrQ29udGV4dERlYnVnRGF0YVZhbHVlKSk7CisgICAgcmV0dXJuIGRh
dGEtPklzSW50MzIoKSA/IGRhdGEtPkludDMyVmFsdWUoKSA6IC0xOworfQorCit9ICAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9TY3JpcHRDb250cm9sbGVy
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjcmlwdENvbnRyb2xsZXIu
Y3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvU2NyaXB0Q29udHJv
bGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTcyLDE3ICs3MiwxNyBAQAogCiBib29sIFNjcmlw
dENvbnRyb2xsZXI6OmlzU2FmZVNjcmlwdChGcmFtZSogdGFyZ2V0KQogewotICAgIHJldHVybiBW
OFByb3h5OjpDYW5BY2Nlc3NGcmFtZSh0YXJnZXQsIHRydWUpOworICAgIHJldHVybiBWOFByb3h5
OjpjYW5BY2Nlc3NGcmFtZSh0YXJnZXQsIHRydWUpOwogfQogCiB2b2lkIFNjcmlwdENvbnRyb2xs
ZXI6OmdjUHJvdGVjdEpTV3JhcHBlcih2b2lkKiBkb21PYmplY3QpCiB7Ci0gICAgVjhQcm94eTo6
R0NQcm90ZWN0KGRvbU9iamVjdCk7CisgICAgVjhQcm94eTo6Z2NQcm90ZWN0KGRvbU9iamVjdCk7
CiB9CiAKIHZvaWQgU2NyaXB0Q29udHJvbGxlcjo6Z2NVbnByb3RlY3RKU1dyYXBwZXIodm9pZCog
ZG9tT2JqZWN0KQogewotICAgIFY4UHJveHk6OkdDVW5wcm90ZWN0KGRvbU9iamVjdCk7CisgICAg
VjhQcm94eTo6Z2NVbnByb3RlY3QoZG9tT2JqZWN0KTsKIH0KIAogU2NyaXB0Q29udHJvbGxlcjo6
U2NyaXB0Q29udHJvbGxlcihGcmFtZSogZnJhbWUpCkBAIC0xNDQsMTggKzE0NCwxOCBAQAogICAg
IFY4UHJveHkqIGFjdGl2ZVByb3h5ID0gYWN0aXZlRnJhbWUtPnNjcmlwdCgpLT5wcm94eSgpOwog
CiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpIYW5kbGU8djg6OkNv
bnRleHQ+IGNvbnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KGFjdGl2ZUZyYW1lKTsKKyAgICB2
ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KGFjdGl2
ZUZyYW1lKTsKICAgICAvLyBGSVhNRTogZmluZCBhbGwgY2FzZXMgY29udGV4dCBjYW4gYmUgZW1w
dHk6CiAgICAgLy8gIDEpIEpTIGlzIGRpc2FibGVkOwogICAgIC8vICAyKSBwYWdlIGlzIE5VTEw7
Ci0gICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgp
KQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShj
b250ZXh0KTsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUodjhDb250ZXh0KTsKIAotICAg
IHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsID0gY29udGV4dC0+R2xvYmFsKCk7CisgICAg
djg6OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwgPSB2OENvbnRleHQtPkdsb2JhbCgpOwogICAg
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiBqc0V2ZW50ID0gZ2xvYmFsLT5HZXQodjg6OlN0cmluZzo6
TmV3U3ltYm9sKCJldmVudCIpKTsKLSAgICBFdmVudCogZXZlbnQgPSBWOFByb3h5OjpUb05hdGl2
ZUV2ZW50KGpzRXZlbnQpOworICAgIEV2ZW50KiBldmVudCA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZUV2ZW50KGpzRXZlbnQpOwogCiAgICAgLy8gQmFzZWQgb24gY29kZSBmcm9tIGtqc19iaW5k
aW5ncy5jcHAuCiAgICAgLy8gTm90ZTogVGhpcyBpcyBtb3JlIGxpYmVyYWwgdGhhbiBGaXJlZm94
J3MgaW1wbGVtZW50YXRpb24uCkBAIC0xOTQsMTEgKzE5NCwxMSBAQAogICAgIH0KIAogICAgIHY4
OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKLSAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBj
b250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChtX3Byb3h5LT5mcmFtZSgpKTsKLSAgICBpZiAo
Y29udGV4dC5Jc0VtcHR5KCkpCisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gdjhDb250ZXh0
ID0gVjhQcm94eTo6Y29udGV4dChtX3Byb3h5LT5mcmFtZSgpKTsKKyAgICBpZiAodjhDb250ZXh0
LklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIFNjcmlwdFZhbHVlKCk7CiAKLSAgICB2ODo6Q29u
dGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3Bl
KHY4Q29udGV4dCk7CiAKICAgICBSZWZQdHI8RnJhbWU+IHByb3RlY3QobV9mcmFtZSk7CiAKQEAg
LTIxNiw3ICsyMTYsNyBAQAogCiB2b2lkIFNjcmlwdENvbnRyb2xsZXI6OnNldEV2ZW50SGFuZGxl
ckxpbmVOdW1iZXIoaW50IGxpbmVOdW1iZXIpCiB7Ci0gICAgbV9wcm94eS0+c2V0RXZlbnRIYW5k
bGVyTGluZW5vKGxpbmVOdW1iZXIpOworICAgIG1fcHJveHktPnNldEV2ZW50SGFuZGxlckxpbmVO
dW1iZXIobGluZU51bWJlcik7CiB9CiAKIHZvaWQgU2NyaXB0Q29udHJvbGxlcjo6ZmluaXNoZWRX
aXRoRXZlbnQoRXZlbnQqIGV2ZW50KQpAQCAtMjI5LDM0ICsyMjksMzQgQEAKIHsKICAgICB2ODo6
SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CiAKLSAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBj
b250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChmcmFtZSk7Ci0gICAgaWYgKGNvbnRleHQuSXNF
bXB0eSgpKQorICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9IFY4UHJveHk6
OmNvbnRleHQoZnJhbWUpOworICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICBy
ZXR1cm47CiAKLSAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisgICAgdjg6
OkNvbnRleHQ6OlNjb3BlIHNjb3BlKHY4Q29udGV4dCk7CiAKICAgICB2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+IHZhbHVlID0gQ3JlYXRlVjhPYmplY3RGb3JOUE9iamVjdChvYmplY3QsIDApOwogCiAg
ICAgLy8gQXR0YWNoIHRvIHRoZSBnbG9iYWwgb2JqZWN0LgotICAgIHY4OjpIYW5kbGU8djg6Ok9i
amVjdD4gZ2xvYmFsID0gY29udGV4dC0+R2xvYmFsKCk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0PiBnbG9iYWwgPSB2OENvbnRleHQtPkdsb2JhbCgpOwogICAgIGdsb2JhbC0+U2V0KHY4U3Ry
aW5nKGtleSksIHZhbHVlKTsKIH0KIAogdm9pZCBTY3JpcHRDb250cm9sbGVyOjpjb2xsZWN0R2Fy
YmFnZSgpCiB7CiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpIYW5k
bGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KG1fcHJveHktPmZy
YW1lKCkpOwotICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICB2ODo6SGFuZGxlPHY4OjpD
b250ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KG1fcHJveHktPmZyYW1lKCkpOwor
ICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKLSAgICB2ODo6
Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNj
b3BlKHY4Q29udGV4dCk7CiAKICAgICBtX3Byb3h5LT5ldmFsdWF0ZShTY3JpcHRTb3VyY2VDb2Rl
KCJpZiAod2luZG93LmdjKSB2b2lkKGdjKCkpOyIpLCAwKTsKIH0KIAogYm9vbCBTY3JpcHRDb250
cm9sbGVyOjpoYXZlSW50ZXJwcmV0ZXIoKSBjb25zdAogewotICAgIHJldHVybiBtX3Byb3h5LT5D
b250ZXh0SW5pdGlhbGl6ZWQoKTsKKyAgICByZXR1cm4gbV9wcm94eS0+aXNDb250ZXh0SW5pdGlh
bGl6ZWQoKTsKIH0KIAogYm9vbCBTY3JpcHRDb250cm9sbGVyOjppc0VuYWJsZWQoKSBjb25zdApA
QCAtMzI2LDEzICszMjYsMTMgQEAKIHN0YXRpYyBOUE9iamVjdCogY3JlYXRlU2NyaXB0T2JqZWN0
KEZyYW1lKiBmcmFtZSkKIHsKICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7Ci0gICAg
djg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQoZnJh
bWUpOwotICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250
ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KGZyYW1lKTsKKyAgICBpZiAodjhDb250
ZXh0LklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIGNyZWF0ZU5vU2NyaXB0T2JqZWN0KCk7CiAK
LSAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6
OlNjb3BlIHNjb3BlKHY4Q29udGV4dCk7CiAgICAgRE9NV2luZG93KiB3aW5kb3cgPSBmcmFtZS0+
ZG9tV2luZG93KCk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGdsb2JhbCA9IFY4UHJveHk6
OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIHdpbmRvdyk7CisgICAgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IGdsb2JhbCA9IFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCB3aW5kb3cpOwogICAgIEFTU0VSVChnbG9iYWwtPklzT2JqZWN0
KCkpOwogICAgIHJldHVybiBucENyZWF0ZVY4U2NyaXB0T2JqZWN0KDAsIHY4OjpIYW5kbGU8djg6
Ok9iamVjdD46OkNhc3QoZ2xvYmFsKSwgd2luZG93KTsKIH0KQEAgLTM2MywxMyArMzYzLDEzIEBA
CiAgICAgICAgIHJldHVybiBjcmVhdGVOb1NjcmlwdE9iamVjdCgpOwogCiAgICAgdjg6OkhhbmRs
ZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQg
PSBWOFByb3h5OjpHZXRDb250ZXh0KG1fZnJhbWUpOwotICAgIGlmIChjb250ZXh0LklzRW1wdHko
KSkKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250
ZXh0KG1fZnJhbWUpOworICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1
cm4gY3JlYXRlTm9TY3JpcHRPYmplY3QoKTsKLSAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUo
Y29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKHY4Q29udGV4dCk7CiAKICAg
ICBET01XaW5kb3cqIHdpbmRvdyA9IG1fZnJhbWUtPmRvbVdpbmRvdygpOwotICAgIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiB2OHBsdWdpbiA9IFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4
OjpIVE1MRU1CRURFTEVNRU5ULCBwbHVnaW4pOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2
OHBsdWdpbiA9IFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6SFRNTEVN
QkVERUxFTUVOVCwgcGx1Z2luKTsKICAgICBpZiAoIXY4cGx1Z2luLT5Jc09iamVjdCgpKQogICAg
ICAgICByZXR1cm4gY3JlYXRlTm9TY3JpcHRPYmplY3QoKTsKIApJbmRleDogV2ViQ29yZS9iaW5k
aW5ncy92OC9WOENvbGxlY3Rpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mv
djgvVjhDb2xsZWN0aW9uLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdz
L3Y4L1Y4Q29sbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDE0ICs0OCwxNCBAQAog
CiAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdmFsdWUgaXMgYW4gSFRNTE9wdGlvbkVsZW1lbnQuICBJ
ZiBub3QsIHRocm93IGEgVFlQRV9NSVNNQVRDSF9FUlIgRE9NRXhjZXB0aW9uLgogICAgIGlmICgh
VjhIVE1MT3B0aW9uRWxlbWVudDo6SGFzSW5zdGFuY2UodmFsdWUpKSB7Ci0gICAgICAgIFY4UHJv
eHk6OlNldERPTUV4Y2VwdGlvbihUWVBFX01JU01BVENIX0VSUik7CisgICAgICAgIFY4UHJveHk6
OnNldERPTUV4Y2VwdGlvbihUWVBFX01JU01BVENIX0VSUik7CiAgICAgICAgIHJldHVybiB2YWx1
ZTsKICAgICB9CiAKLSAgICBIVE1MT3B0aW9uRWxlbWVudCogZWxlbWVudCA9IFY4UHJveHk6OkRP
TVdyYXBwZXJUb05vZGU8SFRNTE9wdGlvbkVsZW1lbnQ+KHY4OjpIYW5kbGU8djg6Ok9iamVjdD46
OkNhc3QodmFsdWUpKTsKKyAgICBIVE1MT3B0aW9uRWxlbWVudCogZWxlbWVudCA9IFY4UHJveHk6
OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxPcHRpb25FbGVtZW50Pih2ODo6SGFuZGxlPHY4
OjpPYmplY3Q+OjpDYXN0KHZhbHVlKSk7CiAgICAgYmFzZS0+c2V0T3B0aW9uKGluZGV4LCBlbGVt
ZW50LCBlYyk7CiAKLSAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOworICAgIFY4UHJv
eHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgcmV0dXJuIHZhbHVlOwogfQogCkluZGV4OiBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4Tm9kZUZpbHRlckNvbmRpdGlvbi5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOE5vZGVGaWx0ZXJDb25kaXRpb24uY3BwCShyZXZpc2lv
biA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhOb2RlRmlsdGVyQ29uZGl0aW9uLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNDQsMTQgKzQ0LDE0IEBACiAgICAgOiBtX2ZpbHRlcih2ODo6
UGVyc2lzdGVudDx2ODo6VmFsdWU+OjpOZXcoZmlsdGVyKSkKIHsKICNpZm5kZWYgTkRFQlVHCi0g
ICAgVjhQcm94eTo6UmVnaXN0ZXJHbG9iYWxIYW5kbGUoTk9ERV9GSUxURVIsIHRoaXMsIG1fZmls
dGVyKTsKKyAgICBWOFByb3h5OjpyZWdpc3Rlckdsb2JhbEhhbmRsZShOT0RFX0ZJTFRFUiwgdGhp
cywgbV9maWx0ZXIpOwogI2VuZGlmCiB9CiAKIFY4Tm9kZUZpbHRlckNvbmRpdGlvbjo6flY4Tm9k
ZUZpbHRlckNvbmRpdGlvbigpCiB7CiAjaWZuZGVmIE5ERUJVRwotICAgIFY4UHJveHk6OlVucmVn
aXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9maWx0ZXIpOworICAgIFY4UHJveHk6OnVucmVnaXN0
ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9maWx0ZXIpOwogI2VuZGlmCiAgICAgbV9maWx0ZXIuRGlz
cG9zZSgpOwogICAgIG1fZmlsdGVyLkNsZWFyKCk7CkBAIC02OSwxMiArNjksMTIgQEAKICAgICB2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpDb250ZXh0OjpHZXRDdXJyZW50KCkt
Pkdsb2JhbCgpOwogICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiBjYWxsYmFjayA9IHY4OjpI
YW5kbGU8djg6OkZ1bmN0aW9uPjo6Q2FzdChtX2ZpbHRlcik7CiAgICAgT3duQXJyYXlQdHI8djg6
OkhhbmRsZTx2ODo6VmFsdWU+ID4gYXJncyhuZXcgdjg6OkhhbmRsZTx2ODo6VmFsdWU+WzFdKTsK
LSAgICBhcmdzWzBdID0gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok5PREUsIG5v
ZGUpOworICAgIGFyZ3NbMF0gPSBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5k
ZXg6Ok5PREUsIG5vZGUpOwogCiAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2
ZSgpOwogICAgIEFTU0VSVChwcm94eSk7CiAKLSAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmVz
dWx0ID0gcHJveHktPkNhbGxGdW5jdGlvbihjYWxsYmFjaywgb2JqZWN0LCAxLCBhcmdzLmdldCgp
KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmVzdWx0ID0gcHJveHktPmNhbGxGdW5jdGlv
bihjYWxsYmFjaywgb2JqZWN0LCAxLCBhcmdzLmdldCgpKTsKIAogICAgIGlmIChleGNlcHRpb25D
YXRjaGVyLkhhc0NhdWdodCgpKSB7CiAgICAgICAgIHN0YXRlLT5zZXRFeGNlcHRpb24oZXhjZXB0
aW9uQ2F0Y2hlci5FeGNlcHRpb24oKSk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4SGVs
cGVycy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOEhlbHBlcnMuY3Bw
CShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhIZWxwZXJzLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNDAsMTMgKzQwLDEzIEBACiAKIHZvaWQgd3JhcE5QT2JqZWN0KHY4
OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqZWN0LCBOUE9iamVjdCogbnBPYmplY3QpCiB7Ci0gICAg
VjhQcm94eTo6U2V0RE9NV3JhcHBlcihvYmplY3QsIFY4Q2xhc3NJbmRleDo6TlBPQkpFQ1QsIG5w
T2JqZWN0KTsKKyAgICBWOFByb3h5OjpzZXRET01XcmFwcGVyKG9iamVjdCwgVjhDbGFzc0luZGV4
OjpOUE9CSkVDVCwgbnBPYmplY3QpOwogfQogCiB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHRvVjhD
b250ZXh0KE5QUCBucHAsIE5QT2JqZWN0KiBucE9iamVjdCkKIHsKICAgICBWOE5QT2JqZWN0KiBv
YmplY3QgPSByZWludGVycHJldF9jYXN0PFY4TlBPYmplY3QqPihucE9iamVjdCk7Ci0gICAgcmV0
dXJuIFY4UHJveHk6OkdldENvbnRleHQob2JqZWN0LT5yb290T2JqZWN0LT5mcmFtZSgpKTsKKyAg
ICByZXR1cm4gVjhQcm94eTo6Y29udGV4dChvYmplY3QtPnJvb3RPYmplY3QtPmZyYW1lKCkpOwog
fQogCiBWOFByb3h5KiB0b1Y4UHJveHkoTlBPYmplY3QqIG5wT2JqZWN0KQpJbmRleDogV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdlQ2hhbm5lbENvbnN0cnVjdG9yLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VDaGFubmVsQ29u
c3RydWN0b3IuY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4TWVzc2FnZUNoYW5uZWxDb25zdHJ1Y3Rvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0
LDcgKzQ0LDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChNZXNzYWdlQ2hhbm5lbENvbnN0cnVjdG9y
KQogewogICAgIElOQ19TVEFUUygiRE9NLk1lc3NhZ2VDaGFubmVsLkNvbnN0cnVjdG9yIik7Ci0g
ICAgLy8gRklYTUU6IFRoZSBsb2dpYyBoZXJlIGlzIGFsbW9zdCBleGFjdCBkdXBsaWNhdGUgb2Yg
Vjg6OkNvbnN0cnVjdERPTU9iamVjdC4KKyAgICAvLyBGSVhNRTogVGhlIGxvZ2ljIGhlcmUgaXMg
YWxtb3N0IGV4YWN0IGR1cGxpY2F0ZSBvZiBWODo6Y29uc3RydWN0RE9NT2JqZWN0LgogICAgIC8v
IENvbnNpZGVyIHJlZmFjdG9yaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGlvbi4KICAgICBpZiAoIWFy
Z3MuSXNDb25zdHJ1Y3RDYWxsKCkpCiAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCJET00gb2Jq
ZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4iKTsKQEAgLTU3
LDcgKzU3LDcgQEAKICAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBmcmFtZS0+ZG9jdW1lbnQoKTsK
IAogICAgIC8vIE5vdGU6IGl0J3MgT0sgdG8gbGV0IHRoaXMgUmVmUHRyIGdvIG91dCBvZiBzY29w
ZSBiZWNhdXNlIHdlIGFsc28gY2FsbAotICAgIC8vIFNldERPTVdyYXBwZXIoKSwgd2hpY2ggZWZm
ZWN0aXZlbHkgaG9sZHMgYSByZWZlcmVuY2UgdG8gb2JqLgorICAgIC8vIHNldERPTVdyYXBwZXIo
KSwgd2hpY2ggZWZmZWN0aXZlbHkgaG9sZHMgYSByZWZlcmVuY2UgdG8gb2JqLgogICAgIFJlZlB0
cjxNZXNzYWdlQ2hhbm5lbD4gb2JqID0gTWVzc2FnZUNoYW5uZWw6OmNyZWF0ZShkb2N1bWVudCk7
CiAKICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gbWVzc2FnZUNoYW5uZWwgPSBhcmdzLkhvbGRl
cigpOwpAQCAtNjUsMTEgKzY1LDExIEBACiAgICAgLy8gQ3JlYXRlIHJlZmVyZW5jZXMgZnJvbSB0
aGUgTWVzc2FnZUNoYW5uZWwgd3JhcHBlciB0byB0aGUgdHdvCiAgICAgLy8gTWVzc2FnZVBvcnQg
d3JhcHBlcnMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIE1lc3NhZ2VQb3J0IHdyYXBwZXJzCiAgICAg
Ly8gc3RheSBhbGl2ZSBhcyBsb25nIGFzIHRoZSBNZXNzYWdlQ2hhbm5lbCB3cmFwcGVyIGlzIGFy
b3VuZC4KLSAgICBtZXNzYWdlQ2hhbm5lbC0+U2V0SW50ZXJuYWxGaWVsZChrTWVzc2FnZUNoYW5u
ZWxQb3J0MUluZGV4LCBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBP
UlQsIG9iai0+cG9ydDEoKSkpOwotICAgIG1lc3NhZ2VDaGFubmVsLT5TZXRJbnRlcm5hbEZpZWxk
KGtNZXNzYWdlQ2hhbm5lbFBvcnQySW5kZXgsIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0lu
ZGV4OjpNRVNTQUdFUE9SVCwgb2JqLT5wb3J0MigpKSk7CisgICAgbWVzc2FnZUNoYW5uZWwtPlNl
dEludGVybmFsRmllbGQoa01lc3NhZ2VDaGFubmVsUG9ydDFJbmRleCwgVjhQcm94eTo6Y29udmVy
dFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgb2JqLT5wb3J0MSgpKSk7Cisg
ICAgbWVzc2FnZUNoYW5uZWwtPlNldEludGVybmFsRmllbGQoa01lc3NhZ2VDaGFubmVsUG9ydDJJ
bmRleCwgVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9S
VCwgb2JqLT5wb3J0MigpKSk7CiAKICAgICAvLyBTZXR1cCB0aGUgc3RhbmRhcmQgd3JhcHBlciBv
YmplY3QgaW50ZXJuYWwgZmllbGRzLgotICAgIFY4UHJveHk6OlNldERPTVdyYXBwZXIobWVzc2Fn
ZUNoYW5uZWwsIFY4Q2xhc3NJbmRleDo6TUVTU0FHRUNIQU5ORUwsIG9iai5nZXQoKSk7CisgICAg
VjhQcm94eTo6c2V0RE9NV3JhcHBlcihtZXNzYWdlQ2hhbm5lbCwgVjhDbGFzc0luZGV4OjpNRVNT
QUdFQ0hBTk5FTCwgb2JqLmdldCgpKTsKICAgICByZXR1cm4gdG9WOChvYmoucmVsZWFzZSgpLCBt
ZXNzYWdlQ2hhbm5lbCk7CiB9CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
SFRNTEZyYW1lRWxlbWVudEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhIVE1MRnJhbWVFbGVtZW50Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUp
CisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxGcmFtZUVsZW1lbnRDdXN0b20u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICszOSw3IEBACiAKIEFDQ0VTU09SX1NFVFRFUihI
VE1MRnJhbWVFbGVtZW50U3JjKQogewotICAgIEhUTUxGcmFtZUVsZW1lbnQqIGZyYW1lID0gVjhQ
cm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MRnJhbWVFbGVtZW50PihpbmZvLkhvbGRlcigpKTsK
KyAgICBIVE1MRnJhbWVFbGVtZW50KiBmcmFtZSA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVy
VG9Ob2RlPEhUTUxGcmFtZUVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIFN0cmluZyBzcmNW
YWx1ZSA9IHRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsQ2hlY2sodmFsdWUpOwogCiAgICAgaWYgKCFh
bGxvd1NldHRpbmdGcmFtZVNyY1RvSmF2YXNjcmlwdFVybChmcmFtZSwgc3JjVmFsdWUpKQpAQCAt
NTAsNyArNTAsNyBAQAogCiBBQ0NFU1NPUl9TRVRURVIoSFRNTEZyYW1lRWxlbWVudExvY2F0aW9u
KQogewotICAgIEhUTUxGcmFtZUVsZW1lbnQqIGZyYW1lID0gVjhQcm94eTo6RE9NV3JhcHBlclRv
Tm9kZTxIVE1MRnJhbWVFbGVtZW50PihpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MRnJhbWVFbGVt
ZW50KiBmcmFtZSA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxGcmFtZUVs
ZW1lbnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIFN0cmluZyBsb2NhdGlvblZhbHVlID0gdG9XZWJD
b3JlU3RyaW5nV2l0aE51bGxDaGVjayh2YWx1ZSk7CiAKICAgICBpZiAoIWFsbG93U2V0dGluZ0Zy
YW1lU3JjVG9KYXZhc2NyaXB0VXJsKGZyYW1lLCBsb2NhdGlvblZhbHVlKSkKSW5kZXg6IFdlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TmF2aWdhdG9yQ3VzdG9tLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE5hdmlnYXRvckN1c3RvbS5jcHAJKHJldmlz
aW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhOYXZpZ2F0b3JDdXN0
b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MSw3ICs0MSw3IEBACiB7CiAgICAgSU5DX1NUQVRT
KCJET00uTmF2aWdhdG9yLmFwcFZlcnNpb24iKTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+
IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0gICAgTmF2aWdhdG9yKiBuYXZpZ2F0b3IgPSBWOFBy
b3h5OjpUb05hdGl2ZU9iamVjdDxOYXZpZ2F0b3I+KFY4Q2xhc3NJbmRleDo6TkFWSUdBVE9SLCBo
b2xkZXIpOworICAgIE5hdmlnYXRvciogbmF2aWdhdG9yID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PE5hdmlnYXRvcj4oVjhDbGFzc0luZGV4OjpOQVZJR0FUT1IsIGhvbGRlcik7CiAg
ICAgcmV0dXJuIHY4U3RyaW5nT3JVbmRlZmluZWQobmF2aWdhdG9yLT5hcHBWZXJzaW9uKCkpOwog
fQogCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFRyYW5zYWN0
aW9uRXJyb3JDYWxsYmFjay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhDdXN0b21TUUxUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2suY3BwCShyZXZpc2lvbiA0
NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tU1FMVHJhbnNhY3Rp
b25FcnJvckNhbGxiYWNrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTQsMTQgKzU0LDE0IEBACiB7
CiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6
Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQobV9mcmFtZS5nZXQoKSk7Cisg
ICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQobV9m
cmFtZS5nZXQoKSk7CiAgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47
CiAKICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CiAKICAgICB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gYXJndltdID0gewotICAgICAgICBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4
Q2xhc3NJbmRleDo6U1FMRVJST1IsIGVycm9yKQorICAgICAgICBWOFByb3h5Ojpjb252ZXJ0VG9W
OE9iamVjdChWOENsYXNzSW5kZXg6OlNRTEVSUk9SLCBlcnJvcikKICAgICB9OwogCiAgICAgLy8g
UHJvdGVjdCB0aGUgZnJhbWUgdW50aWwgdGhlIGNhbGxiYWNrIHJldHVybnMuCkluZGV4OiBXZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxJbnB1dEVsZW1lbnRDdXN0b20uY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTElucHV0RWxlbWVudEN1
c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhIVE1MSW5wdXRFbGVtZW50Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDEsNyArNDEs
NyBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxJbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3Rh
cnQuX2dldCIpOwogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gaW5mby5Ib2xk
ZXIoKTsKLSAgICBIVE1MSW5wdXRFbGVtZW50KiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPEhUTUxJbnB1dEVsZW1lbnQ+KGhvbGRlcik7CisgICAgSFRNTElucHV0RWxlbWVudCogaW1w
ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTElucHV0RWxlbWVudD4oaG9s
ZGVyKTsKIAogICAgIGlmICghaW1wLT5jYW5IYXZlU2VsZWN0aW9uKCkpCiAgICAgICAgIHJldHVy
biB0aHJvd0Vycm9yKCJBY2Nlc3Npbmcgc2VsZWN0aW9uU3RhcnQgb24gYW4gaW5wdXQgZWxlbWVu
dCB0aGF0IGNhbm5vdCBoYXZlIGEgc2VsZWN0aW9uLiIpOwpAQCAtNTQsNyArNTQsNyBAQAogewog
ICAgIElOQ19TVEFUUygiRE9NLkhUTUxJbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQuX3NldCIp
OwogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gaW5mby5Ib2xkZXIoKTsKLSAg
ICBIVE1MSW5wdXRFbGVtZW50KiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxJ
bnB1dEVsZW1lbnQ+KGhvbGRlcik7CisgICAgSFRNTElucHV0RWxlbWVudCogaW1wID0gVjhQcm94
eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTElucHV0RWxlbWVudD4oaG9sZGVyKTsKIAog
ICAgIGlmICghaW1wLT5jYW5IYXZlU2VsZWN0aW9uKCkpIHsKICAgICAgICAgdGhyb3dFcnJvcigi
QWNjZXNzaW5nIHNlbGVjdGlvblN0YXJ0IG9uIGFuIGlucHV0IGVsZW1lbnQgdGhhdCBjYW5ub3Qg
aGF2ZSBhIHNlbGVjdGlvbi4iKTsKQEAgLTY3LDcgKzY3LDcgQEAKIHsKICAgICBJTkNfU1RBVFMo
IkRPTS5IVE1MSW5wdXRFbGVtZW50LnNlbGVjdGlvbkVuZC5fZ2V0Iik7CiAgICAgdjg6OkhhbmRs
ZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBpbmZvLkhvbGRlcigpOwotICAgIEhUTUxJbnB1dEVsZW1l
bnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTElucHV0RWxlbWVudD4oaG9s
ZGVyKTsKKyAgICBIVE1MSW5wdXRFbGVtZW50KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3Jh
cHBlclRvTm9kZTxIVE1MSW5wdXRFbGVtZW50Pihob2xkZXIpOwogCiAgICAgaWYgKCFpbXAtPmNh
bkhhdmVTZWxlY3Rpb24oKSkKICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoIkFjY2Vzc2luZyBz
ZWxlY3Rpb25FbmQgb24gYW4gaW5wdXQgZWxlbWVudCB0aGF0IGNhbm5vdCBoYXZlIGEgc2VsZWN0
aW9uLiIpOwpAQCAtODAsNyArODAsNyBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxJbnB1
dEVsZW1lbnQuc2VsZWN0aW9uRW5kLl9zZXQiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+
IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0gICAgSFRNTElucHV0RWxlbWVudCogaW1wID0gVjhQ
cm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MSW5wdXRFbGVtZW50Pihob2xkZXIpOworICAgIEhU
TUxJbnB1dEVsZW1lbnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhU
TUxJbnB1dEVsZW1lbnQ+KGhvbGRlcik7CiAKICAgICBpZiAoIWltcC0+Y2FuSGF2ZVNlbGVjdGlv
bigpKSB7CiAgICAgICAgIHRocm93RXJyb3IoIkFjY2Vzc2luZyBzZWxlY3Rpb25FbmQgb24gYW4g
aW5wdXQgZWxlbWVudCB0aGF0IGNhbm5vdCBoYXZlIGEgc2VsZWN0aW9uLiIpOwpAQCAtOTQsNyAr
OTQsNyBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxJbnB1dEVsZW1lbnQuc2V0U2VsZWN0
aW9uUmFuZ2UiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGFyZ3MuSG9s
ZGVyKCk7Ci0gICAgSFRNTElucHV0RWxlbWVudCogaW1wID0gVjhQcm94eTo6RE9NV3JhcHBlclRv
Tm9kZTxIVE1MSW5wdXRFbGVtZW50Pihob2xkZXIpOworICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlt
cCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxJbnB1dEVsZW1lbnQ+KGhv
bGRlcik7CiAKICAgICBpZiAoIWltcC0+Y2FuSGF2ZVNlbGVjdGlvbigpKQogICAgICAgICByZXR1
cm4gdGhyb3dFcnJvcigiQ2FsbGluZyBzZXRTZWxlY3Rpb25SYW5nZSBvbiBhbiBpbnB1dCBlbGVt
ZW50IHRoYXQgY2Fubm90IGhhdmUgYSBzZWxlY3Rpb24uIik7CkluZGV4OiBXZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFN0YXRlbWVudENhbGxiYWNrLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFN0YXRlbWVudENhbGxi
YWNrLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OEN1c3RvbVNRTFN0YXRlbWVudENhbGxiYWNrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTQsMTUg
KzU0LDE1IEBACiB7CiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwogCi0gICAgdjg6
OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQobV9mcmFt
ZS5nZXQoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6
OmNvbnRleHQobV9mcmFtZS5nZXQoKSk7CiAgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQogICAg
ICAgICByZXR1cm47CiAKICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CiAK
ICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJndltdID0gewotICAgICAgICBWOFByb3h5OjpU
b1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMVFJBTlNBQ1RJT04sIHRyYW5zYWN0aW9uKSwKLSAg
ICAgICAgVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNRTFJFU1VMVFNFVCwgcmVz
dWx0U2V0KQorICAgICAgICBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6
OlNRTFRSQU5TQUNUSU9OLCB0cmFuc2FjdGlvbiksCisgICAgICAgIFY4UHJveHk6OmNvbnZlcnRU
b1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMUkVTVUxUU0VULCByZXN1bHRTZXQpCiAgICAgfTsK
IAogICAgIC8vIFByb3RlY3QgdGhlIGZyYW1lIHVudGlsIHRoZSBjYWxsYmFjayByZXR1cm5zLgpJ
bmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MRm9ybUVsZW1lbnRDdXN0b20u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTEZvcm1F
bGVtZW50Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOEhUTUxGb3JtRWxlbWVudEN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQy
LDE5ICs0MiwxOSBAQAogSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoSFRNTEZvcm1FbGVtZW50KQog
ewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxGb3JtRWxlbWVudC5JbmRleGVkUHJvcGVydHlHZXR0
ZXIiKTsKLSAgICBIVE1MRm9ybUVsZW1lbnQqIGZvcm0gPSBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPEhUTUxGb3JtRWxlbWVudD4oaW5mby5Ib2xkZXIoKSk7CisgICAgSFRNTEZvcm1FbGVtZW50
KiBmb3JtID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTEZvcm1FbGVtZW50
PihpbmZvLkhvbGRlcigpKTsKICAgICAKICAgICBSZWZQdHI8Tm9kZT4gZm9ybUVsZW1lbnQgPSBm
b3JtLT5lbGVtZW50cygpLT5pdGVtKGluZGV4KTsKICAgICBpZiAoIWZvcm1FbGVtZW50KQogICAg
ICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKLSAgICByZXR1cm4gVjhQcm94
eTo6Tm9kZVRvVjhPYmplY3QoZm9ybUVsZW1lbnQuZ2V0KCkpOworICAgIHJldHVybiBWOFByb3h5
Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QoZm9ybUVsZW1lbnQuZ2V0KCkpOwogfQogCiAKIE5BTUVE
X1BST1BFUlRZX0dFVFRFUihIVE1MRm9ybUVsZW1lbnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00u
SFRNTEZvcm1FbGVtZW50Lk5hbWVkUHJvcGVydHlHZXR0ZXIiKTsKLSAgICBIVE1MRm9ybUVsZW1l
bnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTEZvcm1FbGVtZW50PihpbmZv
LkhvbGRlcigpKTsKKyAgICBIVE1MRm9ybUVsZW1lbnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRE
T01XcmFwcGVyVG9Ob2RlPEhUTUxGb3JtRWxlbWVudD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgQXRv
bWljU3RyaW5nIHYgPSB2OFN0cmluZ1RvQXRvbWljV2ViQ29yZVN0cmluZyhuYW1lKTsKIAogICAg
IC8vIENhbGwgZ2V0TmFtZWRFbGVtZW50cyB0d2ljZSwgZmlyc3QgdGltZSBjaGVjayBpZiBpdCBo
YXMgYSB2YWx1ZQpAQCAtNzQsMTUgKzc0LDE1IEBACiAgICAgQVNTRVJUKCFlbGVtZW50cy5pc0Vt
cHR5KCkpOwogCiAgICAgaWYgKGVsZW1lbnRzLnNpemUoKSA9PSAxKQotICAgICAgICByZXR1cm4g
VjhQcm94eTo6Tm9kZVRvVjhPYmplY3QoZWxlbWVudHMuYXQoMCkuZ2V0KCkpOworICAgICAgICBy
ZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KGVsZW1lbnRzLmF0KDApLmdldCgp
KTsKIAogICAgIE5vZGVMaXN0KiBjb2xsZWN0aW9uID0gbmV3IFY4TmFtZWROb2Rlc0NvbGxlY3Rp
b24oZWxlbWVudHMpOwotICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRl
eDo6Tk9ERUxJU1QsIGNvbGxlY3Rpb24pOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9W
OE9iamVjdChWOENsYXNzSW5kZXg6Ok5PREVMSVNULCBjb2xsZWN0aW9uKTsKIH0KICAgICAKIENB
TExCQUNLX0ZVTkNfREVDTChIVE1MRm9ybUVsZW1lbnRTdWJtaXQpIHsKICAgICBJTkNfU1RBVFMo
IkRPTS5IVE1MRm9ybUVsZW1lbnQuc3VibWl0KCkiKTsKLSAgICBIVE1MRm9ybUVsZW1lbnQqIGZv
cm0gPSBWOFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8SFRNTEZvcm1FbGVtZW50PihhcmdzLkhv
bGRlcigpKTsKKyAgICBIVE1MRm9ybUVsZW1lbnQqIGZvcm0gPSBWOFByb3h5Ojpjb252ZXJ0RE9N
V3JhcHBlclRvTmF0aXZlPEhUTUxGb3JtRWxlbWVudD4oYXJncy5Ib2xkZXIoKSk7CiAgICAgZm9y
bS0+c3VibWl0KDAsIGZhbHNlLCBmYWxzZSk7CiAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsK
IH0KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RGF0YWJhc2VDdXN0b20uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RGF0YWJhc2VDdXN0
b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
RGF0YWJhc2VDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiwxNCArMzIsMTMgQEAKIAog
I2lmIEVOQUJMRShEQVRBQkFTRSkKIAotI2luY2x1ZGUgInY4X2JpbmRpbmcuaCIKLSNpbmNsdWRl
ICJ2OF9wcm94eS5oIgotCiAjaW5jbHVkZSAiRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJWOEJpbmRp
bmcuaCIKICNpbmNsdWRlICJWOEN1c3RvbUJpbmRpbmcuaCIKICNpbmNsdWRlICJWOEN1c3RvbVNR
TFRyYW5zYWN0aW9uQ2FsbGJhY2suaCIKICNpbmNsdWRlICJWOEN1c3RvbVNRTFRyYW5zYWN0aW9u
RXJyb3JDYWxsYmFjay5oIgogI2luY2x1ZGUgIlY4Q3VzdG9tVm9pZENhbGxiYWNrLmgiCisjaW5j
bHVkZSAiVjhQcm94eS5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTU0LDE2ICs1Mywx
NiBAQAogICAgIElOQ19TVEFUUygiRE9NLkRhdGFiYXNlLnRyYW5zYWN0aW9uKCkiKTsKIAogICAg
IGlmIChhcmdzLkxlbmd0aCgpID09IDApIHsKLSAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihW
OFByb3h5OjpTWU5UQVhfRVJST1IsICJUcmFuc2FjdGlvbiBjYWxsYmFjayBpcyByZXF1aXJlZC4i
KTsKKyAgICAgICAgVjhQcm94eTo6dGhyb3dFcnJvcihWOFByb3h5OjpTWU5UQVhfRVJST1IsICJU
cmFuc2FjdGlvbiBjYWxsYmFjayBpcyByZXF1aXJlZC4iKTsKICAgICAgICAgcmV0dXJuIHY4OjpV
bmRlZmluZWQoKTsKICAgICB9CiAKICAgICBpZiAoIWFyZ3NbMF0tPklzT2JqZWN0KCkpIHsKLSAg
ICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiVHJhbnNhY3Rp
b24gY2FsbGJhY2sgbXVzdCBiZSBvZiB2YWxpZCB0eXBlLiIpOworICAgICAgICBWOFByb3h5Ojp0
aHJvd0Vycm9yKFY4UHJveHk6OlRZUEVfRVJST1IsICJUcmFuc2FjdGlvbiBjYWxsYmFjayBtdXN0
IGJlIG9mIHZhbGlkIHR5cGUuIik7CiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAg
ICAgfQogCi0gICAgRGF0YWJhc2UqIGRhdGFiYXNlID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8
RGF0YWJhc2U+KFY4Q2xhc3NJbmRleDo6REFUQUJBU0UsIGFyZ3MuSG9sZGVyKCkpOworICAgIERh
dGFiYXNlKiBkYXRhYmFzZSA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxEYXRhYmFz
ZT4oVjhDbGFzc0luZGV4OjpEQVRBQkFTRSwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBGcmFtZSog
ZnJhbWUgPSBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lKCk7CiAKQEAgLTcyLDcgKzcxLDcgQEAKICAg
ICBSZWZQdHI8VjhDdXN0b21TUUxUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2s+IGVycm9yQ2FsbGJh
Y2s7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAxKSB7CiAgICAgICAgIGlmICghYXJnc1sxXS0+
SXNPYmplY3QoKSkgewotICAgICAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpU
WVBFX0VSUk9SLCAiVHJhbnNhY3Rpb24gZXJyb3IgY2FsbGJhY2sgbXVzdCBiZSBvZiB2YWxpZCB0
eXBlLiIpOworICAgICAgICAgICAgVjhQcm94eTo6dGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VS
Uk9SLCAiVHJhbnNhY3Rpb24gZXJyb3IgY2FsbGJhY2sgbXVzdCBiZSBvZiB2YWxpZCB0eXBlLiIp
OwogICAgICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKICAgICAgICAgfQogICAgICAg
ICBlcnJvckNhbGxiYWNrID0gVjhDdXN0b21TUUxUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2s6OmNy
ZWF0ZShhcmdzWzFdLCBmcmFtZSk7CkBAIC04MSw3ICs4MCw3IEBACiAgICAgUmVmUHRyPFY4Q3Vz
dG9tVm9pZENhbGxiYWNrPiBzdWNjZXNzQ2FsbGJhY2s7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkg
PiAyKSB7CiAgICAgICAgIGlmICghYXJnc1sxXS0+SXNPYmplY3QoKSkgewotICAgICAgICAgICAg
VjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiVHJhbnNhY3Rpb24gc3Vj
Y2VzcyBjYWxsYmFjayBtdXN0IGJlIG9mIHZhbGlkIHR5cGUuIik7CisgICAgICAgICAgICBWOFBy
b3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlRZUEVfRVJST1IsICJUcmFuc2FjdGlvbiBzdWNjZXNz
IGNhbGxiYWNrIG11c3QgYmUgb2YgdmFsaWQgdHlwZS4iKTsKICAgICAgICAgICAgIHJldHVybiB2
ODo6VW5kZWZpbmVkKCk7CiAgICAgICAgIH0KICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrID0gVjhD
dXN0b21Wb2lkQ2FsbGJhY2s6OmNyZWF0ZShhcmdzWzJdLCBmcmFtZSk7CkluZGV4OiBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVBhcnNlckNvbnN0cnVjdG9yLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVBhcnNlckNvbnN0cnVjdG9yLmNw
cAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVBh
cnNlckNvbnN0cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzksNyArMzksNyBAQAogQ0FM
TEJBQ0tfRlVOQ19ERUNMKERPTVBhcnNlckNvbnN0cnVjdG9yKQogewogICAgIElOQ19TVEFUUygi
RE9NLkRPTVBhcnNlci5Db250cnVjdG9yIik7Ci0gICAgcmV0dXJuIFY4UHJveHk6OkNvbnN0cnVj
dERPTU9iamVjdDxWOENsYXNzSW5kZXg6OkRPTVBBUlNFUiwgRE9NUGFyc2VyPihhcmdzKTsKKyAg
ICByZXR1cm4gVjhQcm94eTo6Y29uc3RydWN0RE9NT2JqZWN0PFY4Q2xhc3NJbmRleDo6RE9NUEFS
U0VSLCBET01QYXJzZXI+KGFyZ3MpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVdpbmRvd0N1c3RvbS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dDdXN0b20uY3Bw
CShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RE9NV2lu
ZG93Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjQsMTIgKzY0LDEyIEBACiAgICAgaWYg
KGFyZ3VtZW50Q291bnQgPCAxKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0g
ICAgRE9NV2luZG93KiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4
Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKKyAgICBET01XaW5kb3cqIGlt
cCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRl
eDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIGlmICghaW1wLT5mcmFtZSgpKQog
ICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgaWYgKCFWOFByb3h5OjpDYW5B
Y2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUpKQorICAgIGlmICghVjhQcm94eTo6Y2FuQWNj
ZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmlu
ZWQoKTsKIAogICAgIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIHNjcmlwdENvbnRleHQgPSBzdGF0
aWNfY2FzdDxTY3JpcHRFeGVjdXRpb25Db250ZXh0Kj4oaW1wLT5mcmFtZSgpLT5kb2N1bWVudCgp
KTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252
ZXJ0QmFzZTY0KGNvbnN0IFN0cmluZyYgc3RyLCBib29sIGVuY29kZSkKIHsKICAgICBpZiAoIWlz
QXNjaWkoc3RyKSkgewotICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oSU5WQUxJRF9D
SEFSQUNURVJfRVJSKTsKKyAgICAgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKElOVkFMSURf
Q0hBUkFDVEVSX0VSUik7CiAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigp
OwogICAgIH0KIApAQCAtMTYxLDIwICsxNjEsMjAgQEAKIAogQUNDRVNTT1JfU0VUVEVSKERPTVdp
bmRvd0xvY2F0aW9uKQogewotICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gVjhQ
cm94eTo6TG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaW5mby5UaGlz
KCkpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gVjhQcm94eTo6bG9va3Vw
RE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaW5mby5UaGlzKCkpOwogICAgIGlm
IChob2xkZXIuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBET01XaW5kb3cqIGlt
cCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01X
SU5ET1csIGhvbGRlcik7CisgICAgRE9NV2luZG93KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaG9sZGVyKTsK
ICAgICBXaW5kb3dTZXRMb2NhdGlvbihpbXAsIHRvV2ViQ29yZVN0cmluZyh2YWx1ZSkpOwogfQog
CiAKIEFDQ0VTU09SX1NFVFRFUihET01XaW5kb3dPcGVuZXIpCiB7Ci0gICAgRE9NV2luZG93KiBp
bXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9N
V0lORE9XLCBpbmZvLkhvbGRlcigpKTsKKyAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OmNv
bnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBp
bmZvLkhvbGRlcigpKTsKIAotICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5m
cmFtZSgpLCB0cnVlKSkKKyAgICBpZiAoIVY4UHJveHk6OmNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJh
bWUoKSwgdHJ1ZSkpCiAgICAgICAgIHJldHVybjsKICAgCiAgICAgLy8gT3BlbmVyIGNhbiBiZSBz
aGFkb3dlZCBpZiBpdCBpcyBpbiB0aGUgc2FtZSBkb21haW4uCkBAIC0xOTcsOSArMTk3LDkgQEAK
IENBTExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dBZGRFdmVudExpc3RlbmVyKQogewogICAgIElO
Q19TVEFUUygiRE9NLkRPTVdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCkiKTsKLSAgICBET01XaW5k
b3cqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4
OjpET01XSU5ET1csIGFyZ3MuSG9sZGVyKCkpOworICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94
eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5E
T1csIGFyZ3MuSG9sZGVyKCkpOwogCi0gICAgaWYgKCFWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShp
bXAtPmZyYW1lKCksIHRydWUpKQorICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1w
LT5mcmFtZSgpLCB0cnVlKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAogICAg
IGlmICghaW1wLT5mcmFtZSgpKQpAQCAtMjE0LDcgKzIxNCw3IEBACiAgICAgaWYgKCFwcm94eSkK
ICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIFJlZlB0cjxFdmVudExpc3Rl
bmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIoYXJnc1sx
XSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5m
aW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOwogCiAgICAgaWYgKGxp
c3RlbmVyKSB7CiAgICAgICAgIFN0cmluZyBldmVudFR5cGUgPSB0b1dlYkNvcmVTdHJpbmcoYXJn
c1swXSk7CkBAIC0yMjksOSArMjI5LDkgQEAKIENBTExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dS
ZW1vdmVFdmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5yZW1v
dmVFdmVudExpc3RlbmVyKCkiKTsKLSAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OlRvTmF0
aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGFyZ3MuSG9sZGVy
KCkpOworICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0
PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGFyZ3MuSG9sZGVyKCkpOwogCi0g
ICAgaWYgKCFWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUpKQorICAg
IGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKICAgICAg
ICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAogICAgIGlmICghaW1wLT5mcmFtZSgpKQpAQCAt
MjQ1LDcgKzI0NSw3IEBACiAgICAgaWYgKCFwcm94eSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRl
ZmluZWQoKTsKIAotICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5G
aW5kVjhFdmVudExpc3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsKKyAgICBSZWZQdHI8RXZlbnRMaXN0
ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+ZmluZFY4RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxz
ZSk7CiAKICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgU3RyaW5nIGV2ZW50VHlwZSA9IHRv
V2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKQEAgLTI1OSw3ICsyNTksNyBAQAogQ0FMTEJBQ0tfRlVO
Q19ERUNMKERPTVdpbmRvd1Bvc3RNZXNzYWdlKQogewogICAgIElOQ19TVEFUUygiRE9NLkRPTVdp
bmRvdy5wb3N0TWVzc2FnZSgpIik7Ci0gICAgRE9NV2luZG93KiB3aW5kb3cgPSBWOFByb3h5OjpU
b05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhv
bGRlcigpKTsKKyAgICBET01XaW5kb3cqIHdpbmRvdyA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2
ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigp
KTsKIAogICAgIERPTVdpbmRvdyogc291cmNlID0gVjhQcm94eTo6cmV0cmlldmVGcmFtZUZvckNh
bGxpbmdDb250ZXh0KCktPmRvbVdpbmRvdygpOwogICAgIEFTU0VSVChzb3VyY2UtPmZyYW1lKCkp
OwpAQCAtMjc1LDggKzI3NSw4IEBACiAgICAgLy8gb3IKICAgICAvLyAgIHBvc3RNZXNzYWdlKG1l
c3NhZ2UsIHRhcmdldE9yaWdpbik7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAyKSB7Ci0gICAg
ICAgIGlmIChWOFByb3h5OjpJc1dyYXBwZXJPZlR5cGUoYXJnc1sxXSwgVjhDbGFzc0luZGV4OjpN
RVNTQUdFUE9SVCkpCi0gICAgICAgICAgICBwb3J0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8
TWVzc2FnZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIGFyZ3NbMV0pOworICAgICAg
ICBpZiAoVjhQcm94eTo6aXNXcmFwcGVyT2ZUeXBlKGFyZ3NbMV0sIFY4Q2xhc3NJbmRleDo6TUVT
U0FHRVBPUlQpKQorICAgICAgICAgICAgcG9ydCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxNZXNzYWdlUG9ydD4oVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgYXJnc1sxXSk7CiAg
ICAgICAgIHRhcmdldE9yaWdpbiA9IHZhbHVlVG9TdHJpbmdXaXRoTnVsbE9yVW5kZWZpbmVkQ2hl
Y2soYXJnc1syXSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgdGFyZ2V0T3JpZ2luID0gdmFsdWVU
b1N0cmluZ1dpdGhOdWxsT3JVbmRlZmluZWRDaGVjayhhcmdzWzFdKTsKQEAgLTI4OCw3ICsyODgs
NyBAQAogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgIHdpbmRvdy0+cG9zdE1lc3NhZ2Uo
bWVzc2FnZSwgcG9ydCwgdGFyZ2V0T3JpZ2luLCBzb3VyY2UsIGVjKTsKICAgICBpZiAoZWMpCi0g
ICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAgIFY4UHJveHk6OnNl
dERPTUV4Y2VwdGlvbihlYyk7CiAKICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogfQpAQCAt
Mjk2LDkgKzI5Niw5IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woRE9NV2luZG93QXRvYikKIHsKICAg
ICBJTkNfU1RBVFMoIkRPTS5ET01XaW5kb3cuYXRvYigpIik7Ci0gICAgRE9NV2luZG93KiBpbXAg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lO
RE9XLCBhcmdzLkhvbGRlcigpKTsKKyAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OmNvbnZl
cnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdz
LkhvbGRlcigpKTsKIAotICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFt
ZSgpLCB0cnVlKSkKKyAgICBpZiAoIVY4UHJveHk6OmNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUo
KSwgdHJ1ZSkpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKICAgICBpZiAoYXJn
cy5MZW5ndGgoKSA8IDEpCkBAIC0zMTQsOSArMzE0LDkgQEAKIENBTExCQUNLX0ZVTkNfREVDTChE
T01XaW5kb3dCdG9hKQogewogICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5idG9hKCkiKTsK
LSAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4o
VjhDbGFzc0luZGV4OjpET01XSU5ET1csIGFyZ3MuSG9sZGVyKCkpOworICAgIERPTVdpbmRvdyog
aW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0lu
ZGV4OjpET01XSU5ET1csIGFyZ3MuSG9sZGVyKCkpOwogCi0gICAgaWYgKCFWOFByb3h5OjpDYW5B
Y2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUpKQorICAgIGlmICghVjhQcm94eTo6Y2FuQWNj
ZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmlu
ZWQoKTsKIAogICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMSkKQEAgLTM3MywxMSArMzczLDExIEBA
CiAKIEFDQ0VTU09SX1NFVFRFUihET01XaW5kb3dFdmVudEhhbmRsZXIpCiB7Ci0gICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5OjpMb29rdXBET01XcmFwcGVyKFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRoaXMoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0PiBob2xkZXIgPSBWOFByb3h5Ojpsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9N
V0lORE9XLCBpbmZvLlRoaXMoKSk7CiAgICAgaWYgKGhvbGRlci5Jc0VtcHR5KCkpCiAgICAgICAg
IHJldHVybjsKIAotICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8
RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaG9sZGVyKTsKKyAgICBET01XaW5k
b3cqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOwogICAgIGlmICghaW1wLT5mcmFtZSgpKQogICAg
ICAgICByZXR1cm47CiAKQEAgLTM5Nyw3ICszOTcsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwog
CiAgICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9Ci0gICAgICAgICAgICBw
cm94eS0+RmluZE9yQ3JlYXRlVjhFdmVudExpc3RlbmVyKHZhbHVlLCB0cnVlKTsKKyAgICAgICAg
ICAgIHByb3h5LT5maW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIodmFsdWUsIHRydWUpOwogICAg
ICAgICBpZiAobGlzdGVuZXIpCiAgICAgICAgICAgICBpbXAtPnNldEF0dHJpYnV0ZUV2ZW50TGlz
dGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7CiAgICAgfQpAQCAtNDA1LDExICs0MDUsMTEgQEAK
IAogQUNDRVNTT1JfR0VUVEVSKERPTVdpbmRvd0V2ZW50SGFuZGxlcikKIHsKLSAgICB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFz
c0luZGV4OjpET01XSU5ET1csIGluZm8uVGhpcygpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmpl
Y3Q+IGhvbGRlciA9IFY4UHJveHk6Omxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01X
SU5ET1csIGluZm8uVGhpcygpKTsKICAgICBpZiAoaG9sZGVyLklzRW1wdHkoKSkKICAgICAgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6
VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaG9sZGVy
KTsKKyAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxE
T01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOwogICAgIGlmICghaW1w
LT5mcmFtZSgpKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCkBAIC00MjEsNyAr
NDIxLDcgQEAKICAgICBTdHJpbmcgZXZlbnRUeXBlID0gZXZlbnROYW1lRnJvbUF0dHJpYnV0ZU5h
bWUoa2V5KTsKIAogICAgIEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gaW1wLT5nZXRBdHRyaWJ1
dGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSk7Ci0gICAgcmV0dXJuIFY4UHJveHk6OkV2ZW50TGlz
dGVuZXJUb1Y4T2JqZWN0KGxpc3RlbmVyKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydEV2
ZW50TGlzdGVuZXJUb1Y4T2JqZWN0KGxpc3RlbmVyKTsKIH0KIAogc3RhdGljIGJvb2wgY2FuU2hv
d01vZGFsRGlhbG9nTm93KGNvbnN0IEZyYW1lKiBmcmFtZSkKQEAgLTUxOCw3ICs1MTgsNyBAQAog
CiAgICAgLy8gU2V0IGRpYWxvZyBhcmd1bWVudHMgb24gdGhlIGdsb2JhbCBvYmplY3Qgb2YgdGhl
IG5ldyBmcmFtZS4KICAgICBpZiAoIWRpYWxvZ0FyZ3MuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHY4
OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQobmV3RnJh
bWUpOworICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5Ojpj
b250ZXh0KG5ld0ZyYW1lKTsKICAgICAgICAgaWYgKCFjb250ZXh0LklzRW1wdHkoKSkgewogICAg
ICAgICAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOwogICAgICAgICAgICAg
Y29udGV4dC0+R2xvYmFsKCktPlNldCh2ODo6U3RyaW5nOjpOZXcoImRpYWxvZ0FyZ3VtZW50cyIp
LCBkaWFsb2dBcmdzKTsKQEAgLTU0NCwxMSArNTQ0LDExIEBACiBDQUxMQkFDS19GVU5DX0RFQ0wo
RE9NV2luZG93U2hvd01vZGFsRGlhbG9nKQogewogICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRv
dy5zaG93TW9kYWxEaWFsb2coKSIpOwotICAgIERPTVdpbmRvdyogd2luZG93ID0gVjhQcm94eTo6
VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PigKKyAgICBET01XaW5kb3cqIHdpbmRvdyA9IFY4UHJv
eHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KAogICAgICAgICBWOENsYXNzSW5k
ZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7CiAgICAgRnJhbWUqIGZyYW1lID0gd2luZG93
LT5mcmFtZSgpOwogCi0gICAgaWYgKCFmcmFtZSB8fCAhVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUo
ZnJhbWUsIHRydWUpKSAKKyAgICBpZiAoIWZyYW1lIHx8ICFWOFByb3h5OjpjYW5BY2Nlc3NGcmFt
ZShmcmFtZSwgdHJ1ZSkpIAogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCiAgICAg
RnJhbWUqIGNhbGxpbmdGcmFtZSA9IFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29u
dGV4dCgpOwpAQCAtNjExLDcgKzYxMSw3IEBACiAKICAgICAvLyBIb2xkIG9uIHRvIHRoZSBjb250
ZXh0IG9mIHRoZSBkaWFsb2cgd2luZG93IGxvbmcgZW5vdWdoIHRvIHJldHJpZXZlIHRoZQogICAg
IC8vIHZhbHVlIG9mIHRoZSByZXR1cm4gdmFsdWUgcHJvcGVydHkuCi0gICAgdjg6OkxvY2FsPHY4
OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChkaWFsb2dGcmFtZSk7Cisg
ICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6Y29udGV4dChkaWFs
b2dGcmFtZSk7CiAKICAgICAvLyBSdW4gdGhlIGRpYWxvZy4KICAgICBkaWFsb2dGcmFtZS0+cGFn
ZSgpLT5jaHJvbWUoKS0+cnVuTW9kYWwoKTsKQEAgLTYzMywxMCArNjMzLDEwIEBACiBDQUxMQkFD
S19GVU5DX0RFQ0woRE9NV2luZG93T3BlbikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5ET01XaW5k
b3cub3BlbigpIik7Ci0gICAgRE9NV2luZG93KiBwYXJlbnQgPSBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsK
KyAgICBET01XaW5kb3cqIHBhcmVudCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxE
T01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKICAgICBG
cmFtZSogZnJhbWUgPSBwYXJlbnQtPmZyYW1lKCk7CiAKLSAgICBpZiAoIWZyYW1lIHx8ICFWOFBy
b3h5OjpDYW5BY2Nlc3NGcmFtZShmcmFtZSwgdHJ1ZSkpCisgICAgaWYgKCFmcmFtZSB8fCAhVjhQ
cm94eTo6Y2FuQWNjZXNzRnJhbWUoZnJhbWUsIHRydWUpKQogICAgICAgICByZXR1cm4gdjg6OlVu
ZGVmaW5lZCgpOwogCiAgICAgRnJhbWUqIGNhbGxpbmdGcmFtZSA9IFY4UHJveHk6OnJldHJpZXZl
RnJhbWVGb3JDYWxsaW5nQ29udGV4dCgpOwpAQCAtNjkxLDcgKzY5MSw3IEBACiAKICAgICAgICAg
ICAgIGZyYW1lLT5sb2FkZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZShjb21wbGV0ZWRVcmws
IHJlZmVycmVyLCBmYWxzZSwgdXNlckdlc3R1cmUpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVy
biBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBmcmFtZS0+ZG9t
V2luZG93KCkpOworICAgICAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhD
bGFzc0luZGV4OjpET01XSU5ET1csIGZyYW1lLT5kb21XaW5kb3coKSk7CiAgICAgfQogCiAgICAg
Ly8gSW4gdGhlIGNhc2Ugb2YgYSBuYW1lZCBmcmFtZSBvciBhIG5ldyB3aW5kb3csIHdlJ2xsIHVz
ZSB0aGUKQEAgLTc1MSwxOCArNzUxLDE4IEBACiAgICAgaWYgKCFmcmFtZSkKICAgICAgICAgcmV0
dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4
Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBmcmFtZS0+ZG9tV2luZG93KCkpOworICAgIHJldHVybiBW
OFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgZnJhbWUt
PmRvbVdpbmRvdygpKTsKIH0KIAogCiBJTkRFWEVEX1BST1BFUlRZX0dFVFRFUihET01XaW5kb3cp
CiB7CiAgICAgSU5DX1NUQVRTKCJET00uRE9NV2luZG93LkluZGV4ZWRQcm9wZXJ0eUdldHRlciIp
OwotICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gVjhQcm94eTo6TG9va3VwRE9N
V3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaW5mby5UaGlzKCkpOworICAgIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gVjhQcm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENs
YXNzSW5kZXg6OkRPTVdJTkRPVywgaW5mby5UaGlzKCkpOwogICAgIGlmIChob2xkZXIuSXNFbXB0
eSgpKQogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKIAotICAgIERP
TVdpbmRvdyogd2luZG93ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENs
YXNzSW5kZXg6OkRPTVdJTkRPVywgaG9sZGVyKTsKKyAgICBET01XaW5kb3cqIHdpbmRvdyA9IFY4
UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9N
V0lORE9XLCBob2xkZXIpOwogICAgIGlmICghd2luZG93KQogICAgICAgICByZXR1cm4gbm90SGFu
ZGxlZEJ5SW50ZXJjZXB0b3IoKTsKIApAQCAtNzcyLDcgKzc3Miw3IEBACiAKICAgICBGcmFtZSog
Y2hpbGQgPSBmcmFtZS0+dHJlZSgpLT5jaGlsZChpbmRleCk7CiAgICAgaWYgKGNoaWxkKQotICAg
ICAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywg
Y2hpbGQtPmRvbVdpbmRvdygpKTsKKyAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4
T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBjaGlsZC0+ZG9tV2luZG93KCkpOwogCiAg
ICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiB9CkBAIC03ODIsMTEgKzc4Miwx
MSBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5OYW1lZFByb3BlcnR5R2V0dGVy
Iik7CiAKLSAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Okxvb2t1
cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGluZm8uVGhpcygpKTsKKyAgICB2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Omxvb2t1cERPTVdyYXBwZXIo
VjhDbGFzc0luZGV4OjpET01XSU5ET1csIGluZm8uVGhpcygpKTsKICAgICBpZiAoaG9sZGVyLklz
RW1wdHkoKSkKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAKLSAg
ICBET01XaW5kb3cqIHdpbmRvdyA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4o
VjhDbGFzc0luZGV4OjpET01XSU5ET1csIGhvbGRlcik7CisgICAgRE9NV2luZG93KiB3aW5kb3cg
PSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6
OkRPTVdJTkRPVywgaG9sZGVyKTsKICAgICBpZiAoIXdpbmRvdykKICAgICAgICAgcmV0dXJuIG5v
dEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAKQEAgLTc5OSw3ICs3OTksNyBAQAogICAgIEF0b21p
Y1N0cmluZyBwcm9wTmFtZSA9IHY4U3RyaW5nVG9BdG9taWNXZWJDb3JlU3RyaW5nKG5hbWUpOwog
ICAgIEZyYW1lKiBjaGlsZCA9IGZyYW1lLT50cmVlKCktPmNoaWxkKHByb3BOYW1lKTsKICAgICBp
ZiAoY2hpbGQpCi0gICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRl
eDo6RE9NV0lORE9XLCBjaGlsZC0+ZG9tV2luZG93KCkpOworICAgICAgICByZXR1cm4gVjhQcm94
eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGNoaWxkLT5kb21X
aW5kb3coKSk7CiAKICAgICAvLyBTZWFyY2ggSURMIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBw
cm90b3R5cGUKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmVzdWx0ID0gaG9sZGVyLT5HZXRS
ZWFsTmFtZWRQcm9wZXJ0eUluUHJvdG90eXBlQ2hhaW4obmFtZSk7CkBAIC04MTIsOSArODEyLDkg
QEAKICAgICAgICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBpdGVtcyA9IGRvYy0+d2luZG93TmFt
ZWRJdGVtcyhwcm9wTmFtZSk7CiAgICAgICAgIGlmIChpdGVtcy0+bGVuZ3RoKCkgPj0gMSkgewog
ICAgICAgICAgICAgaWYgKGl0ZW1zLT5sZW5ndGgoKSA9PSAxKQotICAgICAgICAgICAgICAgIHJl
dHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChpdGVtcy0+Zmlyc3RJdGVtKCkpOworICAgICAg
ICAgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QoaXRlbXMtPmZp
cnN0SXRlbSgpKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gVjhQ
cm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBpdGVtcy5nZXQo
KSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4
Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGl0ZW1zLmdldCgpKTsKICAgICAgICAgfQogICAg
IH0KIApAQCAtODU2LDggKzg1Niw4IEBACiB2b2lkIFY4Q3VzdG9tOjpDbGVhclRpbWVvdXRJbXBs
KGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCiB7CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+
IGhvbGRlciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgRE9NV2luZG93KiBpbXAgPSBWOFByb3h5OjpU
b05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIp
OwotICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkK
KyAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01X
aW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOworICAgIGlmICghVjhQcm94
eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKICAgICAgICAgcmV0dXJuOwog
ICAgIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxTY3JpcHRF
eGVjdXRpb25Db250ZXh0Kj4oaW1wLT5mcmFtZSgpLT5kb2N1bWVudCgpKTsKICAgICBpbnQgaGFu
ZGxlID0gdG9JbnQzMihhcmdzWzBdKTsKQEAgLTg4MiwxMSArODgyLDExIEBACiBOQU1FRF9BQ0NF
U1NfQ0hFQ0soRE9NV2luZG93KQogewogICAgIEFTU0VSVChWOENsYXNzSW5kZXg6OkZyb21JbnQo
ZGF0YS0+SW50MzJWYWx1ZSgpKSA9PSBWOENsYXNzSW5kZXg6OkRPTVdJTkRPVyk7Ci0gICAgdjg6
OkhhbmRsZTx2ODo6VmFsdWU+IHdpbmRvdyA9IFY4UHJveHk6Okxvb2t1cERPTVdyYXBwZXIoVjhD
bGFzc0luZGV4OjpET01XSU5ET1csIGhvc3QpOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3
aW5kb3cgPSBWOFByb3h5Ojpsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9X
LCBob3N0KTsKICAgICBpZiAod2luZG93LklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIGZhbHNl
OyAgLy8gdGhlIGZyYW1lIGlzIGdvbmUuCiAKLSAgICBET01XaW5kb3cqIHRhcmdldFdpbmRvdyA9
IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5E
T1csIHdpbmRvdyk7CisgICAgRE9NV2luZG93KiB0YXJnZXRXaW5kb3cgPSBWOFByb3h5Ojpjb252
ZXJ0VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgd2lu
ZG93KTsKIAogICAgIEFTU0VSVCh0YXJnZXRXaW5kb3cpOwogCkBAIC05MDIsMTcgKzkwMiwxNyBA
QAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIFY4UHJveHk6
OkNhbkFjY2Vzc0ZyYW1lKHRhcmdldCwgZmFsc2UpOworICAgIHJldHVybiBWOFByb3h5OjpjYW5B
Y2Nlc3NGcmFtZSh0YXJnZXQsIGZhbHNlKTsKIH0KIAogSU5ERVhFRF9BQ0NFU1NfQ0hFQ0soRE9N
V2luZG93KQogewogICAgIEFTU0VSVChWOENsYXNzSW5kZXg6OkZyb21JbnQoZGF0YS0+SW50MzJW
YWx1ZSgpKSA9PSBWOENsYXNzSW5kZXg6OkRPTVdJTkRPVyk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IHdpbmRvdyA9IFY4UHJveHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpE
T01XSU5ET1csIGhvc3QpOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3aW5kb3cgPSBWOFBy
b3h5Ojpsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob3N0KTsKICAg
ICBpZiAod2luZG93LklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgRE9N
V2luZG93KiB0YXJnZXRXaW5kb3cgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+
KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCB3aW5kb3cpOworICAgIERPTVdpbmRvdyogdGFyZ2V0
V2luZG93ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFz
c0luZGV4OjpET01XSU5ET1csIHdpbmRvdyk7CiAKICAgICBBU1NFUlQodGFyZ2V0V2luZG93KTsK
IApAQCAtOTI0LDcgKzkyNCw3IEBACiAgICAgaWYgKCh0eXBlID09IHY4OjpBQ0NFU1NfR0VUIHx8
IHR5cGUgPT0gdjg6OkFDQ0VTU19IQVMpICYmIHRhcmdldC0+dHJlZSgpLT5jaGlsZChpbmRleCkp
CiAgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgcmV0dXJuIFY4UHJveHk6OkNhbkFjY2Vzc0Zy
YW1lKHRhcmdldCwgZmFsc2UpOworICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZSh0
YXJnZXQsIGZhbHNlKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21YUGF0aE5TUmVzb2x2ZXIuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tWFBhdGhOU1Jlc29sdmVy
LmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1
c3RvbVhQYXRoTlNSZXNvbHZlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYxLDcgKzYxLDcgQEAK
IAogICAgIGlmIChsb29rdXBOYW1lc3BhY2VVUklGdW5jLklzRW1wdHkoKSAmJiAhbV9yZXNvbHZl
ci0+SXNGdW5jdGlvbigpKSB7CiAgICAgICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6OnJldHJp
ZXZlRnJhbWVGb3JFbnRlcmVkQ29udGV4dCgpOwotICAgICAgICBsb2dfaW5mbyhmcmFtZSwgIlhQ
YXRoTlNSZXNvbHZlciBkb2VzIG5vdCBoYXZlIGEgbG9va3VwTmFtZXNwYWNlVVJJIG1ldGhvZC4i
LCBTdHJpbmcoKSk7CisgICAgICAgIGxvZ0luZm8oZnJhbWUsICJYUGF0aE5TUmVzb2x2ZXIgZG9l
cyBub3QgaGF2ZSBhIGxvb2t1cE5hbWVzcGFjZVVSSSBtZXRob2QuIiwgU3RyaW5nKCkpOwogICAg
ICAgICByZXR1cm4gU3RyaW5nKCk7CiAgICAgfQogCkBAIC03NCw3ICs3NCw3IEBACiAgICAgdjg6
OkhhbmRsZTx2ODo6RnVuY3Rpb24+IGZ1bmN0aW9uID0gbG9va3VwTmFtZXNwYWNlVVJJRnVuYy5J
c0VtcHR5KCkgPyB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj46OkNhc3QobV9yZXNvbHZlcikgOiBs
b29rdXBOYW1lc3BhY2VVUklGdW5jOwogCiAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5Ojpy
ZXRyaWV2ZSgpOwotICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiByZXR2YWwgPSBwcm94eS0+Q2Fs
bEZ1bmN0aW9uKGZ1bmN0aW9uLCBtX3Jlc29sdmVyLCBhcmdjLCBhcmd2KTsKKyAgICB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gcmV0dmFsID0gcHJveHktPmNhbGxGdW5jdGlvbihmdW5jdGlvbiwgbV9y
ZXNvbHZlciwgYXJnYywgYXJndik7CiAKICAgICAvLyBFYXQgZXhjZXB0aW9ucyBmcm9tIG5hbWVz
cGFjZSByZXNvbHZlciBhbmQgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4gVGhpcyB3aWxsIG1vc3Qg
bGlrZWx5IGNhdXNlIE5BTUVTUEFDRV9FUlIuCiAgICAgaWYgKHRyeV9jYXRjaC5IYXNDYXVnaHQo
KSkKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V29ya2VyQ3VzdG9tLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckN1c3RvbS5j
cHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhXb3Jr
ZXJDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04Myw3ICs4Myw3IEBACiAgICAgfQogCiAg
ICAgLy8gQ3JlYXRlIHRoZSB3b3JrZXIgb2JqZWN0LgotICAgIC8vIE5vdGU6IGl0J3MgT0sgdG8g
bGV0IHRoaXMgUmVmUHRyIGdvIG91dCBvZiBzY29wZSBiZWNhdXNlIHdlIGFsc28gY2FsbCBTZXRE
T01XcmFwcGVyKCksIHdoaWNoIGVmZmVjdGl2ZWx5IGhvbGRzIGEgcmVmZXJlbmNlIHRvIG9iai4K
KyAgICAvLyBOb3RlOiBpdCdzIE9LIHRvIGxldCB0aGlzIFJlZlB0ciBnbyBvdXQgb2Ygc2NvcGUg
YmVjYXVzZSB3ZSBhbHNvIGNhbGwgc2V0RE9NV3JhcHBlcigpLCB3aGljaCBlZmZlY3RpdmVseSBo
b2xkcyBhIHJlZmVyZW5jZSB0byBvYmouCiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAg
UmVmUHRyPFdvcmtlcj4gb2JqID0gV29ya2VyOjpjcmVhdGUodG9XZWJDb3JlU3RyaW5nKHNjcmlw
dFVybCksIGNvbnRleHQsIGVjKTsKIApAQCAtOTIsMTAgKzkyLDEwIEBACiAKICAgICAvLyBTZXR1
cCB0aGUgc3RhbmRhcmQgd3JhcHBlciBvYmplY3QgaW50ZXJuYWwgZmllbGRzLgogICAgIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlck9iamVjdCA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgVjhQ
cm94eTo6U2V0RE9NV3JhcHBlcih3cmFwcGVyT2JqZWN0LCBWOENsYXNzSW5kZXg6OldPUktFUiwg
b2JqLmdldCgpKTsKKyAgICBWOFByb3h5OjpzZXRET01XcmFwcGVyKHdyYXBwZXJPYmplY3QsIFY4
Q2xhc3NJbmRleDo6V09SS0VSLCBvYmouZ2V0KCkpOwogCiAgICAgb2JqLT5yZWYoKTsKLSAgICBW
OFByb3h5OjpTZXRKU1dyYXBwZXJGb3JBY3RpdmVET01PYmplY3Qob2JqLmdldCgpLCB2ODo6UGVy
c2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHdyYXBwZXJPYmplY3QpKTsKKyAgICBWOFByb3h5Ojpz
ZXRKU1dyYXBwZXJGb3JBY3RpdmVET01PYmplY3Qob2JqLmdldCgpLCB2ODo6UGVyc2lzdGVudDx2
ODo6T2JqZWN0Pjo6TmV3KHdyYXBwZXJPYmplY3QpKTsKIAogICAgIHJldHVybiB3cmFwcGVyT2Jq
ZWN0OwogfQpAQCAtMTEwLDcgKzExMCw3IEBACiAKICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJv
eHk6OnJldHJpZXZlKHdvcmtlci0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpKTsKICAgICBpZiAo
cHJveHkpCi0gICAgICAgIHJldHVybiBmaW5kT25seSA/IHByb3h5LT5GaW5kT2JqZWN0RXZlbnRM
aXN0ZW5lcih2YWx1ZSwgZmFsc2UpIDogcHJveHktPkZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlz
dGVuZXIodmFsdWUsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIGZpbmRPbmx5ID8gcHJveHktPmZp
bmRPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBmYWxzZSkgOiBwcm94eS0+ZmluZE9yQ3JlYXRl
T2JqZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2UpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBA
IC0xMTgsNyArMTE4LDcgQEAKIEFDQ0VTU09SX0dFVFRFUihXb3JrZXJPbm1lc3NhZ2UpCiB7CiAg
ICAgSU5DX1NUQVRTKEwiRE9NLldvcmtlci5vbm1lc3NhZ2UuX2dldCIpOwotICAgIFdvcmtlciog
d29ya2VyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8V29ya2VyPihWOENsYXNzSW5kZXg6OldP
UktFUiwgaW5mby5Ib2xkZXIoKSk7CisgICAgV29ya2VyKiB3b3JrZXIgPSBWOFByb3h5Ojpjb252
ZXJ0VG9OYXRpdmVPYmplY3Q8V29ya2VyPihWOENsYXNzSW5kZXg6OldPUktFUiwgaW5mby5Ib2xk
ZXIoKSk7CiAgICAgaWYgKHdvcmtlci0+b25tZXNzYWdlKCkpIHsKICAgICAgICAgVjhPYmplY3RF
dmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5l
cio+KHdvcmtlci0+b25tZXNzYWdlKCkpOwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4g
djhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMTMwLDcgKzEz
MCw3IEBACiBBQ0NFU1NPUl9TRVRURVIoV29ya2VyT25tZXNzYWdlKQogewogICAgIElOQ19TVEFU
UyhMIkRPTS5Xb3JrZXIub25tZXNzYWdlLl9zZXQiKTsKLSAgICBXb3JrZXIqIHdvcmtlciA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlcj4oVjhDbGFzc0luZGV4OjpXT1JLRVIsIGluZm8u
SG9sZGVyKCkpOworICAgIFdvcmtlciogd29ya2VyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PFdvcmtlcj4oVjhDbGFzc0luZGV4OjpXT1JLRVIsIGluZm8uSG9sZGVyKCkpOwogICAg
IFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogb2xkTGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVj
dEV2ZW50TGlzdGVuZXIqPih3b3JrZXItPm9ubWVzc2FnZSgpKTsKICAgICBpZiAodmFsdWUtPklz
TnVsbCgpKSB7CiAgICAgICAgIGlmIChvbGRMaXN0ZW5lcikgewpAQCAtMTU3LDcgKzE1Nyw3IEBA
CiBBQ0NFU1NPUl9HRVRURVIoV29ya2VyT25lcnJvcikKIHsKICAgICBJTkNfU1RBVFMoTCJET00u
V29ya2VyLm9uZXJyb3IuX2dldCIpOwotICAgIFdvcmtlciogd29ya2VyID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8V29ya2VyPihWOENsYXNzSW5kZXg6OldPUktFUiwgaW5mby5Ib2xkZXIoKSk7
CisgICAgV29ya2VyKiB3b3JrZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8V29y
a2VyPihWOENsYXNzSW5kZXg6OldPUktFUiwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHdvcmtl
ci0+b25lcnJvcigpKSB7CiAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIg
PSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih3b3JrZXItPm9uZXJyb3IoKSk7
CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB2OExpc3RlbmVyID0gbGlzdGVuZXItPmdl
dExpc3RlbmVyT2JqZWN0KCk7CkBAIC0xNjksNyArMTY5LDcgQEAKIEFDQ0VTU09SX1NFVFRFUihX
b3JrZXJPbmVycm9yKQogewogICAgIElOQ19TVEFUUyhMIkRPTS5Xb3JrZXIub25lcnJvci5fc2V0
Iik7Ci0gICAgV29ya2VyKiB3b3JrZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxXb3JrZXI+
KFY4Q2xhc3NJbmRleDo6V09SS0VSLCBpbmZvLkhvbGRlcigpKTsKKyAgICBXb3JrZXIqIHdvcmtl
ciA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxXb3JrZXI+KFY4Q2xhc3NJbmRleDo6
V09SS0VSLCBpbmZvLkhvbGRlcigpKTsKICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIG9sZExp
c3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4od29ya2VyLT5vbmVy
cm9yKCkpOwogICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsKICAgICAgICAgaWYgKG9sZExpc3Rl
bmVyKSB7CkBAIC0xOTYsNyArMTk2LDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChXb3JrZXJBZGRF
dmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFUUyhMIkRPTS5Xb3JrZXIuYWRkRXZlbnRMaXN0
ZW5lcigpIik7Ci0gICAgV29ya2VyKiB3b3JrZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxX
b3JrZXI+KFY4Q2xhc3NJbmRleDo6V09SS0VSLCBhcmdzLkhvbGRlcigpKTsKKyAgICBXb3JrZXIq
IHdvcmtlciA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxXb3JrZXI+KFY4Q2xhc3NJ
bmRleDo6V09SS0VSLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFJlZlB0cjxFdmVudExpc3RlbmVy
PiBsaXN0ZW5lciA9IGdldEV2ZW50TGlzdGVuZXIod29ya2VyLCBhcmdzWzFdLCBmYWxzZSk7CiAg
ICAgaWYgKGxpc3RlbmVyKSB7CkBAIC0yMTIsNyArMjEyLDcgQEAKIENBTExCQUNLX0ZVTkNfREVD
TChXb3JrZXJSZW1vdmVFdmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFUUyhMIkRPTS5Xb3Jr
ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigpIik7Ci0gICAgV29ya2VyKiB3b3JrZXIgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxXb3JrZXI+KFY4Q2xhc3NJbmRleDo6V09SS0VSLCBhcmdzLkhvbGRl
cigpKTsKKyAgICBXb3JrZXIqIHdvcmtlciA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVj
dDxXb3JrZXI+KFY4Q2xhc3NJbmRleDo6V09SS0VSLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFJl
ZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IGdldEV2ZW50TGlzdGVuZXIod29ya2VyLCBh
cmdzWzFdLCB0cnVlKTsKICAgICBpZiAobGlzdGVuZXIpIHsKSW5kZXg6IFdlYkNvcmUvYmluZGlu
Z3MvdjgvY3VzdG9tL1Y4SFRNTENhbnZhc0VsZW1lbnRDdXN0b20uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTENhbnZhc0VsZW1lbnRDdXN0b20uY3Bw
CShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTENh
bnZhc0VsZW1lbnRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MCwxMiArNDAsMTIgQEAK
IAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEhUTUxDYW52YXNFbGVtZW50R2V0Q29udGV4dCkKIHsKLSAg
ICBJTkNfU1RBVFMoIkRPTS5IVE1MQ2FudmFzRWxlbWVudC5nZXRDb250ZXh0Iik7CisgICAgSU5D
X1NUQVRTKCJET00uSFRNTENhbnZhc0VsZW1lbnQuY29udGV4dCIpOwogICAgIHY4OjpIYW5kbGU8
djg6OlZhbHVlPiBob2xkZXIgPSBhcmdzLkhvbGRlcigpOwotICAgIEhUTUxDYW52YXNFbGVtZW50
KiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxDYW52YXNFbGVtZW50Pihob2xk
ZXIpOworICAgIEhUTUxDYW52YXNFbGVtZW50KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3Jh
cHBlclRvTm9kZTxIVE1MQ2FudmFzRWxlbWVudD4oaG9sZGVyKTsKICAgICBTdHJpbmcgY29udGV4
dElkID0gVG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgIENhbnZhc1JlbmRlcmluZ0NvbnRl
eHQyRCogcmVzdWx0ID0gaW1wLT5nZXRDb250ZXh0KGNvbnRleHRJZCk7Ci0gICAgcmV0dXJuIFY4
UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQs
IHJlc3VsdCk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJ
bmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCByZXN1bHQpOwogfQogCiB9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdlYktpdFBv
aW50Q29uc3RydWN0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4V2ViS2l0UG9pbnRDb25zdHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhXZWJLaXRQb2ludENvbnN0cnVjdG9yLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNDAsNyArNDAsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFdlYktpdFBv
aW50Q29uc3RydWN0b3IpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uV2ViS2l0UG9pbnQuQ29uc3Ry
dWN0b3IiKTsKLSAgICByZXR1cm4gVjhQcm94eTo6Q29uc3RydWN0RE9NT2JqZWN0PFY4Q2xhc3NJ
bmRleDo6V0VCS0lUUE9JTlQsIFdlYktpdFBvaW50PihhcmdzKTsKKyAgICByZXR1cm4gVjhQcm94
eTo6Y29uc3RydWN0RE9NT2JqZWN0PFY4Q2xhc3NJbmRleDo6V0VCS0lUUE9JTlQsIFdlYktpdFBv
aW50PihhcmdzKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhDYW52YXNQaXhlbEFycmF5Q3VzdG9tLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOENhbnZhc1BpeGVsQXJyYXlDdXN0b20u
Y3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2Fu
dmFzUGl4ZWxBcnJheUN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQxLDcgKzQxLDcgQEAK
IElOREVYRURfUFJPUEVSVFlfR0VUVEVSKENhbnZhc1BpeGVsQXJyYXkpCiB7CiAgICAgSU5DX1NU
QVRTKCJET00uQ2FudmFzUGl4ZWxBcnJheS5JbmRleGVkUHJvcGVydHlHZXR0ZXIiKTsKLSAgICBD
YW52YXNQaXhlbEFycmF5KiBwaXhlbEJ1ZmZlciA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENh
bnZhc1BpeGVsQXJyYXk+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUElYRUxBUlJBWSwgaW5mby5Ib2xk
ZXIoKSk7CisgICAgQ2FudmFzUGl4ZWxBcnJheSogcGl4ZWxCdWZmZXIgPSBWOFByb3h5Ojpjb252
ZXJ0VG9OYXRpdmVPYmplY3Q8Q2FudmFzUGl4ZWxBcnJheT4oVjhDbGFzc0luZGV4OjpDQU5WQVNQ
SVhFTEFSUkFZLCBpbmZvLkhvbGRlcigpKTsKIAogICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5k
ZXggPj0gcGl4ZWxCdWZmZXItPmxlbmd0aCgpKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmlu
ZWQoKTsKQEAgLTU1LDcgKzU1LDcgQEAKIElOREVYRURfUFJPUEVSVFlfU0VUVEVSKENhbnZhc1Bp
eGVsQXJyYXkpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUGl4ZWxBcnJheS5JbmRleGVk
UHJvcGVydHlTZXR0ZXIiKTsKLSAgICBDYW52YXNQaXhlbEFycmF5KiBwaXhlbEJ1ZmZlciA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZhc1BpeGVsQXJyYXk+KFY4Q2xhc3NJbmRleDo6Q0FO
VkFTUElYRUxBUlJBWSwgaW5mby5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUGl4ZWxBcnJheSogcGl4
ZWxCdWZmZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2FudmFzUGl4ZWxBcnJh
eT4oVjhDbGFzc0luZGV4OjpDQU5WQVNQSVhFTEFSUkFZLCBpbmZvLkhvbGRlcigpKTsKIAogICAg
IGlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwgcGl4ZWxCdWZmZXItPmxlbmd0aCgpKSkKICAg
ICAgICAgcGl4ZWxCdWZmZXItPnNldChpbmRleCwgdmFsdWUtPk51bWJlclZhbHVlKCkpOwpJbmRl
eDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21Wb2lkQ2FsbGJhY2suY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tVm9pZENhbGxi
YWNrLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OEN1c3RvbVZvaWRDYWxsYmFjay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUwLDcgKzUwLDcgQEAK
IHsKICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CiAKLSAgICB2ODo6SGFuZGxlPHY4
OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChtX2ZyYW1lLmdldCgpKTsK
KyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6Y29udGV4dCht
X2ZyYW1lLmdldCgpKTsKICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCiAgICAgICAgIHJldHVy
bjsKIApAQCAtODcsNyArODcsNyBAQAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0
cmlldmUoKTsKICAgICBBU1NFUlQocHJveHkpOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+
IHJlc3VsdCA9IHByb3h5LT5DYWxsRnVuY3Rpb24oY2FsbGJhY2tGdW5jdGlvbiwgdGhpc09iamVj
dCwgYXJnYywgYXJndik7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJlc3VsdCA9IHByb3h5
LT5jYWxsRnVuY3Rpb24oY2FsbGJhY2tGdW5jdGlvbiwgdGhpc09iamVjdCwgYXJnYywgYXJndik7
CiAKICAgICBjYWxsYmFja1JldHVyblZhbHVlID0gcmVzdWx0LklzRW1wdHkoKSAmJiByZXN1bHQt
PklzQm9vbGVhbigpICYmIHJlc3VsdC0+Qm9vbGVhblZhbHVlKCk7CiAKSW5kZXg6IFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4V29ya2VyQ29udGV4dEN1c3RvbS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhXb3JrZXJDb250ZXh0Q3VzdG9tLmNwcAko
cmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckNv
bnRleHRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00OSwxNCArNDksMTQgQEAKIEFDQ0VT
U09SX0dFVFRFUihXb3JrZXJDb250ZXh0U2VsZikKIHsKICAgICBJTkNfU1RBVFMoTCJET00uV29y
a2VyQ29udGV4dC5zZWxmLl9nZXQiKTsKLSAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8V29ya2VyQ29udGV4dD4oVjhDbGFzc0luZGV4OjpX
T1JLRVJDT05URVhULCBpbmZvLkhvbGRlcigpKTsKKyAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJD
b250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4
Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgcmV0dXJuIFdv
cmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6V29ya2VyQ29udGV4dFRvVjhPYmplY3Qod29ya2Vy
Q29udGV4dCk7CiB9CiAKIEFDQ0VTU09SX0dFVFRFUihXb3JrZXJDb250ZXh0T25tZXNzYWdlKQog
ewogICAgIElOQ19TVEFUUyhMIkRPTS5Xb3JrZXJDb250ZXh0Lm9ubWVzc2FnZS5fZ2V0Iik7Ci0g
ICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0
PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCwgaW5mby5Ib2xkZXIo
KSk7CisgICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9IFY4UHJveHk6OmNvbnZlcnRU
b05hdGl2ZU9iamVjdDxXb3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQs
IGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh3b3JrZXJDb250ZXh0LT5vbm1lc3NhZ2UoKSkgewog
ICAgICAgICBWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRpY19j
YXN0PFY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIqPih3b3JrZXJDb250ZXh0LT5vbm1lc3Nh
Z2UoKSk7CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB2OExpc3RlbmVyID0gbGlzdGVu
ZXItPmdldExpc3RlbmVyT2JqZWN0KCk7CkBAIC02OCw3ICs2OCw3IEBACiBBQ0NFU1NPUl9TRVRU
RVIoV29ya2VyQ29udGV4dE9ubWVzc2FnZSkKIHsKICAgICBJTkNfU1RBVFMoTCJET00uV29ya2Vy
Q29udGV4dC5vbm1lc3NhZ2UuX3NldCIpOwotICAgIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRl
eHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxXb3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6
OldPUktFUkNPTlRFWFQsIGluZm8uSG9sZGVyKCkpOworICAgIFdvcmtlckNvbnRleHQqIHdvcmtl
ckNvbnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8V29ya2VyQ29udGV4dD4o
VjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhULCBpbmZvLkhvbGRlcigpKTsKICAgICBWOFdvcmtl
ckNvbnRleHRFdmVudExpc3RlbmVyKiBvbGRMaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4V29ya2Vy
Q29udGV4dEV2ZW50TGlzdGVuZXIqPih3b3JrZXJDb250ZXh0LT5vbm1lc3NhZ2UoKSk7CiAgICAg
aWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAod29ya2VyQ29udGV4dC0+b25tZXNz
YWdlKCkpIHsKQEAgLTk0LDcgKzk0LDcgQEAKIAogdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFNldFRp
bWVvdXRPckludGVydmFsKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MsIGJvb2wgc2luZ2xlU2hv
dCkKIHsKLSAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94eTo6VG9OYXRp
dmVPYmplY3Q8V29ya2VyQ29udGV4dD4oVjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhULCBhcmdz
LkhvbGRlcigpKTsKKyAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94eTo6
Y29udmVydFRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VS
Q09OVEVYVCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBpbnQgYXJndW1lbnRDb3VudCA9IGFyZ3Mu
TGVuZ3RoKCk7CiAgICAgaWYgKGFyZ3VtZW50Q291bnQgPCAxKQpAQCAtMTMxLDggKzEzMSw4IEBA
CiAgICAgaWYgKCFhcmdzLkxlbmd0aCgpKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgp
OwogCi0gICAgU3RyaW5nIGNhbGxlclVSTCA9IFY4UHJveHk6OkdldFNvdXJjZU5hbWUoKTsKLSAg
ICBpbnQgY2FsbGVyTGluZSA9IFY4UHJveHk6OkdldFNvdXJjZUxpbmVOdW1iZXIoKSArIDE7Cisg
ICAgU3RyaW5nIGNhbGxlclVSTCA9IFY4UHJveHk6OnNvdXJjZU5hbWUoKTsKKyAgICBpbnQgY2Fs
bGVyTGluZSA9IFY4UHJveHk6OnNvdXJjZUxpbmVOdW1iZXIoKSArIDE7CiAKICAgICBWZWN0b3I8
U3RyaW5nPiB1cmxzOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5MZW5ndGgoKTsgaSsr
KSB7CkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICAgICAgdXJscy5hcHBlbmQodG9XZWJDb3JlU3Ry
aW5nKHNjcmlwdFVybCkpOwogICAgIH0KIAotICAgIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRl
eHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxXb3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6
OldPUktFUkNPTlRFWFQsIGFyZ3MuSG9sZGVyKCkpOworICAgIFdvcmtlckNvbnRleHQqIHdvcmtl
ckNvbnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8V29ya2VyQ29udGV4dD4o
VjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhULCBhcmdzLkhvbGRlcigpKTsKIAogICAgIEV4Y2Vw
dGlvbkNvZGUgZWMgPSAwOwogICAgIHdvcmtlckNvbnRleHQtPmltcG9ydFNjcmlwdHModXJscywg
Y2FsbGVyVVJMLCBjYWxsZXJMaW5lLCBlYyk7CkBAIC0xNjgsNyArMTY4LDcgQEAKIENBTExCQUNL
X0ZVTkNfREVDTChXb3JrZXJDb250ZXh0QWRkRXZlbnRMaXN0ZW5lcikKIHsKICAgICBJTkNfU1RB
VFMoTCJET00uV29ya2VyQ29udGV4dC5hZGRFdmVudExpc3RlbmVyKCkiKTsKLSAgICBXb3JrZXJD
b250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8V29ya2VyQ29u
dGV4dD4oVjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhULCBhcmdzLkhvbGRlcigpKTsKKyAgICBX
b3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2Jq
ZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCwgYXJncy5Ib2xk
ZXIoKSk7CiAKICAgICBSZWZQdHI8VjhFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHdvcmtlckNv
bnRleHQtPnNjcmlwdCgpLT5wcm94eSgpLT5maW5kT3JDcmVhdGVFdmVudExpc3RlbmVyKHY4OjpM
b2NhbDx2ODo6T2JqZWN0Pjo6Q2FzdChhcmdzWzFdKSwgZmFsc2UsIGZhbHNlKTsKIApAQCAtMTg1
LDcgKzE4NSw3IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woV29ya2VyQ29udGV4dFJlbW92ZUV2ZW50
TGlzdGVuZXIpCiB7CiAgICAgSU5DX1NUQVRTKEwiRE9NLldvcmtlckNvbnRleHQucmVtb3ZlRXZl
bnRMaXN0ZW5lcigpIik7Ci0gICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9IFY4UHJv
eHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09O
VEVYVCwgYXJncy5Ib2xkZXIoKSk7CisgICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9
IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxXb3JrZXJDb250ZXh0PihWOENsYXNzSW5k
ZXg6OldPUktFUkNPTlRFWFQsIGFyZ3MuSG9sZGVyKCkpOwogICAgIFdvcmtlckNvbnRleHRFeGVj
dXRpb25Qcm94eSogcHJveHkgPSB3b3JrZXJDb250ZXh0LT5zY3JpcHQoKS0+cHJveHkoKTsKIAog
ICAgIFJlZlB0cjxWOEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPmZpbmRPckNyZWF0
ZUV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpDYXN0KGFyZ3NbMV0pLCBmYWxz
ZSwgdHJ1ZSk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERvY3VtZW50Q3Vz
dG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERvY3Vt
ZW50Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOERvY3VtZW50Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTIsMTYgKzUyLDE2
IEBACiB7CiAgICAgSU5DX1NUQVRTKCJET00uRG9jdW1lbnQuZXZhbHVhdGUoKSIpOwogCi0gICAg
RG9jdW1lbnQqIGRvY3VtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxEb2N1bWVudD4o
YXJncy5Ib2xkZXIoKSk7CisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gVjhQcm94eTo6Y29udmVy
dERPTVdyYXBwZXJUb05vZGU8RG9jdW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOwogICAgIEV4Y2VwdGlv
bkNvZGUgZWMgPSAwOwogICAgIFN0cmluZyBleHByZXNzaW9uID0gdG9XZWJDb3JlU3RyaW5nKGFy
Z3NbMF0pOwogICAgIE5vZGUqIGNvbnRleHROb2RlID0gMDsKICAgICBpZiAoVjhOb2RlOjpIYXNJ
bnN0YW5jZShhcmdzWzFdKSkKLSAgICAgICAgY29udGV4dE5vZGUgPSBWOFByb3h5OjpET01XcmFw
cGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMV0pOworICAgICAgICBjb250ZXh0Tm9kZSA9IFY4UHJveHk6
OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMV0pOwogCiAgICAgWFBhdGhOU1Jl
c29sdmVyKiByZXNvbHZlciA9IDA7CiAgICAgaWYgKFY4WFBhdGhOU1Jlc29sdmVyOjpIYXNJbnN0
YW5jZShhcmdzWzJdKSkKLSAgICAgICAgcmVzb2x2ZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVj
dDxYUGF0aE5TUmVzb2x2ZXI+KFY4Q2xhc3NJbmRleDo6WFBBVEhOU1JFU09MVkVSLCBhcmdzWzJd
KTsKKyAgICAgICAgcmVzb2x2ZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WFBh
dGhOU1Jlc29sdmVyPihWOENsYXNzSW5kZXg6OlhQQVRITlNSRVNPTFZFUiwgYXJnc1syXSk7CiAg
ICAgZWxzZSBpZiAoYXJnc1syXS0+SXNPYmplY3QoKSkKICAgICAgICAgcmVzb2x2ZXIgPSBuZXcg
VjhDdXN0b21YUGF0aE5TUmVzb2x2ZXIoYXJnc1syXS0+VG9PYmplY3QoKSk7CiAgICAgZWxzZSBp
ZiAoIWFyZ3NbMl0tPklzTnVsbCgpICYmICFhcmdzWzJdLT5Jc1VuZGVmaW5lZCgpKQpAQCAtNzAs
NyArNzAsNyBAQAogICAgIGludCB0eXBlID0gdG9JbnQzMihhcmdzWzNdKTsKICAgICBYUGF0aFJl
c3VsdCogaW5SZXN1bHQgPSAwOwogICAgIGlmIChWOFhQYXRoUmVzdWx0OjpIYXNJbnN0YW5jZShh
cmdzWzRdKSkKLSAgICAgICAgaW5SZXN1bHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYUGF0
aFJlc3VsdD4oVjhDbGFzc0luZGV4OjpYUEFUSFJFU1VMVCwgYXJnc1s0XSk7CisgICAgICAgIGlu
UmVzdWx0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhQYXRoUmVzdWx0PihWOENs
YXNzSW5kZXg6OlhQQVRIUkVTVUxULCBhcmdzWzRdKTsKIAogICAgIHY4OjpUcnlDYXRjaCBleGNl
cHRpb25DYXRjaGVyOwogICAgIFJlZlB0cjxYUGF0aFJlc3VsdD4gcmVzdWx0ID0gZG9jdW1lbnQt
PmV2YWx1YXRlKGV4cHJlc3Npb24sIGNvbnRleHROb2RlLCByZXNvbHZlciwgdHlwZSwgaW5SZXN1
bHQsIGVjKTsKQEAgLTgwLDIwICs4MCwyMCBAQAogICAgIGlmIChlYykKICAgICAgICAgcmV0dXJu
IHRocm93RXJyb3IoZWMpOwogCi0gICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFz
c0luZGV4OjpYUEFUSFJFU1VMVCwgcmVzdWx0LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6
Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpYUEFUSFJFU1VMVCwgcmVzdWx0LmdldCgp
KTsKIH0KIAogQ0FMTEJBQ0tfRlVOQ19ERUNMKERvY3VtZW50R2V0Q1NTQ2FudmFzQ29udGV4dCkK
IHsKICAgICBJTkNfU1RBVFMoIkRPTS5Eb2N1bWVudC5nZXRDU1NDYW52YXNDb250ZXh0Iik7CiAg
ICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhvbGRlciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgRG9j
dW1lbnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8RG9jdW1lbnQ+KGhvbGRlcik7
CisgICAgRG9jdW1lbnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPERv
Y3VtZW50Pihob2xkZXIpOwogICAgIFN0cmluZyBjb250ZXh0SWQgPSB0b1dlYkNvcmVTdHJpbmco
YXJnc1swXSk7CiAgICAgU3RyaW5nIG5hbWUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1sxXSk7CiAg
ICAgaW50IHdpZHRoID0gdG9JbnQzMihhcmdzWzJdKTsKICAgICBpbnQgaGVpZ2h0ID0gdG9JbnQz
MihhcmdzWzNdKTsKICAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIHJlc3VsdCA9IGltcC0+
Z2V0Q1NTQ2FudmFzQ29udGV4dChjb250ZXh0SWQsIG5hbWUsIHdpZHRoLCBoZWlnaHQpOwotICAg
IHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5H
Q09OVEVYVDJELCByZXN1bHQpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVj
dChWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgcmVzdWx0KTsKIH0KIAog
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhIVE1MQ29sbGVjdGlvbkN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhIVE1MQ29sbGVjdGlvbkN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQor
KysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MQ29sbGVjdGlvbkN1c3RvbS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTQ3LDEwICs0NywxMCBAQAogICAgICAgICByZXR1cm4gdjg6Okhh
bmRsZTx2ODo6VmFsdWU+KCk7CiAKICAgICBpZiAobmFtZWRJdGVtcy5zaXplKCkgPT0gMSkKLSAg
ICAgICAgcmV0dXJuIFY4UHJveHk6Ok5vZGVUb1Y4T2JqZWN0KG5hbWVkSXRlbXMuYXQoMCkuZ2V0
KCkpOworICAgICAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KG5hbWVk
SXRlbXMuYXQoMCkuZ2V0KCkpOwogCiAgICAgTm9kZUxpc3QqIGxpc3QgPSBuZXcgVjhOYW1lZE5v
ZGVzQ29sbGVjdGlvbihuYW1lZEl0ZW1zKTsKLSAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVj
dChWOENsYXNzSW5kZXg6Ok5PREVMSVNULCBsaXN0KTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29u
dmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpOT0RFTElTVCwgbGlzdCk7CiB9CiAKIHN0YXRp
YyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZ2V0SXRlbShIVE1MQ29sbGVjdGlvbiogY29sbGVjdGlv
biwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZ3VtZW50KQpAQCAtNjYsNyArNjYsNyBAQAogICAg
IH0KIAogICAgIFJlZlB0cjxOb2RlPiByZXN1bHQgPSBjb2xsZWN0aW9uLT5pdGVtKGluZGV4LT5V
aW50MzJWYWx1ZSgpKTsKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0
LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3Vs
dC5nZXQoKSk7CiB9CiAKIE5BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MQ29sbGVjdGlvbikKQEAg
LTg0LDIxICs4NCwyMSBAQAogICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7
CiAKICAgICAvLyBGaW5hbGx5LCBzZWFyY2ggdGhlIERPTSBzdHJ1Y3R1cmUuCi0gICAgSFRNTENv
bGxlY3Rpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PEhUTUxDb2xsZWN0aW9uPihW
OENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MQ29s
bGVjdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PEhUTUxDb2xsZWN0
aW9uPihWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBpbmZvLkhvbGRlcigpKTsKICAgICBy
ZXR1cm4gZ2V0TmFtZWRJdGVtcyhpbXAsIHY4U3RyaW5nVG9BdG9taWNXZWJDb3JlU3RyaW5nKG5h
bWUpKTsKIH0KIAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEhUTUxDb2xsZWN0aW9uSXRlbSkKIHsKICAg
ICBJTkNfU1RBVFMoIkRPTS5IVE1MQ29sbGVjdGlvbi5pdGVtKCkiKTsKLSAgICBIVE1MQ29sbGVj
dGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SFRNTENvbGxlY3Rpb24+KFY4Q2xh
c3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGFyZ3MuSG9sZGVyKCkpOworICAgIEhUTUxDb2xsZWN0
aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8SFRNTENvbGxlY3Rpb24+
KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGFyZ3MuSG9sZGVyKCkpOwogICAgIHJldHVy
biBnZXRJdGVtKGltcCwgYXJnc1swXSk7CiB9CiAKIENBTExCQUNLX0ZVTkNfREVDTChIVE1MQ29s
bGVjdGlvbk5hbWVkSXRlbSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MQ29sbGVjdGlvbi5u
YW1lZEl0ZW0oKSIpOwotICAgIEhUTUxDb2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2
ZU9iamVjdDxIVE1MQ29sbGVjdGlvbj4oVjhDbGFzc0luZGV4OjpIVE1MQ09MTEVDVElPTiwgYXJn
cy5Ib2xkZXIoKSk7CisgICAgSFRNTENvbGxlY3Rpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRU
b05hdGl2ZU9iamVjdDxIVE1MQ29sbGVjdGlvbj4oVjhDbGFzc0luZGV4OjpIVE1MQ09MTEVDVElP
TiwgYXJncy5Ib2xkZXIoKSk7CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJlc3VsdCA9IGdl
dE5hbWVkSXRlbXMoaW1wLCB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOwogCiAgICAgaWYgKHJl
c3VsdC5Jc0VtcHR5KCkpCkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICBpZiAoYXJncy5MZW5ndGgo
KSA8IDEpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICBIVE1MQ29sbGVj
dGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SFRNTENvbGxlY3Rpb24+KFY4Q2xh
c3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGFyZ3MuSG9sZGVyKCkpOworICAgIEhUTUxDb2xsZWN0
aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8SFRNTENvbGxlY3Rpb24+
KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgaWYg
KGFyZ3MuTGVuZ3RoKCkgPT0gMSkKICAgICAgICAgcmV0dXJuIGdldEl0ZW0oaW1wLCBhcmdzWzBd
KTsKQEAgLTEyOCw3ICsxMjgsNyBAQAogICAgIE5vZGUqIG5vZGUgPSBpbXAtPm5hbWVkSXRlbShu
YW1lKTsKICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICBpZiAoIWN1cnJlbnQpCi0gICAgICAg
ICAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3Qobm9kZSk7CisgICAgICAgICAgICBy
ZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KG5vZGUpOwogCiAgICAgICAgIG5v
ZGUgPSBpbXAtPm5leHROYW1lZEl0ZW0obmFtZSk7CiAgICAgICAgIGN1cnJlbnQtLTsKSW5kZXg6
IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RXZlbnRDdXN0b20uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RXZlbnRDdXN0b20uY3BwCShyZXZpc2lv
biA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RXZlbnRDdXN0b20uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC00MywzOSArNDMsMzkgQEAKIAogQUNDRVNTT1JfU0VUVEVSKEV2
ZW50UmV0dXJuVmFsdWUpCiB7Ci0gICAgRXZlbnQqIGV2ZW50ID0gVjhQcm94eTo6RE9NV3JhcHBl
clRvTmF0aXZlPEV2ZW50PihpbmZvLkhvbGRlcigpKTsKKyAgICBFdmVudCogZXZlbnQgPSBWOFBy
b3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPEV2ZW50PihpbmZvLkhvbGRlcigpKTsKICAg
ICBldmVudC0+c2V0RGVmYXVsdFByZXZlbnRlZCghdmFsdWUtPkJvb2xlYW5WYWx1ZSgpKTsKIH0K
IAogQUNDRVNTT1JfR0VUVEVSKEV2ZW50RGF0YVRyYW5zZmVyKQogewotICAgIEV2ZW50KiBldmVu
dCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05hdGl2ZTxFdmVudD4oaW5mby5Ib2xkZXIoKSk7Cisg
ICAgRXZlbnQqIGV2ZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxFdmVu
dD4oaW5mby5Ib2xkZXIoKSk7CiAKICAgICBpZiAoZXZlbnQtPmlzRHJhZ0V2ZW50KCkpCi0gICAg
ICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBz
dGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZlbnQpLT5jbGlwYm9hcmQoKSk7CisgICAgICAgIHJl
dHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNMSVBCT0FSRCwg
c3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2ZW50KS0+Y2xpcGJvYXJkKCkpOwogCiAgICAgcmV0
dXJuIHY4OjpVbmRlZmluZWQoKTsKIH0KIAogQUNDRVNTT1JfR0VUVEVSKEV2ZW50Q2xpcGJvYXJk
RGF0YSkKIHsKLSAgICBFdmVudCogZXZlbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8
RXZlbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEV2ZW50KiBldmVudCA9IFY4UHJveHk6OmNvbnZl
cnRET01XcmFwcGVyVG9OYXRpdmU8RXZlbnQ+KGluZm8uSG9sZGVyKCkpOwogCiAgICAgaWYgKGV2
ZW50LT5pc0NsaXBib2FyZEV2ZW50KCkpCi0gICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2Jq
ZWN0KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBzdGF0aWNfY2FzdDxDbGlwYm9hcmRFdmVudCo+
KGV2ZW50KS0+Y2xpcGJvYXJkKCkpOworICAgICAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRv
VjhPYmplY3QoVjhDbGFzc0luZGV4OjpDTElQQk9BUkQsIHN0YXRpY19jYXN0PENsaXBib2FyZEV2
ZW50Kj4oZXZlbnQpLT5jbGlwYm9hcmQoKSk7CiAKICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgp
OwogfQogCiBBQ0NFU1NPUl9HRVRURVIoRXZlbnRTcmNFbGVtZW50KQogewotICAgIEV2ZW50KiBl
dmVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05hdGl2ZTxFdmVudD4oaW5mby5Ib2xkZXIoKSk7
Ci0gICAgcmV0dXJuIFY4UHJveHk6OkV2ZW50VGFyZ2V0VG9WOE9iamVjdChldmVudC0+dGFyZ2V0
KCkpOworICAgIEV2ZW50KiBldmVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRp
dmU8RXZlbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0RXZl
bnRUYXJnZXRUb1Y4T2JqZWN0KGV2ZW50LT50YXJnZXQoKSk7CiB9CiAKIEFDQ0VTU09SX0dFVFRF
UihFdmVudFJldHVyblZhbHVlKQogewotICAgIEV2ZW50KiBldmVudCA9IFY4UHJveHk6OkRPTVdy
YXBwZXJUb05hdGl2ZTxFdmVudD4oaW5mby5Ib2xkZXIoKSk7CisgICAgRXZlbnQqIGV2ZW50ID0g
VjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxFdmVudD4oaW5mby5Ib2xkZXIoKSk7
CiAgICAgcmV0dXJuIGV2ZW50LT5kZWZhdWx0UHJldmVudGVkKCkgPyB2ODo6RmFsc2UoKSA6IHY4
OjpUcnVlKCk7CiB9CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTE9w
dGlvbkVsZW1lbnRDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhIVE1MT3B0aW9uRWxlbWVudENvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24g
NDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxPcHRpb25FbGVtZW50
Q29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04MSw5ICs4MSw5IEBACiAgICAgICAg
IH0KICAgICB9CiAKLSAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKGFyZ3MuSG9sZGVyKCksIFY4
Q2xhc3NJbmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpOT0RFKSwgb3B0aW9uLmdldCgpKTsKKyAg
ICBWOFByb3h5OjpzZXRET01XcmFwcGVyKGFyZ3MuSG9sZGVyKCksIFY4Q2xhc3NJbmRleDo6VG9J
bnQoVjhDbGFzc0luZGV4OjpOT0RFKSwgb3B0aW9uLmdldCgpKTsKICAgICBvcHRpb24tPnJlZigp
OwotICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU5vZGUob3B0aW9uLmdldCgpLCB2ODo6
UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGFyZ3MuSG9sZGVyKCkpKTsKKyAgICBWOFByb3h5
OjpzZXRKU1dyYXBwZXJGb3JET01Ob2RlKG9wdGlvbi5nZXQoKSwgdjg6OlBlcnNpc3RlbnQ8djg6
Ok9iamVjdD46Ok5ldyhhcmdzLkhvbGRlcigpKSk7CiAgICAgcmV0dXJuIGFyZ3MuSG9sZGVyKCk7
CiB9CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U3R5bGVTaGVldExpc3RD
dXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U3R5
bGVTaGVldExpc3RDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGlu
Z3MvdjgvY3VzdG9tL1Y4U3R5bGVTaGVldExpc3RDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC00NSwxMiArNDUsMTIgQEAKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9y
KCk7CiAKICAgICAvLyBTZWFyY2ggc3R5bGUgc2hlZXQuCi0gICAgU3R5bGVTaGVldExpc3QqIGlt
cCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFN0eWxlU2hlZXRMaXN0PihWOENsYXNzSW5kZXg6
OlNUWUxFU0hFRVRMSVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBTdHlsZVNoZWV0TGlzdCogaW1w
ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFN0eWxlU2hlZXRMaXN0PihWOENsYXNz
SW5kZXg6OlNUWUxFU0hFRVRMSVNULCBpbmZvLkhvbGRlcigpKTsKICAgICBIVE1MU3R5bGVFbGVt
ZW50KiBpdGVtID0gaW1wLT5nZXROYW1lZEl0ZW0odG9XZWJDb3JlU3RyaW5nKG5hbWUpKTsKICAg
ICBpZiAoIWl0ZW0pCiAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwog
Ci0gICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpIVE1MU1RZTEVF
TEVNRU5ULCBpdGVtKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhD
bGFzc0luZGV4OjpIVE1MU1RZTEVFTEVNRU5ULCBpdGVtKTsKIH0KIAogfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhOb2RlQ3VzdG9tLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE5vZGVDdXN0b20u
Y3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Tm9k
ZUN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ3LDEzICs0NywxMyBAQAogQ0FMTEJBQ0tf
RlVOQ19ERUNMKE5vZGVBZGRFdmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFUUygiRE9NLk5v
ZGUuYWRkRXZlbnRMaXN0ZW5lcigpIik7Ci0gICAgTm9kZSogbm9kZSA9IFY4UHJveHk6OkRPTVdy
YXBwZXJUb05vZGU8Tm9kZT4oYXJncy5Ib2xkZXIoKSk7CisgICAgTm9kZSogbm9kZSA9IFY4UHJv
eHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3MuSG9sZGVyKCkpOwogCiAgICAg
VjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShub2RlLT5kb2N1bWVudCgpLT5mcmFt
ZSgpKTsKICAgICBpZiAoIXByb3h5KQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwog
Ci0gICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPkZpbmRPckNyZWF0
ZVY4RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CisgICAgUmVmUHRyPEV2ZW50TGlzdGVu
ZXI+IGxpc3RlbmVyID0gcHJveHktPmZpbmRPckNyZWF0ZVY4RXZlbnRMaXN0ZW5lcihhcmdzWzFd
LCBmYWxzZSk7CiAgICAgaWYgKGxpc3RlbmVyKSB7CiAgICAgICAgIFN0cmluZyB0eXBlID0gdG9X
ZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgICAgICBib29sIHVzZUNhcHR1cmUgPSBhcmdzWzJd
LT5Cb29sZWFuVmFsdWUoKTsKQEAgLTY1LDcgKzY1LDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChO
b2RlUmVtb3ZlRXZlbnRMaXN0ZW5lcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Ob2RlLnJlbW92
ZUV2ZW50TGlzdGVuZXIoKSIpOwotICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVy
VG9Ob2RlPE5vZGU+KGFyZ3MuSG9sZGVyKCkpOworICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5Ojpj
b252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzLkhvbGRlcigpKTsKIAogICAgIFY4UHJv
eHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUobm9kZS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSk7
CiAgICAgLy8gSXQgaXMgcG9zc2JpbGUgdGhhdCB0aGUgb3duZXIgZG9jdW1lbnQgb2YgdGhlIG5v
ZGUgaXMgZGV0YWNoZWQKQEAgLTc0LDcgKzc0LDcgQEAKICAgICBpZiAoIXByb3h5KQogICAgICAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxp
c3RlbmVyID0gcHJveHktPkZpbmRWOEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOworICAg
IFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5kVjhFdmVudExpc3Rl
bmVyKGFyZ3NbMV0sIGZhbHNlKTsKICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgU3RyaW5n
IHR5cGUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgICAgIGJvb2wgdXNlQ2FwdHVy
ZSA9IGFyZ3NbMl0tPkJvb2xlYW5WYWx1ZSgpOwpAQCAtODksMTMgKzg5LDEzIEBACiB7CiAgICAg
SU5DX1NUQVRTKCJET00uTm9kZS5pbnNlcnRCZWZvcmUiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gaG9sZGVyID0gYXJncy5Ib2xkZXIoKTsKLSAgICBOb2RlKiBpbXAgPSBWOFByb3h5OjpE
T01XcmFwcGVyVG9Ob2RlPE5vZGU+KGhvbGRlcik7CisgICAgTm9kZSogaW1wID0gVjhQcm94eTo6
Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oaG9sZGVyKTsKICAgICBFeGNlcHRpb25Db2Rl
IGVjID0gMDsKLSAgICBOb2RlKiBuZXdDaGlsZCA9IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1sw
XSkgPyBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0pIDogMDsKLSAgICBO
b2RlKiByZWZDaGlsZCA9IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1sxXSkgPyBWOFByb3h5OjpE
T01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMV0pIDogMDsKKyAgICBOb2RlKiBuZXdDaGlsZCA9
IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1swXSkgPyBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBl
clRvTm9kZTxOb2RlPihhcmdzWzBdKSA6IDA7CisgICAgTm9kZSogcmVmQ2hpbGQgPSBWOE5vZGU6
Okhhc0luc3RhbmNlKGFyZ3NbMV0pID8gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8
Tm9kZT4oYXJnc1sxXSkgOiAwOwogICAgIGJvb2wgc3VjY2VzcyA9IGltcC0+aW5zZXJ0QmVmb3Jl
KG5ld0NoaWxkLCByZWZDaGlsZCwgZWMsIHRydWUpOwogICAgIGlmIChlYykgewotICAgICAgICBW
OFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOworICAgICAgICBWOFByb3h5OjpzZXRET01FeGNl
cHRpb24oZWMpOwogICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7CiAgICAg
fQogICAgIGlmIChzdWNjZXNzKQpAQCAtMTA4LDEzICsxMDgsMTMgQEAKIHsKICAgICBJTkNfU1RB
VFMoIkRPTS5Ob2RlLnJlcGxhY2VDaGlsZCIpOwogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBo
b2xkZXIgPSBhcmdzLkhvbGRlcigpOwotICAgIE5vZGUqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBw
ZXJUb05vZGU8Tm9kZT4oaG9sZGVyKTsKKyAgICBOb2RlKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0
RE9NV3JhcHBlclRvTm9kZTxOb2RlPihob2xkZXIpOwogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAw
OwotICAgIE5vZGUqIG5ld0NoaWxkID0gVjhOb2RlOjpIYXNJbnN0YW5jZShhcmdzWzBdKSA/IFY4
UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJnc1swXSkgOiAwOwotICAgIE5vZGUqIG9s
ZENoaWxkID0gVjhOb2RlOjpIYXNJbnN0YW5jZShhcmdzWzFdKSA/IFY4UHJveHk6OkRPTVdyYXBw
ZXJUb05vZGU8Tm9kZT4oYXJnc1sxXSkgOiAwOworICAgIE5vZGUqIG5ld0NoaWxkID0gVjhOb2Rl
OjpIYXNJbnN0YW5jZShhcmdzWzBdKSA/IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2Rl
PE5vZGU+KGFyZ3NbMF0pIDogMDsKKyAgICBOb2RlKiBvbGRDaGlsZCA9IFY4Tm9kZTo6SGFzSW5z
dGFuY2UoYXJnc1sxXSkgPyBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihh
cmdzWzFdKSA6IDA7CiAgICAgYm9vbCBzdWNjZXNzID0gaW1wLT5yZXBsYWNlQ2hpbGQobmV3Q2hp
bGQsIG9sZENoaWxkLCBlYywgdHJ1ZSk7CiAgICAgaWYgKGVjKSB7Ci0gICAgICAgIFY4UHJveHk6
OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihl
Yyk7CiAgICAgICAgIHJldHVybiB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKTsKICAgICB9CiAgICAg
aWYgKHN1Y2Nlc3MpCkBAIC0xMjYsMTIgKzEyNiwxMiBAQAogewogICAgIElOQ19TVEFUUygiRE9N
Lk5vZGUucmVtb3ZlQ2hpbGQiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gaG9sZGVyID0g
YXJncy5Ib2xkZXIoKTsKLSAgICBOb2RlKiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2Rl
PE5vZGU+KGhvbGRlcik7CisgICAgTm9kZSogaW1wID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBw
ZXJUb05vZGU8Tm9kZT4oaG9sZGVyKTsKICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBO
b2RlKiBvbGRDaGlsZCA9IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1swXSkgPyBWOFByb3h5OjpE
T01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0pIDogMDsKKyAgICBOb2RlKiBvbGRDaGlsZCA9
IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1swXSkgPyBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBl
clRvTm9kZTxOb2RlPihhcmdzWzBdKSA6IDA7CiAgICAgYm9vbCBzdWNjZXNzID0gaW1wLT5yZW1v
dmVDaGlsZChvbGRDaGlsZCwgZWMpOwogICAgIGlmIChlYykgewotICAgICAgICBWOFByb3h5OjpT
ZXRET01FeGNlcHRpb24oZWMpOworICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMp
OwogICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7CiAgICAgfQogICAgIGlm
IChzdWNjZXNzKQpAQCAtMTQ0LDEyICsxNDQsMTIgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5O
b2RlLmFwcGVuZENoaWxkIik7CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhvbGRlciA9IGFy
Z3MuSG9sZGVyKCk7Ci0gICAgTm9kZSogaW1wID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxO
b2RlPihob2xkZXIpOworICAgIE5vZGUqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVy
VG9Ob2RlPE5vZGU+KGhvbGRlcik7CiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgTm9k
ZSogbmV3Q2hpbGQgPSBWOE5vZGU6Okhhc0luc3RhbmNlKGFyZ3NbMF0pID8gVjhQcm94eTo6RE9N
V3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKSA6IDA7CisgICAgTm9kZSogbmV3Q2hpbGQgPSBW
OE5vZGU6Okhhc0luc3RhbmNlKGFyZ3NbMF0pID8gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJU
b05vZGU8Tm9kZT4oYXJnc1swXSkgOiAwOwogICAgIGJvb2wgc3VjY2VzcyA9IGltcC0+YXBwZW5k
Q2hpbGQobmV3Q2hpbGQsIGVjLCB0cnVlICk7CiAgICAgaWYgKGVjKSB7Ci0gICAgICAgIFY4UHJv
eHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlv
bihlYyk7CiAgICAgICAgIHJldHVybiB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKTsKICAgICB9CiAg
ICAgaWYgKHN1Y2Nlc3MpCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE5hbWVk
Tm9kZU1hcEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhOYW1lZE5vZGVNYXBDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4TmFtZWROb2RlTWFwQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNDIsMTIgKzQyLDEyIEBACiBJTkRFWEVEX1BST1BFUlRZX0dFVFRFUihOYW1lZE5vZGVN
YXApCiB7CiAgICAgSU5DX1NUQVRTKCJET00uTmFtZWROb2RlTWFwLkluZGV4ZWRQcm9wZXJ0eUdl
dHRlciIpOwotICAgIE5hbWVkTm9kZU1hcCogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8
TmFtZWROb2RlTWFwPihWOENsYXNzSW5kZXg6Ok5BTUVETk9ERU1BUCwgaW5mby5Ib2xkZXIoKSk7
CisgICAgTmFtZWROb2RlTWFwKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8
TmFtZWROb2RlTWFwPihWOENsYXNzSW5kZXg6Ok5BTUVETk9ERU1BUCwgaW5mby5Ib2xkZXIoKSk7
CiAgICAgUmVmUHRyPE5vZGU+IHJlc3VsdCA9IGltcC0+aXRlbShpbmRleCk7CiAgICAgaWYgKCFy
ZXN1bHQpCiAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogCi0gICAg
cmV0dXJuIFY4UHJveHk6Ok5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CisgICAgcmV0dXJu
IFY4UHJveHk6OmNvbnZlcnROb2RlVG9WOE9iamVjdChyZXN1bHQuZ2V0KCkpOwogfQogCiBOQU1F
RF9QUk9QRVJUWV9HRVRURVIoTmFtZWROb2RlTWFwKQpAQCAtNjMsMTIgKzYzLDEyIEBACiAgICAg
ICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogCiAgICAgLy8gRmluYWxseSwg
c2VhcmNoIHRoZSBET00uCi0gICAgTmFtZWROb2RlTWFwKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2
ZU9iamVjdDxOYW1lZE5vZGVNYXA+KFY4Q2xhc3NJbmRleDo6TkFNRUROT0RFTUFQLCBpbmZvLkhv
bGRlcigpKTsKKyAgICBOYW1lZE5vZGVNYXAqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2
ZU9iamVjdDxOYW1lZE5vZGVNYXA+KFY4Q2xhc3NJbmRleDo6TkFNRUROT0RFTUFQLCBpbmZvLkhv
bGRlcigpKTsKICAgICBSZWZQdHI8Tm9kZT4gcmVzdWx0ID0gaW1wLT5nZXROYW1lZEl0ZW0odG9X
ZWJDb3JlU3RyaW5nKG5hbWUpKTsKICAgICBpZiAoIXJlc3VsdCkKICAgICAgICAgcmV0dXJuIG5v
dEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhP
YmplY3QocmVzdWx0LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4
T2JqZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6
IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2xpZW50UmVjdExpc3RDdXN0b20uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2xpZW50UmVjdExpc3RD
dXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4Q2xpZW50UmVjdExpc3RDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NCwxMiArNDQs
MTIgQEAKIElOREVYRURfUFJPUEVSVFlfR0VUVEVSKENsaWVudFJlY3RMaXN0KQogewogICAgIElO
Q19TVEFUUygiRE9NLkNsaWVudFJlY3RMaXN0LkluZGV4ZWRQcm9wZXJ0eUdldHRlciIpOwotICAg
IENsaWVudFJlY3RMaXN0KiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDbGllbnRSZWN0
TGlzdD4oVjhDbGFzc0luZGV4OjpDTElFTlRSRUNUTElTVCwgaW5mby5Ib2xkZXIoKSk7CisgICAg
Q2xpZW50UmVjdExpc3QqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDbGll
bnRSZWN0TGlzdD4oVjhDbGFzc0luZGV4OjpDTElFTlRSRUNUTElTVCwgaW5mby5Ib2xkZXIoKSk7
CiAgICAgUmVmUHRyPENsaWVudFJlY3Q+IHJlc3VsdCA9IGltcC0+aXRlbShpbmRleCk7CiAgICAg
aWYgKCFyZXN1bHQpCiAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwog
Ci0gICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpDTElFTlRSRUNU
LCByZXN1bHQuZ2V0KCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChW
OENsYXNzSW5kZXg6OkNMSUVOVFJFQ1QsIHJlc3VsdC5nZXQoKSk7CiB9CiAKIH0gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTEltYWdl
RWxlbWVudENvbnN0cnVjdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOEhUTUxJbWFnZUVsZW1lbnRDb25zdHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDQ1MDk1
KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MSW1hZ2VFbGVtZW50Q29uc3Ry
dWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NSw3ICs1NSw3IEBACiAKICAgICAvLyBNYWtl
IHN1cmUgdGhlIGRvY3VtZW50IGlzIGFkZGVkIHRvIHRoZSBET00gTm9kZSBtYXAuIE90aGVyd2lz
ZSwgdGhlIEhUTUxJbWFnZUVsZW1lbnQgaW5zdGFuY2UKICAgICAvLyBtYXkgZW5kIHVwIGJlaW5n
IHRoZSBvbmx5IG5vZGUgaW4gdGhlIG1hcCBhbmQgZ2V0IGdhcmJhZ2UtY2NvbGxlY3RlZCBwcmVt
YXR1cmVseS4KLSAgICBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChkb2N1bWVudCk7CisgICAgVjhQ
cm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KGRvY3VtZW50KTsKIAogICAgIFJlZlB0cjxIVE1M
SW1hZ2VFbGVtZW50PiBpbWFnZSA9IG5ldyBIVE1MSW1hZ2VFbGVtZW50KEhUTUxOYW1lczo6aW1n
VGFnLCBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lKCktPmRvY3VtZW50KCkpOwogICAgIGlmIChhcmdz
Lkxlbmd0aCgpID4gMCkgewpAQCAtNjQsOSArNjQsOSBAQAogICAgICAgICAgICAgaW1hZ2UtPnNl
dEhlaWdodCh0b0ludDMyKGFyZ3NbMV0pKTsKICAgICB9CiAKLSAgICBWOFByb3h5OjpTZXRET01X
cmFwcGVyKGFyZ3MuSG9sZGVyKCksIFY4Q2xhc3NJbmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpO
T0RFKSwgaW1hZ2UuZ2V0KCkpOworICAgIFY4UHJveHk6OnNldERPTVdyYXBwZXIoYXJncy5Ib2xk
ZXIoKSwgVjhDbGFzc0luZGV4OjpUb0ludChWOENsYXNzSW5kZXg6Ok5PREUpLCBpbWFnZS5nZXQo
KSk7CiAgICAgaW1hZ2UtPnJlZigpOwotICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU5v
ZGUoaW1hZ2UuZ2V0KCksIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcoYXJncy5Ib2xk
ZXIoKSkpOworICAgIFY4UHJveHk6OnNldEpTV3JhcHBlckZvckRPTU5vZGUoaW1hZ2UuZ2V0KCks
IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcoYXJncy5Ib2xkZXIoKSkpOwogICAgIHJl
dHVybiBhcmdzLkhvbGRlcigpOwogfQogCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOFNRTFJlc3VsdFNldFJvd0xpc3RDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMUmVzdWx0U2V0Um93TGlzdEN1c3RvbS5jcHAJKHJldmlz
aW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTUUxSZXN1bHRTZXRS
b3dMaXN0Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIsMTEgKzMyLDEwIEBACiAKICNp
ZiBFTkFCTEUoREFUQUJBU0UpCiAKLSNpbmNsdWRlICJ2OF9iaW5kaW5nLmgiCi0jaW5jbHVkZSAi
djhfcHJveHkuaCIKLQogI2luY2x1ZGUgIlNRTFJlc3VsdFNldFJvd0xpc3QuaCIKKyNpbmNsdWRl
ICJWOEJpbmRpbmcuaCIKICNpbmNsdWRlICJWOEN1c3RvbUJpbmRpbmcuaCIKKyNpbmNsdWRlICJW
OFByb3h5LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtNDUsMjAgKzQ0LDIwIEBACiAg
ICAgSU5DX1NUQVRTKCJET00uU1FMUmVzdWx0U2V0Um93TGlzdC5pdGVtKCkiKTsKIAogICAgIGlm
IChhcmdzLkxlbmd0aCgpID09IDApIHsKLSAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFBy
b3h5OjpTWU5UQVhfRVJST1IsICJJdGVtIGluZGV4IGlzIHJlcXVpcmVkLiIpOworICAgICAgICBW
OFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgIkl0ZW0gaW5kZXggaXMg
cmVxdWlyZWQuIik7CiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgfQogCiAg
ICAgaWYgKCFhcmdzWzBdLT5Jc051bWJlcigpKSB7Ci0gICAgICAgIFY4UHJveHk6OlRocm93RXJy
b3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgIkl0ZW0gaW5kZXggbXVzdCBiZSBhIG51bWJlci4iKTsK
KyAgICAgICAgVjhQcm94eTo6dGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiSXRlbSBp
bmRleCBtdXN0IGJlIGEgbnVtYmVyLiIpOwogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgp
OwogICAgIH0KIAotICAgIFNRTFJlc3VsdFNldFJvd0xpc3QqIHJvd0xpc3QgPSBWOFByb3h5OjpU
b05hdGl2ZU9iamVjdDxTUUxSZXN1bHRTZXRSb3dMaXN0PihWOENsYXNzSW5kZXg6OlNRTFJFU1VM
VFNFVFJPV0xJU1QsIGFyZ3MuSG9sZGVyKCkpOworICAgIFNRTFJlc3VsdFNldFJvd0xpc3QqIHJv
d0xpc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8U1FMUmVzdWx0U2V0Um93TGlz
dD4oVjhDbGFzc0luZGV4OjpTUUxSRVNVTFRTRVRST1dMSVNULCBhcmdzLkhvbGRlcigpKTsKIAog
ICAgIHVuc2lnbmVkIGxvbmcgaW5kZXggPSBhcmdzWzBdLT5JbnRlZ2VyVmFsdWUoKTsKICAgICBp
ZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHJvd0xpc3QtPmxlbmd0aCgpKSB7Ci0gICAgICAgIFY4
UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6UkFOR0VfRVJST1IsICJJdGVtIGluZGV4IGlzIG91
dCBvZiByYW5nZS4iKTsKKyAgICAgICAgVjhQcm94eTo6dGhyb3dFcnJvcihWOFByb3h5OjpSQU5H
RV9FUlJPUiwgIkl0ZW0gaW5kZXggaXMgb3V0IG9mIHJhbmdlLiIpOwogICAgICAgICByZXR1cm4g
djg6OlVuZGVmaW5lZCgpOwogICAgIH0KIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhOb2RlSXRlcmF0b3JDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGlu
Z3MvdjgvY3VzdG9tL1Y4Tm9kZUl0ZXJhdG9yQ3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUpCisr
KyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE5vZGVJdGVyYXRvckN1c3RvbS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTUzLDEzICs1MywxMyBAQAogICAgIGlmICghb2JqZWN0KQogICAgICAg
ICByZXR1cm4gdjg6Ok51bGwoKTsKIAotICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVj
dChvYmplY3QuZ2V0KCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmpl
Y3Qob2JqZWN0LmdldCgpKTsKIH0KIAogQ0FMTEJBQ0tfRlVOQ19ERUNMKE5vZGVJdGVyYXRvck5l
eHROb2RlKQogewogICAgIElOQ19TVEFUUygiRE9NLk5vZGVJdGVyYXRvci5uZXh0Tm9kZSgpIik7
Ci0gICAgTm9kZUl0ZXJhdG9yKiBub2RlSXRlcmF0b3IgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVj
dDxOb2RlSXRlcmF0b3I+KFY4Q2xhc3NJbmRleDo6Tk9ERUlURVJBVE9SLCBhcmdzLkhvbGRlcigp
KTsKKyAgICBOb2RlSXRlcmF0b3IqIG5vZGVJdGVyYXRvciA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxOb2RlSXRlcmF0b3I+KFY4Q2xhc3NJbmRleDo6Tk9ERUlURVJBVE9SLCBhcmdz
LkhvbGRlcigpKTsKIAogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgIFNjcmlwdFN0YXRl
IHN0YXRlOwpAQCAtNzAsNyArNzAsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKE5vZGVJdGVyYXRv
clByZXZpb3VzTm9kZSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Ob2RlSXRlcmF0b3IucHJldmlv
dXNOb2RlKCkiKTsKLSAgICBOb2RlSXRlcmF0b3IqIG5vZGVJdGVyYXRvciA9IFY4UHJveHk6OlRv
TmF0aXZlT2JqZWN0PE5vZGVJdGVyYXRvcj4oVjhDbGFzc0luZGV4OjpOT0RFSVRFUkFUT1IsIGFy
Z3MuSG9sZGVyKCkpOworICAgIE5vZGVJdGVyYXRvciogbm9kZUl0ZXJhdG9yID0gVjhQcm94eTo6
Y29udmVydFRvTmF0aXZlT2JqZWN0PE5vZGVJdGVyYXRvcj4oVjhDbGFzc0luZGV4OjpOT0RFSVRF
UkFUT1IsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAg
U2NyaXB0U3RhdGUgc3RhdGU7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFNW
R0xlbmd0aEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhTVkdMZW5ndGhDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4U1ZHTGVuZ3RoQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NDQsMTcgKzQ0LDE3IEBACiBBQ0NFU1NPUl9HRVRURVIoU1ZHTGVuZ3RoVmFsdWUpCiB7CiAgICAg
SU5DX1NUQVRTKCJET00uU1ZHTGVuZ3RoLnZhbHVlIik7Ci0gICAgVjhTVkdQT0RUeXBlV3JhcHBl
cjxTVkdMZW5ndGg+KiB3cmFwcGVyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8VjhTVkdQT0RU
eXBlV3JhcHBlcjxTVkdMZW5ndGg+ID4oVjhDbGFzc0luZGV4OjpTVkdMRU5HVEgsIGluZm8uSG9s
ZGVyKCkpOworICAgIFY4U1ZHUE9EVHlwZVdyYXBwZXI8U1ZHTGVuZ3RoPiogd3JhcHBlciA9IFY4
UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxWOFNWR1BPRFR5cGVXcmFwcGVyPFNWR0xlbmd0
aD4gPihWOENsYXNzSW5kZXg6OlNWR0xFTkdUSCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgU1ZHTGVu
Z3RoIGltcCA9ICp3cmFwcGVyOwotICAgIHJldHVybiB2ODo6TnVtYmVyOjpOZXcoaW1wLnZhbHVl
KFY4UHJveHk6OkdldFNWR0NvbnRleHQod3JhcHBlcikpKTsKKyAgICByZXR1cm4gdjg6Ok51bWJl
cjo6TmV3KGltcC52YWx1ZShWOFByb3h5OjpzdmdDb250ZXh0KHdyYXBwZXIpKSk7CiB9CiAKIENB
TExCQUNLX0ZVTkNfREVDTChTVkdMZW5ndGhDb252ZXJ0VG9TcGVjaWZpZWRVbml0cykKIHsKICAg
ICBJTkNfU1RBVFMoIkRPTS5TVkdMZW5ndGguY29udmVydFRvU3BlY2lmaWVkVW5pdHMiKTsKLSAg
ICBWOFNWR1BPRFR5cGVXcmFwcGVyPFNWR0xlbmd0aD4qIHdyYXBwZXIgPSBWOFByb3h5OjpUb05h
dGl2ZU9iamVjdDxWOFNWR1BPRFR5cGVXcmFwcGVyPFNWR0xlbmd0aD4gPihWOENsYXNzSW5kZXg6
OlNWR0xFTkdUSCwgYXJncy5Ib2xkZXIoKSk7CisgICAgVjhTVkdQT0RUeXBlV3JhcHBlcjxTVkdM
ZW5ndGg+KiB3cmFwcGVyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFY4U1ZHUE9E
VHlwZVdyYXBwZXI8U1ZHTGVuZ3RoPiA+KFY4Q2xhc3NJbmRleDo6U1ZHTEVOR1RILCBhcmdzLkhv
bGRlcigpKTsKICAgICBTVkdMZW5ndGggaW1wID0gKndyYXBwZXI7Ci0gICAgU1ZHRWxlbWVudCog
Y29udGV4dCA9IFY4UHJveHk6OkdldFNWR0NvbnRleHQod3JhcHBlcik7CisgICAgU1ZHRWxlbWVu
dCogY29udGV4dCA9IFY4UHJveHk6OnN2Z0NvbnRleHQod3JhcHBlcik7CiAgICAgaW1wLmNvbnZl
cnRUb1NwZWNpZmllZFVuaXRzKHRvSW50MzIoYXJnc1swXSksIGNvbnRleHQpOwogICAgIHdyYXBw
ZXItPmNvbW1pdENoYW5nZShpbXAsIGNvbnRleHQpOwogICAgIHJldHVybiB2ODo6VW5kZWZpbmVk
KCk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxEb2N1bWVudEN1c3Rv
bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MRG9j
dW1lbnRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4SFRNTERvY3VtZW50Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzgsNyAr
NzgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KIAotICAgIEhUTUxEb2N1
bWVudCogaHRtbERvY3VtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MRG9jdW1l
bnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxEb2N1bWVudCogaHRtbERvY3VtZW50ID0gVjhQ
cm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTERvY3VtZW50PihpbmZvLkhvbGRlcigp
KTsKIAogICAgIC8vIEZhc3QgY2FzZSBmb3IgbmFtZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90IHRo
ZXJlLgogICAgIGlmICghaHRtbERvY3VtZW50LT5oYXNOYW1lZEl0ZW0oa2V5LmltcGwoKSkgJiYg
IWh0bWxEb2N1bWVudC0+aGFzRXh0cmFOYW1lZEl0ZW0oa2V5LmltcGwoKSkpCkBAIC05MiwxMiAr
OTIsMTIgQEAKICAgICAgICAgTm9kZSogbm9kZSA9IGl0ZW1zLT5maXJzdEl0ZW0oKTsKICAgICAg
ICAgRnJhbWUqIGZyYW1lID0gMDsKICAgICAgICAgaWYgKG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5h
bWVzOjppZnJhbWVUYWcpICYmIChmcmFtZSA9IHN0YXRpY19jYXN0PEhUTUxJRnJhbWVFbGVtZW50
Kj4obm9kZSktPmNvbnRlbnRGcmFtZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBWOFByb3h5OjpU
b1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBmcmFtZS0+ZG9tV2luZG93KCkpOwor
ICAgICAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRl
eDo6RE9NV0lORE9XLCBmcmFtZS0+ZG9tV2luZG93KCkpOwogCi0gICAgICAgIHJldHVybiBWOFBy
b3h5OjpOb2RlVG9WOE9iamVjdChub2RlKTsKKyAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZl
cnROb2RlVG9WOE9iamVjdChub2RlKTsKICAgICB9CiAKLSAgICByZXR1cm4gVjhQcm94eTo6VG9W
OE9iamVjdChWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBpdGVtcy5nZXQoKSk7CisgICAg
cmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6SFRNTENPTExF
Q1RJT04sIGl0ZW1zLmdldCgpKTsKIH0KIAogLy8gSFRNTERvY3VtZW50IC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEx
Nyw3ICsxMTcsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEhUTUxEb2N1bWVudFdyaXRlKQogewog
ICAgIElOQ19TVEFUUygiRE9NLkhUTUxEb2N1bWVudC53cml0ZSgpIik7Ci0gICAgSFRNTERvY3Vt
ZW50KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxEb2N1bWVu
dD4oYXJncy5Ib2xkZXIoKSk7CisgICAgSFRNTERvY3VtZW50KiBodG1sRG9jdW1lbnQgPSBWOFBy
b3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MRG9jdW1lbnQ+KGFyZ3MuSG9sZGVyKCkp
OwogICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29u
dGV4dCgpOwogICAgIEFTU0VSVChmcmFtZSk7CiAgICAgaHRtbERvY3VtZW50LT53cml0ZSh3cml0
ZUhlbHBlckdldFN0cmluZyhhcmdzKSwgZnJhbWUtPmRvY3VtZW50KCkpOwpAQCAtMTI3LDcgKzEy
Nyw3IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woSFRNTERvY3VtZW50V3JpdGVsbikKIHsKICAgICBJ
TkNfU1RBVFMoIkRPTS5IVE1MRG9jdW1lbnQud3JpdGVsbigpIik7Ci0gICAgSFRNTERvY3VtZW50
KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxEb2N1bWVudD4o
YXJncy5Ib2xkZXIoKSk7CisgICAgSFRNTERvY3VtZW50KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5
Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MRG9jdW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOwog
ICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29udGV4
dCgpOwogICAgIEFTU0VSVChmcmFtZSk7CiAgICAgaHRtbERvY3VtZW50LT53cml0ZWxuKHdyaXRl
SGVscGVyR2V0U3RyaW5nKGFyZ3MpLCBmcmFtZS0+ZG9jdW1lbnQoKSk7CkBAIC0xMzcsMTIgKzEz
NywxMiBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEhUTUxEb2N1bWVudE9wZW4pCiB7CiAgICAgSU5D
X1NUQVRTKCJET00uSFRNTERvY3VtZW50Lm9wZW4oKSIpOwotICAgIEhUTUxEb2N1bWVudCogaHRt
bERvY3VtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MRG9jdW1lbnQ+KGFyZ3Mu
SG9sZGVyKCkpOworICAgIEhUTUxEb2N1bWVudCogaHRtbERvY3VtZW50ID0gVjhQcm94eTo6Y29u
dmVydERPTVdyYXBwZXJUb05vZGU8SFRNTERvY3VtZW50PihhcmdzLkhvbGRlcigpKTsKIAogICAg
IGlmIChhcmdzLkxlbmd0aCgpID4gMikgewogICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gaHRt
bERvY3VtZW50LT5mcmFtZSgpKSB7CiAgICAgICAgICAgICAvLyBGZXRjaCB0aGUgZ2xvYmFsIG9i
amVjdCBmb3IgdGhlIGZyYW1lLgotICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBj
b250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChmcmFtZSk7CisgICAgICAgICAgICB2ODo6TG9j
YWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KGZyYW1lKTsKICAgICAg
ICAgICAgIC8vIEJhaWwgb3V0IGlmIHdlIGNhbm5vdCBnZXQgdGhlIGNvbnRleHQuCiAgICAgICAg
ICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHY4OjpV
bmRlZmluZWQoKTsKQEAgLTE2Miw3ICsxNjIsNyBAQAogICAgICAgICAgICAgVjhQcm94eSogcHJv
eHkgPSBWOFByb3h5OjpyZXRyaWV2ZShmcmFtZSk7CiAgICAgICAgICAgICBBU1NFUlQocHJveHkp
OwogCi0gICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQgPSBwcm94eS0+Q2Fs
bEZ1bmN0aW9uKHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+OjpDYXN0KGZ1bmN0aW9uKSwgZ2xvYmFs
LCBhcmdzLkxlbmd0aCgpLCBwYXJhbXMpOworICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1
ZT4gcmVzdWx0ID0gcHJveHktPmNhbGxGdW5jdGlvbih2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPjo6
Q2FzdChmdW5jdGlvbiksIGdsb2JhbCwgYXJncy5MZW5ndGgoKSwgcGFyYW1zKTsKICAgICAgICAg
ICAgIGRlbGV0ZVtdIHBhcmFtczsKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAg
IH0KQEAgLTE3OSw5ICsxNzksOSBAQAogICAgIElOQ19TVEFUUygiRE9NLkhUTUxEb2N1bWVudC5h
bGwuX2dldCIpOwogICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKICAgICB2ODo6SGFuZGxlPHY4
OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0gICAgSFRNTERvY3VtZW50KiBodG1s
RG9jdW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxEb2N1bWVudD4oaG9sZGVy
KTsKKyAgICBIVE1MRG9jdW1lbnQqIGh0bWxEb2N1bWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01X
cmFwcGVyVG9Ob2RlPEhUTUxEb2N1bWVudD4oaG9sZGVyKTsKICAgICBSZWZQdHI8SFRNTENvbGxl
Y3Rpb24+IGNvbGxlY3Rpb24gPSBXVEY6OmdldFB0cihodG1sRG9jdW1lbnQtPmFsbCgpKTsKLSAg
ICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9O
LCBXVEY6OmdldFB0cihjb2xsZWN0aW9uKSk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRU
b1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIFdURjo6Z2V0UHRyKGNvbGxl
Y3Rpb24pKTsKIH0KIAogQUNDRVNTT1JfU0VUVEVSKEhUTUxEb2N1bWVudEFsbCkKSW5kZXg6IFdl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEQ3VzdG9t
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOENhbnZhc1Jl
bmRlcmluZ0NvbnRleHQyREN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRDdXN0b20uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC01MCwxMCArNTAsMTAgQEAKIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gdG9WOChDYW52YXNTdHlsZSogc3R5bGUpCiB7CiAgICAgaWYgKHN0eWxlLT5jYW52YXNH
cmFkaWVudCgpKQotICAgICAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5k
ZXg6OkNBTlZBU0dSQURJRU5ULCBzdHlsZS0+Y2FudmFzR3JhZGllbnQoKSk7CisgICAgICAgIHJl
dHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNBTlZBU0dSQURJ
RU5ULCBzdHlsZS0+Y2FudmFzR3JhZGllbnQoKSk7CiAKICAgICBpZiAoc3R5bGUtPmNhbnZhc1Bh
dHRlcm4oKSkKLSAgICAgICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4
OjpDQU5WQVNQQVRURVJOLCBzdHlsZS0+Y2FudmFzUGF0dGVybigpKTsKKyAgICAgICAgcmV0dXJu
IFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUEFUVEVSTiwg
c3R5bGUtPmNhbnZhc1BhdHRlcm4oKSk7CiAKICAgICByZXR1cm4gdjhTdHJpbmcoc3R5bGUtPmNv
bG9yKCkpOwogfQpAQCAtNjQsMzUgKzY0LDM1IEBACiAgICAgICAgIHJldHVybiBDYW52YXNTdHls
ZTo6Y3JlYXRlKHRvV2ViQ29yZVN0cmluZyh2YWx1ZSkpOwogCiAgICAgaWYgKFY4Q2FudmFzR3Jh
ZGllbnQ6Okhhc0luc3RhbmNlKHZhbHVlKSkKLSAgICAgICAgcmV0dXJuIENhbnZhc1N0eWxlOjpj
cmVhdGUoVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0aXZlPENhbnZhc0dyYWRpZW50Pih2YWx1ZSkp
OworICAgICAgICByZXR1cm4gQ2FudmFzU3R5bGU6OmNyZWF0ZShWOFByb3h5Ojpjb252ZXJ0RE9N
V3JhcHBlclRvTmF0aXZlPENhbnZhc0dyYWRpZW50Pih2YWx1ZSkpOwogCiAgICAgaWYgKFY4Q2Fu
dmFzUGF0dGVybjo6SGFzSW5zdGFuY2UodmFsdWUpKQotICAgICAgICByZXR1cm4gQ2FudmFzU3R5
bGU6OmNyZWF0ZShWOFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8Q2FudmFzUGF0dGVybj4odmFs
dWUpKTsKKyAgICAgICAgcmV0dXJuIENhbnZhc1N0eWxlOjpjcmVhdGUoVjhQcm94eTo6Y29udmVy
dERPTVdyYXBwZXJUb05hdGl2ZTxDYW52YXNQYXR0ZXJuPih2YWx1ZSkpOwogCiAgICAgcmV0dXJu
IDA7CiB9CiAKIEFDQ0VTU09SX0dFVFRFUihDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRTdHJva2VT
dHlsZSkKIHsKLSAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGltcGwgPSBWOFByb3h5OjpE
T01XcmFwcGVyVG9OYXRpdmU8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihpbmZvLkhvbGRlcigp
KTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGltcGwgPSBWOFByb3h5Ojpjb252ZXJ0
RE9NV3JhcHBlclRvTmF0aXZlPENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oaW5mby5Ib2xkZXIo
KSk7CiAgICAgcmV0dXJuIHRvVjgoaW1wbC0+c3Ryb2tlU3R5bGUoKSk7CiB9CiAKIEFDQ0VTU09S
X1NFVFRFUihDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRTdHJva2VTdHlsZSkKIHsKLSAgICBDYW52
YXNSZW5kZXJpbmdDb250ZXh0MkQqIGltcGwgPSBWOFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8
Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihpbmZvLkhvbGRlcigpKTsKKyAgICBDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQqIGltcGwgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZl
PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgaW1wbC0+c2V0
U3Ryb2tlU3R5bGUodG9DYW52YXNTdHlsZSh2YWx1ZSkpOwogfQogCiBBQ0NFU1NPUl9HRVRURVIo
Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJERmlsbFN0eWxlKQogewotICAgIENhbnZhc1JlbmRlcmlu
Z0NvbnRleHQyRCogaW1wbCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05hdGl2ZTxDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQ+KGluZm8uSG9sZGVyKCkpOworICAgIENhbnZhc1JlbmRlcmluZ0NvbnRl
eHQyRCogaW1wbCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8Q2FudmFzUmVu
ZGVyaW5nQ29udGV4dDJEPihpbmZvLkhvbGRlcigpKTsKICAgICByZXR1cm4gdG9WOChpbXBsLT5m
aWxsU3R5bGUoKSk7CiB9CiAKIEFDQ0VTU09SX1NFVFRFUihDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkRGaWxsU3R5bGUpCiB7Ci0gICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBpbXBsID0gVjhQ
cm94eTo6RE9NV3JhcHBlclRvTmF0aXZlPENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oaW5mby5I
b2xkZXIoKSk7CisgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBpbXBsID0gVjhQcm94eTo6
Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KGluZm8u
SG9sZGVyKCkpOwogICAgIGltcGwtPnNldEZpbGxTdHlsZSh0b0NhbnZhc1N0eWxlKHZhbHVlKSk7
CiB9CiAKQEAgLTEwMSw3ICsxMDEsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRl
cmluZ0NvbnRleHQyRFNldFN0cm9rZUNvbG9yKQogewogICAgIElOQ19TVEFUUygiRE9NLkNhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRC5zZXRTdHJva2VDb2xvcigpIik7Ci0gICAgQ2FudmFzUmVuZGVy
aW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVu
ZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwg
YXJncy5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0g
VjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4o
VjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOwog
ICAgIHN3aXRjaCAoYXJncy5MZW5ndGgoKSkgewogICAgIGNhc2UgMToKICAgICAgICAgaWYgKGFy
Z3NbMF0tPklzU3RyaW5nKCkpCkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICAgICAgY29udGV4dC0+
c2V0U3Ryb2tlQ29sb3IodG9GbG9hdChhcmdzWzBdKSwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9h
dChhcmdzWzJdKSwgdG9GbG9hdChhcmdzWzNdKSwgdG9GbG9hdChhcmdzWzRdKSk7CiAgICAgICAg
IGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94
eTo6U1lOVEFYX0VSUk9SLCAic2V0U3Ryb2tlQ29sb3I6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3Vt
ZW50cyIpOworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJP
UiwgInNldFN0cm9rZUNvbG9yOiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiKTsKICAgICAg
ICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CkBAIC0xMzEsNyAr
MTMxLDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRTZXRG
aWxsQ29sb3IpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJE
LnNldEZpbGxDb2xvcigpIik7Ci0gICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENs
YXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CisgICAg
Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNS
RU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOwogICAgIHN3aXRjaCAoYXJncy5MZW5n
dGgoKSkgewogICAgIGNhc2UgMToKICAgICAgICAgaWYgKGFyZ3NbMF0tPklzU3RyaW5nKCkpCkBA
IC0xNTIsNyArMTUyLDcgQEAKICAgICAgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKHRvRmxvYXQo
YXJnc1swXSksIHRvRmxvYXQoYXJnc1sxXSksIHRvRmxvYXQoYXJnc1syXSksIHRvRmxvYXQoYXJn
c1szXSksIHRvRmxvYXQoYXJnc1s0XSkpOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0Ogot
ICAgICAgICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgInNldEZp
bGxDb2xvcjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIik7CisgICAgICAgIFY4UHJveHk6
OnRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VSUk9SLCAic2V0RmlsbENvbG9yOiBJbnZhbGlk
IG51bWJlciBvZiBhcmd1bWVudHMiKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVy
biB2ODo6VW5kZWZpbmVkKCk7CkBAIC0xNjEsMTMgKzE2MSwxMyBAQAogQ0FMTEJBQ0tfRlVOQ19E
RUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFN0cm9rZVJlY3QpCiB7CiAgICAgSU5DX1NUQVRT
KCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnN0cm9rZVJlY3QoKSIpOwotICAgIENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENh
bnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05U
RVhUMkQsIGFyZ3MuSG9sZGVyKCkpOworICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29u
dGV4dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRl
cigpKTsKICAgICBpZiAoYXJncy5MZW5ndGgoKSA9PSA1KQogICAgICAgICBjb250ZXh0LT5zdHJv
a2VSZWN0KHRvRmxvYXQoYXJnc1swXSksIHRvRmxvYXQoYXJnc1sxXSksIHRvRmxvYXQoYXJnc1sy
XSksIHRvRmxvYXQoYXJnc1szXSksIHRvRmxvYXQoYXJnc1s0XSkpOwogICAgIGVsc2UgaWYgKGFy
Z3MuTGVuZ3RoKCkgPT0gNCkKICAgICAgICAgY29udGV4dC0+c3Ryb2tlUmVjdCh0b0Zsb2F0KGFy
Z3NbMF0pLCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pLCB0b0Zsb2F0KGFyZ3Nb
M10pKTsKICAgICBlbHNlIHsKLSAgICAgICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKElOREVY
X1NJWkVfRVJSKTsKKyAgICAgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKElOREVYX1NJWkVf
RVJSKTsKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAgICAgfQog
ICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CkBAIC0xNzYsNyArMTc2LDcgQEAKIENBTExCQUNL
X0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRTZXRTaGFkb3cpCiB7CiAgICAgSU5D
X1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnNldFNoYWRvdygpIik7Ci0gICAg
Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmpl
Y3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklO
R0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJE
KiBjb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENhbnZhc1JlbmRlcmlu
Z0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIGFyZ3Mu
SG9sZGVyKCkpOwogCiAgICAgc3dpdGNoIChhcmdzLkxlbmd0aCgpKSB7CiAgICAgY2FzZSAzOgpA
QCAtMjAxLDcgKzIwMSw3IEBACiAgICAgICAgIGNvbnRleHQtPnNldFNoYWRvdyh0b0Zsb2F0KGFy
Z3NbMF0pLCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pLCB0b0Zsb2F0KGFyZ3Nb
M10pLCB0b0Zsb2F0KGFyZ3NbNF0pLCB0b0Zsb2F0KGFyZ3NbNV0pLCB0b0Zsb2F0KGFyZ3NbNl0p
LCB0b0Zsb2F0KGFyZ3NbN10pKTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAg
ICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpTWU5UQVhfRVJST1IsICJzZXRTaGFkb3c6
IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIpOworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vy
cm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgInNldFNoYWRvdzogSW52YWxpZCBudW1iZXIgb2Yg
YXJndW1lbnRzIik7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMjExLDEzICsyMTEsMTMg
QEAKIENBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250ZXh0MkREcmF3SW1hZ2Up
CiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmRyYXdJbWFn
ZSgpIik7Ci0gICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6
VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNB
TlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUmVuZGVy
aW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENh
bnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05U
RVhUMkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZyA9
IGFyZ3NbMF07CiAKICAgICBpZiAoVjhIVE1MSW1hZ2VFbGVtZW50OjpIYXNJbnN0YW5jZShhcmcp
KSB7CiAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgICAgICBIVE1MSW1hZ2VFbGVt
ZW50KiBpbWFnZV9lbGVtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MSW1hZ2VF
bGVtZW50PihhcmcpOworICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZV9lbGVtZW50ID0g
VjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTEltYWdlRWxlbWVudD4oYXJnKTsK
ICAgICAgICAgc3dpdGNoIChhcmdzLkxlbmd0aCgpKSB7CiAgICAgICAgIGNhc2UgMzoKICAgICAg
ICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZShpbWFnZV9lbGVtZW50LCB0b0Zsb2F0KGFyZ3NbMV0p
LCB0b0Zsb2F0KGFyZ3NbMl0pKTsKQEAgLTIyNSw3ICsyMjUsNyBAQAogICAgICAgICBjYXNlIDU6
CiAgICAgICAgICAgICBjb250ZXh0LT5kcmF3SW1hZ2UoaW1hZ2VfZWxlbWVudCwgdG9GbG9hdChh
cmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSwgdG9GbG9hdChhcmdzWzNdKSwgdG9GbG9hdChhcmdz
WzRdKSwgZWMpOwogICAgICAgICAgICAgaWYgKGVjICE9IDApIHsKLSAgICAgICAgICAgICAgICBW
OFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOworICAgICAgICAgICAgICAgIFY4UHJveHk6OnNl
dERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUlu
dGVyY2VwdG9yKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTIzNSwx
MiArMjM1LDEyIEBACiAgICAgICAgICAgICAgICAgRmxvYXRSZWN0KHRvRmxvYXQoYXJnc1s1XSks
IHRvRmxvYXQoYXJnc1s2XSksIHRvRmxvYXQoYXJnc1s3XSksIHRvRmxvYXQoYXJnc1s4XSkpLAog
ICAgICAgICAgICAgICAgIGVjKTsKICAgICAgICAgICAgIGlmIChlYyAhPSAwKSB7Ci0gICAgICAg
ICAgICAgICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICAgICAgICAgICAgICBW
OFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogICAgICAgICAgICAgICAgIHJldHVybiBub3RI
YW5kbGVkQnlJbnRlcmNlcHRvcigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7
CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4UHJv
eHk6OlNZTlRBWF9FUlJPUiwgImRyYXdJbWFnZTogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRz
Iik7CisgICAgICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJP
UiwgImRyYXdJbWFnZTogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgICAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB2ODo6
VW5kZWZpbmVkKCk7CkBAIC0yNDksNyArMjQ5LDcgQEAKICAgICAvLyBIVE1MQ2FudmFzRWxlbWVu
dAogICAgIGlmIChWOEhUTUxDYW52YXNFbGVtZW50OjpIYXNJbnN0YW5jZShhcmcpKSB7CiAgICAg
ICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgICAgICBIVE1MQ2FudmFzRWxlbWVudCogY2Fu
dmFzX2VsZW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxDYW52YXNFbGVtZW50
PihhcmcpOworICAgICAgICBIVE1MQ2FudmFzRWxlbWVudCogY2FudmFzX2VsZW1lbnQgPSBWOFBy
b3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MQ2FudmFzRWxlbWVudD4oYXJnKTsKICAg
ICAgICAgc3dpdGNoIChhcmdzLkxlbmd0aCgpKSB7CiAgICAgICAgIGNhc2UgMzoKICAgICAgICAg
ICAgIGNvbnRleHQtPmRyYXdJbWFnZShjYW52YXNfZWxlbWVudCwgdG9GbG9hdChhcmdzWzFdKSwg
dG9GbG9hdChhcmdzWzJdKSk7CkBAIC0yNTcsNyArMjU3LDcgQEAKICAgICAgICAgY2FzZSA1Ogog
ICAgICAgICAgICAgY29udGV4dC0+ZHJhd0ltYWdlKGNhbnZhc19lbGVtZW50LCB0b0Zsb2F0KGFy
Z3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pLCB0b0Zsb2F0KGFyZ3NbM10pLCB0b0Zsb2F0KGFyZ3Nb
NF0pLCBlYyk7CiAgICAgICAgICAgICBpZiAoZWMgIT0gMCkgewotICAgICAgICAgICAgICAgIFY4
UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAgICAgICAgICAgVjhQcm94eTo6c2V0
RE9NRXhjZXB0aW9uKGVjKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50
ZXJjZXB0b3IoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjY3LDMz
ICsyNjcsMzMgQEAKICAgICAgICAgICAgICAgICBGbG9hdFJlY3QodG9GbG9hdChhcmdzWzVdKSwg
dG9GbG9hdChhcmdzWzZdKSwgdG9GbG9hdChhcmdzWzddKSwgdG9GbG9hdChhcmdzWzhdKSksCiAg
ICAgICAgICAgICAgICAgZWMpOwogICAgICAgICAgICAgaWYgKGVjICE9IDApIHsKLSAgICAgICAg
ICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOworICAgICAgICAgICAgICAgIFY4
UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5vdEhh
bmRsZWRCeUludGVyY2VwdG9yKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsK
ICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94
eTo6U1lOVEFYX0VSUk9SLCAiZHJhd0ltYWdlOiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMi
KTsKKyAgICAgICAgICAgIFY4UHJveHk6OnRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VSUk9S
LCAiZHJhd0ltYWdlOiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiKTsKICAgICAgICAgICAg
IHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHY4OjpV
bmRlZmluZWQoKTsKICAgICB9CiAKLSAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oVFlQRV9N
SVNNQVRDSF9FUlIpOworICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihUWVBFX01JU01BVENI
X0VSUik7CiAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiB9CiAKIENBTExC
QUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250ZXh0MkREcmF3SW1hZ2VGcm9tUmVjdCkK
IHsKICAgICBJTkNfU1RBVFMoIkRPTS5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQuZHJhd0ltYWdl
RnJvbVJlY3QoKSIpOwotICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0lu
ZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOworICAgIENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVS
SU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKIAogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiBhcmcgPSBhcmdzWzBdOwogCiAgICAgaWYgKFY4SFRNTEltYWdlRWxlbWVudDo6SGFzSW5zdGFu
Y2UoYXJnKSkgewotICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZV9lbGVtZW50ID0gVjhQ
cm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MSW1hZ2VFbGVtZW50PihhcmcpOworICAgICAgICBI
VE1MSW1hZ2VFbGVtZW50KiBpbWFnZV9lbGVtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBw
ZXJUb05vZGU8SFRNTEltYWdlRWxlbWVudD4oYXJnKTsKICAgICAgICAgY29udGV4dC0+ZHJhd0lt
YWdlRnJvbVJlY3QoaW1hZ2VfZWxlbWVudCwgIHRvRmxvYXQoYXJnc1sxXSksIHRvRmxvYXQoYXJn
c1syXSksIHRvRmxvYXQoYXJnc1szXSksIHRvRmxvYXQoYXJnc1s0XSksIHRvRmxvYXQoYXJnc1s1
XSksIHRvRmxvYXQoYXJnc1s2XSksIHRvRmxvYXQoYXJnc1s3XSksIHRvRmxvYXQoYXJnc1s4XSks
IFRvV2ViQ29yZVN0cmluZyhhcmdzWzldKSk7CiAgICAgfSBlbHNlCi0gICAgICAgIFY4UHJveHk6
OlRocm93RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgImRyYXdJbWFnZUZyb21SZWN0OiBJbnZh
bGlkIHR5cGUgb2YgYXJndW1lbnRzIik7CisgICAgICAgIFY4UHJveHk6OnRocm93RXJyb3IoVjhQ
cm94eTo6VFlQRV9FUlJPUiwgImRyYXdJbWFnZUZyb21SZWN0OiBJbnZhbGlkIHR5cGUgb2YgYXJn
dW1lbnRzIik7CiAKICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogfQpAQCAtMzAxLDMzICsz
MDEsMzMgQEAKIENBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRDcmVh
dGVQYXR0ZXJuKQogewogICAgIElOQ19TVEFUUygiRE9NLkNhbnZhc1JlbmRlcmluZ0NvbnRleHQy
RC5jcmVhdGVQYXR0ZXJuKCkiKTsKLSAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRl
eHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4
Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKKyAg
ICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZB
U1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICB2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4gYXJnID0gYXJnc1swXTsKIAogICAgIGlmIChWOEhUTUxJbWFnZUVsZW1lbnQ6Okhh
c0luc3RhbmNlKGFyZykpIHsKLSAgICAgICAgSFRNTEltYWdlRWxlbWVudCogaW1hZ2VfZWxlbWVu
dCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTEltYWdlRWxlbWVudD4oYXJnKTsKKyAg
ICAgICAgSFRNTEltYWdlRWxlbWVudCogaW1hZ2VfZWxlbWVudCA9IFY4UHJveHk6OmNvbnZlcnRE
T01XcmFwcGVyVG9Ob2RlPEhUTUxJbWFnZUVsZW1lbnQ+KGFyZyk7CiAgICAgICAgIEV4Y2VwdGlv
bkNvZGUgZWMgPSAwOwogICAgICAgICBSZWZQdHI8Q2FudmFzUGF0dGVybj4gcGF0dGVybiA9IGNv
bnRleHQtPmNyZWF0ZVBhdHRlcm4oaW1hZ2VfZWxlbWVudCwgdmFsdWVUb1N0cmluZ1dpdGhOdWxs
Q2hlY2soYXJnc1sxXSksIGVjKTsKICAgICAgICAgaWYgKGVjICE9IDApIHsKLSAgICAgICAgICAg
IFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAgICAgICBWOFByb3h5OjpzZXRE
T01FeGNlcHRpb24oZWMpOwogICAgICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2Vw
dG9yKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhD
bGFzc0luZGV4OjpDQU5WQVNQQVRURVJOLCBwYXR0ZXJuLmdldCgpKTsKKyAgICAgICAgcmV0dXJu
IFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUEFUVEVSTiwg
cGF0dGVybi5nZXQoKSk7CiAgICAgfQogCiAgICAgaWYgKFY4SFRNTENhbnZhc0VsZW1lbnQ6Okhh
c0luc3RhbmNlKGFyZykpIHsKLSAgICAgICAgSFRNTENhbnZhc0VsZW1lbnQqIGNhbnZhc19lbGVt
ZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MQ2FudmFzRWxlbWVudD4oYXJnKTsK
KyAgICAgICAgSFRNTENhbnZhc0VsZW1lbnQqIGNhbnZhc19lbGVtZW50ID0gVjhQcm94eTo6Y29u
dmVydERPTVdyYXBwZXJUb05vZGU8SFRNTENhbnZhc0VsZW1lbnQ+KGFyZyk7CiAgICAgICAgIEV4
Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgICAgICBSZWZQdHI8Q2FudmFzUGF0dGVybj4gcGF0dGVy
biA9IGNvbnRleHQtPmNyZWF0ZVBhdHRlcm4oY2FudmFzX2VsZW1lbnQsIHZhbHVlVG9TdHJpbmdX
aXRoTnVsbENoZWNrKGFyZ3NbMV0pLCBlYyk7CiAgICAgICAgIGlmIChlYyAhPSAwKSB7Ci0gICAg
ICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOworICAgICAgICAgICAgVjhQcm94
eTo6c2V0RE9NRXhjZXB0aW9uKGVjKTsKICAgICAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJ
bnRlcmNlcHRvcigpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2Jq
ZWN0KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUEFUVEVSTiwgcGF0dGVybi5nZXQoKSk7CisgICAgICAg
IHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNBTlZBU1BB
VFRFUk4sIHBhdHRlcm4uZ2V0KCkpOwogICAgIH0KIAotICAgIFY4UHJveHk6OlNldERPTUV4Y2Vw
dGlvbihUWVBFX01JU01BVENIX0VSUik7CisgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKFRZ
UEVfTUlTTUFUQ0hfRVJSKTsKICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsK
IH0KIApAQCAtMzM1LDEzICszMzUsMTMgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5DYW52YXNS
ZW5kZXJpbmdDb250ZXh0MkQuZmlsbFRleHQoKSIpOwogCi0gICAgQ2FudmFzUmVuZGVyaW5nQ29u
dGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5n
Q29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5I
b2xkZXIoKSk7CisgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94
eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFz
c0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAg
Ly8gVHdvIGZvcm1zOgogICAgIC8vICogZmlsbFRleHQodGV4dCwgeCwgeSkKICAgICAvLyAqIGZp
bGxUZXh0KHRleHQsIHgsIHksIG1heFdpZHRoKQogICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMyB8
fCBhcmdzLkxlbmd0aCgpID4gNCkgewotICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24o
U1lOVEFYX0VSUik7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihTWU5UQVhfRVJS
KTsKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAgICAgfQogCkBA
IC0zNjEsMTMgKzM2MSwxMyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0Nv
bnRleHQyRFN0cm9rZVRleHQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5n
Q29udGV4dDJELnN0cm9rZVRleHQoKSIpOwotICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCog
Y29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQy
RD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkp
OworICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OmNvbnZl
cnRUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6
Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKIAogICAgIC8vIFR3byBm
b3JtczoKICAgICAvLyAqIHN0cm9rZVRleHQodGV4dCwgeCwgeSkKICAgICAvLyAqIHN0cm9rZVRl
eHQodGV4dCwgeCwgeSwgbWF4V2lkdGgpCiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAzIHx8IGFy
Z3MuTGVuZ3RoKCkgPiA0KSB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihTWU5U
QVhfRVJSKTsKKyAgICAgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKFNZTlRBWF9FUlIpOwog
ICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKICAgICB9CiAKQEAgLTM5
MiwyMCArMzkyLDIwIEBACiAgICAgLy8gKiBwdXRJbWFnZURhdGEoSW1hZ2VEYXRhLCB4LCB5KQog
ICAgIC8vICogcHV0SW1hZ2VEYXRhKEltYWdlRGF0YSwgeCwgeSwgZGlydHlYLCBkaXJ0eVksIGRp
cnR5V2lkdGgsIGRpcnR5SGVpZ2h0KQogICAgIGlmIChhcmdzLkxlbmd0aCgpICE9IDMgJiYgYXJn
cy5MZW5ndGgoKSAhPSA3KSB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihTWU5U
QVhfRVJSKTsKKyAgICAgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKFNZTlRBWF9FUlIpOwog
ICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKICAgICB9CiAKLSAgICBD
YW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVj
dDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5H
Q09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQq
IGNvbnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5n
Q29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5I
b2xkZXIoKSk7CiAKICAgICBJbWFnZURhdGEqIGltYWdlRGF0YSA9IDA7CiAKICAgICAvLyBOZWVk
IHRvIGNoZWNrIHRoYXQgdGhlIGFyZ3VtZW50IGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUsIHNpbmNl
Ci0gICAgLy8gVG9OYXRpdmVPYmplY3QoKSBleHBlY3RzIGl0IHRvIGJlIGNvcnJlY3QuIElmIHRo
ZSBhcmd1bWVudCB3YXMgaW5jb3JyZWN0CisgICAgLy8gY29udmVydFRvTmF0aXZlT2JqZWN0KCkg
ZXhwZWN0cyBpdCB0byBiZSBjb3JyZWN0LiBJZiB0aGUgYXJndW1lbnQgd2FzIGluY29ycmVjdAog
ICAgIC8vIHdlIGxlYXZlIGl0IG51bGwsIGFuZCBwdXRJbWFnZURhdGEoKSB3aWxsIHRocm93IHRo
ZSBjb3JyZWN0IGV4Y2VwdGlvbgogICAgIC8vIChUWVBFX01JU01BVENIX0VSUikuCi0gICAgaWYg
KFY4UHJveHk6OklzV3JhcHBlck9mVHlwZShhcmdzWzBdLCBWOENsYXNzSW5kZXg6OklNQUdFREFU
QSkpCi0gICAgICAgIGltYWdlRGF0YSA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PEltYWdlRGF0
YT4oVjhDbGFzc0luZGV4OjpJTUFHRURBVEEsIGFyZ3NbMF0pOworICAgIGlmIChWOFByb3h5Ojpp
c1dyYXBwZXJPZlR5cGUoYXJnc1swXSwgVjhDbGFzc0luZGV4OjpJTUFHRURBVEEpKQorICAgICAg
ICBpbWFnZURhdGEgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8SW1hZ2VEYXRhPihW
OENsYXNzSW5kZXg6OklNQUdFREFUQSwgYXJnc1swXSk7CiAKICAgICBFeGNlcHRpb25Db2RlIGVj
ID0gMDsKIApAQCAtNDE1LDcgKzQxNSw3IEBACiAgICAgICAgIGNvbnRleHQtPnB1dEltYWdlRGF0
YShpbWFnZURhdGEsIHRvRmxvYXQoYXJnc1sxXSksIHRvRmxvYXQoYXJnc1syXSksIGVjKTsKIAog
ICAgIGlmIChlYyAhPSAwKSB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7
CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgIHJldHVybiBu
b3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogICAgIH0KIApJbmRleDogV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVzdEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVzdEN1c3RvbS5jcHAJKHJldmlz
aW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVz
dEN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU0LDcgKzU0LDcgQEAKIAogICAgIFY4UHJv
eHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUoeG1sSHR0cFJlcXVlc3QtPnNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQoKSk7CiAgICAgaWYgKHByb3h5KQotICAgICAgICByZXR1cm4gZmluZE9ubHkg
PyBwcm94eS0+RmluZE9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKSA6IHByb3h5LT5G
aW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBmYWxzZSk7CisgICAgICAgIHJl
dHVybiBmaW5kT25seSA/IHByb3h5LT5maW5kT2JqZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFs
c2UpIDogcHJveHktPmZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNl
KTsKIAogICAgIHJldHVybiBQYXNzUmVmUHRyPEV2ZW50TGlzdGVuZXI+KCk7CiB9CkBAIC02Miw3
ICs2Miw3IEBACiBBQ0NFU1NPUl9HRVRURVIoWE1MSHR0cFJlcXVlc3RPbmFib3J0KQogewogICAg
IElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0Lm9uYWJvcnQuX2dldCIpOwotICAgIFhNTEh0
dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0
dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsK
KyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1Qs
IGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh4bWxIdHRwUmVxdWVzdC0+b25hYm9ydCgpKSB7CiAg
ICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9i
amVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdC0+b25hYm9ydCgpKTsKICAgICAgICAg
djg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4TGlzdGVuZXIgPSBsaXN0ZW5lci0+Z2V0TGlzdGVuZXJP
YmplY3QoKTsKQEAgLTc0LDcgKzc0LDcgQEAKIEFDQ0VTU09SX1NFVFRFUihYTUxIdHRwUmVxdWVz
dE9uYWJvcnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3Qub25hYm9ydC5f
c2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1Qs
IGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4
UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4
OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwo
KSkgewogICAgICAgICBpZiAoeG1sSHR0cFJlcXVlc3QtPm9uYWJvcnQoKSkgewogICAgICAgICAg
ICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0
RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0LT5vbmFib3J0KCkpOwpAQCAtOTYsNyArOTYs
NyBAQAogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25lcnJvcikKIHsKICAgICBJTkNf
U1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdC5vbmVycm9yLl9nZXQiKTsKLSAgICBYTUxIdHRwUmVx
dWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVx
dWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CisgICAg
WE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBpbmZv
LkhvbGRlcigpKTsKICAgICBpZiAoeG1sSHR0cFJlcXVlc3QtPm9uZXJyb3IoKSkgewogICAgICAg
ICBSZWZQdHI8VjhPYmplY3RFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4
T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0LT5vbmVycm9yKCkpOwogICAgICAg
ICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0ZW5l
ck9iamVjdCgpOwpAQCAtMTA4LDcgKzEwOCw3IEBACiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJl
cXVlc3RPbmVycm9yKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0Lm9uZXJy
b3IuX3NldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6
OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFV
RVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3Qg
PSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJ
bmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh2YWx1ZS0+SXNO
dWxsKCkpIHsKICAgICAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0LT5vbmVycm9yKCkpIHsKICAgICAg
ICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9i
amVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdC0+b25lcnJvcigpKTsKQEAgLTEzMCw3
ICsxMzAsNyBAQAogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25sb2FkKQogewogICAg
IElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0Lm9ubG9hZC5fZ2V0Iik7Ci0gICAgWE1MSHR0
cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0
cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwor
ICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwg
aW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0LT5vbmxvYWQoKSkgewogICAg
ICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmpl
Y3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3QtPm9ubG9hZCgpKTsKICAgICAgICAgdjg6
OkxvY2FsPHY4OjpPYmplY3Q+IHY4TGlzdGVuZXIgPSBsaXN0ZW5lci0+Z2V0TGlzdGVuZXJPYmpl
Y3QoKTsKQEAgLTE0Miw3ICsxNDIsNyBAQAogQUNDRVNTT1JfU0VUVEVSKFhNTEh0dHBSZXF1ZXN0
T25sb2FkKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0Lm9ubG9hZC5fc2V0
Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRp
dmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGlu
Zm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJv
eHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpY
TUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkg
ewogICAgICAgICBpZiAoeG1sSHR0cFJlcXVlc3QtPm9ubG9hZCgpKSB7CiAgICAgICAgICAgICBW
OE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVu
dExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3QtPm9ubG9hZCgpKTsKQEAgLTE2NCw3ICsxNjQsNyBA
QAogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25sb2Fkc3RhcnQpCiB7CiAgICAgSU5D
X1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3Qub25sb2Fkc3RhcnQuX2dldCIpOwotICAgIFhNTEh0
dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0
dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsK
KyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1Qs
IGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh4bWxIdHRwUmVxdWVzdC0+b25sb2Fkc3RhcnQoKSkg
ewogICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8
VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3QtPm9ubG9hZHN0YXJ0KCkpOwog
ICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRM
aXN0ZW5lck9iamVjdCgpOwpAQCAtMTc2LDcgKzE3Niw3IEBACiBBQ0NFU1NPUl9TRVRURVIoWE1M
SHR0cFJlcXVlc3RPbmxvYWRzdGFydCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVx
dWVzdC5vbmxvYWRzdGFydC5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1
ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRl
eDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4
bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVx
dWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAg
aWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAoeG1sSHR0cFJlcXVlc3QtPm9ubG9h
ZHN0YXJ0KCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIg
PSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdC0+b25s
b2Fkc3RhcnQoKSk7CkBAIC0xOTgsNyArMTk4LDcgQEAKIEFDQ0VTU09SX0dFVFRFUihYTUxIdHRw
UmVxdWVzdE9ucHJvZ3Jlc3MpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3Qu
b25wcm9ncmVzcy5fZ2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0g
VjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1M
SFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRw
UmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4o
VjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHht
bEh0dHBSZXF1ZXN0LT5vbnByb2dyZXNzKCkpIHsKICAgICAgICAgVjhPYmplY3RFdmVudExpc3Rl
bmVyKiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0
dHBSZXF1ZXN0LT5vbnByb2dyZXNzKCkpOwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4g
djhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMjEwLDcgKzIx
MCw3IEBACiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RPbnByb2dyZXNzKQogewogICAg
IElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0Lm9ucHJvZ3Jlc3MuX3NldCIpOwotICAgIFhN
TEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhN
TEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBpbmZvLkhvbGRlcigp
KTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0
VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVF
U1QsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsKICAgICAgICAg
aWYgKHhtbEh0dHBSZXF1ZXN0LT5vbnByb2dyZXNzKCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0
RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVu
ZXIqPih4bWxIdHRwUmVxdWVzdC0+b25wcm9ncmVzcygpKTsKQEAgLTIzMiw3ICsyMzIsNyBAQAog
QUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25yZWFkeXN0YXRlY2hhbmdlKQogewogICAg
IElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZS5fZ2V0Iik7
Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8u
SG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxI
VFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0LT5vbnJl
YWR5c3RhdGVjaGFuZ2UoKSkgewogICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3Rl
bmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3Qt
Pm9ucmVhZHlzdGF0ZWNoYW5nZSgpKTsKICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4
TGlzdGVuZXIgPSBsaXN0ZW5lci0+Z2V0TGlzdGVuZXJPYmplY3QoKTsKQEAgLTI0NCw3ICsyNDQs
NyBAQAogQUNDRVNTT1JfU0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25yZWFkeXN0YXRlY2hhbmdlKQog
ewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZS5f
c2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1Qs
IGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4
UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4
OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwo
KSkgewogICAgICAgICBpZiAoeG1sSHR0cFJlcXVlc3QtPm9ucmVhZHlzdGF0ZWNoYW5nZSgpKSB7
CiAgICAgICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nh
c3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3QtPm9ucmVhZHlzdGF0ZWNo
YW5nZSgpKTsKQEAgLTI2OCwxNCArMjY4LDE0IEBACiAgICAgLy8gRklYTUU6IFRoaXMgaXMgb25s
eSBuZWVkZWQgYmVjYXVzZSB3ZWJraXQgc2V0IHRoaXMgZ2V0dGVyIGFzIGN1c3RvbS4KICAgICAv
LyBTbyB3ZSBuZWVkIGEgY3VzdG9tIG1ldGhvZCB0byBhdm9pZCBmb3JraW5nIHRoZSBJREwgZmls
ZS4KICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdC5yZXNwb25zZXRleHQuX2dldCIp
OwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0aXZl
T2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBpbmZv
LkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5
Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1M
SFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwogICAgIHJldHVybiB2OFN0cmluZ09yTnVsbCh4
bWxIdHRwUmVxdWVzdC0+cmVzcG9uc2VUZXh0KCkpOwogfQogCiBDQUxMQkFDS19GVU5DX0RFQ0wo
WE1MSHR0cFJlcXVlc3RBZGRFdmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFUUygiRE9NLlhN
TEh0dHBSZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoKSIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4
bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihW
OENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBhcmdzLkhvbGRlcigpKTsKKyAgICBYTUxIdHRw
UmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8
WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGFyZ3MuSG9sZGVy
KCkpOwogCiAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gZ2V0RXZlbnRMaXN0
ZW5lcih4bWxIdHRwUmVxdWVzdCwgYXJnc1sxXSwgZmFsc2UpOwogICAgIGlmIChsaXN0ZW5lcikg
ewpAQCAtMjkxLDcgKzI5MSw3IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woWE1MSHR0cFJlcXVlc3RS
ZW1vdmVFdmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0
LnJlbW92ZUV2ZW50TGlzdGVuZXIoKSIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVx
dWVzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5k
ZXg6OlhNTEhUVFBSRVFVRVNULCBhcmdzLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCog
eG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJl
cXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGFyZ3MuSG9sZGVyKCkpOwogCiAg
ICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gZ2V0RXZlbnRMaXN0ZW5lcih4bWxI
dHRwUmVxdWVzdCwgYXJnc1sxXSwgdHJ1ZSk7CiAgICAgaWYgKGxpc3RlbmVyKSB7CkBAIC0zMTcs
NyArMzE3LDcgQEAKICAgICBpZiAoYXJncy5MZW5ndGgoKSA8IDIpCiAgICAgICAgIHJldHVybiB0
aHJvd0Vycm9yKCJOb3QgZW5vdWdoIGFyZ3VtZW50cyIsIFY4UHJveHk6OlNZTlRBWF9FUlJPUik7
CiAKLSAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5OjpUb05hdGl2
ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgYXJn
cy5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94
eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhN
TEhUVFBSRVFVRVNULCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFN0cmluZyBtZXRob2QgPSB0b1dl
YkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgU3RyaW5nIHVybHN0cmluZyA9IHRvV2ViQ29yZVN0
cmluZyhhcmdzWzFdKTsKQEAgLTM3MCw3ICszNzAsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFhN
TEh0dHBSZXF1ZXN0U2VuZCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdC5z
ZW5kKCkiKTsKLSAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5OjpU
b05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVT
VCwgYXJncy5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0g
VjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5k
ZXg6OlhNTEhUVFBSRVFVRVNULCBhcmdzLkhvbGRlcigpKTsKIAogICAgIEV4Y2VwdGlvbkNvZGUg
ZWMgPSAwOwogICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMSkKQEAgLTM4MCw3ICszODAsNyBAQAog
ICAgICAgICAvLyBGSVhNRTogdXBzdHJlYW0gaGFuZGxlcyAiRmlsZSIgb2JqZWN0cyB0b28uCiAg
ICAgICAgIGlmIChJc0RvY3VtZW50VHlwZShhcmcpKSB7CiAgICAgICAgICAgICB2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QoYXJnKTsK
LSAgICAgICAgICAgIERvY3VtZW50KiBkb2N1bWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05v
ZGU8RG9jdW1lbnQ+KG9iamVjdCk7CisgICAgICAgICAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBW
OFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxEb2N1bWVudD4ob2JqZWN0KTsKICAgICAg
ICAgICAgIEFTU0VSVChkb2N1bWVudCk7CiAgICAgICAgICAgICB4bWxIdHRwUmVxdWVzdC0+c2Vu
ZChkb2N1bWVudCwgZWMpOwogICAgICAgICB9IGVsc2UKQEAgLTM5OCw3ICszOTgsNyBAQAogICAg
IGlmIChhcmdzLkxlbmd0aCgpIDwgMikKICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoIk5vdCBl
bm91Z2ggYXJndW1lbnRzIiwgVjhQcm94eTo6U1lOVEFYX0VSUk9SKTsKIAotICAgIFhNTEh0dHBS
ZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBS
ZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBhcmdzLkhvbGRlcigpKTsKKyAg
ICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRp
dmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGFy
Z3MuSG9sZGVyKCkpOwogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgIFN0cmluZyBoZWFk
ZXIgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgU3RyaW5nIHZhbHVlID0gdG9XZWJD
b3JlU3RyaW5nKGFyZ3NbMV0pOwpAQCAtNDE0LDcgKzQxNCw3IEBACiAgICAgaWYgKGFyZ3MuTGVu
Z3RoKCkgPCAxKQogICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigiTm90IGVub3VnaCBhcmd1bWVu
dHMiLCBWOFByb3h5OjpTWU5UQVhfRVJST1IpOwogCi0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0
dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xh
c3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1
ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxI
dHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgYXJncy5Ib2xkZXIoKSk7
CiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAgU3RyaW5nIGhlYWRlciA9IHRvV2ViQ29y
ZVN0cmluZyhhcmdzWzBdKTsKICAgICBTdHJpbmcgcmVzdWx0ID0geG1sSHR0cFJlcXVlc3QtPmdl
dFJlc3BvbnNlSGVhZGVyKGhlYWRlciwgZWMpOwpAQCAtNDI5LDcgKzQyOSw3IEBACiAgICAgaWYg
KGFyZ3MuTGVuZ3RoKCkgPCAxKQogICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigiTm90IGVub3Vn
aCBhcmd1bWVudHMiLCBWOFByb3h5OjpTWU5UQVhfRVJST1IpOwogCi0gICAgWE1MSHR0cFJlcXVl
c3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVl
c3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhN
TEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgYXJncy5I
b2xkZXIoKSk7CiAgICAgU3RyaW5nIHZhbHVlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwog
ICAgIHhtbEh0dHBSZXF1ZXN0LT5vdmVycmlkZU1pbWVUeXBlKHZhbHVlKTsKICAgICByZXR1cm4g
djg6OlVuZGVmaW5lZCgpOwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhJbnNw
ZWN0b3JDb250cm9sbGVyQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOEluc3BlY3RvckNvbnRyb2xsZXJDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5
NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SW5zcGVjdG9yQ29udHJvbGxlckN1
c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU2LDExICs1NiwxMSBAQAogICAgIGlmIChhcmdz
Lkxlbmd0aCgpIDwgMSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIE5v
ZGUqIG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0pOworICAg
IE5vZGUqIG5vZGUgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdz
WzBdKTsKICAgICBpZiAoIW5vZGUpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAK
LSAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVyID0gVjhQcm94eTo6
VG9OYXRpdmVPYmplY3Q8SW5zcGVjdG9yQ29udHJvbGxlcj4oVjhDbGFzc0luZGV4OjpJTlNQRUNU
T1JDT05UUk9MTEVSLCBhcmdzLkhvbGRlcigpKTsKKyAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBp
bnNwZWN0b3JDb250cm9sbGVyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PEluc3Bl
Y3RvckNvbnRyb2xsZXI+KFY4Q2xhc3NJbmRleDo6SU5TUEVDVE9SQ09OVFJPTExFUiwgYXJncy5I
b2xkZXIoKSk7CiAgICAgaW5zcGVjdG9yQ29udHJvbGxlci0+aGlnaGxpZ2h0KG5vZGUpOwogCiAg
ICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKQEAgLTc4LDcgKzc4LDcgQEAKIAogICAgIHVuc2ln
bmVkIGlkZW50aWZpZXIgPSBhcmdzWzFdLT5JbnQzMlZhbHVlKCk7CiAKLSAgICBJbnNwZWN0b3JD
b250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8
SW5zcGVjdG9yQ29udHJvbGxlcj4oVjhDbGFzc0luZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVSLCBh
cmdzLkhvbGRlcigpKTsKKyAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9s
bGVyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+
KFY4Q2xhc3NJbmRleDo6SU5TUEVDVE9SQ09OVFJPTExFUiwgYXJncy5Ib2xkZXIoKSk7CiAgICAg
UmVmUHRyPEluc3BlY3RvclJlc291cmNlPiByZXNvdXJjZSA9IGluc3BlY3RvckNvbnRyb2xsZXIt
PnJlc291cmNlcygpLmdldChpZGVudGlmaWVyKTsKICAgICBBU1NFUlQocmVzb3VyY2UpOwogICAg
IGlmICghcmVzb3VyY2UpCkBAIC05MCw3ICs5MCw3IEBACiAgICAgaWYgKGRvY3VtZW50LT5pc1Bs
dWdpbkRvY3VtZW50KCkgfHwgZG9jdW1lbnQtPmlzSW1hZ2VEb2N1bWVudCgpIHx8IGRvY3VtZW50
LT5pc01lZGlhRG9jdW1lbnQoKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAot
ICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9DVU1FTlQsIGRv
Y3VtZW50KTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0lu
ZGV4OjpET0NVTUVOVCwgZG9jdW1lbnQpOwogfQogCiBDQUxMQkFDS19GVU5DX0RFQ0woSW5zcGVj
dG9yQ29udHJvbGxlclNlYXJjaCkKQEAgLTEwMCw3ICsxMDAsNyBAQAogICAgIGlmIChhcmdzLkxl
bmd0aCgpIDwgMikKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIE5vZGUq
IG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0pOworICAgIE5v
ZGUqIG5vZGUgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBd
KTsKICAgICBpZiAoIW5vZGUpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKQEAg
LTEyNCw3ICsxMjQsNyBAQAogICAgICAgICBpZiAobmV3U3RhcnQgPT0gc3RhcnRWaXNpYmxlUG9z
aXRpb24oc2VhcmNoUmFuZ2UuZ2V0KCksIERPV05TVFJFQU0pKQogICAgICAgICAgICAgYnJlYWs7
CiAKLSAgICAgICAgcmVzdWx0LT5TZXQodjg6Ok51bWJlcjo6TmV3KGluZGV4KyspLCBWOFByb3h5
OjpUb1Y4T2JqZWN0PFJhbmdlPihWOENsYXNzSW5kZXg6OlJBTkdFLCByZXN1bHRSYW5nZS5nZXQo
KSkpOworICAgICAgICByZXN1bHQtPlNldCh2ODo6TnVtYmVyOjpOZXcoaW5kZXgrKyksIFY4UHJv
eHk6OmNvbnZlcnRUb1Y4T2JqZWN0PFJhbmdlPihWOENsYXNzSW5kZXg6OlJBTkdFLCByZXN1bHRS
YW5nZS5nZXQoKSkpOwogCiAgICAgICAgIHNldFN0YXJ0KHNlYXJjaFJhbmdlLmdldCgpLCBuZXdT
dGFydCk7CiAgICAgfSB3aGlsZSAodHJ1ZSk7CkBAIC0xNDUsOCArMTQ1LDggQEAKIHsKICAgICBJ
TkNfU1RBVFMoIkluc3BlY3RvckNvbnRyb2xsZXIuaW5zcGVjdGVkV2luZG93KCkiKTsKIAotICAg
IEluc3BlY3RvckNvbnRyb2xsZXIqIGluc3BlY3RvckNvbnRyb2xsZXIgPSBWOFByb3h5OjpUb05h
dGl2ZU9iamVjdDxJbnNwZWN0b3JDb250cm9sbGVyPihWOENsYXNzSW5kZXg6OklOU1BFQ1RPUkNP
TlRST0xMRVIsIGFyZ3MuSG9sZGVyKCkpOwotICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0
PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGluc3BlY3RvckNvbnRyb2xsZXIt
Pmluc3BlY3RlZFBhZ2UoKS0+bWFpbkZyYW1lKCktPmRvbVdpbmRvdygpKTsKKyAgICBJbnNwZWN0
b3JDb250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVyID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+KFY4Q2xhc3NJbmRleDo6SU5TUEVDVE9SQ09O
VFJPTExFUiwgYXJncy5Ib2xkZXIoKSk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4
T2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGluc3BlY3RvckNvbnRy
b2xsZXItPmluc3BlY3RlZFBhZ2UoKS0+bWFpbkZyYW1lKCktPmRvbVdpbmRvdygpKTsKIH0KIAog
Q0FMTEJBQ0tfRlVOQ19ERUNMKEluc3BlY3RvckNvbnRyb2xsZXJTZXR0aW5nKQpAQCAtMTYwLDcg
KzE2MCw3IEBACiAgICAgaWYgKGtleS5pc0VtcHR5KCkpCiAgICAgICAgIHJldHVybiB2ODo6VW5k
ZWZpbmVkKCk7CiAKLSAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVy
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SW5zcGVjdG9yQ29udHJvbGxlcj4oVjhDbGFzc0lu
ZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVSLCBhcmdzLkhvbGRlcigpKTsKKyAgICBJbnNwZWN0b3JD
b250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+KFY4Q2xhc3NJbmRleDo6SU5TUEVDVE9SQ09OVFJP
TExFUiwgYXJncy5Ib2xkZXIoKSk7CiAgICAgY29uc3QgSW5zcGVjdG9yQ29udHJvbGxlcjo6U2V0
dGluZyYgc2V0dGluZyA9IGluc3BlY3RvckNvbnRyb2xsZXIgLT5zZXR0aW5nKGtleSk7CiAKICAg
ICBzd2l0Y2ggKHNldHRpbmcudHlwZSgpKSB7CkBAIC0yMjEsNyArMjIxLDcgQEAKICAgICB9IGVs
c2UKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIEluc3BlY3RvckNvbnRy
b2xsZXIqIGluc3BlY3RvckNvbnRyb2xsZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxJbnNw
ZWN0b3JDb250cm9sbGVyPihWOENsYXNzSW5kZXg6OklOU1BFQ1RPUkNPTlRST0xMRVIsIGFyZ3Mu
SG9sZGVyKCkpOworICAgIEluc3BlY3RvckNvbnRyb2xsZXIqIGluc3BlY3RvckNvbnRyb2xsZXIg
PSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8SW5zcGVjdG9yQ29udHJvbGxlcj4oVjhD
bGFzc0luZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVSLCBhcmdzLkhvbGRlcigpKTsKICAgICBpbnNw
ZWN0b3JDb250cm9sbGVyLT5zZXRTZXR0aW5nKGtleSwgc2V0dGluZyk7CiAKICAgICByZXR1cm4g
djg6OlVuZGVmaW5lZCgpOwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDU1NT
dHlsZURlY2xhcmF0aW9uQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOENTU1N0eWxlRGVjbGFyYXRpb25DdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5
NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q1NTU3R5bGVEZWNsYXJhdGlvbkN1
c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE2MSw3ICsxNjEsNyBAQAogCiAgICAgLy8gU2Vh
cmNoIHRoZSBzdHlsZSBkZWNsYXJhdGlvbi4KICAgICBDU1NTdHlsZURlY2xhcmF0aW9uKiBpbXAg
PQotICAgICAgICBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDU1NTdHlsZURlY2xhcmF0aW9uPihW
OENsYXNzSW5kZXg6OkNTU1NUWUxFREVDTEFSQVRJT04sIGluZm8uSG9sZGVyKCkpOworICAgICAg
ICBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q1NTU3R5bGVEZWNsYXJhdGlvbj4oVjhD
bGFzc0luZGV4OjpDU1NTVFlMRURFQ0xBUkFUSU9OLCBpbmZvLkhvbGRlcigpKTsKICAgICBDU1NQ
cm9wZXJ0eUluZm8qIHByb3BJbmZvID0gY3NzUHJvcGVydHlJbmZvKG5hbWUpOwogCiAgICAgLy8g
RG8gbm90IGhhbmRsZSBub24tcHJvcGVydHkgbmFtZXMuCkBAIC0xOTUsNyArMTk1LDcgQEAKIHsK
ICAgICBJTkNfU1RBVFMoIkRPTS5DU1NTdHlsZURlY2xhcmF0aW9uLk5hbWVkUHJvcGVydHlTZXR0
ZXIiKTsKICAgICBDU1NTdHlsZURlY2xhcmF0aW9uKiBpbXAgPQotICAgICAgICBWOFByb3h5OjpU
b05hdGl2ZU9iamVjdDxDU1NTdHlsZURlY2xhcmF0aW9uPigKKyAgICAgICAgVjhQcm94eTo6Y29u
dmVydFRvTmF0aXZlT2JqZWN0PENTU1N0eWxlRGVjbGFyYXRpb24+KAogICAgICAgICAgICAgVjhD
bGFzc0luZGV4OjpDU1NTVFlMRURFQ0xBUkFUSU9OLCBpbmZvLkhvbGRlcigpKTsKICAgICBDU1NQ
cm9wZXJ0eUluZm8qIHByb3BJbmZvID0gY3NzUHJvcGVydHlJbmZvKG5hbWUpOwogICAgIGlmICgh
cHJvcEluZm8pCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFNWR01hdHJpeEN1
c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTVkdN
YXRyaXhDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4U1ZHTWF0cml4Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDYsNyArNDYs
NyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFNWR01hdHJpeEludmVyc2UpCiB7CiAgICAgSU5DX1NU
QVRTKCJET00uU1ZHTWF0cml4LmludmVyc2UoKSIpOwotICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4
IG1hdHJpeCA9ICpWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxWOFNWR1BPRFR5cGVXcmFwcGVyPFRy
YW5zZm9ybWF0aW9uTWF0cml4PiA+KFY4Q2xhc3NJbmRleDo6U1ZHTUFUUklYLCBhcmdzLkhvbGRl
cigpKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtYXRyaXggPSAqVjhQcm94eTo6Y29udmVy
dFRvTmF0aXZlT2JqZWN0PFY4U1ZHUE9EVHlwZVdyYXBwZXI8VHJhbnNmb3JtYXRpb25NYXRyaXg+
ID4oVjhDbGFzc0luZGV4OjpTVkdNQVRSSVgsIGFyZ3MuSG9sZGVyKCkpOwogICAgIEV4Y2VwdGlv
bkNvZGUgZWMgPSAwOwogICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHJlc3VsdCA9IG1hdHJpeC5p
bnZlcnNlKCk7CiAKQEAgLTU0LDE3ICs1NCwxNyBAQAogICAgICAgICBlYyA9IFNWR0V4Y2VwdGlv
bjo6U1ZHX01BVFJJWF9OT1RfSU5WRVJUQUJMRTsKIAogICAgIGlmIChlYyAhPSAwKSB7Ci0gICAg
ICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAgIFY4UHJveHk6OnNldERP
TUV4Y2VwdGlvbihlYyk7CiAgICAgICAgIHJldHVybiB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKTsK
ICAgICB9CiAKLSAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNW
R01BVFJJWCwgbmV3IFY4U1ZHU3RhdGljUE9EVHlwZVdyYXBwZXI8VHJhbnNmb3JtYXRpb25NYXRy
aXg+KHJlc3VsdCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENs
YXNzSW5kZXg6OlNWR01BVFJJWCwgbmV3IFY4U1ZHU3RhdGljUE9EVHlwZVdyYXBwZXI8VHJhbnNm
b3JtYXRpb25NYXRyaXg+KHJlc3VsdCkpOwogfQogCiBDQUxMQkFDS19GVU5DX0RFQ0woU1ZHTWF0
cml4Um90YXRlRnJvbVZlY3RvcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5TVkdNYXRyaXgucm90
YXRlRnJvbVZlY3RvcigpIik7Ci0gICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbWF0cml4ID0gKlY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PFY4U1ZHUE9EVHlwZVdyYXBwZXI8VHJhbnNmb3JtYXRpb25N
YXRyaXg+ID4oVjhDbGFzc0luZGV4OjpTVkdNQVRSSVgsIGFyZ3MuSG9sZGVyKCkpOworICAgIFRy
YW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeCA9ICpWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmpl
Y3Q8VjhTVkdQT0RUeXBlV3JhcHBlcjxUcmFuc2Zvcm1hdGlvbk1hdHJpeD4gPihWOENsYXNzSW5k
ZXg6OlNWR01BVFJJWCwgYXJncy5Ib2xkZXIoKSk7CiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7
CiAgICAgZmxvYXQgeCA9IHRvRmxvYXQoYXJnc1swXSk7CiAgICAgZmxvYXQgeSA9IHRvRmxvYXQo
YXJnc1sxXSk7CkBAIC03NCwxMSArNzQsMTEgQEAKICAgICAgICAgZWMgPSBTVkdFeGNlcHRpb246
OlNWR19JTlZBTElEX1ZBTFVFX0VSUjsKIAogICAgIGlmIChlYyAhPSAwKSB7Ci0gICAgICAgIFY4
UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2Vw
dGlvbihlYyk7CiAgICAgICAgIHJldHVybiB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKTsKICAgICB9
CiAKLSAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNWR01BVFJJ
WCwgbmV3IFY4U1ZHU3RhdGljUE9EVHlwZVdyYXBwZXI8VHJhbnNmb3JtYXRpb25NYXRyaXg+KHJl
c3VsdCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5k
ZXg6OlNWR01BVFJJWCwgbmV3IFY4U1ZHU3RhdGljUE9EVHlwZVdyYXBwZXI8VHJhbnNmb3JtYXRp
b25NYXRyaXg+KHJlc3VsdCkpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEVsZW1lbnRDdXN0b20uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RWxlbWVudEN1c3RvbS5jcHAJKHJldmlz
aW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhFbGVtZW50Q3VzdG9t
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTMsNyArNTMsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNM
KEVsZW1lbnRTZXRBdHRyaWJ1dGUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uRWxlbWVudC5zZXRB
dHRyaWJ1dGUoKSIpOwotICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVy
VG9Ob2RlPEVsZW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOworICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBW
OFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxFbGVtZW50PihhcmdzLkhvbGRlcigpKTsK
ICAgICBTdHJpbmcgbmFtZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKICAgICBTdHJpbmcg
dmFsdWUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1sxXSk7CiAKQEAgLTc0LDggKzc0LDggQEAKICAg
ICBpZiAoIVY4QXR0cjo6SGFzSW5zdGFuY2UoYXJnc1swXSkpCiAgICAgICAgIHJldHVybiB0aHJv
d0Vycm9yKFRZUEVfTUlTTUFUQ0hfRVJSKTsKIAotICAgIEF0dHIqIG5ld0F0dHIgPSBWOFByb3h5
OjpET01XcmFwcGVyVG9Ob2RlPEF0dHI+KGFyZ3NbMF0pOwotICAgIEVsZW1lbnQqIGVsZW1lbnQg
PSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEVsZW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOworICAg
IEF0dHIqIG5ld0F0dHIgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxBdHRyPihh
cmdzWzBdKTsKKyAgICBFbGVtZW50KiBlbGVtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBw
ZXJUb05vZGU8RWxlbWVudD4oYXJncy5Ib2xkZXIoKSk7CiAKICAgICBpZiAoIWFsbG93U2V0dGlu
Z1NyY1RvSmF2YXNjcmlwdFVSTChlbGVtZW50LCBuZXdBdHRyLT5uYW1lKCksIG5ld0F0dHItPnZh
bHVlKCkpKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwpAQCAtODUsMTMgKzg1LDEz
IEBACiAgICAgaWYgKGVjKQogICAgICAgICB0aHJvd0Vycm9yKGVjKTsKIAotICAgIHJldHVybiBW
OFByb3h5OjpOb2RlVG9WOE9iamVjdChyZXN1bHQuZ2V0KCkpOworICAgIHJldHVybiBWOFByb3h5
Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsKIH0KIAogQ0FMTEJBQ0tfRlVO
Q19ERUNMKEVsZW1lbnRTZXRBdHRyaWJ1dGVOUykKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5FbGVt
ZW50LnNldEF0dHJpYnV0ZU5TKCkiKTsKLSAgICBFbGVtZW50KiBlbGVtZW50ID0gVjhQcm94eTo6
RE9NV3JhcHBlclRvTm9kZTxFbGVtZW50PihhcmdzLkhvbGRlcigpKTsKKyAgICBFbGVtZW50KiBl
bGVtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8RWxlbWVudD4oYXJncy5I
b2xkZXIoKSk7CiAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHRvV2ViQ29yZVN0cmluZ1dpdGhO
dWxsQ2hlY2soYXJnc1swXSk7CiAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSB0b1dlYkNvcmVT
dHJpbmcoYXJnc1sxXSk7CiAgICAgU3RyaW5nIHZhbHVlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3Nb
Ml0pOwpAQCAtMTEzLDggKzExMyw4IEBACiAgICAgaWYgKCFWOEF0dHI6Okhhc0luc3RhbmNlKGFy
Z3NbMF0pKQogICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihUWVBFX01JU01BVENIX0VSUik7CiAK
LSAgICBBdHRyKiBuZXdBdHRyID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxBdHRyPihhcmdz
WzBdKTsKLSAgICBFbGVtZW50KiBlbGVtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxF
bGVtZW50PihhcmdzLkhvbGRlcigpKTsKKyAgICBBdHRyKiBuZXdBdHRyID0gVjhQcm94eTo6Y29u
dmVydERPTVdyYXBwZXJUb05vZGU8QXR0cj4oYXJnc1swXSk7CisgICAgRWxlbWVudCogZWxlbWVu
dCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEVsZW1lbnQ+KGFyZ3MuSG9sZGVy
KCkpOwogCiAgICAgaWYgKCFhbGxvd1NldHRpbmdTcmNUb0phdmFzY3JpcHRVUkwoZWxlbWVudCwg
bmV3QXR0ci0+bmFtZSgpLCBuZXdBdHRyLT52YWx1ZSgpKSkKICAgICAgICAgcmV0dXJuIHY4OjpV
bmRlZmluZWQoKTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgIGlmIChlYykKICAgICAgICAgdGhy
b3dFcnJvcihlYyk7CiAKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0
LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3Vs
dC5nZXQoKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgU3RyaW5nIHRvRXZlbnRUeXBlKHY4OjpMb2Nh
bDx2ODo6U3RyaW5nPiB2YWx1ZSkKQEAgLTEzNiw3ICsxMzYsNyBAQAogCiBBQ0NFU1NPUl9TRVRU
RVIoRWxlbWVudEV2ZW50SGFuZGxlcikKIHsKLSAgICBOb2RlKiBub2RlID0gVjhQcm94eTo6RE9N
V3JhcHBlclRvTm9kZTxOb2RlPihpbmZvLkhvbGRlcigpKTsKKyAgICBOb2RlKiBub2RlID0gVjhQ
cm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oaW5mby5Ib2xkZXIoKSk7CiAKICAg
ICBTdHJpbmcgZXZlbnRUeXBlID0gdG9FdmVudFR5cGUobmFtZSk7CiAKQEAgLTE1MSw3ICsxNTEs
NyBAQAogICAgICAgICBpZiAoIXByb3h5KQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAg
IGlmIChSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+RmluZE9yQ3JlYXRl
VjhFdmVudExpc3RlbmVyKHZhbHVlLCB0cnVlKSkKKyAgICAgICAgaWYgKFJlZlB0cjxFdmVudExp
c3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIodmFs
dWUsIHRydWUpKQogICAgICAgICAgICAgbm9kZS0+c2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihl
dmVudFR5cGUsIGxpc3RlbmVyKTsKICAgICB9IGVsc2UKICAgICAgICAgbm9kZS0+Y2xlYXJBdHRy
aWJ1dGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSk7CkBAIC0xNTksMTAgKzE1OSwxMCBAQAogCiBB
Q0NFU1NPUl9HRVRURVIoRWxlbWVudEV2ZW50SGFuZGxlcikKIHsKLSAgICBOb2RlKiBub2RlID0g
VjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxOb2RlPihpbmZvLkhvbGRlcigpKTsKKyAgICBOb2Rl
KiBub2RlID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oaW5mby5Ib2xk
ZXIoKSk7CiAKICAgICBFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IG5vZGUtPmdldEF0dHJpYnV0
ZUV2ZW50TGlzdGVuZXIodG9FdmVudFR5cGUobmFtZSkpOwotICAgIHJldHVybiBWOFByb3h5OjpF
dmVudExpc3RlbmVyVG9WOE9iamVjdChsaXN0ZW5lcik7CisgICAgcmV0dXJuIFY4UHJveHk6OmNv
bnZlcnRFdmVudExpc3RlbmVyVG9WOE9iamVjdChsaXN0ZW5lcik7CiB9CiAKIH0gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTFNlbGVj
dEVsZW1lbnRDb2xsZWN0aW9uQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOEhUTUxTZWxlY3RFbGVtZW50Q29sbGVjdGlvbkN1c3RvbS5jcHAJKHJl
dmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MU2VsZWN0
RWxlbWVudENvbGxlY3Rpb25DdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Myw3ICs0Myw3
IEBACiBOQU1FRF9QUk9QRVJUWV9HRVRURVIoSFRNTFNlbGVjdEVsZW1lbnRDb2xsZWN0aW9uKQog
ewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxTZWxlY3RFbGVtZW50Q29sbGVjdGlvbi5OYW1lZFBy
b3BlcnR5U2V0dGVyIik7Ci0gICAgSFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IFY4UHJveHk6
OkRPTVdyYXBwZXJUb05vZGU8SFRNTFNlbGVjdEVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAg
IEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRv
Tm9kZTxIVE1MU2VsZWN0RWxlbWVudD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgdjg6OkhhbmRsZTx2
ODo6VmFsdWU+IHZhbHVlID0gaW5mby5Ib2xkZXIoKS0+R2V0UmVhbE5hbWVkUHJvcGVydHlJblBy
b3RvdHlwZUNoYWluKG5hbWUpOwogCiAgICAgaWYgKCF2YWx1ZS5Jc0VtcHR5KCkpCkBAIC02Miwx
NiArNjIsMTYgQEAKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAK
ICAgICBpZiAoaXRlbXMuc2l6ZSgpID09IDEpCi0gICAgICAgIHJldHVybiBWOFByb3h5OjpOb2Rl
VG9WOE9iamVjdChpdGVtcy5hdCgwKS5nZXQoKSk7CisgICAgICAgIHJldHVybiBWOFByb3h5Ojpj
b252ZXJ0Tm9kZVRvVjhPYmplY3QoaXRlbXMuYXQoMCkuZ2V0KCkpOwogCiAgICAgTm9kZUxpc3Qq
IGxpc3QgPSBuZXcgVjhOYW1lZE5vZGVzQ29sbGVjdGlvbihpdGVtcyk7Ci0gICAgcmV0dXJuIFY4
UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpOT0RFTElTVCwgbGlzdCk7CisgICAgcmV0
dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Tk9ERUxJU1QsIGxp
c3QpOwogfQogCiBJTkRFWEVEX1BST1BFUlRZX1NFVFRFUihIVE1MU2VsZWN0RWxlbWVudENvbGxl
Y3Rpb24pCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTFNlbGVjdEVsZW1lbnRDb2xsZWN0aW9u
LkluZGV4ZWRQcm9wZXJ0eVNldHRlciIpOwotICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3Qg
PSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxTZWxlY3RFbGVtZW50PihpbmZvLkhvbGRl
cigpKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gVjhQcm94eTo6Y29udmVydERP
TVdyYXBwZXJUb05vZGU8SFRNTFNlbGVjdEVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIHJl
dHVybiB0b09wdGlvbnNDb2xsZWN0aW9uU2V0dGVyKGluZGV4LCB2YWx1ZSwgc2VsZWN0KTsKIH0K
IApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MT3B0aW9uc0NvbGxlY3Rp
b25DdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
SFRNTE9wdGlvbnNDb2xsZWN0aW9uQ3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxPcHRpb25zQ29sbGVjdGlvbkN1c3RvbS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTQ2LDcgKzQ2LDcgQEAKIENBTExCQUNLX0ZVTkNfREVDTChIVE1M
T3B0aW9uc0NvbGxlY3Rpb25SZW1vdmUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTE9wdGlv
bnNDb2xsZWN0aW9uLnJlbW92ZSgpIik7Ci0gICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uKiBpbXAg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJ
bmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBhcmdzLkhvbGRlcigpKTsKKyAgICBIVE1MT3B0
aW9uc0NvbGxlY3Rpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1M
T3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBh
cmdzLkhvbGRlcigpKTsKICAgICBIVE1MU2VsZWN0RWxlbWVudCogYmFzZSA9IHN0YXRpY19jYXN0
PEhUTUxTZWxlY3RFbGVtZW50Kj4oaW1wLT5iYXNlKCkpOwogICAgIHJldHVybiByZW1vdmVFbGVt
ZW50KGJhc2UsIGFyZ3MpOwogfQpAQCAtNTUsMTEgKzU1LDExIEBACiB7CiAgICAgSU5DX1NUQVRT
KCJET00uSFRNTE9wdGlvbnNDb2xsZWN0aW9uLmFkZCgpIik7CiAgICAgaWYgKCFWOEhUTUxPcHRp
b25FbGVtZW50OjpIYXNJbnN0YW5jZShhcmdzWzBdKSkgewotICAgICAgICBWOFByb3h5OjpTZXRE
T01FeGNlcHRpb24oVFlQRV9NSVNNQVRDSF9FUlIpOworICAgICAgICBWOFByb3h5OjpzZXRET01F
eGNlcHRpb24oVFlQRV9NSVNNQVRDSF9FUlIpOwogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5l
ZCgpOwogICAgIH0KLSAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb24qIGltcCA9IFY4UHJveHk6OlRv
TmF0aXZlT2JqZWN0PEhUTUxPcHRpb25zQ29sbGVjdGlvbj4oVjhDbGFzc0luZGV4OjpIVE1MT1BU
SU9OU0NPTExFQ1RJT04sIGFyZ3MuSG9sZGVyKCkpOwotICAgIEhUTUxPcHRpb25FbGVtZW50KiBv
cHRpb24gPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxPcHRpb25FbGVtZW50Pihhcmdz
WzBdKTsKKyAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRU
b05hdGl2ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9Q
VElPTlNDT0xMRUNUSU9OLCBhcmdzLkhvbGRlcigpKTsKKyAgICBIVE1MT3B0aW9uRWxlbWVudCog
b3B0aW9uID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTE9wdGlvbkVsZW1l
bnQ+KGFyZ3NbMF0pOwogCiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAgaWYgKGFyZ3Mu
TGVuZ3RoKCkgPCAyKQpAQCAtNzksNyArNzksNyBAQAogICAgIH0KIAogICAgIGlmIChlYyAhPSAw
KQotICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOworICAgICAgICBWOFByb3h5
OjpzZXRET01FeGNlcHRpb24oZWMpOwogCiAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIH0K
QEAgLTg3LDcgKzg3LDcgQEAKIEFDQ0VTU09SX0dFVFRFUihIVE1MT3B0aW9uc0NvbGxlY3Rpb25M
ZW5ndGgpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTE9wdGlvbnNDb2xsZWN0aW9uLmxlbmd0
aC5fZ2V0Iik7Ci0gICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05h
dGl2ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElP
TlNDT0xMRUNUSU9OLCBpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb24q
IGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxlY3Rp
b24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBpbmZvLkhvbGRlcigpKTsK
ICAgICBpbnQgdiA9IGltcC0+bGVuZ3RoKCk7CiAgICAgcmV0dXJuIHY4OjpJbnRlZ2VyOjpOZXco
dik7CiB9CkBAIC05NSw3ICs5NSw3IEBACiBBQ0NFU1NPUl9TRVRURVIoSFRNTE9wdGlvbnNDb2xs
ZWN0aW9uTGVuZ3RoKQogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxPcHRpb25zQ29sbGVjdGlv
bi5sZW5ndGguX3NldCIpOwotICAgIEhUTUxPcHRpb25zQ29sbGVjdGlvbiogaW1wID0gVjhQcm94
eTo6VG9OYXRpdmVPYmplY3Q8SFRNTE9wdGlvbnNDb2xsZWN0aW9uPihWOENsYXNzSW5kZXg6OkhU
TUxPUFRJT05TQ09MTEVDVElPTiwgaW5mby5Ib2xkZXIoKSk7CisgICAgSFRNTE9wdGlvbnNDb2xs
ZWN0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8SFRNTE9wdGlvbnND
b2xsZWN0aW9uPihWOENsYXNzSW5kZXg6OkhUTUxPUFRJT05TQ09MTEVDVElPTiwgaW5mby5Ib2xk
ZXIoKSk7CiAgICAgZG91YmxlIHYgPSB2YWx1ZS0+TnVtYmVyVmFsdWUoKTsKICAgICB1bnNpZ25l
ZCBuZXdMZW5ndGggPSAwOwogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwpAQCAtMTEwLDI1ICsx
MTAsMjUgQEAKICAgICBpZiAoIWVjKQogICAgICAgICBpbXAtPnNldExlbmd0aCh2YWx1ZS0+VWlu
dDMyVmFsdWUoKSwgZWMpOwogCi0gICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAg
ICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogfQogCiBJTkRFWEVEX1BST1BFUlRZX0dF
VFRFUihIVE1MT3B0aW9uc0NvbGxlY3Rpb24pCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTE9w
dGlvbnNDb2xsZWN0aW9uLkluZGV4ZWRQcm9wZXJ0eUdldHRlciIpOwotICAgIEhUTUxPcHRpb25z
Q29sbGVjdGlvbiogY29sbGVjdGlvbiA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PEhUTUxPcHRp
b25zQ29sbGVjdGlvbj4oVjhDbGFzc0luZGV4OjpIVE1MT1BUSU9OU0NPTExFQ1RJT04sIGluZm8u
SG9sZGVyKCkpOworICAgIEhUTUxPcHRpb25zQ29sbGVjdGlvbiogY29sbGVjdGlvbiA9IFY4UHJv
eHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJ
bmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBpbmZvLkhvbGRlcigpKTsKIAogICAgIFJlZlB0
cjxOb2RlPiByZXN1bHQgPSBjb2xsZWN0aW9uLT5pdGVtKGluZGV4KTsKICAgICBpZiAoIXJlc3Vs
dCkKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAKLSAgICByZXR1
cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsKKyAgICByZXR1cm4gVjhQ
cm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAKIElOREVYRURf
UFJPUEVSVFlfU0VUVEVSKEhUTUxPcHRpb25zQ29sbGVjdGlvbikKIHsKICAgICBJTkNfU1RBVFMo
IkRPTS5IVE1MT3B0aW9uc0NvbGxlY3Rpb24uSW5kZXhlZFByb3BlcnR5U2V0dGVyIik7Ci0gICAg
SFRNTE9wdGlvbnNDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6VG9OYXRpdmVPYmpl
Y3Q8SFRNTE9wdGlvbnNDb2xsZWN0aW9uPihWOENsYXNzSW5kZXg6OkhUTUxPUFRJT05TQ09MTEVD
VElPTiwgaW5mby5Ib2xkZXIoKSk7CisgICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uKiBjb2xsZWN0
aW9uID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PEhUTUxPcHRpb25zQ29sbGVjdGlv
bj4oVjhDbGFzc0luZGV4OjpIVE1MT1BUSU9OU0NPTExFQ1RJT04sIGluZm8uSG9sZGVyKCkpOwog
ICAgIEhUTUxTZWxlY3RFbGVtZW50KiBiYXNlID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1l
bnQqPihjb2xsZWN0aW9uLT5iYXNlKCkpOwogICAgIHJldHVybiB0b09wdGlvbnNDb2xsZWN0aW9u
U2V0dGVyKGluZGV4LCB2YWx1ZSwgYmFzZSk7CiB9CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOENsaXBib2FyZEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhDbGlwYm9hcmRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysr
IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2xpcGJvYXJkQ3VzdG9tLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNDcsNyArNDcsNyBAQAogQUNDRVNTT1JfR0VUVEVSKENsaXBib2FyZFR5cGVz
KQogewogICAgIElOQ19TVEFUUygiRE9NLkNsaXBib2FyZC50eXBlcygpIik7Ci0gICAgQ2xpcGJv
YXJkKiBjbGlwYm9hcmQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDbGlwYm9hcmQ+KFY4Q2xh
c3NJbmRleDo6Q0xJUEJPQVJELCBpbmZvLkhvbGRlcigpKTsKKyAgICBDbGlwYm9hcmQqIGNsaXBi
b2FyZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDbGlwYm9hcmQ+KFY4Q2xhc3NJ
bmRleDo6Q0xJUEJPQVJELCBpbmZvLkhvbGRlcigpKTsKIAogICAgIEhhc2hTZXQ8U3RyaW5nPiB0
eXBlcyA9IGNsaXBib2FyZC0+dHlwZXMoKTsKICAgICBpZiAodHlwZXMuaXNFbXB0eSgpKQpAQCAt
NjUsNyArNjUsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKENsaXBib2FyZENsZWFyRGF0YSkKIHsK
ICAgICBJTkNfU1RBVFMoIkRPTS5DbGlwYm9hcmQuY2xlYXJEYXRhKCkiKTsKLSAgICBDbGlwYm9h
cmQqIGNsaXBib2FyZCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENsaXBib2FyZD4oVjhDbGFz
c0luZGV4OjpDTElQQk9BUkQsIGFyZ3MuSG9sZGVyKCkpOworICAgIENsaXBib2FyZCogY2xpcGJv
YXJkID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENsaXBib2FyZD4oVjhDbGFzc0lu
ZGV4OjpDTElQQk9BUkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgaWYgKCFhcmdzLkxlbmd0aCgp
KSB7CiAgICAgICAgIGNsaXBib2FyZC0+Y2xlYXJBbGxEYXRhKCk7CkBAIC04Myw3ICs4Myw3IEBA
CiBDQUxMQkFDS19GVU5DX0RFQ0woQ2xpcGJvYXJkR2V0RGF0YSkKIHsKICAgICBJTkNfU1RBVFMo
IkRPTS5DbGlwYm9hcmQuZ2V0RGF0YSgpIik7Ci0gICAgQ2xpcGJvYXJkKiBjbGlwYm9hcmQgPSBW
OFByb3h5OjpUb05hdGl2ZU9iamVjdDxDbGlwYm9hcmQ+KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJE
LCBhcmdzLkhvbGRlcigpKTsKKyAgICBDbGlwYm9hcmQqIGNsaXBib2FyZCA9IFY4UHJveHk6OmNv
bnZlcnRUb05hdGl2ZU9iamVjdDxDbGlwYm9hcmQ+KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBh
cmdzLkhvbGRlcigpKTsKIAogICAgIGlmIChhcmdzLkxlbmd0aCgpICE9IDEpCiAgICAgICAgIHJl
dHVybiB0aHJvd0Vycm9yKCJnZXREYXRhOiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiLCBW
OFByb3h5OjpTWU5UQVhfRVJST1IpOwpAQCAtOTksNyArOTksNyBAQAogQ0FMTEJBQ0tfRlVOQ19E
RUNMKENsaXBib2FyZFNldERhdGEpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2xpcGJvYXJkLnNl
dERhdGEoKSIpOwotICAgIENsaXBib2FyZCogY2xpcGJvYXJkID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8Q2xpcGJvYXJkPihWOENsYXNzSW5kZXg6OkNMSVBCT0FSRCwgYXJncy5Ib2xkZXIoKSk7
CisgICAgQ2xpcGJvYXJkKiBjbGlwYm9hcmQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmpl
Y3Q8Q2xpcGJvYXJkPihWOENsYXNzSW5kZXg6OkNMSVBCT0FSRCwgYXJncy5Ib2xkZXIoKSk7CiAK
ICAgICBpZiAoYXJncy5MZW5ndGgoKSAhPSAyKQogICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigi
c2V0RGF0YTogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIiwgVjhQcm94eTo6U1lOVEFYX0VS
Uk9SKTsKQEAgLTExMiw3ICsxMTIsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKENsaXBib2FyZFNl
dERyYWdJbWFnZSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5DbGlwYm9hcmQuc2V0RHJhZ0ltYWdl
KCkiKTsKLSAgICBDbGlwYm9hcmQqIGNsaXBib2FyZCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0
PENsaXBib2FyZD4oVjhDbGFzc0luZGV4OjpDTElQQk9BUkQsIGFyZ3MuSG9sZGVyKCkpOworICAg
IENsaXBib2FyZCogY2xpcGJvYXJkID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENs
aXBib2FyZD4oVjhDbGFzc0luZGV4OjpDTElQQk9BUkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAg
aWYgKCFjbGlwYm9hcmQtPmlzRm9yRHJhZ2dpbmcoKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRl
ZmluZWQoKTsKQEAgLTEyNSw3ICsxMjUsNyBAQAogCiAgICAgTm9kZSogbm9kZSA9IDA7CiAgICAg
aWYgKFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1swXSkpCi0gICAgICAgIG5vZGUgPSBWOFByb3h5
OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0pOworICAgICAgICBub2RlID0gVjhQcm94
eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJnc1swXSk7CiAKICAgICBpZiAoIW5v
ZGUgfHwgIW5vZGUtPmlzRWxlbWVudE5vZGUoKSkKICAgICAgICAgcmV0dXJuIHRocm93RXJyb3Io
InNldERyYWdJbWFnZUZyb21FbGVtZW50OiBJbnZhbGlkIGZpcnN0IGFyZ3VtZW50Iik7CkluZGV4
OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxGcmFtZVNldEVsZW1lbnRDdXN0b20u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTEZyYW1l
U2V0RWxlbWVudEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhIVE1MRnJhbWVTZXRFbGVtZW50Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNDcsMTQgKzQ3LDE0IEBACiBOQU1FRF9QUk9QRVJUWV9HRVRURVIoSFRNTEZyYW1lU2V0
RWxlbWVudCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MRnJhbWVTZXRFbGVtZW50Lk5hbWVk
UHJvcGVydHlHZXR0ZXIiKTsKLSAgICBIVE1MRnJhbWVTZXRFbGVtZW50KiBpbXAgPSBWOFByb3h5
OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxGcmFtZVNldEVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOwor
ICAgIEhUTUxGcmFtZVNldEVsZW1lbnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVy
VG9Ob2RlPEhUTUxGcmFtZVNldEVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIE5vZGUqIGZy
YW1lTm9kZSA9IGltcC0+Y2hpbGRyZW4oKS0+bmFtZWRJdGVtKHY4U3RyaW5nVG9BdG9taWNXZWJD
b3JlU3RyaW5nKG5hbWUpKTsKICAgICBpZiAoZnJhbWVOb2RlICYmIGZyYW1lTm9kZS0+aGFzVGFn
TmFtZShIVE1MTmFtZXM6OmZyYW1lVGFnKSkgewogICAgICAgICBEb2N1bWVudCogZG9jID0gc3Rh
dGljX2Nhc3Q8SFRNTEZyYW1lRWxlbWVudCo+KGZyYW1lTm9kZSktPmNvbnRlbnREb2N1bWVudCgp
OwogICAgICAgICBpZiAoIWRvYykKICAgICAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7
CiAgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBkb2MtPmZyYW1lKCkpCi0gICAgICAgICAgICBy
ZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgZnJhbWUt
PmRvbVdpbmRvdygpKTsKKyAgICAgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9i
amVjdChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgZnJhbWUtPmRvbVdpbmRvdygpKTsKICAgICB9
CiAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiB9CkluZGV4OiBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERvY3VtZW50TG9jYXRpb25DdXN0b20uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RG9jdW1lbnRMb2NhdGlvbkN1c3Rv
bS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhE
b2N1bWVudExvY2F0aW9uQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQsMTcgKzM0LDE3
IEBACiAKIEFDQ0VTU09SX0dFVFRFUihEb2N1bWVudExvY2F0aW9uKQogewotICAgIERvY3VtZW50
KiBkb2N1bWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05hdGl2ZTxEb2N1bWVudD4oaW5mby5I
b2xkZXIoKSk7CisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdy
YXBwZXJUb05hdGl2ZTxEb2N1bWVudD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKCFkb2N1bWVu
dC0+ZnJhbWUoKSkKICAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CiAKICAgICBET01XaW5kb3cq
IHdpbmRvdyA9IGRvY3VtZW50LT5mcmFtZSgpLT5kb21XaW5kb3coKTsKLSAgICByZXR1cm4gVjhQ
cm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCB3aW5kb3ctPmxvY2F0aW9u
KCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6
OkxPQ0FUSU9OLCB3aW5kb3ctPmxvY2F0aW9uKCkpOwogfQogCiBBQ0NFU1NPUl9TRVRURVIoRG9j
dW1lbnRMb2NhdGlvbikKIHsKLSAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBWOFByb3h5OjpET01X
cmFwcGVyVG9OYXRpdmU8RG9jdW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIERvY3VtZW50KiBk
b2N1bWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8RG9jdW1lbnQ+KGlu
Zm8uSG9sZGVyKCkpOwogICAgIGlmICghZG9jdW1lbnQtPmZyYW1lKCkpCiAgICAgICAgIHJldHVy
bjsKIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhMb2NhdGlvbkN1c3RvbS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhMb2NhdGlvbkN1
c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhMb2NhdGlvbkN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYyLDcgKzYyLDcgQEAKIHsK
ICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5oYXNoLl9zZXQiKTsKICAgICB2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0gICAgTG9jYXRpb24qIGltcCA9
IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9O
LCBob2xkZXIpOworICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVP
YmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvbGRlcik7CiAgICAgU3Ry
aW5nIGhhc2ggPSB0b1dlYkNvcmVTdHJpbmcodmFsdWUpOwogCiAgICAgRnJhbWUqIGZyYW1lID0g
aW1wLT5mcmFtZSgpOwpAQCAtODUsNyArODUsNyBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkxv
Y2F0aW9uLmhvc3QuX3NldCIpOwogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0g
aW5mby5Ib2xkZXIoKTsKLSAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmpl
Y3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvbGRlcik7CisgICAgTG9jYXRp
b24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFz
c0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKICAgICBTdHJpbmcgaG9zdCA9IHRvV2ViQ29yZVN0
cmluZyh2YWx1ZSk7CiAKICAgICBGcmFtZSogZnJhbWUgPSBpbXAtPmZyYW1lKCk7CkBAIC0xMDUs
NyArMTA1LDcgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5ob3N0bmFtZS5fc2V0
Iik7CiAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBpbmZvLkhvbGRlcigpOwot
ICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhD
bGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94
eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9O
LCBob2xkZXIpOwogICAgIFN0cmluZyBob3N0bmFtZSA9IHRvV2ViQ29yZVN0cmluZyh2YWx1ZSk7
CiAKICAgICBGcmFtZSogZnJhbWUgPSBpbXAtPmZyYW1lKCk7CkBAIC0xMjIsNyArMTIyLDcgQEAK
IHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5ocmVmLl9zZXQiKTsKICAgICB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0gICAgTG9jYXRpb24qIGlt
cCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FU
SU9OLCBob2xkZXIpOworICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRp
dmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvbGRlcik7CiAKICAg
ICBGcmFtZSogZnJhbWUgPSBpbXAtPmZyYW1lKCk7CiAgICAgaWYgKCFmcmFtZSkKQEAgLTE0Miw3
ICsxNDIsNyBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLnBhdGhuYW1lLl9zZXQi
KTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0g
ICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENs
YXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOworICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5
Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04s
IGhvbGRlcik7CiAgICAgU3RyaW5nIHBhdGhuYW1lID0gdG9XZWJDb3JlU3RyaW5nKHZhbHVlKTsK
IAogICAgIEZyYW1lKiBmcmFtZSA9IGltcC0+ZnJhbWUoKTsKQEAgLTE1OSw3ICsxNTksNyBAQAog
ewogICAgIElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLnBvcnQuX3NldCIpOwogICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gaG9sZGVyID0gaW5mby5Ib2xkZXIoKTsKLSAgICBMb2NhdGlvbiogaW1w
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJ
T04sIGhvbGRlcik7CisgICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2
ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKICAgICBT
dHJpbmcgcG9ydCA9IHRvV2ViQ29yZVN0cmluZyh2YWx1ZSk7CiAKICAgICBGcmFtZSogZnJhbWUg
PSBpbXAtPmZyYW1lKCk7CkBAIC0xNzYsNyArMTc2LDcgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRP
TS5Mb2NhdGlvbi5wcm90b2NvbC5fc2V0Iik7CiAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBo
b2xkZXIgPSBpbmZvLkhvbGRlcigpOwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05h
dGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAg
ICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExvY2F0aW9u
PihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwogICAgIFN0cmluZyBwcm90b2NvbCA9
IHRvV2ViQ29yZVN0cmluZyh2YWx1ZSk7CiAKICAgICBGcmFtZSogZnJhbWUgPSBpbXAtPmZyYW1l
KCk7CkBAIC0xOTMsNyArMTkzLDcgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5z
ZWFyY2guX3NldCIpOwogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gaW5mby5I
b2xkZXIoKTsKLSAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TG9j
YXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvbGRlcik7CisgICAgTG9jYXRpb24qIGlt
cCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4
OjpMT0NBVElPTiwgaG9sZGVyKTsKICAgICBTdHJpbmcgcXVlcnkgPSB0b1dlYkNvcmVTdHJpbmco
dmFsdWUpOwogCiAgICAgRnJhbWUqIGZyYW1lID0gaW1wLT5mcmFtZSgpOwpAQCAtMjEwLDE0ICsy
MTAsMTQgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5yZWxvYWQuX2dldCIpOwog
ICAgIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gcHJpdmF0ZVRl
bXBsYXRlID0gdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+OjpOZXcodjg6OkZ1
bmN0aW9uVGVtcGxhdGU6Ok5ldyh2OExvY2F0aW9uUmVsb2FkQ2FsbGJhY2ssIHY4OjpIYW5kbGU8
djg6OlZhbHVlPigpLCB2ODo6U2lnbmF0dXJlOjpOZXcoVjhMb2NhdGlvbjo6R2V0UmF3VGVtcGxh
dGUoKSkpKTsKLSAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Okxv
b2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaW5mby5UaGlzKCkpOworICAg
IHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gVjhQcm94eTo6bG9va3VwRE9NV3JhcHBl
cihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBpbmZvLlRoaXMoKSk7CiAgICAgaWYgKGhvbGRlci5J
c0VtcHR5KCkpIHsKICAgICAgICAgLy8gY2FuIG9ubHkgcmVhY2ggaGVyZSBieSAnb2JqZWN0Ll9f
cHJvdG9fXy5mdW5jJywgYW5kIGl0IHNob3VsZCBwYXNzZWQKICAgICAgICAgLy8gZG9tYWluIHNl
Y3VyaXR5IGNoZWNrIGFscmVhZHkKICAgICAgICAgcmV0dXJuIHByaXZhdGVUZW1wbGF0ZS0+R2V0
RnVuY3Rpb24oKTsKICAgICB9Ci0gICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZl
T2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwotICAgIGlm
ICghVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCBmYWxzZSkpIHsKKyAgICBM
b2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihW
OENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOworICAgIGlmICghVjhQcm94eTo6Y2FuQWNj
ZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCBmYWxzZSkpIHsKICAgICAgICAgc3RhdGljIHY4OjpQZXJz
aXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBzaGFyZWRUZW1wbGF0ZSA9IHY4OjpQZXJzaXN0
ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXco
djhMb2NhdGlvblJlbG9hZENhbGxiYWNrLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKSwgdjg6OlNp
Z25hdHVyZTo6TmV3KFY4TG9jYXRpb246OkdldFJhd1RlbXBsYXRlKCkpKSk7CiAgICAgICAgIHJl
dHVybiBzaGFyZWRUZW1wbGF0ZS0+R2V0RnVuY3Rpb24oKTsKICAgICB9IGVsc2UKQEAgLTIyOCwx
NCArMjI4LDE0IEBACiB7CiAgICAgSU5DX1NUQVRTKCJET00uTG9jYXRpb24ucmVwbGFjZS5fZ2V0
Iik7CiAgICAgc3RhdGljIHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBwcml2
YXRlVGVtcGxhdGUgPSB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT46Ok5ldyh2
ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KHY4TG9jYXRpb25SZXBsYWNlQ2FsbGJhY2ssIHY4OjpI
YW5kbGU8djg6OlZhbHVlPigpLCB2ODo6U2lnbmF0dXJlOjpOZXcoVjhMb2NhdGlvbjo6R2V0UmF3
VGVtcGxhdGUoKSkpKTsKLSAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJv
eHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaW5mby5UaGlzKCkp
OworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gVjhQcm94eTo6bG9va3VwRE9N
V3JhcHBlcihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBpbmZvLlRoaXMoKSk7CiAgICAgaWYgKGhv
bGRlci5Jc0VtcHR5KCkpIHsKICAgICAgICAgLy8gY2FuIG9ubHkgcmVhY2ggaGVyZSBieSAnb2Jq
ZWN0Ll9fcHJvdG9fXy5mdW5jJywgYW5kIGl0IHNob3VsZCBwYXNzZWQKICAgICAgICAgLy8gZG9t
YWluIHNlY3VyaXR5IGNoZWNrIGFscmVhZHkKICAgICAgICAgcmV0dXJuIHByaXZhdGVUZW1wbGF0
ZS0+R2V0RnVuY3Rpb24oKTsKICAgICB9Ci0gICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRv
TmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwot
ICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCBmYWxzZSkpIHsK
KyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExvY2F0
aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOworICAgIGlmICghVjhQcm94eTo6
Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCBmYWxzZSkpIHsKICAgICAgICAgc3RhdGljIHY4
OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBzaGFyZWRUZW1wbGF0ZSA9IHY4OjpQ
ZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KHY4OjpGdW5jdGlvblRlbXBsYXRl
OjpOZXcodjhMb2NhdGlvblJlcGxhY2VDYWxsYmFjaywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCks
IHY4OjpTaWduYXR1cmU6Ok5ldyhWOExvY2F0aW9uOjpHZXRSYXdUZW1wbGF0ZSgpKSkpOwogICAg
ICAgICByZXR1cm4gc2hhcmVkVGVtcGxhdGUtPkdldEZ1bmN0aW9uKCk7CiAgICAgfSBlbHNlCkBA
IC0yNDcsMTQgKzI0NywxNCBAQAogICAgIElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLmFzc2lnbi5f
Z2V0Iik7CiAgICAgc3RhdGljIHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBw
cml2YXRlVGVtcGxhdGUgPQogICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRl
Pjo6TmV3KHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcodjhMb2NhdGlvbkFzc2lnbkNhbGxiYWNr
LCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKSwgdjg6OlNpZ25hdHVyZTo6TmV3KFY4TG9jYXRpb246
OkdldFJhd1RlbXBsYXRlKCkpKSk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIg
PSBWOFByb3h5OjpMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGluZm8u
VGhpcygpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Omxv
b2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaW5mby5UaGlzKCkpOwogICAg
IGlmIChob2xkZXIuSXNFbXB0eSgpKSB7CiAgICAgICAgIC8vIGNhbiBvbmx5IHJlYWNoIGhlcmUg
YnkgJ29iamVjdC5fX3Byb3RvX18uZnVuYycsIGFuZCBpdCBzaG91bGQgcGFzc2VkCiAgICAgICAg
IC8vIGRvbWFpbiBzZWN1cml0eSBjaGVjayBhbHJlYWR5CiAgICAgICAgIHJldHVybiBwcml2YXRl
VGVtcGxhdGUtPkdldEZ1bmN0aW9uKCk7CiAgICAgfQotICAgIExvY2F0aW9uKiBpbXAgPSBWOFBy
b3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9s
ZGVyKTsKLSAgICBpZiAoIVY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgZmFs
c2UpKSB7CisgICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVj
dDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAgICBpZiAoIVY4
UHJveHk6OmNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgZmFsc2UpKSB7CiAgICAgICAgIHN0
YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gc2hhcmVkVGVtcGxhdGUg
PSB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT46Ok5ldyh2ODo6RnVuY3Rpb25U
ZW1wbGF0ZTo6TmV3KHY4TG9jYXRpb25Bc3NpZ25DYWxsYmFjaywgdjg6OkhhbmRsZTx2ODo6VmFs
dWU+KCksIHY4OjpTaWduYXR1cmU6Ok5ldyhWOExvY2F0aW9uOjpHZXRSYXdUZW1wbGF0ZSgpKSkp
OwogICAgICAgICByZXR1cm4gc2hhcmVkVGVtcGxhdGUtPkdldEZ1bmN0aW9uKCk7CiAgICAgfSBl
bHNlCkBAIC0yNjcsNyArMjY3LDcgQEAKIAogICAgIElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLnJl
bG9hZCIpOwogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBob2xkZXIgPSBhcmdzLkhvbGRlcigp
OwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4o
VjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQ
cm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FU
SU9OLCBob2xkZXIpOwogCiAgICAgRnJhbWUqIGZyYW1lID0gaW1wLT5mcmFtZSgpOwogICAgIGlm
ICghZnJhbWUgfHwgIVNjcmlwdENvbnRyb2xsZXI6OmlzU2FmZVNjcmlwdChmcmFtZSkpCkBAIC0y
ODIsNyArMjgyLDcgQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5yZXBsYWNlIik7
CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhvbGRlciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAg
TG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNz
SW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOworICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5Ojpj
b252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhv
bGRlcik7CiAKICAgICBGcmFtZSogZnJhbWUgPSBpbXAtPmZyYW1lKCk7CiAgICAgaWYgKCFmcmFt
ZSkKQEAgLTMwMyw3ICszMDMsNyBAQAogewogICAgIElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLmFz
c2lnbiIpOwogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBob2xkZXIgPSBhcmdzLkhvbGRlcigp
OwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4o
VjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQ
cm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FU
SU9OLCBob2xkZXIpOwogCiAgICAgRnJhbWUqIGZyYW1lID0gaW1wLT5mcmFtZSgpOwogICAgIGlm
ICghZnJhbWUpCkBAIC0zMzQsOCArMzM0LDggQEAKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2Nh
dGlvbi50b1N0cmluZyIpOwogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBob2xkZXIgPSBhcmdz
LkhvbGRlcigpOwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxM
b2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKLSAgICBpZiAoIVY4UHJv
eHk6OkNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgdHJ1ZSkpCisgICAgTG9jYXRpb24qIGlt
cCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4
OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAgICBpZiAoIVY4UHJveHk6OmNhbkFjY2Vzc0ZyYW1lKGlt
cC0+ZnJhbWUoKSwgdHJ1ZSkpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAg
U3RyaW5nIHJlc3VsdCA9IGltcC0+aHJlZigpOwogICAgIHJldHVybiB2OFN0cmluZyhyZXN1bHQp
OwpAQCAtMzQ1LDE2ICszNDUsMTYgQEAKIHsKICAgICBBU1NFUlQoVjhDbGFzc0luZGV4OjpGcm9t
SW50KGRhdGEtPkludDMyVmFsdWUoKSkgPT0gVjhDbGFzc0luZGV4OjpMT0NBVElPTik7CiAgICAg
Ly8gT25seSBhbGxvdyBzYW1lIG9yaWdpbiBhY2Nlc3MKLSAgICBMb2NhdGlvbiogaW1wID0gIFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBo
b3N0KTsKLSAgICByZXR1cm4gVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCBm
YWxzZSk7CisgICAgTG9jYXRpb24qIGltcCA9ICBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmpl
Y3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvc3QpOworICAgIHJldHVybiBW
OFByb3h5OjpjYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIGZhbHNlKTsKIH0KIAogTkFNRURf
QUNDRVNTX0NIRUNLKExvY2F0aW9uKQogewogICAgIEFTU0VSVChWOENsYXNzSW5kZXg6OkZyb21J
bnQoZGF0YS0+SW50MzJWYWx1ZSgpKSA9PSBWOENsYXNzSW5kZXg6OkxPQ0FUSU9OKTsKICAgICAv
LyBPbmx5IGFsbG93IHNhbWUgb3JpZ2luIGFjY2VzcwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFBy
b3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9z
dCk7Ci0gICAgcmV0dXJuIFY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgZmFs
c2UpOworICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8
TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvc3QpOworICAgIHJldHVybiBWOFBy
b3h5OjpjYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIGZhbHNlKTsKIH0KIAogfSAgLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9t
QmluZGluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhD
dXN0b21CaW5kaW5nLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOEN1c3RvbUJpbmRpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MSw3ICs1MSw3
IEBACiB7CiAgICAgaWYgKHByb3RvY29sSXMocGFyc2VVUkwodmFsdWUpLCAiamF2YXNjcmlwdCIp
KSB7CiAgICAgICAgIE5vZGUqIGNvbnRlbnREb2MgPSBmcmFtZS0+Y29udGVudERvY3VtZW50KCk7
Ci0gICAgICAgIGlmIChjb250ZW50RG9jICYmICFWOFByb3h5OjpDaGVja05vZGVTZWN1cml0eShj
b250ZW50RG9jKSkKKyAgICAgICAgaWYgKGNvbnRlbnREb2MgJiYgIVY4UHJveHk6OmNoZWNrTm9k
ZVNlY3VyaXR5KGNvbnRlbnREb2MpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0K
ICAgICByZXR1cm4gdHJ1ZTsKQEAgLTgyLDggKzgyLDggQEAKICAgICAgICAgcmV0dXJuIGltcGxl
bWVudGF0aW9uOwogCiAgICAgLy8gR2VuZXJhdGUgYSB3cmFwcGVyLgotICAgIERvY3VtZW50KiBk
b2N1bWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05hdGl2ZTxEb2N1bWVudD4oaW5mby5Ib2xk
ZXIoKSk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdyYXBwZXIgPSBWOFByb3h5OjpET01J
bXBsZW1lbnRhdGlvblRvVjhPYmplY3QoZG9jdW1lbnQtPmltcGxlbWVudGF0aW9uKCkpOworICAg
IERvY3VtZW50KiBkb2N1bWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8
RG9jdW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3cmFw
cGVyID0gVjhQcm94eTo6Y29udmVydERPTUltcGxlbWVudGF0aW9uVG9WOE9iamVjdChkb2N1bWVu
dC0+aW1wbGVtZW50YXRpb24oKSk7CiAKICAgICAvLyBTdG9yZSB0aGUgd3JhcHBlciBpbiB0aGUg
aW50ZXJuYWwgZmllbGQuCiAgICAgaW5mby5Ib2xkZXIoKS0+U2V0SW50ZXJuYWxGaWVsZChrRG9j
dW1lbnRJbXBsZW1lbnRhdGlvbkluZGV4LCB3cmFwcGVyKTsKQEAgLTk2LDE2ICs5NiwxNiBAQAog
ewogICAgIEFTU0VSVChWOENsYXNzSW5kZXg6OkZyb21JbnQoZGF0YS0+SW50MzJWYWx1ZSgpKSA9
PSBWOENsYXNzSW5kZXg6OkhJU1RPUlkpOwogICAgIC8vIE9ubHkgYWxsb3cgc2FtZSBvcmlnaW4g
YWNjZXNzLgotICAgIEhpc3RvcnkqIGhpc3RvcnkgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxI
aXN0b3J5PihWOENsYXNzSW5kZXg6OkhJU1RPUlksIGhvc3QpOwotICAgIHJldHVybiBWOFByb3h5
OjpDYW5BY2Nlc3NGcmFtZShoaXN0b3J5LT5mcmFtZSgpLCBmYWxzZSk7CisgICAgSGlzdG9yeSog
aGlzdG9yeSA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIaXN0b3J5PihWOENsYXNz
SW5kZXg6OkhJU1RPUlksIGhvc3QpOworICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nlc3NGcmFt
ZShoaXN0b3J5LT5mcmFtZSgpLCBmYWxzZSk7CiB9CiAKIE5BTUVEX0FDQ0VTU19DSEVDSyhIaXN0
b3J5KQogewogICAgIEFTU0VSVChWOENsYXNzSW5kZXg6OkZyb21JbnQoZGF0YS0+SW50MzJWYWx1
ZSgpKSA9PSBWOENsYXNzSW5kZXg6OkhJU1RPUlkpOwogICAgIC8vIE9ubHkgYWxsb3cgc2FtZSBv
cmlnaW4gYWNjZXNzLgotICAgIEhpc3RvcnkqIGhpc3RvcnkgPSBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxIaXN0b3J5PihWOENsYXNzSW5kZXg6OkhJU1RPUlksIGhvc3QpOwotICAgIHJldHVybiBW
OFByb3h5OjpDYW5BY2Nlc3NGcmFtZShoaXN0b3J5LT5mcmFtZSgpLCBmYWxzZSk7CisgICAgSGlz
dG9yeSogaGlzdG9yeSA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIaXN0b3J5PihW
OENsYXNzSW5kZXg6OkhJU1RPUlksIGhvc3QpOworICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nl
c3NGcmFtZShoaXN0b3J5LT5mcmFtZSgpLCBmYWxzZSk7CiB9CiAKICN1bmRlZiBJTkRFWEVEX0FD
Q0VTU19DSEVDSwpAQCAtMTE4LDIxICsxMTgsMjEgQEAKICAgICBGcmFtZSogdGFyZ2V0ID0gMDsK
ICAgICBzd2l0Y2ggKFY4Q2xhc3NJbmRleDo6RnJvbUludChkYXRhLT5JbnQzMlZhbHVlKCkpKSB7
CiAgICAgY2FzZSBWOENsYXNzSW5kZXg6OkRPTVdJTkRPVzogewotICAgICAgICB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gd2luZG93ID0gVjhQcm94eTo6TG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5k
ZXg6OkRPTVdJTkRPVywgaG9zdCk7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3aW5k
b3cgPSBWOFByb3h5Ojpsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBo
b3N0KTsKICAgICAgICAgaWYgKHdpbmRvdy5Jc0VtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4g
dGFyZ2V0OwogCi0gICAgICAgIERPTVdpbmRvdyogdGFyZ2V0V2luZG93ID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgd2luZG93KTsK
KyAgICAgICAgRE9NV2luZG93KiB0YXJnZXRXaW5kb3cgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRp
dmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgd2luZG93KTsKICAg
ICAgICAgdGFyZ2V0ID0gdGFyZ2V0V2luZG93LT5mcmFtZSgpOwogICAgICAgICBicmVhazsKICAg
ICB9CiAgICAgY2FzZSBWOENsYXNzSW5kZXg6OkxPQ0FUSU9OOiB7Ci0gICAgICAgIEhpc3Rvcnkq
IGhpc3RvcnkgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIaXN0b3J5PihWOENsYXNzSW5kZXg6
OkhJU1RPUlksIGhvc3QpOworICAgICAgICBIaXN0b3J5KiBoaXN0b3J5ID0gVjhQcm94eTo6Y29u
dmVydFRvTmF0aXZlT2JqZWN0PEhpc3Rvcnk+KFY4Q2xhc3NJbmRleDo6SElTVE9SWSwgaG9zdCk7
CiAgICAgICAgIHRhcmdldCA9IGhpc3RvcnktPmZyYW1lKCk7CiAgICAgICAgIGJyZWFrOwogICAg
IH0KICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SElTVE9SWTogewotICAgICAgICBMb2NhdGlvbiog
bG9jYXRpb24gPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4
OjpMT0NBVElPTiwgaG9zdCk7CisgICAgICAgIExvY2F0aW9uKiBsb2NhdGlvbiA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwg
aG9zdCk7CiAgICAgICAgIHRhcmdldCA9IGxvY2F0aW9uLT5mcmFtZSgpOwogICAgICAgICBicmVh
azsKICAgICB9CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEF0dHJDdXN0b20u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4QXR0ckN1c3Rv
bS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhB
dHRyQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDIsNyArNDIsNyBAQAogCiBBQ0NFU1NP
Ul9TRVRURVIoQXR0clZhbHVlKQogewotICAgIEF0dHIqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBw
ZXJUb05vZGU8QXR0cj4oaW5mby5Ib2xkZXIoKSk7CisgICAgQXR0ciogaW1wID0gVjhQcm94eTo6
Y29udmVydERPTVdyYXBwZXJUb05vZGU8QXR0cj4oaW5mby5Ib2xkZXIoKSk7CiAgICAgU3RyaW5n
IGF0dHJWYWx1ZSA9IHRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsQ2hlY2sodmFsdWUpOwogICAgIEVs
ZW1lbnQqIG93bmVyRWxlbWVudCA9IGltcC0+b3duZXJFbGVtZW50KCk7CiAKSW5kZXg6IFdlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTFNlbGVjdEVsZW1lbnRDdXN0b20uY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTFNlbGVjdEVsZW1lbnRD
dXN0b20uY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4SFRNTFNlbGVjdEVsZW1lbnRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NCwxNCAr
NDQsMTQgQEAKIENBTExCQUNLX0ZVTkNfREVDTChIVE1MU2VsZWN0RWxlbWVudFJlbW92ZSkKIHsK
ICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MU2VsZWN0RWxlbWVudC5yZW1vdmUiKTsKLSAgICBIVE1M
U2VsZWN0RWxlbWVudCogaW1wID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MU2VsZWN0
RWxlbWVudD4oYXJncy5Ib2xkZXIoKSk7CisgICAgSFRNTFNlbGVjdEVsZW1lbnQqIGltcCA9IFY4
UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxTZWxlY3RFbGVtZW50PihhcmdzLkhv
bGRlcigpKTsKICAgICByZXR1cm4gcmVtb3ZlRWxlbWVudChpbXAsIGFyZ3MpOwogfQogCiB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gcmVtb3ZlRWxlbWVudChIVE1MU2VsZWN0RWxlbWVudCogaW1wLCBj
b25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKSAKIHsKICAgICBpZiAoVjhIVE1MT3B0aW9uRWxlbWVu
dDo6SGFzSW5zdGFuY2UoYXJnc1swXSkpIHsKLSAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnQqIGVs
ZW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxPcHRpb25FbGVtZW50Pihhcmdz
WzBdKTsKKyAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnQqIGVsZW1lbnQgPSBWOFByb3h5Ojpjb252
ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MT3B0aW9uRWxlbWVudD4oYXJnc1swXSk7CiAgICAgICAg
IGltcC0+cmVtb3ZlKGVsZW1lbnQtPmluZGV4KCkpOwogICAgICAgICByZXR1cm4gdjg6OlVuZGVm
aW5lZCgpOwogICAgIH0KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MSHR0
cFJlcXVlc3RVcGxvYWRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4WE1MSHR0cFJlcXVlc3RVcGxvYWRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTA5
NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MSHR0cFJlcXVlc3RVcGxvYWRD
dXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Niw3ICs0Niw3IEBACiBBQ0NFU1NPUl9HRVRU
RVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmFib3J0KQogewogICAgIElOQ19TVEFUUygiRE9NLlhN
TEh0dHBSZXF1ZXN0VXBsb2FkLm9uYWJvcnQuX2dldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0VXBs
b2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0
dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBpbmZv
LkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxv
YWQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+
KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9sZGVyKCkpOwogICAg
IGlmICh4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25hYm9ydCgpKSB7CiAgICAgICAgIFY4T2JqZWN0
RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVu
ZXIqPih4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25hYm9ydCgpKTsKICAgICAgICAgdjg6OkxvY2Fs
PHY4OjpPYmplY3Q+IHY4TGlzdGVuZXIgPSBsaXN0ZW5lci0+Z2V0TGlzdGVuZXJPYmplY3QoKTsK
QEAgLTU4LDcgKzU4LDcgQEAKIEFDQ0VTU09SX1NFVFRFUihYTUxIdHRwUmVxdWVzdFVwbG9hZE9u
YWJvcnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25hYm9y
dC5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2Fk
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJ
bmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBS
ZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVR
VUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewog
ICAgICAgICBpZiAoeG1sSHR0cFJlcXVlc3RVcGxvYWQtPm9uYWJvcnQoKSkgewogICAgICAgICAg
ICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0
RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5vbmFib3J0KCkpOwpAQCAtNzQs
NyArNzQsNyBAQAogICAgICAgICBpZiAoIXByb3h5KQogICAgICAgICAgICAgcmV0dXJuOwogCi0g
ICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVh
dGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBmYWxzZSk7CisgICAgICAgIFJlZlB0cjxFdmVu
dExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3Rl
bmVyKHZhbHVlLCBmYWxzZSk7CiAgICAgICAgIGlmIChsaXN0ZW5lcikgewogICAgICAgICAgICAg
eG1sSHR0cFJlcXVlc3RVcGxvYWQtPnNldE9uYWJvcnQobGlzdGVuZXIpOwogICAgICAgICAgICAg
Y3JlYXRlSGlkZGVuRGVwZW5kZW5jeShpbmZvLkhvbGRlcigpLCB2YWx1ZSwgVjhDdXN0b206OmtY
TUxIdHRwUmVxdWVzdENhY2hlSW5kZXgpOwpAQCAtODUsNyArODUsNyBAQAogQUNDRVNTT1JfR0VU
VEVSKFhNTEh0dHBSZXF1ZXN0VXBsb2FkT25lcnJvcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Y
TUxIdHRwUmVxdWVzdFVwbG9hZC5vbmVycm9yLl9nZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVzdFVw
bG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxI
dHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5m
by5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBs
b2FkID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2Fk
PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKICAg
ICBpZiAoeG1sSHR0cFJlcXVlc3RVcGxvYWQtPm9uZXJyb3IoKSkgewogICAgICAgICBWOE9iamVj
dEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3Rl
bmVyKj4oeG1sSHR0cFJlcXVlc3RVcGxvYWQtPm9uZXJyb3IoKSk7CiAgICAgICAgIHY4OjpMb2Nh
bDx2ODo6T2JqZWN0PiB2OExpc3RlbmVyID0gbGlzdGVuZXItPmdldExpc3RlbmVyT2JqZWN0KCk7
CkBAIC05Nyw3ICs5Nyw3IEBACiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRP
bmVycm9yKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0VXBsb2FkLm9uZXJy
b3IuX3NldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9h
ZCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNz
SW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRw
UmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJF
UVVFU1RVUExPQUQsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsK
ICAgICAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5vbmVycm9yKCkpIHsKICAgICAgICAg
ICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVj
dEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25lcnJvcigpKTsKQEAgLTEx
Myw3ICsxMTMsNyBAQAogICAgICAgICBpZiAoIXByb3h5KQogICAgICAgICAgICAgcmV0dXJuOwog
Ci0gICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JD
cmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBmYWxzZSk7CisgICAgICAgIFJlZlB0cjxF
dmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5kT3JDcmVhdGVPYmplY3RFdmVudExp
c3RlbmVyKHZhbHVlLCBmYWxzZSk7CiAgICAgICAgIGlmIChsaXN0ZW5lcikgewogICAgICAgICAg
ICAgeG1sSHR0cFJlcXVlc3RVcGxvYWQtPnNldE9uZXJyb3IobGlzdGVuZXIpOwogICAgICAgICAg
ICAgY3JlYXRlSGlkZGVuRGVwZW5kZW5jeShpbmZvLkhvbGRlcigpLCB2YWx1ZSwgVjhDdXN0b206
OmtYTUxIdHRwUmVxdWVzdENhY2hlSW5kZXgpOwpAQCAtMTI0LDcgKzEyNCw3IEBACiBBQ0NFU1NP
Ul9HRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmxvYWQpCiB7CiAgICAgSU5DX1NUQVRTKCJE
T00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25sb2FkLl9nZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVz
dFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxY
TUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwg
aW5mby5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0
VXBsb2FkID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBs
b2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsK
ICAgICBpZiAoeG1sSHR0cFJlcXVlc3RVcGxvYWQtPm9ubG9hZCgpKSB7CiAgICAgICAgIFY4T2Jq
ZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlz
dGVuZXIqPih4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25sb2FkKCkpOwogICAgICAgICB2ODo6TG9j
YWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgp
OwpAQCAtMTM2LDcgKzEzNiw3IEBACiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxv
YWRPbmxvYWQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25s
b2FkLl9zZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxv
YWQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFz
c0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7CisgICAgWE1MSHR0
cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6Y29udmVydFRv
TmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBS
RVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKICAgICBpZiAodmFsdWUtPklzTnVsbCgpKSB7
CiAgICAgICAgIGlmICh4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25sb2FkKCkpIHsKICAgICAgICAg
ICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVj
dEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25sb2FkKCkpOwpAQCAtMTUy
LDcgKzE1Miw3IEBACiAgICAgICAgIGlmICghcHJveHkpCiAgICAgICAgICAgICByZXR1cm47CiAK
LSAgICAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPkZpbmRPckNy
ZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKTsKKyAgICAgICAgUmVmUHRyPEV2
ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPmZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlz
dGVuZXIodmFsdWUsIGZhbHNlKTsKICAgICAgICAgaWYgKGxpc3RlbmVyKSB7CiAgICAgICAgICAg
ICB4bWxIdHRwUmVxdWVzdFVwbG9hZC0+c2V0T25sb2FkKGxpc3RlbmVyKTsKICAgICAgICAgICAg
IGNyZWF0ZUhpZGRlbkRlcGVuZGVuY3koaW5mby5Ib2xkZXIoKSwgdmFsdWUsIFY4Q3VzdG9tOjpr
WE1MSHR0cFJlcXVlc3RDYWNoZUluZGV4KTsKQEAgLTE2Myw3ICsxNjMsNyBAQAogQUNDRVNTT1Jf
R0VUVEVSKFhNTEh0dHBSZXF1ZXN0VXBsb2FkT25sb2Fkc3RhcnQpCiB7CiAgICAgSU5DX1NUQVRT
KCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25sb2Fkc3RhcnQuX2dldCIpOwotICAgIFhNTEh0
dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OlRvTmF0aXZl
T2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNU
VVBMT0FELCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0
cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJl
cXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9s
ZGVyKCkpOwogICAgIGlmICh4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25sb2Fkc3RhcnQoKSkgewog
ICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhP
YmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3RVcGxvYWQtPm9ubG9hZHN0YXJ0KCkp
OwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxpc3RlbmVyLT5n
ZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMTc1LDcgKzE3NSw3IEBACiBBQ0NFU1NPUl9TRVRURVIo
WE1MSHR0cFJlcXVlc3RVcGxvYWRPbmxvYWRzdGFydCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Y
TUxIdHRwUmVxdWVzdFVwbG9hZC5vbmxvYWRzdGFydC5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVl
c3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8
WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQs
IGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVz
dFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVw
bG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7
CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAoeG1sSHR0cFJlcXVlc3RV
cGxvYWQtPm9ubG9hZHN0YXJ0KCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5l
ciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRw
UmVxdWVzdFVwbG9hZC0+b25sb2Fkc3RhcnQoKSk7CkBAIC0xOTEsNyArMTkxLDcgQEAKICAgICAg
ICAgaWYgKCFwcm94eSkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBSZWZQdHI8RXZl
bnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+RmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0
ZW5lcih2YWx1ZSwgZmFsc2UpOworICAgICAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVu
ZXIgPSBwcm94eS0+ZmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2Up
OwogICAgICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgICAgIHhtbEh0dHBSZXF1ZXN0VXBs
b2FkLT5zZXRPbmxvYWRzdGFydChsaXN0ZW5lcik7CiAgICAgICAgICAgICBjcmVhdGVIaWRkZW5E
ZXBlbmRlbmN5KGluZm8uSG9sZGVyKCksIHZhbHVlLCBWOEN1c3RvbTo6a1hNTEh0dHBSZXF1ZXN0
Q2FjaGVJbmRleCk7CkBAIC0yMDIsNyArMjAyLDcgQEAKIEFDQ0VTU09SX0dFVFRFUihYTUxIdHRw
UmVxdWVzdFVwbG9hZE9ucHJvZ3Jlc3MpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJl
cXVlc3RVcGxvYWQub25wcm9ncmVzcy5fZ2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQq
IHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJl
cXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9s
ZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9
IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhD
bGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYg
KHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5vbnByb2dyZXNzKCkpIHsKICAgICAgICAgVjhPYmplY3RF
dmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5l
cio+KHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5vbnByb2dyZXNzKCkpOwogICAgICAgICB2ODo6TG9j
YWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgp
OwpAQCAtMjE0LDcgKzIxNCw3IEBACiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxv
YWRPbnByb2dyZXNzKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0VXBsb2Fk
Lm9ucHJvZ3Jlc3MuX3NldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVx
dWVzdFVwbG9hZCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2Fk
PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKKyAg
ICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5Ojpj
b252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6
WE1MSFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh2YWx1ZS0+SXNO
dWxsKCkpIHsKICAgICAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5vbnByb2dyZXNzKCkp
IHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNf
Y2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25wcm9n
cmVzcygpKTsKQEAgLTIzMCw3ICsyMzAsNyBAQAogICAgICAgICBpZiAoIXByb3h5KQogICAgICAg
ICAgICAgcmV0dXJuOwogCi0gICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9
IHByb3h5LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBmYWxzZSk7Cisg
ICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5kT3JDcmVh
dGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBmYWxzZSk7CiAgICAgICAgIGlmIChsaXN0ZW5l
cikgewogICAgICAgICAgICAgeG1sSHR0cFJlcXVlc3RVcGxvYWQtPnNldE9ucHJvZ3Jlc3MobGlz
dGVuZXIpOwogICAgICAgICAgICAgY3JlYXRlSGlkZGVuRGVwZW5kZW5jeShpbmZvLkhvbGRlcigp
LCB2YWx1ZSwgVjhDdXN0b206OmtYTUxIdHRwUmVxdWVzdENhY2hlSW5kZXgpOwpAQCAtMjQxLDE0
ICsyNDEsMTQgQEAKIENBTExCQUNLX0ZVTkNfREVDTChYTUxIdHRwUmVxdWVzdFVwbG9hZEFkZEV2
ZW50TGlzdGVuZXIpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQu
YWRkRXZlbnRMaXN0ZW5lcigpIik7Ci0gICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBS
ZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxv
YWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGFyZ3MuSG9sZGVyKCkpOwor
ICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4
OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBYTUxIdHRwUmVx
dWVzdCogeG1sSHR0cFJlcXVlc3QgPSB4bWxIdHRwUmVxdWVzdFVwbG9hZC0+YXNzb2NpYXRlZFhN
TEh0dHBSZXF1ZXN0KCk7CiAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZSh4
bWxIdHRwUmVxdWVzdC0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpKTsKICAgICBpZiAoIXByb3h5
KQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgUmVmUHRyPEV2ZW50TGlz
dGVuZXI+IGxpc3RlbmVyID0gcHJveHktPkZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIo
YXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHBy
b3h5LT5maW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsKICAg
ICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgU3RyaW5nIHR5cGUgPSB0b1dlYkNvcmVTdHJpbmco
YXJnc1swXSk7CiAgICAgICAgIGJvb2wgdXNlQ2FwdHVyZSA9IGFyZ3NbMl0tPkJvb2xlYW5WYWx1
ZSgpOwpAQCAtMjYyLDE0ICsyNjIsMTQgQEAKIENBTExCQUNLX0ZVTkNfREVDTChYTUxIdHRwUmVx
dWVzdFVwbG9hZFJlbW92ZUV2ZW50TGlzdGVuZXIpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1M
SHR0cFJlcXVlc3RVcGxvYWQucmVtb3ZlRXZlbnRMaXN0ZW5lcigpIik7Ci0gICAgWE1MSHR0cFJl
cXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6VG9OYXRpdmVPYmpl
Y3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExP
QUQsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVx
dWVzdFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVz
dFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgYXJncy5Ib2xkZXIo
KSk7CiAKICAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSB4bWxIdHRwUmVxdWVz
dFVwbG9hZC0+YXNzb2NpYXRlZFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgVjhQcm94eSogcHJveHkg
PSBWOFByb3h5OjpyZXRyaWV2ZSh4bWxIdHRwUmVxdWVzdC0+c2NyaXB0RXhlY3V0aW9uQ29udGV4
dCgpKTsKICAgICBpZiAoIXByb3h5KQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOyAv
LyBQcm9iYWJseSBsZWFrZWQuCiAKLSAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIg
PSBwcm94eS0+RmluZE9iamVjdEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOworICAgIFJl
ZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5kT2JqZWN0RXZlbnRMaXN0
ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAKICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgU3Ry
aW5nIHR5cGUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CkluZGV4OiBXZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOE5vZGVMaXN0Q3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE5vZGVMaXN0Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUp
CisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE5vZGVMaXN0Q3VzdG9tLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNDIsNyArNDIsNyBAQAogTkFNRURfUFJPUEVSVFlfR0VUVEVSKE5vZGVM
aXN0KQogewogICAgIElOQ19TVEFUUygiRE9NLk5vZGVMaXN0Lk5hbWVkUHJvcGVydHlHZXR0ZXIi
KTsKLSAgICBOb2RlTGlzdCogbGlzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PE5vZGVMaXN0
PihWOENsYXNzSW5kZXg6Ok5PREVMSVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBOb2RlTGlzdCog
bGlzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxOb2RlTGlzdD4oVjhDbGFzc0lu
ZGV4OjpOT0RFTElTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgU3RyaW5nIGtleSA9IHRvV2ViQ29y
ZVN0cmluZyhuYW1lKTsKIAogICAgIC8vIExlbmd0aCBwcm9wZXJ0eSBjYW5ub3QgYmUgb3ZlcnJp
ZGRlbi4KQEAgLTUzLDcgKzUzLDcgQEAKICAgICBpZiAoIXJlc3VsdCkKICAgICAgICAgcmV0dXJu
IG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRv
VjhPYmplY3QocmVzdWx0LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVU
b1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5k
ZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4WFBhdGhFdmFsdWF0b3JDb25zdHJ1Y3Rv
ci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYUGF0aEV2
YWx1YXRvckNvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOFhQYXRoRXZhbHVhdG9yQ29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0zOSw3ICszOSw3IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woWFBhdGhFdmFsdWF0b3JD
b25zdHJ1Y3RvcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YUGF0aEV2YWx1YXRvci5Db25zdHJ1
Y3RvciIpOwotICAgIHJldHVybiBWOFByb3h5OjpDb25zdHJ1Y3RET01PYmplY3Q8VjhDbGFzc0lu
ZGV4OjpYUEFUSEVWQUxVQVRPUiwgWFBhdGhFdmFsdWF0b3I+KGFyZ3MpOworICAgIHJldHVybiBW
OFByb3h5Ojpjb25zdHJ1Y3RET01PYmplY3Q8VjhDbGFzc0luZGV4OjpYUEFUSEVWQUxVQVRPUiwg
WFBhdGhFdmFsdWF0b3I+KGFyZ3MpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbUV2ZW50TGlzdGVuZXIuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tRXZlbnRMaXN0
ZW5lci5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhDdXN0b21FdmVudExpc3RlbmVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDAsNyArNDAsNyBA
QAogewogICAgIG1fbGlzdGVuZXIgPSB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGxp
c3RlbmVyKTsKICNpZm5kZWYgTkRFQlVHCi0gICAgVjhQcm94eTo6UmVnaXN0ZXJHbG9iYWxIYW5k
bGUoRVZFTlRfTElTVEVORVIsIHRoaXMsIG1fbGlzdGVuZXIpOworICAgIFY4UHJveHk6OnJlZ2lz
dGVyR2xvYmFsSGFuZGxlKEVWRU5UX0xJU1RFTkVSLCB0aGlzLCBtX2xpc3RlbmVyKTsKICNlbmRp
ZgogfQogCkBAIC00OSw3ICs0OSw3IEBACiAgICAgaWYgKG1fZnJhbWUpIHsKICAgICAgICAgVjhQ
cm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShtX2ZyYW1lKTsKICAgICAgICAgaWYgKHBy
b3h5KQotICAgICAgICAgICAgcHJveHktPlJlbW92ZVY4RXZlbnRMaXN0ZW5lcih0aGlzKTsKKyAg
ICAgICAgICAgIHByb3h5LT5yZW1vdmVWOEV2ZW50TGlzdGVuZXIodGhpcyk7CiAgICAgfQogCiAg
ICAgZGlzcG9zZUxpc3RlbmVyT2JqZWN0KCk7CkBAIC04Myw3ICs4Myw3IEBACiAgICAgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IHBhcmFtZXRlcnNbMV0gPSB7IGpzRXZlbnQgfTsKIAogICAgIFY4UHJv
eHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUobV9mcmFtZSk7Ci0gICAgcmV0dXJuIHByb3h5
LT5DYWxsRnVuY3Rpb24oaGFuZGxlckZ1bmN0aW9uLCByZWNlaXZlciwgMSwgcGFyYW1ldGVycyk7
CisgICAgcmV0dXJuIHByb3h5LT5jYWxsRnVuY3Rpb24oaGFuZGxlckZ1bmN0aW9uLCByZWNlaXZl
ciwgMSwgcGFyYW1ldGVycyk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZVBvcnRDdXN0b20uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZVBvcnRDdXN0b20uY3Bw
CShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2Fn
ZVBvcnRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MywxNCArNDMsMTQgQEAKIEFDQ0VT
U09SX0dFVFRFUihNZXNzYWdlUG9ydE9ubWVzc2FnZSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5N
ZXNzYWdlUG9ydC5vbm1lc3NhZ2UuX2dldCIpOwotICAgIE1lc3NhZ2VQb3J0KiBtZXNzYWdlUG9y
dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PE1lc3NhZ2VQb3J0PihWOENsYXNzSW5kZXg6Ok1F
U1NBR0VQT1JULCBpbmZvLkhvbGRlcigpKTsKLSAgICByZXR1cm4gVjhQcm94eTo6RXZlbnRMaXN0
ZW5lclRvVjhPYmplY3QobWVzc2FnZVBvcnQtPm9ubWVzc2FnZSgpKTsKKyAgICBNZXNzYWdlUG9y
dCogbWVzc2FnZVBvcnQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TWVzc2FnZVBv
cnQ+KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIGluZm8uSG9sZGVyKCkpOworICAgIHJldHVy
biBWOFByb3h5Ojpjb252ZXJ0RXZlbnRMaXN0ZW5lclRvVjhPYmplY3QobWVzc2FnZVBvcnQtPm9u
bWVzc2FnZSgpKTsKIH0KIAogQUNDRVNTT1JfU0VUVEVSKE1lc3NhZ2VQb3J0T25tZXNzYWdlKQog
ewogICAgIElOQ19TVEFUUygiRE9NLk1lc3NhZ2VQb3J0Lm9ubWVzc2FnZS5fc2V0Iik7Ci0gICAg
TWVzc2FnZVBvcnQqIG1lc3NhZ2VQb3J0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TWVzc2Fn
ZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIGluZm8uSG9sZGVyKCkpOworICAgIE1l
c3NhZ2VQb3J0KiBtZXNzYWdlUG9ydCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxN
ZXNzYWdlUG9ydD4oVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgaW5mby5Ib2xkZXIoKSk7CiAg
ICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAobWVzc2FnZVBvcnQtPm9ubWVz
c2FnZSgpKSB7CiAgICAgICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0g
c3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4obWVzc2FnZVBvcnQtPm9ubWVzc2Fn
ZSgpKTsKQEAgLTY1LDcgKzY1LDcgQEAKICAgICAgICAgaWYgKCFwcm94eSkKICAgICAgICAgICAg
IHJldHVybjsKIAotICAgICAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94
eS0+RmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2UpOworICAgICAg
ICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+ZmluZE9yQ3JlYXRlT2Jq
ZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2UpOwogICAgICAgICBpZiAobGlzdGVuZXIpIHsK
ICAgICAgICAgICAgIG1lc3NhZ2VQb3J0LT5zZXRPbm1lc3NhZ2UobGlzdGVuZXIpOwogICAgICAg
ICAgICAgY3JlYXRlSGlkZGVuRGVwZW5kZW5jeShpbmZvLkhvbGRlcigpLCB2YWx1ZSwgVjhDdXN0
b206OmtNZXNzYWdlUG9ydFJlcXVlc3RDYWNoZUluZGV4KTsKQEAgLTc2LDEzICs3NiwxMyBAQAog
Q0FMTEJBQ0tfRlVOQ19ERUNMKE1lc3NhZ2VQb3J0QWRkRXZlbnRMaXN0ZW5lcikKIHsKICAgICBJ
TkNfU1RBVFMoIkRPTS5NZXNzYWdlUG9ydC5BZGRFdmVudExpc3RlbmVyKCkiKTsKLSAgICBNZXNz
YWdlUG9ydCogbWVzc2FnZVBvcnQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxNZXNzYWdlUG9y
dD4oVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgYXJncy5Ib2xkZXIoKSk7CisgICAgTWVzc2Fn
ZVBvcnQqIG1lc3NhZ2VQb3J0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PE1lc3Nh
Z2VQb3J0PihWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JULCBhcmdzLkhvbGRlcigpKTsKIAogICAg
IFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUobWVzc2FnZVBvcnQtPnNjcmlwdEV4
ZWN1dGlvbkNvbnRleHQoKSk7CiAgICAgaWYgKCFwcm94eSkKICAgICAgICAgcmV0dXJuIHY4OjpV
bmRlZmluZWQoKTsKIAotICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5
LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsKKyAgICBS
ZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+ZmluZE9yQ3JlYXRlT2JqZWN0
RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAgICAgaWYgKGxpc3RlbmVyKSB7CiAgICAg
ICAgIFN0cmluZyB0eXBlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgICAgICBib29s
IHVzZUNhcHR1cmUgPSBhcmdzWzJdLT5Cb29sZWFuVmFsdWUoKTsKQEAgLTk2LDEzICs5NiwxMyBA
QAogQ0FMTEJBQ0tfRlVOQ19ERUNMKE1lc3NhZ2VQb3J0UmVtb3ZlRXZlbnRMaXN0ZW5lcikKIHsK
ICAgICBJTkNfU1RBVFMoIkRPTS5NZXNzYWdlUG9ydC5SZW1vdmVFdmVudExpc3RlbmVyKCkiKTsK
LSAgICBNZXNzYWdlUG9ydCogbWVzc2FnZVBvcnQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxN
ZXNzYWdlUG9ydD4oVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgYXJncy5Ib2xkZXIoKSk7Cisg
ICAgTWVzc2FnZVBvcnQqIG1lc3NhZ2VQb3J0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2Jq
ZWN0PE1lc3NhZ2VQb3J0PihWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JULCBhcmdzLkhvbGRlcigp
KTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUobWVzc2FnZVBvcnQt
PnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSk7CiAgICAgaWYgKCFwcm94eSkKICAgICAgICAgcmV0
dXJuIHY4OjpVbmRlZmluZWQoKTsgLy8gcHJvYmFibHkgbGVha2VkCiAKLSAgICBSZWZQdHI8RXZl
bnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+RmluZE9iamVjdEV2ZW50TGlzdGVuZXIoYXJn
c1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5
LT5maW5kT2JqZWN0RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAKICAgICBpZiAobGlz
dGVuZXIpIHsKICAgICAgICAgU3RyaW5nIHR5cGUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7
CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFhTTFRQcm9jZXNzb3JDdXN0b20u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4WFNMVFByb2Nl
c3NvckN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhYU0xUUHJvY2Vzc29yQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDgsNyAr
NDgsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFhTTFRQcm9jZXNzb3JDb25zdHJ1Y3RvcikKIHsK
ICAgICBJTkNfU1RBVFMoIkRPTS5YU0xUUHJvY2Vzc29yLkNvbnN0cnVjdG9yIik7Ci0gICAgcmV0
dXJuIFY4UHJveHk6OkNvbnN0cnVjdERPTU9iamVjdDxWOENsYXNzSW5kZXg6OlhTTFRQUk9DRVNT
T1IsIFhTTFRQcm9jZXNzb3I+KGFyZ3MpOworICAgIHJldHVybiBWOFByb3h5Ojpjb25zdHJ1Y3RE
T01PYmplY3Q8VjhDbGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SLCBYU0xUUHJvY2Vzc29yPihhcmdz
KTsKIH0KIAogCkBAIC01OCw5ICs1OCw5IEBACiAgICAgaWYgKCFWOE5vZGU6Okhhc0luc3RhbmNl
KGFyZ3NbMF0pKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgWFNMVFBy
b2Nlc3NvciogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhD
bGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SLCBhcmdzLkhvbGRlcigpKTsKKyAgICBYU0xUUHJvY2Vz
c29yKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4o
VjhDbGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SLCBhcmdzLkhvbGRlcigpKTsKIAotICAgIE5vZGUq
IG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0pOworICAgIE5v
ZGUqIG5vZGUgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBd
KTsKICAgICBpbXAtPmltcG9ydFN0eWxlc2hlZXQobm9kZSk7CiAgICAgcmV0dXJuIHY4OjpVbmRl
ZmluZWQoKTsKIH0KQEAgLTcyLDEyICs3MiwxMiBAQAogICAgIGlmICghVjhOb2RlOjpIYXNJbnN0
YW5jZShhcmdzWzBdKSB8fCAhVjhEb2N1bWVudDo6SGFzSW5zdGFuY2UoYXJnc1sxXSkpCiAgICAg
ICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICBYU0xUUHJvY2Vzc29yKiBpbXAgPSBW
OFByb3h5OjpUb05hdGl2ZU9iamVjdDxYU0xUUHJvY2Vzc29yPihWOENsYXNzSW5kZXg6OlhTTFRQ
Uk9DRVNTT1IsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhTTFRQcm9jZXNzb3IqIGltcCA9IFY4UHJv
eHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYU0xUUHJvY2Vzc29yPihWOENsYXNzSW5kZXg6OlhT
TFRQUk9DRVNTT1IsIGFyZ3MuSG9sZGVyKCkpOwogCi0gICAgTm9kZSogc291cmNlID0gVjhQcm94
eTo6RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKTsKLSAgICBEb2N1bWVudCogb3duZXIg
PSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPERvY3VtZW50PihhcmdzWzFdKTsKKyAgICBOb2Rl
KiBzb3VyY2UgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBd
KTsKKyAgICBEb2N1bWVudCogb3duZXIgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9k
ZTxEb2N1bWVudD4oYXJnc1sxXSk7CiAgICAgUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IHJlc3Vs
dCA9IGltcC0+dHJhbnNmb3JtVG9GcmFnbWVudChzb3VyY2UsIG93bmVyKTsKLSAgICByZXR1cm4g
VjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsKKyAgICByZXR1cm4gVjhQcm94
eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAKIApAQCAtODgsOSAr
ODgsOSBAQAogICAgIGlmICghVjhOb2RlOjpIYXNJbnN0YW5jZShhcmdzWzBdKSkKICAgICAgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIFhTTFRQcm9jZXNzb3IqIGltcCA9IFY4UHJv
eHk6OlRvTmF0aXZlT2JqZWN0PFhTTFRQcm9jZXNzb3I+KFY4Q2xhc3NJbmRleDo6WFNMVFBST0NF
U1NPUiwgYXJncy5Ib2xkZXIoKSk7CisgICAgWFNMVFByb2Nlc3NvciogaW1wID0gVjhQcm94eTo6
Y29udmVydFRvTmF0aXZlT2JqZWN0PFhTTFRQcm9jZXNzb3I+KFY4Q2xhc3NJbmRleDo6WFNMVFBS
T0NFU1NPUiwgYXJncy5Ib2xkZXIoKSk7CiAKLSAgICBOb2RlKiBzb3VyY2UgPSBWOFByb3h5OjpE
T01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0pOworICAgIE5vZGUqIHNvdXJjZSA9IFY4UHJv
eHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0pOwogICAgIGlmICghc291
cmNlKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCkBAIC05OCw3ICs5OCw3IEBA
CiAgICAgaWYgKCFyZXN1bHQpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAg
ICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsKKyAgICByZXR1
cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAKIApA
QCAtMTA4LDcgKzEwOCw3IEBACiAgICAgaWYgKGlzVW5kZWZpbmVkT3JOdWxsKGFyZ3NbMV0pIHx8
IGlzVW5kZWZpbmVkT3JOdWxsKGFyZ3NbMl0pKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5l
ZCgpOwogCi0gICAgWFNMVFByb2Nlc3NvciogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8
WFNMVFByb2Nlc3Nvcj4oVjhDbGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SLCBhcmdzLkhvbGRlcigp
KTsKKyAgICBYU0xUUHJvY2Vzc29yKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmpl
Y3Q8WFNMVFByb2Nlc3Nvcj4oVjhDbGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SLCBhcmdzLkhvbGRl
cigpKTsKIAogICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1sw
XSk7CiAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzFdKTsKQEAg
LTEyNSw3ICsxMjUsNyBAQAogICAgIGlmIChpc1VuZGVmaW5lZE9yTnVsbChhcmdzWzFdKSkKICAg
ICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIFhTTFRQcm9jZXNzb3IqIGltcCA9
IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhTTFRQcm9jZXNzb3I+KFY4Q2xhc3NJbmRleDo6WFNM
VFBST0NFU1NPUiwgYXJncy5Ib2xkZXIoKSk7CisgICAgWFNMVFByb2Nlc3NvciogaW1wID0gVjhQ
cm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhTTFRQcm9jZXNzb3I+KFY4Q2xhc3NJbmRleDo6
WFNMVFBST0NFU1NPUiwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJ
ID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgIFN0cmluZyBsb2NhbE5hbWUgPSB0b1dl
YkNvcmVTdHJpbmcoYXJnc1sxXSk7CkBAIC0xNDIsNyArMTQyLDcgQEAKICAgICBpZiAoaXNVbmRl
ZmluZWRPck51bGwoYXJnc1sxXSkpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAK
LSAgICBYU0xUUHJvY2Vzc29yKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYU0xUUHJv
Y2Vzc29yPihWOENsYXNzSW5kZXg6OlhTTFRQUk9DRVNTT1IsIGFyZ3MuSG9sZGVyKCkpOworICAg
IFhTTFRQcm9jZXNzb3IqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYU0xU
UHJvY2Vzc29yPihWOENsYXNzSW5kZXg6OlhTTFRQUk9DRVNTT1IsIGFyZ3MuSG9sZGVyKCkpOwog
CiAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKICAg
ICBTdHJpbmcgbG9jYWxOYW1lID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMV0pOwpJbmRleDogV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MUGx1Z0luRWxlbWVudEN1c3RvbS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MUGx1Z0luRWxlbWVu
dEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhIVE1MUGx1Z0luRWxlbWVudEN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDcg
KzQ1LDcgQEAKIE5BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MUGx1Z0luRWxlbWVudCkKIHsKICAg
ICBJTkNfU1RBVFMoIkRPTS5IVE1MUGx1Z0luRWxlbWVudC5OYW1lZFByb3BlcnR5R2V0dGVyIik7
Ci0gICAgSFRNTFBsdWdJbkVsZW1lbnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8
SFRNTFBsdWdJbkVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxQbHVnSW5FbGVtZW50
KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MUGx1Z0luRWxlbWVu
dD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgU2NyaXB0SW5zdGFuY2Ugc2NyaXB0SW5zdGFuY2UgPSBp
bXAtPmdldEluc3RhbmNlKCk7CiAgICAgaWYgKCFzY3JpcHRJbnN0YW5jZSkKICAgICAgICAgcmV0
dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CkBAIC02MCw3ICs2MCw3IEBACiBOQU1FRF9Q
Uk9QRVJUWV9TRVRURVIoSFRNTFBsdWdJbkVsZW1lbnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00u
SFRNTFBsdWdJbkVsZW1lbnQuTmFtZWRQcm9wZXJ0eVNldHRlciIpOwotICAgIEhUTUxQbHVnSW5F
bGVtZW50KiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxQbHVnSW5FbGVtZW50
PihpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MUGx1Z0luRWxlbWVudCogaW1wID0gVjhQcm94eTo6
Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTFBsdWdJbkVsZW1lbnQ+KGluZm8uSG9sZGVyKCkp
OwogICAgIFNjcmlwdEluc3RhbmNlIHNjcmlwdEluc3RhbmNlID0gaW1wLT5nZXRJbnN0YW5jZSgp
OwogICAgIGlmICghc2NyaXB0SW5zdGFuY2UpCiAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJ
bnRlcmNlcHRvcigpOwpAQCAtODEsNyArODEsNyBAQAogSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIo
SFRNTFBsdWdJbkVsZW1lbnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTFBsdWdJbkVsZW1l
bnQuSW5kZXhlZFByb3BlcnR5R2V0dGVyIik7Ci0gICAgSFRNTFBsdWdJbkVsZW1lbnQqIGltcCA9
IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTFBsdWdJbkVsZW1lbnQ+KGluZm8uSG9sZGVy
KCkpOworICAgIEhUTUxQbHVnSW5FbGVtZW50KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3Jh
cHBlclRvTm9kZTxIVE1MUGx1Z0luRWxlbWVudD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgU2NyaXB0
SW5zdGFuY2Ugc2NyaXB0SW5zdGFuY2UgPSBpbXAtPmdldEluc3RhbmNlKCk7CiAgICAgaWYgKCFz
Y3JpcHRJbnN0YW5jZSkKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7
CkBAIC05Niw3ICs5Niw3IEBACiBJTkRFWEVEX1BST1BFUlRZX1NFVFRFUihIVE1MUGx1Z0luRWxl
bWVudCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MUGx1Z0luRWxlbWVudC5JbmRleGVkUHJv
cGVydHlTZXR0ZXIiKTsKLSAgICBIVE1MUGx1Z0luRWxlbWVudCogaW1wID0gVjhQcm94eTo6RE9N
V3JhcHBlclRvTm9kZTxIVE1MUGx1Z0luRWxlbWVudD4oaW5mby5Ib2xkZXIoKSk7CisgICAgSFRN
TFBsdWdJbkVsZW1lbnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhU
TUxQbHVnSW5FbGVtZW50PihpbmZvLkhvbGRlcigpKTsKICAgICBTY3JpcHRJbnN0YW5jZSBzY3Jp
cHRJbnN0YW5jZSA9IGltcC0+Z2V0SW5zdGFuY2UoKTsKICAgICBpZiAoIXNjcmlwdEluc3RhbmNl
KQogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKSW5kZXg6IFdlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1ZHRWxlbWVudEluc3RhbmNlQ3VzdG9tLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFNWR0VsZW1lbnRJbnN0YW5j
ZUN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhTVkdFbGVtZW50SW5zdGFuY2VDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Nywx
MyArNDcsMTMgQEAKIENBTExCQUNLX0ZVTkNfREVDTChTVkdFbGVtZW50SW5zdGFuY2VBZGRFdmVu
dExpc3RlbmVyKQogewogICAgIElOQ19TVEFUUygiRE9NLlNWR0VsZW1lbnRJbnN0YW5jZS5BZGRF
dmVudExpc3RlbmVyKCkiKTsKLSAgICBTVkdFbGVtZW50SW5zdGFuY2UqIGluc3RhbmNlID0gVjhQ
cm94eTo6RE9NV3JhcHBlclRvTmF0aXZlPFNWR0VsZW1lbnRJbnN0YW5jZT4oYXJncy5Ib2xkZXIo
KSk7CisgICAgU1ZHRWxlbWVudEluc3RhbmNlKiBpbnN0YW5jZSA9IFY4UHJveHk6OmNvbnZlcnRE
T01XcmFwcGVyVG9OYXRpdmU8U1ZHRWxlbWVudEluc3RhbmNlPihhcmdzLkhvbGRlcigpKTsKIAog
ICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUoaW5zdGFuY2UtPnNjcmlwdEV4
ZWN1dGlvbkNvbnRleHQoKSk7CiAgICAgaWYgKCFwcm94eSkKICAgICAgICAgcmV0dXJuIHY4OjpV
bmRlZmluZWQoKTsKIAotICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5
LT5GaW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0
cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5maW5kT3JDcmVhdGVWOEV2ZW50TGlz
dGVuZXIoYXJnc1sxXSwgZmFsc2UpOwogICAgIGlmIChsaXN0ZW5lcikgewogICAgICAgICBTdHJp
bmcgdHlwZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKICAgICAgICAgYm9vbCB1c2VDYXB0
dXJlID0gYXJnc1syXS0+Qm9vbGVhblZhbHVlKCk7CkBAIC02NiwxMyArNjYsMTMgQEAKIENBTExC
QUNLX0ZVTkNfREVDTChTVkdFbGVtZW50SW5zdGFuY2VSZW1vdmVFdmVudExpc3RlbmVyKQogewog
ICAgIElOQ19TVEFUUygiRE9NLlNWR0VsZW1lbnRJbnN0YW5jZS5SZW1vdmVFdmVudExpc3RlbmVy
KCkiKTsKLSAgICBTVkdFbGVtZW50SW5zdGFuY2UqIGluc3RhbmNlID0gVjhQcm94eTo6RE9NV3Jh
cHBlclRvTmF0aXZlPFNWR0VsZW1lbnRJbnN0YW5jZT4oYXJncy5Ib2xkZXIoKSk7CisgICAgU1ZH
RWxlbWVudEluc3RhbmNlKiBpbnN0YW5jZSA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9O
YXRpdmU8U1ZHRWxlbWVudEluc3RhbmNlPihhcmdzLkhvbGRlcigpKTsKIAogICAgIFY4UHJveHkq
IHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUoaW5zdGFuY2UtPnNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQoKSk7CiAgICAgaWYgKCFwcm94eSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsK
IAotICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kVjhFdmVu
dExpc3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsKKyAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlz
dGVuZXIgPSBwcm94eS0+ZmluZFY4RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAgICAg
aWYgKGxpc3RlbmVyKSB7CiAgICAgICAgIFN0cmluZyB0eXBlID0gdG9XZWJDb3JlU3RyaW5nKGFy
Z3NbMF0pOwogICAgICAgICBib29sIHVzZUNhcHR1cmUgPSBhcmdzWzJdLT5Cb29sZWFuVmFsdWUo
KTsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V2ViS2l0Q1NTTWF0cml4Q29u
c3RydWN0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
V2ViS2l0Q1NTTWF0cml4Q29uc3RydWN0b3IuY3BwCShyZXZpc2lvbiA0NTA5NSkKKysrIFdlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V2ViS2l0Q1NTTWF0cml4Q29uc3RydWN0b3IuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC00Nyw3ICs0Nyw3IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woV2ViS2l0
Q1NTTWF0cml4Q29uc3RydWN0b3IpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uV2ViS2l0Q1NTTWF0
cml4LkNvbnN0cnVjdG9yIik7Ci0gICAgLy8gRklYTUU6IFRoZSBsb2dpYyBoZXJlIGlzIGFsbW9z
dCBleGFjdCBkdXBsaWNhdGUgb2YgVjg6OkNvbnN0cnVjdERPTU9iamVjdC4KKyAgICAvLyBGSVhN
RTogVGhlIGxvZ2ljIGhlcmUgaXMgYWxtb3N0IGV4YWN0IGR1cGxpY2F0ZSBvZiBWODo6Y29uc3Ry
dWN0RE9NT2JqZWN0LgogICAgIC8vIENvbnNpZGVyIHJlZmFjdG9yaW5nIHRvIHJlZHVjZSBkdXBs
aWNhdGlvbi4KICAgICBTdHJpbmcgY3NzVmFsdWU7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPj0g
MSkKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAgdGhyb3dFcnJvcihlYyk7CiAKICAgICAvLyBU
cmFuc2Zvcm0gdGhlIGhvbGRlciBpbnRvIGEgd3JhcHBlciBvYmplY3QgZm9yIHRoZSBtYXRyaXgu
Ci0gICAgVjhQcm94eTo6U2V0RE9NV3JhcHBlcihhcmdzLkhvbGRlcigpLCBWOENsYXNzSW5kZXg6
OlRvSW50KFY4Q2xhc3NJbmRleDo6V0VCS0lUQ1NTTUFUUklYKSwgbWF0cml4LmdldCgpKTsKKyAg
ICBWOFByb3h5OjpzZXRET01XcmFwcGVyKGFyZ3MuSG9sZGVyKCksIFY4Q2xhc3NJbmRleDo6VG9J
bnQoVjhDbGFzc0luZGV4OjpXRUJLSVRDU1NNQVRSSVgpLCBtYXRyaXguZ2V0KCkpOwogICAgIHJl
dHVybiB0b1Y4KG1hdHJpeC5yZWxlYXNlKCksIGFyZ3MuSG9sZGVyKCkpOwogfQogCkluZGV4OiBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxJRnJhbWVFbGVtZW50Q3VzdG9tLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxJRnJhbWVFbGVt
ZW50Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOEhUTUxJRnJhbWVFbGVtZW50Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzks
NyArMzksNyBAQAogCiBBQ0NFU1NPUl9TRVRURVIoSFRNTElGcmFtZUVsZW1lbnRTcmMpCiB7Ci0g
ICAgSFRNTElGcmFtZUVsZW1lbnQqIGlmcmFtZSA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8
SFRNTElGcmFtZUVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxJRnJhbWVFbGVtZW50
KiBpZnJhbWUgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MSUZyYW1lRWxl
bWVudD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgU3RyaW5nIHYgPSB2YWx1ZVRvU3RyaW5nV2l0aE51
bGxDaGVjayh2YWx1ZSk7CiAKICAgICBpZiAoIWFsbG93U2V0dGluZ0ZyYW1lU3JjVG9KYXZhc2Ny
aXB0VXJsKGlmcmFtZSwgdikpCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFRy
ZWVXYWxrZXJDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4VHJlZVdhbGtlckN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhUcmVlV2Fsa2VyQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNTEsMTMgKzUxLDEzIEBACiAgICAgaWYgKCFvYmplY3QpCiAgICAgICAgIHJldHVybiB2ODo6
TnVsbCgpOwogCi0gICAgcmV0dXJuIFY4UHJveHk6Ok5vZGVUb1Y4T2JqZWN0KG9iamVjdC5nZXQo
KSk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnROb2RlVG9WOE9iamVjdChvYmplY3QuZ2V0
KCkpOwogfQogCiBDQUxMQkFDS19GVU5DX0RFQ0woVHJlZVdhbGtlclBhcmVudE5vZGUpCiB7CiAg
ICAgSU5DX1NUQVRTKCJET00uVHJlZVdhbGtlci5wYXJlbnROb2RlKCkiKTsKLSAgICBUcmVlV2Fs
a2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8VHJlZVdhbGtlcj4oVjhD
bGFzc0luZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKKyAgICBUcmVlV2Fsa2VyKiB0
cmVlV2Fsa2VyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFRyZWVXYWxrZXI+KFY4
Q2xhc3NJbmRleDo6VFJFRVdBTEtFUiwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBTY3JpcHRTdGF0
ZSBzdGF0ZTsKICAgICBSZWZQdHI8Tm9kZT4gcmVzdWx0ID0gdHJlZVdhbGtlci0+cGFyZW50Tm9k
ZSgmc3RhdGUpOwpAQCAtNjcsNyArNjcsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFRyZWVXYWxr
ZXJGaXJzdENoaWxkKQogewogICAgIElOQ19TVEFUUygiRE9NLlRyZWVXYWxrZXIuZmlyc3RDaGls
ZCgpIik7Ci0gICAgVHJlZVdhbGtlciogdHJlZVdhbGtlciA9IFY4UHJveHk6OlRvTmF0aXZlT2Jq
ZWN0PFRyZWVXYWxrZXI+KFY4Q2xhc3NJbmRleDo6VFJFRVdBTEtFUiwgYXJncy5Ib2xkZXIoKSk7
CisgICAgVHJlZVdhbGtlciogdHJlZVdhbGtlciA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5kZXg6OlRSRUVXQUxLRVIsIGFyZ3MuSG9sZGVyKCkp
OwogCiAgICAgU2NyaXB0U3RhdGUgc3RhdGU7CiAgICAgUmVmUHRyPE5vZGU+IHJlc3VsdCA9IHRy
ZWVXYWxrZXItPmZpcnN0Q2hpbGQoJnN0YXRlKTsKQEAgLTc3LDcgKzc3LDcgQEAKIENBTExCQUNL
X0ZVTkNfREVDTChUcmVlV2Fsa2VyTGFzdENoaWxkKQogewogICAgIElOQ19TVEFUUygiRE9NLlRy
ZWVXYWxrZXIubGFzdENoaWxkKCkiKTsKLSAgICBUcmVlV2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQ
cm94eTo6VG9OYXRpdmVPYmplY3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0luZGV4OjpUUkVFV0FMS0VS
LCBhcmdzLkhvbGRlcigpKTsKKyAgICBUcmVlV2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6
Y29udmVydFRvTmF0aXZlT2JqZWN0PFRyZWVXYWxrZXI+KFY4Q2xhc3NJbmRleDo6VFJFRVdBTEtF
UiwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBTY3JpcHRTdGF0ZSBzdGF0ZTsKICAgICBSZWZQdHI8
Tm9kZT4gcmVzdWx0ID0gdHJlZVdhbGtlci0+bGFzdENoaWxkKCZzdGF0ZSk7CkBAIC04Nyw3ICs4
Nyw3IEBACiBDQUxMQkFDS19GVU5DX0RFQ0woVHJlZVdhbGtlck5leHROb2RlKQogewogICAgIElO
Q19TVEFUUygiRE9NLlRyZWVXYWxrZXIubmV4dE5vZGUoKSIpOwotICAgIFRyZWVXYWxrZXIqIHRy
ZWVXYWxrZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5k
ZXg6OlRSRUVXQUxLRVIsIGFyZ3MuSG9sZGVyKCkpOworICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxr
ZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0lu
ZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFNjcmlwdFN0YXRlIHN0YXRl
OwogICAgIFJlZlB0cjxOb2RlPiByZXN1bHQgPSB0cmVlV2Fsa2VyLT5uZXh0Tm9kZSgmc3RhdGUp
OwpAQCAtOTcsNyArOTcsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFRyZWVXYWxrZXJQcmV2aW91
c05vZGUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uVHJlZVdhbGtlci5wcmV2aW91c05vZGUoKSIp
OwotICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxU
cmVlV2Fsa2VyPihWOENsYXNzSW5kZXg6OlRSRUVXQUxLRVIsIGFyZ3MuSG9sZGVyKCkpOworICAg
IFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8
VHJlZVdhbGtlcj4oVjhDbGFzc0luZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKIAog
ICAgIFNjcmlwdFN0YXRlIHN0YXRlOwogICAgIFJlZlB0cjxOb2RlPiByZXN1bHQgPSB0cmVlV2Fs
a2VyLT5wcmV2aW91c05vZGUoJnN0YXRlKTsKQEAgLTEwNyw3ICsxMDcsNyBAQAogQ0FMTEJBQ0tf
RlVOQ19ERUNMKFRyZWVXYWxrZXJOZXh0U2libGluZykKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5U
cmVlV2Fsa2VyLm5leHRTaWJsaW5nKCkiKTsKLSAgICBUcmVlV2Fsa2VyKiB0cmVlV2Fsa2VyID0g
VjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0luZGV4OjpUUkVFV0FM
S0VSLCBhcmdzLkhvbGRlcigpKTsKKyAgICBUcmVlV2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94
eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFRyZWVXYWxrZXI+KFY4Q2xhc3NJbmRleDo6VFJFRVdB
TEtFUiwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBTY3JpcHRTdGF0ZSBzdGF0ZTsKICAgICBSZWZQ
dHI8Tm9kZT4gcmVzdWx0ID0gdHJlZVdhbGtlci0+bmV4dFNpYmxpbmcoJnN0YXRlKTsKQEAgLTEx
Nyw3ICsxMTcsNyBAQAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFRyZWVXYWxrZXJQcmV2aW91c1NpYmxp
bmcpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uVHJlZVdhbGtlci5wcmV2aW91c1NpYmxpbmcoKSIp
OwotICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxU
cmVlV2Fsa2VyPihWOENsYXNzSW5kZXg6OlRSRUVXQUxLRVIsIGFyZ3MuSG9sZGVyKCkpOworICAg
IFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8
VHJlZVdhbGtlcj4oVjhDbGFzc0luZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKIAog
ICAgIFNjcmlwdFN0YXRlIHN0YXRlOwogICAgIFJlZlB0cjxOb2RlPiByZXN1bHQgPSB0cmVlV2Fs
a2VyLT5wcmV2aW91c1NpYmxpbmcoJnN0YXRlKTsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4U1FMVHJhbnNhY3Rpb25DdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMVHJhbnNhY3Rpb25DdXN0b20uY3BwCShyZXZpc2lvbiA0
NTA5NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMVHJhbnNhY3Rpb25DdXN0
b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiwxNCArMzIsMTMgQEAKIAogI2lmIEVOQUJMRShE
QVRBQkFTRSkKIAotI2luY2x1ZGUgInY4X2JpbmRpbmcuaCIKLSNpbmNsdWRlICJ2OF9wcm94eS5o
IgotCiAjaW5jbHVkZSAiRGF0YWJhc2UuaCIKICNpbmNsdWRlICJTUUxWYWx1ZS5oIgorI2luY2x1
ZGUgIlY4QmluZGluZy5oIgogI2luY2x1ZGUgIlY4Q3VzdG9tQmluZGluZy5oIgogI2luY2x1ZGUg
IlY4Q3VzdG9tU1FMU3RhdGVtZW50Q2FsbGJhY2suaCIKICNpbmNsdWRlICJWOEN1c3RvbVNRTFN0
YXRlbWVudEVycm9yQ2FsbGJhY2suaCIKKyNpbmNsdWRlICJWOFByb3h5LmgiCiAjaW5jbHVkZSA8
d3RmL1ZlY3Rvci5oPgogCiB1c2luZyBuYW1lc3BhY2UgV1RGOwpAQCAtNTEsNyArNTAsNyBAQAog
ICAgIElOQ19TVEFUUygiRE9NLlNRTFRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwoKSIpOwogCiAgICAg
aWYgKGFyZ3MuTGVuZ3RoKCkgPT0gMCkgewotICAgICAgICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4
UHJveHk6OlNZTlRBWF9FUlJPUiwgIlNRTCBzdGF0ZW1lbnQgaXMgcmVxdWlyZWQuIik7CisgICAg
ICAgIFY4UHJveHk6OnRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VSUk9SLCAiU1FMIHN0YXRl
bWVudCBpcyByZXF1aXJlZC4iKTsKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKICAg
ICB9CiAKQEAgLTYyLDcgKzYxLDcgQEAKICAgICBpZiAoYXJncy5MZW5ndGgoKSA+IDEpIHsKICAg
ICAgICAgLy8gRklYTUU6IE1ha2UgdGhpcyB3b3JrIGZvciB2ODo6QXJyYXlpc2ggb2JqZWN0cywg
YXMgd2VsbAogICAgICAgICBpZiAoIWFyZ3NbMV0tPklzQXJyYXkoKSkgewotICAgICAgICAgICAg
VjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiU3RhdGVtZW50IGFyZ3Vt
ZW50cyBtdXN0IGJlIGFuIHY4OjpBcnJheS4iKTsKKyAgICAgICAgICAgIFY4UHJveHk6OnRocm93
RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgIlN0YXRlbWVudCBhcmd1bWVudHMgbXVzdCBiZSBh
biB2ODo6QXJyYXkuIik7CiAgICAgICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAg
ICAgICB9CiAKQEAgLTgwLDE0ICs3OSwxNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgU1FM
VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8U1FMVHJh
bnNhY3Rpb24+KFY4Q2xhc3NJbmRleDo6U1FMVFJBTlNBQ1RJT04sIGFyZ3MuSG9sZGVyKCkpOwor
ICAgIFNRTFRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2
ZU9iamVjdDxTUUxUcmFuc2FjdGlvbj4oVjhDbGFzc0luZGV4OjpTUUxUUkFOU0FDVElPTiwgYXJn
cy5Ib2xkZXIoKSk7CiAKICAgICBGcmFtZSogZnJhbWUgPSBWOFByb3h5OjpyZXRyaWV2ZUZyYW1l
KCk7CiAKICAgICBSZWZQdHI8U1FMU3RhdGVtZW50Q2FsbGJhY2s+IGNhbGxiYWNrOwogICAgIGlm
IChhcmdzLkxlbmd0aCgpID4gMikgewogICAgICAgICBpZiAoIWFyZ3NbMl0tPklzT2JqZWN0KCkp
IHsKLSAgICAgICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwg
IlN0YXRlbWVudCBjYWxsYmFjayBtdXN0IGJlIG9mIHZhbGlkIHR5cGUuIik7CisgICAgICAgICAg
ICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlRZUEVfRVJST1IsICJTdGF0ZW1lbnQgY2Fs
bGJhY2sgbXVzdCBiZSBvZiB2YWxpZCB0eXBlLiIpOwogICAgICAgICAgICAgcmV0dXJuIHY4OjpV
bmRlZmluZWQoKTsKICAgICAgICAgfQogCkBAIC05OCw3ICs5Nyw3IEBACiAgICAgUmVmUHRyPFNR
TFN0YXRlbWVudEVycm9yQ2FsbGJhY2s+IGVycm9yQ2FsbGJhY2s7CiAgICAgaWYgKGFyZ3MuTGVu
Z3RoKCkgPiAzKSB7CiAgICAgICAgIGlmICghYXJnc1syXS0+SXNPYmplY3QoKSkgewotICAgICAg
ICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiU3RhdGVtZW50
IGVycm9yIGNhbGxiYWNrIG11c3QgYmUgb2YgdmFsaWQgdHlwZS4iKTsKKyAgICAgICAgICAgIFY4
UHJveHk6OnRocm93RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgIlN0YXRlbWVudCBlcnJvciBj
YWxsYmFjayBtdXN0IGJlIG9mIHZhbGlkIHR5cGUuIik7CiAgICAgICAgICAgICByZXR1cm4gdjg6
OlVuZGVmaW5lZCgpOwogICAgICAgICB9CiAKQEAgLTEwOCw3ICsxMDcsNyBAQAogCiAgICAgRXhj
ZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAgdHJhbnNhY3Rpb24tPmV4ZWN1dGVTUUwoc3RhdGVtZW50
LCBzcWxWYWx1ZXMsIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBlYyk7Ci0gICAgVjhQcm94eTo6
U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwog
CiAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIH0KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4WE1MU2VyaWFsaXplckNvbnN0cnVjdG9yLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFhNTFNlcmlhbGl6ZXJDb25zdHJ1Y3Rvci5jcHAJ
KHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYTUxTZXJp
YWxpemVyQ29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICszOSw3IEBACiBD
QUxMQkFDS19GVU5DX0RFQ0woWE1MU2VyaWFsaXplckNvbnN0cnVjdG9yKQogewogICAgIElOQ19T
VEFUUygiRE9NLlhNTFNlcmlhbGl6ZXIuQ29uc3RydWN0b3IiKTsKLSAgICByZXR1cm4gVjhQcm94
eTo6Q29uc3RydWN0RE9NT2JqZWN0PFY4Q2xhc3NJbmRleDo6WE1MU0VSSUFMSVpFUiwgWE1MU2Vy
aWFsaXplcj4oYXJncyk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnN0cnVjdERPTU9iamVjdDxW
OENsYXNzSW5kZXg6OlhNTFNFUklBTElaRVIsIFhNTFNlcmlhbGl6ZXI+KGFyZ3MpOwogfQogCiB9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2suY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tU1FMU3RhdGVtZW50RXJyb3JDYWxsYmFjay5j
cHAJKHJldmlzaW9uIDQ1MDk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0
b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTQsMTUg
KzU0LDE1IEBACiB7CiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwogCi0gICAgdjg6
OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQobV9mcmFt
ZS5nZXQoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6
OmNvbnRleHQobV9mcmFtZS5nZXQoKSk7CiAgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQogICAg
ICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0
KTsKIAogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmd2W10gPSB7Ci0gICAgICAgIFY4UHJv
eHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpTUUxUUkFOU0FDVElPTiwgdHJhbnNhY3Rpb24p
LAotICAgICAgICBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMRVJST1IsIGVy
cm9yKQorICAgICAgICBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNR
TFRSQU5TQUNUSU9OLCB0cmFuc2FjdGlvbiksCisgICAgICAgIFY4UHJveHk6OmNvbnZlcnRUb1Y4
T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMRVJST1IsIGVycm9yKQogICAgIH07CiAKICAgICAvLyBQ
cm90ZWN0IHRoZSBmcmFtZSB1bnRpbCB0aGUgY2FsbGJhY2sgcmV0dXJucy4KSW5kZXg6IFdlYkNv
cmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tU1FMVHJhbnNhY3Rpb25DYWxsYmFjay5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxUcmFu
c2FjdGlvbkNhbGxiYWNrLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJhY2suY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC01NSwxNCArNTUsMTQgQEAKIHsKICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2Nv
cGU7CiAKLSAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0
Q29udGV4dChtX2ZyYW1lLmdldCgpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250
ZXh0ID0gVjhQcm94eTo6Y29udGV4dChtX2ZyYW1lLmdldCgpKTsKICAgICBpZiAoY29udGV4dC5J
c0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKIAogICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29w
ZShjb250ZXh0KTsKIAogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmd2W10gPSB7Ci0gICAg
ICAgIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpTUUxUUkFOU0FDVElPTiwgdHJh
bnNhY3Rpb24pCisgICAgICAgIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRl
eDo6U1FMVFJBTlNBQ1RJT04sIHRyYW5zYWN0aW9uKQogICAgIH07CiAKICAgICAvLyBQcm90ZWN0
IHRoZSBmcmFtZSB1bnRpbCB0aGUgY2FsbGJhY2sgcmV0dXJucy4KSW5kZXg6IFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4WE1MSHR0cFJlcXVlc3RDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVzdENvbnN0cnVj
dG9yLmNwcAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OFhNTEh0dHBSZXF1ZXN0Q29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01OSwxMSAr
NTksMTEgQEAKICNlbmRpZgogICAgICAgICBjb250ZXh0ID0gVjhQcm94eTo6cmV0cmlldmVGcmFt
ZSgpLT5kb2N1bWVudCgpOwogICAgIFJlZlB0cjxYTUxIdHRwUmVxdWVzdD4geG1sSHR0cFJlcXVl
c3QgPSBYTUxIdHRwUmVxdWVzdDo6Y3JlYXRlKGNvbnRleHQpOwotICAgIFY4UHJveHk6OlNldERP
TVdyYXBwZXIoYXJncy5Ib2xkZXIoKSwgVjhDbGFzc0luZGV4OjpUb0ludChWOENsYXNzSW5kZXg6
OlhNTEhUVFBSRVFVRVNUKSwgeG1sSHR0cFJlcXVlc3QuZ2V0KCkpOworICAgIFY4UHJveHk6OnNl
dERPTVdyYXBwZXIoYXJncy5Ib2xkZXIoKSwgVjhDbGFzc0luZGV4OjpUb0ludChWOENsYXNzSW5k
ZXg6OlhNTEhUVFBSRVFVRVNUKSwgeG1sSHR0cFJlcXVlc3QuZ2V0KCkpOwogCiAgICAgLy8gQWRk
IG9iamVjdCB0byB0aGUgd3JhcHBlciBtYXAuCiAgICAgeG1sSHR0cFJlcXVlc3QtPnJlZigpOwot
ICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckFjdGl2ZURPTU9iamVjdCh4bWxIdHRwUmVxdWVz
dC5nZXQoKSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhhcmdzLkhvbGRlcigpKSk7
CisgICAgVjhQcm94eTo6c2V0SlNXcmFwcGVyRm9yQWN0aXZlRE9NT2JqZWN0KHhtbEh0dHBSZXF1
ZXN0LmdldCgpLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGFyZ3MuSG9sZGVyKCkp
KTsKICAgICByZXR1cm4gYXJncy5Ib2xkZXIoKTsKIH0KIApJbmRleDogV2ViQ29yZS9iaW5kaW5n
cy92OC9WOEFic3RyYWN0RXZlbnRMaXN0ZW5lci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9i
aW5kaW5ncy92OC9WOEFic3RyYWN0RXZlbnRMaXN0ZW5lci5jcHAJKHJldmlzaW9uIDQ1MDk1KQor
KysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOEFic3RyYWN0RXZlbnRMaXN0ZW5lci5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTU1LDcgKzU1LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgVjhBYnN0cmFjdEV2
ZW50TGlzdGVuZXI6Omludm9rZUV2ZW50SGFuZGxlcih2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBj
b250ZXh0LCBFdmVudCogZXZlbnQsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBqc0V2ZW50LCBib29s
IGlzV2luZG93RXZlbnQpCit2b2lkIFY4QWJzdHJhY3RFdmVudExpc3RlbmVyOjppbnZva2VFdmVu
dEhhbmRsZXIodjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gdjhDb250ZXh0LCBFdmVudCogZXZlbnQs
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiBqc0V2ZW50LCBib29sIGlzV2luZG93RXZlbnQpCiB7CiAg
ICAgLy8gV2UgcHVzaCB0aGUgZXZlbnQgYmVpbmcgcHJvY2Vzc2VkIGludG8gdGhlIGdsb2JhbCBv
YmplY3QsIHNvIHRoYXQgaXQgY2FuIGJlIGV4cG9zZWQgYnkgRE9NV2luZG93J3MgYmluZGluZ3Mu
CiAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGV2ZW50U3ltYm9sID0gdjg6OlN0cmluZzo6TmV3
U3ltYm9sKCJldmVudCIpOwpAQCAtNjcsMTEgKzY3LDExIEBACiAgICAgICAgIHRyeUNhdGNoLlNl
dFZlcmJvc2UodHJ1ZSk7CiAKICAgICAgICAgLy8gU2F2ZSB0aGUgb2xkICdldmVudCcgcHJvcGVy
dHkgc28gd2UgY2FuIHJlc3RvcmUgaXQgbGF0ZXIuCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6VmFs
dWU+IHNhdmVkRXZlbnQgPSBjb250ZXh0LT5HbG9iYWwoKS0+R2V0SGlkZGVuVmFsdWUoZXZlbnRT
eW1ib2wpOworICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBzYXZlZEV2ZW50ID0gdjhDb250
ZXh0LT5HbG9iYWwoKS0+R2V0SGlkZGVuVmFsdWUoZXZlbnRTeW1ib2wpOwogICAgICAgICB0cnlD
YXRjaC5SZXNldCgpOwogCiAgICAgICAgIC8vIE1ha2UgdGhlIGV2ZW50IGF2YWlsYWJsZSBpbiB0
aGUgZ2xvYmFsIG9iamVjdCwgc28gRE9NV2luZG93IGNhbiBleHBvc2UgaXQuCi0gICAgICAgIGNv
bnRleHQtPkdsb2JhbCgpLT5TZXRIaWRkZW5WYWx1ZShldmVudFN5bWJvbCwganNFdmVudCk7Cisg
ICAgICAgIHY4Q29udGV4dC0+R2xvYmFsKCktPlNldEhpZGRlblZhbHVlKGV2ZW50U3ltYm9sLCBq
c0V2ZW50KTsKICAgICAgICAgdHJ5Q2F0Y2guUmVzZXQoKTsKIAogICAgICAgICAvLyBDYWxsIHRo
ZSBldmVudCBoYW5kbGVyLgpAQCAtODAsMTMgKzgwLDEzIEBACiAKICAgICAgICAgLy8gUmVzdG9y
ZSB0aGUgb2xkIGV2ZW50LiBUaGlzIG11c3QgYmUgZG9uZSBmb3IgYWxsIGV4aXQgcGF0aHMgdGhy
b3VnaCB0aGlzIG1ldGhvZC4KICAgICAgICAgaWYgKHNhdmVkRXZlbnQuSXNFbXB0eSgpKQotICAg
ICAgICAgICAgY29udGV4dC0+R2xvYmFsKCktPlNldEhpZGRlblZhbHVlKGV2ZW50U3ltYm9sLCB2
ODo6VW5kZWZpbmVkKCkpOworICAgICAgICAgICAgdjhDb250ZXh0LT5HbG9iYWwoKS0+U2V0SGlk
ZGVuVmFsdWUoZXZlbnRTeW1ib2wsIHY4OjpVbmRlZmluZWQoKSk7CiAgICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5TZXRIaWRkZW5WYWx1ZShldmVudFN5bWJvbCwg
c2F2ZWRFdmVudCk7CisgICAgICAgICAgICB2OENvbnRleHQtPkdsb2JhbCgpLT5TZXRIaWRkZW5W
YWx1ZShldmVudFN5bWJvbCwgc2F2ZWRFdmVudCk7CiAgICAgICAgIHRyeUNhdGNoLlJlc2V0KCk7
CiAgICAgfQogCi0gICAgQVNTRVJUKCFWOFByb3h5OjpIYW5kbGVPdXRPZk1lbW9yeSgpIHx8IHJl
dHVyblZhbHVlLklzRW1wdHkoKSk7CisgICAgQVNTRVJUKCFWOFByb3h5OjpoYW5kbGVPdXRPZk1l
bW9yeSgpIHx8IHJldHVyblZhbHVlLklzRW1wdHkoKSk7CiAKICAgICBpZiAocmV0dXJuVmFsdWUu
SXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CkBAIC0xMTIsMjAgKzExMiwyMCBAQAogCiAgICAg
djg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4
dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQobV9mcmFtZSk7Ci0gICAgaWYgKGNvbnRl
eHQuSXNFbXB0eSgpKQorICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9IFY4
UHJveHk6OmNvbnRleHQobV9mcmFtZSk7CisgICAgaWYgKHY4Q29udGV4dC5Jc0VtcHR5KCkpCiAg
ICAgICAgIHJldHVybjsKIAogICAgIC8vIG1fZnJhbWUgY2FuIHJlbW92ZWQgYnkgdGhlIGNhbGxi
YWNrIGZ1bmN0aW9uLCBwcm90ZWN0IGl0IHVudGlsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1
cm5zLgogICAgIFJlZlB0cjxGcmFtZT4gcHJvdGVjdEZyYW1lKG1fZnJhbWUpOwogCiAgICAgLy8g
RW50ZXIgdGhlIFY4IGNvbnRleHQgaW4gd2hpY2ggdG8gcGVyZm9ybSB0aGUgZXZlbnQgaGFuZGxp
bmcuCi0gICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworICAgIHY4OjpDb250
ZXh0OjpTY29wZSBzY29wZSh2OENvbnRleHQpOwogCiAgICAgLy8gR2V0IHRoZSBWOCB3cmFwcGVy
IGZvciB0aGUgZXZlbnQgb2JqZWN0LgotICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBqc0V2ZW50
ID0gVjhQcm94eTo6RXZlbnRUb1Y4T2JqZWN0KGV2ZW50KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4ganNFdmVudCA9IFY4UHJveHk6OmNvbnZlcnRFdmVudFRvVjhPYmplY3QoZXZlbnQpOwog
Ci0gICAgaW52b2tlRXZlbnRIYW5kbGVyKGNvbnRleHQsIGV2ZW50LCBqc0V2ZW50LCBpc1dpbmRv
d0V2ZW50KTsKKyAgICBpbnZva2VFdmVudEhhbmRsZXIodjhDb250ZXh0LCBldmVudCwganNFdmVu
dCwgaXNXaW5kb3dFdmVudCk7CiAKICAgICBEb2N1bWVudDo6dXBkYXRlU3R5bGVGb3JBbGxEb2N1
bWVudHMoKTsKIH0KQEAgLTEzNCw3ICsxMzQsNyBAQAogewogICAgIGlmICghbV9saXN0ZW5lci5J
c0VtcHR5KCkpIHsKICNpZm5kZWYgTkRFQlVHCi0gICAgICAgIFY4UHJveHk6OlVucmVnaXN0ZXJH
bG9iYWxIYW5kbGUodGhpcywgbV9saXN0ZW5lcik7CisgICAgICAgIFY4UHJveHk6OnVucmVnaXN0
ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9saXN0ZW5lcik7CiAjZW5kaWYKICAgICAgICAgbV9saXN0
ZW5lci5EaXNwb3NlKCk7CiAgICAgICAgIG1fbGlzdGVuZXIuQ2xlYXIoKTsKQEAgLTE1MCw3ICsx
NTAsNyBAQAogICAgICAgICByZXR1cm4gdjg6OkNvbnRleHQ6OkdldEN1cnJlbnQoKS0+R2xvYmFs
KCk7CiAKICAgICBFdmVudFRhcmdldCogdGFyZ2V0ID0gZXZlbnQtPmN1cnJlbnRUYXJnZXQoKTsK
LSAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUgPSBWOFByb3h5OjpFdmVudFRhcmdldFRv
VjhPYmplY3QodGFyZ2V0KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUgPSBWOFBy
b3h5Ojpjb252ZXJ0RXZlbnRUYXJnZXRUb1Y4T2JqZWN0KHRhcmdldCk7CiAgICAgaWYgKHZhbHVl
LklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOwogICAg
IHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD46Ok5ldyh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+
OjpDYXN0KHZhbHVlKSk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjcmlwdEluc3RhbmNl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjcmlwdEluc3RhbmNlLmNw
cAkocmV2aXNpb24gNDUwOTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjcmlwdEluc3RhbmNl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjIsNyArNjIsNyBAQAogICAgIGlmIChtX2luc3RhbmNl
LklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwogI2lmbmRlZiBOREVCVUcKLSAgICBWOFByb3h5
OjpVbnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMsIG1faW5zdGFuY2UpOworICAgIFY4UHJveHk6
OnVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9pbnN0YW5jZSk7CiAjZW5kaWYKICAgICBt
X2luc3RhbmNlLkRpc3Bvc2UoKTsKICAgICBtX2luc3RhbmNlLkNsZWFyKCk7CkBAIC03Niw3ICs3
Niw3IEBACiAKICAgICBtX2luc3RhbmNlID0gdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5l
dyhpbnN0YW5jZSk7CiAjaWZuZGVmIE5ERUJVRwotICAgIFY4UHJveHk6OlJlZ2lzdGVyR2xvYmFs
SGFuZGxlKFNDUklQVElOU1RBTkNFLCB0aGlzLCBtX2luc3RhbmNlKTsKKyAgICBWOFByb3h5Ojpy
ZWdpc3Rlckdsb2JhbEhhbmRsZShTQ1JJUFRJTlNUQU5DRSwgdGhpcywgbV9pbnN0YW5jZSk7CiAj
ZW5kaWYKIH0KIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOERPTU1hcC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOERPTU1hcC5jcHAJKHJldmlzaW9uIDQ1MDk1
KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOERPTU1hcC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTM0OCw3ICszNDgsNyBAQAogICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKICAgICBBU1NFUlQo
djhPYmplY3QtPklzT2JqZWN0KCkpOwogCi0gICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBl
IHR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFwcGVyVHlwZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+
OjpDYXN0KHY4T2JqZWN0KSk7CisgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUg
PSBWOFByb3h5Ojpkb21XcmFwcGVyVHlwZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4
T2JqZWN0KSk7CiAKICAgICBUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBl
ck1hcDx2b2lkPiYgbWFwID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRl
cm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mPihnZXRET01TVkdPYmplY3RXaXRoQ29udGV4dE1hcCgp
KTsKICAgICBpZiAobWFwLmNvbnRhaW5zKGRvbU9iamVjdCkpIHsKQEAgLTQxNSw3ICs0MTUsNyBA
QAogICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKICAgICBBU1NFUlQodjhPYmplY3QtPklzT2Jq
ZWN0KCkpOwogCi0gICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5
OjpHZXRET01XcmFwcGVyVHlwZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0
KSk7CisgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5Ojpkb21X
cmFwcGVyVHlwZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSk7CiAKICAg
ICBUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgbWFw
ID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJN
YXA8dm9pZD4mPihnZXRET01PYmplY3RNYXAoKSk7CiAgICAgaWYgKG1hcC5jb250YWlucyhkb21P
YmplY3QpKSB7CkBAIC00NDAsNyArNDQwLDcgQEAKICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7
CiAgICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVjdCgpKTsKIAotICAgIFY4Q2xhc3NJbmRleDo6
VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUodjg6OkhhbmRs
ZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFw
cGVyVHlwZSB0eXBlID0gVjhQcm94eTo6ZG9tV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOwogCiAgICAgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRl
cm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mIG1hcCA9IHN0YXRpY19jYXN0PFRocmVhZFNwZWNpZmlj
RE9NRGF0YTo6SW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+Jj4oZ2V0QWN0aXZlRE9NT2JqZWN0
TWFwKCkpOwogICAgIGlmIChtYXAuY29udGFpbnMoZG9tT2JqZWN0KSkgewpAQCAtNTI4LDcgKzUy
OCw3IEBACiAgICAgICAgIFQqIGRvbU9iamVjdCA9IHN0YXRpY19jYXN0PFQqPihpdGVyLT5maXJz
dCk7CiAgICAgICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHY4T2JqZWN0KGl0ZXItPnNl
Y29uZCk7CiAKLSAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFBy
b3h5OjpHZXRET01XcmFwcGVyVHlwZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2Jq
ZWN0KSk7CisgICAgICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94
eTo6ZG9tV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkp
OwogCiAgICAgICAgIC8vIERlcmVmIHRoZSBET00gb2JqZWN0LgogICAgICAgICBkZXJlZk9iamVj
dCh0eXBlLCBkb21PYmplY3QpOwo=
</data>
<flag name="review"
          id="16397"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31893</attachid>
            <date>2009-06-25 17:21:59 -0700</date>
            <delta_ts>2009-06-25 22:25:30 -0700</delta_ts>
            <desc>patch5</desc>
            <filename>patch5.txt</filename>
            <type>text/plain</type>
            <size>394938</size>
            <attacher name="Nate Chapin">japhet</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NTIxNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDQwIEBACisyMDA5LTA2LTI1ICBOYXRlIENoYXBpbiAgPGphcGhldEBjaHJvbWl1
bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
VXBzdHJlYW0gVjhQcm94eS4gIFRoaXMgaW52b2x2ZWQgdXBkYXRpbmcgYSBsb3Qgb2YgZnVuY3Rp
b24gYW5kIHZhcmlhYmxlIG5hbWVzIHRvIG1hdGNoIFdlYktpdCBzdHlsZSwgaGVuY2UgdGhlIGxh
cmdlIHNpemUuCisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTI2NjIzCisKKyAgICAgICAgKiBiaW5kaW5ncy92OC9TY2hlZHVsZWRBY3Rpb24uY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6U2NoZWR1bGVkQWN0aW9uOjpTY2hlZHVsZWRBY3Rpb24pOgorICAg
ICAgICAoV2ViQ29yZTo6U2NoZWR1bGVkQWN0aW9uOjp+U2NoZWR1bGVkQWN0aW9uKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNjaGVkdWxlZEFjdGlvbjo6ZXhlY3V0ZSk6CisgICAgICAgICogYmluZGlu
Z3MvdjgvU2NyaXB0Q2FsbFN0YWNrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNjcmlwdENhbGxT
dGFjazo6U2NyaXB0Q2FsbFN0YWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9TY3JpcHRDb250
cm9sbGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNjcmlwdENvbnRyb2xsZXI6OmlzU2FmZVNj
cmlwdCk6CisgICAgICAgIChXZWJDb3JlOjpTY3JpcHRDb250cm9sbGVyOjpnY1Byb3RlY3RKU1dy
YXBwZXIpOgorICAgICAgICAoV2ViQ29yZTo6U2NyaXB0Q29udHJvbGxlcjo6Z2NVbnByb3RlY3RK
U1dyYXBwZXIpOgorICAgICAgICAoV2ViQ29yZTo6U2NyaXB0Q29udHJvbGxlcjo6cHJvY2Vzc2lu
Z1VzZXJHZXN0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlNjcmlwdENvbnRyb2xsZXI6OmV2YWx1
YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNjcmlwdENvbnRyb2xsZXI6OnNldEV2ZW50SGFuZGxl
ckxpbmVOdW1iZXIpOgorICAgICAgICAoV2ViQ29yZTo6U2NyaXB0Q29udHJvbGxlcjo6YmluZFRv
V2luZG93T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlNjcmlwdENvbnRyb2xsZXI6OmNvbGxl
Y3RHYXJiYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OlNjcmlwdENvbnRyb2xsZXI6OmhhdmVJbnRl
cnByZXRlcik6CisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVTY3JpcHRPYmplY3QpOgorICAgICAg
ICAoV2ViQ29yZTo6U2NyaXB0Q29udHJvbGxlcjo6Y3JlYXRlU2NyaXB0T2JqZWN0Rm9yUGx1Z2lu
RWxlbWVudCk6CisgICAgICAgICogYmluZGluZ3MvdjgvU2NyaXB0SW5zdGFuY2UuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6VjhTY3JpcHRJbnN0YW5jZTo6Y2xlYXIpOgorICAgICAgICAoV2ViQ29y
ZTo6VjhTY3JpcHRJbnN0YW5jZTo6c2V0KToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9TY3JpcHRP
YmplY3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U2NyaXB0R2xvYmFsT2JqZWN0OjpzZXQpOgor
ICAgICAgICAqIGJpbmRpbmdzL3Y4L1NjcmlwdE9iamVjdFF1YXJhbnRpbmUuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6Z2V0UXVhcmFudGluZWRTY3JpcHRPYmplY3QpOgorICAgICAgICAqIGJpbmRp
bmdzL3Y4L1NjcmlwdFNjb3BlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNjcmlwdFNjb3BlOjpT
Y3JpcHRTY29wZSk6CisgICAgICAgICogYmluZGluZ3MvdjgvU2NyaXB0VmFsdWUuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OlNjcmlwdFZhbHVlOjpTY3JpcHRWYWx1ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpTY3JpcHRWYWx1ZTo6b3BlcmF0b3I9KToKKyAgICAgICAgKFdlYkNvcmU6OlNjcmlwdFZhbHVl
OjpjbGVhcik6CisgICAgICAgICogYmluZGluZ3MvdjgvVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6Omludm9rZUV2
ZW50SGFuZGxlcik6CisgICAgICAgIChXZWJDb3JlOjpWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcjo6
aGFuZGxlRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6VjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6
OmRpc3Bvc2VMaXN0ZW5lck9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpWOEFic3RyYWN0RXZl
bnRMaXN0ZW5lcjo6Z2V0UmVjZWl2ZXJPYmplY3QpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1Y4
Q29sbGVjdGlvbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjp0b09wdGlvbnNDb2xsZWN0aW9uU2V0
dGVyKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9WOENvbGxlY3Rpb24uaDoKKyAgICAgICAgKFdl
YkNvcmU6OmdldFY4T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OmdldE5hbWVkUHJvcGVydHlP
ZkNvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6bm9kZUNvbGxlY3Rpb25OYW1lZFByb3Bl
cnR5R2V0dGVyKToKKyAgICAgICAgKFdlYkNvcmU6OmdldEluZGV4ZWRQcm9wZXJ0eU9mQ29sbGVj
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpub2RlQ29sbGVjdGlvbkluZGV4ZWRQcm9wZXJ0eUdl
dHRlcik6CisgICAgICAgIChXZWJDb3JlOjpub2RlQ29sbGVjdGlvbkluZGV4ZWRQcm9wZXJ0eUVu
dW1lcmF0b3IpOgorICAgICAgICAoV2ViQ29yZTo6Y29sbGVjdGlvbkluZGV4ZWRQcm9wZXJ0eUVu
dW1lcmF0b3IpOgorICAgICAgICAoV2ViQ29yZTo6Y29sbGVjdGlvblN0cmluZ09yTnVsbEluZGV4
ZWRQcm9wZXJ0eUdldHRlcik6CisgICAgICAgICogYmluZGluZ3MvdjgvVjhET01NYXAuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6d2Vha0RPTU9iamVjdENhbGxiYWNrKToKKyAgICAgICAgKFdlYkNv
cmU6OkRPTURhdGE6OnJlbW92ZU9iamVjdHNGcm9tV3JhcHBlck1hcCk6CisgICAgICAgICogYmlu
ZGluZ3MvdjgvVjhIZWxwZXJzLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OndyYXBOUE9iamVjdCk6
CisgICAgICAgIChXZWJDb3JlOjp0b1Y4Q29udGV4dCk6CisgICAgICAgICogYmluZGluZ3Mvdjgv
VjhMYXp5RXZlbnRMaXN0ZW5lci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWOExhenlFdmVudExp
c3RlbmVyOjp+VjhMYXp5RXZlbnRMaXN0ZW5lcik6CisgICAgICAgIChXZWJDb3JlOjpWOExhenlF
dmVudExpc3RlbmVyOjpnZXRMaXN0ZW5lckZ1bmN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlY4
TGF6eUV2ZW50TGlzdGVuZXI6OmNhbGxMaXN0ZW5lckZ1bmN0aW9uKToKKyAgICAgICAgKFdlYkNv
cmU6OlY4TGF6eUV2ZW50TGlzdGVuZXI6OmdldFdyYXBwZWRMaXN0ZW5lckZ1bmN0aW9uKToKKyAg
ICAgICAgKiBiaW5kaW5ncy92OC9WOE5vZGVGaWx0ZXJDb25kaXRpb24uY3BwOgorICAgICAgICAo
V2ViQ29yZTo6VjhOb2RlRmlsdGVyQ29uZGl0aW9uOjpWOE5vZGVGaWx0ZXJDb25kaXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6VjhOb2RlRmlsdGVyQ29uZGl0aW9uOjp+VjhOb2RlRmlsdGVyQ29u
ZGl0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlY4Tm9kZUZpbHRlckNvbmRpdGlvbjo6YWNjZXB0
Tm9kZSk6CisgICAgICAgICogYmluZGluZ3MvdjgvVjhPYmplY3RFdmVudExpc3RlbmVyLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OndlYWtPYmplY3RFdmVudExpc3RlbmVyQ2FsbGJhY2spOgorICAg
ICAgICAoV2ViQ29yZTo6VjhPYmplY3RFdmVudExpc3RlbmVyOjp+VjhPYmplY3RFdmVudExpc3Rl
bmVyKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9WOFByb3h5LmNwcDogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjpnbG9iYWxIYW5kbGVNYXApOgorICAgICAgICAoV2ViQ29yZTo6VVNFX1ZBUik6
CisgICAgICAgIChXZWJDb3JlOjplbnVtZXJhdGVHbG9iYWxIYW5kbGVzKToKKyAgICAgICAgKFdl
YkNvcmU6OlY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxlKToKKyAgICAgICAgKFdlYkNvcmU6
OlY4UHJveHk6OnVucmVnaXN0ZXJHbG9iYWxIYW5kbGUpOgorICAgICAgICAoV2ViQ29yZTo6YmF0
Y2hDb25maWd1cmVBdHRyaWJ1dGVzKToKKyAgICAgICAgKFdlYkNvcmU6OmJhdGNoQ29uZmlndXJl
Q29uc3RhbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OmVudW1lcmF0ZURPTU9iamVjdE1hcCk6Cisg
ICAgICAgIChXZWJDb3JlOjplbnVtZXJhdGVET01Ob2RlTWFwKToKKyAgICAgICAgKFdlYkNvcmU6
OkRPTU9iamVjdFZpc2l0b3I6OnZpc2l0RE9NV3JhcHBlcik6CisgICAgICAgIChXZWJDb3JlOjpF
bnN1cmVXZWFrRE9NTm9kZVZpc2l0b3I6OnZpc2l0RE9NV3JhcHBlcik6CisgICAgICAgIChXZWJD
b3JlOjpWOFByb3h5Ojpjb252ZXJ0U1ZHRWxlbWVudEluc3RhbmNlVG9WOE9iamVjdCk6CisgICAg
ICAgIChXZWJDb3JlOjpzdmdPYmplY3RUb0NvbnRleHRNYXApOgorICAgICAgICAoV2ViQ29yZTo6
VjhQcm94eTo6Y29udmVydFNWR09iamVjdFdpdGhDb250ZXh0VG9WOE9iamVjdCk6CisgICAgICAg
IChXZWJDb3JlOjpWOFByb3h5OjpzZXRTVkdDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OlY4
UHJveHk6OnN2Z0NvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Z2NQcm90ZWN0ZWRNYXApOgor
ICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6Z2NQcm90ZWN0KToKKyAgICAgICAgKFdlYkNvcmU6
OlY4UHJveHk6OmdjVW5wcm90ZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdDUHJvbG9ndWVWaXNp
dG9yOjp2aXNpdERPTVdyYXBwZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JvdXBlckl0ZW06Okdy
b3VwZXJJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6Okdyb3VwZXJJdGVtOjpncm91cF9pZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpHcm91cGVySXRlbTo6bm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpH
cm91cGVySXRlbTo6d3JhcHBlcik6CisgICAgICAgIChXZWJDb3JlOjpvcGVyYXRvcjwpOgorICAg
ICAgICAoV2ViQ29yZTo6T2JqZWN0R3JvdXBlclZpc2l0b3I6Ok9iamVjdEdyb3VwZXJWaXNpdG9y
KToKKyAgICAgICAgKFdlYkNvcmU6Ok9iamVjdEdyb3VwZXJWaXNpdG9yOjp2aXNpdERPTVdyYXBw
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6T2JqZWN0R3JvdXBlclZpc2l0b3I6OmFwcGx5R3JvdXBp
bmcpOgorICAgICAgICAoV2ViQ29yZTo6Z2NQcm9sb2d1ZSk6CisgICAgICAgIChXZWJDb3JlOjpH
Q0VwaWxvZ3VlVmlzaXRvcjo6dmlzaXRET01XcmFwcGVyKToKKyAgICAgICAgKFdlYkNvcmU6Omdj
RXBpbG9ndWUpOgorICAgICAgICAoV2ViQ29yZTo6SmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlOjpK
YXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6SmF2YVNjcmlwdENv
bnNvbGVNZXNzYWdlOjphZGRUb1BhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6Q29uc29sZU1lc3Nh
Z2VNYW5hZ2VyOjphZGRNZXNzYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbnNvbGVNZXNzYWdl
TWFuYWdlcjo6YWRkRGVsYXllZE1lc3NhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6Q29uc29sZU1l
c3NhZ2VNYW5hZ2VyOjpwcm9jZXNzRGVsYXllZE1lc3NhZ2VzKToKKyAgICAgICAgKFdlYkNvcmU6
OkNvbnNvbGVNZXNzYWdlU2NvcGU6OkNvbnNvbGVNZXNzYWdlU2NvcGUpOgorICAgICAgICAoV2Vi
Q29yZTo6Q29uc29sZU1lc3NhZ2VTY29wZTo6fkNvbnNvbGVNZXNzYWdlU2NvcGUpOgorICAgICAg
ICAoV2ViQ29yZTo6bG9nSW5mbyk6CisgICAgICAgIChXZWJDb3JlOjpoYW5kbGVDb25zb2xlTWVz
c2FnZSk6CisgICAgICAgIChXZWJDb3JlOjopOgorICAgICAgICAoV2ViQ29yZTo6cmVwb3J0VW5z
YWZlQWNjZXNzVG8pOgorICAgICAgICAoV2ViQ29yZTo6cmVwb3J0VW5zYWZlSmF2YVNjcmlwdEFj
Y2Vzcyk6CisgICAgICAgIChXZWJDb3JlOjpoYW5kbGVGYXRhbEVycm9ySW5WOCk6CisgICAgICAg
IChXZWJDb3JlOjpyZXBvcnRGYXRhbEVycm9ySW5WOCk6CisgICAgICAgIChXZWJDb3JlOjpWOFBy
b3h5Ojp+VjhQcm94eSk6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5OjpkZXN0cm95R2xvYmFs
KToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmRvbU9iamVjdEhhc0pTV3JhcHBlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01PYmplY3QpOgorICAg
ICAgICAoV2ViQ29yZTo6VjhQcm94eTo6c2V0SlNXcmFwcGVyRm9yQWN0aXZlRE9NT2JqZWN0KToK
KyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OnNldEpTV3JhcHBlckZvckRPTU5vZGUpOgorICAg
ICAgICAoV2ViQ29yZTo6ZmluZEV2ZW50TGlzdGVuZXJJbkxpc3QpOgorICAgICAgICAoV2ViQ29y
ZTo6VjhQcm94eTo6ZmluZFY4RXZlbnRMaXN0ZW5lcik6CisgICAgICAgIChXZWJDb3JlOjpWOFBy
b3h5OjpmaW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIpOgorICAgICAgICAoV2ViQ29yZTo6VjhQ
cm94eTo6ZmluZE9iamVjdEV2ZW50TGlzdGVuZXIpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94
eTo6ZmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0ZW5lcik6CisgICAgICAgIChXZWJDb3JlOjpy
ZW1vdmVFdmVudExpc3RlbmVyRnJvbUxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6
cmVtb3ZlVjhFdmVudExpc3RlbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OnJlbW92
ZU9iamVjdEV2ZW50TGlzdGVuZXIpOgorICAgICAgICAoV2ViQ29yZTo6ZGlzY29ubmVjdEV2ZW50
TGlzdGVuZXJzSW5MaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmRpc2Nvbm5lY3RF
dmVudExpc3RlbmVycyk6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5Ojpjb21waWxlU2NyaXB0
KToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmhhbmRsZU91dE9mTWVtb3J5KToKKyAgICAg
ICAgKFdlYkNvcmU6OlY4UHJveHk6OmV2YWx1YXRlSW5OZXdXb3JsZCk6CisgICAgICAgIChXZWJD
b3JlOjpWOFByb3h5OjpldmFsdWF0ZUluTmV3Q29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpW
OFByb3h5OjpldmFsdWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5OjpydW5TY3JpcHQp
OgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6Y2FsbEZ1bmN0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OlY4UHJveHk6Om5ld0luc3RhbmNlKToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6
OmdldENvbnN0cnVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmNyZWF0ZVdyYXBw
ZXJGcm9tQ2FjaGUpOgorICAgICAgICAoV2ViQ29yZTo6R2V0VG9TdHJpbmdOYW1lKToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvbnN0cnVjdG9yVG9TdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6VjhQ
cm94eTo6Z2V0VGVtcGxhdGUpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6aXNDb250ZXh0
SW5pdGlhbGl6ZWQpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6cmV0cmlldmVXaW5kb3cp
OgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6cmV0cmlldmVGcmFtZSk6CisgICAgICAgIChX
ZWJDb3JlOjpWOFByb3h5OjpyZXRyaWV2ZUZyYW1lRm9yRW50ZXJlZENvbnRleHQpOgorICAgICAg
ICAoV2ViQ29yZTo6VjhQcm94eTo6cmV0cmlldmVGcmFtZUZvckN1cnJlbnRDb250ZXh0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29udGV4dCk6
CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5OjpyZXRyaWV2ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpWOFByb3h5OjpkaXNjb25uZWN0RnJhbWUpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6
aXNFbmFibGVkKToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OnVwZGF0ZURvY3VtZW50V3Jh
cHBlcik6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5OjpjbGVhckRvY3VtZW50V3JhcHBlcik6
CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5Ojp1cGRhdGVEb2N1bWVudFdyYXBwZXJDYWNoZSk6
CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5OjpjbGVhckRvY3VtZW50V3JhcHBlckNhY2hlKToK
KyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmRpc3Bvc2VDb250ZXh0SGFuZGxlcyk6CisgICAg
ICAgIChXZWJDb3JlOjpWOFByb3h5OjpjbGVhckZvckNsb3NlKToKKyAgICAgICAgKFdlYkNvcmU6
OlY4UHJveHk6OmNsZWFyRm9yTmF2aWdhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5
OjpzZXRTZWN1cml0eVRva2VuKToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OnVwZGF0ZURv
Y3VtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OnVwZGF0ZVNlY3VyaXR5T3JpZ2lu
KToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmNhbkFjY2Vzc1ByaXZhdGUpOgorICAgICAg
ICAoV2ViQ29yZTo6VjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUpOgorICAgICAgICAoV2ViQ29yZTo6
VjhQcm94eTo6Y2hlY2tOb2RlU2VjdXJpdHkpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6
Y3JlYXRlTmV3Q29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5OjppbnN0YWxsRE9N
V2luZG93KToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmluaXRDb250ZXh0SWZOZWVkZWQp
OgorICAgICAgICAoV2ViQ29yZTo6c2V0RE9NRXhjZXB0aW9uSGVscGVyKToKKyAgICAgICAgKFdl
YkNvcmU6OlY4UHJveHk6OnNldERPTUV4Y2VwdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpWOFBy
b3h5Ojp0aHJvd0Vycm9yKToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmNvbnRleHQpOgor
ICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6Y3VycmVudENvbnRleHQpOgorICAgICAgICAoV2Vi
Q29yZTo6VjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QpOgorICAgICAgICAoV2ViQ29yZTo6VjhQ
cm94eTo6c2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJv
eHk6OmRvbVdyYXBwZXJUeXBlKToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmNvbnZlcnRU
b05hdGl2ZU9iamVjdEltcGwpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6Y29udmVydFRv
U1ZHUE9EVHlwZUltcGwpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6bG9va3VwRE9NV3Jh
cHBlcik6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9k
ZUhlbHBlcik6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5Ojp3cmFwTmF0aXZlTm9kZUZpbHRl
cik6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5OjppbnN0YW50aWF0ZVY4T2JqZWN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmNoZWNrTmV3TGVnYWwpOgorICAgICAgICAoV2ViQ29y
ZTo6VjhQcm94eTo6c2V0RE9NV3JhcHBlcik6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5Ojpt
YXliZURPTVdyYXBwZXIpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6aXNET01FdmVudFdy
YXBwZXIpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6aXNXcmFwcGVyT2ZUeXBlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlY4UHJveHk6Omh0bWxFbGVtZW50VHlwZSk6CisgICAgICAgIChXZWJD
b3JlOjpWOFByb3h5OjpzdmdFbGVtZW50VHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5
Ojpjb252ZXJ0RXZlbnRUb1Y4T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmNv
bnZlcnROb2RlVG9WOE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5Ojpjb252ZXJ0
RXZlbnRUYXJnZXRUb1Y4T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmNvbnZl
cnRFdmVudExpc3RlbmVyVG9WOE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5Ojpj
b252ZXJ0RE9NSW1wbGVtZW50YXRpb25Ub1Y4T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlY4
UHJveHk6OmNvbnZlcnRTdHlsZVNoZWV0VG9WOE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpW
OFByb3h5Ojpjb252ZXJ0Q1NTVmFsdWVUb1Y4T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlY4
UHJveHk6OmNvbnZlcnRDU1NSdWxlVG9WOE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpWOFBy
b3h5Ojpjb252ZXJ0V2luZG93VG9WOE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5
OjpiaW5kSnNPYmplY3RUb1dpbmRvdyk6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5Ojpwcm9j
ZXNzQ29uc29sZU1lc3NhZ2VzKToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmNyZWF0ZVV0
aWxpdHlDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OnNvdXJjZUxpbmVOdW1i
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6c291cmNlTmFtZSk6CisgICAgICAgIChX
ZWJDb3JlOjpWOFByb3h5OjpyZWdpc3RlckV4dGVuc2lvbik6CisgICAgICAgIChXZWJDb3JlOjpW
OFByb3h5OjpzZXRDb250ZXh0RGVidWdJZCk6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5Ojpj
b250ZXh0RGVidWdJZCk6CisgICAgICAgICogYmluZGluZ3MvdjgvVjhQcm94eS5oOgorICAgICAg
ICAoV2ViQ29yZTo6KToKKyAgICAgICAgKFdlYkNvcmU6Okdsb2JhbEhhbmRsZUluZm86Okdsb2Jh
bEhhbmRsZUluZm8pOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6KToKKyAgICAgICAgKFdl
YkNvcmU6OlY4UHJveHk6OlY4UHJveHkpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6ZnJh
bWUpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6aW5saW5lQ29kZSk6CisgICAgICAgIChX
ZWJDb3JlOjpWOFByb3h5OjpzZXRJbmxpbmVDb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJv
eHk6OnRpbWVyQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6c2V0VGltZXJD
YWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5OjpzZXRFdmVudEhhbmRsZXJMaW5l
TnVtYmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmZpbmlzaGVkV2l0aEV2ZW50KToK
KyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OndyYXBDUG9pbnRlcik6CisgICAgICAgIChXZWJD
b3JlOjpWOFByb3h5OjpleHRyYWN0Q1BvaW50ZXIpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94
eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZSk6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5
Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5Ojpj
b252ZXJ0VG9WOE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3QpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6Y29udmVydFRvTmF0aXZl
RXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6VjhQcm94eTo6Y29udGV4dCk6CisgICAgICAgIChX
ZWJDb3JlOjpWOFByb3h5OjpleHRyYWN0Q1BvaW50ZXJJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6
OlY4UHJveHk6OnV0aWxpdHlDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OlY4UHJveHk6OmNv
bnN0cnVjdERPTU9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjp0aHJvd0Vycm9yKToKKyAgICAg
ICAgKFdlYkNvcmU6OnRvVjgpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1Y4VXRpbGl0aWVzLmg6
CisgICAgICAgICogYmluZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5LmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OldvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6cmV0cmlldmUp
OgorICAgICAgICAoV2ViQ29yZTo6V29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5Ojppbml0Q29u
dGV4dElmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6OldvcmtlckNvbnRleHRFeGVjdXRpb25Q
cm94eTo6R2V0Q29uc3RydWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6V29ya2VyQ29udGV4dEV4
ZWN1dGlvblByb3h5OjpUb1Y4T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OldvcmtlckNvbnRl
eHRFeGVjdXRpb25Qcm94eTo6RXZlbnRUb1Y4T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6Oldv
cmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6dG9WOCk6CisgICAgICAgIChXZWJDb3JlOjpXb3Jr
ZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OmZvcmdldFY4RXZlbnRPYmplY3QpOgorICAgICAgICAo
V2ViQ29yZTo6V29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpldmFsdWF0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OnJ1blNjcmlwdCk6CisgICAg
ICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4QXR0ckN1c3RvbS5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpBQ0NFU1NPUl9TRVRURVIpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOENT
U1N0eWxlRGVjbGFyYXRpb25DdXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6TkFNRURfUFJP
UEVSVFlfR0VUVEVSKToKKyAgICAgICAgKFdlYkNvcmU6Ok5BTUVEX1BST1BFUlRZX1NFVFRFUik6
CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2FudmFzUGl4ZWxBcnJheUN1c3RvbS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpJTkRFWEVEX1BST1BFUlRZX0dFVFRFUik6CisgICAgICAg
IChXZWJDb3JlOjpJTkRFWEVEX1BST1BFUlRZX1NFVFRFUik6CisgICAgICAgICogYmluZGluZ3Mv
djgvY3VzdG9tL1Y4Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEQ3VzdG9tLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OnRvVjgpOgorICAgICAgICAoV2ViQ29yZTo6dG9DYW52YXNTdHlsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpBQ0NFU1NPUl9HRVRURVIpOgorICAgICAgICAoV2ViQ29yZTo6QUNDRVNT
T1JfU0VUVEVSKToKKyAgICAgICAgKFdlYkNvcmU6OkNBTExCQUNLX0ZVTkNfREVDTCk6CisgICAg
ICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2xpZW50UmVjdExpc3RDdXN0b20uY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6SU5ERVhFRF9QUk9QRVJUWV9HRVRURVIpOgorICAgICAgICAqIGJpbmRp
bmdzL3Y4L2N1c3RvbS9WOENsaXBib2FyZEN1c3RvbS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpB
Q0NFU1NPUl9HRVRURVIpOgorICAgICAgICAoV2ViQ29yZTo6Q0FMTEJBQ0tfRlVOQ19ERUNMKToK
KyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21CaW5kaW5nLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OmFsbG93U2V0dGluZ0ZyYW1lU3JjVG9KYXZhc2NyaXB0VXJsKToKKyAgICAg
ICAgKFdlYkNvcmU6OkFDQ0VTU09SX0dFVFRFUik6CisgICAgICAgIChXZWJDb3JlOjpJTkRFWEVE
X0FDQ0VTU19DSEVDSyk6CisgICAgICAgIChXZWJDb3JlOjpOQU1FRF9BQ0NFU1NfQ0hFQ0spOgor
ICAgICAgICAoV2ViQ29yZTo6VjhDdXN0b206OkdldFRhcmdldEZyYW1lKToKKyAgICAgICAgKiBi
aW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21FdmVudExpc3RlbmVyLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlY4RXZlbnRMaXN0ZW5lcjo6VjhFdmVudExpc3RlbmVyKToKKyAgICAgICAgKFdlYkNv
cmU6OlY4RXZlbnRMaXN0ZW5lcjo6flY4RXZlbnRMaXN0ZW5lcik6CisgICAgICAgIChXZWJDb3Jl
OjpWOEV2ZW50TGlzdGVuZXI6OmNhbGxMaXN0ZW5lckZ1bmN0aW9uKToKKyAgICAgICAgKiBiaW5k
aW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxTdGF0ZW1lbnRDYWxsYmFjay5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpWOEN1c3RvbVNRTFN0YXRlbWVudENhbGxiYWNrOjpoYW5kbGVFdmVudCk6Cisg
ICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tU1FMU3RhdGVtZW50RXJyb3JDYWxs
YmFjay5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWOEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2Fs
bGJhY2s6OmhhbmRsZUV2ZW50KToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0
b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlY4Q3VzdG9t
U1FMVHJhbnNhY3Rpb25DYWxsYmFjazo6aGFuZGxlRXZlbnQpOgorICAgICAgICAqIGJpbmRpbmdz
L3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjay5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpWOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjazo6aGFuZGxl
RXZlbnQpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVZvaWRDYWxsYmFj
ay5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWOEN1c3RvbVZvaWRDYWxsYmFjazo6aGFuZGxlRXZl
bnQpOgorICAgICAgICAoV2ViQ29yZTo6aW52b2tlQ2FsbGJhY2spOgorICAgICAgICAqIGJpbmRp
bmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVhQYXRoTlNSZXNvbHZlci5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpWOEN1c3RvbVhQYXRoTlNSZXNvbHZlcjo6bG9va3VwTmFtZXNwYWNlVVJJKToKKyAgICAg
ICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhET01QYXJzZXJDb25zdHJ1Y3Rvci5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpDQUxMQkFDS19GVU5DX0RFQ0wpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4
L2N1c3RvbS9WOERPTVdpbmRvd0N1c3RvbS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWOEN1c3Rv
bTo6V2luZG93U2V0VGltZW91dEltcGwpOgorICAgICAgICAoV2ViQ29yZTo6Y29udmVydEJhc2U2
NCk6CisgICAgICAgIChXZWJDb3JlOjpBQ0NFU1NPUl9TRVRURVIpOgorICAgICAgICAoV2ViQ29y
ZTo6Q0FMTEJBQ0tfRlVOQ19ERUNMKToKKyAgICAgICAgKFdlYkNvcmU6OkFDQ0VTU09SX0dFVFRF
Uik6CisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVXaW5kb3cpOgorICAgICAgICAoV2ViQ29yZTo6
SU5ERVhFRF9QUk9QRVJUWV9HRVRURVIpOgorICAgICAgICAoV2ViQ29yZTo6TkFNRURfUFJPUEVS
VFlfR0VUVEVSKToKKyAgICAgICAgKFdlYkNvcmU6OlY4Q3VzdG9tOjpDbGVhclRpbWVvdXRJbXBs
KToKKyAgICAgICAgKFdlYkNvcmU6Ok5BTUVEX0FDQ0VTU19DSEVDSyk6CisgICAgICAgIChXZWJD
b3JlOjpJTkRFWEVEX0FDQ0VTU19DSEVDSyk6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9t
L1Y4RGF0YWJhc2VDdXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0FMTEJBQ0tfRlVOQ19E
RUNMKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhEb2N1bWVudEN1c3RvbS5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpDQUxMQkFDS19GVU5DX0RFQ0wpOgorICAgICAgICAqIGJpbmRp
bmdzL3Y4L2N1c3RvbS9WOERvY3VtZW50TG9jYXRpb25DdXN0b20uY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6QUNDRVNTT1JfR0VUVEVSKToKKyAgICAgICAgKFdlYkNvcmU6OkFDQ0VTU09SX1NFVFRF
Uik6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4RWxlbWVudEN1c3RvbS5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpDQUxMQkFDS19GVU5DX0RFQ0wpOgorICAgICAgICAoV2ViQ29yZTo6
QUNDRVNTT1JfU0VUVEVSKToKKyAgICAgICAgKFdlYkNvcmU6OkFDQ0VTU09SX0dFVFRFUik6Cisg
ICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4RXZlbnRDdXN0b20uY3BwOgorICAgICAgICAo
V2ViQ29yZTo6QUNDRVNTT1JfU0VUVEVSKToKKyAgICAgICAgKFdlYkNvcmU6OkFDQ0VTU09SX0dF
VFRFUik6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTENhbnZhc0VsZW1lbnRD
dXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0FMTEJBQ0tfRlVOQ19ERUNMKToKKyAgICAg
ICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MQ29sbGVjdGlvbkN1c3RvbS5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpnZXROYW1lZEl0ZW1zKToKKyAgICAgICAgKFdlYkNvcmU6OmdldEl0ZW0p
OgorICAgICAgICAoV2ViQ29yZTo6TkFNRURfUFJPUEVSVFlfR0VUVEVSKToKKyAgICAgICAgKFdl
YkNvcmU6OkNBTExCQUNLX0ZVTkNfREVDTCk6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9t
L1Y4SFRNTERvY3VtZW50Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok5BTUVEX1BST1BF
UlRZX0dFVFRFUik6CisgICAgICAgIChXZWJDb3JlOjpDQUxMQkFDS19GVU5DX0RFQ0wpOgorICAg
ICAgICAoV2ViQ29yZTo6QUNDRVNTT1JfR0VUVEVSKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9j
dXN0b20vVjhIVE1MRm9ybUVsZW1lbnRDdXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6SU5E
RVhFRF9QUk9QRVJUWV9HRVRURVIpOgorICAgICAgICAoV2ViQ29yZTo6TkFNRURfUFJPUEVSVFlf
R0VUVEVSKToKKyAgICAgICAgKFdlYkNvcmU6OkNBTExCQUNLX0ZVTkNfREVDTCk6CisgICAgICAg
ICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTEZyYW1lRWxlbWVudEN1c3RvbS5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpBQ0NFU1NPUl9TRVRURVIpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1
c3RvbS9WOEhUTUxGcmFtZVNldEVsZW1lbnRDdXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6
TkFNRURfUFJPUEVSVFlfR0VUVEVSKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhI
VE1MSUZyYW1lRWxlbWVudEN1c3RvbS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBQ0NFU1NPUl9T
RVRURVIpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxJbWFnZUVsZW1lbnRD
b25zdHJ1Y3Rvci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDQUxMQkFDS19GVU5DX0RFQ0wpOgor
ICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxJbnB1dEVsZW1lbnRDdXN0b20uY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6QUNDRVNTT1JfR0VUVEVSKToKKyAgICAgICAgKFdlYkNvcmU6
OkFDQ0VTU09SX1NFVFRFUik6CisgICAgICAgIChXZWJDb3JlOjpDQUxMQkFDS19GVU5DX0RFQ0wp
OgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxPcHRpb25FbGVtZW50Q29uc3Ry
dWN0b3IuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0FMTEJBQ0tfRlVOQ19ERUNMKToKKyAgICAg
ICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MT3B0aW9uc0NvbGxlY3Rpb25DdXN0b20uY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6Q0FMTEJBQ0tfRlVOQ19ERUNMKToKKyAgICAgICAgKFdlYkNv
cmU6OkFDQ0VTU09SX0dFVFRFUik6CisgICAgICAgIChXZWJDb3JlOjpBQ0NFU1NPUl9TRVRURVIp
OgorICAgICAgICAoV2ViQ29yZTo6SU5ERVhFRF9QUk9QRVJUWV9HRVRURVIpOgorICAgICAgICAo
V2ViQ29yZTo6SU5ERVhFRF9QUk9QRVJUWV9TRVRURVIpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4
L2N1c3RvbS9WOEhUTUxQbHVnSW5FbGVtZW50Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
Ok5BTUVEX1BST1BFUlRZX0dFVFRFUik6CisgICAgICAgIChXZWJDb3JlOjpOQU1FRF9QUk9QRVJU
WV9TRVRURVIpOgorICAgICAgICAoV2ViQ29yZTo6SU5ERVhFRF9QUk9QRVJUWV9HRVRURVIpOgor
ICAgICAgICAoV2ViQ29yZTo6SU5ERVhFRF9QUk9QRVJUWV9TRVRURVIpOgorICAgICAgICAqIGJp
bmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxTZWxlY3RFbGVtZW50Q29sbGVjdGlvbkN1c3RvbS5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpOQU1FRF9QUk9QRVJUWV9HRVRURVIpOgorICAgICAgICAoV2Vi
Q29yZTo6SU5ERVhFRF9QUk9QRVJUWV9TRVRURVIpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1
c3RvbS9WOEhUTUxTZWxlY3RFbGVtZW50Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNB
TExCQUNLX0ZVTkNfREVDTCk6CisgICAgICAgIChXZWJDb3JlOjpyZW1vdmVFbGVtZW50KToKKyAg
ICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhJbnNwZWN0b3JDb250cm9sbGVyQ3VzdG9tLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OkNBTExCQUNLX0ZVTkNfREVDTCk6CisgICAgICAgICogYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4TG9jYXRpb25DdXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6
QUNDRVNTT1JfU0VUVEVSKToKKyAgICAgICAgKFdlYkNvcmU6OkFDQ0VTU09SX0dFVFRFUik6Cisg
ICAgICAgIChXZWJDb3JlOjpDQUxMQkFDS19GVU5DX0RFQ0wpOgorICAgICAgICAoV2ViQ29yZTo6
SU5ERVhFRF9BQ0NFU1NfQ0hFQ0spOgorICAgICAgICAoV2ViQ29yZTo6TkFNRURfQUNDRVNTX0NI
RUNLKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhNZXNzYWdlQ2hhbm5lbENvbnN0
cnVjdG9yLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNBTExCQUNLX0ZVTkNfREVDTCk6CisgICAg
ICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZVBvcnRDdXN0b20uY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6QUNDRVNTT1JfR0VUVEVSKToKKyAgICAgICAgKFdlYkNvcmU6OkFDQ0VTU09S
X1NFVFRFUik6CisgICAgICAgIChXZWJDb3JlOjpDQUxMQkFDS19GVU5DX0RFQ0wpOgorICAgICAg
ICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOE5hbWVkTm9kZU1hcEN1c3RvbS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpJTkRFWEVEX1BST1BFUlRZX0dFVFRFUik6CisgICAgICAgIChXZWJDb3JlOjpO
QU1FRF9QUk9QRVJUWV9HRVRURVIpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOE5h
dmlnYXRvckN1c3RvbS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBQ0NFU1NPUl9HRVRURVIpOgor
ICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOE5vZGVDdXN0b20uY3BwOgorICAgICAgICAo
V2ViQ29yZTo6Q0FMTEJBQ0tfRlVOQ19ERUNMKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0
b20vVjhOb2RlSXRlcmF0b3JDdXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6dG9WOCk6Cisg
ICAgICAgIChXZWJDb3JlOjpDQUxMQkFDS19GVU5DX0RFQ0wpOgorICAgICAgICAqIGJpbmRpbmdz
L3Y4L2N1c3RvbS9WOE5vZGVMaXN0Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok5BTUVE
X1BST1BFUlRZX0dFVFRFUik6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMUmVz
dWx0U2V0Um93TGlzdEN1c3RvbS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDQUxMQkFDS19GVU5D
X0RFQ0wpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOFNRTFRyYW5zYWN0aW9uQ3Vz
dG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNBTExCQUNLX0ZVTkNfREVDTCk6CisgICAgICAg
ICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1ZHRWxlbWVudEluc3RhbmNlQ3VzdG9tLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkNBTExCQUNLX0ZVTkNfREVDTCk6CisgICAgICAgICogYmluZGluZ3Mv
djgvY3VzdG9tL1Y4U1ZHTGVuZ3RoQ3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkFDQ0VT
U09SX0dFVFRFUik6CisgICAgICAgIChXZWJDb3JlOjpDQUxMQkFDS19GVU5DX0RFQ0wpOgorICAg
ICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOFNWR01hdHJpeEN1c3RvbS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpDQUxMQkFDS19GVU5DX0RFQ0wpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1
c3RvbS9WOFN0eWxlU2hlZXRMaXN0Q3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok5BTUVE
X1BST1BFUlRZX0dFVFRFUik6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4VHJlZVdh
bGtlckN1c3RvbS5jcHA6CisgICAgICAgIChXZWJDb3JlOjp0b1Y4KToKKyAgICAgICAgKFdlYkNv
cmU6OkNBTExCQUNLX0ZVTkNfREVDTCk6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4
V2ViS2l0Q1NTTWF0cml4Q29uc3RydWN0b3IuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0FMTEJB
Q0tfRlVOQ19ERUNMKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhXZWJLaXRQb2lu
dENvbnN0cnVjdG9yLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNBTExCQUNLX0ZVTkNfREVDTCk6
CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4V29ya2VyQ29udGV4dEN1c3RvbS5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpBQ0NFU1NPUl9HRVRURVIpOgorICAgICAgICAoV2ViQ29yZTo6
QUNDRVNTT1JfU0VUVEVSKToKKyAgICAgICAgKFdlYkNvcmU6OlNldFRpbWVvdXRPckludGVydmFs
KToKKyAgICAgICAgKFdlYkNvcmU6OkNBTExCQUNLX0ZVTkNfREVDTCk6CisgICAgICAgICogYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4V29ya2VyQ3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNB
TExCQUNLX0ZVTkNfREVDTCk6CisgICAgICAgIChXZWJDb3JlOjpnZXRFdmVudExpc3RlbmVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkFDQ0VTU09SX0dFVFRFUik6CisgICAgICAgIChXZWJDb3JlOjpB
Q0NFU1NPUl9TRVRURVIpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOFhNTEh0dHBS
ZXF1ZXN0Q29uc3RydWN0b3IuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0FMTEJBQ0tfRlVOQ19E
RUNMKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVzdEN1c3Rv
bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpnZXRFdmVudExpc3RlbmVyKToKKyAgICAgICAgKFdl
YkNvcmU6OkFDQ0VTU09SX0dFVFRFUik6CisgICAgICAgIChXZWJDb3JlOjpBQ0NFU1NPUl9TRVRU
RVIpOgorICAgICAgICAoV2ViQ29yZTo6Q0FMTEJBQ0tfRlVOQ19ERUNMKToKKyAgICAgICAgKiBi
aW5kaW5ncy92OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVzdFVwbG9hZEN1c3RvbS5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpBQ0NFU1NPUl9HRVRURVIpOgorICAgICAgICAoV2ViQ29yZTo6QUNDRVNT
T1JfU0VUVEVSKToKKyAgICAgICAgKFdlYkNvcmU6OkNBTExCQUNLX0ZVTkNfREVDTCk6CisgICAg
ICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MU2VyaWFsaXplckNvbnN0cnVjdG9yLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkNBTExCQUNLX0ZVTkNfREVDTCk6CisgICAgICAgICogYmluZGlu
Z3MvdjgvY3VzdG9tL1Y4WFBhdGhFdmFsdWF0b3JDb25zdHJ1Y3Rvci5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpDQUxMQkFDS19GVU5DX0RFQ0wpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3Rv
bS9WOFhTTFRQcm9jZXNzb3JDdXN0b20uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0FMTEJBQ0tf
RlVOQ19ERUNMKToKKwogMjAwOS0wNi0yNSAgQWxiZXJ0IEouIFdvbmcgIDxhandvbmdAY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEZpc2hlci4KSW5kZXg6IFdlYkNv
cmUvYmluZGluZ3MvdjgvU2NoZWR1bGVkQWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L1NjaGVkdWxlZEFjdGlvbi5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2Vi
Q29yZS9iaW5kaW5ncy92OC9TY2hlZHVsZWRBY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01
MCw3ICs1MCw3IEBAIFNjaGVkdWxlZEFjdGlvbjo6U2NoZWR1bGVkQWN0aW9uKHY4OjpIYW4KICAg
ICBtX2Z1bmN0aW9uID0gdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uPjo6TmV3KGZ1bmMpOwog
CiAjaWZuZGVmIE5ERUJVRwotICAgIFY4UHJveHk6OlJlZ2lzdGVyR2xvYmFsSGFuZGxlKFNDSEVE
VUxFRF9BQ1RJT04sIHRoaXMsIG1fZnVuY3Rpb24pOworICAgIFY4UHJveHk6OnJlZ2lzdGVyR2xv
YmFsSGFuZGxlKFNDSEVEVUxFRF9BQ1RJT04sIHRoaXMsIG1fZnVuY3Rpb24pOwogI2VuZGlmCiAK
ICAgICBtX2FyZ2MgPSBhcmdjOwpAQCAtNjAsNyArNjAsNyBAQCBTY2hlZHVsZWRBY3Rpb246OlNj
aGVkdWxlZEFjdGlvbih2ODo6SGFuCiAgICAgICAgICAgICBtX2FyZ3ZbaV0gPSB2ODo6UGVyc2lz
dGVudDx2ODo6VmFsdWU+OjpOZXcoYXJndltpXSk7CiAKICNpZm5kZWYgTkRFQlVHCi0gICAgVjhQ
cm94eTo6UmVnaXN0ZXJHbG9iYWxIYW5kbGUoU0NIRURVTEVEX0FDVElPTiwgdGhpcywgbV9hcmd2
W2ldKTsKKyAgICBWOFByb3h5OjpyZWdpc3Rlckdsb2JhbEhhbmRsZShTQ0hFRFVMRURfQUNUSU9O
LCB0aGlzLCBtX2FyZ3ZbaV0pOwogI2VuZGlmCiAgICAgICAgIH0KICAgICB9IGVsc2UKQEAgLTcz
LDEzICs3MywxMyBAQCBTY2hlZHVsZWRBY3Rpb246On5TY2hlZHVsZWRBY3Rpb24oKQogICAgICAg
ICByZXR1cm47CiAKICNpZm5kZWYgTkRFQlVHCi0gICAgVjhQcm94eTo6VW5yZWdpc3Rlckdsb2Jh
bEhhbmRsZSh0aGlzLCBtX2Z1bmN0aW9uKTsKKyAgICBWOFByb3h5Ojp1bnJlZ2lzdGVyR2xvYmFs
SGFuZGxlKHRoaXMsIG1fZnVuY3Rpb24pOwogI2VuZGlmCiAgICAgbV9mdW5jdGlvbi5EaXNwb3Nl
KCk7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fYXJnYzsgaSsrKSB7CiAjaWZuZGVmIE5E
RUJVRwotICAgICAgICBWOFByb3h5OjpVbnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMsIG1fYXJn
dltpXSk7CisgICAgICAgIFY4UHJveHk6OnVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9h
cmd2W2ldKTsKICNlbmRpZgogICAgICAgICBtX2FyZ3ZbaV0uRGlzcG9zZSgpOwogICAgIH0KQEAg
LTEwNiw3ICsxMDYsNyBAQCB2b2lkIFNjaGVkdWxlZEFjdGlvbjo6ZXhlY3V0ZShWOFByb3h5KiBw
CiAgICAgQVNTRVJUKHByb3h5KTsKIAogICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsK
LSAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9IHByb3h5LT5HZXRDb250ZXh0
KCk7CisgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSBwcm94eS0+Y29udGV4
dCgpOwogICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47IC8vIEpT
IG1heSBub3QgYmUgZW5hYmxlZC4KIApAQCAtMTE2LDcgKzExNiw3IEBAIHZvaWQgU2NoZWR1bGVk
QWN0aW9uOjpleGVjdXRlKFY4UHJveHkqIHAKIAogICAgIC8vIEZJWE1FOiBOZWVkIHRvIGltcGxl
bWVudCB0aW1lb3V0cyBmb3IgcHJlZW1wdGluZyBhIGxvbmctcnVubmluZyBzY3JpcHQuCiAgICAg
aWYgKCFtX2Z1bmN0aW9uLklzRW1wdHkoKSAmJiBtX2Z1bmN0aW9uLT5Jc0Z1bmN0aW9uKCkpIHsK
LSAgICAgICAgcHJveHktPkNhbGxGdW5jdGlvbih2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+
OjpDYXN0KG1fZnVuY3Rpb24pLCB2OENvbnRleHQtPkdsb2JhbCgpLCBtX2FyZ2MsIG1fYXJndik7
CisgICAgICAgIHByb3h5LT5jYWxsRnVuY3Rpb24odjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9u
Pjo6Q2FzdChtX2Z1bmN0aW9uKSwgdjhDb250ZXh0LT5HbG9iYWwoKSwgbV9hcmdjLCBtX2FyZ3Yp
OwogICAgICAgICBEb2N1bWVudDo6dXBkYXRlU3R5bGVGb3JBbGxEb2N1bWVudHMoKTsKICAgICB9
IGVsc2UKICAgICAgICAgcHJveHktPmV2YWx1YXRlKG1fY29kZSwgMCk7CkluZGV4OiBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L1NjcmlwdENhbGxTdGFjay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9i
aW5kaW5ncy92OC9TY3JpcHRDYWxsU3RhY2suY3BwCShyZXZpc2lvbiA0NTIxNikKKysrIFdlYkNv
cmUvYmluZGluZ3MvdjgvU2NyaXB0Q2FsbFN0YWNrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzks
NyArMzksNyBAQAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBTY3JpcHRDYWxsU3RhY2s6OlNjcmlw
dENhbGxTdGFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcmd1bWVudHMsIHVuc2lnbmVkIHNraXBB
cmd1bWVudENvdW50KQotICAgIDogbV9sYXN0Q2FsbGVyKFN0cmluZygpLCBWOFByb3h5OjpHZXRT
b3VyY2VOYW1lKCksIFY4UHJveHk6OkdldFNvdXJjZUxpbmVOdW1iZXIoKSArIDEsIGFyZ3VtZW50
cywgc2tpcEFyZ3VtZW50Q291bnQpCisgICAgOiBtX2xhc3RDYWxsZXIoU3RyaW5nKCksIFY4UHJv
eHk6OnNvdXJjZU5hbWUoKSwgVjhQcm94eTo6c291cmNlTGluZU51bWJlcigpICsgMSwgYXJndW1l
bnRzLCBza2lwQXJndW1lbnRDb3VudCkKICAgICAsIG1fc2NyaXB0U3RhdGUobmV3IFNjcmlwdFN0
YXRlKFY4UHJveHk6OnJldHJpZXZlRnJhbWUoKSkpCiB7CiB9CkluZGV4OiBXZWJDb3JlL2JpbmRp
bmdzL3Y4L1NjcmlwdENvbnRyb2xsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGlu
Z3MvdjgvU2NyaXB0Q29udHJvbGxlci5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9i
aW5kaW5ncy92OC9TY3JpcHRDb250cm9sbGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzIsMTcg
KzcyLDE3IEBAIEZyYW1lKiBTY3JpcHRDb250cm9sbGVyOjpyZXRyaWV2ZUZyYW1lRm8KIAogYm9v
bCBTY3JpcHRDb250cm9sbGVyOjppc1NhZmVTY3JpcHQoRnJhbWUqIHRhcmdldCkKIHsKLSAgICBy
ZXR1cm4gVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUodGFyZ2V0LCB0cnVlKTsKKyAgICByZXR1cm4g
VjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUodGFyZ2V0LCB0cnVlKTsKIH0KIAogdm9pZCBTY3JpcHRD
b250cm9sbGVyOjpnY1Byb3RlY3RKU1dyYXBwZXIodm9pZCogZG9tT2JqZWN0KQogewotICAgIFY4
UHJveHk6OkdDUHJvdGVjdChkb21PYmplY3QpOworICAgIFY4UHJveHk6OmdjUHJvdGVjdChkb21P
YmplY3QpOwogfQogCiB2b2lkIFNjcmlwdENvbnRyb2xsZXI6OmdjVW5wcm90ZWN0SlNXcmFwcGVy
KHZvaWQqIGRvbU9iamVjdCkKIHsKLSAgICBWOFByb3h5OjpHQ1VucHJvdGVjdChkb21PYmplY3Qp
OworICAgIFY4UHJveHk6OmdjVW5wcm90ZWN0KGRvbU9iamVjdCk7CiB9CiAKIFNjcmlwdENvbnRy
b2xsZXI6OlNjcmlwdENvbnRyb2xsZXIoRnJhbWUqIGZyYW1lKQpAQCAtMTQ0LDE4ICsxNDQsMTgg
QEAgYm9vbCBTY3JpcHRDb250cm9sbGVyOjpwcm9jZXNzaW5nVXNlckdlcwogICAgIFY4UHJveHkq
IGFjdGl2ZVByb3h5ID0gYWN0aXZlRnJhbWUtPnNjcmlwdCgpLT5wcm94eSgpOwogCiAgICAgdjg6
OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNv
bnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KGFjdGl2ZUZyYW1lKTsKKyAgICB2ODo6SGFuZGxl
PHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KGFjdGl2ZUZyYW1lKTsK
ICAgICAvLyBGSVhNRTogZmluZCBhbGwgY2FzZXMgY29udGV4dCBjYW4gYmUgZW1wdHk6CiAgICAg
Ly8gIDEpIEpTIGlzIGRpc2FibGVkOwogICAgIC8vICAyKSBwYWdlIGlzIE5VTEw7Ci0gICAgaWYg
KGNvbnRleHQuSXNFbXB0eSgpKQorICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQogICAgICAg
ICByZXR1cm4gdHJ1ZTsKIAotICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsK
KyAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUodjhDb250ZXh0KTsKIAotICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gZ2xvYmFsID0gY29udGV4dC0+R2xvYmFsKCk7CisgICAgdjg6OkhhbmRs
ZTx2ODo6T2JqZWN0PiBnbG9iYWwgPSB2OENvbnRleHQtPkdsb2JhbCgpOwogICAgIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBqc0V2ZW50ID0gZ2xvYmFsLT5HZXQodjg6OlN0cmluZzo6TmV3U3ltYm9s
KCJldmVudCIpKTsKLSAgICBFdmVudCogZXZlbnQgPSBWOFByb3h5OjpUb05hdGl2ZUV2ZW50KGpz
RXZlbnQpOworICAgIEV2ZW50KiBldmVudCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZUV2ZW50
KGpzRXZlbnQpOwogCiAgICAgLy8gQmFzZWQgb24gY29kZSBmcm9tIGtqc19iaW5kaW5ncy5jcHAu
CiAgICAgLy8gTm90ZTogVGhpcyBpcyBtb3JlIGxpYmVyYWwgdGhhbiBGaXJlZm94J3MgaW1wbGVt
ZW50YXRpb24uCkBAIC0xOTksMTEgKzE5OSwxMSBAQCBTY3JpcHRWYWx1ZSBTY3JpcHRDb250cm9s
bGVyOjpldmFsdWF0ZShjCiAgICAgfQogCiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3Bl
OwotICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5OjpHZXRDb250
ZXh0KG1fcHJveHktPmZyYW1lKCkpOwotICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICB2
ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KG1fcHJv
eHktPmZyYW1lKCkpOworICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1
cm4gU2NyaXB0VmFsdWUoKTsKIAotICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0
KTsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUodjhDb250ZXh0KTsKIAogICAgIFJlZlB0
cjxGcmFtZT4gcHJvdGVjdChtX2ZyYW1lKTsKIApAQCAtMjIxLDcgKzIyMSw3IEBAIFNjcmlwdFZh
bHVlIFNjcmlwdENvbnRyb2xsZXI6OmV2YWx1YXRlKGMKIAogdm9pZCBTY3JpcHRDb250cm9sbGVy
OjpzZXRFdmVudEhhbmRsZXJMaW5lTnVtYmVyKGludCBsaW5lTnVtYmVyKQogewotICAgIG1fcHJv
eHktPnNldEV2ZW50SGFuZGxlckxpbmVubyhsaW5lTnVtYmVyKTsKKyAgICBtX3Byb3h5LT5zZXRF
dmVudEhhbmRsZXJMaW5lTnVtYmVyKGxpbmVOdW1iZXIpOwogfQogCiB2b2lkIFNjcmlwdENvbnRy
b2xsZXI6OmZpbmlzaGVkV2l0aEV2ZW50KEV2ZW50KiBldmVudCkKQEAgLTIzNCwzNCArMjM0LDM0
IEBAIHZvaWQgU2NyaXB0Q29udHJvbGxlcjo6YmluZFRvV2luZG93T2JqZWMKIHsKICAgICB2ODo6
SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CiAKLSAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBj
b250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChmcmFtZSk7Ci0gICAgaWYgKGNvbnRleHQuSXNF
bXB0eSgpKQorICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9IFY4UHJveHk6
OmNvbnRleHQoZnJhbWUpOworICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICBy
ZXR1cm47CiAKLSAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisgICAgdjg6
OkNvbnRleHQ6OlNjb3BlIHNjb3BlKHY4Q29udGV4dCk7CiAKICAgICB2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+IHZhbHVlID0gQ3JlYXRlVjhPYmplY3RGb3JOUE9iamVjdChvYmplY3QsIDApOwogCiAg
ICAgLy8gQXR0YWNoIHRvIHRoZSBnbG9iYWwgb2JqZWN0LgotICAgIHY4OjpIYW5kbGU8djg6Ok9i
amVjdD4gZ2xvYmFsID0gY29udGV4dC0+R2xvYmFsKCk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0PiBnbG9iYWwgPSB2OENvbnRleHQtPkdsb2JhbCgpOwogICAgIGdsb2JhbC0+U2V0KHY4U3Ry
aW5nKGtleSksIHZhbHVlKTsKIH0KIAogdm9pZCBTY3JpcHRDb250cm9sbGVyOjpjb2xsZWN0R2Fy
YmFnZSgpCiB7CiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpIYW5k
bGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KG1fcHJveHktPmZy
YW1lKCkpOwotICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICB2ODo6SGFuZGxlPHY4OjpD
b250ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KG1fcHJveHktPmZyYW1lKCkpOwor
ICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKLSAgICB2ODo6
Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNj
b3BlKHY4Q29udGV4dCk7CiAKICAgICBtX3Byb3h5LT5ldmFsdWF0ZShTY3JpcHRTb3VyY2VDb2Rl
KCJpZiAod2luZG93LmdjKSB2b2lkKGdjKCkpOyIpLCAwKTsKIH0KIAogYm9vbCBTY3JpcHRDb250
cm9sbGVyOjpoYXZlSW50ZXJwcmV0ZXIoKSBjb25zdAogewotICAgIHJldHVybiBtX3Byb3h5LT5D
b250ZXh0SW5pdGlhbGl6ZWQoKTsKKyAgICByZXR1cm4gbV9wcm94eS0+aXNDb250ZXh0SW5pdGlh
bGl6ZWQoKTsKIH0KIAogYm9vbCBTY3JpcHRDb250cm9sbGVyOjppc0VuYWJsZWQoKSBjb25zdApA
QCAtMzMxLDEzICszMzEsMTMgQEAgc3RhdGljIE5QT2JqZWN0KiBjcmVhdGVOb1NjcmlwdE9iamVj
dCgpCiBzdGF0aWMgTlBPYmplY3QqIGNyZWF0ZVNjcmlwdE9iamVjdChGcmFtZSogZnJhbWUpCiB7
CiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpIYW5kbGU8djg6OkNv
bnRleHQ+IGNvbnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KGZyYW1lKTsKLSAgICBpZiAoY29u
dGV4dC5Jc0VtcHR5KCkpCisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gdjhDb250ZXh0ID0g
VjhQcm94eTo6Y29udGV4dChmcmFtZSk7CisgICAgaWYgKHY4Q29udGV4dC5Jc0VtcHR5KCkpCiAg
ICAgICAgIHJldHVybiBjcmVhdGVOb1NjcmlwdE9iamVjdCgpOwogCi0gICAgdjg6OkNvbnRleHQ6
OlNjb3BlIHNjb3BlKGNvbnRleHQpOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZSh2OENv
bnRleHQpOwogICAgIERPTVdpbmRvdyogd2luZG93ID0gZnJhbWUtPmRvbVdpbmRvdygpOwotICAg
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiBnbG9iYWwgPSBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCB3aW5kb3cpOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBn
bG9iYWwgPSBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkRPTVdJTkRP
Vywgd2luZG93KTsKICAgICBBU1NFUlQoZ2xvYmFsLT5Jc09iamVjdCgpKTsKICAgICByZXR1cm4g
bnBDcmVhdGVWOFNjcmlwdE9iamVjdCgwLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KGds
b2JhbCksIHdpbmRvdyk7CiB9CkBAIC0zNjgsMTMgKzM2OCwxMyBAQCBOUE9iamVjdCogU2NyaXB0
Q29udHJvbGxlcjo6Y3JlYXRlU2NyaXB0CiAgICAgICAgIHJldHVybiBjcmVhdGVOb1NjcmlwdE9i
amVjdCgpOwogCiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwotICAgIHY4OjpIYW5k
bGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KG1fZnJhbWUpOwot
ICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB2
OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KG1fZnJhbWUpOworICAgIGlmICh2OENvbnRleHQu
SXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gY3JlYXRlTm9TY3JpcHRPYmplY3QoKTsKLSAgICB2
ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3Bl
IHNjb3BlKHY4Q29udGV4dCk7CiAKICAgICBET01XaW5kb3cqIHdpbmRvdyA9IG1fZnJhbWUtPmRv
bVdpbmRvdygpOwotICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OHBsdWdpbiA9IFY4UHJveHk6
OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpIVE1MRU1CRURFTEVNRU5ULCBwbHVnaW4pOworICAg
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OHBsdWdpbiA9IFY4UHJveHk6OmNvbnZlcnRUb1Y4T2Jq
ZWN0KFY4Q2xhc3NJbmRleDo6SFRNTEVNQkVERUxFTUVOVCwgcGx1Z2luKTsKICAgICBpZiAoIXY4
cGx1Z2luLT5Jc09iamVjdCgpKQogICAgICAgICByZXR1cm4gY3JlYXRlTm9TY3JpcHRPYmplY3Qo
KTsKIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9TY3JpcHRJbnN0YW5jZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9TY3JpcHRJbnN0YW5jZS5jcHAJKHJldmlzaW9u
IDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9TY3JpcHRJbnN0YW5jZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTYyLDcgKzYyLDcgQEAgdm9pZCBWOFNjcmlwdEluc3RhbmNlOjpjbGVhcigp
CiAgICAgaWYgKG1faW5zdGFuY2UuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAjaWZuZGVm
IE5ERUJVRwotICAgIFY4UHJveHk6OlVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9pbnN0
YW5jZSk7CisgICAgVjhQcm94eTo6dW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBtX2luc3Rh
bmNlKTsKICNlbmRpZgogICAgIG1faW5zdGFuY2UuRGlzcG9zZSgpOwogICAgIG1faW5zdGFuY2Uu
Q2xlYXIoKTsKQEAgLTc2LDcgKzc2LDcgQEAgdm9pZCBWOFNjcmlwdEluc3RhbmNlOjpzZXQodjg6
OkhhbmRsZTx2OAogCiAgICAgbV9pbnN0YW5jZSA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+
OjpOZXcoaW5zdGFuY2UpOwogI2lmbmRlZiBOREVCVUcKLSAgICBWOFByb3h5OjpSZWdpc3Rlckds
b2JhbEhhbmRsZShTQ1JJUFRJTlNUQU5DRSwgdGhpcywgbV9pbnN0YW5jZSk7CisgICAgVjhQcm94
eTo6cmVnaXN0ZXJHbG9iYWxIYW5kbGUoU0NSSVBUSU5TVEFOQ0UsIHRoaXMsIG1faW5zdGFuY2Up
OwogI2VuZGlmCiB9CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvU2NyaXB0T2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjcmlwdE9iamVjdC5jcHAJKHJl
dmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9TY3JpcHRPYmplY3QuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xMTksNyArMTE5LDcgQEAgYm9vbCBTY3JpcHRHbG9iYWxPYmplY3Q6
OnNldChTY3JpcHRTdGF0ZQogYm9vbCBTY3JpcHRHbG9iYWxPYmplY3Q6OnNldChTY3JpcHRTdGF0
ZSogc2NyaXB0U3RhdGUsIGNvbnN0IGNoYXIqIG5hbWUsIEluc3BlY3RvckNvbnRyb2xsZXIqIHZh
bHVlKQogewogICAgIFNjcmlwdFNjb3BlIHNjb3BlKHNjcmlwdFN0YXRlKTsKLSAgICBzY29wZS5n
bG9iYWwoKS0+U2V0KHY4OjpTdHJpbmc6Ok5ldyhuYW1lKSwgVjhQcm94eTo6VG9WOE9iamVjdChW
OENsYXNzSW5kZXg6OklOU1BFQ1RPUkNPTlRST0xMRVIsIHZhbHVlKSk7CisgICAgc2NvcGUuZ2xv
YmFsKCktPlNldCh2ODo6U3RyaW5nOjpOZXcobmFtZSksIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2Jq
ZWN0KFY4Q2xhc3NJbmRleDo6SU5TUEVDVE9SQ09OVFJPTExFUiwgdmFsdWUpKTsKICAgICByZXR1
cm4gc2NvcGUuc3VjY2VzcygpOwogfQogCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Njcmlw
dE9iamVjdFF1YXJhbnRpbmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mvdjgv
U2NyaXB0T2JqZWN0UXVhcmFudGluZS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9i
aW5kaW5ncy92OC9TY3JpcHRPYmplY3RRdWFyYW50aW5lLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NzcsMTAgKzc3LDEwIEBAIGJvb2wgZ2V0UXVhcmFudGluZWRTY3JpcHRPYmplY3QoTm9kZSogbm8K
ICAgICBBU1NFUlQobm9kZSk7CiAKICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7Ci0g
ICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChu
b2RlLT5kb2N1bWVudCgpLT5wYWdlKCktPm1haW5GcmFtZSgpKTsKKyAgICB2ODo6TG9jYWw8djg6
OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KG5vZGUtPmRvY3VtZW50KCktPnBh
Z2UoKS0+bWFpbkZyYW1lKCkpOwogICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0
KTsKIAotICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2OE5vZGUgPSBWOFByb3h5OjpOb2RlVG9W
OE9iamVjdChub2RlKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdjhOb2RlID0gVjhQcm94
eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KG5vZGUpOwogICAgIHF1YXJhbnRpbmVkT2JqZWN0ID0g
U2NyaXB0T2JqZWN0KHY4OjpMb2NhbDx2ODo6T2JqZWN0Pih2ODo6T2JqZWN0OjpDYXN0KCp2OE5v
ZGUpKSk7CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTkxLDEwICs5MSwxMCBAQCBib29sIGdldFF1
YXJhbnRpbmVkU2NyaXB0T2JqZWN0KERPTVdpbmRvCiAgICAgQVNTRVJUKGRvbVdpbmRvdyk7CiAK
ICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7Ci0gICAgdjg6OkxvY2FsPHY4OjpDb250
ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChkb21XaW5kb3ctPmZyYW1lKCkpOwor
ICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQoZG9t
V2luZG93LT5mcmFtZSgpKTsKICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7
CiAKLSAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdjhEb21XaW5kb3cgPSBWOFByb3h5OjpUb1Y4
T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBkb21XaW5kb3cpOworICAgIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiB2OERvbVdpbmRvdyA9IFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4
Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBkb21XaW5kb3cpOwogICAgIHF1YXJhbnRpbmVkT2JqZWN0
ID0gU2NyaXB0T2JqZWN0KHY4OjpMb2NhbDx2ODo6T2JqZWN0Pih2ODo6T2JqZWN0OjpDYXN0KCp2
OERvbVdpbmRvdykpKTsKIAogICAgIHJldHVybiB0cnVlOwpJbmRleDogV2ViQ29yZS9iaW5kaW5n
cy92OC9TY3JpcHRTY29wZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9T
Y3JpcHRTY29wZS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9T
Y3JpcHRTY29wZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQzLDcgKzQzLDcgQEAKIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIAogU2NyaXB0U2NvcGU6OlNjcmlwdFNjb3BlKFNjcmlwdFN0YXRlKiBzY3Jp
cHRTdGF0ZSwgYm9vbCByZXBvcnRFeGNlcHRpb25zKQotICAgIDogbV9jb250ZXh0KFY4UHJveHk6
OkdldENvbnRleHQoc2NyaXB0U3RhdGUtPmZyYW1lKCkpKQorICAgIDogbV9jb250ZXh0KFY4UHJv
eHk6OmNvbnRleHQoc2NyaXB0U3RhdGUtPmZyYW1lKCkpKQogICAgICwgbV9zY29wZShtX2NvbnRl
eHQpCiAgICAgLCBtX3NjcmlwdFN0YXRlKHNjcmlwdFN0YXRlKQogICAgICwgbV9yZXBvcnRFeGNl
cHRpb25zKHJlcG9ydEV4Y2VwdGlvbnMpCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Njcmlw
dFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9TY3JpcHRWYWx1ZS5o
CShyZXZpc2lvbiA0NTIxNikKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvU2NyaXB0VmFsdWUuaAko
d29ya2luZyBjb3B5KQpAQCAtNTMsNyArNTMsNyBAQCBwdWJsaWM6CiAKICAgICAgICAgbV92YWx1
ZSA9IHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT46Ok5ldyh2YWx1ZSk7CiAjaWZuZGVmIE5ERUJV
RwotICAgICAgICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhhbmRsZShTQ1JJUFRWQUxVRSwgdGhp
cywgbV92YWx1ZSk7CisgICAgICAgIFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxlKFNDUklQ
VFZBTFVFLCB0aGlzLCBtX3ZhbHVlKTsKICNlbmRpZgogICAgIH0KIApAQCAtNjQsNyArNjQsNyBA
QCBwdWJsaWM6CiAKICAgICAgICAgbV92YWx1ZSA9IHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT46
Ok5ldyh2YWx1ZS5tX3ZhbHVlKTsKICNpZm5kZWYgTkRFQlVHCi0gICAgICAgIFY4UHJveHk6OlJl
Z2lzdGVyR2xvYmFsSGFuZGxlKFNDUklQVFZBTFVFLCB0aGlzLCBtX3ZhbHVlKTsKKyAgICAgICAg
VjhQcm94eTo6cmVnaXN0ZXJHbG9iYWxIYW5kbGUoU0NSSVBUVkFMVUUsIHRoaXMsIG1fdmFsdWUp
OwogI2VuZGlmCiAgICAgfQogCkBAIC04MCw3ICs4MCw3IEBAIHB1YmxpYzoKIAogICAgICAgICBt
X3ZhbHVlID0gdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPjo6TmV3KHZhbHVlLm1fdmFsdWUpOwog
I2lmbmRlZiBOREVCVUcKLSAgICAgICAgVjhQcm94eTo6UmVnaXN0ZXJHbG9iYWxIYW5kbGUoU0NS
SVBUVkFMVUUsIHRoaXMsIG1fdmFsdWUpOworICAgICAgICBWOFByb3h5OjpyZWdpc3Rlckdsb2Jh
bEhhbmRsZShTQ1JJUFRWQUxVRSwgdGhpcywgbV92YWx1ZSk7CiAjZW5kaWYKIAogICAgICAgICBy
ZXR1cm4gKnRoaXM7CkBAIC0xMjIsNyArMTIyLDcgQEAgcHVibGljOgogICAgICAgICAgICAgcmV0
dXJuOwogCiAjaWZuZGVmIE5ERUJVRwotICAgICAgICBWOFByb3h5OjpVbnJlZ2lzdGVyR2xvYmFs
SGFuZGxlKHRoaXMsIG1fdmFsdWUpOworICAgICAgICBWOFByb3h5Ojp1bnJlZ2lzdGVyR2xvYmFs
SGFuZGxlKHRoaXMsIG1fdmFsdWUpOwogI2VuZGlmCiAgICAgICAgIG1fdmFsdWUuRGlzcG9zZSgp
OwogICAgICAgICBtX3ZhbHVlLkNsZWFyKCk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4
QWJzdHJhY3RFdmVudExpc3RlbmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdz
L3Y4L1Y4QWJzdHJhY3RFdmVudExpc3RlbmVyLmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJD
b3JlL2JpbmRpbmdzL3Y4L1Y4QWJzdHJhY3RFdmVudExpc3RlbmVyLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNTUsNyArNTUsNyBAQCBWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcjo6VjhBYnN0cmFjdEV2
ZW50CiAgICAgfQogfQogCi12b2lkIFY4QWJzdHJhY3RFdmVudExpc3RlbmVyOjppbnZva2VFdmVu
dEhhbmRsZXIodjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCwgRXZlbnQqIGV2ZW50LCB2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4ganNFdmVudCwgYm9vbCBpc1dpbmRvd0V2ZW50KQordm9pZCBW
OEFic3RyYWN0RXZlbnRMaXN0ZW5lcjo6aW52b2tlRXZlbnRIYW5kbGVyKHY4OjpIYW5kbGU8djg6
OkNvbnRleHQ+IHY4Q29udGV4dCwgRXZlbnQqIGV2ZW50LCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4g
anNFdmVudCwgYm9vbCBpc1dpbmRvd0V2ZW50KQogewogICAgIC8vIFdlIHB1c2ggdGhlIGV2ZW50
IGJlaW5nIHByb2Nlc3NlZCBpbnRvIHRoZSBnbG9iYWwgb2JqZWN0LCBzbyB0aGF0IGl0IGNhbiBi
ZSBleHBvc2VkIGJ5IERPTVdpbmRvdydzIGJpbmRpbmdzLgogICAgIHY4OjpMb2NhbDx2ODo6U3Ry
aW5nPiBldmVudFN5bWJvbCA9IHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCgiZXZlbnQiKTsKQEAgLTY3
LDExICs2NywxMSBAQCB2b2lkIFY4QWJzdHJhY3RFdmVudExpc3RlbmVyOjppbnZva2VFdmVuCiAg
ICAgICAgIHRyeUNhdGNoLlNldFZlcmJvc2UodHJ1ZSk7CiAKICAgICAgICAgLy8gU2F2ZSB0aGUg
b2xkICdldmVudCcgcHJvcGVydHkgc28gd2UgY2FuIHJlc3RvcmUgaXQgbGF0ZXIuCi0gICAgICAg
IHY4OjpMb2NhbDx2ODo6VmFsdWU+IHNhdmVkRXZlbnQgPSBjb250ZXh0LT5HbG9iYWwoKS0+R2V0
SGlkZGVuVmFsdWUoZXZlbnRTeW1ib2wpOworICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBz
YXZlZEV2ZW50ID0gdjhDb250ZXh0LT5HbG9iYWwoKS0+R2V0SGlkZGVuVmFsdWUoZXZlbnRTeW1i
b2wpOwogICAgICAgICB0cnlDYXRjaC5SZXNldCgpOwogCiAgICAgICAgIC8vIE1ha2UgdGhlIGV2
ZW50IGF2YWlsYWJsZSBpbiB0aGUgZ2xvYmFsIG9iamVjdCwgc28gRE9NV2luZG93IGNhbiBleHBv
c2UgaXQuCi0gICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5TZXRIaWRkZW5WYWx1ZShldmVudFN5
bWJvbCwganNFdmVudCk7CisgICAgICAgIHY4Q29udGV4dC0+R2xvYmFsKCktPlNldEhpZGRlblZh
bHVlKGV2ZW50U3ltYm9sLCBqc0V2ZW50KTsKICAgICAgICAgdHJ5Q2F0Y2guUmVzZXQoKTsKIAog
ICAgICAgICAvLyBDYWxsIHRoZSBldmVudCBoYW5kbGVyLgpAQCAtODAsMTMgKzgwLDEzIEBAIHZv
aWQgVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6Omludm9rZUV2ZW4KIAogICAgICAgICAvLyBSZXN0
b3JlIHRoZSBvbGQgZXZlbnQuIFRoaXMgbXVzdCBiZSBkb25lIGZvciBhbGwgZXhpdCBwYXRocyB0
aHJvdWdoIHRoaXMgbWV0aG9kLgogICAgICAgICBpZiAoc2F2ZWRFdmVudC5Jc0VtcHR5KCkpCi0g
ICAgICAgICAgICBjb250ZXh0LT5HbG9iYWwoKS0+U2V0SGlkZGVuVmFsdWUoZXZlbnRTeW1ib2ws
IHY4OjpVbmRlZmluZWQoKSk7CisgICAgICAgICAgICB2OENvbnRleHQtPkdsb2JhbCgpLT5TZXRI
aWRkZW5WYWx1ZShldmVudFN5bWJvbCwgdjg6OlVuZGVmaW5lZCgpKTsKICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgY29udGV4dC0+R2xvYmFsKCktPlNldEhpZGRlblZhbHVlKGV2ZW50U3ltYm9s
LCBzYXZlZEV2ZW50KTsKKyAgICAgICAgICAgIHY4Q29udGV4dC0+R2xvYmFsKCktPlNldEhpZGRl
blZhbHVlKGV2ZW50U3ltYm9sLCBzYXZlZEV2ZW50KTsKICAgICAgICAgdHJ5Q2F0Y2guUmVzZXQo
KTsKICAgICB9CiAKLSAgICBBU1NFUlQoIVY4UHJveHk6OkhhbmRsZU91dE9mTWVtb3J5KCkgfHwg
cmV0dXJuVmFsdWUuSXNFbXB0eSgpKTsKKyAgICBBU1NFUlQoIVY4UHJveHk6OmhhbmRsZU91dE9m
TWVtb3J5KCkgfHwgcmV0dXJuVmFsdWUuSXNFbXB0eSgpKTsKIAogICAgIGlmIChyZXR1cm5WYWx1
ZS5Jc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKQEAgLTExMiwyMCArMTEyLDIwIEBAIHZvaWQg
VjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6OmhhbmRsZUV2ZW4KIAogICAgIHY4OjpIYW5kbGVTY29w
ZSBoYW5kbGVTY29wZTsKIAotICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBW
OFByb3h5OjpHZXRDb250ZXh0KG1fZnJhbWUpOwotICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkK
KyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0
KG1fZnJhbWUpOworICAgIGlmICh2OENvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47
CiAKICAgICAvLyBtX2ZyYW1lIGNhbiByZW1vdmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbiwg
cHJvdGVjdCBpdCB1bnRpbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJucy4KICAgICBSZWZQ
dHI8RnJhbWU+IHByb3RlY3RGcmFtZShtX2ZyYW1lKTsKIAogICAgIC8vIEVudGVyIHRoZSBWOCBj
b250ZXh0IGluIHdoaWNoIHRvIHBlcmZvcm0gdGhlIGV2ZW50IGhhbmRsaW5nLgotICAgIHY4OjpD
b250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2Nv
cGUodjhDb250ZXh0KTsKIAogICAgIC8vIEdldCB0aGUgVjggd3JhcHBlciBmb3IgdGhlIGV2ZW50
IG9iamVjdC4KLSAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4ganNFdmVudCA9IFY4UHJveHk6OkV2
ZW50VG9WOE9iamVjdChldmVudCk7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGpzRXZlbnQg
PSBWOFByb3h5Ojpjb252ZXJ0RXZlbnRUb1Y4T2JqZWN0KGV2ZW50KTsKIAotICAgIGludm9rZUV2
ZW50SGFuZGxlcihjb250ZXh0LCBldmVudCwganNFdmVudCwgaXNXaW5kb3dFdmVudCk7CisgICAg
aW52b2tlRXZlbnRIYW5kbGVyKHY4Q29udGV4dCwgZXZlbnQsIGpzRXZlbnQsIGlzV2luZG93RXZl
bnQpOwogCiAgICAgRG9jdW1lbnQ6OnVwZGF0ZVN0eWxlRm9yQWxsRG9jdW1lbnRzKCk7CiB9CkBA
IC0xMzQsNyArMTM0LDcgQEAgdm9pZCBWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcjo6ZGlzcG9zZUxp
cwogewogICAgIGlmICghbV9saXN0ZW5lci5Jc0VtcHR5KCkpIHsKICNpZm5kZWYgTkRFQlVHCi0g
ICAgICAgIFY4UHJveHk6OlVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9saXN0ZW5lcik7
CisgICAgICAgIFY4UHJveHk6OnVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywgbV9saXN0ZW5l
cik7CiAjZW5kaWYKICAgICAgICAgbV9saXN0ZW5lci5EaXNwb3NlKCk7CiAgICAgICAgIG1fbGlz
dGVuZXIuQ2xlYXIoKTsKQEAgLTE1MCw3ICsxNTAsNyBAQCB2ODo6TG9jYWw8djg6Ok9iamVjdD4g
VjhBYnN0cmFjdEV2ZW50TGlzCiAgICAgICAgIHJldHVybiB2ODo6Q29udGV4dDo6R2V0Q3VycmVu
dCgpLT5HbG9iYWwoKTsKIAogICAgIEV2ZW50VGFyZ2V0KiB0YXJnZXQgPSBldmVudC0+Y3VycmVu
dFRhcmdldCgpOwotICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSA9IFY4UHJveHk6OkV2
ZW50VGFyZ2V0VG9WOE9iamVjdCh0YXJnZXQpOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2
YWx1ZSA9IFY4UHJveHk6OmNvbnZlcnRFdmVudFRhcmdldFRvVjhPYmplY3QodGFyZ2V0KTsKICAg
ICBpZiAodmFsdWUuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmpl
Y3Q+KCk7CiAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6TmV3KHY4OjpIYW5kbGU8
djg6Ok9iamVjdD46OkNhc3QodmFsdWUpKTsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvVjhD
b2xsZWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4Q29sbGVj
dGlvbi5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOENvbGxl
Y3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00OCwxNCArNDgsMTQgQEAgdjg6OkhhbmRsZTx2
ODo6VmFsdWU+IHRvT3B0aW9uc0NvbGxlY3RpbwogCiAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdmFs
dWUgaXMgYW4gSFRNTE9wdGlvbkVsZW1lbnQuICBJZiBub3QsIHRocm93IGEgVFlQRV9NSVNNQVRD
SF9FUlIgRE9NRXhjZXB0aW9uLgogICAgIGlmICghVjhIVE1MT3B0aW9uRWxlbWVudDo6SGFzSW5z
dGFuY2UodmFsdWUpKSB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihUWVBFX01J
U01BVENIX0VSUik7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihUWVBFX01JU01B
VENIX0VSUik7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKLSAgICBIVE1MT3B0aW9u
RWxlbWVudCogZWxlbWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTE9wdGlvbkVs
ZW1lbnQ+KHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodmFsdWUpKTsKKyAgICBIVE1MT3B0
aW9uRWxlbWVudCogZWxlbWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhU
TUxPcHRpb25FbGVtZW50Pih2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHZhbHVlKSk7CiAg
ICAgYmFzZS0+c2V0T3B0aW9uKGluZGV4LCBlbGVtZW50LCBlYyk7CiAKLSAgICBWOFByb3h5OjpT
ZXRET01FeGNlcHRpb24oZWMpOworICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAg
ICAgcmV0dXJuIHZhbHVlOwogfQogCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4Q29sbGVj
dGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhDb2xsZWN0aW9uLmgJ
KHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOENvbGxlY3Rpb24uaAko
d29ya2luZyBjb3B5KQpAQCAtNDcsOCArNDcsOCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAg
ICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7CiAgICAgICAgIFY4Q2xhc3NJ
bmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhDbGFzc0luZGV4OjpGcm9tSW50KGltcGxlbWVu
dGF0aW9uVHlwZS0+SW50MzJWYWx1ZSgpKTsKICAgICAgICAgaWYgKHR5cGUgPT0gVjhDbGFzc0lu
ZGV4OjpOT0RFKQotICAgICAgICAgICAgcmV0dXJuIFY4UHJveHk6Ok5vZGVUb1Y4T2JqZWN0KHN0
YXRpY19jYXN0PE5vZGUqPihpbXBsZW1lbnRhdGlvbikpOwotICAgICAgICByZXR1cm4gVjhQcm94
eTo6VG9WOE9iamVjdCh0eXBlLCBpbXBsZW1lbnRhdGlvbik7CisgICAgICAgICAgICByZXR1cm4g
VjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHN0YXRpY19jYXN0PE5vZGUqPihpbXBsZW1l
bnRhdGlvbikpOworICAgICAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QodHlw
ZSwgaW1wbGVtZW50YXRpb24pOwogICAgIH0KIAogICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHN0YXRp
YyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZ2V0VjhPYmplY3QoUGFzc1JlZlB0cjxUPiBpbXBsZW1l
bnRhdGlvbiwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaW1wbGVtZW50YXRpb25UeXBlKQpAQCAtNjEs
MTAgKzYxLDEwIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGltcGxlbWVudGF0
aW9uVHlwZSkKICAgICB7CiAgICAgICAgIC8vIEZJWE1FOiBhc3NlcnQgb2JqZWN0IGlzIGEgY29s
bGVjdGlvbiB0eXBlCi0gICAgICAgIEFTU0VSVChWOFByb3h5OjpNYXliZURPTVdyYXBwZXIob2Jq
ZWN0KSk7Ci0gICAgICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB3cmFwcGVyVHlwZSA9
IFY4UHJveHk6OkdldERPTVdyYXBwZXJUeXBlKG9iamVjdCk7CisgICAgICAgIEFTU0VSVChWOFBy
b3h5OjptYXliZURPTVdyYXBwZXIob2JqZWN0KSk7CisgICAgICAgIFY4Q2xhc3NJbmRleDo6VjhX
cmFwcGVyVHlwZSB3cmFwcGVyVHlwZSA9IFY4UHJveHk6OmRvbVdyYXBwZXJUeXBlKG9iamVjdCk7
CiAgICAgICAgIEFTU0VSVCh3cmFwcGVyVHlwZSAhPSBWOENsYXNzSW5kZXg6Ok5PREUpOwotICAg
ICAgICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q29s
bGVjdGlvbj4od3JhcHBlclR5cGUsIG9iamVjdCk7CisgICAgICAgIENvbGxlY3Rpb24qIGNvbGxl
Y3Rpb24gPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q29sbGVjdGlvbj4od3JhcHBl
clR5cGUsIG9iamVjdCk7CiAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0b1dlYkNvcmVT
dHJpbmcobmFtZSk7CiAgICAgICAgIHJldHVybiBnZXRWOE9iamVjdDxJdGVtVHlwZT4oY29sbGVj
dGlvbi0+bmFtZWRJdGVtKHByb3BlcnR5TmFtZSksIGltcGxlbWVudGF0aW9uVHlwZSk7CiAgICAg
fQpAQCAtODcsOCArODcsOCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgLy8gQSB0ZW1wbGF0
ZSBvZiBuYW1lZCBwcm9wZXJ0eSBhY2Nlc3NvciBvZiBIVE1MU2VsZWN0RWxlbWVudCBhbmQgSFRN
TEZvcm1FbGVtZW50LgogICAgIHRlbXBsYXRlPGNsYXNzIENvbGxlY3Rpb24+IHN0YXRpYyB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gbm9kZUNvbGxlY3Rpb25OYW1lZFByb3BlcnR5R2V0dGVyKHY4OjpM
b2NhbDx2ODo6U3RyaW5nPiBuYW1lLCBjb25zdCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZvKQogICAg
IHsKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6Ok1heWJlRE9NV3JhcHBlcihpbmZvLkhvbGRlcigp
KSk7Ci0gICAgICAgIEFTU0VSVChWOFByb3h5OjpHZXRET01XcmFwcGVyVHlwZShpbmZvLkhvbGRl
cigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOworICAgICAgICBBU1NFUlQoVjhQcm94eTo6bWF5
YmVET01XcmFwcGVyKGluZm8uSG9sZGVyKCkpKTsKKyAgICAgICAgQVNTRVJUKFY4UHJveHk6OmRv
bVdyYXBwZXJUeXBlKGluZm8uSG9sZGVyKCkpID09IFY4Q2xhc3NJbmRleDo6Tk9ERSk7CiAgICAg
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSA9IGluZm8uSG9sZGVyKCktPkdldFJlYWxO
YW1lZFByb3BlcnR5SW5Qcm90b3R5cGVDaGFpbihuYW1lKTsKIAogICAgICAgICBpZiAoIXZhbHVl
LklzRW1wdHkoKSkKQEAgLTEwOSwxMCArMTA5LDEwIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2Fs
PHY4OjpWYWx1ZT4gaW1wbGVtZW50YXRpb25UeXBlKQogICAgIHsKICAgICAgICAgLy8gRklYTUU6
IEFzc2VydCB0aGF0IG9iamVjdCBtdXN0IGJlIGEgY29sbGVjdGlvbiB0eXBlLgotICAgICAgICBB
U1NFUlQoVjhQcm94eTo6TWF5YmVET01XcmFwcGVyKG9iamVjdCkpOwotICAgICAgICBWOENsYXNz
SW5kZXg6OlY4V3JhcHBlclR5cGUgd3JhcHBlclR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFwcGVy
VHlwZShvYmplY3QpOworICAgICAgICBBU1NFUlQoVjhQcm94eTo6bWF5YmVET01XcmFwcGVyKG9i
amVjdCkpOworICAgICAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgd3JhcHBlclR5cGUg
PSBWOFByb3h5Ojpkb21XcmFwcGVyVHlwZShvYmplY3QpOwogICAgICAgICBBU1NFUlQod3JhcHBl
clR5cGUgIT0gVjhDbGFzc0luZGV4OjpOT0RFKTsKLSAgICAgICAgQ29sbGVjdGlvbiogY29sbGVj
dGlvbiA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENvbGxlY3Rpb24+KHdyYXBwZXJUeXBlLCBv
YmplY3QpOworICAgICAgICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6Y29udmVy
dFRvTmF0aXZlT2JqZWN0PENvbGxlY3Rpb24+KHdyYXBwZXJUeXBlLCBvYmplY3QpOwogICAgICAg
ICByZXR1cm4gZ2V0VjhPYmplY3Q8SXRlbVR5cGU+KGNvbGxlY3Rpb24tPml0ZW0oaW5kZXgpLCBp
bXBsZW1lbnRhdGlvblR5cGUpOwogICAgIH0KIApAQCAtMTI1LDkgKzEyNSw5IEBAIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKICAgICAvLyBBIHRlbXBsYXRlIG9mIGluZGV4IGludGVyY2VwdG9yIG9mIEhU
TUxTZWxlY3RFbGVtZW50IGFuZCBIVE1MRm9ybUVsZW1lbnQuCiAgICAgdGVtcGxhdGU8Y2xhc3Mg
Q29sbGVjdGlvbj4gc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBub2RlQ29sbGVjdGlvbklu
ZGV4ZWRQcm9wZXJ0eUdldHRlcih1aW50MzJfdCBpbmRleCwgY29uc3Qgdjg6OkFjY2Vzc29ySW5m
byYgaW5mbykKICAgICB7Ci0gICAgICAgIEFTU0VSVChWOFByb3h5OjpNYXliZURPTVdyYXBwZXIo
aW5mby5Ib2xkZXIoKSkpOwotICAgICAgICBBU1NFUlQoVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5
cGUoaW5mby5Ib2xkZXIoKSkgPT0gVjhDbGFzc0luZGV4OjpOT0RFKTsKLSAgICAgICAgQ29sbGVj
dGlvbiogY29sbGVjdGlvbiA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8Q29sbGVjdGlvbj4o
aW5mby5Ib2xkZXIoKSk7CisgICAgICAgIEFTU0VSVChWOFByb3h5OjptYXliZURPTVdyYXBwZXIo
aW5mby5Ib2xkZXIoKSkpOworICAgICAgICBBU1NFUlQoVjhQcm94eTo6ZG9tV3JhcHBlclR5cGUo
aW5mby5Ib2xkZXIoKSkgPT0gVjhDbGFzc0luZGV4OjpOT0RFKTsKKyAgICAgICAgQ29sbGVjdGlv
biogY29sbGVjdGlvbiA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPENvbGxlY3Rp
b24+KGluZm8uSG9sZGVyKCkpOwogICAgICAgICB2b2lkKiBpbXBsZW1lbnRhdGlvbiA9IGNvbGxl
Y3Rpb24tPml0ZW0oaW5kZXgpOwogICAgICAgICByZXR1cm4gZ2V0VjhPYmplY3QoaW1wbGVtZW50
YXRpb24sIGluZm8uRGF0YSgpKTsKICAgICB9CkBAIC0xMzUsOSArMTM1LDkgQEAgbmFtZXNwYWNl
IFdlYkNvcmUgewogICAgIC8vIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBp
bmRleGVkIHByb3BlcnRpZXMgb2YgSFRNTFNlbGVjdEVsZW1lbnQgYW5kIEhUTUxGb3JtRWxlbWVu
dC4KICAgICB0ZW1wbGF0ZTxjbGFzcyBDb2xsZWN0aW9uPiBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6
QXJyYXk+IG5vZGVDb2xsZWN0aW9uSW5kZXhlZFByb3BlcnR5RW51bWVyYXRvcihjb25zdCB2ODo6
QWNjZXNzb3JJbmZvJiBpbmZvKQogICAgIHsKLSAgICAgICAgQVNTRVJUKFY4UHJveHk6Ok1heWJl
RE9NV3JhcHBlcihpbmZvLkhvbGRlcigpKSk7Ci0gICAgICAgIEFTU0VSVChWOFByb3h5OjpHZXRE
T01XcmFwcGVyVHlwZShpbmZvLkhvbGRlcigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOwotICAg
ICAgICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxD
b2xsZWN0aW9uPihpbmZvLkhvbGRlcigpKTsKKyAgICAgICAgQVNTRVJUKFY4UHJveHk6Om1heWJl
RE9NV3JhcHBlcihpbmZvLkhvbGRlcigpKSk7CisgICAgICAgIEFTU0VSVChWOFByb3h5Ojpkb21X
cmFwcGVyVHlwZShpbmZvLkhvbGRlcigpKSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOworICAgICAg
ICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05v
ZGU8Q29sbGVjdGlvbj4oaW5mby5Ib2xkZXIoKSk7CiAgICAgICAgIGludCBsZW5ndGggPSBjb2xs
ZWN0aW9uLT5sZW5ndGgoKTsKICAgICAgICAgdjg6OkhhbmRsZTx2ODo6QXJyYXk+IHByb3BlcnRp
ZXMgPSB2ODo6QXJyYXk6Ok5ldyhsZW5ndGgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8
IGxlbmd0aDsgKytpKSB7CkBAIC0xNTEsOSArMTUxLDkgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewog
ICAgIC8vIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBpbmRleGVkIHByb3Bl
cnRpZXMgaW4gYSBjb2xsZWN0aW9uLgogICAgIHRlbXBsYXRlPGNsYXNzIENvbGxlY3Rpb24+IHN0
YXRpYyB2ODo6SGFuZGxlPHY4OjpBcnJheT4gY29sbGVjdGlvbkluZGV4ZWRQcm9wZXJ0eUVudW1l
cmF0b3IoY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYgaW5mbykKICAgICB7Ci0gICAgICAgIEFTU0VS
VChWOFByb3h5OjpNYXliZURPTVdyYXBwZXIoaW5mby5Ib2xkZXIoKSkpOwotICAgICAgICBWOENs
YXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgd3JhcHBlclR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFw
cGVyVHlwZShpbmZvLkhvbGRlcigpKTsKLSAgICAgICAgQ29sbGVjdGlvbiogY29sbGVjdGlvbiA9
IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENvbGxlY3Rpb24+KHdyYXBwZXJUeXBlLCBpbmZvLkhv
bGRlcigpKTsKKyAgICAgICAgQVNTRVJUKFY4UHJveHk6Om1heWJlRE9NV3JhcHBlcihpbmZvLkhv
bGRlcigpKSk7CisgICAgICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB3cmFwcGVyVHlw
ZSA9IFY4UHJveHk6OmRvbVdyYXBwZXJUeXBlKGluZm8uSG9sZGVyKCkpOworICAgICAgICBDb2xs
ZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENvbGxl
Y3Rpb24+KHdyYXBwZXJUeXBlLCBpbmZvLkhvbGRlcigpKTsKICAgICAgICAgaW50IGxlbmd0aCA9
IGNvbGxlY3Rpb24tPmxlbmd0aCgpOwogICAgICAgICB2ODo6SGFuZGxlPHY4OjpBcnJheT4gcHJv
cGVydGllcyA9IHY4OjpBcnJheTo6TmV3KGxlbmd0aCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbGVuZ3RoOyArK2kpIHsKQEAgLTE2OSw5ICsxNjksOSBAQCBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAgICAgdGVtcGxhdGU8Y2xhc3MgQ29sbGVjdGlvbj4gc3RhdGljIHY4OjpIYW5kbGU8djg6
OlZhbHVlPiBjb2xsZWN0aW9uU3RyaW5nT3JOdWxsSW5kZXhlZFByb3BlcnR5R2V0dGVyKHVpbnQz
Ml90IGluZGV4LCBjb25zdCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZvKQogICAgIHsKICAgICAgICAg
Ly8gRklYTUU6IGFzc2VydCB0aGF0IG9iamVjdCBtdXN0IGJlIGEgY29sbGVjdGlvbiB0eXBlCi0g
ICAgICAgIEFTU0VSVChWOFByb3h5OjpNYXliZURPTVdyYXBwZXIoaW5mby5Ib2xkZXIoKSkpOwot
ICAgICAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgd3JhcHBlclR5cGUgPSBWOFByb3h5
OjpHZXRET01XcmFwcGVyVHlwZShpbmZvLkhvbGRlcigpKTsKLSAgICAgICAgQ29sbGVjdGlvbiog
Y29sbGVjdGlvbiA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENvbGxlY3Rpb24+KHdyYXBwZXJU
eXBlLCBpbmZvLkhvbGRlcigpKTsKKyAgICAgICAgQVNTRVJUKFY4UHJveHk6Om1heWJlRE9NV3Jh
cHBlcihpbmZvLkhvbGRlcigpKSk7CisgICAgICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlw
ZSB3cmFwcGVyVHlwZSA9IFY4UHJveHk6OmRvbVdyYXBwZXJUeXBlKGluZm8uSG9sZGVyKCkpOwor
ICAgICAgICBDb2xsZWN0aW9uKiBjb2xsZWN0aW9uID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PENvbGxlY3Rpb24+KHdyYXBwZXJUeXBlLCBpbmZvLkhvbGRlcigpKTsKICAgICAgICAg
U3RyaW5nIHJlc3VsdCA9IGNvbGxlY3Rpb24tPml0ZW0oaW5kZXgpOwogICAgICAgICByZXR1cm4g
djhTdHJpbmdPck51bGwocmVzdWx0KTsKICAgICB9CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4
L1Y4RE9NTWFwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4RE9NTWFw
LmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4RE9NTWFwLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNDkyLDcgKzQ5MiwyOSBAQCBzdGF0aWMgdm9pZCB3ZWFrRE9N
T2JqZWN0Q2FsbGJhY2sodjg6OlBlCiB7CiAgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwogICAg
IEFTU0VSVCh2OE9iamVjdC0+SXNPYmplY3QoKSk7Cis8PDw8PDw8IC5taW5lCisKKyAgICBWOENs
YXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IFY4UHJveHk6OmRvbVdyYXBwZXJUeXBlKHY4
OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhPYmplY3QpKTsKKworICAgIFRocmVhZFNwZWNp
ZmljRE9NRGF0YTo6SW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+JiBtYXAgPSBzdGF0aWNfY2Fz
dDxUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiY+KGdl
dERPTU9iamVjdE1hcCgpKTsKKyAgICBpZiAobWFwLmNvbnRhaW5zKGRvbU9iamVjdCkpIHsKKyAg
ICAgICAgLy8gVGhlIGZvcmdldCBmdW5jdGlvbiByZW1vdmVzIG9iamVjdCBmcm9tIHRoZSBtYXAg
YW5kIGRpc3Bvc2VzIHRoZSB3cmFwcGVyLgorICAgICAgICBtYXAuZm9yZ2V0T25seShkb21PYmpl
Y3QpOworCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworI2RlZmluZSBNYWtlQ2FzZSh0eXBlLCBu
YW1lKSAgIFwKKyAgICAgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4Ojp0eXBlOiBzdGF0aWNfY2Fz
dDxuYW1lKj4oZG9tT2JqZWN0KS0+ZGVyZWYoKTsgYnJlYWs7CisgICAgICAgIERPTV9PQkpFQ1Rf
VFlQRVMoTWFrZUNhc2UpCisjdW5kZWYgTWFrZUNhc2UKKyAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICB9IGVsc2UKKyAgICAgICAgaGFuZGxlV2Vha09iamVjdEluT3duaW5nVGhyZWFkKFRo
cmVhZFNwZWNpZmljRE9NRGF0YTo6RE9NT2JqZWN0TWFwLCB0eXBlLCBkb21PYmplY3QpOworPT09
PT09PQogICAgIERPTURhdGE6OmhhbmRsZVdlYWtPYmplY3QoRE9NRGF0YVN0b3JlOjpET01PYmpl
Y3RNYXAsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhPYmplY3QpLCBkb21PYmplY3Qp
OworPj4+Pj4+PiAucjQ1MjE2CiB9CiAKIHZvaWQgd2Vha0FjdGl2ZURPTU9iamVjdENhbGxiYWNr
KHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKQEAg
LTU4NSw3ICs2MDcsNyBAQCB2b2lkIERPTURhdGE6OnJlbW92ZU9iamVjdHNGcm9tV3JhcHBlck1h
CiAgICAgICAgIFQqIGRvbU9iamVjdCA9IHN0YXRpY19jYXN0PFQqPihpdGVyLT5maXJzdCk7CiAg
ICAgICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHY4T2JqZWN0KGl0ZXItPnNlY29uZCk7
CiAKLSAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5OjpH
ZXRET01XcmFwcGVyVHlwZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSk7
CisgICAgICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6ZG9t
V3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOwogCiAg
ICAgICAgIC8vIERlcmVmIHRoZSBET00gb2JqZWN0LgogICAgICAgICBkZXJlZk9iamVjdCh0eXBl
LCBkb21PYmplY3QpOwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOEhlbHBlcnMuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhIZWxwZXJzLmNwcAkocmV2aXNpb24g
NDUyMTYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4SGVscGVycy5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTQwLDEzICs0MCwxMyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHZvaWQgd3JhcE5Q
T2JqZWN0KHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqZWN0LCBOUE9iamVjdCogbnBPYmplY3Qp
CiB7Ci0gICAgVjhQcm94eTo6U2V0RE9NV3JhcHBlcihvYmplY3QsIFY4Q2xhc3NJbmRleDo6TlBP
QkpFQ1QsIG5wT2JqZWN0KTsKKyAgICBWOFByb3h5OjpzZXRET01XcmFwcGVyKG9iamVjdCwgVjhD
bGFzc0luZGV4OjpOUE9CSkVDVCwgbnBPYmplY3QpOwogfQogCiB2ODo6TG9jYWw8djg6OkNvbnRl
eHQ+IHRvVjhDb250ZXh0KE5QUCBucHAsIE5QT2JqZWN0KiBucE9iamVjdCkKIHsKICAgICBWOE5Q
T2JqZWN0KiBvYmplY3QgPSByZWludGVycHJldF9jYXN0PFY4TlBPYmplY3QqPihucE9iamVjdCk7
Ci0gICAgcmV0dXJuIFY4UHJveHk6OkdldENvbnRleHQob2JqZWN0LT5yb290T2JqZWN0LT5mcmFt
ZSgpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udGV4dChvYmplY3QtPnJvb3RPYmplY3QtPmZy
YW1lKCkpOwogfQogCiBWOFByb3h5KiB0b1Y4UHJveHkoTlBPYmplY3QqIG5wT2JqZWN0KQpJbmRl
eDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOExhenlFdmVudExpc3RlbmVyLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4TGF6eUV2ZW50TGlzdGVuZXIuY3BwCShyZXZpc2lv
biA0NTIxNikKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhMYXp5RXZlbnRMaXN0ZW5lci5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTU0LDcgKzU0LDcgQEAgVjhMYXp5RXZlbnRMaXN0ZW5lcjo6flY4
TGF6eUV2ZW50TGlzdGVuZQogICAgIC8vIERpc3Bvc2Ugd3JhcHBlZCBmdW5jdGlvbgogICAgIGlm
ICghbV93cmFwcGVkRnVuY3Rpb24uSXNFbXB0eSgpKSB7CiAjaWZuZGVmIE5ERUJVRwotICAgICAg
ICBWOFByb3h5OjpVbnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMsIG1fd3JhcHBlZEZ1bmN0aW9u
KTsKKyAgICAgICAgVjhQcm94eTo6dW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBtX3dyYXBw
ZWRGdW5jdGlvbik7CiAjZW5kaWYKICAgICAgICAgbV93cmFwcGVkRnVuY3Rpb24uRGlzcG9zZSgp
OwogICAgICAgICBtX3dyYXBwZWRGdW5jdGlvbi5DbGVhcigpOwpAQCAtNzcsMTIgKzc3LDEyIEBA
IHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IFY4TGF6eUV2ZW50TGlzdGUKICAgICAgICAgdjg6Okhh
bmRsZVNjb3BlIGhhbmRsZVNjb3BlOwogCiAgICAgICAgIC8vIFVzZSB0aGUgb3V0ZXIgc2NvcGUg
dG8gaG9sZCBjb250ZXh0LgotICAgICAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0
ID0gVjhQcm94eTo6R2V0Q29udGV4dChtX2ZyYW1lKTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6
Q29udGV4dD4gdjhDb250ZXh0ID0gVjhQcm94eTo6Y29udGV4dChtX2ZyYW1lKTsKICAgICAgICAg
Ly8gQmFpbCBvdXQgaWYgd2UgY291bGQgbm90IGdldCB0aGUgY29udGV4dC4KLSAgICAgICAgaWYg
KGNvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICBpZiAodjhDb250ZXh0LklzRW1wdHkoKSkKICAg
ICAgICAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPigpOwogCi0gICAgICAgIHY4
OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKKyAgICAgICAgdjg6OkNvbnRleHQ6OlNj
b3BlIHNjb3BlKHY4Q29udGV4dCk7CiAKICAgICAgICAgLy8gV3JhcCBmdW5jdGlvbiBhcm91bmQg
dGhlIGV2ZW50IGNvZGUuICBUaGUgcGFyZW50aGVzaXMgYXJvdW5kIHRoZSBmdW5jdGlvbiBhcmUg
bmVlZGVkIHNvIHRoYXQgZXZhbHVhdGluZyB0aGUgY29kZSB5aWVsZHMKICAgICAgICAgLy8gdGhl
IGZ1bmN0aW9uIHZhbHVlLiAgV2l0aG91dCB0aGUgcGFyZW50aGVzaXMgdGhlIGZ1bmN0aW9uIHZh
bHVlIGlzIHRocm93biBhd2F5LgpAQCAtMTAyLDExICsxMDIsMTEgQEAgdjg6OkxvY2FsPHY4OjpG
dW5jdGlvbj4gVjhMYXp5RXZlbnRMaXN0ZQogICAgICAgICBjb2RlLmFwcGVuZCgiXG59KSIpOwog
CiAgICAgICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gY29kZUV4dGVybmFsU3RyaW5nID0gdjhF
eHRlcm5hbFN0cmluZyhjb2RlKTsKLSAgICAgICAgdjg6OkhhbmRsZTx2ODo6U2NyaXB0PiBzY3Jp
cHQgPSBWOFByb3h5OjpDb21waWxlU2NyaXB0KGNvZGVFeHRlcm5hbFN0cmluZywgbV9mcmFtZS0+
ZG9jdW1lbnQoKS0+dXJsKCksIG1fbGluZU51bWJlciAtIDEpOworICAgICAgICB2ODo6SGFuZGxl
PHY4OjpTY3JpcHQ+IHNjcmlwdCA9IFY4UHJveHk6OmNvbXBpbGVTY3JpcHQoY29kZUV4dGVybmFs
U3RyaW5nLCBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSwgbV9saW5lTnVtYmVyIC0gMSk7CiAg
ICAgICAgIGlmICghc2NyaXB0LklzRW1wdHkoKSkgewogICAgICAgICAgICAgVjhQcm94eSogcHJv
eHkgPSBWOFByb3h5OjpyZXRyaWV2ZShtX2ZyYW1lKTsKICAgICAgICAgICAgIEFTU0VSVChwcm94
eSk7Ci0gICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSA9IHByb3h5LT5SdW5T
Y3JpcHQoc2NyaXB0LCBmYWxzZSk7CisgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2
YWx1ZSA9IHByb3h5LT5ydW5TY3JpcHQoc2NyaXB0LCBmYWxzZSk7CiAgICAgICAgICAgICBpZiAo
IXZhbHVlLklzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIEFTU0VSVCh2YWx1ZS0+SXNGdW5j
dGlvbigpKTsKICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBsaXN0ZW5l
ckZ1bmN0aW9uID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj46OkNhc3QodmFsdWUpOwpAQCAtMTE0
LDcgKzExNCw3IEBAIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IFY4TGF6eUV2ZW50TGlzdGUKIAog
ICAgICAgICAgICAgICAgIG1fbGlzdGVuZXIgPSB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+
OjpOZXcobGlzdGVuZXJGdW5jdGlvbik7CiAjaWZuZGVmIE5ERUJVRwotICAgICAgICAgICAgICAg
IFY4UHJveHk6OlJlZ2lzdGVyR2xvYmFsSGFuZGxlKEVWRU5UX0xJU1RFTkVSLCB0aGlzLCBtX2xp
c3RlbmVyKTsKKyAgICAgICAgICAgICAgICBWOFByb3h5OjpyZWdpc3Rlckdsb2JhbEhhbmRsZShF
VkVOVF9MSVNURU5FUiwgdGhpcywgbV9saXN0ZW5lcik7CiAjZW5kaWYKICAgICAgICAgICAgIH0K
ICAgICAgICAgfQpAQCAtMTM0LDcgKzEzNCw3IEBAIHY4OjpMb2NhbDx2ODo6VmFsdWU+IFY4TGF6
eUV2ZW50TGlzdGVuZXIKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcGFyYW1ldGVyc1sxXSA9
IHsganNFdmVudCB9OwogCiAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZSht
X2ZyYW1lKTsKLSAgICByZXR1cm4gcHJveHktPkNhbGxGdW5jdGlvbihoYW5kbGVyRnVuY3Rpb24s
IHJlY2VpdmVyLCAxLCBwYXJhbWV0ZXJzKTsKKyAgICByZXR1cm4gcHJveHktPmNhbGxGdW5jdGlv
bihoYW5kbGVyRnVuY3Rpb24sIHJlY2VpdmVyLCAxLCBwYXJhbWV0ZXJzKTsKIH0KIAogCkBAIC0x
NTgsMTIgKzE1OCwxMiBAQCB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBWOExhenlFdmVudExpc3Rl
CiAgICAgICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKIAogICAgICAgICAvLyBVc2Ug
dGhlIG91dGVyIHNjb3BlIHRvIGhvbGQgY29udGV4dC4KLSAgICAgICAgdjg6OkhhbmRsZTx2ODo6
Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQobV9mcmFtZSk7CisgICAgICAg
IHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQobV9m
cmFtZSk7CiAgICAgICAgIC8vIEJhaWwgb3V0IGlmIHdlIGNhbm5vdCBnZXQgdGhlIGNvbnRleHQu
Ci0gICAgICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgaWYgKHY4Q29udGV4dC5J
c0VtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4oKTsK
IAotICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisgICAgICAgIHY4
OjpDb250ZXh0OjpTY29wZSBzY29wZSh2OENvbnRleHQpOwogCiAgICAgICAgIC8vIEZJWE1FOiBj
YWNoZSB0aGUgd3JhcHBlciBmdW5jdGlvbi4KIApAQCAtMTg0LDExICsxODQsMTEgQEAgdjg6Okxv
Y2FsPHY4OjpGdW5jdGlvbj4gVjhMYXp5RXZlbnRMaXN0ZQogICAgICAgICAvLyBJbnNlcnQgJ1xu
JyBvdGhlcndpc2UgLy8tc3R5bGUgY29tbWVudHMgY291bGQgYnJlYWsgdGhlIGhhbmRsZXIuCiAg
ICAgICAgIGNvZGUuYXBwZW5kKCAgIlxufSkuY2FsbCh0aGlzLCBldnQpO319fX0pIik7CiAgICAg
ICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gY29kZUV4dGVybmFsU3RyaW5nID0gdjhFeHRlcm5h
bFN0cmluZyhjb2RlKTsKLSAgICAgICAgdjg6OkhhbmRsZTx2ODo6U2NyaXB0PiBzY3JpcHQgPSBW
OFByb3h5OjpDb21waWxlU2NyaXB0KGNvZGVFeHRlcm5hbFN0cmluZywgbV9mcmFtZS0+ZG9jdW1l
bnQoKS0+dXJsKCksIG1fbGluZU51bWJlcik7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OlNjcmlw
dD4gc2NyaXB0ID0gVjhQcm94eTo6Y29tcGlsZVNjcmlwdChjb2RlRXh0ZXJuYWxTdHJpbmcsIG1f
ZnJhbWUtPmRvY3VtZW50KCktPnVybCgpLCBtX2xpbmVOdW1iZXIpOwogICAgICAgICBpZiAoIXNj
cmlwdC5Jc0VtcHR5KCkpIHsKICAgICAgICAgICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6
cmV0cmlldmUobV9mcmFtZSk7CiAgICAgICAgICAgICBBU1NFUlQocHJveHkpOwotICAgICAgICAg
ICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUgPSBwcm94eS0+UnVuU2NyaXB0KHNjcmlwdCwg
ZmFsc2UpOworICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUgPSBwcm94eS0+
cnVuU2NyaXB0KHNjcmlwdCwgZmFsc2UpOwogICAgICAgICAgICAgaWYgKCF2YWx1ZS5Jc0VtcHR5
KCkpIHsKICAgICAgICAgICAgICAgICBBU1NFUlQodmFsdWUtPklzRnVuY3Rpb24oKSk7CiAKQEAg
LTIxOCw3ICsyMTgsNyBAQCB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBWOExhenlFdmVudExpc3Rl
CiAgICAgICAgICAgICAgICAgfQogCiAjaWZuZGVmIE5ERUJVRwotICAgICAgICAgICAgICAgIFY4
UHJveHk6OlJlZ2lzdGVyR2xvYmFsSGFuZGxlKEVWRU5UX0xJU1RFTkVSLCB0aGlzLCBtX3dyYXBw
ZWRGdW5jdGlvbik7CisgICAgICAgICAgICAgICAgVjhQcm94eTo6cmVnaXN0ZXJHbG9iYWxIYW5k
bGUoRVZFTlRfTElTVEVORVIsIHRoaXMsIG1fd3JhcHBlZEZ1bmN0aW9uKTsKICNlbmRpZgogICAg
ICAgICAgICAgICAgIG1fd3JhcHBlZEZ1bmN0aW9uLT5TZXROYW1lKHY4OjpTdHJpbmc6Ok5ldyhm
cm9tV2ViQ29yZVN0cmluZyhtX2Z1bmN0aW9uTmFtZSksIG1fZnVuY3Rpb25OYW1lLmxlbmd0aCgp
KSk7CiAgICAgICAgICAgICB9CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4Tm9kZUZpbHRl
ckNvbmRpdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOE5vZGVG
aWx0ZXJDb25kaXRpb24uY3BwCShyZXZpc2lvbiA0NTIxNikKKysrIFdlYkNvcmUvYmluZGluZ3Mv
djgvVjhOb2RlRmlsdGVyQ29uZGl0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsMTQgKzQ0
LDE0IEBAIFY4Tm9kZUZpbHRlckNvbmRpdGlvbjo6VjhOb2RlRmlsdGVyQ29uZGkKICAgICA6IG1f
ZmlsdGVyKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT46Ok5ldyhmaWx0ZXIpKQogewogI2lmbmRl
ZiBOREVCVUcKLSAgICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhhbmRsZShOT0RFX0ZJTFRFUiwg
dGhpcywgbV9maWx0ZXIpOworICAgIFY4UHJveHk6OnJlZ2lzdGVyR2xvYmFsSGFuZGxlKE5PREVf
RklMVEVSLCB0aGlzLCBtX2ZpbHRlcik7CiAjZW5kaWYKIH0KIAogVjhOb2RlRmlsdGVyQ29uZGl0
aW9uOjp+VjhOb2RlRmlsdGVyQ29uZGl0aW9uKCkKIHsKICNpZm5kZWYgTkRFQlVHCi0gICAgVjhQ
cm94eTo6VW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBtX2ZpbHRlcik7CisgICAgVjhQcm94
eTo6dW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBtX2ZpbHRlcik7CiAjZW5kaWYKICAgICBt
X2ZpbHRlci5EaXNwb3NlKCk7CiAgICAgbV9maWx0ZXIuQ2xlYXIoKTsKQEAgLTY5LDEyICs2OSwx
MiBAQCBzaG9ydCBWOE5vZGVGaWx0ZXJDb25kaXRpb246OmFjY2VwdE5vZGUoCiAgICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiBvYmplY3QgPSB2ODo6Q29udGV4dDo6R2V0Q3VycmVudCgpLT5HbG9i
YWwoKTsKICAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4gY2FsbGJhY2sgPSB2ODo6SGFuZGxl
PHY4OjpGdW5jdGlvbj46OkNhc3QobV9maWx0ZXIpOwogICAgIE93bkFycmF5UHRyPHY4OjpIYW5k
bGU8djg6OlZhbHVlPiA+IGFyZ3MobmV3IHY4OjpIYW5kbGU8djg6OlZhbHVlPlsxXSk7Ci0gICAg
YXJnc1swXSA9IFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpOT0RFLCBub2RlKTsK
KyAgICBhcmdzWzBdID0gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpO
T0RFLCBub2RlKTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUoKTsK
ICAgICBBU1NFUlQocHJveHkpOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJlc3VsdCA9
IHByb3h5LT5DYWxsRnVuY3Rpb24oY2FsbGJhY2ssIG9iamVjdCwgMSwgYXJncy5nZXQoKSk7Cisg
ICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJlc3VsdCA9IHByb3h5LT5jYWxsRnVuY3Rpb24oY2Fs
bGJhY2ssIG9iamVjdCwgMSwgYXJncy5nZXQoKSk7CiAKICAgICBpZiAoZXhjZXB0aW9uQ2F0Y2hl
ci5IYXNDYXVnaHQoKSkgewogICAgICAgICBzdGF0ZS0+c2V0RXhjZXB0aW9uKGV4Y2VwdGlvbkNh
dGNoZXIuRXhjZXB0aW9uKCkpOwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOE9iamVjdEV2
ZW50TGlzdGVuZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhPYmpl
Y3RFdmVudExpc3RlbmVyLmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJDb3JlL2JpbmRpbmdz
L3Y4L1Y4T2JqZWN0RXZlbnRMaXN0ZW5lci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDcgKzQ1
LDcgQEAgc3RhdGljIHZvaWQgd2Vha09iamVjdEV2ZW50TGlzdGVuZXJDYWxsYgogICAgIGlmIChm
cmFtZSkgewogICAgICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKGZyYW1l
KTsKICAgICAgICAgaWYgKHByb3h5KQotICAgICAgICAgICAgcHJveHktPlJlbW92ZU9iamVjdEV2
ZW50TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICAgICAgcHJveHktPnJlbW92ZU9iamVjdEV2
ZW50TGlzdGVuZXIobGlzdGVuZXIpOwogCiAgICAgICAgIC8vIEJlY2F1c2UgdGhlIGxpc3RlbmVy
IGlzIG5vIGxvbmdlciBpbiB0aGUgbGlzdCwgaXQgbXVzdCBiZSBkaXNjb25uZWN0ZWQgZnJvbSB0
aGUgZnJhbWUgdG8gYXZvaWQgZGFuZ2xpbmcgZnJhbWUgcG9pbnRlcgogICAgICAgICAvLyBpbiB0
aGUgZGVzdHJ1Y3Rvci4KQEAgLTY2LDcgKzY2LDcgQEAgVjhPYmplY3RFdmVudExpc3RlbmVyOjp+
VjhPYmplY3RFdmVudExpcwogICAgICAgICBBU1NFUlQoIW1fbGlzdGVuZXIuSXNFbXB0eSgpKTsK
ICAgICAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShtX2ZyYW1lKTsKICAg
ICAgICAgaWYgKHByb3h5KQotICAgICAgICAgICAgcHJveHktPlJlbW92ZU9iamVjdEV2ZW50TGlz
dGVuZXIodGhpcyk7CisgICAgICAgICAgICBwcm94eS0+cmVtb3ZlT2JqZWN0RXZlbnRMaXN0ZW5l
cih0aGlzKTsKICAgICB9CiAKICAgICBkaXNwb3NlTGlzdGVuZXJPYmplY3QoKTsKSW5kZXg6IFdl
YkNvcmUvYmluZGluZ3MvdjgvVjhQcm94eS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5k
aW5ncy92OC9WOFByb3h5LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvYmluZGluZ3Mvdjgv
VjhQcm94eS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMzI1MSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOCwgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICog
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICog
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRp
c3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9y
IHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
CisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICog
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJWOFByb3h5LmgiCisKKyNpbmNsdWRlICJDaHJvbWl1
bUJyaWRnZS5oIgorI2luY2x1ZGUgIkNTU011dGFibGVTdHlsZURlY2xhcmF0aW9uLmgiCisjaW5j
bHVkZSAiRE9NT2JqZWN0c0luY2x1ZGUuaCIKKyNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgor
I2luY2x1ZGUgIlNjcmlwdENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJWOEJpbmRpbmcuaCIKKyNp
bmNsdWRlICJWOENvbGxlY3Rpb24uaCIKKyNpbmNsdWRlICJWOEN1c3RvbUJpbmRpbmcuaCIKKyNp
bmNsdWRlICJWOERPTU1hcC5oIgorI2luY2x1ZGUgIlY4RE9NV2luZG93LmgiCisjaW5jbHVkZSAi
VjhJbmRleC5oIgorI2luY2x1ZGUgIlY4SXNvbGF0ZWRXb3JsZC5oIgorI2luY2x1ZGUgIldvcmtl
ckNvbnRleHRFeGVjdXRpb25Qcm94eS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1
ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8djguaD4KKyNpbmNsdWRlIDx2OC1kZWJ1Zy5oPgorI2lu
Y2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVkZSA8d3RmL093bkFycmF5UHRyLmg+Cisj
aW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9VbnVzZWRQYXJhbS5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3Y4OjpQZXJzaXN0ZW50PHY4OjpDb250ZXh0PiBW
OFByb3h5OjptX3V0aWxpdHlDb250ZXh0OworCisvLyBTdGF0aWMgbGlzdCBvZiByZWdpc3RlcmVk
IGV4dGVuc2lvbnMKK1Y4RXh0ZW5zaW9uTGlzdCBWOFByb3h5OjptX2V4dGVuc2lvbnM7CisKK2Nv
bnN0IGNoYXIqIFY4UHJveHk6OmtDb250ZXh0RGVidWdEYXRhVHlwZSA9ICJ0eXBlIjsKK2NvbnN0
IGNoYXIqIFY4UHJveHk6OmtDb250ZXh0RGVidWdEYXRhVmFsdWUgPSAidmFsdWUiOworCisjaWZu
ZGVmIE5ERUJVRworLy8gS2VlcHMgdHJhY2sgb2YgZ2xvYmFsIGhhbmRsZXMgY3JlYXRlZCAobm90
IEpTIHdyYXBwZXJzCisvLyBvZiBET00gb2JqZWN0cykuIE9mdGVuIHRoZXNlIGdsb2JhbCBoYW5k
bGVzIGFyZSBzb3VyY2UKKy8vIG9mIGxlYWtzLgorLy8KKy8vIElmIHlvdSB3YW50IHRvIGxldCBh
IEMrKyBvYmplY3QgaG9sZCBhIHBlcnNpc3RlbnQgaGFuZGxlCisvLyB0byBhIEpTIG9iamVjdCwg
eW91IHNob3VsZCByZWdpc3RlciB0aGUgaGFuZGxlIGhlcmUgdG8KKy8vIGtlZXAgdHJhY2sgb2Yg
bGVha3MuCisvLworLy8gV2hlbiBjcmVhdGluZyBhIHBlcnNpc3RlbnQgaGFuZGxlLCBjYWxsOgor
Ly8KKy8vICNpZm5kZWYgTkRFQlVHCisvLyAgICBWOFByb3h5OjpyZWdpc3Rlckdsb2JhbEhhbmRs
ZSh0eXBlLCBob3N0LCBoYW5kbGUpOworLy8gI2VuZGlmCisvLworLy8gV2hlbiByZWxlYXNpbmcg
dGhlIGhhbmRsZSwgY2FsbDoKKy8vCisvLyAjaWZuZGVmIE5ERUJVRworLy8gICAgVjhQcm94eTo6
dW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0eXBlLCBob3N0LCBoYW5kbGUpOworLy8gI2VuZGlmCisv
LwordHlwZWRlZiBIYXNoTWFwPHY4OjpWYWx1ZSosIEdsb2JhbEhhbmRsZUluZm8qPiBHbG9iYWxI
YW5kbGVNYXA7CisKK3N0YXRpYyBHbG9iYWxIYW5kbGVNYXAmIGdsb2JhbEhhbmRsZU1hcCgpCit7
CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChHbG9iYWxIYW5kbGVNYXAsIHN0YXRpY0dsb2JhbEhh
bmRsZU1hcCwgKCkpOworICAgIHJldHVybiBzdGF0aWNHbG9iYWxIYW5kbGVNYXA7Cit9CisKKy8v
IFRoZSBVU0VfVkFSKHgpIHRlbXBsYXRlIGlzIHVzZWQgdG8gc2lsZW5jZSBDKysgY29tcGlsZXIg
d2FybmluZ3MNCisvLyBpc3N1ZWQgZm9yIHVudXNlZCB2YXJpYWJsZXMgKHR5cGljYWxseSBwYXJh
bWV0ZXJzIG9yIHZhbHVlcyB0aGF0DQorLy8gd2Ugd2FudCB0byB3YXRjaCBpbiB0aGUgZGVidWdn
ZXIpLg0KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPg0KK3N0YXRpYyBpbmxpbmUgdm9pZCBVU0VfVkFS
KFQpIHsgfQorCisvLyBUaGUgZnVuY3Rpb24gaXMgdGhlIHBsYWNlIHRvIHNldCB0aGUgYnJlYWsg
cG9pbnQgdG8gaW5zcGVjdAorLy8gbGl2ZSBnbG9iYWwgaGFuZGxlcy4gTGVha3MgYXJlIG9mdGVu
IGNvbWUgZnJvbSBsZWFrZWQgZ2xvYmFsIGhhbmRsZXMuCitzdGF0aWMgdm9pZCBlbnVtZXJhdGVH
bG9iYWxIYW5kbGVzKCkKK3sKKyAgICBmb3IgKEdsb2JhbEhhbmRsZU1hcDo6aXRlcmF0b3IgaXQg
PSBnbG9iYWxIYW5kbGVNYXAoKS5iZWdpbigpLCBlbmQgPSBnbG9iYWxIYW5kbGVNYXAoKS5lbmQo
KTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIEdsb2JhbEhhbmRsZUluZm8qIGluZm8gPSBp
dC0+c2Vjb25kOworICAgICAgICBVTlVTRURfUEFSQU0oaW5mbyk7CisgICAgICAgIHY4OjpWYWx1
ZSogaGFuZGxlID0gaXQtPmZpcnN0OworICAgICAgICBVTlVTRURfUEFSQU0oaGFuZGxlKTsKKyAg
ICB9Cit9CisKK3ZvaWQgVjhQcm94eTo6cmVnaXN0ZXJHbG9iYWxIYW5kbGUoR2xvYmFsSGFuZGxl
VHlwZSB0eXBlLCB2b2lkKiBob3N0LCB2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IGhhbmRsZSkK
K3sKKyAgICBBU1NFUlQoIWdsb2JhbEhhbmRsZU1hcCgpLmNvbnRhaW5zKCpoYW5kbGUpKTsKKyAg
ICBnbG9iYWxIYW5kbGVNYXAoKS5zZXQoKmhhbmRsZSwgbmV3IEdsb2JhbEhhbmRsZUluZm8oaG9z
dCwgdHlwZSkpOworfQorCit2b2lkIFY4UHJveHk6OnVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodm9p
ZCogaG9zdCwgdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiBoYW5kbGUpCit7CisgICAgQVNTRVJU
KGdsb2JhbEhhbmRsZU1hcCgpLmNvbnRhaW5zKCpoYW5kbGUpKTsKKyAgICBHbG9iYWxIYW5kbGVJ
bmZvKiBpbmZvID0gZ2xvYmFsSGFuZGxlTWFwKCkudGFrZSgqaGFuZGxlKTsKKyAgICBBU1NFUlQo
aW5mby0+bV9ob3N0ID09IGhvc3QpOworICAgIGRlbGV0ZSBpbmZvOworfQorI2VuZGlmIC8vIGlm
bmRlZiBOREVCVUcKKwordm9pZCBiYXRjaENvbmZpZ3VyZUF0dHJpYnV0ZXModjg6OkhhbmRsZTx2
ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlLCB2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0
ZT4gcHJvdG8sIGNvbnN0IEJhdGNoZWRBdHRyaWJ1dGUqIGF0dHJpYnV0ZXMsIHNpemVfdCBhdHRy
aWJ1dGVDb3VudCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF0dHJpYnV0ZUNvdW50
OyArK2kpIHsKKyAgICAgICAgY29uc3QgQmF0Y2hlZEF0dHJpYnV0ZSogYXR0cmlidXRlID0gJmF0
dHJpYnV0ZXNbaV07CisgICAgICAgIChhdHRyaWJ1dGUtPm9uUHJvdG8gPyBwcm90byA6IGluc3Rh
bmNlKS0+U2V0QWNjZXNzb3Iodjg6OlN0cmluZzo6TmV3KGF0dHJpYnV0ZS0+bmFtZSksCisgICAg
ICAgICAgICBhdHRyaWJ1dGUtPmdldHRlciwKKyAgICAgICAgICAgIGF0dHJpYnV0ZS0+c2V0dGVy
LAorICAgICAgICAgICAgYXR0cmlidXRlLT5kYXRhID09IFY4Q2xhc3NJbmRleDo6SU5WQUxJRF9D
TEFTU19JTkRFWCA/IHY4OjpIYW5kbGU8djg6OlZhbHVlPigpIDogdjg6OkludGVnZXI6Ok5ldyhW
OENsYXNzSW5kZXg6OlRvSW50KGF0dHJpYnV0ZS0+ZGF0YSkpLAorICAgICAgICAgICAgYXR0cmli
dXRlLT5zZXR0aW5ncywKKyAgICAgICAgICAgIGF0dHJpYnV0ZS0+YXR0cmlidXRlKTsKKyAgICB9
Cit9CisKK3ZvaWQgYmF0Y2hDb25maWd1cmVDb25zdGFudHModjg6OkhhbmRsZTx2ODo6RnVuY3Rp
b25UZW1wbGF0ZT4gZnVuY3Rpb25EZXNjcmlwdG9yLCB2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1w
bGF0ZT4gcHJvdG8sIGNvbnN0IEJhdGNoZWRDb25zdGFudCogY29uc3RhbnRzLCBzaXplX3QgY29u
c3RhbnRDb3VudCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbnN0YW50Q291bnQ7
ICsraSkgeworICAgICAgICBjb25zdCBCYXRjaGVkQ29uc3RhbnQqIGNvbnN0YW50ID0gJmNvbnN0
YW50c1tpXTsKKyAgICAgICAgZnVuY3Rpb25EZXNjcmlwdG9yLT5TZXQodjg6OlN0cmluZzo6TmV3
KGNvbnN0YW50LT5uYW1lKSwgdjg6OkludGVnZXI6Ok5ldyhjb25zdGFudC0+dmFsdWUpLCB2ODo6
UmVhZE9ubHkpOworICAgICAgICBwcm90by0+U2V0KHY4OjpTdHJpbmc6Ok5ldyhjb25zdGFudC0+
bmFtZSksIHY4OjpJbnRlZ2VyOjpOZXcoY29uc3RhbnQtPnZhbHVlKSwgdjg6OlJlYWRPbmx5KTsK
KyAgICB9Cit9CisKK3R5cGVkZWYgSGFzaE1hcDxOb2RlKiwgdjg6Ok9iamVjdCo+IERPTU5vZGVN
YXA7Cit0eXBlZGVmIEhhc2hNYXA8dm9pZCosIHY4OjpPYmplY3QqPiBET01PYmplY3RNYXA7CisK
KyNpZm5kZWYgTkRFQlVHCisKK3N0YXRpYyB2b2lkIGVudW1lcmF0ZURPTU9iamVjdE1hcChET01P
YmplY3RNYXAmIHdyYXBwZXJNYXApCit7CisgICAgZm9yIChET01PYmplY3RNYXA6Oml0ZXJhdG9y
IGl0ID0gd3JhcHBlck1hcC5iZWdpbigpLCBlbmQgPSB3cmFwcGVyTWFwLmVuZCgpOyBpdCAhPSBl
bmQ7ICsraXQpIHsKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gd3JhcHBlcihp
dC0+c2Vjb25kKTsKKyAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBW
OFByb3h5Ojpkb21XcmFwcGVyVHlwZSh3cmFwcGVyKTsKKyAgICAgICAgdm9pZCogb2JqZWN0ID0g
aXQtPmZpcnN0OworICAgICAgICBVTlVTRURfUEFSQU0odHlwZSk7CisgICAgICAgIFVOVVNFRF9Q
QVJBTShvYmplY3QpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZW51bWVyYXRlRE9NTm9kZU1h
cChET01Ob2RlTWFwJiBub2RlTWFwKQoreworICAgIGZvciAoRE9NTm9kZU1hcDo6aXRlcmF0b3Ig
aXQgPSBub2RlTWFwLmJlZ2luKCksIGVuZCA9IG5vZGVNYXAuZW5kKCk7IGl0ICE9IGVuZDsgKytp
dCkgeworICAgICAgICBOb2RlKiBub2RlID0gaXQtPmZpcnN0OworICAgICAgICBVTlVTRURfUEFS
QU0obm9kZSk7CisgICAgICAgIEFTU0VSVCh2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PihpdC0+
c2Vjb25kKS5Jc1dlYWsoKSk7CisgICAgfQorfQorCitjbGFzcyBET01PYmplY3RWaXNpdG9yIDog
cHVibGljIERPTVdyYXBwZXJNYXA8dm9pZD46OlZpc2l0b3Igew0KKyAgICBwdWJsaWM6DQorICAg
ICAgICB2b2lkIHZpc2l0RE9NV3JhcHBlcih2b2lkKiBvYmplY3QsIHY4OjpQZXJzaXN0ZW50PHY4
OjpPYmplY3Q+IHdyYXBwZXIpIHsNCisgICAgICAgICAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBl
clR5cGUgdHlwZSA9IFY4UHJveHk6OmRvbVdyYXBwZXJUeXBlKHdyYXBwZXIpOw0KKyAgICAgICAg
ICAgIFVTRV9WQVIodHlwZSk7DQorICAgICAgICAgICAgVVNFX1ZBUihvYmplY3QpOw0KKyAgICAg
ICAgfQ0KK307CisKK2NsYXNzIEVuc3VyZVdlYWtET01Ob2RlVmlzaXRvciA6IHB1YmxpYyBET01X
cmFwcGVyTWFwPE5vZGU+OjpWaXNpdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZvaWQgdmlz
aXRET01XcmFwcGVyKE5vZGUqIG9iamVjdCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gd3Jh
cHBlcikgeworICAgICAgICAgICAgVVNFX1ZBUihvYmplY3QpOworICAgICAgICAgICAgQVNTRVJU
KHdyYXBwZXIuSXNXZWFrKCkpOworICAgICAgICB9Cit9OworCisjZW5kaWYgLy8gTkRFQlVHCisK
KyNpZiBFTkFCTEUoU1ZHKQordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6OmNvbnZlcnRT
VkdFbGVtZW50SW5zdGFuY2VUb1Y4T2JqZWN0KFNWR0VsZW1lbnRJbnN0YW5jZSogaW5zdGFuY2Up
Cit7CisgICAgaWYgKCFpbnN0YW5jZSkKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAg
ICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGV4aXN0aW5nSW5zdGFuY2UgPSBnZXRET01TVkdFbGVt
ZW50SW5zdGFuY2VNYXAoKS5nZXQoaW5zdGFuY2UpOworICAgIGlmICghZXhpc3RpbmdJbnN0YW5j
ZS5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBleGlzdGluZ0luc3RhbmNlOworCisgICAgaW5z
dGFuY2UtPnJlZigpOworCisgICAgLy8gSW5zdGFudGlhdGUgdGhlIFY4IG9iamVjdCBhbmQgcmVt
ZW1iZXIgaXQKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJlc3VsdCA9IGluc3RhbnRpYXRl
VjhPYmplY3QoVjhDbGFzc0luZGV4OjpTVkdFTEVNRU5USU5TVEFOQ0UsIFY4Q2xhc3NJbmRleDo6
U1ZHRUxFTUVOVElOU1RBTkNFLCBpbnN0YW5jZSk7CisgICAgaWYgKCFyZXN1bHQuSXNFbXB0eSgp
KSB7CisgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBET00gU1ZHIGVsZW1lbnQgbWFwIGlmIHRo
ZSByZXN1bHQgaXMgbm9uLWVtcHR5LgorICAgICAgICBnZXRET01TVkdFbGVtZW50SW5zdGFuY2VN
YXAoKS5zZXQoaW5zdGFuY2UsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcocmVzdWx0
KSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIE1hcCBvZiBTVkcgb2JqZWN0
cyB3aXRoIGNvbnRleHRzIHRvIHRoZWlyIGNvbnRleHRzCitzdGF0aWMgSGFzaE1hcDx2b2lkKiwg
U1ZHRWxlbWVudCo+JiBzdmdPYmplY3RUb0NvbnRleHRNYXAoKQoreworICAgIHR5cGVkZWYgSGFz
aE1hcDx2b2lkKiwgU1ZHRWxlbWVudCo+IFN2Z09iamVjdFRvQ29udGV4dE1hcDsKKyAgICBERUZJ
TkVfU1RBVElDX0xPQ0FMKFN2Z09iamVjdFRvQ29udGV4dE1hcCwgc3RhdGljU3ZnT2JqZWN0VG9D
b250ZXh0TWFwLCAoKSk7CisgICAgcmV0dXJuIHN0YXRpY1N2Z09iamVjdFRvQ29udGV4dE1hcDsK
K30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6OmNvbnZlcnRTVkdPYmplY3RXaXRo
Q29udGV4dFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHZvaWQq
IG9iamVjdCkKK3sKKyAgICBpZiAoIW9iamVjdCkKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7
CisKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiByZXN1bHQgPSBnZXRET01TVkdPYmpl
Y3RXaXRoQ29udGV4dE1hcCgpLmdldChvYmplY3QpOworICAgIGlmICghcmVzdWx0LklzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIC8vIFNwZWNpYWwgY2FzZTogU1ZHUGF0
aFNlZ3MgbmVlZCB0byBiZSBkb3duY2FzdCB0byB0aGVpciByZWFsIHR5cGUKKyAgICBpZiAodHlw
ZSA9PSBWOENsYXNzSW5kZXg6OlNWR1BBVEhTRUcpCisgICAgICAgIHR5cGUgPSBWOEN1c3RvbTo6
RG93bmNhc3RTVkdQYXRoU2VnKG9iamVjdCk7CisKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4g
djhPYmplY3QgPSBpbnN0YW50aWF0ZVY4T2JqZWN0KHR5cGUsIHR5cGUsIG9iamVjdCk7CisgICAg
aWYgKCF2OE9iamVjdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgcmVzdWx0ID0gdjg6OlBlcnNpc3Rl
bnQ8djg6Ok9iamVjdD46Ok5ldyh2OE9iamVjdCk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgewor
I2RlZmluZSBNQUtFX0NBU0UoVFlQRSwgTkFNRSkgICAgIFwKKyAgICAgICAgY2FzZSBWOENsYXNz
SW5kZXg6OlRZUEU6IHN0YXRpY19jYXN0PE5BTUUqPihvYmplY3QpLT5yZWYoKTsgYnJlYWs7Cisg
ICAgICAgIFNWR19PQkpFQ1RfVFlQRVMoTUFLRV9DQVNFKQorI3VuZGVmIE1BS0VfQ0FTRQorI2Rl
ZmluZSBNQUtFX0NBU0UoVFlQRSwgTkFNRSkgICAgIFwKKyAgICAgICAgY2FzZSBWOENsYXNzSW5k
ZXg6OlRZUEU6ICAgIFwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFY4U1ZHUE9EVHlwZVdyYXBw
ZXI8TkFNRT4qPihvYmplY3QpLT5yZWYoKTsgYnJlYWs7CisgICAgICAgIFNWR19QT0RfTkFUSVZF
X1RZUEVTKE1BS0VfQ0FTRSkKKyN1bmRlZiBNQUtFX0NBU0UKKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICB9CisgICAgICAgIGdldERP
TVNWR09iamVjdFdpdGhDb250ZXh0TWFwKCkuc2V0KG9iamVjdCwgcmVzdWx0KTsKKyAgICB9CisK
KyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFY4UHJveHk6OnNldFNWR0NvbnRleHQodm9p
ZCogb2JqZWN0LCBTVkdFbGVtZW50KiBjb250ZXh0KQoreworICAgIGlmICghb2JqZWN0KQorICAg
ICAgICByZXR1cm47CisKKyAgICBTVkdFbGVtZW50KiBvbGRDb250ZXh0ID0gc3ZnT2JqZWN0VG9D
b250ZXh0TWFwKCkuZ2V0KG9iamVjdCk7CisKKyAgICBpZiAob2xkQ29udGV4dCA9PSBjb250ZXh0
KQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAob2xkQ29udGV4dCkKKyAgICAgICAgb2xkQ29u
dGV4dC0+ZGVyZWYoKTsKKworICAgIGlmIChjb250ZXh0KQorICAgICAgICBjb250ZXh0LT5yZWYo
KTsKKworICAgIHN2Z09iamVjdFRvQ29udGV4dE1hcCgpLnNldChvYmplY3QsIGNvbnRleHQpOwor
fQorCitTVkdFbGVtZW50KiBWOFByb3h5OjpzdmdDb250ZXh0KHZvaWQqIG9iamVjdCkKK3sKKyAg
ICByZXR1cm4gc3ZnT2JqZWN0VG9Db250ZXh0TWFwKCkuZ2V0KG9iamVjdCk7Cit9CisKKyNlbmRp
ZgorCisvLyBBIG1hcCBmcm9tIGEgRE9NIG5vZGUgdG8gaXRzIEpTIHdyYXBwZXIsIHRoZSB3cmFw
cGVyCisvLyBpcyBrZXB0IGFzIGEgc3Ryb25nIHJlZmVyZW5jZSB0byBzdXJ2aXZlIEdDcy4KK3N0
YXRpYyBET01PYmplY3RNYXAmIGdjUHJvdGVjdGVkTWFwKCkgeworICAgIERFRklORV9TVEFUSUNf
TE9DQUwoRE9NT2JqZWN0TWFwLCBzdGF0aWNHY1Byb3RlY3RlZE1hcCwgKCkpOworICAgIHJldHVy
biBzdGF0aWNHY1Byb3RlY3RlZE1hcDsKK30KKwordm9pZCBWOFByb3h5OjpnY1Byb3RlY3Qodm9p
ZCogZG9tT2JqZWN0KQoreworICAgIGlmICghZG9tT2JqZWN0KQorICAgICAgICByZXR1cm47Cisg
ICAgaWYgKGdjUHJvdGVjdGVkTWFwKCkuY29udGFpbnMoZG9tT2JqZWN0KSkKKyAgICAgICAgcmV0
dXJuOworICAgIGlmICghZ2V0RE9NT2JqZWN0TWFwKCkuY29udGFpbnMoZG9tT2JqZWN0KSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IChzdHJvbmcpIHBlcnNpc3RlbnQg
aGFuZGxlIGZvciB0aGUgb2JqZWN0LgorICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdy
YXBwZXIgPSBnZXRET01PYmplY3RNYXAoKS5nZXQoZG9tT2JqZWN0KTsKKyAgICBpZiAod3JhcHBl
ci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGdjUHJvdGVjdGVkTWFwKCkuc2V0
KGRvbU9iamVjdCwgKnY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcod3JhcHBlcikpOwor
fQorCit2b2lkIFY4UHJveHk6OmdjVW5wcm90ZWN0KHZvaWQqIGRvbU9iamVjdCkKK3sKKyAgICBp
ZiAoIWRvbU9iamVjdCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghZ2NQcm90ZWN0ZWRNYXAo
KS5jb250YWlucyhkb21PYmplY3QpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBEaXNwb3Nl
IHRoZSBzdHJvbmcgcmVmZXJlbmNlLgorICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdy
YXBwZXIoZ2NQcm90ZWN0ZWRNYXAoKS50YWtlKGRvbU9iamVjdCkpOworICAgIHdyYXBwZXIuRGlz
cG9zZSgpOworfQorDQorY2xhc3MgR0NQcm9sb2d1ZVZpc2l0b3IgOiBwdWJsaWMgRE9NV3JhcHBl
ck1hcDx2b2lkPjo6VmlzaXRvciB7DQorICAgIHB1YmxpYzoNCisgICAgICAgIHZvaWQgdmlzaXRE
T01XcmFwcGVyKHZvaWQqIG9iamVjdCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gd3JhcHBl
cikgeworICAgICAgICAgICAgQVNTRVJUKHdyYXBwZXIuSXNXZWFrKCkpOworICAgICAgICAgICAg
VjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5Ojpkb21XcmFwcGVyVHlw
ZSh3cmFwcGVyKTsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworI2RlZmluZSBNQUtFX0NB
U0UoVFlQRSwgTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAg
IGNhc2UgVjhDbGFzc0luZGV4OjpUWVBFOiB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAg
ICAgICAgICAgTkFNRSogaW1wbCA9IHN0YXRpY19jYXN0PE5BTUUqPihvYmplY3QpOyAgXAorICAg
ICAgICAgICAgICAgIGlmIChpbXBsLT5oYXNQZW5kaW5nQWN0aXZpdHkoKSkgICAgICAgICAgIFwK
KyAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5DbGVhcldlYWsoKTsgICAgICAgICAgICAgICAg
ICBcCisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXAorICAgICAgICAgICAgfQorICAgICAgICBBQ1RJVkVfRE9NX09CSkVDVF9UWVBFUyhN
QUtFX0NBU0UpCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyN1bmRlZiBNQUtFX0NBU0UKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZGl0aW9u
YWwgaGFuZGxpbmcgb2YgbWVzc2FnZSBwb3J0IGVuc3VyaW5nIHRoYXQgZW50YW5nbGVkIHBvcnRz
IGFsc28KKyAgICAgICAgLy8gaGF2ZSB0aGVpciB3cmFwcGVycyBlbnRhbmdsZWQuIFRoaXMgc2hv
dWxkIGlkZWFsbHkgYmUgaGFuZGxlZCB3aGVuIHRoZQorICAgICAgICAvLyBwb3J0cyBhcmUgYWN0
dWFsbHkgZW50YW5nbGVkIGluIE1lc3NhZ2VQb3J0OjplbnRhbmdsZSwgYnV0IHRvIGF2b2lkCisg
ICAgICAgIC8vIGZvcmtpbmcgTWVzc2FnZVBvcnQuKiB0aGlzIGlzIHBvc3Rwb25lZCB0byBHQyB0
aW1lLiBIYXZpbmcgdGhpcyBwb3N0cG9uZWQKKyAgICAgICAgLy8gaGFzIHRoZSBkcmF3YmFjayB0
aGF0IHRoZSB3cmFwcGVycyBhcmUgImVudGFuZ2xlZC91bmVudGFuZ2xlZCIgZm9yIGVhY2gKKyAg
ICAgICAgLy8gR0MgZXZlbiB0aG91Z2ggdGhlaXIgZW50YWdsZW1lbnQgbW9zdCBsaWtlbHkgaXMg
c3RpbGwgdGhlIHNhbWUuCisgICAgICAgIGlmICh0eXBlID09IFY4Q2xhc3NJbmRleDo6TUVTU0FH
RVBPUlQpIHsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgcG9ydCBhbmQgaXRzIGVudGFuZ2xlZCBw
b3J0LgorICAgICAgICAgICAgTWVzc2FnZVBvcnQqIHBvcnQxID0gc3RhdGljX2Nhc3Q8TWVzc2Fn
ZVBvcnQqPihvYmplY3QpOworICAgICAgICAgICAgTWVzc2FnZVBvcnQqIHBvcnQyID0gcG9ydDEt
PmxvY2FsbHlFbnRhbmdsZWRQb3J0KCk7DQorDQorICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHJl
bW90ZWx5IGVudGFuZ2xlZCwgdGhlbiBtYXJrIHRoaXMgb2JqZWN0IGFzIHJlYWNoYWJsZQ0KKyAg
ICAgICAgICAgIC8vICh3ZSBjYW4ndCBkZXRlcm1pbmUgcmVhY2hhYmlsaXR5IGRpcmVjdGx5IGFz
IHRoZSByZW1vdGUgb2JqZWN0IGlzDQorICAgICAgICAgICAgLy8gb3V0LW9mLXByb2MpLg0KKyAg
ICAgICAgICAgIGlmIChwb3J0MS0+aXNFbnRhbmdsZWQoKSAmJiAhcG9ydDIpDQorICAgICAgICAg
ICAgICAgIHdyYXBwZXIuQ2xlYXJXZWFrKCk7CisKKyAgICAgICAgICAgIGlmICghcG9ydDIpIHsK
KyAgICAgICAgICAgICAgICAvLyBBcyBwb3J0cyBhcmUgYWx3YXlzIGVudGFuZ2xlZCBpbiBwYWly
cyBvbmx5IHBlcmZvcm0gdGhlIGVudGFuZ2xlbWVudAorICAgICAgICAgICAgICAgIC8vIG9uY2Ug
Zm9yIGVhY2ggcGFpciAoc2VlIEFTU0VSVCBpbiBNZXNzYWdlUG9ydDo6dW5lbnRhbmdsZSgpKS4K
KyAgICAgICAgICAgICAgICBpZiAocG9ydDEgPCBwb3J0MikgeworICAgICAgICAgICAgICAgICAg
ICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcG9ydDFXcmFwcGVyID0gVjhQcm94eTo6Y29udmVydFRv
VjhPYmplY3QoVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgcG9ydDEpOworICAgICAgICAgICAg
ICAgICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcG9ydDJXcmFwcGVyID0gVjhQcm94eTo6Y29u
dmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgcG9ydDIpOworICAgICAg
ICAgICAgICAgICAgICBBU1NFUlQocG9ydDFXcmFwcGVyLT5Jc09iamVjdCgpKTsKKyAgICAgICAg
ICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdChwb3J0MVdyYXBwZXIpLT5T
ZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprTWVzc2FnZVBvcnRFbnRhbmdsZWRQb3J0SW5kZXgs
IHBvcnQyV3JhcHBlcik7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChwb3J0MldyYXBwZXIt
PklzT2JqZWN0KCkpOworICAgICAgICAgICAgICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+
OjpDYXN0KHBvcnQyV3JhcHBlciktPlNldEludGVybmFsRmllbGQoVjhDdXN0b206OmtNZXNzYWdl
UG9ydEVudGFuZ2xlZFBvcnRJbmRleCwgcG9ydDFXcmFwcGVyKTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgd3Jh
cHBlciBlbnRhbmdsZW1lbnQgd2hlbiBhIHBvcnQgaXMgbm90IGVudGFuZ2xlZC4KKyAgICAgICAg
ICAgICAgICBpZiAoVjhQcm94eTo6ZG9tT2JqZWN0SGFzSlNXcmFwcGVyKHBvcnQxKSkgeworICAg
ICAgICAgICAgICAgICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcHBlciA9IFY4UHJveHk6
OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIHBvcnQxKTsKKyAg
ICAgICAgICAgICAgICAgICAgQVNTRVJUKHdyYXBwZXItPklzT2JqZWN0KCkpOworICAgICAgICAg
ICAgICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHdyYXBwZXIpLT5TZXRJbnRl
cm5hbEZpZWxkKFY4Q3VzdG9tOjprTWVzc2FnZVBvcnRFbnRhbmdsZWRQb3J0SW5kZXgsIHY4OjpV
bmRlZmluZWQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgfQorfTsKKworY2xhc3MgR3JvdXBlckl0ZW0gew0KKyAgICBwdWJsaWM6DQorICAgICAg
ICBHcm91cGVySXRlbSh1aW50cHRyX3QgZ3JvdXBfaWQsIE5vZGUqIG5vZGUsIHY4OjpQZXJzaXN0
ZW50PHY4OjpPYmplY3Q+IHdyYXBwZXIpIDogZ3JvdXBfaWRfKGdyb3VwX2lkKSwgbm9kZV8obm9k
ZSksIHdyYXBwZXJfKHdyYXBwZXIpIHsgfQ0KKw0KKyAgICAgICAgdWludHB0cl90IGdyb3VwX2lk
KCkgY29uc3QgeyByZXR1cm4gZ3JvdXBfaWRfOyB9DQorICAgICAgICBOb2RlKiBub2RlKCkgY29u
c3QgeyByZXR1cm4gbm9kZV87IH0NCisgICAgICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+
IHdyYXBwZXIoKSBjb25zdCB7IHJldHVybiB3cmFwcGVyXzsgfQ0KKw0KKyAgICBwcml2YXRlOg0K
KyAgICAgICAgdWludHB0cl90IGdyb3VwX2lkXzsNCisgICAgICAgIE5vZGUqIG5vZGVfOw0KKyAg
ICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gd3JhcHBlcl87DQorfTsNCisNCitib29s
IG9wZXJhdG9yPChjb25zdCBHcm91cGVySXRlbSYgYSwgY29uc3QgR3JvdXBlckl0ZW0mIGIpDQor
ew0KKyAgICByZXR1cm4gYS5ncm91cF9pZCgpIDwgYi5ncm91cF9pZCgpOw0KK30NCisNCit0eXBl
ZGVmIFZlY3RvcjxHcm91cGVySXRlbT4gR3JvdXBlckxpc3Q7DQorDQorY2xhc3MgT2JqZWN0R3Jv
dXBlclZpc2l0b3IgOiBwdWJsaWMgRE9NV3JhcHBlck1hcDxOb2RlPjo6VmlzaXRvciB7DQorICAg
IHB1YmxpYzoNCisgICAgICAgIE9iamVjdEdyb3VwZXJWaXNpdG9yKCkgew0KKyAgICAgICAgICAg
IC8vIEZJWE1FOiBncm91cGVyXy5yZXNlcnZlQ2FwYWNpdHkobm9kZV9tYXAuc2l6ZSgpKTsgID8N
CisgICAgICAgIH0NCisNCisgICAgICAgIHZvaWQgdmlzaXRET01XcmFwcGVyKE5vZGUqIG5vZGUs
IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdyYXBwZXIpIHsKKworICAgICAgICAgICAgLy8g
SWYgdGhlIG5vZGUgaXMgaW4gZG9jdW1lbnQsIHB1dCBpdCBpbiB0aGUgb3duZXJEb2N1bWVudCdz
IG9iamVjdCBncm91cC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiBhbiBpbWFn
ZSBlbGVtZW50IHdhcyBjcmVhdGVkIGJ5IEphdmFTY3JpcHQgIm5ldyBJbWFnZSIsCisgICAgICAg
ICAgICAvLyBpdCBpcyBub3QgaW4gYSBkb2N1bWVudC4gSG93ZXZlciwgaWYgdGhlIGxvYWQgZXZl
bnQgaGFzIG5vdAorICAgICAgICAgICAgLy8gYmVlbiBmaXJlZCAoc3RpbGwgb25sb2FkaW5nKSwg
aXQgaXMgdHJlYXRlZCBhcyBpbiB0aGUgZG9jdW1lbnQuCisgICAgICAgICAgICAvLworICAgICAg
ICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgbm9kZSBpcyBwdXQgaW4gYW4gb2JqZWN0IGdyb3VwIGlk
ZW50aWZpZWQgYnkgdGhlIHJvb3QKKyAgICAgICAgICAgIC8vIGVsbWVudCBvZiB0aGUgdHJlZSB0
byB3aGljaCBpdCBiZWxvbmdzLgorICAgICAgICAgICAgdWludHB0cl90IGdyb3VwSWQ7CisgICAg
ICAgICAgICBpZiAobm9kZS0+aW5Eb2N1bWVudCgpIHx8IChub2RlLT5oYXNUYWdOYW1lKEhUTUxO
YW1lczo6aW1nVGFnKSAmJiAhc3RhdGljX2Nhc3Q8SFRNTEltYWdlRWxlbWVudCo+KG5vZGUpLT5o
YXZlRmlyZWRMb2FkRXZlbnQoKSkpIHsKKyAgICAgICAgICAgICAgICBncm91cElkID0gcmVpbnRl
cnByZXRfY2FzdDx1aW50cHRyX3Q+KG5vZGUtPmRvY3VtZW50KCkpOworICAgICAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgICAgICBOb2RlKiByb290ID0gbm9kZTsKKyAgICAgICAgICAgICAg
ICB3aGlsZSAocm9vdC0+cGFyZW50KCkpCisgICAgICAgICAgICAgICAgICAgIHJvb3QgPSByb290
LT5wYXJlbnQoKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGFsb25lIGlu
IGl0cyBET00gdHJlZSAoZG9lc24ndCBoYXZlIGEgcGFyZW50IG9yIGFueQorICAgICAgICAgICAg
ICAgIC8vIGNoaWxkcmVuKSB0aGVuIHRoZSBncm91cCB3aWxsIGJlIGZpbHRlcmVkIG91dCBsYXRl
ciBhbnl3YXkuCisgICAgICAgICAgICAgICAgaWYgKHJvb3QgPT0gbm9kZSAmJiAhbm9kZS0+aGFz
Q2hpbGROb2RlcygpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAg
ICAgICBncm91cElkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHJvb3QpOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgZ3JvdXBlcl8uYXBwZW5kKEdyb3VwZXJJdGVtKGdyb3VwSWQs
IG5vZGUsIHdyYXBwZXIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYXBwbHlHcm91cGlu
ZygpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gR3JvdXAgYnkgc29ydGluZyBieSB0aGUg
Z3JvdXAgaWQuDQorICAgICAgICAgICAgc3RkOjpzb3J0KGdyb3VwZXJfLmJlZ2luKCksIGdyb3Vw
ZXJfLmVuZCgpKTsNCisNCisgICAgICAgICAgICAvLyBGSVhNRSBTaG91bGQgcHJvYmFibHkgd29y
ayBpbiBpdGVyYXRvcnMgaGVyZSwgYnV0IGluZGV4ZXMgd2VyZSBlYXNpZXIgZm9yIG15IHNpbXBs
ZSBtaW5kLg0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZ3JvdXBlcl8uc2l6
ZSgpOyApIHsNCisgICAgICAgICAgICAgICAgLy8gU2VlayB0byB0aGUgbmV4dCBrZXkgKG9yIHRo
ZSBlbmQgb2YgdGhlIGxpc3QpLg0KKyAgICAgICAgICAgICAgICBzaXplX3QgbmV4dF9rZXlfaW5k
ZXggPSBncm91cGVyXy5zaXplKCk7DQorICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSBp
OyBqIDwgZ3JvdXBlcl8uc2l6ZSgpOyArK2opIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChn
cm91cGVyX1tpXS5ncm91cF9pZCgpICE9IGdyb3VwZXJfW2pdLmdyb3VwX2lkKCkpIHsNCisgICAg
ICAgICAgICAgICAgICAgICAgICBuZXh0X2tleV9pbmRleCA9IGo7DQorICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAg
IH0NCisNCisgICAgICAgICAgICAgICAgQVNTRVJUKG5leHRfa2V5X2luZGV4ID4gaSk7DQorDQor
ICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgY2FyZSBhYm91dCBhIGdyb3VwIGlmIGl0IGhhcyBt
b3JlIHRoYW4gb25lIG9iamVjdC4gSWYgaXQgb25seQ0KKyAgICAgICAgICAgICAgICAvLyBoYXMg
b25lIG9iamVjdCwgaXQgaGFzIG5vdGhpbmcgZWxzZSB0aGF0IG5lZWRzIHRvIGJlIGtlcHQgYWxp
dmUuDQorICAgICAgICAgICAgICAgIGlmIChuZXh0X2tleV9pbmRleCAtIGkgPD0gMSkgew0KKyAg
ICAgICAgICAgICAgICAgICAgaSA9IG5leHRfa2V5X2luZGV4Ow0KKyAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgVmVj
dG9yPHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gPiBncm91cDsNCisgICAgICAgICAgICAgICAg
Z3JvdXAucmVzZXJ2ZUNhcGFjaXR5KG5leHRfa2V5X2luZGV4IC0gaSk7DQorICAgICAgICAgICAg
ICAgIGZvciAoOyBpIDwgbmV4dF9rZXlfaW5kZXg7ICsraSkgew0KKyAgICAgICAgICAgICAgICAg
ICAgTm9kZSogbm9kZSA9IGdyb3VwZXJfW2ldLm5vZGUoKTsNCisgICAgICAgICAgICAgICAgICAg
IHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gd3JhcHBlciA9IGdyb3VwZXJfW2ldLndyYXBwZXIo
KTsNCisgICAgICAgICAgICAgICAgICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpDQorICAgICAg
ICAgICAgICAgICAgICAgICAgZ3JvdXAuYXBwZW5kKHdyYXBwZXIpOw0KKyAgICAgICAgICAgICAg
ICAgICAgLyogRklYTUU6IFJlLWVuYWJsZWQgdGhpcyBjb2RlIHRvIGF2b2lkIEdDaW5nIHRoZXNl
IHdyYXBwZXJzIQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSB0
aGlzIGRlcGVuZHMgb24gbG9va2luZyB1cCB0aGUgd3JhcHBlcg0KKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGR1cmluZyBhIEdDLCBidXQgd2UgZG9uJ3Qga25vdyB3aGljaCBpc29s
YXRlZCB3b3JsZA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlJ3JlIGluLCBz
byBpdCdzIHVuY2xlYXIgd2hpY2ggbWFwIHRvIGxvb2sgaW4uLi4NCisNCisgICAgICAgICAgICAg
ICAgICAgIC8vIElmIHRoZSBub2RlIGlzIHN0eWxlZCBhbmQgdGhlcmUgaXMgYSB3cmFwcGVyIGZv
ciB0aGUgaW5saW5lDQorICAgICAgICAgICAgICAgICAgICAvLyBzdHlsZSBkZWNsYXJhdGlvbiwg
d2UgbmVlZCB0byBrZWVwIHRoYXQgc3R5bGUgZGVjbGFyYXRpb24NCisgICAgICAgICAgICAgICAg
ICAgIC8vIHdyYXBwZXIgYWxpdmUgYXMgd2VsbCwgc28gd2UgYWRkIGl0IHRvIHRoZSBvYmplY3Qg
Z3JvdXAuDQorICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS0+aXNTdHlsZWRFbGVtZW50KCkp
IHsNCisgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkRWxlbWVudCogZWxlbWVudCA9IHJlaW50
ZXJwcmV0X2Nhc3Q8U3R5bGVkRWxlbWVudCo+KG5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAg
ICBDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSA9IGVsZW1lbnQtPmlubGluZVN0eWxlRGVjbCgp
Ow0KKyAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGUgIT0gTlVMTCkgew0KKyAgICAgICAg
ICAgICAgICAgICAgICAgIHdyYXBwZXIgPSBnZXRET01PYmplY3RNYXAoKS5nZXQoc3R5bGUpOw0K
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpDQorICAgICAg
ICAgICAgICAgICAgICAgICAgICBncm91cC5hcHBlbmQod3JhcHBlcik7DQorICAgICAgICAgICAg
ICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAg
ICovDQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgaWYgKGdyb3VwLnNp
emUoKSA+IDEpDQorICAgICAgICAgICAgICAgICAgICB2ODo6Vjg6OkFkZE9iamVjdEdyb3VwKCZn
cm91cFswXSwgZ3JvdXAuc2l6ZSgpKTsNCisNCisgICAgICAgICAgICAgICAgQVNTRVJUKGkgPT0g
bmV4dF9rZXlfaW5kZXgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgDQorICAgIHBy
aXZhdGU6DQorICAgICAgICBHcm91cGVyTGlzdCBncm91cGVyXzsNCit9Ow0KKw0KKy8vIENyZWF0
ZSBvYmplY3QgZ3JvdXBzIGZvciBET00gdHJlZSBub2Rlcy4NCitzdGF0aWMgdm9pZCBnY1Byb2xv
Z3VlKCkNCit7DQorICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsNCisNCisjaWZuZGVmIE5ERUJV
Rw0KKyAgICBET01PYmplY3RWaXNpdG9yIGRvbU9iamVjdFZpc2l0b3I7DQorICAgIHZpc2l0RE9N
T2JqZWN0c0luQ3VycmVudFRocmVhZCgmZG9tT2JqZWN0VmlzaXRvcik7DQorI2VuZGlmDQorDQor
ICAgIC8vIFJ1biB0aHJvdWdoIGFsbCBvYmplY3RzIHdpdGggcG9zc2libGUgcGVuZGluZyBhY3Rp
dml0eSBtYWtpbmcgdGhlaXINCisgICAgLy8gd3JhcHBlcnMgbm9uIHdlYWsgaWYgdGhlcmUgaXMg
cGVuZGluZyBhY3Rpdml0eS4NCisgICAgR0NQcm9sb2d1ZVZpc2l0b3IgcHJvbG9ndWVWaXNpdG9y
Ow0KKyAgICB2aXNpdEFjdGl2ZURPTU9iamVjdHNJbkN1cnJlbnRUaHJlYWQoJnByb2xvZ3VlVmlz
aXRvcik7DQorDQorICAgIC8vIENyZWF0ZSBvYmplY3QgZ3JvdXBzLg0KKyAgICBPYmplY3RHcm91
cGVyVmlzaXRvciBvYmplY3RHcm91cGVyVmlzaXRvcjsNCisgICAgdmlzaXRET01Ob2Rlc0luQ3Vy
cmVudFRocmVhZCgmb2JqZWN0R3JvdXBlclZpc2l0b3IpOw0KKyAgICBvYmplY3RHcm91cGVyVmlz
aXRvci5hcHBseUdyb3VwaW5nKCk7DQorfQ0KKw0KK2NsYXNzIEdDRXBpbG9ndWVWaXNpdG9yIDog
cHVibGljIERPTVdyYXBwZXJNYXA8dm9pZD46OlZpc2l0b3Igew0KKyAgICBwdWJsaWM6DQorICAg
ICAgICB2b2lkIHZpc2l0RE9NV3JhcHBlcih2b2lkKiBvYmplY3QsIHY4OjpQZXJzaXN0ZW50PHY4
OjpPYmplY3Q+IHdyYXBwZXIpDQorICAgICAgICB7DQorICAgICAgICAgICAgVjhDbGFzc0luZGV4
OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5Ojpkb21XcmFwcGVyVHlwZSh3cmFwcGVyKTsN
CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsNCisjZGVmaW5lIE1BS0VfQ0FTRShUWVBFLCBO
QU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAg
ICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OlRZUEU6IHsgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgXA0KKyAgICAgICAgICAgICAgTkFNRSogaW1wbCA9IHN0YXRpY19jYXN0PE5BTUUq
PihvYmplY3QpOyAgICAgICAgICAgICAgICAgIFwNCisgICAgICAgICAgICAgIGlmIChpbXBsLT5o
YXNQZW5kaW5nQWN0aXZpdHkoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAg
ICAgICAgICAgIEFTU0VSVCghd3JhcHBlci5Jc1dlYWsoKSk7ICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgXA0KKyAgICAgICAgICAgICAgICB3cmFwcGVyLk1ha2VXZWFrKGltcGwsICZ3ZWFr
QWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2spOyAgIFwNCisgICAgICAgICAgICAgIH0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAg
ICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgXA0KKyAgICAgICAgICAgIH0NCitBQ1RJVkVfRE9NX09CSkVDVF9UWVBFUyhNQUtF
X0NBU0UpDQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7DQorI3VuZGVmIE1BS0VfQ0FTRQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfTsN
CisNCitzdGF0aWMgdm9pZCBnY0VwaWxvZ3VlKCkNCit7DQorICAgIHY4OjpIYW5kbGVTY29wZSBz
Y29wZTsNCisNCisgICAgLy8gUnVuIHRocm91Z2ggYWxsIG9iamVjdHMgd2l0aCBwZW5kaW5nIGFj
dGl2aXR5IG1ha2luZyB0aGVpciB3cmFwcGVycyB3ZWFrDQorICAgIC8vIGFnYWluLg0KKyAgICBH
Q0VwaWxvZ3VlVmlzaXRvciBlcGlsb2d1ZVZpc2l0b3I7DQorICAgIHZpc2l0QWN0aXZlRE9NT2Jq
ZWN0c0luQ3VycmVudFRocmVhZCgmZXBpbG9ndWVWaXNpdG9yKTsNCisNCisjaWZuZGVmIE5ERUJV
Rw0KKyAgICAvLyBDaGVjayBhbGwgc3Vydml2YWxzIGFyZSB3ZWFrLg0KKyAgICBET01PYmplY3RW
aXNpdG9yIGRvbU9iamVjdFZpc2l0b3I7DQorICAgIHZpc2l0RE9NT2JqZWN0c0luQ3VycmVudFRo
cmVhZCgmZG9tT2JqZWN0VmlzaXRvcik7DQorDQorICAgIEVuc3VyZVdlYWtET01Ob2RlVmlzaXRv
ciB3ZWFrRE9NTm9kZVZpc2l0b3I7DQorICAgIHZpc2l0RE9NTm9kZXNJbkN1cnJlbnRUaHJlYWQo
JndlYWtET01Ob2RlVmlzaXRvcik7CisKKyAgICBlbnVtZXJhdGVET01PYmplY3RNYXAoZ2NQcm90
ZWN0ZWRNYXAoKSk7CisgICAgZW51bWVyYXRlR2xvYmFsSGFuZGxlcygpOworI3VuZGVmIFVTRV9W
QVIKKyNlbmRpZgorfQorCit0eXBlZGVmIEhhc2hNYXA8aW50LCB2ODo6RnVuY3Rpb25UZW1wbGF0
ZSo+IEZ1bmN0aW9uVGVtcGxhdGVNYXA7CisKK2Jvb2wgQWxsb3dBbGxvY2F0aW9uOjptX2N1cnJl
bnQgPSBmYWxzZTsKKworLy8gSmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlcyBlbmNhcHN1bGF0ZSBl
dmVyeXRoaW5nIG5lZWRlZCB0bworLy8gbG9nIG1lc3NhZ2VzIG9yaWdpbmF0aW5nIGZyb20gSmF2
YVNjcmlwdCB0byB0aGUgQ2hyb21lIGNvbnNvbGUuCitjbGFzcyBKYXZhU2NyaXB0Q29uc29sZU1l
c3NhZ2UgeworcHVibGljOgorICAgIEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZShjb25zdCBTdHJp
bmcmIHN0cmluZywgY29uc3QgU3RyaW5nJiBzb3VyY2VJRCwgdW5zaWduZWQgbGluZU51bWJlcikK
KyAgICAgICAgOiBtX3N0cmluZyhzdHJpbmcpCisgICAgICAgICwgbV9zb3VyY2VJRChzb3VyY2VJ
RCkKKyAgICAgICAgLCBtX2xpbmVOdW1iZXIobGluZU51bWJlcikKKyAgICAgICAgeyAKKyAgICAg
ICAgfQorCisgICAgdm9pZCBhZGRUb1BhZ2UoUGFnZSopIGNvbnN0OworCitwcml2YXRlOgorICAg
IGNvbnN0IFN0cmluZyBtX3N0cmluZzsKKyAgICBjb25zdCBTdHJpbmcgbV9zb3VyY2VJRDsKKyAg
ICBjb25zdCB1bnNpZ25lZCBtX2xpbmVOdW1iZXI7Cit9OworCit2b2lkIEphdmFTY3JpcHRDb25z
b2xlTWVzc2FnZTo6YWRkVG9QYWdlKFBhZ2UqIHBhZ2UpIGNvbnN0Cit7CisgICAgQVNTRVJUKHBh
Z2UpOworICAgIENvbnNvbGUqIGNvbnNvbGUgPSBwYWdlLT5tYWluRnJhbWUoKS0+ZG9tV2luZG93
KCktPmNvbnNvbGUoKTsKKyAgICBjb25zb2xlLT5hZGRNZXNzYWdlKEpTTWVzc2FnZVNvdXJjZSwg
RXJyb3JNZXNzYWdlTGV2ZWwsIG1fc3RyaW5nLCBtX2xpbmVOdW1iZXIsIG1fc291cmNlSUQpOwor
fQorCisvLyBUaGUgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyIGhhbmRsZXMgYWxsIGNvbnNvbGUgbWVz
c2FnZXMgdGhhdCBzdGVtCisvLyBmcm9tIEphdmFTY3JpcHQuIEl0IGtlZXBzIGEgbGlzdCBvZiBt
ZXNzYWdlcyB0aGF0IGhhdmUgYmVlbiBkZWxheWVkIGJ1dAorLy8gaXQgbWFrZXMgc3VyZSB0byBh
ZGQgYWxsIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlIGluIHRoZSByaWdodCBvcmRlci4KK2NsYXNz
IENvbnNvbGVNZXNzYWdlTWFuYWdlciB7CitwdWJsaWM6CisgICAgLy8gQWRkIGEgbWVzc2FnZSB0
byB0aGUgY29uc29sZS4gTWF5IGVuZCB1cCBjYWxsaW5nIEphdmFTY3JpcHQgY29kZQorICAgIC8v
IGluZGlyZWN0bHkgdGhyb3VnaCB0aGUgaW5zcGVjdG9yIHNvIG9ubHkgY2FsbCB0aGlzIGZ1bmN0
aW9uIHdoZW4KKyAgICAvLyBpdCBpcyBzYWZlIHRvIGRvIGFsbG9jYXRpb25zLgorICAgIHN0YXRp
YyB2b2lkIGFkZE1lc3NhZ2UoUGFnZSosIGNvbnN0IEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZSYp
OworCisgICAgLy8gQWRkIGEgbWVzc2FnZSB0byB0aGUgY29uc29sZSBidXQgZGVsYXkgdGhlIHJl
cG9ydGluZyB1bnRpbCBpdAorICAgIC8vIGlzIHNhZmUgdG8gZG8gc286IEVpdGhlciB3aGVuIHdl
IGxlYXZlIEphdmFTY3JpcHQgZXhlY3V0aW9uIG9yCisgICAgLy8gd2hlbiBhZGRpbmcgb3RoZXIg
Y29uc29sZSBtZXNzYWdlcy4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzCisgICAgLy8gbWV0
aG9kIGlzIHRvIGF2b2lkIGNhbGxpbmcgaW50byBWOCB0byBoYW5kbGUgY29uc29sZSBtZXNzYWdl
cworICAgIC8vIHdoZW4gdGhlIFZNIGlzIGluIGEgc3RhdGUgdGhhdCBkb2VzIG5vdCBzdXBwb3J0
IEdDcyBvciBhbGxvY2F0aW9ucy4KKyAgICAvLyBEZWxheWVkIG1lc3NhZ2VzIGFyZSBhbHdheXMg
cmVwb3J0ZWQgaW4gdGhlIHBhZ2UgY29ycmVzcG9uZGluZworICAgIC8vIHRvIHRoZSBhY3RpdmUg
Y29udGV4dC4KKyAgICBzdGF0aWMgdm9pZCBhZGREZWxheWVkTWVzc2FnZShjb25zdCBKYXZhU2Ny
aXB0Q29uc29sZU1lc3NhZ2UmKTsKKworICAgIC8vIFByb2Nlc3MgYW55IGRlbGF5ZWQgbWVzc2Fn
ZXMuIE1heSBlbmQgdXAgY2FsbGluZyBKYXZhU2NyaXB0IGNvZGUKKyAgICAvLyBpbmRpcmVjdGx5
IHRocm91Z2ggdGhlIGluc3BlY3RvciBzbyBvbmx5IGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuCisg
ICAgLy8gaXQgaXMgc2FmZSB0byBkbyBhbGxvY2F0aW9ucy4KKyAgICBzdGF0aWMgdm9pZCBwcm9j
ZXNzRGVsYXllZE1lc3NhZ2VzKCk7CisKK3ByaXZhdGU6CisgICAgLy8gQWxsIGRlbGF5ZWQgbWVz
c2FnZXMgYXJlIHN0b3JlZCBpbiB0aGlzIHZlY3Rvci4gSWYgdGhlIHZlY3RvcgorICAgIC8vIGlz
IE5VTEwsIHRoZXJlIGFyZSBubyBkZWxheWVkIG1lc3NhZ2VzLgorICAgIHN0YXRpYyBWZWN0b3I8
SmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlPiogbV9kZWxheWVkOworfTsKKworVmVjdG9yPEphdmFT
Y3JpcHRDb25zb2xlTWVzc2FnZT4qIENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6bV9kZWxheWVkID0g
MDsKKwordm9pZCBDb25zb2xlTWVzc2FnZU1hbmFnZXI6OmFkZE1lc3NhZ2UoUGFnZSogcGFnZSwg
Y29uc3QgSmF2YVNjcmlwdENvbnNvbGVNZXNzYWdlJiBtZXNzYWdlKQoreworICAgIC8vIFByb2Nl
c3MgYW55IGRlbGF5ZWQgbWVzc2FnZXMgdG8gbWFrZSBzdXJlIHRoYXQgbWVzc2FnZXMKKyAgICAv
LyBhcHBlYXIgaW4gdGhlIHJpZ2h0IG9yZGVyIGluIHRoZSBjb25zb2xlLgorICAgIHByb2Nlc3NE
ZWxheWVkTWVzc2FnZXMoKTsKKyAgICBtZXNzYWdlLmFkZFRvUGFnZShwYWdlKTsKK30KKwordm9p
ZCBDb25zb2xlTWVzc2FnZU1hbmFnZXI6OmFkZERlbGF5ZWRNZXNzYWdlKGNvbnN0IEphdmFTY3Jp
cHRDb25zb2xlTWVzc2FnZSYgbWVzc2FnZSkKK3sKKyAgICBpZiAoIW1fZGVsYXllZCkgeworICAg
ICAgICAvLyBBbGxvY2F0ZSBhIHZlY3RvciBmb3IgdGhlIGRlbGF5ZWQgbWVzc2FnZXMuIFdpbGwg
YmUKKyAgICAgICAgLy8gZGVhbGxvY2F0ZWQgd2hlbiB0aGUgZGVsYXllZCBtZXNzYWdlcyBhcmUg
cHJvY2Vzc2VkCisgICAgICAgIC8vIGluIHByb2Nlc3NEZWxheWVkTWVzc2FnZXMoKS4KKyAgICAg
ICAgbV9kZWxheWVkID0gbmV3IFZlY3RvcjxKYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2U+KCk7Cisg
ICAgfQorICAgIG1fZGVsYXllZC0+YXBwZW5kKG1lc3NhZ2UpOworfQorCit2b2lkIENvbnNvbGVN
ZXNzYWdlTWFuYWdlcjo6cHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpCit7CisgICAgLy8gSWYgd2Ug
aGF2ZSBhIGRlbGF5ZWQgdmVjdG9yIGl0IGNhbm5vdCBiZSBlbXB0eS4KKyAgICBpZiAoIW1fZGVs
YXllZCkKKyAgICAgICAgcmV0dXJuOworICAgIEFTU0VSVCghbV9kZWxheWVkLT5pc0VtcHR5KCkp
OworCisgICAgLy8gQWRkIHRoZSBkZWxheWVkIG1lc3NhZ2VzIHRvIHRoZSBwYWdlIG9mIHRoZSBh
Y3RpdmUKKyAgICAvLyBjb250ZXh0LiBJZiB0aGF0IGZvciBzb21lIGJpemFycmUgcmVhc29uIGRv
ZXMgbm90CisgICAgLy8gZXhpc3QsIHdlIGNsZWFyIHRoZSBsaXN0IG9mIGRlbGF5ZWQgbWVzc2Fn
ZXMgdG8gYXZvaWQKKyAgICAvLyBwb3N0aW5nIG1lc3NhZ2VzLiBXZSBzdGlsbCBkZWFsbG9jYXRl
IHRoZSB2ZWN0b3IuCisgICAgRnJhbWUqIGZyYW1lID0gVjhQcm94eTo6cmV0cmlldmVGcmFtZUZv
ckVudGVyZWRDb250ZXh0KCk7CisgICAgUGFnZSogcGFnZSA9IDA7CisgICAgaWYgKGZyYW1lKQor
ICAgICAgICBwYWdlID0gZnJhbWUtPnBhZ2UoKTsKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgIG1f
ZGVsYXllZC0+Y2xlYXIoKTsKKworICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIGRlbGF5
ZWQgbWVzc2FnZXMgYW5kIGFkZCB0aGVtCisgICAgLy8gdG8gdGhlIGNvbnNvbGUuCisgICAgY29u
c3QgaW50IHNpemUgPSBtX2RlbGF5ZWQtPnNpemUoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8
IHNpemU7IGkrKykgeworICAgICAgICBtX2RlbGF5ZWQtPmF0KGkpLmFkZFRvUGFnZShwYWdlKTsK
KyAgICB9CisKKyAgICAvLyBEZWFsbG9jYXRlIHRoZSBkZWxheWVkIHZlY3Rvci4KKyAgICBkZWxl
dGUgbV9kZWxheWVkOworICAgIG1fZGVsYXllZCA9IDA7Cit9CisKKy8vIENvbnZlbmllbmNlIGNs
YXNzIGZvciBlbnN1cmluZyB0aGF0IGRlbGF5ZWQgbWVzc2FnZXMgaW4gdGhlCisvLyBDb25zb2xl
TWVzc2FnZU1hbmFnZXIgYXJlIHByb2Nlc3NlZCBxdWlja2x5LgorY2xhc3MgQ29uc29sZU1lc3Nh
Z2VTY29wZSB7CitwdWJsaWM6CisgICAgQ29uc29sZU1lc3NhZ2VTY29wZSgpIHsgQ29uc29sZU1l
c3NhZ2VNYW5hZ2VyOjpwcm9jZXNzRGVsYXllZE1lc3NhZ2VzKCk7IH0KKyAgICB+Q29uc29sZU1l
c3NhZ2VTY29wZSgpIHsgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjpwcm9jZXNzRGVsYXllZE1lc3Nh
Z2VzKCk7IH0KK307CisKK3ZvaWQgbG9nSW5mbyhGcmFtZSogZnJhbWUsIGNvbnN0IFN0cmluZyYg
bWVzc2FnZSwgY29uc3QgU3RyaW5nJiB1cmwpDQorew0KKyAgICBQYWdlKiBwYWdlID0gZnJhbWUt
PnBhZ2UoKTsNCisgICAgaWYgKCFwYWdlKQ0KKyAgICAgICAgcmV0dXJuOw0KKyAgICBKYXZhU2Ny
aXB0Q29uc29sZU1lc3NhZ2UgY29uc29sZU1lc3NhZ2UobWVzc2FnZSwgdXJsLCAwKTsNCisgICAg
Q29uc29sZU1lc3NhZ2VNYW5hZ2VyOjphZGRNZXNzYWdlKHBhZ2UsIGNvbnNvbGVNZXNzYWdlKTsN
Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZUNvbnNvbGVNZXNzYWdlKHY4OjpIYW5kbGU8djg6Ok1l
c3NhZ2U+IG1lc3NhZ2UsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBkYXRhKQoreworICAgIC8vIFVz
ZSB0aGUgZnJhbWUgd2hlcmUgSmF2YVNjcmlwdCBpcyBjYWxsZWQgZnJvbS4KKyAgICBGcmFtZSog
ZnJhbWUgPSBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lRm9yRW50ZXJlZENvbnRleHQoKTsKKyAgICBp
ZiAoIWZyYW1lKQorICAgICAgICByZXR1cm47CisKKyAgICBQYWdlKiBwYWdlID0gZnJhbWUtPnBh
Z2UoKTsKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgIHJldHVybjsKKworICAgIHY4OjpIYW5kbGU8
djg6OlN0cmluZz4gZXJyb3JNZXNzYWdlU3RyaW5nID0gbWVzc2FnZS0+R2V0KCk7CisgICAgQVNT
RVJUKCFlcnJvck1lc3NhZ2VTdHJpbmcuSXNFbXB0eSgpKTsKKyAgICBTdHJpbmcgZXJyb3JNZXNz
YWdlID0gVG9XZWJDb3JlU3RyaW5nKGVycm9yTWVzc2FnZVN0cmluZyk7CisKKyAgICB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gcmVzb3VyY2VOYW1lID0gbWVzc2FnZS0+R2V0U2NyaXB0UmVzb3VyY2VO
YW1lKCk7CisgICAgYm9vbCB1c2VVUkwgPSByZXNvdXJjZU5hbWUuSXNFbXB0eSgpIHx8ICFyZXNv
dXJjZU5hbWUtPklzU3RyaW5nKCk7CisgICAgU3RyaW5nIHJlc291cmNlTmFtZVN0cmluZyA9IHVz
ZVVSTCA/IGZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSA6IFRvV2ViQ29yZVN0cmluZyhyZXNvdXJj
ZU5hbWUpOworICAgIEphdmFTY3JpcHRDb25zb2xlTWVzc2FnZSBjb25zb2xlTWVzc2FnZShlcnJv
ck1lc3NhZ2UsIHJlc291cmNlTmFtZVN0cmluZywgbWVzc2FnZS0+R2V0TGluZU51bWJlcigpKTsK
KyAgICBDb25zb2xlTWVzc2FnZU1hbmFnZXI6OmFkZE1lc3NhZ2UocGFnZSwgY29uc29sZU1lc3Nh
Z2UpOworfQorCitlbnVtIERlbGF5UmVwb3J0aW5nIHsKKyAgICBSZXBvcnRMYXRlciwKKyAgICBS
ZXBvcnROb3cKK307CisKK3N0YXRpYyB2b2lkIHJlcG9ydFVuc2FmZUFjY2Vzc1RvKEZyYW1lKiB0
YXJnZXQsIERlbGF5UmVwb3J0aW5nIGRlbGF5KQoreworICAgIEFTU0VSVCh0YXJnZXQpOworICAg
IERvY3VtZW50KiB0YXJnZXREb2N1bWVudCA9IHRhcmdldC0+ZG9jdW1lbnQoKTsKKyAgICBpZiAo
IXRhcmdldERvY3VtZW50KQorICAgICAgICByZXR1cm47CisKKyAgICBGcmFtZSogc291cmNlID0g
VjhQcm94eTo6cmV0cmlldmVGcmFtZUZvckVudGVyZWRDb250ZXh0KCk7CisgICAgaWYgKCFzb3Vy
Y2UgfHwgIXNvdXJjZS0+ZG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgZXJy
b3IgaWYgdGhlIHNvdXJjZSBkb2N1bWVudCBpcyBnb25lLgorCisgICAgRG9jdW1lbnQqIHNvdXJj
ZURvY3VtZW50ID0gc291cmNlLT5kb2N1bWVudCgpOworCisgICAgLy8gRklYTUU6IFRoaXMgZXJy
b3IgbWVzc2FnZSBzaG91bGQgY29udGFpbiBtb3JlIHNwZWNpZmljcyBvZiB3aHkgdGhlIHNhbWUK
KyAgICAvLyBvcmlnaW4gY2hlY2sgaGFzIGZhaWxlZC4KKyAgICBTdHJpbmcgc3RyID0gU3RyaW5n
Ojpmb3JtYXQoIlVuc2FmZSBKYXZhU2NyaXB0IGF0dGVtcHQgdG8gYWNjZXNzIGZyYW1lICIKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggVVJMICVzIGZyb20gZnJhbWUgd2l0
aCBVUkwgJXMuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvbWFpbnMsIHBy
b3RvY29scyBhbmQgcG9ydHMgbXVzdCBtYXRjaC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHRhcmdldERvY3VtZW50LT51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VEb2N1bWVudC0+dXJsKCkuc3Ry
aW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICAvLyBCdWlsZCBhIGNvbnNvbGUgbWVzc2FnZSB3
aXRoIGZha2Ugc291cmNlIElEIGFuZCBsaW5lIG51bWJlci4KKyAgICBjb25zdCBTdHJpbmcga1Nv
dXJjZUlEID0gIiI7CisgICAgY29uc3QgaW50IGtMaW5lTnVtYmVyID0gMTsKKyAgICBKYXZhU2Ny
aXB0Q29uc29sZU1lc3NhZ2UgbWVzc2FnZShzdHIsIGtTb3VyY2VJRCwga0xpbmVOdW1iZXIpOwor
CisgICAgaWYgKGRlbGF5ID09IFJlcG9ydE5vdykgeworICAgICAgICAvLyBOT1RFOiBTYWZhcmkg
cHJpbnRzIHRoZSBtZXNzYWdlIGluIHRoZSB0YXJnZXQgcGFnZSwgYnV0IGl0IHNlZW1zIGxpa2UK
KyAgICAgICAgLy8gaXQgc2hvdWxkIGJlIGluIHRoZSBzb3VyY2UgcGFnZS4gRXZlbiBmb3IgZGVs
YXllZCBtZXNzYWdlcywgd2UgcHV0IGl0IGluCisgICAgICAgIC8vIHRoZSBzb3VyY2UgcGFnZTsg
c2VlIENvbnNvbGVNZXNzYWdlTWFuYWdlcjo6cHJvY2Vzc0RlbGF5ZWRNZXNzYWdlcygpLgorICAg
ICAgICBDb25zb2xlTWVzc2FnZU1hbmFnZXI6OmFkZE1lc3NhZ2Uoc291cmNlLT5wYWdlKCksIG1l
c3NhZ2UpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUKGRlbGF5ID09IFJlcG9ydExh
dGVyKTsKKyAgICAgICAgLy8gV2UgY2Fubm90IHNhZmVseSByZXBvcnQgdGhlIG1lc3NhZ2UgZWFn
ZXJseSwgYmVjYXVzZSB0aGlzIG1heSBjYXVzZQorICAgICAgICAvLyBhbGxvY2F0aW9ucyBhbmQg
R0NzIGludGVybmFsbHkgaW4gVjggYW5kIHdlIGNhbm5vdCBoYW5kbGUgdGhhdCBhdCB0aGlzCisg
ICAgICAgIC8vIHBvaW50LiBUaGVyZWZvcmUgd2UgZGVsYXkgdGhlIHJlcG9ydGluZy4KKyAgICAg
ICAgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjphZGREZWxheWVkTWVzc2FnZShtZXNzYWdlKTsKKyAg
ICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlcG9ydFVuc2FmZUphdmFTY3JpcHRBY2Nlc3Modjg6Okxv
Y2FsPHY4OjpPYmplY3Q+IGhvc3QsIHY4OjpBY2Nlc3NUeXBlIHR5cGUsIHY4OjpMb2NhbDx2ODo6
VmFsdWU+IGRhdGEpCit7CisgICAgRnJhbWUqIHRhcmdldCA9IFY4Q3VzdG9tOjpHZXRUYXJnZXRG
cmFtZShob3N0LCBkYXRhKTsKKyAgICBpZiAodGFyZ2V0KQorICAgICAgICByZXBvcnRVbnNhZmVB
Y2Nlc3NUbyh0YXJnZXQsIFJlcG9ydExhdGVyKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlRmF0
YWxFcnJvckluVjgoKQoreworICAgIC8vIEZJWE1FOiBXZSB0ZW1wb3JhcmlseSBkZWFsIHdpdGgg
VjggaW50ZXJuYWwgZXJyb3Igc2l0dWF0aW9ucworICAgIC8vIHN1Y2ggYXMgb3V0LW9mLW1lbW9y
eSBieSBjcmFzaGluZyB0aGUgcmVuZGVyZXIuCisgICAgQ1JBU0goKTsKK30KKworc3RhdGljIHZv
aWQgcmVwb3J0RmF0YWxFcnJvckluVjgoY29uc3QgY2hhciogbG9jYXRpb24sIGNvbnN0IGNoYXIq
IG1lc3NhZ2UpCit7CisgICAgLy8gVjggaXMgc2h1dGRvd24sIHdlIGNhbm5vdCB1c2UgVjggYXBp
LgorICAgIC8vIFRoZSBvbmx5IHRoaW5nIHdlIGNhbiBkbyBpcyB0byBkaXNhYmxlIEphdmFTY3Jp
cHQuCisgICAgLy8gRklYTUU6IGNsZWFuIHVwIFY4UHJveHkgYW5kIGRpc2FibGUgSmF2YVNjcmlw
dC4KKyAgICBwcmludGYoIlY4IGVycm9yOiAlcyAoJXMpXG4iLCBtZXNzYWdlLCBsb2NhdGlvbik7
CisgICAgaGFuZGxlRmF0YWxFcnJvckluVjgoKTsKK30KKworVjhQcm94eTo6flY4UHJveHkoKQor
eworICAgIGNsZWFyRm9yQ2xvc2UoKTsKKyAgICBkZXN0cm95R2xvYmFsKCk7Cit9CisKK3ZvaWQg
VjhQcm94eTo6ZGVzdHJveUdsb2JhbCgpCit7CisgICAgaWYgKCFtX2dsb2JhbC5Jc0VtcHR5KCkp
IHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIHVucmVnaXN0ZXJHbG9iYWxIYW5kbGUodGhpcywg
bV9nbG9iYWwpOworI2VuZGlmCisgICAgICAgIG1fZ2xvYmFsLkRpc3Bvc2UoKTsKKyAgICAgICAg
bV9nbG9iYWwuQ2xlYXIoKTsKKyAgICB9Cit9CisKKworYm9vbCBWOFByb3h5Ojpkb21PYmplY3RI
YXNKU1dyYXBwZXIodm9pZCogb2JqZWN0KSB7CisgICAgcmV0dXJuIGdldERPTU9iamVjdE1hcCgp
LmNvbnRhaW5zKG9iamVjdCkgfHwgZ2V0QWN0aXZlRE9NT2JqZWN0TWFwKCkuY29udGFpbnMob2Jq
ZWN0KTsKK30KKworLy8gVGhlIGNhbGxlciBtdXN0IGhhdmUgaW5jcmVhc2VkIG9iaidzIHJlZiBj
b3VudC4KK3ZvaWQgVjhQcm94eTo6c2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KHZvaWQqIG9iamVj
dCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gd3JhcHBlcikKK3sKKyAgICBBU1NFUlQobWF5
YmVET01XcmFwcGVyKHdyYXBwZXIpKTsKKyNpZm5kZWYgTkRFQlVHCisgICAgVjhDbGFzc0luZGV4
OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5Ojpkb21XcmFwcGVyVHlwZSh3cmFwcGVyKTsK
KyAgICBzd2l0Y2ggKHR5cGUpIHsKKyNkZWZpbmUgTUFLRV9DQVNFKFRZUEUsIE5BTUUpIGNhc2Ug
VjhDbGFzc0luZGV4OjpUWVBFOgorICAgICAgICBBQ1RJVkVfRE9NX09CSkVDVF9UWVBFUyhNQUtF
X0NBU0UpCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworI3VuZGVmIE1BS0VfQ0FTRQor
ICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorICAgIGdldERPTU9i
amVjdE1hcCgpLnNldChvYmplY3QsIHdyYXBwZXIpOworfQorCisvLyBUaGUgY2FsbGVyIG11c3Qg
aGF2ZSBpbmNyZWFzZWQgb2JqJ3MgcmVmIGNvdW50Lgordm9pZCBWOFByb3h5OjpzZXRKU1dyYXBw
ZXJGb3JBY3RpdmVET01PYmplY3Qodm9pZCogb2JqZWN0LCB2ODo6UGVyc2lzdGVudDx2ODo6T2Jq
ZWN0PiB3cmFwcGVyKQoreworICAgIEFTU0VSVChtYXliZURPTVdyYXBwZXIod3JhcHBlcikpOwor
I2lmbmRlZiBOREVCVUcKKyAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IFY4
UHJveHk6OmRvbVdyYXBwZXJUeXBlKHdyYXBwZXIpOworICAgIHN3aXRjaCAodHlwZSkgeworI2Rl
ZmluZSBNQUtFX0NBU0UoVFlQRSwgTkFNRSkgY2FzZSBWOENsYXNzSW5kZXg6OlRZUEU6IGJyZWFr
OworICAgICAgICBBQ1RJVkVfRE9NX09CSkVDVF9UWVBFUyhNQUtFX0NBU0UpCisgICAgZGVmYXVs
dDogCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworI3VuZGVmIE1BS0VfQ0FTRQorICAg
IH0KKyNlbmRpZgorICAgIGdldEFjdGl2ZURPTU9iamVjdE1hcCgpLnNldChvYmplY3QsIHdyYXBw
ZXIpOworfQorCisvLyBUaGUgY2FsbGVyIG11c3QgaGF2ZSBpbmNyZWFzZWQgbm9kZSdzIHJlZiBj
b3VudC4KK3ZvaWQgVjhQcm94eTo6c2V0SlNXcmFwcGVyRm9yRE9NTm9kZShOb2RlKiBub2RlLCB2
ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiB3cmFwcGVyKQoreworICAgIEFTU0VSVChtYXliZURP
TVdyYXBwZXIod3JhcHBlcikpOworICAgIGdldERPTU5vZGVNYXAoKS5zZXQobm9kZSwgd3JhcHBl
cik7Cit9CisKKy8vIEV2ZW50IGxpc3RlbmVycworCitzdGF0aWMgVjhFdmVudExpc3RlbmVyKiBm
aW5kRXZlbnRMaXN0ZW5lckluTGlzdChWOEV2ZW50TGlzdGVuZXJMaXN0JiBsaXN0LCB2ODo6TG9j
YWw8djg6OlZhbHVlPiBsaXN0ZW5lciwgYm9vbCBpc0lubGluZSkKK3sKKyAgICBBU1NFUlQodjg6
OkNvbnRleHQ6OkluQ29udGV4dCgpKTsKKworICAgIGlmICghbGlzdGVuZXItPklzT2JqZWN0KCkp
CisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGxpc3QuZmluZChsaXN0ZW5lci0+VG9P
YmplY3QoKSwgaXNJbmxpbmUpOworfQorCisvLyBGaW5kIGFuIGV4aXN0aW5nIHdyYXBwZXIgZm9y
IGEgSlMgZXZlbnQgbGlzdGVuZXIgaW4gdGhlIG1hcC4KK1Bhc3NSZWZQdHI8VjhFdmVudExpc3Rl
bmVyPiBWOFByb3h5OjpmaW5kVjhFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6VmFsdWU+IGxp
c3RlbmVyLCBib29sIGlzSW5saW5lKQoreworICAgIHJldHVybiBmaW5kRXZlbnRMaXN0ZW5lcklu
TGlzdChtX2V2ZW50TGlzdGVuZXJzLCBsaXN0ZW5lciwgaXNJbmxpbmUpOworfQorCitQYXNzUmVm
UHRyPFY4RXZlbnRMaXN0ZW5lcj4gVjhQcm94eTo6ZmluZE9yQ3JlYXRlVjhFdmVudExpc3RlbmVy
KHY4OjpMb2NhbDx2ODo6VmFsdWU+IG9iamVjdCwgYm9vbCBpc0lubGluZSkKK3sKKyAgICBBU1NF
UlQodjg6OkNvbnRleHQ6OkluQ29udGV4dCgpKTsKKworICAgIGlmICghb2JqZWN0LT5Jc09iamVj
dCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFY4RXZlbnRMaXN0ZW5lciogd3JhcHBlciA9
IGZpbmRFdmVudExpc3RlbmVySW5MaXN0KG1fZXZlbnRMaXN0ZW5lcnMsIG9iamVjdCwgaXNJbmxp
bmUpOworICAgIGlmICh3cmFwcGVyKQorICAgICAgICByZXR1cm4gd3JhcHBlcjsKKworICAgIC8v
IENyZWF0ZSBhIG5ldyBvbmUsIGFuZCBhZGQgdG8gY2FjaGUuCisgICAgUmVmUHRyPFY4RXZlbnRM
aXN0ZW5lcj4gbmV3TGlzdGVuZXIgPSBWOEV2ZW50TGlzdGVuZXI6OmNyZWF0ZShtX2ZyYW1lLCB2
ODo6TG9jYWw8djg6Ok9iamVjdD46OkNhc3Qob2JqZWN0KSwgaXNJbmxpbmUpOworICAgIG1fZXZl
bnRMaXN0ZW5lcnMuYWRkKG5ld0xpc3RlbmVyLmdldCgpKTsKKworICAgIHJldHVybiBuZXdMaXN0
ZW5lcjsKK30KKworLy8gT2JqZWN0IGV2ZW50IGxpc3RlbmVycyAoc3VjaCBhcyBYbWxIdHRwUmVx
dWVzdCBhbmQgTWVzc2FnZVBvcnQpIGFyZQorLy8gZGlmZmVyZW50IGZyb20gbGlzdGVuZXJzIG9u
IERPTSBub2Rlcy4gQW4gb2JqZWN0IGV2ZW50IGxpc3RlbmVyIHdyYXBwZXIKKy8vIG9ubHkgaG9s
ZHMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgSlMgZnVuY3Rpb24uIEEgc3Ryb25nIHJlZmVyZW5j
ZSBjYW4KKy8vIGNyZWF0ZSBhIGN5Y2xlLgorLy8KKy8vIFRoZSBsaWZldGltZSBvZiB0aGVzZSBv
YmplY3RzIGlzIGJvdW5kZWQgYnkgdGhlIGxpZmUgdGltZSBvZiBpdHMgSlMKKy8vIHdyYXBwZXIu
IFNvIHdlIGNhbiBjcmVhdGUgYSBoaWRkZW4gcmVmZXJlbmNlIGZyb20gdGhlIEpTIHdyYXBwZXIg
dG8KKy8vIHRvIGl0cyBKUyBmdW5jdGlvbi4KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAg
ICAgKG1hcCkKKy8vICAgICAgICAgICAgICBYSFIgICAgICA8LS0tLS0tLS0tLSAgSlNfd3JhcHBl
cgorLy8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgIChoaWRkZW4pIDogIF4KKy8vICAgICAg
ICAgICAgICAgViAgICAgICAgICAgICAgICAgICAgICBWICA6IChtYXkgcmVhY2hhYmxlIGJ5IGNs
b3N1cmUpCisvLyAgICAgICAgICAgVjhfbGlzdGVuZXIgIC0tLS0tLS0tPiBKU19mdW5jdGlvbgor
Ly8gICAgICAgICAgICAgICAgICAgICAgICAgKHdlYWspICA8LS0gbWF5IGNyZWF0ZSBhIGN5Y2xl
IGlmIGl0IGlzIHN0cm9uZworLy8KKy8vIFRoZSBwZXJzaXN0ZW50IHJlZmVyZW5jZSBpcyBtYWRl
IHdlYWsgaW4gdGhlIGNvbnN0cnVjdG9yCisvLyBvZiBWOE9iamVjdEV2ZW50TGlzdGVuZXIuCisK
K1Bhc3NSZWZQdHI8VjhFdmVudExpc3RlbmVyPiBWOFByb3h5OjpmaW5kT2JqZWN0RXZlbnRMaXN0
ZW5lciggdjg6OkxvY2FsPHY4OjpWYWx1ZT4gbGlzdGVuZXIsIGJvb2wgaXNJbmxpbmUpCit7Cisg
ICAgcmV0dXJuIGZpbmRFdmVudExpc3RlbmVySW5MaXN0KG1feGhyTGlzdGVuZXJzLCBsaXN0ZW5l
ciwgaXNJbmxpbmUpOworfQorCitQYXNzUmVmUHRyPFY4RXZlbnRMaXN0ZW5lcj4gVjhQcm94eTo6
ZmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0ZW5lcih2ODo6TG9jYWw8djg6OlZhbHVlPiBvYmpl
Y3QsIGJvb2wgaXNJbmxpbmUpCit7CisgICAgQVNTRVJUKHY4OjpDb250ZXh0OjpJbkNvbnRleHQo
KSk7CisKKyAgICBpZiAoIW9iamVjdC0+SXNPYmplY3QoKSkKKyAgICAgICAgcmV0dXJuIDA7CisK
KyAgICBWOEV2ZW50TGlzdGVuZXIqIHdyYXBwZXIgPSBmaW5kRXZlbnRMaXN0ZW5lckluTGlzdCht
X3hockxpc3RlbmVycywgb2JqZWN0LCBpc0lubGluZSk7CisgICAgaWYgKHdyYXBwZXIpCisgICAg
ICAgIHJldHVybiB3cmFwcGVyOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IG9uZSwgYW5kIGFkZCB0
byBjYWNoZS4KKyAgICBSZWZQdHI8VjhFdmVudExpc3RlbmVyPiBuZXdMaXN0ZW5lciA9IFY4T2Jq
ZWN0RXZlbnRMaXN0ZW5lcjo6Y3JlYXRlKG1fZnJhbWUsIHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6
Q2FzdChvYmplY3QpLCBpc0lubGluZSk7CisgICAgbV94aHJMaXN0ZW5lcnMuYWRkKG5ld0xpc3Rl
bmVyLmdldCgpKTsKKworICAgIHJldHVybiBuZXdMaXN0ZW5lci5yZWxlYXNlKCk7Cit9CisKKwor
c3RhdGljIHZvaWQgcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21MaXN0KFY4RXZlbnRMaXN0ZW5lckxp
c3QmIGxpc3QsIFY4RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpCit7CisgICAgbGlzdC5yZW1vdmUo
bGlzdGVuZXIpOworfQorCit2b2lkIFY4UHJveHk6OnJlbW92ZVY4RXZlbnRMaXN0ZW5lcihWOEV2
ZW50TGlzdGVuZXIqIGxpc3RlbmVyKQoreworICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTGlz
dChtX2V2ZW50TGlzdGVuZXJzLCBsaXN0ZW5lcik7Cit9CisKKwordm9pZCBWOFByb3h5OjpyZW1v
dmVPYmplY3RFdmVudExpc3RlbmVyKFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpCit7
CisgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21MaXN0KG1feGhyTGlzdGVuZXJzLCBsaXN0ZW5l
cik7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2Nvbm5lY3RFdmVudExpc3RlbmVyc0luTGlzdChWOEV2
ZW50TGlzdGVuZXJMaXN0JiBsaXN0KQoreworICAgIFY4RXZlbnRMaXN0ZW5lckxpc3Q6Oml0ZXJh
dG9yIGl0ID0gbGlzdC5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBsaXN0LmVuZCgpKSB7Cisg
ICAgICAgICgqaXQpLT5kaXNjb25uZWN0RnJhbWUoKTsKKyAgICAgICAgKytpdDsKKyAgICB9Cisg
ICAgbGlzdC5jbGVhcigpOworfQorCisKK3ZvaWQgVjhQcm94eTo6ZGlzY29ubmVjdEV2ZW50TGlz
dGVuZXJzKCkKK3sKKyAgICBkaXNjb25uZWN0RXZlbnRMaXN0ZW5lcnNJbkxpc3QobV9ldmVudExp
c3RlbmVycyk7CisgICAgZGlzY29ubmVjdEV2ZW50TGlzdGVuZXJzSW5MaXN0KG1feGhyTGlzdGVu
ZXJzKTsKK30KKworCit2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IFY4UHJveHk6OmNvbXBpbGVTY3Jp
cHQodjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBjb2RlLCBjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBp
bnQgYmFzZUxpbmUpCit7CisgICAgY29uc3QgdWludDE2X3QqIGZpbGVOYW1lU3RyaW5nID0gRnJv
bVdlYkNvcmVTdHJpbmcoZmlsZU5hbWUpOworICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gbmFt
ZSA9IHY4OjpTdHJpbmc6Ok5ldyhmaWxlTmFtZVN0cmluZywgZmlsZU5hbWUubGVuZ3RoKCkpOwor
ICAgIHY4OjpIYW5kbGU8djg6OkludGVnZXI+IGxpbmUgPSB2ODo6SW50ZWdlcjo6TmV3KGJhc2VM
aW5lKTsKKyAgICB2ODo6U2NyaXB0T3JpZ2luIG9yaWdpbihuYW1lLCBsaW5lKTsKKyAgICB2ODo6
SGFuZGxlPHY4OjpTY3JpcHQ+IHNjcmlwdCA9IHY4OjpTY3JpcHQ6OkNvbXBpbGUoY29kZSwgJm9y
aWdpbik7CisgICAgcmV0dXJuIHNjcmlwdDsKK30KKworYm9vbCBWOFByb3h5OjpoYW5kbGVPdXRP
Zk1lbW9yeSgpCit7CisgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gdjg6OkNv
bnRleHQ6OkdldEN1cnJlbnQoKTsKKworICAgIGlmICghY29udGV4dC0+SGFzT3V0T2ZNZW1vcnlF
eGNlcHRpb24oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gV2FybmluZywgZXJy
b3IsIGRpc2FibGUgSlMgZm9yIHRoaXMgZnJhbWU/CisgICAgRnJhbWUqIGZyYW1lID0gVjhQcm94
eTo6cmV0cmlldmVGcmFtZShjb250ZXh0KTsKKworICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94
eTo6cmV0cmlldmUoZnJhbWUpOworICAgIGlmIChwcm94eSkgeworICAgICAgICAvLyBDbGVhbiBt
X2NvbnRleHQsIGFuZCBldmVudCBoYW5kbGVycy4KKyAgICAgICAgcHJveHktPmNsZWFyRm9yQ2xv
c2UoKTsKKworICAgICAgICBwcm94eS0+ZGVzdHJveUdsb2JhbCgpOworICAgIH0KKworICAgIENo
cm9taXVtQnJpZGdlOjpub3RpZnlKU091dE9mTWVtb3J5KGZyYW1lKTsKKworICAgIC8vIERpc2Fi
bGUgSlMuCisgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZnJhbWUtPnNldHRpbmdzKCk7CisgICAg
QVNTRVJUKHNldHRpbmdzKTsKKyAgICBzZXR0aW5ncy0+c2V0SmF2YVNjcmlwdEVuYWJsZWQoZmFs
c2UpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVjhQcm94eTo6ZXZhbHVhdGVJbk5l
d1dvcmxkKGNvbnN0IFZlY3RvcjxTY3JpcHRTb3VyY2VDb2RlPiYgc291cmNlcykNCit7DQorICAg
IGluaXRDb250ZXh0SWZOZWVkZWQoKTsNCisgICAgVjhJc29sYXRlZFdvcmxkOjpldmFsdWF0ZShz
b3VyY2VzLCB0aGlzKTsNCit9CisKK3ZvaWQgVjhQcm94eTo6ZXZhbHVhdGVJbk5ld0NvbnRleHQo
Y29uc3QgVmVjdG9yPFNjcmlwdFNvdXJjZUNvZGU+JiBzb3VyY2VzKQoreworICAgIGluaXRDb250
ZXh0SWZOZWVkZWQoKTsKKworICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKworICAg
IC8vIFNldCB1cCB0aGUgRE9NIHdpbmRvdyBhcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBuZXcgZ2xv
YmFsIG9iamVjdC4KKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB3aW5kb3dDb250ZXh0ID0g
bV9jb250ZXh0OworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd2luZG93R2xvYmFsID0gd2lu
ZG93Q29udGV4dC0+R2xvYmFsKCk7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdpbmRvd1dy
YXBwZXIgPSBWOFByb3h5Ojpsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9X
LCB3aW5kb3dHbG9iYWwpOworCisgICAgQVNTRVJUKFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVy
VG9OYXRpdmU8RE9NV2luZG93Pih3aW5kb3dXcmFwcGVyKSA9PSBtX2ZyYW1lLT5kb21XaW5kb3co
KSk7CisKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGNyZWF0ZU5l
d0NvbnRleHQodjg6OkhhbmRsZTx2ODo6T2JqZWN0PigpKTsKKyAgICB2ODo6Q29udGV4dDo6U2Nv
cGUgY29udGV4dFNjb3BlKGNvbnRleHQpOworCisgICAgLy8gU2V0dXAgY29udGV4dCBpZCBmb3Ig
SlMgZGVidWdnZXIuCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBjb250ZXh0RGF0YSA9IHY4
OjpPYmplY3Q6Ok5ldygpOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3aW5kb3dDb250ZXh0
RGF0YSA9IHdpbmRvd0NvbnRleHQtPkdldERhdGEoKTsKKyAgICBpZiAod2luZG93Q29udGV4dERh
dGEtPklzT2JqZWN0KCkpIHsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBwcm9wZXJ0
eU5hbWUgPSB2ODo6U3RyaW5nOjpOZXcoa0NvbnRleHREZWJ1Z0RhdGFWYWx1ZSk7CisgICAgICAg
IGNvbnRleHREYXRhLT5TZXQocHJvcGVydHlOYW1lLCB2ODo6T2JqZWN0OjpDYXN0KCp3aW5kb3dD
b250ZXh0RGF0YSktPkdldChwcm9wZXJ0eU5hbWUpKTsKKyAgICB9CisgICAgY29udGV4dERhdGEt
PlNldCh2ODo6U3RyaW5nOjpOZXcoa0NvbnRleHREZWJ1Z0RhdGFUeXBlKSwgdjg6OlN0cmluZzo6
TmV3KCJpbmplY3RlZCIpKTsKKyAgICBjb250ZXh0LT5TZXREYXRhKGNvbnRleHREYXRhKTsKKwor
ICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsID0gY29udGV4dC0+R2xvYmFsKCk7CisK
KyAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IGltcGxpY2l0UHJvdG9TdHJpbmcgPSB2ODo6U3Ry
aW5nOjpOZXcoIl9fcHJvdG9fXyIpOworICAgIGdsb2JhbC0+U2V0KGltcGxpY2l0UHJvdG9TdHJp
bmcsIHdpbmRvd1dyYXBwZXIpOworCisgICAgLy8gR2l2ZSB0aGUgY29kZSBydW5uaW5nIGluIHRo
ZSBuZXcgY29udGV4dCBhIHdheSB0byBnZXQgYWNjZXNzIHRvIHRoZQorICAgIC8vIG9yaWdpbmFs
IGNvbnRleHQuCisgICAgZ2xvYmFsLT5TZXQodjg6OlN0cmluZzo6TmV3KCJjb250ZW50V2luZG93
IiksIHdpbmRvd0dsb2JhbCk7CisKKyAgICAvLyBSdW4gY29kZSBpbiB0aGUgbmV3IGNvbnRleHQu
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzb3VyY2VzLnNpemUoKTsgKytpKQorICAgICAg
ICBldmFsdWF0ZShzb3VyY2VzW2ldLCAwKTsKKworICAgIC8vIFVzaW5nIHRoZSBkZWZhdWx0IHNl
Y3VyaXR5IHRva2VuIG1lYW5zIHRoYXQgdGhlIGNhbkFjY2VzcyBpcyBhbHdheXMKKyAgICAvLyBj
YWxsZWQsIHdoaWNoIGlzIHNsb3cuCisgICAgLy8gRklYTUU6IFVzZSB0b2tlbnMgd2hlcmUgcG9z
c2libGUuIFRoaXMgd2lsbCBtZWFuIGtlZXBpbmcgdHJhY2sgb2YgYWxsCisgICAgLy8gY3JlYXRl
ZCBjb250ZXh0cyBzbyB0aGF0IHRoZXkgY2FuIGFsbCBiZSB1cGRhdGVkIHdoZW4gdGhlIGRvY3Vt
ZW50IGRvbWFpbgorICAgIC8vIGNoYW5nZXMuCisgICAgY29udGV4dC0+VXNlRGVmYXVsdFNlY3Vy
aXR5VG9rZW4oKTsKKyAgICBjb250ZXh0LkRpc3Bvc2UoKTsKK30KKwordjg6OkxvY2FsPHY4OjpW
YWx1ZT4gVjhQcm94eTo6ZXZhbHVhdGUoY29uc3QgU2NyaXB0U291cmNlQ29kZSYgc291cmNlLCBO
b2RlKiBub2RlKQoreworICAgIEFTU0VSVCh2ODo6Q29udGV4dDo6SW5Db250ZXh0KCkpOworCisg
ICAgLy8gQ29tcGlsZSB0aGUgc2NyaXB0LgorICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBjb2Rl
ID0gdjhFeHRlcm5hbFN0cmluZyhzb3VyY2Uuc291cmNlKCkpOworICAgIENocm9taXVtQnJpZGdl
Ojp0cmFjZUV2ZW50QmVnaW4oInY4LmNvbXBpbGUiLCBub2RlLCAiIik7CisKKyAgICAvLyBOT1RF
OiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFdlYkNvcmUsIFNjcmlwdFNvdXJjZUNvZGUncyBsaW5l
IHN0YXJ0cyBhdAorICAgIC8vIDEsIHdoZXJlYXMgdjggc3RhcnRzIGF0IDAuCisgICAgdjg6Okhh
bmRsZTx2ODo6U2NyaXB0PiBzY3JpcHQgPSBjb21waWxlU2NyaXB0KGNvZGUsIHNvdXJjZS51cmwo
KSwgc291cmNlLnN0YXJ0TGluZSgpIC0gMSk7CisgICAgQ2hyb21pdW1CcmlkZ2U6OnRyYWNlRXZl
bnRFbmQoInY4LmNvbXBpbGUiLCBub2RlLCAiIik7CisKKyAgICBDaHJvbWl1bUJyaWRnZTo6dHJh
Y2VFdmVudEJlZ2luKCJ2OC5ydW4iLCBub2RlLCAiIik7CisgICAgdjg6OkxvY2FsPHY4OjpWYWx1
ZT4gcmVzdWx0OworICAgIHsKKyAgICAgICAgLy8gSXNvbGF0ZSBleGNlcHRpb25zIHRoYXQgb2Nj
dXIgd2hlbiBleGVjdXRpbmcgdGhlIGNvZGUuIFRoZXNlCisgICAgICAgIC8vIGV4Y2VwdGlvbnMg
c2hvdWxkIG5vdCBpbnRlcmZlcmUgd2l0aCBqYXZhc2NyaXB0IGNvZGUgd2UgbWlnaHQKKyAgICAg
ICAgLy8gZXZhbHVhdGUgZnJvbSBDKysgd2hlbiByZXR1cm5pbmcgZnJvbSBoZXJlLgorICAgICAg
ICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7CisgICAgICAgIHRyeUNhdGNoLlNldFZlcmJvc2UodHJ1
ZSk7CisKKyAgICAgICAgLy8gU2V0IGlubGluZUNvZGUgdG8gdHJ1ZSBmb3IgPGEgaHJlZj0iamF2
YXNjcmlwdDpkb1NvbWV0aGluZygpIj4KKyAgICAgICAgLy8gYW5kIGZhbHNlIGZvciA8c2NyaXB0
PmRvU29tZXRoaW5nPC9zY3JpcHQ+LiBXZSBtYWtlIGEgcm91Z2ggZ3Vlc3MgYXQKKyAgICAgICAg
Ly8gdGhpcyBiYXNlZCBvbiB3aGV0aGVyIHRoZSBzY3JpcHQgc291cmNlIGhhcyBhIFVSTC4KKyAg
ICAgICAgcmVzdWx0ID0gcnVuU2NyaXB0KHNjcmlwdCwgc291cmNlLnVybCgpLnN0cmluZygpLmlz
TnVsbCgpKTsKKyAgICB9CisgICAgQ2hyb21pdW1CcmlkZ2U6OnRyYWNlRXZlbnRFbmQoInY4LnJ1
biIsIG5vZGUsICIiKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2ODo6TG9jYWw8djg6OlZh
bHVlPiBWOFByb3h5OjpydW5TY3JpcHQodjg6OkhhbmRsZTx2ODo6U2NyaXB0PiBzY3JpcHQsIGJv
b2wgaXNJbmxpbmVDb2RlKQoreworICAgIGlmIChzY3JpcHQuSXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKworICAgIC8vIENvbXB1dGUgdGhlIHNv
dXJjZSBzdHJpbmcgYW5kIHByZXZlbnQgYWdhaW5zdCBpbmZpbml0ZSByZWN1cnNpb24uCisgICAg
aWYgKG1fcmVjdXJzaW9uID49IGtNYXhSZWN1cnNpb25EZXB0aCkgeworICAgICAgICB2ODo6TG9j
YWw8djg6OlN0cmluZz4gY29kZSA9IHY4RXh0ZXJuYWxTdHJpbmcoInRocm93IFJhbmdlRXJyb3Io
J1JlY3Vyc2lvbiB0b28gZGVlcCcpIik7CisgICAgICAgIC8vIEZJWE1FOiBJZGVhbGx5LCB3ZSBz
aG91bGQgYmUgYWJsZSB0byByZS11c2UgdGhlIG9yaWdpbiBvZiB0aGUKKyAgICAgICAgLy8gc2Ny
aXB0IHBhc3NlZCB0byB1cyBhcyB0aGUgYXJndW1lbnQgaW5zdGVhZCBvZiB1c2luZyBhbiBlbXB0
eSBzdHJpbmcKKyAgICAgICAgLy8gYW5kIDAgYmFzZUxpbmUuCisgICAgICAgIHNjcmlwdCA9IGNv
bXBpbGVTY3JpcHQoY29kZSwgIiIsIDApOworICAgIH0KKworICAgIGlmIChoYW5kbGVPdXRPZk1l
bW9yeSgpKQorICAgICAgICBBU1NFUlQoc2NyaXB0LklzRW1wdHkoKSk7CisKKyAgICBpZiAoc2Ny
aXB0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7
CisKKyAgICAvLyBTYXZlIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgaW5saW5lQ29kZSBmbGFn
IGFuZCB1cGRhdGUgdGhlIGZsYWcgZm9yCisgICAgLy8gdGhlIGR1cmF0aW9uIG9mIHRoZSBzY3Jp
cHQgaW52b2NhdGlvbi4KKyAgICBib29sIHByZXZpb3VzSW5saW5lQ29kZSA9IGlubGluZUNvZGUo
KTsKKyAgICBzZXRJbmxpbmVDb2RlKGlzSW5saW5lQ29kZSk7CisKKyAgICAvLyBSdW4gdGhlIHNj
cmlwdCBhbmQga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCByZWN1cnNpb24gZGVwdGguCisgICAg
djg6OkxvY2FsPHY4OjpWYWx1ZT4gcmVzdWx0OworICAgIHsKKyAgICAgICAgQ29uc29sZU1lc3Nh
Z2VTY29wZSBzY29wZTsKKyAgICAgICAgbV9yZWN1cnNpb24rKzsKKworICAgICAgICAvLyBTZWUg
Y29tbWVudCBpbiBWOFByb3h5OjpjYWxsRnVuY3Rpb24uCisgICAgICAgIG1fZnJhbWUtPmtlZXBB
bGl2ZSgpOworCisgICAgICAgIHJlc3VsdCA9IHNjcmlwdC0+UnVuKCk7CisgICAgICAgIG1fcmVj
dXJzaW9uLS07CisgICAgfQorCisgICAgaWYgKGhhbmRsZU91dE9mTWVtb3J5KCkpCisgICAgICAg
IEFTU0VSVChyZXN1bHQuSXNFbXB0eSgpKTsKKworICAgIC8vIEhhbmRsZSBWOCBpbnRlcm5hbCBl
cnJvciBzaXR1YXRpb24gKE91dC1vZi1tZW1vcnkpLgorICAgIGlmIChyZXN1bHQuSXNFbXB0eSgp
KQorICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKworICAgIC8vIFJl
c3RvcmUgaW5saW5lQ29kZSBmbGFnLgorICAgIHNldElubGluZUNvZGUocHJldmlvdXNJbmxpbmVD
b2RlKTsKKworICAgIGlmICh2ODo6Vjg6OklzRGVhZCgpKQorICAgICAgICBoYW5kbGVGYXRhbEVy
cm9ySW5WOCgpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1
ZT4gVjhQcm94eTo6Y2FsbEZ1bmN0aW9uKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiBmdW5jdGlv
biwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiByZWNlaXZlciwgaW50IGFyZ2MsIHY4OjpIYW5kbGU8
djg6OlZhbHVlPiBhcmdzW10pCit7CisgICAgLy8gRm9yIG5vdywgd2UgZG9uJ3QgcHV0IGFueSBh
cnRpZmljaWFsIGxpbWl0YXRpb25zIG9uIHRoZSBkZXB0aAorICAgIC8vIG9mIHJlY3Vyc2lvbiB0
aGF0IHN0ZW1zIGZyb20gY2FsbGluZyBmdW5jdGlvbnMuIFRoaXMgaXMgaW4KKyAgICAvLyBjb250
cmFzdCB0byB0aGUgc2NyaXB0IGV2YWx1YXRpb25zLgorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+
IHJlc3VsdDsKKyAgICB7CisgICAgICAgIENvbnNvbGVNZXNzYWdlU2NvcGUgc2NvcGU7CisKKyAg
ICAgICAgLy8gRXZhbHVhdGluZyB0aGUgSmF2YVNjcmlwdCBjb3VsZCBjYXVzZSB0aGUgZnJhbWUg
dG8gYmUgZGVhbGxvY2F0ZWQsCisgICAgICAgIC8vIHNvIHdlIHN0YXJ0IHRoZSBrZWVwIGFsaXZl
IHRpbWVyIGhlcmUuCisgICAgICAgIC8vIEZyYW1lOjprZWVwQWxpdmUgbWV0aG9kIGFkZHMgdGhl
IHJlZiBjb3VudCBvZiB0aGUgZnJhbWUgYW5kIHNldHMgYQorICAgICAgICAvLyB0aW1lciB0byBk
ZWNyZWFzZSB0aGUgcmVmIGNvdW50LiBJdCBhc3N1bWVzIHRoYXQgdGhlIGN1cnJlbnQgSmF2YVNj
cmlwdAorICAgICAgICAvLyBleGVjdXRpb24gZmluaXNocyBiZWZvcmUgZmlyaW5nIHRoZSB0aW1l
ci4KKyAgICAgICAgbV9mcmFtZS0+a2VlcEFsaXZlKCk7CisKKyAgICAgICAgcmVzdWx0ID0gZnVu
Y3Rpb24tPkNhbGwocmVjZWl2ZXIsIGFyZ2MsIGFyZ3MpOworICAgIH0KKworICAgIGlmICh2ODo6
Vjg6OklzRGVhZCgpKQorICAgICAgICBoYW5kbGVGYXRhbEVycm9ySW5WOCgpOworCisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gVjhQcm94eTo6bmV3SW5zdGFu
Y2Uodjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+IGNvbnN0cnVjdG9yLCBpbnQgYXJnYywgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IGFyZ3NbXSkKK3sKKyAgICAvLyBObyBhcnRpZmljaWFsIGxpbWl0YXRp
b25zIG9uIHRoZSBkZXB0aCBvZiByZWN1cnNpb24sIHNlZSBjb21tZW50IGluCisgICAgLy8gVjhQ
cm94eTo6Y2FsbEZ1bmN0aW9uLgorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJlc3VsdDsKKyAg
ICB7CisgICAgICAgIENvbnNvbGVNZXNzYWdlU2NvcGUgc2NvcGU7CisKKyAgICAgICAgLy8gU2Vl
IGNvbW1lbnQgaW4gVjhQcm94eTo6Y2FsbEZ1bmN0aW9uLgorICAgICAgICBtX2ZyYW1lLT5rZWVw
QWxpdmUoKTsKKworICAgICAgICByZXN1bHQgPSBjb25zdHJ1Y3Rvci0+TmV3SW5zdGFuY2UoYXJn
YywgYXJncyk7CisgICAgfQorCisgICAgaWYgKHY4OjpWODo6SXNEZWFkKCkpCisgICAgICAgIGhh
bmRsZUZhdGFsRXJyb3JJblY4KCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2ODo6TG9j
YWw8djg6OkZ1bmN0aW9uPiBWOFByb3h5OjpnZXRDb25zdHJ1Y3RvcihWOENsYXNzSW5kZXg6OlY4
V3JhcHBlclR5cGUgdHlwZSkKK3sKKyAgICAvLyBBIERPTSBjb25zdHJ1Y3RvciBpcyBhIGZ1bmN0
aW9uIGluc3RhbmNlIGNyZWF0ZWQgZnJvbSBhIERPTSBjb25zdHJ1Y3RvcgorICAgIC8vIHRlbXBs
YXRlLiBUaGVyZSBpcyBvbmUgaW5zdGFuY2UgcGVyIGNvbnRleHQuIEEgRE9NIGNvbnN0cnVjdG9y
IGlzCisgICAgLy8gZGlmZmVyZW50IGZyb20gYSBub3JtYWwgZnVuY3Rpb24gaW4gdHdvIHdheXM6
CisgICAgLy8gICAxKSBpdCBjYW5ub3QgYmUgY2FsbGVkIGFzIGNvbnN0cnVjdG9yIChha2EsIHVz
ZWQgdG8gY3JlYXRlIGEgRE9NIG9iamVjdCkKKyAgICAvLyAgIDIpIGl0cyBfX3Byb3RvX18gcG9p
bnRzIHRvIE9iamVjdC5wcm90b3R5cGUgcmF0aGVyIHRoYW4KKyAgICAvLyAgICAgIEZ1bmN0aW9u
LnByb3RvdHlwZS4KKyAgICAvLyBUaGUgcmVhc29uIGZvciAyKSBpcyB0aGF0LCBpbiBTYWZhcmks
IGEgRE9NIGNvbnN0cnVjdG9yIGlzIGEgbm9ybWFsIEpTCisgICAgLy8gb2JqZWN0LCBidXQgbm90
IGEgZnVuY3Rpb24uIEhvdG1haWwgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQsIGluIFNhZmFyaSwK
KyAgICAvLyBIVE1MRWxlbWVudC5fX3Byb3RvX18gPT0gT2JqZWN0LnByb3RvdHlwZS4KKyAgICAv
LworICAgIC8vIG1fb2JqZWN0UHJvdG90eXBlIGlzIGEgY2FjaGUgb2YgdGhlIG9yaWdpbmFsIE9i
amVjdC5wcm90b3R5cGUuCisKKyAgICBBU1NFUlQoaXNDb250ZXh0SW5pdGlhbGl6ZWQoKSk7Cisg
ICAgLy8gRW50ZXIgdGhlIGNvbnRleHQgb2YgdGhlIHByb3h5IHRvIG1ha2Ugc3VyZSB0aGF0IHRo
ZQorICAgIC8vIGZ1bmN0aW9uIGlzIGNvbnN0cnVjdGVkIGluIHRoZSBjb250ZXh0IGNvcnJlc3Bv
bmRpbmcgdG8KKyAgICAvLyB0aGlzIHByb3h5LgorICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29w
ZShtX2NvbnRleHQpOworICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGZ1bmN0
aW9uVGVtcGxhdGUgPSBnZXRUZW1wbGF0ZSh0eXBlKTsKKyAgICAvLyBHZXR0aW5nIHRoZSBmdW5j
dGlvbiBtaWdodCBmYWlsIGlmIHdlJ3JlIHJ1bm5pbmcgb3V0IG9mCisgICAgLy8gc3RhY2sgb3Ig
bWVtb3J5LgorICAgIHY4OjpUcnlDYXRjaCB0cnlDYXRjaDsKKyAgICB2ODo6TG9jYWw8djg6OkZ1
bmN0aW9uPiB2YWx1ZSA9IGZ1bmN0aW9uVGVtcGxhdGUtPkdldEZ1bmN0aW9uKCk7CisgICAgaWYg
KHZhbHVlLklzRW1wdHkoKSkKKyAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPigp
OworICAgIC8vIEhvdG1haWwgZml4LCBzZWUgY29tbWVudHMgYWJvdmUuCisgICAgdmFsdWUtPlNl
dCh2ODo6U3RyaW5nOjpOZXcoIl9fcHJvdG9fXyIpLCBtX29iamVjdFByb3RvdHlwZSk7CisgICAg
cmV0dXJuIHZhbHVlOworfQorCit2ODo6TG9jYWw8djg6Ok9iamVjdD4gVjhQcm94eTo6Y3JlYXRl
V3JhcHBlckZyb21DYWNoZShWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSkKK3sKKyAg
ICBpbnQgY2xhc3NJbmRleCA9IFY4Q2xhc3NJbmRleDo6VG9JbnQodHlwZSk7CisgICAgdjg6Okxv
Y2FsPHY4OjpWYWx1ZT4gY2FjaGVkT2JqZWN0ID0gbV93cmFwcGVyQm9pbGVycGxhdGVzLT5HZXQo
djg6OkludGVnZXI6Ok5ldyhjbGFzc0luZGV4KSk7CisgICAgaWYgKGNhY2hlZE9iamVjdC0+SXNP
YmplY3QoKSkgeworICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjg6Okxv
Y2FsPHY4OjpPYmplY3Q+OjpDYXN0KGNhY2hlZE9iamVjdCk7CisgICAgICAgIHJldHVybiBvYmpl
Y3QtPkNsb25lKCk7CisgICAgfQorCisgICAgLy8gTm90IGluIGNhY2hlLgorICAgIGluaXRDb250
ZXh0SWZOZWVkZWQoKTsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUobV9jb250ZXh0KTsK
KyAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBmdW5jdGlvbiA9IGdldENvbnN0cnVjdG9yKHR5
cGUpOworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBpbnN0YW5jZSA9IFNhZmVBbGxvY2F0aW9u
OjpuZXdJbnN0YW5jZShmdW5jdGlvbik7CisgICAgaWYgKCFpbnN0YW5jZS5Jc0VtcHR5KCkpIHsK
KyAgICAgICAgbV93cmFwcGVyQm9pbGVycGxhdGVzLT5TZXQodjg6OkludGVnZXI6Ok5ldyhjbGFz
c0luZGV4KSwgaW5zdGFuY2UpOworICAgICAgICByZXR1cm4gaW5zdGFuY2UtPkNsb25lKCk7Cisg
ICAgfQorICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworfQorCisvLyBHZXQg
dGhlIHN0cmluZyAndG9TdHJpbmcnLgorc3RhdGljIHY4OjpQZXJzaXN0ZW50PHY4OjpTdHJpbmc+
IEdldFRvU3RyaW5nTmFtZSgpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTCh2ODo6UGVyc2lz
dGVudDx2ODo6U3RyaW5nPiwgdmFsdWUsICgpKTsKKyAgICBpZiAodmFsdWUuSXNFbXB0eSgpKQor
ICAgICAgICB2YWx1ZSA9IHY4OjpQZXJzaXN0ZW50PHY4OjpTdHJpbmc+OjpOZXcodjg6OlN0cmlu
Zzo6TmV3KCJ0b1N0cmluZyIpKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gQ29uc3RydWN0b3JUb1N0cmluZyhjb25zdCB2ODo6QXJndW1lbnRz
JiBhcmdzKQoreworICAgIC8vIFRoZSBET00gY29uc3RydWN0b3JzJyB0b1N0cmluZyBmdW5jdGlv
bnMgZ3JhYiB0aGUgY3VycmVudCB0b1N0cmluZworICAgIC8vIGZvciBGdW5jdGlvbnMgYnkgdGFr
aW5nIHRoZSB0b1N0cmluZyBmdW5jdGlvbiBvZiBpdHNlbGYgYW5kIHRoZW4KKyAgICAvLyBjYWxs
aW5nIGl0IHdpdGggdGhlIGNvbnN0cnVjdG9yIGFzIGl0cyByZWNlaXZlci4gVGhpcyBtZWFucyB0
aGF0CisgICAgLy8gY2hhbmdlcyB0byB0aGUgRnVuY3Rpb24gcHJvdG90eXBlIGNoYWluIG9yIHRv
U3RyaW5nIGZ1bmN0aW9uIGFyZQorICAgIC8vIHJlZmxlY3RlZCB3aGVuIHByaW50aW5nIERPTSBj
b25zdHJ1Y3RvcnMuIFRoZSBvbmx5IHdhcnQgaXMgdGhhdAorICAgIC8vIGNoYW5nZXMgdG8gYSBE
T00gY29uc3RydWN0b3IncyB0b1N0cmluZydzIHRvU3RyaW5nIHdpbGwgY2F1c2UgdGhlCisgICAg
Ly8gdG9TdHJpbmcgb2YgdGhlIERPTSBjb25zdHJ1Y3RvciBpdHNlbGYgdG8gY2hhbmdlLiBUaGlz
IGlzIGV4dHJlbWVseQorICAgIC8vIG9ic2N1cmUgYW5kIHVubGlrZWx5IHRvIGJlIGEgcHJvYmxl
bS4KKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUgPSBhcmdzLkNhbGxlZSgpLT5HZXQo
R2V0VG9TdHJpbmdOYW1lKCkpOworICAgIGlmICghdmFsdWUtPklzRnVuY3Rpb24oKSkgCisgICAg
ICAgIHJldHVybiB2ODo6U3RyaW5nOjpOZXcoIiIpOworICAgIHJldHVybiB2ODo6SGFuZGxlPHY4
OjpGdW5jdGlvbj46OkNhc3QodmFsdWUpLT5DYWxsKGFyZ3MuVGhpcygpLCAwLCAwKTsKK30KKwor
djg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IFY4UHJveHk6OmdldFRlbXBsYXRl
KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlKQoreworICAgIHY4OjpQZXJzaXN0ZW50
PHY4OjpGdW5jdGlvblRlbXBsYXRlPiogY2FjaGVDZWxsID0gVjhDbGFzc0luZGV4OjpHZXRDYWNo
ZSh0eXBlKTsKKyAgICBpZiAoIWNhY2hlQ2VsbC0+SXNFbXB0eSgpKQorICAgICAgICByZXR1cm4g
KmNhY2hlQ2VsbDsKKworICAgIC8vIE5vdCBpbiB0aGUgY2FjaGUuCisgICAgRnVuY3Rpb25UZW1w
bGF0ZUZhY3RvcnkgZmFjdG9yeSA9IFY4Q2xhc3NJbmRleDo6R2V0RmFjdG9yeSh0eXBlKTsKKyAg
ICB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gZGVzY3JpcHRvciA9IGZhY3Rv
cnkoKTsKKyAgICAvLyBET00gY29uc3RydWN0b3JzIGFyZSBmdW5jdGlvbnMgYW5kIHNob3VsZCBw
cmludCB0aGVtc2VsdmVzIGFzIHN1Y2guCisgICAgLy8gSG93ZXZlciwgd2Ugd2lsbCBsYXRlciBy
ZXBsYWNlIHRoZWlyIHByb3RvdHlwZXMgd2l0aCBPYmplY3QKKyAgICAvLyBwcm90b3R5cGVzIHNv
IHdlIG5lZWQgdG8gZXhwbGljaXRseSBvdmVycmlkZSB0b1N0cmluZyBvbiB0aGUKKyAgICAvLyBp
bnN0YW5jZSBpdHNlbGYuIElmIHdlIGxhdGVyIG1ha2UgRE9NIGNvbnN0cnVjdG9ycyBmdWxsIG9i
amVjdHMKKyAgICAvLyB3ZSBjYW4gZ2l2ZSB0aGVtIGNsYXNzIG5hbWVzIGluc3RlYWQgYW5kIE9i
amVjdC5wcm90b3R5cGUudG9TdHJpbmcKKyAgICAvLyB3aWxsIHdvcmsgc28gd2UgY2FuIHJlbW92
ZSB0aGlzIGNvZGUuCisgICAgREVGSU5FX1NUQVRJQ19MT0NBTCh2ODo6UGVyc2lzdGVudDx2ODo6
RnVuY3Rpb25UZW1wbGF0ZT4sIHRvU3RyaW5nVGVtcGxhdGUsICgpKTsKKyAgICBpZiAodG9TdHJp
bmdUZW1wbGF0ZS5Jc0VtcHR5KCkpCisgICAgICAgIHRvU3RyaW5nVGVtcGxhdGUgPSB2ODo6UGVy
c2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT46Ok5ldyh2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6
TmV3KENvbnN0cnVjdG9yVG9TdHJpbmcpKTsKKyAgICBkZXNjcmlwdG9yLT5TZXQoR2V0VG9TdHJp
bmdOYW1lKCksIHRvU3RyaW5nVGVtcGxhdGUpOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNh
c2UgVjhDbGFzc0luZGV4OjpDU1NTVFlMRURFQ0xBUkFUSU9OOgorICAgICAgICAvLyBUaGUgbmFt
ZWQgcHJvcGVydHkgaGFuZGxlciBmb3Igc3R5bGUgZGVjbGFyYXRpb25zIGhhcyBhCisgICAgICAg
IC8vIHNldHRlci4gVGhlcmVmb3JlLCB0aGUgaW50ZXJjZXB0b3IgaGFzIHRvIGJlIG9uIHRoZSBv
YmplY3QKKyAgICAgICAgLy8gaXRzZWxmIGFuZCBub3Qgb24gdGhlIHByb3RvdHlwZSBvYmplY3Qu
CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0
eUhhbmRsZXIoIFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoQ1NTU3R5bGVEZWNsYXJhdGlvbiks
IFVTRV9OQU1FRF9QUk9QRVJUWV9TRVRURVIoQ1NTU3R5bGVEZWNsYXJhdGlvbikpOworICAgICAg
ICBzZXRDb2xsZWN0aW9uU3RyaW5nT3JOdWxsSW5kZXhlZEdldHRlcjxDU1NTdHlsZURlY2xhcmF0
aW9uPihkZXNjcmlwdG9yKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6
OkNTU1JVTEVMSVNUOgorICAgICAgICBzZXRDb2xsZWN0aW9uSW5kZXhlZEdldHRlcjxDU1NSdWxl
TGlzdCwgQ1NTUnVsZT4oZGVzY3JpcHRvciwgIFY4Q2xhc3NJbmRleDo6Q1NTUlVMRSk7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpDU1NWQUxVRUxJU1Q6CisgICAgICAg
IHNldENvbGxlY3Rpb25JbmRleGVkR2V0dGVyPENTU1ZhbHVlTGlzdCwgQ1NTVmFsdWU+KGRlc2Ny
aXB0b3IsIFY4Q2xhc3NJbmRleDo6Q1NTVkFMVUUpOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IFY4Q2xhc3NJbmRleDo6Q1NTVkFSSUFCTEVTREVDTEFSQVRJT046CisgICAgICAgIHNldENvbGxl
Y3Rpb25TdHJpbmdPck51bGxJbmRleGVkR2V0dGVyPENTU1ZhcmlhYmxlc0RlY2xhcmF0aW9uPihk
ZXNjcmlwdG9yKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OldFQktJ
VENTU1RSQU5TRk9STVZBTFVFOgorICAgICAgICBzZXRDb2xsZWN0aW9uSW5kZXhlZEdldHRlcjxX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSwgQ1NTVmFsdWU+KGRlc2NyaXB0b3IsIFY4Q2xhc3NJbmRl
eDo6Q1NTVkFMVUUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6VU5E
RVRFQ1RBQkxFSFRNTENPTExFQ1RJT046CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVt
cGxhdGUoKS0+TWFya0FzVW5kZXRlY3RhYmxlKCk7ICAvLyBmYWxsIHRocm91Z2gKKyAgICBjYXNl
IFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT046CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3Rh
bmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZ
X0dFVFRFUihIVE1MQ29sbGVjdGlvbikpOworICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRl
bXBsYXRlKCktPlNldENhbGxBc0Z1bmN0aW9uSGFuZGxlcihVU0VfQ0FMTEJBQ0soSFRNTENvbGxl
Y3Rpb25DYWxsQXNGdW5jdGlvbikpOworICAgICAgICBzZXRDb2xsZWN0aW9uSW5kZXhlZEdldHRl
cjxIVE1MQ29sbGVjdGlvbiwgTm9kZT4oZGVzY3JpcHRvciwgVjhDbGFzc0luZGV4OjpOT0RFKTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhUTUxPUFRJT05TQ09MTEVD
VElPTjoKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFBy
b3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxDb2xsZWN0aW9uKSk7
CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0SW5kZXhlZFByb3Bl
cnR5SGFuZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoSFRNTE9wdGlvbnNDb2xsZWN0
aW9uKSwgVVNFX0lOREVYRURfUFJPUEVSVFlfU0VUVEVSKEhUTUxPcHRpb25zQ29sbGVjdGlvbikp
OworICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldENhbGxBc0Z1bmN0
aW9uSGFuZGxlcihVU0VfQ0FMTEJBQ0soSFRNTENvbGxlY3Rpb25DYWxsQXNGdW5jdGlvbikpOwor
ICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTFNFTEVDVEVMRU1FTlQ6
CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0
eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MU2VsZWN0RWxlbWVudENvbGxl
Y3Rpb24pKTsKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRJbmRl
eGVkUHJvcGVydHlIYW5kbGVyKG5vZGVDb2xsZWN0aW9uSW5kZXhlZFByb3BlcnR5R2V0dGVyPEhU
TUxTZWxlY3RFbGVtZW50PiwgVVNFX0lOREVYRURfUFJPUEVSVFlfU0VUVEVSKEhUTUxTZWxlY3RF
bGVtZW50Q29sbGVjdGlvbiksCisgICAgICAgICAgICAwLCAwLCBub2RlQ29sbGVjdGlvbkluZGV4
ZWRQcm9wZXJ0eUVudW1lcmF0b3I8SFRNTFNlbGVjdEVsZW1lbnQ+LCB2ODo6SW50ZWdlcjo6TmV3
KFY4Q2xhc3NJbmRleDo6Tk9ERSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJ
bmRleDo6SFRNTERPQ1VNRU5UOiB7CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxh
dGUoKS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVEX1BST1BFUlRZX0dFVFRFUihI
VE1MRG9jdW1lbnQpLCAwLCAwLCBVU0VfTkFNRURfUFJPUEVSVFlfREVMRVRFUihIVE1MRG9jdW1l
bnQpKTsKKworICAgICAgICAvLyBXZSBhZGQgYW4gZXh0cmEgaW50ZXJuYWwgZmllbGQgdG8gYWxs
IERvY3VtZW50IHdyYXBwZXJzIGZvcgorICAgICAgICAvLyBzdG9yaW5nIGEgcGVyIGRvY3VtZW50
IERPTUltcGxlbWVudGF0aW9uIHdyYXBwZXIuCisgICAgICAgIC8vCisgICAgICAgIC8vIEFkZGl0
aW9uYWxseSwgd2UgYWRkIHR3byBleHRyYSBpbnRlcm5hbCBmaWVsZHMgZm9yCisgICAgICAgIC8v
IEhUTUxEb2N1bWVudHMgdG8gaW1wbGVtZW50IHRlbXBvcmFyeSBzaGFkb3dpbmcgb2YKKyAgICAg
ICAgLy8gZG9jdW1lbnQuYWxsLiBPbmUgZmllbGQgaG9sZHMgYW4gb2JqZWN0IHRoYXQgaXMgdXNl
ZCBhcyBhCisgICAgICAgIC8vIG1hcmtlci4gVGhlIG90aGVyIGZpZWxkIGhvbGRzIHRoZSBtYXJr
ZXIgb2JqZWN0IGlmCisgICAgICAgIC8vIGRvY3VtZW50LmFsbCBpcyBub3Qgc2hhZG93ZWQgYW5k
IHNvbWUgb3RoZXIgdmFsdWUgaWYKKyAgICAgICAgLy8gZG9jdW1lbnQuYWxsIGlzIHNoYWRvd2Vk
LgorICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBpbnN0YW5jZVRlbXBsYXRl
ID0gZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBBU1NFUlQoaW5zdGFu
Y2VUZW1wbGF0ZS0+SW50ZXJuYWxGaWVsZENvdW50KCkgPT0gVjhDdXN0b206OmtEZWZhdWx0V3Jh
cHBlckludGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUtPlNldElu
dGVybmFsRmllbGRDb3VudChWOEN1c3RvbTo6a0hUTUxEb2N1bWVudEludGVybmFsRmllbGRDb3Vu
dCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNpZiBFTkFCTEUoU1ZHKQorICAgIGNhc2UgVjhD
bGFzc0luZGV4OjpTVkdET0NVTUVOVDogIC8vIGZhbGwgdGhyb3VnaAorI2VuZGlmCisgICAgY2Fz
ZSBWOENsYXNzSW5kZXg6OkRPQ1VNRU5UOiB7CisgICAgICAgIC8vIFdlIGFkZCBhbiBleHRyYSBp
bnRlcm5hbCBmaWVsZCB0byBhbGwgRG9jdW1lbnQgd3JhcHBlcnMgZm9yCisgICAgICAgIC8vIHN0
b3JpbmcgYSBwZXIgZG9jdW1lbnQgRE9NSW1wbGVtZW50YXRpb24gd3JhcHBlci4KKyAgICAgICAg
djg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2NyaXB0
b3ItPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAgICAgICAgQVNTRVJUKGluc3RhbmNlVGVtcGxhdGUt
PkludGVybmFsRmllbGRDb3VudCgpID09IFY4Q3VzdG9tOjprRGVmYXVsdFdyYXBwZXJJbnRlcm5h
bEZpZWxkQ291bnQpOworICAgICAgICBpbnN0YW5jZVRlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxk
Q291bnQoIFY4Q3VzdG9tOjprRG9jdW1lbnRNaW5pbXVtSW50ZXJuYWxGaWVsZENvdW50KTsKKyAg
ICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpIVE1MQVBQTEVURUxF
TUVOVDogIC8vIGZhbGwgdGhyb3VnaAorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpIVE1MRU1CRURF
TEVNRU5UOiAgLy8gZmFsbCB0aHJvdWdoCisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhUTUxPQkpF
Q1RFTEVNRU5UOgorICAgICAgICAvLyBIVE1MQXBwbGV0RWxlbWVudCwgSFRNTEVtYmVkRWxlbWVu
dCBhbmQgSFRNTE9iamVjdEVsZW1lbnQgYXJlCisgICAgICAgIC8vIGluaGVyaXRlZCBmcm9tIEhU
TUxQbHVnSW5FbGVtZW50LCBhbmQgdGhleSBzaGFyZSB0aGUgc2FtZSBwcm9wZXJ0eQorICAgICAg
ICAvLyBoYW5kbGluZyBjb2RlLgorICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRl
KCktPlNldE5hbWVkUHJvcGVydHlIYW5kbGVyKFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoSFRN
TFBsdWdJbkVsZW1lbnQpLCBVU0VfTkFNRURfUFJPUEVSVFlfU0VUVEVSKEhUTUxQbHVnSW5FbGVt
ZW50KSk7CisgICAgICAgIGRlc2NyaXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0SW5kZXhl
ZFByb3BlcnR5SGFuZGxlcihVU0VfSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoSFRNTFBsdWdJbkVs
ZW1lbnQpLCBVU0VfSU5ERVhFRF9QUk9QRVJUWV9TRVRURVIoSFRNTFBsdWdJbkVsZW1lbnQpKTsK
KyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRDYWxsQXNGdW5jdGlv
bkhhbmRsZXIoVVNFX0NBTExCQUNLKEhUTUxQbHVnSW5FbGVtZW50KSk7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpIVE1MRlJBTUVTRVRFTEVNRU5UOgorICAgICAgICBk
ZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldE5hbWVkUHJvcGVydHlIYW5kbGVyKFVT
RV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoSFRNTEZyYW1lU2V0RWxlbWVudCkpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6SFRNTEZPUk1FTEVNRU5UOgorICAgICAgICBk
ZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldE5hbWVkUHJvcGVydHlIYW5kbGVyKFVT
RV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoSFRNTEZvcm1FbGVtZW50KSk7CisgICAgICAgIGRlc2Ny
aXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0SW5kZXhlZFByb3BlcnR5SGFuZGxlcihVU0Vf
SU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoSFRNTEZvcm1FbGVtZW50KSwgMCwgMCwgMCwgbm9kZUNv
bGxlY3Rpb25JbmRleGVkUHJvcGVydHlFbnVtZXJhdG9yPEhUTUxGb3JtRWxlbWVudD4sIHY4OjpJ
bnRlZ2VyOjpOZXcoVjhDbGFzc0luZGV4OjpOT0RFKSk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgVjhDbGFzc0luZGV4OjpDQU5WQVNQSVhFTEFSUkFZOgorICAgICAgICBkZXNjcmlwdG9yLT5J
bnN0YW5jZVRlbXBsYXRlKCktPlNldEluZGV4ZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX0lOREVYRURf
UFJPUEVSVFlfR0VUVEVSKENhbnZhc1BpeGVsQXJyYXkpLCBVU0VfSU5ERVhFRF9QUk9QRVJUWV9T
RVRURVIoQ2FudmFzUGl4ZWxBcnJheSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6U1RZTEVTSEVFVDogIC8vIGZhbGwgdGhyb3VnaAorICAgIGNhc2UgVjhDbGFzc0lu
ZGV4OjpDU1NTVFlMRVNIRUVUOiB7CisgICAgICAgIC8vIFdlIGFkZCBhbiBleHRyYSBpbnRlcm5h
bCBmaWVsZCB0byBob2xkIGEgcmVmZXJlbmNlIHRvCisgICAgICAgIC8vIHRoZSBvd25lciBub2Rl
LgorICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBpbnN0YW5jZVRlbXBsYXRl
ID0gZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBBU1NFUlQoaW5zdGFu
Y2VUZW1wbGF0ZS0+SW50ZXJuYWxGaWVsZENvdW50KCkgPT0gVjhDdXN0b206OmtEZWZhdWx0V3Jh
cHBlckludGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUtPlNldElu
dGVybmFsRmllbGRDb3VudChWOEN1c3RvbTo6a1N0eWxlU2hlZXRJbnRlcm5hbEZpZWxkQ291bnQp
OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWOENsYXNzSW5kZXg6Ok1FRElBTElT
VDoKKyAgICAgICAgc2V0Q29sbGVjdGlvblN0cmluZ09yTnVsbEluZGV4ZWRHZXR0ZXI8TWVkaWFM
aXN0PihkZXNjcmlwdG9yKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6
Ok1JTUVUWVBFQVJSQVk6CisgICAgICAgIHNldENvbGxlY3Rpb25JbmRleGVkQW5kTmFtZWRHZXR0
ZXJzPE1pbWVUeXBlQXJyYXksIE1pbWVUeXBlPihkZXNjcmlwdG9yLCBWOENsYXNzSW5kZXg6Ok1J
TUVUWVBFKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6Ok5BTUVETk9E
RU1BUDoKKyAgICAgICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFBy
b3BlcnR5SGFuZGxlcihVU0VfTkFNRURfUFJPUEVSVFlfR0VUVEVSKE5hbWVkTm9kZU1hcCkpOwor
ICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldEluZGV4ZWRQcm9wZXJ0
eUhhbmRsZXIoVVNFX0lOREVYRURfUFJPUEVSVFlfR0VUVEVSKE5hbWVkTm9kZU1hcCksIDAsIDAs
IDAsIGNvbGxlY3Rpb25JbmRleGVkUHJvcGVydHlFbnVtZXJhdG9yPE5hbWVkTm9kZU1hcD4sIHY4
OjpJbnRlZ2VyOjpOZXcoVjhDbGFzc0luZGV4OjpOT0RFKSk7CisgICAgICAgIGJyZWFrOworI2lm
IEVOQUJMRShET01fU1RPUkFHRSkNCisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlNUT1JBR0U6DQor
ICAgICAgICBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldE5hbWVkUHJvcGVydHlI
YW5kbGVyKFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoU3RvcmFnZSksIFVTRV9OQU1FRF9QUk9Q
RVJUWV9TRVRURVIoU3RvcmFnZSksIDAsIFVTRV9OQU1FRF9QUk9QRVJUWV9ERUxFVEVSKFN0b3Jh
Z2UpLCBWOEN1c3RvbTo6djhTdG9yYWdlTmFtZWRQcm9wZXJ0eUVudW1lcmF0b3IpOw0KKyAgICAg
ICAgZGVzY3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRJbmRleGVkUHJvcGVydHlIYW5k
bGVyKFVTRV9JTkRFWEVEX1BST1BFUlRZX0dFVFRFUihTdG9yYWdlKSwgVVNFX0lOREVYRURfUFJP
UEVSVFlfU0VUVEVSKFN0b3JhZ2UpLCAwLCBVU0VfSU5ERVhFRF9QUk9QRVJUWV9ERUxFVEVSKFN0
b3JhZ2UpKTsNCisgICAgICAgIGJyZWFrOw0KKyNlbmRpZgorICAgIGNhc2UgVjhDbGFzc0luZGV4
OjpOT0RFTElTVDoKKyAgICAgICAgc2V0Q29sbGVjdGlvbkluZGV4ZWRHZXR0ZXI8Tm9kZUxpc3Qs
IE5vZGU+KGRlc2NyaXB0b3IsIFY4Q2xhc3NJbmRleDo6Tk9ERSk7CisgICAgICAgIGRlc2NyaXB0
b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoVVNFX05BTUVE
X1BST1BFUlRZX0dFVFRFUihOb2RlTGlzdCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4
Q2xhc3NJbmRleDo6UExVR0lOOgorICAgICAgICBzZXRDb2xsZWN0aW9uSW5kZXhlZEFuZE5hbWVk
R2V0dGVyczxQbHVnaW4sIE1pbWVUeXBlPihkZXNjcmlwdG9yLCBWOENsYXNzSW5kZXg6Ok1JTUVU
WVBFKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlBMVUdJTkFSUkFZ
OgorICAgICAgICBzZXRDb2xsZWN0aW9uSW5kZXhlZEFuZE5hbWVkR2V0dGVyczxQbHVnaW5BcnJh
eSwgUGx1Z2luPihkZXNjcmlwdG9yLCBWOENsYXNzSW5kZXg6OlBMVUdJTik7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpTVFlMRVNIRUVUTElTVDoKKyAgICAgICAgZGVz
Y3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihVU0Vf
TkFNRURfUFJPUEVSVFlfR0VUVEVSKFN0eWxlU2hlZXRMaXN0KSk7CisgICAgICAgIHNldENvbGxl
Y3Rpb25JbmRleGVkR2V0dGVyPFN0eWxlU2hlZXRMaXN0LCBTdHlsZVNoZWV0PihkZXNjcmlwdG9y
LCBWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4
Q2xhc3NJbmRleDo6RE9NV0lORE9XOiB7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6U2lnbmF0dXJl
PiBkZWZhdWx0U2lnbmF0dXJlID0gdjg6OlNpZ25hdHVyZTo6TmV3KGRlc2NyaXB0b3IpOworCisg
ICAgICAgIGRlc2NyaXB0b3ItPlByb3RvdHlwZVRlbXBsYXRlKCktPlNldE5hbWVkUHJvcGVydHlI
YW5kbGVyKFVTRV9OQU1FRF9QUk9QRVJUWV9HRVRURVIoRE9NV2luZG93KSk7CisgICAgICAgIGRl
c2NyaXB0b3ItPlByb3RvdHlwZVRlbXBsYXRlKCktPlNldEluZGV4ZWRQcm9wZXJ0eUhhbmRsZXIo
VVNFX0lOREVYRURfUFJPUEVSVFlfR0VUVEVSKERPTVdpbmRvdykpOworCisgICAgICAgIGRlc2Ny
aXB0b3ItPlNldEhpZGRlblByb3RvdHlwZSh0cnVlKTsKKworICAgICAgICAvLyBSZXNlcnZlIHNw
YWNlcyBmb3IgcmVmZXJlbmNlcyB0byBsb2NhdGlvbiwgaGlzdG9yeSBhbmQKKyAgICAgICAgLy8g
bmF2aWdhdG9yIG9iamVjdHMuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+
IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAg
ICAgIGluc3RhbmNlVGVtcGxhdGUtPlNldEludGVybmFsRmllbGRDb3VudChWOEN1c3RvbTo6a0RP
TVdpbmRvd0ludGVybmFsRmllbGRDb3VudCk7CisKKyAgICAgICAgLy8gU2V0IGFjY2VzcyBjaGVj
ayBjYWxsYmFja3MsIGJ1dCB0dXJuZWQgb2ZmIGluaXRpYWxseS4KKyAgICAgICAgLy8gV2hlbiBh
IGNvbnRleHQgaXMgZGV0YWNoZWQgZnJvbSBhIGZyYW1lLCB0dXJuIG9uIHRoZSBhY2Nlc3MgY2hl
Y2suCisgICAgICAgIC8vIFR1cm5pbmcgb24gY2hlY2tzIGFsc28gaW52YWxpZGF0ZXMgaW5saW5l
IGNhY2hlcyBvZiB0aGUgb2JqZWN0LgorICAgICAgICBpbnN0YW5jZVRlbXBsYXRlLT5TZXRBY2Nl
c3NDaGVja0NhbGxiYWNrcyhWOEN1c3RvbTo6djhET01XaW5kb3dOYW1lZFNlY3VyaXR5Q2hlY2ss
IFY4Q3VzdG9tOjp2OERPTVdpbmRvd0luZGV4ZWRTZWN1cml0eUNoZWNrLCB2ODo6SW50ZWdlcjo6
TmV3KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XKSwgZmFsc2UpOworICAgICAgICBicmVhazsKKyAg
ICB9CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkxPQ0FUSU9OOiB7CisgICAgICAgIC8vIEZvciBz
ZWN1cml0eSByZWFzb25zLCB0aGVzZSBmdW5jdGlvbnMgYXJlIG9uIHRoZSBpbnN0YW5jZQorICAg
ICAgICAvLyBpbnN0ZWFkIG9mIG9uIHRoZSBwcm90b3R5cGUgb2JqZWN0IHRvIGluc3VyZSB0aGF0
IHRoZXkgY2Fubm90CisgICAgICAgIC8vIGJlIG92ZXJ3cml0dGVuLgorICAgICAgICB2ODo6TG9j
YWw8djg6Ok9iamVjdFRlbXBsYXRlPiBpbnN0YW5jZSA9IGRlc2NyaXB0b3ItPkluc3RhbmNlVGVt
cGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2UtPlNldEFjY2Vzc29yKHY4OjpTdHJpbmc6Ok5ldygi
cmVsb2FkIiksIFY4Q3VzdG9tOjp2OExvY2F0aW9uUmVsb2FkQWNjZXNzb3JHZXR0ZXIsIDAsIHY4
OjpIYW5kbGU8djg6OlZhbHVlPigpLCB2ODo6QUxMX0NBTl9SRUFELCBzdGF0aWNfY2FzdDx2ODo6
UHJvcGVydHlBdHRyaWJ1dGU+KHY4OjpEb250RGVsZXRlIHwgdjg6OlJlYWRPbmx5KSk7CisgICAg
ICAgIGluc3RhbmNlLT5TZXRBY2Nlc3Nvcih2ODo6U3RyaW5nOjpOZXcoInJlcGxhY2UiKSwgVjhD
dXN0b206OnY4TG9jYXRpb25SZXBsYWNlQWNjZXNzb3JHZXR0ZXIsIDAsIHY4OjpIYW5kbGU8djg6
OlZhbHVlPigpLCB2ODo6QUxMX0NBTl9SRUFELCBzdGF0aWNfY2FzdDx2ODo6UHJvcGVydHlBdHRy
aWJ1dGU+KHY4OjpEb250RGVsZXRlIHwgdjg6OlJlYWRPbmx5KSk7CisgICAgICAgIGluc3RhbmNl
LT5TZXRBY2Nlc3Nvcih2ODo6U3RyaW5nOjpOZXcoImFzc2lnbiIpLCBWOEN1c3RvbTo6djhMb2Nh
dGlvbkFzc2lnbkFjY2Vzc29yR2V0dGVyLCAwLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKSwgdjg6
OkFMTF9DQU5fUkVBRCwgc3RhdGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6RG9u
dERlbGV0ZSB8IHY4OjpSZWFkT25seSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2Fz
ZSBWOENsYXNzSW5kZXg6OkhJU1RPUlk6CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWOENs
YXNzSW5kZXg6Ok1FU1NBR0VDSEFOTkVMOiB7CisgICAgICAgIC8vIFJlc2VydmUgdHdvIG1vcmUg
aW50ZXJuYWwgZmllbGRzIGZvciByZWZlcmVuY2luZyB0aGUgcG9ydDEKKyAgICAgICAgLy8gYW5k
IHBvcnQyIHdyYXBwZXJzLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcG9ydCB3cmFwcGVycyBhcmUK
KyAgICAgICAgLy8ga2VwdCBhbGl2ZSB3aGVuIHRoZSBjaGFubmVsIHdyYXBwZXIgaXMuCisgICAg
ICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5kbGVyKFVTRV9DQUxMQkFDSyhNZXNzYWdlQ2hhbm5l
bENvbnN0cnVjdG9yKSk7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGlu
c3RhbmNlVGVtcGxhdGUgPSBkZXNjcmlwdG9yLT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAgICAg
IGluc3RhbmNlVGVtcGxhdGUtPlNldEludGVybmFsRmllbGRDb3VudChWOEN1c3RvbTo6a01lc3Nh
Z2VDaGFubmVsSW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisg
ICAgY2FzZSBWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JUOiB7CisgICAgICAgIC8vIFJlc2VydmUg
b25lIG1vcmUgaW50ZXJuYWwgZmllbGQgZm9yIGtlZXBpbmcgZXZlbnQgbGlzdGVuZXJzLgorICAg
ICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBpbnN0YW5jZVRlbXBsYXRlID0gZGVz
Y3JpcHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgICAgICBpbnN0YW5jZVRlbXBsYXRlLT5T
ZXRJbnRlcm5hbEZpZWxkQ291bnQoVjhDdXN0b206OmtNZXNzYWdlUG9ydEludGVybmFsRmllbGRD
b3VudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmIEVOQUJMRShXT1JLRVJTKQorICAg
IGNhc2UgVjhDbGFzc0luZGV4OjpXT1JLRVI6IHsKKyAgICAgICAgLy8gUmVzZXJ2ZSBvbmUgbW9y
ZSBpbnRlcm5hbCBmaWVsZCBmb3Iga2VlcGluZyBldmVudCBsaXN0ZW5lcnMuCisgICAgICAgIHY4
OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjcmlwdG9y
LT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUtPlNldEludGVy
bmFsRmllbGRDb3VudChWOEN1c3RvbTo6a1dvcmtlckludGVybmFsRmllbGRDb3VudCk7CisgICAg
ICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5kbGVyKFVTRV9DQUxMQkFDSyhXb3JrZXJDb25zdHJ1
Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6
V09SS0VSQ09OVEVYVDogeworICAgICAgICAvLyBSZXNlcnZlIG9uZSBtb3JlIGludGVybmFsIGZp
ZWxkIGZvciBrZWVwaW5nIGV2ZW50IGxpc3RlbmVycy4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpP
YmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2NyaXB0b3ItPkluc3RhbmNlVGVt
cGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2VUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50
KFY4Q3VzdG9tOjprV29ya2VyQ29udGV4dEludGVybmFsRmllbGRDb3VudCk7CisgICAgICAgIGJy
ZWFrOworICAgIH0KKyNlbmRpZiAvLyBXT1JLRVJTCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIG9i
amVjdHMgYXJlIGNyZWF0ZWQgZnJvbSBKYXZhU2NyaXB0LgorICAgIGNhc2UgVjhDbGFzc0luZGV4
OjpET01QQVJTRVI6CisgICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxIYW5kbGVyKFVTRV9DQUxM
QkFDSyhET01QYXJzZXJDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyNpZiBFTkFCTEUo
VklERU8pDQorICAgIGNhc2UgVjhDbGFzc0luZGV4OjpIVE1MQVVESU9FTEVNRU5UOg0KKyAgICAg
ICAgZGVzY3JpcHRvci0+U2V0Q2FsbEhhbmRsZXIoVVNFX0NBTExCQUNLKEhUTUxBdWRpb0VsZW1l
bnRDb25zdHJ1Y3RvcikpOw0KKyAgICAgICAgYnJlYWs7DQorI2VuZGlmCisgICAgY2FzZSBWOENs
YXNzSW5kZXg6OkhUTUxJTUFHRUVMRU1FTlQ6CisgICAgICAgIGRlc2NyaXB0b3ItPlNldENhbGxI
YW5kbGVyKFVTRV9DQUxMQkFDSyhIVE1MSW1hZ2VFbGVtZW50Q29uc3RydWN0b3IpKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhUTUxPUFRJT05FTEVNRU5UOgorICAg
ICAgICBkZXNjcmlwdG9yLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJBQ0soSFRNTE9wdGlvbkVs
ZW1lbnRDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRl
eDo6V0VCS0lUQ1NTTUFUUklYOgorICAgICAgICBkZXNjcmlwdG9yLT5TZXRDYWxsSGFuZGxlcihV
U0VfQ0FMTEJBQ0soV2ViS2l0Q1NTTWF0cml4Q29uc3RydWN0b3IpKTsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OldFQktJVFBPSU5UOgorICAgICAgICBkZXNjcmlwdG9y
LT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJBQ0soV2ViS2l0UG9pbnRDb25zdHJ1Y3RvcikpOwor
ICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6WE1MU0VSSUFMSVpFUjoKKyAg
ICAgICAgZGVzY3JpcHRvci0+U2V0Q2FsbEhhbmRsZXIoVVNFX0NBTExCQUNLKFhNTFNlcmlhbGl6
ZXJDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6
WE1MSFRUUFJFUVVFU1Q6IHsKKyAgICAgICAgLy8gUmVzZXJ2ZSBvbmUgbW9yZSBpbnRlcm5hbCBm
aWVsZCBmb3Iga2VlcGluZyBldmVudCBsaXN0ZW5lcnMuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6
T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlVGVtcGxhdGUgPSBkZXNjcmlwdG9yLT5JbnN0YW5jZVRl
bXBsYXRlKCk7CisgICAgICAgIGluc3RhbmNlVGVtcGxhdGUtPlNldEludGVybmFsRmllbGRDb3Vu
dChWOEN1c3RvbTo6a1hNTEh0dHBSZXF1ZXN0SW50ZXJuYWxGaWVsZENvdW50KTsKKyAgICAgICAg
ZGVzY3JpcHRvci0+U2V0Q2FsbEhhbmRsZXIoVVNFX0NBTExCQUNLKFhNTEh0dHBSZXF1ZXN0Q29u
c3RydWN0b3IpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVjhDbGFzc0luZGV4
OjpYTUxIVFRQUkVRVUVTVFVQTE9BRDogeworICAgICAgICAvLyBSZXNlcnZlIG9uZSBtb3JlIGlu
dGVybmFsIGZpZWxkIGZvciBrZWVwaW5nIGV2ZW50IGxpc3RlbmVycy4KKyAgICAgICAgdjg6Okxv
Y2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2VUZW1wbGF0ZSA9IGRlc2NyaXB0b3ItPklu
c3RhbmNlVGVtcGxhdGUoKTsKKyAgICAgICAgaW5zdGFuY2VUZW1wbGF0ZS0+U2V0SW50ZXJuYWxG
aWVsZENvdW50KFY4Q3VzdG9tOjprWE1MSHR0cFJlcXVlc3RJbnRlcm5hbEZpZWxkQ291bnQpOwor
ICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlhQQVRIRVZBTFVB
VE9SOgorICAgICAgICBkZXNjcmlwdG9yLT5TZXRDYWxsSGFuZGxlcihVU0VfQ0FMTEJBQ0soWFBh
dGhFdmFsdWF0b3JDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6WFNMVFBST0NFU1NPUjoKKyAgICAgICAgZGVzY3JpcHRvci0+U2V0Q2FsbEhhbmRs
ZXIoVVNFX0NBTExCQUNLKFhTTFRQcm9jZXNzb3JDb25zdHJ1Y3RvcikpOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q0xJRU5UUkVDVExJU1Q6CisgICAgICAgIGRlc2Ny
aXB0b3ItPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0SW5kZXhlZFByb3BlcnR5SGFuZGxlcihVU0Vf
SU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoQ2xpZW50UmVjdExpc3QpKTsKKyAgICAgICAgYnJlYWs7
CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgKmNhY2hlQ2VsbCA9
IGRlc2NyaXB0b3I7CisgICAgcmV0dXJuIGRlc2NyaXB0b3I7Cit9CisKK2Jvb2wgVjhQcm94eTo6
aXNDb250ZXh0SW5pdGlhbGl6ZWQoKQoreworICAgIC8vIG1fY29udGV4dCwgbV9nbG9iYWwsIG1f
b2JqZWN0UHJvdG90eXBlIGFuZCBtX3dyYXBwZXJCb2lsZXJwbGF0ZXMgc2hvdWxkCisgICAgLy8g
YWxsIGJlIG5vbi1lbXB0eSBpZiBpZiBtX2NvbnRleHQgaXMgbm9uLWVtcHR5LgorICAgIEFTU0VS
VChtX2NvbnRleHQuSXNFbXB0eSgpIHx8ICFtX2dsb2JhbC5Jc0VtcHR5KCkpOworICAgIEFTU0VS
VChtX2NvbnRleHQuSXNFbXB0eSgpIHx8ICFtX29iamVjdFByb3RvdHlwZS5Jc0VtcHR5KCkpOwor
ICAgIEFTU0VSVChtX2NvbnRleHQuSXNFbXB0eSgpIHx8ICFtX3dyYXBwZXJCb2lsZXJwbGF0ZXMu
SXNFbXB0eSgpKTsKKyAgICByZXR1cm4gIW1fY29udGV4dC5Jc0VtcHR5KCk7Cit9CisKK0RPTVdp
bmRvdyogVjhQcm94eTo6cmV0cmlldmVXaW5kb3coKQoreworICAgIC8vIEZJWE1FOiBUaGlzIHNl
ZW1zIHZlcnkgZnJhZ2lsZS4gSG93IGRvIHdlIGtub3cgdGhhdCB0aGUgZ2xvYmFsIG9iamVjdAor
ICAgIC8vIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCBpcyBzb21ldGhpbmcgc2Vuc2libGU/IERv
IHdlIG5lZWQgdG8gdXNlIHRoZQorICAgIC8vIGxhc3QgZW50ZXJlZCBoZXJlPyBXaG8gY2FsbHMg
dGhpcz8KKyAgICByZXR1cm4gcmV0cmlldmVXaW5kb3codjg6OkNvbnRleHQ6OkdldEN1cnJlbnQo
KSk7Cit9CisKK0RPTVdpbmRvdyogVjhQcm94eTo6cmV0cmlldmVXaW5kb3codjg6OkhhbmRsZTx2
ODo6Q29udGV4dD4gY29udGV4dCkKK3sKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGdsb2Jh
bCA9IGNvbnRleHQtPkdsb2JhbCgpOworICAgIEFTU0VSVCghZ2xvYmFsLklzRW1wdHkoKSk7Cisg
ICAgZ2xvYmFsID0gbG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgZ2xv
YmFsKTsKKyAgICBBU1NFUlQoIWdsb2JhbC5Jc0VtcHR5KCkpOworICAgIHJldHVybiBjb252ZXJ0
VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgZ2xvYmFs
KTsKK30KKworRnJhbWUqIFY4UHJveHk6OnJldHJpZXZlRnJhbWUodjg6OkhhbmRsZTx2ODo6Q29u
dGV4dD4gY29udGV4dCkKK3sKKyAgICByZXR1cm4gcmV0cmlldmVXaW5kb3coY29udGV4dCktPmZy
YW1lKCk7Cit9CisKK0ZyYW1lKiBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lRm9yRW50ZXJlZENvbnRl
eHQoKQoreworICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2ODo6Q29udGV4
dDo6R2V0RW50ZXJlZCgpOworICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgcmV0dXJuIHJldHJpZXZlRnJhbWUoY29udGV4dCk7Cit9CisKK0ZyYW1lKiBW
OFByb3h5OjpyZXRyaWV2ZUZyYW1lRm9yQ3VycmVudENvbnRleHQoKQoreworICAgIHY4OjpIYW5k
bGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2ODo6Q29udGV4dDo6R2V0Q3VycmVudCgpOworICAg
IGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHJl
dHJpZXZlRnJhbWUoY29udGV4dCk7Cit9CisKK0ZyYW1lKiBWOFByb3h5OjpyZXRyaWV2ZUZyYW1l
Rm9yQ2FsbGluZ0NvbnRleHQoKQoreworICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRl
eHQgPSB2ODo6Q29udGV4dDo6R2V0Q2FsbGluZygpOworICAgIGlmIChjb250ZXh0LklzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHJldHJpZXZlRnJhbWUoY29udGV4dCk7
Cit9CisKK0ZyYW1lKiBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lKCkKK3sKKyAgICBET01XaW5kb3cq
IHdpbmRvdyA9IHJldHJpZXZlV2luZG93KCk7CisgICAgcmV0dXJuIHdpbmRvdyA/IHdpbmRvdy0+
ZnJhbWUoKSA6IDA7Cit9CisKK1Y4UHJveHkqIFY4UHJveHk6OnJldHJpZXZlKCkKK3sKKyAgICBE
T01XaW5kb3cqIHdpbmRvdyA9IHJldHJpZXZlV2luZG93KCk7CisgICAgQVNTRVJUKHdpbmRvdyk7
CisgICAgcmV0dXJuIHJldHJpZXZlKHdpbmRvdy0+ZnJhbWUoKSk7Cit9CisKK1Y4UHJveHkqIFY4
UHJveHk6OnJldHJpZXZlKEZyYW1lKiBmcmFtZSkKK3sKKyAgICBpZiAoIWZyYW1lKQorICAgICAg
ICByZXR1cm4gMDsKKyAgICByZXR1cm4gZnJhbWUtPnNjcmlwdCgpLT5pc0VuYWJsZWQoKSA/IGZy
YW1lLT5zY3JpcHQoKS0+cHJveHkoKSA6IDA7Cit9CisKK1Y4UHJveHkqIFY4UHJveHk6OnJldHJp
ZXZlKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQpCit7CisgICAgaWYgKCFjb250ZXh0
LT5pc0RvY3VtZW50KCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiByZXRyaWV2ZShz
dGF0aWNfY2FzdDxEb2N1bWVudCo+KGNvbnRleHQpLT5mcmFtZSgpKTsKK30KKwordm9pZCBWOFBy
b3h5OjpkaXNjb25uZWN0RnJhbWUoKQoreworICAgIGRpc2Nvbm5lY3RFdmVudExpc3RlbmVycygp
OworfQorCitib29sIFY4UHJveHk6OmlzRW5hYmxlZCgpCit7CisgICAgU2V0dGluZ3MqIHNldHRp
bmdzID0gbV9mcmFtZS0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXNldHRpbmdzKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJbiB0aGUgY29tbW9uIGNhc2UsIEphdmFTY3JpcHQgaXMg
ZW5hYmxlZCBhbmQgd2UncmUgZG9uZS4KKyAgICBpZiAoc2V0dGluZ3MtPmlzSmF2YVNjcmlwdEVu
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBJZiBKYXZhU2NyaXB0IGhh
cyBiZWVuIGRpc2FibGVkLCB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlIGZyYW1lIHRvIHRlbGwKKyAg
ICAvLyB3aGV0aGVyIHRoaXMgc2NyaXB0IGNhbWUgZnJvbSB0aGUgd2ViIG9yIHRoZSBlbWJlZGRl
ci4gU2NyaXB0cyBmcm9tIHRoZQorICAgIC8vIGVtYmVkZGVyIGFyZSBzYWZlIHRvIHJ1biwgYnV0
IHNjcmlwdHMgZnJvbSB0aGUgb3RoZXIgc291cmNlcyBhcmUKKyAgICAvLyBkaXNhbGxvd2VkLgor
ICAgIERvY3VtZW50KiBkb2N1bWVudCA9IG1fZnJhbWUtPmRvY3VtZW50KCk7CisgICAgaWYgKCFk
b2N1bWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgU2VjdXJpdHlPcmlnaW4qIG9y
aWdpbiA9IGRvY3VtZW50LT5zZWN1cml0eU9yaWdpbigpOworICAgIGlmIChvcmlnaW4tPnByb3Rv
Y29sKCkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBVbmluaXRpYWxpemVk
IGRvY3VtZW50CisKKyAgICBpZiAob3JpZ2luLT5wcm90b2NvbCgpID09ICJodHRwIiB8fCBvcmln
aW4tPnByb3RvY29sKCkgPT0gImh0dHBzIikKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gV2Vi
IHNpdGUKKworICAgIC8vIEZJWE1FOiB0aGUgZm9sbG93aW5nIGFyZSBhcHBsaWNhdGlvbiBkZWNp
c2lvbnMsIGFuZCB0aGV5IHNob3VsZAorICAgIC8vIG5vdCBiZSBtYWRlIGF0IHRoaXMgbGF5ZXIu
IGluc3RlYWQsIHdlIHNob3VsZCBicmlkZ2Ugb3V0IHRvIHRoZQorICAgIC8vIGVtYmVkZGVyIHRv
IGFsbG93IHRoZW0gdG8gb3ZlcnJpZGUgcG9saWN5IGhlcmUuCisKKyAgICBpZiAob3JpZ2luLT5w
cm90b2NvbCgpID09IENocm9taXVtQnJpZGdlOjp1aVJlc291cmNlUHJvdG9jb2woKSkKKyAgICAg
ICAgcmV0dXJuIHRydWU7ICAgLy8gRW1iZWRkZXIncyBzY3JpcHRzIGFyZSBvayB0byBydW4KKwor
ICAgIC8vIElmIHRoZSBzY2hlbWUgaXMgZnRwOiBvciBmaWxlOiwgYW4gZW1wdHkgZmlsZSBuYW1l
IGluZGljYXRlcyBhIGRpcmVjdG9yeQorICAgIC8vIGxpc3RpbmcsIHdoaWNoIHJlcXVpcmVzIEph
dmFTY3JpcHQgdG8gZnVuY3Rpb24gcHJvcGVybHkuCisgICAgY29uc3QgY2hhcioga0RpclByb3Rv
Y29sc1tdID0geyAiZnRwIiwgImZpbGUiIH07CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBh
cnJheXNpemUoa0RpclByb3RvY29scyk7ICsraSkgeworICAgICAgICBpZiAob3JpZ2luLT5wcm90
b2NvbCgpID09IGtEaXJQcm90b2NvbHNbaV0pIHsKKyAgICAgICAgICAgIGNvbnN0IEtVUkwmIHVy
bCA9IGRvY3VtZW50LT51cmwoKTsKKyAgICAgICAgICAgIHJldHVybiB1cmwucGF0aEFmdGVyTGFz
dFNsYXNoKCkgPT0gdXJsLnBhdGhFbmQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVy
biBmYWxzZTsgIC8vIE90aGVyIHByb3RvY29scyBmYWxsIHRocm91Z2ggdG8gaGVyZQorfQorCit2
b2lkIFY4UHJveHk6OnVwZGF0ZURvY3VtZW50V3JhcHBlcih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4g
d3JhcHBlcikKK3sKKyAgICBjbGVhckRvY3VtZW50V3JhcHBlcigpOworCisgICAgQVNTRVJUKG1f
ZG9jdW1lbnQuSXNFbXB0eSgpKTsKKyAgICBtX2RvY3VtZW50ID0gdjg6OlBlcnNpc3RlbnQ8djg6
OlZhbHVlPjo6TmV3KHdyYXBwZXIpOworI2lmbmRlZiBOREVCVUcKKyAgICByZWdpc3Rlckdsb2Jh
bEhhbmRsZShQUk9YWSwgdGhpcywgbV9kb2N1bWVudCk7CisjZW5kaWYKK30KKwordm9pZCBWOFBy
b3h5OjpjbGVhckRvY3VtZW50V3JhcHBlcigpCit7CisgICAgaWYgKCFtX2RvY3VtZW50LklzRW1w
dHkoKSkgeworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgdW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0
aGlzLCBtX2RvY3VtZW50KTsKKyNlbmRpZgorICAgICAgICBtX2RvY3VtZW50LkRpc3Bvc2UoKTsK
KyAgICAgICAgbV9kb2N1bWVudC5DbGVhcigpOworICAgIH0KK30KKwordm9pZCBWOFByb3h5Ojp1
cGRhdGVEb2N1bWVudFdyYXBwZXJDYWNoZSgpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRs
ZVNjb3BlOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0U2NvcGUoY29udGV4dCgpKTsK
KworICAgIC8vIElmIHRoZSBkb2N1bWVudCBoYXMgbm8gZnJhbWUsIE5vZGVUb1Y4T2JqZWN0IG1p
Z2h0IGdldCB0aGUKKyAgICAvLyBkb2N1bWVudCB3cmFwcGVyIGZvciBhIGRvY3VtZW50IHRoYXQg
aXMgYWJvdXQgdG8gYmUgZGVsZXRlZC4KKyAgICAvLyBJZiB0aGUgRm9yY2VTZXQgYmVsb3cgY2F1
c2VzIGEgZ2FyYmFnZSBjb2xsZWN0aW9uLCB0aGUgZG9jdW1lbnQKKyAgICAvLyBtaWdodCBnZXQg
ZGVsZXRlZCBhbmQgdGhlIGdsb2JhbCBoYW5kbGUgZm9yIHRoZSBkb2N1bWVudAorICAgIC8vIHdy
YXBwZXIgY2xlYXJlZC4gVXNpbmcgdGhlIGNsZWFyZWQgZ2xvYmFsIGhhbmRsZSB3aWxsIGxlYWQg
dG8KKyAgICAvLyBjcmFzaGVzLiBJbiB0aGlzIGNhc2Ugd2UgY2xlYXIgdGhlIGNhY2hlIGFuZCBs
ZXQgdGhlIERPTVdpbmRvdworICAgIC8vIGFjY2Vzc29yIGhhbmRsZSBhY2Nlc3MgdG8gdGhlIGRv
Y3VtZW50LgorICAgIGlmICghbV9mcmFtZS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSkgeworICAgICAg
ICBjbGVhckRvY3VtZW50V3JhcHBlckNhY2hlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZG9jdW1lbnRXcmFwcGVyID0gY29udmVydE5vZGVU
b1Y4T2JqZWN0KG1fZnJhbWUtPmRvY3VtZW50KCkpOworCisgICAgLy8gSWYgaW5zdGFudGlhdGlv
biBvZiB0aGUgZG9jdW1lbnQgd3JhcHBlciBmYWlscywgY2xlYXIgdGhlIGNhY2hlDQorICAgIC8v
IGFuZCBsZXQgdGhlIERPTVdpbmRvdyBhY2Nlc3NvciBoYW5kbGUgYWNjZXNzIHRvIHRoZSBkb2N1
bWVudC4NCisgICAgaWYgKGRvY3VtZW50V3JhcHBlci5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGNs
ZWFyRG9jdW1lbnRXcmFwcGVyQ2FjaGUoKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQorICAg
IG1fY29udGV4dC0+R2xvYmFsKCktPkZvcmNlU2V0KHY4OjpTdHJpbmc6Ok5ldygiZG9jdW1lbnQi
KSwgZG9jdW1lbnRXcmFwcGVyLCBzdGF0aWNfY2FzdDx2ODo6UHJvcGVydHlBdHRyaWJ1dGU+KHY4
OjpSZWFkT25seSB8IHY4OjpEb250RGVsZXRlKSk7Cit9CisKK3ZvaWQgVjhQcm94eTo6Y2xlYXJE
b2N1bWVudFdyYXBwZXJDYWNoZSgpCit7CisgICAgQVNTRVJUKCFtX2NvbnRleHQuSXNFbXB0eSgp
KTsKKyAgICBtX2NvbnRleHQtPkdsb2JhbCgpLT5Gb3JjZURlbGV0ZSh2ODo6U3RyaW5nOjpOZXco
ImRvY3VtZW50IikpOworfQorCit2b2lkIFY4UHJveHk6OmRpc3Bvc2VDb250ZXh0SGFuZGxlcygp
Cit7CisgICAgaWYgKCFtX2NvbnRleHQuSXNFbXB0eSgpKSB7CisgICAgICAgIG1fY29udGV4dC5E
aXNwb3NlKCk7CisgICAgICAgIG1fY29udGV4dC5DbGVhcigpOworICAgIH0KKworICAgIGlmICgh
bV93cmFwcGVyQm9pbGVycGxhdGVzLklzRW1wdHkoKSkgeworI2lmbmRlZiBOREVCVUcKKyAgICAg
ICAgdW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBtX3dyYXBwZXJCb2lsZXJwbGF0ZXMpOwor
I2VuZGlmCisgICAgICAgIG1fd3JhcHBlckJvaWxlcnBsYXRlcy5EaXNwb3NlKCk7CisgICAgICAg
IG1fd3JhcHBlckJvaWxlcnBsYXRlcy5DbGVhcigpOworICAgIH0KKworICAgIGlmICghbV9vYmpl
Y3RQcm90b3R5cGUuSXNFbXB0eSgpKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgICB1bnJlZ2lz
dGVyR2xvYmFsSGFuZGxlKHRoaXMsIG1fb2JqZWN0UHJvdG90eXBlKTsKKyNlbmRpZgorICAgICAg
ICBtX29iamVjdFByb3RvdHlwZS5EaXNwb3NlKCk7CisgICAgICAgIG1fb2JqZWN0UHJvdG90eXBl
LkNsZWFyKCk7CisgICAgfQorfQorCit2b2lkIFY4UHJveHk6OmNsZWFyRm9yQ2xvc2UoKQorewor
ICAgIGlmICghbV9jb250ZXh0LklzRW1wdHkoKSkgeworICAgICAgICB2ODo6SGFuZGxlU2NvcGUg
aGFuZGxlU2NvcGU7CisKKyAgICAgICAgY2xlYXJEb2N1bWVudFdyYXBwZXIoKTsKKyAgICAgICAg
ZGlzcG9zZUNvbnRleHRIYW5kbGVzKCk7CisgICAgfQorfQorCit2b2lkIFY4UHJveHk6OmNsZWFy
Rm9yTmF2aWdhdGlvbigpCit7CisgICAgZGlzY29ubmVjdEV2ZW50TGlzdGVuZXJzKCk7CisKKyAg
ICBpZiAoIW1fY29udGV4dC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgdjg6OkhhbmRsZVNjb3BlIGhh
bmRsZTsKKyAgICAgICAgY2xlYXJEb2N1bWVudFdyYXBwZXIoKTsKKworICAgICAgICB2ODo6Q29u
dGV4dDo6U2NvcGUgY29udGV4dFNjb3BlKG1fY29udGV4dCk7CisKKyAgICAgICAgLy8gQ2xlYXIg
dGhlIGRvY3VtZW50IHdyYXBwZXIgY2FjaGUgYmVmb3JlIHR1cm5pbmcgb24gYWNjZXNzIGNoZWNr
cyBvbgorICAgICAgICAvLyB0aGUgb2xkIERPTVdpbmRvdyB3cmFwcGVyLiBUaGlzIHdheSwgYWNj
ZXNzIHRvIHRoZSBkb2N1bWVudCB3cmFwcGVyCisgICAgICAgIC8vIHdpbGwgYmUgcHJvdGVjdGVk
IGJ5IHRoZSBzZWN1cml0eSBjaGVja3Mgb24gdGhlIERPTVdpbmRvdyB3cmFwcGVyLgorICAgICAg
ICBjbGVhckRvY3VtZW50V3JhcHBlckNhY2hlKCk7CisKKyAgICAgICAgLy8gVHVybiBvbiBhY2Nl
c3MgY2hlY2sgb24gdGhlIG9sZCBET01XaW5kb3cgd3JhcHBlci4KKyAgICAgICAgdjg6OkhhbmRs
ZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gbG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRP
TVdJTkRPVywgbV9nbG9iYWwpOworICAgICAgICBBU1NFUlQoIXdyYXBwZXIuSXNFbXB0eSgpKTsK
KyAgICAgICAgd3JhcHBlci0+VHVybk9uQWNjZXNzQ2hlY2soKTsKKworICAgICAgICAvLyBTZXBh
cmF0ZSB0aGUgY29udGV4dCBmcm9tIGl0cyBnbG9iYWwgb2JqZWN0LgorICAgICAgICBtX2NvbnRl
eHQtPkRldGFjaEdsb2JhbCgpOworCisgICAgICAgIGRpc3Bvc2VDb250ZXh0SGFuZGxlcygpOwor
CisgICAgICAgIC8vIFJlaW5pdGlhbGl6ZSB0aGUgY29udGV4dCBzbyB0aGUgZ2xvYmFsIG9iamVj
dCBwb2ludHMgdG8KKyAgICAgICAgLy8gdGhlIG5ldyBET00gd2luZG93LgorICAgICAgICBpbml0
Q29udGV4dElmTmVlZGVkKCk7CisgICAgfQorfQorCit2b2lkIFY4UHJveHk6OnNldFNlY3VyaXR5
VG9rZW4oKQoreworICAgIERvY3VtZW50KiBkb2N1bWVudCA9IG1fZnJhbWUtPmRvY3VtZW50KCk7
CisgICAgLy8gU2V0dXAgc2VjdXJpdHkgb3JpZ2luIGFuZCBzZWN1cml0eSB0b2tlbi4KKyAgICBp
ZiAoIWRvY3VtZW50KSB7CisgICAgICAgIG1fY29udGV4dC0+VXNlRGVmYXVsdFNlY3VyaXR5VG9r
ZW4oKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEFzayB0aGUgZG9jdW1lbnQn
cyBTZWN1cml0eU9yaWdpbiB0byBnZW5lcmF0ZSBhIHNlY3VyaXR5IHRva2VuLgorICAgIC8vIElm
IHR3byB0b2tlbnMgYXJlIGVxdWFsLCB0aGVuIHRoZSBTZWN1cml0eU9yaWdpbnMgY2FuQWNjZXNz
IGVhY2ggb3RoZXIuCisgICAgLy8gSWYgdHdvIHRva2VucyBhcmUgbm90IGVxdWFsLCB0aGVuIHdl
IGhhdmUgdG8gY2FsbCBjYW5BY2Nlc3MuCisgICAgLy8gTm90ZTogd2UgY2FuJ3QgdXNlIHRoZSBI
VFRQT3JpZ2luIGlmIGl0IHdhcyBzZXQgZnJvbSB0aGUgRE9NLgorICAgIFNlY3VyaXR5T3JpZ2lu
KiBvcmlnaW4gPSBkb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKTsKKyAgICBTdHJpbmcgdG9rZW47
CisgICAgaWYgKCFvcmlnaW4tPmRvbWFpbldhc1NldEluRE9NKCkpCisgICAgICAgIHRva2VuID0g
ZG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCktPnRvU3RyaW5nKCk7CisKKyAgICAvLyBBbiBlbXB0
eSBvciAibnVsbCIgdG9rZW4gbWVhbnMgd2UgYWx3YXlzIGhhdmUgdG8gY2FsbAorICAgIC8vIGNh
bkFjY2Vzcy4gVGhlIHRvU3RyaW5nIG1ldGhvZCBvbiBzZWN1cml0eU9yaWdpbnMgcmV0dXJucyB0
aGUKKyAgICAvLyBzdHJpbmcgIm51bGwiIGZvciBlbXB0eSBzZWN1cml0eSBvcmlnaW5zIGFuZCBm
b3Igc2VjdXJpdHkKKyAgICAvLyBvcmlnaW5zIHRoYXQgc2hvdWxkIG9ubHkgYWxsb3cgYWNjZXNz
IHRvIHRoZW1zZWx2ZXMuIEluIHRoaXMKKyAgICAvLyBjYXNlLCB3ZSB1c2UgdGhlIGdsb2JhbCBv
YmplY3QgYXMgdGhlIHNlY3VyaXR5IHRva2VuIHRvIGF2b2lkCisgICAgLy8gY2FsbGluZyBjYW5B
Y2Nlc3Mgd2hlbiBhIHNjcmlwdCBhY2Nlc3NlcyBpdHMgb3duIG9iamVjdHMuCisgICAgaWYgKHRv
a2VuLmlzRW1wdHkoKSB8fCB0b2tlbiA9PSAibnVsbCIpIHsKKyAgICAgICAgbV9jb250ZXh0LT5V
c2VEZWZhdWx0U2VjdXJpdHlUb2tlbigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
Q1N0cmluZyB1dGY4VG9rZW4gPSB0b2tlbi51dGY4KCk7CisgICAgLy8gTk9URTogVjggZG9lcyBp
ZGVudGl0eSBjb21wYXJpc29uIGluIGZhc3QgcGF0aCwgbXVzdCB1c2UgYSBzeW1ib2wKKyAgICAv
LyBhcyB0aGUgc2VjdXJpdHkgdG9rZW4uCisgICAgbV9jb250ZXh0LT5TZXRTZWN1cml0eVRva2Vu
KHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCh1dGY4VG9rZW4uZGF0YSgpLCB1dGY4VG9rZW4ubGVuZ3Ro
KCkpKTsKK30KKwordm9pZCBWOFByb3h5Ojp1cGRhdGVEb2N1bWVudCgpCit7CisgICAgaWYgKCFt
X2ZyYW1lLT5kb2N1bWVudCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobV9nbG9iYWwu
SXNFbXB0eSgpKSB7CisgICAgICAgIEFTU0VSVChtX2NvbnRleHQuSXNFbXB0eSgpKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdlIGhhdmUgYSBuZXcgZG9jdW1lbnQgYW5kIHdl
IG5lZWQgdG8gdXBkYXRlIHRoZSBjYWNoZS4KKyAgICB1cGRhdGVEb2N1bWVudFdyYXBwZXJDYWNo
ZSgpOworCisgICAgdXBkYXRlU2VjdXJpdHlPcmlnaW4oKTsKK30KKwordm9pZCBWOFByb3h5Ojp1
cGRhdGVTZWN1cml0eU9yaWdpbigpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAg
IHNldFNlY3VyaXR5VG9rZW4oKTsKK30KKworLy8gU2FtZSBvcmlnaW4gcG9saWN5IGltcGxlbWVu
dGF0aW9uOgorLy8KKy8vIFNhbWUgb3JpZ2luIHBvbGljeSBwcmV2ZW50cyBKUyBjb2RlIGZyb20g
ZG9tYWluIEEgYWNjZXNzIEpTICYgRE9NIG9iamVjdHMKKy8vIGluIGEgZGlmZmVyZW50IGRvbWFp
biBCLiBUaGVyZSBhcmUgZXhjZXB0aW9ucyBhbmQgc2V2ZXJhbCBvYmplY3RzIGFyZQorLy8gYWNj
ZXNzaWJsZSBieSBjcm9zcy1kb21haW4gY29kZS4gRm9yIGV4YW1wbGUsIHRoZSB3aW5kb3cuZnJh
bWVzIG9iamVjdCBpcworLy8gYWNjZXNzaWJsZSBieSBjb2RlIGZyb20gYSBkaWZmZXJlbnQgZG9t
YWluLCBidXQgd2luZG93LmRvY3VtZW50IGlzIG5vdC4KKy8vCisvLyBUaGUgYmluZGluZyBjb2Rl
IHNldHMgc2VjdXJpdHkgY2hlY2sgY2FsbGJhY2tzIG9uIGEgZnVuY3Rpb24gdGVtcGxhdGUsCisv
LyBhbmQgYWNjZXNzaW5nIGluc3RhbmNlcyBvZiB0aGUgdGVtcGxhdGUgY2FsbHMgdGhlIGNhbGxi
YWNrIGZ1bmN0aW9uLgorLy8gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGNoZWNrcyBzYW1lIG9yaWdp
biBwb2xpY3kuCisvLworLy8gQ2FsbGJhY2sgZnVuY3Rpb25zIGFyZSBleHBlbnNpdmUuIFY4IHVz
ZXMgYSBzZWN1cml0eSB0b2tlbiBzdHJpbmcgdG8gZG8KKy8vIGZhc3QgYWNjZXNzIGNoZWNrcyBm
b3IgdGhlIGNvbW1vbiBjYXNlIHdoZXJlIHNvdXJjZSBhbmQgdGFyZ2V0IGFyZSBpbiB0aGUKKy8v
IHNhbWUgZG9tYWluLiBBIHNlY3VyaXR5IHRva2VuIGlzIGEgc3RyaW5nIG9iamVjdCB0aGF0IHJl
cHJlc2VudHMKKy8vIHRoZSBwcm90b2NvbC91cmwvcG9ydCBvZiBhIGRvbWFpbi4KKy8vCisvLyBU
aGVyZSBhcmUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhIHNlY3VyaXR5IHRva2VuIG1hdGNoaW5nIGlz
IG5vdCBlbm91Z2guCisvLyBGb3IgZXhhbXBsZSwgSmF2YVNjcmlwdCBjYW4gc2V0IGl0cyBkb21h
aW4gdG8gYSBzdXBlciBkb21haW4gYnkgY2FsbGluZworLy8gZG9jdW1lbnQuc2V0RG9tYWluKC4u
LikuIEluIHRoZXNlIGNhc2VzLCB0aGUgYmluZGluZyBjb2RlIGNhbiByZXNldAorLy8gYSBjb250
ZXh0J3Mgc2VjdXJpdHkgdG9rZW4gdG8gaXRzIGdsb2JhbCBvYmplY3Qgc28gdGhhdCB0aGUgZmFz
dCBhY2Nlc3MKKy8vIGNoZWNrIHdpbGwgYWx3YXlzIGZhaWwuCisKKy8vIENoZWNrIGlmIHRoZSBj
dXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0IGNhbiBhY2Nlc3MgYSB0YXJnZXQgZnJhbWUuCisvLyBG
aXJzdCBpdCBjaGVja3Mgc2FtZSBkb21haW4gcG9saWN5IHVzaW5nIHRoZSBsZXhpY2FsIGNvbnRl
eHQKKy8vCisvLyBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gS0pTOjpXaW5kb3c6OmFsbG93c0FjY2Vz
c0Zyb20oRXhlY1N0YXRlKiwgU3RyaW5nJikuCitib29sIFY4UHJveHk6OmNhbkFjY2Vzc1ByaXZh
dGUoRE9NV2luZG93KiB0YXJnZXRXaW5kb3cpCit7CisgICAgQVNTRVJUKHRhcmdldFdpbmRvdyk7
CisKKyAgICBTdHJpbmcgbWVzc2FnZTsKKworICAgIERPTVdpbmRvdyogb3JpZ2luV2luZG93ID0g
cmV0cmlldmVXaW5kb3coKTsKKyAgICBpZiAob3JpZ2luV2luZG93ID09IHRhcmdldFdpbmRvdykK
KyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoIW9yaWdpbldpbmRvdykKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgY29uc3QgU2VjdXJpdHlPcmlnaW4qIGFjdGl2ZVNlY3VyaXR5
T3JpZ2luID0gb3JpZ2luV2luZG93LT5zZWN1cml0eU9yaWdpbigpOworICAgIGNvbnN0IFNlY3Vy
aXR5T3JpZ2luKiB0YXJnZXRTZWN1cml0eU9yaWdpbiA9IHRhcmdldFdpbmRvdy0+c2VjdXJpdHlP
cmlnaW4oKTsKKworICAgIC8vIFdlIGhhdmUgc2VlbiBjcmFzaGVzIHdlcmUgdGhlIHNlY3VyaXR5
IG9yaWdpbiBvZiB0aGUgdGFyZ2V0IGhhcyBub3QgYmVlbgorICAgIC8vIGluaXRpYWxpemVkLiBE
ZWZlbmQgYWdhaW5zdCB0aGF0LgorICAgIGlmICghdGFyZ2V0U2VjdXJpdHlPcmlnaW4pCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChhY3RpdmVTZWN1cml0eU9yaWdpbi0+Y2FuQWNj
ZXNzKHRhcmdldFNlY3VyaXR5T3JpZ2luKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAv
LyBBbGxvdyBhY2Nlc3MgdG8gYSAiYWJvdXQ6YmxhbmsiIHBhZ2UgaWYgdGhlIGR5bmFtaWMgY29u
dGV4dCBpcyBhCisgICAgLy8gZGV0YWNoZWQgY29udGV4dCBvZiB0aGUgc2FtZSBmcmFtZSBhcyB0
aGUgYmxhbmsgcGFnZS4KKyAgICBpZiAodGFyZ2V0U2VjdXJpdHlPcmlnaW4tPmlzRW1wdHkoKSAm
JiBvcmlnaW5XaW5kb3ctPmZyYW1lKCkgPT0gdGFyZ2V0V2luZG93LT5mcmFtZSgpKQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBWOFByb3h5Ojpj
YW5BY2Nlc3NGcmFtZShGcmFtZSogdGFyZ2V0LCBib29sIHJlcG9ydEVycm9yKQoreworICAgIC8v
IFRoZSBzdWJqZWN0IGlzIGRldGFjaGVkIGZyb20gYSBmcmFtZSwgZGVueSBhY2Nlc3Nlcy4KKyAg
ICBpZiAoIXRhcmdldCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFjYW5BY2Nl
c3NQcml2YXRlKHRhcmdldC0+ZG9tV2luZG93KCkpKSB7CisgICAgICAgIGlmIChyZXBvcnRFcnJv
cikKKyAgICAgICAgICAgIHJlcG9ydFVuc2FmZUFjY2Vzc1RvKHRhcmdldCwgUmVwb3J0Tm93KTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9v
bCBWOFByb3h5OjpjaGVja05vZGVTZWN1cml0eShOb2RlKiBub2RlKQoreworICAgIGlmICghbm9k
ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgRnJhbWUqIHRhcmdldCA9IG5vZGUtPmRv
Y3VtZW50KCktPmZyYW1lKCk7CisKKyAgICBpZiAoIXRhcmdldCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgcmV0dXJuIGNhbkFjY2Vzc0ZyYW1lKHRhcmdldCwgdHJ1ZSk7Cit9CisKK3Y4
OjpQZXJzaXN0ZW50PHY4OjpDb250ZXh0PiBWOFByb3h5OjpjcmVhdGVOZXdDb250ZXh0KHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsKQoreworICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpDb250
ZXh0PiByZXN1bHQ7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgZW52aXJvbm1lbnQgdXNpbmcgYW4g
ZW1wdHkgdGVtcGxhdGUgZm9yIHRoZSBzaGFkb3cKKyAgICAvLyBvYmplY3QuIFJldXNlIHRoZSBn
bG9iYWwgb2JqZWN0IGlmIG9uZSBoYXMgYmVlbiBjcmVhdGVkIGVhcmxpZXIuCisgICAgdjg6OlBl
cnNpc3RlbnQ8djg6Ok9iamVjdFRlbXBsYXRlPiBnbG9iYWxUZW1wbGF0ZSA9IFY4RE9NV2luZG93
OjpHZXRTaGFkb3dPYmplY3RUZW1wbGF0ZSgpOworICAgIGlmIChnbG9iYWxUZW1wbGF0ZS5Jc0Vt
cHR5KCkpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAvLyBJbnN0YWxsIGEgc2VjdXJp
dHkgaGFuZGxlciB3aXRoIFY4LgorICAgIGdsb2JhbFRlbXBsYXRlLT5TZXRBY2Nlc3NDaGVja0Nh
bGxiYWNrcyhWOEN1c3RvbTo6djhET01XaW5kb3dOYW1lZFNlY3VyaXR5Q2hlY2ssIFY4Q3VzdG9t
Ojp2OERPTVdpbmRvd0luZGV4ZWRTZWN1cml0eUNoZWNrLCB2ODo6SW50ZWdlcjo6TmV3KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XKSk7CisKKyAgICAvLyBEeW5hbWljYWxseSB0ZWxsIHY4IGFib3V0
IG91ciBleHRlbnNpb25zIG5vdy4KKyAgICBPd25BcnJheVB0cjxjb25zdCBjaGFyKj4gZXh0ZW5z
aW9uTmFtZXMobmV3IGNvbnN0IGNoYXIqW21fZXh0ZW5zaW9ucy5zaXplKCldKTsKKyAgICBpbnQg
aW5kZXggPSAwOworICAgIGZvciAoVjhFeHRlbnNpb25MaXN0OjppdGVyYXRvciBpdCA9IG1fZXh0
ZW5zaW9ucy5iZWdpbigpOyBpdCAhPSBtX2V4dGVuc2lvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAg
ICAgLy8gTm90ZTogd2UgY2hlY2sgdGhlIGxvYWRlciBVUkwgaGVyZSBpbnN0ZWFkIG9mIHRoZSBk
b2N1bWVudCBVUkwKKyAgICAgICAgLy8gYmVjYXVzZSB3ZSBtaWdodCBiZSBjdXJyZW50bHkgbG9h
ZGluZyBhbiBVUkwgaW50byBhIGJsYW5rIHBhZ2UuCisgICAgICAgIC8vIFNlZSBodHRwOi8vY29k
ZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMDkyNAorICAgICAgICBp
ZiAoaXQtPnNjaGVtZS5sZW5ndGgoKSA+IDAgJiYgKGl0LT5zY2hlbWUgIT0gbV9mcmFtZS0+bG9h
ZGVyKCktPmFjdGl2ZURvY3VtZW50TG9hZGVyKCktPnVybCgpLnByb3RvY29sKCkgfHwgaXQtPnNj
aGVtZSAhPSBtX2ZyYW1lLT5wYWdlKCktPm1haW5GcmFtZSgpLT5sb2FkZXIoKS0+YWN0aXZlRG9j
dW1lbnRMb2FkZXIoKS0+dXJsKCkucHJvdG9jb2woKSkpCisgICAgICAgICAgICBjb250aW51ZTsK
KworICAgICAgICBleHRlbnNpb25OYW1lc1tpbmRleCsrXSA9IGl0LT5leHRlbnNpb24tPm5hbWUo
KTsKKyAgICB9CisgICAgdjg6OkV4dGVuc2lvbkNvbmZpZ3VyYXRpb24gZXh0ZW5zaW9ucyhpbmRl
eCwgZXh0ZW5zaW9uTmFtZXMuZ2V0KCkpOworICAgIHJlc3VsdCA9IHY4OjpDb250ZXh0OjpOZXco
JmV4dGVuc2lvbnMsIGdsb2JhbFRlbXBsYXRlLCBnbG9iYWwpOworCisgICAgcmV0dXJuIHJlc3Vs
dDsKK30KKworYm9vbCBWOFByb3h5OjppbnN0YWxsRE9NV2luZG93KHY4OjpIYW5kbGU8djg6OkNv
bnRleHQ+IGNvbnRleHQsIERPTVdpbmRvdyogd2luZG93KQ0KK3sNCisgICAgdjg6OkhhbmRsZTx2
ODo6U3RyaW5nPiBpbXBsaWNpdFByb3RvU3RyaW5nID0gdjg6OlN0cmluZzo6TmV3KCJfX3Byb3Rv
X18iKTsNCisgICAgaWYgKGltcGxpY2l0UHJvdG9TdHJpbmcuSXNFbXB0eSgpKQ0KKyAgICAgICAg
cmV0dXJuIGZhbHNlOw0KKw0KKyAgICAvLyBDcmVhdGUgYSBuZXcgSlMgd2luZG93IG9iamVjdCBh
bmQgdXNlIGl0IGFzIHRoZSBwcm90b3R5cGUgZm9yIHRoZSAgc2hhZG93IGdsb2JhbCBvYmplY3Qu
DQorICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiB3aW5kb3dDb25zdHJ1Y3RvciA9IGdldENv
bnN0cnVjdG9yKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XKTsNCisgICAgdjg6OkxvY2FsPHY4OjpP
YmplY3Q+IGpzV2luZG93ID0gU2FmZUFsbG9jYXRpb246Om5ld0luc3RhbmNlKHdpbmRvd0NvbnN0
cnVjdG9yKTsNCisgICAgLy8gQmFpbCBvdXQgaWYgYWxsb2NhdGlvbiBmYWlsZWQuDQorICAgIGlm
IChqc1dpbmRvdy5Jc0VtcHR5KCkpDQorICAgICAgICByZXR1cm4gZmFsc2U7DQorDQorICAgIC8v
IFdyYXAgdGhlIHdpbmRvdy4NCisgICAgc2V0RE9NV3JhcHBlcihqc1dpbmRvdywgVjhDbGFzc0lu
ZGV4OjpUb0ludChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVyksIHdpbmRvdyk7DQorDQorICAgIHdp
bmRvdy0+cmVmKCk7DQorICAgIFY4UHJveHk6OnNldEpTV3JhcHBlckZvckRPTU9iamVjdCh3aW5k
b3csIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcoanNXaW5kb3cpKTsNCisNCisgICAg
Ly8gSW5zZXJ0IHRoZSB3aW5kb3cgaW5zdGFuY2UgYXMgdGhlIHByb3RvdHlwZSBvZiB0aGUgc2hh
ZG93IG9iamVjdC4NCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB2OEdsb2JhbCA9IGNvbnRl
eHQtPkdsb2JhbCgpOw0KKyAgICB2OEdsb2JhbC0+U2V0KGltcGxpY2l0UHJvdG9TdHJpbmcsIGpz
V2luZG93KTsNCisgICAgcmV0dXJuIHRydWU7DQorfQorCisvLyBDcmVhdGUgYSBuZXcgZW52aXJv
bm1lbnQgYW5kIHNldHVwIHRoZSBnbG9iYWwgb2JqZWN0LgorLy8KKy8vIFRoZSBnbG9iYWwgb2Jq
ZWN0IGNvcnJlc3BvbmRzIHRvIGEgRE9NV2luZG93IGluc3RhbmNlLiBIb3dldmVyLCB0bworLy8g
YWxsb3cgcHJvcGVydGllcyBvZiB0aGUgSlMgRE9NV2luZG93IGluc3RhbmNlIHRvIGJlIHNoYWRv
d2VkLCB3ZQorLy8gdXNlIGEgc2hhZG93IG9iamVjdCBhcyB0aGUgZ2xvYmFsIG9iamVjdCBhbmQg
dXNlIHRoZSBKUyBET01XaW5kb3cKKy8vIGluc3RhbmNlIGFzIHRoZSBwcm90b3R5cGUgZm9yIHRo
YXQgc2hhZG93IG9iamVjdC4gVGhlIEpTIERPTVdpbmRvdworLy8gaW5zdGFuY2UgaXMgdW5kZXRl
Y3RhYmxlIGZyb20gamF2YXNjcmlwdCBjb2RlIGJlY2F1c2UgdGhlIF9fcHJvdG9fXworLy8gYWNj
ZXNzb3JzIHNraXAgdGhhdCBvYmplY3QuCisvLworLy8gVGhlIHNoYWRvdyBvYmplY3QgYW5kIHRo
ZSBET01XaW5kb3cgaW5zdGFuY2UgYXJlIHNlZW4gYXMgb25lIG9iamVjdAorLy8gZnJvbSBqYXZh
c2NyaXB0LiBUaGUgamF2YXNjcmlwdCBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byBhCisvLyBE
T01XaW5kb3cgaW5zdGFuY2UgaXMgdGhlIHNoYWRvdyBvYmplY3QuIFdoZW4gbWFwcGluZyBhIERP
TVdpbmRvdworLy8gaW5zdGFuY2UgdG8gYSBWOCBvYmplY3QsIHdlIHJldHVybiB0aGUgc2hhZG93
IG9iamVjdC4KKy8vCisvLyBUbyBpbXBsZW1lbnQgc3BsaXQtd2luZG93LCBzZWUKKy8vICAgMSkg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3MjQ5CisvLyAgIDIpIGh0
dHBzOi8vd2lraS5tb3ppbGxhLm9yZy9HZWNrbzpTcGxpdFdpbmRvdworLy8gICAzKSBodHRwczov
L2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTY2MzkKKy8vIHdlIG5lZWQg
dG8gc3BsaXQgdGhlIHNoYWRvdyBvYmplY3QgZnVydGhlciBpbnRvIHR3byBvYmplY3RzOgorLy8g
YW4gb3V0ZXIgd2luZG93IGFuZCBhbiBpbm5lciB3aW5kb3cuIFRoZSBpbm5lciB3aW5kb3cgaXMg
dGhlIGhpZGRlbgorLy8gcHJvdG90eXBlIG9mIHRoZSBvdXRlciB3aW5kb3cuIFRoZSBpbm5lciB3
aW5kb3cgaXMgdGhlIGRlZmF1bHQKKy8vIGdsb2JhbCBvYmplY3Qgb2YgdGhlIGNvbnRleHQuIEEg
dmFyaWFibGUgZGVjbGFyZWQgaW4gdGhlIGdsb2JhbAorLy8gc2NvcGUgaXMgYSBwcm9wZXJ0eSBv
ZiB0aGUgaW5uZXIgd2luZG93LgorLy8KKy8vIFRoZSBvdXRlciB3aW5kb3cgc3RpY2tzIHRvIGEg
RnJhbWUsIGl0IGlzIGV4cG9zZWQgdG8gSmF2YVNjcmlwdAorLy8gdmlhIHdpbmRvdy53aW5kb3cs
IHdpbmRvdy5zZWxmLCB3aW5kb3cucGFyZW50LCBldGMuIFRoZSBvdXRlciB3aW5kb3cKKy8vIGhh
cyBhIHNlY3VyaXR5IHRva2VuIHdoaWNoIGlzIHRoZSBkb21haW4uIFRoZSBvdXRlciB3aW5kb3cg
Y2Fubm90CisvLyBoYXZlIGl0cyBvd24gcHJvcGVydGllcy4gd2luZG93LmZvbyA9ICd4JyBpcyBk
ZWxlZ2F0ZWQgdG8gdGhlCisvLyBpbm5lciB3aW5kb3cuCisvLworLy8gV2hlbiBhIGZyYW1lIG5h
dmlnYXRlcyB0byBhIG5ldyBwYWdlLCB0aGUgaW5uZXIgd2luZG93IGlzIGN1dCBvZmYKKy8vIHRo
ZSBvdXRlciB3aW5kb3csIGFuZCB0aGUgb3V0ZXIgd2luZG93IGlkZW50aWZ5IGlzIHByZXNlcnZl
ZCBmb3IKKy8vIHRoZSBmcmFtZS4gSG93ZXZlciwgYSBuZXcgaW5uZXIgd2luZG93IGlzIGNyZWF0
ZWQgZm9yIHRoZSBuZXcgcGFnZS4KKy8vIElmIHRoZXJlIGFyZSBKUyBjb2RlIGhvbGRzIGEgY2xv
c3VyZSB0byB0aGUgb2xkIGlubmVyIHdpbmRvdywKKy8vIGl0IHdvbid0IGJlIGFibGUgdG8gcmVh
Y2ggdGhlIG91dGVyIHdpbmRvdyB2aWEgaXRzIGdsb2JhbCBvYmplY3QuCit2b2lkIFY4UHJveHk6
OmluaXRDb250ZXh0SWZOZWVkZWQoKQoreworICAgIC8vIEJhaWwgb3V0IGlmIHRoZSBjb250ZXh0
IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgaWYgKCFtX2NvbnRleHQuSXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDcmVhdGUgYSBoYW5kbGUgc2NvcGUgZm9y
IGFsbCBsb2NhbCBoYW5kbGVzLgorICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKwor
ICAgIC8vIFNldHVwIHRoZSBzZWN1cml0eSBoYW5kbGVycyBhbmQgbWVzc2FnZSBsaXN0ZW5lci4g
VGhpcyBvbmx5IGhhcworICAgIC8vIHRvIGJlIGRvbmUgb25jZS4KKyAgICBzdGF0aWMgYm9vbCBp
c1Y4SW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBpZiAoIWlzVjhJbml0aWFsaXplZCkgeworICAg
ICAgICAvLyBUZWxscyBWOCBub3QgdG8gY2FsbCB0aGUgZGVmYXVsdCBPT00gaGFuZGxlciwgYmlu
ZGluZyBjb2RlCisgICAgICAgIC8vIHdpbGwgaGFuZGxlIGl0LgorICAgICAgICB2ODo6Vjg6Okln
bm9yZU91dE9mTWVtb3J5RXhjZXB0aW9uKCk7CisgICAgICAgIHY4OjpWODo6U2V0RmF0YWxFcnJv
ckhhbmRsZXIocmVwb3J0RmF0YWxFcnJvckluVjgpOworCisgICAgICAgIHY4OjpWODo6U2V0R2xv
YmFsR0NQcm9sb2d1ZUNhbGxiYWNrKCZnY1Byb2xvZ3VlKTsKKyAgICAgICAgdjg6OlY4OjpTZXRH
bG9iYWxHQ0VwaWxvZ3VlQ2FsbGJhY2soJmdjRXBpbG9ndWUpOworCisgICAgICAgIHY4OjpWODo6
QWRkTWVzc2FnZUxpc3RlbmVyKGhhbmRsZUNvbnNvbGVNZXNzYWdlKTsKKworICAgICAgICB2ODo6
Vjg6OlNldEZhaWxlZEFjY2Vzc0NoZWNrQ2FsbGJhY2tGdW5jdGlvbihyZXBvcnRVbnNhZmVKYXZh
U2NyaXB0QWNjZXNzKTsKKworICAgICAgICBpc1Y4SW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0K
KworICAgIG1fY29udGV4dCA9IGNyZWF0ZU5ld0NvbnRleHQobV9nbG9iYWwpOworICAgIGlmICht
X2NvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBTdGFydGluZyBm
cm9tIG5vdywgdXNlIGxvY2FsIGNvbnRleHQgb25seS4KKyAgICB2ODo6TG9jYWw8djg6OkNvbnRl
eHQ+IHY4Q29udGV4dCA9IGNvbnRleHQoKTsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4
dFNjb3BlKHY4Q29udGV4dCk7CisKKyAgICAvLyBTdG9yZSB0aGUgZmlyc3QgZ2xvYmFsIG9iamVj
dCBjcmVhdGVkIHNvIHdlIGNhbiByZXVzZSBpdC4KKyAgICBpZiAobV9nbG9iYWwuSXNFbXB0eSgp
KSB7CisgICAgICAgIG1fZ2xvYmFsID0gdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyh2
OENvbnRleHQtPkdsb2JhbCgpKTsKKyAgICAgICAgLy8gQmFpbCBvdXQgaWYgYWxsb2NhdGlvbiBv
ZiB0aGUgZmlyc3QgZ2xvYmFsIG9iamVjdHMgZmFpbHMuCisgICAgICAgIGlmIChtX2dsb2JhbC5J
c0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGRpc3Bvc2VDb250ZXh0SGFuZGxlcygpOworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisjaWZuZGVmIE5ERUJVRworICAgICAgICByZWdpc3Rl
ckdsb2JhbEhhbmRsZShQUk9YWSwgdGhpcywgbV9nbG9iYWwpOworI2VuZGlmCisgICAgfQorCisg
ICAgLy8gQWxsb2NhdGUgc3RyaW5ncyB1c2VkIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgICB2
ODo6SGFuZGxlPHY4OjpTdHJpbmc+IG9iamVjdFN0cmluZyA9IHY4OjpTdHJpbmc6Ok5ldygiT2Jq
ZWN0Iik7CisgICAgdjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBwcm90b3R5cGVTdHJpbmcgPSB2ODo6
U3RyaW5nOjpOZXcoInByb3RvdHlwZSIpOworICAgIC8vIEJhaWwgb3V0IGlmIGFsbG9jYXRpb24g
ZmFpbGVkLgorICAgIGlmIChvYmplY3RTdHJpbmcuSXNFbXB0eSgpIHx8IHByb3RvdHlwZVN0cmlu
Zy5Jc0VtcHR5KCkpIHsKKyAgICAgICAgZGlzcG9zZUNvbnRleHRIYW5kbGVzKCk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSBjbG9uZSBjYWNoZSBhbmQgcHJlLWFs
bG9jYXRlZCBvYmplY3RzCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmplY3QgPSB2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KG1fZ2xvYmFsLT5HZXQob2JqZWN0U3RyaW5nKSk7Cisg
ICAgbV9vYmplY3RQcm90b3R5cGUgPSB2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+OjpOZXcob2Jq
ZWN0LT5HZXQocHJvdG90eXBlU3RyaW5nKSk7CisgICAgbV93cmFwcGVyQm9pbGVycGxhdGVzID0g
djg6OlBlcnNpc3RlbnQ8djg6OkFycmF5Pjo6TmV3KHY4OjpBcnJheTo6TmV3KFY4Q2xhc3NJbmRl
eDo6V1JBUFBFUl9UWVBFX0NPVU5UKSk7CisgICAgLy8gQmFpbCBvdXQgaWYgYWxsb2NhdGlvbiBm
YWlsZWQuCisgICAgaWYgKG1fb2JqZWN0UHJvdG90eXBlLklzRW1wdHkoKSkgeworICAgICAgICBk
aXNwb3NlQ29udGV4dEhhbmRsZXMoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZm5kZWYg
TkRFQlVHCisgICAgcmVnaXN0ZXJHbG9iYWxIYW5kbGUoUFJPWFksIHRoaXMsIG1fb2JqZWN0UHJv
dG90eXBlKTsKKyAgICByZWdpc3Rlckdsb2JhbEhhbmRsZShQUk9YWSwgdGhpcywgbV93cmFwcGVy
Qm9pbGVycGxhdGVzKTsKKyNlbmRpZgorCisgICAgaWYgKCFpbnN0YWxsRE9NV2luZG93KHY4Q29u
dGV4dCwgbV9mcmFtZS0+ZG9tV2luZG93KCkpKQorICAgICAgICBkaXNwb3NlQ29udGV4dEhhbmRs
ZXMoKTsKKworICAgIHVwZGF0ZURvY3VtZW50KCk7CisKKyAgICBzZXRTZWN1cml0eVRva2VuKCk7
CisKKyAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+ZGlzcGF0Y2hXaW5kb3dPYmplY3RBdmFpbGFibGUo
KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+DQordm9pZCBzZXRET01FeGNlcHRpb25IZWxwZXIo
VjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIFBhc3NSZWZQdHI8VD4gZXhjZXB0aW9u
KQ0KK3sNCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHY4RXhjZXB0aW9uOw0KKyAgICBpZiAo
V29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpyZXRyaWV2ZSgpKQ0KKyAgICAgICAgdjhFeGNl
cHRpb24gPSBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OlRvVjhPYmplY3QodHlwZSwgZXhj
ZXB0aW9uLmdldCgpKTsNCisgICAgZWxzZQ0KKyAgICAgICAgdjhFeGNlcHRpb24gPSBWOFByb3h5
Ojpjb252ZXJ0VG9WOE9iamVjdCh0eXBlLCBleGNlcHRpb24uZ2V0KCkpOw0KKw0KKyAgICB2ODo6
VGhyb3dFeGNlcHRpb24odjhFeGNlcHRpb24pOw0KK30KKwordm9pZCBWOFByb3h5OjpzZXRET01F
eGNlcHRpb24oaW50IGV4Y2VwdGlvbkNvZGUpCit7CisgICAgaWYgKGV4Y2VwdGlvbkNvZGUgPD0g
MCkKKyAgICAgICAgcmV0dXJuOworCisgICAgRXhjZXB0aW9uQ29kZURlc2NyaXB0aW9uIGRlc2Ny
aXB0aW9uOworICAgIGdldEV4Y2VwdGlvbkNvZGVEZXNjcmlwdGlvbihleGNlcHRpb25Db2RlLCBk
ZXNjcmlwdGlvbik7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZXhjZXB0aW9uOworICAg
IHN3aXRjaCAoZGVzY3JpcHRpb24udHlwZSkgeworICAgIGNhc2UgRE9NRXhjZXB0aW9uVHlwZToK
KyAgICAgICAgc2V0RE9NRXhjZXB0aW9uSGVscGVyKFY4Q2xhc3NJbmRleDo6RE9NQ09SRUVYQ0VQ
VElPTiwgRE9NQ29yZUV4Y2VwdGlvbjo6Y3JlYXRlKGRlc2NyaXB0aW9uKSk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgUmFuZ2VFeGNlcHRpb25UeXBlOgorICAgICAgICBzZXRET01FeGNlcHRp
b25IZWxwZXIoVjhDbGFzc0luZGV4OjpSQU5HRUVYQ0VQVElPTiwgUmFuZ2VFeGNlcHRpb246OmNy
ZWF0ZShkZXNjcmlwdGlvbikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEV2ZW50RXhjZXB0
aW9uVHlwZToKKyAgICAgICAgc2V0RE9NRXhjZXB0aW9uSGVscGVyKFY4Q2xhc3NJbmRleDo6RVZF
TlRFWENFUFRJT04sIEV2ZW50RXhjZXB0aW9uOjpjcmVhdGUoZGVzY3JpcHRpb24pKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBYTUxIdHRwUmVxdWVzdEV4Y2VwdGlvblR5cGU6CisgICAgICAg
IHNldERPTUV4Y2VwdGlvbkhlbHBlcihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNURVhDRVBU
SU9OLCBYTUxIdHRwUmVxdWVzdEV4Y2VwdGlvbjo6Y3JlYXRlKGRlc2NyaXB0aW9uKSk7CisgICAg
ICAgIGJyZWFrOworI2lmIEVOQUJMRShTVkcpCisgICAgY2FzZSBTVkdFeGNlcHRpb25UeXBlOgor
ICAgICAgICBzZXRET01FeGNlcHRpb25IZWxwZXIoVjhDbGFzc0luZGV4OjpTVkdFWENFUFRJT04s
IFNWR0V4Y2VwdGlvbjo6Y3JlYXRlKGRlc2NyaXB0aW9uKSk7CisgICAgICAgIGJyZWFrOworI2Vu
ZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAg
IGJyZWFrOworI2lmIEVOQUJMRShYUEFUSCkKKyAgICBjYXNlIFhQYXRoRXhjZXB0aW9uVHlwZToK
KyAgICAgICAgZXhjZXB0aW9uID0gY29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpYUEFU
SEVYQ0VQVElPTiwgWFBhdGhFeGNlcHRpb246OmNyZWF0ZShkZXNjcmlwdGlvbikpOworICAgICAg
ICBicmVhazsKKyNlbmRpZgorICAgIH0KKworICAgIEFTU0VSVCghZXhjZXB0aW9uLklzRW1wdHko
KSk7CisgICAgdjg6OlRocm93RXhjZXB0aW9uKGV4Y2VwdGlvbik7Cit9CisKK3Y4OjpIYW5kbGU8
djg6OlZhbHVlPiBWOFByb3h5Ojp0aHJvd0Vycm9yKEVycm9yVHlwZSB0eXBlLCBjb25zdCBjaGFy
KiBtZXNzYWdlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgUmFuZ2VFcnJvcjoK
KyAgICAgICAgcmV0dXJuIHY4OjpUaHJvd0V4Y2VwdGlvbih2ODo6RXhjZXB0aW9uOjpSYW5nZUVy
cm9yKHY4U3RyaW5nKG1lc3NhZ2UpKSk7CisgICAgY2FzZSBSZWZlcmVuY2VFcnJvcjoKKyAgICAg
ICAgcmV0dXJuIHY4OjpUaHJvd0V4Y2VwdGlvbih2ODo6RXhjZXB0aW9uOjpSZWZlcmVuY2VFcnJv
cih2OFN0cmluZyhtZXNzYWdlKSkpOworICAgIGNhc2UgU3ludGF4RXJyb3I6CisgICAgICAgIHJl
dHVybiB2ODo6VGhyb3dFeGNlcHRpb24odjg6OkV4Y2VwdGlvbjo6U3ludGF4RXJyb3IodjhTdHJp
bmcobWVzc2FnZSkpKTsKKyAgICBjYXNlIFR5cGVFcnJvcjoKKyAgICAgICAgcmV0dXJuIHY4OjpU
aHJvd0V4Y2VwdGlvbih2ODo6RXhjZXB0aW9uOjpUeXBlRXJyb3IodjhTdHJpbmcobWVzc2FnZSkp
KTsKKyAgICBjYXNlIEdlbmVyYWxFcnJvcjoKKyAgICAgICAgcmV0dXJuIHY4OjpUaHJvd0V4Y2Vw
dGlvbih2ODo6RXhjZXB0aW9uOjpFcnJvcih2OFN0cmluZyhtZXNzYWdlKSkpOworICAgIGRlZmF1
bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gbm90SGFu
ZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKyAgICB9Cit9CisKK3Y4OjpMb2NhbDx2ODo6Q29udGV4dD4g
VjhQcm94eTo6Y29udGV4dChGcmFtZSogZnJhbWUpCit7CisgICAgVjhQcm94eSogcHJveHkgPSBy
ZXRyaWV2ZShmcmFtZSk7CisgICAgaWYgKCFwcm94eSkKKyAgICAgICAgcmV0dXJuIHY4OjpMb2Nh
bDx2ODo6Q29udGV4dD4oKTsKKworICAgIHByb3h5LT5pbml0Q29udGV4dElmTmVlZGVkKCk7Cisg
ICAgcmV0dXJuIHByb3h5LT5jb250ZXh0KCk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6Q29udGV4dD4g
VjhQcm94eTo6Y3VycmVudENvbnRleHQoKQoreworICAgIHJldHVybiB2ODo6Q29udGV4dDo6R2V0
Q3VycmVudCgpOworfQorCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y29udmVydFRv
VjhPYmplY3QoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHZvaWQqIGltcGwpCit7
CisgICAgQVNTRVJUKHR5cGUgIT0gVjhDbGFzc0luZGV4OjpFVkVOVExJU1RFTkVSKTsKKyAgICBB
U1NFUlQodHlwZSAhPSBWOENsYXNzSW5kZXg6OkVWRU5UVEFSR0VUKTsKKyAgICBBU1NFUlQodHlw
ZSAhPSBWOENsYXNzSW5kZXg6OkVWRU5UKTsKKworICAgIGJvb2wgaXNBY3RpdmVEb21PYmplY3Qg
PSBmYWxzZTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyNkZWZpbmUgTUFLRV9DQVNFKFRZUEUsIE5B
TUUpIGNhc2UgVjhDbGFzc0luZGV4OjpUWVBFOgorICAgICAgICBET01fTk9ERV9UWVBFUyhNQUtF
X0NBU0UpCisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgU1ZHX05PREVfVFlQRVMoTUFLRV9DQVNF
KQorI2VuZGlmCisgICAgICAgIHJldHVybiBjb252ZXJ0Tm9kZVRvVjhPYmplY3Qoc3RhdGljX2Nh
c3Q8Tm9kZSo+KGltcGwpKTsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q1NTVkFMVUU6CisgICAg
ICAgIHJldHVybiBjb252ZXJ0Q1NTVmFsdWVUb1Y4T2JqZWN0KHN0YXRpY19jYXN0PENTU1ZhbHVl
Kj4oaW1wbCkpOworICAgIGNhc2UgVjhDbGFzc0luZGV4OjpDU1NSVUxFOgorICAgICAgICByZXR1
cm4gY29udmVydENTU1J1bGVUb1Y4T2JqZWN0KHN0YXRpY19jYXN0PENTU1J1bGUqPihpbXBsKSk7
CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlNUWUxFU0hFRVQ6CisgICAgICAgIHJldHVybiBjb252
ZXJ0U3R5bGVTaGVldFRvVjhPYmplY3Qoc3RhdGljX2Nhc3Q8U3R5bGVTaGVldCo+KGltcGwpKTsK
KyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XOgorICAgICAgICByZXR1cm4gY29udmVy
dFdpbmRvd1RvVjhPYmplY3Qoc3RhdGljX2Nhc3Q8RE9NV2luZG93Kj4oaW1wbCkpOworI2lmIEVO
QUJMRShTVkcpCisgICAgICAgIFNWR19OT05OT0RFX1RZUEVTKE1BS0VfQ0FTRSkKKyAgICAgICAg
aWYgKHR5cGUgPT0gVjhDbGFzc0luZGV4OjpTVkdFTEVNRU5USU5TVEFOQ0UpCisgICAgICAgICAg
ICByZXR1cm4gY29udmVydFNWR0VsZW1lbnRJbnN0YW5jZVRvVjhPYmplY3Qoc3RhdGljX2Nhc3Q8
U1ZHRWxlbWVudEluc3RhbmNlKj4oaW1wbCkpOworICAgICAgICByZXR1cm4gY29udmVydFNWR09i
amVjdFdpdGhDb250ZXh0VG9WOE9iamVjdCh0eXBlLCBpbXBsKTsKKyNlbmRpZgorCisgICAgICAg
IEFDVElWRV9ET01fT0JKRUNUX1RZUEVTKE1BS0VfQ0FTRSkKKyAgICAgICAgaXNBY3RpdmVEb21P
YmplY3QgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVh
azsKKyAgfQorCisjdW5kZWYgTUFLRV9DQVNFCisKKyAgICBpZiAoIWltcGwpCisgICAgICAgIHJl
dHVybiB2ODo6TnVsbCgpOworCisgICAgLy8gTm9uIERPTSBub2RlCisgICAgdjg6OlBlcnNpc3Rl
bnQ8djg6Ok9iamVjdD4gcmVzdWx0ID0gaXNBY3RpdmVEb21PYmplY3QgPyBnZXRBY3RpdmVET01P
YmplY3RNYXAoKS5nZXQoaW1wbCkgOiBnZXRET01PYmplY3RNYXAoKS5nZXQoaW1wbCk7CisgICAg
aWYgKHJlc3VsdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4
T2JqZWN0ID0gaW5zdGFudGlhdGVWOE9iamVjdCh0eXBlLCB0eXBlLCBpbXBsKTsKKyAgICAgICAg
aWYgKCF2OE9iamVjdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIEdvIHRocm91Z2ggYmln
IHN3aXRjaCBzdGF0ZW1lbnQsIGl0IGhhcyBzb21lIGR1cGxpY2F0aW9ucworICAgICAgICAgICAg
Ly8gdGhhdCB3ZXJlIGhhbmRsZWQgYnkgY29kZSBhYm92ZSAoc3VjaCBhcyBDU1NWQUxVRSwgQ1NT
UlVMRSwgZXRjKS4KKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworI2RlZmluZSBNQUtFX0NB
U0UoVFlQRSwgTkFNRSkgXAorICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OlRZUEU6IHN0
YXRpY19jYXN0PE5BTUUqPihpbXBsKS0+cmVmKCk7IGJyZWFrOworICAgICAgICAgICAgICAgIERP
TV9PQkpFQ1RfVFlQRVMoTUFLRV9DQVNFKQorI3VuZGVmIE1BS0VfQ0FTRQorICAgICAgICAgICAg
ZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpO
ZXcodjhPYmplY3QpOworICAgICAgICAgICAgaWYgKGlzQWN0aXZlRG9tT2JqZWN0KQorICAgICAg
ICAgICAgICAgIHNldEpTV3JhcHBlckZvckFjdGl2ZURPTU9iamVjdChpbXBsLCByZXN1bHQpOwor
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNldEpTV3JhcHBlckZvckRPTU9iamVj
dChpbXBsLCByZXN1bHQpOworCisgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIG5vbi1u
b2RlIG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIGEKKyAgICAgICAgICAgIC8vIERPTVdpbmRvdy4g
Qm90aCBTYWZhcmkgYW5kIEZGIGxldCB0aGUgSlMgd3JhcHBlcnMgZm9yIHRoZXNlCisgICAgICAg
ICAgICAvLyBvYmplY3RzIHN1cnZpdmUgR0MuIFRvIG1pbWljIHRoZWlyIGJlaGF2aW9yLCBWOCBj
cmVhdGVzCisgICAgICAgICAgICAvLyBoaWRkZW4gcmVmZXJlbmNlcyBmcm9tIHRoZSBET01XaW5k
b3cgdG8gdGhlc2Ugd3JhcHBlcgorICAgICAgICAgICAgLy8gb2JqZWN0cy4gVGhlc2UgcmVmZXJl
bmNlcyBnZXQgY2xlYXJlZCB3aGVuIHRoZSBET01XaW5kb3cgaXMKKyAgICAgICAgICAgIC8vIHJl
dXNlZCBieSBhIG5ldyBwYWdlLgorICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAg
ICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Q09OU09MRToKKyAgICAgICAgICAgICAgICBzZXRIaWRk
ZW5XaW5kb3dSZWZlcmVuY2Uoc3RhdGljX2Nhc3Q8Q29uc29sZSo+KGltcGwpLT5mcmFtZSgpLCBW
OEN1c3RvbTo6a0RPTVdpbmRvd0NvbnNvbGVJbmRleCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpISVNUT1JZOgorICAgICAg
ICAgICAgICAgIHNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShzdGF0aWNfY2FzdDxIaXN0b3J5Kj4o
aW1wbCktPmZyYW1lKCksIFY4Q3VzdG9tOjprRE9NV2luZG93SGlzdG9yeUluZGV4LCByZXN1bHQp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6
Ok5BVklHQVRPUjoKKyAgICAgICAgICAgICAgICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2Uoc3Rh
dGljX2Nhc3Q8TmF2aWdhdG9yKj4oaW1wbCktPmZyYW1lKCksIFY4Q3VzdG9tOjprRE9NV2luZG93
TmF2aWdhdG9ySW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6U0NSRUVOOgorICAgICAgICAgICAgICAgIHNldEhpZGRl
bldpbmRvd1JlZmVyZW5jZShzdGF0aWNfY2FzdDxTY3JlZW4qPihpbXBsKS0+ZnJhbWUoKSwgVjhD
dXN0b206OmtET01XaW5kb3dTY3JlZW5JbmRleCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpMT0NBVElPTjoKKyAgICAgICAg
ICAgICAgICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2Uoc3RhdGljX2Nhc3Q8TG9jYXRpb24qPihp
bXBsKS0+ZnJhbWUoKSwgVjhDdXN0b206OmtET01XaW5kb3dMb2NhdGlvbkluZGV4LCByZXN1bHQp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6
OkRPTVNFTEVDVElPTjoKKyAgICAgICAgICAgICAgICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2Uo
c3RhdGljX2Nhc3Q8RE9NU2VsZWN0aW9uKj4oaW1wbCktPmZyYW1lKCksIFY4Q3VzdG9tOjprRE9N
V2luZG93RE9NU2VsZWN0aW9uSW5kZXgsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6QkFSSU5GTzogeworICAgICAgICAgICAg
ICAgIEJhckluZm8qIGJhckluZm8gPSBzdGF0aWNfY2FzdDxCYXJJbmZvKj4oaW1wbCk7CisgICAg
ICAgICAgICAgICAgRnJhbWUqIGZyYW1lID0gYmFySW5mby0+ZnJhbWUoKTsKKyAgICAgICAgICAg
ICAgICBzd2l0Y2ggKGJhckluZm8tPnR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQmFy
SW5mbzo6TG9jYXRpb25iYXI6CisgICAgICAgICAgICAgICAgICAgIHNldEhpZGRlbldpbmRvd1Jl
ZmVyZW5jZShmcmFtZSwgVjhDdXN0b206OmtET01XaW5kb3dMb2NhdGlvbmJhckluZGV4LCByZXN1
bHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJh
ckluZm86Ok1lbnViYXI6CisgICAgICAgICAgICAgICAgICAgIHNldEhpZGRlbldpbmRvd1JlZmVy
ZW5jZShmcmFtZSwgVjhDdXN0b206OmtET01XaW5kb3dNZW51YmFySW5kZXgsIHJlc3VsdCk7Cisg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQmFySW5mbzo6
UGVyc29uYWxiYXI6CisgICAgICAgICAgICAgICAgICAgIHNldEhpZGRlbldpbmRvd1JlZmVyZW5j
ZShmcmFtZSwgVjhDdXN0b206OmtET01XaW5kb3dQZXJzb25hbGJhckluZGV4LCByZXN1bHQpOwor
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJhckluZm86
OlNjcm9sbGJhcnM6CisgICAgICAgICAgICAgICAgICAgIHNldEhpZGRlbldpbmRvd1JlZmVyZW5j
ZShmcmFtZSwgVjhDdXN0b206OmtET01XaW5kb3dTY3JvbGxiYXJzSW5kZXgsIHJlc3VsdCk7Cisg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQmFySW5mbzo6
U3RhdHVzYmFyOgorICAgICAgICAgICAgICAgICAgICBzZXRIaWRkZW5XaW5kb3dSZWZlcmVuY2Uo
ZnJhbWUsIFY4Q3VzdG9tOjprRE9NV2luZG93U3RhdHVzYmFySW5kZXgsIHJlc3VsdCk7CisgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQmFySW5mbzo6VG9v
bGJhcjoKKyAgICAgICAgICAgICAgICAgICAgc2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKGZyYW1l
LCBWOEN1c3RvbTo6a0RPTVdpbmRvd1Rvb2xiYXJJbmRleCwgcmVzdWx0KTsKKyAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0
OworfQorCit2b2lkIFY4UHJveHk6OnNldEhpZGRlbldpbmRvd1JlZmVyZW5jZShGcmFtZSogZnJh
bWUsIGNvbnN0IGludCBpbnRlcm5hbEluZGV4LCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGpzT2Jq
ZWN0KQoreworICAgIC8vIEdldCBET01XaW5kb3cKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICBy
ZXR1cm47ICAvLyBPYmplY3QgbWlnaHQgYmUgZGV0YWNoZWQgZnJvbSB3aW5kb3cKKyAgICB2ODo6
SGFuZGxlPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSBjb250ZXh0KGZyYW1lKTsKKyAgICBpZiAo
djhDb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKGludGVy
bmFsSW5kZXggPCBWOEN1c3RvbTo6a0RPTVdpbmRvd0ludGVybmFsRmllbGRDb3VudCk7CisKKyAg
ICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGdsb2JhbCA9IHY4Q29udGV4dC0+R2xvYmFsKCk7Cisg
ICAgLy8gTG9vayBmb3IgcmVhbCBET00gd3JhcHBlci4KKyAgICBnbG9iYWwgPSBsb29rdXBET01X
cmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBnbG9iYWwpOworICAgIEFTU0VSVCghZ2xv
YmFsLklzRW1wdHkoKSk7CisgICAgQVNTRVJUKGdsb2JhbC0+R2V0SW50ZXJuYWxGaWVsZChpbnRl
cm5hbEluZGV4KS0+SXNVbmRlZmluZWQoKSk7CisgICAgZ2xvYmFsLT5TZXRJbnRlcm5hbEZpZWxk
KGludGVybmFsSW5kZXgsIGpzT2JqZWN0KTsKK30KKworVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJU
eXBlIFY4UHJveHk6OmRvbVdyYXBwZXJUeXBlKHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqZWN0
KQoreworICAgIEFTU0VSVChtYXliZURPTVdyYXBwZXIob2JqZWN0KSk7CisgICAgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IHR5cGUgPSBvYmplY3QtPkdldEludGVybmFsRmllbGQoVjhDdXN0b206OmtE
T01XcmFwcGVyVHlwZUluZGV4KTsKKyAgICByZXR1cm4gVjhDbGFzc0luZGV4OjpGcm9tSW50KHR5
cGUtPkludDMyVmFsdWUoKSk7Cit9CisKK3ZvaWQqIFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdEltcGwoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHY4OjpIYW5kbGU8djg6
OlZhbHVlPiBvYmplY3QpCit7CisgICAgLy8gTmF0aXZlIGV2ZW50IGxpc3RlbmVyIGlzIHBlciBm
cmFtZSwgaXQgY2Fubm90IGJlIGhhbmRsZWQgYnkgdGhpcyBnZW5lcmljIGZ1bmN0aW9uLgorICAg
IEFTU0VSVCh0eXBlICE9IFY4Q2xhc3NJbmRleDo6RVZFTlRMSVNURU5FUik7CisgICAgQVNTRVJU
KHR5cGUgIT0gVjhDbGFzc0luZGV4OjpFVkVOVFRBUkdFVCk7CisKKyAgICBBU1NFUlQobWF5YmVE
T01XcmFwcGVyKG9iamVjdCkpOworCisgICAgc3dpdGNoICh0eXBlKSB7CisjZGVmaW5lIE1BS0Vf
Q0FTRShUWVBFLCBOQU1FKSBjYXNlIFY4Q2xhc3NJbmRleDo6VFlQRToKKyAgICAgICAgRE9NX05P
REVfVFlQRVMoTUFLRV9DQVNFKQorI2lmIEVOQUJMRShTVkcpCisgICAgICAgIFNWR19OT0RFX1RZ
UEVTKE1BS0VfQ0FTRSkKKyNlbmRpZgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUOgor
ICAgICAgICByZXR1cm4gY29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxYTUxIdHRwUmVxdWVzdD4o
b2JqZWN0KTsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6RVZFTlQ6CisgICAgICAgIHJldHVybiBj
b252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPEV2ZW50PihvYmplY3QpOworICAgIGNhc2UgVjhDbGFz
c0luZGV4OjpDU1NSVUxFOgorICAgICAgICByZXR1cm4gY29udmVydERPTVdyYXBwZXJUb05hdGl2
ZTxDU1NSdWxlPihvYmplY3QpOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0K
KyN1bmRlZiBNQUtFX0NBU0UKKworICAgIHJldHVybiBjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZl
PHZvaWQ+KG9iamVjdCk7Cit9CisKKwordm9pZCogVjhQcm94eTo6Y29udmVydFRvU1ZHUE9EVHlw
ZUltcGwoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBvYmplY3QpCit7CisgICAgcmV0dXJuIGlzV3JhcHBlck9mVHlwZShvYmplY3QsIHR5cGUp
ID8gY29udmVydERPTVdyYXBwZXJUb05hdGl2ZTx2b2lkPihvYmplY3QpIDogMDsKK30KKwordjg6
OkhhbmRsZTx2ODo6T2JqZWN0PiBWOFByb3h5Ojpsb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRl
eDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUpCit7Cisg
ICAgaWYgKHZhbHVlLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVy
Y2VwdG9yKCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBkZXNjcmlw
dG9yID0gVjhQcm94eTo6Z2V0VGVtcGxhdGUodHlwZSk7CisgICAgd2hpbGUgKHZhbHVlLT5Jc09i
amVjdCgpKSB7CisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqZWN0ID0gdjg6Okhh
bmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2YWx1ZSk7CisgICAgICAgIGlmIChkZXNjcmlwdG9yLT5I
YXNJbnN0YW5jZShvYmplY3QpKQorICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKKworICAgICAg
ICB2YWx1ZSA9IG9iamVjdC0+R2V0UHJvdG90eXBlKCk7CisgICAgfQorICAgIHJldHVybiBub3RI
YW5kbGVkQnlJbnRlcmNlcHRvcigpOworfSAKKwordm9pZCogVjhQcm94eTo6Y29udmVydERPTVdy
YXBwZXJUb05vZGVIZWxwZXIodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQoreworICAgIEFT
U0VSVChtYXliZURPTVdyYXBwZXIodmFsdWUpKTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVj
dD4gb2JqZWN0ID0gdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2YWx1ZSk7CisKKyAgICBB
U1NFUlQoZG9tV3JhcHBlclR5cGUob2JqZWN0KSA9PSBWOENsYXNzSW5kZXg6Ok5PREUpOworCisg
ICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdyYXBwZXIgPSBvYmplY3QtPkdldEludGVybmFsRmll
bGQoVjhDdXN0b206OmtET01XcmFwcGVyT2JqZWN0SW5kZXgpOworICAgIHJldHVybiBleHRyYWN0
Q1BvaW50ZXI8Tm9kZT4od3JhcHBlcik7Cit9CisKK1Bhc3NSZWZQdHI8Tm9kZUZpbHRlcj4gVjhQ
cm94eTo6d3JhcE5hdGl2ZU5vZGVGaWx0ZXIodjg6OkhhbmRsZTx2ODo6VmFsdWU+IGZpbHRlcikK
K3sKKyAgICAvLyBBIE5vZGVGaWx0ZXIgaXMgdXNlZCB3aGVuIHdhbGtpbmcgdGhyb3VnaCBhIERP
TSB0cmVlIG9yIGl0ZXJhdGluZyB0cmVlCisgICAgLy8gbm9kZXMuCisgICAgLy8gRklYTUU6IHdl
IG1heSB3YW50IHRvIGNhY2hlIE5vZGVGaWx0ZXJDb25kaXRpb24gYW5kIE5vZGVGaWx0ZXIKKyAg
ICAvLyBvYmplY3QsIGJ1dCBpdCBpcyBtaW5vci4KKyAgICAvLyBOb2RlRmlsdGVyIGlzIHBhc3Nl
ZCB0byBOb2RlSXRlcmF0b3IgdGhhdCBoYXMgYSByZWYgY291bnRlZCBwb2ludGVyCisgICAgLy8g
dG8gTm9kZUZpbHRlci4gTm9kZUZpbHRlciBoYXMgYSByZWYgY291bnRlZCBwb2ludGVyIHRvIE5v
ZGVGaWx0ZXJDb25kaXRpb24uCisgICAgLy8gSW4gTm9kZUZpbHRlckNvbmRpdGlvbiwgZmlsdGVy
IG9iamVjdCBpcyBwZXJzaXN0ZWQgaW4gaXRzIGNvbnN0cnVjdG9yLAorICAgIC8vIGFuZCBkaXNw
b3NlZCBpbiBpdHMgZGVzdHJ1Y3Rvci4KKyAgICBpZiAoIWZpbHRlci0+SXNGdW5jdGlvbigpKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIE5vZGVGaWx0ZXJDb25kaXRpb24qIGNvbmRpdGlvbiA9
IG5ldyBWOE5vZGVGaWx0ZXJDb25kaXRpb24oZmlsdGVyKTsKKyAgICByZXR1cm4gTm9kZUZpbHRl
cjo6Y3JlYXRlKGNvbmRpdGlvbik7Cit9CisKK3Y4OjpMb2NhbDx2ODo6T2JqZWN0PiBWOFByb3h5
OjppbnN0YW50aWF0ZVY4T2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBkZXNjcmlw
dG9yVHlwZSwgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIGNwdHJUeXBlLCB2b2lkKiBpbXBs
KQoreworICAgIC8vIE1ha2UgYSBzcGVjaWFsIGNhc2UgZm9yIGRvY3VtZW50LmFsbAorICAgIGlm
IChkZXNjcmlwdG9yVHlwZSA9PSBWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OICYmIHN0YXRp
Y19jYXN0PEhUTUxDb2xsZWN0aW9uKj4oaW1wbCktPnR5cGUoKSA9PSBEb2NBbGwpCisgICAgICAg
IGRlc2NyaXB0b3JUeXBlID0gVjhDbGFzc0luZGV4OjpVTkRFVEVDVEFCTEVIVE1MQ09MTEVDVElP
TjsKKworICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUoKTsKKyAgICB2ODo6
TG9jYWw8djg6Ok9iamVjdD4gaW5zdGFuY2U7CisgICAgaWYgKHByb3h5KQorICAgICAgICBpbnN0
YW5jZSA9IHByb3h5LT5jcmVhdGVXcmFwcGVyRnJvbUNhY2hlKGRlc2NyaXB0b3JUeXBlKTsKKyAg
ICBlbHNlIHsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gZnVuY3Rpb24gPSBnZXRU
ZW1wbGF0ZShkZXNjcmlwdG9yVHlwZSktPkdldEZ1bmN0aW9uKCk7CisgICAgICAgIGluc3RhbmNl
ID0gU2FmZUFsbG9jYXRpb246Om5ld0luc3RhbmNlKGZ1bmN0aW9uKTsKKyAgICB9CisgICAgaWYg
KCFpbnN0YW5jZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gQXZvaWQgc2V0dGluZyB0aGUgRE9N
IHdyYXBwZXIgZm9yIGZhaWxlZCBhbGxvY2F0aW9ucy4KKyAgICAgICAgc2V0RE9NV3JhcHBlcihp
bnN0YW5jZSwgVjhDbGFzc0luZGV4OjpUb0ludChjcHRyVHlwZSksIGltcGwpOworICAgIH0KKyAg
ICByZXR1cm4gaW5zdGFuY2U7Cit9CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpj
aGVja05ld0xlZ2FsKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCit7CisgICAgaWYgKCFBbGxv
d0FsbG9jYXRpb246Om1fY3VycmVudCkKKyAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoVHlwZUVy
cm9yLCAiSWxsZWdhbCBjb25zdHJ1Y3RvciIpOworCisgICAgcmV0dXJuIGFyZ3MuVGhpcygpOwor
fQorCit2b2lkIFY4UHJveHk6OnNldERPTVdyYXBwZXIodjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBv
YmplY3QsIGludCB0eXBlLCB2b2lkKiBjcHRyKQoreworICAgIEFTU0VSVChvYmplY3QtPkludGVy
bmFsRmllbGRDb3VudCgpID49IDIpOworICAgIG9iamVjdC0+U2V0SW50ZXJuYWxGaWVsZChWOEN1
c3RvbTo6a0RPTVdyYXBwZXJPYmplY3RJbmRleCwgd3JhcENQb2ludGVyKGNwdHIpKTsKKyAgICBv
YmplY3QtPlNldEludGVybmFsRmllbGQoVjhDdXN0b206OmtET01XcmFwcGVyVHlwZUluZGV4LCB2
ODo6SW50ZWdlcjo6TmV3KHR5cGUpKTsKK30KKworI2lmbmRlZiBOREVCVUcKK2Jvb2wgVjhQcm94
eTo6bWF5YmVET01XcmFwcGVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKK3sKKyAgICBp
ZiAodmFsdWUuSXNFbXB0eSgpIHx8ICF2YWx1ZS0+SXNPYmplY3QoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmplY3QgPSB2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+OjpDYXN0KHZhbHVlKTsKKyAgICBpZiAoIW9iamVjdC0+SW50ZXJuYWxGaWVs
ZENvdW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFTU0VSVChvYmplY3QtPklu
dGVybmFsRmllbGRDb3VudCgpID49IFY4Q3VzdG9tOjprRGVmYXVsdFdyYXBwZXJJbnRlcm5hbEZp
ZWxkQ291bnQpOworCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHR5cGUgPSBvYmplY3QtPkdl
dEludGVybmFsRmllbGQoVjhDdXN0b206OmtET01XcmFwcGVyVHlwZUluZGV4KTsKKyAgICBBU1NF
UlQodHlwZS0+SXNJbnQzMigpKTsKKyAgICBBU1NFUlQoVjhDbGFzc0luZGV4OjpJTlZBTElEX0NM
QVNTX0lOREVYIDwgdHlwZS0+SW50MzJWYWx1ZSgpICYmIHR5cGUtPkludDMyVmFsdWUoKSA8IFY4
Q2xhc3NJbmRleDo6Q0xBU1NJTkRFWF9FTkQpOworCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+
IHdyYXBwZXIgPSBvYmplY3QtPkdldEludGVybmFsRmllbGQoVjhDdXN0b206OmtET01XcmFwcGVy
T2JqZWN0SW5kZXgpOworICAgIEFTU0VSVCh3cmFwcGVyLT5Jc051bWJlcigpIHx8IHdyYXBwZXIt
PklzRXh0ZXJuYWwoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCitib29sIFY4
UHJveHk6OmlzRE9NRXZlbnRXcmFwcGVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKK3sK
KyAgICAvLyBBbGwga2luZHMgb2YgZXZlbnRzIHVzZSBFVkVOVCBhcyBkb20gdHlwZSBpbiBKUyB3
cmFwcGVycy4KKyAgICAvLyBTZWUgRXZlbnRUb1Y4T2JqZWN0CisgICAgcmV0dXJuIGlzV3JhcHBl
ck9mVHlwZSh2YWx1ZSwgVjhDbGFzc0luZGV4OjpFVkVOVCk7Cit9CisKK2Jvb2wgVjhQcm94eTo6
aXNXcmFwcGVyT2ZUeXBlKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSwgVjhDbGFzc0luZGV4
OjpWOFdyYXBwZXJUeXBlIGNsYXNzVHlwZSkKK3sKKyAgICBpZiAodmFsdWUuSXNFbXB0eSgpIHx8
ICF2YWx1ZS0+SXNPYmplY3QoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiBvYmplY3QgPSB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHZh
bHVlKTsKKyAgICBpZiAoIW9iamVjdC0+SW50ZXJuYWxGaWVsZENvdW50KCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIEFTU0VSVChvYmplY3QtPkludGVybmFsRmllbGRDb3VudCgpID49
IFY4Q3VzdG9tOjprRGVmYXVsdFdyYXBwZXJJbnRlcm5hbEZpZWxkQ291bnQpOworCisgICAgdjg6
OkhhbmRsZTx2ODo6VmFsdWU+IHdyYXBwZXIgPSBvYmplY3QtPkdldEludGVybmFsRmllbGQoVjhD
dXN0b206OmtET01XcmFwcGVyT2JqZWN0SW5kZXgpOworICAgIEFTU0VSVCh3cmFwcGVyLT5Jc051
bWJlcigpIHx8IHdyYXBwZXItPklzRXh0ZXJuYWwoKSk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gdHlwZSA9IG9iamVjdC0+R2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a0RPTVdyYXBw
ZXJUeXBlSW5kZXgpOworICAgIEFTU0VSVCh0eXBlLT5Jc0ludDMyKCkpOworICAgIEFTU0VSVChW
OENsYXNzSW5kZXg6OklOVkFMSURfQ0xBU1NfSU5ERVggPCB0eXBlLT5JbnQzMlZhbHVlKCkgJiYg
dHlwZS0+SW50MzJWYWx1ZSgpIDwgVjhDbGFzc0luZGV4OjpDTEFTU0lOREVYX0VORCk7CisKKyAg
ICByZXR1cm4gVjhDbGFzc0luZGV4OjpGcm9tSW50KHR5cGUtPkludDMyVmFsdWUoKSkgPT0gY2xh
c3NUeXBlOworfQorCisjaWYgRU5BQkxFKFZJREVPKQorI2RlZmluZSBGT1JfRUFDSF9WSURFT19U
QUcobWFjcm8pICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvKGF1ZGlvLCBBVURJTykgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvKHNvdXJjZSwgU09VUkNFKSAgICAg
ICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvKHZpZGVvLCBWSURFTykKKyNlbHNlCisj
ZGVmaW5lIEZPUl9FQUNIX1ZJREVPX1RBRyhtYWNybykKKyNlbmRpZgorCisjZGVmaW5lIEZPUl9F
QUNIX1RBRyhtYWNybykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYSwgQU5D
SE9SKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYXBwbGV0LCBB
UFBMRVQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYXJlYSwgQVJFQSkg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYmFzZSwgQkFTRSkgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYmFzZWZvbnQsIEJBU0VGT05U
KSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYmxvY2txdW90ZSwgQkxPQ0tRVU9U
RSkgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYm9keSwgQk9EWSkgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYnIsIEJSKSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgbWFjcm8oYnV0dG9uLCBCVVRUT04pICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgbWFjcm8oY2FwdGlvbiwgVEFCTEVDQVBUSU9OKSAgICAgICAgICAg
ICAgICAgICBcCisgICAgbWFjcm8oY29sLCBUQUJMRUNPTCkgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgbWFjcm8oY29sZ3JvdXAsIFRBQkxFQ09MKSAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgbWFjcm8oZGVsLCBNT0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgbWFjcm8oY2FudmFzLCBDQU5WQVMpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgbWFjcm8oZGlyLCBESVJFQ1RPUlkpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
bWFjcm8oZGl2LCBESVYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFj
cm8oZGwsIERMSVNUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8o
ZW1iZWQsIEVNQkVEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oZmll
bGRzZXQsIEZJRUxEU0VUKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oZm9udCwg
Rk9OVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oZm9ybSwgRk9S
TSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oZnJhbWUsIEZSQU1F
KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oZnJhbWVzZXQsIEZSQU1F
U0VUKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaDEsIEhFQURJTkcpICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaDIsIEhFQURJTkcpICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaDMsIEhFQURJTkcpICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaDQsIEhFQURJTkcpICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaDUsIEhFQURJTkcpICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgbWFjcm8oaDYsIEhFQURJTkcpICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgICAgbWFjcm8oaGVhZCwgSEVBRCkgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgbWFjcm8oaHIsIEhSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgbWFjcm8oaHRtbCwgSFRNTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgbWFjcm8oaW1nLCBJTUFHRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgbWFjcm8oaWZyYW1lLCBJRlJBTUUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
bWFjcm8oaW1hZ2UsIElNQUdFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFj
cm8oaW5wdXQsIElOUFVUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8o
aW5zLCBNT0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oaXNp
bmRleCwgSVNJTkRFWCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oa2V5Z2Vu
LCBTRUxFQ1QpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obGFiZWwsIExB
QkVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obGVnZW5kLCBMRUdF
TkQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obGksIExJKSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obGluaywgTElOSykgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obGlzdGluZywgUFJFKSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obWFwLCBNQVApICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8obWFycXVlZSwgTUFSUVVFRSkgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgbWFjcm8obWVudSwgTUVOVSkgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgbWFjcm8obWV0YSwgTUVUQSkgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgICAgbWFjcm8ob2JqZWN0LCBPQkpFQ1QpICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgbWFjcm8ob2wsIE9MSVNUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgbWFjcm8ob3B0Z3JvdXAsIE9QVEdST1VQKSAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgbWFjcm8ob3B0aW9uLCBPUFRJT04pICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgbWFjcm8ocCwgUEFSQUdSQVBIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
bWFjcm8ocGFyYW0sIFBBUkFNKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFj
cm8ocHJlLCBQUkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8o
cSwgUVVPVEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oc2Ny
aXB0LCBTQ1JJUFQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oc2VsZWN0
LCBTRUxFQ1QpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oc3R5bGUsIFNU
WUxFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGFibGUsIFRBQkxF
KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGhlYWQsIFRBQkxFU0VD
VElPTikgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGJvZHksIFRBQkxFU0VDVElP
TikgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGZvb3QsIFRBQkxFU0VDVElPTikg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGQsIFRBQkxFQ0VMTCkgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8odGgsIFRBQkxFQ0VMTCkgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgbWFjcm8odHIsIFRBQkxFUk9XKSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgbWFjcm8odGV4dGFyZWEsIFRFWFRBUkVBKSAgICAgICAgICAgICAg
ICAgICAgICBcCisgICAgbWFjcm8odGl0bGUsIFRJVExFKSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgbWFjcm8odWwsIFVMSVNUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgbWFjcm8oeG1wLCBQUkUpCisKK1Y4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBW
OFByb3h5OjpodG1sRWxlbWVudFR5cGUoSFRNTEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgdHlw
ZWRlZiBIYXNoTWFwPFN0cmluZywgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlPiBXcmFwcGVy
VHlwZU1hcDsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFdyYXBwZXJUeXBlTWFwLCB3cmFwcGVy
VHlwZU1hcCwgKCkpOworICAgIGlmICh3cmFwcGVyVHlwZU1hcC5pc0VtcHR5KCkpIHsKKyNkZWZp
bmUgQUREX1RPX0hBU0hfTUFQKHRhZywgbmFtZSkgXAorICAgICAgICB3cmFwcGVyVHlwZU1hcC5z
ZXQoI3RhZywgVjhDbGFzc0luZGV4OjpIVE1MIyNuYW1lIyNFTEVNRU5UKTsKKyAgICAgICAgRk9S
X0VBQ0hfVEFHKEFERF9UT19IQVNIX01BUCkKKyNpZiBFTkFCTEUoVklERU8pCisgICAgICAgIGlm
IChNZWRpYVBsYXllcjo6aXNBdmFpbGFibGUoKSkgeworICAgICAgICAgICAgRk9SX0VBQ0hfVklE
RU9fVEFHKEFERF9UT19IQVNIX01BUCkKKyAgICAgICAgfQorI2VuZGlmCisjdW5kZWYgQUREX1RP
X0hBU0hfTUFQCisgICAgfQorCisgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUg
PSB3cmFwcGVyVHlwZU1hcC5nZXQoZWxlbWVudC0+bG9jYWxOYW1lKCkuaW1wbCgpKTsKKyAgICBp
ZiAoIXR5cGUpCisgICAgICAgIHJldHVybiBWOENsYXNzSW5kZXg6OkhUTUxFTEVNRU5UOworICAg
IHJldHVybiB0eXBlOworfQorI3VuZGVmIEZPUl9FQUNIX1RBRworCisjaWYgRU5BQkxFKFNWRykK
KworI2lmIEVOQUJMRShTVkdfQU5JTUFUSU9OKQorI2RlZmluZSBGT1JfRUFDSF9BTklNQVRJT05f
VEFHKG1hY3JvKSBcCisgICAgbWFjcm8oYW5pbWF0ZUNvbG9yLCBBTklNQVRFQ09MT1IpIFwKKyAg
ICBtYWNybyhhbmltYXRlLCBBTklNQVRFKSBcCisgICAgbWFjcm8oYW5pbWF0ZVRyYW5zZm9ybSwg
QU5JTUFURVRSQU5TRk9STSkgXAorICAgIG1hY3JvKHNldCwgU0VUKQorI2Vsc2UKKyNkZWZpbmUg
Rk9SX0VBQ0hfQU5JTUFUSU9OX1RBRyhtYWNybykKKyNlbmRpZgorCisjaWYgRU5BQkxFKFNWR19G
SUxURVJTKQorI2RlZmluZSBGT1JfRUFDSF9GSUxURVJTX1RBRyhtYWNybykgXAorICAgIG1hY3Jv
KGZlQmxlbmQsIEZFQkxFTkQpIFwKKyAgICBtYWNybyhmZUNvbG9yTWF0cml4LCBGRUNPTE9STUFU
UklYKSBcCisgICAgbWFjcm8oZmVDb21wb25lbnRUcmFuc2ZlciwgRkVDT01QT05FTlRUUkFOU0ZF
UikgXAorICAgIG1hY3JvKGZlQ29tcG9zaXRlLCBGRUNPTVBPU0lURSkgXAorICAgIG1hY3JvKGZl
RGlmZnVzZUxpZ2h0aW5nLCBGRURJRkZVU0VMSUdIVElORykgXAorICAgIG1hY3JvKGZlRGlzcGxh
Y2VtZW50TWFwLCBGRURJU1BMQUNFTUVOVE1BUCkgXAorICAgIG1hY3JvKGZlRGlzdGFudExpZ2h0
LCBGRURJU1RBTlRMSUdIVCkgXAorICAgIG1hY3JvKGZlRmxvb2QsIEZFRkxPT0QpIFwKKyAgICBt
YWNybyhmZUZ1bmNBLCBGRUZVTkNBKSBcCisgICAgbWFjcm8oZmVGdW5jQiwgRkVGVU5DQikgXAor
ICAgIG1hY3JvKGZlRnVuY0csIEZFRlVOQ0cpIFwKKyAgICBtYWNybyhmZUZ1bmNSLCBGRUZVTkNS
KSBcCisgICAgbWFjcm8oZmVHYXVzc2lhbkJsdXIsIEZFR0FVU1NJQU5CTFVSKSBcCisgICAgbWFj
cm8oZmVJbWFnZSwgRkVJTUFHRSkgXAorICAgIG1hY3JvKGZlTWVyZ2UsIEZFTUVSR0UpIFwKKyAg
ICBtYWNybyhmZU1lcmdlTm9kZSwgRkVNRVJHRU5PREUpIFwKKyAgICBtYWNybyhmZU9mZnNldCwg
RkVPRkZTRVQpIFwKKyAgICBtYWNybyhmZVBvaW50TGlnaHQsIEZFUE9JTlRMSUdIVCkgXAorICAg
IG1hY3JvKGZlU3BlY3VsYXJMaWdodGluZywgRkVTUEVDVUxBUkxJR0hUSU5HKSBcCisgICAgbWFj
cm8oZmVTcG90TGlnaHQsIEZFU1BPVExJR0hUKSBcCisgICAgbWFjcm8oZmVUaWxlLCBGRVRJTEUp
IFwKKyAgICBtYWNybyhmZVR1cmJ1bGVuY2UsIEZFVFVSQlVMRU5DRSkgXAorICAgIG1hY3JvKGZp
bHRlciwgRklMVEVSKQorI2Vsc2UKKyNkZWZpbmUgRk9SX0VBQ0hfRklMVEVSU19UQUcobWFjcm8p
CisjZW5kaWYKKworI2lmIEVOQUJMRShTVkdfRk9OVFMpCisjZGVmaW5lIEZPUl9FQUNIX0ZPTlRT
X1RBRyhtYWNybykgXAorICAgIG1hY3JvKGRlZmluaXRpb24tc3JjLCBERUZJTklUSU9OU1JDKSBc
CisgICAgbWFjcm8oZm9udC1mYWNlLCBGT05URkFDRSkgXAorICAgIG1hY3JvKGZvbnQtZmFjZS1m
b3JtYXQsIEZPTlRGQUNFRk9STUFUKSBcCisgICAgbWFjcm8oZm9udC1mYWNlLW5hbWUsIEZPTlRG
QUNFTkFNRSkgXAorICAgIG1hY3JvKGZvbnQtZmFjZS1zcmMsIEZPTlRGQUNFU1JDKSBcCisgICAg
bWFjcm8oZm9udC1mYWNlLXVyaSwgRk9OVEZBQ0VVUkkpCisjZWxzZQorI2RlZmluZSBGT1JfRUFD
SF9GT05UU19UQUcobWFyY28pCisjZW5kaWYKKworI2lmIEVOQUJMRShTVkdfRk9SRUlHTl9PQkpF
Q1QpCisjZGVmaW5lIEZPUl9FQUNIX0ZPUkVJR05fT0JKRUNUX1RBRyhtYWNybykgXAorICAgIG1h
Y3JvKGZvcmVpZ25PYmplY3QsIEZPUkVJR05PQkpFQ1QpCisjZWxzZQorI2RlZmluZSBGT1JfRUFD
SF9GT1JFSUdOX09CSkVDVF9UQUcobWFjcm8pCisjZW5kaWYKKworI2lmIEVOQUJMRShTVkdfVVNF
KQorI2RlZmluZSBGT1JfRUFDSF9VU0VfVEFHKG1hY3JvKSBcCisgICAgbWFjcm8odXNlLCBVU0Up
CisjZWxzZQorI2RlZmluZSBGT1JfRUFDSF9VU0VfVEFHKG1hY3JvKQorI2VuZGlmCisKKyNkZWZp
bmUgRk9SX0VBQ0hfVEFHKG1hY3JvKSBcCisgICAgRk9SX0VBQ0hfQU5JTUFUSU9OX1RBRyhtYWNy
bykgXAorICAgIEZPUl9FQUNIX0ZJTFRFUlNfVEFHKG1hY3JvKSBcCisgICAgRk9SX0VBQ0hfRk9O
VFNfVEFHKG1hY3JvKSBcCisgICAgRk9SX0VBQ0hfRk9SRUlHTl9PQkpFQ1RfVEFHKG1hY3JvKSBc
CisgICAgRk9SX0VBQ0hfVVNFX1RBRyhtYWNybykgXAorICAgIG1hY3JvKGEsIEEpIFwKKyAgICBt
YWNybyhhbHRHbHlwaCwgQUxUR0xZUEgpIFwKKyAgICBtYWNybyhjaXJjbGUsIENJUkNMRSkgXAor
ICAgIG1hY3JvKGNsaXBQYXRoLCBDTElQUEFUSCkgXAorICAgIG1hY3JvKGN1cnNvciwgQ1VSU09S
KSBcCisgICAgbWFjcm8oZGVmcywgREVGUykgXAorICAgIG1hY3JvKGRlc2MsIERFU0MpIFwKKyAg
ICBtYWNybyhlbGxpcHNlLCBFTExJUFNFKSBcCisgICAgbWFjcm8oZywgRykgXAorICAgIG1hY3Jv
KGdseXBoLCBHTFlQSCkgXAorICAgIG1hY3JvKGltYWdlLCBJTUFHRSkgXAorICAgIG1hY3JvKGxp
bmVhckdyYWRpZW50LCBMSU5FQVJHUkFESUVOVCkgXAorICAgIG1hY3JvKGxpbmUsIExJTkUpIFwK
KyAgICBtYWNybyhtYXJrZXIsIE1BUktFUikgXAorICAgIG1hY3JvKG1hc2ssIE1BU0spIFwKKyAg
ICBtYWNybyhtZXRhZGF0YSwgTUVUQURBVEEpIFwKKyAgICBtYWNybyhwYXRoLCBQQVRIKSBcCisg
ICAgbWFjcm8ocGF0dGVybiwgUEFUVEVSTikgXAorICAgIG1hY3JvKHBvbHlsaW5lLCBQT0xZTElO
RSkgXAorICAgIG1hY3JvKHBvbHlnb24sIFBPTFlHT04pIFwKKyAgICBtYWNybyhyYWRpYWxHcmFk
aWVudCwgUkFESUFMR1JBRElFTlQpIFwKKyAgICBtYWNybyhyZWN0LCBSRUNUKSBcCisgICAgbWFj
cm8oc2NyaXB0LCBTQ1JJUFQpIFwKKyAgICBtYWNybyhzdG9wLCBTVE9QKSBcCisgICAgbWFjcm8o
c3R5bGUsIFNUWUxFKSBcCisgICAgbWFjcm8oc3ZnLCBTVkcpIFwKKyAgICBtYWNybyhzd2l0Y2gs
IFNXSVRDSCkgXAorICAgIG1hY3JvKHN5bWJvbCwgU1lNQk9MKSBcCisgICAgbWFjcm8odGV4dCwg
VEVYVCkgXAorICAgIG1hY3JvKHRleHRQYXRoLCBURVhUUEFUSCkgXAorICAgIG1hY3JvKHRpdGxl
LCBUSVRMRSkgXAorICAgIG1hY3JvKHRyZWYsIFRSRUYpIFwKKyAgICBtYWNybyh0c3BhbiwgVFNQ
QU4pIFwKKyAgICBtYWNybyh2aWV3LCBWSUVXKSBcCisgICAgLy8gZW5kIG9mIG1hY3JvCisKK1Y4
Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBWOFByb3h5OjpzdmdFbGVtZW50VHlwZShTVkdFbGVt
ZW50KiBlbGVtZW50KQoreworICAgIHR5cGVkZWYgSGFzaE1hcDxTdHJpbmcsIFY4Q2xhc3NJbmRl
eDo6VjhXcmFwcGVyVHlwZT4gV3JhcHBlclR5cGVNYXA7CisgICAgREVGSU5FX1NUQVRJQ19MT0NB
TChXcmFwcGVyVHlwZU1hcCwgd3JhcHBlclR5cGVNYXAsICgpKTsKKyAgICBpZiAod3JhcHBlclR5
cGVNYXAuaXNFbXB0eSgpKSB7CisjZGVmaW5lIEFERF9UT19IQVNIX01BUCh0YWcsIG5hbWUpIFwK
KyAgICAgICAgd3JhcHBlclR5cGVNYXAuc2V0KCN0YWcsIFY4Q2xhc3NJbmRleDo6U1ZHIyNuYW1l
IyNFTEVNRU5UKTsKKyAgICAgICAgRk9SX0VBQ0hfVEFHKEFERF9UT19IQVNIX01BUCkKKyN1bmRl
ZiBBRERfVE9fSEFTSF9NQVAKKyAgICB9CisKKyAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5
cGUgdHlwZSA9IHdyYXBwZXJUeXBlTWFwLmdldChlbGVtZW50LT5sb2NhbE5hbWUoKS5pbXBsKCkp
OworICAgIGlmICghdHlwZSkKKyAgICAgICAgcmV0dXJuIFY4Q2xhc3NJbmRleDo6U1ZHRUxFTUVO
VDsKKyAgICByZXR1cm4gdHlwZTsKK30KKyN1bmRlZiBGT1JfRUFDSF9UQUcKKworI2VuZGlmIC8v
IEVOQUJMRShTVkcpCisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpjb252ZXJ0RXZl
bnRUb1Y4T2JqZWN0KEV2ZW50KiBldmVudCkKK3sKKyAgICBpZiAoIWV2ZW50KQorICAgICAgICBy
ZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlciA9
IGdldERPTU9iamVjdE1hcCgpLmdldChldmVudCk7CisgICAgaWYgKCF3cmFwcGVyLklzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisKKyAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBl
clR5cGUgdHlwZSA9IFY4Q2xhc3NJbmRleDo6RVZFTlQ7CisKKyAgICBpZiAoZXZlbnQtPmlzVUlF
dmVudCgpKSB7CisgICAgICAgIGlmIChldmVudC0+aXNLZXlib2FyZEV2ZW50KCkpCisgICAgICAg
ICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpLRVlCT0FSREVWRU5UOworICAgICAgICBlbHNlIGlm
IChldmVudC0+aXNUZXh0RXZlbnQoKSkKKyAgICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6
OlRFWFRFVkVOVDsKKyAgICAgICAgZWxzZSBpZiAoZXZlbnQtPmlzTW91c2VFdmVudCgpKQorICAg
ICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6TU9VU0VFVkVOVDsKKyAgICAgICAgZWxzZSBp
ZiAoZXZlbnQtPmlzV2hlZWxFdmVudCgpKQorICAgICAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRl
eDo6V0hFRUxFVkVOVDsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBlbHNlIGlmIChldmVudC0+
aXNTVkdab29tRXZlbnQoKSkKKyAgICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OlNWR1pP
T01FVkVOVDsKKyNlbmRpZgorICAgICAgICBlbHNlCisgICAgICAgICAgICB0eXBlID0gVjhDbGFz
c0luZGV4OjpVSUVWRU5UOworICAgIH0gZWxzZSBpZiAoZXZlbnQtPmlzTXV0YXRpb25FdmVudCgp
KQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpNVVRBVElPTkVWRU5UOworICAgIGVsc2Ug
aWYgKGV2ZW50LT5pc092ZXJmbG93RXZlbnQoKSkKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRl
eDo6T1ZFUkZMT1dFVkVOVDsKKyAgICBlbHNlIGlmIChldmVudC0+aXNNZXNzYWdlRXZlbnQoKSkK
KyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6TUVTU0FHRUVWRU5UOworICAgIGVsc2UgaWYg
KGV2ZW50LT5pc1Byb2dyZXNzRXZlbnQoKSkgeworICAgICAgICBpZiAoZXZlbnQtPmlzWE1MSHR0
cFJlcXVlc3RQcm9ncmVzc0V2ZW50KCkpCisgICAgICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4
OjpYTUxIVFRQUkVRVUVTVFBST0dSRVNTRVZFTlQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IHR5cGUgPSBWOENsYXNzSW5kZXg6OlBST0dSRVNTRVZFTlQ7CisgICAgfSBlbHNlIGlmIChldmVu
dC0+aXNXZWJLaXRBbmltYXRpb25FdmVudCgpKQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4
OjpXRUJLSVRBTklNQVRJT05FVkVOVDsKKyAgICBlbHNlIGlmIChldmVudC0+aXNXZWJLaXRUcmFu
c2l0aW9uRXZlbnQoKSkKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6V0VCS0lUVFJBTlNJ
VElPTkVWRU5UOworCisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJlc3VsdCA9IGluc3Rh
bnRpYXRlVjhPYmplY3QodHlwZSwgVjhDbGFzc0luZGV4OjpFVkVOVCwgZXZlbnQpOworICAgIGlm
IChyZXN1bHQuSXNFbXB0eSgpKSB7CisgICAgICAgIC8vIEluc3RhbnRpYXRpb24gZmFpbGVkLiBB
dm9pZCB1cGRhdGluZyB0aGUgRE9NIG9iamVjdCBtYXAgYW5kCisgICAgICAgIC8vIHJldHVybiBu
dWxsIHdoaWNoIGlzIGFscmVhZHkgaGFuZGxlZCBieSBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24K
KyAgICAgICAgLy8gaW4gY2FzZSB0aGUgZXZlbnQgaXMgTlVMTC4KKyAgICAgICAgcmV0dXJuIHY4
OjpOdWxsKCk7CisgICAgfQorCisgICAgZXZlbnQtPnJlZigpOyAgLy8gZmFzdCByZWYKKyAgICBz
ZXRKU1dyYXBwZXJGb3JET01PYmplY3QoZXZlbnQsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+
OjpOZXcocmVzdWx0KSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBDYWxsZXIgY2hl
Y2tzIG5vZGUgaXMgbm90IG51bGwuCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y29u
dmVydE5vZGVUb1Y4T2JqZWN0KE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlKQorICAgICAg
ICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIC8vIEZpbmQgdGhlIGNvbnRleHQgdG8gd2hpY2gg
dGhlIG5vZGUgYmVsb25ncyBhbmQgY3JlYXRlIHRoZSB3cmFwcGVyCisgICAgLy8gaW4gdGhhdCBj
b250ZXh0LiBJZiB0aGUgbm9kZSBpcyBub3QgaW4gYSBkb2N1bWVudCwgdGhlIGN1cnJlbnQKKyAg
ICAvLyBjb250ZXh0IGlzIHVzZWQuCisgICAgLy8KKyAgICAvLyBHZXR0aW5nIHRoZSBjb250ZXh0
IG1pZ2h0IGluaXRpYWxpemUgdGhlIGNvbnRleHQgd2hpY2ggY2FuIGluc3RhbnRpYXRlCisgICAg
Ly8gYSBkb2N1bWVudCB3cmFwcGVyLiBUaGVyZWZvcmUsIHdlIGdldCB0aGUgY29udGV4dCBiZWZv
cmUgY2hlY2tpbmcgaWYKKyAgICAvLyB0aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHdyYXBwZXIuCisg
ICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiB2OENvbnRleHQ7CisgICAgRG9jdW1lbnQqIGRvY3Vt
ZW50ID0gbm9kZS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoZG9jdW1lbnQpCisgICAgICAgIHY4Q29u
dGV4dCA9IFY4UHJveHk6OmNvbnRleHQoZG9jdW1lbnQtPmZyYW1lKCkpOworCisgICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZ2V0RE9NTm9kZU1hcCgpLmdldChub2RlKTsKKyAg
ICBpZiAoIXdyYXBwZXIuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gd3JhcHBlcjsKKworICAg
IGJvb2wgaXNEb2N1bWVudCA9IGZhbHNlOyAgLy8gZG9jdW1lbnQgdHlwZSBub2RlIGhhcyBzcGVj
aWFsIGhhbmRsaW5nCisgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGU7CisKKyAg
ICBzd2l0Y2ggKG5vZGUtPm5vZGVUeXBlKCkpIHsKKyAgICBjYXNlIE5vZGU6OkVMRU1FTlRfTk9E
RToKKyAgICAgICAgaWYgKG5vZGUtPmlzSFRNTEVsZW1lbnQoKSkKKyAgICAgICAgICAgIHR5cGUg
PSBodG1sRWxlbWVudFR5cGUoc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnQqPihub2RlKSk7CisjaWYg
RU5BQkxFKFNWRykKKyAgICAgICAgZWxzZSBpZiAobm9kZS0+aXNTVkdFbGVtZW50KCkpCisgICAg
ICAgICAgICB0eXBlID0gc3ZnRWxlbWVudFR5cGUoc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KG5v
ZGUpKTsKKyNlbmRpZgorICAgICAgICBlbHNlCisgICAgICAgICAgICB0eXBlID0gVjhDbGFzc0lu
ZGV4OjpFTEVNRU5UOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5vZGU6OkFUVFJJQlVURV9O
T0RFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpBVFRSOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIE5vZGU6OlRFWFRfTk9ERToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6
VEVYVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlOjpDREFUQV9TRUNUSU9OX05PREU6
CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNEQVRBU0VDVElPTjsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBOb2RlOjpFTlRJVFlfTk9ERToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJ
bmRleDo6RU5USVRZOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5vZGU6OlBST0NFU1NJTkdf
SU5TVFJVQ1RJT05fTk9ERToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6UFJPQ0VTU0lO
R0lOU1RSVUNUSU9OOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5vZGU6OkNPTU1FTlRfTk9E
RToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q09NTUVOVDsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9OT0RFOiB7CisgICAgICAgIGlzRG9jdW1lbnQgPSB0
cnVlOworICAgICAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxEb2N1bWVudCo+
KG5vZGUpOworICAgICAgICBpZiAoZG9jdW1lbnQtPmlzSFRNTERvY3VtZW50KCkpCisgICAgICAg
ICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpIVE1MRE9DVU1FTlQ7CisjaWYgRU5BQkxFKFNWRykK
KyAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQtPmlzU1ZHRG9jdW1lbnQoKSkKKyAgICAgICAgICAg
IHR5cGUgPSBWOENsYXNzSW5kZXg6OlNWR0RPQ1VNRU5UOworI2VuZGlmCisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkRPQ1VNRU5UOworICAgICAgICBicmVh
azsKKyAgICB9CisgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9UWVBFX05PREU6CisgICAgICAgIHR5
cGUgPSBWOENsYXNzSW5kZXg6OkRPQ1VNRU5UVFlQRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBOb2RlOjpOT1RBVElPTl9OT0RFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpOT1RB
VElPTjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9GUkFHTUVOVF9O
T0RFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpET0NVTUVOVEZSQUdNRU5UOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIE5vZGU6OkVOVElUWV9SRUZFUkVOQ0VfTk9ERToKKyAgICAg
ICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6RU5USVRZUkVGRVJFTkNFOworICAgICAgICBicmVhazsK
KyAgICBkZWZhdWx0OgorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpOT0RFOworICAgIH0K
KworICAgIC8vIEVudGVyIHRoZSBub2RlJ3MgY29udGV4dCBhbmQgY3JlYXRlIHRoZSB3cmFwcGVy
IGluIHRoYXQgY29udGV4dC4KKyAgICBpZiAoIXY4Q29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAg
IHY4Q29udGV4dC0+RW50ZXIoKTsKKworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiByZXN1bHQg
PSBpbnN0YW50aWF0ZVY4T2JqZWN0KHR5cGUsIFY4Q2xhc3NJbmRleDo6Tk9ERSwgbm9kZSk7CisK
KyAgICAvLyBFeGl0IHRoZSBub2RlJ3MgY29udGV4dCBpZiBpdCB3YXMgZW50ZXJlZC4KKyAgICBp
ZiAoIXY4Q29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHY4Q29udGV4dC0+RXhpdCgpOworCisg
ICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gSWYgaW5zdGFudGlhdGlvbiBm
YWlsZWQgaXQncyBpbXBvcnRhbnQgbm90IHRvIGFkZCB0aGUgcmVzdWx0CisgICAgICAgIC8vIHRv
IHRoZSBET00gbm9kZSBtYXAuIEluc3RlYWQgd2UgcmV0dXJuIGFuIGVtcHR5IGhhbmRsZSwgd2hp
Y2gKKyAgICAgICAgLy8gc2hvdWxkIGFscmVhZHkgYmUgaGFuZGxlZCBieSBjYWxsZXJzIG9mIHRo
aXMgZnVuY3Rpb24gaW4gY2FzZQorICAgICAgICAvLyB0aGUgbm9kZSBpcyBOVUxMLgorICAgICAg
ICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIG5vZGUtPnJlZigpOworICAgIHNldEpTV3Jh
cHBlckZvckRPTU5vZGUobm9kZSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhyZXN1
bHQpKTsKKworICAgIGlmIChpc0RvY3VtZW50KSB7CisgICAgICAgIERvY3VtZW50KiBkb2N1bWVu
dCA9IHN0YXRpY19jYXN0PERvY3VtZW50Kj4obm9kZSk7CisgICAgICAgIFY4UHJveHkqIHByb3h5
ID0gVjhQcm94eTo6cmV0cmlldmUoZG9jdW1lbnQtPmZyYW1lKCkpOworICAgICAgICBpZiAocHJv
eHkpCisgICAgICAgICAgICBwcm94eS0+dXBkYXRlRG9jdW1lbnRXcmFwcGVyKHJlc3VsdCk7CisK
KyAgICAgICAgaWYgKHR5cGUgPT0gVjhDbGFzc0luZGV4OjpIVE1MRE9DVU1FTlQpIHsKKyAgICAg
ICAgICAgIC8vIENyZWF0ZSBtYXJrZXIgb2JqZWN0IGFuZCBpbnNlcnQgaXQgaW4gdHdvIGludGVy
bmFsIGZpZWxkcy4KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGVt
cG9yYXJ5IHNoYWRvd2luZyBvZgorICAgICAgICAgICAgLy8gZG9jdW1lbnQuYWxsLgorICAgICAg
ICAgICAgQVNTRVJUKHJlc3VsdC0+SW50ZXJuYWxGaWVsZENvdW50KCkgPT0gVjhDdXN0b206OmtI
VE1MRG9jdW1lbnRJbnRlcm5hbEZpZWxkQ291bnQpOworICAgICAgICAgICAgdjg6OkxvY2FsPHY4
OjpPYmplY3Q+IG1hcmtlciA9IHY4OjpPYmplY3Q6Ok5ldygpOworICAgICAgICAgICAgcmVzdWx0
LT5TZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprSFRNTERvY3VtZW50TWFya2VySW5kZXgsIG1h
cmtlcik7CisgICAgICAgICAgICByZXN1bHQtPlNldEludGVybmFsRmllbGQoVjhDdXN0b206OmtI
VE1MRG9jdW1lbnRTaGFkb3dJbmRleCwgbWFya2VyKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEEgSlMgb2JqZWN0IG9mIHR5cGUgRXZlbnRUYXJnZXQg
Y2FuIG9ubHkgYmUgdGhlIGZvbGxvd2luZyBwb3NzaWJsZSB0eXBlczoKKy8vIDEpIEV2ZW50VGFy
Z2V0Tm9kZTsgMikgRE9NV2luZG93IDMpIFhNTEh0dHBSZXF1ZXN0OyA0KSBNZXNzYWdlUG9ydDsK
Ky8vIDUpIFhNTEh0dHBSZXF1ZXN0VXBsb2FkCisvLyBjaGVjayBFdmVudFRhcmdldC5oIGZvciBu
ZXcgdHlwZSBjb252ZXJzaW9uIG1ldGhvZHMKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5
Ojpjb252ZXJ0RXZlbnRUYXJnZXRUb1Y4T2JqZWN0KEV2ZW50VGFyZ2V0KiB0YXJnZXQpCit7Cisg
ICAgaWYgKCF0YXJnZXQpCisgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisjaWYgRU5BQkxF
KFNWRykKKyAgICBTVkdFbGVtZW50SW5zdGFuY2UqIGluc3RhbmNlID0gdGFyZ2V0LT50b1NWR0Vs
ZW1lbnRJbnN0YW5jZSgpOworICAgIGlmIChpbnN0YW5jZSkKKyAgICAgICAgcmV0dXJuIGNvbnZl
cnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1ZHRUxFTUVOVElOU1RBTkNFLCBpbnN0YW5jZSk7
CisjZW5kaWYKKworI2lmIEVOQUJMRShXT1JLRVJTKQorICAgIFdvcmtlciogd29ya2VyID0gdGFy
Z2V0LT50b1dvcmtlcigpOworICAgIGlmICh3b3JrZXIpCisgICAgICAgIHJldHVybiBjb252ZXJ0
VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OldPUktFUiwgd29ya2VyKTsKKyNlbmRpZiAvLyBXT1JL
RVJTCisKKyAgICBOb2RlKiBub2RlID0gdGFyZ2V0LT50b05vZGUoKTsKKyAgICBpZiAobm9kZSkK
KyAgICAgICAgcmV0dXJuIGNvbnZlcnROb2RlVG9WOE9iamVjdChub2RlKTsKKworICAgIGlmIChE
T01XaW5kb3cqIGRvbVdpbmRvdyA9IHRhcmdldC0+dG9ET01XaW5kb3coKSkKKyAgICAgICAgcmV0
dXJuIGNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBkb21XaW5kb3cp
OworCisgICAgLy8gWE1MSHR0cFJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoaW4gaXRzIEpTIGNvdW50
ZXJwYXJ0LgorICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IHRhcmdldC0+dG9Y
TUxIdHRwUmVxdWVzdCgpOworICAgIGlmICh4bWxIdHRwUmVxdWVzdCkgeworICAgICAgICB2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRBY3RpdmVET01PYmplY3RNYXAoKS5nZXQo
eG1sSHR0cFJlcXVlc3QpOworICAgICAgICBBU1NFUlQoIXdyYXBwZXIuSXNFbXB0eSgpKTsKKyAg
ICAgICAgcmV0dXJuIHdyYXBwZXI7CisgICAgfQorCisgICAgLy8gTWVzc2FnZVBvcnQgaXMgY3Jl
YXRlZCB3aXRoaW4gaXRzIEpTIGNvdW50ZXJwYXJ0CisgICAgTWVzc2FnZVBvcnQqIHBvcnQgPSB0
YXJnZXQtPnRvTWVzc2FnZVBvcnQoKTsKKyAgICBpZiAocG9ydCkgeworICAgICAgICB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRBY3RpdmVET01PYmplY3RNYXAoKS5nZXQocG9y
dCk7CisgICAgICAgIEFTU0VSVCghd3JhcHBlci5Jc0VtcHR5KCkpOworICAgICAgICByZXR1cm4g
d3JhcHBlcjsKKyAgICB9CisKKyAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogdXBsb2FkID0gdGFy
Z2V0LT50b1hNTEh0dHBSZXF1ZXN0VXBsb2FkKCk7CisgICAgaWYgKHVwbG9hZCkgeworICAgICAg
ICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRET01PYmplY3RNYXAoKS5nZXQo
dXBsb2FkKTsKKyAgICAgICAgQVNTRVJUKCF3cmFwcGVyLklzRW1wdHkoKSk7CisgICAgICAgIHJl
dHVybiB3cmFwcGVyOworICAgIH0KKworICAgIEFTU0VSVCgwKTsKKyAgICByZXR1cm4gbm90SGFu
ZGxlZEJ5SW50ZXJjZXB0b3IoKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6
OmNvbnZlcnRFdmVudExpc3RlbmVyVG9WOE9iamVjdChFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikK
K3sKKyAgICBpZiAoIWxpc3RlbmVyKQorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAg
IC8vIEZJWE1FOiBjYW4gYSB1c2VyIHRha2UgYSBsYXp5IGV2ZW50IGxpc3RlbmVyIGFuZCBzZXQg
dG8gb3RoZXIgcGxhY2VzPworICAgIFY4QWJzdHJhY3RFdmVudExpc3RlbmVyKiB2OGxpc3RlbmVy
ID0gc3RhdGljX2Nhc3Q8VjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIqPihsaXN0ZW5lcik7CisgICAg
cmV0dXJuIHY4bGlzdGVuZXItPmdldExpc3RlbmVyT2JqZWN0KCk7Cit9CisKK3Y4OjpIYW5kbGU8
djg6OlZhbHVlPiBWOFByb3h5Ojpjb252ZXJ0RE9NSW1wbGVtZW50YXRpb25Ub1Y4T2JqZWN0KERP
TUltcGxlbWVudGF0aW9uKiBpbXBsKQoreworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gcmVz
dWx0ID0gaW5zdGFudGlhdGVWOE9iamVjdChWOENsYXNzSW5kZXg6OkRPTUlNUExFTUVOVEFUSU9O
LCBWOENsYXNzSW5kZXg6OkRPTUlNUExFTUVOVEFUSU9OLCBpbXBsKTsKKyAgICBpZiAocmVzdWx0
LklzRW1wdHkoKSkgeworICAgICAgICAvLyBJZiB0aGUgaW5zdGFudGlhdGlvbiBmYWlsZWQsIHdl
IGlnbm9yZSBpdCBhbmQgcmV0dXJuIG51bGwgaW5zdGVhZAorICAgICAgICAvLyBvZiByZXR1cm5p
bmcgYW4gZW1wdHkgaGFuZGxlLgorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKyAgICB9Cisg
ICAgcmV0dXJuIHJlc3VsdDsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6OmNv
bnZlcnRTdHlsZVNoZWV0VG9WOE9iamVjdChTdHlsZVNoZWV0KiBzaGVldCkKK3sKKyAgICBpZiAo
IXNoZWV0KQorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIHY4OjpIYW5kbGU8djg6
Ok9iamVjdD4gd3JhcHBlciA9IGdldERPTU9iamVjdE1hcCgpLmdldChzaGVldCk7CisgICAgaWYg
KCF3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisKKyAgICBWOENs
YXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IFY4Q2xhc3NJbmRleDo6U1RZTEVTSEVFVDsK
KyAgICBpZiAoc2hlZXQtPmlzQ1NTU3R5bGVTaGVldCgpKQorICAgICAgICB0eXBlID0gVjhDbGFz
c0luZGV4OjpDU1NTVFlMRVNIRUVUOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiByZXN1
bHQgPSBpbnN0YW50aWF0ZVY4T2JqZWN0KHR5cGUsIFY4Q2xhc3NJbmRleDo6U1RZTEVTSEVFVCwg
c2hlZXQpOworICAgIGlmICghcmVzdWx0LklzRW1wdHkoKSkgeworICAgICAgICAvLyBPbmx5IHVw
ZGF0ZSB0aGUgRE9NIG9iamVjdCBtYXAgaWYgdGhlIHJlc3VsdCBpcyBub24tZW1wdHkuCisgICAg
ICAgIHNoZWV0LT5yZWYoKTsKKyAgICAgICAgc2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KHNoZWV0
LCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KHJlc3VsdCkpOworICAgIH0KKworICAg
IC8vIEFkZCBhIGhpZGRlbiByZWZlcmVuY2UgZnJvbSBzdHlsZXNoZWV0IG9iamVjdCB0byBpdHMg
b3duZXIgbm9kZS4KKyAgICBOb2RlKiBvd25lck5vZGUgPSBzaGVldC0+b3duZXJOb2RlKCk7Cisg
ICAgaWYgKG93bmVyTm9kZSkgeworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG93bmVy
ID0gdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdChjb252ZXJ0Tm9kZVRvVjhPYmplY3Qob3du
ZXJOb2RlKSk7CisgICAgICAgIHJlc3VsdC0+U2V0SW50ZXJuYWxGaWVsZChWOEN1c3RvbTo6a1N0
eWxlU2hlZXRPd25lck5vZGVJbmRleCwgb3duZXIpOworICAgIH0KKworICAgIHJldHVybiByZXN1
bHQ7Cit9CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFByb3h5Ojpjb252ZXJ0Q1NTVmFsdWVU
b1Y4T2JqZWN0KENTU1ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAoIXZhbHVlKQorICAgICAgICBy
ZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlciA9
IGdldERPTU9iamVjdE1hcCgpLmdldCh2YWx1ZSk7CisgICAgaWYgKCF3cmFwcGVyLklzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisKKyAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBl
clR5cGUgdHlwZTsKKworICAgIGlmICh2YWx1ZS0+aXNXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSgp
KQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpXRUJLSVRDU1NUUkFOU0ZPUk1WQUxVRTsK
KyAgICBlbHNlIGlmICh2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgdHlwZSA9IFY4Q2xh
c3NJbmRleDo6Q1NTVkFMVUVMSVNUOworICAgIGVsc2UgaWYgKHZhbHVlLT5pc1ByaW1pdGl2ZVZh
bHVlKCkpCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU1BSSU1JVElWRVZBTFVFOwor
I2lmIEVOQUJMRShTVkcpCisgICAgZWxzZSBpZiAodmFsdWUtPmlzU1ZHUGFpbnQoKSkKKyAgICAg
ICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6U1ZHUEFJTlQ7CisgICAgZWxzZSBpZiAodmFsdWUtPmlz
U1ZHQ29sb3IoKSkKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6U1ZHQ09MT1I7CisjZW5k
aWYKKyAgICBlbHNlCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU1ZBTFVFOworCisg
ICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiByZXN1bHQgPSBpbnN0YW50aWF0ZVY4T2JqZWN0KHR5
cGUsIFY4Q2xhc3NJbmRleDo6Q1NTVkFMVUUsIHZhbHVlKTsKKyAgICBpZiAoIXJlc3VsdC5Jc0Vt
cHR5KCkpIHsKKyAgICAgICAgLy8gT25seSB1cGRhdGUgdGhlIERPTSBvYmplY3QgbWFwIGlmIHRo
ZSByZXN1bHQgaXMgbm9uLWVtcHR5LgorICAgICAgICB2YWx1ZS0+cmVmKCk7CisgICAgICAgIHNl
dEpTV3JhcHBlckZvckRPTU9iamVjdCh2YWx1ZSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46
Ok5ldyhyZXN1bHQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gVjhQcm94eTo6Y29udmVydENTU1J1bGVUb1Y4T2JqZWN0KENTU1J1bGUq
IHJ1bGUpCit7CisgICAgaWYgKCFydWxlKSAKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisK
KyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBnZXRET01PYmplY3RNYXAoKS5n
ZXQocnVsZSk7CisgICAgaWYgKCF3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHdy
YXBwZXI7CisKKyAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZTsKKworICAgIHN3
aXRjaCAocnVsZS0+dHlwZSgpKSB7CisgICAgY2FzZSBDU1NSdWxlOjpTVFlMRV9SVUxFOgorICAg
ICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpDU1NTVFlMRVJVTEU7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgQ1NTUnVsZTo6Q0hBUlNFVF9SVUxFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0lu
ZGV4OjpDU1NDSEFSU0VUUlVMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NSdWxlOjpJ
TVBPUlRfUlVMRToKKyAgICAgICAgdHlwZSA9IFY4Q2xhc3NJbmRleDo6Q1NTSU1QT1JUUlVMRTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NSdWxlOjpNRURJQV9SVUxFOgorICAgICAgICB0
eXBlID0gVjhDbGFzc0luZGV4OjpDU1NNRURJQVJVTEU7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgQ1NTUnVsZTo6Rk9OVF9GQUNFX1JVTEU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6
OkNTU0ZPTlRGQUNFUlVMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NSdWxlOjpQQUdF
X1JVTEU6CisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6OkNTU1BBR0VSVUxFOworICAgICAg
ICBicmVhazsKKyAgICBjYXNlIENTU1J1bGU6OlZBUklBQkxFU19SVUxFOgorICAgICAgICB0eXBl
ID0gVjhDbGFzc0luZGV4OjpDU1NWQVJJQUJMRVNSVUxFOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIENTU1J1bGU6OldFQktJVF9LRVlGUkFNRV9SVUxFOgorICAgICAgICB0eXBlID0gVjhDbGFz
c0luZGV4OjpXRUJLSVRDU1NLRVlGUkFNRVJVTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
Q1NTUnVsZTo6V0VCS0lUX0tFWUZSQU1FU19SVUxFOgorICAgICAgICB0eXBlID0gVjhDbGFzc0lu
ZGV4OjpXRUJLSVRDU1NLRVlGUkFNRVNSVUxFOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0
OiAgLy8gQ1NTUnVsZTo6VU5LTk9XTl9SVUxFCisgICAgICAgIHR5cGUgPSBWOENsYXNzSW5kZXg6
OkNTU1JVTEU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHY4OjpIYW5kbGU8djg6Ok9i
amVjdD4gcmVzdWx0ID0gaW5zdGFudGlhdGVWOE9iamVjdCh0eXBlLCBWOENsYXNzSW5kZXg6OkNT
U1JVTEUsIHJ1bGUpOworICAgIGlmICghcmVzdWx0LklzRW1wdHkoKSkgeworICAgICAgICAvLyBP
bmx5IHVwZGF0ZSB0aGUgRE9NIG9iamVjdCBtYXAgaWYgdGhlIHJlc3VsdCBpcyBub24tZW1wdHku
CisgICAgICAgIHJ1bGUtPnJlZigpOworICAgICAgICBzZXRKU1dyYXBwZXJGb3JET01PYmplY3Qo
cnVsZSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhyZXN1bHQpKTsKKyAgICB9Cisg
ICAgcmV0dXJuIHJlc3VsdDsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFY4UHJveHk6OmNv
bnZlcnRXaW5kb3dUb1Y4T2JqZWN0KERPTVdpbmRvdyogd2luZG93KQoreworICAgIGlmICghd2lu
ZG93KQorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKyAgICAvLyBJbml0aWFsaXplcyBlbnZp
cm9ubWVudCBvZiBhIGZyYW1lLCBhbmQgcmV0dXJuIHRoZSBnbG9iYWwgb2JqZWN0CisgICAgLy8g
b2YgdGhlIGZyYW1lLgorICAgIEZyYW1lKiBmcmFtZSA9IHdpbmRvdy0+ZnJhbWUoKTsKKyAgICBp
ZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6T2JqZWN0PigpOworCisg
ICAgLy8gU3BlY2lhbCBjYXNlOiBCZWNhdXNlIG9mIGV2YWx1YXRlSW5OZXdDb250ZXh0KCkgb25l
IERPTVdpbmRvdyBjYW4gaGF2ZQorICAgIC8vIG11bHRpcGxlIGNvbnRleHRzIGFuZCBtdWx0aXBs
ZSBnbG9iYWwgb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggaXQuIFdoZW4KKyAgICAvLyBjb2RlIHJ1
bm5pbmcgaW4gb25lIG9mIHRob3NlIGNvbnRleHRzIGFjY2Vzc2VzIHRoZSB3aW5kb3cgb2JqZWN0
LCB3ZQorICAgIC8vIHdhbnQgdG8gcmV0dXJuIHRoZSBnbG9iYWwgb2JqZWN0IGFzc29jaWF0ZWQg
d2l0aCB0aGF0IGNvbnRleHQsIG5vdAorICAgIC8vIG5lY2Vzc2FyaWx5IHRoZSBmaXJzdCBnbG9i
YWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGF0IERPTVdpbmRvdy4KKyAgICB2ODo6SGFuZGxl
PHY4OjpDb250ZXh0PiBjdXJyZW50Q29udGV4dCA9IHY4OjpDb250ZXh0OjpHZXRDdXJyZW50KCk7
CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBjdXJyZW50R2xvYmFsID0gY3VycmVudENvbnRl
eHQtPkdsb2JhbCgpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd2luZG93V3JhcHBlciA9
IGxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGN1cnJlbnRHbG9iYWwp
OworICAgIGlmICghd2luZG93V3JhcHBlci5Jc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKGNvbnZl
cnRET01XcmFwcGVyVG9OYXRpdmU8RE9NV2luZG93Pih3aW5kb3dXcmFwcGVyKSA9PSB3aW5kb3cp
CisgICAgICAgICAgICByZXR1cm4gY3VycmVudEdsb2JhbDsKKyAgICB9CisKKyAgICAvLyBPdGhl
cndpc2UsIHJldHVybiB0aGUgZ2xvYmFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmcmFt
ZS4KKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSBjb250ZXh0KGZyYW1l
KTsKKyAgICBpZiAodjhDb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4oKTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsID0g
djhDb250ZXh0LT5HbG9iYWwoKTsKKyAgICBBU1NFUlQoIWdsb2JhbC5Jc0VtcHR5KCkpOworICAg
IHJldHVybiBnbG9iYWw7Cit9CisKK3ZvaWQgVjhQcm94eTo6YmluZEpzT2JqZWN0VG9XaW5kb3co
RnJhbWUqIGZyYW1lLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgdHlwZSwgdjg6OkhhbmRsZTx2ODo6
RnVuY3Rpb25UZW1wbGF0ZT4gZGVzY3JpcHRvciwgdm9pZCogaW1wbCkKK3sKKyAgICAvLyBHZXQg
ZW52aXJvbm1lbnQuCisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gdjhDb250ZXh0ID0gVjhQ
cm94eTo6Y29udGV4dChmcmFtZSk7CisgICAgaWYgKHY4Q29udGV4dC5Jc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybjsgIC8vIEpTIG5vdCBlbmFibGVkLgorCisgICAgdjg6OkNvbnRleHQ6OlNjb3Bl
IHNjb3BlKHY4Q29udGV4dCk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBpbnN0YW5jZSA9
IGRlc2NyaXB0b3ItPkdldEZ1bmN0aW9uKCk7CisgICAgc2V0RE9NV3JhcHBlcihpbnN0YW5jZSwg
dHlwZSwgaW1wbCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGdsb2JhbCA9IHY4Q29u
dGV4dC0+R2xvYmFsKCk7CisgICAgZ2xvYmFsLT5TZXQodjg6OlN0cmluZzo6TmV3KG5hbWUpLCBp
bnN0YW5jZSk7Cit9CisKK3ZvaWQgVjhQcm94eTo6cHJvY2Vzc0NvbnNvbGVNZXNzYWdlcygpCit7
CisgICAgQ29uc29sZU1lc3NhZ2VNYW5hZ2VyOjpwcm9jZXNzRGVsYXllZE1lc3NhZ2VzKCk7Cit9
CisKKy8vIENyZWF0ZSB0aGUgdXRpbGl0eSBjb250ZXh0IGZvciBob2xkaW5nIEphdmFTY3JpcHQg
ZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseQorLy8gd2hpY2ggYXJlIG5vdCB2aXNpYmxlIHRvIEph
dmFTY3JpcHQgZXhlY3V0aW5nIG9uIHRoZSBwYWdlLgordm9pZCBWOFByb3h5OjpjcmVhdGVVdGls
aXR5Q29udGV4dCgpCit7CisgICAgQVNTRVJUKG1fdXRpbGl0eUNvbnRleHQuSXNFbXB0eSgpKTsK
KworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3RU
ZW1wbGF0ZT4gZ2xvYmFsVGVtcGxhdGUgPSB2ODo6T2JqZWN0VGVtcGxhdGU6Ok5ldygpOworICAg
IG1fdXRpbGl0eUNvbnRleHQgPSB2ODo6Q29udGV4dDo6TmV3KDAsIGdsb2JhbFRlbXBsYXRlKTsK
KyAgICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dFNjb3BlKG1fdXRpbGl0eUNvbnRleHQpOwor
CisgICAgLy8gQ29tcGlsZSBKYXZhU2NyaXB0IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSBz
b3VyY2UgbGluZSBvZiB0aGUgdG9wCisgICAgLy8gSmF2YVNjcmlwdCBzdGFjayBmcmFtZS4KKyAg
ICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IGNoYXIqLCBmcmFtZVNvdXJjZUxpbmVTb3VyY2Us
CisgICAgICAgICgiZnVuY3Rpb24gZnJhbWVTb3VyY2VMaW5lKGV4ZWNfc3RhdGUpIHsiCisgICAg
ICAgICIgIHJldHVybiBleGVjX3N0YXRlLmZyYW1lKDApLnNvdXJjZUxpbmUoKTsiCisgICAgICAg
ICJ9IikpOworICAgIHY4OjpTY3JpcHQ6OkNvbXBpbGUodjg6OlN0cmluZzo6TmV3KGZyYW1lU291
cmNlTGluZVNvdXJjZSkpLT5SdW4oKTsKKworICAgIC8vIENvbXBpbGUgSmF2YVNjcmlwdCBmdW5j
dGlvbiBmb3IgcmV0cmlldmluZyB0aGUgc291cmNlIG5hbWUgb2YgdGhlIHRvcAorICAgIC8vIEph
dmFTY3JpcHQgc3RhY2sgZnJhbWUuCisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBjaGFy
KiwgZnJhbWVTb3VyY2VOYW1lU291cmNlLAorICAgICAgICAoImZ1bmN0aW9uIGZyYW1lU291cmNl
TmFtZShleGVjX3N0YXRlKSB7IgorICAgICAgICAiICB2YXIgZnJhbWUgPSBleGVjX3N0YXRlLmZy
YW1lKDApOyIKKyAgICAgICAgIiAgaWYgKGZyYW1lLmZ1bmMoKS5yZXNvbHZlZCgpICYmICIKKyAg
ICAgICAgIiAgICAgIGZyYW1lLmZ1bmMoKS5zY3JpcHQoKSAmJiAiCisgICAgICAgICIgICAgICBm
cmFtZS5mdW5jKCkuc2NyaXB0KCkubmFtZSgpKSB7IgorICAgICAgICAiICAgIHJldHVybiBmcmFt
ZS5mdW5jKCkuc2NyaXB0KCkubmFtZSgpOyIKKyAgICAgICAgIiAgfSIKKyAgICAgICAgIn0iKSk7
CisgICAgdjg6OlNjcmlwdDo6Q29tcGlsZSh2ODo6U3RyaW5nOjpOZXcoZnJhbWVTb3VyY2VOYW1l
U291cmNlKSktPlJ1bigpOworfQorCitpbnQgVjhQcm94eTo6c291cmNlTGluZU51bWJlcigpCit7
CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+
IHY4VXRpbGl0eUNvbnRleHQgPSBWOFByb3h5Ojp1dGlsaXR5Q29udGV4dCgpOworICAgIGlmICh2
OFV0aWxpdHlDb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdjg6OkNv
bnRleHQ6OlNjb3BlIGNvbnRleHRTY29wZSh2OFV0aWxpdHlDb250ZXh0KTsKKyAgICB2ODo6SGFu
ZGxlPHY4OjpGdW5jdGlvbj4gZnJhbWVTb3VyY2VMaW5lOworICAgIGZyYW1lU291cmNlTGluZSA9
IHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+OjpDYXN0KHY4VXRpbGl0eUNvbnRleHQtPkdsb2JhbCgp
LT5HZXQodjg6OlN0cmluZzo6TmV3KCJmcmFtZVNvdXJjZUxpbmUiKSkpOworICAgIGlmIChmcmFt
ZVNvdXJjZUxpbmUuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gcmVzdWx0ID0gdjg6OkRlYnVnOjpDYWxsKGZyYW1lU291cmNlTGluZSk7Cisg
ICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBy
ZXN1bHQtPkludDMyVmFsdWUoKTsKK30KKworU3RyaW5nIFY4UHJveHk6OnNvdXJjZU5hbWUoKQor
eworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0
PiB2OFV0aWxpdHlDb250ZXh0ID0gdXRpbGl0eUNvbnRleHQoKTsKKyAgICBpZiAodjhVdGlsaXR5
Q29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICB2ODo6Q29u
dGV4dDo6U2NvcGUgY29udGV4dFNjb3BlKHY4VXRpbGl0eUNvbnRleHQpOworICAgIHY4OjpIYW5k
bGU8djg6OkZ1bmN0aW9uPiBmcmFtZVNvdXJjZU5hbWU7CisgICAgZnJhbWVTb3VyY2VOYW1lID0g
djg6OkxvY2FsPHY4OjpGdW5jdGlvbj46OkNhc3QodjhVdGlsaXR5Q29udGV4dC0+R2xvYmFsKCkt
PkdldCh2ODo6U3RyaW5nOjpOZXcoImZyYW1lU291cmNlTmFtZSIpKSk7CisgICAgaWYgKGZyYW1l
U291cmNlTmFtZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgIH0K
KyAgICByZXR1cm4gVG9XZWJDb3JlU3RyaW5nKHY4OjpEZWJ1Zzo6Q2FsbChmcmFtZVNvdXJjZU5h
bWUpKTsKK30KKwordm9pZCBWOFByb3h5OjpyZWdpc3RlckV4dGVuc2lvbih2ODo6RXh0ZW5zaW9u
KiBleHRlbnNpb24sIGNvbnN0IFN0cmluZyYgc2NoZW1lUmVzdHJpY3Rpb24pCit7CisgICAgdjg6
OlJlZ2lzdGVyRXh0ZW5zaW9uKGV4dGVuc2lvbik7CisgICAgVjhFeHRlbnNpb25JbmZvIGluZm8g
PSB7c2NoZW1lUmVzdHJpY3Rpb24sIGV4dGVuc2lvbn07CisgICAgbV9leHRlbnNpb25zLnB1c2hf
YmFjayhpbmZvKTsKK30KKworYm9vbCBWOFByb3h5OjpzZXRDb250ZXh0RGVidWdJZChpbnQgZGVi
dWdJZCkgeworICAgIEFTU0VSVChkZWJ1Z0lkID4gMCk7CisgICAgaWYgKG1fY29udGV4dC5Jc0Vt
cHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7
CisgICAgaWYgKCFtX2NvbnRleHQtPkdldERhdGEoKS0+SXNVbmRlZmluZWQoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBjb250ZXh0RGF0YSA9
IHY4OjpPYmplY3Q6Ok5ldygpOworICAgIGNvbnRleHREYXRhLT5TZXQodjg6OlN0cmluZzo6TmV3
KGtDb250ZXh0RGVidWdEYXRhVHlwZSksIHY4OjpTdHJpbmc6Ok5ldygicGFnZSIpKTsKKyAgICBj
b250ZXh0RGF0YS0+U2V0KHY4OjpTdHJpbmc6Ok5ldyhrQ29udGV4dERlYnVnRGF0YVZhbHVlKSwg
djg6OkludGVnZXI6Ok5ldyhkZWJ1Z0lkKSk7CisgICAgbV9jb250ZXh0LT5TZXREYXRhKGNvbnRl
eHREYXRhKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IFY4UHJveHk6OmNvbnRleHREZWJ1
Z0lkKHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQpCit7CisgICAgdjg6OkhhbmRsZVNj
b3BlIHNjb3BlOworICAgIGlmICghY29udGV4dC0+R2V0RGF0YSgpLT5Jc09iamVjdCgpKQorICAg
ICAgICByZXR1cm4gLTE7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGRhdGEgPSBjb250ZXh0
LT5HZXREYXRhKCktPlRvT2JqZWN0KCktPkdldCggdjg6OlN0cmluZzo6TmV3KGtDb250ZXh0RGVi
dWdEYXRhVmFsdWUpKTsKKyAgICByZXR1cm4gZGF0YS0+SXNJbnQzMigpID8gZGF0YS0+SW50MzJW
YWx1ZSgpIDogLTE7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L1Y4UHJveHkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4
L1Y4UHJveHkuaAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4UHJv
eHkuaAkod29ya2luZyBjb3B5KQpAQCAtMzEsMTIgKzMxLDYxNiBAQAogI2lmbmRlZiBWOFByb3h5
X2gKICNkZWZpbmUgVjhQcm94eV9oCiAKLS8vIEZJWE1FOiBUaGlzIGlzIGEgdGVtcG9yYXJ5IGZv
cndhcmRpbmcgaGVhZGVyIHVudGlsIGFsbCBiaW5kaW5ncyBoYXZlIG1pZ3JhdGVkCi0vLyBvdmVy
IGFuZCB2OF9wcm94eSBhY3R1YWxseSBiZWNvbWVzIFY4UHJveHkuCi0jaW5jbHVkZSAidjhfcHJv
eHkuaCIKKyNpbmNsdWRlICJDaHJvbWl1bUJyaWRnZS5oIgorI2luY2x1ZGUgIk5vZGUuaCIKKyNp
bmNsdWRlICJOb2RlRmlsdGVyLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIgLy8gZm9y
IFdlYkNvcmU6OlN0cmluZworI2luY2x1ZGUgIlNjcmlwdFNvdXJjZUNvZGUuaCIgLy8gZm9yIFdl
YkNvcmU6OlNjcmlwdFNvdXJjZUNvZGUKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIiAvLyBm
b3IgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4KKyNpbmNsdWRlICJWOEN1c3RvbUJpbmRpbmcuaCIK
KyNpbmNsdWRlICJWOERPTU1hcC5oIgorI2luY2x1ZGUgIlY4RXZlbnRMaXN0ZW5lckxpc3QuaCIK
KyNpbmNsdWRlICJWOEluZGV4LmgiCisjaW5jbHVkZSAiVjhVdGlsaXRpZXMuaCIKKyNpbmNsdWRl
IDx2OC5oPgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NS
ZWZQdHIuaD4gLy8gc28gZ2VuZXJhdGVkIGJpbmRpbmdzIGRvbid0IGhhdmUgdG8KKyNpbmNsdWRl
IDx3dGYvVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaXN0Pgor
CisjaWZkZWYgRU5BQkxFX0RPTV9TVEFUU19DT1VOVEVSUworI2RlZmluZSBJTkNfU1RBVFMobmFt
ZSkgQ2hyb21pdW1CcmlkZ2U6OmluY3JlbWVudFN0YXRzQ291bnRlcihuYW1lKQorI2Vsc2UKKyNk
ZWZpbmUgSU5DX1NUQVRTKG5hbWUpCisjZW5kaWYKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCisg
ICAgY2xhc3MgQ1NTUnVsZTsKKyAgICBjbGFzcyBDU1NSdWxlTGlzdDsKKyAgICBjbGFzcyBDU1NT
dHlsZURlY2xhcmF0aW9uOworICAgIGNsYXNzIENTU1ZhbHVlOworICAgIGNsYXNzIENTU1ZhbHVl
TGlzdDsKKyAgICBjbGFzcyBDbGllbnRSZWN0TGlzdDsKKyAgICBjbGFzcyBET01JbXBsZW1lbnRh
dGlvbjsKKyAgICBjbGFzcyBET01XaW5kb3c7CisgICAgY2xhc3MgRG9jdW1lbnQ7CisgICAgY2xh
c3MgRWxlbWVudDsKKyAgICBjbGFzcyBFdmVudDsKKyAgICBjbGFzcyBFdmVudExpc3RlbmVyOwor
ICAgIGNsYXNzIEV2ZW50VGFyZ2V0OworICAgIGNsYXNzIEZyYW1lOworICAgIGNsYXNzIEhUTUxD
b2xsZWN0aW9uOworICAgIGNsYXNzIEhUTUxEb2N1bWVudDsKKyAgICBjbGFzcyBIVE1MRWxlbWVu
dDsKKyAgICBjbGFzcyBIVE1MT3B0aW9uc0NvbGxlY3Rpb247CisgICAgY2xhc3MgTWVkaWFMaXN0
OworICAgIGNsYXNzIE1pbWVUeXBlOworICAgIGNsYXNzIE1pbWVUeXBlQXJyYXk7CisgICAgY2xh
c3MgTmFtZWROb2RlTWFwOworICAgIGNsYXNzIE5hdmlnYXRvcjsKKyAgICBjbGFzcyBOb2RlOwor
ICAgIGNsYXNzIE5vZGVGaWx0ZXI7CisgICAgY2xhc3MgTm9kZUxpc3Q7CisgICAgY2xhc3MgUGx1
Z2luOworICAgIGNsYXNzIFBsdWdpbkFycmF5OworICAgIGNsYXNzIFNWR0VsZW1lbnQ7CisjaWYg
RU5BQkxFKFNWRykKKyAgICBjbGFzcyBTVkdFbGVtZW50SW5zdGFuY2U7CisjZW5kaWYKKyAgICBj
bGFzcyBTY3JlZW47CisgICAgY2xhc3MgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDsKKyNpZiBFTkFC
TEUoRE9NX1NUT1JBR0UpDQorICAgIGNsYXNzIFN0b3JhZ2U7DQorICAgIGNsYXNzIFN0b3JhZ2VF
dmVudDsNCisjZW5kaWYKKyAgICBjbGFzcyBTdHJpbmc7CisgICAgY2xhc3MgU3R5bGVTaGVldDsK
KyAgICBjbGFzcyBTdHlsZVNoZWV0TGlzdDsKKyAgICBjbGFzcyBWOEV2ZW50TGlzdGVuZXI7Cisg
ICAgY2xhc3MgVjhPYmplY3RFdmVudExpc3RlbmVyOworCisgICAgLy8gRklYTUU6IHVzZSBzdGFu
ZGFyZCBsb2dnaW5nIGZhY2lsaXRpZXMgaW4gV2ViQ29yZS4NCisgICAgdm9pZCBsb2dJbmZvKEZy
YW1lKiwgY29uc3QgU3RyaW5nJiBtZXNzYWdlLCBjb25zdCBTdHJpbmcmIHVybCk7CisKKyNpZm5k
ZWYgTkRFQlVHCisKKyNkZWZpbmUgR2xvYmFsSGFuZGxlVHlwZUxpc3QoVikgICBcCisgICAgVihQ
Uk9YWSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFYoTlBPQkpFQ1QpICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBWKFNDSEVEVUxFRF9BQ1RJT04pICAgICAgICAgICBcCisgICAgVihFVkVO
VF9MSVNURU5FUikgICAgICAgICAgICAgXAorICAgIFYoTk9ERV9GSUxURVIpICAgICAgICAgICAg
ICAgIFwKKyAgICBWKFNDUklQVElOU1RBTkNFKSAgICAgICAgICAgICBcCisgICAgVihTQ1JJUFRW
QUxVRSkKKworCisgICAgLy8gSG9zdCBpbmZvcm1hdGlvbiBvZiBwZXJzaXN0ZW50IGhhbmRsZXMu
CisgICAgZW51bSBHbG9iYWxIYW5kbGVUeXBlIHsKKyNkZWZpbmUgRU5VTShuYW1lKSBuYW1lLAor
ICAgICAgICBHbG9iYWxIYW5kbGVUeXBlTGlzdChFTlVNKQorI3VuZGVmIEVOVU0KKyAgICB9Owor
CisKKyAgICBjbGFzcyBHbG9iYWxIYW5kbGVJbmZvIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEds
b2JhbEhhbmRsZUluZm8odm9pZCogaG9zdCwgR2xvYmFsSGFuZGxlVHlwZSB0eXBlKSA6IG1faG9z
dChob3N0KSwgbV90eXBlKHR5cGUpIHsgfQorICAgICAgICB2b2lkKiBtX2hvc3Q7CisgICAgICAg
IEdsb2JhbEhhbmRsZVR5cGUgbV90eXBlOworICAgIH07CisKKyNlbmRpZiAvLyBOREVCVUcKKwor
ICAgIC8vIFRoZSBmb2xsb3dpbmcgQmF0Y2ggc3RydWN0cyBhbmQgbWV0aG9kcyBhcmUgdXNlZCBm
b3Igc2V0dGluZyBtdWx0aXBsZQorICAgIC8vIHByb3BlcnRpZXMgb24gYW4gT2JqZWN0VGVtcGxh
dGUsIHVzZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIGJpbmRpbmdzCisgICAgLy8gaW5pdGlhbGl6YXRp
b24gKENvbmZpZ3VyZVhYWFRlbXBsYXRlKS4gVGhpcyBncmVhdGx5IHJlZHVjZXMgdGhlIGJpbmFy
eQorICAgIC8vIHNpemUgYnkgbW92aW5nIGZyb20gY29kZSBkcml2ZW4gc2V0dXAgdG8gZGF0YSB0
YWJsZSBkcml2ZW4gc2V0dXAuCisKKyAgICAvLyBCYXRjaGVkQXR0cmlidXRlIHRyYW5zbGF0ZXMg
aW50byBjYWxscyB0byBTZXRBY2Nlc3NvcigpIG9uIGVpdGhlciB0aGUKKyAgICAvLyBpbnN0YW5j
ZSBvciB0aGUgcHJvdG90eXBlIE9iamVjdFRlbXBsYXRlLCBiYXNlZCBvbiB8b25Qcm90b3wuCisg
ICAgc3RydWN0IEJhdGNoZWRBdHRyaWJ1dGUgeworICAgICAgICBjb25zdCBjaGFyKiBjb25zdCBu
YW1lOworICAgICAgICB2ODo6QWNjZXNzb3JHZXR0ZXIgZ2V0dGVyOworICAgICAgICB2ODo6QWNj
ZXNzb3JTZXR0ZXIgc2V0dGVyOworICAgICAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUg
ZGF0YTsKKyAgICAgICAgdjg6OkFjY2Vzc0NvbnRyb2wgc2V0dGluZ3M7CisgICAgICAgIHY4OjpQ
cm9wZXJ0eUF0dHJpYnV0ZSBhdHRyaWJ1dGU7CisgICAgICAgIGJvb2wgb25Qcm90bzsKKyAgICB9
OworCisgICAgdm9pZCBiYXRjaENvbmZpZ3VyZUF0dHJpYnV0ZXModjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0VGVtcGxhdGU+LCB2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4sIGNvbnN0IEJhdGNo
ZWRBdHRyaWJ1dGUqLCBzaXplX3QgYXR0cmlidXRlQ291bnQpOworCisgICAgLy8gQmF0Y2hlZENv
bnN0YW50IHRyYW5zbGF0ZXMgaW50byBjYWxscyB0byBTZXQoKSBmb3Igc2V0dGluZyB1cCBhbiBv
YmplY3QncworICAgIC8vIGNvbnN0YW50cy4gSXQgc2V0cyB0aGUgY29uc3RhbnQgb24gYm90aCB0
aGUgRnVuY3Rpb25UZW1wbGF0ZSBhbmQgdGhlCisgICAgLy8gT2JqZWN0VGVtcGxhdGUuIFByb3Bl
cnR5QXR0cmlidXRlcyBpcyBhbHdheXMgUmVhZE9ubHkuCisgICAgc3RydWN0IEJhdGNoZWRDb25z
dGFudCB7CisgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWU7CisgICAgICAgIGludCB2YWx1
ZTsKKyAgICB9OworCisgICAgdm9pZCBiYXRjaENvbmZpZ3VyZUNvbnN0YW50cyh2ODo6SGFuZGxl
PHY4OjpGdW5jdGlvblRlbXBsYXRlPiwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+LCBj
b25zdCBCYXRjaGVkQ29uc3RhbnQqLCBzaXplX3QgY29uc3RhbnRDb3VudCk7CisKKyAgICBjb25z
dCBpbnQga01heFJlY3Vyc2lvbkRlcHRoID0gMjA7CisKKyAgICAvLyBJbmZvcm1hdGlvbiBhYm91
dCBhbiBleHRlbnNpb24gdGhhdCBpcyByZWdpc3RlcmVkIGZvciB1c2Ugd2l0aCBWOC4gSWYgc2No
ZW1lCisgICAgLy8gaXMgbm9uLWVtcHR5LCBpdCBjb250YWlucyB0aGUgVVJMIHNjaGVtZSB0aGUg
ZXh0ZW5zaW9uIHNob3VsZCBiZSB1c2VkIHdpdGguCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgZXh0
ZW5zaW9uIGlzIHVzZWQgd2l0aCBhbGwgc2NoZW1lcy4KKyAgICBzdHJ1Y3QgVjhFeHRlbnNpb25J
bmZvIHsKKyAgICAgICAgU3RyaW5nIHNjaGVtZTsKKyAgICAgICAgdjg6OkV4dGVuc2lvbiogZXh0
ZW5zaW9uOworICAgIH07CisgICAgdHlwZWRlZiBzdGQ6Omxpc3Q8VjhFeHRlbnNpb25JbmZvPiBW
OEV4dGVuc2lvbkxpc3Q7CisKKyAgICBjbGFzcyBWOFByb3h5IHsKKyAgICBwdWJsaWM6CisgICAg
ICAgIC8vIFRoZSB0eXBlcyBvZiBqYXZhc2NyaXB0IGVycm9ycyB0aGF0IGNhbiBiZSB0aHJvd24u
CisgICAgICAgIGVudW0gRXJyb3JUeXBlIHsKKyAgICAgICAgICAgIFJhbmdlRXJyb3IsCisgICAg
ICAgICAgICBSZWZlcmVuY2VFcnJvciwKKyAgICAgICAgICAgIFN5bnRheEVycm9yLAorICAgICAg
ICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICAgR2VuZXJhbEVycm9yCisgICAgICAgIH07CisK
KyAgICAgICAgZXhwbGljaXQgVjhQcm94eShGcmFtZSogZnJhbWUpIDogbV9mcmFtZShmcmFtZSks
IG1faW5saW5lQ29kZShmYWxzZSksIG1fdGltZXJDYWxsYmFjayhmYWxzZSksIG1fcmVjdXJzaW9u
KDApIHsgfQorCisgICAgICAgIH5WOFByb3h5KCk7CisKKyAgICAgICAgRnJhbWUqIGZyYW1lKCkg
eyByZXR1cm4gbV9mcmFtZTsgfQorCisgICAgICAgIC8vIENsZWFyIHBhZ2Utc3BlY2lmaWMgZGF0
YSwgYnV0IGtlZXAgdGhlIGdsb2JhbCBvYmplY3QgaWRlbnRpZnkuCisgICAgICAgIHZvaWQgY2xl
YXJGb3JOYXZpZ2F0aW9uKCk7CisKKyAgICAgICAgLy8gQ2xlYXIgcGFnZS1zcGVjaWZpYyBkYXRh
IGJlZm9yZSBzaHV0dGluZyBkb3duIHRoZSBwcm94eSBvYmplY3QuCisgICAgICAgIHZvaWQgY2xl
YXJGb3JDbG9zZSgpOworCisgICAgICAgIC8vIFVwZGF0ZSBkb2N1bWVudCBvYmplY3Qgb2YgdGhl
IGZyYW1lLgorICAgICAgICB2b2lkIHVwZGF0ZURvY3VtZW50KCk7CisKKyAgICAgICAgLy8gVXBk
YXRlIHRoZSBzZWN1cml0eSBvcmlnaW4gb2YgYSBkb2N1bWVudAorICAgICAgICAvLyAoZS5nLiwg
YWZ0ZXIgc2V0dGluZyBkb2NvdW1lbnQuZG9tYWluKS4KKyAgICAgICAgdm9pZCB1cGRhdGVTZWN1
cml0eU9yaWdpbigpOworCisgICAgICAgIC8vIERlc3Ryb3kgdGhlIGdsb2JhbCBvYmplY3QuCisg
ICAgICAgIHZvaWQgZGVzdHJveUdsb2JhbCgpOworCisgICAgICAgIC8vIEZJWE1FOiBOZWVkIGNv
bW1lbnQuIFVzZXIgR2VzdHVyZSByZWxhdGVkLgorICAgICAgICBib29sIGlubGluZUNvZGUoKSBj
b25zdCB7IHJldHVybiBtX2lubGluZUNvZGU7IH0KKyAgICAgICAgdm9pZCBzZXRJbmxpbmVDb2Rl
KGJvb2wgdmFsdWUpIHsgbV9pbmxpbmVDb2RlID0gdmFsdWU7IH0KKworICAgICAgICBib29sIHRp
bWVyQ2FsbGJhY2soKSBjb25zdCB7IHJldHVybiBtX3RpbWVyQ2FsbGJhY2s7IH0KKyAgICAgICAg
dm9pZCBzZXRUaW1lckNhbGxiYWNrKGJvb2wgdmFsdWUpIHsgbV90aW1lckNhbGxiYWNrID0gdmFs
dWU7IH0KKworICAgICAgICAvLyBIYXMgdGhlIGNvbnRleHQgZm9yIHRoaXMgcHJveHkgYmVlbiBp
bml0aWFsaXplZD8KKyAgICAgICAgYm9vbCBpc0NvbnRleHRJbml0aWFsaXplZCgpOworCisgICAg
ICAgIC8vIERpc2Nvbm5lY3RzIHRoZSBwcm94eSBmcm9tIGl0cyBvd25lciBmcmFtZSwKKyAgICAg
ICAgLy8gYW5kIGNsZWFycyBhbGwgdGltZW91dHMgb24gdGhlIERPTSB3aW5kb3cuCisgICAgICAg
IHZvaWQgZGlzY29ubmVjdEZyYW1lKCk7CisKKyAgICAgICAgYm9vbCBpc0VuYWJsZWQoKTsKKwor
ICAgICAgICAvLyBGaW5kL0NyZWF0ZS9SZW1vdmUgZXZlbnQgbGlzdGVuZXIgd3JhcHBlcnMuCisg
ICAgICAgIFBhc3NSZWZQdHI8VjhFdmVudExpc3RlbmVyPiBmaW5kVjhFdmVudExpc3RlbmVyKHY4
OjpMb2NhbDx2ODo6VmFsdWU+IGxpc3RlbmVyLCBib29sIGlzSHRtbCk7CisgICAgICAgIFBhc3NS
ZWZQdHI8VjhFdmVudExpc3RlbmVyPiBmaW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIodjg6Okxv
Y2FsPHY4OjpWYWx1ZT4gbGlzdGVuZXIsIGJvb2wgaXNIdG1sKTsKKworICAgICAgICBQYXNzUmVm
UHRyPFY4RXZlbnRMaXN0ZW5lcj4gZmluZE9iamVjdEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4
OjpWYWx1ZT4gbGlzdGVuZXIsIGJvb2wgaXNIdG1sKTsKKyAgICAgICAgUGFzc1JlZlB0cjxWOEV2
ZW50TGlzdGVuZXI+IGZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4
OjpWYWx1ZT4gbGlzdGVuZXIsIGJvb2wgaXNIdG1sKTsKKworICAgICAgICB2b2lkIHJlbW92ZVY4
RXZlbnRMaXN0ZW5lcihWOEV2ZW50TGlzdGVuZXIqKTsKKyAgICAgICAgdm9pZCByZW1vdmVPYmpl
Y3RFdmVudExpc3RlbmVyKFY4T2JqZWN0RXZlbnRMaXN0ZW5lciopOworCisgICAgICAgIC8vIFBy
b3RlY3QvVW5wcm90ZWN0IEpTIHdyYXBwZXJzIG9mIGEgRE9NIG9iamVjdC4KKyAgICAgICAgc3Rh
dGljIHZvaWQgZ2NQcm90ZWN0KHZvaWQqIGRvbU9iamVjdCk7CisgICAgICAgIHN0YXRpYyB2b2lk
IGdjVW5wcm90ZWN0KHZvaWQqIGRvbU9iamVjdCk7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAg
ICBzdGF0aWMgdm9pZCBzZXRTVkdDb250ZXh0KHZvaWQqLCBTVkdFbGVtZW50Kik7CisgICAgICAg
IHN0YXRpYyBTVkdFbGVtZW50KiBzdmdDb250ZXh0KHZvaWQqKTsKKyNlbmRpZgorCisgICAgICAg
IHZvaWQgc2V0RXZlbnRIYW5kbGVyTGluZU51bWJlcihpbnQgbGluZU51bWJlcikgeyBtX2hhbmRs
ZXJMaW5lTnVtYmVyID0gbGluZU51bWJlcjsgfQorICAgICAgICB2b2lkIGZpbmlzaGVkV2l0aEV2
ZW50KEV2ZW50KikgeyB9CisKKyAgICAgICAgLy8gRXZhbHVhdGUgSmF2YVNjcmlwdCBpbiBhIG5l
dyBpc29sYXRlZCB3b3JsZC4gVGhlIHNjcmlwdCBnZXRzIGl0cyBvd24NCisgICAgICAgIC8vIGds
b2JhbCBzY29wZSwgaXRzIG93biBwcm90b3R5cGVzIGZvciBpbnRyaW5zaWMgSmF2YVNjcmlwdCBv
YmplY3RzIChTdHJpbmcsDQorICAgICAgICAvLyBBcnJheSwgYW5kIHNvLW9uKSwgYW5kIGl0cyBv
d24gd3JhcHBlcnMgZm9yIGFsbCBET00gbm9kZXMgYW5kIERPTQ0KKyAgICAgICAgLy8gY29uc3Ry
dWN0b3JzLg0KKyAgICAgICAgdm9pZCBldmFsdWF0ZUluTmV3V29ybGQoY29uc3QgVmVjdG9yPFNj
cmlwdFNvdXJjZUNvZGU+JiBzb3VyY2VzKTsKKworICAgICAgICAvLyBFdmFsdWF0ZSBKYXZhU2Ny
aXB0IGluIGEgbmV3IGNvbnRleHQuIFRoZSBzY3JpcHQgZ2V0cyBpdHMgb3duIGdsb2JhbCBzY29w
ZQorICAgICAgICAvLyBhbmQgaXRzIG93biBwcm90b3R5cGVzIGZvciBpbnRyaW5zaWMgSmF2YVNj
cmlwdCBvYmplY3RzIChTdHJpbmcsIEFycmF5LAorICAgICAgICAvLyBhbmQgc28tb24pLiBJdCBz
aGFyZXMgdGhlIHdyYXBwZXJzIGZvciBhbGwgRE9NIG5vZGVzIGFuZCBET00gY29uc3RydWN0b3Jz
LgorICAgICAgICB2b2lkIGV2YWx1YXRlSW5OZXdDb250ZXh0KGNvbnN0IFZlY3RvcjxTY3JpcHRT
b3VyY2VDb2RlPiYpOworCisgICAgICAgIC8vIEV2YWx1YXRlIGEgc2NyaXB0IGZpbGUgaW4gdGhl
IGN1cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50LgorICAgICAgICAvLyBUaGUgY2FsbGVyIG11
c3QgaG9sZCBhbiBleGVjdXRpb24gY29udGV4dC4KKyAgICAgICAgLy8gSWYgY2Fubm90IGV2YWx1
dGUgdGhlIHNjcmlwdCwgaXQgcmV0dXJucyBhbiBlcnJvci4KKyAgICAgICAgdjg6OkxvY2FsPHY4
OjpWYWx1ZT4gZXZhbHVhdGUoY29uc3QgU2NyaXB0U291cmNlQ29kZSYsIE5vZGUqKTsKKworICAg
ICAgICAvLyBSdW4gYW4gYWxyZWFkeSBjb21waWxlZCBzY3JpcHQuCisgICAgICAgIHY4OjpMb2Nh
bDx2ODo6VmFsdWU+IHJ1blNjcmlwdCh2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+LCBib29sIGlzSW5s
aW5lQ29kZSk7CisKKyAgICAgICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4g
cmVjZWl2ZXIgYW5kIGFyZ3VtZW50cy4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gY2Fs
bEZ1bmN0aW9uKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0
PiwgaW50IGFyZ2MsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmd2W10pOworCisgICAgICAgIC8v
IENhbGwgdGhlIGZ1bmN0aW9uIGFzIGNvbnN0cnVjdG9yIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50
cy4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gbmV3SW5zdGFuY2Uodjg6OkhhbmRsZTx2
ODo6RnVuY3Rpb24+LCBpbnQgYXJnYywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZ3ZbXSk7CisK
KyAgICAgICAgLy8gUmV0dXJucyB0aGUgZG9tIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciB0aGUg
Z2l2ZW4gbm9kZSB0eXBlLgorICAgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBnZXRDb25z
dHJ1Y3RvcihWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUpOworCisgICAgICAgIC8vIFRvIGNy
ZWF0ZSBKUyBXcmFwcGVyIG9iamVjdHMsIHdlIGNyZWF0ZSBhIGNhY2hlIG9mIGEgJ2JvaWxlciBw
bGF0ZScKKyAgICAgICAgLy8gb2JqZWN0LCBhbmQgdGhlbiBzaW1wbHkgQ2xvbmUgdGhhdCBvYmpl
Y3QgZWFjaCB0aW1lIHdlIG5lZWQgYSBuZXcgb25lLgorICAgICAgICAvLyBUaGlzIGlzIGZhc3Rl
ciB0aGFuIGdvaW5nIHRocm91Z2ggdGhlIGZ1bGwgb2JqZWN0IGNyZWF0aW9uIHByb2Nlc3MuCisg
ICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBjcmVhdGVXcmFwcGVyRnJvbUNhY2hlKFY4Q2xh
c3NJbmRleDo6VjhXcmFwcGVyVHlwZSk7CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgd2luZG93
IG9iamVjdCBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBjb250ZXh0LgorICAgICAgICBzdGF0
aWMgRE9NV2luZG93KiByZXRyaWV2ZVdpbmRvdygpOworICAgICAgICAvLyBSZXR1cm5zIHRoZSB3
aW5kb3cgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRleHQuCisgICAgICAgIHN0YXRpYyBE
T01XaW5kb3cqIHJldHJpZXZlV2luZG93KHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+KTsKKyAgICAg
ICAgLy8gUmV0dXJucyBWOFByb3h5IG9iamVjdCBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBj
b250ZXh0LgorICAgICAgICBzdGF0aWMgVjhQcm94eSogcmV0cmlldmUoKTsKKyAgICAgICAgLy8g
UmV0dXJucyBWOFByb3h5IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSBmcmFtZS4KKyAgICAgICAg
c3RhdGljIFY4UHJveHkqIHJldHJpZXZlKEZyYW1lKik7CisgICAgICAgIC8vIFJldHVybnMgVjhQ
cm94eSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgc2NyaXB0IGV4ZWN1dGlvbiBjb250ZXh0Lgor
ICAgICAgICBzdGF0aWMgVjhQcm94eSogcmV0cmlldmUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCop
OworCisgICAgICAgIC8vIFJldHVybnMgdGhlIGZyYW1lIG9iamVjdCBvZiB0aGUgd2luZG93IG9i
amVjdCBhc3NvY2lhdGVkCisgICAgICAgIC8vIHdpdGggdGhlIGN1cnJlbnRseSBleGVjdXRpbmcg
Y29udGV4dC4KKyAgICAgICAgc3RhdGljIEZyYW1lKiByZXRyaWV2ZUZyYW1lKCk7CisgICAgICAg
IC8vIFJldHVybnMgdGhlIGZyYW1lIG9iamVjdCBvZiB0aGUgd2luZG93IG9iamVjdCBhc3NvY2lh
dGVkIHdpdGgKKyAgICAgICAgLy8gYSBjb250ZXh0LgorICAgICAgICBzdGF0aWMgRnJhbWUqIHJl
dHJpZXZlRnJhbWUodjg6OkhhbmRsZTx2ODo6Q29udGV4dD4pOworCisKKyAgICAgICAgLy8gVGhl
IHRocmVlIGZ1bmN0aW9ucyBiZWxvdyByZXRyaWV2ZSBXZWJGcmFtZSBpbnN0YW5jZXMgcmVsYXRp
bmcgdGhlCisgICAgICAgIC8vIGN1cnJlbnRseSBleGVjdXRpbmcgSmF2YVNjcmlwdC4gU2luY2Ug
SmF2YVNjcmlwdCBjYW4gbWFrZSBmdW5jdGlvbiBjYWxscworICAgICAgICAvLyBhY3Jvc3MgZnJh
bWVzLCB0aG91Z2gsIHdlIG5lZWQgdG8gYmUgbW9yZSBwcmVjaXNlLgorICAgICAgICAvLworICAg
ICAgICAvLyBGb3IgZXhhbXBsZSwgaW1hZ2luZSB0aGF0IGEgSlMgZnVuY3Rpb24gaW4gZnJhbWUg
QSBjYWxscyBhIGZ1bmN0aW9uIGluCisgICAgICAgIC8vIGZyYW1lIEIsIHdoaWNoIGNhbGxzIG5h
dGl2ZSBjb2RlLCB3aGljaCB3YW50cyB0byBrbm93IHdoYXQgdGhlICdhY3RpdmUnCisgICAgICAg
IC8vIGZyYW1lIGlzLgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgJ2VudGVyZWQgY29udGV4
dCcgaXMgdGhlIGNvbnRleHQgd2hlcmUgZXhlY3V0aW9uIGZpcnN0IGVudGVyZWQgdGhlCisgICAg
ICAgIC8vIHNjcmlwdCBlbmdpbmU7IHRoZSBjb250ZXh0IHRoYXQgaXMgYXQgdGhlIGJvdHRvbSBv
ZiB0aGUgSlMgZnVuY3Rpb24gc3RhY2suCisgICAgICAgIC8vIFJldHJpZXZlRnJhbWVGb3JFbnRl
cmVkQ29udGV4dCgpIHdvdWxkIHJldHVybiBGcmFtZSBBIGluIG91ciBleGFtcGxlLgorICAgICAg
ICAvLyBUaGlzIGZyYW1lIGlzIG9mdGVuIHJlZmVycmVkIHRvIGFzIHRoZSAiZHluYW1pYyBnbG9i
YWwgb2JqZWN0LiIKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlICdjdXJyZW50IGNvbnRleHQn
IGlzIHRoZSBjb250ZXh0IHRoZSBKUyBlbmdpbmUgaXMgY3VycmVudGx5IGluc2lkZSBvZjsKKyAg
ICAgICAgLy8gdGhlIGNvbnRleHQgdGhhdCBpcyBhdCB0aGUgdG9wIG9mIHRoZSBKUyBmdW5jdGlv
biBzdGFjay4KKyAgICAgICAgLy8gUmV0cmlldmVGcmFtZUZvckN1cnJlbnRDb250ZXh0KCkgd291
bGQgcmV0dXJuIEZyYW1lIEIgaW4gb3VyIGV4YW1wbGUuCisgICAgICAgIC8vIFRoaXMgZnJhbWUg
aXMgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgdGhlICJsZXhpY2FsIGdsb2JhbCBvYmplY3QuIgorICAg
ICAgICAvLworICAgICAgICAvLyBGaW5hbGx5LCB0aGUgJ2NhbGxpbmcgY29udGV4dCcgaXMgdGhl
IGNvbnRleHQgb25lIGJlbG93IHRoZSBjdXJyZW50CisgICAgICAgIC8vIGNvbnRleHQgb24gdGhl
IEpTIGZ1bmN0aW9uIHN0YWNrLiBGb3IgZXhhbXBsZSwgaWYgZnVuY3Rpb24gZiBjYWxscworICAg
ICAgICAvLyBmdW5jdGlvbiBnLCB0aGVuIHRoZSBjYWxsaW5nIGNvbnRleHQgd2lsbCBiZSB0aGUg
Y29udGV4dCBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgLy8gZi4gVGhpcyBjb250ZXh0IGlzIGNv
bW1vbmx5IHVzZWQgYnkgRE9NIHNlY3VyaXR5IGNoZWNrcyBiZWNhdXNlIHRoZXkgd2FudAorICAg
ICAgICAvLyB0byBrbm93IHdobyBjYWxsZWQgdGhlbS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8g
SWYgeW91IGFyZSB1bnN1cmUgd2hpY2ggb2YgdGhlc2UgZnVuY3Rpb25zIHRvIHVzZSwgYXNrIGFi
YXJ0aC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTk9URTogVGhlc2UgY2Fubm90IGJlIGRlY2xh
cmVkIGFzIGlubGluZSBmdW5jdGlvbiwgYmVjYXVzZSBWUyBjb21wbGFpbnMgYXQKKyAgICAgICAg
Ly8gbGlua2luZyB0aW1lLgorICAgICAgICBzdGF0aWMgRnJhbWUqIHJldHJpZXZlRnJhbWVGb3JF
bnRlcmVkQ29udGV4dCgpOworICAgICAgICBzdGF0aWMgRnJhbWUqIHJldHJpZXZlRnJhbWVGb3JD
dXJyZW50Q29udGV4dCgpOworICAgICAgICBzdGF0aWMgRnJhbWUqIHJldHJpZXZlRnJhbWVGb3JD
YWxsaW5nQ29udGV4dCgpOworCisgICAgICAgIC8vIFJldHVybnMgVjggQ29udGV4dCBvZiBhIGZy
YW1lLiBJZiBub25lIGV4aXN0cywgY3JlYXRlcworICAgICAgICAvLyBhIG5ldyBjb250ZXh0LiBJ
dCBpcyBwb3RlbnRpYWxseSBzbG93IGFuZCBjb25zdW1lcyBtZW1vcnkuCisgICAgICAgIHN0YXRp
YyB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQoRnJhbWUqKTsKKyAgICAgICAgc3RhdGlj
IHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY3VycmVudENvbnRleHQoKTsKKworICAgICAgICAvLyBJ
ZiB0aGUgY3VycmVudCBjb250ZXh0IGNhdXNlcyBvdXQgb2YgbWVtb3J5LCBKYXZhU2NyaXB0IHNl
dHRpbmcKKyAgICAgICAgLy8gaXMgZGlzYWJsZWQgYW5kIGl0IHJldHVybnMgdHJ1ZS4KKyAgICAg
ICAgc3RhdGljIGJvb2wgaGFuZGxlT3V0T2ZNZW1vcnkoKTsKKworICAgICAgICAvLyBDaGVjayBp
ZiB0aGUgYWN0aXZlIGV4ZWN1dGlvbiBjb250ZXh0IGNhbiBhY2Nlc3MgdGhlIHRhcmdldCBmcmFt
ZS4KKyAgICAgICAgc3RhdGljIGJvb2wgY2FuQWNjZXNzRnJhbWUoRnJhbWUqLCBib29sIHJlcG9y
dEVycm9yKTsKKworICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBzYWZlIHRvIGFjY2VzcyB0aGUg
Z2l2ZW4gbm9kZSBmcm9tIHRoZQorICAgICAgICAvLyBjdXJyZW50IHNlY3VyaXR5IGNvbnRleHQu
CisgICAgICAgIHN0YXRpYyBib29sIGNoZWNrTm9kZVNlY3VyaXR5KE5vZGUqKTsKKworICAgICAg
ICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNoZWNrTmV3TGVnYWwoY29uc3Qgdjg6OkFy
Z3VtZW50cyYpOworCisgICAgICAgIC8vIENyZWF0ZSBhIFY4IHdyYXBwZXIgZm9yIGEgQyBwb2lu
dGVyCisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcENQb2ludGVyKHZv
aWQqIGNwdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFJlcHJlc2VudCB2b2lkKiBhcyBp
bnQKKyAgICAgICAgICAgIGludCBhZGRyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQ+KGNwdHIpOwor
ICAgICAgICAgICAgQVNTRVJUKCEoYWRkciAmIDB4MDEpKTsgLy8gVGhlIGFkZHJlc3MgbXVzdCBi
ZSBhbGlnbmVkLgorICAgICAgICAgICAgcmV0dXJuIHY4OjpJbnRlZ2VyOjpOZXcoYWRkciA+PiAx
KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRha2UgQyBwb2ludGVyIG91dCBvZiBhIHY4IHdy
YXBwZXIuCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBDPgorICAgICAgICBzdGF0aWMgQyogZXh0
cmFjdENQb2ludGVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBvYmopCisgICAgICAgIHsKKyAgICAg
ICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxDKj4oZXh0cmFjdENQb2ludGVySW1wbChvYmopKTsK
KyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IGNvbXBp
bGVTY3JpcHQodjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBjb2RlLCBjb25zdCBTdHJpbmcmIGZpbGVO
YW1lLCBpbnQgYmFzZUxpbmUpOworCisjaWZuZGVmIE5ERUJVRworICAgICAgICAvLyBDaGVja3Mg
aWYgYSB2OCB2YWx1ZSBjYW4gYmUgYSBET00gd3JhcHBlcgorICAgICAgICBzdGF0aWMgYm9vbCBt
YXliZURPTVdyYXBwZXIodjg6OkhhbmRsZTx2ODo6VmFsdWU+KTsKKyNlbmRpZgorCisgICAgICAg
IC8vIFNldHMgY29udGVudHMgb2YgYSBET00gd3JhcHBlci4KKyAgICAgICAgc3RhdGljIHZvaWQg
c2V0RE9NV3JhcHBlcih2ODo6SGFuZGxlPHY4OjpPYmplY3Q+LCBpbnQgdHlwZSwgdm9pZCogcHRy
KTsKKworICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBsb29rdXBET01XcmFw
cGVyKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KTsK
KworICAgICAgICAvLyBBIGhlbHBlciBmdW5jdGlvbiBleHRyYWN0IG5hdGl2ZSBvYmplY3QgcG9p
bnRlciBmcm9tIGEgRE9NIHdyYXBwZXIKKyAgICAgICAgLy8gYW5kIGNhc3QgdG8gdGhlIHNwZWNp
ZmllZCB0eXBlLgorICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KKyAgICAgICAgc3RhdGljIEMq
IGNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmUodjg6OkhhbmRsZTx2ODo6VmFsdWU+IG9iamVjdCkK
KyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKG1heWJlRE9NV3JhcHBlcihvYmplY3QpKTsK
KyAgICAgICAgICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBwdHIgPSB2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+OjpDYXN0KG9iamVjdCktPkdldEludGVybmFsRmllbGQoVjhDdXN0b206OmtET01XcmFw
cGVyT2JqZWN0SW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RDUG9pbnRlcjxDPihw
dHIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQSBoZWxwIGZ1bmN0aW9uIGV4dHJhY3QgYSBu
b2RlIHR5cGUgcG9pbnRlciBmcm9tIGEgRE9NIHdyYXBwZXIuCisgICAgICAgIC8vIFdyYXBwZWQg
cG9pbnRlciBtdXN0IGJlIGNhc3QgdG8gTm9kZSogZmlyc3QuCisgICAgICAgIHN0YXRpYyB2b2lk
KiBjb252ZXJ0RE9NV3JhcHBlclRvTm9kZUhlbHBlcih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4pOwor
CisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBDPgorICAgICAgICBzdGF0aWMgQyogY29udmVydERP
TVdyYXBwZXJUb05vZGUodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQorICAgICAgICB7Cisg
ICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Qyo+KGNvbnZlcnRET01XcmFwcGVyVG9Ob2Rl
SGVscGVyKHZhbHVlKSk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU
PgorICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnRUb1Y4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCBQYXNzUmVmUHRyPFQ+IGltcCkKKyAg
ICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1Y4T2JqZWN0KHR5cGUsIGltcC5n
ZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+
IGNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSwgdm9pZCopOwor
CisgICAgICAgIC8vIEZhc3QtcGF0aCBmb3IgTm9kZSBvYmplY3RzLgorICAgICAgICBzdGF0aWMg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnROb2RlVG9WOE9iamVjdChOb2RlKik7CisKKyAg
ICAgICAgdGVtcGxhdGUgPGNsYXNzIEM+CisgICAgICAgIHN0YXRpYyBDKiBjb252ZXJ0VG9OYXRp
dmVPYmplY3QoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHY4OjpIYW5kbGU8djg6
OlZhbHVlPiBvYmplY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxDKj4oY29udmVydFRvTmF0aXZlT2JqZWN0SW1wbCh0eXBlLCBvYmplY3QpKTsKKyAgICAgICAg
fQorCisgICAgICAgIHN0YXRpYyBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgZG9tV3JhcHBl
clR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pik7CisKKyAgICAgICAgLy8gSWYgdGhlIGV4Y2Vw
dGlvbiBjb2RlIGlzIGRpZmZlcmVudCBmcm9tIHplcm8sIGEgRE9NIGV4Y2VwdGlvbiBpcworICAg
ICAgICAvLyBzY2hlZHVsZSB0byBiZSB0aHJvd24uCisgICAgICAgIHN0YXRpYyB2b2lkIHNldERP
TUV4Y2VwdGlvbihpbnQgZXhjZXB0aW9uQ29kZSk7CisKKyAgICAgICAgLy8gU2NoZWR1bGUgYW4g
ZXJyb3Igb2JqZWN0IHRvIGJlIHRocm93bi4KKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6
OlZhbHVlPiB0aHJvd0Vycm9yKEVycm9yVHlwZSwgY29uc3QgY2hhciogbWVzc2FnZSk7CisKKyAg
ICAgICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgZnVuY3Rpb24gZGVzY3JpcHRvciBhbmQg
c2V0IHRvIHRoZSBnbG9iYWwgb2JqZWN0CisgICAgICAgIC8vIGFzIGEgbmFtZWQgcHJvcGVydHku
IFVzZWQgYnkgdjhfdGVzdF9zaGVsbC4KKyAgICAgICAgc3RhdGljIHZvaWQgYmluZEpzT2JqZWN0
VG9XaW5kb3coRnJhbWUqLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgdHlwZSwgdjg6OkhhbmRsZTx2
ODo6RnVuY3Rpb25UZW1wbGF0ZT4sIHZvaWQqKTsKKworICAgICAgICBzdGF0aWMgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IGNvbnZlcnRFdmVudFRvVjhPYmplY3QoRXZlbnQqKTsKKworICAgICAgICBz
dGF0aWMgRXZlbnQqIGNvbnZlcnRUb05hdGl2ZUV2ZW50KHY4OjpIYW5kbGU8djg6OlZhbHVlPiBq
c0V2ZW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWlzRE9NRXZlbnRXcmFwcGVyKGpz
RXZlbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuIGNv
bnZlcnRET01XcmFwcGVyVG9OYXRpdmU8RXZlbnQ+KGpzRXZlbnQpOworICAgICAgICB9CisKKyAg
ICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252ZXJ0RXZlbnRUYXJnZXRUb1Y4
T2JqZWN0KEV2ZW50VGFyZ2V0Kik7CisgICAgICAgIC8vIFdyYXAgYW5kIHVud3JhcCBKUyBldmVu
dCBsaXN0ZW5lcnMuCisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVy
dEV2ZW50TGlzdGVuZXJUb1Y4T2JqZWN0KEV2ZW50TGlzdGVuZXIqKTsKKworICAgICAgICAvLyBE
T01JbXBsZW1lbnRhdGlvbiBpcyBhIHNpbmdsZXRvbiBhbmQgaXQgaXMgaGFuZGxlZCBpbiBhIHNw
ZWNpYWwKKyAgICAgICAgLy8gd2F5LiBBIHdyYXBwZXIgaXMgZ2VuZXJhdGVkIHBlciBkb2N1bWVu
dCBhbmQgc3RvcmVkIGluIGFuCisgICAgICAgIC8vIGludGVybmFsIGZpZWxkIG9mIHRoZSBkb2N1
bWVudC4KKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252ZXJ0RE9NSW1w
bGVtZW50YXRpb25Ub1Y4T2JqZWN0KERPTUltcGxlbWVudGF0aW9uKik7CisKKyAgICAgICAgLy8g
V3JhcCBKUyBub2RlIGZpbHRlciBpbiBDKysuCisgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPE5v
ZGVGaWx0ZXI+IHdyYXBOYXRpdmVOb2RlRmlsdGVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPik7CisK
KyAgICAgICAgc3RhdGljIHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBnZXRU
ZW1wbGF0ZShWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUpOworCisgICAgICAgIHRlbXBsYXRl
IDxpbnQgdGFnLCB0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFs
dWU+IGNvbnN0cnVjdERPTU9iamVjdChjb25zdCB2ODo6QXJndW1lbnRzJik7CisKKyAgICAgICAg
Ly8gQ2hlY2tzIHdoZXRoZXIgYSBET00gb2JqZWN0IGhhcyBhIEpTIHdyYXBwZXIuCisgICAgICAg
IHN0YXRpYyBib29sIGRvbU9iamVjdEhhc0pTV3JhcHBlcih2b2lkKik7CisgICAgICAgIC8vIFNl
dCBKUyB3cmFwcGVyIG9mIGEgRE9NIG9iamVjdCwgdGhlIGNhbGxlciBpbiBjaGFyZ2Ugb2YgaW5j
cmVhc2UgcmVmLgorICAgICAgICBzdGF0aWMgdm9pZCBzZXRKU1dyYXBwZXJGb3JET01PYmplY3Qo
dm9pZCosIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+KTsKKyAgICAgICAgc3RhdGljIHZvaWQg
c2V0SlNXcmFwcGVyRm9yQWN0aXZlRE9NT2JqZWN0KHZvaWQqLCB2ODo6UGVyc2lzdGVudDx2ODo6
T2JqZWN0Pik7CisgICAgICAgIHN0YXRpYyB2b2lkIHNldEpTV3JhcHBlckZvckRPTU5vZGUoTm9k
ZSosIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+KTsKKworICAgICAgICAvLyBQcm9jZXNzIGFu
eSBwZW5kaW5nIEphdmFTY3JpcHQgY29uc29sZSBtZXNzYWdlcy4KKyAgICAgICAgc3RhdGljIHZv
aWQgcHJvY2Vzc0NvbnNvbGVNZXNzYWdlcygpOworCisjaWZuZGVmIE5ERUJVRworICAgICAgICAv
LyBGb3IgZGVidWdnaW5nIGFuZCBsZWFrIGRldGVjdGlvbiBwdXJwb3NlLgorICAgICAgICBzdGF0
aWMgdm9pZCByZWdpc3Rlckdsb2JhbEhhbmRsZShHbG9iYWxIYW5kbGVUeXBlLCB2b2lkKiwgdjg6
OlBlcnNpc3RlbnQ8djg6OlZhbHVlPik7CisgICAgICAgIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJH
bG9iYWxIYW5kbGUodm9pZCosIHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4pOworI2VuZGlmCisK
KyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhIFY4IHZhbHVlIGlzIGEgd3JhcHBlciBvZiB0eXBl
IHxjbGFzc1R5cGV8LgorICAgICAgICBzdGF0aWMgYm9vbCBpc1dyYXBwZXJPZlR5cGUodjg6Okhh
bmRsZTx2ODo6VmFsdWU+LCBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUpOworCisgICAgICAg
IC8vIEZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSBsaW5lIG51bWJlciBhbmQgc291cmNlIG5h
bWUgZm9yIHRoZSB0b3AKKyAgICAgICAgLy8gSmF2YVNjcmlwdCBzdGFjayBmcmFtZS4KKyAgICAg
ICAgc3RhdGljIGludCBzb3VyY2VMaW5lTnVtYmVyKCk7CisgICAgICAgIHN0YXRpYyBTdHJpbmcg
c291cmNlTmFtZSgpOworCisKKyAgICAgICAgLy8gUmV0dXJucyBhIGxvY2FsIGhhbmRsZSBvZiB0
aGUgY29udGV4dC4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0KCkKKyAg
ICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyht
X2NvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBzZXRDb250ZXh0RGVidWdJZChp
bnQgaWQpOworICAgICAgICBzdGF0aWMgaW50IGNvbnRleHREZWJ1Z0lkKHY4OjpIYW5kbGU8djg6
OkNvbnRleHQ+KTsKKworICAgICAgICAvLyBSZWdpc3RlcnMgYW4gZXh0ZW5zaW9uIHRvIGJlIGF2
YWlsYWJsZSBvbiB3ZWJwYWdlcyB3aXRoIGEgcGFydGljdWxhciBzY2hlbWUKKyAgICAgICAgLy8g
SWYgdGhlIHNjaGVtZSBhcmd1bWVudCBpcyBlbXB0eSwgdGhlIGV4dGVuc2lvbiBpcyBhdmFpbGFi
bGUgb24gYWxsIHBhZ2VzLgorICAgICAgICAvLyBXaWxsIG9ubHkgYWZmZWN0IHY4IGNvbnRleHRz
IGluaXRpYWxpemVkIGFmdGVyIHRoaXMgY2FsbC4gVGFrZXMgb3duZXJzaGlwCisgICAgICAgIC8v
IG9mIHRoZSB2ODo6RXh0ZW5zaW9uIG9iamVjdCBwYXNzZWQuCisgICAgICAgIHN0YXRpYyB2b2lk
IHJlZ2lzdGVyRXh0ZW5zaW9uKHY4OjpFeHRlbnNpb24qLCBjb25zdCBTdHJpbmcmIHNjaGVtZVJl
c3RyaWN0aW9uKTsKKworICAgICAgICBzdGF0aWMgdm9pZCogY29udmVydFRvU1ZHUE9EVHlwZUlt
cGwoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4pOwor
CisgICAgICAgIC8vIEZJWE1FOiBTZXBhcmF0ZSB0aGVzZSBjb25jZXJucyBmcm9tIFY4UHJveHk/
DQorICAgICAgICB2ODo6UGVyc2lzdGVudDx2ODo6Q29udGV4dD4gY3JlYXRlTmV3Q29udGV4dCh2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGdsb2JhbCk7DQorICAgICAgICBib29sIGluc3RhbGxET01X
aW5kb3codjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCwgRE9NV2luZG93KiB3aW5kb3cp
OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDb250ZXh0RGVi
dWdEYXRhVHlwZTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDb250ZXh0RGVidWdEYXRh
VmFsdWU7CisKKyAgICAgICAgdm9pZCBpbml0Q29udGV4dElmTmVlZGVkKCk7CisgICAgICAgIHZv
aWQgZGlzY29ubmVjdEV2ZW50TGlzdGVuZXJzKCk7CisgICAgICAgIHZvaWQgc2V0U2VjdXJpdHlU
b2tlbigpOworICAgICAgICB2b2lkIGNsZWFyRG9jdW1lbnRXcmFwcGVyKCk7CisgICAgICAgIHZv
aWQgdXBkYXRlRG9jdW1lbnRXcmFwcGVyKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3cmFwcGVyKTsK
KworICAgICAgICAvLyBUaGUgSmF2YVNjcmlwdCB3cmFwcGVyIGZvciB0aGUgZG9jdW1lbnQgb2Jq
ZWN0IGlzIGNhY2hlZCBvbiB0aGUgZ2xvYmFsCisgICAgICAgIC8vIG9iamVjdCBmb3IgZmFzdCBh
Y2Nlc3MuIFVwZGF0ZURvY3VtZW50V3JhcHBlckNhY2hlIHNldHMgdGhlIHdyYXBwZXIKKyAgICAg
ICAgLy8gZm9yIHRoZSBjdXJyZW50IGRvY3VtZW50IG9uIHRoZSBnbG9iYWwgb2JqZWN0LiBDbGVh
ckRvY3VtZW50V3JhcHBlckNhY2hlCisgICAgICAgIC8vIGRlbGV0ZXMgdGhlIGRvY3VtZW50IHdy
YXBwZXIgZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgdm9pZCB1cGRhdGVEb2N1bWVu
dFdyYXBwZXJDYWNoZSgpOworICAgICAgICB2b2lkIGNsZWFyRG9jdW1lbnRXcmFwcGVyQ2FjaGUo
KTsKKworICAgICAgICAvLyBEaXNwb3NlIGdsb2JhbCBoYW5kbGVzIG9mIG1fY29udGV4dHMgYW5k
IGZyaWVuZHMuCisgICAgICAgIHZvaWQgZGlzcG9zZUNvbnRleHRIYW5kbGVzKCk7CisKKyAgICAg
ICAgc3RhdGljIGJvb2wgY2FuQWNjZXNzUHJpdmF0ZShET01XaW5kb3cqKTsKKworICAgICAgICAv
LyBDaGVjayB3aGV0aGVyIGEgVjggdmFsdWUgaXMgYSBET00gRXZlbnQgd3JhcHBlci4KKyAgICAg
ICAgc3RhdGljIGJvb2wgaXNET01FdmVudFdyYXBwZXIodjg6OkhhbmRsZTx2ODo6VmFsdWU+KTsK
KworICAgICAgICBzdGF0aWMgdm9pZCogY29udmVydFRvTmF0aXZlT2JqZWN0SW1wbChWOENsYXNz
SW5kZXg6OlY4V3JhcHBlclR5cGUsIHY4OjpIYW5kbGU8djg6OlZhbHVlPik7CisKKyAgICAgICAg
Ly8gVGFrZSBDIHBvaW50ZXIgb3V0IG9mIGEgdjggd3JhcHBlci4KKyAgICAgICAgc3RhdGljIHZv
aWQqIGV4dHJhY3RDUG9pbnRlckltcGwodjg6OkhhbmRsZTx2ODo6VmFsdWU+IG9iamVjdCkKKyAg
ICAgICAgeworICAgICAgICAgICAgQVNTRVJUKG9iamVjdC0+SXNOdW1iZXIoKSk7CisgICAgICAg
ICAgICBpbnQgYWRkciA9IG9iamVjdC0+SW50MzJWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJu
IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFkZHIgPDwgMSk7CisgICAgICAgIH0KKworCisgICAg
ICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVydFN0eWxlU2hlZXRUb1Y4T2Jq
ZWN0KFN0eWxlU2hlZXQqKTsKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBj
b252ZXJ0Q1NTVmFsdWVUb1Y4T2JqZWN0KENTU1ZhbHVlKik7CisgICAgICAgIHN0YXRpYyB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVydENTU1J1bGVUb1Y4T2JqZWN0KENTU1J1bGUqKTsKKyAg
ICAgICAgLy8gUmV0dXJucyB0aGUgSlMgd3JhcHBlciBvZiBhIHdpbmRvdyBvYmplY3QsIGluaXRp
YWxpemVzIHRoZSBlbnZpcm9ubWVudAorICAgICAgICAvLyBvZiB0aGUgd2luZG93IGZyYW1lIGlm
IG5lZWRlZC4KKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252ZXJ0V2lu
ZG93VG9WOE9iamVjdChET01XaW5kb3cqKTsKKworI2lmIEVOQUJMRShTVkcpCisgICAgICAgIHN0
YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVydFNWR0VsZW1lbnRJbnN0YW5jZVRvVjhP
YmplY3QoU1ZHRWxlbWVudEluc3RhbmNlKik7CisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4gY29udmVydFNWR09iamVjdFdpdGhDb250ZXh0VG9WOE9iamVjdChWOENsYXNzSW5k
ZXg6OlY4V3JhcHBlclR5cGUsIHZvaWQqKTsKKyNlbmRpZgorCisgICAgICAgIC8vIFNldCBoaWRk
ZW4gcmVmZXJlbmNlcyBpbiBhIERPTVdpbmRvdyBvYmplY3Qgb2YgYSBmcmFtZS4KKyAgICAgICAg
c3RhdGljIHZvaWQgc2V0SGlkZGVuV2luZG93UmVmZXJlbmNlKEZyYW1lKiwgY29uc3QgaW50IGlu
dGVybmFsSW5kZXgsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4pOworCisgICAgICAgIHN0YXRpYyBW
OENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgaHRtbEVsZW1lbnRUeXBlKEhUTUxFbGVtZW50Kik7
CisKKyAgICAgICAgLy8gVGhlIGZpcnN0IFY4V3JhcHBlclR5cGUgc3BlY2lmaWVzIHRoZSBmdW5j
dGlvbiBkZXNjcmlwdG9yCisgICAgICAgIC8vIHVzZWQgdG8gY3JlYXRlIEpTIG9iamVjdC4gVGhl
IHNlY29uZCBWOFdyYXBwZXJUeXBlIHNwZWNpZmllcworICAgICAgICAvLyB0aGUgYWN0dWFsIHR5
cGUgb2YgdGhlIHZvaWQqIGZvciB0eXBlIGNhc3RpbmcuCisgICAgICAgIC8vIEZvciBleGFtcGxl
LCBhIEhUTUwgZWxlbWVudCBoYXMgSFRNTEVMRU1FTlQgZm9yIHRoZSBmaXJzdCBWOFdyYXBwZXJU
eXBlLCBidXQgYWx3YXlzCisgICAgICAgIC8vIHVzZSBOT0RFIGFzIHRoZSBzZWNvbmQgVjhXcmFw
cGVyVHlwZS4gSlMgd3JhcHBlciBzdG9yZXMgdGhlIHNlY29uZAorICAgICAgICAvLyBWOFdyYXBw
ZXJUeXBlIGFuZCB0aGUgdm9pZCogYXMgaW50ZXJuYWwgZmllbGRzLgorICAgICAgICBzdGF0aWMg
djg6OkxvY2FsPHY4OjpPYmplY3Q+IGluc3RhbnRpYXRlVjhPYmplY3QoVjhDbGFzc0luZGV4OjpW
OFdyYXBwZXJUeXBlLCBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUsIHZvaWQqKTsKKworICAg
ICAgICBzdGF0aWMgY29uc3QgY2hhciogcmFuZ2VFeGNlcHRpb25OYW1lKGludCBleGNlcHRpb25D
b2RlKTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGV2ZW50RXhjZXB0aW9uTmFtZShpbnQg
ZXhjZXB0aW9uQ29kZSk7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiB4bWxIdHRwUmVxdWVz
dEV4Y2VwdGlvbk5hbWUoaW50IGV4Y2VwdGlvbkNvZGUpOworICAgICAgICBzdGF0aWMgY29uc3Qg
Y2hhciogZG9tRXhjZXB0aW9uTmFtZShpbnQgZXhjZXB0aW9uQ29kZSk7CisKKyNpZiBFTkFCTEUo
WFBBVEgpCisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiB4cGF0aEV4Y2VwdGlvbk5hbWUoaW50
IGV4Y2VwdGlvbkNvZGUpOworI2VuZGlmCisKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBzdGF0
aWMgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHN2Z0VsZW1lbnRUeXBlKFNWR0VsZW1lbnQq
KTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIHN2Z0V4Y2VwdGlvbk5hbWUoaW50IGV4Y2Vw
dGlvbkNvZGUpOworI2VuZGlmCisKKyAgICAgICAgc3RhdGljIHZvaWQgY3JlYXRlVXRpbGl0eUNv
bnRleHQoKTsKKworICAgICAgICAvLyBSZXR1cm5zIGEgbG9jYWwgaGFuZGxlIG9mIHRoZSB1dGls
aXR5IGNvbnRleHQuCisgICAgICAgIHN0YXRpYyB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHV0aWxp
dHlDb250ZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1fdXRpbGl0eUNvbnRleHQu
SXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGNyZWF0ZVV0aWxpdHlDb250ZXh0KCk7CisgICAg
ICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KG1fdXRpbGl0eUNvbnRl
eHQpOworICAgICAgICB9CisKKyAgICAgICAgRnJhbWUqIG1fZnJhbWU7CisKKyAgICAgICAgdjg6
OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IG1fY29udGV4dDsKKyAgICAgICAgLy8gRm9yIGVhY2gg
cG9zc2libGUgdHlwZSBvZiB3cmFwcGVyLCB3ZSBrZWVwIGEgYm9pbGVycGxhdGUgb2JqZWN0Lgor
ICAgICAgICAvLyBUaGUgYm9pbGVycGxhdGUgaXMgdXNlZCB0byBjcmVhdGUgYWRkaXRpb25hbCB3
cmFwcGVycyBvZiB0aGUgc2FtZSB0eXBlLgorICAgICAgICAvLyBXZSBrZWVwIGEgc2luZ2xlIHBl
cnNpc3RlbnQgaGFuZGxlIHRvIGFuIGFycmF5IG9mIHRoZSBhY3RpdmF0ZWQKKyAgICAgICAgLy8g
Ym9pbGVycGxhdGVzLgorICAgICAgICB2ODo6UGVyc2lzdGVudDx2ODo6QXJyYXk+IG1fd3JhcHBl
ckJvaWxlcnBsYXRlczsKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiBtX29iamVj
dFByb3RvdHlwZTsKKworICAgICAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiBtX2dsb2Jh
bDsKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiBtX2RvY3VtZW50OworCisgICAg
ICAgIC8vIFV0aWxpdHkgY29udGV4dCBob2xkaW5nIEphdmFTY3JpcHQgZnVuY3Rpb25zIHVzZWQg
aW50ZXJuYWxseS4KKyAgICAgICAgc3RhdGljIHY4OjpQZXJzaXN0ZW50PHY4OjpDb250ZXh0PiBt
X3V0aWxpdHlDb250ZXh0OworCisgICAgICAgIGludCBtX2hhbmRsZXJMaW5lTnVtYmVyOworCisg
ICAgICAgIC8vIEEgbGlzdCBvZiBldmVudCBsaXN0ZW5lcnMgY3JlYXRlZCBmb3IgdGhpcyBmcmFt
ZSwKKyAgICAgICAgLy8gdGhlIGxpc3QgZ2V0cyBjbGVhcmVkIHdoZW4gcmVtb3ZpbmcgYWxsIHRp
bWVvdXRzLgorICAgICAgICBWOEV2ZW50TGlzdGVuZXJMaXN0IG1fZXZlbnRMaXN0ZW5lcnM7CisK
KyAgICAgICAgLy8gQSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyBjcmVhdGUgZm9yIFhNTEh0dHBS
ZXF1ZXN0IG9iamVjdCBmb3IgdGhpcyBmcmFtZSwKKyAgICAgICAgLy8gdGhlIGxpc3QgZ2V0cyBj
bGVhcmVkIHdoZW4gcmVtb3ZpbmcgYWxsIHRpbWVvdXRzLgorICAgICAgICBWOEV2ZW50TGlzdGVu
ZXJMaXN0IG1feGhyTGlzdGVuZXJzOworCisgICAgICAgIC8vIFRydWUgZm9yIDxhIGhyZWY9Imph
dmFzY3JpcHQ6Zm9vKCkiPiBhbmQgZmFsc2UgZm9yIDxzY3JpcHQ+Zm9vKCk8L3NjcmlwdD4uCisg
ICAgICAgIC8vIE9ubHkgdmFsaWQgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICAgICAgYm9vbCBtX2lu
bGluZUNvZGU7CisKKyAgICAgICAgLy8gVHJ1ZSB3aGVuIGV4ZWN1dGluZyBmcm9tIHdpdGhpbiBh
IHRpbWVyIGNhbGxiYWNrLiBPbmx5IHZhbGlkIGR1cmluZworICAgICAgICAvLyBleGVjdXRpb24u
CisgICAgICAgIGJvb2wgbV90aW1lckNhbGxiYWNrOworCisgICAgICAgIC8vIFRyYWNrIHRoZSBy
ZWN1cnNpb24gZGVwdGggdG8gYmUgYWJsZSB0byBhdm9pZCB0b28gZGVlcCByZWN1cnNpb24uIFRo
ZSBWOAorICAgICAgICAvLyBlbmdpbmUgYWxsb3dzIG11Y2ggbW9yZSByZWN1cnNpb24gdGhhbiBL
SlMgZG9lcyBzbyB3ZSBuZWVkIHRvIGd1YXJkIGFnYWluc3QKKyAgICAgICAgLy8gZXhjZXNzaXZl
IHJlY3Vyc2lvbiBpbiB0aGUgYmluZGluZyBsYXllci4KKyAgICAgICAgaW50IG1fcmVjdXJzaW9u
OworCisgICAgICAgIC8vIExpc3Qgb2YgZXh0ZW5zaW9ucyByZWdpc3RlcmVkIHdpdGggdGhlIGNv
bnRleHQuCisgICAgICAgIHN0YXRpYyBWOEV4dGVuc2lvbkxpc3QgbV9leHRlbnNpb25zOworICAg
IH07CisKKyAgICB0ZW1wbGF0ZSA8aW50IHRhZywgdHlwZW5hbWUgVD4KKyAgICB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gVjhQcm94eTo6Y29uc3RydWN0RE9NT2JqZWN0KGNvbnN0IHY4OjpBcmd1bWVu
dHMmIGFyZ3MpCisgICAgeworICAgICAgICBpZiAoIWFyZ3MuSXNDb25zdHJ1Y3RDYWxsKCkpCisg
ICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihWOFByb3h5OjpUeXBlRXJyb3IsICJET00gb2Jq
ZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4iKTsKKworICAg
ICAgICAvLyBOb3RlOiBpdCdzIE9LIHRvIGxldCB0aGlzIFJlZlB0ciBnbyBvdXQgb2Ygc2NvcGUg
YmVjYXVzZSB3ZSBhbHNvIGNhbGwKKyAgICAgICAgLy8gU2V0RE9NV3JhcHBlcigpLCB3aGljaCBl
ZmZlY3RpdmVseSBob2xkcyBhIHJlZmVyZW5jZSB0byBvYmouCisgICAgICAgIFJlZlB0cjxUPiBv
YmogPSBUOjpjcmVhdGUoKTsKKyAgICAgICAgVjhQcm94eTo6c2V0RE9NV3JhcHBlcihhcmdzLkhv
bGRlcigpLCB0YWcsIG9iai5nZXQoKSk7CisgICAgICAgIG9iai0+cmVmKCk7CisgICAgICAgIFY4
UHJveHk6OnNldEpTV3JhcHBlckZvckRPTU9iamVjdChvYmouZ2V0KCksIHY4OjpQZXJzaXN0ZW50
PHY4OjpPYmplY3Q+OjpOZXcoYXJncy5Ib2xkZXIoKSkpOworICAgICAgICByZXR1cm4gYXJncy5I
b2xkZXIoKTsKKyAgICB9CisKKwogICAgIC8vIFVzZWQgYnkgYW4gaW50ZXJjZXB0b3IgY2FsbGJh
Y2sgdGhhdCBpdCBoYXNuJ3QgZm91bmQgYW55dGhpbmcgdG8KICAgICAvLyBpbnRlcmNlcHQuCiAg
ICAgaW5saW5lIHN0YXRpYyB2ODo6TG9jYWw8djg6Ok9iamVjdD4gbm90SGFuZGxlZEJ5SW50ZXJj
ZXB0b3IoKQpAQCAtNDgsMjIgKzY1MiwxNSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgewog
ICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpCb29sZWFuPigpOwogICAgIH0KLQotICAgIC8v
IEZJWE1FOiBSZW1vdmUgb25jZSBtaWdyYXRpb24gaXMgY29tcGxldGUuCi0gICAgaW5saW5lIHN0
YXRpYyBET01XcmFwcGVyTWFwPHZvaWQ+JiBkb21PYmplY3RNYXAoKQotICAgIHsKLSAgICAgICAg
cmV0dXJuIEdldERPTU9iamVjdE1hcCgpOwotICAgIH0KLQotICAgIGlubGluZSB2ODo6SGFuZGxl
PHY4OjpQcmltaXRpdmU+IHRocm93RXJyb3IoY29uc3QgY2hhciogbWVzc2FnZSwgVjhQcm94eTo6
RXJyb3JUeXBlIHR5cGUgPSBWOFByb3h5OjpUWVBFX0VSUk9SKQorICAgIGlubGluZSB2ODo6SGFu
ZGxlPHY4OjpQcmltaXRpdmU+IHRocm93RXJyb3IoY29uc3QgY2hhciogbWVzc2FnZSwgVjhQcm94
eTo6RXJyb3JUeXBlIHR5cGUgPSBWOFByb3h5OjpUeXBlRXJyb3IpCiAgICAgewotICAgICAgICBW
OFByb3h5OjpUaHJvd0Vycm9yKHR5cGUsIG1lc3NhZ2UpOworICAgICAgICBWOFByb3h5Ojp0aHJv
d0Vycm9yKHR5cGUsIG1lc3NhZ2UpOwogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwog
ICAgIH0KIAogICAgIGlubGluZSB2ODo6SGFuZGxlPHY4OjpQcmltaXRpdmU+IHRocm93RXJyb3Io
RXhjZXB0aW9uQ29kZSBlYykKICAgICB7Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlv
bihlYyk7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihlYyk7CiAgICAgICAgIHJl
dHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgfQogCkBAIC03Niw3ICs2NzMsNyBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSB2ODo6SGFuZGxlPHY4
OjpPYmplY3Q+IHRvVjgoUGFzc1JlZlB0cjxUPiBvYmplY3QsIHY4OjpMb2NhbDx2ODo6T2JqZWN0
PiBob2xkZXIpCiAgICAgewogICAgICAgICBvYmplY3QtPnJlZigpOwotICAgICAgICBWOFByb3h5
OjpTZXRKU1dyYXBwZXJGb3JET01PYmplY3Qob2JqZWN0LmdldCgpLCB2ODo6UGVyc2lzdGVudDx2
ODo6T2JqZWN0Pjo6TmV3KGhvbGRlcikpOworICAgICAgICBWOFByb3h5OjpzZXRKU1dyYXBwZXJG
b3JET01PYmplY3Qob2JqZWN0LmdldCgpLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3
KGhvbGRlcikpOwogICAgICAgICByZXR1cm4gaG9sZGVyOwogICAgIH0KIApJbmRleDogV2ViQ29y
ZS9iaW5kaW5ncy92OC9WOFV0aWxpdGllcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGlu
Z3MvdjgvVjhVdGlsaXRpZXMuaAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJDb3JlL2JpbmRpbmdz
L3Y4L1Y4VXRpbGl0aWVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTMxLDkgKzMxLDYgQEAKICNpZm5k
ZWYgVjhVdGlsaXRpZXNfaAogI2RlZmluZSBWOFV0aWxpdGllc19oCiAKLS8vIEZJWE1FOiBSZW1v
dmUgb25jZSBjaHJvbWl1bSBkZXBlbmRlbmNpZXMgb24gdjhfdXRpbGl0eS5oIGFyZSByZW1vdmVk
LgotI2RlZmluZSBWOFVUSUxJVElFU19ERUZJTkVEIDEKLQogI2luY2x1ZGUgPHY4Lmg+CiAKIG5h
bWVzcGFjZSBXZWJDb3JlIHsKQEAgLTc1LDExICs3Miw2IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsK
ICAgICAgIHN0YXRpYyBpbmxpbmUgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG5ld0luc3RhbmNlKHY4
OjpIYW5kbGU8djg6OkZ1bmN0aW9uPik7CiAgICAgICBzdGF0aWMgaW5saW5lIHY4OjpMb2NhbDx2
ODo6T2JqZWN0PiBuZXdJbnN0YW5jZSh2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4pOwog
ICAgICAgc3RhdGljIGlubGluZSB2ODo6TG9jYWw8djg6Ok9iamVjdD4gbmV3SW5zdGFuY2Uodjg6
OkhhbmRsZTx2ODo6RnVuY3Rpb24+LCBpbnQgYXJnYywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFy
Z3ZbXSk7Ci0KLSAgICAgIC8vIEZJWE1FOiBUaGVzZSBOZXdJbnN0YW5jZSBmdW5jdGlvbnMgYXJl
IGhlcmUgdG8gZWFzZSB1cHN0cmVhbWluZy4gUmVtb3ZlIGFsb25nIHdpdGggVjhVVElMSVRJRVNf
REVGSU5FRCBvbmNlIGNocm9taXVtIGRlcGVuZGVuY2llcyBvbiB2OF91dGlsaXR5LmggYXJlIHJl
bW92ZWQuCi0gICAgICBzdGF0aWMgaW5saW5lIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBOZXdJbnN0
YW5jZSh2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4pOwotICAgICAgc3RhdGljIGlubGluZSB2ODo6
TG9jYWw8djg6Ok9iamVjdD4gTmV3SW5zdGFuY2Uodjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxh
dGU+KTsKLSAgICAgIHN0YXRpYyBpbmxpbmUgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IE5ld0luc3Rh
bmNlKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiwgaW50IGFyZ2MsIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBhcmd2W10pOwogICAgIH07CiAKICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gU2FmZUFs
bG9jYXRpb246Om5ld0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiBmdW5jdGlvbikK
QEAgLTEwNiwyMiArOTgsNiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIHJldHVybiBm
dW5jdGlvbi0+TmV3SW5zdGFuY2UoYXJnYywgYXJndik7CiAgICAgfQogCi0gICAgLy8gRklYTUU6
IFRoZXNlIE5ld0luc3RhbmNlIGZ1bmN0aW9ucyBhcmUgaGVyZSB0byBlYXNlIHVwc3RyZWFtaW5n
LiBSZW1vdmUgYWxvbmcgd2l0aCBWOFVUSUxJVElFU19ERUZJTkVEIG9uY2UgY2hyb21pdW0gZGVw
ZW5kZW5jaWVzIG9uIHY4X3V0aWxpdHkuaCBhcmUgcmVtb3ZlZC4KLSAgICB2ODo6TG9jYWw8djg6
Ok9iamVjdD4gU2FmZUFsbG9jYXRpb246Ok5ld0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OkZ1bmN0
aW9uPiBmdW5jdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZShmdW5jdGlv
bik7Ci0gICAgfQotCi0gICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IFNhZmVBbGxvY2F0aW9uOjpO
ZXdJbnN0YW5jZSh2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4gb2JqZWN0VGVtcGxhdGUp
Ci0gICAgewotICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2Uob2JqZWN0VGVtcGxhdGUpOwotICAg
IH0KLQotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBTYWZlQWxsb2NhdGlvbjo6TmV3SW5zdGFu
Y2Uodjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+IGZ1bmN0aW9uLCBpbnQgYXJnYywgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IGFyZ3ZbXSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZShm
dW5jdGlvbiwgYXJnYywgYXJndik7Ci0gICAgfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAK
ICNlbmRpZiAvLyBWOFV0aWxpdGllc19oCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtl
ckNvbnRleHRFeGVjdXRpb25Qcm94eS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5n
cy92OC9Xb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuY3BwCShyZXZpc2lvbiA0NTIxNikKKysr
IFdlYkNvcmUvYmluZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5LmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMzUsMTMgKzM1LDEzIEBACiAKICNpbmNsdWRlICJXb3JrZXJDb250ZXh0
RXhlY3V0aW9uUHJveHkuaCIKIAotI2luY2x1ZGUgIlY4QmluZGluZy5oIgotI2luY2x1ZGUgIlY4
UHJveHkuaCIKICNpbmNsdWRlICJET01Db3JlRXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiRXZlbnQu
aCIKICNpbmNsdWRlICJFdmVudEV4Y2VwdGlvbi5oIgogI2luY2x1ZGUgIlJhbmdlRXhjZXB0aW9u
LmgiCi0jaW5jbHVkZSAiWE1MSHR0cFJlcXVlc3RFeGNlcHRpb24uaCIKKyNpbmNsdWRlICJWOEJp
bmRpbmcuaCIKKyNpbmNsdWRlICJWOERPTU1hcC5oIgorI2luY2x1ZGUgIlY4UHJveHkuaCIKICNp
bmNsdWRlICJWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyLmgiCiAjaW5jbHVkZSAiVjhXb3Jr
ZXJDb250ZXh0T2JqZWN0RXZlbnRMaXN0ZW5lci5oIgogI2luY2x1ZGUgIldvcmtlci5oIgpAQCAt
NDksNiArNDksNyBAQAogI2luY2x1ZGUgIldvcmtlckxvY2F0aW9uLmgiCiAjaW5jbHVkZSAiV29y
a2VyTmF2aWdhdG9yLmgiCiAjaW5jbHVkZSAiV29ya2VyU2NyaXB0Q29udHJvbGxlci5oIgorI2lu
Y2x1ZGUgIlhNTEh0dHBSZXF1ZXN0RXhjZXB0aW9uLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IApAQCAtMTMzLDExICsxMzQsMTEgQEAgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5KiBXb3Jr
ZXJDb250ZQogewogICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2ODo6Q29u
dGV4dDo6R2V0Q3VycmVudCgpOwogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsID0g
Y29udGV4dC0+R2xvYmFsKCk7Ci0gICAgZ2xvYmFsID0gVjhQcm94eTo6TG9va3VwRE9NV3JhcHBl
cihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGdsb2JhbCk7CisgICAgZ2xvYmFsID0gVjhQ
cm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGdsb2Jh
bCk7CiAgICAgLy8gUmV0dXJuIDAgaWYgdGhlIGN1cnJlbnQgZXhlY3V0aW5nIGNvbnRleHQgaXMg
bm90IHRoZSB3b3JrZXIgY29udGV4dC4KICAgICBpZiAoZ2xvYmFsLklzRW1wdHkoKSkKICAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9IFY4UHJveHk6
OlRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVY
VCwgZ2xvYmFsKTsKKyAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94eTo6
Y29udmVydFRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VS
Q09OVEVYVCwgZ2xvYmFsKTsKICAgICByZXR1cm4gd29ya2VyQ29udGV4dC0+c2NyaXB0KCktPnBy
b3h5KCk7CiB9CiAKQEAgLTE4NSw5ICsxODYsOSBAQCB2b2lkIFdvcmtlckNvbnRleHRFeGVjdXRp
b25Qcm94eTo6aW5pdENvCiAgICAgfQogCiAgICAgLy8gV3JhcCB0aGUgb2JqZWN0LgotICAgIFY4
UHJveHk6OlNldERPTVdyYXBwZXIoanNXb3JrZXJDb250ZXh0LCBWOENsYXNzSW5kZXg6OlRvSW50
KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCksIG1fd29ya2VyQ29udGV4dCk7CisgICAgVjhQ
cm94eTo6c2V0RE9NV3JhcHBlcihqc1dvcmtlckNvbnRleHQsIFY4Q2xhc3NJbmRleDo6VG9JbnQo
VjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhUKSwgbV93b3JrZXJDb250ZXh0KTsKIAotICAgIFY4
UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU9iamVjdChtX3dvcmtlckNvbnRleHQsIHY4OjpQZXJz
aXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcoanNXb3JrZXJDb250ZXh0KSk7CisgICAgVjhQcm94eTo6
c2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KG1fd29ya2VyQ29udGV4dCwgdjg6OlBlcnNpc3RlbnQ8
djg6Ok9iamVjdD46Ok5ldyhqc1dvcmtlckNvbnRleHQpKTsKICAgICBtX3dvcmtlckNvbnRleHQt
PnJlZigpOwogCiAgICAgLy8gSW5zZXJ0IHRoZSBvYmplY3QgaW5zdGFuY2UgYXMgdGhlIHByb3Rv
dHlwZSBvZiB0aGUgc2hhZG93IG9iamVjdC4KQEAgLTIwMiw3ICsyMDMsNyBAQCB2ODo6TG9jYWw8
djg6OkZ1bmN0aW9uPiBXb3JrZXJDb250ZXh0RXhlCiAgICAgLy8gRW50ZXIgdGhlIGNvbnRleHQg
b2YgdGhlIHByb3h5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBmdW5jdGlvbiBpcwogICAgIC8vIGNv
bnN0cnVjdGVkIGluIHRoZSBjb250ZXh0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwcm94eS4KICAg
ICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUobV9jb250ZXh0KTsKLSAgICB2ODo6SGFuZGxlPHY4
OjpGdW5jdGlvblRlbXBsYXRlPiBmdW5jdGlvblRlbXBsYXRlID0gVjhQcm94eTo6R2V0VGVtcGxh
dGUodHlwZSk7CisgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gZnVuY3Rpb25U
ZW1wbGF0ZSA9IFY4UHJveHk6OmdldFRlbXBsYXRlKHR5cGUpOwogCiAgICAgLy8gR2V0dGluZyB0
aGUgZnVuY3Rpb24gbWlnaHQgZmFpbCBpZiB3ZSdyZSBydW5uaW5nIG91dCBvZiBzdGFjayBvciBt
ZW1vcnkuCiAgICAgdjg6OlRyeUNhdGNoIHRyeUNhdGNoOwpAQCAtMjMwLDEyICsyMzEsMTIgQEAg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IFdvcmtlckNvbnRleHRFeGVjdQogICAgICAgICBpZiAoIW9i
amVjdC5Jc0VtcHR5KCkpCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxXb3JrZXIqPihpbXBsKS0+
cmVmKCk7CiAgICAgICAgIHJlc3VsdCA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXco
b2JqZWN0KTsKLSAgICAgICAgVjhQcm94eTo6U2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KGltcGws
IHJlc3VsdCk7CisgICAgICAgIFY4UHJveHk6OnNldEpTV3JhcHBlckZvckRPTU9iamVjdChpbXBs
LCByZXN1bHQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8vIE5vbiBE
T00gbm9kZQotICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHJlc3VsdCA9IGRvbU9iamVj
dE1hcCgpLmdldChpbXBsKTsKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiByZXN1bHQg
PSBnZXRET01PYmplY3RNYXAoKS5nZXQoaW1wbCk7CiAgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkp
IHsKICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IHRvVjgodHlwZSwgdHlw
ZSwgaW1wbCk7CiAgICAgICAgIGlmICghb2JqZWN0LklzRW1wdHkoKSkgewpAQCAtMjYyLDcgKzI2
Myw3IEBAIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBXb3JrZXJDb250ZXh0RXhlY3UKICAgICAgICAg
ICAgICAgICBBU1NFUlQoZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzdWx0
ID0gdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhvYmplY3QpOwotICAgICAgICAgICAg
VjhQcm94eTo6U2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KGltcGwsIHJlc3VsdCk7CisgICAgICAg
ICAgICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01PYmplY3QoaW1wbCwgcmVzdWx0KTsKICAg
ICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMjczLDcgKzI3NCw3IEBAIHY4
OjpIYW5kbGU8djg6OlZhbHVlPiBXb3JrZXJDb250ZXh0RXhlY3UKICAgICBpZiAoIWV2ZW50KQog
ICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKIAotICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4g
d3JhcHBlciA9IGRvbU9iamVjdE1hcCgpLmdldChldmVudCk7CisgICAgdjg6OkhhbmRsZTx2ODo6
T2JqZWN0PiB3cmFwcGVyID0gZ2V0RE9NT2JqZWN0TWFwKCkuZ2V0KGV2ZW50KTsKICAgICBpZiAo
IXdyYXBwZXIuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gd3JhcHBlcjsKIApAQCAtMjkwLDcg
KzI5MSw3IEBAIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBXb3JrZXJDb250ZXh0RXhlY3UKICAgICB9
CiAKICAgICBldmVudC0+cmVmKCk7ICAvLyBmYXN0IHJlZgotICAgIFY4UHJveHk6OlNldEpTV3Jh
cHBlckZvckRPTU9iamVjdChldmVudCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhy
ZXN1bHQpKTsKKyAgICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01PYmplY3QoZXZlbnQsIHY4
OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcocmVzdWx0KSk7CiAKICAgICByZXR1cm4gcmVz
dWx0OwogfQpAQCAtMzM2LDIwICszMzcsMjAgQEAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IFdvcmtl
ckNvbnRleHRFeGVjdQogICAgIGlmIChwcm94eSkKICAgICAgICAgZnVuY3Rpb24gPSBwcm94eS0+
R2V0Q29uc3RydWN0b3IoZGVzY1R5cGUpOwogICAgIGVsc2UKLSAgICAgICAgZnVuY3Rpb24gPSBW
OFByb3h5OjpHZXRUZW1wbGF0ZShkZXNjVHlwZSktPkdldEZ1bmN0aW9uKCk7CisgICAgICAgIGZ1
bmN0aW9uID0gVjhQcm94eTo6Z2V0VGVtcGxhdGUoZGVzY1R5cGUpLT5HZXRGdW5jdGlvbigpOwog
CiAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGluc3RhbmNlID0gU2FmZUFsbG9jYXRpb246Om5l
d0luc3RhbmNlKGZ1bmN0aW9uKTsKICAgICBpZiAoIWluc3RhbmNlLklzRW1wdHkoKSkgewogICAg
ICAgICAvLyBBdm9pZCBzZXR0aW5nIHRoZSBET00gd3JhcHBlciBmb3IgZmFpbGVkIGFsbG9jYXRp
b25zLgotICAgICAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKGluc3RhbmNlLCBWOENsYXNzSW5k
ZXg6OlRvSW50KGNwdHJUeXBlKSwgaW1wbCk7CisgICAgICAgIFY4UHJveHk6OnNldERPTVdyYXBw
ZXIoaW5zdGFuY2UsIFY4Q2xhc3NJbmRleDo6VG9JbnQoY3B0clR5cGUpLCBpbXBsKTsKICAgICB9
CiAgICAgcmV0dXJuIGluc3RhbmNlOwogfQogCiBib29sIFdvcmtlckNvbnRleHRFeGVjdXRpb25Q
cm94eTo6Zm9yZ2V0VjhFdmVudE9iamVjdChFdmVudCogZXZlbnQpCiB7Ci0gICAgaWYgKGRvbU9i
amVjdE1hcCgpLmNvbnRhaW5zKGV2ZW50KSkgewotICAgICAgICBkb21PYmplY3RNYXAoKS5mb3Jn
ZXQoZXZlbnQpOworICAgIGlmIChnZXRET01PYmplY3RNYXAoKS5jb250YWlucyhldmVudCkpIHsK
KyAgICAgICAgZ2V0RE9NT2JqZWN0TWFwKCkuZm9yZ2V0KGV2ZW50KTsKICAgICAgICAgcmV0dXJu
IHRydWU7CiAgICAgfSBlbHNlCiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTM2Myw3ICszNjQs
NyBAQCB2ODo6TG9jYWw8djg6OlZhbHVlPiBXb3JrZXJDb250ZXh0RXhlY3V0CiAgICAgdjg6OkNv
bnRleHQ6OlNjb3BlIHNjb3BlKG1fY29udGV4dCk7CiAKICAgICB2ODo6TG9jYWw8djg6OlN0cmlu
Zz4gc2NyaXB0U3RyaW5nID0gdjhFeHRlcm5hbFN0cmluZyhzY3JpcHQpOwotICAgIHY4OjpIYW5k
bGU8djg6OlNjcmlwdD4gY29tcGlsZWRTY3JpcHQgPSBWOFByb3h5OjpDb21waWxlU2NyaXB0KHNj
cmlwdFN0cmluZywgZmlsZU5hbWUsIGJhc2VMaW5lKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpTY3Jp
cHQ+IGNvbXBpbGVkU2NyaXB0ID0gVjhQcm94eTo6Y29tcGlsZVNjcmlwdChzY3JpcHRTdHJpbmcs
IGZpbGVOYW1lLCBiYXNlTGluZSk7CiAgICAgcmV0dXJuIHJ1blNjcmlwdChjb21waWxlZFNjcmlw
dCk7CiB9CiAKQEAgLTM3NSwxMCArMzc2LDEwIEBAIHY4OjpMb2NhbDx2ODo6VmFsdWU+IFdvcmtl
ckNvbnRleHRFeGVjdXQKICAgICAvLyBDb21wdXRlIHRoZSBzb3VyY2Ugc3RyaW5nIGFuZCBwcmV2
ZW50IGFnYWluc3QgaW5maW5pdGUgcmVjdXJzaW9uLgogICAgIGlmIChtX3JlY3Vyc2lvbiA+PSBr
TWF4UmVjdXJzaW9uRGVwdGgpIHsKICAgICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGNvZGUg
PSB2OEV4dGVybmFsU3RyaW5nKCJ0aHJvdyBSYW5nZUVycm9yKCdSZWN1cnNpb24gdG9vIGRlZXAn
KSIpOwotICAgICAgICBzY3JpcHQgPSBWOFByb3h5OjpDb21waWxlU2NyaXB0KGNvZGUsICIiLCAw
KTsKKyAgICAgICAgc2NyaXB0ID0gVjhQcm94eTo6Y29tcGlsZVNjcmlwdChjb2RlLCAiIiwgMCk7
CiAgICAgfQogCi0gICAgaWYgKFY4UHJveHk6OkhhbmRsZU91dE9mTWVtb3J5KCkpCisgICAgaWYg
KFY4UHJveHk6OmhhbmRsZU91dE9mTWVtb3J5KCkpCiAgICAgICAgIEFTU0VSVChzY3JpcHQuSXNF
bXB0eSgpKTsKIAogICAgIGlmIChzY3JpcHQuSXNFbXB0eSgpKQpJbmRleDogV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhBdHRyQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOEF0dHJDdXN0b20uY3BwCShyZXZpc2lvbiA0NTIxNikKKysrIFdl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4QXR0ckN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTQyLDcgKzQyLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBBQ0NFU1NPUl9TRVRURVIo
QXR0clZhbHVlKQogewotICAgIEF0dHIqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8
QXR0cj4oaW5mby5Ib2xkZXIoKSk7CisgICAgQXR0ciogaW1wID0gVjhQcm94eTo6Y29udmVydERP
TVdyYXBwZXJUb05vZGU8QXR0cj4oaW5mby5Ib2xkZXIoKSk7CiAgICAgU3RyaW5nIGF0dHJWYWx1
ZSA9IHRvV2ViQ29yZVN0cmluZ1dpdGhOdWxsQ2hlY2sodmFsdWUpOwogICAgIEVsZW1lbnQqIG93
bmVyRWxlbWVudCA9IGltcC0+b3duZXJFbGVtZW50KCk7CiAKSW5kZXg6IFdlYkNvcmUvYmluZGlu
Z3MvdjgvY3VzdG9tL1Y4Q1NTU3R5bGVEZWNsYXJhdGlvbkN1c3RvbS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDU1NTdHlsZURlY2xhcmF0aW9uQ3VzdG9t
LmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOENT
U1N0eWxlRGVjbGFyYXRpb25DdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNjEsNyArMTYx
LDcgQEAgTkFNRURfUFJPUEVSVFlfR0VUVEVSKENTU1N0eWxlRGVjbGFyYXRpbwogCiAgICAgLy8g
U2VhcmNoIHRoZSBzdHlsZSBkZWNsYXJhdGlvbi4KICAgICBDU1NTdHlsZURlY2xhcmF0aW9uKiBp
bXAgPQotICAgICAgICBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDU1NTdHlsZURlY2xhcmF0aW9u
PihWOENsYXNzSW5kZXg6OkNTU1NUWUxFREVDTEFSQVRJT04sIGluZm8uSG9sZGVyKCkpOworICAg
ICAgICBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q1NTU3R5bGVEZWNsYXJhdGlvbj4o
VjhDbGFzc0luZGV4OjpDU1NTVFlMRURFQ0xBUkFUSU9OLCBpbmZvLkhvbGRlcigpKTsKICAgICBD
U1NQcm9wZXJ0eUluZm8qIHByb3BJbmZvID0gY3NzUHJvcGVydHlJbmZvKG5hbWUpOwogCiAgICAg
Ly8gRG8gbm90IGhhbmRsZSBub24tcHJvcGVydHkgbmFtZXMuCkBAIC0xOTUsNyArMTk1LDcgQEAg
TkFNRURfUFJPUEVSVFlfU0VUVEVSKENTU1N0eWxlRGVjbGFyYXRpbwogewogICAgIElOQ19TVEFU
UygiRE9NLkNTU1N0eWxlRGVjbGFyYXRpb24uTmFtZWRQcm9wZXJ0eVNldHRlciIpOwogICAgIENT
U1N0eWxlRGVjbGFyYXRpb24qIGltcCA9Ci0gICAgICAgIFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0
PENTU1N0eWxlRGVjbGFyYXRpb24+KAorICAgICAgICBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVP
YmplY3Q8Q1NTU3R5bGVEZWNsYXJhdGlvbj4oCiAgICAgICAgICAgICBWOENsYXNzSW5kZXg6OkNT
U1NUWUxFREVDTEFSQVRJT04sIGluZm8uSG9sZGVyKCkpOwogICAgIENTU1Byb3BlcnR5SW5mbyog
cHJvcEluZm8gPSBjc3NQcm9wZXJ0eUluZm8obmFtZSk7CiAgICAgaWYgKCFwcm9wSW5mbykKSW5k
ZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2FudmFzUGl4ZWxBcnJheUN1c3RvbS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDYW52YXNQaXhl
bEFycmF5Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOENhbnZhc1BpeGVsQXJyYXlDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00
MSw3ICs0MSw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIElOREVYRURfUFJPUEVSVFlfR0VUVEVS
KENhbnZhc1BpeGVsQXJyYXkpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUGl4ZWxBcnJh
eS5JbmRleGVkUHJvcGVydHlHZXR0ZXIiKTsKLSAgICBDYW52YXNQaXhlbEFycmF5KiBwaXhlbEJ1
ZmZlciA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZhc1BpeGVsQXJyYXk+KFY4Q2xhc3NJ
bmRleDo6Q0FOVkFTUElYRUxBUlJBWSwgaW5mby5Ib2xkZXIoKSk7CisgICAgQ2FudmFzUGl4ZWxB
cnJheSogcGl4ZWxCdWZmZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2FudmFz
UGl4ZWxBcnJheT4oVjhDbGFzc0luZGV4OjpDQU5WQVNQSVhFTEFSUkFZLCBpbmZvLkhvbGRlcigp
KTsKIAogICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gcGl4ZWxCdWZmZXItPmxlbmd0
aCgpKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKQEAgLTU1LDcgKzU1LDcgQEAg
SU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoQ2FudmFzUGl4ZWxBcnJheQogSU5ERVhFRF9QUk9QRVJU
WV9TRVRURVIoQ2FudmFzUGl4ZWxBcnJheSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5DYW52YXNQ
aXhlbEFycmF5LkluZGV4ZWRQcm9wZXJ0eVNldHRlciIpOwotICAgIENhbnZhc1BpeGVsQXJyYXkq
IHBpeGVsQnVmZmVyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUGl4ZWxBcnJheT4o
VjhDbGFzc0luZGV4OjpDQU5WQVNQSVhFTEFSUkFZLCBpbmZvLkhvbGRlcigpKTsKKyAgICBDYW52
YXNQaXhlbEFycmF5KiBwaXhlbEJ1ZmZlciA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVj
dDxDYW52YXNQaXhlbEFycmF5PihWOENsYXNzSW5kZXg6OkNBTlZBU1BJWEVMQVJSQVksIGluZm8u
SG9sZGVyKCkpOwogCiAgICAgaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCBwaXhlbEJ1ZmZl
ci0+bGVuZ3RoKCkpKQogICAgICAgICBwaXhlbEJ1ZmZlci0+c2V0KGluZGV4LCB2YWx1ZS0+TnVt
YmVyVmFsdWUoKSk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOENhbnZhc1Jl
bmRlcmluZ0NvbnRleHQyREN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRDdXN0b20uY3BwCShyZXZpc2lv
biA0NTIxNikKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2FudmFzUmVuZGVyaW5n
Q29udGV4dDJEQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTAsMTAgKzUwLDEwIEBAIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdG9WOChDYW52
YXNTdHlsZSogc3R5bGUpCiB7CiAgICAgaWYgKHN0eWxlLT5jYW52YXNHcmFkaWVudCgpKQotICAg
ICAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNBTlZBU0dSQURJ
RU5ULCBzdHlsZS0+Y2FudmFzR3JhZGllbnQoKSk7CisgICAgICAgIHJldHVybiBWOFByb3h5Ojpj
b252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNBTlZBU0dSQURJRU5ULCBzdHlsZS0+Y2Fu
dmFzR3JhZGllbnQoKSk7CiAKICAgICBpZiAoc3R5bGUtPmNhbnZhc1BhdHRlcm4oKSkKLSAgICAg
ICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpDQU5WQVNQQVRURVJO
LCBzdHlsZS0+Y2FudmFzUGF0dGVybigpKTsKKyAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZl
cnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUEFUVEVSTiwgc3R5bGUtPmNhbnZhc1Bh
dHRlcm4oKSk7CiAKICAgICByZXR1cm4gdjhTdHJpbmcoc3R5bGUtPmNvbG9yKCkpOwogfQpAQCAt
NjQsMzUgKzY0LDM1IEBAIHN0YXRpYyBQYXNzUmVmUHRyPENhbnZhc1N0eWxlPiB0b0NhbnZhc1MK
ICAgICAgICAgcmV0dXJuIENhbnZhc1N0eWxlOjpjcmVhdGUodG9XZWJDb3JlU3RyaW5nKHZhbHVl
KSk7CiAKICAgICBpZiAoVjhDYW52YXNHcmFkaWVudDo6SGFzSW5zdGFuY2UodmFsdWUpKQotICAg
ICAgICByZXR1cm4gQ2FudmFzU3R5bGU6OmNyZWF0ZShWOFByb3h5OjpET01XcmFwcGVyVG9OYXRp
dmU8Q2FudmFzR3JhZGllbnQ+KHZhbHVlKSk7CisgICAgICAgIHJldHVybiBDYW52YXNTdHlsZTo6
Y3JlYXRlKFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8Q2FudmFzR3JhZGllbnQ+
KHZhbHVlKSk7CiAKICAgICBpZiAoVjhDYW52YXNQYXR0ZXJuOjpIYXNJbnN0YW5jZSh2YWx1ZSkp
Ci0gICAgICAgIHJldHVybiBDYW52YXNTdHlsZTo6Y3JlYXRlKFY4UHJveHk6OkRPTVdyYXBwZXJU
b05hdGl2ZTxDYW52YXNQYXR0ZXJuPih2YWx1ZSkpOworICAgICAgICByZXR1cm4gQ2FudmFzU3R5
bGU6OmNyZWF0ZShWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPENhbnZhc1BhdHRl
cm4+KHZhbHVlKSk7CiAKICAgICByZXR1cm4gMDsKIH0KIAogQUNDRVNTT1JfR0VUVEVSKENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRFN0cm9rZVN0eWxlKQogewotICAgIENhbnZhc1JlbmRlcmluZ0Nv
bnRleHQyRCogaW1wbCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05hdGl2ZTxDYW52YXNSZW5kZXJp
bmdDb250ZXh0MkQ+KGluZm8uSG9sZGVyKCkpOworICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQy
RCogaW1wbCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8Q2FudmFzUmVuZGVy
aW5nQ29udGV4dDJEPihpbmZvLkhvbGRlcigpKTsKICAgICByZXR1cm4gdG9WOChpbXBsLT5zdHJv
a2VTdHlsZSgpKTsKIH0KIAogQUNDRVNTT1JfU0VUVEVSKENhbnZhc1JlbmRlcmluZ0NvbnRleHQy
RFN0cm9rZVN0eWxlKQogewotICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogaW1wbCA9IFY4
UHJveHk6OkRPTVdyYXBwZXJUb05hdGl2ZTxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KGluZm8u
SG9sZGVyKCkpOworICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogaW1wbCA9IFY4UHJveHk6
OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihpbmZv
LkhvbGRlcigpKTsKICAgICBpbXBsLT5zZXRTdHJva2VTdHlsZSh0b0NhbnZhc1N0eWxlKHZhbHVl
KSk7CiB9CiAKIEFDQ0VTU09SX0dFVFRFUihDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRGaWxsU3R5
bGUpCiB7Ci0gICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBpbXBsID0gVjhQcm94eTo6RE9N
V3JhcHBlclRvTmF0aXZlPENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oaW5mby5Ib2xkZXIoKSk7
CisgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBpbXBsID0gVjhQcm94eTo6Y29udmVydERP
TVdyYXBwZXJUb05hdGl2ZTxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KGluZm8uSG9sZGVyKCkp
OwogICAgIHJldHVybiB0b1Y4KGltcGwtPmZpbGxTdHlsZSgpKTsKIH0KIAogQUNDRVNTT1JfU0VU
VEVSKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyREZpbGxTdHlsZSkKIHsKLSAgICBDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQqIGltcGwgPSBWOFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8Q2FudmFz
UmVuZGVyaW5nQ29udGV4dDJEPihpbmZvLkhvbGRlcigpKTsKKyAgICBDYW52YXNSZW5kZXJpbmdD
b250ZXh0MkQqIGltcGwgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgaW1wbC0+c2V0RmlsbFN0
eWxlKHRvQ2FudmFzU3R5bGUodmFsdWUpKTsKIH0KIApAQCAtMTAxLDcgKzEwMSw3IEBAIEFDQ0VT
U09SX1NFVFRFUihDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQKIENBTExCQUNLX0ZVTkNfREVDTChD
YW52YXNSZW5kZXJpbmdDb250ZXh0MkRTZXRTdHJva2VDb2xvcikKIHsKICAgICBJTkNfU1RBVFMo
IkRPTS5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQuc2V0U3Ryb2tlQ29sb3IoKSIpOwotICAgIENh
bnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0
PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdD
T05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOworICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCog
Y29udGV4dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdD
b250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhv
bGRlcigpKTsKICAgICBzd2l0Y2ggKGFyZ3MuTGVuZ3RoKCkpIHsKICAgICBjYXNlIDE6CiAgICAg
ICAgIGlmIChhcmdzWzBdLT5Jc1N0cmluZygpKQpAQCAtMTIyLDcgKzEyMiw3IEBAIENBTExCQUNL
X0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250ZXgKICAgICAgICAgY29udGV4dC0+c2V0U3Ry
b2tlQ29sb3IodG9GbG9hdChhcmdzWzBdKSwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdz
WzJdKSwgdG9GbG9hdChhcmdzWzNdKSwgdG9GbG9hdChhcmdzWzRdKSk7CiAgICAgICAgIGJyZWFr
OwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6U1lO
VEFYX0VSUk9SLCAic2V0U3Ryb2tlQ29sb3I6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIp
OworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgInNl
dFN0cm9rZUNvbG9yOiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiKTsKICAgICAgICAgYnJl
YWs7CiAgICAgfQogICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CkBAIC0xMzEsNyArMTMxLDcg
QEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleAogQ0FMTEJBQ0tfRlVO
Q19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFNldEZpbGxDb2xvcikKIHsKICAgICBJTkNf
U1RBVFMoIkRPTS5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQuc2V0RmlsbENvbG9yKCkiKTsKLSAg
ICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVS
SU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkQqIGNvbnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVy
aW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJn
cy5Ib2xkZXIoKSk7CiAgICAgc3dpdGNoIChhcmdzLkxlbmd0aCgpKSB7CiAgICAgY2FzZSAxOgog
ICAgICAgICBpZiAoYXJnc1swXS0+SXNTdHJpbmcoKSkKQEAgLTE1Miw3ICsxNTIsNyBAQCBDQUxM
QkFDS19GVU5DX0RFQ0woQ2FudmFzUmVuZGVyaW5nQ29udGV4CiAgICAgICAgIGNvbnRleHQtPnNl
dEZpbGxDb2xvcih0b0Zsb2F0KGFyZ3NbMF0pLCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFy
Z3NbMl0pLCB0b0Zsb2F0KGFyZ3NbM10pLCB0b0Zsb2F0KGFyZ3NbNF0pKTsKICAgICAgICAgYnJl
YWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpT
WU5UQVhfRVJST1IsICJzZXRGaWxsQ29sb3I6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIp
OworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgInNl
dEZpbGxDb2xvcjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgIGJyZWFr
OwogICAgIH0KICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwpAQCAtMTYxLDEzICsxNjEsMTMg
QEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleAogQ0FMTEJBQ0tfRlVO
Q19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFN0cm9rZVJlY3QpCiB7CiAgICAgSU5DX1NU
QVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnN0cm9rZVJlY3QoKSIpOwotICAgIENh
bnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0
PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdD
T05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOworICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCog
Y29udGV4dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdD
b250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhv
bGRlcigpKTsKICAgICBpZiAoYXJncy5MZW5ndGgoKSA9PSA1KQogICAgICAgICBjb250ZXh0LT5z
dHJva2VSZWN0KHRvRmxvYXQoYXJnc1swXSksIHRvRmxvYXQoYXJnc1sxXSksIHRvRmxvYXQoYXJn
c1syXSksIHRvRmxvYXQoYXJnc1szXSksIHRvRmxvYXQoYXJnc1s0XSkpOwogICAgIGVsc2UgaWYg
KGFyZ3MuTGVuZ3RoKCkgPT0gNCkKICAgICAgICAgY29udGV4dC0+c3Ryb2tlUmVjdCh0b0Zsb2F0
KGFyZ3NbMF0pLCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pLCB0b0Zsb2F0KGFy
Z3NbM10pKTsKICAgICBlbHNlIHsKLSAgICAgICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKElO
REVYX1NJWkVfRVJSKTsKKyAgICAgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKElOREVYX1NJ
WkVfRVJSKTsKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAgICAg
fQogICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CkBAIC0xNzYsNyArMTc2LDcgQEAgQ0FMTEJB
Q0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleAogQ0FMTEJBQ0tfRlVOQ19ERUNMKENh
bnZhc1JlbmRlcmluZ0NvbnRleHQyRFNldFNoYWRvdykKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5D
YW52YXNSZW5kZXJpbmdDb250ZXh0MkQuc2V0U2hhZG93KCkiKTsKLSAgICBDYW52YXNSZW5kZXJp
bmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBh
cmdzLkhvbGRlcigpKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBW
OFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihW
OENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CiAK
ICAgICBzd2l0Y2ggKGFyZ3MuTGVuZ3RoKCkpIHsKICAgICBjYXNlIDM6CkBAIC0yMDEsNyArMjAx
LDcgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleAogICAgICAgICBj
b250ZXh0LT5zZXRTaGFkb3codG9GbG9hdChhcmdzWzBdKSwgdG9GbG9hdChhcmdzWzFdKSwgdG9G
bG9hdChhcmdzWzJdKSwgdG9GbG9hdChhcmdzWzNdKSwgdG9GbG9hdChhcmdzWzRdKSwgdG9GbG9h
dChhcmdzWzVdKSwgdG9GbG9hdChhcmdzWzZdKSwgdG9GbG9hdChhcmdzWzddKSk7CiAgICAgICAg
IGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94
eTo6U1lOVEFYX0VSUk9SLCAic2V0U2hhZG93OiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMi
KTsKKyAgICAgICAgVjhQcm94eTo6dGhyb3dFcnJvcihWOFByb3h5OjpTWU5UQVhfRVJST1IsICJz
ZXRTaGFkb3c6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIpOwogICAgICAgICBicmVhazsK
ICAgICB9CiAKQEAgLTIxMSwxMyArMjExLDEzIEBAIENBTExCQUNLX0ZVTkNfREVDTChDYW52YXNS
ZW5kZXJpbmdDb250ZXgKIENBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkREcmF3SW1hZ2UpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4
dDJELmRyYXdJbWFnZSgpIik7Ci0gICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENs
YXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CisgICAg
Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNS
RU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IGFyZyA9IGFyZ3NbMF07CiAKICAgICBpZiAoVjhIVE1MSW1hZ2VFbGVtZW50OjpIYXNJ
bnN0YW5jZShhcmcpKSB7CiAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgICAgICBI
VE1MSW1hZ2VFbGVtZW50KiBpbWFnZV9lbGVtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9k
ZTxIVE1MSW1hZ2VFbGVtZW50PihhcmcpOworICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFn
ZV9lbGVtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTEltYWdlRWxl
bWVudD4oYXJnKTsKICAgICAgICAgc3dpdGNoIChhcmdzLkxlbmd0aCgpKSB7CiAgICAgICAgIGNh
c2UgMzoKICAgICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZShpbWFnZV9lbGVtZW50LCB0b0Zs
b2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pKTsKQEAgLTIyNSw3ICsyMjUsNyBAQCBDQUxM
QkFDS19GVU5DX0RFQ0woQ2FudmFzUmVuZGVyaW5nQ29udGV4CiAgICAgICAgIGNhc2UgNToKICAg
ICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZShpbWFnZV9lbGVtZW50LCB0b0Zsb2F0KGFyZ3Nb
MV0pLCB0b0Zsb2F0KGFyZ3NbMl0pLCB0b0Zsb2F0KGFyZ3NbM10pLCB0b0Zsb2F0KGFyZ3NbNF0p
LCBlYyk7CiAgICAgICAgICAgICBpZiAoZWMgIT0gMCkgewotICAgICAgICAgICAgICAgIFY4UHJv
eHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAgICAgICAgICAgVjhQcm94eTo6c2V0RE9N
RXhjZXB0aW9uKGVjKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJj
ZXB0b3IoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjM1LDEyICsy
MzUsMTIgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleAogICAgICAg
ICAgICAgICAgIEZsb2F0UmVjdCh0b0Zsb2F0KGFyZ3NbNV0pLCB0b0Zsb2F0KGFyZ3NbNl0pLCB0
b0Zsb2F0KGFyZ3NbN10pLCB0b0Zsb2F0KGFyZ3NbOF0pKSwKICAgICAgICAgICAgICAgICBlYyk7
CiAgICAgICAgICAgICBpZiAoZWMgIT0gMCkgewotICAgICAgICAgICAgICAgIFY4UHJveHk6OlNl
dERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAgICAgICAgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0
aW9uKGVjKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3Io
KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0Ogot
ICAgICAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpTWU5UQVhfRVJST1IsICJk
cmF3SW1hZ2U6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgVjhQ
cm94eTo6dGhyb3dFcnJvcihWOFByb3h5OjpTWU5UQVhfRVJST1IsICJkcmF3SW1hZ2U6IEludmFs
aWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIpOwogICAgICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmlu
ZWQoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwpAQCAtMjQ5
LDcgKzI0OSw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250ZXgKICAg
ICAvLyBIVE1MQ2FudmFzRWxlbWVudAogICAgIGlmIChWOEhUTUxDYW52YXNFbGVtZW50OjpIYXNJ
bnN0YW5jZShhcmcpKSB7CiAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgICAgICBI
VE1MQ2FudmFzRWxlbWVudCogY2FudmFzX2VsZW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPEhUTUxDYW52YXNFbGVtZW50PihhcmcpOworICAgICAgICBIVE1MQ2FudmFzRWxlbWVudCog
Y2FudmFzX2VsZW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MQ2Fu
dmFzRWxlbWVudD4oYXJnKTsKICAgICAgICAgc3dpdGNoIChhcmdzLkxlbmd0aCgpKSB7CiAgICAg
ICAgIGNhc2UgMzoKICAgICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZShjYW52YXNfZWxlbWVu
dCwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSk7CkBAIC0yNTcsNyArMjU3LDcg
QEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleAogICAgICAgICBjYXNl
IDU6CiAgICAgICAgICAgICBjb250ZXh0LT5kcmF3SW1hZ2UoY2FudmFzX2VsZW1lbnQsIHRvRmxv
YXQoYXJnc1sxXSksIHRvRmxvYXQoYXJnc1syXSksIHRvRmxvYXQoYXJnc1szXSksIHRvRmxvYXQo
YXJnc1s0XSksIGVjKTsKICAgICAgICAgICAgIGlmIChlYyAhPSAwKSB7Ci0gICAgICAgICAgICAg
ICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICAgICAgICAgICAgICBWOFByb3h5
OjpzZXRET01FeGNlcHRpb24oZWMpOwogICAgICAgICAgICAgICAgIHJldHVybiBub3RIYW5kbGVk
QnlJbnRlcmNlcHRvcigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0y
NjcsMzMgKzI2NywzMyBAQCBDQUxMQkFDS19GVU5DX0RFQ0woQ2FudmFzUmVuZGVyaW5nQ29udGV4
CiAgICAgICAgICAgICAgICAgRmxvYXRSZWN0KHRvRmxvYXQoYXJnc1s1XSksIHRvRmxvYXQoYXJn
c1s2XSksIHRvRmxvYXQoYXJnc1s3XSksIHRvRmxvYXQoYXJnc1s4XSkpLAogICAgICAgICAgICAg
ICAgIGVjKTsKICAgICAgICAgICAgIGlmIChlYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgVjhQ
cm94eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICAgICAgICAgICAgICBWOFByb3h5OjpzZXRE
T01FeGNlcHRpb24oZWMpOwogICAgICAgICAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRl
cmNlcHRvcigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRl
ZmF1bHQ6Ci0gICAgICAgICAgICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9F
UlJPUiwgImRyYXdJbWFnZTogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIik7CisgICAgICAg
ICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgImRyYXdJbWFn
ZTogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgICAgICByZXR1cm4gdjg6
OlVuZGVmaW5lZCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7
CiAgICAgfQogCi0gICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKFRZUEVfTUlTTUFUQ0hfRVJS
KTsKKyAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oVFlQRV9NSVNNQVRDSF9FUlIpOwogICAg
IHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogfQogCiBDQUxMQkFDS19GVU5DX0RF
Q0woQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJERHJhd0ltYWdlRnJvbVJlY3QpCiB7CiAgICAgSU5D
X1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmRyYXdJbWFnZUZyb21SZWN0KCki
KTsKLSAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpUb05h
dGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFT
UkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKKyAgICBDYW52YXNSZW5kZXJpbmdD
b250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2FudmFz
UmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQy
RCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJnID0gYXJn
c1swXTsKIAogICAgIGlmIChWOEhUTUxJbWFnZUVsZW1lbnQ6Okhhc0luc3RhbmNlKGFyZykpIHsK
LSAgICAgICAgSFRNTEltYWdlRWxlbWVudCogaW1hZ2VfZWxlbWVudCA9IFY4UHJveHk6OkRPTVdy
YXBwZXJUb05vZGU8SFRNTEltYWdlRWxlbWVudD4oYXJnKTsKKyAgICAgICAgSFRNTEltYWdlRWxl
bWVudCogaW1hZ2VfZWxlbWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhU
TUxJbWFnZUVsZW1lbnQ+KGFyZyk7CiAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZUZyb21SZWN0
KGltYWdlX2VsZW1lbnQsICB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pLCB0b0Zs
b2F0KGFyZ3NbM10pLCB0b0Zsb2F0KGFyZ3NbNF0pLCB0b0Zsb2F0KGFyZ3NbNV0pLCB0b0Zsb2F0
KGFyZ3NbNl0pLCB0b0Zsb2F0KGFyZ3NbN10pLCB0b0Zsb2F0KGFyZ3NbOF0pLCBUb1dlYkNvcmVT
dHJpbmcoYXJnc1s5XSkpOwogICAgIH0gZWxzZQotICAgICAgICBWOFByb3h5OjpUaHJvd0Vycm9y
KFY4UHJveHk6OlRZUEVfRVJST1IsICJkcmF3SW1hZ2VGcm9tUmVjdDogSW52YWxpZCB0eXBlIG9m
IGFyZ3VtZW50cyIpOworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlRZUEVf
RVJST1IsICJkcmF3SW1hZ2VGcm9tUmVjdDogSW52YWxpZCB0eXBlIG9mIGFyZ3VtZW50cyIpOwog
CiAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIH0KQEAgLTMwMSwzMyArMzAxLDMzIEBAIENB
TExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250ZXgKIENBTExCQUNLX0ZVTkNfREVD
TChDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRDcmVhdGVQYXR0ZXJuKQogewogICAgIElOQ19TVEFU
UygiRE9NLkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5jcmVhdGVQYXR0ZXJuKCkiKTsKLSAgICBD
YW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVj
dDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5H
Q09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQq
IGNvbnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5n
Q29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5I
b2xkZXIoKSk7CiAKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJnID0gYXJnc1swXTsKIAog
ICAgIGlmIChWOEhUTUxJbWFnZUVsZW1lbnQ6Okhhc0luc3RhbmNlKGFyZykpIHsKLSAgICAgICAg
SFRNTEltYWdlRWxlbWVudCogaW1hZ2VfZWxlbWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05v
ZGU8SFRNTEltYWdlRWxlbWVudD4oYXJnKTsKKyAgICAgICAgSFRNTEltYWdlRWxlbWVudCogaW1h
Z2VfZWxlbWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxJbWFnZUVs
ZW1lbnQ+KGFyZyk7CiAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgICAgICBSZWZQ
dHI8Q2FudmFzUGF0dGVybj4gcGF0dGVybiA9IGNvbnRleHQtPmNyZWF0ZVBhdHRlcm4oaW1hZ2Vf
ZWxlbWVudCwgdmFsdWVUb1N0cmluZ1dpdGhOdWxsQ2hlY2soYXJnc1sxXSksIGVjKTsKICAgICAg
ICAgaWYgKGVjICE9IDApIHsKLSAgICAgICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihl
Yyk7CisgICAgICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogICAgICAgICAg
ICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAgICAgICAgIH0KLSAgICAgICAg
cmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpDQU5WQVNQQVRURVJOLCBw
YXR0ZXJuLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUEFUVEVSTiwgcGF0dGVybi5nZXQoKSk7CiAgICAgfQogCiAg
ICAgaWYgKFY4SFRNTENhbnZhc0VsZW1lbnQ6Okhhc0luc3RhbmNlKGFyZykpIHsKLSAgICAgICAg
SFRNTENhbnZhc0VsZW1lbnQqIGNhbnZhc19lbGVtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRv
Tm9kZTxIVE1MQ2FudmFzRWxlbWVudD4oYXJnKTsKKyAgICAgICAgSFRNTENhbnZhc0VsZW1lbnQq
IGNhbnZhc19lbGVtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTENh
bnZhc0VsZW1lbnQ+KGFyZyk7CiAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgICAg
ICBSZWZQdHI8Q2FudmFzUGF0dGVybj4gcGF0dGVybiA9IGNvbnRleHQtPmNyZWF0ZVBhdHRlcm4o
Y2FudmFzX2VsZW1lbnQsIHZhbHVlVG9TdHJpbmdXaXRoTnVsbENoZWNrKGFyZ3NbMV0pLCBlYyk7
CiAgICAgICAgIGlmIChlYyAhPSAwKSB7Ci0gICAgICAgICAgICBWOFByb3h5OjpTZXRET01FeGNl
cHRpb24oZWMpOworICAgICAgICAgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKGVjKTsKICAg
ICAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogICAgICAgICB9Ci0g
ICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUEFU
VEVSTiwgcGF0dGVybi5nZXQoKSk7CisgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9W
OE9iamVjdChWOENsYXNzSW5kZXg6OkNBTlZBU1BBVFRFUk4sIHBhdHRlcm4uZ2V0KCkpOwogICAg
IH0KIAotICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihUWVBFX01JU01BVENIX0VSUik7Cisg
ICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKFRZUEVfTUlTTUFUQ0hfRVJSKTsKICAgICByZXR1
cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKIH0KIApAQCAtMzM1LDEzICszMzUsMTMgQEAg
Q0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleAogewogICAgIElOQ19TVEFU
UygiRE9NLkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5maWxsVGV4dCgpIik7CiAKLSAgICBDYW52
YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxD
YW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09O
VEVYVDJELCBhcmdzLkhvbGRlcigpKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNv
bnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29u
dGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xk
ZXIoKSk7CiAKICAgICAvLyBUd28gZm9ybXM6CiAgICAgLy8gKiBmaWxsVGV4dCh0ZXh0LCB4LCB5
KQogICAgIC8vICogZmlsbFRleHQodGV4dCwgeCwgeSwgbWF4V2lkdGgpCiAgICAgaWYgKGFyZ3Mu
TGVuZ3RoKCkgPCAzIHx8IGFyZ3MuTGVuZ3RoKCkgPiA0KSB7Ci0gICAgICAgIFY4UHJveHk6OlNl
dERPTUV4Y2VwdGlvbihTWU5UQVhfRVJSKTsKKyAgICAgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0
aW9uKFNZTlRBWF9FUlIpOwogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3Io
KTsKICAgICB9CiAKQEAgLTM2MSwxMyArMzYxLDEzIEBAIENBTExCQUNLX0ZVTkNfREVDTChDYW52
YXNSZW5kZXJpbmdDb250ZXgKIENBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkRTdHJva2VUZXh0KQogewogICAgIElOQ19TVEFUUygiRE9NLkNhbnZhc1JlbmRlcmluZ0Nv
bnRleHQyRC5zdHJva2VUZXh0KCkiKTsKLSAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNv
bnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+
KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsK
KyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5Ojpjb252ZXJ0
VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNB
TlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICAvLyBUd28gZm9y
bXM6CiAgICAgLy8gKiBzdHJva2VUZXh0KHRleHQsIHgsIHkpCiAgICAgLy8gKiBzdHJva2VUZXh0
KHRleHQsIHgsIHksIG1heFdpZHRoKQogICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMyB8fCBhcmdz
Lkxlbmd0aCgpID4gNCkgewotICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oU1lOVEFY
X0VSUik7CisgICAgICAgIFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihTWU5UQVhfRVJSKTsKICAg
ICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAgICAgfQogCkBAIC0zOTIs
MjAgKzM5MiwyMCBAQCBDQUxMQkFDS19GVU5DX0RFQ0woQ2FudmFzUmVuZGVyaW5nQ29udGV4CiAg
ICAgLy8gKiBwdXRJbWFnZURhdGEoSW1hZ2VEYXRhLCB4LCB5KQogICAgIC8vICogcHV0SW1hZ2VE
YXRhKEltYWdlRGF0YSwgeCwgeSwgZGlydHlYLCBkaXJ0eVksIGRpcnR5V2lkdGgsIGRpcnR5SGVp
Z2h0KQogICAgIGlmIChhcmdzLkxlbmd0aCgpICE9IDMgJiYgYXJncy5MZW5ndGgoKSAhPSA3KSB7
Ci0gICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihTWU5UQVhfRVJSKTsKKyAgICAgICAg
VjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKFNZTlRBWF9FUlIpOwogICAgICAgICByZXR1cm4gbm90
SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKICAgICB9CiAKLSAgICBDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdD
b250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhv
bGRlcigpKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5
Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNz
SW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBJ
bWFnZURhdGEqIGltYWdlRGF0YSA9IDA7CiAKICAgICAvLyBOZWVkIHRvIGNoZWNrIHRoYXQgdGhl
IGFyZ3VtZW50IGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUsIHNpbmNlCi0gICAgLy8gVG9OYXRpdmVP
YmplY3QoKSBleHBlY3RzIGl0IHRvIGJlIGNvcnJlY3QuIElmIHRoZSBhcmd1bWVudCB3YXMgaW5j
b3JyZWN0CisgICAgLy8gY29udmVydFRvTmF0aXZlT2JqZWN0KCkgZXhwZWN0cyBpdCB0byBiZSBj
b3JyZWN0LiBJZiB0aGUgYXJndW1lbnQgd2FzIGluY29ycmVjdAogICAgIC8vIHdlIGxlYXZlIGl0
IG51bGwsIGFuZCBwdXRJbWFnZURhdGEoKSB3aWxsIHRocm93IHRoZSBjb3JyZWN0IGV4Y2VwdGlv
bgogICAgIC8vIChUWVBFX01JU01BVENIX0VSUikuCi0gICAgaWYgKFY4UHJveHk6OklzV3JhcHBl
ck9mVHlwZShhcmdzWzBdLCBWOENsYXNzSW5kZXg6OklNQUdFREFUQSkpCi0gICAgICAgIGltYWdl
RGF0YSA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PEltYWdlRGF0YT4oVjhDbGFzc0luZGV4OjpJ
TUFHRURBVEEsIGFyZ3NbMF0pOworICAgIGlmIChWOFByb3h5Ojppc1dyYXBwZXJPZlR5cGUoYXJn
c1swXSwgVjhDbGFzc0luZGV4OjpJTUFHRURBVEEpKQorICAgICAgICBpbWFnZURhdGEgPSBWOFBy
b3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8SW1hZ2VEYXRhPihWOENsYXNzSW5kZXg6OklNQUdF
REFUQSwgYXJnc1swXSk7CiAKICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKIApAQCAtNDE1LDcg
KzQxNSw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250ZXgKICAgICAg
ICAgY29udGV4dC0+cHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgdG9GbG9hdChhcmdzWzFdKSwgdG9G
bG9hdChhcmdzWzJdKSwgZWMpOwogCiAgICAgaWYgKGVjICE9IDApIHsKLSAgICAgICAgVjhQcm94
eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICAgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9u
KGVjKTsKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAgICAgfQog
CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOENsaWVudFJlY3RMaXN0Q3VzdG9t
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOENsaWVudFJl
Y3RMaXN0Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOENsaWVudFJlY3RMaXN0Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQs
MTIgKzQ0LDEyIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIElOREVYRURfUFJPUEVSVFlfR0VUVEVS
KENsaWVudFJlY3RMaXN0KQogewogICAgIElOQ19TVEFUUygiRE9NLkNsaWVudFJlY3RMaXN0Lklu
ZGV4ZWRQcm9wZXJ0eUdldHRlciIpOwotICAgIENsaWVudFJlY3RMaXN0KiBpbXAgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxDbGllbnRSZWN0TGlzdD4oVjhDbGFzc0luZGV4OjpDTElFTlRSRUNU
TElTVCwgaW5mby5Ib2xkZXIoKSk7CisgICAgQ2xpZW50UmVjdExpc3QqIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxDbGllbnRSZWN0TGlzdD4oVjhDbGFzc0luZGV4OjpDTElF
TlRSRUNUTElTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgUmVmUHRyPENsaWVudFJlY3Q+IHJlc3Vs
dCA9IGltcC0+aXRlbShpbmRleCk7CiAgICAgaWYgKCFyZXN1bHQpCiAgICAgICAgIHJldHVybiBu
b3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogCi0gICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmpl
Y3QoVjhDbGFzc0luZGV4OjpDTElFTlRSRUNULCByZXN1bHQuZ2V0KCkpOworICAgIHJldHVybiBW
OFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNMSUVOVFJFQ1QsIHJlc3Vs
dC5nZXQoKSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4Q2xpcGJvYXJkQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOENsaXBib2FyZEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1
MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDbGlwYm9hcmRDdXN0b20uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC00Nyw3ICs0Nyw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIEFD
Q0VTU09SX0dFVFRFUihDbGlwYm9hcmRUeXBlcykKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5DbGlw
Ym9hcmQudHlwZXMoKSIpOwotICAgIENsaXBib2FyZCogY2xpcGJvYXJkID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8Q2xpcGJvYXJkPihWOENsYXNzSW5kZXg6OkNMSVBCT0FSRCwgaW5mby5Ib2xk
ZXIoKSk7CisgICAgQ2xpcGJvYXJkKiBjbGlwYm9hcmQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRp
dmVPYmplY3Q8Q2xpcGJvYXJkPihWOENsYXNzSW5kZXg6OkNMSVBCT0FSRCwgaW5mby5Ib2xkZXIo
KSk7CiAKICAgICBIYXNoU2V0PFN0cmluZz4gdHlwZXMgPSBjbGlwYm9hcmQtPnR5cGVzKCk7CiAg
ICAgaWYgKHR5cGVzLmlzRW1wdHkoKSkKQEAgLTY1LDcgKzY1LDcgQEAgQUNDRVNTT1JfR0VUVEVS
KENsaXBib2FyZFR5cGVzKQogQ0FMTEJBQ0tfRlVOQ19ERUNMKENsaXBib2FyZENsZWFyRGF0YSkK
IHsKICAgICBJTkNfU1RBVFMoIkRPTS5DbGlwYm9hcmQuY2xlYXJEYXRhKCkiKTsKLSAgICBDbGlw
Ym9hcmQqIGNsaXBib2FyZCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENsaXBib2FyZD4oVjhD
bGFzc0luZGV4OjpDTElQQk9BUkQsIGFyZ3MuSG9sZGVyKCkpOworICAgIENsaXBib2FyZCogY2xp
cGJvYXJkID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENsaXBib2FyZD4oVjhDbGFz
c0luZGV4OjpDTElQQk9BUkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgaWYgKCFhcmdzLkxlbmd0
aCgpKSB7CiAgICAgICAgIGNsaXBib2FyZC0+Y2xlYXJBbGxEYXRhKCk7CkBAIC04Myw3ICs4Myw3
IEBAIENBTExCQUNLX0ZVTkNfREVDTChDbGlwYm9hcmRDbGVhckRhdGEpCiBDQUxMQkFDS19GVU5D
X0RFQ0woQ2xpcGJvYXJkR2V0RGF0YSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5DbGlwYm9hcmQu
Z2V0RGF0YSgpIik7Ci0gICAgQ2xpcGJvYXJkKiBjbGlwYm9hcmQgPSBWOFByb3h5OjpUb05hdGl2
ZU9iamVjdDxDbGlwYm9hcmQ+KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBhcmdzLkhvbGRlcigp
KTsKKyAgICBDbGlwYm9hcmQqIGNsaXBib2FyZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxDbGlwYm9hcmQ+KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBhcmdzLkhvbGRlcigpKTsK
IAogICAgIGlmIChhcmdzLkxlbmd0aCgpICE9IDEpCiAgICAgICAgIHJldHVybiB0aHJvd0Vycm9y
KCJnZXREYXRhOiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiLCBWOFByb3h5OjpTWU5UQVhf
RVJST1IpOwpAQCAtOTksNyArOTksNyBAQCBDQUxMQkFDS19GVU5DX0RFQ0woQ2xpcGJvYXJkR2V0
RGF0YSkKIENBTExCQUNLX0ZVTkNfREVDTChDbGlwYm9hcmRTZXREYXRhKQogewogICAgIElOQ19T
VEFUUygiRE9NLkNsaXBib2FyZC5zZXREYXRhKCkiKTsKLSAgICBDbGlwYm9hcmQqIGNsaXBib2Fy
ZCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENsaXBib2FyZD4oVjhDbGFzc0luZGV4OjpDTElQ
Qk9BUkQsIGFyZ3MuSG9sZGVyKCkpOworICAgIENsaXBib2FyZCogY2xpcGJvYXJkID0gVjhQcm94
eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PENsaXBib2FyZD4oVjhDbGFzc0luZGV4OjpDTElQQk9B
UkQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgIT0gMikKICAgICAg
ICAgcmV0dXJuIHRocm93RXJyb3IoInNldERhdGE6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50
cyIsIFY4UHJveHk6OlNZTlRBWF9FUlJPUik7CkBAIC0xMTIsNyArMTEyLDcgQEAgQ0FMTEJBQ0tf
RlVOQ19ERUNMKENsaXBib2FyZFNldERhdGEpCiBDQUxMQkFDS19GVU5DX0RFQ0woQ2xpcGJvYXJk
U2V0RHJhZ0ltYWdlKQogewogICAgIElOQ19TVEFUUygiRE9NLkNsaXBib2FyZC5zZXREcmFnSW1h
Z2UoKSIpOwotICAgIENsaXBib2FyZCogY2xpcGJvYXJkID0gVjhQcm94eTo6VG9OYXRpdmVPYmpl
Y3Q8Q2xpcGJvYXJkPihWOENsYXNzSW5kZXg6OkNMSVBCT0FSRCwgYXJncy5Ib2xkZXIoKSk7Cisg
ICAgQ2xpcGJvYXJkKiBjbGlwYm9hcmQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8
Q2xpcGJvYXJkPihWOENsYXNzSW5kZXg6OkNMSVBCT0FSRCwgYXJncy5Ib2xkZXIoKSk7CiAKICAg
ICBpZiAoIWNsaXBib2FyZC0+aXNGb3JEcmFnZ2luZygpKQogICAgICAgICByZXR1cm4gdjg6OlVu
ZGVmaW5lZCgpOwpAQCAtMTI1LDcgKzEyNSw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChDbGlwYm9h
cmRTZXREcmFnSW1hZ2UKIAogICAgIE5vZGUqIG5vZGUgPSAwOwogICAgIGlmIChWOE5vZGU6Okhh
c0luc3RhbmNlKGFyZ3NbMF0pKQotICAgICAgICBub2RlID0gVjhQcm94eTo6RE9NV3JhcHBlclRv
Tm9kZTxOb2RlPihhcmdzWzBdKTsKKyAgICAgICAgbm9kZSA9IFY4UHJveHk6OmNvbnZlcnRET01X
cmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0pOwogCiAgICAgaWYgKCFub2RlIHx8ICFub2RlLT5p
c0VsZW1lbnROb2RlKCkpCiAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCJzZXREcmFnSW1hZ2VG
cm9tRWxlbWVudDogSW52YWxpZCBmaXJzdCBhcmd1bWVudCIpOwpJbmRleDogV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhDdXN0b21CaW5kaW5nLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbUJpbmRpbmcuY3BwCShyZXZpc2lvbiA0NTIxNikK
KysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tQmluZGluZy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTUxLDcgKzUxLDcgQEAgYm9vbCBhbGxvd1NldHRpbmdGcmFtZVNyY1RvSmF2
YXNjcmlwdFVybAogewogICAgIGlmIChwcm90b2NvbElzKHBhcnNlVVJMKHZhbHVlKSwgImphdmFz
Y3JpcHQiKSkgewogICAgICAgICBOb2RlKiBjb250ZW50RG9jID0gZnJhbWUtPmNvbnRlbnREb2N1
bWVudCgpOwotICAgICAgICBpZiAoY29udGVudERvYyAmJiAhVjhQcm94eTo6Q2hlY2tOb2RlU2Vj
dXJpdHkoY29udGVudERvYykpCisgICAgICAgIGlmIChjb250ZW50RG9jICYmICFWOFByb3h5Ojpj
aGVja05vZGVTZWN1cml0eShjb250ZW50RG9jKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
ICAgICB9CiAgICAgcmV0dXJuIHRydWU7CkBAIC04Miw4ICs4Miw4IEBAIEFDQ0VTU09SX0dFVFRF
UihEb2N1bWVudEltcGxlbWVudGF0aW9uKQogICAgICAgICByZXR1cm4gaW1wbGVtZW50YXRpb247
CiAKICAgICAvLyBHZW5lcmF0ZSBhIHdyYXBwZXIuCi0gICAgRG9jdW1lbnQqIGRvY3VtZW50ID0g
VjhQcm94eTo6RE9NV3JhcHBlclRvTmF0aXZlPERvY3VtZW50PihpbmZvLkhvbGRlcigpKTsKLSAg
ICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd3JhcHBlciA9IFY4UHJveHk6OkRPTUltcGxlbWVudGF0
aW9uVG9WOE9iamVjdChkb2N1bWVudC0+aW1wbGVtZW50YXRpb24oKSk7CisgICAgRG9jdW1lbnQq
IGRvY3VtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxEb2N1bWVudD4o
aW5mby5Ib2xkZXIoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdyYXBwZXIgPSBWOFBy
b3h5Ojpjb252ZXJ0RE9NSW1wbGVtZW50YXRpb25Ub1Y4T2JqZWN0KGRvY3VtZW50LT5pbXBsZW1l
bnRhdGlvbigpKTsKIAogICAgIC8vIFN0b3JlIHRoZSB3cmFwcGVyIGluIHRoZSBpbnRlcm5hbCBm
aWVsZC4KICAgICBpbmZvLkhvbGRlcigpLT5TZXRJbnRlcm5hbEZpZWxkKGtEb2N1bWVudEltcGxl
bWVudGF0aW9uSW5kZXgsIHdyYXBwZXIpOwpAQCAtOTYsMTYgKzk2LDE2IEBAIElOREVYRURfQUND
RVNTX0NIRUNLKEhpc3RvcnkpCiB7CiAgICAgQVNTRVJUKFY4Q2xhc3NJbmRleDo6RnJvbUludChk
YXRhLT5JbnQzMlZhbHVlKCkpID09IFY4Q2xhc3NJbmRleDo6SElTVE9SWSk7CiAgICAgLy8gT25s
eSBhbGxvdyBzYW1lIG9yaWdpbiBhY2Nlc3MuCi0gICAgSGlzdG9yeSogaGlzdG9yeSA9IFY4UHJv
eHk6OlRvTmF0aXZlT2JqZWN0PEhpc3Rvcnk+KFY4Q2xhc3NJbmRleDo6SElTVE9SWSwgaG9zdCk7
Ci0gICAgcmV0dXJuIFY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGhpc3RvcnktPmZyYW1lKCksIGZh
bHNlKTsKKyAgICBIaXN0b3J5KiBoaXN0b3J5ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2Jq
ZWN0PEhpc3Rvcnk+KFY4Q2xhc3NJbmRleDo6SElTVE9SWSwgaG9zdCk7CisgICAgcmV0dXJuIFY4
UHJveHk6OmNhbkFjY2Vzc0ZyYW1lKGhpc3RvcnktPmZyYW1lKCksIGZhbHNlKTsKIH0KIAogTkFN
RURfQUNDRVNTX0NIRUNLKEhpc3RvcnkpCiB7CiAgICAgQVNTRVJUKFY4Q2xhc3NJbmRleDo6RnJv
bUludChkYXRhLT5JbnQzMlZhbHVlKCkpID09IFY4Q2xhc3NJbmRleDo6SElTVE9SWSk7CiAgICAg
Ly8gT25seSBhbGxvdyBzYW1lIG9yaWdpbiBhY2Nlc3MuCi0gICAgSGlzdG9yeSogaGlzdG9yeSA9
IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PEhpc3Rvcnk+KFY4Q2xhc3NJbmRleDo6SElTVE9SWSwg
aG9zdCk7Ci0gICAgcmV0dXJuIFY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGhpc3RvcnktPmZyYW1l
KCksIGZhbHNlKTsKKyAgICBIaXN0b3J5KiBoaXN0b3J5ID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PEhpc3Rvcnk+KFY4Q2xhc3NJbmRleDo6SElTVE9SWSwgaG9zdCk7CisgICAgcmV0
dXJuIFY4UHJveHk6OmNhbkFjY2Vzc0ZyYW1lKGhpc3RvcnktPmZyYW1lKCksIGZhbHNlKTsKIH0K
IAogI3VuZGVmIElOREVYRURfQUNDRVNTX0NIRUNLCkBAIC0xMTgsMjEgKzExOCwyMSBAQCBGcmFt
ZSogVjhDdXN0b206OkdldFRhcmdldEZyYW1lKHY4OjpMb2NhCiAgICAgRnJhbWUqIHRhcmdldCA9
IDA7CiAgICAgc3dpdGNoIChWOENsYXNzSW5kZXg6OkZyb21JbnQoZGF0YS0+SW50MzJWYWx1ZSgp
KSkgewogICAgIGNhc2UgVjhDbGFzc0luZGV4OjpET01XSU5ET1c6IHsKLSAgICAgICAgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IHdpbmRvdyA9IFY4UHJveHk6Okxvb2t1cERPTVdyYXBwZXIoVjhDbGFz
c0luZGV4OjpET01XSU5ET1csIGhvc3QpOworICAgICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4g
d2luZG93ID0gVjhQcm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRP
VywgaG9zdCk7CiAgICAgICAgIGlmICh3aW5kb3cuSXNFbXB0eSgpKQogICAgICAgICAgICAgcmV0
dXJuIHRhcmdldDsKIAotICAgICAgICBET01XaW5kb3cqIHRhcmdldFdpbmRvdyA9IFY4UHJveHk6
OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIHdpbmRv
dyk7CisgICAgICAgIERPTVdpbmRvdyogdGFyZ2V0V2luZG93ID0gVjhQcm94eTo6Y29udmVydFRv
TmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIHdpbmRvdyk7
CiAgICAgICAgIHRhcmdldCA9IHRhcmdldFdpbmRvdy0+ZnJhbWUoKTsKICAgICAgICAgYnJlYWs7
CiAgICAgfQogICAgIGNhc2UgVjhDbGFzc0luZGV4OjpMT0NBVElPTjogewotICAgICAgICBIaXN0
b3J5KiBoaXN0b3J5ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SGlzdG9yeT4oVjhDbGFzc0lu
ZGV4OjpISVNUT1JZLCBob3N0KTsKKyAgICAgICAgSGlzdG9yeSogaGlzdG9yeSA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIaXN0b3J5PihWOENsYXNzSW5kZXg6OkhJU1RPUlksIGhv
c3QpOwogICAgICAgICB0YXJnZXQgPSBoaXN0b3J5LT5mcmFtZSgpOwogICAgICAgICBicmVhazsK
ICAgICB9CiAgICAgY2FzZSBWOENsYXNzSW5kZXg6OkhJU1RPUlk6IHsKLSAgICAgICAgTG9jYXRp
b24qIGxvY2F0aW9uID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJ
bmRleDo6TE9DQVRJT04sIGhvc3QpOworICAgICAgICBMb2NhdGlvbiogbG9jYXRpb24gPSBWOFBy
b3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJ
T04sIGhvc3QpOwogICAgICAgICB0YXJnZXQgPSBsb2NhdGlvbi0+ZnJhbWUoKTsKICAgICAgICAg
YnJlYWs7CiAgICAgfQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21F
dmVudExpc3RlbmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOEN1c3RvbUV2ZW50TGlzdGVuZXIuY3BwCShyZXZpc2lvbiA0NTIxNikKKysrIFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tRXZlbnRMaXN0ZW5lci5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTQwLDcgKzQwLDcgQEAgVjhFdmVudExpc3RlbmVyOjpWOEV2ZW50TGlzdGVuZXIoRnJh
bWUqIAogewogICAgIG1fbGlzdGVuZXIgPSB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3
KGxpc3RlbmVyKTsKICNpZm5kZWYgTkRFQlVHCi0gICAgVjhQcm94eTo6UmVnaXN0ZXJHbG9iYWxI
YW5kbGUoRVZFTlRfTElTVEVORVIsIHRoaXMsIG1fbGlzdGVuZXIpOworICAgIFY4UHJveHk6OnJl
Z2lzdGVyR2xvYmFsSGFuZGxlKEVWRU5UX0xJU1RFTkVSLCB0aGlzLCBtX2xpc3RlbmVyKTsKICNl
bmRpZgogfQogCkBAIC00OSw3ICs0OSw3IEBAIFY4RXZlbnRMaXN0ZW5lcjo6flY4RXZlbnRMaXN0
ZW5lcigpCiAgICAgaWYgKG1fZnJhbWUpIHsKICAgICAgICAgVjhQcm94eSogcHJveHkgPSBWOFBy
b3h5OjpyZXRyaWV2ZShtX2ZyYW1lKTsKICAgICAgICAgaWYgKHByb3h5KQotICAgICAgICAgICAg
cHJveHktPlJlbW92ZVY4RXZlbnRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIHByb3h5LT5y
ZW1vdmVWOEV2ZW50TGlzdGVuZXIodGhpcyk7CiAgICAgfQogCiAgICAgZGlzcG9zZUxpc3RlbmVy
T2JqZWN0KCk7CkBAIC04Myw3ICs4Myw3IEBAIHY4OjpMb2NhbDx2ODo6VmFsdWU+IFY4RXZlbnRM
aXN0ZW5lcjo6Y2EKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcGFyYW1ldGVyc1sxXSA9IHsg
anNFdmVudCB9OwogCiAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShtX2Zy
YW1lKTsKLSAgICByZXR1cm4gcHJveHktPkNhbGxGdW5jdGlvbihoYW5kbGVyRnVuY3Rpb24sIHJl
Y2VpdmVyLCAxLCBwYXJhbWV0ZXJzKTsKKyAgICByZXR1cm4gcHJveHktPmNhbGxGdW5jdGlvbiho
YW5kbGVyRnVuY3Rpb24sIHJlY2VpdmVyLCAxLCBwYXJhbWV0ZXJzKTsKIH0KIAogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21T
UUxTdGF0ZW1lbnRDYWxsYmFjay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhDdXN0b21TUUxTdGF0ZW1lbnRDYWxsYmFjay5jcHAJKHJldmlzaW9uIDQ1MjE2
KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxTdGF0ZW1lbnRDYWxs
YmFjay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU0LDE1ICs1NCwxNSBAQCB2b2lkIFY4Q3VzdG9t
U1FMU3RhdGVtZW50Q2FsbGJhY2s6OmhhbmRsCiB7CiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRs
ZVNjb3BlOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6
OkdldENvbnRleHQobV9mcmFtZS5nZXQoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4g
Y29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQobV9mcmFtZS5nZXQoKSk7CiAgICAgaWYgKGNvbnRl
eHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKICAgICB2ODo6Q29udGV4dDo6U2NvcGUg
c2NvcGUoY29udGV4dCk7CiAKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJndltdID0gewot
ICAgICAgICBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMVFJBTlNBQ1RJT04s
IHRyYW5zYWN0aW9uKSwKLSAgICAgICAgVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6
OlNRTFJFU1VMVFNFVCwgcmVzdWx0U2V0KQorICAgICAgICBWOFByb3h5Ojpjb252ZXJ0VG9WOE9i
amVjdChWOENsYXNzSW5kZXg6OlNRTFRSQU5TQUNUSU9OLCB0cmFuc2FjdGlvbiksCisgICAgICAg
IFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMUkVTVUxUU0VULCBy
ZXN1bHRTZXQpCiAgICAgfTsKIAogICAgIC8vIFByb3RlY3QgdGhlIGZyYW1lIHVudGlsIHRoZSBj
YWxsYmFjayByZXR1cm5zLgpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0
b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2suY3BwCShy
ZXZpc2lvbiA0NTIxNikKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tU1FM
U3RhdGVtZW50RXJyb3JDYWxsYmFjay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU0LDE1ICs1NCwx
NSBAQCBib29sIFY4Q3VzdG9tU1FMU3RhdGVtZW50RXJyb3JDYWxsYmFjazo6CiB7CiAgICAgdjg6
OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4g
Y29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQobV9mcmFtZS5nZXQoKSk7CisgICAgdjg6Okhh
bmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQobV9mcmFtZS5nZXQo
KSk7CiAgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAog
ICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKIAogICAgIHY4OjpIYW5kbGU8
djg6OlZhbHVlPiBhcmd2W10gPSB7Ci0gICAgICAgIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFz
c0luZGV4OjpTUUxUUkFOU0FDVElPTiwgdHJhbnNhY3Rpb24pLAotICAgICAgICBWOFByb3h5OjpU
b1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMRVJST1IsIGVycm9yKQorICAgICAgICBWOFByb3h5
Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlNRTFRSQU5TQUNUSU9OLCB0cmFuc2Fj
dGlvbiksCisgICAgICAgIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6
U1FMRVJST1IsIGVycm9yKQogICAgIH07CiAKICAgICAvLyBQcm90ZWN0IHRoZSBmcmFtZSB1bnRp
bCB0aGUgY2FsbGJhY2sgcmV0dXJucy4KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4Q3VzdG9tU1FMVHJhbnNhY3Rpb25DYWxsYmFjay5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrLmNwcAko
cmV2aXNpb24gNDUyMTYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNR
TFRyYW5zYWN0aW9uQ2FsbGJhY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NSwxNCArNTUsMTQg
QEAgdm9pZCBWOEN1c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJhY2s6OmhhbgogewogICAgIHY4OjpI
YW5kbGVTY29wZSBoYW5kbGVTY29wZTsKIAotICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNv
bnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KG1fZnJhbWUuZ2V0KCkpOworICAgIHY4OjpIYW5k
bGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KG1fZnJhbWUuZ2V0KCkp
OwogICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgdjg6
OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOwogCiAgICAgdjg6OkhhbmRsZTx2ODo6VmFs
dWU+IGFyZ3ZbXSA9IHsKLSAgICAgICAgVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6
OlNRTFRSQU5TQUNUSU9OLCB0cmFuc2FjdGlvbikKKyAgICAgICAgVjhQcm94eTo6Y29udmVydFRv
VjhPYmplY3QoVjhDbGFzc0luZGV4OjpTUUxUUkFOU0FDVElPTiwgdHJhbnNhY3Rpb24pCiAgICAg
fTsKIAogICAgIC8vIFByb3RlY3QgdGhlIGZyYW1lIHVudGlsIHRoZSBjYWxsYmFjayByZXR1cm5z
LgpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxUcmFuc2FjdGlv
bkVycm9yQ2FsbGJhY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4Q3VzdG9tU1FMVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrLmNwcAkocmV2aXNpb24gNDUy
MTYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFRyYW5zYWN0aW9u
RXJyb3JDYWxsYmFjay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU0LDE0ICs1NCwxNCBAQCB2b2lk
IFY4Q3VzdG9tU1FMVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrCiB7CiAgICAgdjg6OkhhbmRsZVNj
b3BlIGhhbmRsZVNjb3BlOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9
IFY4UHJveHk6OkdldENvbnRleHQobV9mcmFtZS5nZXQoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6
Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQobV9mcmFtZS5nZXQoKSk7CiAgICAg
aWYgKGNvbnRleHQuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKICAgICB2ODo6Q29udGV4
dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CiAKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJn
dltdID0gewotICAgICAgICBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMRVJS
T1IsIGVycm9yKQorICAgICAgICBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5k
ZXg6OlNRTEVSUk9SLCBlcnJvcikKICAgICB9OwogCiAgICAgLy8gUHJvdGVjdCB0aGUgZnJhbWUg
dW50aWwgdGhlIGNhbGxiYWNrIHJldHVybnMuCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOEN1c3RvbVZvaWRDYWxsYmFjay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhDdXN0b21Wb2lkQ2FsbGJhY2suY3BwCShyZXZpc2lvbiA0NTIxNikK
KysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tVm9pZENhbGxiYWNrLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNTAsNyArNTAsNyBAQCB2b2lkIFY4Q3VzdG9tVm9pZENhbGxiYWNr
OjpoYW5kbGVFdmVudCgpCiB7CiAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOwogCi0g
ICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQo
bV9mcmFtZS5nZXQoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4
UHJveHk6OmNvbnRleHQobV9mcmFtZS5nZXQoKSk7CiAgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgp
KQogICAgICAgICByZXR1cm47CiAKQEAgLTg3LDcgKzg3LDcgQEAgYm9vbCBpbnZva2VDYWxsYmFj
ayh2ODo6UGVyc2lzdGVudDx2ODo6TwogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0
cmlldmUoKTsKICAgICBBU1NFUlQocHJveHkpOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+
IHJlc3VsdCA9IHByb3h5LT5DYWxsRnVuY3Rpb24oY2FsbGJhY2tGdW5jdGlvbiwgdGhpc09iamVj
dCwgYXJnYywgYXJndik7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJlc3VsdCA9IHByb3h5
LT5jYWxsRnVuY3Rpb24oY2FsbGJhY2tGdW5jdGlvbiwgdGhpc09iamVjdCwgYXJnYywgYXJndik7
CiAKICAgICBjYWxsYmFja1JldHVyblZhbHVlID0gcmVzdWx0LklzRW1wdHkoKSAmJiByZXN1bHQt
PklzQm9vbGVhbigpICYmIHJlc3VsdC0+Qm9vbGVhblZhbHVlKCk7CiAKSW5kZXg6IFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tWFBhdGhOU1Jlc29sdmVyLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVhQYXRoTlNSZXNvbHZlci5j
cHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0
b21YUGF0aE5TUmVzb2x2ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MSw3ICs2MSw3IEBAIFN0
cmluZyBWOEN1c3RvbVhQYXRoTlNSZXNvbHZlcjo6bG9va3VwTmEKIAogICAgIGlmIChsb29rdXBO
YW1lc3BhY2VVUklGdW5jLklzRW1wdHkoKSAmJiAhbV9yZXNvbHZlci0+SXNGdW5jdGlvbigpKSB7
CiAgICAgICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JFbnRlcmVk
Q29udGV4dCgpOwotICAgICAgICBsb2dfaW5mbyhmcmFtZSwgIlhQYXRoTlNSZXNvbHZlciBkb2Vz
IG5vdCBoYXZlIGEgbG9va3VwTmFtZXNwYWNlVVJJIG1ldGhvZC4iLCBTdHJpbmcoKSk7CisgICAg
ICAgIGxvZ0luZm8oZnJhbWUsICJYUGF0aE5TUmVzb2x2ZXIgZG9lcyBub3QgaGF2ZSBhIGxvb2t1
cE5hbWVzcGFjZVVSSSBtZXRob2QuIiwgU3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gU3RyaW5n
KCk7CiAgICAgfQogCkBAIC03NCw3ICs3NCw3IEBAIFN0cmluZyBWOEN1c3RvbVhQYXRoTlNSZXNv
bHZlcjo6bG9va3VwTmEKICAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4gZnVuY3Rpb24gPSBs
b29rdXBOYW1lc3BhY2VVUklGdW5jLklzRW1wdHkoKSA/IHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9u
Pjo6Q2FzdChtX3Jlc29sdmVyKSA6IGxvb2t1cE5hbWVzcGFjZVVSSUZ1bmM7CiAKICAgICBWOFBy
b3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKCk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6VmFs
dWU+IHJldHZhbCA9IHByb3h5LT5DYWxsRnVuY3Rpb24oZnVuY3Rpb24sIG1fcmVzb2x2ZXIsIGFy
Z2MsIGFyZ3YpOworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiByZXR2YWwgPSBwcm94eS0+Y2Fs
bEZ1bmN0aW9uKGZ1bmN0aW9uLCBtX3Jlc29sdmVyLCBhcmdjLCBhcmd2KTsKIAogICAgIC8vIEVh
dCBleGNlcHRpb25zIGZyb20gbmFtZXNwYWNlIHJlc29sdmVyIGFuZCByZXR1cm4gYW4gZW1wdHkg
c3RyaW5nLiBUaGlzIHdpbGwgbW9zdCBsaWtlbHkgY2F1c2UgTkFNRVNQQUNFX0VSUi4KICAgICBp
ZiAodHJ5X2NhdGNoLkhhc0NhdWdodCgpKQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhET01QYXJzZXJDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhET01QYXJzZXJDb25zdHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDQ1MjE2
KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhET01QYXJzZXJDb25zdHJ1Y3Rvci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTM5LDcgKzM5LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewog
Q0FMTEJBQ0tfRlVOQ19ERUNMKERPTVBhcnNlckNvbnN0cnVjdG9yKQogewogICAgIElOQ19TVEFU
UygiRE9NLkRPTVBhcnNlci5Db250cnVjdG9yIik7Ci0gICAgcmV0dXJuIFY4UHJveHk6OkNvbnN0
cnVjdERPTU9iamVjdDxWOENsYXNzSW5kZXg6OkRPTVBBUlNFUiwgRE9NUGFyc2VyPihhcmdzKTsK
KyAgICByZXR1cm4gVjhQcm94eTo6Y29uc3RydWN0RE9NT2JqZWN0PFY4Q2xhc3NJbmRleDo6RE9N
UEFSU0VSLCBET01QYXJzZXI+KGFyZ3MpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCklu
ZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERPTVdpbmRvd0N1c3RvbS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhET01XaW5kb3dDdXN0b20u
Y3BwCShyZXZpc2lvbiA0NTIxNikKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RE9N
V2luZG93Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjQsMTIgKzY0LDEyIEBAIHY4OjpI
YW5kbGU8djg6OlZhbHVlPiBWOEN1c3RvbTo6V2luZG93U2UKICAgICBpZiAoYXJndW1lbnRDb3Vu
dCA8IDEpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICBET01XaW5kb3cq
IGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpE
T01XSU5ET1csIGFyZ3MuSG9sZGVyKCkpOworICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6
Y29udmVydFRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1cs
IGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgaWYgKCFpbXAtPmZyYW1lKCkpCiAgICAgICAgIHJldHVy
biB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICBpZiAoIVY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGlt
cC0+ZnJhbWUoKSwgdHJ1ZSkpCisgICAgaWYgKCFWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZShpbXAt
PmZyYW1lKCksIHRydWUpKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCiAgICAg
U2NyaXB0RXhlY3V0aW9uQ29udGV4dCogc2NyaXB0Q29udGV4dCA9IHN0YXRpY19jYXN0PFNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQqPihpbXAtPmZyYW1lKCktPmRvY3VtZW50KCkpOwpAQCAtMTI0LDcg
KzEyNCw3IEBAIHN0YXRpYyBib29sIGlzQXNjaWkoY29uc3QgU3RyaW5nJiBzdHIpCiBzdGF0aWMg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnRCYXNlNjQoY29uc3QgU3RyaW5nJiBzdHIsIGJv
b2wgZW5jb2RlKQogewogICAgIGlmICghaXNBc2NpaShzdHIpKSB7Ci0gICAgICAgIFY4UHJveHk6
OlNldERPTUV4Y2VwdGlvbihJTlZBTElEX0NIQVJBQ1RFUl9FUlIpOworICAgICAgICBWOFByb3h5
OjpzZXRET01FeGNlcHRpb24oSU5WQUxJRF9DSEFSQUNURVJfRVJSKTsKICAgICAgICAgcmV0dXJu
IG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAgICAgfQogCkBAIC0xNjEsMjAgKzE2MSwyMCBA
QCBBQ0NFU1NPUl9HRVRURVIoRE9NV2luZG93Q3J5cHRvKQogCiBBQ0NFU1NPUl9TRVRURVIoRE9N
V2luZG93TG9jYXRpb24pCiB7Ci0gICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBW
OFByb3h5OjpMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRo
aXMoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5Ojpsb29r
dXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRoaXMoKSk7CiAgICAg
aWYgKGhvbGRlci5Jc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIERPTVdpbmRvdyog
aW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRP
TVdJTkRPVywgaG9sZGVyKTsKKyAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRU
b05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIp
OwogICAgIFdpbmRvd1NldExvY2F0aW9uKGltcCwgdG9XZWJDb3JlU3RyaW5nKHZhbHVlKSk7CiB9
CiAKIAogQUNDRVNTT1JfU0VUVEVSKERPTVdpbmRvd09wZW5lcikKIHsKLSAgICBET01XaW5kb3cq
IGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpE
T01XSU5ET1csIGluZm8uSG9sZGVyKCkpOworICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6
Y29udmVydFRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1cs
IGluZm8uSG9sZGVyKCkpOwogCi0gICAgaWYgKCFWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShpbXAt
PmZyYW1lKCksIHRydWUpKQorICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5m
cmFtZSgpLCB0cnVlKSkKICAgICAgICAgcmV0dXJuOwogICAKICAgICAvLyBPcGVuZXIgY2FuIGJl
IHNoYWRvd2VkIGlmIGl0IGlzIGluIHRoZSBzYW1lIGRvbWFpbi4KQEAgLTE5Nyw5ICsxOTcsOSBA
QCBBQ0NFU1NPUl9TRVRURVIoRE9NV2luZG93T3BlbmVyKQogQ0FMTEJBQ0tfRlVOQ19ERUNMKERP
TVdpbmRvd0FkZEV2ZW50TGlzdGVuZXIpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uRE9NV2luZG93
LmFkZEV2ZW50TGlzdGVuZXIoKSIpOwotICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xk
ZXIoKSk7CisgICAgRE9NV2luZG93KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmpl
Y3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7CiAK
LSAgICBpZiAoIVY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgdHJ1ZSkpCisg
ICAgaWYgKCFWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUpKQogICAg
ICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCiAgICAgaWYgKCFpbXAtPmZyYW1lKCkpCkBA
IC0yMTQsNyArMjE0LDcgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKERPTVdpbmRvd0FkZEV2ZW50TGlz
dAogICAgIGlmICghcHJveHkpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAg
ICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+RmluZE9yQ3JlYXRlVjhF
dmVudExpc3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsKKyAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4g
bGlzdGVuZXIgPSBwcm94eS0+ZmluZE9yQ3JlYXRlVjhFdmVudExpc3RlbmVyKGFyZ3NbMV0sIGZh
bHNlKTsKIAogICAgIGlmIChsaXN0ZW5lcikgewogICAgICAgICBTdHJpbmcgZXZlbnRUeXBlID0g
dG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwpAQCAtMjI5LDkgKzIyOSw5IEBAIENBTExCQUNLX0ZV
TkNfREVDTChET01XaW5kb3dBZGRFdmVudExpc3QKIENBTExCQUNLX0ZVTkNfREVDTChET01XaW5k
b3dSZW1vdmVFdmVudExpc3RlbmVyKQogewogICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5y
ZW1vdmVFdmVudExpc3RlbmVyKCkiKTsKLSAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OlRv
TmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGFyZ3MuSG9s
ZGVyKCkpOworICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2Jq
ZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGFyZ3MuSG9sZGVyKCkpOwog
Ci0gICAgaWYgKCFWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUpKQor
ICAgIGlmICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKICAg
ICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAogICAgIGlmICghaW1wLT5mcmFtZSgpKQpA
QCAtMjQ1LDcgKzI0NSw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dSZW1vdmVFdmVu
dEwKICAgICBpZiAoIXByb3h5KQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0g
ICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPkZpbmRWOEV2ZW50TGlz
dGVuZXIoYXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5l
ciA9IHByb3h5LT5maW5kVjhFdmVudExpc3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsKIAogICAgIGlm
IChsaXN0ZW5lcikgewogICAgICAgICBTdHJpbmcgZXZlbnRUeXBlID0gdG9XZWJDb3JlU3RyaW5n
KGFyZ3NbMF0pOwpAQCAtMjU5LDcgKzI1OSw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChET01XaW5k
b3dSZW1vdmVFdmVudEwKIENBTExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dQb3N0TWVzc2FnZSkK
IHsKICAgICBJTkNfU1RBVFMoIkRPTS5ET01XaW5kb3cucG9zdE1lc3NhZ2UoKSIpOwotICAgIERP
TVdpbmRvdyogd2luZG93ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENs
YXNzSW5kZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7CisgICAgRE9NV2luZG93KiB3aW5k
b3cgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5k
ZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBET01XaW5kb3cqIHNvdXJjZSA9
IFY4UHJveHk6OnJldHJpZXZlRnJhbWVGb3JDYWxsaW5nQ29udGV4dCgpLT5kb21XaW5kb3coKTsK
ICAgICBBU1NFUlQoc291cmNlLT5mcmFtZSgpKTsKQEAgLTI3NSw4ICsyNzUsOCBAQCBDQUxMQkFD
S19GVU5DX0RFQ0woRE9NV2luZG93UG9zdE1lc3NhZ2UpCiAgICAgLy8gb3IKICAgICAvLyAgIHBv
c3RNZXNzYWdlKG1lc3NhZ2UsIHRhcmdldE9yaWdpbik7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkg
PiAyKSB7Ci0gICAgICAgIGlmIChWOFByb3h5OjpJc1dyYXBwZXJPZlR5cGUoYXJnc1sxXSwgVjhD
bGFzc0luZGV4OjpNRVNTQUdFUE9SVCkpCi0gICAgICAgICAgICBwb3J0ID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8TWVzc2FnZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIGFyZ3Nb
MV0pOworICAgICAgICBpZiAoVjhQcm94eTo6aXNXcmFwcGVyT2ZUeXBlKGFyZ3NbMV0sIFY4Q2xh
c3NJbmRleDo6TUVTU0FHRVBPUlQpKQorICAgICAgICAgICAgcG9ydCA9IFY4UHJveHk6OmNvbnZl
cnRUb05hdGl2ZU9iamVjdDxNZXNzYWdlUG9ydD4oVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwg
YXJnc1sxXSk7CiAgICAgICAgIHRhcmdldE9yaWdpbiA9IHZhbHVlVG9TdHJpbmdXaXRoTnVsbE9y
VW5kZWZpbmVkQ2hlY2soYXJnc1syXSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgdGFyZ2V0T3Jp
Z2luID0gdmFsdWVUb1N0cmluZ1dpdGhOdWxsT3JVbmRlZmluZWRDaGVjayhhcmdzWzFdKTsKQEAg
LTI4OCw3ICsyODgsNyBAQCBDQUxMQkFDS19GVU5DX0RFQ0woRE9NV2luZG93UG9zdE1lc3NhZ2Up
CiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAgd2luZG93LT5wb3N0TWVzc2FnZShtZXNz
YWdlLCBwb3J0LCB0YXJnZXRPcmlnaW4sIHNvdXJjZSwgZWMpOwogICAgIGlmIChlYykKLSAgICAg
ICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICAgICAgVjhQcm94eTo6c2V0RE9N
RXhjZXB0aW9uKGVjKTsKIAogICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiB9CkBAIC0yOTYs
OSArMjk2LDkgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKERPTVdpbmRvd1Bvc3RNZXNzYWdlKQogQ0FM
TEJBQ0tfRlVOQ19ERUNMKERPTVdpbmRvd0F0b2IpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uRE9N
V2luZG93LmF0b2IoKSIpOwotICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7
CisgICAgRE9NV2luZG93KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8RE9N
V2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7CiAKLSAgICBp
ZiAoIVY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgdHJ1ZSkpCisgICAgaWYg
KCFWOFByb3h5OjpjYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUpKQogICAgICAgICBy
ZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAxKQpAQCAt
MzE0LDkgKzMxNCw5IEBAIENBTExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dBdG9iKQogQ0FMTEJB
Q0tfRlVOQ19ERUNMKERPTVdpbmRvd0J0b2EpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uRE9NV2lu
ZG93LmJ0b2EoKSIpOwotICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmpl
Y3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7Cisg
ICAgRE9NV2luZG93KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8RE9NV2lu
ZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7CiAKLSAgICBpZiAo
IVY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgdHJ1ZSkpCisgICAgaWYgKCFW
OFByb3h5OjpjYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUpKQogICAgICAgICByZXR1
cm4gdjg6OlVuZGVmaW5lZCgpOwogCiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAxKQpAQCAtMzcz
LDExICszNzMsMTEgQEAgc3RhdGljIFN0cmluZyBldmVudE5hbWVGcm9tQXR0cmlidXRlTmFtZQog
CiBBQ0NFU1NPUl9TRVRURVIoRE9NV2luZG93RXZlbnRIYW5kbGVyKQogewotICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gaG9sZGVyID0gVjhQcm94eTo6TG9va3VwRE9NV3JhcHBlcihWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVywgaW5mby5UaGlzKCkpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVj
dD4gaG9sZGVyID0gVjhQcm94eTo6bG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJ
TkRPVywgaW5mby5UaGlzKCkpOwogICAgIGlmIChob2xkZXIuSXNFbXB0eSgpKQogICAgICAgICBy
ZXR1cm47CiAKLSAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERP
TVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGhvbGRlcik7CisgICAgRE9NV2luZG93
KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVywgaG9sZGVyKTsKICAgICBpZiAoIWltcC0+ZnJhbWUoKSkKICAgICAg
ICAgcmV0dXJuOwogCkBAIC0zOTcsNyArMzk3LDcgQEAgQUNDRVNTT1JfU0VUVEVSKERPTVdpbmRv
d0V2ZW50SGFuZGxlcikKICAgICAgICAgICAgIHJldHVybjsKIAogICAgICAgICBSZWZQdHI8RXZl
bnRMaXN0ZW5lcj4gbGlzdGVuZXIgPQotICAgICAgICAgICAgcHJveHktPkZpbmRPckNyZWF0ZVY4
RXZlbnRMaXN0ZW5lcih2YWx1ZSwgdHJ1ZSk7CisgICAgICAgICAgICBwcm94eS0+ZmluZE9yQ3Jl
YXRlVjhFdmVudExpc3RlbmVyKHZhbHVlLCB0cnVlKTsKICAgICAgICAgaWYgKGxpc3RlbmVyKQog
ICAgICAgICAgICAgaW1wLT5zZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlz
dGVuZXIpOwogICAgIH0KQEAgLTQwNSwxMSArNDA1LDExIEBAIEFDQ0VTU09SX1NFVFRFUihET01X
aW5kb3dFdmVudEhhbmRsZXIpCiAKIEFDQ0VTU09SX0dFVFRFUihET01XaW5kb3dFdmVudEhhbmRs
ZXIpCiB7Ci0gICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5OjpMb29r
dXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRoaXMoKSk7CisgICAg
djg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5Ojpsb29rdXBET01XcmFwcGVy
KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRoaXMoKSk7CiAgICAgaWYgKGhvbGRlci5J
c0VtcHR5KCkpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICBET01XaW5k
b3cqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4
OjpET01XSU5ET1csIGhvbGRlcik7CisgICAgRE9NV2luZG93KiBpbXAgPSBWOFByb3h5Ojpjb252
ZXJ0VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaG9s
ZGVyKTsKICAgICBpZiAoIWltcC0+ZnJhbWUoKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmlu
ZWQoKTsKIApAQCAtNDIxLDcgKzQyMSw3IEBAIEFDQ0VTU09SX0dFVFRFUihET01XaW5kb3dFdmVu
dEhhbmRsZXIpCiAgICAgU3RyaW5nIGV2ZW50VHlwZSA9IGV2ZW50TmFtZUZyb21BdHRyaWJ1dGVO
YW1lKGtleSk7CiAKICAgICBFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IGltcC0+Z2V0QXR0cmli
dXRlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUpOwotICAgIHJldHVybiBWOFByb3h5OjpFdmVudExp
c3RlbmVyVG9WOE9iamVjdChsaXN0ZW5lcik7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRF
dmVudExpc3RlbmVyVG9WOE9iamVjdChsaXN0ZW5lcik7CiB9CiAKIHN0YXRpYyBib29sIGNhblNo
b3dNb2RhbERpYWxvZ05vdyhjb25zdCBGcmFtZSogZnJhbWUpCkBAIC01MTgsNyArNTE4LDcgQEAg
c3RhdGljIEZyYW1lKiBjcmVhdGVXaW5kb3coRnJhbWUqIGNhbGxpbgogCiAgICAgLy8gU2V0IGRp
YWxvZyBhcmd1bWVudHMgb24gdGhlIGdsb2JhbCBvYmplY3Qgb2YgdGhlIG5ldyBmcmFtZS4KICAg
ICBpZiAoIWRpYWxvZ0FyZ3MuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6Q29u
dGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQobmV3RnJhbWUpOworICAgICAgICB2
ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5Ojpjb250ZXh0KG5ld0ZyYW1l
KTsKICAgICAgICAgaWYgKCFjb250ZXh0LklzRW1wdHkoKSkgewogICAgICAgICAgICAgdjg6OkNv
bnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOwogICAgICAgICAgICAgY29udGV4dC0+R2xvYmFs
KCktPlNldCh2ODo6U3RyaW5nOjpOZXcoImRpYWxvZ0FyZ3VtZW50cyIpLCBkaWFsb2dBcmdzKTsK
QEAgLTU0NCwxMSArNTQ0LDExIEBAIHN0YXRpYyBGcmFtZSogY3JlYXRlV2luZG93KEZyYW1lKiBj
YWxsaW4KIENBTExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dTaG93TW9kYWxEaWFsb2cpCiB7CiAg
ICAgSU5DX1NUQVRTKCJET00uRE9NV2luZG93LnNob3dNb2RhbERpYWxvZygpIik7Ci0gICAgRE9N
V2luZG93KiB3aW5kb3cgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KAorICAg
IERPTVdpbmRvdyogd2luZG93ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PERPTVdp
bmRvdz4oCiAgICAgICAgIFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsK
ICAgICBGcmFtZSogZnJhbWUgPSB3aW5kb3ctPmZyYW1lKCk7CiAKLSAgICBpZiAoIWZyYW1lIHx8
ICFWOFByb3h5OjpDYW5BY2Nlc3NGcmFtZShmcmFtZSwgdHJ1ZSkpIAorICAgIGlmICghZnJhbWUg
fHwgIVY4UHJveHk6OmNhbkFjY2Vzc0ZyYW1lKGZyYW1lLCB0cnVlKSkgCiAgICAgICAgIHJldHVy
biB2ODo6VW5kZWZpbmVkKCk7CiAKICAgICBGcmFtZSogY2FsbGluZ0ZyYW1lID0gVjhQcm94eTo6
cmV0cmlldmVGcmFtZUZvckNhbGxpbmdDb250ZXh0KCk7CkBAIC02MTEsNyArNjExLDcgQEAgQ0FM
TEJBQ0tfRlVOQ19ERUNMKERPTVdpbmRvd1Nob3dNb2RhbERpYQogCiAgICAgLy8gSG9sZCBvbiB0
byB0aGUgY29udGV4dCBvZiB0aGUgZGlhbG9nIHdpbmRvdyBsb25nIGVub3VnaCB0byByZXRyaWV2
ZSB0aGUKICAgICAvLyB2YWx1ZSBvZiB0aGUgcmV0dXJuIHZhbHVlIHByb3BlcnR5LgotICAgIHY4
OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQoZGlhbG9n
RnJhbWUpOworICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OmNv
bnRleHQoZGlhbG9nRnJhbWUpOwogCiAgICAgLy8gUnVuIHRoZSBkaWFsb2cuCiAgICAgZGlhbG9n
RnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCktPnJ1bk1vZGFsKCk7CkBAIC02MzMsMTAgKzYzMywxMCBA
QCBDQUxMQkFDS19GVU5DX0RFQ0woRE9NV2luZG93U2hvd01vZGFsRGlhCiBDQUxMQkFDS19GVU5D
X0RFQ0woRE9NV2luZG93T3BlbikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5ET01XaW5kb3cub3Bl
bigpIik7Ci0gICAgRE9NV2luZG93KiBwYXJlbnQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxE
T01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKKyAgICBE
T01XaW5kb3cqIHBhcmVudCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxET01XaW5k
b3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKICAgICBGcmFtZSog
ZnJhbWUgPSBwYXJlbnQtPmZyYW1lKCk7CiAKLSAgICBpZiAoIWZyYW1lIHx8ICFWOFByb3h5OjpD
YW5BY2Nlc3NGcmFtZShmcmFtZSwgdHJ1ZSkpCisgICAgaWYgKCFmcmFtZSB8fCAhVjhQcm94eTo6
Y2FuQWNjZXNzRnJhbWUoZnJhbWUsIHRydWUpKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5l
ZCgpOwogCiAgICAgRnJhbWUqIGNhbGxpbmdGcmFtZSA9IFY4UHJveHk6OnJldHJpZXZlRnJhbWVG
b3JDYWxsaW5nQ29udGV4dCgpOwpAQCAtNjkxLDcgKzY5MSw3IEBAIENBTExCQUNLX0ZVTkNfREVD
TChET01XaW5kb3dPcGVuKQogCiAgICAgICAgICAgICBmcmFtZS0+bG9hZGVyKCktPnNjaGVkdWxl
TG9jYXRpb25DaGFuZ2UoY29tcGxldGVkVXJsLCByZWZlcnJlciwgZmFsc2UsIHVzZXJHZXN0dXJl
KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNz
SW5kZXg6OkRPTVdJTkRPVywgZnJhbWUtPmRvbVdpbmRvdygpKTsKKyAgICAgICAgcmV0dXJuIFY4
UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBmcmFtZS0+
ZG9tV2luZG93KCkpOwogICAgIH0KIAogICAgIC8vIEluIHRoZSBjYXNlIG9mIGEgbmFtZWQgZnJh
bWUgb3IgYSBuZXcgd2luZG93LCB3ZSdsbCB1c2UgdGhlCkBAIC03NTEsMTggKzc1MSwxOCBAQCBD
QUxMQkFDS19GVU5DX0RFQ0woRE9NV2luZG93T3BlbikKICAgICBpZiAoIWZyYW1lKQogICAgICAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmpl
Y3QoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGZyYW1lLT5kb21XaW5kb3coKSk7CisgICAgcmV0
dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBm
cmFtZS0+ZG9tV2luZG93KCkpOwogfQogCiAKIElOREVYRURfUFJPUEVSVFlfR0VUVEVSKERPTVdp
bmRvdykKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5ET01XaW5kb3cuSW5kZXhlZFByb3BlcnR5R2V0
dGVyIik7Ci0gICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5OjpMb29r
dXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRoaXMoKSk7CisgICAg
djg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5Ojpsb29rdXBET01XcmFwcGVy
KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRoaXMoKSk7CiAgICAgaWYgKGhvbGRlci5J
c0VtcHR5KCkpCiAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogCi0g
ICAgRE9NV2luZG93KiB3aW5kb3cgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+
KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOworICAgIERPTVdpbmRvdyogd2luZG93
ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4
OjpET01XSU5ET1csIGhvbGRlcik7CiAgICAgaWYgKCF3aW5kb3cpCiAgICAgICAgIHJldHVybiBu
b3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogCkBAIC03NzIsNyArNzcyLDcgQEAgSU5ERVhFRF9Q
Uk9QRVJUWV9HRVRURVIoRE9NV2luZG93KQogCiAgICAgRnJhbWUqIGNoaWxkID0gZnJhbWUtPnRy
ZWUoKS0+Y2hpbGQoaW5kZXgpOwogICAgIGlmIChjaGlsZCkKLSAgICAgICAgcmV0dXJuIFY4UHJv
eHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGNoaWxkLT5kb21XaW5kb3co
KSk7CisgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5k
ZXg6OkRPTVdJTkRPVywgY2hpbGQtPmRvbVdpbmRvdygpKTsKIAogICAgIHJldHVybiBub3RIYW5k
bGVkQnlJbnRlcmNlcHRvcigpOwogfQpAQCAtNzgyLDExICs3ODIsMTEgQEAgTkFNRURfUFJPUEVS
VFlfR0VUVEVSKERPTVdpbmRvdykKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5ET01XaW5kb3cuTmFt
ZWRQcm9wZXJ0eUdldHRlciIpOwogCi0gICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIg
PSBWOFByb3h5OjpMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZv
LlRoaXMoKSk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5Ojps
b29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRoaXMoKSk7CiAg
ICAgaWYgKGhvbGRlci5Jc0VtcHR5KCkpCiAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRl
cmNlcHRvcigpOwogCi0gICAgRE9NV2luZG93KiB3aW5kb3cgPSBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOworICAgIERP
TVdpbmRvdyogd2luZG93ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PERPTVdpbmRv
dz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGhvbGRlcik7CiAgICAgaWYgKCF3aW5kb3cpCiAg
ICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogCkBAIC03OTksNyArNzk5
LDcgQEAgTkFNRURfUFJPUEVSVFlfR0VUVEVSKERPTVdpbmRvdykKICAgICBBdG9taWNTdHJpbmcg
cHJvcE5hbWUgPSB2OFN0cmluZ1RvQXRvbWljV2ViQ29yZVN0cmluZyhuYW1lKTsKICAgICBGcmFt
ZSogY2hpbGQgPSBmcmFtZS0+dHJlZSgpLT5jaGlsZChwcm9wTmFtZSk7CiAgICAgaWYgKGNoaWxk
KQotICAgICAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkRPTVdJ
TkRPVywgY2hpbGQtPmRvbVdpbmRvdygpKTsKKyAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZl
cnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBjaGlsZC0+ZG9tV2luZG93KCkp
OwogCiAgICAgLy8gU2VhcmNoIElETCBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgcHJvdG90eXBl
CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJlc3VsdCA9IGhvbGRlci0+R2V0UmVhbE5hbWVk
UHJvcGVydHlJblByb3RvdHlwZUNoYWluKG5hbWUpOwpAQCAtODEyLDkgKzgxMiw5IEBAIE5BTUVE
X1BST1BFUlRZX0dFVFRFUihET01XaW5kb3cpCiAgICAgICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlv
bj4gaXRlbXMgPSBkb2MtPndpbmRvd05hbWVkSXRlbXMocHJvcE5hbWUpOwogICAgICAgICBpZiAo
aXRlbXMtPmxlbmd0aCgpID49IDEpIHsKICAgICAgICAgICAgIGlmIChpdGVtcy0+bGVuZ3RoKCkg
PT0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QoaXRl
bXMtPmZpcnN0SXRlbSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6Y29udmVy
dE5vZGVUb1Y4T2JqZWN0KGl0ZW1zLT5maXJzdEl0ZW0oKSk7CiAgICAgICAgICAgICBlbHNlCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpI
VE1MQ09MTEVDVElPTiwgaXRlbXMuZ2V0KCkpOworICAgICAgICAgICAgICAgIHJldHVybiBWOFBy
b3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBpdGVt
cy5nZXQoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTg1Niw4ICs4NTYsOCBAQCBDQUxMQkFD
S19GVU5DX0RFQ0woRE9NV2luZG93U2V0SW50ZXJ2YWwpCiB2b2lkIFY4Q3VzdG9tOjpDbGVhclRp
bWVvdXRJbXBsKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCiB7CiAgICAgdjg6OkhhbmRsZTx2
ODo6VmFsdWU+IGhvbGRlciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgRE9NV2luZG93KiBpbXAgPSBW
OFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9X
LCBob2xkZXIpOwotICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgp
LCB0cnVlKSkKKyAgICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9i
amVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOworICAgIGlm
ICghVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKICAgICAgICAg
cmV0dXJuOwogICAgIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQgPSBzdGF0aWNfY2Fz
dDxTY3JpcHRFeGVjdXRpb25Db250ZXh0Kj4oaW1wLT5mcmFtZSgpLT5kb2N1bWVudCgpKTsKICAg
ICBpbnQgaGFuZGxlID0gdG9JbnQzMihhcmdzWzBdKTsKQEAgLTg4MiwxMSArODgyLDExIEBAIENB
TExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dDbGVhckludGVydmEKIE5BTUVEX0FDQ0VTU19DSEVD
SyhET01XaW5kb3cpCiB7CiAgICAgQVNTRVJUKFY4Q2xhc3NJbmRleDo6RnJvbUludChkYXRhLT5J
bnQzMlZhbHVlKCkpID09IFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XKTsKLSAgICB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gd2luZG93ID0gVjhQcm94eTo6TG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5k
ZXg6OkRPTVdJTkRPVywgaG9zdCk7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdpbmRvdyA9
IFY4UHJveHk6Omxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGhvc3Qp
OwogICAgIGlmICh3aW5kb3cuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyB0
aGUgZnJhbWUgaXMgZ29uZS4KIAotICAgIERPTVdpbmRvdyogdGFyZ2V0V2luZG93ID0gVjhQcm94
eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgd2lu
ZG93KTsKKyAgICBET01XaW5kb3cqIHRhcmdldFdpbmRvdyA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCB3aW5kb3cpOwog
CiAgICAgQVNTRVJUKHRhcmdldFdpbmRvdyk7CiAKQEAgLTkwMiwxNyArOTAyLDE3IEBAIE5BTUVE
X0FDQ0VTU19DSEVDSyhET01XaW5kb3cpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9
CiAKLSAgICByZXR1cm4gVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUodGFyZ2V0LCBmYWxzZSk7Cisg
ICAgcmV0dXJuIFY4UHJveHk6OmNhbkFjY2Vzc0ZyYW1lKHRhcmdldCwgZmFsc2UpOwogfQogCiBJ
TkRFWEVEX0FDQ0VTU19DSEVDSyhET01XaW5kb3cpCiB7CiAgICAgQVNTRVJUKFY4Q2xhc3NJbmRl
eDo6RnJvbUludChkYXRhLT5JbnQzMlZhbHVlKCkpID09IFY4Q2xhc3NJbmRleDo6RE9NV0lORE9X
KTsKLSAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gd2luZG93ID0gVjhQcm94eTo6TG9va3VwRE9N
V3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaG9zdCk7CisgICAgdjg6OkhhbmRsZTx2
ODo6VmFsdWU+IHdpbmRvdyA9IFY4UHJveHk6Omxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4
OjpET01XSU5ET1csIGhvc3QpOwogICAgIGlmICh3aW5kb3cuSXNFbXB0eSgpKQogICAgICAgICBy
ZXR1cm4gZmFsc2U7CiAKLSAgICBET01XaW5kb3cqIHRhcmdldFdpbmRvdyA9IFY4UHJveHk6OlRv
TmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIHdpbmRvdyk7
CisgICAgRE9NV2luZG93KiB0YXJnZXRXaW5kb3cgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVP
YmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgd2luZG93KTsKIAogICAg
IEFTU0VSVCh0YXJnZXRXaW5kb3cpOwogCkBAIC05MjQsNyArOTI0LDcgQEAgSU5ERVhFRF9BQ0NF
U1NfQ0hFQ0soRE9NV2luZG93KQogICAgIGlmICgodHlwZSA9PSB2ODo6QUNDRVNTX0dFVCB8fCB0
eXBlID09IHY4OjpBQ0NFU1NfSEFTKSAmJiB0YXJnZXQtPnRyZWUoKS0+Y2hpbGQoaW5kZXgpKQog
ICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgIHJldHVybiBWOFByb3h5OjpDYW5BY2Nlc3NGcmFt
ZSh0YXJnZXQsIGZhbHNlKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y2FuQWNjZXNzRnJhbWUodGFy
Z2V0LCBmYWxzZSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4RGF0YWJhc2VDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RGF0YWJhc2VDdXN0b20uY3BwCShyZXZpc2lvbiA0
NTIxNikKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RGF0YWJhc2VDdXN0b20uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0zMiwxNCArMzIsMTMgQEAKIAogI2lmIEVOQUJMRShEQVRBQkFT
RSkKIAotI2luY2x1ZGUgInY4X2JpbmRpbmcuaCIKLSNpbmNsdWRlICJ2OF9wcm94eS5oIgotCiAj
aW5jbHVkZSAiRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJWOEJpbmRpbmcuaCIKICNpbmNsdWRlICJW
OEN1c3RvbUJpbmRpbmcuaCIKICNpbmNsdWRlICJWOEN1c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJh
Y2suaCIKICNpbmNsdWRlICJWOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjay5oIgog
I2luY2x1ZGUgIlY4Q3VzdG9tVm9pZENhbGxiYWNrLmgiCisjaW5jbHVkZSAiVjhQcm94eS5oIgog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTU0LDE2ICs1MywxNiBAQCBDQUxMQkFDS19GVU5D
X0RFQ0woRGF0YWJhc2VUcmFuc2FjdGlvbikKICAgICBJTkNfU1RBVFMoIkRPTS5EYXRhYmFzZS50
cmFuc2FjdGlvbigpIik7CiAKICAgICBpZiAoYXJncy5MZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAg
IFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VSUk9SLCAiVHJhbnNhY3Rpb24g
Y2FsbGJhY2sgaXMgcmVxdWlyZWQuIik7CisgICAgICAgIFY4UHJveHk6OnRocm93RXJyb3IoVjhQ
cm94eTo6U1lOVEFYX0VSUk9SLCAiVHJhbnNhY3Rpb24gY2FsbGJhY2sgaXMgcmVxdWlyZWQuIik7
CiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgfQogCiAgICAgaWYgKCFhcmdz
WzBdLT5Jc09iamVjdCgpKSB7Ci0gICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6
VFlQRV9FUlJPUiwgIlRyYW5zYWN0aW9uIGNhbGxiYWNrIG11c3QgYmUgb2YgdmFsaWQgdHlwZS4i
KTsKKyAgICAgICAgVjhQcm94eTo6dGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiVHJh
bnNhY3Rpb24gY2FsbGJhY2sgbXVzdCBiZSBvZiB2YWxpZCB0eXBlLiIpOwogICAgICAgICByZXR1
cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgIH0KIAotICAgIERhdGFiYXNlKiBkYXRhYmFzZSA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PERhdGFiYXNlPihWOENsYXNzSW5kZXg6OkRBVEFCQVNFLCBh
cmdzLkhvbGRlcigpKTsKKyAgICBEYXRhYmFzZSogZGF0YWJhc2UgPSBWOFByb3h5Ojpjb252ZXJ0
VG9OYXRpdmVPYmplY3Q8RGF0YWJhc2U+KFY4Q2xhc3NJbmRleDo6REFUQUJBU0UsIGFyZ3MuSG9s
ZGVyKCkpOwogCiAgICAgRnJhbWUqIGZyYW1lID0gVjhQcm94eTo6cmV0cmlldmVGcmFtZSgpOwog
CkBAIC03Miw3ICs3MSw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChEYXRhYmFzZVRyYW5zYWN0aW9u
KQogICAgIFJlZlB0cjxWOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjaz4gZXJyb3JD
YWxsYmFjazsKICAgICBpZiAoYXJncy5MZW5ndGgoKSA+IDEpIHsKICAgICAgICAgaWYgKCFhcmdz
WzFdLT5Jc09iamVjdCgpKSB7Ci0gICAgICAgICAgICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4UHJv
eHk6OlRZUEVfRVJST1IsICJUcmFuc2FjdGlvbiBlcnJvciBjYWxsYmFjayBtdXN0IGJlIG9mIHZh
bGlkIHR5cGUuIik7CisgICAgICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlRZ
UEVfRVJST1IsICJUcmFuc2FjdGlvbiBlcnJvciBjYWxsYmFjayBtdXN0IGJlIG9mIHZhbGlkIHR5
cGUuIik7CiAgICAgICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgICAgICB9CiAg
ICAgICAgIGVycm9yQ2FsbGJhY2sgPSBWOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFj
azo6Y3JlYXRlKGFyZ3NbMV0sIGZyYW1lKTsKQEAgLTgxLDcgKzgwLDcgQEAgQ0FMTEJBQ0tfRlVO
Q19ERUNMKERhdGFiYXNlVHJhbnNhY3Rpb24pCiAgICAgUmVmUHRyPFY4Q3VzdG9tVm9pZENhbGxi
YWNrPiBzdWNjZXNzQ2FsbGJhY2s7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAyKSB7CiAgICAg
ICAgIGlmICghYXJnc1sxXS0+SXNPYmplY3QoKSkgewotICAgICAgICAgICAgVjhQcm94eTo6VGhy
b3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiVHJhbnNhY3Rpb24gc3VjY2VzcyBjYWxsYmFj
ayBtdXN0IGJlIG9mIHZhbGlkIHR5cGUuIik7CisgICAgICAgICAgICBWOFByb3h5Ojp0aHJvd0Vy
cm9yKFY4UHJveHk6OlRZUEVfRVJST1IsICJUcmFuc2FjdGlvbiBzdWNjZXNzIGNhbGxiYWNrIG11
c3QgYmUgb2YgdmFsaWQgdHlwZS4iKTsKICAgICAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVk
KCk7CiAgICAgICAgIH0KICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrID0gVjhDdXN0b21Wb2lkQ2Fs
bGJhY2s6OmNyZWF0ZShhcmdzWzJdLCBmcmFtZSk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOERvY3VtZW50Q3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOERvY3VtZW50Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERvY3VtZW50Q3VzdG9tLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNTIsMTYgKzUyLDE2IEBAIENBTExCQUNLX0ZVTkNfREVDTChEb2N1bWVudEV2YWx1
YXRlKQogewogICAgIElOQ19TVEFUUygiRE9NLkRvY3VtZW50LmV2YWx1YXRlKCkiKTsKIAotICAg
IERvY3VtZW50KiBkb2N1bWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8RG9jdW1lbnQ+
KGFyZ3MuSG9sZGVyKCkpOworICAgIERvY3VtZW50KiBkb2N1bWVudCA9IFY4UHJveHk6OmNvbnZl
cnRET01XcmFwcGVyVG9Ob2RlPERvY3VtZW50PihhcmdzLkhvbGRlcigpKTsKICAgICBFeGNlcHRp
b25Db2RlIGVjID0gMDsKICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9IHRvV2ViQ29yZVN0cmluZyhh
cmdzWzBdKTsKICAgICBOb2RlKiBjb250ZXh0Tm9kZSA9IDA7CiAgICAgaWYgKFY4Tm9kZTo6SGFz
SW5zdGFuY2UoYXJnc1sxXSkpCi0gICAgICAgIGNvbnRleHROb2RlID0gVjhQcm94eTo6RE9NV3Jh
cHBlclRvTm9kZTxOb2RlPihhcmdzWzFdKTsKKyAgICAgICAgY29udGV4dE5vZGUgPSBWOFByb3h5
Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzFdKTsKIAogICAgIFhQYXRoTlNS
ZXNvbHZlciogcmVzb2x2ZXIgPSAwOwogICAgIGlmIChWOFhQYXRoTlNSZXNvbHZlcjo6SGFzSW5z
dGFuY2UoYXJnc1syXSkpCi0gICAgICAgIHJlc29sdmVyID0gVjhQcm94eTo6VG9OYXRpdmVPYmpl
Y3Q8WFBhdGhOU1Jlc29sdmVyPihWOENsYXNzSW5kZXg6OlhQQVRITlNSRVNPTFZFUiwgYXJnc1sy
XSk7CisgICAgICAgIHJlc29sdmVyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhQ
YXRoTlNSZXNvbHZlcj4oVjhDbGFzc0luZGV4OjpYUEFUSE5TUkVTT0xWRVIsIGFyZ3NbMl0pOwog
ICAgIGVsc2UgaWYgKGFyZ3NbMl0tPklzT2JqZWN0KCkpCiAgICAgICAgIHJlc29sdmVyID0gbmV3
IFY4Q3VzdG9tWFBhdGhOU1Jlc29sdmVyKGFyZ3NbMl0tPlRvT2JqZWN0KCkpOwogICAgIGVsc2Ug
aWYgKCFhcmdzWzJdLT5Jc051bGwoKSAmJiAhYXJnc1syXS0+SXNVbmRlZmluZWQoKSkKQEAgLTcw
LDcgKzcwLDcgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKERvY3VtZW50RXZhbHVhdGUpCiAgICAgaW50
IHR5cGUgPSB0b0ludDMyKGFyZ3NbM10pOwogICAgIFhQYXRoUmVzdWx0KiBpblJlc3VsdCA9IDA7
CiAgICAgaWYgKFY4WFBhdGhSZXN1bHQ6Okhhc0luc3RhbmNlKGFyZ3NbNF0pKQotICAgICAgICBp
blJlc3VsdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhQYXRoUmVzdWx0PihWOENsYXNzSW5k
ZXg6OlhQQVRIUkVTVUxULCBhcmdzWzRdKTsKKyAgICAgICAgaW5SZXN1bHQgPSBWOFByb3h5Ojpj
b252ZXJ0VG9OYXRpdmVPYmplY3Q8WFBhdGhSZXN1bHQ+KFY4Q2xhc3NJbmRleDo6WFBBVEhSRVNV
TFQsIGFyZ3NbNF0pOwogCiAgICAgdjg6OlRyeUNhdGNoIGV4Y2VwdGlvbkNhdGNoZXI7CiAgICAg
UmVmUHRyPFhQYXRoUmVzdWx0PiByZXN1bHQgPSBkb2N1bWVudC0+ZXZhbHVhdGUoZXhwcmVzc2lv
biwgY29udGV4dE5vZGUsIHJlc29sdmVyLCB0eXBlLCBpblJlc3VsdCwgZWMpOwpAQCAtODAsMjAg
KzgwLDIwIEBAIENBTExCQUNLX0ZVTkNfREVDTChEb2N1bWVudEV2YWx1YXRlKQogICAgIGlmIChl
YykKICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZWMpOwogCi0gICAgcmV0dXJuIFY4UHJveHk6
OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpYUEFUSFJFU1VMVCwgcmVzdWx0LmdldCgpKTsKKyAg
ICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpYUEFUSFJF
U1VMVCwgcmVzdWx0LmdldCgpKTsKIH0KIAogQ0FMTEJBQ0tfRlVOQ19ERUNMKERvY3VtZW50R2V0
Q1NTQ2FudmFzQ29udGV4dCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Eb2N1bWVudC5nZXRDU1ND
YW52YXNDb250ZXh0Iik7CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhvbGRlciA9IGFyZ3Mu
SG9sZGVyKCk7Ci0gICAgRG9jdW1lbnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8
RG9jdW1lbnQ+KGhvbGRlcik7CisgICAgRG9jdW1lbnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRE
T01XcmFwcGVyVG9Ob2RlPERvY3VtZW50Pihob2xkZXIpOwogICAgIFN0cmluZyBjb250ZXh0SWQg
PSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgU3RyaW5nIG5hbWUgPSB0b1dlYkNvcmVT
dHJpbmcoYXJnc1sxXSk7CiAgICAgaW50IHdpZHRoID0gdG9JbnQzMihhcmdzWzJdKTsKICAgICBp
bnQgaGVpZ2h0ID0gdG9JbnQzMihhcmdzWzNdKTsKICAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkQqIHJlc3VsdCA9IGltcC0+Z2V0Q1NTQ2FudmFzQ29udGV4dChjb250ZXh0SWQsIG5hbWUsIHdp
ZHRoLCBoZWlnaHQpOwotICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRl
eDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCByZXN1bHQpOworICAgIHJldHVybiBWOFByb3h5
Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQy
RCwgcmVzdWx0KTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhEb2N1bWVudExvY2F0aW9uQ3VzdG9tLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERvY3VtZW50TG9jYXRpb25DdXN0b20u
Y3BwCShyZXZpc2lvbiA0NTIxNikKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RG9j
dW1lbnRMb2NhdGlvbkN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDE3ICszNCwxNyBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIEFDQ0VTU09SX0dFVFRFUihEb2N1bWVudExvY2F0aW9u
KQogewotICAgIERvY3VtZW50KiBkb2N1bWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05hdGl2
ZTxEb2N1bWVudD4oaW5mby5Ib2xkZXIoKSk7CisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gVjhQ
cm94eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxEb2N1bWVudD4oaW5mby5Ib2xkZXIoKSk7
CiAgICAgaWYgKCFkb2N1bWVudC0+ZnJhbWUoKSkKICAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7
CiAKICAgICBET01XaW5kb3cqIHdpbmRvdyA9IGRvY3VtZW50LT5mcmFtZSgpLT5kb21XaW5kb3co
KTsKLSAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkxPQ0FUSU9O
LCB3aW5kb3ctPmxvY2F0aW9uKCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9i
amVjdChWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCB3aW5kb3ctPmxvY2F0aW9uKCkpOwogfQogCiBB
Q0NFU1NPUl9TRVRURVIoRG9jdW1lbnRMb2NhdGlvbikKIHsKLSAgICBEb2N1bWVudCogZG9jdW1l
bnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8RG9jdW1lbnQ+KGluZm8uSG9sZGVyKCkp
OworICAgIERvY3VtZW50KiBkb2N1bWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9O
YXRpdmU8RG9jdW1lbnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIGlmICghZG9jdW1lbnQtPmZyYW1l
KCkpCiAgICAgICAgIHJldHVybjsKIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhFbGVtZW50Q3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOEVsZW1lbnRDdXN0b20uY3BwCShyZXZpc2lvbiA0NTIxNikKKysrIFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4RWxlbWVudEN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUz
LDcgKzUzLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogQ0FMTEJBQ0tfRlVOQ19ERUNMKEVsZW1l
bnRTZXRBdHRyaWJ1dGUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uRWxlbWVudC5zZXRBdHRyaWJ1
dGUoKSIpOwotICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2Rl
PEVsZW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOworICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBWOFByb3h5
Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxFbGVtZW50PihhcmdzLkhvbGRlcigpKTsKICAgICBT
dHJpbmcgbmFtZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKICAgICBTdHJpbmcgdmFsdWUg
PSB0b1dlYkNvcmVTdHJpbmcoYXJnc1sxXSk7CiAKQEAgLTc0LDggKzc0LDggQEAgQ0FMTEJBQ0tf
RlVOQ19ERUNMKEVsZW1lbnRTZXRBdHRyaWJ1dGVObwogICAgIGlmICghVjhBdHRyOjpIYXNJbnN0
YW5jZShhcmdzWzBdKSkKICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoVFlQRV9NSVNNQVRDSF9F
UlIpOwogCi0gICAgQXR0ciogbmV3QXR0ciA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8QXR0
cj4oYXJnc1swXSk7Ci0gICAgRWxlbWVudCogZWxlbWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJU
b05vZGU8RWxlbWVudD4oYXJncy5Ib2xkZXIoKSk7CisgICAgQXR0ciogbmV3QXR0ciA9IFY4UHJv
eHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEF0dHI+KGFyZ3NbMF0pOworICAgIEVsZW1lbnQq
IGVsZW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxFbGVtZW50Pihhcmdz
LkhvbGRlcigpKTsKIAogICAgIGlmICghYWxsb3dTZXR0aW5nU3JjVG9KYXZhc2NyaXB0VVJMKGVs
ZW1lbnQsIG5ld0F0dHItPm5hbWUoKSwgbmV3QXR0ci0+dmFsdWUoKSkpCiAgICAgICAgIHJldHVy
biB2ODo6VW5kZWZpbmVkKCk7CkBAIC04NSwxMyArODUsMTMgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNM
KEVsZW1lbnRTZXRBdHRyaWJ1dGVObwogICAgIGlmIChlYykKICAgICAgICAgdGhyb3dFcnJvcihl
Yyk7CiAKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsK
KyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7
CiB9CiAKIENBTExCQUNLX0ZVTkNfREVDTChFbGVtZW50U2V0QXR0cmlidXRlTlMpCiB7CiAgICAg
SU5DX1NUQVRTKCJET00uRWxlbWVudC5zZXRBdHRyaWJ1dGVOUygpIik7Ci0gICAgRWxlbWVudCog
ZWxlbWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8RWxlbWVudD4oYXJncy5Ib2xkZXIo
KSk7CisgICAgRWxlbWVudCogZWxlbWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9O
b2RlPEVsZW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOwogICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSB0
b1dlYkNvcmVTdHJpbmdXaXRoTnVsbENoZWNrKGFyZ3NbMF0pOwogICAgIFN0cmluZyBxdWFsaWZp
ZWROYW1lID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMV0pOwogICAgIFN0cmluZyB2YWx1ZSA9IHRv
V2ViQ29yZVN0cmluZyhhcmdzWzJdKTsKQEAgLTExMyw4ICsxMTMsOCBAQCBDQUxMQkFDS19GVU5D
X0RFQ0woRWxlbWVudFNldEF0dHJpYnV0ZU5vCiAgICAgaWYgKCFWOEF0dHI6Okhhc0luc3RhbmNl
KGFyZ3NbMF0pKQogICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihUWVBFX01JU01BVENIX0VSUik7
CiAKLSAgICBBdHRyKiBuZXdBdHRyID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxBdHRyPihh
cmdzWzBdKTsKLSAgICBFbGVtZW50KiBlbGVtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9k
ZTxFbGVtZW50PihhcmdzLkhvbGRlcigpKTsKKyAgICBBdHRyKiBuZXdBdHRyID0gVjhQcm94eTo6
Y29udmVydERPTVdyYXBwZXJUb05vZGU8QXR0cj4oYXJnc1swXSk7CisgICAgRWxlbWVudCogZWxl
bWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEVsZW1lbnQ+KGFyZ3MuSG9s
ZGVyKCkpOwogCiAgICAgaWYgKCFhbGxvd1NldHRpbmdTcmNUb0phdmFzY3JpcHRVUkwoZWxlbWVu
dCwgbmV3QXR0ci0+bmFtZSgpLCBuZXdBdHRyLT52YWx1ZSgpKSkKICAgICAgICAgcmV0dXJuIHY4
OjpVbmRlZmluZWQoKTsKQEAgLTEyNCw3ICsxMjQsNyBAQCBDQUxMQkFDS19GVU5DX0RFQ0woRWxl
bWVudFNldEF0dHJpYnV0ZU5vCiAgICAgaWYgKGVjKQogICAgICAgICB0aHJvd0Vycm9yKGVjKTsK
IAotICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChyZXN1bHQuZ2V0KCkpOworICAg
IHJldHVybiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsKIH0K
IAogc3RhdGljIGlubGluZSBTdHJpbmcgdG9FdmVudFR5cGUodjg6OkxvY2FsPHY4OjpTdHJpbmc+
IHZhbHVlKQpAQCAtMTM2LDcgKzEzNiw3IEBAIHN0YXRpYyBpbmxpbmUgU3RyaW5nIHRvRXZlbnRU
eXBlKHY4OjpMb2MKIAogQUNDRVNTT1JfU0VUVEVSKEVsZW1lbnRFdmVudEhhbmRsZXIpCiB7Ci0g
ICAgTm9kZSogbm9kZSA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8Tm9kZT4oaW5mby5Ib2xk
ZXIoKSk7CisgICAgTm9kZSogbm9kZSA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2Rl
PE5vZGU+KGluZm8uSG9sZGVyKCkpOwogCiAgICAgU3RyaW5nIGV2ZW50VHlwZSA9IHRvRXZlbnRU
eXBlKG5hbWUpOwogCkBAIC0xNTEsNyArMTUxLDcgQEAgQUNDRVNTT1JfU0VUVEVSKEVsZW1lbnRF
dmVudEhhbmRsZXIpCiAgICAgICAgIGlmICghcHJveHkpCiAgICAgICAgICAgICByZXR1cm47CiAK
LSAgICAgICAgaWYgKFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5k
T3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIodmFsdWUsIHRydWUpKQorICAgICAgICBpZiAoUmVmUHRy
PEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPmZpbmRPckNyZWF0ZVY4RXZlbnRMaXN0
ZW5lcih2YWx1ZSwgdHJ1ZSkpCiAgICAgICAgICAgICBub2RlLT5zZXRBdHRyaWJ1dGVFdmVudExp
c3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOwogICAgIH0gZWxzZQogICAgICAgICBub2RlLT5j
bGVhckF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlKTsKQEAgLTE1OSwxMCArMTU5LDEw
IEBAIEFDQ0VTU09SX1NFVFRFUihFbGVtZW50RXZlbnRIYW5kbGVyKQogCiBBQ0NFU1NPUl9HRVRU
RVIoRWxlbWVudEV2ZW50SGFuZGxlcikKIHsKLSAgICBOb2RlKiBub2RlID0gVjhQcm94eTo6RE9N
V3JhcHBlclRvTm9kZTxOb2RlPihpbmZvLkhvbGRlcigpKTsKKyAgICBOb2RlKiBub2RlID0gVjhQ
cm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oaW5mby5Ib2xkZXIoKSk7CiAKICAg
ICBFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IG5vZGUtPmdldEF0dHJpYnV0ZUV2ZW50TGlzdGVu
ZXIodG9FdmVudFR5cGUobmFtZSkpOwotICAgIHJldHVybiBWOFByb3h5OjpFdmVudExpc3RlbmVy
VG9WOE9iamVjdChsaXN0ZW5lcik7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRFdmVudExp
c3RlbmVyVG9WOE9iamVjdChsaXN0ZW5lcik7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
SW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RXZlbnRDdXN0b20uY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RXZlbnRDdXN0b20uY3BwCShy
ZXZpc2lvbiA0NTIxNikKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RXZlbnRDdXN0
b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MywzOSArNDMsMzkgQEAgbmFtZXNwYWNlIFdlYkNv
cmUgewogCiBBQ0NFU1NPUl9TRVRURVIoRXZlbnRSZXR1cm5WYWx1ZSkKIHsKLSAgICBFdmVudCog
ZXZlbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8RXZlbnQ+KGluZm8uSG9sZGVyKCkp
OworICAgIEV2ZW50KiBldmVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9OYXRpdmU8
RXZlbnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIGV2ZW50LT5zZXREZWZhdWx0UHJldmVudGVkKCF2
YWx1ZS0+Qm9vbGVhblZhbHVlKCkpOwogfQogCiBBQ0NFU1NPUl9HRVRURVIoRXZlbnREYXRhVHJh
bnNmZXIpCiB7Ci0gICAgRXZlbnQqIGV2ZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0aXZl
PEV2ZW50PihpbmZvLkhvbGRlcigpKTsKKyAgICBFdmVudCogZXZlbnQgPSBWOFByb3h5Ojpjb252
ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPEV2ZW50PihpbmZvLkhvbGRlcigpKTsKIAogICAgIGlmIChl
dmVudC0+aXNEcmFnRXZlbnQoKSkKLSAgICAgICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3Qo
VjhDbGFzc0luZGV4OjpDTElQQk9BUkQsIHN0YXRpY19jYXN0PE1vdXNlRXZlbnQqPihldmVudCkt
PmNsaXBib2FyZCgpKTsKKyAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6Q0xJUEJPQVJELCBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZlbnQp
LT5jbGlwYm9hcmQoKSk7CiAKICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogfQogCiBBQ0NF
U1NPUl9HRVRURVIoRXZlbnRDbGlwYm9hcmREYXRhKQogewotICAgIEV2ZW50KiBldmVudCA9IFY4
UHJveHk6OkRPTVdyYXBwZXJUb05hdGl2ZTxFdmVudD4oaW5mby5Ib2xkZXIoKSk7CisgICAgRXZl
bnQqIGV2ZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxFdmVudD4oaW5m
by5Ib2xkZXIoKSk7CiAKICAgICBpZiAoZXZlbnQtPmlzQ2xpcGJvYXJkRXZlbnQoKSkKLSAgICAg
ICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpDTElQQk9BUkQsIHN0
YXRpY19jYXN0PENsaXBib2FyZEV2ZW50Kj4oZXZlbnQpLT5jbGlwYm9hcmQoKSk7CisgICAgICAg
IHJldHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNMSVBCT0FS
RCwgc3RhdGljX2Nhc3Q8Q2xpcGJvYXJkRXZlbnQqPihldmVudCktPmNsaXBib2FyZCgpKTsKIAog
ICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiB9CiAKIEFDQ0VTU09SX0dFVFRFUihFdmVudFNy
Y0VsZW1lbnQpCiB7Ci0gICAgRXZlbnQqIGV2ZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0
aXZlPEV2ZW50PihpbmZvLkhvbGRlcigpKTsKLSAgICByZXR1cm4gVjhQcm94eTo6RXZlbnRUYXJn
ZXRUb1Y4T2JqZWN0KGV2ZW50LT50YXJnZXQoKSk7CisgICAgRXZlbnQqIGV2ZW50ID0gVjhQcm94
eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxFdmVudD4oaW5mby5Ib2xkZXIoKSk7CisgICAg
cmV0dXJuIFY4UHJveHk6OmNvbnZlcnRFdmVudFRhcmdldFRvVjhPYmplY3QoZXZlbnQtPnRhcmdl
dCgpKTsKIH0KIAogQUNDRVNTT1JfR0VUVEVSKEV2ZW50UmV0dXJuVmFsdWUpCiB7Ci0gICAgRXZl
bnQqIGV2ZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTmF0aXZlPEV2ZW50PihpbmZvLkhvbGRl
cigpKTsKKyAgICBFdmVudCogZXZlbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTmF0
aXZlPEV2ZW50PihpbmZvLkhvbGRlcigpKTsKICAgICByZXR1cm4gZXZlbnQtPmRlZmF1bHRQcmV2
ZW50ZWQoKSA/IHY4OjpGYWxzZSgpIDogdjg6OlRydWUoKTsKIH0KIApJbmRleDogV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhIVE1MQ2FudmFzRWxlbWVudEN1c3RvbS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MQ2FudmFzRWxlbWVudEN1c3Rv
bS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhI
VE1MQ2FudmFzRWxlbWVudEN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQwLDEyICs0MCwx
MiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIENBTExCQUNLX0ZVTkNfREVDTChIVE1MQ2FudmFz
RWxlbWVudEdldENvbnRleHQpCiB7Ci0gICAgSU5DX1NUQVRTKCJET00uSFRNTENhbnZhc0VsZW1l
bnQuZ2V0Q29udGV4dCIpOworICAgIElOQ19TVEFUUygiRE9NLkhUTUxDYW52YXNFbGVtZW50LmNv
bnRleHQiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gaG9sZGVyID0gYXJncy5Ib2xkZXIo
KTsKLSAgICBIVE1MQ2FudmFzRWxlbWVudCogaW1wID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9k
ZTxIVE1MQ2FudmFzRWxlbWVudD4oaG9sZGVyKTsKKyAgICBIVE1MQ2FudmFzRWxlbWVudCogaW1w
ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTENhbnZhc0VsZW1lbnQ+KGhv
bGRlcik7CiAgICAgU3RyaW5nIGNvbnRleHRJZCA9IFRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsK
ICAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIHJlc3VsdCA9IGltcC0+Z2V0Q29udGV4dChj
b250ZXh0SWQpOwotICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6
Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCByZXN1bHQpOworICAgIHJldHVybiBWOFByb3h5Ojpj
b252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwg
cmVzdWx0KTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhIVE1MQ29sbGVjdGlvbkN1c3RvbS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MQ29sbGVjdGlvbkN1c3RvbS5jcHAJKHJl
dmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MQ29sbGVj
dGlvbkN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ3LDEwICs0NywxMCBAQCBzdGF0aWMg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGdldE5hbWVkSXRlCiAgICAgICAgIHJldHVybiB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4oKTsKIAogICAgIGlmIChuYW1lZEl0ZW1zLnNpemUoKSA9PSAxKQotICAg
ICAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QobmFtZWRJdGVtcy5hdCgwKS5nZXQo
KSk7CisgICAgICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QobmFtZWRJ
dGVtcy5hdCgwKS5nZXQoKSk7CiAKICAgICBOb2RlTGlzdCogbGlzdCA9IG5ldyBWOE5hbWVkTm9k
ZXNDb2xsZWN0aW9uKG5hbWVkSXRlbXMpOwotICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6Tk9ERUxJU1QsIGxpc3QpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252
ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok5PREVMSVNULCBsaXN0KTsKIH0KIAogc3RhdGlj
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiBnZXRJdGVtKEhUTUxDb2xsZWN0aW9uKiBjb2xsZWN0aW9u
LCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJndW1lbnQpCkBAIC02Niw3ICs2Niw3IEBAIHN0YXRp
YyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZ2V0SXRlbShIVE0KICAgICB9CiAKICAgICBSZWZQdHI8
Tm9kZT4gcmVzdWx0ID0gY29sbGVjdGlvbi0+aXRlbShpbmRleC0+VWludDMyVmFsdWUoKSk7Ci0g
ICAgcmV0dXJuIFY4UHJveHk6Ok5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CisgICAgcmV0
dXJuIFY4UHJveHk6OmNvbnZlcnROb2RlVG9WOE9iamVjdChyZXN1bHQuZ2V0KCkpOwogfQogCiBO
QU1FRF9QUk9QRVJUWV9HRVRURVIoSFRNTENvbGxlY3Rpb24pCkBAIC04NCwyMSArODQsMjEgQEAg
TkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxDb2xsZWN0aW9uKQogICAgICAgICByZXR1cm4gdjg6
OkhhbmRsZTx2ODo6VmFsdWU+KCk7CiAKICAgICAvLyBGaW5hbGx5LCBzZWFyY2ggdGhlIERPTSBz
dHJ1Y3R1cmUuCi0gICAgSFRNTENvbGxlY3Rpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2Jq
ZWN0PEhUTUxDb2xsZWN0aW9uPihWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBpbmZvLkhv
bGRlcigpKTsKKyAgICBIVE1MQ29sbGVjdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PEhUTUxDb2xsZWN0aW9uPihWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBp
bmZvLkhvbGRlcigpKTsKICAgICByZXR1cm4gZ2V0TmFtZWRJdGVtcyhpbXAsIHY4U3RyaW5nVG9B
dG9taWNXZWJDb3JlU3RyaW5nKG5hbWUpKTsKIH0KIAogQ0FMTEJBQ0tfRlVOQ19ERUNMKEhUTUxD
b2xsZWN0aW9uSXRlbSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MQ29sbGVjdGlvbi5pdGVt
KCkiKTsKLSAgICBIVE1MQ29sbGVjdGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8
SFRNTENvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGFyZ3MuSG9sZGVy
KCkpOworICAgIEhUTUxDb2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVP
YmplY3Q8SFRNTENvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIGFyZ3Mu
SG9sZGVyKCkpOwogICAgIHJldHVybiBnZXRJdGVtKGltcCwgYXJnc1swXSk7CiB9CiAKIENBTExC
QUNLX0ZVTkNfREVDTChIVE1MQ29sbGVjdGlvbk5hbWVkSXRlbSkKIHsKICAgICBJTkNfU1RBVFMo
IkRPTS5IVE1MQ29sbGVjdGlvbi5uYW1lZEl0ZW0oKSIpOwotICAgIEhUTUxDb2xsZWN0aW9uKiBp
bXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIVE1MQ29sbGVjdGlvbj4oVjhDbGFzc0luZGV4
OjpIVE1MQ09MTEVDVElPTiwgYXJncy5Ib2xkZXIoKSk7CisgICAgSFRNTENvbGxlY3Rpb24qIGlt
cCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1MQ29sbGVjdGlvbj4oVjhDbGFz
c0luZGV4OjpIVE1MQ09MTEVDVElPTiwgYXJncy5Ib2xkZXIoKSk7CiAgICAgdjg6OkhhbmRsZTx2
ODo6VmFsdWU+IHJlc3VsdCA9IGdldE5hbWVkSXRlbXMoaW1wLCB0b1dlYkNvcmVTdHJpbmcoYXJn
c1swXSkpOwogCiAgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpCkBAIC0xMTMsNyArMTEzLDcgQEAg
Q0FMTEJBQ0tfRlVOQ19ERUNMKEhUTUxDb2xsZWN0aW9uQ2FsbEFzRgogICAgIGlmIChhcmdzLkxl
bmd0aCgpIDwgMSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIEhUTUxD
b2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIVE1MQ29sbGVjdGlvbj4o
VjhDbGFzc0luZGV4OjpIVE1MQ09MTEVDVElPTiwgYXJncy5Ib2xkZXIoKSk7CisgICAgSFRNTENv
bGxlY3Rpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1MQ29sbGVj
dGlvbj4oVjhDbGFzc0luZGV4OjpIVE1MQ09MTEVDVElPTiwgYXJncy5Ib2xkZXIoKSk7CiAKICAg
ICBpZiAoYXJncy5MZW5ndGgoKSA9PSAxKQogICAgICAgICByZXR1cm4gZ2V0SXRlbShpbXAsIGFy
Z3NbMF0pOwpAQCAtMTI4LDcgKzEyOCw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChIVE1MQ29sbGVj
dGlvbkNhbGxBc0YKICAgICBOb2RlKiBub2RlID0gaW1wLT5uYW1lZEl0ZW0obmFtZSk7CiAgICAg
d2hpbGUgKG5vZGUpIHsKICAgICAgICAgaWYgKCFjdXJyZW50KQotICAgICAgICAgICAgcmV0dXJu
IFY4UHJveHk6Ok5vZGVUb1Y4T2JqZWN0KG5vZGUpOworICAgICAgICAgICAgcmV0dXJuIFY4UHJv
eHk6OmNvbnZlcnROb2RlVG9WOE9iamVjdChub2RlKTsKIAogICAgICAgICBub2RlID0gaW1wLT5u
ZXh0TmFtZWRJdGVtKG5hbWUpOwogICAgICAgICBjdXJyZW50LS07CkluZGV4OiBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxEb2N1bWVudEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MRG9jdW1lbnRDdXN0b20uY3BwCShyZXZp
c2lvbiA0NTIxNikKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTERvY3VtZW50
Q3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzgsNyArNzgsNyBAQCBOQU1FRF9QUk9QRVJU
WV9HRVRURVIoSFRNTERvY3VtZW50KQogICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0K
IAotICAgIEhUTUxEb2N1bWVudCogaHRtbERvY3VtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRv
Tm9kZTxIVE1MRG9jdW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxEb2N1bWVudCogaHRt
bERvY3VtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTERvY3VtZW50
PihpbmZvLkhvbGRlcigpKTsKIAogICAgIC8vIEZhc3QgY2FzZSBmb3IgbmFtZWQgZWxlbWVudHMg
dGhhdCBhcmUgbm90IHRoZXJlLgogICAgIGlmICghaHRtbERvY3VtZW50LT5oYXNOYW1lZEl0ZW0o
a2V5LmltcGwoKSkgJiYgIWh0bWxEb2N1bWVudC0+aGFzRXh0cmFOYW1lZEl0ZW0oa2V5LmltcGwo
KSkpCkBAIC05MiwxMiArOTIsMTIgQEAgTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxEb2N1bWVu
dCkKICAgICAgICAgTm9kZSogbm9kZSA9IGl0ZW1zLT5maXJzdEl0ZW0oKTsKICAgICAgICAgRnJh
bWUqIGZyYW1lID0gMDsKICAgICAgICAgaWYgKG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpp
ZnJhbWVUYWcpICYmIChmcmFtZSA9IHN0YXRpY19jYXN0PEhUTUxJRnJhbWVFbGVtZW50Kj4obm9k
ZSktPmNvbnRlbnRGcmFtZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2Jq
ZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBmcmFtZS0+ZG9tV2luZG93KCkpOworICAgICAg
ICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9N
V0lORE9XLCBmcmFtZS0+ZG9tV2luZG93KCkpOwogCi0gICAgICAgIHJldHVybiBWOFByb3h5OjpO
b2RlVG9WOE9iamVjdChub2RlKTsKKyAgICAgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnROb2Rl
VG9WOE9iamVjdChub2RlKTsKICAgICB9CiAKLSAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVj
dChWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBpdGVtcy5nZXQoKSk7CisgICAgcmV0dXJu
IFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04s
IGl0ZW1zLmdldCgpKTsKIH0KIAogLy8gSFRNTERvY3VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTExNyw3ICsx
MTcsNyBAQCBzdGF0aWMgU3RyaW5nIHdyaXRlSGVscGVyR2V0U3RyaW5nKGNvbnN0CiBDQUxMQkFD
S19GVU5DX0RFQ0woSFRNTERvY3VtZW50V3JpdGUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRN
TERvY3VtZW50LndyaXRlKCkiKTsKLSAgICBIVE1MRG9jdW1lbnQqIGh0bWxEb2N1bWVudCA9IFY4
UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTERvY3VtZW50PihhcmdzLkhvbGRlcigpKTsKKyAg
ICBIVE1MRG9jdW1lbnQqIGh0bWxEb2N1bWVudCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVy
VG9Ob2RlPEhUTUxEb2N1bWVudD4oYXJncy5Ib2xkZXIoKSk7CiAgICAgRnJhbWUqIGZyYW1lID0g
VjhQcm94eTo6cmV0cmlldmVGcmFtZUZvckNhbGxpbmdDb250ZXh0KCk7CiAgICAgQVNTRVJUKGZy
YW1lKTsKICAgICBodG1sRG9jdW1lbnQtPndyaXRlKHdyaXRlSGVscGVyR2V0U3RyaW5nKGFyZ3Mp
LCBmcmFtZS0+ZG9jdW1lbnQoKSk7CkBAIC0xMjcsNyArMTI3LDcgQEAgQ0FMTEJBQ0tfRlVOQ19E
RUNMKEhUTUxEb2N1bWVudFdyaXRlKQogQ0FMTEJBQ0tfRlVOQ19ERUNMKEhUTUxEb2N1bWVudFdy
aXRlbG4pCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTERvY3VtZW50LndyaXRlbG4oKSIpOwot
ICAgIEhUTUxEb2N1bWVudCogaHRtbERvY3VtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9k
ZTxIVE1MRG9jdW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOworICAgIEhUTUxEb2N1bWVudCogaHRtbERv
Y3VtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRNTERvY3VtZW50Pihh
cmdzLkhvbGRlcigpKTsKICAgICBGcmFtZSogZnJhbWUgPSBWOFByb3h5OjpyZXRyaWV2ZUZyYW1l
Rm9yQ2FsbGluZ0NvbnRleHQoKTsKICAgICBBU1NFUlQoZnJhbWUpOwogICAgIGh0bWxEb2N1bWVu
dC0+d3JpdGVsbih3cml0ZUhlbHBlckdldFN0cmluZyhhcmdzKSwgZnJhbWUtPmRvY3VtZW50KCkp
OwpAQCAtMTM3LDEyICsxMzcsMTIgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKEhUTUxEb2N1bWVudFdy
aXRlbG4pCiBDQUxMQkFDS19GVU5DX0RFQ0woSFRNTERvY3VtZW50T3BlbikKIHsKICAgICBJTkNf
U1RBVFMoIkRPTS5IVE1MRG9jdW1lbnQub3BlbigpIik7Ci0gICAgSFRNTERvY3VtZW50KiBodG1s
RG9jdW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxEb2N1bWVudD4oYXJncy5I
b2xkZXIoKSk7CisgICAgSFRNTERvY3VtZW50KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5Ojpjb252
ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MRG9jdW1lbnQ+KGFyZ3MuSG9sZGVyKCkpOwogCiAgICAg
aWYgKGFyZ3MuTGVuZ3RoKCkgPiAyKSB7CiAgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBodG1s
RG9jdW1lbnQtPmZyYW1lKCkpIHsKICAgICAgICAgICAgIC8vIEZldGNoIHRoZSBnbG9iYWwgb2Jq
ZWN0IGZvciB0aGUgZnJhbWUuCi0gICAgICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNv
bnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KGZyYW1lKTsKKyAgICAgICAgICAgIHY4OjpMb2Nh
bDx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OmNvbnRleHQoZnJhbWUpOwogICAgICAg
ICAgICAgLy8gQmFpbCBvdXQgaWYgd2UgY2Fubm90IGdldCB0aGUgY29udGV4dC4KICAgICAgICAg
ICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKICAgICAgICAgICAgICAgICByZXR1cm4gdjg6OlVu
ZGVmaW5lZCgpOwpAQCAtMTYyLDcgKzE2Miw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChIVE1MRG9j
dW1lbnRPcGVuKQogICAgICAgICAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2
ZShmcmFtZSk7CiAgICAgICAgICAgICBBU1NFUlQocHJveHkpOwogCi0gICAgICAgICAgICB2ODo6
TG9jYWw8djg6OlZhbHVlPiByZXN1bHQgPSBwcm94eS0+Q2FsbEZ1bmN0aW9uKHY4OjpMb2NhbDx2
ODo6RnVuY3Rpb24+OjpDYXN0KGZ1bmN0aW9uKSwgZ2xvYmFsLCBhcmdzLkxlbmd0aCgpLCBwYXJh
bXMpOworICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmVzdWx0ID0gcHJveHktPmNh
bGxGdW5jdGlvbih2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPjo6Q2FzdChmdW5jdGlvbiksIGdsb2Jh
bCwgYXJncy5MZW5ndGgoKSwgcGFyYW1zKTsKICAgICAgICAgICAgIGRlbGV0ZVtdIHBhcmFtczsK
ICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KQEAgLTE3OSw5ICsxNzksOSBA
QCBBQ0NFU1NPUl9HRVRURVIoSFRNTERvY3VtZW50QWxsKQogICAgIElOQ19TVEFUUygiRE9NLkhU
TUxEb2N1bWVudC5hbGwuX2dldCIpOwogICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKICAgICB2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0gICAgSFRNTERv
Y3VtZW50KiBodG1sRG9jdW1lbnQgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxEb2N1
bWVudD4oaG9sZGVyKTsKKyAgICBIVE1MRG9jdW1lbnQqIGh0bWxEb2N1bWVudCA9IFY4UHJveHk6
OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxEb2N1bWVudD4oaG9sZGVyKTsKICAgICBSZWZQ
dHI8SFRNTENvbGxlY3Rpb24+IGNvbGxlY3Rpb24gPSBXVEY6OmdldFB0cihodG1sRG9jdW1lbnQt
PmFsbCgpKTsKLSAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkhU
TUxDT0xMRUNUSU9OLCBXVEY6OmdldFB0cihjb2xsZWN0aW9uKSk7CisgICAgcmV0dXJuIFY4UHJv
eHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6SFRNTENPTExFQ1RJT04sIFdURjo6
Z2V0UHRyKGNvbGxlY3Rpb24pKTsKIH0KIAogQUNDRVNTT1JfU0VUVEVSKEhUTUxEb2N1bWVudEFs
bCkKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTEZvcm1FbGVtZW50Q3Vz
dG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxG
b3JtRWxlbWVudEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhIVE1MRm9ybUVsZW1lbnRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC00MiwxOSArNDIsMTkgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogSU5ERVhFRF9QUk9QRVJUWV9H
RVRURVIoSFRNTEZvcm1FbGVtZW50KQogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxGb3JtRWxl
bWVudC5JbmRleGVkUHJvcGVydHlHZXR0ZXIiKTsKLSAgICBIVE1MRm9ybUVsZW1lbnQqIGZvcm0g
PSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxGb3JtRWxlbWVudD4oaW5mby5Ib2xkZXIo
KSk7CisgICAgSFRNTEZvcm1FbGVtZW50KiBmb3JtID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBw
ZXJUb05vZGU8SFRNTEZvcm1FbGVtZW50PihpbmZvLkhvbGRlcigpKTsKICAgICAKICAgICBSZWZQ
dHI8Tm9kZT4gZm9ybUVsZW1lbnQgPSBmb3JtLT5lbGVtZW50cygpLT5pdGVtKGluZGV4KTsKICAg
ICBpZiAoIWZvcm1FbGVtZW50KQogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0
b3IoKTsKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QoZm9ybUVsZW1lbnQuZ2V0
KCkpOworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QoZm9ybUVsZW1l
bnQuZ2V0KCkpOwogfQogCiAKIE5BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MRm9ybUVsZW1lbnQp
CiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTEZvcm1FbGVtZW50Lk5hbWVkUHJvcGVydHlHZXR0
ZXIiKTsKLSAgICBIVE1MRm9ybUVsZW1lbnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05v
ZGU8SFRNTEZvcm1FbGVtZW50PihpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MRm9ybUVsZW1lbnQq
IGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxGb3JtRWxlbWVudD4o
aW5mby5Ib2xkZXIoKSk7CiAgICAgQXRvbWljU3RyaW5nIHYgPSB2OFN0cmluZ1RvQXRvbWljV2Vi
Q29yZVN0cmluZyhuYW1lKTsKIAogICAgIC8vIENhbGwgZ2V0TmFtZWRFbGVtZW50cyB0d2ljZSwg
Zmlyc3QgdGltZSBjaGVjayBpZiBpdCBoYXMgYSB2YWx1ZQpAQCAtNzQsMTUgKzc0LDE1IEBAIE5B
TUVEX1BST1BFUlRZX0dFVFRFUihIVE1MRm9ybUVsZW1lbnQpCiAgICAgQVNTRVJUKCFlbGVtZW50
cy5pc0VtcHR5KCkpOwogCiAgICAgaWYgKGVsZW1lbnRzLnNpemUoKSA9PSAxKQotICAgICAgICBy
ZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QoZWxlbWVudHMuYXQoMCkuZ2V0KCkpOworICAg
ICAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KGVsZW1lbnRzLmF0KDAp
LmdldCgpKTsKIAogICAgIE5vZGVMaXN0KiBjb2xsZWN0aW9uID0gbmV3IFY4TmFtZWROb2Rlc0Nv
bGxlY3Rpb24oZWxlbWVudHMpOwotICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xh
c3NJbmRleDo6Tk9ERUxJU1QsIGNvbGxlY3Rpb24pOworICAgIHJldHVybiBWOFByb3h5Ojpjb252
ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok5PREVMSVNULCBjb2xsZWN0aW9uKTsKIH0KICAg
ICAKIENBTExCQUNLX0ZVTkNfREVDTChIVE1MRm9ybUVsZW1lbnRTdWJtaXQpIHsKICAgICBJTkNf
U1RBVFMoIkRPTS5IVE1MRm9ybUVsZW1lbnQuc3VibWl0KCkiKTsKLSAgICBIVE1MRm9ybUVsZW1l
bnQqIGZvcm0gPSBWOFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8SFRNTEZvcm1FbGVtZW50Pihh
cmdzLkhvbGRlcigpKTsKKyAgICBIVE1MRm9ybUVsZW1lbnQqIGZvcm0gPSBWOFByb3h5Ojpjb252
ZXJ0RE9NV3JhcHBlclRvTmF0aXZlPEhUTUxGb3JtRWxlbWVudD4oYXJncy5Ib2xkZXIoKSk7CiAg
ICAgZm9ybS0+c3VibWl0KDAsIGZhbHNlLCBmYWxzZSk7CiAgICAgcmV0dXJuIHY4OjpVbmRlZmlu
ZWQoKTsKIH0KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTEZyYW1lRWxl
bWVudEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhIVE1MRnJhbWVFbGVtZW50Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxGcmFtZUVsZW1lbnRDdXN0b20uY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zOSw3ICszOSw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogQUNDRVNTT1Jf
U0VUVEVSKEhUTUxGcmFtZUVsZW1lbnRTcmMpCiB7Ci0gICAgSFRNTEZyYW1lRWxlbWVudCogZnJh
bWUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxGcmFtZUVsZW1lbnQ+KGluZm8uSG9s
ZGVyKCkpOworICAgIEhUTUxGcmFtZUVsZW1lbnQqIGZyYW1lID0gVjhQcm94eTo6Y29udmVydERP
TVdyYXBwZXJUb05vZGU8SFRNTEZyYW1lRWxlbWVudD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgU3Ry
aW5nIHNyY1ZhbHVlID0gdG9XZWJDb3JlU3RyaW5nV2l0aE51bGxDaGVjayh2YWx1ZSk7CiAKICAg
ICBpZiAoIWFsbG93U2V0dGluZ0ZyYW1lU3JjVG9KYXZhc2NyaXB0VXJsKGZyYW1lLCBzcmNWYWx1
ZSkpCkBAIC01MCw3ICs1MCw3IEBAIEFDQ0VTU09SX1NFVFRFUihIVE1MRnJhbWVFbGVtZW50U3Jj
KQogCiBBQ0NFU1NPUl9TRVRURVIoSFRNTEZyYW1lRWxlbWVudExvY2F0aW9uKQogewotICAgIEhU
TUxGcmFtZUVsZW1lbnQqIGZyYW1lID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MRnJh
bWVFbGVtZW50PihpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MRnJhbWVFbGVtZW50KiBmcmFtZSA9
IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxGcmFtZUVsZW1lbnQ+KGluZm8u
SG9sZGVyKCkpOwogICAgIFN0cmluZyBsb2NhdGlvblZhbHVlID0gdG9XZWJDb3JlU3RyaW5nV2l0
aE51bGxDaGVjayh2YWx1ZSk7CiAKICAgICBpZiAoIWFsbG93U2V0dGluZ0ZyYW1lU3JjVG9KYXZh
c2NyaXB0VXJsKGZyYW1lLCBsb2NhdGlvblZhbHVlKSkKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4SFRNTEZyYW1lU2V0RWxlbWVudEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MRnJhbWVTZXRFbGVtZW50Q3VzdG9tLmNw
cAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxG
cmFtZVNldEVsZW1lbnRDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NywxNCArNDcsMTQg
QEAgbmFtZXNwYWNlIFdlYkNvcmUgewogTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxGcmFtZVNl
dEVsZW1lbnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTEZyYW1lU2V0RWxlbWVudC5OYW1l
ZFByb3BlcnR5R2V0dGVyIik7Ci0gICAgSFRNTEZyYW1lU2V0RWxlbWVudCogaW1wID0gVjhQcm94
eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MRnJhbWVTZXRFbGVtZW50PihpbmZvLkhvbGRlcigpKTsK
KyAgICBIVE1MRnJhbWVTZXRFbGVtZW50KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBl
clRvTm9kZTxIVE1MRnJhbWVTZXRFbGVtZW50PihpbmZvLkhvbGRlcigpKTsKICAgICBOb2RlKiBm
cmFtZU5vZGUgPSBpbXAtPmNoaWxkcmVuKCktPm5hbWVkSXRlbSh2OFN0cmluZ1RvQXRvbWljV2Vi
Q29yZVN0cmluZyhuYW1lKSk7CiAgICAgaWYgKGZyYW1lTm9kZSAmJiBmcmFtZU5vZGUtPmhhc1Rh
Z05hbWUoSFRNTE5hbWVzOjpmcmFtZVRhZykpIHsKICAgICAgICAgRG9jdW1lbnQqIGRvYyA9IHN0
YXRpY19jYXN0PEhUTUxGcmFtZUVsZW1lbnQqPihmcmFtZU5vZGUpLT5jb250ZW50RG9jdW1lbnQo
KTsKICAgICAgICAgaWYgKCFkb2MpCiAgICAgICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgp
OwogICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gZG9jLT5mcmFtZSgpKQotICAgICAgICAgICAg
cmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGZyYW1l
LT5kb21XaW5kb3coKSk7CisgICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhP
YmplY3QoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGZyYW1lLT5kb21XaW5kb3coKSk7CiAgICAg
fQogICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwogfQpJbmRleDogV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MSUZyYW1lRWxlbWVudEN1c3RvbS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MSUZyYW1lRWxlbWVudEN1
c3RvbS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhIVE1MSUZyYW1lRWxlbWVudEN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM5LDcgKzM5
LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBBQ0NFU1NPUl9TRVRURVIoSFRNTElGcmFtZUVs
ZW1lbnRTcmMpCiB7Ci0gICAgSFRNTElGcmFtZUVsZW1lbnQqIGlmcmFtZSA9IFY4UHJveHk6OkRP
TVdyYXBwZXJUb05vZGU8SFRNTElGcmFtZUVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEhU
TUxJRnJhbWVFbGVtZW50KiBpZnJhbWUgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9k
ZTxIVE1MSUZyYW1lRWxlbWVudD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgU3RyaW5nIHYgPSB2YWx1
ZVRvU3RyaW5nV2l0aE51bGxDaGVjayh2YWx1ZSk7CiAKICAgICBpZiAoIWFsbG93U2V0dGluZ0Zy
YW1lU3JjVG9KYXZhc2NyaXB0VXJsKGlmcmFtZSwgdikpCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOEhUTUxJbWFnZUVsZW1lbnRDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MSW1hZ2VFbGVtZW50Q29uc3RydWN0
b3IuY3BwCShyZXZpc2lvbiA0NTIxNikKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4
SFRNTEltYWdlRWxlbWVudENvbnN0cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTUsNyAr
NTUsNyBAQCBDQUxMQkFDS19GVU5DX0RFQ0woSFRNTEltYWdlRWxlbWVudENvbnN0CiAKICAgICAv
LyBNYWtlIHN1cmUgdGhlIGRvY3VtZW50IGlzIGFkZGVkIHRvIHRoZSBET00gTm9kZSBtYXAuIE90
aGVyd2lzZSwgdGhlIEhUTUxJbWFnZUVsZW1lbnQgaW5zdGFuY2UKICAgICAvLyBtYXkgZW5kIHVw
IGJlaW5nIHRoZSBvbmx5IG5vZGUgaW4gdGhlIG1hcCBhbmQgZ2V0IGdhcmJhZ2UtY2NvbGxlY3Rl
ZCBwcmVtYXR1cmVseS4KLSAgICBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChkb2N1bWVudCk7Cisg
ICAgVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KGRvY3VtZW50KTsKIAogICAgIFJlZlB0
cjxIVE1MSW1hZ2VFbGVtZW50PiBpbWFnZSA9IG5ldyBIVE1MSW1hZ2VFbGVtZW50KEhUTUxOYW1l
czo6aW1nVGFnLCBWOFByb3h5OjpyZXRyaWV2ZUZyYW1lKCktPmRvY3VtZW50KCkpOwogICAgIGlm
IChhcmdzLkxlbmd0aCgpID4gMCkgewpAQCAtNjQsOSArNjQsOSBAQCBDQUxMQkFDS19GVU5DX0RF
Q0woSFRNTEltYWdlRWxlbWVudENvbnN0CiAgICAgICAgICAgICBpbWFnZS0+c2V0SGVpZ2h0KHRv
SW50MzIoYXJnc1sxXSkpOwogICAgIH0KIAotICAgIFY4UHJveHk6OlNldERPTVdyYXBwZXIoYXJn
cy5Ib2xkZXIoKSwgVjhDbGFzc0luZGV4OjpUb0ludChWOENsYXNzSW5kZXg6Ok5PREUpLCBpbWFn
ZS5nZXQoKSk7CisgICAgVjhQcm94eTo6c2V0RE9NV3JhcHBlcihhcmdzLkhvbGRlcigpLCBWOENs
YXNzSW5kZXg6OlRvSW50KFY4Q2xhc3NJbmRleDo6Tk9ERSksIGltYWdlLmdldCgpKTsKICAgICBp
bWFnZS0+cmVmKCk7Ci0gICAgVjhQcm94eTo6U2V0SlNXcmFwcGVyRm9yRE9NTm9kZShpbWFnZS5n
ZXQoKSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhhcmdzLkhvbGRlcigpKSk7Cisg
ICAgVjhQcm94eTo6c2V0SlNXcmFwcGVyRm9yRE9NTm9kZShpbWFnZS5nZXQoKSwgdjg6OlBlcnNp
c3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhhcmdzLkhvbGRlcigpKSk7CiAgICAgcmV0dXJuIGFyZ3Mu
SG9sZGVyKCk7CiB9CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTElu
cHV0RWxlbWVudEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhIVE1MSW5wdXRFbGVtZW50Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxJbnB1dEVsZW1lbnRDdXN0b20uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC00MSw3ICs0MSw3IEBAIEFDQ0VTU09SX0dFVFRFUihIVE1MSW5wdXRF
bGVtZW50U2VsZWN0aW8KIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MSW5wdXRFbGVtZW50LnNl
bGVjdGlvblN0YXJ0Ll9nZXQiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9
IGluZm8uSG9sZGVyKCk7Ci0gICAgSFRNTElucHV0RWxlbWVudCogaW1wID0gVjhQcm94eTo6RE9N
V3JhcHBlclRvTm9kZTxIVE1MSW5wdXRFbGVtZW50Pihob2xkZXIpOworICAgIEhUTUxJbnB1dEVs
ZW1lbnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxJbnB1dEVs
ZW1lbnQ+KGhvbGRlcik7CiAKICAgICBpZiAoIWltcC0+Y2FuSGF2ZVNlbGVjdGlvbigpKQogICAg
ICAgICByZXR1cm4gdGhyb3dFcnJvcigiQWNjZXNzaW5nIHNlbGVjdGlvblN0YXJ0IG9uIGFuIGlu
cHV0IGVsZW1lbnQgdGhhdCBjYW5ub3QgaGF2ZSBhIHNlbGVjdGlvbi4iKTsKQEAgLTU0LDcgKzU0
LDcgQEAgQUNDRVNTT1JfU0VUVEVSKEhUTUxJbnB1dEVsZW1lbnRTZWxlY3RpbwogewogICAgIElO
Q19TVEFUUygiRE9NLkhUTUxJbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQuX3NldCIpOwogICAg
IHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gaW5mby5Ib2xkZXIoKTsKLSAgICBIVE1M
SW5wdXRFbGVtZW50KiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxJbnB1dEVs
ZW1lbnQ+KGhvbGRlcik7CisgICAgSFRNTElucHV0RWxlbWVudCogaW1wID0gVjhQcm94eTo6Y29u
dmVydERPTVdyYXBwZXJUb05vZGU8SFRNTElucHV0RWxlbWVudD4oaG9sZGVyKTsKIAogICAgIGlm
ICghaW1wLT5jYW5IYXZlU2VsZWN0aW9uKCkpIHsKICAgICAgICAgdGhyb3dFcnJvcigiQWNjZXNz
aW5nIHNlbGVjdGlvblN0YXJ0IG9uIGFuIGlucHV0IGVsZW1lbnQgdGhhdCBjYW5ub3QgaGF2ZSBh
IHNlbGVjdGlvbi4iKTsKQEAgLTY3LDcgKzY3LDcgQEAgQUNDRVNTT1JfR0VUVEVSKEhUTUxJbnB1
dEVsZW1lbnRTZWxlY3RpbwogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxJbnB1dEVsZW1lbnQu
c2VsZWN0aW9uRW5kLl9nZXQiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9
IGluZm8uSG9sZGVyKCk7Ci0gICAgSFRNTElucHV0RWxlbWVudCogaW1wID0gVjhQcm94eTo6RE9N
V3JhcHBlclRvTm9kZTxIVE1MSW5wdXRFbGVtZW50Pihob2xkZXIpOworICAgIEhUTUxJbnB1dEVs
ZW1lbnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxJbnB1dEVs
ZW1lbnQ+KGhvbGRlcik7CiAKICAgICBpZiAoIWltcC0+Y2FuSGF2ZVNlbGVjdGlvbigpKQogICAg
ICAgICByZXR1cm4gdGhyb3dFcnJvcigiQWNjZXNzaW5nIHNlbGVjdGlvbkVuZCBvbiBhbiBpbnB1
dCBlbGVtZW50IHRoYXQgY2Fubm90IGhhdmUgYSBzZWxlY3Rpb24uIik7CkBAIC04MCw3ICs4MCw3
IEBAIEFDQ0VTU09SX1NFVFRFUihIVE1MSW5wdXRFbGVtZW50U2VsZWN0aW8KIHsKICAgICBJTkNf
U1RBVFMoIkRPTS5IVE1MSW5wdXRFbGVtZW50LnNlbGVjdGlvbkVuZC5fc2V0Iik7CiAgICAgdjg6
OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBpbmZvLkhvbGRlcigpOwotICAgIEhUTUxJbnB1
dEVsZW1lbnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTElucHV0RWxlbWVu
dD4oaG9sZGVyKTsKKyAgICBIVE1MSW5wdXRFbGVtZW50KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0
RE9NV3JhcHBlclRvTm9kZTxIVE1MSW5wdXRFbGVtZW50Pihob2xkZXIpOwogCiAgICAgaWYgKCFp
bXAtPmNhbkhhdmVTZWxlY3Rpb24oKSkgewogICAgICAgICB0aHJvd0Vycm9yKCJBY2Nlc3Npbmcg
c2VsZWN0aW9uRW5kIG9uIGFuIGlucHV0IGVsZW1lbnQgdGhhdCBjYW5ub3QgaGF2ZSBhIHNlbGVj
dGlvbi4iKTsKQEAgLTk0LDcgKzk0LDcgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKEhUTUxJbnB1dEVs
ZW1lbnRTZXRTZQogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxJbnB1dEVsZW1lbnQuc2V0U2Vs
ZWN0aW9uUmFuZ2UiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGFyZ3Mu
SG9sZGVyKCk7Ci0gICAgSFRNTElucHV0RWxlbWVudCogaW1wID0gVjhQcm94eTo6RE9NV3JhcHBl
clRvTm9kZTxIVE1MSW5wdXRFbGVtZW50Pihob2xkZXIpOworICAgIEhUTUxJbnB1dEVsZW1lbnQq
IGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxJbnB1dEVsZW1lbnQ+
KGhvbGRlcik7CiAKICAgICBpZiAoIWltcC0+Y2FuSGF2ZVNlbGVjdGlvbigpKQogICAgICAgICBy
ZXR1cm4gdGhyb3dFcnJvcigiQ2FsbGluZyBzZXRTZWxlY3Rpb25SYW5nZSBvbiBhbiBpbnB1dCBl
bGVtZW50IHRoYXQgY2Fubm90IGhhdmUgYSBzZWxlY3Rpb24uIik7CkluZGV4OiBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxPcHRpb25FbGVtZW50Q29uc3RydWN0b3IuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTE9wdGlvbkVsZW1lbnRD
b25zdHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhIVE1MT3B0aW9uRWxlbWVudENvbnN0cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtODEsOSArODEsOSBAQCBDQUxMQkFDS19GVU5DX0RFQ0woSFRNTE9wdGlvbkVsZW1lbnRDb25z
CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKGFyZ3MuSG9s
ZGVyKCksIFY4Q2xhc3NJbmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpOT0RFKSwgb3B0aW9uLmdl
dCgpKTsKKyAgICBWOFByb3h5OjpzZXRET01XcmFwcGVyKGFyZ3MuSG9sZGVyKCksIFY4Q2xhc3NJ
bmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpOT0RFKSwgb3B0aW9uLmdldCgpKTsKICAgICBvcHRp
b24tPnJlZigpOwotICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU5vZGUob3B0aW9uLmdl
dCgpLCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGFyZ3MuSG9sZGVyKCkpKTsKKyAg
ICBWOFByb3h5OjpzZXRKU1dyYXBwZXJGb3JET01Ob2RlKG9wdGlvbi5nZXQoKSwgdjg6OlBlcnNp
c3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhhcmdzLkhvbGRlcigpKSk7CiAgICAgcmV0dXJuIGFyZ3Mu
SG9sZGVyKCk7CiB9CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SFRNTE9w
dGlvbnNDb2xsZWN0aW9uQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOEhUTUxPcHRpb25zQ29sbGVjdGlvbkN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1
MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MT3B0aW9uc0NvbGxlY3Rp
b25DdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Niw3ICs0Niw3IEBAIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIENBTExCQUNLX0ZVTkNfREVDTChIVE1MT3B0aW9uc0NvbGxlY3Rpb25SZW1vdmUp
CiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTE9wdGlvbnNDb2xsZWN0aW9uLnJlbW92ZSgpIik7
Ci0gICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVj
dDxIVE1MT3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNU
SU9OLCBhcmdzLkhvbGRlcigpKTsKKyAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb24qIGltcCA9IFY4
UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xh
c3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBhcmdzLkhvbGRlcigpKTsKICAgICBIVE1M
U2VsZWN0RWxlbWVudCogYmFzZSA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4oaW1w
LT5iYXNlKCkpOwogICAgIHJldHVybiByZW1vdmVFbGVtZW50KGJhc2UsIGFyZ3MpOwogfQpAQCAt
NTUsMTEgKzU1LDExIEBAIENBTExCQUNLX0ZVTkNfREVDTChIVE1MT3B0aW9uc0NvbGxlY3Rpb24K
IHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MT3B0aW9uc0NvbGxlY3Rpb24uYWRkKCkiKTsKICAg
ICBpZiAoIVY4SFRNTE9wdGlvbkVsZW1lbnQ6Okhhc0luc3RhbmNlKGFyZ3NbMF0pKSB7Ci0gICAg
ICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihUWVBFX01JU01BVENIX0VSUik7CisgICAgICAg
IFY4UHJveHk6OnNldERPTUV4Y2VwdGlvbihUWVBFX01JU01BVENIX0VSUik7CiAgICAgICAgIHJl
dHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgfQotICAgIEhUTUxPcHRpb25zQ29sbGVjdGlvbiog
aW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8SFRNTE9wdGlvbnNDb2xsZWN0aW9uPihWOENs
YXNzSW5kZXg6OkhUTUxPUFRJT05TQ09MTEVDVElPTiwgYXJncy5Ib2xkZXIoKSk7Ci0gICAgSFRN
TE9wdGlvbkVsZW1lbnQqIG9wdGlvbiA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTE9w
dGlvbkVsZW1lbnQ+KGFyZ3NbMF0pOworICAgIEhUTUxPcHRpb25zQ29sbGVjdGlvbiogaW1wID0g
VjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PEhUTUxPcHRpb25zQ29sbGVjdGlvbj4oVjhD
bGFzc0luZGV4OjpIVE1MT1BUSU9OU0NPTExFQ1RJT04sIGFyZ3MuSG9sZGVyKCkpOworICAgIEhU
TUxPcHRpb25FbGVtZW50KiBvcHRpb24gPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9k
ZTxIVE1MT3B0aW9uRWxlbWVudD4oYXJnc1swXSk7CiAKICAgICBFeGNlcHRpb25Db2RlIGVjID0g
MDsKICAgICBpZiAoYXJncy5MZW5ndGgoKSA8IDIpCkBAIC03OSw3ICs3OSw3IEBAIENBTExCQUNL
X0ZVTkNfREVDTChIVE1MT3B0aW9uc0NvbGxlY3Rpb24KICAgICB9CiAKICAgICBpZiAoZWMgIT0g
MCkKLSAgICAgICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICAgICAgVjhQcm94
eTo6c2V0RE9NRXhjZXB0aW9uKGVjKTsKIAogICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiB9
CkBAIC04Nyw3ICs4Nyw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChIVE1MT3B0aW9uc0NvbGxlY3Rp
b24KIEFDQ0VTU09SX0dFVFRFUihIVE1MT3B0aW9uc0NvbGxlY3Rpb25MZW5ndGgpCiB7CiAgICAg
SU5DX1NUQVRTKCJET00uSFRNTE9wdGlvbnNDb2xsZWN0aW9uLmxlbmd0aC5fZ2V0Iik7Ci0gICAg
SFRNTE9wdGlvbnNDb2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIVE1M
T3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBp
bmZvLkhvbGRlcigpKTsKKyAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb24qIGltcCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRl
eDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBpbmZvLkhvbGRlcigpKTsKICAgICBpbnQgdiA9IGlt
cC0+bGVuZ3RoKCk7CiAgICAgcmV0dXJuIHY4OjpJbnRlZ2VyOjpOZXcodik7CiB9CkBAIC05NSw3
ICs5NSw3IEBAIEFDQ0VTU09SX0dFVFRFUihIVE1MT3B0aW9uc0NvbGxlY3Rpb25MZW4KIEFDQ0VT
U09SX1NFVFRFUihIVE1MT3B0aW9uc0NvbGxlY3Rpb25MZW5ndGgpCiB7CiAgICAgSU5DX1NUQVRT
KCJET00uSFRNTE9wdGlvbnNDb2xsZWN0aW9uLmxlbmd0aC5fc2V0Iik7Ci0gICAgSFRNTE9wdGlv
bnNDb2xsZWN0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxIVE1MT3B0aW9uc0Nv
bGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBpbmZvLkhvbGRl
cigpKTsKKyAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRU
b05hdGl2ZU9iamVjdDxIVE1MT3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9Q
VElPTlNDT0xMRUNUSU9OLCBpbmZvLkhvbGRlcigpKTsKICAgICBkb3VibGUgdiA9IHZhbHVlLT5O
dW1iZXJWYWx1ZSgpOwogICAgIHVuc2lnbmVkIG5ld0xlbmd0aCA9IDA7CiAgICAgRXhjZXB0aW9u
Q29kZSBlYyA9IDA7CkBAIC0xMTAsMjUgKzExMCwyNSBAQCBBQ0NFU1NPUl9TRVRURVIoSFRNTE9w
dGlvbnNDb2xsZWN0aW9uTGVuCiAgICAgaWYgKCFlYykKICAgICAgICAgaW1wLT5zZXRMZW5ndGgo
dmFsdWUtPlVpbnQzMlZhbHVlKCksIGVjKTsKIAotICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlv
bihlYyk7CisgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9uKGVjKTsKIH0KIAogSU5ERVhFRF9Q
Uk9QRVJUWV9HRVRURVIoSFRNTE9wdGlvbnNDb2xsZWN0aW9uKQogewogICAgIElOQ19TVEFUUygi
RE9NLkhUTUxPcHRpb25zQ29sbGVjdGlvbi5JbmRleGVkUHJvcGVydHlHZXR0ZXIiKTsKLSAgICBI
VE1MT3B0aW9uc0NvbGxlY3Rpb24qIGNvbGxlY3Rpb24gPSBWOFByb3h5OjpUb05hdGl2ZU9iamVj
dDxIVE1MT3B0aW9uc0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNU
SU9OLCBpbmZvLkhvbGRlcigpKTsKKyAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb24qIGNvbGxlY3Rp
b24gPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8SFRNTE9wdGlvbnNDb2xsZWN0aW9u
PihWOENsYXNzSW5kZXg6OkhUTUxPUFRJT05TQ09MTEVDVElPTiwgaW5mby5Ib2xkZXIoKSk7CiAK
ICAgICBSZWZQdHI8Tm9kZT4gcmVzdWx0ID0gY29sbGVjdGlvbi0+aXRlbShpbmRleCk7CiAgICAg
aWYgKCFyZXN1bHQpCiAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwog
Ci0gICAgcmV0dXJuIFY4UHJveHk6Ok5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CisgICAg
cmV0dXJuIFY4UHJveHk6OmNvbnZlcnROb2RlVG9WOE9iamVjdChyZXN1bHQuZ2V0KCkpOwogfQog
CiBJTkRFWEVEX1BST1BFUlRZX1NFVFRFUihIVE1MT3B0aW9uc0NvbGxlY3Rpb24pCiB7CiAgICAg
SU5DX1NUQVRTKCJET00uSFRNTE9wdGlvbnNDb2xsZWN0aW9uLkluZGV4ZWRQcm9wZXJ0eVNldHRl
ciIpOwotICAgIEhUTUxPcHRpb25zQ29sbGVjdGlvbiogY29sbGVjdGlvbiA9IFY4UHJveHk6OlRv
TmF0aXZlT2JqZWN0PEhUTUxPcHRpb25zQ29sbGVjdGlvbj4oVjhDbGFzc0luZGV4OjpIVE1MT1BU
SU9OU0NPTExFQ1RJT04sIGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxPcHRpb25zQ29sbGVjdGlv
biogY29sbGVjdGlvbiA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxIVE1MT3B0aW9u
c0NvbGxlY3Rpb24+KFY4Q2xhc3NJbmRleDo6SFRNTE9QVElPTlNDT0xMRUNUSU9OLCBpbmZvLkhv
bGRlcigpKTsKICAgICBIVE1MU2VsZWN0RWxlbWVudCogYmFzZSA9IHN0YXRpY19jYXN0PEhUTUxT
ZWxlY3RFbGVtZW50Kj4oY29sbGVjdGlvbi0+YmFzZSgpKTsKICAgICByZXR1cm4gdG9PcHRpb25z
Q29sbGVjdGlvblNldHRlcihpbmRleCwgdmFsdWUsIGJhc2UpOwogfQpJbmRleDogV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhIVE1MUGx1Z0luRWxlbWVudEN1c3RvbS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MUGx1Z0luRWxlbWVudEN1c3Rv
bS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhI
VE1MUGx1Z0luRWxlbWVudEN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDcgKzQ1LDcg
QEAgbmFtZXNwYWNlIFdlYkNvcmUgewogTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxQbHVnSW5F
bGVtZW50KQogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxQbHVnSW5FbGVtZW50Lk5hbWVkUHJv
cGVydHlHZXR0ZXIiKTsKLSAgICBIVE1MUGx1Z0luRWxlbWVudCogaW1wID0gVjhQcm94eTo6RE9N
V3JhcHBlclRvTm9kZTxIVE1MUGx1Z0luRWxlbWVudD4oaW5mby5Ib2xkZXIoKSk7CisgICAgSFRN
TFBsdWdJbkVsZW1lbnQqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPEhU
TUxQbHVnSW5FbGVtZW50PihpbmZvLkhvbGRlcigpKTsKICAgICBTY3JpcHRJbnN0YW5jZSBzY3Jp
cHRJbnN0YW5jZSA9IGltcC0+Z2V0SW5zdGFuY2UoKTsKICAgICBpZiAoIXNjcmlwdEluc3RhbmNl
KQogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKQEAgLTYwLDcgKzYw
LDcgQEAgTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxQbHVnSW5FbGVtZW50KQogTkFNRURfUFJP
UEVSVFlfU0VUVEVSKEhUTUxQbHVnSW5FbGVtZW50KQogewogICAgIElOQ19TVEFUUygiRE9NLkhU
TUxQbHVnSW5FbGVtZW50Lk5hbWVkUHJvcGVydHlTZXR0ZXIiKTsKLSAgICBIVE1MUGx1Z0luRWxl
bWVudCogaW1wID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MUGx1Z0luRWxlbWVudD4o
aW5mby5Ib2xkZXIoKSk7CisgICAgSFRNTFBsdWdJbkVsZW1lbnQqIGltcCA9IFY4UHJveHk6OmNv
bnZlcnRET01XcmFwcGVyVG9Ob2RlPEhUTUxQbHVnSW5FbGVtZW50PihpbmZvLkhvbGRlcigpKTsK
ICAgICBTY3JpcHRJbnN0YW5jZSBzY3JpcHRJbnN0YW5jZSA9IGltcC0+Z2V0SW5zdGFuY2UoKTsK
ICAgICBpZiAoIXNjcmlwdEluc3RhbmNlKQogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50
ZXJjZXB0b3IoKTsKQEAgLTgxLDcgKzgxLDcgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKEhUTUxQbHVn
SW5FbGVtZW50KQogSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoSFRNTFBsdWdJbkVsZW1lbnQpCiB7
CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTFBsdWdJbkVsZW1lbnQuSW5kZXhlZFByb3BlcnR5R2V0
dGVyIik7Ci0gICAgSFRNTFBsdWdJbkVsZW1lbnQqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJU
b05vZGU8SFRNTFBsdWdJbkVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOworICAgIEhUTUxQbHVnSW5F
bGVtZW50KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxIVE1MUGx1Z0lu
RWxlbWVudD4oaW5mby5Ib2xkZXIoKSk7CiAgICAgU2NyaXB0SW5zdGFuY2Ugc2NyaXB0SW5zdGFu
Y2UgPSBpbXAtPmdldEluc3RhbmNlKCk7CiAgICAgaWYgKCFzY3JpcHRJbnN0YW5jZSkKICAgICAg
ICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CkBAIC05Niw3ICs5Niw3IEBAIElO
REVYRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxQbHVnSW5FbGVtZW4KIElOREVYRURfUFJPUEVSVFlf
U0VUVEVSKEhUTUxQbHVnSW5FbGVtZW50KQogewogICAgIElOQ19TVEFUUygiRE9NLkhUTUxQbHVn
SW5FbGVtZW50LkluZGV4ZWRQcm9wZXJ0eVNldHRlciIpOwotICAgIEhUTUxQbHVnSW5FbGVtZW50
KiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxQbHVnSW5FbGVtZW50PihpbmZv
LkhvbGRlcigpKTsKKyAgICBIVE1MUGx1Z0luRWxlbWVudCogaW1wID0gVjhQcm94eTo6Y29udmVy
dERPTVdyYXBwZXJUb05vZGU8SFRNTFBsdWdJbkVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOwogICAg
IFNjcmlwdEluc3RhbmNlIHNjcmlwdEluc3RhbmNlID0gaW1wLT5nZXRJbnN0YW5jZSgpOwogICAg
IGlmICghc2NyaXB0SW5zdGFuY2UpCiAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNl
cHRvcigpOwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MU2VsZWN0RWxl
bWVudENvbGxlY3Rpb25DdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4SFRNTFNlbGVjdEVsZW1lbnRDb2xsZWN0aW9uQ3VzdG9tLmNwcAkocmV2aXNp
b24gNDUyMTYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEhUTUxTZWxlY3RFbGVt
ZW50Q29sbGVjdGlvbkN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQzLDcgKzQzLDcgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogTkFNRURfUFJPUEVSVFlfR0VUVEVSKEhUTUxTZWxlY3RFbGVt
ZW50Q29sbGVjdGlvbikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5IVE1MU2VsZWN0RWxlbWVudENv
bGxlY3Rpb24uTmFtZWRQcm9wZXJ0eVNldHRlciIpOwotICAgIEhUTUxTZWxlY3RFbGVtZW50KiBz
ZWxlY3QgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxTZWxlY3RFbGVtZW50PihpbmZv
LkhvbGRlcigpKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gVjhQcm94eTo6Y29u
dmVydERPTVdyYXBwZXJUb05vZGU8SFRNTFNlbGVjdEVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOwog
ICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSA9IGluZm8uSG9sZGVyKCktPkdldFJlYWxO
YW1lZFByb3BlcnR5SW5Qcm90b3R5cGVDaGFpbihuYW1lKTsKIAogICAgIGlmICghdmFsdWUuSXNF
bXB0eSgpKQpAQCAtNjIsMTYgKzYyLDE2IEBAIE5BTUVEX1BST1BFUlRZX0dFVFRFUihIVE1MU2Vs
ZWN0RWxlbWVudEMKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAK
ICAgICBpZiAoaXRlbXMuc2l6ZSgpID09IDEpCi0gICAgICAgIHJldHVybiBWOFByb3h5OjpOb2Rl
VG9WOE9iamVjdChpdGVtcy5hdCgwKS5nZXQoKSk7CisgICAgICAgIHJldHVybiBWOFByb3h5Ojpj
b252ZXJ0Tm9kZVRvVjhPYmplY3QoaXRlbXMuYXQoMCkuZ2V0KCkpOwogCiAgICAgTm9kZUxpc3Qq
IGxpc3QgPSBuZXcgVjhOYW1lZE5vZGVzQ29sbGVjdGlvbihpdGVtcyk7Ci0gICAgcmV0dXJuIFY4
UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpOT0RFTElTVCwgbGlzdCk7CisgICAgcmV0
dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6Tk9ERUxJU1QsIGxp
c3QpOwogfQogCiBJTkRFWEVEX1BST1BFUlRZX1NFVFRFUihIVE1MU2VsZWN0RWxlbWVudENvbGxl
Y3Rpb24pCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRNTFNlbGVjdEVsZW1lbnRDb2xsZWN0aW9u
LkluZGV4ZWRQcm9wZXJ0eVNldHRlciIpOwotICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3Qg
PSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxTZWxlY3RFbGVtZW50PihpbmZvLkhvbGRl
cigpKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gVjhQcm94eTo6Y29udmVydERP
TVdyYXBwZXJUb05vZGU8SFRNTFNlbGVjdEVsZW1lbnQ+KGluZm8uSG9sZGVyKCkpOwogICAgIHJl
dHVybiB0b09wdGlvbnNDb2xsZWN0aW9uU2V0dGVyKGluZGV4LCB2YWx1ZSwgc2VsZWN0KTsKIH0K
IApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1MU2VsZWN0RWxlbWVudEN1
c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhIVE1M
U2VsZWN0RWxlbWVudEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhIVE1MU2VsZWN0RWxlbWVudEN1c3RvbS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTQ0LDE0ICs0NCwxNCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBDQUxMQkFDS19GVU5D
X0RFQ0woSFRNTFNlbGVjdEVsZW1lbnRSZW1vdmUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uSFRN
TFNlbGVjdEVsZW1lbnQucmVtb3ZlIik7Ci0gICAgSFRNTFNlbGVjdEVsZW1lbnQqIGltcCA9IFY4
UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8SFRNTFNlbGVjdEVsZW1lbnQ+KGFyZ3MuSG9sZGVyKCkp
OworICAgIEhUTUxTZWxlY3RFbGVtZW50KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBl
clRvTm9kZTxIVE1MU2VsZWN0RWxlbWVudD4oYXJncy5Ib2xkZXIoKSk7CiAgICAgcmV0dXJuIHJl
bW92ZUVsZW1lbnQoaW1wLCBhcmdzKTsKIH0KIAogdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJlbW92
ZUVsZW1lbnQoSFRNTFNlbGVjdEVsZW1lbnQqIGltcCwgY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJn
cykgCiB7CiAgICAgaWYgKFY4SFRNTE9wdGlvbkVsZW1lbnQ6Okhhc0luc3RhbmNlKGFyZ3NbMF0p
KSB7Ci0gICAgICAgIEhUTUxPcHRpb25FbGVtZW50KiBlbGVtZW50ID0gVjhQcm94eTo6RE9NV3Jh
cHBlclRvTm9kZTxIVE1MT3B0aW9uRWxlbWVudD4oYXJnc1swXSk7CisgICAgICAgIEhUTUxPcHRp
b25FbGVtZW50KiBlbGVtZW50ID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8SFRN
TE9wdGlvbkVsZW1lbnQ+KGFyZ3NbMF0pOwogICAgICAgICBpbXAtPnJlbW92ZShlbGVtZW50LT5p
bmRleCgpKTsKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKICAgICB9CkluZGV4OiBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEluc3BlY3RvckNvbnRyb2xsZXJDdXN0b20uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4SW5zcGVjdG9yQ29u
dHJvbGxlckN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhJbnNwZWN0b3JDb250cm9sbGVyQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNTYsMTEgKzU2LDExIEBAIENBTExCQUNLX0ZVTkNfREVDTChJbnNwZWN0b3JDb250cm9sbGVy
SGkKICAgICBpZiAoYXJncy5MZW5ndGgoKSA8IDEpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZp
bmVkKCk7CiAKLSAgICBOb2RlKiBub2RlID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxOb2Rl
PihhcmdzWzBdKTsKKyAgICBOb2RlKiBub2RlID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJU
b05vZGU8Tm9kZT4oYXJnc1swXSk7CiAgICAgaWYgKCFub2RlKQogICAgICAgICByZXR1cm4gdjg6
OlVuZGVmaW5lZCgpOwogCi0gICAgSW5zcGVjdG9yQ29udHJvbGxlciogaW5zcGVjdG9yQ29udHJv
bGxlciA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+KFY4Q2xh
c3NJbmRleDo6SU5TUEVDVE9SQ09OVFJPTExFUiwgYXJncy5Ib2xkZXIoKSk7CisgICAgSW5zcGVj
dG9yQ29udHJvbGxlciogaW5zcGVjdG9yQ29udHJvbGxlciA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxJbnNwZWN0b3JDb250cm9sbGVyPihWOENsYXNzSW5kZXg6OklOU1BFQ1RPUkNP
TlRST0xMRVIsIGFyZ3MuSG9sZGVyKCkpOwogICAgIGluc3BlY3RvckNvbnRyb2xsZXItPmhpZ2hs
aWdodChub2RlKTsKIAogICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CkBAIC03OCw3ICs3OCw3
IEBAIENBTExCQUNLX0ZVTkNfREVDTChJbnNwZWN0b3JDb250cm9sbGVyR2UKIAogICAgIHVuc2ln
bmVkIGlkZW50aWZpZXIgPSBhcmdzWzFdLT5JbnQzMlZhbHVlKCk7CiAKLSAgICBJbnNwZWN0b3JD
b250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8
SW5zcGVjdG9yQ29udHJvbGxlcj4oVjhDbGFzc0luZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVSLCBh
cmdzLkhvbGRlcigpKTsKKyAgICBJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9s
bGVyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+
KFY4Q2xhc3NJbmRleDo6SU5TUEVDVE9SQ09OVFJPTExFUiwgYXJncy5Ib2xkZXIoKSk7CiAgICAg
UmVmUHRyPEluc3BlY3RvclJlc291cmNlPiByZXNvdXJjZSA9IGluc3BlY3RvckNvbnRyb2xsZXIt
PnJlc291cmNlcygpLmdldChpZGVudGlmaWVyKTsKICAgICBBU1NFUlQocmVzb3VyY2UpOwogICAg
IGlmICghcmVzb3VyY2UpCkBAIC05MCw3ICs5MCw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChJbnNw
ZWN0b3JDb250cm9sbGVyR2UKICAgICBpZiAoZG9jdW1lbnQtPmlzUGx1Z2luRG9jdW1lbnQoKSB8
fCBkb2N1bWVudC0+aXNJbWFnZURvY3VtZW50KCkgfHwgZG9jdW1lbnQtPmlzTWVkaWFEb2N1bWVu
dCgpKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgcmV0dXJuIFY4UHJv
eHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET0NVTUVOVCwgZG9jdW1lbnQpOworICAgIHJl
dHVybiBWOFByb3h5Ojpjb252ZXJ0VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkRPQ1VNRU5ULCBk
b2N1bWVudCk7CiB9CiAKIENBTExCQUNLX0ZVTkNfREVDTChJbnNwZWN0b3JDb250cm9sbGVyU2Vh
cmNoKQpAQCAtMTAwLDcgKzEwMCw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChJbnNwZWN0b3JDb250
cm9sbGVyU2UKICAgICBpZiAoYXJncy5MZW5ndGgoKSA8IDIpCiAgICAgICAgIHJldHVybiB2ODo6
VW5kZWZpbmVkKCk7CiAKLSAgICBOb2RlKiBub2RlID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9k
ZTxOb2RlPihhcmdzWzBdKTsKKyAgICBOb2RlKiBub2RlID0gVjhQcm94eTo6Y29udmVydERPTVdy
YXBwZXJUb05vZGU8Tm9kZT4oYXJnc1swXSk7CiAgICAgaWYgKCFub2RlKQogICAgICAgICByZXR1
cm4gdjg6OlVuZGVmaW5lZCgpOwogCkBAIC0xMjQsNyArMTI0LDcgQEAgQ0FMTEJBQ0tfRlVOQ19E
RUNMKEluc3BlY3RvckNvbnRyb2xsZXJTZQogICAgICAgICBpZiAobmV3U3RhcnQgPT0gc3RhcnRW
aXNpYmxlUG9zaXRpb24oc2VhcmNoUmFuZ2UuZ2V0KCksIERPV05TVFJFQU0pKQogICAgICAgICAg
ICAgYnJlYWs7CiAKLSAgICAgICAgcmVzdWx0LT5TZXQodjg6Ok51bWJlcjo6TmV3KGluZGV4Kysp
LCBWOFByb3h5OjpUb1Y4T2JqZWN0PFJhbmdlPihWOENsYXNzSW5kZXg6OlJBTkdFLCByZXN1bHRS
YW5nZS5nZXQoKSkpOworICAgICAgICByZXN1bHQtPlNldCh2ODo6TnVtYmVyOjpOZXcoaW5kZXgr
KyksIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0PFJhbmdlPihWOENsYXNzSW5kZXg6OlJBTkdF
LCByZXN1bHRSYW5nZS5nZXQoKSkpOwogCiAgICAgICAgIHNldFN0YXJ0KHNlYXJjaFJhbmdlLmdl
dCgpLCBuZXdTdGFydCk7CiAgICAgfSB3aGlsZSAodHJ1ZSk7CkBAIC0xNDUsOCArMTQ1LDggQEAg
Q0FMTEJBQ0tfRlVOQ19ERUNMKEluc3BlY3RvckNvbnRyb2xsZXJJbgogewogICAgIElOQ19TVEFU
UygiSW5zcGVjdG9yQ29udHJvbGxlci5pbnNwZWN0ZWRXaW5kb3coKSIpOwogCi0gICAgSW5zcGVj
dG9yQ29udHJvbGxlciogaW5zcGVjdG9yQ29udHJvbGxlciA9IFY4UHJveHk6OlRvTmF0aXZlT2Jq
ZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+KFY4Q2xhc3NJbmRleDo6SU5TUEVDVE9SQ09OVFJPTExF
UiwgYXJncy5Ib2xkZXIoKSk7Ci0gICAgcmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3Q8RE9NV2lu
ZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVj
dGVkUGFnZSgpLT5tYWluRnJhbWUoKS0+ZG9tV2luZG93KCkpOworICAgIEluc3BlY3RvckNvbnRy
b2xsZXIqIGluc3BlY3RvckNvbnRyb2xsZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmpl
Y3Q8SW5zcGVjdG9yQ29udHJvbGxlcj4oVjhDbGFzc0luZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVS
LCBhcmdzLkhvbGRlcigpKTsKKyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3Q8
RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaW5zcGVjdG9yQ29udHJvbGxlci0+
aW5zcGVjdGVkUGFnZSgpLT5tYWluRnJhbWUoKS0+ZG9tV2luZG93KCkpOwogfQogCiBDQUxMQkFD
S19GVU5DX0RFQ0woSW5zcGVjdG9yQ29udHJvbGxlclNldHRpbmcpCkBAIC0xNjAsNyArMTYwLDcg
QEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKEluc3BlY3RvckNvbnRyb2xsZXJTZQogICAgIGlmIChrZXku
aXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgSW5zcGVj
dG9yQ29udHJvbGxlciogaW5zcGVjdG9yQ29udHJvbGxlciA9IFY4UHJveHk6OlRvTmF0aXZlT2Jq
ZWN0PEluc3BlY3RvckNvbnRyb2xsZXI+KFY4Q2xhc3NJbmRleDo6SU5TUEVDVE9SQ09OVFJPTExF
UiwgYXJncy5Ib2xkZXIoKSk7CisgICAgSW5zcGVjdG9yQ29udHJvbGxlciogaW5zcGVjdG9yQ29u
dHJvbGxlciA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxJbnNwZWN0b3JDb250cm9s
bGVyPihWOENsYXNzSW5kZXg6OklOU1BFQ1RPUkNPTlRST0xMRVIsIGFyZ3MuSG9sZGVyKCkpOwog
ICAgIGNvbnN0IEluc3BlY3RvckNvbnRyb2xsZXI6OlNldHRpbmcmIHNldHRpbmcgPSBpbnNwZWN0
b3JDb250cm9sbGVyIC0+c2V0dGluZyhrZXkpOwogCiAgICAgc3dpdGNoIChzZXR0aW5nLnR5cGUo
KSkgewpAQCAtMjIxLDcgKzIyMSw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChJbnNwZWN0b3JDb250
cm9sbGVyU2UKICAgICB9IGVsc2UKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAot
ICAgIEluc3BlY3RvckNvbnRyb2xsZXIqIGluc3BlY3RvckNvbnRyb2xsZXIgPSBWOFByb3h5OjpU
b05hdGl2ZU9iamVjdDxJbnNwZWN0b3JDb250cm9sbGVyPihWOENsYXNzSW5kZXg6OklOU1BFQ1RP
UkNPTlRST0xMRVIsIGFyZ3MuSG9sZGVyKCkpOworICAgIEluc3BlY3RvckNvbnRyb2xsZXIqIGlu
c3BlY3RvckNvbnRyb2xsZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8SW5zcGVj
dG9yQ29udHJvbGxlcj4oVjhDbGFzc0luZGV4OjpJTlNQRUNUT1JDT05UUk9MTEVSLCBhcmdzLkhv
bGRlcigpKTsKICAgICBpbnNwZWN0b3JDb250cm9sbGVyLT5zZXRTZXR0aW5nKGtleSwgc2V0dGlu
Zyk7CiAKICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwpJbmRleDogV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhMb2NhdGlvbkN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhMb2NhdGlvbkN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MjE2KQor
KysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhMb2NhdGlvbkN1c3RvbS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTYyLDcgKzYyLDcgQEAgQUNDRVNTT1JfU0VUVEVSKExvY2F0aW9uSGFzaCkK
IHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5oYXNoLl9zZXQiKTsKICAgICB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0gICAgTG9jYXRpb24qIGlt
cCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FU
SU9OLCBob2xkZXIpOworICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRp
dmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvbGRlcik7CiAgICAg
U3RyaW5nIGhhc2ggPSB0b1dlYkNvcmVTdHJpbmcodmFsdWUpOwogCiAgICAgRnJhbWUqIGZyYW1l
ID0gaW1wLT5mcmFtZSgpOwpAQCAtODUsNyArODUsNyBAQCBBQ0NFU1NPUl9TRVRURVIoTG9jYXRp
b25Ib3N0KQogewogICAgIElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLmhvc3QuX3NldCIpOwogICAg
IHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gaW5mby5Ib2xkZXIoKTsKLSAgICBMb2Nh
dGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRl
eDo6TE9DQVRJT04sIGhvbGRlcik7CisgICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OmNvbnZl
cnRUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVy
KTsKICAgICBTdHJpbmcgaG9zdCA9IHRvV2ViQ29yZVN0cmluZyh2YWx1ZSk7CiAKICAgICBGcmFt
ZSogZnJhbWUgPSBpbXAtPmZyYW1lKCk7CkBAIC0xMDUsNyArMTA1LDcgQEAgQUNDRVNTT1JfU0VU
VEVSKExvY2F0aW9uSG9zdG5hbWUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uTG9jYXRpb24uaG9z
dG5hbWUuX3NldCIpOwogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gaW5mby5I
b2xkZXIoKTsKLSAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TG9j
YXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvbGRlcik7CisgICAgTG9jYXRpb24qIGlt
cCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4
OjpMT0NBVElPTiwgaG9sZGVyKTsKICAgICBTdHJpbmcgaG9zdG5hbWUgPSB0b1dlYkNvcmVTdHJp
bmcodmFsdWUpOwogCiAgICAgRnJhbWUqIGZyYW1lID0gaW1wLT5mcmFtZSgpOwpAQCAtMTIyLDcg
KzEyMiw3IEBAIEFDQ0VTU09SX1NFVFRFUihMb2NhdGlvbkhyZWYpCiB7CiAgICAgSU5DX1NUQVRT
KCJET00uTG9jYXRpb24uaHJlZi5fc2V0Iik7CiAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBo
b2xkZXIgPSBpbmZvLkhvbGRlcigpOwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05h
dGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAg
ICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExvY2F0aW9u
PihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwogCiAgICAgRnJhbWUqIGZyYW1lID0g
aW1wLT5mcmFtZSgpOwogICAgIGlmICghZnJhbWUpCkBAIC0xNDIsNyArMTQyLDcgQEAgQUNDRVNT
T1JfU0VUVEVSKExvY2F0aW9uUGF0aG5hbWUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uTG9jYXRp
b24ucGF0aG5hbWUuX3NldCIpOwogICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0g
aW5mby5Ib2xkZXIoKTsKLSAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmpl
Y3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvbGRlcik7CisgICAgTG9jYXRp
b24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFz
c0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKICAgICBTdHJpbmcgcGF0aG5hbWUgPSB0b1dlYkNv
cmVTdHJpbmcodmFsdWUpOwogCiAgICAgRnJhbWUqIGZyYW1lID0gaW1wLT5mcmFtZSgpOwpAQCAt
MTU5LDcgKzE1OSw3IEBAIEFDQ0VTU09SX1NFVFRFUihMb2NhdGlvblBvcnQpCiB7CiAgICAgSU5D
X1NUQVRTKCJET00uTG9jYXRpb24ucG9ydC5fc2V0Iik7CiAgICAgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0PiBob2xkZXIgPSBpbmZvLkhvbGRlcigpOwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVy
KTsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExv
Y2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwogICAgIFN0cmluZyBwb3J0
ID0gdG9XZWJDb3JlU3RyaW5nKHZhbHVlKTsKIAogICAgIEZyYW1lKiBmcmFtZSA9IGltcC0+ZnJh
bWUoKTsKQEAgLTE3Niw3ICsxNzYsNyBAQCBBQ0NFU1NPUl9TRVRURVIoTG9jYXRpb25Qcm90b2Nv
bCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5wcm90b2NvbC5fc2V0Iik7CiAgICAg
djg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBpbmZvLkhvbGRlcigpOwotICAgIExvY2F0
aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4
OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAgICBMb2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVy
dFRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIp
OwogICAgIFN0cmluZyBwcm90b2NvbCA9IHRvV2ViQ29yZVN0cmluZyh2YWx1ZSk7CiAKICAgICBG
cmFtZSogZnJhbWUgPSBpbXAtPmZyYW1lKCk7CkBAIC0xOTMsNyArMTkzLDcgQEAgQUNDRVNTT1Jf
U0VUVEVSKExvY2F0aW9uU2VhcmNoKQogewogICAgIElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLnNl
YXJjaC5fc2V0Iik7CiAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBpbmZvLkhv
bGRlcigpOwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2Nh
dGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAgICBMb2NhdGlvbiogaW1w
ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6
OkxPQ0FUSU9OLCBob2xkZXIpOwogICAgIFN0cmluZyBxdWVyeSA9IHRvV2ViQ29yZVN0cmluZyh2
YWx1ZSk7CiAKICAgICBGcmFtZSogZnJhbWUgPSBpbXAtPmZyYW1lKCk7CkBAIC0yMTAsMTQgKzIx
MCwxNCBAQCBBQ0NFU1NPUl9HRVRURVIoTG9jYXRpb25SZWxvYWQpCiB7CiAgICAgSU5DX1NUQVRT
KCJET00uTG9jYXRpb24ucmVsb2FkLl9nZXQiKTsKICAgICBzdGF0aWMgdjg6OlBlcnNpc3RlbnQ8
djg6OkZ1bmN0aW9uVGVtcGxhdGU+IHByaXZhdGVUZW1wbGF0ZSA9IHY4OjpQZXJzaXN0ZW50PHY4
OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcodjhMb2Nh
dGlvblJlbG9hZENhbGxiYWNrLCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKSwgdjg6OlNpZ25hdHVy
ZTo6TmV3KFY4TG9jYXRpb246OkdldFJhd1RlbXBsYXRlKCkpKSk7Ci0gICAgdjg6OkhhbmRsZTx2
ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5OjpMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRl
eDo6TE9DQVRJT04sIGluZm8uVGhpcygpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhv
bGRlciA9IFY4UHJveHk6Omxvb2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpMT0NBVElPTiwg
aW5mby5UaGlzKCkpOwogICAgIGlmIChob2xkZXIuSXNFbXB0eSgpKSB7CiAgICAgICAgIC8vIGNh
biBvbmx5IHJlYWNoIGhlcmUgYnkgJ29iamVjdC5fX3Byb3RvX18uZnVuYycsIGFuZCBpdCBzaG91
bGQgcGFzc2VkCiAgICAgICAgIC8vIGRvbWFpbiBzZWN1cml0eSBjaGVjayBhbHJlYWR5CiAgICAg
ICAgIHJldHVybiBwcml2YXRlVGVtcGxhdGUtPkdldEZ1bmN0aW9uKCk7CiAgICAgfQotICAgIExv
Y2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0lu
ZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKLSAgICBpZiAoIVY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1l
KGltcC0+ZnJhbWUoKSwgZmFsc2UpKSB7CisgICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OmNv
bnZlcnRUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9s
ZGVyKTsKKyAgICBpZiAoIVY4UHJveHk6OmNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgZmFs
c2UpKSB7CiAgICAgICAgIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0
ZT4gc2hhcmVkVGVtcGxhdGUgPSB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT46
Ok5ldyh2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KHY4TG9jYXRpb25SZWxvYWRDYWxsYmFjaywg
djg6OkhhbmRsZTx2ODo6VmFsdWU+KCksIHY4OjpTaWduYXR1cmU6Ok5ldyhWOExvY2F0aW9uOjpH
ZXRSYXdUZW1wbGF0ZSgpKSkpOwogICAgICAgICByZXR1cm4gc2hhcmVkVGVtcGxhdGUtPkdldEZ1
bmN0aW9uKCk7CiAgICAgfSBlbHNlCkBAIC0yMjgsMTQgKzIyOCwxNCBAQCBBQ0NFU1NPUl9HRVRU
RVIoTG9jYXRpb25SZXBsYWNlKQogewogICAgIElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLnJlcGxh
Y2UuX2dldCIpOwogICAgIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0
ZT4gcHJpdmF0ZVRlbXBsYXRlID0gdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+
OjpOZXcodjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyh2OExvY2F0aW9uUmVwbGFjZUNhbGxiYWNr
LCB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKSwgdjg6OlNpZ25hdHVyZTo6TmV3KFY4TG9jYXRpb246
OkdldFJhd1RlbXBsYXRlKCkpKSk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIg
PSBWOFByb3h5OjpMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGluZm8u
VGhpcygpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Omxv
b2t1cERPTVdyYXBwZXIoVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaW5mby5UaGlzKCkpOwogICAg
IGlmIChob2xkZXIuSXNFbXB0eSgpKSB7CiAgICAgICAgIC8vIGNhbiBvbmx5IHJlYWNoIGhlcmUg
YnkgJ29iamVjdC5fX3Byb3RvX18uZnVuYycsIGFuZCBpdCBzaG91bGQgcGFzc2VkCiAgICAgICAg
IC8vIGRvbWFpbiBzZWN1cml0eSBjaGVjayBhbHJlYWR5CiAgICAgICAgIHJldHVybiBwcml2YXRl
VGVtcGxhdGUtPkdldEZ1bmN0aW9uKCk7CiAgICAgfQotICAgIExvY2F0aW9uKiBpbXAgPSBWOFBy
b3h5OjpUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9s
ZGVyKTsKLSAgICBpZiAoIVY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgZmFs
c2UpKSB7CisgICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVj
dDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAgICBpZiAoIVY4
UHJveHk6OmNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgZmFsc2UpKSB7CiAgICAgICAgIHN0
YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gc2hhcmVkVGVtcGxhdGUg
PSB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT46Ok5ldyh2ODo6RnVuY3Rpb25U
ZW1wbGF0ZTo6TmV3KHY4TG9jYXRpb25SZXBsYWNlQ2FsbGJhY2ssIHY4OjpIYW5kbGU8djg6OlZh
bHVlPigpLCB2ODo6U2lnbmF0dXJlOjpOZXcoVjhMb2NhdGlvbjo6R2V0UmF3VGVtcGxhdGUoKSkp
KTsKICAgICAgICAgcmV0dXJuIHNoYXJlZFRlbXBsYXRlLT5HZXRGdW5jdGlvbigpOwogICAgIH0g
ZWxzZQpAQCAtMjQ3LDE0ICsyNDcsMTQgQEAgQUNDRVNTT1JfR0VUVEVSKExvY2F0aW9uQXNzaWdu
KQogICAgIElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLmFzc2lnbi5fZ2V0Iik7CiAgICAgc3RhdGlj
IHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBwcml2YXRlVGVtcGxhdGUgPQog
ICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KHY4OjpGdW5jdGlv
blRlbXBsYXRlOjpOZXcodjhMb2NhdGlvbkFzc2lnbkNhbGxiYWNrLCB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4oKSwgdjg6OlNpZ25hdHVyZTo6TmV3KFY4TG9jYXRpb246OkdldFJhd1RlbXBsYXRlKCkp
KSk7Ci0gICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5OjpMb29rdXBE
T01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGluZm8uVGhpcygpKTsKKyAgICB2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Omxvb2t1cERPTVdyYXBwZXIoVjhD
bGFzc0luZGV4OjpMT0NBVElPTiwgaW5mby5UaGlzKCkpOwogICAgIGlmIChob2xkZXIuSXNFbXB0
eSgpKSB7CiAgICAgICAgIC8vIGNhbiBvbmx5IHJlYWNoIGhlcmUgYnkgJ29iamVjdC5fX3Byb3Rv
X18uZnVuYycsIGFuZCBpdCBzaG91bGQgcGFzc2VkCiAgICAgICAgIC8vIGRvbWFpbiBzZWN1cml0
eSBjaGVjayBhbHJlYWR5CiAgICAgICAgIHJldHVybiBwcml2YXRlVGVtcGxhdGUtPkdldEZ1bmN0
aW9uKCk7CiAgICAgfQotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVj
dDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKLSAgICBpZiAoIVY4
UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgZmFsc2UpKSB7CisgICAgTG9jYXRp
b24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFz
c0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKKyAgICBpZiAoIVY4UHJveHk6OmNhbkFjY2Vzc0Zy
YW1lKGltcC0+ZnJhbWUoKSwgZmFsc2UpKSB7CiAgICAgICAgIHN0YXRpYyB2ODo6UGVyc2lzdGVu
dDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gc2hhcmVkVGVtcGxhdGUgPSB2ODo6UGVyc2lzdGVudDx2
ODo6RnVuY3Rpb25UZW1wbGF0ZT46Ok5ldyh2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KHY4TG9j
YXRpb25Bc3NpZ25DYWxsYmFjaywgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCksIHY4OjpTaWduYXR1
cmU6Ok5ldyhWOExvY2F0aW9uOjpHZXRSYXdUZW1wbGF0ZSgpKSkpOwogICAgICAgICByZXR1cm4g
c2hhcmVkVGVtcGxhdGUtPkdldEZ1bmN0aW9uKCk7CiAgICAgfSBlbHNlCkBAIC0yNjcsNyArMjY3
LDcgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKExvY2F0aW9uUmVsb2FkKQogCiAgICAgSU5DX1NUQVRT
KCJET00uTG9jYXRpb24ucmVsb2FkIik7CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhvbGRl
ciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0aXZl
T2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOworICAgIExv
Y2F0aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4
Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvbGRlcik7CiAKICAgICBGcmFtZSogZnJhbWUgPSBpbXAt
PmZyYW1lKCk7CiAgICAgaWYgKCFmcmFtZSB8fCAhU2NyaXB0Q29udHJvbGxlcjo6aXNTYWZlU2Ny
aXB0KGZyYW1lKSkKQEAgLTI4Miw3ICsyODIsNyBAQCBDQUxMQkFDS19GVU5DX0RFQ0woTG9jYXRp
b25SZXBsYWNlKQogewogICAgIElOQ19TVEFUUygiRE9NLkxvY2F0aW9uLnJlcGxhY2UiKTsKICAg
ICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gaG9sZGVyID0gYXJncy5Ib2xkZXIoKTsKLSAgICBMb2Nh
dGlvbiogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRl
eDo6TE9DQVRJT04sIGhvbGRlcik7CisgICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OmNvbnZl
cnRUb05hdGl2ZU9iamVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVy
KTsKIAogICAgIEZyYW1lKiBmcmFtZSA9IGltcC0+ZnJhbWUoKTsKICAgICBpZiAoIWZyYW1lKQpA
QCAtMzAzLDcgKzMwMyw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChMb2NhdGlvbkFzc2lnbikKIHsK
ICAgICBJTkNfU1RBVFMoIkRPTS5Mb2NhdGlvbi5hc3NpZ24iKTsKICAgICB2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4gaG9sZGVyID0gYXJncy5Ib2xkZXIoKTsKLSAgICBMb2NhdGlvbiogaW1wID0gVjhQ
cm94eTo6VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhv
bGRlcik7CisgICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVj
dDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9sZGVyKTsKIAogICAgIEZyYW1l
KiBmcmFtZSA9IGltcC0+ZnJhbWUoKTsKICAgICBpZiAoIWZyYW1lKQpAQCAtMzM0LDggKzMzNCw4
IEBAIENBTExCQUNLX0ZVTkNfREVDTChMb2NhdGlvblRvU3RyaW5nKQogewogICAgIElOQ19TVEFU
UygiRE9NLkxvY2F0aW9uLnRvU3RyaW5nIik7CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhv
bGRlciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgTG9jYXRpb24qIGltcCA9IFY4UHJveHk6OlRvTmF0
aXZlT2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOwotICAg
IGlmICghVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKKyAgICBM
b2NhdGlvbiogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PExvY2F0aW9uPihW
OENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob2xkZXIpOworICAgIGlmICghVjhQcm94eTo6Y2FuQWNj
ZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmlu
ZWQoKTsKICAgICBTdHJpbmcgcmVzdWx0ID0gaW1wLT5ocmVmKCk7CiAgICAgcmV0dXJuIHY4U3Ry
aW5nKHJlc3VsdCk7CkBAIC0zNDUsMTYgKzM0NSwxNiBAQCBJTkRFWEVEX0FDQ0VTU19DSEVDSyhM
b2NhdGlvbikKIHsKICAgICBBU1NFUlQoVjhDbGFzc0luZGV4OjpGcm9tSW50KGRhdGEtPkludDMy
VmFsdWUoKSkgPT0gVjhDbGFzc0luZGV4OjpMT0NBVElPTik7CiAgICAgLy8gT25seSBhbGxvdyBz
YW1lIG9yaWdpbiBhY2Nlc3MKLSAgICBMb2NhdGlvbiogaW1wID0gIFY4UHJveHk6OlRvTmF0aXZl
T2JqZWN0PExvY2F0aW9uPihWOENsYXNzSW5kZXg6OkxPQ0FUSU9OLCBob3N0KTsKLSAgICByZXR1
cm4gVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCBmYWxzZSk7CisgICAgTG9j
YXRpb24qIGltcCA9ICBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4
Q2xhc3NJbmRleDo6TE9DQVRJT04sIGhvc3QpOworICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nl
c3NGcmFtZShpbXAtPmZyYW1lKCksIGZhbHNlKTsKIH0KIAogTkFNRURfQUNDRVNTX0NIRUNLKExv
Y2F0aW9uKQogewogICAgIEFTU0VSVChWOENsYXNzSW5kZXg6OkZyb21JbnQoZGF0YS0+SW50MzJW
YWx1ZSgpKSA9PSBWOENsYXNzSW5kZXg6OkxPQ0FUSU9OKTsKICAgICAvLyBPbmx5IGFsbG93IHNh
bWUgb3JpZ2luIGFjY2VzcwotICAgIExvY2F0aW9uKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxMb2NhdGlvbj4oVjhDbGFzc0luZGV4OjpMT0NBVElPTiwgaG9zdCk7Ci0gICAgcmV0dXJu
IFY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgZmFsc2UpOworICAgIExvY2F0
aW9uKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TG9jYXRpb24+KFY4Q2xh
c3NJbmRleDo6TE9DQVRJT04sIGhvc3QpOworICAgIHJldHVybiBWOFByb3h5OjpjYW5BY2Nlc3NG
cmFtZShpbXAtPmZyYW1lKCksIGZhbHNlKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUK
SW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TWVzc2FnZUNoYW5uZWxDb25zdHJ1
Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhNZXNz
YWdlQ2hhbm5lbENvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VDaGFubmVsQ29uc3RydWN0b3IuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00NCw3ICs0NCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIENBTExCQUNLX0ZV
TkNfREVDTChNZXNzYWdlQ2hhbm5lbENvbnN0cnVjdG9yKQogewogICAgIElOQ19TVEFUUygiRE9N
Lk1lc3NhZ2VDaGFubmVsLkNvbnN0cnVjdG9yIik7Ci0gICAgLy8gRklYTUU6IFRoZSBsb2dpYyBo
ZXJlIGlzIGFsbW9zdCBleGFjdCBkdXBsaWNhdGUgb2YgVjg6OkNvbnN0cnVjdERPTU9iamVjdC4K
KyAgICAvLyBGSVhNRTogVGhlIGxvZ2ljIGhlcmUgaXMgYWxtb3N0IGV4YWN0IGR1cGxpY2F0ZSBv
ZiBWODo6Y29uc3RydWN0RE9NT2JqZWN0LgogICAgIC8vIENvbnNpZGVyIHJlZmFjdG9yaW5nIHRv
IHJlZHVjZSBkdXBsaWNhdGlvbi4KICAgICBpZiAoIWFyZ3MuSXNDb25zdHJ1Y3RDYWxsKCkpCiAg
ICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCJET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBi
ZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4iKTsKQEAgLTU3LDcgKzU3LDcgQEAgQ0FMTEJBQ0tfRlVO
Q19ERUNMKE1lc3NhZ2VDaGFubmVsQ29uc3RydQogICAgIERvY3VtZW50KiBkb2N1bWVudCA9IGZy
YW1lLT5kb2N1bWVudCgpOwogCiAgICAgLy8gTm90ZTogaXQncyBPSyB0byBsZXQgdGhpcyBSZWZQ
dHIgZ28gb3V0IG9mIHNjb3BlIGJlY2F1c2Ugd2UgYWxzbyBjYWxsCi0gICAgLy8gU2V0RE9NV3Jh
cHBlcigpLCB3aGljaCBlZmZlY3RpdmVseSBob2xkcyBhIHJlZmVyZW5jZSB0byBvYmouCisgICAg
Ly8gc2V0RE9NV3JhcHBlcigpLCB3aGljaCBlZmZlY3RpdmVseSBob2xkcyBhIHJlZmVyZW5jZSB0
byBvYmouCiAgICAgUmVmUHRyPE1lc3NhZ2VDaGFubmVsPiBvYmogPSBNZXNzYWdlQ2hhbm5lbDo6
Y3JlYXRlKGRvY3VtZW50KTsKIAogICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBtZXNzYWdlQ2hh
bm5lbCA9IGFyZ3MuSG9sZGVyKCk7CkBAIC02NSwxMSArNjUsMTEgQEAgQ0FMTEJBQ0tfRlVOQ19E
RUNMKE1lc3NhZ2VDaGFubmVsQ29uc3RydQogICAgIC8vIENyZWF0ZSByZWZlcmVuY2VzIGZyb20g
dGhlIE1lc3NhZ2VDaGFubmVsIHdyYXBwZXIgdG8gdGhlIHR3bwogICAgIC8vIE1lc3NhZ2VQb3J0
IHdyYXBwZXJzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBNZXNzYWdlUG9ydCB3cmFwcGVycwogICAg
IC8vIHN0YXkgYWxpdmUgYXMgbG9uZyBhcyB0aGUgTWVzc2FnZUNoYW5uZWwgd3JhcHBlciBpcyBh
cm91bmQuCi0gICAgbWVzc2FnZUNoYW5uZWwtPlNldEludGVybmFsRmllbGQoa01lc3NhZ2VDaGFu
bmVsUG9ydDFJbmRleCwgVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6Ok1FU1NBR0VQ
T1JULCBvYmotPnBvcnQxKCkpKTsKLSAgICBtZXNzYWdlQ2hhbm5lbC0+U2V0SW50ZXJuYWxGaWVs
ZChrTWVzc2FnZUNoYW5uZWxQb3J0MkluZGV4LCBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJ
bmRleDo6TUVTU0FHRVBPUlQsIG9iai0+cG9ydDIoKSkpOworICAgIG1lc3NhZ2VDaGFubmVsLT5T
ZXRJbnRlcm5hbEZpZWxkKGtNZXNzYWdlQ2hhbm5lbFBvcnQxSW5kZXgsIFY4UHJveHk6OmNvbnZl
cnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIG9iai0+cG9ydDEoKSkpOwor
ICAgIG1lc3NhZ2VDaGFubmVsLT5TZXRJbnRlcm5hbEZpZWxkKGtNZXNzYWdlQ2hhbm5lbFBvcnQy
SW5kZXgsIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBP
UlQsIG9iai0+cG9ydDIoKSkpOwogCiAgICAgLy8gU2V0dXAgdGhlIHN0YW5kYXJkIHdyYXBwZXIg
b2JqZWN0IGludGVybmFsIGZpZWxkcy4KLSAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKG1lc3Nh
Z2VDaGFubmVsLCBWOENsYXNzSW5kZXg6Ok1FU1NBR0VDSEFOTkVMLCBvYmouZ2V0KCkpOworICAg
IFY4UHJveHk6OnNldERPTVdyYXBwZXIobWVzc2FnZUNoYW5uZWwsIFY4Q2xhc3NJbmRleDo6TUVT
U0FHRUNIQU5ORUwsIG9iai5nZXQoKSk7CiAgICAgcmV0dXJuIHRvVjgob2JqLnJlbGVhc2UoKSwg
bWVzc2FnZUNoYW5uZWwpOwogfQogCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OE1lc3NhZ2VQb3J0Q3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE1lc3NhZ2VQb3J0Q3VzdG9tLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNDMsMTQgKzQzLDE0IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIEFDQ0VTU09SX0dF
VFRFUihNZXNzYWdlUG9ydE9ubWVzc2FnZSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5NZXNzYWdl
UG9ydC5vbm1lc3NhZ2UuX2dldCIpOwotICAgIE1lc3NhZ2VQb3J0KiBtZXNzYWdlUG9ydCA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PE1lc3NhZ2VQb3J0PihWOENsYXNzSW5kZXg6Ok1FU1NBR0VQ
T1JULCBpbmZvLkhvbGRlcigpKTsKLSAgICByZXR1cm4gVjhQcm94eTo6RXZlbnRMaXN0ZW5lclRv
VjhPYmplY3QobWVzc2FnZVBvcnQtPm9ubWVzc2FnZSgpKTsKKyAgICBNZXNzYWdlUG9ydCogbWVz
c2FnZVBvcnQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8TWVzc2FnZVBvcnQ+KFY4
Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIGluZm8uSG9sZGVyKCkpOworICAgIHJldHVybiBWOFBy
b3h5Ojpjb252ZXJ0RXZlbnRMaXN0ZW5lclRvVjhPYmplY3QobWVzc2FnZVBvcnQtPm9ubWVzc2Fn
ZSgpKTsKIH0KIAogQUNDRVNTT1JfU0VUVEVSKE1lc3NhZ2VQb3J0T25tZXNzYWdlKQogewogICAg
IElOQ19TVEFUUygiRE9NLk1lc3NhZ2VQb3J0Lm9ubWVzc2FnZS5fc2V0Iik7Ci0gICAgTWVzc2Fn
ZVBvcnQqIG1lc3NhZ2VQb3J0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TWVzc2FnZVBvcnQ+
KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIGluZm8uSG9sZGVyKCkpOworICAgIE1lc3NhZ2VQ
b3J0KiBtZXNzYWdlUG9ydCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxNZXNzYWdl
UG9ydD4oVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYg
KHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAobWVzc2FnZVBvcnQtPm9ubWVzc2FnZSgp
KSB7CiAgICAgICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGlj
X2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4obWVzc2FnZVBvcnQtPm9ubWVzc2FnZSgpKTsK
QEAgLTY1LDcgKzY1LDcgQEAgQUNDRVNTT1JfU0VUVEVSKE1lc3NhZ2VQb3J0T25tZXNzYWdlKQog
ICAgICAgICBpZiAoIXByb3h5KQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIFJlZlB0
cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVu
dExpc3RlbmVyKHZhbHVlLCBmYWxzZSk7CisgICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBs
aXN0ZW5lciA9IHByb3h5LT5maW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBm
YWxzZSk7CiAgICAgICAgIGlmIChsaXN0ZW5lcikgewogICAgICAgICAgICAgbWVzc2FnZVBvcnQt
PnNldE9ubWVzc2FnZShsaXN0ZW5lcik7CiAgICAgICAgICAgICBjcmVhdGVIaWRkZW5EZXBlbmRl
bmN5KGluZm8uSG9sZGVyKCksIHZhbHVlLCBWOEN1c3RvbTo6a01lc3NhZ2VQb3J0UmVxdWVzdENh
Y2hlSW5kZXgpOwpAQCAtNzYsMTMgKzc2LDEzIEBAIEFDQ0VTU09SX1NFVFRFUihNZXNzYWdlUG9y
dE9ubWVzc2FnZSkKIENBTExCQUNLX0ZVTkNfREVDTChNZXNzYWdlUG9ydEFkZEV2ZW50TGlzdGVu
ZXIpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uTWVzc2FnZVBvcnQuQWRkRXZlbnRMaXN0ZW5lcigp
Iik7Ci0gICAgTWVzc2FnZVBvcnQqIG1lc3NhZ2VQb3J0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmpl
Y3Q8TWVzc2FnZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIGFyZ3MuSG9sZGVyKCkp
OworICAgIE1lc3NhZ2VQb3J0KiBtZXNzYWdlUG9ydCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2
ZU9iamVjdDxNZXNzYWdlUG9ydD4oVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgYXJncy5Ib2xk
ZXIoKSk7CiAKICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKG1lc3NhZ2VQ
b3J0LT5zY3JpcHRFeGVjdXRpb25Db250ZXh0KCkpOwogICAgIGlmICghcHJveHkpCiAgICAgICAg
IHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlz
dGVuZXIgPSBwcm94eS0+RmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBm
YWxzZSk7CisgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPmZpbmRP
ckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOwogICAgIGlmIChsaXN0
ZW5lcikgewogICAgICAgICBTdHJpbmcgdHlwZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsK
ICAgICAgICAgYm9vbCB1c2VDYXB0dXJlID0gYXJnc1syXS0+Qm9vbGVhblZhbHVlKCk7CkBAIC05
NiwxMyArOTYsMTMgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKE1lc3NhZ2VQb3J0QWRkRXZlbnRMaQog
Q0FMTEJBQ0tfRlVOQ19ERUNMKE1lc3NhZ2VQb3J0UmVtb3ZlRXZlbnRMaXN0ZW5lcikKIHsKICAg
ICBJTkNfU1RBVFMoIkRPTS5NZXNzYWdlUG9ydC5SZW1vdmVFdmVudExpc3RlbmVyKCkiKTsKLSAg
ICBNZXNzYWdlUG9ydCogbWVzc2FnZVBvcnQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxNZXNz
YWdlUG9ydD4oVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgYXJncy5Ib2xkZXIoKSk7CisgICAg
TWVzc2FnZVBvcnQqIG1lc3NhZ2VQb3J0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0
PE1lc3NhZ2VQb3J0PihWOENsYXNzSW5kZXg6Ok1FU1NBR0VQT1JULCBhcmdzLkhvbGRlcigpKTsK
IAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUobWVzc2FnZVBvcnQtPnNj
cmlwdEV4ZWN1dGlvbkNvbnRleHQoKSk7CiAgICAgaWYgKCFwcm94eSkKICAgICAgICAgcmV0dXJu
IHY4OjpVbmRlZmluZWQoKTsgLy8gcHJvYmFibHkgbGVha2VkCiAKLSAgICBSZWZQdHI8RXZlbnRM
aXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+RmluZE9iamVjdEV2ZW50TGlzdGVuZXIoYXJnc1sx
XSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5m
aW5kT2JqZWN0RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAKICAgICBpZiAobGlzdGVu
ZXIpIHsKICAgICAgICAgU3RyaW5nIHR5cGUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7Cklu
ZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE5hbWVkTm9kZU1hcEN1c3RvbS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhOYW1lZE5vZGVNYXBD
dXN0b20uY3BwCShyZXZpc2lvbiA0NTIxNikKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4TmFtZWROb2RlTWFwQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDIsMTIgKzQyLDEy
IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIElOREVYRURfUFJPUEVSVFlfR0VUVEVSKE5hbWVkTm9k
ZU1hcCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5OYW1lZE5vZGVNYXAuSW5kZXhlZFByb3BlcnR5
R2V0dGVyIik7Ci0gICAgTmFtZWROb2RlTWFwKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVj
dDxOYW1lZE5vZGVNYXA+KFY4Q2xhc3NJbmRleDo6TkFNRUROT0RFTUFQLCBpbmZvLkhvbGRlcigp
KTsKKyAgICBOYW1lZE5vZGVNYXAqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVj
dDxOYW1lZE5vZGVNYXA+KFY4Q2xhc3NJbmRleDo6TkFNRUROT0RFTUFQLCBpbmZvLkhvbGRlcigp
KTsKICAgICBSZWZQdHI8Tm9kZT4gcmVzdWx0ID0gaW1wLT5pdGVtKGluZGV4KTsKICAgICBpZiAo
IXJlc3VsdCkKICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CiAKLSAg
ICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsKKyAgICByZXR1
cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CiB9CiAKIE5B
TUVEX1BST1BFUlRZX0dFVFRFUihOYW1lZE5vZGVNYXApCkBAIC02MywxMiArNjMsMTIgQEAgTkFN
RURfUFJPUEVSVFlfR0VUVEVSKE5hbWVkTm9kZU1hcCkKICAgICAgICAgcmV0dXJuIG5vdEhhbmRs
ZWRCeUludGVyY2VwdG9yKCk7CiAKICAgICAvLyBGaW5hbGx5LCBzZWFyY2ggdGhlIERPTS4KLSAg
ICBOYW1lZE5vZGVNYXAqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PE5hbWVkTm9kZU1h
cD4oVjhDbGFzc0luZGV4OjpOQU1FRE5PREVNQVAsIGluZm8uSG9sZGVyKCkpOworICAgIE5hbWVk
Tm9kZU1hcCogaW1wID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PE5hbWVkTm9kZU1h
cD4oVjhDbGFzc0luZGV4OjpOQU1FRE5PREVNQVAsIGluZm8uSG9sZGVyKCkpOwogICAgIFJlZlB0
cjxOb2RlPiByZXN1bHQgPSBpbXAtPmdldE5hbWVkSXRlbSh0b1dlYkNvcmVTdHJpbmcobmFtZSkp
OwogICAgIGlmICghcmVzdWx0KQogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0
b3IoKTsKIAotICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChyZXN1bHQuZ2V0KCkp
OworICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgp
KTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhOYXZpZ2F0b3JDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4TmF2aWdhdG9yQ3VzdG9tLmNwcAkocmV2aXNpb24gNDUyMTYpCisr
KyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE5hdmlnYXRvckN1c3RvbS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTQxLDcgKzQxLDcgQEAgQUNDRVNTT1JfR0VUVEVSKE5hdmlnYXRvckFwcFZl
cnNpb24pCiB7CiAgICAgSU5DX1NUQVRTKCJET00uTmF2aWdhdG9yLmFwcFZlcnNpb24iKTsKICAg
ICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IGluZm8uSG9sZGVyKCk7Ci0gICAgTmF2
aWdhdG9yKiBuYXZpZ2F0b3IgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxOYXZpZ2F0b3I+KFY4
Q2xhc3NJbmRleDo6TkFWSUdBVE9SLCBob2xkZXIpOworICAgIE5hdmlnYXRvciogbmF2aWdhdG9y
ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PE5hdmlnYXRvcj4oVjhDbGFzc0luZGV4
OjpOQVZJR0FUT1IsIGhvbGRlcik7CiAgICAgcmV0dXJuIHY4U3RyaW5nT3JVbmRlZmluZWQobmF2
aWdhdG9yLT5hcHBWZXJzaW9uKCkpOwogfQogCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOE5vZGVDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4Tm9kZUN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhOb2RlQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDcsMTMg
KzQ3LDEzIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIENBTExCQUNLX0ZVTkNfREVDTChOb2RlQWRk
RXZlbnRMaXN0ZW5lcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5Ob2RlLmFkZEV2ZW50TGlzdGVu
ZXIoKSIpOwotICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+
KGFyZ3MuSG9sZGVyKCkpOworICAgIE5vZGUqIG5vZGUgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3Jh
cHBlclRvTm9kZTxOb2RlPihhcmdzLkhvbGRlcigpKTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0g
VjhQcm94eTo6cmV0cmlldmUobm9kZS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSk7CiAgICAgaWYgKCFw
cm94eSkKICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIFJlZlB0cjxFdmVu
dExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIo
YXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHBy
b3h5LT5maW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOwogICAgIGlm
IChsaXN0ZW5lcikgewogICAgICAgICBTdHJpbmcgdHlwZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdz
WzBdKTsKICAgICAgICAgYm9vbCB1c2VDYXB0dXJlID0gYXJnc1syXS0+Qm9vbGVhblZhbHVlKCk7
CkBAIC02NSw3ICs2NSw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChOb2RlQWRkRXZlbnRMaXN0ZW5l
cikKIENBTExCQUNLX0ZVTkNfREVDTChOb2RlUmVtb3ZlRXZlbnRMaXN0ZW5lcikKIHsKICAgICBJ
TkNfU1RBVFMoIkRPTS5Ob2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoKSIpOwotICAgIE5vZGUqIG5v
ZGUgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3MuSG9sZGVyKCkpOworICAg
IE5vZGUqIG5vZGUgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdz
LkhvbGRlcigpKTsKIAogICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUobm9k
ZS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSk7CiAgICAgLy8gSXQgaXMgcG9zc2JpbGUgdGhhdCB0aGUg
b3duZXIgZG9jdW1lbnQgb2YgdGhlIG5vZGUgaXMgZGV0YWNoZWQKQEAgLTc0LDcgKzc0LDcgQEAg
Q0FMTEJBQ0tfRlVOQ19ERUNMKE5vZGVSZW1vdmVFdmVudExpc3RlbgogICAgIGlmICghcHJveHkp
CiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICBSZWZQdHI8RXZlbnRMaXN0
ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+RmluZFY4RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxz
ZSk7CisgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPmZpbmRWOEV2
ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOwogICAgIGlmIChsaXN0ZW5lcikgewogICAgICAg
ICBTdHJpbmcgdHlwZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKICAgICAgICAgYm9vbCB1
c2VDYXB0dXJlID0gYXJnc1syXS0+Qm9vbGVhblZhbHVlKCk7CkBAIC04OSwxMyArODksMTMgQEAg
Q0FMTEJBQ0tfRlVOQ19ERUNMKE5vZGVJbnNlcnRCZWZvcmUpCiB7CiAgICAgSU5DX1NUQVRTKCJE
T00uTm9kZS5pbnNlcnRCZWZvcmUiKTsKICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gaG9sZGVy
ID0gYXJncy5Ib2xkZXIoKTsKLSAgICBOb2RlKiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPE5vZGU+KGhvbGRlcik7CisgICAgTm9kZSogaW1wID0gVjhQcm94eTo6Y29udmVydERPTVdy
YXBwZXJUb05vZGU8Tm9kZT4oaG9sZGVyKTsKICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAg
ICBOb2RlKiBuZXdDaGlsZCA9IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1swXSkgPyBWOFByb3h5
OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMF0pIDogMDsKLSAgICBOb2RlKiByZWZDaGls
ZCA9IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1sxXSkgPyBWOFByb3h5OjpET01XcmFwcGVyVG9O
b2RlPE5vZGU+KGFyZ3NbMV0pIDogMDsKKyAgICBOb2RlKiBuZXdDaGlsZCA9IFY4Tm9kZTo6SGFz
SW5zdGFuY2UoYXJnc1swXSkgPyBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2Rl
PihhcmdzWzBdKSA6IDA7CisgICAgTm9kZSogcmVmQ2hpbGQgPSBWOE5vZGU6Okhhc0luc3RhbmNl
KGFyZ3NbMV0pID8gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJnc1sx
XSkgOiAwOwogICAgIGJvb2wgc3VjY2VzcyA9IGltcC0+aW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCBy
ZWZDaGlsZCwgZWMsIHRydWUpOwogICAgIGlmIChlYykgewotICAgICAgICBWOFByb3h5OjpTZXRE
T01FeGNlcHRpb24oZWMpOworICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwog
ICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7CiAgICAgfQogICAgIGlmIChz
dWNjZXNzKQpAQCAtMTA4LDEzICsxMDgsMTMgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKE5vZGVSZXBs
YWNlQ2hpbGQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uTm9kZS5yZXBsYWNlQ2hpbGQiKTsKICAg
ICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gaG9sZGVyID0gYXJncy5Ib2xkZXIoKTsKLSAgICBOb2Rl
KiBpbXAgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGhvbGRlcik7CisgICAgTm9k
ZSogaW1wID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oaG9sZGVyKTsK
ICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBOb2RlKiBuZXdDaGlsZCA9IFY4Tm9kZTo6
SGFzSW5zdGFuY2UoYXJnc1swXSkgPyBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFy
Z3NbMF0pIDogMDsKLSAgICBOb2RlKiBvbGRDaGlsZCA9IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJn
c1sxXSkgPyBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3NbMV0pIDogMDsKKyAg
ICBOb2RlKiBuZXdDaGlsZCA9IFY4Tm9kZTo6SGFzSW5zdGFuY2UoYXJnc1swXSkgPyBWOFByb3h5
Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKSA6IDA7CisgICAgTm9kZSog
b2xkQ2hpbGQgPSBWOE5vZGU6Okhhc0luc3RhbmNlKGFyZ3NbMV0pID8gVjhQcm94eTo6Y29udmVy
dERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJnc1sxXSkgOiAwOwogICAgIGJvb2wgc3VjY2VzcyA9
IGltcC0+cmVwbGFjZUNoaWxkKG5ld0NoaWxkLCBvbGRDaGlsZCwgZWMsIHRydWUpOwogICAgIGlm
IChlYykgewotICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOworICAgICAgICBW
OFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2
ODo6VmFsdWU+KCk7CiAgICAgfQogICAgIGlmIChzdWNjZXNzKQpAQCAtMTI2LDEyICsxMjYsMTIg
QEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKE5vZGVSZW1vdmVDaGlsZCkKIHsKICAgICBJTkNfU1RBVFMo
IkRPTS5Ob2RlLnJlbW92ZUNoaWxkIik7CiAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhvbGRl
ciA9IGFyZ3MuSG9sZGVyKCk7Ci0gICAgTm9kZSogaW1wID0gVjhQcm94eTo6RE9NV3JhcHBlclRv
Tm9kZTxOb2RlPihob2xkZXIpOworICAgIE5vZGUqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRET01X
cmFwcGVyVG9Ob2RlPE5vZGU+KGhvbGRlcik7CiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0g
ICAgTm9kZSogb2xkQ2hpbGQgPSBWOE5vZGU6Okhhc0luc3RhbmNlKGFyZ3NbMF0pID8gVjhQcm94
eTo6RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKSA6IDA7CisgICAgTm9kZSogb2xkQ2hp
bGQgPSBWOE5vZGU6Okhhc0luc3RhbmNlKGFyZ3NbMF0pID8gVjhQcm94eTo6Y29udmVydERPTVdy
YXBwZXJUb05vZGU8Tm9kZT4oYXJnc1swXSkgOiAwOwogICAgIGJvb2wgc3VjY2VzcyA9IGltcC0+
cmVtb3ZlQ2hpbGQob2xkQ2hpbGQsIGVjKTsKICAgICBpZiAoZWMpIHsKLSAgICAgICAgVjhQcm94
eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICAgICAgVjhQcm94eTo6c2V0RE9NRXhjZXB0aW9u
KGVjKTsKICAgICAgICAgcmV0dXJuIHY4OjpIYW5kbGU8djg6OlZhbHVlPigpOwogICAgIH0KICAg
ICBpZiAoc3VjY2VzcykKQEAgLTE0NCwxMiArMTQ0LDEyIEBAIENBTExCQUNLX0ZVTkNfREVDTChO
b2RlQXBwZW5kQ2hpbGQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uTm9kZS5hcHBlbmRDaGlsZCIp
OwogICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBob2xkZXIgPSBhcmdzLkhvbGRlcigpOwotICAg
IE5vZGUqIGltcCA9IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8Tm9kZT4oaG9sZGVyKTsKKyAg
ICBOb2RlKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxOb2RlPihob2xk
ZXIpOwogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIE5vZGUqIG5ld0NoaWxkID0gVjhO
b2RlOjpIYXNJbnN0YW5jZShhcmdzWzBdKSA/IFY4UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8Tm9k
ZT4oYXJnc1swXSkgOiAwOworICAgIE5vZGUqIG5ld0NoaWxkID0gVjhOb2RlOjpIYXNJbnN0YW5j
ZShhcmdzWzBdKSA/IFY4UHJveHk6OmNvbnZlcnRET01XcmFwcGVyVG9Ob2RlPE5vZGU+KGFyZ3Nb
MF0pIDogMDsKICAgICBib29sIHN1Y2Nlc3MgPSBpbXAtPmFwcGVuZENoaWxkKG5ld0NoaWxkLCBl
YywgdHJ1ZSApOwogICAgIGlmIChlYykgewotICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRp
b24oZWMpOworICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMpOwogICAgICAgICBy
ZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7CiAgICAgfQogICAgIGlmIChzdWNjZXNzKQpJ
bmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhOb2RlSXRlcmF0b3JDdXN0b20uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Tm9kZUl0ZXJhdG9y
Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOE5vZGVJdGVyYXRvckN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUzLDEzICs1Mywx
MyBAQCBzdGF0aWMgaW5saW5lIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB0b1Y4CiAgICAgaWYgKCFv
YmplY3QpCiAgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOwogCi0gICAgcmV0dXJuIFY4UHJveHk6
Ok5vZGVUb1Y4T2JqZWN0KG9iamVjdC5nZXQoKSk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZl
cnROb2RlVG9WOE9iamVjdChvYmplY3QuZ2V0KCkpOwogfQogCiBDQUxMQkFDS19GVU5DX0RFQ0wo
Tm9kZUl0ZXJhdG9yTmV4dE5vZGUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uTm9kZUl0ZXJhdG9y
Lm5leHROb2RlKCkiKTsKLSAgICBOb2RlSXRlcmF0b3IqIG5vZGVJdGVyYXRvciA9IFY4UHJveHk6
OlRvTmF0aXZlT2JqZWN0PE5vZGVJdGVyYXRvcj4oVjhDbGFzc0luZGV4OjpOT0RFSVRFUkFUT1Is
IGFyZ3MuSG9sZGVyKCkpOworICAgIE5vZGVJdGVyYXRvciogbm9kZUl0ZXJhdG9yID0gVjhQcm94
eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PE5vZGVJdGVyYXRvcj4oVjhDbGFzc0luZGV4OjpOT0RF
SVRFUkFUT1IsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAg
ICAgU2NyaXB0U3RhdGUgc3RhdGU7CkBAIC03MCw3ICs3MCw3IEBAIENBTExCQUNLX0ZVTkNfREVD
TChOb2RlSXRlcmF0b3JOZXh0Tm9kZSkKIENBTExCQUNLX0ZVTkNfREVDTChOb2RlSXRlcmF0b3JQ
cmV2aW91c05vZGUpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uTm9kZUl0ZXJhdG9yLnByZXZpb3Vz
Tm9kZSgpIik7Ci0gICAgTm9kZUl0ZXJhdG9yKiBub2RlSXRlcmF0b3IgPSBWOFByb3h5OjpUb05h
dGl2ZU9iamVjdDxOb2RlSXRlcmF0b3I+KFY4Q2xhc3NJbmRleDo6Tk9ERUlURVJBVE9SLCBhcmdz
LkhvbGRlcigpKTsKKyAgICBOb2RlSXRlcmF0b3IqIG5vZGVJdGVyYXRvciA9IFY4UHJveHk6OmNv
bnZlcnRUb05hdGl2ZU9iamVjdDxOb2RlSXRlcmF0b3I+KFY4Q2xhc3NJbmRleDo6Tk9ERUlURVJB
VE9SLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgIFNj
cmlwdFN0YXRlIHN0YXRlOwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhOb2Rl
TGlzdEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhOb2RlTGlzdEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhOb2RlTGlzdEN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDcg
KzQyLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogTkFNRURfUFJPUEVSVFlfR0VUVEVSKE5vZGVM
aXN0KQogewogICAgIElOQ19TVEFUUygiRE9NLk5vZGVMaXN0Lk5hbWVkUHJvcGVydHlHZXR0ZXIi
KTsKLSAgICBOb2RlTGlzdCogbGlzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PE5vZGVMaXN0
PihWOENsYXNzSW5kZXg6Ok5PREVMSVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBOb2RlTGlzdCog
bGlzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxOb2RlTGlzdD4oVjhDbGFzc0lu
ZGV4OjpOT0RFTElTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgU3RyaW5nIGtleSA9IHRvV2ViQ29y
ZVN0cmluZyhuYW1lKTsKIAogICAgIC8vIExlbmd0aCBwcm9wZXJ0eSBjYW5ub3QgYmUgb3ZlcnJp
ZGRlbi4KQEAgLTUzLDcgKzUzLDcgQEAgTkFNRURfUFJPUEVSVFlfR0VUVEVSKE5vZGVMaXN0KQog
ICAgIGlmICghcmVzdWx0KQogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3Io
KTsKIAotICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChyZXN1bHQuZ2V0KCkpOwor
ICAgIHJldHVybiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsK
IH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhTUUxSZXN1bHRTZXRSb3dMaXN0Q3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFNRTFJlc3VsdFNldFJvd0xpc3RDdXN0b20uY3BwCShy
ZXZpc2lvbiA0NTIxNikKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMUmVzdWx0
U2V0Um93TGlzdEN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDExICszMiwxMCBAQAog
CiAjaWYgRU5BQkxFKERBVEFCQVNFKQogCi0jaW5jbHVkZSAidjhfYmluZGluZy5oIgotI2luY2x1
ZGUgInY4X3Byb3h5LmgiCi0KICNpbmNsdWRlICJTUUxSZXN1bHRTZXRSb3dMaXN0LmgiCisjaW5j
bHVkZSAiVjhCaW5kaW5nLmgiCiAjaW5jbHVkZSAiVjhDdXN0b21CaW5kaW5nLmgiCisjaW5jbHVk
ZSAiVjhQcm94eS5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTQ1LDIwICs0NCwyMCBA
QCBDQUxMQkFDS19GVU5DX0RFQ0woU1FMUmVzdWx0U2V0Um93TGlzdEl0CiAgICAgSU5DX1NUQVRT
KCJET00uU1FMUmVzdWx0U2V0Um93TGlzdC5pdGVtKCkiKTsKIAogICAgIGlmIChhcmdzLkxlbmd0
aCgpID09IDApIHsKLSAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpTWU5UQVhf
RVJST1IsICJJdGVtIGluZGV4IGlzIHJlcXVpcmVkLiIpOworICAgICAgICBWOFByb3h5Ojp0aHJv
d0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgIkl0ZW0gaW5kZXggaXMgcmVxdWlyZWQuIik7
CiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgfQogCiAgICAgaWYgKCFhcmdz
WzBdLT5Jc051bWJlcigpKSB7Ci0gICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6
VFlQRV9FUlJPUiwgIkl0ZW0gaW5kZXggbXVzdCBiZSBhIG51bWJlci4iKTsKKyAgICAgICAgVjhQ
cm94eTo6dGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiSXRlbSBpbmRleCBtdXN0IGJl
IGEgbnVtYmVyLiIpOwogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogICAgIH0KIAot
ICAgIFNRTFJlc3VsdFNldFJvd0xpc3QqIHJvd0xpc3QgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVj
dDxTUUxSZXN1bHRTZXRSb3dMaXN0PihWOENsYXNzSW5kZXg6OlNRTFJFU1VMVFNFVFJPV0xJU1Qs
IGFyZ3MuSG9sZGVyKCkpOworICAgIFNRTFJlc3VsdFNldFJvd0xpc3QqIHJvd0xpc3QgPSBWOFBy
b3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8U1FMUmVzdWx0U2V0Um93TGlzdD4oVjhDbGFzc0lu
ZGV4OjpTUUxSRVNVTFRTRVRST1dMSVNULCBhcmdzLkhvbGRlcigpKTsKIAogICAgIHVuc2lnbmVk
IGxvbmcgaW5kZXggPSBhcmdzWzBdLT5JbnRlZ2VyVmFsdWUoKTsKICAgICBpZiAoaW5kZXggPCAw
IHx8IGluZGV4ID49IHJvd0xpc3QtPmxlbmd0aCgpKSB7Ci0gICAgICAgIFY4UHJveHk6OlRocm93
RXJyb3IoVjhQcm94eTo6UkFOR0VfRVJST1IsICJJdGVtIGluZGV4IGlzIG91dCBvZiByYW5nZS4i
KTsKKyAgICAgICAgVjhQcm94eTo6dGhyb3dFcnJvcihWOFByb3h5OjpSQU5HRV9FUlJPUiwgIkl0
ZW0gaW5kZXggaXMgb3V0IG9mIHJhbmdlLiIpOwogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5l
ZCgpOwogICAgIH0KIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTUUxUcmFu
c2FjdGlvbkN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhTUUxUcmFuc2FjdGlvbkN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTUUxUcmFuc2FjdGlvbkN1c3RvbS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTMyLDE0ICszMiwxMyBAQAogCiAjaWYgRU5BQkxFKERBVEFCQVNFKQogCi0jaW5j
bHVkZSAidjhfYmluZGluZy5oIgotI2luY2x1ZGUgInY4X3Byb3h5LmgiCi0KICNpbmNsdWRlICJE
YXRhYmFzZS5oIgogI2luY2x1ZGUgIlNRTFZhbHVlLmgiCisjaW5jbHVkZSAiVjhCaW5kaW5nLmgi
CiAjaW5jbHVkZSAiVjhDdXN0b21CaW5kaW5nLmgiCiAjaW5jbHVkZSAiVjhDdXN0b21TUUxTdGF0
ZW1lbnRDYWxsYmFjay5oIgogI2luY2x1ZGUgIlY4Q3VzdG9tU1FMU3RhdGVtZW50RXJyb3JDYWxs
YmFjay5oIgorI2luY2x1ZGUgIlY4UHJveHkuaCIKICNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAK
IHVzaW5nIG5hbWVzcGFjZSBXVEY7CkBAIC01MSw3ICs1MCw3IEBAIENBTExCQUNLX0ZVTkNfREVD
TChTUUxUcmFuc2FjdGlvbkV4ZWN1dGUKICAgICBJTkNfU1RBVFMoIkRPTS5TUUxUcmFuc2FjdGlv
bi5leGVjdXRlU3FsKCkiKTsKIAogICAgIGlmIChhcmdzLkxlbmd0aCgpID09IDApIHsKLSAgICAg
ICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpTWU5UQVhfRVJST1IsICJTUUwgc3RhdGVt
ZW50IGlzIHJlcXVpcmVkLiIpOworICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6
OlNZTlRBWF9FUlJPUiwgIlNRTCBzdGF0ZW1lbnQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgIHJl
dHVybiB2ODo6VW5kZWZpbmVkKCk7CiAgICAgfQogCkBAIC02Miw3ICs2MSw3IEBAIENBTExCQUNL
X0ZVTkNfREVDTChTUUxUcmFuc2FjdGlvbkV4ZWN1dGUKICAgICBpZiAoYXJncy5MZW5ndGgoKSA+
IDEpIHsKICAgICAgICAgLy8gRklYTUU6IE1ha2UgdGhpcyB3b3JrIGZvciB2ODo6QXJyYXlpc2gg
b2JqZWN0cywgYXMgd2VsbAogICAgICAgICBpZiAoIWFyZ3NbMV0tPklzQXJyYXkoKSkgewotICAg
ICAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiU3RhdGVt
ZW50IGFyZ3VtZW50cyBtdXN0IGJlIGFuIHY4OjpBcnJheS4iKTsKKyAgICAgICAgICAgIFY4UHJv
eHk6OnRocm93RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgIlN0YXRlbWVudCBhcmd1bWVudHMg
bXVzdCBiZSBhbiB2ODo6QXJyYXkuIik7CiAgICAgICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5l
ZCgpOwogICAgICAgICB9CiAKQEAgLTgwLDE0ICs3OSwxNCBAQCBDQUxMQkFDS19GVU5DX0RFQ0wo
U1FMVHJhbnNhY3Rpb25FeGVjdXRlCiAgICAgICAgIH0KICAgICB9CiAKLSAgICBTUUxUcmFuc2Fj
dGlvbiogdHJhbnNhY3Rpb24gPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxTUUxUcmFuc2FjdGlv
bj4oVjhDbGFzc0luZGV4OjpTUUxUUkFOU0FDVElPTiwgYXJncy5Ib2xkZXIoKSk7CisgICAgU1FM
VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0
PFNRTFRyYW5zYWN0aW9uPihWOENsYXNzSW5kZXg6OlNRTFRSQU5TQUNUSU9OLCBhcmdzLkhvbGRl
cigpKTsKIAogICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6OnJldHJpZXZlRnJhbWUoKTsKIAog
ICAgIFJlZlB0cjxTUUxTdGF0ZW1lbnRDYWxsYmFjaz4gY2FsbGJhY2s7CiAgICAgaWYgKGFyZ3Mu
TGVuZ3RoKCkgPiAyKSB7CiAgICAgICAgIGlmICghYXJnc1syXS0+SXNPYmplY3QoKSkgewotICAg
ICAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiU3RhdGVt
ZW50IGNhbGxiYWNrIG11c3QgYmUgb2YgdmFsaWQgdHlwZS4iKTsKKyAgICAgICAgICAgIFY4UHJv
eHk6OnRocm93RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgIlN0YXRlbWVudCBjYWxsYmFjayBt
dXN0IGJlIG9mIHZhbGlkIHR5cGUuIik7CiAgICAgICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5l
ZCgpOwogICAgICAgICB9CiAKQEAgLTk4LDcgKzk3LDcgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKFNR
TFRyYW5zYWN0aW9uRXhlY3V0ZQogICAgIFJlZlB0cjxTUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNr
PiBlcnJvckNhbGxiYWNrOwogICAgIGlmIChhcmdzLkxlbmd0aCgpID4gMykgewogICAgICAgICBp
ZiAoIWFyZ3NbMl0tPklzT2JqZWN0KCkpIHsKLSAgICAgICAgICAgIFY4UHJveHk6OlRocm93RXJy
b3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgIlN0YXRlbWVudCBlcnJvciBjYWxsYmFjayBtdXN0IGJl
IG9mIHZhbGlkIHR5cGUuIik7CisgICAgICAgICAgICBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJv
eHk6OlRZUEVfRVJST1IsICJTdGF0ZW1lbnQgZXJyb3IgY2FsbGJhY2sgbXVzdCBiZSBvZiB2YWxp
ZCB0eXBlLiIpOwogICAgICAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKICAgICAgICAg
fQogCkBAIC0xMDgsNyArMTA3LDcgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKFNRTFRyYW5zYWN0aW9u
RXhlY3V0ZQogCiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAgdHJhbnNhY3Rpb24tPmV4
ZWN1dGVTUUwoc3RhdGVtZW50LCBzcWxWYWx1ZXMsIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBl
Yyk7Ci0gICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICBWOFByb3h5OjpzZXRE
T01FeGNlcHRpb24oZWMpOwogCiAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKIH0KSW5kZXg6
IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1ZHRWxlbWVudEluc3RhbmNlQ3VzdG9tLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFNWR0VsZW1lbnRJ
bnN0YW5jZUN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhTVkdFbGVtZW50SW5zdGFuY2VDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC00NywxMyArNDcsMTMgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogQ0FMTEJBQ0tfRlVOQ19ERUNM
KFNWR0VsZW1lbnRJbnN0YW5jZUFkZEV2ZW50TGlzdGVuZXIpCiB7CiAgICAgSU5DX1NUQVRTKCJE
T00uU1ZHRWxlbWVudEluc3RhbmNlLkFkZEV2ZW50TGlzdGVuZXIoKSIpOwotICAgIFNWR0VsZW1l
bnRJbnN0YW5jZSogaW5zdGFuY2UgPSBWOFByb3h5OjpET01XcmFwcGVyVG9OYXRpdmU8U1ZHRWxl
bWVudEluc3RhbmNlPihhcmdzLkhvbGRlcigpKTsKKyAgICBTVkdFbGVtZW50SW5zdGFuY2UqIGlu
c3RhbmNlID0gVjhQcm94eTo6Y29udmVydERPTVdyYXBwZXJUb05hdGl2ZTxTVkdFbGVtZW50SW5z
dGFuY2U+KGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5Ojpy
ZXRyaWV2ZShpbnN0YW5jZS0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpKTsKICAgICBpZiAoIXBy
b3h5KQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgUmVmUHRyPEV2ZW50
TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPkZpbmRPckNyZWF0ZVY4RXZlbnRMaXN0ZW5lcihh
cmdzWzFdLCBmYWxzZSk7CisgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJv
eHktPmZpbmRPckNyZWF0ZVY4RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAgICAgaWYg
KGxpc3RlbmVyKSB7CiAgICAgICAgIFN0cmluZyB0eXBlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3Nb
MF0pOwogICAgICAgICBib29sIHVzZUNhcHR1cmUgPSBhcmdzWzJdLT5Cb29sZWFuVmFsdWUoKTsK
QEAgLTY2LDEzICs2NiwxMyBAQCBDQUxMQkFDS19GVU5DX0RFQ0woU1ZHRWxlbWVudEluc3RhbmNl
QWRkCiBDQUxMQkFDS19GVU5DX0RFQ0woU1ZHRWxlbWVudEluc3RhbmNlUmVtb3ZlRXZlbnRMaXN0
ZW5lcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5TVkdFbGVtZW50SW5zdGFuY2UuUmVtb3ZlRXZl
bnRMaXN0ZW5lcigpIik7Ci0gICAgU1ZHRWxlbWVudEluc3RhbmNlKiBpbnN0YW5jZSA9IFY4UHJv
eHk6OkRPTVdyYXBwZXJUb05hdGl2ZTxTVkdFbGVtZW50SW5zdGFuY2U+KGFyZ3MuSG9sZGVyKCkp
OworICAgIFNWR0VsZW1lbnRJbnN0YW5jZSogaW5zdGFuY2UgPSBWOFByb3h5Ojpjb252ZXJ0RE9N
V3JhcHBlclRvTmF0aXZlPFNWR0VsZW1lbnRJbnN0YW5jZT4oYXJncy5Ib2xkZXIoKSk7CiAKICAg
ICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKGluc3RhbmNlLT5zY3JpcHRFeGVj
dXRpb25Db250ZXh0KCkpOwogICAgIGlmICghcHJveHkpCiAgICAgICAgIHJldHVybiB2ODo6VW5k
ZWZpbmVkKCk7CiAKLSAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+
RmluZFY4RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CisgICAgUmVmUHRyPEV2ZW50TGlz
dGVuZXI+IGxpc3RlbmVyID0gcHJveHktPmZpbmRWOEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFs
c2UpOwogICAgIGlmIChsaXN0ZW5lcikgewogICAgICAgICBTdHJpbmcgdHlwZSA9IHRvV2ViQ29y
ZVN0cmluZyhhcmdzWzBdKTsKICAgICAgICAgYm9vbCB1c2VDYXB0dXJlID0gYXJnc1syXS0+Qm9v
bGVhblZhbHVlKCk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFNWR0xlbmd0
aEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhT
VkdMZW5ndGhDdXN0b20uY3BwCShyZXZpc2lvbiA0NTIxNikKKysrIFdlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4U1ZHTGVuZ3RoQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsMTcg
KzQ0LDE3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIEFDQ0VTU09SX0dFVFRFUihTVkdMZW5ndGhW
YWx1ZSkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5TVkdMZW5ndGgudmFsdWUiKTsKLSAgICBWOFNW
R1BPRFR5cGVXcmFwcGVyPFNWR0xlbmd0aD4qIHdyYXBwZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxWOFNWR1BPRFR5cGVXcmFwcGVyPFNWR0xlbmd0aD4gPihWOENsYXNzSW5kZXg6OlNWR0xF
TkdUSCwgaW5mby5Ib2xkZXIoKSk7CisgICAgVjhTVkdQT0RUeXBlV3JhcHBlcjxTVkdMZW5ndGg+
KiB3cmFwcGVyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFY4U1ZHUE9EVHlwZVdy
YXBwZXI8U1ZHTGVuZ3RoPiA+KFY4Q2xhc3NJbmRleDo6U1ZHTEVOR1RILCBpbmZvLkhvbGRlcigp
KTsKICAgICBTVkdMZW5ndGggaW1wID0gKndyYXBwZXI7Ci0gICAgcmV0dXJuIHY4OjpOdW1iZXI6
Ok5ldyhpbXAudmFsdWUoVjhQcm94eTo6R2V0U1ZHQ29udGV4dCh3cmFwcGVyKSkpOworICAgIHJl
dHVybiB2ODo6TnVtYmVyOjpOZXcoaW1wLnZhbHVlKFY4UHJveHk6OnN2Z0NvbnRleHQod3JhcHBl
cikpKTsKIH0KIAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFNWR0xlbmd0aENvbnZlcnRUb1NwZWNpZmll
ZFVuaXRzKQogewogICAgIElOQ19TVEFUUygiRE9NLlNWR0xlbmd0aC5jb252ZXJ0VG9TcGVjaWZp
ZWRVbml0cyIpOwotICAgIFY4U1ZHUE9EVHlwZVdyYXBwZXI8U1ZHTGVuZ3RoPiogd3JhcHBlciA9
IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFY4U1ZHUE9EVHlwZVdyYXBwZXI8U1ZHTGVuZ3RoPiA+
KFY4Q2xhc3NJbmRleDo6U1ZHTEVOR1RILCBhcmdzLkhvbGRlcigpKTsKKyAgICBWOFNWR1BPRFR5
cGVXcmFwcGVyPFNWR0xlbmd0aD4qIHdyYXBwZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVP
YmplY3Q8VjhTVkdQT0RUeXBlV3JhcHBlcjxTVkdMZW5ndGg+ID4oVjhDbGFzc0luZGV4OjpTVkdM
RU5HVEgsIGFyZ3MuSG9sZGVyKCkpOwogICAgIFNWR0xlbmd0aCBpbXAgPSAqd3JhcHBlcjsKLSAg
ICBTVkdFbGVtZW50KiBjb250ZXh0ID0gVjhQcm94eTo6R2V0U1ZHQ29udGV4dCh3cmFwcGVyKTsK
KyAgICBTVkdFbGVtZW50KiBjb250ZXh0ID0gVjhQcm94eTo6c3ZnQ29udGV4dCh3cmFwcGVyKTsK
ICAgICBpbXAuY29udmVydFRvU3BlY2lmaWVkVW5pdHModG9JbnQzMihhcmdzWzBdKSwgY29udGV4
dCk7CiAgICAgd3JhcHBlci0+Y29tbWl0Q2hhbmdlKGltcCwgY29udGV4dCk7CiAgICAgcmV0dXJu
IHY4OjpVbmRlZmluZWQoKTsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1ZH
TWF0cml4Q3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOFNWR01hdHJpeEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhTVkdNYXRyaXhDdXN0b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00
Niw3ICs0Niw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIENBTExCQUNLX0ZVTkNfREVDTChTVkdN
YXRyaXhJbnZlcnNlKQogewogICAgIElOQ19TVEFUUygiRE9NLlNWR01hdHJpeC5pbnZlcnNlKCki
KTsKLSAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtYXRyaXggPSAqVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8VjhTVkdQT0RUeXBlV3JhcHBlcjxUcmFuc2Zvcm1hdGlvbk1hdHJpeD4gPihWOENsYXNz
SW5kZXg6OlNWR01BVFJJWCwgYXJncy5Ib2xkZXIoKSk7CisgICAgVHJhbnNmb3JtYXRpb25NYXRy
aXggbWF0cml4ID0gKlY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxWOFNWR1BPRFR5cGVX
cmFwcGVyPFRyYW5zZm9ybWF0aW9uTWF0cml4PiA+KFY4Q2xhc3NJbmRleDo6U1ZHTUFUUklYLCBh
cmdzLkhvbGRlcigpKTsKICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKICAgICBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCByZXN1bHQgPSBtYXRyaXguaW52ZXJzZSgpOwogCkBAIC01NCwxNyArNTQsMTcg
QEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKFNWR01hdHJpeEludmVyc2UpCiAgICAgICAgIGVjID0gU1ZH
RXhjZXB0aW9uOjpTVkdfTUFUUklYX05PVF9JTlZFUlRBQkxFOwogCiAgICAgaWYgKGVjICE9IDAp
IHsKLSAgICAgICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICAgICAgVjhQcm94
eTo6c2V0RE9NRXhjZXB0aW9uKGVjKTsKICAgICAgICAgcmV0dXJuIHY4OjpIYW5kbGU8djg6OlZh
bHVlPigpOwogICAgIH0KIAotICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJ
bmRleDo6U1ZHTUFUUklYLCBuZXcgVjhTVkdTdGF0aWNQT0RUeXBlV3JhcHBlcjxUcmFuc2Zvcm1h
dGlvbk1hdHJpeD4ocmVzdWx0KSk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZlcnRUb1Y4T2Jq
ZWN0KFY4Q2xhc3NJbmRleDo6U1ZHTUFUUklYLCBuZXcgVjhTVkdTdGF0aWNQT0RUeXBlV3JhcHBl
cjxUcmFuc2Zvcm1hdGlvbk1hdHJpeD4ocmVzdWx0KSk7CiB9CiAKIENBTExCQUNLX0ZVTkNfREVD
TChTVkdNYXRyaXhSb3RhdGVGcm9tVmVjdG9yKQogewogICAgIElOQ19TVEFUUygiRE9NLlNWR01h
dHJpeC5yb3RhdGVGcm9tVmVjdG9yKCkiKTsKLSAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtYXRy
aXggPSAqVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8VjhTVkdQT0RUeXBlV3JhcHBlcjxUcmFuc2Zv
cm1hdGlvbk1hdHJpeD4gPihWOENsYXNzSW5kZXg6OlNWR01BVFJJWCwgYXJncy5Ib2xkZXIoKSk7
CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbWF0cml4ID0gKlY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxWOFNWR1BPRFR5cGVXcmFwcGVyPFRyYW5zZm9ybWF0aW9uTWF0cml4PiA+KFY4
Q2xhc3NJbmRleDo6U1ZHTUFUUklYLCBhcmdzLkhvbGRlcigpKTsKICAgICBFeGNlcHRpb25Db2Rl
IGVjID0gMDsKICAgICBmbG9hdCB4ID0gdG9GbG9hdChhcmdzWzBdKTsKICAgICBmbG9hdCB5ID0g
dG9GbG9hdChhcmdzWzFdKTsKQEAgLTc0LDExICs3NCwxMSBAQCBDQUxMQkFDS19GVU5DX0RFQ0wo
U1ZHTWF0cml4Um90YXRlRnJvbVZlCiAgICAgICAgIGVjID0gU1ZHRXhjZXB0aW9uOjpTVkdfSU5W
QUxJRF9WQUxVRV9FUlI7CiAKICAgICBpZiAoZWMgIT0gMCkgewotICAgICAgICBWOFByb3h5OjpT
ZXRET01FeGNlcHRpb24oZWMpOworICAgICAgICBWOFByb3h5OjpzZXRET01FeGNlcHRpb24oZWMp
OwogICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7CiAgICAgfQogCi0gICAg
cmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpTVkdNQVRSSVgsIG5ldyBW
OFNWR1N0YXRpY1BPRFR5cGVXcmFwcGVyPFRyYW5zZm9ybWF0aW9uTWF0cml4PihyZXN1bHQpKTsK
KyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydFRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpTVkdN
QVRSSVgsIG5ldyBWOFNWR1N0YXRpY1BPRFR5cGVXcmFwcGVyPFRyYW5zZm9ybWF0aW9uTWF0cml4
PihyZXN1bHQpKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhTdHlsZVNoZWV0TGlzdEN1c3RvbS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTdHlsZVNoZWV0TGlzdEN1c3RvbS5jcHAJ
KHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTdHlsZVNo
ZWV0TGlzdEN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDEyICs0NSwxMiBAQCBOQU1F
RF9QUk9QRVJUWV9HRVRURVIoU3R5bGVTaGVldExpc3QpCiAgICAgICAgIHJldHVybiBub3RIYW5k
bGVkQnlJbnRlcmNlcHRvcigpOwogCiAgICAgLy8gU2VhcmNoIHN0eWxlIHNoZWV0LgotICAgIFN0
eWxlU2hlZXRMaXN0KiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxTdHlsZVNoZWV0TGlz
dD4oVjhDbGFzc0luZGV4OjpTVFlMRVNIRUVUTElTVCwgaW5mby5Ib2xkZXIoKSk7CisgICAgU3R5
bGVTaGVldExpc3QqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxTdHlsZVNo
ZWV0TGlzdD4oVjhDbGFzc0luZGV4OjpTVFlMRVNIRUVUTElTVCwgaW5mby5Ib2xkZXIoKSk7CiAg
ICAgSFRNTFN0eWxlRWxlbWVudCogaXRlbSA9IGltcC0+Z2V0TmFtZWRJdGVtKHRvV2ViQ29yZVN0
cmluZyhuYW1lKSk7CiAgICAgaWYgKCFpdGVtKQogICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5
SW50ZXJjZXB0b3IoKTsKIAotICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJ
bmRleDo6SFRNTFNUWUxFRUxFTUVOVCwgaXRlbSk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnZl
cnRUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6SFRNTFNUWUxFRUxFTUVOVCwgaXRlbSk7CiB9CiAK
IH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4VHJlZVdhbGtlckN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhUcmVlV2Fsa2VyQ3VzdG9tLmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFRyZWVXYWxrZXJDdXN0b20uY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC01MSwxMyArNTEsMTMgQEAgc3RhdGljIGlubGluZSB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gdG9WOAogICAgIGlmICghb2JqZWN0KQogICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKIAot
ICAgIHJldHVybiBWOFByb3h5OjpOb2RlVG9WOE9iamVjdChvYmplY3QuZ2V0KCkpOworICAgIHJl
dHVybiBWOFByb3h5Ojpjb252ZXJ0Tm9kZVRvVjhPYmplY3Qob2JqZWN0LmdldCgpKTsKIH0KIAog
Q0FMTEJBQ0tfRlVOQ19ERUNMKFRyZWVXYWxrZXJQYXJlbnROb2RlKQogewogICAgIElOQ19TVEFU
UygiRE9NLlRyZWVXYWxrZXIucGFyZW50Tm9kZSgpIik7Ci0gICAgVHJlZVdhbGtlciogdHJlZVdh
bGtlciA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFRyZWVXYWxrZXI+KFY4Q2xhc3NJbmRleDo6
VFJFRVdBTEtFUiwgYXJncy5Ib2xkZXIoKSk7CisgICAgVHJlZVdhbGtlciogdHJlZVdhbGtlciA9
IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5kZXg6
OlRSRUVXQUxLRVIsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgU2NyaXB0U3RhdGUgc3RhdGU7CiAg
ICAgUmVmUHRyPE5vZGU+IHJlc3VsdCA9IHRyZWVXYWxrZXItPnBhcmVudE5vZGUoJnN0YXRlKTsK
QEAgLTY3LDcgKzY3LDcgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKFRyZWVXYWxrZXJQYXJlbnROb2Rl
KQogQ0FMTEJBQ0tfRlVOQ19ERUNMKFRyZWVXYWxrZXJGaXJzdENoaWxkKQogewogICAgIElOQ19T
VEFUUygiRE9NLlRyZWVXYWxrZXIuZmlyc3RDaGlsZCgpIik7Ci0gICAgVHJlZVdhbGtlciogdHJl
ZVdhbGtlciA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFRyZWVXYWxrZXI+KFY4Q2xhc3NJbmRl
eDo6VFJFRVdBTEtFUiwgYXJncy5Ib2xkZXIoKSk7CisgICAgVHJlZVdhbGtlciogdHJlZVdhbGtl
ciA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5k
ZXg6OlRSRUVXQUxLRVIsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgU2NyaXB0U3RhdGUgc3RhdGU7
CiAgICAgUmVmUHRyPE5vZGU+IHJlc3VsdCA9IHRyZWVXYWxrZXItPmZpcnN0Q2hpbGQoJnN0YXRl
KTsKQEAgLTc3LDcgKzc3LDcgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKFRyZWVXYWxrZXJGaXJzdENo
aWxkKQogQ0FMTEJBQ0tfRlVOQ19ERUNMKFRyZWVXYWxrZXJMYXN0Q2hpbGQpCiB7CiAgICAgSU5D
X1NUQVRTKCJET00uVHJlZVdhbGtlci5sYXN0Q2hpbGQoKSIpOwotICAgIFRyZWVXYWxrZXIqIHRy
ZWVXYWxrZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5k
ZXg6OlRSRUVXQUxLRVIsIGFyZ3MuSG9sZGVyKCkpOworICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxr
ZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0lu
ZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFNjcmlwdFN0YXRlIHN0YXRl
OwogICAgIFJlZlB0cjxOb2RlPiByZXN1bHQgPSB0cmVlV2Fsa2VyLT5sYXN0Q2hpbGQoJnN0YXRl
KTsKQEAgLTg3LDcgKzg3LDcgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKFRyZWVXYWxrZXJMYXN0Q2hp
bGQpCiBDQUxMQkFDS19GVU5DX0RFQ0woVHJlZVdhbGtlck5leHROb2RlKQogewogICAgIElOQ19T
VEFUUygiRE9NLlRyZWVXYWxrZXIubmV4dE5vZGUoKSIpOwotICAgIFRyZWVXYWxrZXIqIHRyZWVX
YWxrZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5kZXg6
OlRSRUVXQUxLRVIsIGFyZ3MuSG9sZGVyKCkpOworICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxrZXIg
PSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0luZGV4
OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFNjcmlwdFN0YXRlIHN0YXRlOwog
ICAgIFJlZlB0cjxOb2RlPiByZXN1bHQgPSB0cmVlV2Fsa2VyLT5uZXh0Tm9kZSgmc3RhdGUpOwpA
QCAtOTcsNyArOTcsNyBAQCBDQUxMQkFDS19GVU5DX0RFQ0woVHJlZVdhbGtlck5leHROb2RlKQog
Q0FMTEJBQ0tfRlVOQ19ERUNMKFRyZWVXYWxrZXJQcmV2aW91c05vZGUpCiB7CiAgICAgSU5DX1NU
QVRTKCJET00uVHJlZVdhbGtlci5wcmV2aW91c05vZGUoKSIpOwotICAgIFRyZWVXYWxrZXIqIHRy
ZWVXYWxrZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxUcmVlV2Fsa2VyPihWOENsYXNzSW5k
ZXg6OlRSRUVXQUxLRVIsIGFyZ3MuSG9sZGVyKCkpOworICAgIFRyZWVXYWxrZXIqIHRyZWVXYWxr
ZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0lu
ZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFNjcmlwdFN0YXRlIHN0YXRl
OwogICAgIFJlZlB0cjxOb2RlPiByZXN1bHQgPSB0cmVlV2Fsa2VyLT5wcmV2aW91c05vZGUoJnN0
YXRlKTsKQEAgLTEwNyw3ICsxMDcsNyBAQCBDQUxMQkFDS19GVU5DX0RFQ0woVHJlZVdhbGtlclBy
ZXZpb3VzTm9kCiBDQUxMQkFDS19GVU5DX0RFQ0woVHJlZVdhbGtlck5leHRTaWJsaW5nKQogewog
ICAgIElOQ19TVEFUUygiRE9NLlRyZWVXYWxrZXIubmV4dFNpYmxpbmcoKSIpOwotICAgIFRyZWVX
YWxrZXIqIHRyZWVXYWxrZXIgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxUcmVlV2Fsa2VyPihW
OENsYXNzSW5kZXg6OlRSRUVXQUxLRVIsIGFyZ3MuSG9sZGVyKCkpOworICAgIFRyZWVXYWxrZXIq
IHRyZWVXYWxrZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8VHJlZVdhbGtlcj4o
VjhDbGFzc0luZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFNjcmlwdFN0
YXRlIHN0YXRlOwogICAgIFJlZlB0cjxOb2RlPiByZXN1bHQgPSB0cmVlV2Fsa2VyLT5uZXh0U2li
bGluZygmc3RhdGUpOwpAQCAtMTE3LDcgKzExNyw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChUcmVl
V2Fsa2VyTmV4dFNpYmxpbmcKIENBTExCQUNLX0ZVTkNfREVDTChUcmVlV2Fsa2VyUHJldmlvdXNT
aWJsaW5nKQogewogICAgIElOQ19TVEFUUygiRE9NLlRyZWVXYWxrZXIucHJldmlvdXNTaWJsaW5n
KCkiKTsKLSAgICBUcmVlV2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6VG9OYXRpdmVPYmpl
Y3Q8VHJlZVdhbGtlcj4oVjhDbGFzc0luZGV4OjpUUkVFV0FMS0VSLCBhcmdzLkhvbGRlcigpKTsK
KyAgICBUcmVlV2Fsa2VyKiB0cmVlV2Fsa2VyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2Jq
ZWN0PFRyZWVXYWxrZXI+KFY4Q2xhc3NJbmRleDo6VFJFRVdBTEtFUiwgYXJncy5Ib2xkZXIoKSk7
CiAKICAgICBTY3JpcHRTdGF0ZSBzdGF0ZTsKICAgICBSZWZQdHI8Tm9kZT4gcmVzdWx0ID0gdHJl
ZVdhbGtlci0+cHJldmlvdXNTaWJsaW5nKCZzdGF0ZSk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOFdlYktpdENTU01hdHJpeENvbnN0cnVjdG9yLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdlYktpdENTU01hdHJpeENvbnN0cnVjdG9y
LmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdl
YktpdENTU01hdHJpeENvbnN0cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDcsNyArNDcs
NyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBDQUxMQkFDS19GVU5DX0RFQ0woV2ViS2l0Q1NTTWF0
cml4Q29uc3RydWN0b3IpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uV2ViS2l0Q1NTTWF0cml4LkNv
bnN0cnVjdG9yIik7Ci0gICAgLy8gRklYTUU6IFRoZSBsb2dpYyBoZXJlIGlzIGFsbW9zdCBleGFj
dCBkdXBsaWNhdGUgb2YgVjg6OkNvbnN0cnVjdERPTU9iamVjdC4KKyAgICAvLyBGSVhNRTogVGhl
IGxvZ2ljIGhlcmUgaXMgYWxtb3N0IGV4YWN0IGR1cGxpY2F0ZSBvZiBWODo6Y29uc3RydWN0RE9N
T2JqZWN0LgogICAgIC8vIENvbnNpZGVyIHJlZmFjdG9yaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGlv
bi4KICAgICBTdHJpbmcgY3NzVmFsdWU7CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPj0gMSkKQEAg
LTU5LDcgKzU5LDcgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKFdlYktpdENTU01hdHJpeENvbnN0cgog
ICAgICAgICB0aHJvd0Vycm9yKGVjKTsKIAogICAgIC8vIFRyYW5zZm9ybSB0aGUgaG9sZGVyIGlu
dG8gYSB3cmFwcGVyIG9iamVjdCBmb3IgdGhlIG1hdHJpeC4KLSAgICBWOFByb3h5OjpTZXRET01X
cmFwcGVyKGFyZ3MuSG9sZGVyKCksIFY4Q2xhc3NJbmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpX
RUJLSVRDU1NNQVRSSVgpLCBtYXRyaXguZ2V0KCkpOworICAgIFY4UHJveHk6OnNldERPTVdyYXBw
ZXIoYXJncy5Ib2xkZXIoKSwgVjhDbGFzc0luZGV4OjpUb0ludChWOENsYXNzSW5kZXg6OldFQktJ
VENTU01BVFJJWCksIG1hdHJpeC5nZXQoKSk7CiAgICAgcmV0dXJuIHRvVjgobWF0cml4LnJlbGVh
c2UoKSwgYXJncy5Ib2xkZXIoKSk7CiB9CiAKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4V2ViS2l0UG9pbnRDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhXZWJLaXRQb2ludENvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24g
NDUyMTYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdlYktpdFBvaW50Q29uc3Ry
dWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MCw3ICs0MCw3IEBAIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIENBTExCQUNLX0ZVTkNfREVDTChXZWJLaXRQb2ludENvbnN0cnVjdG9yKQogewogICAg
IElOQ19TVEFUUygiRE9NLldlYktpdFBvaW50LkNvbnN0cnVjdG9yIik7Ci0gICAgcmV0dXJuIFY4
UHJveHk6OkNvbnN0cnVjdERPTU9iamVjdDxWOENsYXNzSW5kZXg6OldFQktJVFBPSU5ULCBXZWJL
aXRQb2ludD4oYXJncyk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnN0cnVjdERPTU9iamVjdDxW
OENsYXNzSW5kZXg6OldFQktJVFBPSU5ULCBXZWJLaXRQb2ludD4oYXJncyk7CiB9CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4V29y
a2VyQ29udGV4dEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhXb3JrZXJDb250ZXh0Q3VzdG9tLmNwcAkocmV2aXNpb24gNDUyMTYpCisrKyBXZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckNvbnRleHRDdXN0b20uY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00OSwxNCArNDksMTQgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogQUNDRVNTT1Jf
R0VUVEVSKFdvcmtlckNvbnRleHRTZWxmKQogewogICAgIElOQ19TVEFUUyhMIkRPTS5Xb3JrZXJD
b250ZXh0LnNlbGYuX2dldCIpOwotICAgIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBW
OFByb3h5OjpUb05hdGl2ZU9iamVjdDxXb3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6OldPUktF
UkNPTlRFWFQsIGluZm8uSG9sZGVyKCkpOworICAgIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRl
eHQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8V29ya2VyQ29udGV4dD4oVjhDbGFz
c0luZGV4OjpXT1JLRVJDT05URVhULCBpbmZvLkhvbGRlcigpKTsKICAgICByZXR1cm4gV29ya2Vy
Q29udGV4dEV4ZWN1dGlvblByb3h5OjpXb3JrZXJDb250ZXh0VG9WOE9iamVjdCh3b3JrZXJDb250
ZXh0KTsKIH0KIAogQUNDRVNTT1JfR0VUVEVSKFdvcmtlckNvbnRleHRPbm1lc3NhZ2UpCiB7CiAg
ICAgSU5DX1NUQVRTKEwiRE9NLldvcmtlckNvbnRleHQub25tZXNzYWdlLl9nZXQiKTsKLSAgICBX
b3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8V29y
a2VyQ29udGV4dD4oVjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhULCBpbmZvLkhvbGRlcigpKTsK
KyAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCwgaW5m
by5Ib2xkZXIoKSk7CiAgICAgaWYgKHdvcmtlckNvbnRleHQtPm9ubWVzc2FnZSgpKSB7CiAgICAg
ICAgIFY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8
VjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lcio+KHdvcmtlckNvbnRleHQtPm9ubWVzc2FnZSgp
KTsKICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4TGlzdGVuZXIgPSBsaXN0ZW5lci0+
Z2V0TGlzdGVuZXJPYmplY3QoKTsKQEAgLTY4LDcgKzY4LDcgQEAgQUNDRVNTT1JfR0VUVEVSKFdv
cmtlckNvbnRleHRPbm1lc3NhZ2UpCiBBQ0NFU1NPUl9TRVRURVIoV29ya2VyQ29udGV4dE9ubWVz
c2FnZSkKIHsKICAgICBJTkNfU1RBVFMoTCJET00uV29ya2VyQ29udGV4dC5vbm1lc3NhZ2UuX3Nl
dCIpOwotICAgIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2
ZU9iamVjdDxXb3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGluZm8u
SG9sZGVyKCkpOworICAgIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBWOFByb3h5Ojpj
b252ZXJ0VG9OYXRpdmVPYmplY3Q8V29ya2VyQ29udGV4dD4oVjhDbGFzc0luZGV4OjpXT1JLRVJD
T05URVhULCBpbmZvLkhvbGRlcigpKTsKICAgICBWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVy
KiBvbGRMaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIq
Pih3b3JrZXJDb250ZXh0LT5vbm1lc3NhZ2UoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkg
ewogICAgICAgICBpZiAod29ya2VyQ29udGV4dC0+b25tZXNzYWdlKCkpIHsKQEAgLTk0LDcgKzk0
LDcgQEAgQUNDRVNTT1JfU0VUVEVSKFdvcmtlckNvbnRleHRPbm1lc3NhZ2UpCiAKIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBTZXRUaW1lb3V0T3JJbnRlcnZhbChjb25zdCB2ODo6QXJndW1lbnRzJiBh
cmdzLCBib29sIHNpbmdsZVNob3QpCiB7Ci0gICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4
dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6
V09SS0VSQ09OVEVYVCwgYXJncy5Ib2xkZXIoKSk7CisgICAgV29ya2VyQ29udGV4dCogd29ya2Vy
Q29udGV4dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxXb3JrZXJDb250ZXh0PihW
OENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgaW50IGFy
Z3VtZW50Q291bnQgPSBhcmdzLkxlbmd0aCgpOwogICAgIGlmIChhcmd1bWVudENvdW50IDwgMSkK
QEAgLTEzMSw4ICsxMzEsOCBAQCBDQUxMQkFDS19GVU5DX0RFQ0woV29ya2VyQ29udGV4dEltcG9y
dFNjCiAgICAgaWYgKCFhcmdzLkxlbmd0aCgpKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5l
ZCgpOwogCi0gICAgU3RyaW5nIGNhbGxlclVSTCA9IFY4UHJveHk6OkdldFNvdXJjZU5hbWUoKTsK
LSAgICBpbnQgY2FsbGVyTGluZSA9IFY4UHJveHk6OkdldFNvdXJjZUxpbmVOdW1iZXIoKSArIDE7
CisgICAgU3RyaW5nIGNhbGxlclVSTCA9IFY4UHJveHk6OnNvdXJjZU5hbWUoKTsKKyAgICBpbnQg
Y2FsbGVyTGluZSA9IFY4UHJveHk6OnNvdXJjZUxpbmVOdW1iZXIoKSArIDE7CiAKICAgICBWZWN0
b3I8U3RyaW5nPiB1cmxzOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5MZW5ndGgoKTsg
aSsrKSB7CkBAIC0xNDMsNyArMTQzLDcgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKFdvcmtlckNvbnRl
eHRJbXBvcnRTYwogICAgICAgICB1cmxzLmFwcGVuZCh0b1dlYkNvcmVTdHJpbmcoc2NyaXB0VXJs
KSk7CiAgICAgfQogCi0gICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9IFY4UHJveHk6
OlRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVY
VCwgYXJncy5Ib2xkZXIoKSk7CisgICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9IFY4
UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxXb3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6
OldPUktFUkNPTlRFWFQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9
IDA7CiAgICAgd29ya2VyQ29udGV4dC0+aW1wb3J0U2NyaXB0cyh1cmxzLCBjYWxsZXJVUkwsIGNh
bGxlckxpbmUsIGVjKTsKQEAgLTE2OCw3ICsxNjgsNyBAQCBDQUxMQkFDS19GVU5DX0RFQ0woV29y
a2VyQ29udGV4dFNldEludGVyCiBDQUxMQkFDS19GVU5DX0RFQ0woV29ya2VyQ29udGV4dEFkZEV2
ZW50TGlzdGVuZXIpCiB7CiAgICAgSU5DX1NUQVRTKEwiRE9NLldvcmtlckNvbnRleHQuYWRkRXZl
bnRMaXN0ZW5lcigpIik7Ci0gICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9IFY4UHJv
eHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09O
VEVYVCwgYXJncy5Ib2xkZXIoKSk7CisgICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCA9
IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxXb3JrZXJDb250ZXh0PihWOENsYXNzSW5k
ZXg6OldPUktFUkNPTlRFWFQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgUmVmUHRyPFY4RXZlbnRM
aXN0ZW5lcj4gbGlzdGVuZXIgPSB3b3JrZXJDb250ZXh0LT5zY3JpcHQoKS0+cHJveHkoKS0+Zmlu
ZE9yQ3JlYXRlRXZlbnRMaXN0ZW5lcih2ODo6TG9jYWw8djg6Ok9iamVjdD46OkNhc3QoYXJnc1sx
XSksIGZhbHNlLCBmYWxzZSk7CiAKQEAgLTE4NSw3ICsxODUsNyBAQCBDQUxMQkFDS19GVU5DX0RF
Q0woV29ya2VyQ29udGV4dEFkZEV2ZW50CiBDQUxMQkFDS19GVU5DX0RFQ0woV29ya2VyQ29udGV4
dFJlbW92ZUV2ZW50TGlzdGVuZXIpCiB7CiAgICAgSU5DX1NUQVRTKEwiRE9NLldvcmtlckNvbnRl
eHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigpIik7Ci0gICAgV29ya2VyQ29udGV4dCogd29ya2VyQ29u
dGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlckNvbnRleHQ+KFY4Q2xhc3NJbmRl
eDo6V09SS0VSQ09OVEVYVCwgYXJncy5Ib2xkZXIoKSk7CisgICAgV29ya2VyQ29udGV4dCogd29y
a2VyQ29udGV4dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxXb3JrZXJDb250ZXh0
PihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGFyZ3MuSG9sZGVyKCkpOwogICAgIFdvcmtl
ckNvbnRleHRFeGVjdXRpb25Qcm94eSogcHJveHkgPSB3b3JrZXJDb250ZXh0LT5zY3JpcHQoKS0+
cHJveHkoKTsKIAogICAgIFJlZlB0cjxWOEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHkt
PmZpbmRPckNyZWF0ZUV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpDYXN0KGFy
Z3NbMV0pLCBmYWxzZSwgdHJ1ZSk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OFdvcmtlckN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhXb3JrZXJDdXN0b20uY3BwCShyZXZpc2lvbiA0NTIxNikKKysrIFdlYkNvcmUvYmluZGlu
Z3MvdjgvY3VzdG9tL1Y4V29ya2VyQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtODMsNyAr
ODMsNyBAQCBDQUxMQkFDS19GVU5DX0RFQ0woV29ya2VyQ29uc3RydWN0b3IpCiAgICAgfQogCiAg
ICAgLy8gQ3JlYXRlIHRoZSB3b3JrZXIgb2JqZWN0LgotICAgIC8vIE5vdGU6IGl0J3MgT0sgdG8g
bGV0IHRoaXMgUmVmUHRyIGdvIG91dCBvZiBzY29wZSBiZWNhdXNlIHdlIGFsc28gY2FsbCBTZXRE
T01XcmFwcGVyKCksIHdoaWNoIGVmZmVjdGl2ZWx5IGhvbGRzIGEgcmVmZXJlbmNlIHRvIG9iai4K
KyAgICAvLyBOb3RlOiBpdCdzIE9LIHRvIGxldCB0aGlzIFJlZlB0ciBnbyBvdXQgb2Ygc2NvcGUg
YmVjYXVzZSB3ZSBhbHNvIGNhbGwgc2V0RE9NV3JhcHBlcigpLCB3aGljaCBlZmZlY3RpdmVseSBo
b2xkcyBhIHJlZmVyZW5jZSB0byBvYmouCiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAg
UmVmUHRyPFdvcmtlcj4gb2JqID0gV29ya2VyOjpjcmVhdGUodG9XZWJDb3JlU3RyaW5nKHNjcmlw
dFVybCksIGNvbnRleHQsIGVjKTsKIApAQCAtOTIsMTAgKzkyLDEwIEBAIENBTExCQUNLX0ZVTkNf
REVDTChXb3JrZXJDb25zdHJ1Y3RvcikKIAogICAgIC8vIFNldHVwIHRoZSBzdGFuZGFyZCB3cmFw
cGVyIG9iamVjdCBpbnRlcm5hbCBmaWVsZHMuCiAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3
cmFwcGVyT2JqZWN0ID0gYXJncy5Ib2xkZXIoKTsKLSAgICBWOFByb3h5OjpTZXRET01XcmFwcGVy
KHdyYXBwZXJPYmplY3QsIFY4Q2xhc3NJbmRleDo6V09SS0VSLCBvYmouZ2V0KCkpOworICAgIFY4
UHJveHk6OnNldERPTVdyYXBwZXIod3JhcHBlck9iamVjdCwgVjhDbGFzc0luZGV4OjpXT1JLRVIs
IG9iai5nZXQoKSk7CiAKICAgICBvYmotPnJlZigpOwotICAgIFY4UHJveHk6OlNldEpTV3JhcHBl
ckZvckFjdGl2ZURPTU9iamVjdChvYmouZ2V0KCksIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+
OjpOZXcod3JhcHBlck9iamVjdCkpOworICAgIFY4UHJveHk6OnNldEpTV3JhcHBlckZvckFjdGl2
ZURPTU9iamVjdChvYmouZ2V0KCksIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcod3Jh
cHBlck9iamVjdCkpOwogCiAgICAgcmV0dXJuIHdyYXBwZXJPYmplY3Q7CiB9CkBAIC0xMTAsNyAr
MTEwLDcgQEAgUGFzc1JlZlB0cjxFdmVudExpc3RlbmVyPiBnZXRFdmVudExpc3RlbgogCiAgICAg
VjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZSh3b3JrZXItPnNjcmlwdEV4ZWN1dGlv
bkNvbnRleHQoKSk7CiAgICAgaWYgKHByb3h5KQotICAgICAgICByZXR1cm4gZmluZE9ubHkgPyBw
cm94eS0+RmluZE9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKSA6IHByb3h5LT5GaW5k
T3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBmYWxzZSk7CisgICAgICAgIHJldHVy
biBmaW5kT25seSA/IHByb3h5LT5maW5kT2JqZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2Up
IDogcHJveHktPmZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKTsK
IAogICAgIHJldHVybiAwOwogfQpAQCAtMTE4LDcgKzExOCw3IEBAIFBhc3NSZWZQdHI8RXZlbnRM
aXN0ZW5lcj4gZ2V0RXZlbnRMaXN0ZW4KIEFDQ0VTU09SX0dFVFRFUihXb3JrZXJPbm1lc3NhZ2Up
CiB7CiAgICAgSU5DX1NUQVRTKEwiRE9NLldvcmtlci5vbm1lc3NhZ2UuX2dldCIpOwotICAgIFdv
cmtlciogd29ya2VyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8V29ya2VyPihWOENsYXNzSW5k
ZXg6OldPUktFUiwgaW5mby5Ib2xkZXIoKSk7CisgICAgV29ya2VyKiB3b3JrZXIgPSBWOFByb3h5
Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8V29ya2VyPihWOENsYXNzSW5kZXg6OldPUktFUiwgaW5m
by5Ib2xkZXIoKSk7CiAgICAgaWYgKHdvcmtlci0+b25tZXNzYWdlKCkpIHsKICAgICAgICAgVjhP
YmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRM
aXN0ZW5lcio+KHdvcmtlci0+b25tZXNzYWdlKCkpOwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9i
amVjdD4gdjhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMTMw
LDcgKzEzMCw3IEBAIEFDQ0VTU09SX0dFVFRFUihXb3JrZXJPbm1lc3NhZ2UpCiBBQ0NFU1NPUl9T
RVRURVIoV29ya2VyT25tZXNzYWdlKQogewogICAgIElOQ19TVEFUUyhMIkRPTS5Xb3JrZXIub25t
ZXNzYWdlLl9zZXQiKTsKLSAgICBXb3JrZXIqIHdvcmtlciA9IFY4UHJveHk6OlRvTmF0aXZlT2Jq
ZWN0PFdvcmtlcj4oVjhDbGFzc0luZGV4OjpXT1JLRVIsIGluZm8uSG9sZGVyKCkpOworICAgIFdv
cmtlciogd29ya2VyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFdvcmtlcj4oVjhD
bGFzc0luZGV4OjpXT1JLRVIsIGluZm8uSG9sZGVyKCkpOwogICAgIFY4T2JqZWN0RXZlbnRMaXN0
ZW5lciogb2xkTGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih3
b3JrZXItPm9ubWVzc2FnZSgpKTsKICAgICBpZiAodmFsdWUtPklzTnVsbCgpKSB7CiAgICAgICAg
IGlmIChvbGRMaXN0ZW5lcikgewpAQCAtMTU3LDcgKzE1Nyw3IEBAIEFDQ0VTU09SX1NFVFRFUihX
b3JrZXJPbm1lc3NhZ2UpCiBBQ0NFU1NPUl9HRVRURVIoV29ya2VyT25lcnJvcikKIHsKICAgICBJ
TkNfU1RBVFMoTCJET00uV29ya2VyLm9uZXJyb3IuX2dldCIpOwotICAgIFdvcmtlciogd29ya2Vy
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8V29ya2VyPihWOENsYXNzSW5kZXg6OldPUktFUiwg
aW5mby5Ib2xkZXIoKSk7CisgICAgV29ya2VyKiB3b3JrZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9O
YXRpdmVPYmplY3Q8V29ya2VyPihWOENsYXNzSW5kZXg6OldPUktFUiwgaW5mby5Ib2xkZXIoKSk7
CiAgICAgaWYgKHdvcmtlci0+b25lcnJvcigpKSB7CiAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0
ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih3b3Jr
ZXItPm9uZXJyb3IoKSk7CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB2OExpc3RlbmVy
ID0gbGlzdGVuZXItPmdldExpc3RlbmVyT2JqZWN0KCk7CkBAIC0xNjksNyArMTY5LDcgQEAgQUND
RVNTT1JfR0VUVEVSKFdvcmtlck9uZXJyb3IpCiBBQ0NFU1NPUl9TRVRURVIoV29ya2VyT25lcnJv
cikKIHsKICAgICBJTkNfU1RBVFMoTCJET00uV29ya2VyLm9uZXJyb3IuX3NldCIpOwotICAgIFdv
cmtlciogd29ya2VyID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8V29ya2VyPihWOENsYXNzSW5k
ZXg6OldPUktFUiwgaW5mby5Ib2xkZXIoKSk7CisgICAgV29ya2VyKiB3b3JrZXIgPSBWOFByb3h5
Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8V29ya2VyPihWOENsYXNzSW5kZXg6OldPUktFUiwgaW5m
by5Ib2xkZXIoKSk7CiAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBvbGRMaXN0ZW5lciA9IHN0
YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHdvcmtlci0+b25lcnJvcigpKTsKICAg
ICBpZiAodmFsdWUtPklzTnVsbCgpKSB7CiAgICAgICAgIGlmIChvbGRMaXN0ZW5lcikgewpAQCAt
MTk2LDcgKzE5Niw3IEBAIEFDQ0VTU09SX1NFVFRFUihXb3JrZXJPbmVycm9yKQogQ0FMTEJBQ0tf
RlVOQ19ERUNMKFdvcmtlckFkZEV2ZW50TGlzdGVuZXIpCiB7CiAgICAgSU5DX1NUQVRTKEwiRE9N
Lldvcmtlci5hZGRFdmVudExpc3RlbmVyKCkiKTsKLSAgICBXb3JrZXIqIHdvcmtlciA9IFY4UHJv
eHk6OlRvTmF0aXZlT2JqZWN0PFdvcmtlcj4oVjhDbGFzc0luZGV4OjpXT1JLRVIsIGFyZ3MuSG9s
ZGVyKCkpOworICAgIFdvcmtlciogd29ya2VyID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2Jq
ZWN0PFdvcmtlcj4oVjhDbGFzc0luZGV4OjpXT1JLRVIsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAg
UmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gZ2V0RXZlbnRMaXN0ZW5lcih3b3JrZXIs
IGFyZ3NbMV0sIGZhbHNlKTsKICAgICBpZiAobGlzdGVuZXIpIHsKQEAgLTIxMiw3ICsyMTIsNyBA
QCBDQUxMQkFDS19GVU5DX0RFQ0woV29ya2VyQWRkRXZlbnRMaXN0ZW5lCiBDQUxMQkFDS19GVU5D
X0RFQ0woV29ya2VyUmVtb3ZlRXZlbnRMaXN0ZW5lcikKIHsKICAgICBJTkNfU1RBVFMoTCJET00u
V29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoKSIpOwotICAgIFdvcmtlciogd29ya2VyID0gVjhQ
cm94eTo6VG9OYXRpdmVPYmplY3Q8V29ya2VyPihWOENsYXNzSW5kZXg6OldPUktFUiwgYXJncy5I
b2xkZXIoKSk7CisgICAgV29ya2VyKiB3b3JrZXIgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVP
YmplY3Q8V29ya2VyPihWOENsYXNzSW5kZXg6OldPUktFUiwgYXJncy5Ib2xkZXIoKSk7CiAKICAg
ICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBnZXRFdmVudExpc3RlbmVyKHdvcmtl
ciwgYXJnc1sxXSwgdHJ1ZSk7CiAgICAgaWYgKGxpc3RlbmVyKSB7CkluZGV4OiBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOFhNTEh0dHBSZXF1ZXN0Q29uc3RydWN0b3IuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MSHR0cFJlcXVlc3RDb25zdHJ1
Y3Rvci5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhYTUxIdHRwUmVxdWVzdENvbnN0cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTksMTEg
KzU5LDExIEBAIENBTExCQUNLX0ZVTkNfREVDTChYTUxIdHRwUmVxdWVzdENvbnN0cnUKICNlbmRp
ZgogICAgICAgICBjb250ZXh0ID0gVjhQcm94eTo6cmV0cmlldmVGcmFtZSgpLT5kb2N1bWVudCgp
OwogICAgIFJlZlB0cjxYTUxIdHRwUmVxdWVzdD4geG1sSHR0cFJlcXVlc3QgPSBYTUxIdHRwUmVx
dWVzdDo6Y3JlYXRlKGNvbnRleHQpOwotICAgIFY4UHJveHk6OlNldERPTVdyYXBwZXIoYXJncy5I
b2xkZXIoKSwgVjhDbGFzc0luZGV4OjpUb0ludChWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNU
KSwgeG1sSHR0cFJlcXVlc3QuZ2V0KCkpOworICAgIFY4UHJveHk6OnNldERPTVdyYXBwZXIoYXJn
cy5Ib2xkZXIoKSwgVjhDbGFzc0luZGV4OjpUb0ludChWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFV
RVNUKSwgeG1sSHR0cFJlcXVlc3QuZ2V0KCkpOwogCiAgICAgLy8gQWRkIG9iamVjdCB0byB0aGUg
d3JhcHBlciBtYXAuCiAgICAgeG1sSHR0cFJlcXVlc3QtPnJlZigpOwotICAgIFY4UHJveHk6OlNl
dEpTV3JhcHBlckZvckFjdGl2ZURPTU9iamVjdCh4bWxIdHRwUmVxdWVzdC5nZXQoKSwgdjg6OlBl
cnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhhcmdzLkhvbGRlcigpKSk7CisgICAgVjhQcm94eTo6
c2V0SlNXcmFwcGVyRm9yQWN0aXZlRE9NT2JqZWN0KHhtbEh0dHBSZXF1ZXN0LmdldCgpLCB2ODo6
UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGFyZ3MuSG9sZGVyKCkpKTsKICAgICByZXR1cm4g
YXJncy5Ib2xkZXIoKTsKIH0KIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhY
TUxIdHRwUmVxdWVzdEN1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVzdEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysg
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVzdEN1c3RvbS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTU0LDcgKzU0LDcgQEAgUGFzc1JlZlB0cjxFdmVudExpc3RlbmVyPiBn
ZXRFdmVudExpc3RlbgogCiAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZSh4
bWxIdHRwUmVxdWVzdC0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpKTsKICAgICBpZiAocHJveHkp
Ci0gICAgICAgIHJldHVybiBmaW5kT25seSA/IHByb3h5LT5GaW5kT2JqZWN0RXZlbnRMaXN0ZW5l
cih2YWx1ZSwgZmFsc2UpIDogcHJveHktPkZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIo
dmFsdWUsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIGZpbmRPbmx5ID8gcHJveHktPmZpbmRPYmpl
Y3RFdmVudExpc3RlbmVyKHZhbHVlLCBmYWxzZSkgOiBwcm94eS0+ZmluZE9yQ3JlYXRlT2JqZWN0
RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2UpOwogCiAgICAgcmV0dXJuIFBhc3NSZWZQdHI8RXZl
bnRMaXN0ZW5lcj4oKTsKIH0KQEAgLTYyLDcgKzYyLDcgQEAgUGFzc1JlZlB0cjxFdmVudExpc3Rl
bmVyPiBnZXRFdmVudExpc3RlbgogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25hYm9y
dCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdC5vbmFib3J0Ll9nZXQiKTsK
LSAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5I
b2xkZXIoKSk7CisgICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6
Y29udmVydFRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhU
VFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKICAgICBpZiAoeG1sSHR0cFJlcXVlc3QtPm9uYWJv
cnQoKSkgewogICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGlj
X2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3QtPm9uYWJvcnQoKSk7
CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB2OExpc3RlbmVyID0gbGlzdGVuZXItPmdl
dExpc3RlbmVyT2JqZWN0KCk7CkBAIC03NCw3ICs3NCw3IEBAIEFDQ0VTU09SX0dFVFRFUihYTUxI
dHRwUmVxdWVzdE9uYWJvcnQpCiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RPbmFib3J0
KQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0Lm9uYWJvcnQuX3NldCIpOwot
ICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2Jq
ZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBpbmZvLkhv
bGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpj
b252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRU
UFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsKICAg
ICAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0LT5vbmFib3J0KCkpIHsKICAgICAgICAgICAgIFY4T2Jq
ZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlz
dGVuZXIqPih4bWxIdHRwUmVxdWVzdC0+b25hYm9ydCgpKTsKQEAgLTk2LDcgKzk2LDcgQEAgQUND
RVNTT1JfU0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25hYm9ydCkKIEFDQ0VTU09SX0dFVFRFUihYTUxI
dHRwUmVxdWVzdE9uZXJyb3IpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3Qu
b25lcnJvci5fZ2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQ
cm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRU
UFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVx
dWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhD
bGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHhtbEh0
dHBSZXF1ZXN0LT5vbmVycm9yKCkpIHsKICAgICAgICAgUmVmUHRyPFY4T2JqZWN0RXZlbnRMaXN0
ZW5lcj4gbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxI
dHRwUmVxdWVzdC0+b25lcnJvcigpKTsKICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4
TGlzdGVuZXIgPSBsaXN0ZW5lci0+Z2V0TGlzdGVuZXJPYmplY3QoKTsKQEAgLTEwOCw3ICsxMDgs
NyBAQCBBQ0NFU1NPUl9HRVRURVIoWE1MSHR0cFJlcXVlc3RPbmVycm9yKQogQUNDRVNTT1JfU0VU
VEVSKFhNTEh0dHBSZXF1ZXN0T25lcnJvcikKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRw
UmVxdWVzdC5vbmVycm9yLl9zZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVl
c3QgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4
OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJlcXVlc3QqIHht
bEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1
ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKICAgICBp
ZiAodmFsdWUtPklzTnVsbCgpKSB7CiAgICAgICAgIGlmICh4bWxIdHRwUmVxdWVzdC0+b25lcnJv
cigpKSB7CiAgICAgICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3Rh
dGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3QtPm9uZXJyb3Io
KSk7CkBAIC0xMzAsNyArMTMwLDcgQEAgQUNDRVNTT1JfU0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25l
cnJvcikKIEFDQ0VTU09SX0dFVFRFUihYTUxIdHRwUmVxdWVzdE9ubG9hZCkKIHsKICAgICBJTkNf
U1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdC5vbmxvYWQuX2dldCIpOwotICAgIFhNTEh0dHBSZXF1
ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1
ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBY
TUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVP
YmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8u
SG9sZGVyKCkpOwogICAgIGlmICh4bWxIdHRwUmVxdWVzdC0+b25sb2FkKCkpIHsKICAgICAgICAg
VjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZl
bnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0LT5vbmxvYWQoKSk7CiAgICAgICAgIHY4OjpMb2Nh
bDx2ODo6T2JqZWN0PiB2OExpc3RlbmVyID0gbGlzdGVuZXItPmdldExpc3RlbmVyT2JqZWN0KCk7
CkBAIC0xNDIsNyArMTQyLDcgQEAgQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25sb2Fk
KQogQUNDRVNTT1JfU0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25sb2FkKQogewogICAgIElOQ19TVEFU
UygiRE9NLlhNTEh0dHBSZXF1ZXN0Lm9ubG9hZC5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3Qq
IHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+
KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0
dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVj
dDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xk
ZXIoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAoeG1sSHR0cFJl
cXVlc3QtPm9ubG9hZCgpKSB7CiAgICAgICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxp
c3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVl
c3QtPm9ubG9hZCgpKTsKQEAgLTE2NCw3ICsxNjQsNyBAQCBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0
cFJlcXVlc3RPbmxvYWQpCiBBQ0NFU1NPUl9HRVRURVIoWE1MSHR0cFJlcXVlc3RPbmxvYWRzdGFy
dCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdC5vbmxvYWRzdGFydC5fZ2V0
Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRp
dmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGlu
Zm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJv
eHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpY
TUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0LT5v
bmxvYWRzdGFydCgpKSB7CiAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIg
PSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdC0+b25s
b2Fkc3RhcnQoKSk7CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB2OExpc3RlbmVyID0g
bGlzdGVuZXItPmdldExpc3RlbmVyT2JqZWN0KCk7CkBAIC0xNzYsNyArMTc2LDcgQEAgQUNDRVNT
T1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25sb2Fkc3RhcgogQUNDRVNTT1JfU0VUVEVSKFhNTEh0
dHBSZXF1ZXN0T25sb2Fkc3RhcnQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVl
c3Qub25sb2Fkc3RhcnQuX3NldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVz
dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6
OlhNTEhUVFBSRVFVRVNULCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1s
SHR0cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVl
c3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwogICAgIGlm
ICh2YWx1ZS0+SXNOdWxsKCkpIHsKICAgICAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0LT5vbmxvYWRz
dGFydCgpKSB7CiAgICAgICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0g
c3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3QtPm9ubG9h
ZHN0YXJ0KCkpOwpAQCAtMTk4LDcgKzE5OCw3IEBAIEFDQ0VTU09SX1NFVFRFUihYTUxIdHRwUmVx
dWVzdE9ubG9hZHN0YXIKIEFDQ0VTU09SX0dFVFRFUihYTUxIdHRwUmVxdWVzdE9ucHJvZ3Jlc3Mp
CiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3Qub25wcm9ncmVzcy5fZ2V0Iik7
Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8u
SG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxI
VFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0LT5vbnBy
b2dyZXNzKCkpIHsKICAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0
YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0LT5vbnByb2dy
ZXNzKCkpOwogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxpc3Rl
bmVyLT5nZXRMaXN0ZW5lck9iamVjdCgpOwpAQCAtMjEwLDcgKzIxMCw3IEBAIEFDQ0VTU09SX0dF
VFRFUihYTUxIdHRwUmVxdWVzdE9ucHJvZ3Jlc3MKIEFDQ0VTU09SX1NFVFRFUihYTUxIdHRwUmVx
dWVzdE9ucHJvZ3Jlc3MpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3Qub25w
cm9ncmVzcy5fc2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQ
cm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRU
UFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVx
dWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhD
bGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHZhbHVl
LT5Jc051bGwoKSkgewogICAgICAgICBpZiAoeG1sSHR0cFJlcXVlc3QtPm9ucHJvZ3Jlc3MoKSkg
ewogICAgICAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRpY19j
YXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0LT5vbnByb2dyZXNzKCkp
OwpAQCAtMjMyLDcgKzIzMiw3IEBAIEFDQ0VTU09SX1NFVFRFUihYTUxIdHRwUmVxdWVzdE9ucHJv
Z3Jlc3MKIEFDQ0VTU09SX0dFVFRFUihYTUxIdHRwUmVxdWVzdE9ucmVhZHlzdGF0ZWNoYW5nZSkK
IHsKICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2Uu
X2dldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OlRv
TmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNU
LCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBW
OFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRl
eDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh4bWxIdHRwUmVxdWVz
dC0+b25yZWFkeXN0YXRlY2hhbmdlKCkpIHsKICAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVy
KiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBS
ZXF1ZXN0LT5vbnJlYWR5c3RhdGVjaGFuZ2UoKSk7CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2Jq
ZWN0PiB2OExpc3RlbmVyID0gbGlzdGVuZXItPmdldExpc3RlbmVyT2JqZWN0KCk7CkBAIC0yNDQs
NyArMjQ0LDcgQEAgQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25yZWFkeXN0YQogQUND
RVNTT1JfU0VUVEVSKFhNTEh0dHBSZXF1ZXN0T25yZWFkeXN0YXRlY2hhbmdlKQogewogICAgIElO
Q19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZS5fc2V0Iik7Ci0g
ICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmpl
Y3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9s
ZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNv
bnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQ
UkVRVUVTVCwgaW5mby5Ib2xkZXIoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAg
ICAgICBpZiAoeG1sSHR0cFJlcXVlc3QtPm9ucmVhZHlzdGF0ZWNoYW5nZSgpKSB7CiAgICAgICAg
ICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmpl
Y3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3QtPm9ucmVhZHlzdGF0ZWNoYW5nZSgpKTsK
QEAgLTI2OCwxNCArMjY4LDE0IEBAIEFDQ0VTU09SX0dFVFRFUihYTUxIdHRwUmVxdWVzdFJlc3Bv
bnNlVGUKICAgICAvLyBGSVhNRTogVGhpcyBpcyBvbmx5IG5lZWRlZCBiZWNhdXNlIHdlYmtpdCBz
ZXQgdGhpcyBnZXR0ZXIgYXMgY3VzdG9tLgogICAgIC8vIFNvIHdlIG5lZWQgYSBjdXN0b20gbWV0
aG9kIHRvIGF2b2lkIGZvcmtpbmcgdGhlIElETCBmaWxlLgogICAgIElOQ19TVEFUUygiRE9NLlhN
TEh0dHBSZXF1ZXN0LnJlc3BvbnNldGV4dC5fZ2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHht
bEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4
Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBS
ZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxY
TUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgaW5mby5Ib2xkZXIo
KSk7CiAgICAgcmV0dXJuIHY4U3RyaW5nT3JOdWxsKHhtbEh0dHBSZXF1ZXN0LT5yZXNwb25zZVRl
eHQoKSk7CiB9CiAKIENBTExCQUNLX0ZVTkNfREVDTChYTUxIdHRwUmVxdWVzdEFkZEV2ZW50TGlz
dGVuZXIpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3QuYWRkRXZlbnRMaXN0
ZW5lcigpIik7Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6
VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVF
U1QsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9
IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0lu
ZGV4OjpYTUxIVFRQUkVRVUVTVCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBSZWZQdHI8RXZlbnRM
aXN0ZW5lcj4gbGlzdGVuZXIgPSBnZXRFdmVudExpc3RlbmVyKHhtbEh0dHBSZXF1ZXN0LCBhcmdz
WzFdLCBmYWxzZSk7CiAgICAgaWYgKGxpc3RlbmVyKSB7CkBAIC0yOTEsNyArMjkxLDcgQEAgQ0FM
TEJBQ0tfRlVOQ19ERUNMKFhNTEh0dHBSZXF1ZXN0QWRkRXZlbgogQ0FMTEJBQ0tfRlVOQ19ERUNM
KFhNTEh0dHBSZXF1ZXN0UmVtb3ZlRXZlbnRMaXN0ZW5lcikKIHsKICAgICBJTkNfU1RBVFMoIkRP
TS5YTUxIdHRwUmVxdWVzdC5yZW1vdmVFdmVudExpc3RlbmVyKCkiKTsKLSAgICBYTUxIdHRwUmVx
dWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVx
dWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgYXJncy5Ib2xkZXIoKSk7CisgICAg
WE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6Y29udmVydFRvTmF0aXZl
T2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNULCBhcmdz
LkhvbGRlcigpKTsKIAogICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IGdldEV2
ZW50TGlzdGVuZXIoeG1sSHR0cFJlcXVlc3QsIGFyZ3NbMV0sIHRydWUpOwogICAgIGlmIChsaXN0
ZW5lcikgewpAQCAtMzE3LDcgKzMxNyw3IEBAIENBTExCQUNLX0ZVTkNfREVDTChYTUxIdHRwUmVx
dWVzdE9wZW4pCiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAyKQogICAgICAgICByZXR1cm4gdGhy
b3dFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiLCBWOFByb3h5OjpTWU5UQVhfRVJST1IpOwog
Ci0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGFyZ3Mu
SG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6
OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxI
VFRQUkVRVUVTVCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBTdHJpbmcgbWV0aG9kID0gdG9XZWJD
b3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgIFN0cmluZyB1cmxzdHJpbmcgPSB0b1dlYkNvcmVTdHJp
bmcoYXJnc1sxXSk7CkBAIC0zNzAsNyArMzcwLDcgQEAgc3RhdGljIGJvb2wgSXNEb2N1bWVudFR5
cGUodjg6OkhhbmRsZTx2OAogQ0FMTEJBQ0tfRlVOQ19ERUNMKFhNTEh0dHBSZXF1ZXN0U2VuZCkK
IHsKICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRwUmVxdWVzdC5zZW5kKCkiKTsKLSAgICBYTUxI
dHRwUmVxdWVzdCogeG1sSHR0cFJlcXVlc3QgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxI
dHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgYXJncy5Ib2xkZXIoKSk7
CisgICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6Y29udmVydFRv
TmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNU
LCBhcmdzLkhvbGRlcigpKTsKIAogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgIGlmIChh
cmdzLkxlbmd0aCgpIDwgMSkKQEAgLTM4MCw3ICszODAsNyBAQCBDQUxMQkFDS19GVU5DX0RFQ0wo
WE1MSHR0cFJlcXVlc3RTZW5kKQogICAgICAgICAvLyBGSVhNRTogdXBzdHJlYW0gaGFuZGxlcyAi
RmlsZSIgb2JqZWN0cyB0b28uCiAgICAgICAgIGlmIChJc0RvY3VtZW50VHlwZShhcmcpKSB7CiAg
ICAgICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCA9IHY4OjpIYW5kbGU8djg6
Ok9iamVjdD46OkNhc3QoYXJnKTsKLSAgICAgICAgICAgIERvY3VtZW50KiBkb2N1bWVudCA9IFY4
UHJveHk6OkRPTVdyYXBwZXJUb05vZGU8RG9jdW1lbnQ+KG9iamVjdCk7CisgICAgICAgICAgICBE
b2N1bWVudCogZG9jdW1lbnQgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRvTm9kZTxEb2N1
bWVudD4ob2JqZWN0KTsKICAgICAgICAgICAgIEFTU0VSVChkb2N1bWVudCk7CiAgICAgICAgICAg
ICB4bWxIdHRwUmVxdWVzdC0+c2VuZChkb2N1bWVudCwgZWMpOwogICAgICAgICB9IGVsc2UKQEAg
LTM5OCw3ICszOTgsNyBAQCBDQUxMQkFDS19GVU5DX0RFQ0woWE1MSHR0cFJlcXVlc3RTZXRSZXF1
CiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAyKQogICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigi
Tm90IGVub3VnaCBhcmd1bWVudHMiLCBWOFByb3h5OjpTWU5UQVhfRVJST1IpOwogCi0gICAgWE1M
SHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1M
SHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGFyZ3MuSG9sZGVyKCkp
OworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9IFY4UHJveHk6OmNvbnZlcnRU
b05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVT
VCwgYXJncy5Ib2xkZXIoKSk7CiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAgU3RyaW5n
IGhlYWRlciA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKICAgICBTdHJpbmcgdmFsdWUgPSB0
b1dlYkNvcmVTdHJpbmcoYXJnc1sxXSk7CkBAIC00MTQsNyArNDE0LDcgQEAgQ0FMTEJBQ0tfRlVO
Q19ERUNMKFhNTEh0dHBSZXF1ZXN0R2V0UmVzcAogICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMSkK
ICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoIk5vdCBlbm91Z2ggYXJndW1lbnRzIiwgVjhQcm94
eTo6U1lOVEFYX0VSUk9SKTsKIAotICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVzdCA9
IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0PihWOENsYXNzSW5kZXg6OlhN
TEhUVFBSRVFVRVNULCBhcmdzLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0
cFJlcXVlc3QgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+
KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1QsIGFyZ3MuSG9sZGVyKCkpOwogICAgIEV4Y2Vw
dGlvbkNvZGUgZWMgPSAwOwogICAgIFN0cmluZyBoZWFkZXIgPSB0b1dlYkNvcmVTdHJpbmcoYXJn
c1swXSk7CiAgICAgU3RyaW5nIHJlc3VsdCA9IHhtbEh0dHBSZXF1ZXN0LT5nZXRSZXNwb25zZUhl
YWRlcihoZWFkZXIsIGVjKTsKQEAgLTQyOSw3ICs0MjksNyBAQCBDQUxMQkFDS19GVU5DX0RFQ0wo
WE1MSHR0cFJlcXVlc3RPdmVycmlkCiAgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAxKQogICAgICAg
ICByZXR1cm4gdGhyb3dFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiLCBWOFByb3h5OjpTWU5U
QVhfRVJST1IpOwogCi0gICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1ZXN0ID0gVjhQcm94
eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3Q+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJF
UVVFU1QsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0KiB4bWxIdHRwUmVxdWVz
dCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdD4oVjhDbGFz
c0luZGV4OjpYTUxIVFRQUkVRVUVTVCwgYXJncy5Ib2xkZXIoKSk7CiAgICAgU3RyaW5nIHZhbHVl
ID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgIHhtbEh0dHBSZXF1ZXN0LT5vdmVycmlk
ZU1pbWVUeXBlKHZhbHVlKTsKICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwpJbmRleDogV2Vi
Q29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVzdFVwbG9hZEN1c3RvbS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVz
dFVwbG9hZEN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhYTUxIdHRwUmVxdWVzdFVwbG9hZEN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTQ2LDcgKzQ2LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogQUNDRVNTT1JfR0VUVEVSKFhN
TEh0dHBSZXF1ZXN0VXBsb2FkT25hYm9ydCkKIHsKICAgICBJTkNfU1RBVFMoIkRPTS5YTUxIdHRw
UmVxdWVzdFVwbG9hZC5vbmFib3J0Ll9nZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCog
eG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVx
dWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xk
ZXIoKSk7CisgICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0g
VjhQcm94eTo6Y29udmVydFRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENs
YXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKICAgICBpZiAo
eG1sSHR0cFJlcXVlc3RVcGxvYWQtPm9uYWJvcnQoKSkgewogICAgICAgICBWOE9iamVjdEV2ZW50
TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3RlbmVyKj4o
eG1sSHR0cFJlcXVlc3RVcGxvYWQtPm9uYWJvcnQoKSk7CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6
T2JqZWN0PiB2OExpc3RlbmVyID0gbGlzdGVuZXItPmdldExpc3RlbmVyT2JqZWN0KCk7CkBAIC01
OCw3ICs1OCw3IEBAIEFDQ0VTU09SX0dFVFRFUihYTUxIdHRwUmVxdWVzdFVwbG9hZE9uYWIKIEFD
Q0VTU09SX1NFVFRFUihYTUxIdHRwUmVxdWVzdFVwbG9hZE9uYWJvcnQpCiB7CiAgICAgSU5DX1NU
QVRTKCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25hYm9ydC5fc2V0Iik7Ci0gICAgWE1MSHR0
cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RV
UExPQUQsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRw
UmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVx
dWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xk
ZXIoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAoeG1sSHR0cFJl
cXVlc3RVcGxvYWQtPm9uYWJvcnQoKSkgewogICAgICAgICAgICAgVjhPYmplY3RFdmVudExpc3Rl
bmVyKiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0
dHBSZXF1ZXN0VXBsb2FkLT5vbmFib3J0KCkpOwpAQCAtNzQsNyArNzQsNyBAQCBBQ0NFU1NPUl9T
RVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmFiCiAgICAgICAgIGlmICghcHJveHkpCiAgICAg
ICAgICAgICByZXR1cm47CiAKLSAgICAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVy
ID0gcHJveHktPkZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKTsK
KyAgICAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPmZpbmRPckNy
ZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKTsKICAgICAgICAgaWYgKGxpc3Rl
bmVyKSB7CiAgICAgICAgICAgICB4bWxIdHRwUmVxdWVzdFVwbG9hZC0+c2V0T25hYm9ydChsaXN0
ZW5lcik7CiAgICAgICAgICAgICBjcmVhdGVIaWRkZW5EZXBlbmRlbmN5KGluZm8uSG9sZGVyKCks
IHZhbHVlLCBWOEN1c3RvbTo6a1hNTEh0dHBSZXF1ZXN0Q2FjaGVJbmRleCk7CkBAIC04NSw3ICs4
NSw3IEBAIEFDQ0VTU09SX1NFVFRFUihYTUxIdHRwUmVxdWVzdFVwbG9hZE9uYWIKIEFDQ0VTU09S
X0dFVFRFUihYTUxIdHRwUmVxdWVzdFVwbG9hZE9uZXJyb3IpCiB7CiAgICAgSU5DX1NUQVRTKCJE
T00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25lcnJvci5fZ2V0Iik7Ci0gICAgWE1MSHR0cFJlcXVl
c3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8
WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQs
IGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVz
dFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVw
bG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7
CiAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5vbmVycm9yKCkpIHsKICAgICAgICAgVjhP
YmplY3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRM
aXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5vbmVycm9yKCkpOwogICAgICAgICB2ODo6
TG9jYWw8djg6Ok9iamVjdD4gdjhMaXN0ZW5lciA9IGxpc3RlbmVyLT5nZXRMaXN0ZW5lck9iamVj
dCgpOwpAQCAtOTcsNyArOTcsNyBAQCBBQ0NFU1NPUl9HRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxv
YWRPbmVyCiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmVycm9yKQogewog
ICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0VXBsb2FkLm9uZXJyb3IuX3NldCIpOwot
ICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6
OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhU
VFBSRVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdFVwbG9h
ZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8
WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQs
IGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsKICAgICAgICAgaWYg
KHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5vbmVycm9yKCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0
RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVu
ZXIqPih4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25lcnJvcigpKTsKQEAgLTExMyw3ICsxMTMsNyBA
QCBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmVyCiAgICAgICAgIGlmICgh
cHJveHkpCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgUmVmUHRyPEV2ZW50TGlzdGVu
ZXI+IGxpc3RlbmVyID0gcHJveHktPkZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFs
dWUsIGZhbHNlKTsKKyAgICAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJv
eHktPmZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKTsKICAgICAg
ICAgaWYgKGxpc3RlbmVyKSB7CiAgICAgICAgICAgICB4bWxIdHRwUmVxdWVzdFVwbG9hZC0+c2V0
T25lcnJvcihsaXN0ZW5lcik7CiAgICAgICAgICAgICBjcmVhdGVIaWRkZW5EZXBlbmRlbmN5KGlu
Zm8uSG9sZGVyKCksIHZhbHVlLCBWOEN1c3RvbTo6a1hNTEh0dHBSZXF1ZXN0Q2FjaGVJbmRleCk7
CkBAIC0xMjQsNyArMTI0LDcgQEAgQUNDRVNTT1JfU0VUVEVSKFhNTEh0dHBSZXF1ZXN0VXBsb2Fk
T25lcgogQUNDRVNTT1JfR0VUVEVSKFhNTEh0dHBSZXF1ZXN0VXBsb2FkT25sb2FkKQogewogICAg
IElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0VXBsb2FkLm9ubG9hZC5fZ2V0Iik7Ci0gICAg
WE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJF
UVVFU1RVUExPQUQsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4
bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxI
dHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5m
by5Ib2xkZXIoKSk7CiAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0VXBsb2FkLT5vbmxvYWQoKSkgewog
ICAgICAgICBWOE9iamVjdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhP
YmplY3RFdmVudExpc3RlbmVyKj4oeG1sSHR0cFJlcXVlc3RVcGxvYWQtPm9ubG9hZCgpKTsKICAg
ICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4TGlzdGVuZXIgPSBsaXN0ZW5lci0+Z2V0TGlz
dGVuZXJPYmplY3QoKTsKQEAgLTEzNiw3ICsxMzYsNyBAQCBBQ0NFU1NPUl9HRVRURVIoWE1MSHR0
cFJlcXVlc3RVcGxvYWRPbmxvCiBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRP
bmxvYWQpCiB7CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQub25sb2Fk
Ll9zZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0lu
ZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7CisgICAgWE1MSHR0cFJl
cXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6Y29udmVydFRvTmF0
aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFV
RVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKICAgICBpZiAodmFsdWUtPklzTnVsbCgpKSB7CiAg
ICAgICAgIGlmICh4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25sb2FkKCkpIHsKICAgICAgICAgICAg
IFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2
ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25sb2FkKCkpOwpAQCAtMTUyLDcg
KzE1Miw3IEBAIEFDQ0VTU09SX1NFVFRFUihYTUxIdHRwUmVxdWVzdFVwbG9hZE9ubG8KICAgICAg
ICAgaWYgKCFwcm94eSkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBSZWZQdHI8RXZl
bnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+RmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0
ZW5lcih2YWx1ZSwgZmFsc2UpOworICAgICAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVu
ZXIgPSBwcm94eS0+ZmluZE9yQ3JlYXRlT2JqZWN0RXZlbnRMaXN0ZW5lcih2YWx1ZSwgZmFsc2Up
OwogICAgICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgICAgIHhtbEh0dHBSZXF1ZXN0VXBs
b2FkLT5zZXRPbmxvYWQobGlzdGVuZXIpOwogICAgICAgICAgICAgY3JlYXRlSGlkZGVuRGVwZW5k
ZW5jeShpbmZvLkhvbGRlcigpLCB2YWx1ZSwgVjhDdXN0b206OmtYTUxIdHRwUmVxdWVzdENhY2hl
SW5kZXgpOwpAQCAtMTYzLDcgKzE2Myw3IEBAIEFDQ0VTU09SX1NFVFRFUihYTUxIdHRwUmVxdWVz
dFVwbG9hZE9ubG8KIEFDQ0VTU09SX0dFVFRFUihYTUxIdHRwUmVxdWVzdFVwbG9hZE9ubG9hZHN0
YXJ0KQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0VXBsb2FkLm9ubG9hZHN0
YXJ0Ll9nZXQiKTsKLSAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxv
YWQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFz
c0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xkZXIoKSk7CisgICAgWE1MSHR0
cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6Y29udmVydFRv
TmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBS
RVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKICAgICBpZiAoeG1sSHR0cFJlcXVlc3RVcGxv
YWQtPm9ubG9hZHN0YXJ0KCkpIHsKICAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKiBsaXN0
ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHhtbEh0dHBSZXF1ZXN0
VXBsb2FkLT5vbmxvYWRzdGFydCgpKTsKICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4
TGlzdGVuZXIgPSBsaXN0ZW5lci0+Z2V0TGlzdGVuZXJPYmplY3QoKTsKQEAgLTE3NSw3ICsxNzUs
NyBAQCBBQ0NFU1NPUl9HRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmxvCiBBQ0NFU1NPUl9T
RVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbmxvYWRzdGFydCkKIHsKICAgICBJTkNfU1RBVFMo
IkRPTS5YTUxIdHRwUmVxdWVzdFVwbG9hZC5vbmxvYWRzdGFydC5fc2V0Iik7Ci0gICAgWE1MSHR0
cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RV
UExPQUQsIGluZm8uSG9sZGVyKCkpOworICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRw
UmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYTUxIdHRwUmVx
dWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVRVUVTVFVQTE9BRCwgaW5mby5Ib2xk
ZXIoKSk7CiAgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgewogICAgICAgICBpZiAoeG1sSHR0cFJl
cXVlc3RVcGxvYWQtPm9ubG9hZHN0YXJ0KCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRM
aXN0ZW5lciogbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4
bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25sb2Fkc3RhcnQoKSk7CkBAIC0xOTEsNyArMTkxLDcgQEAg
QUNDRVNTT1JfU0VUVEVSKFhNTEh0dHBSZXF1ZXN0VXBsb2FkT25sbwogICAgICAgICBpZiAoIXBy
b3h5KQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVy
PiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVl
LCBmYWxzZSk7CisgICAgICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHByb3h5
LT5maW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKHZhbHVlLCBmYWxzZSk7CiAgICAgICAg
IGlmIChsaXN0ZW5lcikgewogICAgICAgICAgICAgeG1sSHR0cFJlcXVlc3RVcGxvYWQtPnNldE9u
bG9hZHN0YXJ0KGxpc3RlbmVyKTsKICAgICAgICAgICAgIGNyZWF0ZUhpZGRlbkRlcGVuZGVuY3ko
aW5mby5Ib2xkZXIoKSwgdmFsdWUsIFY4Q3VzdG9tOjprWE1MSHR0cFJlcXVlc3RDYWNoZUluZGV4
KTsKQEAgLTIwMiw3ICsyMDIsNyBAQCBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxv
YWRPbmxvCiBBQ0NFU1NPUl9HRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbnByb2dyZXNzKQog
ewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0VXBsb2FkLm9ucHJvZ3Jlc3MuX2dl
dCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6
OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBpbmZvLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVz
dFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVP
YmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RV
UExPQUQsIGluZm8uSG9sZGVyKCkpOwogICAgIGlmICh4bWxIdHRwUmVxdWVzdFVwbG9hZC0+b25w
cm9ncmVzcygpKSB7CiAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBz
dGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVzdFVwbG9hZC0+
b25wcm9ncmVzcygpKTsKICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4TGlzdGVuZXIg
PSBsaXN0ZW5lci0+Z2V0TGlzdGVuZXJPYmplY3QoKTsKQEAgLTIxNCw3ICsyMTQsNyBAQCBBQ0NF
U1NPUl9HRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbnByCiBBQ0NFU1NPUl9TRVRURVIoWE1M
SHR0cFJlcXVlc3RVcGxvYWRPbnByb2dyZXNzKQogewogICAgIElOQ19TVEFUUygiRE9NLlhNTEh0
dHBSZXF1ZXN0VXBsb2FkLm9ucHJvZ3Jlc3MuX3NldCIpOwotICAgIFhNTEh0dHBSZXF1ZXN0VXBs
b2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0
dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBpbmZv
LkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxv
YWQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+
KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGluZm8uSG9sZGVyKCkpOwogICAg
IGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsKICAgICAgICAgaWYgKHhtbEh0dHBSZXF1ZXN0VXBsb2Fk
LT5vbnByb2dyZXNzKCkpIHsKICAgICAgICAgICAgIFY4T2JqZWN0RXZlbnRMaXN0ZW5lciogbGlz
dGVuZXIgPSBzdGF0aWNfY2FzdDxWOE9iamVjdEV2ZW50TGlzdGVuZXIqPih4bWxIdHRwUmVxdWVz
dFVwbG9hZC0+b25wcm9ncmVzcygpKTsKQEAgLTIzMCw3ICsyMzAsNyBAQCBBQ0NFU1NPUl9TRVRU
RVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbnByCiAgICAgICAgIGlmICghcHJveHkpCiAgICAgICAg
ICAgICByZXR1cm47CiAKLSAgICAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0g
cHJveHktPkZpbmRPckNyZWF0ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKTsKKyAg
ICAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gcHJveHktPmZpbmRPckNyZWF0
ZU9iamVjdEV2ZW50TGlzdGVuZXIodmFsdWUsIGZhbHNlKTsKICAgICAgICAgaWYgKGxpc3RlbmVy
KSB7CiAgICAgICAgICAgICB4bWxIdHRwUmVxdWVzdFVwbG9hZC0+c2V0T25wcm9ncmVzcyhsaXN0
ZW5lcik7CiAgICAgICAgICAgICBjcmVhdGVIaWRkZW5EZXBlbmRlbmN5KGluZm8uSG9sZGVyKCks
IHZhbHVlLCBWOEN1c3RvbTo6a1hNTEh0dHBSZXF1ZXN0Q2FjaGVJbmRleCk7CkBAIC0yNDEsMTQg
KzI0MSwxNCBAQCBBQ0NFU1NPUl9TRVRURVIoWE1MSHR0cFJlcXVlc3RVcGxvYWRPbnByCiBDQUxM
QkFDS19GVU5DX0RFQ0woWE1MSHR0cFJlcXVlc3RVcGxvYWRBZGRFdmVudExpc3RlbmVyKQogewog
ICAgIElOQ19TVEFUUygiRE9NLlhNTEh0dHBSZXF1ZXN0VXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIo
KSIpOwotICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4
UHJveHk6OlRvTmF0aXZlT2JqZWN0PFhNTEh0dHBSZXF1ZXN0VXBsb2FkPihWOENsYXNzSW5kZXg6
OlhNTEhUVFBSRVFVRVNUVVBMT0FELCBhcmdzLkhvbGRlcigpKTsKKyAgICBYTUxIdHRwUmVxdWVz
dFVwbG9hZCogeG1sSHR0cFJlcXVlc3RVcGxvYWQgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVP
YmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJbmRleDo6WE1MSFRUUFJFUVVFU1RV
UExPQUQsIGFyZ3MuSG9sZGVyKCkpOwogCiAgICAgWE1MSHR0cFJlcXVlc3QqIHhtbEh0dHBSZXF1
ZXN0ID0geG1sSHR0cFJlcXVlc3RVcGxvYWQtPmFzc29jaWF0ZWRYTUxIdHRwUmVxdWVzdCgpOwog
ICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUoeG1sSHR0cFJlcXVlc3QtPnNj
cmlwdEV4ZWN1dGlvbkNvbnRleHQoKSk7CiAgICAgaWYgKCFwcm94eSkKICAgICAgICAgcmV0dXJu
IHY4OjpVbmRlZmluZWQoKTsKIAotICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9
IHByb3h5LT5GaW5kT3JDcmVhdGVPYmplY3RFdmVudExpc3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsK
KyAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+ZmluZE9yQ3JlYXRl
T2JqZWN0RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAgICAgaWYgKGxpc3RlbmVyKSB7
CiAgICAgICAgIFN0cmluZyB0eXBlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOwogICAgICAg
ICBib29sIHVzZUNhcHR1cmUgPSBhcmdzWzJdLT5Cb29sZWFuVmFsdWUoKTsKQEAgLTI2MiwxNCAr
MjYyLDE0IEBAIENBTExCQUNLX0ZVTkNfREVDTChYTUxIdHRwUmVxdWVzdFVwbG9hZEEKIENBTExC
QUNLX0ZVTkNfREVDTChYTUxIdHRwUmVxdWVzdFVwbG9hZFJlbW92ZUV2ZW50TGlzdGVuZXIpCiB7
CiAgICAgSU5DX1NUQVRTKCJET00uWE1MSHR0cFJlcXVlc3RVcGxvYWQucmVtb3ZlRXZlbnRMaXN0
ZW5lcigpIik7Ci0gICAgWE1MSHR0cFJlcXVlc3RVcGxvYWQqIHhtbEh0dHBSZXF1ZXN0VXBsb2Fk
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WE1MSHR0cFJlcXVlc3RVcGxvYWQ+KFY4Q2xhc3NJ
bmRleDo6WE1MSFRUUFJFUVVFU1RVUExPQUQsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhNTEh0dHBS
ZXF1ZXN0VXBsb2FkKiB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9IFY4UHJveHk6OmNvbnZlcnRUb05h
dGl2ZU9iamVjdDxYTUxIdHRwUmVxdWVzdFVwbG9hZD4oVjhDbGFzc0luZGV4OjpYTUxIVFRQUkVR
VUVTVFVQTE9BRCwgYXJncy5Ib2xkZXIoKSk7CiAKICAgICBYTUxIdHRwUmVxdWVzdCogeG1sSHR0
cFJlcXVlc3QgPSB4bWxIdHRwUmVxdWVzdFVwbG9hZC0+YXNzb2NpYXRlZFhNTEh0dHBSZXF1ZXN0
KCk7CiAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZSh4bWxIdHRwUmVxdWVz
dC0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpKTsKICAgICBpZiAoIXByb3h5KQogICAgICAgICBy
ZXR1cm4gdjg6OlVuZGVmaW5lZCgpOyAvLyBQcm9iYWJseSBsZWFrZWQuCiAKLSAgICBSZWZQdHI8
RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBwcm94eS0+RmluZE9iamVjdEV2ZW50TGlzdGVuZXIo
YXJnc1sxXSwgZmFsc2UpOworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHBy
b3h5LT5maW5kT2JqZWN0RXZlbnRMaXN0ZW5lcihhcmdzWzFdLCBmYWxzZSk7CiAKICAgICBpZiAo
bGlzdGVuZXIpIHsKICAgICAgICAgU3RyaW5nIHR5cGUgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1sw
XSk7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFhNTFNlcmlhbGl6ZXJDb25z
dHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhY
TUxTZXJpYWxpemVyQ29uc3RydWN0b3IuY3BwCShyZXZpc2lvbiA0NTIxNikKKysrIFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MU2VyaWFsaXplckNvbnN0cnVjdG9yLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMzksNyArMzksNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBDQUxMQkFDS19G
VU5DX0RFQ0woWE1MU2VyaWFsaXplckNvbnN0cnVjdG9yKQogewogICAgIElOQ19TVEFUUygiRE9N
LlhNTFNlcmlhbGl6ZXIuQ29uc3RydWN0b3IiKTsKLSAgICByZXR1cm4gVjhQcm94eTo6Q29uc3Ry
dWN0RE9NT2JqZWN0PFY4Q2xhc3NJbmRleDo6WE1MU0VSSUFMSVpFUiwgWE1MU2VyaWFsaXplcj4o
YXJncyk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnN0cnVjdERPTU9iamVjdDxWOENsYXNzSW5k
ZXg6OlhNTFNFUklBTElaRVIsIFhNTFNlcmlhbGl6ZXI+KGFyZ3MpOwogfQogCiB9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFhQYXRoRXZh
bHVhdG9yQ29uc3RydWN0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mvdjgv
Y3VzdG9tL1Y4WFBhdGhFdmFsdWF0b3JDb25zdHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDQ1MjE2KQor
KysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYUGF0aEV2YWx1YXRvckNvbnN0cnVjdG9y
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzksNyArMzksNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7
CiBDQUxMQkFDS19GVU5DX0RFQ0woWFBhdGhFdmFsdWF0b3JDb25zdHJ1Y3RvcikKIHsKICAgICBJ
TkNfU1RBVFMoIkRPTS5YUGF0aEV2YWx1YXRvci5Db25zdHJ1Y3RvciIpOwotICAgIHJldHVybiBW
OFByb3h5OjpDb25zdHJ1Y3RET01PYmplY3Q8VjhDbGFzc0luZGV4OjpYUEFUSEVWQUxVQVRPUiwg
WFBhdGhFdmFsdWF0b3I+KGFyZ3MpOworICAgIHJldHVybiBWOFByb3h5Ojpjb25zdHJ1Y3RET01P
YmplY3Q8VjhDbGFzc0luZGV4OjpYUEFUSEVWQUxVQVRPUiwgWFBhdGhFdmFsdWF0b3I+KGFyZ3Mp
OwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOFhTTFRQcm9jZXNzb3JDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
YmluZGluZ3MvdjgvY3VzdG9tL1Y4WFNMVFByb2Nlc3NvckN1c3RvbS5jcHAJKHJldmlzaW9uIDQ1
MjE2KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhYU0xUUHJvY2Vzc29yQ3VzdG9t
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDgsNyArNDgsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7
CiBDQUxMQkFDS19GVU5DX0RFQ0woWFNMVFByb2Nlc3NvckNvbnN0cnVjdG9yKQogewogICAgIElO
Q19TVEFUUygiRE9NLlhTTFRQcm9jZXNzb3IuQ29uc3RydWN0b3IiKTsKLSAgICByZXR1cm4gVjhQ
cm94eTo6Q29uc3RydWN0RE9NT2JqZWN0PFY4Q2xhc3NJbmRleDo6WFNMVFBST0NFU1NPUiwgWFNM
VFByb2Nlc3Nvcj4oYXJncyk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNvbnN0cnVjdERPTU9iamVj
dDxWOENsYXNzSW5kZXg6OlhTTFRQUk9DRVNTT1IsIFhTTFRQcm9jZXNzb3I+KGFyZ3MpOwogfQog
CiAKQEAgLTU4LDkgKzU4LDkgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKFhTTFRQcm9jZXNzb3JJbXBv
cnRTdAogICAgIGlmICghVjhOb2RlOjpIYXNJbnN0YW5jZShhcmdzWzBdKSkKICAgICAgICAgcmV0
dXJuIHY4OjpVbmRlZmluZWQoKTsKIAotICAgIFhTTFRQcm9jZXNzb3IqIGltcCA9IFY4UHJveHk6
OlRvTmF0aXZlT2JqZWN0PFhTTFRQcm9jZXNzb3I+KFY4Q2xhc3NJbmRleDo6WFNMVFBST0NFU1NP
UiwgYXJncy5Ib2xkZXIoKSk7CisgICAgWFNMVFByb2Nlc3NvciogaW1wID0gVjhQcm94eTo6Y29u
dmVydFRvTmF0aXZlT2JqZWN0PFhTTFRQcm9jZXNzb3I+KFY4Q2xhc3NJbmRleDo6WFNMVFBST0NF
U1NPUiwgYXJncy5Ib2xkZXIoKSk7CiAKLSAgICBOb2RlKiBub2RlID0gVjhQcm94eTo6RE9NV3Jh
cHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKTsKKyAgICBOb2RlKiBub2RlID0gVjhQcm94eTo6Y29u
dmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJnc1swXSk7CiAgICAgaW1wLT5pbXBvcnRTdHls
ZXNoZWV0KG5vZGUpOwogICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiB9CkBAIC03MiwxMiAr
NzIsMTIgQEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKFhTTFRQcm9jZXNzb3JUcmFuc2ZvcgogICAgIGlm
ICghVjhOb2RlOjpIYXNJbnN0YW5jZShhcmdzWzBdKSB8fCAhVjhEb2N1bWVudDo6SGFzSW5zdGFu
Y2UoYXJnc1sxXSkpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKLSAgICBYU0xU
UHJvY2Vzc29yKiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxYU0xUUHJvY2Vzc29yPihW
OENsYXNzSW5kZXg6OlhTTFRQUk9DRVNTT1IsIGFyZ3MuSG9sZGVyKCkpOworICAgIFhTTFRQcm9j
ZXNzb3IqIGltcCA9IFY4UHJveHk6OmNvbnZlcnRUb05hdGl2ZU9iamVjdDxYU0xUUHJvY2Vzc29y
PihWOENsYXNzSW5kZXg6OlhTTFRQUk9DRVNTT1IsIGFyZ3MuSG9sZGVyKCkpOwogCi0gICAgTm9k
ZSogc291cmNlID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxOb2RlPihhcmdzWzBdKTsKLSAg
ICBEb2N1bWVudCogb3duZXIgPSBWOFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPERvY3VtZW50Pihh
cmdzWzFdKTsKKyAgICBOb2RlKiBzb3VyY2UgPSBWOFByb3h5Ojpjb252ZXJ0RE9NV3JhcHBlclRv
Tm9kZTxOb2RlPihhcmdzWzBdKTsKKyAgICBEb2N1bWVudCogb3duZXIgPSBWOFByb3h5Ojpjb252
ZXJ0RE9NV3JhcHBlclRvTm9kZTxEb2N1bWVudD4oYXJnc1sxXSk7CiAgICAgUmVmUHRyPERvY3Vt
ZW50RnJhZ21lbnQ+IHJlc3VsdCA9IGltcC0+dHJhbnNmb3JtVG9GcmFnbWVudChzb3VyY2UsIG93
bmVyKTsKLSAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QocmVzdWx0LmdldCgpKTsK
KyAgICByZXR1cm4gVjhQcm94eTo6Y29udmVydE5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7
CiB9CiAKIApAQCAtODgsOSArODgsOSBAQCBDQUxMQkFDS19GVU5DX0RFQ0woWFNMVFByb2Nlc3Nv
clRyYW5zZm9yCiAgICAgaWYgKCFWOE5vZGU6Okhhc0luc3RhbmNlKGFyZ3NbMF0pKQogICAgICAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgWFNMVFByb2Nlc3NvciogaW1wID0gVjhQ
cm94eTo6VG9OYXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhDbGFzc0luZGV4OjpYU0xUUFJP
Q0VTU09SLCBhcmdzLkhvbGRlcigpKTsKKyAgICBYU0xUUHJvY2Vzc29yKiBpbXAgPSBWOFByb3h5
Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhDbGFzc0luZGV4OjpYU0xU
UFJPQ0VTU09SLCBhcmdzLkhvbGRlcigpKTsKIAotICAgIE5vZGUqIHNvdXJjZSA9IFY4UHJveHk6
OkRPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJnc1swXSk7CisgICAgTm9kZSogc291cmNlID0gVjhQ
cm94eTo6Y29udmVydERPTVdyYXBwZXJUb05vZGU8Tm9kZT4oYXJnc1swXSk7CiAgICAgaWYgKCFz
b3VyY2UpCiAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CiAKQEAgLTk4LDcgKzk4LDcg
QEAgQ0FMTEJBQ0tfRlVOQ19ERUNMKFhTTFRQcm9jZXNzb3JUcmFuc2ZvcgogICAgIGlmICghcmVz
dWx0KQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgcmV0dXJuIFY4UHJv
eHk6Ok5vZGVUb1Y4T2JqZWN0KHJlc3VsdC5nZXQoKSk7CisgICAgcmV0dXJuIFY4UHJveHk6OmNv
bnZlcnROb2RlVG9WOE9iamVjdChyZXN1bHQuZ2V0KCkpOwogfQogCiAKQEAgLTEwOCw3ICsxMDgs
NyBAQCBDQUxMQkFDS19GVU5DX0RFQ0woWFNMVFByb2Nlc3NvclNldFBhcmFtCiAgICAgaWYgKGlz
VW5kZWZpbmVkT3JOdWxsKGFyZ3NbMV0pIHx8IGlzVW5kZWZpbmVkT3JOdWxsKGFyZ3NbMl0pKQog
ICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgWFNMVFByb2Nlc3NvciogaW1w
ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhDbGFzc0luZGV4OjpY
U0xUUFJPQ0VTU09SLCBhcmdzLkhvbGRlcigpKTsKKyAgICBYU0xUUHJvY2Vzc29yKiBpbXAgPSBW
OFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhDbGFzc0luZGV4
OjpYU0xUUFJPQ0VTU09SLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFN0cmluZyBuYW1lc3BhY2VV
UkkgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHRv
V2ViQ29yZVN0cmluZyhhcmdzWzFdKTsKQEAgLTEyNSw3ICsxMjUsNyBAQCBDQUxMQkFDS19GVU5D
X0RFQ0woWFNMVFByb2Nlc3NvckdldFBhcmFtCiAgICAgaWYgKGlzVW5kZWZpbmVkT3JOdWxsKGFy
Z3NbMV0pKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAgWFNMVFByb2Nl
c3NvciogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhDbGFz
c0luZGV4OjpYU0xUUFJPQ0VTU09SLCBhcmdzLkhvbGRlcigpKTsKKyAgICBYU0xUUHJvY2Vzc29y
KiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nvcj4oVjhD
bGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SLCBhcmdzLkhvbGRlcigpKTsKIAogICAgIFN0cmluZyBu
YW1lc3BhY2VVUkkgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgU3RyaW5nIGxvY2Fs
TmFtZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzFdKTsKQEAgLTE0Miw3ICsxNDIsNyBAQCBDQUxM
QkFDS19GVU5DX0RFQ0woWFNMVFByb2Nlc3NvclJlbW92ZVBhCiAgICAgaWYgKGlzVW5kZWZpbmVk
T3JOdWxsKGFyZ3NbMV0pKQogICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwogCi0gICAg
WFNMVFByb2Nlc3NvciogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8WFNMVFByb2Nlc3Nv
cj4oVjhDbGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SLCBhcmdzLkhvbGRlcigpKTsKKyAgICBYU0xU
UHJvY2Vzc29yKiBpbXAgPSBWOFByb3h5Ojpjb252ZXJ0VG9OYXRpdmVPYmplY3Q8WFNMVFByb2Nl
c3Nvcj4oVjhDbGFzc0luZGV4OjpYU0xUUFJPQ0VTU09SLCBhcmdzLkhvbGRlcigpKTsKIAogICAg
IFN0cmluZyBuYW1lc3BhY2VVUkkgPSB0b1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CiAgICAgU3Ry
aW5nIGxvY2FsTmFtZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzFdKTsK
</data>
<flag name="review"
          id="16451"
          type_id="1"
          status="+"
          setter="levin"
    />
          </attachment>
      

    </bug>

</bugzilla>