<?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>116258</bug_id>
          
          <creation_ts>2013-05-16 20:06:33 -0700</creation_ts>
          <short_desc>[WIN] Move Windows port off legacy clipboard</short_desc>
          <delta_ts>2013-05-27 12:51:36 -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>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Windows 7</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>115980</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="huangxueqing">huangxueqing</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>bfulgham</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>roger_fong</cc>
    
    <cc>thorton</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>890108</commentid>
    <comment_count>0</comment_count>
    <who name="huangxueqing">huangxueqing</who>
    <bug_when>2013-05-16 20:06:33 -0700</bug_when>
    <thetext>See master bug #115980</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>892095</commentid>
    <comment_count>1</comment_count>
      <attachid>202490</attachid>
    <who name="huangxueqing">huangxueqing</who>
    <bug_when>2013-05-21 19:36:22 -0700</bug_when>
    <thetext>Created attachment 202490
patch

Sorry for huge patch, It&apos;s difficult to split since splited patch will make some tests failed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>892096</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-05-21 19:38:28 -0700</bug_when>
    <thetext>Attachment 202490 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/dom/Clipboard.h&apos;, u&apos;Source/WebCore/page/win/EventHandlerWin.cpp&apos;, u&apos;Source/WebCore/platform/Pasteboard.h&apos;, u&apos;Source/WebCore/platform/win/ClipboardWin.cpp&apos;, u&apos;Source/WebCore/platform/win/ClipboardWin.h&apos;, u&apos;Source/WebCore/platform/win/EditorWin.cpp&apos;, u&apos;Source/WebCore/platform/win/PasteboardWin.cpp&apos;, u&apos;Source/WebKit/win/ChangeLog&apos;, u&apos;Source/WebKit/win/WebCoreSupport/WebDragClient.cpp&apos;]&quot; exit_code: 1
Source/WebCore/platform/win/PasteboardWin.cpp:114:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/platform/win/PasteboardWin.cpp:115:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/platform/win/PasteboardWin.cpp:298:  An else if statement should be written as an if statement when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
Source/WebCore/platform/win/PasteboardWin.cpp:569:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/platform/win/EditorWin.cpp:60:  Local variables should never be PassRefPtr (see http://webkit.org/coding/RefPtr.html).  [readability/pass_ptr] [5]
Source/WebCore/platform/Pasteboard.h:110:  The parameter name &quot;dataObject&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/Pasteboard.h:111:  The parameter name &quot;dataObject&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/Pasteboard.h:112:  The parameter name &quot;dataMap&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/Pasteboard.h:169:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/platform/Pasteboard.h:170:  The parameter name &quot;dataObject&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/Pasteboard.h:170:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/platform/Pasteboard.h:171:  The parameter name &quot;element&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/Pasteboard.h:171:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/Pasteboard.h:171:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/Pasteboard.h:171:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Total errors found: 15 in 9 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>892097</commentid>
    <comment_count>3</comment_count>
      <attachid>202491</attachid>
    <who name="huangxueqing">huangxueqing</who>
    <bug_when>2013-05-21 19:53:04 -0700</bug_when>
    <thetext>Created attachment 202491
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>892098</commentid>
    <comment_count>4</comment_count>
      <attachid>202492</attachid>
    <who name="huangxueqing">huangxueqing</who>
    <bug_when>2013-05-21 19:54:56 -0700</bug_when>
    <thetext>Created attachment 202492
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893098</commentid>
    <comment_count>5</comment_count>
    <who name="huangxueqing">huangxueqing</who>
    <bug_when>2013-05-23 18:53:41 -0700</bug_when>
    <thetext>Darin, do you know who can review this patch?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893099</commentid>
    <comment_count>6</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-05-23 19:01:35 -0700</bug_when>
    <thetext>I’ll review this. I’ve just been really busy this week.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893100</commentid>
    <comment_count>7</comment_count>
      <attachid>202492</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-05-23 19:09:41 -0700</bug_when>
    <thetext>Comment on attachment 202492
patch

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

Great patch! Definitely a step in the right direction. A few things that need fixing, but I think it’s getting close!

&gt; Source/WebCore/page/win/EventHandlerWin.cpp:46
&gt; +#if !USE(LEGACY_STYLE_ABSTRACT_CLIPBOARD_CLASS)

Should not use this #if in this file, since it’s only used for PLATFORM(WIN). Should just keep the !USE(LEGACY_STYLE_ABSTRACT_CLIPBOARD_CLASS) and delete the other side.

&gt; Source/WebCore/platform/Pasteboard.h:72
&gt; +#if PLATFORM(WIN)
&gt; +class Element;
&gt; +#endif

Should not put an #if around a forward declaration. Just leave the #if off.

&gt; Source/WebCore/platform/Pasteboard.h:171
&gt; +    void declareAndWriteDragImage(Element*, const KURL&amp;, const String&amp;, Frame*);

This function does not belong here. Pasteboard should expose what’s needed to implement this, but this function should stay elsewhere. I think DragControllerWin is the right file for this or we could leave it in ClipboardWin for now.

&gt; Source/WebCore/platform/win/EditorWin.cpp:30
&gt; +#if !USE(LEGACY_STYLE_ABSTRACT_CLIPBOARD_CLASS)

Should not use this #if in this file, since it’s only used for PLATFORM(WIN). Should just keep the !USE(LEGACY_STYLE_ABSTRACT_CLIPBOARD_CLASS) and delete the other side.

&gt; Source/WebCore/platform/win/EditorWin.cpp:62
&gt; +    Pasteboard* pasteboard = const_cast&lt;Pasteboard*&gt;(&amp;clipboard-&gt;pasteboard());
&gt; +    pasteboard-&gt;setExternalDataObject(clipboardData.get());

Ultimately this const_cast should not be needed. There’s some kind of design mistake that makes it needed for now. But no need for the pointer, this should be:

    const_cast&lt;Pasteboard&amp;&gt;(clipboard-&gt;pasteboard()).setExternalDataObject(clipboardData.get());

&gt; Source/WebCore/platform/win/PasteboardWin.cpp:111
&gt; +// static

We don&apos;t put in these kinds of comments in WebKit coding style.

&gt; Source/WebCore/platform/win/PasteboardWin.cpp:130
&gt; +void Pasteboard::createPasteboardPrivate()

I’d call this finishCreatingPasteboard.

&gt; Source/WebKit/win/WebCoreSupport/WebDragClient.cpp:34
&gt; +#if !USE(LEGACY_STYLE_ABSTRACT_CLIPBOARD_CLASS)

Should not use this #if in this file, since it’s only used for PLATFORM(WIN). Should just keep the !USE(LEGACY_STYLE_ABSTRACT_CLIPBOARD_CLASS) and delete the other side.

&gt; Source/WebKit/win/WebCoreSupport/WebDragClient.cpp:117
&gt; +    Pasteboard* pasteboard = const_cast&lt;Pasteboard*&gt;(&amp;clipboard-&gt;pasteboard());
&gt; +    COMPtr&lt;IDataObject&gt; dataObject = pasteboard-&gt;dataObject();

Doesn’t make sense that you have to const_cast here. Can’t dataObject be a const member function?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893211</commentid>
    <comment_count>8</comment_count>
      <attachid>202780</attachid>
    <who name="huangxueqing">huangxueqing</who>
    <bug_when>2013-05-24 01:08:21 -0700</bug_when>
    <thetext>Created attachment 202780
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893212</commentid>
    <comment_count>9</comment_count>
    <who name="huangxueqing">huangxueqing</who>
    <bug_when>2013-05-24 01:09:58 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 202492 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=202492&amp;action=review
&gt; 
&gt; Great patch! Definitely a step in the right direction. A few things that need fixing, but I think it’s getting close!
&gt; 
&gt; &gt; Source/WebCore/page/win/EventHandlerWin.cpp:46
&gt; &gt; +#if !USE(LEGACY_STYLE_ABSTRACT_CLIPBOARD_CLASS)
&gt; 
&gt; Should not use this #if in this file, since it’s only used for PLATFORM(WIN). Should just keep the !USE(LEGACY_STYLE_ABSTRACT_CLIPBOARD_CLASS) and delete the other side.
&gt; 
Done

&gt; &gt; Source/WebCore/platform/Pasteboard.h:72
&gt; &gt; +#if PLATFORM(WIN)
&gt; &gt; +class Element;
&gt; &gt; +#endif
&gt; 
&gt; Should not put an #if around a forward declaration. Just leave the #if off.
&gt; 
Done

&gt; &gt; Source/WebCore/platform/Pasteboard.h:171
&gt; &gt; +    void declareAndWriteDragImage(Element*, const KURL&amp;, const String&amp;, Frame*);
&gt; 
&gt; This function does not belong here. Pasteboard should expose what’s needed to implement this, but this function should stay elsewhere. I think DragControllerWin is the right file for this or we could leave it in ClipboardWin for now.
&gt; 
Done

&gt; &gt; Source/WebCore/platform/win/EditorWin.cpp:30
&gt; &gt; +#if !USE(LEGACY_STYLE_ABSTRACT_CLIPBOARD_CLASS)
&gt; 
&gt; Should not use this #if in this file, since it’s only used for PLATFORM(WIN). Should just keep the !USE(LEGACY_STYLE_ABSTRACT_CLIPBOARD_CLASS) and delete the other side.
&gt; 
Done

&gt; &gt; Source/WebCore/platform/win/EditorWin.cpp:62
&gt; &gt; +    Pasteboard* pasteboard = const_cast&lt;Pasteboard*&gt;(&amp;clipboard-&gt;pasteboard());
&gt; &gt; +    pasteboard-&gt;setExternalDataObject(clipboardData.get());
&gt; 
&gt; Ultimately this const_cast should not be needed. There’s some kind of design mistake that makes it needed for now. But no need for the pointer, this should be:
&gt; 
&gt;     const_cast&lt;Pasteboard&amp;&gt;(clipboard-&gt;pasteboard()).setExternalDataObject(clipboardData.get());
&gt; 
Done

&gt; &gt; Source/WebCore/platform/win/PasteboardWin.cpp:111
&gt; &gt; +// static
&gt; 
&gt; We don&apos;t put in these kinds of comments in WebKit coding style.
&gt; 
Done

&gt; &gt; Source/WebCore/platform/win/PasteboardWin.cpp:130
&gt; &gt; +void Pasteboard::createPasteboardPrivate()
&gt; 
&gt; I’d call this finishCreatingPasteboard.
&gt; 
Done

&gt; &gt; Source/WebKit/win/WebCoreSupport/WebDragClient.cpp:34
&gt; &gt; +#if !USE(LEGACY_STYLE_ABSTRACT_CLIPBOARD_CLASS)
&gt; 
&gt; Should not use this #if in this file, since it’s only used for PLATFORM(WIN). Should just keep the !USE(LEGACY_STYLE_ABSTRACT_CLIPBOARD_CLASS) and delete the other side.
&gt; 
Done

&gt; &gt; Source/WebKit/win/WebCoreSupport/WebDragClient.cpp:117
&gt; &gt; +    Pasteboard* pasteboard = const_cast&lt;Pasteboard*&gt;(&amp;clipboard-&gt;pasteboard());
&gt; &gt; +    COMPtr&lt;IDataObject&gt; dataObject = pasteboard-&gt;dataObject();
&gt; 
&gt; Doesn’t make sense that you have to const_cast here. Can’t dataObject be a const member function?
Done</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893213</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-05-24 01:11:59 -0700</bug_when>
    <thetext>Attachment 202780 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/dom/Clipboard.h&apos;, u&apos;Source/WebCore/page/win/EventHandlerWin.cpp&apos;, u&apos;Source/WebCore/platform/Pasteboard.h&apos;, u&apos;Source/WebCore/platform/win/ClipboardWin.cpp&apos;, u&apos;Source/WebCore/platform/win/ClipboardWin.h&apos;, u&apos;Source/WebCore/platform/win/EditorWin.cpp&apos;, u&apos;Source/WebCore/platform/win/PasteboardWin.cpp&apos;, u&apos;Source/WebKit/win/ChangeLog&apos;, u&apos;Source/WebKit/win/WebCoreSupport/WebDragClient.cpp&apos;]&quot; exit_code: 1
Source/WebKit/win/WebCoreSupport/WebDragClient.cpp:34:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 1 in 9 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893219</commentid>
    <comment_count>11</comment_count>
      <attachid>202784</attachid>
    <who name="huangxueqing">huangxueqing</who>
    <bug_when>2013-05-24 01:29:23 -0700</bug_when>
    <thetext>Created attachment 202784
patch

Fix style check failed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893220</commentid>
    <comment_count>12</comment_count>
      <attachid>202785</attachid>
    <who name="huangxueqing">huangxueqing</who>
    <bug_when>2013-05-24 01:30:18 -0700</bug_when>
    <thetext>Created attachment 202785
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893221</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-05-24 01:33:52 -0700</bug_when>
    <thetext>Attachment 202785 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/dom/Clipboard.h&apos;, u&apos;Source/WebCore/page/win/EventHandlerWin.cpp&apos;, u&apos;Source/WebCore/platform/Pasteboard.h&apos;, u&apos;Source/WebCore/platform/win/ClipboardWin.cpp&apos;, u&apos;Source/WebCore/platform/win/ClipboardWin.h&apos;, u&apos;Source/WebCore/platform/win/EditorWin.cpp&apos;, u&apos;Source/WebCore/platform/win/PasteboardWin.cpp&apos;, u&apos;Source/WebKit/win/ChangeLog&apos;, u&apos;Source/WebKit/win/WebCoreSupport/WebDragClient.cpp&apos;]&quot; exit_code: 1
Source/WebKit/win/WebCoreSupport/WebDragClient.cpp:34:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 1 in 9 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893223</commentid>
    <comment_count>14</comment_count>
      <attachid>202787</attachid>
    <who name="huangxueqing">huangxueqing</who>
    <bug_when>2013-05-24 01:37:55 -0700</bug_when>
    <thetext>Created attachment 202787
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893848</commentid>
    <comment_count>15</comment_count>
      <attachid>202787</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-05-26 18:01:50 -0700</bug_when>
    <thetext>Comment on attachment 202787
patch

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

&gt; Source/WebCore/ChangeLog:8
&gt; +        Tests:

I’d leave this line out.

&gt; Source/WebCore/ChangeLog:9
&gt; +        Clipboard refactor, no new tests.

It’s OK to have a line like this explaining why we have no new tests.

&gt; Source/WebCore/ChangeLog:16
&gt; +        (WebCore):
&gt; +        (Pasteboard):

Unpleasant lines like these should be removed from the change log. They are just signs of bugs in the prepare-ChangeLog script.

&gt; Source/WebCore/ChangeLog:26
&gt; +        (WebCore):

Ditto.

&gt; Source/WebCore/platform/Pasteboard.h:42
&gt; +#include &lt;WebCore/COMPtr.h&gt;
&gt; +#include &lt;WebCore/WCDataObject.h&gt;

Includes inside WebCore from files inside WebCore are normally done like this:

    #include &quot;COMPtr.h&quot;
    #include &quot;WCDataObject.h&quot;

Is there some reason we need to do &lt;WebCore/xxx.h&gt; here?

&gt; Source/WebCore/platform/Pasteboard.h:111
&gt; +#if PLATFORM(WIN)
&gt; +    explicit Pasteboard(IDataObject*);
&gt; +    explicit Pasteboard(WCDataObject*);
&gt; +    explicit Pasteboard(const DragDataMap&amp;);
&gt; +#endif

Do these constructors need to be public? Can we keep them private instead since they are called only by other Pasteboard functions?

&gt; Source/WebCore/platform/win/EditorWin.cpp:52
&gt; +    const_cast&lt;Pasteboard&amp;&gt;(clipboard-&gt;pasteboard()).setExternalDataObject(clipboardData.get());

I think the OldGetClipboard code should go inside Pasteboard::createForCopyAndPaste() and not here. Eventually if not in this patch.

&gt; Source/WebCore/platform/win/PasteboardWin.cpp:106
&gt; +    // Windows has not &quot;Private pasteboard&quot; concept.

The grammar here is not right. Probably should replace the word “not” here with the word “no”.

&gt; Source/WebCore/platform/win/PasteboardWin.cpp:123
&gt; +    // We could not call DragData::dragDataMap via |const DragData&amp;|.

This comment seems confusing to me. The issue is that DragData::dragDataMap needs a const version that returns a const&amp; result. We should fix that.

&gt; Source/WebCore/platform/win/PasteboardWin.cpp:125
&gt; +    const DragDataMap&amp; dragDataMap = const_cast&lt;DragData*&gt;((&amp;dragData))-&gt;dragDataMap();
&gt; +    return adoptPtr(new Pasteboard(dragDataMap));

If we need the const cast here, it can still be written simpler in one line without all the parentheses and uses of pointers:

    // FIXME: Should add a const overload of dragDataMap so we don’t need a const_cast here.
    return adoptPtr(new Pasteboard(const_cast&lt;DragData&amp;&gt;(dragData).dragDataMap()));

&gt; Source/WebCore/platform/win/PasteboardWin.cpp:187
&gt; +    String qType = type.stripWhiteSpace().lower();

The name “qType” sure seems strange here, but I suppose best to not change this.

&gt; Source/WebCore/platform/win/PasteboardWin.cpp:396
&gt; +    if (winType == ClipboardDataTypeURL)
&gt; +        return WebCore::writeURL(m_writableDataObject.get(), KURL(ParsedURLString, data), String(), false, true);

This is not a correct nor safe use of ParsedURLString. It should be KURL(KURL(), data) instead. Just a bug in the code we are moving, but still not good!

&gt; Source/WebCore/platform/win/PasteboardWin.cpp:415
&gt; +void Pasteboard::setDragImage(DragImageRef, const IntPoint&amp; hotSpot)

Should omit the argument name hotSpot to possibly avoid unused argument warnings in future versions of the compiler.

&gt; Source/WebCore/platform/win/PasteboardWin.cpp:565
&gt; +        KURL kurl(ParsedURLString, url);

This is not a correct nor safe use of ParsedURLString. It should be KURL kurl(KURL(), url) instead. Just a bug in the code we are moving, but still not good!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893887</commentid>
    <comment_count>16</comment_count>
      <attachid>202948</attachid>
    <who name="huangxueqing">huangxueqing</who>
    <bug_when>2013-05-26 21:23:19 -0700</bug_when>
    <thetext>Created attachment 202948
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893889</commentid>
    <comment_count>17</comment_count>
    <who name="huangxueqing">huangxueqing</who>
    <bug_when>2013-05-26 21:27:59 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; (From update of attachment 202787 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=202787&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:8
&gt; &gt; +        Tests:
&gt; 
&gt; I’d leave this line out.
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:9
&gt; &gt; +        Clipboard refactor, no new tests.
&gt; 
&gt; It’s OK to have a line like this explaining why we have no new tests.
&gt; 
Done

&gt; &gt; Source/WebCore/ChangeLog:16
&gt; &gt; +        (WebCore):
&gt; &gt; +        (Pasteboard):
&gt; 
&gt; Unpleasant lines like these should be removed from the change log. They are just signs of bugs in the prepare-ChangeLog script.
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:26
&gt; &gt; +        (WebCore):
&gt; 
&gt; Ditto.
&gt; 
Done

&gt; &gt; Source/WebCore/platform/Pasteboard.h:42
&gt; &gt; +#include &lt;WebCore/COMPtr.h&gt;
&gt; &gt; +#include &lt;WebCore/WCDataObject.h&gt;
&gt; 
&gt; Includes inside WebCore from files inside WebCore are normally done like this:
&gt; 
&gt;     #include &quot;COMPtr.h&quot;
&gt;     #include &quot;WCDataObject.h&quot;
&gt; 
&gt; Is there some reason we need to do &lt;WebCore/xxx.h&gt; here?
&gt; 
Done, just a copy and paste mistake.

&gt; &gt; Source/WebCore/platform/Pasteboard.h:111
&gt; &gt; +#if PLATFORM(WIN)
&gt; &gt; +    explicit Pasteboard(IDataObject*);
&gt; &gt; +    explicit Pasteboard(WCDataObject*);
&gt; &gt; +    explicit Pasteboard(const DragDataMap&amp;);
&gt; &gt; +#endif
&gt; 
&gt; Do these constructors need to be public? Can we keep them private instead since they are called only by other Pasteboard functions?
&gt; 
You are right, I had moved these constructors to private.

&gt; &gt; Source/WebCore/platform/win/EditorWin.cpp:52
&gt; &gt; +    const_cast&lt;Pasteboard&amp;&gt;(clipboard-&gt;pasteboard()).setExternalDataObject(clipboardData.get());
&gt; 
&gt; I think the OldGetClipboard code should go inside Pasteboard::createForCopyAndPaste() and not here. Eventually if not in this patch.
&gt; 
Me too :-), I think we&apos;d better file a new bug to fix this.

&gt; &gt; Source/WebCore/platform/win/PasteboardWin.cpp:106
&gt; &gt; +    // Windows has not &quot;Private pasteboard&quot; concept.
&gt; 
&gt; The grammar here is not right. Probably should replace the word “not” here with the word “no”.
&gt; 
Done

&gt; &gt; Source/WebCore/platform/win/PasteboardWin.cpp:123
&gt; &gt; +    // We could not call DragData::dragDataMap via |const DragData&amp;|.
&gt; 
&gt; This comment seems confusing to me. The issue is that DragData::dragDataMap needs a const version that returns a const&amp; result. We should fix that.
&gt; 
&gt; &gt; Source/WebCore/platform/win/PasteboardWin.cpp:125
&gt; &gt; +    const DragDataMap&amp; dragDataMap = const_cast&lt;DragData*&gt;((&amp;dragData))-&gt;dragDataMap();
&gt; &gt; +    return adoptPtr(new Pasteboard(dragDataMap));
&gt; 
&gt; If we need the const cast here, it can still be written simpler in one line without all the parentheses and uses of pointers:
&gt; 
&gt;     // FIXME: Should add a const overload of dragDataMap so we don’t need a const_cast here.
&gt;     return adoptPtr(new Pasteboard(const_cast&lt;DragData&amp;&gt;(dragData).dragDataMap()));
&gt; 
Done

&gt; &gt; Source/WebCore/platform/win/PasteboardWin.cpp:187
&gt; &gt; +    String qType = type.stripWhiteSpace().lower();
&gt; 
&gt; The name “qType” sure seems strange here, but I suppose best to not change this.
&gt; 
&gt; &gt; Source/WebCore/platform/win/PasteboardWin.cpp:396
&gt; &gt; +    if (winType == ClipboardDataTypeURL)
&gt; &gt; +        return WebCore::writeURL(m_writableDataObject.get(), KURL(ParsedURLString, data), String(), false, true);
&gt; 
&gt; This is not a correct nor safe use of ParsedURLString. It should be KURL(KURL(), data) instead. Just a bug in the code we are moving, but still not good!
&gt; 
Done

&gt; &gt; Source/WebCore/platform/win/PasteboardWin.cpp:415
&gt; &gt; +void Pasteboard::setDragImage(DragImageRef, const IntPoint&amp; hotSpot)
&gt; 
&gt; Should omit the argument name hotSpot to possibly avoid unused argument warnings in future versions of the compiler.
&gt; 
Done

&gt; &gt; Source/WebCore/platform/win/PasteboardWin.cpp:565
&gt; &gt; +        KURL kurl(ParsedURLString, url);
&gt; 
&gt; This is not a correct nor safe use of ParsedURLString. It should be KURL kurl(KURL(), url) instead. Just a bug in the code we are moving, but still not good!
Done</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>894126</commentid>
    <comment_count>18</comment_count>
      <attachid>202948</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-05-27 12:51:33 -0700</bug_when>
    <thetext>Comment on attachment 202948
patch

Clearing flags on attachment: 202948

Committed r150772: &lt;http://trac.webkit.org/changeset/150772&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>894127</commentid>
    <comment_count>19</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-05-27 12:51:36 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>202490</attachid>
            <date>2013-05-21 19:36:22 -0700</date>
            <delta_ts>2013-05-21 19:54:56 -0700</delta_ts>
            <desc>patch</desc>
            <filename>116258.patch</filename>
            <type>text/plain</type>
            <size>68138</size>
            <attacher name="huangxueqing">huangxueqing</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9X
ZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNDk0KQ0KKysrIFNvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEsMyArMSw2MiBAQA0KKzIwMTMtMDUtMjEgIFh1
ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgorCisgICAgICAgIE1vdmUgV2lu
ZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJkLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdHM6CisgICAgICAgIENsaXBib2FyZCByZWZhY3Rv
ciwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogZG9tL0NsaXBib2FyZC5oOgorICAgICAgICAq
IHBhZ2Uvd2luL0V2ZW50SGFuZGxlcldpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFdmVudEhh
bmRsZXI6OmNyZWF0ZURyYWdnaW5nQ2xpcGJvYXJkKTogQ3JlYXRlIENsaXBib2FyZCBpbnN0ZWFk
IG9mIENsaXBib2FyZFdpbi4KKyAgICAgICAgKiBwbGF0Zm9ybS9QYXN0ZWJvYXJkLmg6CisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFBhc3RlYm9hcmQpOgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6ZGF0YU9iamVjdCk6IEdldCBJRGF0YU9iamVjdCBieSBDbGlwYm9yYWQuCisg
ICAgICAgICogcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpDbGlwYm9hcmQ6OmNyZWF0ZURyYWdJbWFnZSk6IENoYW5nZSBwYXJhbWV0ZXIgbmFtZSBsb2Mg
dG8gZHJhZ0xvY2F0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q2xpcGJvYXJkOjpkZWNsYXJlQW5k
V3JpdGVEcmFnSW1hZ2UpOiBNb3ZlIGltcGxlbWVudGF0aW9uIGludG8gUGFzdGVib2FyZFdpbi5j
cHAuCisgICAgICAgICogcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5oOiBSZW1vdmVkLgorICAg
ICAgICAqIHBsYXRmb3JtL3dpbi9FZGl0b3JXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6RWRp
dG9yOjpuZXdHZW5lcmFsQ2xpcGJvYXJkKTogQ3JlYXRlIENsaXBib2FyZCBpbnN0ZWFkIG9mIENs
aXBib2FyZFdpbi4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmNyZWF0ZUZv
ckNvcHlBbmRQYXN0ZSk6IENyZWF0ZSBhIFBhc3RlYm9hcmQuCisgICAgICAgIChXZWJDb3JlOjpQ
YXN0ZWJvYXJkOjpjcmVhdGVQcml2YXRlKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0
ZWJvYXJkOjpjcmVhdGVGb3JEcmFnQW5kRHJvcCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6Y3JlYXRlUGFzdGVib2FyZFByaXZhdGUpOiBDcmVhdGUgUGFzdGVib2FyZCB1
c2UgV2luZG93cyBBUEkuCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpQYXN0ZWJvYXJk
KToKKyAgICAgICAgKFdlYkNvcmU6OmNsaXBib2FyZFR5cGVGcm9tTUlNRVR5cGUpOiBDb3BpZWQg
ZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6Y2xl
YXIpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6Omhhc0RhdGEpOiBEaXR0
by4KKyAgICAgICAgKFdlYkNvcmU6OmFkZE1pbWVUeXBlc0ZvckZvcm1hdCk6IERpdHRvLgorICAg
ICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6dHlwZXMpOiBEaXR0by4KKyAgICAgICAgKFdlYkNv
cmU6OlBhc3RlYm9hcmQ6OnJlYWRTdHJpbmcpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBh
c3RlYm9hcmQ6OnJlYWRGaWxlbmFtZXMpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OndyaXRl
VVJMKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVN0cmluZyk6
IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6c2V0RHJhZ0ltYWdlKTogRGl0
dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVJhbmdlVG9EYXRhT2JqZWN0
KTogV3JpdGUgcmFuZ2UgdG8gV0NEYXRhT2JqZWN0LgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVi
b2FyZDo6d3JpdGVTZWxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3Jp
dGVQbGFpblRleHRUb0RhdGFPYmplY3QpOiBXcml0ZSBQbGFpblRleHQgdG8gV0NEYXRhT2JqZWN0
LgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVQbGFpblRleHQpOgorICAgICAg
ICAoV2ViQ29yZTo6cGF0aFJlbW92ZUJhZEZTQ2hhcmFjdGVycyk6IENvcGllZCBmcm9tIENsaXBi
b2FyZFdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRp
dGxlKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjp3cml0ZUZpbGVUb0RhdGFPYmplY3QpOiBE
aXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlVVJMVG9EYXRhT2JqZWN0
KTogV3JpdGUgVVJMIHRvIFdDRGF0YU9iamVjdC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9h
cmQ6OndyaXRlVVJMKTogQ29waWVkIGZyb20gQ2xpcGJvYXJkV2luLmNwcC4KKyAgICAgICAgKFdl
YkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlUGFzdGVib2FyZCk6ICBDb3BpZWQgZnJvbSBQYXN0ZWJv
YXJkOjp3cml0ZUNsaXBib2FyZC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmRvY3Vt
ZW50RnJhZ21lbnQpOiBDb3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6UGFzdGVib2FyZDo6c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KTogQ2xpcGJvYXJkIGNhbiBz
ZXQgbmV3IElEYXRhT2JqZWN0LgorICAgICAgICAoV2ViQ29yZTo6Z2V0Q2FjaGVkSW1hZ2UpOiBD
b3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlR2xv
YmFsSW1hZ2VGaWxlRGVzY3JpcHRvcik6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
R2xvYmFsSW1hZ2VGaWxlQ29udGVudCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
R2xvYmFsSERyb3BDb250ZW50KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjp3cml0ZUltYWdl
VG9EYXRhT2JqZWN0KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpkZWNs
YXJlQW5kV3JpdGVEcmFnSW1hZ2UpOiBDb3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorCiAy
MDEzLTA1LTIxICBBbmR5IEVzdGVzICA8YWVzdGVzQGFwcGxlLmNvbT4KIAogICAgICAgICBBbGxv
dyBzZXNzaW9uIHN0b3JhZ2UgZm9yIHRoaXJkLXBhcnR5IG9yaWdpbnMgZXZlbiBpZiB0aGlyZC1w
YXJ0eSBkYXRhIGFjY2VzcyBpcyBibG9ja2VkLgpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0Ns
aXBib2FyZC5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09DQotLS0gU291cmNlL1dlYkNvcmUvZG9tL0NsaXBib2FyZC5o
CShyZXZpc2lvbiAxNTA0MzMpDQorKysgU291cmNlL1dlYkNvcmUvZG9tL0NsaXBib2FyZC5oCSh3
b3JraW5nIGNvcHkpDQpAQCAtMzQsNyArMzQsNyBAQA0KIC8vIFRoaXMgRE9NIG9iamVjdCBub3cg
d29ya3MgYnkgY2FsbGluZyB0aHJvdWdoIHRvIGNsYXNzZXMgaW4gdGhlIHBsYXRmb3JtIGxheWVy
LgogLy8gU3BlY2lmaWNhbGx5LCB0aGUgY2xhc3MgY3VycmVudGx5IG5hbWVkIFBhc3RlYm9hcmQu
IFRoZSBsZWdhY3kgc3R5bGUgaW5zdGVhZAogLy8gdXNlcyB0aGlzIGFzIGFuIGFic3RyYWN0IGJh
c2UgY2xhc3MuCi0jZGVmaW5lIFdURl9VU0VfTEVHQUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FS
RF9DTEFTUyAoUExBVEZPUk0oSU9TKSB8fCBQTEFURk9STShRVCkgfHwgUExBVEZPUk0oV0lOKSkK
KyNkZWZpbmUgV1RGX1VTRV9MRUdBQ1lfU1RZTEVfQUJTVFJBQ1RfQ0xJUEJPQVJEX0NMQVNTIChQ
TEFURk9STShJT1MpIHx8IFBMQVRGT1JNKFFUKSkKIAogI2lmIFVTRShMRUdBQ1lfU1RZTEVfQUJT
VFJBQ1RfQ0xJUEJPQVJEX0NMQVNTKQogI2RlZmluZSBMRUdBQ1lfVklSVFVBTCB2aXJ0dWFsCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL3dpbi9FdmVudEhhbmRsZXJXaW4uY3BwDQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09DQotLS0gU291cmNlL1dlYkNvcmUvcGFnZS93aW4vRXZlbnRIYW5kbGVyV2luLmNwcAkocmV2
aXNpb24gMTUwNDMzKQ0KKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2Uvd2luL0V2ZW50SGFuZGxlcldp
bi5jcHAJKHdvcmtpbmcgY29weSkNCkBAIC00MywxMSArNDMsMTYgQEANCiAjaW5jbHVkZSAiV0NE
YXRhT2JqZWN0LmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKIAorI2lmICFVU0UoTEVH
QUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFTUykKKyNpbmNsdWRlICJDT01QdHIuaCIK
KyNpbmNsdWRlICJDbGlwYm9hcmQuaCIKKyNlbHNlCiAjaWYgT1MoV0lOQ0UpCiAjaW5jbHVkZSAi
Q2xpcGJvYXJkLmgiCiAjZWxzZQogI2luY2x1ZGUgIkNsaXBib2FyZFdpbi5oIgogI2VuZGlmCisj
ZW5kaWYKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC0xMDEsMTAgKzEwNiwxNCBAQA0KICNp
ZiBPUyhXSU5DRSkKICAgICByZXR1cm4gMDsKICNlbHNlCisjaWYgVVNFKExFR0FDWV9TVFlMRV9B
QlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCiAgICAgQ09NUHRyPFdDRGF0YU9iamVjdD4gZGF0YU9i
amVjdDsKICAgICBXQ0RhdGFPYmplY3Q6OmNyZWF0ZUluc3RhbmNlKCZkYXRhT2JqZWN0KTsKICAg
ICByZXR1cm4gQ2xpcGJvYXJkV2luOjpjcmVhdGUoQ2xpcGJvYXJkOjpEcmFnQW5kRHJvcCwgZGF0
YU9iamVjdC5nZXQoKSwgQ2xpcGJvYXJkV3JpdGFibGUsIG1fZnJhbWUpOworI2Vsc2UKKyAgICBy
ZXR1cm4gQ2xpcGJvYXJkOjpjcmVhdGVGb3JEcmFnQW5kRHJvcCgpOwogI2VuZGlmCisjZW5kaWYK
IH0KICNlbmRpZgogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgN
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0NCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgJKHJl
dmlzaW9uIDE1MDQzMykNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgJ
KHdvcmtpbmcgY29weSkNCkBAIC0zOCw2ICszOCw5IEBADQogI2VuZGlmCiAKICNpZiBQTEFURk9S
TShXSU4pCisjaW5jbHVkZSA8V2ViQ29yZS9DT01QdHIuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1dD
RGF0YU9iamVjdC5oPgorI2luY2x1ZGUgPG9iamlkbC5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4K
IHR5cGVkZWYgc3RydWN0IEhXTkRfXyogSFdORDsKICNlbmRpZgpAQCAtNjQsNiArNjcsOSBAQA0K
IGNsYXNzIENsaXBib2FyZDsKIGNsYXNzIERvY3VtZW50RnJhZ21lbnQ7CiBjbGFzcyBEcmFnRGF0
YTsKKyNpZiBQTEFURk9STShXSU4pCitjbGFzcyBFbGVtZW50OworI2VuZGlmCiBjbGFzcyBGcmFt
ZTsKIGNsYXNzIEhpdFRlc3RSZXN1bHQ7CiBjbGFzcyBLVVJMOwpAQCAtMTAwLDYgKzEwNiwxMiBA
QA0KICAgICBQYXNzUmVmUHRyPERhdGFPYmplY3RHdGs+IGRhdGFPYmplY3QoKSBjb25zdDsKICNl
bmRpZgogCisjaWYgUExBVEZPUk0oV0lOKQorICAgIGV4cGxpY2l0IFBhc3RlYm9hcmQoSURhdGFP
YmplY3QqIGRhdGFPYmplY3QpOworICAgIGV4cGxpY2l0IFBhc3RlYm9hcmQoV0NEYXRhT2JqZWN0
KiBkYXRhT2JqZWN0KTsKKyAgICBleHBsaWNpdCBQYXN0ZWJvYXJkKGNvbnN0IERyYWdEYXRhTWFw
JiBkYXRhTWFwKTsKKyNlbmRpZgorCiAgICAgLy8gRGVwcmVjYXRlZC4gVXNlIGNyZWF0ZUZvckNv
cHlBbmRQYXN0ZSBpbnN0ZWFkLgogICAgIHN0YXRpYyBQYXN0ZWJvYXJkKiBnZW5lcmFsUGFzdGVi
b2FyZCgpOwogCkBAIC0xNTMsNiArMTY1LDEyIEBADQogICAgIHZvaWQgc2V0U2VsZWN0aW9uTW9k
ZShib29sKSB7IH0KICNlbmRpZgogCisjaWYgUExBVEZPUk0oV0lOKQorICAgICBDT01QdHI8SURh
dGFPYmplY3Q+IGRhdGFPYmplY3QoKSB7IHJldHVybiBtX2RhdGFPYmplY3Q7IH0KKyAgICAgdm9p
ZCBzZXRFeHRlcm5hbERhdGFPYmplY3QoSURhdGFPYmplY3QgKmRhdGFPYmplY3QpOworICAgICB2
b2lkIGRlY2xhcmVBbmRXcml0ZURyYWdJbWFnZShFbGVtZW50KiBlbGVtZW50LCBjb25zdCBLVVJM
JiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUsIEZyYW1lKiBmcmFtZSk7CisjZW5kaWYKKwogI2lm
IFBMQVRGT1JNKEdUSykKICAgICB+UGFzdGVib2FyZCgpOwogI2VuZGlmCkBAIC0xNzUsNyArMTkz
LDE1IEBADQogI2VuZGlmCiAKICNpZiBQTEFURk9STShXSU4pCisgICAgdm9pZCBjcmVhdGVQYXN0
ZWJvYXJkUHJpdmF0ZSgpOworICAgIHZvaWQgd3JpdGVSYW5nZVRvRGF0YU9iamVjdChSYW5nZSos
IEZyYW1lKik7CisgICAgdm9pZCB3cml0ZVVSTFRvRGF0YU9iamVjdChjb25zdCBLVVJMJiwgY29u
c3QgU3RyaW5nJiwgRnJhbWUqKTsKKyAgICB2b2lkIHdyaXRlUGxhaW5UZXh0VG9EYXRhT2JqZWN0
KGNvbnN0IFN0cmluZyYsIFNtYXJ0UmVwbGFjZU9wdGlvbik7CisKICAgICBIV05EIG1fb3duZXI7
CisgICAgQ09NUHRyPElEYXRhT2JqZWN0PiBtX2RhdGFPYmplY3Q7CisgICAgQ09NUHRyPFdDRGF0
YU9iamVjdD4gbV93cml0YWJsZURhdGFPYmplY3Q7CisgICAgRHJhZ0RhdGFNYXAgbV9kcmFnRGF0
YU1hcDsKICNlbmRpZgogCiAjaWYgUExBVEZPUk0oUVQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4uY3BwCShyZXZpc2lvbiAxNTA0MzMpDQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5jcHAJKHdvcmtpbmcgY29w
eSkNCkBAIC0xLDUgKzEsNiBAQA0KIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBw
bGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBYdWVx
aW5nIEh1YW5nIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCkBAIC0yNCw3OTUgKzI1LDM2IEBADQogICovCiAKICNpbmNsdWRlICJjb25maWcu
aCIKLSNpbmNsdWRlICJDbGlwYm9hcmRXaW4uaCIKKyNpbmNsdWRlICJDbGlwYm9hcmQuaCIKIAog
I2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCi0jaW5jbHVkZSAiQ2xpcGJvYXJkVXRpbGl0aWVzV2lu
LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJEcmFnRGF0YS5oIgotI2luY2x1
ZGUgIkVkaXRvci5oIgotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNpbmNsdWRlICJFdmVudEhhbmRs
ZXIuaCIKLSNpbmNsdWRlICJGaWxlTGlzdC5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5jbHVk
ZSAiRnJhbWVMb2FkZXIuaCIKLSNpbmNsdWRlICJGcmFtZVZpZXcuaCIKLSNpbmNsdWRlICJIVE1M
TmFtZXMuaCIKLSNpbmNsdWRlICJIVE1MUGFyc2VySWRpb21zLmgiCi0jaW5jbHVkZSAiSW1hZ2Uu
aCIKLSNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCi0jaW5jbHVkZSAiTm90SW1wbGVtZW50
ZWQuaCIKLSNpbmNsdWRlICJQYWdlLmgiCiAjaW5jbHVkZSAiUGFzdGVib2FyZC5oIgotI2luY2x1
ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgotI2luY2x1ZGUgIlJhbmdlLmgiCi0jaW5jbHVkZSAi
UmVuZGVySW1hZ2UuaCIKLSNpbmNsdWRlICJSZXNvdXJjZVJlc3BvbnNlLmgiCi0jaW5jbHVkZSAi
U2hhcmVkQnVmZmVyLmgiCi0jaW5jbHVkZSAiV0NEYXRhT2JqZWN0LmgiCi0jaW5jbHVkZSAibWFy
a3VwLmgiCi0jaW5jbHVkZSA8c2hsd2FwaS5oPgotI2luY2x1ZGUgPHdpbmluZXQuaD4KLSNpbmNs
dWRlIDx3dGYvUmVmUHRyLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgotI2luY2x1
ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2gu
aD4KIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQogbmFtZXNwYWNlIFdlYkNvcmUgewogCi11c2lu
ZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi0vLyBXZSBwcm92aWRlIHRoZSBJRSBjbGlwYm9hcmQg
dHlwZXMgKFVSTCBhbmQgVGV4dCksIGFuZCB0aGUgY2xpcGJvYXJkIHR5cGVzIHNwZWNpZmllZCBp
biB0aGUgV0hBVFdHIFdlYiBBcHBsaWNhdGlvbnMgMS4wIGRyYWZ0Ci0vLyBzZWUgaHR0cDovL3d3
dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8gU2VjdGlvbiA2LjMuNS4z
Ci0KLWVudW0gQ2xpcGJvYXJkRGF0YVR5cGUgeyBDbGlwYm9hcmREYXRhVHlwZU5vbmUsIENsaXBi
b2FyZERhdGFUeXBlVVJMLCBDbGlwYm9hcmREYXRhVHlwZVRleHQsIENsaXBib2FyZERhdGFUeXBl
VGV4dEhUTUwgfTsKLQotc3RhdGljIENsaXBib2FyZERhdGFUeXBlIGNsaXBib2FyZFR5cGVGcm9t
TUlNRVR5cGUoY29uc3QgU3RyaW5nJiB0eXBlKQorRHJhZ0ltYWdlUmVmIENsaXBib2FyZDo6Y3Jl
YXRlRHJhZ0ltYWdlKEludFBvaW50JiBkcmFnTG9jYXRpb24pIGNvbnN0CiB7Ci0gICAgU3RyaW5n
IHFUeXBlID0gdHlwZS5zdHJpcFdoaXRlU3BhY2UoKS5sb3dlcigpOwotCi0gICAgLy8gdHdvIHNw
ZWNpYWwgY2FzZXMgZm9yIElFIGNvbXBhdGliaWxpdHkKLSAgICBpZiAocVR5cGUgPT0gInRleHQi
IHx8IHFUeXBlID09ICJ0ZXh0L3BsYWluIiB8fCBxVHlwZS5zdGFydHNXaXRoKCJ0ZXh0L3BsYWlu
OyIpKQotICAgICAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0OwotICAgIGlmIChxVHlw
ZSA9PSAidXJsIiB8fCBxVHlwZSA9PSAidGV4dC91cmktbGlzdCIpCi0gICAgICAgIHJldHVybiBD
bGlwYm9hcmREYXRhVHlwZVVSTDsKLSAgICBpZiAocVR5cGUgPT0gInRleHQvaHRtbCIpCi0gICAg
ICAgIHJldHVybiBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MOwotCi0gICAgcmV0dXJuIENsaXBi
b2FyZERhdGFUeXBlTm9uZTsKLX0KLQotI2lmICFPUyhXSU5DRSkKLXN0YXRpYyBpbmxpbmUgdm9p
ZCBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKFBXU1RSIHBzeiwgc2l6ZV90IGxlbmd0aCkKLXsK
LSAgICBzaXplX3Qgd3JpdGVUbyA9IDA7Ci0gICAgc2l6ZV90IHJlYWRGcm9tID0gMDsKLSAgICB3
aGlsZSAocmVhZEZyb20gPCBsZW5ndGgpIHsKLSAgICAgICAgVUlOVCB0eXBlID0gUGF0aEdldENo
YXJUeXBlKHBzeltyZWFkRnJvbV0pOwotICAgICAgICBpZiAoIXBzeltyZWFkRnJvbV0gfHwgdHlw
ZSAmIChHQ1RfTEZOQ0hBUiB8IEdDVF9TSE9SVENIQVIpKQotICAgICAgICAgICAgcHN6W3dyaXRl
VG8rK10gPSBwc3pbcmVhZEZyb21dOwotCi0gICAgICAgIHJlYWRGcm9tKys7Ci0gICAgfQotICAg
IHBzelt3cml0ZVRvXSA9IDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIFN0cmluZyBmaWxlc3lzdGVt
UGF0aEZyb21VcmxPclRpdGxlKGNvbnN0IFN0cmluZyYgdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxl
LCBjb25zdCBVQ2hhciogZXh0ZW5zaW9uLCBib29sIGlzTGluaykKLXsKLSNpZiBPUyhXSU5DRSkK
LSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVybiBTdHJpbmcoKTsKLSNlbHNlCi0gICAg
c3RhdGljIGNvbnN0IHNpemVfdCBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdOdWxsVGVybWluYXRv
ciA9IE1BWF9QQVRIIC0gMTsKLSAgICBib29sIHVzZWRVUkwgPSBmYWxzZTsKLSAgICBXQ0hBUiBm
c1BhdGhCdWZmZXJbTUFYX1BBVEhdOwotICAgIGZzUGF0aEJ1ZmZlclswXSA9IDA7Ci0gICAgaW50
IGV4dGVuc2lvbkxlbiA9IGV4dGVuc2lvbiA/IGxzdHJsZW4oZXh0ZW5zaW9uKSA6IDA7Ci0gICAg
aW50IGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4dGVuc2lvbiA9IGZzUGF0aE1heExlbmd0aEV4
Y2x1ZGluZ051bGxUZXJtaW5hdG9yIC0gZXh0ZW5zaW9uTGVuOwotCi0gICAgaWYgKCF0aXRsZS5p
c0VtcHR5KCkpIHsKLSAgICAgICAgc2l6ZV90IGxlbiA9IG1pbjxzaXplX3Q+KHRpdGxlLmxlbmd0
aCgpLCBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24pOwotICAgICAgICBDb3B5TWVt
b3J5KGZzUGF0aEJ1ZmZlciwgdGl0bGUuY2hhcmFjdGVycygpLCBsZW4gKiBzaXplb2YoVUNoYXIp
KTsKLSAgICAgICAgZnNQYXRoQnVmZmVyW2xlbl0gPSAwOwotICAgICAgICBwYXRoUmVtb3ZlQmFk
RlNDaGFyYWN0ZXJzKGZzUGF0aEJ1ZmZlciwgbGVuKTsKLSAgICB9Ci0KLSAgICBpZiAoIWxzdHJs
ZW4oZnNQYXRoQnVmZmVyKSkgewotICAgICAgICBLVVJMIGt1cmwoUGFyc2VkVVJMU3RyaW5nLCB1
cmwpOwotICAgICAgICB1c2VkVVJMID0gdHJ1ZTsKLSAgICAgICAgLy8gVGhlIGZpbGVuYW1lIGZv
ciBhbnkgY29udGVudCBiYXNlZCBkcmFnIG9yIGZpbGUgdXJsIHNob3VsZCBiZSB0aGUgbGFzdCBl
bGVtZW50IG9mIAotICAgICAgICAvLyB0aGUgcGF0aC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIG9y
IHdlJ3JlIGNvbWluZyB1cCB3aXRoIHRoZSBuYW1lIGZvciBhIGxpbmsKLSAgICAgICAgLy8gd2Ug
anVzdCB1c2UgdGhlIGVudGlyZSB1cmwuCi0gICAgICAgIERXT1JEIGxlbiA9IGZzUGF0aE1heExl
bmd0aEV4Y2x1ZGluZ0V4dGVuc2lvbjsKLSAgICAgICAgU3RyaW5nIGxhc3RDb21wb25lbnQgPSBr
dXJsLmxhc3RQYXRoQ29tcG9uZW50KCk7Ci0gICAgICAgIGlmIChrdXJsLmlzTG9jYWxGaWxlKCkg
fHwgKCFpc0xpbmsgJiYgIWxhc3RDb21wb25lbnQuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAg
bGVuID0gbWluPERXT1JEPihmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24sIGxhc3RD
b21wb25lbnQubGVuZ3RoKCkpOwotICAgICAgICAgICAgQ29weU1lbW9yeShmc1BhdGhCdWZmZXIs
IGxhc3RDb21wb25lbnQuY2hhcmFjdGVycygpLCBsZW4gKiBzaXplb2YoVUNoYXIpKTsKLSAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxlbiA9IG1pbjxEV09SRD4oZnNQYXRoTWF4TGVuZ3Ro
RXhjbHVkaW5nRXh0ZW5zaW9uLCB1cmwubGVuZ3RoKCkpOwotICAgICAgICAgICAgQ29weU1lbW9y
eShmc1BhdGhCdWZmZXIsIHVybC5jaGFyYWN0ZXJzKCksIGxlbiAqIHNpemVvZihVQ2hhcikpOwot
ICAgICAgICB9Ci0gICAgICAgIGZzUGF0aEJ1ZmZlcltsZW5dID0gMDsKLSAgICAgICAgcGF0aFJl
bW92ZUJhZEZTQ2hhcmFjdGVycyhmc1BhdGhCdWZmZXIsIGxlbik7Ci0gICAgfQotCi0gICAgaWYg
KCFleHRlbnNpb24pCi0gICAgICAgIHJldHVybiBTdHJpbmcoc3RhdGljX2Nhc3Q8VUNoYXIqPihm
c1BhdGhCdWZmZXIpKTsKLQotICAgIGlmICghaXNMaW5rICYmIHVzZWRVUkwpIHsKLSAgICAgICAg
UGF0aFJlbmFtZUV4dGVuc2lvbihmc1BhdGhCdWZmZXIsIGV4dGVuc2lvbik7Ci0gICAgICAgIHJl
dHVybiBTdHJpbmcoc3RhdGljX2Nhc3Q8VUNoYXIqPihmc1BhdGhCdWZmZXIpKTsKLSAgICB9Ci0K
LSAgICByZXR1cm4gbWFrZVN0cmluZyhzdGF0aWNfY2FzdDxjb25zdCBVQ2hhcio+KGZzUGF0aEJ1
ZmZlciksIGV4dGVuc2lvbik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIEhHTE9CQUwgY3JlYXRlR2xv
YmFsSW1hZ2VGaWxlQ29udGVudChTaGFyZWRCdWZmZXIqIGRhdGEpCi17Ci0gICAgSEdMT0JBTCBt
ZW1PYmogPSBHbG9iYWxBbGxvYyhHUFRSLCBkYXRhLT5zaXplKCkpOwotICAgIGlmICghbWVtT2Jq
KSAKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjaGFyKiBmaWxlQ29udGVudHMgPSAoUFNUUilH
bG9iYWxMb2NrKG1lbU9iaik7Ci0KLSAgICBDb3B5TWVtb3J5KGZpbGVDb250ZW50cywgZGF0YS0+
ZGF0YSgpLCBkYXRhLT5zaXplKCkpOwotICAgIAotICAgIEdsb2JhbFVubG9jayhtZW1PYmopOwot
ICAgIAotICAgIHJldHVybiBtZW1PYmo7Ci19Ci0KLXN0YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2Jh
bEhEcm9wQ29udGVudChjb25zdCBLVVJMJiB1cmwsIFN0cmluZyYgZmlsZU5hbWUsIFNoYXJlZEJ1
ZmZlciogZGF0YSkKLXsKLSAgICBpZiAoZmlsZU5hbWUuaXNFbXB0eSgpIHx8ICFkYXRhKQotICAg
ICAgICByZXR1cm4gMDsKLQotICAgIFdDSEFSIGZpbGVQYXRoW01BWF9QQVRIXTsKLQotICAgIGlm
ICh1cmwuaXNMb2NhbEZpbGUoKSkgewotICAgICAgICBTdHJpbmcgbG9jYWxQYXRoID0gZGVjb2Rl
VVJMRXNjYXBlU2VxdWVuY2VzKHVybC5wYXRoKCkpOwotICAgICAgICAvLyB3aW5kb3dzIGRvZXMg
bm90IGVuam95IGEgbGVhZGluZyBzbGFzaCBvbiBwYXRocwotICAgICAgICBpZiAobG9jYWxQYXRo
WzBdID09ICcvJykKLSAgICAgICAgICAgIGxvY2FsUGF0aCA9IGxvY2FsUGF0aC5zdWJzdHJpbmco
MSk7Ci0gICAgICAgIExQQ1dTVFIgbG9jYWxQYXRoU3RyID0gbG9jYWxQYXRoLmNoYXJhY3RlcnNX
aXRoTnVsbFRlcm1pbmF0aW9uKCk7Ci0gICAgICAgIGlmICh3Y3NsZW4obG9jYWxQYXRoU3RyKSAr
IDEgPCBNQVhfUEFUSCkKLSAgICAgICAgICAgIHdjc2NweV9zKGZpbGVQYXRoLCBNQVhfUEFUSCwg
bG9jYWxQYXRoU3RyKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAg
fSBlbHNlIHsKLSNpZiBPUyhXSU5DRSkKLSAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICAg
ICAgcmV0dXJuIDA7Ci0jZWxzZQotICAgICAgICBXQ0hBUiB0ZW1wUGF0aFtNQVhfUEFUSF07Ci0g
ICAgICAgIFdDSEFSIGV4dGVuc2lvbltNQVhfUEFUSF07Ci0gICAgICAgIGlmICghOjpHZXRUZW1w
UGF0aChXVEZfQVJSQVlfTEVOR1RIKHRlbXBQYXRoKSwgdGVtcFBhdGgpKQotICAgICAgICAgICAg
cmV0dXJuIDA7Ci0gICAgICAgIGlmICghOjpQYXRoQXBwZW5kKHRlbXBQYXRoLCBmaWxlTmFtZS5j
aGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKSkKLSAgICAgICAgICAgIHJldHVybiAwOwot
ICAgICAgICBMUENXU1RSIGZvdW5kRXh0ZW5zaW9uID0gOjpQYXRoRmluZEV4dGVuc2lvbih0ZW1w
UGF0aCk7Ci0gICAgICAgIGlmIChmb3VuZEV4dGVuc2lvbikgewotICAgICAgICAgICAgaWYgKHdj
c2NweV9zKGV4dGVuc2lvbiwgTUFYX1BBVEgsIGZvdW5kRXh0ZW5zaW9uKSkKLSAgICAgICAgICAg
ICAgICByZXR1cm4gMDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAqZXh0ZW5zaW9uID0g
MDsKLSAgICAgICAgOjpQYXRoUmVtb3ZlRXh0ZW5zaW9uKHRlbXBQYXRoKTsKLSAgICAgICAgZm9y
IChpbnQgaSA9IDE7IGkgPCAxMDAwMDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoc3dwcmludGZf
cyhmaWxlUGF0aCwgTUFYX1BBVEgsIFRFWFQoIiVzLSVkJXMiKSwgdGVtcFBhdGgsIGksIGV4dGVu
c2lvbikgPT0gLTEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBpZiAo
ITo6UGF0aEZpbGVFeGlzdHMoZmlsZVBhdGgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICB9Ci0gICAgICAgIEhBTkRMRSB0ZW1wRmlsZUhhbmRsZSA9IENyZWF0ZUZpbGUoZmlsZVBh
dGgsIEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUsIDAsIDAsIENSRUFURV9BTFdBWVMsIEZJ
TEVfQVRUUklCVVRFX05PUk1BTCwgMCk7Ci0gICAgICAgIGlmICh0ZW1wRmlsZUhhbmRsZSA9PSBJ
TlZBTElEX0hBTkRMRV9WQUxVRSkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIC8v
IFdyaXRlIHRoZSBkYXRhIHRvIHRoaXMgdGVtcCBmaWxlLgotICAgICAgICBEV09SRCB3cml0dGVu
OwotICAgICAgICBCT09MIHRlbXBXcml0ZVN1Y2NlZWRlZCA9IFdyaXRlRmlsZSh0ZW1wRmlsZUhh
bmRsZSwgZGF0YS0+ZGF0YSgpLCBkYXRhLT5zaXplKCksICZ3cml0dGVuLCAwKTsKLSAgICAgICAg
Q2xvc2VIYW5kbGUodGVtcEZpbGVIYW5kbGUpOwotICAgICAgICBpZiAoIXRlbXBXcml0ZVN1Y2Nl
ZWRlZCkKLSAgICAgICAgICAgIHJldHVybiAwOwotI2VuZGlmCi0gICAgfQotCi0gICAgU0laRV9U
IGRyb3BGaWxlc1NpemUgPSBzaXplb2YoRFJPUEZJTEVTKSArIChzaXplb2YoV0NIQVIpICogKHdj
c2xlbihmaWxlUGF0aCkgKyAyKSk7Ci0gICAgSEdMT0JBTCBtZW1PYmogPSBHbG9iYWxBbGxvYyhH
SE5EIHwgR01FTV9TSEFSRSwgZHJvcEZpbGVzU2l6ZSk7Ci0gICAgaWYgKCFtZW1PYmopIAotICAg
ICAgICByZXR1cm4gMDsKLQotICAgIERST1BGSUxFUyogZHJvcEZpbGVzID0gKERST1BGSUxFUyop
IEdsb2JhbExvY2sobWVtT2JqKTsKLSAgICBkcm9wRmlsZXMtPnBGaWxlcyA9IHNpemVvZihEUk9Q
RklMRVMpOwotICAgIGRyb3BGaWxlcy0+ZldpZGUgPSBUUlVFOwotICAgIHdjc2NweSgoTFBXU1RS
KShkcm9wRmlsZXMgKyAxKSwgZmlsZVBhdGgpOyAgICAKLSAgICBHbG9iYWxVbmxvY2sobWVtT2Jq
KTsKLSAgICAKLSAgICByZXR1cm4gbWVtT2JqOwotfQotCi1zdGF0aWMgSEdMT0JBTCBjcmVhdGVH
bG9iYWxJbWFnZUZpbGVEZXNjcmlwdG9yKGNvbnN0IFN0cmluZyYgdXJsLCBjb25zdCBTdHJpbmcm
IHRpdGxlLCBDYWNoZWRJbWFnZSogaW1hZ2UpCi17Ci0gICAgQVNTRVJUX0FSRyhpbWFnZSwgaW1h
Z2UpOwotICAgIEFTU0VSVChpbWFnZS0+aW1hZ2UoKS0+ZGF0YSgpKTsKLQotICAgIEhSRVNVTFQg
aHIgPSBTX09LOwotICAgIEhHTE9CQUwgbWVtT2JqID0gMDsKLSAgICBTdHJpbmcgZnNQYXRoOwot
ICAgIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdQVFIsIHNpemVvZihGSUxFR1JPVVBERVNDUklQVE9S
KSk7Ci0gICAgaWYgKCFtZW1PYmopCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgRklMRUdST1VQ
REVTQ1JJUFRPUiogZmdkID0gKEZJTEVHUk9VUERFU0NSSVBUT1IqKUdsb2JhbExvY2sobWVtT2Jq
KTsKLSAgICBtZW1zZXQoZmdkLCAwLCBzaXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOwotICAg
IGZnZC0+Y0l0ZW1zID0gMTsKLSAgICBmZ2QtPmZnZFswXS5kd0ZsYWdzID0gRkRfRklMRVNJWkU7
Ci0gICAgZmdkLT5mZ2RbMF0ubkZpbGVTaXplTG93ID0gaW1hZ2UtPmltYWdlKCktPmRhdGEoKS0+
c2l6ZSgpOwotICAgIAotICAgIGNvbnN0IFN0cmluZyYgcHJlZmVycmVkVGl0bGUgPSB0aXRsZS5p
c0VtcHR5KCkgPyBpbWFnZS0+cmVzcG9uc2UoKS5zdWdnZXN0ZWRGaWxlbmFtZSgpIDogdGl0bGU7
Ci0gICAgU3RyaW5nIGV4dGVuc2lvbiA9IGltYWdlLT5pbWFnZSgpLT5maWxlbmFtZUV4dGVuc2lv
bigpOwotICAgIGlmIChleHRlbnNpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vIERvIG5vdCBj
b250aW51ZSBwcm9jZXNzaW5nIGluIHRoZSByYXJlIGFuZCB1bnVzdWFsIGNhc2Ugd2hlcmUgYSBk
ZWNvZGVkIGltYWdlIGlzIG5vdCBhYmxlIAotICAgICAgICAvLyB0byBwcm92aWRlIGEgZmlsZW5h
bWUgZXh0ZW5zaW9uLiBTb21ldGhpbmcgdHJpY2t5IChsaWtlIGEgYmFpdC1uLXN3aXRjaCkgaXMg
Z29pbmcgb24KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGV4dGVuc2lvbi5pbnNlcnQo
Ii4iLCAwKTsKLSAgICBmc1BhdGggPSBmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRpdGxlKHVybCwg
cHJlZmVycmVkVGl0bGUsIGV4dGVuc2lvbi5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigp
LCBmYWxzZSk7Ci0KLSAgICBpZiAoZnNQYXRoLmxlbmd0aCgpIDw9IDApIHsKLSAgICAgICAgR2xv
YmFsVW5sb2NrKG1lbU9iaik7Ci0gICAgICAgIEdsb2JhbEZyZWUobWVtT2JqKTsKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaW50IG1heFNpemUgPSBtaW4oZnNQYXRoLmxlbmd0aCgp
LCBXVEZfQVJSQVlfTEVOR1RIKGZnZC0+ZmdkWzBdLmNGaWxlTmFtZSkpOwotICAgIENvcHlNZW1v
cnkoZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lLCAoTFBDV1NUUilmc1BhdGguY2hhcmFjdGVycygpLCBt
YXhTaXplICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgR2xvYmFsVW5sb2NrKG1lbU9iaik7Ci0gICAg
Ci0gICAgcmV0dXJuIG1lbU9iajsKLX0KLQotCi0vLyB3cml0ZUZpbGVUb0RhdGFPYmplY3QgdGFr
ZXMgb3duZXJzaGlwIG9mIGZpbGVEZXNjcmlwdG9yIGFuZCBmaWxlQ29udGVudAotc3RhdGljIEhS
RVNVTFQgd3JpdGVGaWxlVG9EYXRhT2JqZWN0KElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBIR0xP
QkFMIGZpbGVEZXNjcmlwdG9yLCBIR0xPQkFMIGZpbGVDb250ZW50LCBIR0xPQkFMIGhEcm9wQ29u
dGVudCkKLXsKLSAgICBIUkVTVUxUIGhyID0gU19PSzsKLSAgICBGT1JNQVRFVEMqIGZlOwotICAg
IFNUR01FRElVTSBtZWRpdW0gPSB7MH07Ci0gICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JB
TDsKLQotICAgIGlmICghZmlsZURlc2NyaXB0b3IgfHwgIWZpbGVDb250ZW50KQotICAgICAgICBn
b3RvIGV4aXQ7Ci0KLSAgICAvLyBEZXNjcmlwdG9yCi0gICAgZmUgPSBmaWxlRGVzY3JpcHRvckZv
cm1hdCgpOwotCi0gICAgbWVkaXVtLmhHbG9iYWwgPSBmaWxlRGVzY3JpcHRvcjsKLQotICAgIGlm
IChGQUlMRUQoaHIgPSBkYXRhT2JqZWN0LT5TZXREYXRhKGZlLCAmbWVkaXVtLCBUUlVFKSkpCi0g
ICAgICAgIGdvdG8gZXhpdDsKLQotICAgIC8vIENvbnRlbnRzCi0gICAgZmUgPSBmaWxlQ29udGVu
dEZvcm1hdFplcm8oKTsKLSAgICBtZWRpdW0uaEdsb2JhbCA9IGZpbGVDb250ZW50OwotICAgIGlm
IChGQUlMRUQoaHIgPSBkYXRhT2JqZWN0LT5TZXREYXRhKGZlLCAmbWVkaXVtLCBUUlVFKSkpCi0g
ICAgICAgIGdvdG8gZXhpdDsKLQotI2lmIFVTRShDRikKLSAgICAvLyBIRFJPUAotICAgIGlmICho
RHJvcENvbnRlbnQpIHsKLSAgICAgICAgbWVkaXVtLmhHbG9iYWwgPSBoRHJvcENvbnRlbnQ7Ci0g
ICAgICAgIGhyID0gZGF0YU9iamVjdC0+U2V0RGF0YShjZkhEcm9wRm9ybWF0KCksICZtZWRpdW0s
IFRSVUUpOwotICAgIH0KLSNlbmRpZgotCi1leGl0OgotICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0g
ICAgICAgIGlmIChmaWxlRGVzY3JpcHRvcikKLSAgICAgICAgICAgIEdsb2JhbEZyZWUoZmlsZURl
c2NyaXB0b3IpOwotICAgICAgICBpZiAoZmlsZUNvbnRlbnQpCi0gICAgICAgICAgICBHbG9iYWxG
cmVlKGZpbGVDb250ZW50KTsKLSAgICAgICAgaWYgKGhEcm9wQ29udGVudCkKLSAgICAgICAgICAg
IEdsb2JhbEZyZWUoaERyb3BDb250ZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIGhyOwotfQotCi1Q
YXNzUmVmUHRyPENsaXBib2FyZD4gQ2xpcGJvYXJkOjpjcmVhdGUoQ2xpcGJvYXJkQWNjZXNzUG9s
aWN5IHBvbGljeSwgRHJhZ0RhdGEqIGRyYWdEYXRhLCBGcmFtZSogZnJhbWUpCi17Ci0gICAgaWYg
KGRyYWdEYXRhLT5wbGF0Zm9ybURhdGEoKSkKLSAgICAgICAgcmV0dXJuIENsaXBib2FyZFdpbjo6
Y3JlYXRlKERyYWdBbmREcm9wLCBkcmFnRGF0YS0+cGxhdGZvcm1EYXRhKCksIHBvbGljeSwgZnJh
bWUpOwotICAgIHJldHVybiBDbGlwYm9hcmRXaW46OmNyZWF0ZShEcmFnQW5kRHJvcCwgZHJhZ0Rh
dGEtPmRyYWdEYXRhTWFwKCksIHBvbGljeSwgZnJhbWUpOwotfQotCi1DbGlwYm9hcmRXaW46OkNs
aXBib2FyZFdpbihDbGlwYm9hcmRUeXBlIGNsaXBib2FyZFR5cGUsIElEYXRhT2JqZWN0KiBkYXRh
T2JqZWN0LCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBGcmFtZSogZnJhbWUpCi0gICAg
OiBDbGlwYm9hcmQocG9saWN5LCBjbGlwYm9hcmRUeXBlKQotICAgICwgbV9kYXRhT2JqZWN0KGRh
dGFPYmplY3QpCi0gICAgLCBtX3dyaXRhYmxlRGF0YU9iamVjdCgwKQotICAgICwgbV9mcmFtZShm
cmFtZSkKLXsKLX0KLQotQ2xpcGJvYXJkV2luOjpDbGlwYm9hcmRXaW4oQ2xpcGJvYXJkVHlwZSBj
bGlwYm9hcmRUeXBlLCBXQ0RhdGFPYmplY3QqIGRhdGFPYmplY3QsIENsaXBib2FyZEFjY2Vzc1Bv
bGljeSBwb2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAgICA6IENsaXBib2FyZChwb2xpY3ksIGNsaXBi
b2FyZFR5cGUpCi0gICAgLCBtX2RhdGFPYmplY3QoZGF0YU9iamVjdCkKLSAgICAsIG1fd3JpdGFi
bGVEYXRhT2JqZWN0KGRhdGFPYmplY3QpCi0gICAgLCBtX2ZyYW1lKGZyYW1lKQotewotfQotCi1D
bGlwYm9hcmRXaW46OkNsaXBib2FyZFdpbihDbGlwYm9hcmRUeXBlIGNsaXBib2FyZFR5cGUsIGNv
bnN0IERyYWdEYXRhTWFwJiBkYXRhTWFwLCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBG
cmFtZSogZnJhbWUpCi0gICAgOiBDbGlwYm9hcmQocG9saWN5LCBjbGlwYm9hcmRUeXBlKQotICAg
ICwgbV9kYXRhT2JqZWN0KDApCi0gICAgLCBtX3dyaXRhYmxlRGF0YU9iamVjdCgwKQotICAgICwg
bV9mcmFtZShmcmFtZSkKLSAgICAsIG1fZHJhZ0RhdGFNYXAoZGF0YU1hcCkKLXsKLX0KLQotQ2xp
cGJvYXJkV2luOjp+Q2xpcGJvYXJkV2luKCkKLXsKLSAgICBpZiAobV9kcmFnSW1hZ2UpCi0gICAg
ICAgIG1fZHJhZ0ltYWdlLT5yZW1vdmVDbGllbnQodGhpcyk7Ci19Ci0KLXN0YXRpYyBib29sIHdy
aXRlVVJMKFdDRGF0YU9iamVjdCAqZGF0YSwgY29uc3QgS1VSTCYgdXJsLCBTdHJpbmcgdGl0bGUs
IGJvb2wgd2l0aFBsYWluVGV4dCwgYm9vbCB3aXRoSFRNTCkKLXsKLSAgICBBU1NFUlQoZGF0YSk7
Ci0KLSAgICBpZiAodXJsLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAot
ICAgIGlmICh0aXRsZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgdGl0bGUgPSB1cmwubGFzdFBhdGhD
b21wb25lbnQoKTsKLSAgICAgICAgaWYgKHRpdGxlLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHRp
dGxlID0gdXJsLmhvc3QoKTsKLSAgICB9Ci0KLSAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9Owot
ICAgIG1lZGl1bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7Ci0KLSAgICBtZWRpdW0uaEdsb2JhbCA9
IGNyZWF0ZUdsb2JhbERhdGEodXJsLCB0aXRsZSk7Ci0gICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7
Ci0gICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChkYXRhLT5TZXREYXRhKHVybFdGb3Jt
YXQoKSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9i
YWwpOwotICAgIGVsc2UKLSAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0KLSAgICBpZiAod2l0aEhU
TUwpIHsKLSAgICAgICAgVmVjdG9yPGNoYXI+IGNmaHRtbERhdGE7Ci0gICAgICAgIG1hcmt1cFRv
Q0ZIVE1MKHVybFRvTWFya3VwKHVybCwgdGl0bGUpLCAiIiwgY2ZodG1sRGF0YSk7Ci0gICAgICAg
IG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YShjZmh0bWxEYXRhKTsKLSAgICAgICAg
aWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChkYXRhLT5TZXREYXRhKGh0bWxGb3JtYXQoKSwg
Jm1lZGl1bSwgVFJVRSkpKQotICAgICAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFs
KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgfQotCi0g
ICAgaWYgKHdpdGhQbGFpblRleHQpIHsKLSAgICAgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVH
bG9iYWxEYXRhKHVybC5zdHJpbmcoKSk7Ci0gICAgICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBG
QUlMRUQoZGF0YS0+U2V0RGF0YShwbGFpblRleHRXRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkK
LSAgICAgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7Ci0gICAgICAgIGVsc2UK
LSAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBzdWNjZXNz
OwotfQotCi12b2lkIENsaXBib2FyZFdpbjo6Y2xlYXJEYXRhKGNvbnN0IFN0cmluZyYgdHlwZSkK
LXsKLSAgICAvLyBGSVhNRTogTmVlZCB0byBiZSBhYmxlIHRvIHdyaXRlIHRvIHRoZSBzeXN0ZW0g
Y2xpcGJvYXJkIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQxPgotICAgIEFTU0VSVChpc0ZvckRyYWdB
bmREcm9wKCkpOwotICAgIGlmICghY2FuV3JpdGVEYXRhKCkgfHwgIW1fd3JpdGFibGVEYXRhT2Jq
ZWN0KQotICAgICAgICByZXR1cm47Ci0KLSAgICBDbGlwYm9hcmREYXRhVHlwZSBkYXRhVHlwZSA9
IGNsaXBib2FyZFR5cGVGcm9tTUlNRVR5cGUodHlwZSk7Ci0KLSAgICBpZiAoZGF0YVR5cGUgPT0g
Q2xpcGJvYXJkRGF0YVR5cGVVUkwpIHsKLSAgICAgICAgbV93cml0YWJsZURhdGFPYmplY3QtPmNs
ZWFyRGF0YSh1cmxXRm9ybWF0KCktPmNmRm9ybWF0KTsKLSAgICAgICAgbV93cml0YWJsZURhdGFP
YmplY3QtPmNsZWFyRGF0YSh1cmxGb3JtYXQoKS0+Y2ZGb3JtYXQpOwotICAgIH0KLSAgICBpZiAo
ZGF0YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KSB7Ci0gICAgICAgIG1fd3JpdGFibGVE
YXRhT2JqZWN0LT5jbGVhckRhdGEocGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0KTsKLSAgICAg
ICAgbV93cml0YWJsZURhdGFPYmplY3QtPmNsZWFyRGF0YShwbGFpblRleHRXRm9ybWF0KCktPmNm
Rm9ybWF0KTsKLSAgICB9Ci0KLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OmNsZWFyRGF0YSgpCi17
Ci0gICAgLy8gRklYTUU6IE5lZWQgdG8gYmUgYWJsZSB0byB3cml0ZSB0byB0aGUgc3lzdGVtIGNs
aXBib2FyZCA8cmRhcjovL3Byb2JsZW0vNTAxNTk0MT4KLSAgICBBU1NFUlQoaXNGb3JEcmFnQW5k
RHJvcCgpKTsKLSAgICBpZiAoIWNhbldyaXRlRGF0YSgpKQotICAgICAgICByZXR1cm47Ci0gICAg
Ci0gICAgbV93cml0YWJsZURhdGFPYmplY3QgPSAwOwotICAgIFdDRGF0YU9iamVjdDo6Y3JlYXRl
SW5zdGFuY2UoJm1fd3JpdGFibGVEYXRhT2JqZWN0KTsKLSAgICBtX2RhdGFPYmplY3QgPSBtX3dy
aXRhYmxlRGF0YU9iamVjdDsKLX0KLQotU3RyaW5nIENsaXBib2FyZFdpbjo6Z2V0RGF0YShjb25z
dCBTdHJpbmcmIHR5cGUpIGNvbnN0Ci17ICAgICAKLSAgICBpZiAoIWNhblJlYWREYXRhKCkgfHwg
KCFtX2RhdGFPYmplY3QgJiYgbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCkpKQotICAgICAgICByZXR1
cm4gIiI7Ci0KLSAgICBDbGlwYm9hcmREYXRhVHlwZSBkYXRhVHlwZSA9IGNsaXBib2FyZFR5cGVG
cm9tTUlNRVR5cGUodHlwZSk7Ci0gICAgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBl
VGV4dCkKLSAgICAgICAgcmV0dXJuIG1fZGF0YU9iamVjdCA/IGdldFBsYWluVGV4dChtX2RhdGFP
YmplY3QuZ2V0KCkpIDogZ2V0UGxhaW5UZXh0KCZtX2RyYWdEYXRhTWFwKTsKLSAgICBpZiAoZGF0
YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVVUkwpCi0gICAgICAgIHJldHVybiBtX2RhdGFPYmpl
Y3QgPyBnZXRVUkwobV9kYXRhT2JqZWN0LmdldCgpLCBEcmFnRGF0YTo6RG9Ob3RDb252ZXJ0Rmls
ZW5hbWVzKSA6IGdldFVSTCgmbV9kcmFnRGF0YU1hcCwgRHJhZ0RhdGE6OkRvTm90Q29udmVydEZp
bGVuYW1lcyk7Ci0gICAgZWxzZSBpZiAoZGF0YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0
SFRNTCkgewotICAgICAgICBTdHJpbmcgZGF0YSA9IG1fZGF0YU9iamVjdCA/IGdldFRleHRIVE1M
KG1fZGF0YU9iamVjdC5nZXQoKSkgOiBnZXRUZXh0SFRNTCgmbV9kcmFnRGF0YU1hcCk7Ci0gICAg
ICAgIGlmICghZGF0YS5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gZGF0YTsKLSAgICAg
ICAgcmV0dXJuIG1fZGF0YU9iamVjdCA/IGdldENGSFRNTChtX2RhdGFPYmplY3QuZ2V0KCkpIDog
Z2V0Q0ZIVE1MKCZtX2RyYWdEYXRhTWFwKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuICIiOwot
fQotCi1ib29sIENsaXBib2FyZFdpbjo6c2V0RGF0YShjb25zdCBTdHJpbmcmIHR5cGUsIGNvbnN0
IFN0cmluZyYgZGF0YSkKLXsKLSAgICAvLyBGSVhNRTogTmVlZCB0byBiZSBhYmxlIHRvIHdyaXRl
IHRvIHRoZSBzeXN0ZW0gY2xpcGJvYXJkIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQxPgotICAgIEFT
U0VSVChpc0ZvckRyYWdBbmREcm9wKCkpOwotICAgIGlmICghY2FuV3JpdGVEYXRhKCkgfHwgIW1f
d3JpdGFibGVEYXRhT2JqZWN0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDbGlwYm9h
cmREYXRhVHlwZSB3aW5UeXBlID0gY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZSh0eXBlKTsKLQot
ICAgIGlmICh3aW5UeXBlID09IENsaXBib2FyZERhdGFUeXBlVVJMKQotICAgICAgICByZXR1cm4g
V2ViQ29yZTo6d3JpdGVVUkwobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIEtVUkwoUGFyc2Vk
VVJMU3RyaW5nLCBkYXRhKSwgU3RyaW5nKCksIGZhbHNlLCB0cnVlKTsKLQotICAgIGlmICh3aW5U
eXBlID09IENsaXBib2FyZERhdGFUeXBlVGV4dCkgewotICAgICAgICBTVEdNRURJVU0gbWVkaXVt
ID0gezB9OwotICAgICAgICBtZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOwotICAgICAgICBt
ZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7Ci0gICAgICAgIGlmICghbWVk
aXVtLmhHbG9iYWwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKEZB
SUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShwbGFpblRleHRXRm9ybWF0KCksICZt
ZWRpdW0sIFRSVUUpKSkgewotICAgICAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFs
KTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZE1p
bWVUeXBlc0ZvckZvcm1hdChMaXN0SGFzaFNldDxTdHJpbmc+JiByZXN1bHRzLCBjb25zdCBGT1JN
QVRFVEMmIGZvcm1hdCkKLXsKLSAgICAvLyBVUkwgYW5kIFRleHQgYXJlIHByb3ZpZGVkIGZvciBj
b21wYXRpYmlsaXR5IHdpdGggSUUncyBtb2RlbAotICAgIGlmIChmb3JtYXQuY2ZGb3JtYXQgPT0g
dXJsRm9ybWF0KCktPmNmRm9ybWF0IHx8IGZvcm1hdC5jZkZvcm1hdCA9PSB1cmxXRm9ybWF0KCkt
PmNmRm9ybWF0KSB7Ci0gICAgICAgIHJlc3VsdHMuYWRkKCJVUkwiKTsKLSAgICAgICAgcmVzdWx0
cy5hZGQoInRleHQvdXJpLWxpc3QiKTsKLSAgICB9Ci0KLSAgICBpZiAoZm9ybWF0LmNmRm9ybWF0
ID09IHBsYWluVGV4dFdGb3JtYXQoKS0+Y2ZGb3JtYXQgfHwgZm9ybWF0LmNmRm9ybWF0ID09IHBs
YWluVGV4dEZvcm1hdCgpLT5jZkZvcm1hdCkgewotICAgICAgICByZXN1bHRzLmFkZCgiVGV4dCIp
OwotICAgICAgICByZXN1bHRzLmFkZCgidGV4dC9wbGFpbiIpOwotICAgIH0KLX0KLQotLy8gZXh0
ZW5zaW9ucyBiZXlvbmQgSUUncyBBUEkKLUxpc3RIYXNoU2V0PFN0cmluZz4gQ2xpcGJvYXJkV2lu
Ojp0eXBlcygpIGNvbnN0Ci17IAotICAgIExpc3RIYXNoU2V0PFN0cmluZz4gcmVzdWx0czsKLSAg
ICBpZiAoIWNhblJlYWRUeXBlcygpKQotICAgICAgICByZXR1cm4gcmVzdWx0czsKLQotICAgIGlm
ICghbV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQotICAgICAgICByZXR1
cm4gcmVzdWx0czsKLQotICAgIGlmIChtX2RhdGFPYmplY3QpIHsKLSAgICAgICAgQ09NUHRyPElF
bnVtRk9STUFURVRDPiBpdHI7Ci0KLSAgICAgICAgaWYgKEZBSUxFRChtX2RhdGFPYmplY3QtPkVu
dW1Gb3JtYXRFdGMoREFUQURJUl9HRVQsICZpdHIpKSkKLSAgICAgICAgICAgIHJldHVybiByZXN1
bHRzOwotCi0gICAgICAgIGlmICghaXRyKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0K
LSAgICAgICAgRk9STUFURVRDIGRhdGE7Ci0KLSAgICAgICAgLy8gSUVudW1GT1JNQVRFVEM6Ok5l
eHQgcmV0dXJucyBTX0ZBTFNFIGlmIHRoZXJlIGFyZSBubyBtb3JlIGl0ZW1zLgotICAgICAgICB3
aGlsZSAoaXRyLT5OZXh0KDEsICZkYXRhLCAwKSA9PSBTX09LKQotICAgICAgICAgICAgYWRkTWlt
ZVR5cGVzRm9yRm9ybWF0KHJlc3VsdHMsIGRhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZv
ciAoRHJhZ0RhdGFNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9kcmFnRGF0YU1hcC5iZWdpbigp
OyBpdCAhPSBtX2RyYWdEYXRhTWFwLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICBGT1JNQVRF
VEMgZGF0YTsKLSAgICAgICAgICAgIGRhdGEuY2ZGb3JtYXQgPSAoKml0KS5rZXk7Ci0gICAgICAg
ICAgICBhZGRNaW1lVHlwZXNGb3JGb3JtYXQocmVzdWx0cywgZGF0YSk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0czsKLX0KLQotUGFzc1JlZlB0cjxGaWxlTGlzdD4gQ2xp
cGJvYXJkV2luOjpmaWxlcygpIGNvbnN0Ci17Ci0jaWYgVVNFKENGKQotICAgIFJlZlB0cjxGaWxl
TGlzdD4gZmlsZXMgPSBGaWxlTGlzdDo6Y3JlYXRlKCk7Ci0gICAgaWYgKCFjYW5SZWFkRGF0YSgp
KQotICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgpOwotCi0gICAgaWYgKCFtX2RhdGFPYmpl
Y3QgJiYgbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBmaWxlcy5yZWxl
YXNlKCk7Ci0KLSAgICBpZiAobV9kYXRhT2JqZWN0KSB7Ci0gICAgICAgIFNUR01FRElVTSBtZWRp
dW07Ci0gICAgICAgIGlmIChGQUlMRUQobV9kYXRhT2JqZWN0LT5HZXREYXRhKGNmSERyb3BGb3Jt
YXQoKSwgJm1lZGl1bSkpKQotICAgICAgICAgICAgcmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKLQot
ICAgICAgICBIRFJPUCBoZHJvcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8SERST1A+KEdsb2JhbExvY2so
bWVkaXVtLmhHbG9iYWwpKTsKLSAgICAgICAgaWYgKCFoZHJvcCkKLSAgICAgICAgICAgIHJldHVy
biBmaWxlcy5yZWxlYXNlKCk7Ci0KLSAgICAgICAgV0NIQVIgZmlsZW5hbWVbTUFYX1BBVEhdOwot
ICAgICAgICBVSU5UIGZpbGVDb3VudCA9IERyYWdRdWVyeUZpbGVXKGhkcm9wLCAweEZGRkZGRkZG
LCAwLCAwKTsKLSAgICAgICAgZm9yIChVSU5UIGkgPSAwOyBpIDwgZmlsZUNvdW50OyBpKyspIHsK
LSAgICAgICAgICAgIGlmICghRHJhZ1F1ZXJ5RmlsZVcoaGRyb3AsIGksIGZpbGVuYW1lLCBXVEZf
QVJSQVlfTEVOR1RIKGZpbGVuYW1lKSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgICAgICBmaWxlcy0+YXBwZW5kKEZpbGU6OmNyZWF0ZShyZWludGVycHJldF9jYXN0PFVDaGFy
Kj4oZmlsZW5hbWUpLCBGaWxlOjpBbGxDb250ZW50VHlwZXMpKTsKLSAgICAgICAgfQotCi0gICAg
ICAgIEdsb2JhbFVubG9jayhtZWRpdW0uaEdsb2JhbCk7Ci0gICAgICAgIFJlbGVhc2VTdGdNZWRp
dW0oJm1lZGl1bSk7Ci0gICAgICAgIHJldHVybiBmaWxlcy5yZWxlYXNlKCk7Ci0gICAgfQotICAg
IGlmICghbV9kcmFnRGF0YU1hcC5jb250YWlucyhjZkhEcm9wRm9ybWF0KCktPmNmRm9ybWF0KSkK
LSAgICAgICAgcmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKLSAgICBWZWN0b3I8U3RyaW5nPiBmaWxl
c1ZlY3RvciA9IG1fZHJhZ0RhdGFNYXAuZ2V0KGNmSERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQpOwot
ICAgIGZvciAoVmVjdG9yPFN0cmluZz46Oml0ZXJhdG9yIGl0ID0gZmlsZXNWZWN0b3IuYmVnaW4o
KTsgaXQgIT0gZmlsZXNWZWN0b3IuZW5kKCk7ICsraXQpCi0gICAgICAgIGZpbGVzLT5hcHBlbmQo
RmlsZTo6Y3JlYXRlKCppdCkpOwotICAgIHJldHVybiBmaWxlcy5yZWxlYXNlKCk7Ci0jZWxzZQot
ICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotdm9pZCBD
bGlwYm9hcmRXaW46OnNldERyYWdJbWFnZShDYWNoZWRJbWFnZSogaW1hZ2UsIE5vZGUgKm5vZGUs
IGNvbnN0IEludFBvaW50ICZsb2MpCi17Ci0gICAgaWYgKCFjYW5TZXREcmFnSW1hZ2UoKSkKLSAg
ICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICBpZiAobV9kcmFnSW1hZ2UpCi0gICAgICAgIG1f
ZHJhZ0ltYWdlLT5yZW1vdmVDbGllbnQodGhpcyk7Ci0gICAgbV9kcmFnSW1hZ2UgPSBpbWFnZTsK
LSAgICBpZiAobV9kcmFnSW1hZ2UpCi0gICAgICAgIG1fZHJhZ0ltYWdlLT5hZGRDbGllbnQodGhp
cyk7Ci0KLSAgICBtX2RyYWdMb2MgPSBsb2M7Ci0gICAgbV9kcmFnSW1hZ2VFbGVtZW50ID0gbm9k
ZTsKLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OnNldERyYWdJbWFnZShDYWNoZWRJbWFnZSogaW1n
LCBjb25zdCBJbnRQb2ludCAmbG9jKQotewotICAgIHNldERyYWdJbWFnZShpbWcsIDAsIGxvYyk7
Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjpzZXREcmFnSW1hZ2VFbGVtZW50KE5vZGUgKm5vZGUs
IGNvbnN0IEludFBvaW50ICZsb2MpCi17Ci0gICAgc2V0RHJhZ0ltYWdlKDAsIG5vZGUsIGxvYyk7
Ci19Ci0KLURyYWdJbWFnZVJlZiBDbGlwYm9hcmRXaW46OmNyZWF0ZURyYWdJbWFnZShJbnRQb2lu
dCYgbG9jKSBjb25zdAotewogICAgIEhCSVRNQVAgcmVzdWx0ID0gMDsKICAgICBpZiAobV9kcmFn
SW1hZ2UpIHsKICNpZiBVU0UoQ0FJUk8pIHx8IFVTRShDRykKICAgICAgICAgcmVzdWx0ID0gY3Jl
YXRlRHJhZ0ltYWdlRnJvbUltYWdlKG1fZHJhZ0ltYWdlLT5pbWFnZSgpKTsgICAgICAgIAotICAg
ICAgICBsb2MgPSBtX2RyYWdMb2M7CisgICAgICAgIGRyYWdMb2NhdGlvbiA9IG1fZHJhZ0xvYzsK
ICNlbHNlCiAgICAgICAgIG5vdEltcGxlbWVudGVkKCk7CiAjZW5kaWYKICAgICB9IGVsc2UgaWYg
KG1fZHJhZ0ltYWdlRWxlbWVudCkgewogICAgICAgICBOb2RlKiBub2RlID0gbV9kcmFnSW1hZ2VF
bGVtZW50LmdldCgpOwogICAgICAgICByZXN1bHQgPSBub2RlLT5kb2N1bWVudCgpLT5mcmFtZSgp
LT5ub2RlSW1hZ2Uobm9kZSk7Ci0gICAgICAgIGxvYyA9IG1fZHJhZ0xvYzsKKyAgICAgICAgZHJh
Z0xvY2F0aW9uID0gbV9kcmFnTG9jOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1z
dGF0aWMgQ2FjaGVkSW1hZ2UqIGdldENhY2hlZEltYWdlKEVsZW1lbnQqIGVsZW1lbnQpCit2b2lk
IENsaXBib2FyZDo6ZGVjbGFyZUFuZFdyaXRlRHJhZ0ltYWdlKEVsZW1lbnQqIGVsZW1lbnQsIGNv
bnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgRnJhbWUqIGZyYW1lKQogewotICAg
IC8vIEF0dGVtcHQgdG8gcHVsbCBDYWNoZWRJbWFnZSBmcm9tIGVsZW1lbnQKLSAgICBBU1NFUlQo
ZWxlbWVudCk7Ci0gICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGVsZW1lbnQtPnJlbmRlcmVy
KCk7Ci0gICAgaWYgKCFyZW5kZXJlciB8fCAhcmVuZGVyZXItPmlzSW1hZ2UoKSkgCi0gICAgICAg
IHJldHVybiAwOwotICAgIAotICAgIFJlbmRlckltYWdlKiBpbWFnZSA9IHRvUmVuZGVySW1hZ2Uo
cmVuZGVyZXIpOwotICAgIGlmIChpbWFnZS0+Y2FjaGVkSW1hZ2UoKSAmJiAhaW1hZ2UtPmNhY2hl
ZEltYWdlKCktPmVycm9yT2NjdXJyZWQoKSkKLSAgICAgICAgcmV0dXJuIGltYWdlLT5jYWNoZWRJ
bWFnZSgpOwotCi0gICAgcmV0dXJuIDA7CisgICAgbV9wYXN0ZWJvYXJkLT5kZWNsYXJlQW5kV3Jp
dGVEcmFnSW1hZ2UoZWxlbWVudCwgdXJsLCB0aXRsZSwgZnJhbWUpOwogfQogCi1zdGF0aWMgdm9p
ZCB3cml0ZUltYWdlVG9EYXRhT2JqZWN0KElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBFbGVtZW50
KiBlbGVtZW50LCBjb25zdCBLVVJMJiB1cmwpCi17Ci0gICAgLy8gU2hvdmUgaW1hZ2UgZGF0YSBp
bnRvIGEgRGF0YU9iamVjdCBmb3IgdXNlIGFzIGEgZmlsZQotICAgIENhY2hlZEltYWdlKiBjYWNo
ZWRJbWFnZSA9IGdldENhY2hlZEltYWdlKGVsZW1lbnQpOwotICAgIGlmICghY2FjaGVkSW1hZ2Ug
fHwgIWNhY2hlZEltYWdlLT5pbWFnZUZvclJlbmRlcmVyKGVsZW1lbnQtPnJlbmRlcmVyKCkpIHx8
ICFjYWNoZWRJbWFnZS0+aXNMb2FkZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU2hhcmVk
QnVmZmVyKiBpbWFnZUJ1ZmZlciA9IGNhY2hlZEltYWdlLT5pbWFnZUZvclJlbmRlcmVyKGVsZW1l
bnQtPnJlbmRlcmVyKCkpLT5kYXRhKCk7Ci0gICAgaWYgKCFpbWFnZUJ1ZmZlciB8fCAhaW1hZ2VC
dWZmZXItPnNpemUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgSEdMT0JBTCBpbWFnZUZpbGVE
ZXNjcmlwdG9yID0gY3JlYXRlR2xvYmFsSW1hZ2VGaWxlRGVzY3JpcHRvcih1cmwuc3RyaW5nKCks
IGVsZW1lbnQtPmdldEF0dHJpYnV0ZShhbHRBdHRyKSwgY2FjaGVkSW1hZ2UpOwotICAgIGlmICgh
aW1hZ2VGaWxlRGVzY3JpcHRvcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgSEdMT0JBTCBpbWFn
ZUZpbGVDb250ZW50ID0gY3JlYXRlR2xvYmFsSW1hZ2VGaWxlQ29udGVudChpbWFnZUJ1ZmZlcik7
Ci0gICAgaWYgKCFpbWFnZUZpbGVDb250ZW50KSB7Ci0gICAgICAgIEdsb2JhbEZyZWUoaW1hZ2VG
aWxlRGVzY3JpcHRvcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZmls
ZU5hbWUgPSBjYWNoZWRJbWFnZS0+cmVzcG9uc2UoKS5zdWdnZXN0ZWRGaWxlbmFtZSgpOwotICAg
IEhHTE9CQUwgaERyb3BDb250ZW50ID0gY3JlYXRlR2xvYmFsSERyb3BDb250ZW50KHVybCwgZmls
ZU5hbWUsIGltYWdlQnVmZmVyKTsKLSAgICBpZiAoIWhEcm9wQ29udGVudCkgewotICAgICAgICBH
bG9iYWxGcmVlKGhEcm9wQ29udGVudCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3
cml0ZUZpbGVUb0RhdGFPYmplY3QoZGF0YU9iamVjdCwgaW1hZ2VGaWxlRGVzY3JpcHRvciwgaW1h
Z2VGaWxlQ29udGVudCwgaERyb3BDb250ZW50KTsKLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OmRl
Y2xhcmVBbmRXcml0ZURyYWdJbWFnZShFbGVtZW50KiBlbGVtZW50LCBjb25zdCBLVVJMJiB1cmws
IGNvbnN0IFN0cmluZyYgdGl0bGUsIEZyYW1lKiBmcmFtZSkKLXsKLSAgICAvLyBPcmRlciBpcyBp
bXBvcnRhbnQgaGVyZSBmb3IgRXhwbG9yZXIncyBzYWtlCi0gICAgaWYgKCFtX3dyaXRhYmxlRGF0
YU9iamVjdCkKLSAgICAgICAgIHJldHVybjsKLSAgICBXZWJDb3JlOjp3cml0ZVVSTChtX3dyaXRh
YmxlRGF0YU9iamVjdC5nZXQoKSwgdXJsLCB0aXRsZSwgdHJ1ZSwgZmFsc2UpOwotCi0gICAgd3Jp
dGVJbWFnZVRvRGF0YU9iamVjdChtX3dyaXRhYmxlRGF0YU9iamVjdC5nZXQoKSwgZWxlbWVudCwg
dXJsKTsKLQotICAgIEF0b21pY1N0cmluZyBpbWFnZVVSTCA9IGVsZW1lbnQtPmdldEF0dHJpYnV0
ZShzcmNBdHRyKTsKLSAgICBpZiAoaW1hZ2VVUkwuaXNFbXB0eSgpKSAKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgS1VSTCBmdWxsVVJMID0gZnJhbWUtPmRvY3VtZW50KCktPmNvbXBsZXRlVVJMKHN0
cmlwTGVhZGluZ0FuZFRyYWlsaW5nSFRNTFNwYWNlcyhpbWFnZVVSTCkpOwotICAgIGlmIChmdWxs
VVJMLmlzRW1wdHkoKSkgCi0gICAgICAgIHJldHVybjsKLSAgICBTVEdNRURJVU0gbWVkaXVtID0g
ezB9OwotICAgIG1lZGl1bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7Ci0KLSAgICAvLyBQdXQgaW1n
IHRhZyBvbiB0aGUgY2xpcGJvYXJkIHJlZmVyZW5jaW5nIHRoZSBpbWFnZQotICAgIFZlY3Rvcjxj
aGFyPiBkYXRhOwotICAgIG1hcmt1cFRvQ0ZIVE1MKGNyZWF0ZU1hcmt1cChlbGVtZW50LCBJbmNs
dWRlTm9kZSwgMCwgUmVzb2x2ZUFsbFVSTHMpLCAiIiwgZGF0YSk7Ci0gICAgbWVkaXVtLmhHbG9i
YWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEpOwotICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBG
QUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEoaHRtbEZvcm1hdCgpLCAmbWVkaXVt
LCBUUlVFKSkpCi0gICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7Ci19Ci0KLXZv
aWQgQ2xpcGJvYXJkV2luOjp3cml0ZVVSTChjb25zdCBLVVJMJiBrdXJsLCBjb25zdCBTdHJpbmcm
IHRpdGxlU3RyLCBGcmFtZSopCi17Ci0gICAgaWYgKCFtX3dyaXRhYmxlRGF0YU9iamVjdCkKLSAg
ICAgICAgIHJldHVybjsKLSAgICBXZWJDb3JlOjp3cml0ZVVSTChtX3dyaXRhYmxlRGF0YU9iamVj
dC5nZXQoKSwga3VybCwgdGl0bGVTdHIsIHRydWUsIHRydWUpOwotCi0gICAgU3RyaW5nIHVybCA9
IGt1cmwuc3RyaW5nKCk7Ci0gICAgQVNTRVJUKHVybC5jb250YWluc09ubHlBU0NJSSgpKTsgLy8g
S1VSTDo6c3RyaW5nKCkgaXMgVVJMIGVuY29kZWQuCi0KLSAgICBTdHJpbmcgZnNQYXRoID0gZmls
ZXN5c3RlbVBhdGhGcm9tVXJsT3JUaXRsZSh1cmwsIHRpdGxlU3RyLCBMIi5VUkwiLCB0cnVlKTsK
LSAgICBTdHJpbmcgY29udGVudFN0cmluZygiW0ludGVybmV0U2hvcnRjdXRdXHJcblVSTD0iICsg
dXJsICsgIlxyXG4iKTsKLSAgICBDU3RyaW5nIGNvbnRlbnQgPSBjb250ZW50U3RyaW5nLmxhdGlu
MSgpOwotCi0gICAgaWYgKGZzUGF0aC5sZW5ndGgoKSA8PSAwKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBIR0xPQkFMIHVybEZpbGVEZXNjcmlwdG9yID0gR2xvYmFsQWxsb2MoR1BUUiwgc2l6ZW9m
KEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKLSAgICBpZiAoIXVybEZpbGVEZXNjcmlwdG9yKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBIR0xPQkFMIHVybEZpbGVDb250ZW50ID0gR2xvYmFsQWxsb2Mo
R1BUUiwgY29udGVudC5sZW5ndGgoKSk7Ci0gICAgaWYgKCF1cmxGaWxlQ29udGVudCkgewotICAg
ICAgICBHbG9iYWxGcmVlKHVybEZpbGVEZXNjcmlwdG9yKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIEZJTEVHUk9VUERFU0NSSVBUT1IqIGZnZCA9IHN0YXRpY19jYXN0PEZJTEVHUk9V
UERFU0NSSVBUT1IqPihHbG9iYWxMb2NrKHVybEZpbGVEZXNjcmlwdG9yKSk7Ci0gICAgWmVyb01l
bW9yeShmZ2QsIHNpemVvZihGSUxFR1JPVVBERVNDUklQVE9SKSk7Ci0gICAgZmdkLT5jSXRlbXMg
PSAxOwotICAgIGZnZC0+ZmdkWzBdLmR3RmxhZ3MgPSBGRF9GSUxFU0laRTsKLSAgICBmZ2QtPmZn
ZFswXS5uRmlsZVNpemVMb3cgPSBjb250ZW50Lmxlbmd0aCgpOwotCi0gICAgdW5zaWduZWQgbWF4
U2l6ZSA9IG1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgoZmdkLT5mZ2RbMF0u
Y0ZpbGVOYW1lKSk7Ci0gICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmlsZU5hbWUsIGZzUGF0
aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKLSAgICBHbG9iYWxVbmxv
Y2sodXJsRmlsZURlc2NyaXB0b3IpOwotCi0gICAgY2hhciogZmlsZUNvbnRlbnRzID0gc3RhdGlj
X2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2sodXJsRmlsZUNvbnRlbnQpKTsKLSAgICBDb3B5TWVtb3J5
KGZpbGVDb250ZW50cywgY29udGVudC5kYXRhKCksIGNvbnRlbnQubGVuZ3RoKCkpOwotICAgIEds
b2JhbFVubG9jayh1cmxGaWxlQ29udGVudCk7Ci0KLSAgICB3cml0ZUZpbGVUb0RhdGFPYmplY3Qo
bV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybEZpbGVEZXNjcmlwdG9yLCB1cmxGaWxlQ29u
dGVudCwgMCk7Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjp3cml0ZVJhbmdlKFJhbmdlKiBzZWxl
Y3RlZFJhbmdlLCBGcmFtZSogZnJhbWUpCi17Ci0gICAgQVNTRVJUKHNlbGVjdGVkUmFuZ2UpOwot
ICAgIGlmICghbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgICByZXR1cm47Ci0KLSAgICBT
VEdNRURJVU0gbWVkaXVtID0gezB9OwotICAgIG1lZGl1bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7
Ci0KLSAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKLSAgICBtYXJrdXBUb0NGSFRNTChjcmVhdGVNYXJr
dXAoc2VsZWN0ZWRSYW5nZSwgMCwgQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSksCi0gICAgICAgIHNl
bGVjdGVkUmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCktPmRvY3VtZW50KCktPnVybCgpLnN0cmluZygp
LCBkYXRhKTsKLSAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7Ci0g
ICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0
RGF0YShodG1sRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgOjpHbG9iYWxGcmVl
KG1lZGl1bS5oR2xvYmFsKTsKLQotICAgIFN0cmluZyBzdHIgPSBmcmFtZS0+ZWRpdG9yKCkuc2Vs
ZWN0ZWRUZXh0Rm9yQ2xpcGJvYXJkKCk7Ci0gICAgcmVwbGFjZU5ld2xpbmVzV2l0aFdpbmRvd3NT
dHlsZU5ld2xpbmVzKHN0cik7Ci0gICAgcmVwbGFjZU5CU1BXaXRoU3BhY2Uoc3RyKTsKLSAgICBt
ZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoc3RyKTsKLSAgICBpZiAobWVkaXVtLmhH
bG9iYWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKHBsYWluVGV4dFdG
b3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhH
bG9iYWwpOwotCi0gICAgbWVkaXVtLmhHbG9iYWwgPSAwOwotICAgIGlmIChmcmFtZS0+ZWRpdG9y
KCkuY2FuU21hcnRDb3B5T3JEZWxldGUoKSkKLSAgICAgICAgbV93cml0YWJsZURhdGFPYmplY3Qt
PlNldERhdGEoc21hcnRQYXN0ZUZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKTsKLX0KLQotdm9pZCBD
bGlwYm9hcmRXaW46OndyaXRlUGxhaW5UZXh0KGNvbnN0IFN0cmluZyYgdGV4dCkKLXsKLSAgICBp
ZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgU1RH
TUVESVVNIG1lZGl1bSA9IHswfTsKLSAgICBtZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOwot
ICAgIAotICAgIFN0cmluZyBzdHIgPSB0ZXh0OwotICAgIHJlcGxhY2VOZXdsaW5lc1dpdGhXaW5k
b3dzU3R5bGVOZXdsaW5lcyhzdHIpOwotICAgIHJlcGxhY2VOQlNQV2l0aFNwYWNlKHN0cik7Ci0g
ICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKHN0cik7Ci0gICAgaWYgKG1lZGl1
bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShwbGFpblRl
eHRXRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1
bS5oR2xvYmFsKTsgICAgICAgIAotCi0gICAgbWVkaXVtLmhHbG9iYWwgPSAwOwotfQotICAgIAot
Ym9vbCBDbGlwYm9hcmRXaW46Omhhc0RhdGEoKQotewotICAgIGlmICghbV9kYXRhT2JqZWN0ICYm
IG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBp
ZiAobV9kYXRhT2JqZWN0KSB7Ci0gICAgICAgIENPTVB0cjxJRW51bUZPUk1BVEVUQz4gaXRyOwot
ICAgICAgICBpZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+RW51bUZvcm1hdEV0YyhEQVRBRElSX0dF
VCwgJml0cikpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmICghaXRy
KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEZPUk1BVEVUQyBkYXRhOwot
Ci0gICAgICAgIC8vIElFbnVtRk9STUFURVRDOjpOZXh0IHJldHVybnMgU19GQUxTRSBpZiB0aGVy
ZSBhcmUgbm8gbW9yZSBpdGVtcy4KLSAgICAgICAgaWYgKGl0ci0+TmV4dCgxLCAmZGF0YSwgMCkg
PT0gU19PSykgewotICAgICAgICAgICAgLy8gVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGl0ZW0gaW4g
dGhlIElEYXRhT2JqZWN0Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuICFtX2RyYWdEYXRhTWFwLmlz
RW1wdHkoKTsKLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OnNldEV4dGVybmFsRGF0YU9iamVjdChJ
RGF0YU9iamVjdCAqZGF0YU9iamVjdCkKLXsKLSAgICBBU1NFUlQoaXNGb3JEcmFnQW5kRHJvcCgp
KTsKLQotICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0ID0gMDsKLSAgICBtX2RhdGFPYmplY3QgPSBk
YXRhT2JqZWN0OwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgNCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgJKHJldmlzaW9uIDE1MDQzMykNCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgJKHdvcmtpbmcgY29w
eSkNCkBAIC0xLDEwMSArMCwwIEBADQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywg
MjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0g
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0KLSNpZm5kZWYgQ2xp
cGJvYXJkV2luX2gKLSNkZWZpbmUgQ2xpcGJvYXJkV2luX2gKLQotI2luY2x1ZGUgIkNPTVB0ci5o
IgotI2luY2x1ZGUgIkNhY2hlZEltYWdlQ2xpZW50LmgiCi0jaW5jbHVkZSAiQ2xpcGJvYXJkLmgi
Ci0jaW5jbHVkZSAiRHJhZ0RhdGEuaCIKLQotc3RydWN0IElEYXRhT2JqZWN0OwotCi1uYW1lc3Bh
Y2UgV2ViQ29yZSB7Ci0KLWNsYXNzIENhY2hlZEltYWdlOwotY2xhc3MgRnJhbWU7Ci1jbGFzcyBJ
bnRQb2ludDsKLWNsYXNzIFdDRGF0YU9iamVjdDsKLQotLy8gU3RhdGUgYXZhaWxhYmxlIGR1cmlu
ZyBJRSdzIGV2ZW50cyBmb3IgZHJhZyBhbmQgZHJvcCBhbmQgY29weS9wYXN0ZQotY2xhc3MgQ2xp
cGJvYXJkV2luIDogcHVibGljIENsaXBib2FyZCwgcHVibGljIENhY2hlZEltYWdlQ2xpZW50IHsK
LSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1Jl
ZlB0cjxDbGlwYm9hcmRXaW4+IGNyZWF0ZShDbGlwYm9hcmRUeXBlIGNsaXBib2FyZFR5cGUsIElE
YXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBGcmFt
ZSogZnJhbWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IENsaXBib2FyZFdp
bihjbGlwYm9hcmRUeXBlLCBkYXRhT2JqZWN0LCBwb2xpY3ksIGZyYW1lKSk7Ci0gICAgfQotICAg
IHN0YXRpYyBQYXNzUmVmUHRyPENsaXBib2FyZFdpbj4gY3JlYXRlKENsaXBib2FyZFR5cGUgY2xp
cGJvYXJkVHlwZSwgV0NEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBDbGlwYm9hcmRBY2Nlc3NQb2xp
Y3kgcG9saWN5LCBGcmFtZSogZnJhbWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IENsaXBib2FyZFdpbihjbGlwYm9hcmRUeXBlLCBkYXRhT2JqZWN0LCBwb2xpY3ksIGZyYW1l
KSk7Ci0gICAgfQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPENsaXBib2FyZFdpbj4gY3JlYXRlKENs
aXBib2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgY29uc3QgRHJhZ0RhdGFNYXAmIGRhdGFNYXAsIENs
aXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAgICB7Ci0gICAgICAg
IHJldHVybiBhZG9wdFJlZihuZXcgQ2xpcGJvYXJkV2luKGNsaXBib2FyZFR5cGUsIGRhdGFNYXAs
IHBvbGljeSwgZnJhbWUpKTsKLSAgICB9Ci0gICAgfkNsaXBib2FyZFdpbigpOwotCi0gICAgdm9p
ZCBjbGVhckRhdGEoY29uc3QgU3RyaW5nJiB0eXBlKTsKLSAgICB2b2lkIGNsZWFyRGF0YSgpOwot
ICAgIFN0cmluZyBnZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSkgY29uc3Q7Ci0gICAgYm9vbCBz
ZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBkYXRhKTsKLQotICAgIC8v
IGV4dGVuc2lvbnMgYmV5b25kIElFJ3MgQVBJCi0gICAgdmlydHVhbCBMaXN0SGFzaFNldDxTdHJp
bmc+IHR5cGVzKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPEZpbGVMaXN0PiBmaWxl
cygpIGNvbnN0OwotCi0gICAgdm9pZCBzZXREcmFnSW1hZ2UoQ2FjaGVkSW1hZ2UqLCBjb25zdCBJ
bnRQb2ludCYpOwotICAgIHZvaWQgc2V0RHJhZ0ltYWdlRWxlbWVudChOb2RlKiwgY29uc3QgSW50
UG9pbnQmKTsKLQotICAgIHZpcnR1YWwgRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZShJbnRQ
b2ludCYgZHJhZ0xvYykgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGRlY2xhcmVBbmRXcml0ZURy
YWdJbWFnZShFbGVtZW50KiwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYgdGl0bGUsIEZyYW1l
Kik7Ci0gICAgdmlydHVhbCB2b2lkIHdyaXRlVVJMKGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcm
LCBGcmFtZSopOwotICAgIHZpcnR1YWwgdm9pZCB3cml0ZVJhbmdlKFJhbmdlKiwgRnJhbWUqKTsK
LSAgICB2aXJ0dWFsIHZvaWQgd3JpdGVQbGFpblRleHQoY29uc3QgU3RyaW5nJik7Ci0KLSAgICB2
aXJ0dWFsIGJvb2wgaGFzRGF0YSgpOwotCi0gICAgQ09NUHRyPElEYXRhT2JqZWN0PiBkYXRhT2Jq
ZWN0KCkgeyByZXR1cm4gbV9kYXRhT2JqZWN0OyB9Ci0KLSAgICB2b2lkIHNldEV4dGVybmFsRGF0
YU9iamVjdChJRGF0YU9iamVjdCAqZGF0YU9iamVjdCk7Ci0KLXByaXZhdGU6Ci0gICAgQ2xpcGJv
YXJkV2luKENsaXBib2FyZFR5cGUsIElEYXRhT2JqZWN0KiwgQ2xpcGJvYXJkQWNjZXNzUG9saWN5
LCBGcmFtZSopOwotICAgIENsaXBib2FyZFdpbihDbGlwYm9hcmRUeXBlLCBXQ0RhdGFPYmplY3Qq
LCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3ksIEZyYW1lKik7Ci0gICAgQ2xpcGJvYXJkV2luKENsaXBi
b2FyZFR5cGUsIGNvbnN0IERyYWdEYXRhTWFwJiwgQ2xpcGJvYXJkQWNjZXNzUG9saWN5LCBGcmFt
ZSopOwotCi0gICAgdm9pZCByZXNldEZyb21DbGlwYm9hcmQoKTsKLSAgICB2b2lkIHNldERyYWdJ
bWFnZShDYWNoZWRJbWFnZSosIE5vZGUqLCBjb25zdCBJbnRQb2ludCYpOwotCi0gICAgQ09NUHRy
PElEYXRhT2JqZWN0PiBtX2RhdGFPYmplY3Q7Ci0gICAgQ09NUHRyPFdDRGF0YU9iamVjdD4gbV93
cml0YWJsZURhdGFPYmplY3Q7Ci0gICAgRHJhZ0RhdGFNYXAgbV9kcmFnRGF0YU1hcDsKLSAgICBG
cmFtZSogbV9mcmFtZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKLQotI2VuZGlmIC8v
IENsaXBib2FyZFdpbl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vRWRpdG9y
V2luLmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9FZGl0
b3JXaW4uY3BwCShyZXZpc2lvbiAxNTA0MzMpDQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
d2luL0VkaXRvcldpbi5jcHAJKHdvcmtpbmcgY29weSkNCkBAIC0yNywxMSArMjcsMTkgQEANCiAj
aW5jbHVkZSAiRWRpdG9yLmgiCiAjaW5jbHVkZSAiRWRpdG9yQ2xpZW50LmgiCiAKKyNpZiAhVVNF
KExFR0FDWV9TVFlMRV9BQlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCisjaW5jbHVkZSAiQ09NUHRy
LmgiCisjaW5jbHVkZSAiQ2xpcGJvYXJkLmgiCisjZWxzZQogI2luY2x1ZGUgIkNsaXBib2FyZFdp
bi5oIgorI2VuZGlmCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJFbGVtZW50Lmgi
CiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJodG1sZWRpdGluZy5oIgorI2lmICFVU0Uo
TEVHQUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFTUykKKyNpbmNsdWRlICJQYXN0ZWJv
YXJkLmgiCisjZW5kaWYKICNpbmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKICNpbmNsdWRlICJWaXNp
YmxlVW5pdHMuaCIKIApAQCAtNDYsOCArNTQsMTQgQEANCiAgICAgaWYgKCFTVUNDRUVERUQoT2xl
R2V0Q2xpcGJvYXJkKCZjbGlwYm9hcmREYXRhKSkpCiAgICAgICAgIGNsaXBib2FyZERhdGEgPSAw
OwogI2VuZGlmCi0KKyNpZiBVU0UoTEVHQUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFT
UykKICAgICByZXR1cm4gQ2xpcGJvYXJkV2luOjpjcmVhdGUoQ2xpcGJvYXJkOjpDb3B5QW5kUGFz
dGUsIGNsaXBib2FyZERhdGEuZ2V0KCksIHBvbGljeSwgZnJhbWUpOworI2Vsc2UKKyAgICBQYXNz
UmVmUHRyPENsaXBib2FyZD4gY2xpcGJvYXJkID0gQ2xpcGJvYXJkOjpjcmVhdGVGb3JDb3B5QW5k
UGFzdGUocG9saWN5KTsKKyAgICBQYXN0ZWJvYXJkKiBwYXN0ZWJvYXJkID0gY29uc3RfY2FzdDxQ
YXN0ZWJvYXJkKj4oJmNsaXBib2FyZC0+cGFzdGVib2FyZCgpKTsKKyAgICBwYXN0ZWJvYXJkLT5z
ZXRFeHRlcm5hbERhdGFPYmplY3QoY2xpcGJvYXJkRGF0YS5nZXQoKSk7CisgICAgcmV0dXJuIGNs
aXBib2FyZDsKKyNlbmRpZgogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHANCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHAJKHJldmlzaW9u
IDE1MDQzMykNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5j
cHAJKHdvcmtpbmcgY29weSkNCkBAIC0xLDUgKzEsNiBAQA0KIC8qCiAgKiBDb3B5cmlnaHQgKEMp
IDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdo
dCAoQykgMjAxMyBYdWVxaW5nIEh1YW5nIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgogICoKICAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zNCw2ICszNSw4IEBADQogI2luY2x1ZGUgIkVk
aXRvci5oIgogI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1
ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhUTUxQYXJzZXJJZGlvbXMuaCIKICNpbmNsdWRl
ICJIV25kREMuaCIKICNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCiAjaW5jbHVkZSAiSW1hZ2Uu
aCIKQEAgLTQyLDYgKzQ1LDcgQEANCiAjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlJhbmdl
LmgiCiAjaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIK
ICNpbmNsdWRlICJUZXh0RW5jb2RpbmcuaCIKICNpbmNsdWRlICJXZWJDb3JlSW5zdGFuY2VIYW5k
bGUuaCIKICNpbmNsdWRlICJXaW5kb3dzRXh0cmFzLmgiCkBAIC01MCw2ICs1NCw5IEBADQogCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKKy8vIFdlIHByb3ZpZGUgdGhlIElFIGNsaXBib2FyZCB0eXBl
cyAoVVJMIGFuZCBUZXh0KSwgYW5kIHRoZSBjbGlwYm9hcmQgdHlwZXMgc3BlY2lmaWVkIGluIHRo
ZSBXSEFUV0cgV2ViIEFwcGxpY2F0aW9ucyAxLjAgZHJhZnQKKy8vIHNlZSBodHRwOi8vd3d3Lndo
YXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyBTZWN0aW9uIDYuMy41LjMKKwog
c3RhdGljIFVJTlQgSFRNTENsaXBib2FyZEZvcm1hdCA9IDA7CiBzdGF0aWMgVUlOVCBCb29rbWFy
a0NsaXBib2FyZEZvcm1hdCA9IDA7CiBzdGF0aWMgVUlOVCBXZWJTbWFydFBhc3RlRm9ybWF0ID0g
MDsKQEAgLTg5LDggKzk2LDM5IEBADQogICAgIHJldHVybiBwYXN0ZWJvYXJkOwogfQogCi1QYXN0
ZWJvYXJkOjpQYXN0ZWJvYXJkKCkKK1Bhc3NPd25QdHI8UGFzdGVib2FyZD4gUGFzdGVib2FyZDo6
Y3JlYXRlRm9yQ29weUFuZFBhc3RlKCkKIHsKKyAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBhc3Rl
Ym9hcmQpOworfQorCitQYXNzT3duUHRyPFBhc3RlYm9hcmQ+IFBhc3RlYm9hcmQ6OmNyZWF0ZVBy
aXZhdGUoKQoreworICAgIC8vIFdpbmRvd3MgaGFzIG5vdCAiUHJpdmF0ZSBwYXN0ZWJvYXJkIiBj
b25jZXB0LgorICAgIHJldHVybiBjcmVhdGVGb3JDb3B5QW5kUGFzdGUoKTsKK30KKworI2lmIEVO
QUJMRShEUkFHX1NVUFBPUlQpCisvLyBzdGF0aWMKK1Bhc3NPd25QdHI8UGFzdGVib2FyZD4gUGFz
dGVib2FyZDo6Y3JlYXRlRm9yRHJhZ0FuZERyb3AoKQoreworCUNPTVB0cjxXQ0RhdGFPYmplY3Q+
IGRhdGFPYmplY3Q7CisJV0NEYXRhT2JqZWN0OjpjcmVhdGVJbnN0YW5jZSgmZGF0YU9iamVjdCk7
CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBQYXN0ZWJvYXJkKGRhdGFPYmplY3QuZ2V0KCkpKTsK
K30KKworLy8gc3RhdGljCitQYXNzT3duUHRyPFBhc3RlYm9hcmQ+IFBhc3RlYm9hcmQ6OmNyZWF0
ZUZvckRyYWdBbmREcm9wKGNvbnN0IERyYWdEYXRhJiBkcmFnRGF0YSkKK3sKKyAgICBpZiAoZHJh
Z0RhdGEucGxhdGZvcm1EYXRhKCkpCisgICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgUGFzdGVi
b2FyZChkcmFnRGF0YS5wbGF0Zm9ybURhdGEoKSkpOworICAgIC8vIFdlIGNvdWxkIG5vdCBjYWxs
IERyYWdEYXRhOjpkcmFnRGF0YU1hcCB2aWEgfGNvbnN0IERyYWdEYXRhJnwuCisgICAgY29uc3Qg
RHJhZ0RhdGFNYXAmIGRyYWdEYXRhTWFwID0gY29uc3RfY2FzdDxEcmFnRGF0YSo+KCgmZHJhZ0Rh
dGEpKS0+ZHJhZ0RhdGFNYXAoKTsKKyAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBhc3RlYm9hcmQo
ZHJhZ0RhdGFNYXApKTsKK30KKyNlbmRpZgorCit2b2lkIFBhc3RlYm9hcmQ6OmNyZWF0ZVBhc3Rl
Ym9hcmRQcml2YXRlKCkKK3sKICAgICBXTkRDTEFTUyB3YzsKICAgICBtZW1zZXQoJndjLCAwLCBz
aXplb2YoV05EQ0xBU1MpKTsKICAgICB3Yy5scGZuV25kUHJvYyAgICA9IFBhc3RlYm9hcmRPd25l
clduZFByb2M7CkBAIC0xMDYsNiArMTQ0LDM1IEBADQogICAgIFdlYlNtYXJ0UGFzdGVGb3JtYXQg
PSA6OlJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiV2ViS2l0IFNtYXJ0IFBhc3RlIEZvcm1hdCIp
OwogfQogCitQYXN0ZWJvYXJkOjpQYXN0ZWJvYXJkKCkKKyAgICA6IG1fZGF0YU9iamVjdCgwKQor
ICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoMCkKK3sKKyAgICBjcmVhdGVQYXN0ZWJvYXJkUHJp
dmF0ZSgpOworfQorCitQYXN0ZWJvYXJkOjpQYXN0ZWJvYXJkKElEYXRhT2JqZWN0KiBkYXRhT2Jq
ZWN0KQorICAgIDogbV9kYXRhT2JqZWN0KGRhdGFPYmplY3QpCisgICAgLCBtX3dyaXRhYmxlRGF0
YU9iamVjdCgwKQoreworICAgIGNyZWF0ZVBhc3RlYm9hcmRQcml2YXRlKCk7Cit9CisKK1Bhc3Rl
Ym9hcmQ6OlBhc3RlYm9hcmQoV0NEYXRhT2JqZWN0KiBkYXRhT2JqZWN0KQorICAgIDogbV9kYXRh
T2JqZWN0KGRhdGFPYmplY3QpCisgICAgLCBtX3dyaXRhYmxlRGF0YU9iamVjdChkYXRhT2JqZWN0
KQoreworICAgIGNyZWF0ZVBhc3RlYm9hcmRQcml2YXRlKCk7Cit9CisKK1Bhc3RlYm9hcmQ6OlBh
c3RlYm9hcmQoY29uc3QgRHJhZ0RhdGFNYXAmIGRhdGFNYXApCisgICAgOiBtX2RhdGFPYmplY3Qo
MCkKKyAgICAsIG1fd3JpdGFibGVEYXRhT2JqZWN0KDApCisgICAgLCBtX2RyYWdEYXRhTWFwKGRh
dGFNYXApCit7CisgICAgY3JlYXRlUGFzdGVib2FyZFByaXZhdGUoKTsKK30KKwogdm9pZCBQYXN0
ZWJvYXJkOjpjbGVhcigpCiB7CiAgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgewpA
QCAtMTE0LDYgKzE4MSwyNzEgQEANCiAgICAgfQogfQogCitlbnVtIENsaXBib2FyZERhdGFUeXBl
IHsgQ2xpcGJvYXJkRGF0YVR5cGVOb25lLCBDbGlwYm9hcmREYXRhVHlwZVVSTCwgQ2xpcGJvYXJk
RGF0YVR5cGVUZXh0LCBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MIH07CisKK3N0YXRpYyBDbGlw
Ym9hcmREYXRhVHlwZSBjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKGNvbnN0IFN0cmluZyYgdHlw
ZSkKK3sKKyAgICBTdHJpbmcgcVR5cGUgPSB0eXBlLnN0cmlwV2hpdGVTcGFjZSgpLmxvd2VyKCk7
CisKKyAgICAvLyB0d28gc3BlY2lhbCBjYXNlcyBmb3IgSUUgY29tcGF0aWJpbGl0eQorICAgIGlm
IChxVHlwZSA9PSAidGV4dCIgfHwgcVR5cGUgPT0gInRleHQvcGxhaW4iIHx8IHFUeXBlLnN0YXJ0
c1dpdGgoInRleHQvcGxhaW47IikpCisgICAgICAgIHJldHVybiBDbGlwYm9hcmREYXRhVHlwZVRl
eHQ7CisgICAgaWYgKHFUeXBlID09ICJ1cmwiIHx8IHFUeXBlID09ICJ0ZXh0L3VyaS1saXN0IikK
KyAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVVJMOworICAgIGlmIChxVHlwZSA9PSAi
dGV4dC9odG1sIikKKyAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVGV4dEhUTUw7CisK
KyAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVOb25lOworfQorCit2b2lkIFBhc3RlYm9hcmQ6
OmNsZWFyKGNvbnN0IFN0cmluZyYgdHlwZSkKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2Jq
ZWN0KQorICAgICAgICByZXR1cm47CisKKyAgICBDbGlwYm9hcmREYXRhVHlwZSBkYXRhVHlwZSA9
IGNsaXBib2FyZFR5cGVGcm9tTUlNRVR5cGUodHlwZSk7CisKKyAgICBpZiAoZGF0YVR5cGUgPT0g
Q2xpcGJvYXJkRGF0YVR5cGVVUkwpIHsKKyAgICAgICAgbV93cml0YWJsZURhdGFPYmplY3QtPmNs
ZWFyRGF0YSh1cmxXRm9ybWF0KCktPmNmRm9ybWF0KTsKKyAgICAgICAgbV93cml0YWJsZURhdGFP
YmplY3QtPmNsZWFyRGF0YSh1cmxGb3JtYXQoKS0+Y2ZGb3JtYXQpOworICAgIH0KKyAgICBpZiAo
ZGF0YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KSB7CisgICAgICAgIG1fd3JpdGFibGVE
YXRhT2JqZWN0LT5jbGVhckRhdGEocGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0KTsKKyAgICAg
ICAgbV93cml0YWJsZURhdGFPYmplY3QtPmNsZWFyRGF0YShwbGFpblRleHRXRm9ybWF0KCktPmNm
Rm9ybWF0KTsKKyAgICB9Cit9CisKK2Jvb2wgUGFzdGVib2FyZDo6aGFzRGF0YSgpCit7CisgICAg
aWYgKCFtX2RhdGFPYmplY3QgJiYgbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIGlmIChtX2RhdGFPYmplY3QpIHsKKyAgICAgICAgQ09NUHRyPElF
bnVtRk9STUFURVRDPiBpdHI7CisgICAgICAgIGlmIChGQUlMRUQobV9kYXRhT2JqZWN0LT5FbnVt
Rm9ybWF0RXRjKERBVEFESVJfR0VULCAmaXRyKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICAgICAgaWYgKCFpdHIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAg
ICAgRk9STUFURVRDIGRhdGE7CisKKyAgICAgICAgLy8gSUVudW1GT1JNQVRFVEM6Ok5leHQgcmV0
dXJucyBTX0ZBTFNFIGlmIHRoZXJlIGFyZSBubyBtb3JlIGl0ZW1zLgorICAgICAgICBpZiAoaXRy
LT5OZXh0KDEsICZkYXRhLCAwKSA9PSBTX09LKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBh
dCBsZWFzdCBvbmUgaXRlbSBpbiB0aGUgSURhdGFPYmplY3QKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1
cm4gIW1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpOworfQorCitzdGF0aWMgdm9pZCBhZGRNaW1lVHlw
ZXNGb3JGb3JtYXQoTGlzdEhhc2hTZXQ8U3RyaW5nPiYgcmVzdWx0cywgY29uc3QgRk9STUFURVRD
JiBmb3JtYXQpCit7CisgICAgLy8gVVJMIGFuZCBUZXh0IGFyZSBwcm92aWRlZCBmb3IgY29tcGF0
aWJpbGl0eSB3aXRoIElFJ3MgbW9kZWwKKyAgICBpZiAoZm9ybWF0LmNmRm9ybWF0ID09IHVybEZv
cm1hdCgpLT5jZkZvcm1hdCB8fCBmb3JtYXQuY2ZGb3JtYXQgPT0gdXJsV0Zvcm1hdCgpLT5jZkZv
cm1hdCkgeworICAgICAgICByZXN1bHRzLmFkZCgiVVJMIik7CisgICAgICAgIHJlc3VsdHMuYWRk
KCJ0ZXh0L3VyaS1saXN0Iik7CisgICAgfQorCisgICAgaWYgKGZvcm1hdC5jZkZvcm1hdCA9PSBw
bGFpblRleHRXRm9ybWF0KCktPmNmRm9ybWF0IHx8IGZvcm1hdC5jZkZvcm1hdCA9PSBwbGFpblRl
eHRGb3JtYXQoKS0+Y2ZGb3JtYXQpIHsKKyAgICAgICAgcmVzdWx0cy5hZGQoIlRleHQiKTsKKyAg
ICAgICAgcmVzdWx0cy5hZGQoInRleHQvcGxhaW4iKTsKKyAgICB9Cit9CisKK0xpc3RIYXNoU2V0
PFN0cmluZz4gUGFzdGVib2FyZDo6dHlwZXMoKQoreworICAgIExpc3RIYXNoU2V0PFN0cmluZz4g
cmVzdWx0czsKKworICAgIGlmICghbV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm4gcmVzdWx0czsKKworICAgIGlmIChtX2RhdGFPYmplY3QpIHsK
KyAgICAgICAgQ09NUHRyPElFbnVtRk9STUFURVRDPiBpdHI7CisKKyAgICAgICAgaWYgKEZBSUxF
RChtX2RhdGFPYmplY3QtPkVudW1Gb3JtYXRFdGMoREFUQURJUl9HRVQsICZpdHIpKSkKKyAgICAg
ICAgICAgIHJldHVybiByZXN1bHRzOworCisgICAgICAgIGlmICghaXRyKQorICAgICAgICAgICAg
cmV0dXJuIHJlc3VsdHM7CisKKyAgICAgICAgRk9STUFURVRDIGRhdGE7CisKKyAgICAgICAgLy8g
SUVudW1GT1JNQVRFVEM6Ok5leHQgcmV0dXJucyBTX0ZBTFNFIGlmIHRoZXJlIGFyZSBubyBtb3Jl
IGl0ZW1zLgorICAgICAgICB3aGlsZSAoaXRyLT5OZXh0KDEsICZkYXRhLCAwKSA9PSBTX09LKQor
ICAgICAgICAgICAgYWRkTWltZVR5cGVzRm9yRm9ybWF0KHJlc3VsdHMsIGRhdGEpOworICAgIH0g
ZWxzZSB7CisgICAgICAgIGZvciAoRHJhZ0RhdGFNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9k
cmFnRGF0YU1hcC5iZWdpbigpOyBpdCAhPSBtX2RyYWdEYXRhTWFwLmVuZCgpOyArK2l0KSB7Cisg
ICAgICAgICAgICBGT1JNQVRFVEMgZGF0YTsKKyAgICAgICAgICAgIGRhdGEuY2ZGb3JtYXQgPSAo
Kml0KS5rZXk7CisgICAgICAgICAgICBhZGRNaW1lVHlwZXNGb3JGb3JtYXQocmVzdWx0cywgZGF0
YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0czsKK30KKworU3RyaW5n
IFBhc3RlYm9hcmQ6OnJlYWRTdHJpbmcoY29uc3QgU3RyaW5nJiB0eXBlKQoreworICAgIGlmICgh
bV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4g
IiI7CisKKyAgICBDbGlwYm9hcmREYXRhVHlwZSBkYXRhVHlwZSA9IGNsaXBib2FyZFR5cGVGcm9t
TUlNRVR5cGUodHlwZSk7CisgICAgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBlVGV4
dCkKKyAgICAgICAgcmV0dXJuIG1fZGF0YU9iamVjdCA/IGdldFBsYWluVGV4dChtX2RhdGFPYmpl
Y3QuZ2V0KCkpIDogZ2V0UGxhaW5UZXh0KCZtX2RyYWdEYXRhTWFwKTsKKyAgICBpZiAoZGF0YVR5
cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVVUkwpCisgICAgICAgIHJldHVybiBtX2RhdGFPYmplY3Qg
PyBnZXRVUkwobV9kYXRhT2JqZWN0LmdldCgpLCBEcmFnRGF0YTo6RG9Ob3RDb252ZXJ0RmlsZW5h
bWVzKSA6IGdldFVSTCgmbV9kcmFnRGF0YU1hcCwgRHJhZ0RhdGE6OkRvTm90Q29udmVydEZpbGVu
YW1lcyk7CisgICAgZWxzZSBpZiAoZGF0YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0SFRN
TCkgeworICAgICAgICBTdHJpbmcgZGF0YSA9IG1fZGF0YU9iamVjdCA/IGdldFRleHRIVE1MKG1f
ZGF0YU9iamVjdC5nZXQoKSkgOiBnZXRUZXh0SFRNTCgmbV9kcmFnRGF0YU1hcCk7CisgICAgICAg
IGlmICghZGF0YS5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAg
cmV0dXJuIG1fZGF0YU9iamVjdCA/IGdldENGSFRNTChtX2RhdGFPYmplY3QuZ2V0KCkpIDogZ2V0
Q0ZIVE1MKCZtX2RyYWdEYXRhTWFwKTsKKyAgICB9CisKKyAgICByZXR1cm4gIiI7Cit9CisKK1Zl
Y3RvcjxTdHJpbmc+IFBhc3RlYm9hcmQ6OnJlYWRGaWxlbmFtZXMoKQoreworI2lmIFVTRShDRikK
KyAgICBWZWN0b3I8U3RyaW5nPiBmaWxlTmFtZXM7CisKKyAgICBpZiAobV9kYXRhT2JqZWN0KSB7
CisgICAgICAgIFNUR01FRElVTSBtZWRpdW07CisgICAgICAgIGlmIChGQUlMRUQobV9kYXRhT2Jq
ZWN0LT5HZXREYXRhKGNmSERyb3BGb3JtYXQoKSwgJm1lZGl1bSkpKQorICAgICAgICAgICAgcmV0
dXJuIGZpbGVOYW1lczsKKworICAgICAgICBIRFJPUCBoZHJvcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8
SERST1A+KEdsb2JhbExvY2sobWVkaXVtLmhHbG9iYWwpKTsKKyAgICAgICAgaWYgKCFoZHJvcCkK
KyAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZXM7CisKKyAgICAgICAgV0NIQVIgZmlsZW5hbWVb
TUFYX1BBVEhdOworICAgICAgICBVSU5UIGZpbGVDb3VudCA9IERyYWdRdWVyeUZpbGVXKGhkcm9w
LCAweEZGRkZGRkZGLCAwLCAwKTsKKyAgICAgICAgZm9yIChVSU5UIGkgPSAwOyBpIDwgZmlsZUNv
dW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmICghRHJhZ1F1ZXJ5RmlsZVcoaGRyb3AsIGksIGZp
bGVuYW1lLCBXVEZfQVJSQVlfTEVOR1RIKGZpbGVuYW1lKSkpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICBmaWxlTmFtZXMuYXBwZW5kKGZpbGVuYW1lKTsKKyAgICAgICAg
fQorCisgICAgICAgIEdsb2JhbFVubG9jayhtZWRpdW0uaEdsb2JhbCk7CisgICAgICAgIFJlbGVh
c2VTdGdNZWRpdW0oJm1lZGl1bSk7CisgICAgICAgIHJldHVybiBmaWxlTmFtZXM7CisgICAgfQor
ICAgIGlmICghbV9kcmFnRGF0YU1hcC5jb250YWlucyhjZkhEcm9wRm9ybWF0KCktPmNmRm9ybWF0
KSkKKyAgICAgICAgcmV0dXJuIGZpbGVOYW1lczsKKyAgICByZXR1cm4gbV9kcmFnRGF0YU1hcC5n
ZXQoY2ZIRHJvcEZvcm1hdCgpLT5jZkZvcm1hdCk7CisjZWxzZQorICAgIG5vdEltcGxlbWVudGVk
KCk7CisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGJvb2wgd3JpdGVVUkwoV0NE
YXRhT2JqZWN0ICpkYXRhLCBjb25zdCBLVVJMJiB1cmwsIFN0cmluZyB0aXRsZSwgYm9vbCB3aXRo
UGxhaW5UZXh0LCBib29sIHdpdGhIVE1MKQoreworICAgIEFTU0VSVChkYXRhKTsKKworICAgIGlm
ICh1cmwuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAodGl0bGUu
aXNFbXB0eSgpKSB7CisgICAgICAgIHRpdGxlID0gdXJsLmxhc3RQYXRoQ29tcG9uZW50KCk7Cisg
ICAgICAgIGlmICh0aXRsZS5pc0VtcHR5KCkpCisgICAgICAgICAgICB0aXRsZSA9IHVybC5ob3N0
KCk7CisgICAgfQorCisgICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKKyAgICBtZWRpdW0udHlt
ZWQgPSBUWU1FRF9IR0xPQkFMOworCisgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxE
YXRhKHVybCwgdGl0bGUpOworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIGlmIChtZWRp
dW0uaEdsb2JhbCAmJiBGQUlMRUQoZGF0YS0+U2V0RGF0YSh1cmxXRm9ybWF0KCksICZtZWRpdW0s
IFRSVUUpKSkKKyAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKKyAgICBlbHNl
CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworCisgICAgaWYgKHdpdGhIVE1MKSB7CisgICAgICAg
IFZlY3RvcjxjaGFyPiBjZmh0bWxEYXRhOworICAgICAgICBtYXJrdXBUb0NGSFRNTCh1cmxUb01h
cmt1cCh1cmwsIHRpdGxlKSwgIiIsIGNmaHRtbERhdGEpOworICAgICAgICBtZWRpdW0uaEdsb2Jh
bCA9IGNyZWF0ZUdsb2JhbERhdGEoY2ZodG1sRGF0YSk7CisgICAgICAgIGlmIChtZWRpdW0uaEds
b2JhbCAmJiBGQUlMRUQoZGF0YS0+U2V0RGF0YShodG1sRm9ybWF0KCksICZtZWRpdW0sIFRSVUUp
KSkKKyAgICAgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgIH0KKworICAgIGlmICh3aXRoUGxh
aW5UZXh0KSB7CisgICAgICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YSh1cmwu
c3RyaW5nKCkpOworICAgICAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKGRhdGEtPlNl
dERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgICAgICA6
Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBz
dWNjZXNzID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworYm9vbCBQ
YXN0ZWJvYXJkOjp3cml0ZVN0cmluZyhjb25zdCBTdHJpbmcmIHR5cGUsIGNvbnN0IFN0cmluZyYg
ZGF0YSkKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBDbGlwYm9hcmREYXRhVHlwZSB3aW5UeXBlID0gY2xpcGJvYXJkVHlwZUZy
b21NSU1FVHlwZSh0eXBlKTsKKworICAgIGlmICh3aW5UeXBlID09IENsaXBib2FyZERhdGFUeXBl
VVJMKQorICAgICAgICByZXR1cm4gV2ViQ29yZTo6d3JpdGVVUkwobV93cml0YWJsZURhdGFPYmpl
Y3QuZ2V0KCksIEtVUkwoUGFyc2VkVVJMU3RyaW5nLCBkYXRhKSwgU3RyaW5nKCksIGZhbHNlLCB0
cnVlKTsKKworICAgIGlmICh3aW5UeXBlID09IENsaXBib2FyZERhdGFUeXBlVGV4dCkgeworICAg
ICAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OworICAgICAgICBtZWRpdW0udHltZWQgPSBUWU1F
RF9IR0xPQkFMOworICAgICAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0
YSk7CisgICAgICAgIGlmICghbWVkaXVtLmhHbG9iYWwpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgaWYgKEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShw
bGFpblRleHRXRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkgeworICAgICAgICAgICAgOjpHbG9i
YWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK3ZvaWQgUGFzdGVib2FyZDo6c2V0RHJhZ0ltYWdlKERyYWdJbWFnZVJlZiwgY29uc3QgSW50
UG9pbnQmIGhvdFNwb3QpCit7CisgICAgLy8gRG8gbm90aGluZyBpbiBXaW5kb3dzLgorfQorCit2
b2lkIFBhc3RlYm9hcmQ6OndyaXRlUmFuZ2VUb0RhdGFPYmplY3QoUmFuZ2UqIHNlbGVjdGVkUmFu
Z2UsIEZyYW1lKiBmcmFtZSkKK3sKKyAgICBBU1NFUlQoc2VsZWN0ZWRSYW5nZSk7CisgICAgaWYg
KCFtX3dyaXRhYmxlRGF0YU9iamVjdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgU1RHTUVESVVN
IG1lZGl1bSA9IHswfTsKKyAgICBtZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOworCisgICAg
VmVjdG9yPGNoYXI+IGRhdGE7CisgICAgbWFya3VwVG9DRkhUTUwoY3JlYXRlTWFya3VwKHNlbGVj
dGVkUmFuZ2UsIDAsIEFubm90YXRlRm9ySW50ZXJjaGFuZ2UpLAorICAgICAgICBzZWxlY3RlZFJh
bmdlLT5zdGFydENvbnRhaW5lcigpLT5kb2N1bWVudCgpLT51cmwoKS5zdHJpbmcoKSwgZGF0YSk7
CisgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEpOworICAgIGlmICht
ZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEoaHRt
bEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0u
aEdsb2JhbCk7CisKKyAgICBTdHJpbmcgc3RyID0gZnJhbWUtPmVkaXRvcigpLnNlbGVjdGVkVGV4
dEZvckNsaXBib2FyZCgpOworICAgIHJlcGxhY2VOZXdsaW5lc1dpdGhXaW5kb3dzU3R5bGVOZXds
aW5lcyhzdHIpOworICAgIHJlcGxhY2VOQlNQV2l0aFNwYWNlKHN0cik7CisgICAgbWVkaXVtLmhH
bG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKHN0cik7CisgICAgaWYgKG1lZGl1bS5oR2xvYmFsICYm
IEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShwbGFpblRleHRXRm9ybWF0KCks
ICZtZWRpdW0sIFRSVUUpKSkKKyAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsK
KworICAgIG1lZGl1bS5oR2xvYmFsID0gMDsKKyAgICBpZiAoZnJhbWUtPmVkaXRvcigpLmNhblNt
YXJ0Q29weU9yRGVsZXRlKCkpCisgICAgICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRh
KHNtYXJ0UGFzdGVGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSk7Cit9CisKIHZvaWQgUGFzdGVib2Fy
ZDo6d3JpdGVTZWxlY3Rpb24oUmFuZ2UqIHNlbGVjdGVkUmFuZ2UsIGJvb2wgY2FuU21hcnRDb3B5
T3JEZWxldGUsIEZyYW1lKiBmcmFtZSwgU2hvdWxkU2VyaWFsaXplU2VsZWN0ZWRUZXh0Rm9yQ2xp
cGJvYXJkIHNob3VsZFNlcmlhbGl6ZVNlbGVjdGVkVGV4dEZvckNsaXBib2FyZCkKIHsKICAgICBj
bGVhcigpOwpAQCAtMTQ2LDEwICs0NzgsMjkgQEANCiAgICAgICAgICAgICA6OlNldENsaXBib2Fy
ZERhdGEoV2ViU21hcnRQYXN0ZUZvcm1hdCwgMCk7CiAgICAgICAgICAgICA6OkNsb3NlQ2xpcGJv
YXJkKCk7CiAgICAgICAgIH0KLSAgICAgICAgCiAgICAgfQorCisgICAgd3JpdGVSYW5nZVRvRGF0
YU9iamVjdChzZWxlY3RlZFJhbmdlLCBmcmFtZSk7CiB9CiAKK3ZvaWQgUGFzdGVib2FyZDo6d3Jp
dGVQbGFpblRleHRUb0RhdGFPYmplY3QoY29uc3QgU3RyaW5nJiB0ZXh0LCBTbWFydFJlcGxhY2VP
cHRpb24gc21hcnRSZXBsYWNlT3B0aW9uKQoreworICAgIGlmICghbV93cml0YWJsZURhdGFPYmpl
Y3QpCisgICAgICAgIHJldHVybjsKKworICAgIFNUR01FRElVTSBtZWRpdW0gPSB7MH07CisgICAg
bWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKKworICAgIFN0cmluZyBzdHIgPSB0ZXh0Owor
ICAgIHJlcGxhY2VOZXdsaW5lc1dpdGhXaW5kb3dzU3R5bGVOZXdsaW5lcyhzdHIpOworICAgIHJl
cGxhY2VOQlNQV2l0aFNwYWNlKHN0cik7CisgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9i
YWxEYXRhKHN0cik7CisgICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxl
RGF0YU9iamVjdC0+U2V0RGF0YShwbGFpblRleHRXRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkK
KyAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsgICAgICAgIAorCisgICAgbWVk
aXVtLmhHbG9iYWwgPSAwOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6OndyaXRlUGxhaW5UZXh0KGNv
bnN0IFN0cmluZyYgdGV4dCwgU21hcnRSZXBsYWNlT3B0aW9uIHNtYXJ0UmVwbGFjZU9wdGlvbikK
IHsKICAgICBjbGVhcigpOwpAQCAtMTcxLDggKzUyMiwxNjUgQEANCiAgICAgICAgICAgICA6OkNs
b3NlQ2xpcGJvYXJkKCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICB3cml0ZVBsYWluVGV4dFRv
RGF0YU9iamVjdCh0ZXh0LCBzbWFydFJlcGxhY2VPcHRpb24pOwogfQogCisjaWYgIU9TKFdJTkNF
KQorc3RhdGljIGlubGluZSB2b2lkIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoUFdTVFIgcHN6
LCBzaXplX3QgbGVuZ3RoKQoreworICAgIHNpemVfdCB3cml0ZVRvID0gMDsKKyAgICBzaXplX3Qg
cmVhZEZyb20gPSAwOworICAgIHdoaWxlIChyZWFkRnJvbSA8IGxlbmd0aCkgeworICAgICAgICBV
SU5UIHR5cGUgPSBQYXRoR2V0Q2hhclR5cGUocHN6W3JlYWRGcm9tXSk7CisgICAgICAgIGlmICgh
cHN6W3JlYWRGcm9tXSB8fCB0eXBlICYgKEdDVF9MRk5DSEFSIHwgR0NUX1NIT1JUQ0hBUikpCisg
ICAgICAgICAgICBwc3pbd3JpdGVUbysrXSA9IHBzeltyZWFkRnJvbV07CisKKyAgICAgICAgcmVh
ZEZyb20rKzsKKyAgICB9CisgICAgcHN6W3dyaXRlVG9dID0gMDsKK30KKyNlbmRpZgorCitzdGF0
aWMgU3RyaW5nIGZpbGVzeXN0ZW1QYXRoRnJvbVVybE9yVGl0bGUoY29uc3QgU3RyaW5nJiB1cmws
IGNvbnN0IFN0cmluZyYgdGl0bGUsIGNvbnN0IFVDaGFyKiBleHRlbnNpb24sIGJvb2wgaXNMaW5r
KQoreworI2lmIE9TKFdJTkNFKQorICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIFN0
cmluZygpOworI2Vsc2UKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGZzUGF0aE1heExlbmd0aEV4
Y2x1ZGluZ051bGxUZXJtaW5hdG9yID0gTUFYX1BBVEggLSAxOworICAgIGJvb2wgdXNlZFVSTCA9
IGZhbHNlOworICAgIFdDSEFSIGZzUGF0aEJ1ZmZlcltNQVhfUEFUSF07CisgICAgZnNQYXRoQnVm
ZmVyWzBdID0gMDsKKyAgICBpbnQgZXh0ZW5zaW9uTGVuID0gZXh0ZW5zaW9uID8gbHN0cmxlbihl
eHRlbnNpb24pIDogMDsKKyAgICBpbnQgZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0ZW5zaW9u
ID0gZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nTnVsbFRlcm1pbmF0b3IgLSBleHRlbnNpb25MZW47
CisKKyAgICBpZiAoIXRpdGxlLmlzRW1wdHkoKSkgeworICAgICAgICBzaXplX3QgbGVuID0gc3Rk
OjptaW48c2l6ZV90Pih0aXRsZS5sZW5ndGgoKSwgZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0
ZW5zaW9uKTsKKyAgICAgICAgQ29weU1lbW9yeShmc1BhdGhCdWZmZXIsIHRpdGxlLmNoYXJhY3Rl
cnMoKSwgbGVuICogc2l6ZW9mKFVDaGFyKSk7CisgICAgICAgIGZzUGF0aEJ1ZmZlcltsZW5dID0g
MDsKKyAgICAgICAgcGF0aFJlbW92ZUJhZEZTQ2hhcmFjdGVycyhmc1BhdGhCdWZmZXIsIGxlbik7
CisgICAgfQorCisgICAgaWYgKCFsc3RybGVuKGZzUGF0aEJ1ZmZlcikpIHsKKyAgICAgICAgS1VS
TCBrdXJsKFBhcnNlZFVSTFN0cmluZywgdXJsKTsKKyAgICAgICAgdXNlZFVSTCA9IHRydWU7Cisg
ICAgICAgIC8vIFRoZSBmaWxlbmFtZSBmb3IgYW55IGNvbnRlbnQgYmFzZWQgZHJhZyBvciBmaWxl
IHVybCBzaG91bGQgYmUgdGhlIGxhc3QgZWxlbWVudCBvZiAKKyAgICAgICAgLy8gdGhlIHBhdGgu
ICBJZiB3ZSBjYW4ndCBmaW5kIGl0LCBvciB3ZSdyZSBjb21pbmcgdXAgd2l0aCB0aGUgbmFtZSBm
b3IgYSBsaW5rCisgICAgICAgIC8vIHdlIGp1c3QgdXNlIHRoZSBlbnRpcmUgdXJsLgorICAgICAg
ICBEV09SRCBsZW4gPSBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb247CisgICAgICAg
IFN0cmluZyBsYXN0Q29tcG9uZW50ID0ga3VybC5sYXN0UGF0aENvbXBvbmVudCgpOworICAgICAg
ICBpZiAoa3VybC5pc0xvY2FsRmlsZSgpIHx8ICghaXNMaW5rICYmICFsYXN0Q29tcG9uZW50Lmlz
RW1wdHkoKSkpIHsKKyAgICAgICAgICAgIGxlbiA9IHN0ZDo6bWluPERXT1JEPihmc1BhdGhNYXhM
ZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24sIGxhc3RDb21wb25lbnQubGVuZ3RoKCkpOworICAgICAg
ICAgICAgQ29weU1lbW9yeShmc1BhdGhCdWZmZXIsIGxhc3RDb21wb25lbnQuY2hhcmFjdGVycygp
LCBsZW4gKiBzaXplb2YoVUNoYXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxl
biA9IHN0ZDo6bWluPERXT1JEPihmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24sIHVy
bC5sZW5ndGgoKSk7CisgICAgICAgICAgICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgdXJsLmNo
YXJhY3RlcnMoKSwgbGVuICogc2l6ZW9mKFVDaGFyKSk7CisgICAgICAgIH0KKyAgICAgICAgZnNQ
YXRoQnVmZmVyW2xlbl0gPSAwOworICAgICAgICBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKGZz
UGF0aEJ1ZmZlciwgbGVuKTsKKyAgICB9CisKKyAgICBpZiAoIWV4dGVuc2lvbikKKyAgICAgICAg
cmV0dXJuIFN0cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+KGZzUGF0aEJ1ZmZlcikpOworCisgICAg
aWYgKCFpc0xpbmsgJiYgdXNlZFVSTCkgeworICAgICAgICBQYXRoUmVuYW1lRXh0ZW5zaW9uKGZz
UGF0aEJ1ZmZlciwgZXh0ZW5zaW9uKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZyhzdGF0aWNfY2Fz
dDxVQ2hhcio+KGZzUGF0aEJ1ZmZlcikpOworICAgIH0KKworICAgIHJldHVybiBtYWtlU3RyaW5n
KHN0YXRpY19jYXN0PGNvbnN0IFVDaGFyKj4oZnNQYXRoQnVmZmVyKSwgZXh0ZW5zaW9uKTsKKyNl
bmRpZgorfQorCisvLyB3cml0ZUZpbGVUb0RhdGFPYmplY3QgdGFrZXMgb3duZXJzaGlwIG9mIGZp
bGVEZXNjcmlwdG9yIGFuZCBmaWxlQ29udGVudAorc3RhdGljIEhSRVNVTFQgd3JpdGVGaWxlVG9E
YXRhT2JqZWN0KElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBIR0xPQkFMIGZpbGVEZXNjcmlwdG9y
LCBIR0xPQkFMIGZpbGVDb250ZW50LCBIR0xPQkFMIGhEcm9wQ29udGVudCkKK3sKKyAgICBIUkVT
VUxUIGhyID0gU19PSzsKKyAgICBGT1JNQVRFVEMqIGZlOworICAgIFNUR01FRElVTSBtZWRpdW0g
PSB7MH07CisgICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKKworICAgIGlmICghZmls
ZURlc2NyaXB0b3IgfHwgIWZpbGVDb250ZW50KQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICAv
LyBEZXNjcmlwdG9yCisgICAgZmUgPSBmaWxlRGVzY3JpcHRvckZvcm1hdCgpOworCisgICAgbWVk
aXVtLmhHbG9iYWwgPSBmaWxlRGVzY3JpcHRvcjsKKworICAgIGlmIChGQUlMRUQoaHIgPSBkYXRh
T2JqZWN0LT5TZXREYXRhKGZlLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIGdvdG8gZXhpdDsK
KworICAgIC8vIENvbnRlbnRzCisgICAgZmUgPSBmaWxlQ29udGVudEZvcm1hdFplcm8oKTsKKyAg
ICBtZWRpdW0uaEdsb2JhbCA9IGZpbGVDb250ZW50OworICAgIGlmIChGQUlMRUQoaHIgPSBkYXRh
T2JqZWN0LT5TZXREYXRhKGZlLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIGdvdG8gZXhpdDsK
KworI2lmIFVTRShDRikKKyAgICAvLyBIRFJPUAorICAgIGlmIChoRHJvcENvbnRlbnQpIHsKKyAg
ICAgICAgbWVkaXVtLmhHbG9iYWwgPSBoRHJvcENvbnRlbnQ7CisgICAgICAgIGhyID0gZGF0YU9i
amVjdC0+U2V0RGF0YShjZkhEcm9wRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpOworICAgIH0KKyNl
bmRpZgorCitleGl0OgorICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGlmIChmaWxlRGVz
Y3JpcHRvcikKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoZmlsZURlc2NyaXB0b3IpOworICAgICAg
ICBpZiAoZmlsZUNvbnRlbnQpCisgICAgICAgICAgICBHbG9iYWxGcmVlKGZpbGVDb250ZW50KTsK
KyAgICAgICAgaWYgKGhEcm9wQ29udGVudCkKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoaERyb3BD
b250ZW50KTsKKyAgICB9CisgICAgcmV0dXJuIGhyOworfQorCit2b2lkIFBhc3RlYm9hcmQ6Ondy
aXRlVVJMVG9EYXRhT2JqZWN0KGNvbnN0IEtVUkwmIGt1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGVT
dHIsIEZyYW1lKiBmcmFtZSkKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQorICAg
ICAgICByZXR1cm47CisgICAgV2ViQ29yZTo6d3JpdGVVUkwobV93cml0YWJsZURhdGFPYmplY3Qu
Z2V0KCksIGt1cmwsIHRpdGxlU3RyLCB0cnVlLCB0cnVlKTsKKworICAgIFN0cmluZyB1cmwgPSBr
dXJsLnN0cmluZygpOworICAgIEFTU0VSVCh1cmwuY29udGFpbnNPbmx5QVNDSUkoKSk7IC8vIEtV
Ukw6OnN0cmluZygpIGlzIFVSTCBlbmNvZGVkLgorCisgICAgU3RyaW5nIGZzUGF0aCA9IGZpbGVz
eXN0ZW1QYXRoRnJvbVVybE9yVGl0bGUodXJsLCB0aXRsZVN0ciwgTCIuVVJMIiwgdHJ1ZSk7Cisg
ICAgU3RyaW5nIGNvbnRlbnRTdHJpbmcoIltJbnRlcm5ldFNob3J0Y3V0XVxyXG5VUkw9IiArIHVy
bCArICJcclxuIik7CisgICAgQ1N0cmluZyBjb250ZW50ID0gY29udGVudFN0cmluZy5sYXRpbjEo
KTsKKworICAgIGlmIChmc1BhdGgubGVuZ3RoKCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgSEdMT0JBTCB1cmxGaWxlRGVzY3JpcHRvciA9IEdsb2JhbEFsbG9jKEdQVFIsIHNpemVvZihG
SUxFR1JPVVBERVNDUklQVE9SKSk7CisgICAgaWYgKCF1cmxGaWxlRGVzY3JpcHRvcikKKyAgICAg
ICAgcmV0dXJuOworCisgICAgSEdMT0JBTCB1cmxGaWxlQ29udGVudCA9IEdsb2JhbEFsbG9jKEdQ
VFIsIGNvbnRlbnQubGVuZ3RoKCkpOworICAgIGlmICghdXJsRmlsZUNvbnRlbnQpIHsKKyAgICAg
ICAgR2xvYmFsRnJlZSh1cmxGaWxlRGVzY3JpcHRvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBGSUxFR1JPVVBERVNDUklQVE9SKiBmZ2QgPSBzdGF0aWNfY2FzdDxGSUxFR1JPVVBE
RVNDUklQVE9SKj4oR2xvYmFsTG9jayh1cmxGaWxlRGVzY3JpcHRvcikpOworICAgIFplcm9NZW1v
cnkoZmdkLCBzaXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOworICAgIGZnZC0+Y0l0ZW1zID0g
MTsKKyAgICBmZ2QtPmZnZFswXS5kd0ZsYWdzID0gRkRfRklMRVNJWkU7CisgICAgZmdkLT5mZ2Rb
MF0ubkZpbGVTaXplTG93ID0gY29udGVudC5sZW5ndGgoKTsKKworICAgIHVuc2lnbmVkIG1heFNp
emUgPSBzdGQ6Om1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgoZmdkLT5mZ2Rb
MF0uY0ZpbGVOYW1lKSk7CisgICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmlsZU5hbWUsIGZz
UGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKKyAgICBHbG9iYWxV
bmxvY2sodXJsRmlsZURlc2NyaXB0b3IpOworCisgICAgY2hhciogZmlsZUNvbnRlbnRzID0gc3Rh
dGljX2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2sodXJsRmlsZUNvbnRlbnQpKTsKKyAgICBDb3B5TWVt
b3J5KGZpbGVDb250ZW50cywgY29udGVudC5kYXRhKCksIGNvbnRlbnQubGVuZ3RoKCkpOworICAg
IEdsb2JhbFVubG9jayh1cmxGaWxlQ29udGVudCk7CisKKyAgICB3cml0ZUZpbGVUb0RhdGFPYmpl
Y3QobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybEZpbGVEZXNjcmlwdG9yLCB1cmxGaWxl
Q29udGVudCwgMCk7Cit9CisKIHZvaWQgUGFzdGVib2FyZDo6d3JpdGVVUkwoY29uc3QgS1VSTCYg
dXJsLCBjb25zdCBTdHJpbmcmIHRpdGxlU3RyLCBGcmFtZSogZnJhbWUpCiB7CiAgICAgQVNTRVJU
KCF1cmwuaXNFbXB0eSgpKTsKQEAgLTIxMSw2ICs3MTksOCBAQA0KICAgICAgICAgICAgIDo6R2xv
YmFsRnJlZShjYkRhdGEpOwogICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7CiAgICAgfQorCisg
ICAgd3JpdGVVUkxUb0RhdGFPYmplY3QodXJsLCB0aXRsZVN0ciwgZnJhbWUpOwogfQogCiB2b2lk
IFBhc3RlYm9hcmQ6OndyaXRlSW1hZ2UoTm9kZSogbm9kZSwgY29uc3QgS1VSTCYsIGNvbnN0IFN0
cmluZyYpCkBAIC0yNTYsNiArNzY2LDExIEBADQogICAgIH0KIH0KIAordm9pZCBQYXN0ZWJvYXJk
Ojp3cml0ZVBhc3RlYm9hcmQoY29uc3QgUGFzdGVib2FyZCYgc291cmNlUGFzdGVib2FyZCkKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6OndyaXRlQ2xpcGJv
YXJkKENsaXBib2FyZCopCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKQEAgLTM1Miw0ICs4Njcs
MjA3IEBADQogICAgIHJldHVybiAwOwogfQogCit2b2lkIFBhc3RlYm9hcmQ6OnNldEV4dGVybmFs
RGF0YU9iamVjdChJRGF0YU9iamVjdCAqZGF0YU9iamVjdCkKK3sKKyAgICBtX3dyaXRhYmxlRGF0
YU9iamVjdCA9IDA7CisgICAgbV9kYXRhT2JqZWN0ID0gZGF0YU9iamVjdDsKK30KKworc3RhdGlj
IENhY2hlZEltYWdlKiBnZXRDYWNoZWRJbWFnZShFbGVtZW50KiBlbGVtZW50KQoreworICAgIC8v
IEF0dGVtcHQgdG8gcHVsbCBDYWNoZWRJbWFnZSBmcm9tIGVsZW1lbnQKKyAgICBBU1NFUlQoZWxl
bWVudCk7CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGVsZW1lbnQtPnJlbmRlcmVyKCk7
CisgICAgaWYgKCFyZW5kZXJlciB8fCAhcmVuZGVyZXItPmlzSW1hZ2UoKSkgCisgICAgICAgIHJl
dHVybiAwOworCisgICAgUmVuZGVySW1hZ2UqIGltYWdlID0gdG9SZW5kZXJJbWFnZShyZW5kZXJl
cik7CisgICAgaWYgKGltYWdlLT5jYWNoZWRJbWFnZSgpICYmICFpbWFnZS0+Y2FjaGVkSW1hZ2Uo
KS0+ZXJyb3JPY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gaW1hZ2UtPmNhY2hlZEltYWdlKCk7
CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSW1hZ2VG
aWxlRGVzY3JpcHRvcihjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ2Fj
aGVkSW1hZ2UqIGltYWdlKQoreworICAgIEFTU0VSVF9BUkcoaW1hZ2UsIGltYWdlKTsKKyAgICBB
U1NFUlQoaW1hZ2UtPmltYWdlKCktPmRhdGEoKSk7CisKKyAgICBIUkVTVUxUIGhyID0gU19PSzsK
KyAgICBIR0xPQkFMIG1lbU9iaiA9IDA7CisgICAgU3RyaW5nIGZzUGF0aDsKKyAgICBtZW1PYmog
PSBHbG9iYWxBbGxvYyhHUFRSLCBzaXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOworICAgIGlm
ICghbWVtT2JqKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEZJTEVHUk9VUERFU0NSSVBUT1Iq
IGZnZCA9IChGSUxFR1JPVVBERVNDUklQVE9SKilHbG9iYWxMb2NrKG1lbU9iaik7CisgICAgbWVt
c2V0KGZnZCwgMCwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKKyAgICBmZ2QtPmNJdGVt
cyA9IDE7CisgICAgZmdkLT5mZ2RbMF0uZHdGbGFncyA9IEZEX0ZJTEVTSVpFOworICAgIGZnZC0+
ZmdkWzBdLm5GaWxlU2l6ZUxvdyA9IGltYWdlLT5pbWFnZSgpLT5kYXRhKCktPnNpemUoKTsKKwor
ICAgIGNvbnN0IFN0cmluZyYgcHJlZmVycmVkVGl0bGUgPSB0aXRsZS5pc0VtcHR5KCkgPyBpbWFn
ZS0+cmVzcG9uc2UoKS5zdWdnZXN0ZWRGaWxlbmFtZSgpIDogdGl0bGU7CisgICAgU3RyaW5nIGV4
dGVuc2lvbiA9IGltYWdlLT5pbWFnZSgpLT5maWxlbmFtZUV4dGVuc2lvbigpOworICAgIGlmIChl
eHRlbnNpb24uaXNFbXB0eSgpKSB7CisgICAgICAgIC8vIERvIG5vdCBjb250aW51ZSBwcm9jZXNz
aW5nIGluIHRoZSByYXJlIGFuZCB1bnVzdWFsIGNhc2Ugd2hlcmUgYSBkZWNvZGVkIGltYWdlIGlz
IG5vdCBhYmxlIAorICAgICAgICAvLyB0byBwcm92aWRlIGEgZmlsZW5hbWUgZXh0ZW5zaW9uLiBT
b21ldGhpbmcgdHJpY2t5IChsaWtlIGEgYmFpdC1uLXN3aXRjaCkgaXMgZ29pbmcgb24KKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgfQorICAgIGV4dGVuc2lvbi5pbnNlcnQoIi4iLCAwKTsKKyAgICBm
c1BhdGggPSBmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRpdGxlKHVybCwgcHJlZmVycmVkVGl0bGUs
IGV4dGVuc2lvbi5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCBmYWxzZSk7CisKKyAg
ICBpZiAoZnNQYXRoLmxlbmd0aCgpIDw9IDApIHsKKyAgICAgICAgR2xvYmFsVW5sb2NrKG1lbU9i
aik7CisgICAgICAgIEdsb2JhbEZyZWUobWVtT2JqKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
fQorCisgICAgaW50IG1heFNpemUgPSBzdGQ6Om1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJB
WV9MRU5HVEgoZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lKSk7CisgICAgQ29weU1lbW9yeShmZ2QtPmZn
ZFswXS5jRmlsZU5hbWUsIChMUENXU1RSKWZzUGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBz
aXplb2YoVUNoYXIpKTsKKyAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKKworICAgIHJldHVybiBt
ZW1PYmo7Cit9CisKK3N0YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQo
U2hhcmVkQnVmZmVyKiBkYXRhKQoreworICAgIEhHTE9CQUwgbWVtT2JqID0gR2xvYmFsQWxsb2Mo
R1BUUiwgZGF0YS0+c2l6ZSgpKTsKKyAgICBpZiAoIW1lbU9iaikgCisgICAgICAgIHJldHVybiAw
OworCisgICAgY2hhciogZmlsZUNvbnRlbnRzID0gKFBTVFIpR2xvYmFsTG9jayhtZW1PYmopOwor
CisgICAgQ29weU1lbW9yeShmaWxlQ29udGVudHMsIGRhdGEtPmRhdGEoKSwgZGF0YS0+c2l6ZSgp
KTsKKworICAgIEdsb2JhbFVubG9jayhtZW1PYmopOworCisgICAgcmV0dXJuIG1lbU9iajsKK30K
Kworc3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSERyb3BDb250ZW50KGNvbnN0IEtVUkwmIHVy
bCwgU3RyaW5nJiBmaWxlTmFtZSwgU2hhcmVkQnVmZmVyKiBkYXRhKQoreworICAgIGlmIChmaWxl
TmFtZS5pc0VtcHR5KCkgfHwgIWRhdGEpCisgICAgICAgIHJldHVybiAwOworCisgICAgV0NIQVIg
ZmlsZVBhdGhbTUFYX1BBVEhdOworCisgICAgaWYgKHVybC5pc0xvY2FsRmlsZSgpKSB7CisgICAg
ICAgIFN0cmluZyBsb2NhbFBhdGggPSBkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXModXJsLnBhdGgo
KSk7CisgICAgICAgIC8vIHdpbmRvd3MgZG9lcyBub3QgZW5qb3kgYSBsZWFkaW5nIHNsYXNoIG9u
IHBhdGhzCisgICAgICAgIGlmIChsb2NhbFBhdGhbMF0gPT0gJy8nKQorICAgICAgICAgICAgbG9j
YWxQYXRoID0gbG9jYWxQYXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgTFBDV1NUUiBsb2NhbFBh
dGhTdHIgPSBsb2NhbFBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKTsKKyAgICAg
ICAgaWYgKHdjc2xlbihsb2NhbFBhdGhTdHIpICsgMSA8IE1BWF9QQVRIKQorICAgICAgICAgICAg
d2NzY3B5X3MoZmlsZVBhdGgsIE1BWF9QQVRILCBsb2NhbFBhdGhTdHIpOworICAgICAgICBlbHNl
CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworI2lmIE9TKFdJTkNFKQorICAg
ICAgICBub3RJbXBsZW1lbnRlZCgpOworICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgICAg
IFdDSEFSIHRlbXBQYXRoW01BWF9QQVRIXTsKKyAgICAgICAgV0NIQVIgZXh0ZW5zaW9uW01BWF9Q
QVRIXTsKKyAgICAgICAgaWYgKCE6OkdldFRlbXBQYXRoKFdURl9BUlJBWV9MRU5HVEgodGVtcFBh
dGgpLCB0ZW1wUGF0aCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCE6OlBh
dGhBcHBlbmQodGVtcFBhdGgsIGZpbGVOYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9u
KCkpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIExQQ1dTVFIgZm91bmRFeHRlbnNp
b24gPSA6OlBhdGhGaW5kRXh0ZW5zaW9uKHRlbXBQYXRoKTsKKyAgICAgICAgaWYgKGZvdW5kRXh0
ZW5zaW9uKSB7CisgICAgICAgICAgICBpZiAod2NzY3B5X3MoZXh0ZW5zaW9uLCBNQVhfUEFUSCwg
Zm91bmRFeHRlbnNpb24pKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVs
c2UKKyAgICAgICAgICAgICpleHRlbnNpb24gPSAwOworICAgICAgICA6OlBhdGhSZW1vdmVFeHRl
bnNpb24odGVtcFBhdGgpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwOyBpKysp
IHsKKyAgICAgICAgICAgIGlmIChzd3ByaW50Zl9zKGZpbGVQYXRoLCBNQVhfUEFUSCwgVEVYVCgi
JXMtJWQlcyIpLCB0ZW1wUGF0aCwgaSwgZXh0ZW5zaW9uKSA9PSAtMSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmICghOjpQYXRoRmlsZUV4aXN0cyhmaWxlUGF0aCkp
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgSEFORExFIHRlbXBG
aWxlSGFuZGxlID0gQ3JlYXRlRmlsZShmaWxlUGF0aCwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19X
UklURSwgMCwgMCwgQ1JFQVRFX0FMV0FZUywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCAwKTsKKyAg
ICAgICAgaWYgKHRlbXBGaWxlSGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgdG8gdGhpcyB0ZW1w
IGZpbGUuCisgICAgICAgIERXT1JEIHdyaXR0ZW47CisgICAgICAgIEJPT0wgdGVtcFdyaXRlU3Vj
Y2VlZGVkID0gV3JpdGVGaWxlKHRlbXBGaWxlSGFuZGxlLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNp
emUoKSwgJndyaXR0ZW4sIDApOworICAgICAgICBDbG9zZUhhbmRsZSh0ZW1wRmlsZUhhbmRsZSk7
CisgICAgICAgIGlmICghdGVtcFdyaXRlU3VjY2VlZGVkKQorICAgICAgICAgICAgcmV0dXJuIDA7
CisjZW5kaWYKKyAgICB9CisKKyAgICBTSVpFX1QgZHJvcEZpbGVzU2l6ZSA9IHNpemVvZihEUk9Q
RklMRVMpICsgKHNpemVvZihXQ0hBUikgKiAod2NzbGVuKGZpbGVQYXRoKSArIDIpKTsKKyAgICBI
R0xPQkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdITkQgfCBHTUVNX1NIQVJFLCBkcm9wRmlsZXNT
aXplKTsKKyAgICBpZiAoIW1lbU9iaikgCisgICAgICAgIHJldHVybiAwOworCisgICAgRFJPUEZJ
TEVTKiBkcm9wRmlsZXMgPSAoRFJPUEZJTEVTKikgR2xvYmFsTG9jayhtZW1PYmopOworICAgIGRy
b3BGaWxlcy0+cEZpbGVzID0gc2l6ZW9mKERST1BGSUxFUyk7CisgICAgZHJvcEZpbGVzLT5mV2lk
ZSA9IFRSVUU7CisgICAgd2NzY3B5KChMUFdTVFIpKGRyb3BGaWxlcyArIDEpLCBmaWxlUGF0aCk7
ICAgIAorICAgIEdsb2JhbFVubG9jayhtZW1PYmopOworCisgICAgcmV0dXJuIG1lbU9iajsKK30K
Kworc3RhdGljIHZvaWQgd3JpdGVJbWFnZVRvRGF0YU9iamVjdChJRGF0YU9iamVjdCogZGF0YU9i
amVjdCwgRWxlbWVudCogZWxlbWVudCwgY29uc3QgS1VSTCYgdXJsKQoreworICAgIC8vIFNob3Zl
IGltYWdlIGRhdGEgaW50byBhIERhdGFPYmplY3QgZm9yIHVzZSBhcyBhIGZpbGUKKyAgICBDYWNo
ZWRJbWFnZSogY2FjaGVkSW1hZ2UgPSBnZXRDYWNoZWRJbWFnZShlbGVtZW50KTsKKyAgICBpZiAo
IWNhY2hlZEltYWdlIHx8ICFjYWNoZWRJbWFnZS0+aW1hZ2VGb3JSZW5kZXJlcihlbGVtZW50LT5y
ZW5kZXJlcigpKSB8fCAhY2FjaGVkSW1hZ2UtPmlzTG9hZGVkKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIFNoYXJlZEJ1ZmZlciogaW1hZ2VCdWZmZXIgPSBjYWNoZWRJbWFnZS0+aW1hZ2VGb3JS
ZW5kZXJlcihlbGVtZW50LT5yZW5kZXJlcigpKS0+ZGF0YSgpOworICAgIGlmICghaW1hZ2VCdWZm
ZXIgfHwgIWltYWdlQnVmZmVyLT5zaXplKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEhHTE9C
QUwgaW1hZ2VGaWxlRGVzY3JpcHRvciA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZURlc2NyaXB0b3Io
dXJsLnN0cmluZygpLCBlbGVtZW50LT5nZXRBdHRyaWJ1dGUoSFRNTE5hbWVzOjphbHRBdHRyKSwg
Y2FjaGVkSW1hZ2UpOworICAgIGlmICghaW1hZ2VGaWxlRGVzY3JpcHRvcikKKyAgICAgICAgcmV0
dXJuOworCisgICAgSEdMT0JBTCBpbWFnZUZpbGVDb250ZW50ID0gY3JlYXRlR2xvYmFsSW1hZ2VG
aWxlQ29udGVudChpbWFnZUJ1ZmZlcik7CisgICAgaWYgKCFpbWFnZUZpbGVDb250ZW50KSB7Cisg
ICAgICAgIEdsb2JhbEZyZWUoaW1hZ2VGaWxlRGVzY3JpcHRvcik7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBTdHJpbmcgZmlsZU5hbWUgPSBjYWNoZWRJbWFnZS0+cmVzcG9uc2UoKS5z
dWdnZXN0ZWRGaWxlbmFtZSgpOworICAgIEhHTE9CQUwgaERyb3BDb250ZW50ID0gY3JlYXRlR2xv
YmFsSERyb3BDb250ZW50KHVybCwgZmlsZU5hbWUsIGltYWdlQnVmZmVyKTsKKyAgICBpZiAoIWhE
cm9wQ29udGVudCkgeworICAgICAgICBHbG9iYWxGcmVlKGhEcm9wQ29udGVudCk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICB3cml0ZUZpbGVUb0RhdGFPYmplY3QoZGF0YU9iamVjdCwg
aW1hZ2VGaWxlRGVzY3JpcHRvciwgaW1hZ2VGaWxlQ29udGVudCwgaERyb3BDb250ZW50KTsKK30K
Kwordm9pZCBQYXN0ZWJvYXJkOjpkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UoRWxlbWVudCogZWxl
bWVudCwgY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBGcmFtZSogZnJhbWUp
Cit7CisgICAgLy8gT3JkZXIgaXMgaW1wb3J0YW50IGhlcmUgZm9yIEV4cGxvcmVyJ3Mgc2FrZQor
ICAgIGlmICghbV93cml0YWJsZURhdGFPYmplY3QpCisgICAgICAgIHJldHVybjsKKyAgICBXZWJD
b3JlOjp3cml0ZVVSTChtX3dyaXRhYmxlRGF0YU9iamVjdC5nZXQoKSwgdXJsLCB0aXRsZSwgdHJ1
ZSwgZmFsc2UpOworCisgICAgd3JpdGVJbWFnZVRvRGF0YU9iamVjdChtX3dyaXRhYmxlRGF0YU9i
amVjdC5nZXQoKSwgZWxlbWVudCwgdXJsKTsKKworICAgIEF0b21pY1N0cmluZyBpbWFnZVVSTCA9
IGVsZW1lbnQtPmdldEF0dHJpYnV0ZShIVE1MTmFtZXM6OnNyY0F0dHIpOworICAgIGlmIChpbWFn
ZVVSTC5pc0VtcHR5KCkpIAorICAgICAgICByZXR1cm47CisKKyAgICBLVVJMIGZ1bGxVUkwgPSBm
cmFtZS0+ZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoc3RyaXBMZWFkaW5nQW5kVHJhaWxpbmdIVE1M
U3BhY2VzKGltYWdlVVJMKSk7CisgICAgaWYgKGZ1bGxVUkwuaXNFbXB0eSgpKSAKKyAgICAgICAg
cmV0dXJuOworICAgIFNUR01FRElVTSBtZWRpdW0gPSB7MH07CisgICAgbWVkaXVtLnR5bWVkID0g
VFlNRURfSEdMT0JBTDsKKworICAgIC8vIFB1dCBpbWcgdGFnIG9uIHRoZSBjbGlwYm9hcmQgcmVm
ZXJlbmNpbmcgdGhlIGltYWdlCisgICAgVmVjdG9yPGNoYXI+IGRhdGE7CisgICAgbWFya3VwVG9D
RkhUTUwoY3JlYXRlTWFya3VwKGVsZW1lbnQsIEluY2x1ZGVOb2RlLCAwLCBSZXNvbHZlQWxsVVJM
cyksICIiLCBkYXRhKTsKKyAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0
YSk7CisgICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVj
dC0+U2V0RGF0YShodG1sRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKKyAgICAgICAgOjpHbG9i
YWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRl
eDogU291cmNlL1dlYktpdC93aW4vQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gU291cmNlL1dl
YktpdC93aW4vQ2hhbmdlTG9nCShyZXZpc2lvbiAxNTA0OTQpDQorKysgU291cmNlL1dlYktpdC93
aW4vQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpDQpAQCAtMSwzICsxLDE0IEBADQorMjAxMy0wNS0y
MSAgWHVlcWluZyBIdWFuZyAgPGh1YW5neHVlcWluZ0BiYWlkdS5jb20+CisKKyAgICAgICAgTW92
ZSBXaW5kb3dzIHBvcnQgb2ZmIGxlZ2FjeSBjbGlwYm9hcmQuCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTYyNTgKKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGll
bnQuY3BwOgorICAgICAgICAoV2ViRHJhZ0NsaWVudDo6d2lsbFBlcmZvcm1EcmFnU291cmNlQWN0
aW9uKTogR2V0IElEYXRhT2JqZWN0IGZyb20gUGFzdGVib2FyZCBpbnN0ZWFkIG9mIENsaXBib2Fy
ZC4KKyAgICAgICAgKFdlYkRyYWdDbGllbnQ6OnN0YXJ0RHJhZyk6IERpdHRvLgorCiAyMDEzLTA1
LTE5ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBhcHBsZS5jb20+CiAKICAgICAgICAgUmVt
b3ZlIENocm9tZUNsaWVudDo6d2ViVmlldygpCkluZGV4OiBTb3VyY2UvV2ViS2l0L3dpbi9XZWJD
b3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJL
aXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQuY3BwCShyZXZpc2lvbiAxNTA0MzMp
DQorKysgU291cmNlL1dlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5jcHAJ
KHdvcmtpbmcgY29weSkNCkBAIC0zMSwxMCArMzEsMTcgQEANCiAKICNpbmNsdWRlIDxzaGxvYmou
aD4KIAorI2lmICFVU0UoTEVHQUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFTUykKKyNp
bmNsdWRlIDxXZWJDb3JlL0NsaXBib2FyZC5oPgorI2Vsc2UKICNpbmNsdWRlIDxXZWJDb3JlL0Ns
aXBib2FyZFdpbi5oPgorI2VuZGlmCiAjaW5jbHVkZSA8V2ViQ29yZS9EcmFnQ29udHJvbGxlci5o
PgogI2luY2x1ZGUgPFdlYkNvcmUvRHJhZ0RhdGEuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0V2ZW50
SGFuZGxlci5oPgorI2lmICFVU0UoTEVHQUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFT
UykKKyNpbmNsdWRlIDxXZWJDb3JlL1Bhc3RlYm9hcmQuaD4KKyNlbmRpZgogI2luY2x1ZGUgPFdl
YkNvcmUvUGxhdGZvcm1Nb3VzZUV2ZW50Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9GcmFtZS5oPgog
I2luY2x1ZGUgPFdlYkNvcmUvRnJhbWVWaWV3Lmg+CkBAIC0xMDMsMTIgKzExMCwyMSBAQA0KICAg
ICAgICAgcmV0dXJuOwogCiAgICAgUE9JTlQgcG9pbnQgPSBpbnRQb2ludDsKKyNpZiBVU0UoTEVH
QUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFTUykKICAgICBDT01QdHI8SURhdGFPYmpl
Y3Q+IGRhdGFPYmplY3QgPSBzdGF0aWNfY2FzdDxDbGlwYm9hcmRXaW4qPihjbGlwYm9hcmQpLT5k
YXRhT2JqZWN0KCk7CisjZWxzZQorICAgIFBhc3RlYm9hcmQqIHBhc3RlYm9hcmQgPSBjb25zdF9j
YXN0PFBhc3RlYm9hcmQqPigmY2xpcGJvYXJkLT5wYXN0ZWJvYXJkKCkpOworICAgIENPTVB0cjxJ
RGF0YU9iamVjdD4gZGF0YU9iamVjdCA9IHBhc3RlYm9hcmQtPmRhdGFPYmplY3QoKTsKKyNlbmRp
ZgogCiAgICAgQ09NUHRyPElEYXRhT2JqZWN0PiBuZXdEYXRhT2JqZWN0OwogICAgIEhSRVNVTFQg
cmVzdWx0ID0gdWlEZWxlZ2F0ZS0+d2lsbFBlcmZvcm1EcmFnU291cmNlQWN0aW9uKG1fd2ViVmll
dywgc3RhdGljX2Nhc3Q8V2ViRHJhZ1NvdXJjZUFjdGlvbj4oYWN0aW9uKSwgJnBvaW50LCBkYXRh
T2JqZWN0LmdldCgpLCAmbmV3RGF0YU9iamVjdCk7CiAgICAgaWYgKHJlc3VsdCA9PSBTX09LICYm
IG5ld0RhdGFPYmplY3QgIT0gZGF0YU9iamVjdCkKKyNpZiBVU0UoTEVHQUNZX1NUWUxFX0FCU1RS
QUNUX0NMSVBCT0FSRF9DTEFTUykKICAgICAgICAgc3RhdGljX2Nhc3Q8Q2xpcGJvYXJkV2luKj4o
Y2xpcGJvYXJkKS0+c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KG5ld0RhdGFPYmplY3QuZ2V0KCkpOwor
I2Vsc2UKKyAgICAgICAgcGFzdGVib2FyZC0+c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KG5ld0RhdGFP
YmplY3QuZ2V0KCkpOworI2VuZGlmCiB9CiAKIHZvaWQgV2ViRHJhZ0NsaWVudDo6c3RhcnREcmFn
KERyYWdJbWFnZVJlZiBpbWFnZSwgY29uc3QgSW50UG9pbnQmIGltYWdlT3JpZ2luLCBjb25zdCBJ
bnRQb2ludCYgZHJhZ1BvaW50LCBDbGlwYm9hcmQqIGNsaXBib2FyZCwgRnJhbWUqIGZyYW1lLCBi
b29sIGlzTGluaykKQEAgLTEyNCw3ICsxNDAsMTIgQEANCiAgICAgaWYgKEZBSUxFRChXZWJEcm9w
U291cmNlOjpjcmVhdGVJbnN0YW5jZShtX3dlYlZpZXcsICZzb3VyY2UpKSkKICAgICAgICAgcmV0
dXJuOwogCisjaWYgVVNFKExFR0FDWV9TVFlMRV9BQlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCiAg
ICAgZGF0YU9iamVjdCA9IHN0YXRpY19jYXN0PENsaXBib2FyZFdpbio+KGNsaXBib2FyZCktPmRh
dGFPYmplY3QoKTsKKyNlbHNlCisgICAgUGFzdGVib2FyZCogcGFzdGVib2FyZCA9IGNvbnN0X2Nh
c3Q8UGFzdGVib2FyZCo+KCZjbGlwYm9hcmQtPnBhc3RlYm9hcmQoKSk7CisgICAgZGF0YU9iamVj
dCA9IHBhc3RlYm9hcmQtPmRhdGFPYmplY3QoKTsKKyNlbmRpZgogICAgIGlmIChzb3VyY2UgJiYg
KGltYWdlIHx8IGRhdGFPYmplY3QpKSB7CiAgICAgICAgIGlmIChpbWFnZSkgewogICAgICAgICAg
ICAgaWYoU1VDQ0VFREVEKENvQ3JlYXRlSW5zdGFuY2UoQ0xTSURfRHJhZ0Ryb3BIZWxwZXIsIDAs
IENMU0NUWF9JTlBST0NfU0VSVkVSLAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>202491</attachid>
            <date>2013-05-21 19:53:04 -0700</date>
            <delta_ts>2013-05-21 19:54:56 -0700</delta_ts>
            <desc>patch</desc>
            <filename>116258.patch</filename>
            <type>text/plain</type>
            <size>68076</size>
            <attacher name="huangxueqing">huangxueqing</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9X
ZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNDk0KQ0KKysrIFNvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEsMyArMSw2MiBAQA0KKzIwMTMtMDUtMjEgIFh1
ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgorCisgICAgICAgIE1vdmUgV2lu
ZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJkLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdHM6CisgICAgICAgIENsaXBib2FyZCByZWZhY3Rv
ciwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogZG9tL0NsaXBib2FyZC5oOgorICAgICAgICAq
IHBhZ2Uvd2luL0V2ZW50SGFuZGxlcldpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFdmVudEhh
bmRsZXI6OmNyZWF0ZURyYWdnaW5nQ2xpcGJvYXJkKTogQ3JlYXRlIENsaXBib2FyZCBpbnN0ZWFk
IG9mIENsaXBib2FyZFdpbi4KKyAgICAgICAgKiBwbGF0Zm9ybS9QYXN0ZWJvYXJkLmg6CisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFBhc3RlYm9hcmQpOgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6ZGF0YU9iamVjdCk6IEdldCBJRGF0YU9iamVjdCBieSBDbGlwYm9yYWQuCisg
ICAgICAgICogcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpDbGlwYm9hcmQ6OmNyZWF0ZURyYWdJbWFnZSk6IENoYW5nZSBwYXJhbWV0ZXIgbmFtZSBsb2Mg
dG8gZHJhZ0xvY2F0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q2xpcGJvYXJkOjpkZWNsYXJlQW5k
V3JpdGVEcmFnSW1hZ2UpOiBNb3ZlIGltcGxlbWVudGF0aW9uIGludG8gUGFzdGVib2FyZFdpbi5j
cHAuCisgICAgICAgICogcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5oOiBSZW1vdmVkLgorICAg
ICAgICAqIHBsYXRmb3JtL3dpbi9FZGl0b3JXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6RWRp
dG9yOjpuZXdHZW5lcmFsQ2xpcGJvYXJkKTogQ3JlYXRlIENsaXBib2FyZCBpbnN0ZWFkIG9mIENs
aXBib2FyZFdpbi4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmNyZWF0ZUZv
ckNvcHlBbmRQYXN0ZSk6IENyZWF0ZSBhIFBhc3RlYm9hcmQuCisgICAgICAgIChXZWJDb3JlOjpQ
YXN0ZWJvYXJkOjpjcmVhdGVQcml2YXRlKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0
ZWJvYXJkOjpjcmVhdGVGb3JEcmFnQW5kRHJvcCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6Y3JlYXRlUGFzdGVib2FyZFByaXZhdGUpOiBDcmVhdGUgUGFzdGVib2FyZCB1
c2UgV2luZG93cyBBUEkuCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpQYXN0ZWJvYXJk
KToKKyAgICAgICAgKFdlYkNvcmU6OmNsaXBib2FyZFR5cGVGcm9tTUlNRVR5cGUpOiBDb3BpZWQg
ZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6Y2xl
YXIpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6Omhhc0RhdGEpOiBEaXR0
by4KKyAgICAgICAgKFdlYkNvcmU6OmFkZE1pbWVUeXBlc0ZvckZvcm1hdCk6IERpdHRvLgorICAg
ICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6dHlwZXMpOiBEaXR0by4KKyAgICAgICAgKFdlYkNv
cmU6OlBhc3RlYm9hcmQ6OnJlYWRTdHJpbmcpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBh
c3RlYm9hcmQ6OnJlYWRGaWxlbmFtZXMpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OndyaXRl
VVJMKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVN0cmluZyk6
IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6c2V0RHJhZ0ltYWdlKTogRGl0
dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVJhbmdlVG9EYXRhT2JqZWN0
KTogV3JpdGUgcmFuZ2UgdG8gV0NEYXRhT2JqZWN0LgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVi
b2FyZDo6d3JpdGVTZWxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3Jp
dGVQbGFpblRleHRUb0RhdGFPYmplY3QpOiBXcml0ZSBQbGFpblRleHQgdG8gV0NEYXRhT2JqZWN0
LgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVQbGFpblRleHQpOgorICAgICAg
ICAoV2ViQ29yZTo6cGF0aFJlbW92ZUJhZEZTQ2hhcmFjdGVycyk6IENvcGllZCBmcm9tIENsaXBi
b2FyZFdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRp
dGxlKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjp3cml0ZUZpbGVUb0RhdGFPYmplY3QpOiBE
aXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlVVJMVG9EYXRhT2JqZWN0
KTogV3JpdGUgVVJMIHRvIFdDRGF0YU9iamVjdC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9h
cmQ6OndyaXRlVVJMKTogQ29waWVkIGZyb20gQ2xpcGJvYXJkV2luLmNwcC4KKyAgICAgICAgKFdl
YkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlUGFzdGVib2FyZCk6ICBDb3BpZWQgZnJvbSBQYXN0ZWJv
YXJkOjp3cml0ZUNsaXBib2FyZC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmRvY3Vt
ZW50RnJhZ21lbnQpOiBDb3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6UGFzdGVib2FyZDo6c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KTogQ2xpcGJvYXJkIGNhbiBz
ZXQgbmV3IElEYXRhT2JqZWN0LgorICAgICAgICAoV2ViQ29yZTo6Z2V0Q2FjaGVkSW1hZ2UpOiBD
b3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlR2xv
YmFsSW1hZ2VGaWxlRGVzY3JpcHRvcik6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
R2xvYmFsSW1hZ2VGaWxlQ29udGVudCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
R2xvYmFsSERyb3BDb250ZW50KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjp3cml0ZUltYWdl
VG9EYXRhT2JqZWN0KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpkZWNs
YXJlQW5kV3JpdGVEcmFnSW1hZ2UpOiBDb3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorCiAy
MDEzLTA1LTIxICBBbmR5IEVzdGVzICA8YWVzdGVzQGFwcGxlLmNvbT4KIAogICAgICAgICBBbGxv
dyBzZXNzaW9uIHN0b3JhZ2UgZm9yIHRoaXJkLXBhcnR5IG9yaWdpbnMgZXZlbiBpZiB0aGlyZC1w
YXJ0eSBkYXRhIGFjY2VzcyBpcyBibG9ja2VkLgpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0Ns
aXBib2FyZC5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09DQotLS0gU291cmNlL1dlYkNvcmUvZG9tL0NsaXBib2FyZC5o
CShyZXZpc2lvbiAxNTA0MzMpDQorKysgU291cmNlL1dlYkNvcmUvZG9tL0NsaXBib2FyZC5oCSh3
b3JraW5nIGNvcHkpDQpAQCAtMzQsNyArMzQsNyBAQA0KIC8vIFRoaXMgRE9NIG9iamVjdCBub3cg
d29ya3MgYnkgY2FsbGluZyB0aHJvdWdoIHRvIGNsYXNzZXMgaW4gdGhlIHBsYXRmb3JtIGxheWVy
LgogLy8gU3BlY2lmaWNhbGx5LCB0aGUgY2xhc3MgY3VycmVudGx5IG5hbWVkIFBhc3RlYm9hcmQu
IFRoZSBsZWdhY3kgc3R5bGUgaW5zdGVhZAogLy8gdXNlcyB0aGlzIGFzIGFuIGFic3RyYWN0IGJh
c2UgY2xhc3MuCi0jZGVmaW5lIFdURl9VU0VfTEVHQUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FS
RF9DTEFTUyAoUExBVEZPUk0oSU9TKSB8fCBQTEFURk9STShRVCkgfHwgUExBVEZPUk0oV0lOKSkK
KyNkZWZpbmUgV1RGX1VTRV9MRUdBQ1lfU1RZTEVfQUJTVFJBQ1RfQ0xJUEJPQVJEX0NMQVNTIChQ
TEFURk9STShJT1MpIHx8IFBMQVRGT1JNKFFUKSkKIAogI2lmIFVTRShMRUdBQ1lfU1RZTEVfQUJT
VFJBQ1RfQ0xJUEJPQVJEX0NMQVNTKQogI2RlZmluZSBMRUdBQ1lfVklSVFVBTCB2aXJ0dWFsCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL3dpbi9FdmVudEhhbmRsZXJXaW4uY3BwDQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09DQotLS0gU291cmNlL1dlYkNvcmUvcGFnZS93aW4vRXZlbnRIYW5kbGVyV2luLmNwcAkocmV2
aXNpb24gMTUwNDMzKQ0KKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2Uvd2luL0V2ZW50SGFuZGxlcldp
bi5jcHAJKHdvcmtpbmcgY29weSkNCkBAIC00MywxMSArNDMsMTYgQEANCiAjaW5jbHVkZSAiV0NE
YXRhT2JqZWN0LmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKIAorI2lmICFVU0UoTEVH
QUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFTUykKKyNpbmNsdWRlICJDT01QdHIuaCIK
KyNpbmNsdWRlICJDbGlwYm9hcmQuaCIKKyNlbHNlCiAjaWYgT1MoV0lOQ0UpCiAjaW5jbHVkZSAi
Q2xpcGJvYXJkLmgiCiAjZWxzZQogI2luY2x1ZGUgIkNsaXBib2FyZFdpbi5oIgogI2VuZGlmCisj
ZW5kaWYKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC0xMDEsMTAgKzEwNiwxNCBAQA0KICNp
ZiBPUyhXSU5DRSkKICAgICByZXR1cm4gMDsKICNlbHNlCisjaWYgVVNFKExFR0FDWV9TVFlMRV9B
QlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCiAgICAgQ09NUHRyPFdDRGF0YU9iamVjdD4gZGF0YU9i
amVjdDsKICAgICBXQ0RhdGFPYmplY3Q6OmNyZWF0ZUluc3RhbmNlKCZkYXRhT2JqZWN0KTsKICAg
ICByZXR1cm4gQ2xpcGJvYXJkV2luOjpjcmVhdGUoQ2xpcGJvYXJkOjpEcmFnQW5kRHJvcCwgZGF0
YU9iamVjdC5nZXQoKSwgQ2xpcGJvYXJkV3JpdGFibGUsIG1fZnJhbWUpOworI2Vsc2UKKyAgICBy
ZXR1cm4gQ2xpcGJvYXJkOjpjcmVhdGVGb3JEcmFnQW5kRHJvcCgpOwogI2VuZGlmCisjZW5kaWYK
IH0KICNlbmRpZgogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgN
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0NCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgJKHJl
dmlzaW9uIDE1MDQzMykNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgJ
KHdvcmtpbmcgY29weSkNCkBAIC0zOCw2ICszOCw5IEBADQogI2VuZGlmCiAKICNpZiBQTEFURk9S
TShXSU4pCisjaW5jbHVkZSA8V2ViQ29yZS9DT01QdHIuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1dD
RGF0YU9iamVjdC5oPgorI2luY2x1ZGUgPG9iamlkbC5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4K
IHR5cGVkZWYgc3RydWN0IEhXTkRfXyogSFdORDsKICNlbmRpZgpAQCAtNjQsNiArNjcsOSBAQA0K
IGNsYXNzIENsaXBib2FyZDsKIGNsYXNzIERvY3VtZW50RnJhZ21lbnQ7CiBjbGFzcyBEcmFnRGF0
YTsKKyNpZiBQTEFURk9STShXSU4pCitjbGFzcyBFbGVtZW50OworI2VuZGlmCiBjbGFzcyBGcmFt
ZTsKIGNsYXNzIEhpdFRlc3RSZXN1bHQ7CiBjbGFzcyBLVVJMOwpAQCAtMTAwLDYgKzEwNiwxMiBA
QA0KICAgICBQYXNzUmVmUHRyPERhdGFPYmplY3RHdGs+IGRhdGFPYmplY3QoKSBjb25zdDsKICNl
bmRpZgogCisjaWYgUExBVEZPUk0oV0lOKQorICAgIGV4cGxpY2l0IFBhc3RlYm9hcmQoSURhdGFP
YmplY3QqKTsKKyAgICBleHBsaWNpdCBQYXN0ZWJvYXJkKFdDRGF0YU9iamVjdCopOworICAgIGV4
cGxpY2l0IFBhc3RlYm9hcmQoY29uc3QgRHJhZ0RhdGFNYXAmKTsKKyNlbmRpZgorCiAgICAgLy8g
RGVwcmVjYXRlZC4gVXNlIGNyZWF0ZUZvckNvcHlBbmRQYXN0ZSBpbnN0ZWFkLgogICAgIHN0YXRp
YyBQYXN0ZWJvYXJkKiBnZW5lcmFsUGFzdGVib2FyZCgpOwogCkBAIC0xNTMsNiArMTY1LDEyIEBA
DQogICAgIHZvaWQgc2V0U2VsZWN0aW9uTW9kZShib29sKSB7IH0KICNlbmRpZgogCisjaWYgUExB
VEZPUk0oV0lOKQorICAgIENPTVB0cjxJRGF0YU9iamVjdD4gZGF0YU9iamVjdCgpIHsgcmV0dXJu
IG1fZGF0YU9iamVjdDsgfQorICAgIHZvaWQgc2V0RXh0ZXJuYWxEYXRhT2JqZWN0KElEYXRhT2Jq
ZWN0Kik7CisgICAgdm9pZCBkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UoRWxlbWVudCosIGNvbnN0
IEtVUkwmLCBjb25zdCBTdHJpbmcmLCBGcmFtZSopOworI2VuZGlmCisKICNpZiBQTEFURk9STShH
VEspCiAgICAgflBhc3RlYm9hcmQoKTsKICNlbmRpZgpAQCAtMTc1LDcgKzE5MywxNSBAQA0KICNl
bmRpZgogCiAjaWYgUExBVEZPUk0oV0lOKQorICAgIHZvaWQgY3JlYXRlUGFzdGVib2FyZFByaXZh
dGUoKTsKKyAgICB2b2lkIHdyaXRlUmFuZ2VUb0RhdGFPYmplY3QoUmFuZ2UqLCBGcmFtZSopOwor
ICAgIHZvaWQgd3JpdGVVUkxUb0RhdGFPYmplY3QoY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYs
IEZyYW1lKik7CisgICAgdm9pZCB3cml0ZVBsYWluVGV4dFRvRGF0YU9iamVjdChjb25zdCBTdHJp
bmcmLCBTbWFydFJlcGxhY2VPcHRpb24pOworCiAgICAgSFdORCBtX293bmVyOworICAgIENPTVB0
cjxJRGF0YU9iamVjdD4gbV9kYXRhT2JqZWN0OworICAgIENPTVB0cjxXQ0RhdGFPYmplY3Q+IG1f
d3JpdGFibGVEYXRhT2JqZWN0OworICAgIERyYWdEYXRhTWFwIG1fZHJhZ0RhdGFNYXA7CiAjZW5k
aWYKIAogI2lmIFBMQVRGT1JNKFFUKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2lu
L0NsaXBib2FyZFdpbi5jcHANCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS93aW4vQ2xpcGJvYXJkV2luLmNwcAkocmV2aXNpb24gMTUwNDMzKQ0KKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4uY3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtMSw1
ICsxLDYgQEANCiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgWHVlcWluZyBIdWFuZyA8
aHVhbmd4dWVxaW5nQGJhaWR1LmNvbT4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpA
QCAtMjQsNzk1ICsyNSwzNiBAQA0KICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVk
ZSAiQ2xpcGJvYXJkV2luLmgiCisjaW5jbHVkZSAiQ2xpcGJvYXJkLmgiCiAKICNpbmNsdWRlICJD
YWNoZWRJbWFnZS5oIgotI2luY2x1ZGUgIkNsaXBib2FyZFV0aWxpdGllc1dpbi5oIgogI2luY2x1
ZGUgIkRvY3VtZW50LmgiCi0jaW5jbHVkZSAiRHJhZ0RhdGEuaCIKLSNpbmNsdWRlICJFZGl0b3Iu
aCIKLSNpbmNsdWRlICJFbGVtZW50LmgiCi0jaW5jbHVkZSAiRXZlbnRIYW5kbGVyLmgiCi0jaW5j
bHVkZSAiRmlsZUxpc3QuaCIKICNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIkZyYW1lTG9h
ZGVyLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0j
aW5jbHVkZSAiSFRNTFBhcnNlcklkaW9tcy5oIgotI2luY2x1ZGUgIkltYWdlLmgiCi0jaW5jbHVk
ZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgotI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCi0jaW5j
bHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlBhc3RlYm9hcmQuaCIKLSNpbmNsdWRlICJQbGF0Zm9y
bU1vdXNlRXZlbnQuaCIKLSNpbmNsdWRlICJSYW5nZS5oIgotI2luY2x1ZGUgIlJlbmRlckltYWdl
LmgiCi0jaW5jbHVkZSAiUmVzb3VyY2VSZXNwb25zZS5oIgotI2luY2x1ZGUgIlNoYXJlZEJ1ZmZl
ci5oIgotI2luY2x1ZGUgIldDRGF0YU9iamVjdC5oIgotI2luY2x1ZGUgIm1hcmt1cC5oIgotI2lu
Y2x1ZGUgPHNobHdhcGkuaD4KLSNpbmNsdWRlIDx3aW5pbmV0Lmg+Ci0jaW5jbHVkZSA8d3RmL1Jl
ZlB0ci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KLSNpbmNsdWRlIDx3dGYvdGV4
dC9XVEZTdHJpbmcuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CiAKLXVzaW5n
IG5hbWVzcGFjZSBzdGQ7Ci0KIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNl
IEhUTUxOYW1lczsKLQotLy8gV2UgcHJvdmlkZSB0aGUgSUUgY2xpcGJvYXJkIHR5cGVzIChVUkwg
YW5kIFRleHQpLCBhbmQgdGhlIGNsaXBib2FyZCB0eXBlcyBzcGVjaWZpZWQgaW4gdGhlIFdIQVRX
RyBXZWIgQXBwbGljYXRpb25zIDEuMCBkcmFmdAotLy8gc2VlIGh0dHA6Ly93d3cud2hhdHdnLm9y
Zy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvIFNlY3Rpb24gNi4zLjUuMwotCi1lbnVtIENs
aXBib2FyZERhdGFUeXBlIHsgQ2xpcGJvYXJkRGF0YVR5cGVOb25lLCBDbGlwYm9hcmREYXRhVHlw
ZVVSTCwgQ2xpcGJvYXJkRGF0YVR5cGVUZXh0LCBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MIH07
Ci0KLXN0YXRpYyBDbGlwYm9hcmREYXRhVHlwZSBjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKGNv
bnN0IFN0cmluZyYgdHlwZSkKK0RyYWdJbWFnZVJlZiBDbGlwYm9hcmQ6OmNyZWF0ZURyYWdJbWFn
ZShJbnRQb2ludCYgZHJhZ0xvY2F0aW9uKSBjb25zdAogewotICAgIFN0cmluZyBxVHlwZSA9IHR5
cGUuc3RyaXBXaGl0ZVNwYWNlKCkubG93ZXIoKTsKLQotICAgIC8vIHR3byBzcGVjaWFsIGNhc2Vz
IGZvciBJRSBjb21wYXRpYmlsaXR5Ci0gICAgaWYgKHFUeXBlID09ICJ0ZXh0IiB8fCBxVHlwZSA9
PSAidGV4dC9wbGFpbiIgfHwgcVR5cGUuc3RhcnRzV2l0aCgidGV4dC9wbGFpbjsiKSkKLSAgICAg
ICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVGV4dDsKLSAgICBpZiAocVR5cGUgPT0gInVybCIg
fHwgcVR5cGUgPT0gInRleHQvdXJpLWxpc3QiKQotICAgICAgICByZXR1cm4gQ2xpcGJvYXJkRGF0
YVR5cGVVUkw7Ci0gICAgaWYgKHFUeXBlID09ICJ0ZXh0L2h0bWwiKQotICAgICAgICByZXR1cm4g
Q2xpcGJvYXJkRGF0YVR5cGVUZXh0SFRNTDsKLQotICAgIHJldHVybiBDbGlwYm9hcmREYXRhVHlw
ZU5vbmU7Ci19Ci0KLSNpZiAhT1MoV0lOQ0UpCi1zdGF0aWMgaW5saW5lIHZvaWQgcGF0aFJlbW92
ZUJhZEZTQ2hhcmFjdGVycyhQV1NUUiBwc3osIHNpemVfdCBsZW5ndGgpCi17Ci0gICAgc2l6ZV90
IHdyaXRlVG8gPSAwOwotICAgIHNpemVfdCByZWFkRnJvbSA9IDA7Ci0gICAgd2hpbGUgKHJlYWRG
cm9tIDwgbGVuZ3RoKSB7Ci0gICAgICAgIFVJTlQgdHlwZSA9IFBhdGhHZXRDaGFyVHlwZShwc3pb
cmVhZEZyb21dKTsKLSAgICAgICAgaWYgKCFwc3pbcmVhZEZyb21dIHx8IHR5cGUgJiAoR0NUX0xG
TkNIQVIgfCBHQ1RfU0hPUlRDSEFSKSkKLSAgICAgICAgICAgIHBzelt3cml0ZVRvKytdID0gcHN6
W3JlYWRGcm9tXTsKLQotICAgICAgICByZWFkRnJvbSsrOwotICAgIH0KLSAgICBwc3pbd3JpdGVU
b10gPSAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBTdHJpbmcgZmlsZXN5c3RlbVBhdGhGcm9tVXJs
T3JUaXRsZShjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgY29uc3QgVUNo
YXIqIGV4dGVuc2lvbiwgYm9vbCBpc0xpbmspCi17Ci0jaWYgT1MoV0lOQ0UpCi0gICAgbm90SW1w
bGVtZW50ZWQoKTsKLSAgICByZXR1cm4gU3RyaW5nKCk7Ci0jZWxzZQotICAgIHN0YXRpYyBjb25z
dCBzaXplX3QgZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nTnVsbFRlcm1pbmF0b3IgPSBNQVhfUEFU
SCAtIDE7Ci0gICAgYm9vbCB1c2VkVVJMID0gZmFsc2U7Ci0gICAgV0NIQVIgZnNQYXRoQnVmZmVy
W01BWF9QQVRIXTsKLSAgICBmc1BhdGhCdWZmZXJbMF0gPSAwOwotICAgIGludCBleHRlbnNpb25M
ZW4gPSBleHRlbnNpb24gPyBsc3RybGVuKGV4dGVuc2lvbikgOiAwOwotICAgIGludCBmc1BhdGhN
YXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24gPSBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdOdWxs
VGVybWluYXRvciAtIGV4dGVuc2lvbkxlbjsKLQotICAgIGlmICghdGl0bGUuaXNFbXB0eSgpKSB7
Ci0gICAgICAgIHNpemVfdCBsZW4gPSBtaW48c2l6ZV90Pih0aXRsZS5sZW5ndGgoKSwgZnNQYXRo
TWF4TGVuZ3RoRXhjbHVkaW5nRXh0ZW5zaW9uKTsKLSAgICAgICAgQ29weU1lbW9yeShmc1BhdGhC
dWZmZXIsIHRpdGxlLmNoYXJhY3RlcnMoKSwgbGVuICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgICAg
IGZzUGF0aEJ1ZmZlcltsZW5dID0gMDsKLSAgICAgICAgcGF0aFJlbW92ZUJhZEZTQ2hhcmFjdGVy
cyhmc1BhdGhCdWZmZXIsIGxlbik7Ci0gICAgfQotCi0gICAgaWYgKCFsc3RybGVuKGZzUGF0aEJ1
ZmZlcikpIHsKLSAgICAgICAgS1VSTCBrdXJsKFBhcnNlZFVSTFN0cmluZywgdXJsKTsKLSAgICAg
ICAgdXNlZFVSTCA9IHRydWU7Ci0gICAgICAgIC8vIFRoZSBmaWxlbmFtZSBmb3IgYW55IGNvbnRl
bnQgYmFzZWQgZHJhZyBvciBmaWxlIHVybCBzaG91bGQgYmUgdGhlIGxhc3QgZWxlbWVudCBvZiAK
LSAgICAgICAgLy8gdGhlIHBhdGguICBJZiB3ZSBjYW4ndCBmaW5kIGl0LCBvciB3ZSdyZSBjb21p
bmcgdXAgd2l0aCB0aGUgbmFtZSBmb3IgYSBsaW5rCi0gICAgICAgIC8vIHdlIGp1c3QgdXNlIHRo
ZSBlbnRpcmUgdXJsLgotICAgICAgICBEV09SRCBsZW4gPSBmc1BhdGhNYXhMZW5ndGhFeGNsdWRp
bmdFeHRlbnNpb247Ci0gICAgICAgIFN0cmluZyBsYXN0Q29tcG9uZW50ID0ga3VybC5sYXN0UGF0
aENvbXBvbmVudCgpOwotICAgICAgICBpZiAoa3VybC5pc0xvY2FsRmlsZSgpIHx8ICghaXNMaW5r
ICYmICFsYXN0Q29tcG9uZW50LmlzRW1wdHkoKSkpIHsKLSAgICAgICAgICAgIGxlbiA9IG1pbjxE
V09SRD4oZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0ZW5zaW9uLCBsYXN0Q29tcG9uZW50Lmxl
bmd0aCgpKTsKLSAgICAgICAgICAgIENvcHlNZW1vcnkoZnNQYXRoQnVmZmVyLCBsYXN0Q29tcG9u
ZW50LmNoYXJhY3RlcnMoKSwgbGVuICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICBsZW4gPSBtaW48RFdPUkQ+KGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4
dGVuc2lvbiwgdXJsLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIENvcHlNZW1vcnkoZnNQYXRoQnVm
ZmVyLCB1cmwuY2hhcmFjdGVycygpLCBsZW4gKiBzaXplb2YoVUNoYXIpKTsKLSAgICAgICAgfQot
ICAgICAgICBmc1BhdGhCdWZmZXJbbGVuXSA9IDA7Ci0gICAgICAgIHBhdGhSZW1vdmVCYWRGU0No
YXJhY3RlcnMoZnNQYXRoQnVmZmVyLCBsZW4pOwotICAgIH0KLQotICAgIGlmICghZXh0ZW5zaW9u
KQotICAgICAgICByZXR1cm4gU3RyaW5nKHN0YXRpY19jYXN0PFVDaGFyKj4oZnNQYXRoQnVmZmVy
KSk7Ci0KLSAgICBpZiAoIWlzTGluayAmJiB1c2VkVVJMKSB7Ci0gICAgICAgIFBhdGhSZW5hbWVF
eHRlbnNpb24oZnNQYXRoQnVmZmVyLCBleHRlbnNpb24pOwotICAgICAgICByZXR1cm4gU3RyaW5n
KHN0YXRpY19jYXN0PFVDaGFyKj4oZnNQYXRoQnVmZmVyKSk7Ci0gICAgfQotCi0gICAgcmV0dXJu
IG1ha2VTdHJpbmcoc3RhdGljX2Nhc3Q8Y29uc3QgVUNoYXIqPihmc1BhdGhCdWZmZXIpLCBleHRl
bnNpb24pOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmls
ZUNvbnRlbnQoU2hhcmVkQnVmZmVyKiBkYXRhKQotewotICAgIEhHTE9CQUwgbWVtT2JqID0gR2xv
YmFsQWxsb2MoR1BUUiwgZGF0YS0+c2l6ZSgpKTsKLSAgICBpZiAoIW1lbU9iaikgCi0gICAgICAg
IHJldHVybiAwOwotCi0gICAgY2hhciogZmlsZUNvbnRlbnRzID0gKFBTVFIpR2xvYmFsTG9jayht
ZW1PYmopOwotCi0gICAgQ29weU1lbW9yeShmaWxlQ29udGVudHMsIGRhdGEtPmRhdGEoKSwgZGF0
YS0+c2l6ZSgpKTsKLSAgICAKLSAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKLSAgICAKLSAgICBy
ZXR1cm4gbWVtT2JqOwotfQotCi1zdGF0aWMgSEdMT0JBTCBjcmVhdGVHbG9iYWxIRHJvcENvbnRl
bnQoY29uc3QgS1VSTCYgdXJsLCBTdHJpbmcmIGZpbGVOYW1lLCBTaGFyZWRCdWZmZXIqIGRhdGEp
Ci17Ci0gICAgaWYgKGZpbGVOYW1lLmlzRW1wdHkoKSB8fCAhZGF0YSkKLSAgICAgICAgcmV0dXJu
IDA7Ci0KLSAgICBXQ0hBUiBmaWxlUGF0aFtNQVhfUEFUSF07Ci0KLSAgICBpZiAodXJsLmlzTG9j
YWxGaWxlKCkpIHsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGF0aCA9IGRlY29kZVVSTEVzY2FwZVNl
cXVlbmNlcyh1cmwucGF0aCgpKTsKLSAgICAgICAgLy8gd2luZG93cyBkb2VzIG5vdCBlbmpveSBh
IGxlYWRpbmcgc2xhc2ggb24gcGF0aHMKLSAgICAgICAgaWYgKGxvY2FsUGF0aFswXSA9PSAnLycp
Ci0gICAgICAgICAgICBsb2NhbFBhdGggPSBsb2NhbFBhdGguc3Vic3RyaW5nKDEpOwotICAgICAg
ICBMUENXU1RSIGxvY2FsUGF0aFN0ciA9IGxvY2FsUGF0aC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJt
aW5hdGlvbigpOwotICAgICAgICBpZiAod2NzbGVuKGxvY2FsUGF0aFN0cikgKyAxIDwgTUFYX1BB
VEgpCi0gICAgICAgICAgICB3Y3NjcHlfcyhmaWxlUGF0aCwgTUFYX1BBVEgsIGxvY2FsUGF0aFN0
cik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0j
aWYgT1MoV0lOQ0UpCi0gICAgICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgICAgIHJldHVybiAw
OwotI2Vsc2UKLSAgICAgICAgV0NIQVIgdGVtcFBhdGhbTUFYX1BBVEhdOwotICAgICAgICBXQ0hB
UiBleHRlbnNpb25bTUFYX1BBVEhdOwotICAgICAgICBpZiAoITo6R2V0VGVtcFBhdGgoV1RGX0FS
UkFZX0xFTkdUSCh0ZW1wUGF0aCksIHRlbXBQYXRoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwot
ICAgICAgICBpZiAoITo6UGF0aEFwcGVuZCh0ZW1wUGF0aCwgZmlsZU5hbWUuY2hhcmFjdGVyc1dp
dGhOdWxsVGVybWluYXRpb24oKSkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgTFBD
V1NUUiBmb3VuZEV4dGVuc2lvbiA9IDo6UGF0aEZpbmRFeHRlbnNpb24odGVtcFBhdGgpOwotICAg
ICAgICBpZiAoZm91bmRFeHRlbnNpb24pIHsKLSAgICAgICAgICAgIGlmICh3Y3NjcHlfcyhleHRl
bnNpb24sIE1BWF9QQVRILCBmb3VuZEV4dGVuc2lvbikpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IDA7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgKmV4dGVuc2lvbiA9IDA7Ci0gICAgICAg
IDo6UGF0aFJlbW92ZUV4dGVuc2lvbih0ZW1wUGF0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAx
OyBpIDwgMTAwMDA7IGkrKykgewotICAgICAgICAgICAgaWYgKHN3cHJpbnRmX3MoZmlsZVBhdGgs
IE1BWF9QQVRILCBURVhUKCIlcy0lZCVzIiksIHRlbXBQYXRoLCBpLCBleHRlbnNpb24pID09IC0x
KQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgaWYgKCE6OlBhdGhGaWxl
RXhpc3RzKGZpbGVQYXRoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAg
ICAgICBIQU5ETEUgdGVtcEZpbGVIYW5kbGUgPSBDcmVhdGVGaWxlKGZpbGVQYXRoLCBHRU5FUklD
X1JFQUQgfCBHRU5FUklDX1dSSVRFLCAwLCAwLCBDUkVBVEVfQUxXQVlTLCBGSUxFX0FUVFJJQlVU
RV9OT1JNQUwsIDApOwotICAgICAgICBpZiAodGVtcEZpbGVIYW5kbGUgPT0gSU5WQUxJRF9IQU5E
TEVfVkFMVUUpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAvLyBXcml0ZSB0aGUg
ZGF0YSB0byB0aGlzIHRlbXAgZmlsZS4KLSAgICAgICAgRFdPUkQgd3JpdHRlbjsKLSAgICAgICAg
Qk9PTCB0ZW1wV3JpdGVTdWNjZWVkZWQgPSBXcml0ZUZpbGUodGVtcEZpbGVIYW5kbGUsIGRhdGEt
PmRhdGEoKSwgZGF0YS0+c2l6ZSgpLCAmd3JpdHRlbiwgMCk7Ci0gICAgICAgIENsb3NlSGFuZGxl
KHRlbXBGaWxlSGFuZGxlKTsKLSAgICAgICAgaWYgKCF0ZW1wV3JpdGVTdWNjZWVkZWQpCi0gICAg
ICAgICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIH0KLQotICAgIFNJWkVfVCBkcm9wRmlsZXNT
aXplID0gc2l6ZW9mKERST1BGSUxFUykgKyAoc2l6ZW9mKFdDSEFSKSAqICh3Y3NsZW4oZmlsZVBh
dGgpICsgMikpOwotICAgIEhHTE9CQUwgbWVtT2JqID0gR2xvYmFsQWxsb2MoR0hORCB8IEdNRU1f
U0hBUkUsIGRyb3BGaWxlc1NpemUpOwotICAgIGlmICghbWVtT2JqKSAKLSAgICAgICAgcmV0dXJu
IDA7Ci0KLSAgICBEUk9QRklMRVMqIGRyb3BGaWxlcyA9IChEUk9QRklMRVMqKSBHbG9iYWxMb2Nr
KG1lbU9iaik7Ci0gICAgZHJvcEZpbGVzLT5wRmlsZXMgPSBzaXplb2YoRFJPUEZJTEVTKTsKLSAg
ICBkcm9wRmlsZXMtPmZXaWRlID0gVFJVRTsKLSAgICB3Y3NjcHkoKExQV1NUUikoZHJvcEZpbGVz
ICsgMSksIGZpbGVQYXRoKTsgICAgCi0gICAgR2xvYmFsVW5sb2NrKG1lbU9iaik7Ci0gICAgCi0g
ICAgcmV0dXJuIG1lbU9iajsKLX0KLQotc3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSW1hZ2VG
aWxlRGVzY3JpcHRvcihjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ2Fj
aGVkSW1hZ2UqIGltYWdlKQotewotICAgIEFTU0VSVF9BUkcoaW1hZ2UsIGltYWdlKTsKLSAgICBB
U1NFUlQoaW1hZ2UtPmltYWdlKCktPmRhdGEoKSk7Ci0KLSAgICBIUkVTVUxUIGhyID0gU19PSzsK
LSAgICBIR0xPQkFMIG1lbU9iaiA9IDA7Ci0gICAgU3RyaW5nIGZzUGF0aDsKLSAgICBtZW1PYmog
PSBHbG9iYWxBbGxvYyhHUFRSLCBzaXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOwotICAgIGlm
ICghbWVtT2JqKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIEZJTEVHUk9VUERFU0NSSVBUT1Iq
IGZnZCA9IChGSUxFR1JPVVBERVNDUklQVE9SKilHbG9iYWxMb2NrKG1lbU9iaik7Ci0gICAgbWVt
c2V0KGZnZCwgMCwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKLSAgICBmZ2QtPmNJdGVt
cyA9IDE7Ci0gICAgZmdkLT5mZ2RbMF0uZHdGbGFncyA9IEZEX0ZJTEVTSVpFOwotICAgIGZnZC0+
ZmdkWzBdLm5GaWxlU2l6ZUxvdyA9IGltYWdlLT5pbWFnZSgpLT5kYXRhKCktPnNpemUoKTsKLSAg
ICAKLSAgICBjb25zdCBTdHJpbmcmIHByZWZlcnJlZFRpdGxlID0gdGl0bGUuaXNFbXB0eSgpID8g
aW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5hbWUoKSA6IHRpdGxlOwotICAgIFN0cmlu
ZyBleHRlbnNpb24gPSBpbWFnZS0+aW1hZ2UoKS0+ZmlsZW5hbWVFeHRlbnNpb24oKTsKLSAgICBp
ZiAoZXh0ZW5zaW9uLmlzRW1wdHkoKSkgewotICAgICAgICAvLyBEbyBub3QgY29udGludWUgcHJv
Y2Vzc2luZyBpbiB0aGUgcmFyZSBhbmQgdW51c3VhbCBjYXNlIHdoZXJlIGEgZGVjb2RlZCBpbWFn
ZSBpcyBub3QgYWJsZSAKLSAgICAgICAgLy8gdG8gcHJvdmlkZSBhIGZpbGVuYW1lIGV4dGVuc2lv
bi4gU29tZXRoaW5nIHRyaWNreSAobGlrZSBhIGJhaXQtbi1zd2l0Y2gpIGlzIGdvaW5nIG9uCi0g
ICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBleHRlbnNpb24uaW5zZXJ0KCIuIiwgMCk7Ci0g
ICAgZnNQYXRoID0gZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JUaXRsZSh1cmwsIHByZWZlcnJlZFRp
dGxlLCBleHRlbnNpb24uY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgZmFsc2UpOwot
Ci0gICAgaWYgKGZzUGF0aC5sZW5ndGgoKSA8PSAwKSB7Ci0gICAgICAgIEdsb2JhbFVubG9jayht
ZW1PYmopOwotICAgICAgICBHbG9iYWxGcmVlKG1lbU9iaik7Ci0gICAgICAgIHJldHVybiAwOwot
ICAgIH0KLQotICAgIGludCBtYXhTaXplID0gbWluKGZzUGF0aC5sZW5ndGgoKSwgV1RGX0FSUkFZ
X0xFTkdUSChmZ2QtPmZnZFswXS5jRmlsZU5hbWUpKTsKLSAgICBDb3B5TWVtb3J5KGZnZC0+Zmdk
WzBdLmNGaWxlTmFtZSwgKExQQ1dTVFIpZnNQYXRoLmNoYXJhY3RlcnMoKSwgbWF4U2l6ZSAqIHNp
emVvZihVQ2hhcikpOwotICAgIEdsb2JhbFVubG9jayhtZW1PYmopOwotICAgIAotICAgIHJldHVy
biBtZW1PYmo7Ci19Ci0KLQotLy8gd3JpdGVGaWxlVG9EYXRhT2JqZWN0IHRha2VzIG93bmVyc2hp
cCBvZiBmaWxlRGVzY3JpcHRvciBhbmQgZmlsZUNvbnRlbnQKLXN0YXRpYyBIUkVTVUxUIHdyaXRl
RmlsZVRvRGF0YU9iamVjdChJRGF0YU9iamVjdCogZGF0YU9iamVjdCwgSEdMT0JBTCBmaWxlRGVz
Y3JpcHRvciwgSEdMT0JBTCBmaWxlQ29udGVudCwgSEdMT0JBTCBoRHJvcENvbnRlbnQpCi17Ci0g
ICAgSFJFU1VMVCBociA9IFNfT0s7Ci0gICAgRk9STUFURVRDKiBmZTsKLSAgICBTVEdNRURJVU0g
bWVkaXVtID0gezB9OwotICAgIG1lZGl1bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7Ci0KLSAgICBp
ZiAoIWZpbGVEZXNjcmlwdG9yIHx8ICFmaWxlQ29udGVudCkKLSAgICAgICAgZ290byBleGl0Owot
Ci0gICAgLy8gRGVzY3JpcHRvcgotICAgIGZlID0gZmlsZURlc2NyaXB0b3JGb3JtYXQoKTsKLQot
ICAgIG1lZGl1bS5oR2xvYmFsID0gZmlsZURlc2NyaXB0b3I7Ci0KLSAgICBpZiAoRkFJTEVEKGhy
ID0gZGF0YU9iamVjdC0+U2V0RGF0YShmZSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICBnb3Rv
IGV4aXQ7Ci0KLSAgICAvLyBDb250ZW50cwotICAgIGZlID0gZmlsZUNvbnRlbnRGb3JtYXRaZXJv
KCk7Ci0gICAgbWVkaXVtLmhHbG9iYWwgPSBmaWxlQ29udGVudDsKLSAgICBpZiAoRkFJTEVEKGhy
ID0gZGF0YU9iamVjdC0+U2V0RGF0YShmZSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICBnb3Rv
IGV4aXQ7Ci0KLSNpZiBVU0UoQ0YpCi0gICAgLy8gSERST1AKLSAgICBpZiAoaERyb3BDb250ZW50
KSB7Ci0gICAgICAgIG1lZGl1bS5oR2xvYmFsID0gaERyb3BDb250ZW50OwotICAgICAgICBociA9
IGRhdGFPYmplY3QtPlNldERhdGEoY2ZIRHJvcEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKTsKLSAg
ICB9Ci0jZW5kaWYKLQotZXhpdDoKLSAgICBpZiAoRkFJTEVEKGhyKSkgewotICAgICAgICBpZiAo
ZmlsZURlc2NyaXB0b3IpCi0gICAgICAgICAgICBHbG9iYWxGcmVlKGZpbGVEZXNjcmlwdG9yKTsK
LSAgICAgICAgaWYgKGZpbGVDb250ZW50KQotICAgICAgICAgICAgR2xvYmFsRnJlZShmaWxlQ29u
dGVudCk7Ci0gICAgICAgIGlmIChoRHJvcENvbnRlbnQpCi0gICAgICAgICAgICBHbG9iYWxGcmVl
KGhEcm9wQ29udGVudCk7Ci0gICAgfQotICAgIHJldHVybiBocjsKLX0KLQotUGFzc1JlZlB0cjxD
bGlwYm9hcmQ+IENsaXBib2FyZDo6Y3JlYXRlKENsaXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ks
IERyYWdEYXRhKiBkcmFnRGF0YSwgRnJhbWUqIGZyYW1lKQotewotICAgIGlmIChkcmFnRGF0YS0+
cGxhdGZvcm1EYXRhKCkpCi0gICAgICAgIHJldHVybiBDbGlwYm9hcmRXaW46OmNyZWF0ZShEcmFn
QW5kRHJvcCwgZHJhZ0RhdGEtPnBsYXRmb3JtRGF0YSgpLCBwb2xpY3ksIGZyYW1lKTsKLSAgICBy
ZXR1cm4gQ2xpcGJvYXJkV2luOjpjcmVhdGUoRHJhZ0FuZERyb3AsIGRyYWdEYXRhLT5kcmFnRGF0
YU1hcCgpLCBwb2xpY3ksIGZyYW1lKTsKLX0KLQotQ2xpcGJvYXJkV2luOjpDbGlwYm9hcmRXaW4o
Q2xpcGJvYXJkVHlwZSBjbGlwYm9hcmRUeXBlLCBJRGF0YU9iamVjdCogZGF0YU9iamVjdCwgQ2xp
cGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwgRnJhbWUqIGZyYW1lKQotICAgIDogQ2xpcGJvYXJk
KHBvbGljeSwgY2xpcGJvYXJkVHlwZSkKLSAgICAsIG1fZGF0YU9iamVjdChkYXRhT2JqZWN0KQot
ICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoMCkKLSAgICAsIG1fZnJhbWUoZnJhbWUpCi17Ci19
Ci0KLUNsaXBib2FyZFdpbjo6Q2xpcGJvYXJkV2luKENsaXBib2FyZFR5cGUgY2xpcGJvYXJkVHlw
ZSwgV0NEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5
LCBGcmFtZSogZnJhbWUpCi0gICAgOiBDbGlwYm9hcmQocG9saWN5LCBjbGlwYm9hcmRUeXBlKQot
ICAgICwgbV9kYXRhT2JqZWN0KGRhdGFPYmplY3QpCi0gICAgLCBtX3dyaXRhYmxlRGF0YU9iamVj
dChkYXRhT2JqZWN0KQotICAgICwgbV9mcmFtZShmcmFtZSkKLXsKLX0KLQotQ2xpcGJvYXJkV2lu
OjpDbGlwYm9hcmRXaW4oQ2xpcGJvYXJkVHlwZSBjbGlwYm9hcmRUeXBlLCBjb25zdCBEcmFnRGF0
YU1hcCYgZGF0YU1hcCwgQ2xpcGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwgRnJhbWUqIGZyYW1l
KQotICAgIDogQ2xpcGJvYXJkKHBvbGljeSwgY2xpcGJvYXJkVHlwZSkKLSAgICAsIG1fZGF0YU9i
amVjdCgwKQotICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoMCkKLSAgICAsIG1fZnJhbWUoZnJh
bWUpCi0gICAgLCBtX2RyYWdEYXRhTWFwKGRhdGFNYXApCi17Ci19Ci0KLUNsaXBib2FyZFdpbjo6
fkNsaXBib2FyZFdpbigpCi17Ci0gICAgaWYgKG1fZHJhZ0ltYWdlKQotICAgICAgICBtX2RyYWdJ
bWFnZS0+cmVtb3ZlQ2xpZW50KHRoaXMpOwotfQotCi1zdGF0aWMgYm9vbCB3cml0ZVVSTChXQ0Rh
dGFPYmplY3QgKmRhdGEsIGNvbnN0IEtVUkwmIHVybCwgU3RyaW5nIHRpdGxlLCBib29sIHdpdGhQ
bGFpblRleHQsIGJvb2wgd2l0aEhUTUwpCi17Ci0gICAgQVNTRVJUKGRhdGEpOwotCi0gICAgaWYg
KHVybC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAodGl0
bGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHRpdGxlID0gdXJsLmxhc3RQYXRoQ29tcG9uZW50KCk7
Ci0gICAgICAgIGlmICh0aXRsZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICB0aXRsZSA9IHVybC5o
b3N0KCk7Ci0gICAgfQotCi0gICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAgICBtZWRpdW0u
dHltZWQgPSBUWU1FRF9IR0xPQkFMOwotCi0gICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9i
YWxEYXRhKHVybCwgdGl0bGUpOwotICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotICAgIGlmICht
ZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQoZGF0YS0+U2V0RGF0YSh1cmxXRm9ybWF0KCksICZtZWRp
dW0sIFRSVUUpKSkKLSAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKLSAgICBl
bHNlCi0gICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotCi0gICAgaWYgKHdpdGhIVE1MKSB7Ci0gICAg
ICAgIFZlY3RvcjxjaGFyPiBjZmh0bWxEYXRhOwotICAgICAgICBtYXJrdXBUb0NGSFRNTCh1cmxU
b01hcmt1cCh1cmwsIHRpdGxlKSwgIiIsIGNmaHRtbERhdGEpOwotICAgICAgICBtZWRpdW0uaEds
b2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoY2ZodG1sRGF0YSk7Ci0gICAgICAgIGlmIChtZWRpdW0u
aEdsb2JhbCAmJiBGQUlMRUQoZGF0YS0+U2V0RGF0YShodG1sRm9ybWF0KCksICZtZWRpdW0sIFRS
VUUpKSkKLSAgICAgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7Ci0gICAgICAg
IGVsc2UKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgIH0KLQotICAgIGlmICh3aXRo
UGxhaW5UZXh0KSB7Ci0gICAgICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YSh1
cmwuc3RyaW5nKCkpOwotICAgICAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKGRhdGEt
PlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAgICAg
ICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICBzdWNjZXNzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3VjY2VzczsKLX0KLQotdm9p
ZCBDbGlwYm9hcmRXaW46OmNsZWFyRGF0YShjb25zdCBTdHJpbmcmIHR5cGUpCi17Ci0gICAgLy8g
RklYTUU6IE5lZWQgdG8gYmUgYWJsZSB0byB3cml0ZSB0byB0aGUgc3lzdGVtIGNsaXBib2FyZCA8
cmRhcjovL3Byb2JsZW0vNTAxNTk0MT4KLSAgICBBU1NFUlQoaXNGb3JEcmFnQW5kRHJvcCgpKTsK
LSAgICBpZiAoIWNhbldyaXRlRGF0YSgpIHx8ICFtX3dyaXRhYmxlRGF0YU9iamVjdCkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgQ2xpcGJvYXJkRGF0YVR5cGUgZGF0YVR5cGUgPSBjbGlwYm9hcmRU
eXBlRnJvbU1JTUVUeXBlKHR5cGUpOwotCi0gICAgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERh
dGFUeXBlVVJMKSB7Ci0gICAgICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0LT5jbGVhckRhdGEodXJs
V0Zvcm1hdCgpLT5jZkZvcm1hdCk7Ci0gICAgICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0LT5jbGVh
ckRhdGEodXJsRm9ybWF0KCktPmNmRm9ybWF0KTsKLSAgICB9Ci0gICAgaWYgKGRhdGFUeXBlID09
IENsaXBib2FyZERhdGFUeXBlVGV4dCkgewotICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+
Y2xlYXJEYXRhKHBsYWluVGV4dEZvcm1hdCgpLT5jZkZvcm1hdCk7Ci0gICAgICAgIG1fd3JpdGFi
bGVEYXRhT2JqZWN0LT5jbGVhckRhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLT5jZkZvcm1hdCk7Ci0g
ICAgfQotCi19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjpjbGVhckRhdGEoKQotewotICAgIC8vIEZJ
WE1FOiBOZWVkIHRvIGJlIGFibGUgdG8gd3JpdGUgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQgPHJk
YXI6Ly9wcm9ibGVtLzUwMTU5NDE+Ci0gICAgQVNTRVJUKGlzRm9yRHJhZ0FuZERyb3AoKSk7Ci0g
ICAgaWYgKCFjYW5Xcml0ZURhdGEoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIG1fd3Jp
dGFibGVEYXRhT2JqZWN0ID0gMDsKLSAgICBXQ0RhdGFPYmplY3Q6OmNyZWF0ZUluc3RhbmNlKCZt
X3dyaXRhYmxlRGF0YU9iamVjdCk7Ci0gICAgbV9kYXRhT2JqZWN0ID0gbV93cml0YWJsZURhdGFP
YmplY3Q7Ci19Ci0KLVN0cmluZyBDbGlwYm9hcmRXaW46OmdldERhdGEoY29uc3QgU3RyaW5nJiB0
eXBlKSBjb25zdAoteyAgICAgCi0gICAgaWYgKCFjYW5SZWFkRGF0YSgpIHx8ICghbV9kYXRhT2Jq
ZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKSkKLSAgICAgICAgcmV0dXJuICIiOwotCi0g
ICAgQ2xpcGJvYXJkRGF0YVR5cGUgZGF0YVR5cGUgPSBjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBl
KHR5cGUpOwotICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRleHQpCi0gICAg
ICAgIHJldHVybiBtX2RhdGFPYmplY3QgPyBnZXRQbGFpblRleHQobV9kYXRhT2JqZWN0LmdldCgp
KSA6IGdldFBsYWluVGV4dCgmbV9kcmFnRGF0YU1hcCk7Ci0gICAgaWYgKGRhdGFUeXBlID09IENs
aXBib2FyZERhdGFUeXBlVVJMKQotICAgICAgICByZXR1cm4gbV9kYXRhT2JqZWN0ID8gZ2V0VVJM
KG1fZGF0YU9iamVjdC5nZXQoKSwgRHJhZ0RhdGE6OkRvTm90Q29udmVydEZpbGVuYW1lcykgOiBn
ZXRVUkwoJm1fZHJhZ0RhdGFNYXAsIERyYWdEYXRhOjpEb05vdENvbnZlcnRGaWxlbmFtZXMpOwot
ICAgIGVsc2UgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBlVGV4dEhUTUwpIHsKLSAg
ICAgICAgU3RyaW5nIGRhdGEgPSBtX2RhdGFPYmplY3QgPyBnZXRUZXh0SFRNTChtX2RhdGFPYmpl
Y3QuZ2V0KCkpIDogZ2V0VGV4dEhUTUwoJm1fZHJhZ0RhdGFNYXApOwotICAgICAgICBpZiAoIWRh
dGEuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgICAgIHJldHVybiBt
X2RhdGFPYmplY3QgPyBnZXRDRkhUTUwobV9kYXRhT2JqZWN0LmdldCgpKSA6IGdldENGSFRNTCgm
bV9kcmFnRGF0YU1hcCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAiIjsKLX0KLQotYm9vbCBD
bGlwYm9hcmRXaW46OnNldERhdGEoY29uc3QgU3RyaW5nJiB0eXBlLCBjb25zdCBTdHJpbmcmIGRh
dGEpCi17Ci0gICAgLy8gRklYTUU6IE5lZWQgdG8gYmUgYWJsZSB0byB3cml0ZSB0byB0aGUgc3lz
dGVtIGNsaXBib2FyZCA8cmRhcjovL3Byb2JsZW0vNTAxNTk0MT4KLSAgICBBU1NFUlQoaXNGb3JE
cmFnQW5kRHJvcCgpKTsKLSAgICBpZiAoIWNhbldyaXRlRGF0YSgpIHx8ICFtX3dyaXRhYmxlRGF0
YU9iamVjdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ2xpcGJvYXJkRGF0YVR5cGUg
d2luVHlwZSA9IGNsaXBib2FyZFR5cGVGcm9tTUlNRVR5cGUodHlwZSk7Ci0KLSAgICBpZiAod2lu
VHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVSTCkKLSAgICAgICAgcmV0dXJuIFdlYkNvcmU6Ondy
aXRlVVJMKG1fd3JpdGFibGVEYXRhT2JqZWN0LmdldCgpLCBLVVJMKFBhcnNlZFVSTFN0cmluZywg
ZGF0YSksIFN0cmluZygpLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICBpZiAod2luVHlwZSA9PSBDbGlw
Ym9hcmREYXRhVHlwZVRleHQpIHsKLSAgICAgICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAg
ICAgICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKLSAgICAgICAgbWVkaXVtLmhHbG9i
YWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEpOwotICAgICAgICBpZiAoIW1lZGl1bS5oR2xvYmFs
KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChGQUlMRUQobV93cml0
YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVF
KSkpIHsKLSAgICAgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7Ci0gICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
fQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCBhZGRNaW1lVHlwZXNGb3JG
b3JtYXQoTGlzdEhhc2hTZXQ8U3RyaW5nPiYgcmVzdWx0cywgY29uc3QgRk9STUFURVRDJiBmb3Jt
YXQpCi17Ci0gICAgLy8gVVJMIGFuZCBUZXh0IGFyZSBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0
eSB3aXRoIElFJ3MgbW9kZWwKLSAgICBpZiAoZm9ybWF0LmNmRm9ybWF0ID09IHVybEZvcm1hdCgp
LT5jZkZvcm1hdCB8fCBmb3JtYXQuY2ZGb3JtYXQgPT0gdXJsV0Zvcm1hdCgpLT5jZkZvcm1hdCkg
ewotICAgICAgICByZXN1bHRzLmFkZCgiVVJMIik7Ci0gICAgICAgIHJlc3VsdHMuYWRkKCJ0ZXh0
L3VyaS1saXN0Iik7Ci0gICAgfQotCi0gICAgaWYgKGZvcm1hdC5jZkZvcm1hdCA9PSBwbGFpblRl
eHRXRm9ybWF0KCktPmNmRm9ybWF0IHx8IGZvcm1hdC5jZkZvcm1hdCA9PSBwbGFpblRleHRGb3Jt
YXQoKS0+Y2ZGb3JtYXQpIHsKLSAgICAgICAgcmVzdWx0cy5hZGQoIlRleHQiKTsKLSAgICAgICAg
cmVzdWx0cy5hZGQoInRleHQvcGxhaW4iKTsKLSAgICB9Ci19Ci0KLS8vIGV4dGVuc2lvbnMgYmV5
b25kIElFJ3MgQVBJCi1MaXN0SGFzaFNldDxTdHJpbmc+IENsaXBib2FyZFdpbjo6dHlwZXMoKSBj
b25zdAoteyAKLSAgICBMaXN0SGFzaFNldDxTdHJpbmc+IHJlc3VsdHM7Ci0gICAgaWYgKCFjYW5S
ZWFkVHlwZXMoKSkKLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0KLSAgICBpZiAoIW1fZGF0YU9i
amVjdCAmJiBtX2RyYWdEYXRhTWFwLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7
Ci0KLSAgICBpZiAobV9kYXRhT2JqZWN0KSB7Ci0gICAgICAgIENPTVB0cjxJRW51bUZPUk1BVEVU
Qz4gaXRyOwotCi0gICAgICAgIGlmIChGQUlMRUQobV9kYXRhT2JqZWN0LT5FbnVtRm9ybWF0RXRj
KERBVEFESVJfR0VULCAmaXRyKSkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKLQotICAg
ICAgICBpZiAoIWl0cikKLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwotCi0gICAgICAgIEZP
Uk1BVEVUQyBkYXRhOwotCi0gICAgICAgIC8vIElFbnVtRk9STUFURVRDOjpOZXh0IHJldHVybnMg
U19GQUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcy4KLSAgICAgICAgd2hpbGUgKGl0ci0+
TmV4dCgxLCAmZGF0YSwgMCkgPT0gU19PSykKLSAgICAgICAgICAgIGFkZE1pbWVUeXBlc0ZvckZv
cm1hdChyZXN1bHRzLCBkYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKERyYWdEYXRh
TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fZHJhZ0RhdGFNYXAuYmVnaW4oKTsgaXQgIT0gbV9k
cmFnRGF0YU1hcC5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgRk9STUFURVRDIGRhdGE7Ci0g
ICAgICAgICAgICBkYXRhLmNmRm9ybWF0ID0gKCppdCkua2V5OwotICAgICAgICAgICAgYWRkTWlt
ZVR5cGVzRm9yRm9ybWF0KHJlc3VsdHMsIGRhdGEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAg
cmV0dXJuIHJlc3VsdHM7Ci19Ci0KLVBhc3NSZWZQdHI8RmlsZUxpc3Q+IENsaXBib2FyZFdpbjo6
ZmlsZXMoKSBjb25zdAotewotI2lmIFVTRShDRikKLSAgICBSZWZQdHI8RmlsZUxpc3Q+IGZpbGVz
ID0gRmlsZUxpc3Q6OmNyZWF0ZSgpOwotICAgIGlmICghY2FuUmVhZERhdGEoKSkKLSAgICAgICAg
cmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKLQotICAgIGlmICghbV9kYXRhT2JqZWN0ICYmIG1fZHJh
Z0RhdGFNYXAuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgpOwotCi0g
ICAgaWYgKG1fZGF0YU9iamVjdCkgewotICAgICAgICBTVEdNRURJVU0gbWVkaXVtOwotICAgICAg
ICBpZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+R2V0RGF0YShjZkhEcm9wRm9ybWF0KCksICZtZWRp
dW0pKSkKLSAgICAgICAgICAgIHJldHVybiBmaWxlcy5yZWxlYXNlKCk7Ci0KLSAgICAgICAgSERS
T1AgaGRyb3AgPSByZWludGVycHJldF9jYXN0PEhEUk9QPihHbG9iYWxMb2NrKG1lZGl1bS5oR2xv
YmFsKSk7Ci0gICAgICAgIGlmICghaGRyb3ApCi0gICAgICAgICAgICByZXR1cm4gZmlsZXMucmVs
ZWFzZSgpOwotCi0gICAgICAgIFdDSEFSIGZpbGVuYW1lW01BWF9QQVRIXTsKLSAgICAgICAgVUlO
VCBmaWxlQ291bnQgPSBEcmFnUXVlcnlGaWxlVyhoZHJvcCwgMHhGRkZGRkZGRiwgMCwgMCk7Ci0g
ICAgICAgIGZvciAoVUlOVCBpID0gMDsgaSA8IGZpbGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAg
ICBpZiAoIURyYWdRdWVyeUZpbGVXKGhkcm9wLCBpLCBmaWxlbmFtZSwgV1RGX0FSUkFZX0xFTkdU
SChmaWxlbmFtZSkpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgZmls
ZXMtPmFwcGVuZChGaWxlOjpjcmVhdGUocmVpbnRlcnByZXRfY2FzdDxVQ2hhcio+KGZpbGVuYW1l
KSwgRmlsZTo6QWxsQ29udGVudFR5cGVzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBHbG9iYWxV
bmxvY2sobWVkaXVtLmhHbG9iYWwpOwotICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZtZWRpdW0p
OwotICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgpOwotICAgIH0KLSAgICBpZiAoIW1fZHJh
Z0RhdGFNYXAuY29udGFpbnMoY2ZIRHJvcEZvcm1hdCgpLT5jZkZvcm1hdCkpCi0gICAgICAgIHJl
dHVybiBmaWxlcy5yZWxlYXNlKCk7Ci0gICAgVmVjdG9yPFN0cmluZz4gZmlsZXNWZWN0b3IgPSBt
X2RyYWdEYXRhTWFwLmdldChjZkhEcm9wRm9ybWF0KCktPmNmRm9ybWF0KTsKLSAgICBmb3IgKFZl
Y3RvcjxTdHJpbmc+OjppdGVyYXRvciBpdCA9IGZpbGVzVmVjdG9yLmJlZ2luKCk7IGl0ICE9IGZp
bGVzVmVjdG9yLmVuZCgpOyArK2l0KQotICAgICAgICBmaWxlcy0+YXBwZW5kKEZpbGU6OmNyZWF0
ZSgqaXQpKTsKLSAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgpOwotI2Vsc2UKLSAgICBub3RJbXBs
ZW1lbnRlZCgpOwotICAgIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLXZvaWQgQ2xpcGJvYXJkV2lu
OjpzZXREcmFnSW1hZ2UoQ2FjaGVkSW1hZ2UqIGltYWdlLCBOb2RlICpub2RlLCBjb25zdCBJbnRQ
b2ludCAmbG9jKQotewotICAgIGlmICghY2FuU2V0RHJhZ0ltYWdlKCkpCi0gICAgICAgIHJldHVy
bjsKLSAgICAgICAgCi0gICAgaWYgKG1fZHJhZ0ltYWdlKQotICAgICAgICBtX2RyYWdJbWFnZS0+
cmVtb3ZlQ2xpZW50KHRoaXMpOwotICAgIG1fZHJhZ0ltYWdlID0gaW1hZ2U7Ci0gICAgaWYgKG1f
ZHJhZ0ltYWdlKQotICAgICAgICBtX2RyYWdJbWFnZS0+YWRkQ2xpZW50KHRoaXMpOwotCi0gICAg
bV9kcmFnTG9jID0gbG9jOwotICAgIG1fZHJhZ0ltYWdlRWxlbWVudCA9IG5vZGU7Ci19Ci0KLXZv
aWQgQ2xpcGJvYXJkV2luOjpzZXREcmFnSW1hZ2UoQ2FjaGVkSW1hZ2UqIGltZywgY29uc3QgSW50
UG9pbnQgJmxvYykKLXsKLSAgICBzZXREcmFnSW1hZ2UoaW1nLCAwLCBsb2MpOwotfQotCi12b2lk
IENsaXBib2FyZFdpbjo6c2V0RHJhZ0ltYWdlRWxlbWVudChOb2RlICpub2RlLCBjb25zdCBJbnRQ
b2ludCAmbG9jKQotewotICAgIHNldERyYWdJbWFnZSgwLCBub2RlLCBsb2MpOwotfQotCi1EcmFn
SW1hZ2VSZWYgQ2xpcGJvYXJkV2luOjpjcmVhdGVEcmFnSW1hZ2UoSW50UG9pbnQmIGxvYykgY29u
c3QKLXsKICAgICBIQklUTUFQIHJlc3VsdCA9IDA7CiAgICAgaWYgKG1fZHJhZ0ltYWdlKSB7CiAj
aWYgVVNFKENBSVJPKSB8fCBVU0UoQ0cpCiAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZURyYWdJbWFn
ZUZyb21JbWFnZShtX2RyYWdJbWFnZS0+aW1hZ2UoKSk7ICAgICAgICAKLSAgICAgICAgbG9jID0g
bV9kcmFnTG9jOworICAgICAgICBkcmFnTG9jYXRpb24gPSBtX2RyYWdMb2M7CiAjZWxzZQogICAg
ICAgICBub3RJbXBsZW1lbnRlZCgpOwogI2VuZGlmCiAgICAgfSBlbHNlIGlmIChtX2RyYWdJbWFn
ZUVsZW1lbnQpIHsKICAgICAgICAgTm9kZSogbm9kZSA9IG1fZHJhZ0ltYWdlRWxlbWVudC5nZXQo
KTsKICAgICAgICAgcmVzdWx0ID0gbm9kZS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKS0+bm9kZUltYWdl
KG5vZGUpOwotICAgICAgICBsb2MgPSBtX2RyYWdMb2M7CisgICAgICAgIGRyYWdMb2NhdGlvbiA9
IG1fZHJhZ0xvYzsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIENhY2hl
ZEltYWdlKiBnZXRDYWNoZWRJbWFnZShFbGVtZW50KiBlbGVtZW50KQordm9pZCBDbGlwYm9hcmQ6
OmRlY2xhcmVBbmRXcml0ZURyYWdJbWFnZShFbGVtZW50KiBlbGVtZW50LCBjb25zdCBLVVJMJiB1
cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUsIEZyYW1lKiBmcmFtZSkKIHsKLSAgICAvLyBBdHRlbXB0
IHRvIHB1bGwgQ2FjaGVkSW1hZ2UgZnJvbSBlbGVtZW50Ci0gICAgQVNTRVJUKGVsZW1lbnQpOwot
ICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBlbGVtZW50LT5yZW5kZXJlcigpOwotICAgIGlm
ICghcmVuZGVyZXIgfHwgIXJlbmRlcmVyLT5pc0ltYWdlKCkpIAotICAgICAgICByZXR1cm4gMDsK
LSAgICAKLSAgICBSZW5kZXJJbWFnZSogaW1hZ2UgPSB0b1JlbmRlckltYWdlKHJlbmRlcmVyKTsK
LSAgICBpZiAoaW1hZ2UtPmNhY2hlZEltYWdlKCkgJiYgIWltYWdlLT5jYWNoZWRJbWFnZSgpLT5l
cnJvck9jY3VycmVkKCkpCi0gICAgICAgIHJldHVybiBpbWFnZS0+Y2FjaGVkSW1hZ2UoKTsKLQot
ICAgIHJldHVybiAwOworICAgIG1fcGFzdGVib2FyZC0+ZGVjbGFyZUFuZFdyaXRlRHJhZ0ltYWdl
KGVsZW1lbnQsIHVybCwgdGl0bGUsIGZyYW1lKTsKIH0KIAotc3RhdGljIHZvaWQgd3JpdGVJbWFn
ZVRvRGF0YU9iamVjdChJRGF0YU9iamVjdCogZGF0YU9iamVjdCwgRWxlbWVudCogZWxlbWVudCwg
Y29uc3QgS1VSTCYgdXJsKQotewotICAgIC8vIFNob3ZlIGltYWdlIGRhdGEgaW50byBhIERhdGFP
YmplY3QgZm9yIHVzZSBhcyBhIGZpbGUKLSAgICBDYWNoZWRJbWFnZSogY2FjaGVkSW1hZ2UgPSBn
ZXRDYWNoZWRJbWFnZShlbGVtZW50KTsKLSAgICBpZiAoIWNhY2hlZEltYWdlIHx8ICFjYWNoZWRJ
bWFnZS0+aW1hZ2VGb3JSZW5kZXJlcihlbGVtZW50LT5yZW5kZXJlcigpKSB8fCAhY2FjaGVkSW1h
Z2UtPmlzTG9hZGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFNoYXJlZEJ1ZmZlciogaW1h
Z2VCdWZmZXIgPSBjYWNoZWRJbWFnZS0+aW1hZ2VGb3JSZW5kZXJlcihlbGVtZW50LT5yZW5kZXJl
cigpKS0+ZGF0YSgpOwotICAgIGlmICghaW1hZ2VCdWZmZXIgfHwgIWltYWdlQnVmZmVyLT5zaXpl
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIEhHTE9CQUwgaW1hZ2VGaWxlRGVzY3JpcHRvciA9
IGNyZWF0ZUdsb2JhbEltYWdlRmlsZURlc2NyaXB0b3IodXJsLnN0cmluZygpLCBlbGVtZW50LT5n
ZXRBdHRyaWJ1dGUoYWx0QXR0ciksIGNhY2hlZEltYWdlKTsKLSAgICBpZiAoIWltYWdlRmlsZURl
c2NyaXB0b3IpCi0gICAgICAgIHJldHVybjsKLQotICAgIEhHTE9CQUwgaW1hZ2VGaWxlQ29udGVu
dCA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoaW1hZ2VCdWZmZXIpOwotICAgIGlmICgh
aW1hZ2VGaWxlQ29udGVudCkgewotICAgICAgICBHbG9iYWxGcmVlKGltYWdlRmlsZURlc2NyaXB0
b3IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgU3RyaW5nIGZpbGVOYW1lID0gY2Fj
aGVkSW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5hbWUoKTsKLSAgICBIR0xPQkFMIGhE
cm9wQ29udGVudCA9IGNyZWF0ZUdsb2JhbEhEcm9wQ29udGVudCh1cmwsIGZpbGVOYW1lLCBpbWFn
ZUJ1ZmZlcik7Ci0gICAgaWYgKCFoRHJvcENvbnRlbnQpIHsKLSAgICAgICAgR2xvYmFsRnJlZSho
RHJvcENvbnRlbnQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd3JpdGVGaWxlVG9E
YXRhT2JqZWN0KGRhdGFPYmplY3QsIGltYWdlRmlsZURlc2NyaXB0b3IsIGltYWdlRmlsZUNvbnRl
bnQsIGhEcm9wQ29udGVudCk7Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjpkZWNsYXJlQW5kV3Jp
dGVEcmFnSW1hZ2UoRWxlbWVudCogZWxlbWVudCwgY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJp
bmcmIHRpdGxlLCBGcmFtZSogZnJhbWUpCi17Ci0gICAgLy8gT3JkZXIgaXMgaW1wb3J0YW50IGhl
cmUgZm9yIEV4cGxvcmVyJ3Mgc2FrZQotICAgIGlmICghbV93cml0YWJsZURhdGFPYmplY3QpCi0g
ICAgICAgICByZXR1cm47Ci0gICAgV2ViQ29yZTo6d3JpdGVVUkwobV93cml0YWJsZURhdGFPYmpl
Y3QuZ2V0KCksIHVybCwgdGl0bGUsIHRydWUsIGZhbHNlKTsKLQotICAgIHdyaXRlSW1hZ2VUb0Rh
dGFPYmplY3QobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIGVsZW1lbnQsIHVybCk7Ci0KLSAg
ICBBdG9taWNTdHJpbmcgaW1hZ2VVUkwgPSBlbGVtZW50LT5nZXRBdHRyaWJ1dGUoc3JjQXR0cik7
Ci0gICAgaWYgKGltYWdlVVJMLmlzRW1wdHkoKSkgCi0gICAgICAgIHJldHVybjsKLQotICAgIEtV
UkwgZnVsbFVSTCA9IGZyYW1lLT5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTChzdHJpcExlYWRpbmdB
bmRUcmFpbGluZ0hUTUxTcGFjZXMoaW1hZ2VVUkwpKTsKLSAgICBpZiAoZnVsbFVSTC5pc0VtcHR5
KCkpIAotICAgICAgICByZXR1cm47Ci0gICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAgICBt
ZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOwotCi0gICAgLy8gUHV0IGltZyB0YWcgb24gdGhl
IGNsaXBib2FyZCByZWZlcmVuY2luZyB0aGUgaW1hZ2UKLSAgICBWZWN0b3I8Y2hhcj4gZGF0YTsK
LSAgICBtYXJrdXBUb0NGSFRNTChjcmVhdGVNYXJrdXAoZWxlbWVudCwgSW5jbHVkZU5vZGUsIDAs
IFJlc29sdmVBbGxVUkxzKSwgIiIsIGRhdGEpOwotICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRl
R2xvYmFsRGF0YShkYXRhKTsKLSAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKG1fd3Jp
dGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKGh0bWxGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQot
ICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOwotfQotCi12b2lkIENsaXBib2Fy
ZFdpbjo6d3JpdGVVUkwoY29uc3QgS1VSTCYga3VybCwgY29uc3QgU3RyaW5nJiB0aXRsZVN0ciwg
RnJhbWUqKQotewotICAgIGlmICghbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgICByZXR1
cm47Ci0gICAgV2ViQ29yZTo6d3JpdGVVUkwobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIGt1
cmwsIHRpdGxlU3RyLCB0cnVlLCB0cnVlKTsKLQotICAgIFN0cmluZyB1cmwgPSBrdXJsLnN0cmlu
ZygpOwotICAgIEFTU0VSVCh1cmwuY29udGFpbnNPbmx5QVNDSUkoKSk7IC8vIEtVUkw6OnN0cmlu
ZygpIGlzIFVSTCBlbmNvZGVkLgotCi0gICAgU3RyaW5nIGZzUGF0aCA9IGZpbGVzeXN0ZW1QYXRo
RnJvbVVybE9yVGl0bGUodXJsLCB0aXRsZVN0ciwgTCIuVVJMIiwgdHJ1ZSk7Ci0gICAgU3RyaW5n
IGNvbnRlbnRTdHJpbmcoIltJbnRlcm5ldFNob3J0Y3V0XVxyXG5VUkw9IiArIHVybCArICJcclxu
Iik7Ci0gICAgQ1N0cmluZyBjb250ZW50ID0gY29udGVudFN0cmluZy5sYXRpbjEoKTsKLQotICAg
IGlmIChmc1BhdGgubGVuZ3RoKCkgPD0gMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgSEdMT0JB
TCB1cmxGaWxlRGVzY3JpcHRvciA9IEdsb2JhbEFsbG9jKEdQVFIsIHNpemVvZihGSUxFR1JPVVBE
RVNDUklQVE9SKSk7Ci0gICAgaWYgKCF1cmxGaWxlRGVzY3JpcHRvcikKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgSEdMT0JBTCB1cmxGaWxlQ29udGVudCA9IEdsb2JhbEFsbG9jKEdQVFIsIGNvbnRl
bnQubGVuZ3RoKCkpOwotICAgIGlmICghdXJsRmlsZUNvbnRlbnQpIHsKLSAgICAgICAgR2xvYmFs
RnJlZSh1cmxGaWxlRGVzY3JpcHRvcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBG
SUxFR1JPVVBERVNDUklQVE9SKiBmZ2QgPSBzdGF0aWNfY2FzdDxGSUxFR1JPVVBERVNDUklQVE9S
Kj4oR2xvYmFsTG9jayh1cmxGaWxlRGVzY3JpcHRvcikpOwotICAgIFplcm9NZW1vcnkoZmdkLCBz
aXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOwotICAgIGZnZC0+Y0l0ZW1zID0gMTsKLSAgICBm
Z2QtPmZnZFswXS5kd0ZsYWdzID0gRkRfRklMRVNJWkU7Ci0gICAgZmdkLT5mZ2RbMF0ubkZpbGVT
aXplTG93ID0gY29udGVudC5sZW5ndGgoKTsKLQotICAgIHVuc2lnbmVkIG1heFNpemUgPSBtaW4o
ZnNQYXRoLmxlbmd0aCgpLCBXVEZfQVJSQVlfTEVOR1RIKGZnZC0+ZmdkWzBdLmNGaWxlTmFtZSkp
OwotICAgIENvcHlNZW1vcnkoZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lLCBmc1BhdGguY2hhcmFjdGVy
cygpLCBtYXhTaXplICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgR2xvYmFsVW5sb2NrKHVybEZpbGVE
ZXNjcmlwdG9yKTsKLQotICAgIGNoYXIqIGZpbGVDb250ZW50cyA9IHN0YXRpY19jYXN0PGNoYXIq
PihHbG9iYWxMb2NrKHVybEZpbGVDb250ZW50KSk7Ci0gICAgQ29weU1lbW9yeShmaWxlQ29udGVu
dHMsIGNvbnRlbnQuZGF0YSgpLCBjb250ZW50Lmxlbmd0aCgpKTsKLSAgICBHbG9iYWxVbmxvY2so
dXJsRmlsZUNvbnRlbnQpOwotCi0gICAgd3JpdGVGaWxlVG9EYXRhT2JqZWN0KG1fd3JpdGFibGVE
YXRhT2JqZWN0LmdldCgpLCB1cmxGaWxlRGVzY3JpcHRvciwgdXJsRmlsZUNvbnRlbnQsIDApOwot
fQotCi12b2lkIENsaXBib2FyZFdpbjo6d3JpdGVSYW5nZShSYW5nZSogc2VsZWN0ZWRSYW5nZSwg
RnJhbWUqIGZyYW1lKQotewotICAgIEFTU0VSVChzZWxlY3RlZFJhbmdlKTsKLSAgICBpZiAoIW1f
d3JpdGFibGVEYXRhT2JqZWN0KQotICAgICAgICAgcmV0dXJuOwotCi0gICAgU1RHTUVESVVNIG1l
ZGl1bSA9IHswfTsKLSAgICBtZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOwotCi0gICAgVmVj
dG9yPGNoYXI+IGRhdGE7Ci0gICAgbWFya3VwVG9DRkhUTUwoY3JlYXRlTWFya3VwKHNlbGVjdGVk
UmFuZ2UsIDAsIEFubm90YXRlRm9ySW50ZXJjaGFuZ2UpLAotICAgICAgICBzZWxlY3RlZFJhbmdl
LT5zdGFydENvbnRhaW5lcigpLT5kb2N1bWVudCgpLT51cmwoKS5zdHJpbmcoKSwgZGF0YSk7Ci0g
ICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEpOwotICAgIGlmIChtZWRp
dW0uaEdsb2JhbCAmJiBGQUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEoaHRtbEZv
cm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEds
b2JhbCk7Ci0KLSAgICBTdHJpbmcgc3RyID0gZnJhbWUtPmVkaXRvcigpLnNlbGVjdGVkVGV4dEZv
ckNsaXBib2FyZCgpOwotICAgIHJlcGxhY2VOZXdsaW5lc1dpdGhXaW5kb3dzU3R5bGVOZXdsaW5l
cyhzdHIpOwotICAgIHJlcGxhY2VOQlNQV2l0aFNwYWNlKHN0cik7Ci0gICAgbWVkaXVtLmhHbG9i
YWwgPSBjcmVhdGVHbG9iYWxEYXRhKHN0cik7Ci0gICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZB
SUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShwbGFpblRleHRXRm9ybWF0KCksICZt
ZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKLQot
ICAgIG1lZGl1bS5oR2xvYmFsID0gMDsKLSAgICBpZiAoZnJhbWUtPmVkaXRvcigpLmNhblNtYXJ0
Q29weU9yRGVsZXRlKCkpCi0gICAgICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKHNt
YXJ0UGFzdGVGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSk7Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2lu
Ojp3cml0ZVBsYWluVGV4dChjb25zdCBTdHJpbmcmIHRleHQpCi17Ci0gICAgaWYgKCFtX3dyaXRh
YmxlRGF0YU9iamVjdCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIFNUR01FRElVTSBtZWRp
dW0gPSB7MH07Ci0gICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKLSAgICAKLSAgICBT
dHJpbmcgc3RyID0gdGV4dDsKLSAgICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3
bGluZXMoc3RyKTsKLSAgICByZXBsYWNlTkJTUFdpdGhTcGFjZShzdHIpOwotICAgIG1lZGl1bS5o
R2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YShzdHIpOwotICAgIGlmIChtZWRpdW0uaEdsb2JhbCAm
JiBGQUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgp
LCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7
ICAgICAgICAKLQotICAgIG1lZGl1bS5oR2xvYmFsID0gMDsKLX0KLSAgICAKLWJvb2wgQ2xpcGJv
YXJkV2luOjpoYXNEYXRhKCkKLXsKLSAgICBpZiAoIW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRh
TWFwLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKG1fZGF0YU9i
amVjdCkgewotICAgICAgICBDT01QdHI8SUVudW1GT1JNQVRFVEM+IGl0cjsKLSAgICAgICAgaWYg
KEZBSUxFRChtX2RhdGFPYmplY3QtPkVudW1Gb3JtYXRFdGMoREFUQURJUl9HRVQsICZpdHIpKSkK
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoIWl0cikKLSAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBGT1JNQVRFVEMgZGF0YTsKLQotICAgICAgICAv
LyBJRW51bUZPUk1BVEVUQzo6TmV4dCByZXR1cm5zIFNfRkFMU0UgaWYgdGhlcmUgYXJlIG5vIG1v
cmUgaXRlbXMuCi0gICAgICAgIGlmIChpdHItPk5leHQoMSwgJmRhdGEsIDApID09IFNfT0spIHsK
LSAgICAgICAgICAgIC8vIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBpdGVtIGluIHRoZSBJRGF0YU9i
amVjdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiAhbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCk7Ci19
Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjpzZXRFeHRlcm5hbERhdGFPYmplY3QoSURhdGFPYmplY3Qg
KmRhdGFPYmplY3QpCi17Ci0gICAgQVNTRVJUKGlzRm9yRHJhZ0FuZERyb3AoKSk7Ci0KLSAgICBt
X3dyaXRhYmxlRGF0YU9iamVjdCA9IDA7Ci0gICAgbV9kYXRhT2JqZWN0ID0gZGF0YU9iamVjdDsK
LX0KLQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vd2luL0NsaXBib2FyZFdpbi5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vd2luL0NsaXBib2FyZFdpbi5oCShyZXZpc2lvbiAxNTA0MzMpDQorKysgU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5oCSh3b3JraW5nIGNvcHkpDQpAQCAtMSwx
MDEgKzAsMCBAQA0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
Ci0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0g
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqLwotCi0jaWZuZGVmIENsaXBib2FyZFdpbl9o
Ci0jZGVmaW5lIENsaXBib2FyZFdpbl9oCi0KLSNpbmNsdWRlICJDT01QdHIuaCIKLSNpbmNsdWRl
ICJDYWNoZWRJbWFnZUNsaWVudC5oIgotI2luY2x1ZGUgIkNsaXBib2FyZC5oIgotI2luY2x1ZGUg
IkRyYWdEYXRhLmgiCi0KLXN0cnVjdCBJRGF0YU9iamVjdDsKLQotbmFtZXNwYWNlIFdlYkNvcmUg
ewotCi1jbGFzcyBDYWNoZWRJbWFnZTsKLWNsYXNzIEZyYW1lOwotY2xhc3MgSW50UG9pbnQ7Ci1j
bGFzcyBXQ0RhdGFPYmplY3Q7Ci0KLS8vIFN0YXRlIGF2YWlsYWJsZSBkdXJpbmcgSUUncyBldmVu
dHMgZm9yIGRyYWcgYW5kIGRyb3AgYW5kIGNvcHkvcGFzdGUKLWNsYXNzIENsaXBib2FyZFdpbiA6
IHB1YmxpYyBDbGlwYm9hcmQsIHB1YmxpYyBDYWNoZWRJbWFnZUNsaWVudCB7Ci0gICAgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8Q2xpcGJv
YXJkV2luPiBjcmVhdGUoQ2xpcGJvYXJkVHlwZSBjbGlwYm9hcmRUeXBlLCBJRGF0YU9iamVjdCog
ZGF0YU9iamVjdCwgQ2xpcGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwgRnJhbWUqIGZyYW1lKQot
ICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBDbGlwYm9hcmRXaW4oY2xpcGJvYXJk
VHlwZSwgZGF0YU9iamVjdCwgcG9saWN5LCBmcmFtZSkpOwotICAgIH0KLSAgICBzdGF0aWMgUGFz
c1JlZlB0cjxDbGlwYm9hcmRXaW4+IGNyZWF0ZShDbGlwYm9hcmRUeXBlIGNsaXBib2FyZFR5cGUs
IFdDRGF0YU9iamVjdCogZGF0YU9iamVjdCwgQ2xpcGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwg
RnJhbWUqIGZyYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBDbGlwYm9h
cmRXaW4oY2xpcGJvYXJkVHlwZSwgZGF0YU9iamVjdCwgcG9saWN5LCBmcmFtZSkpOwotICAgIH0K
LSAgICBzdGF0aWMgUGFzc1JlZlB0cjxDbGlwYm9hcmRXaW4+IGNyZWF0ZShDbGlwYm9hcmRUeXBl
IGNsaXBib2FyZFR5cGUsIGNvbnN0IERyYWdEYXRhTWFwJiBkYXRhTWFwLCBDbGlwYm9hcmRBY2Nl
c3NQb2xpY3kgcG9saWN5LCBGcmFtZSogZnJhbWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRv
cHRSZWYobmV3IENsaXBib2FyZFdpbihjbGlwYm9hcmRUeXBlLCBkYXRhTWFwLCBwb2xpY3ksIGZy
YW1lKSk7Ci0gICAgfQotICAgIH5DbGlwYm9hcmRXaW4oKTsKLQotICAgIHZvaWQgY2xlYXJEYXRh
KGNvbnN0IFN0cmluZyYgdHlwZSk7Ci0gICAgdm9pZCBjbGVhckRhdGEoKTsKLSAgICBTdHJpbmcg
Z2V0RGF0YShjb25zdCBTdHJpbmcmIHR5cGUpIGNvbnN0OwotICAgIGJvb2wgc2V0RGF0YShjb25z
dCBTdHJpbmcmIHR5cGUsIGNvbnN0IFN0cmluZyYgZGF0YSk7Ci0KLSAgICAvLyBleHRlbnNpb25z
IGJleW9uZCBJRSdzIEFQSQotICAgIHZpcnR1YWwgTGlzdEhhc2hTZXQ8U3RyaW5nPiB0eXBlcygp
IGNvbnN0OwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxGaWxlTGlzdD4gZmlsZXMoKSBjb25zdDsK
LQotICAgIHZvaWQgc2V0RHJhZ0ltYWdlKENhY2hlZEltYWdlKiwgY29uc3QgSW50UG9pbnQmKTsK
LSAgICB2b2lkIHNldERyYWdJbWFnZUVsZW1lbnQoTm9kZSosIGNvbnN0IEludFBvaW50Jik7Ci0K
LSAgICB2aXJ0dWFsIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2UoSW50UG9pbnQmIGRyYWdM
b2MpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UoRWxl
bWVudCosIGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBGcmFtZSopOwotICAgIHZp
cnR1YWwgdm9pZCB3cml0ZVVSTChjb25zdCBLVVJMJiwgY29uc3QgU3RyaW5nJiwgRnJhbWUqKTsK
LSAgICB2aXJ0dWFsIHZvaWQgd3JpdGVSYW5nZShSYW5nZSosIEZyYW1lKik7Ci0gICAgdmlydHVh
bCB2b2lkIHdyaXRlUGxhaW5UZXh0KGNvbnN0IFN0cmluZyYpOwotCi0gICAgdmlydHVhbCBib29s
IGhhc0RhdGEoKTsKLQotICAgIENPTVB0cjxJRGF0YU9iamVjdD4gZGF0YU9iamVjdCgpIHsgcmV0
dXJuIG1fZGF0YU9iamVjdDsgfQotCi0gICAgdm9pZCBzZXRFeHRlcm5hbERhdGFPYmplY3QoSURh
dGFPYmplY3QgKmRhdGFPYmplY3QpOwotCi1wcml2YXRlOgotICAgIENsaXBib2FyZFdpbihDbGlw
Ym9hcmRUeXBlLCBJRGF0YU9iamVjdCosIENsaXBib2FyZEFjY2Vzc1BvbGljeSwgRnJhbWUqKTsK
LSAgICBDbGlwYm9hcmRXaW4oQ2xpcGJvYXJkVHlwZSwgV0NEYXRhT2JqZWN0KiwgQ2xpcGJvYXJk
QWNjZXNzUG9saWN5LCBGcmFtZSopOwotICAgIENsaXBib2FyZFdpbihDbGlwYm9hcmRUeXBlLCBj
b25zdCBEcmFnRGF0YU1hcCYsIENsaXBib2FyZEFjY2Vzc1BvbGljeSwgRnJhbWUqKTsKLQotICAg
IHZvaWQgcmVzZXRGcm9tQ2xpcGJvYXJkKCk7Ci0gICAgdm9pZCBzZXREcmFnSW1hZ2UoQ2FjaGVk
SW1hZ2UqLCBOb2RlKiwgY29uc3QgSW50UG9pbnQmKTsKLQotICAgIENPTVB0cjxJRGF0YU9iamVj
dD4gbV9kYXRhT2JqZWN0OwotICAgIENPTVB0cjxXQ0RhdGFPYmplY3Q+IG1fd3JpdGFibGVEYXRh
T2JqZWN0OwotICAgIERyYWdEYXRhTWFwIG1fZHJhZ0RhdGFNYXA7Ci0gICAgRnJhbWUqIG1fZnJh
bWU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCi0KLSNlbmRpZiAvLyBDbGlwYm9hcmRX
aW5faApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0VkaXRvcldpbi5jcHANCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0NCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vRWRpdG9yV2luLmNwcAko
cmV2aXNpb24gMTUwNDMzKQ0KKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9FZGl0b3JX
aW4uY3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtMjcsMTEgKzI3LDE5IEBADQogI2luY2x1ZGUgIkVk
aXRvci5oIgogI2luY2x1ZGUgIkVkaXRvckNsaWVudC5oIgogCisjaWYgIVVTRShMRUdBQ1lfU1RZ
TEVfQUJTVFJBQ1RfQ0xJUEJPQVJEX0NMQVNTKQorI2luY2x1ZGUgIkNPTVB0ci5oIgorI2luY2x1
ZGUgIkNsaXBib2FyZC5oIgorI2Vsc2UKICNpbmNsdWRlICJDbGlwYm9hcmRXaW4uaCIKKyNlbmRp
ZgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUg
IkZyYW1lLmgiCiAjaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKKyNpZiAhVVNFKExFR0FDWV9TVFlM
RV9BQlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCisjaW5jbHVkZSAiUGFzdGVib2FyZC5oIgorI2Vu
ZGlmCiAjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiVmlzaWJsZVVuaXRzLmgi
CiAKQEAgLTQ2LDggKzU0LDE0IEBADQogICAgIGlmICghU1VDQ0VFREVEKE9sZUdldENsaXBib2Fy
ZCgmY2xpcGJvYXJkRGF0YSkpKQogICAgICAgICBjbGlwYm9hcmREYXRhID0gMDsKICNlbmRpZgot
CisjaWYgVVNFKExFR0FDWV9TVFlMRV9BQlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCiAgICAgcmV0
dXJuIENsaXBib2FyZFdpbjo6Y3JlYXRlKENsaXBib2FyZDo6Q29weUFuZFBhc3RlLCBjbGlwYm9h
cmREYXRhLmdldCgpLCBwb2xpY3ksIGZyYW1lKTsKKyNlbHNlCisgICAgUmVmUHRyPENsaXBib2Fy
ZD4gY2xpcGJvYXJkID0gQ2xpcGJvYXJkOjpjcmVhdGVGb3JDb3B5QW5kUGFzdGUocG9saWN5KTsK
KyAgICBQYXN0ZWJvYXJkKiBwYXN0ZWJvYXJkID0gY29uc3RfY2FzdDxQYXN0ZWJvYXJkKj4oJmNs
aXBib2FyZC0+cGFzdGVib2FyZCgpKTsKKyAgICBwYXN0ZWJvYXJkLT5zZXRFeHRlcm5hbERhdGFP
YmplY3QoY2xpcGJvYXJkRGF0YS5nZXQoKSk7CisgICAgcmV0dXJuIGNsaXBib2FyZC5yZWxlYXNl
KCk7CisjZW5kaWYKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vd2luL1Bhc3RlYm9hcmRXaW4uY3BwDQo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL1Bhc3RlYm9hcmRXaW4uY3BwCShyZXZpc2lvbiAxNTA0
MzMpDQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL1Bhc3RlYm9hcmRXaW4uY3BwCSh3
b3JraW5nIGNvcHkpDQpAQCAtMSw1ICsxLDYgQEANCiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA2
LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTMgWHVlcWluZyBIdWFuZyA8aHVhbmd4dWVxaW5nQGJhaWR1LmNvbT4KICAqCiAgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMzQsNiArMzUsOCBAQA0KICNpbmNsdWRlICJFZGl0b3Iu
aCIKICNpbmNsdWRlICJFbGVtZW50LmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJI
VE1MTmFtZXMuaCIKKyNpbmNsdWRlICJIVE1MUGFyc2VySWRpb21zLmgiCiAjaW5jbHVkZSAiSFdu
ZERDLmgiCiAjaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgogI2luY2x1ZGUgIkltYWdlLmgiCkBA
IC00Miw2ICs0NSw3IEBADQogI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNsdWRlICJSYW5nZS5oIgog
I2luY2x1ZGUgIlJlbmRlckltYWdlLmgiCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCiAjaW5j
bHVkZSAiVGV4dEVuY29kaW5nLmgiCiAjaW5jbHVkZSAiV2ViQ29yZUluc3RhbmNlSGFuZGxlLmgi
CiAjaW5jbHVkZSAiV2luZG93c0V4dHJhcy5oIgpAQCAtNTAsNiArNTQsOSBAQA0KIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCisvLyBXZSBwcm92aWRlIHRoZSBJRSBjbGlwYm9hcmQgdHlwZXMgKFVS
TCBhbmQgVGV4dCksIGFuZCB0aGUgY2xpcGJvYXJkIHR5cGVzIHNwZWNpZmllZCBpbiB0aGUgV0hB
VFdHIFdlYiBBcHBsaWNhdGlvbnMgMS4wIGRyYWZ0CisvLyBzZWUgaHR0cDovL3d3dy53aGF0d2cu
b3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8gU2VjdGlvbiA2LjMuNS4zCisKIHN0YXRp
YyBVSU5UIEhUTUxDbGlwYm9hcmRGb3JtYXQgPSAwOwogc3RhdGljIFVJTlQgQm9va21hcmtDbGlw
Ym9hcmRGb3JtYXQgPSAwOwogc3RhdGljIFVJTlQgV2ViU21hcnRQYXN0ZUZvcm1hdCA9IDA7CkBA
IC04OSw4ICs5NiwzOSBAQA0KICAgICByZXR1cm4gcGFzdGVib2FyZDsKIH0KIAotUGFzdGVib2Fy
ZDo6UGFzdGVib2FyZCgpCitQYXNzT3duUHRyPFBhc3RlYm9hcmQ+IFBhc3RlYm9hcmQ6OmNyZWF0
ZUZvckNvcHlBbmRQYXN0ZSgpCiB7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBQYXN0ZWJvYXJk
KTsKK30KKworUGFzc093blB0cjxQYXN0ZWJvYXJkPiBQYXN0ZWJvYXJkOjpjcmVhdGVQcml2YXRl
KCkKK3sKKyAgICAvLyBXaW5kb3dzIGhhcyBub3QgIlByaXZhdGUgcGFzdGVib2FyZCIgY29uY2Vw
dC4KKyAgICByZXR1cm4gY3JlYXRlRm9yQ29weUFuZFBhc3RlKCk7Cit9CisKKyNpZiBFTkFCTEUo
RFJBR19TVVBQT1JUKQorLy8gc3RhdGljCitQYXNzT3duUHRyPFBhc3RlYm9hcmQ+IFBhc3RlYm9h
cmQ6OmNyZWF0ZUZvckRyYWdBbmREcm9wKCkKK3sKKyAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBk
YXRhT2JqZWN0OworICAgIFdDRGF0YU9iamVjdDo6Y3JlYXRlSW5zdGFuY2UoJmRhdGFPYmplY3Qp
OworICAgIHJldHVybiBhZG9wdFB0cihuZXcgUGFzdGVib2FyZChkYXRhT2JqZWN0LmdldCgpKSk7
Cit9CisKKy8vIHN0YXRpYworUGFzc093blB0cjxQYXN0ZWJvYXJkPiBQYXN0ZWJvYXJkOjpjcmVh
dGVGb3JEcmFnQW5kRHJvcChjb25zdCBEcmFnRGF0YSYgZHJhZ0RhdGEpCit7CisgICAgaWYgKGRy
YWdEYXRhLnBsYXRmb3JtRGF0YSgpKQorICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBhc3Rl
Ym9hcmQoZHJhZ0RhdGEucGxhdGZvcm1EYXRhKCkpKTsKKyAgICAvLyBXZSBjb3VsZCBub3QgY2Fs
bCBEcmFnRGF0YTo6ZHJhZ0RhdGFNYXAgdmlhIHxjb25zdCBEcmFnRGF0YSZ8LgorICAgIGNvbnN0
IERyYWdEYXRhTWFwJiBkcmFnRGF0YU1hcCA9IGNvbnN0X2Nhc3Q8RHJhZ0RhdGEqPigoJmRyYWdE
YXRhKSktPmRyYWdEYXRhTWFwKCk7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBQYXN0ZWJvYXJk
KGRyYWdEYXRhTWFwKSk7Cit9CisjZW5kaWYKKwordm9pZCBQYXN0ZWJvYXJkOjpjcmVhdGVQYXN0
ZWJvYXJkUHJpdmF0ZSgpCit7CiAgICAgV05EQ0xBU1Mgd2M7CiAgICAgbWVtc2V0KCZ3YywgMCwg
c2l6ZW9mKFdORENMQVNTKSk7CiAgICAgd2MubHBmblduZFByb2MgICAgPSBQYXN0ZWJvYXJkT3du
ZXJXbmRQcm9jOwpAQCAtMTA2LDYgKzE0NCwzNSBAQA0KICAgICBXZWJTbWFydFBhc3RlRm9ybWF0
ID0gOjpSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIldlYktpdCBTbWFydCBQYXN0ZSBGb3JtYXQi
KTsKIH0KIAorUGFzdGVib2FyZDo6UGFzdGVib2FyZCgpCisgICAgOiBtX2RhdGFPYmplY3QoMCkK
KyAgICAsIG1fd3JpdGFibGVEYXRhT2JqZWN0KDApCit7CisgICAgY3JlYXRlUGFzdGVib2FyZFBy
aXZhdGUoKTsKK30KKworUGFzdGVib2FyZDo6UGFzdGVib2FyZChJRGF0YU9iamVjdCogZGF0YU9i
amVjdCkKKyAgICA6IG1fZGF0YU9iamVjdChkYXRhT2JqZWN0KQorICAgICwgbV93cml0YWJsZURh
dGFPYmplY3QoMCkKK3sKKyAgICBjcmVhdGVQYXN0ZWJvYXJkUHJpdmF0ZSgpOworfQorCitQYXN0
ZWJvYXJkOjpQYXN0ZWJvYXJkKFdDRGF0YU9iamVjdCogZGF0YU9iamVjdCkKKyAgICA6IG1fZGF0
YU9iamVjdChkYXRhT2JqZWN0KQorICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoZGF0YU9iamVj
dCkKK3sKKyAgICBjcmVhdGVQYXN0ZWJvYXJkUHJpdmF0ZSgpOworfQorCitQYXN0ZWJvYXJkOjpQ
YXN0ZWJvYXJkKGNvbnN0IERyYWdEYXRhTWFwJiBkYXRhTWFwKQorICAgIDogbV9kYXRhT2JqZWN0
KDApCisgICAgLCBtX3dyaXRhYmxlRGF0YU9iamVjdCgwKQorICAgICwgbV9kcmFnRGF0YU1hcChk
YXRhTWFwKQoreworICAgIGNyZWF0ZVBhc3RlYm9hcmRQcml2YXRlKCk7Cit9CisKIHZvaWQgUGFz
dGVib2FyZDo6Y2xlYXIoKQogewogICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsK
QEAgLTExNCw2ICsxODEsMjcxIEBADQogICAgIH0KIH0KIAorZW51bSBDbGlwYm9hcmREYXRhVHlw
ZSB7IENsaXBib2FyZERhdGFUeXBlTm9uZSwgQ2xpcGJvYXJkRGF0YVR5cGVVUkwsIENsaXBib2Fy
ZERhdGFUeXBlVGV4dCwgQ2xpcGJvYXJkRGF0YVR5cGVUZXh0SFRNTCB9OworCitzdGF0aWMgQ2xp
cGJvYXJkRGF0YVR5cGUgY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZShjb25zdCBTdHJpbmcmIHR5
cGUpCit7CisgICAgU3RyaW5nIHFUeXBlID0gdHlwZS5zdHJpcFdoaXRlU3BhY2UoKS5sb3dlcigp
OworCisgICAgLy8gdHdvIHNwZWNpYWwgY2FzZXMgZm9yIElFIGNvbXBhdGliaWxpdHkKKyAgICBp
ZiAocVR5cGUgPT0gInRleHQiIHx8IHFUeXBlID09ICJ0ZXh0L3BsYWluIiB8fCBxVHlwZS5zdGFy
dHNXaXRoKCJ0ZXh0L3BsYWluOyIpKQorICAgICAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVU
ZXh0OworICAgIGlmIChxVHlwZSA9PSAidXJsIiB8fCBxVHlwZSA9PSAidGV4dC91cmktbGlzdCIp
CisgICAgICAgIHJldHVybiBDbGlwYm9hcmREYXRhVHlwZVVSTDsKKyAgICBpZiAocVR5cGUgPT0g
InRleHQvaHRtbCIpCisgICAgICAgIHJldHVybiBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MOwor
CisgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlTm9uZTsKK30KKwordm9pZCBQYXN0ZWJvYXJk
OjpjbGVhcihjb25zdCBTdHJpbmcmIHR5cGUpCit7CisgICAgaWYgKCFtX3dyaXRhYmxlRGF0YU9i
amVjdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgQ2xpcGJvYXJkRGF0YVR5cGUgZGF0YVR5cGUg
PSBjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKHR5cGUpOworCisgICAgaWYgKGRhdGFUeXBlID09
IENsaXBib2FyZERhdGFUeXBlVVJMKSB7CisgICAgICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0LT5j
bGVhckRhdGEodXJsV0Zvcm1hdCgpLT5jZkZvcm1hdCk7CisgICAgICAgIG1fd3JpdGFibGVEYXRh
T2JqZWN0LT5jbGVhckRhdGEodXJsRm9ybWF0KCktPmNmRm9ybWF0KTsKKyAgICB9CisgICAgaWYg
KGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBlVGV4dCkgeworICAgICAgICBtX3dyaXRhYmxl
RGF0YU9iamVjdC0+Y2xlYXJEYXRhKHBsYWluVGV4dEZvcm1hdCgpLT5jZkZvcm1hdCk7CisgICAg
ICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0LT5jbGVhckRhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLT5j
ZkZvcm1hdCk7CisgICAgfQorfQorCitib29sIFBhc3RlYm9hcmQ6Omhhc0RhdGEoKQoreworICAg
IGlmICghbV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobV9kYXRhT2JqZWN0KSB7CisgICAgICAgIENPTVB0cjxJ
RW51bUZPUk1BVEVUQz4gaXRyOworICAgICAgICBpZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+RW51
bUZvcm1hdEV0YyhEQVRBRElSX0dFVCwgJml0cikpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgICAgIGlmICghaXRyKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIEZPUk1BVEVUQyBkYXRhOworCisgICAgICAgIC8vIElFbnVtRk9STUFURVRDOjpOZXh0IHJl
dHVybnMgU19GQUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcy4KKyAgICAgICAgaWYgKGl0
ci0+TmV4dCgxLCAmZGF0YSwgMCkgPT0gU19PSykgeworICAgICAgICAgICAgLy8gVGhlcmUgaXMg
YXQgbGVhc3Qgb25lIGl0ZW0gaW4gdGhlIElEYXRhT2JqZWN0CisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0
dXJuICFtX2RyYWdEYXRhTWFwLmlzRW1wdHkoKTsKK30KKworc3RhdGljIHZvaWQgYWRkTWltZVR5
cGVzRm9yRm9ybWF0KExpc3RIYXNoU2V0PFN0cmluZz4mIHJlc3VsdHMsIGNvbnN0IEZPUk1BVEVU
QyYgZm9ybWF0KQoreworICAgIC8vIFVSTCBhbmQgVGV4dCBhcmUgcHJvdmlkZWQgZm9yIGNvbXBh
dGliaWxpdHkgd2l0aCBJRSdzIG1vZGVsCisgICAgaWYgKGZvcm1hdC5jZkZvcm1hdCA9PSB1cmxG
b3JtYXQoKS0+Y2ZGb3JtYXQgfHwgZm9ybWF0LmNmRm9ybWF0ID09IHVybFdGb3JtYXQoKS0+Y2ZG
b3JtYXQpIHsKKyAgICAgICAgcmVzdWx0cy5hZGQoIlVSTCIpOworICAgICAgICByZXN1bHRzLmFk
ZCgidGV4dC91cmktbGlzdCIpOworICAgIH0KKworICAgIGlmIChmb3JtYXQuY2ZGb3JtYXQgPT0g
cGxhaW5UZXh0V0Zvcm1hdCgpLT5jZkZvcm1hdCB8fCBmb3JtYXQuY2ZGb3JtYXQgPT0gcGxhaW5U
ZXh0Rm9ybWF0KCktPmNmRm9ybWF0KSB7CisgICAgICAgIHJlc3VsdHMuYWRkKCJUZXh0Iik7Cisg
ICAgICAgIHJlc3VsdHMuYWRkKCJ0ZXh0L3BsYWluIik7CisgICAgfQorfQorCitMaXN0SGFzaFNl
dDxTdHJpbmc+IFBhc3RlYm9hcmQ6OnR5cGVzKCkKK3sKKyAgICBMaXN0SGFzaFNldDxTdHJpbmc+
IHJlc3VsdHM7CisKKyAgICBpZiAoIW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFwLmlzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisKKyAgICBpZiAobV9kYXRhT2JqZWN0KSB7
CisgICAgICAgIENPTVB0cjxJRW51bUZPUk1BVEVUQz4gaXRyOworCisgICAgICAgIGlmIChGQUlM
RUQobV9kYXRhT2JqZWN0LT5FbnVtRm9ybWF0RXRjKERBVEFESVJfR0VULCAmaXRyKSkpCisgICAg
ICAgICAgICByZXR1cm4gcmVzdWx0czsKKworICAgICAgICBpZiAoIWl0cikKKyAgICAgICAgICAg
IHJldHVybiByZXN1bHRzOworCisgICAgICAgIEZPUk1BVEVUQyBkYXRhOworCisgICAgICAgIC8v
IElFbnVtRk9STUFURVRDOjpOZXh0IHJldHVybnMgU19GQUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9y
ZSBpdGVtcy4KKyAgICAgICAgd2hpbGUgKGl0ci0+TmV4dCgxLCAmZGF0YSwgMCkgPT0gU19PSykK
KyAgICAgICAgICAgIGFkZE1pbWVUeXBlc0ZvckZvcm1hdChyZXN1bHRzLCBkYXRhKTsKKyAgICB9
IGVsc2UgeworICAgICAgICBmb3IgKERyYWdEYXRhTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1f
ZHJhZ0RhdGFNYXAuYmVnaW4oKTsgaXQgIT0gbV9kcmFnRGF0YU1hcC5lbmQoKTsgKytpdCkgewor
ICAgICAgICAgICAgRk9STUFURVRDIGRhdGE7CisgICAgICAgICAgICBkYXRhLmNmRm9ybWF0ID0g
KCppdCkua2V5OworICAgICAgICAgICAgYWRkTWltZVR5cGVzRm9yRm9ybWF0KHJlc3VsdHMsIGRh
dGEpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdHM7Cit9CisKK1N0cmlu
ZyBQYXN0ZWJvYXJkOjpyZWFkU3RyaW5nKGNvbnN0IFN0cmluZyYgdHlwZSkKK3sKKyAgICBpZiAo
IW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFwLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
ICIiOworCisgICAgQ2xpcGJvYXJkRGF0YVR5cGUgZGF0YVR5cGUgPSBjbGlwYm9hcmRUeXBlRnJv
bU1JTUVUeXBlKHR5cGUpOworICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRl
eHQpCisgICAgICAgIHJldHVybiBtX2RhdGFPYmplY3QgPyBnZXRQbGFpblRleHQobV9kYXRhT2Jq
ZWN0LmdldCgpKSA6IGdldFBsYWluVGV4dCgmbV9kcmFnRGF0YU1hcCk7CisgICAgaWYgKGRhdGFU
eXBlID09IENsaXBib2FyZERhdGFUeXBlVVJMKQorICAgICAgICByZXR1cm4gbV9kYXRhT2JqZWN0
ID8gZ2V0VVJMKG1fZGF0YU9iamVjdC5nZXQoKSwgRHJhZ0RhdGE6OkRvTm90Q29udmVydEZpbGVu
YW1lcykgOiBnZXRVUkwoJm1fZHJhZ0RhdGFNYXAsIERyYWdEYXRhOjpEb05vdENvbnZlcnRGaWxl
bmFtZXMpOworICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MKSB7
CisgICAgICAgIFN0cmluZyBkYXRhID0gbV9kYXRhT2JqZWN0ID8gZ2V0VGV4dEhUTUwobV9kYXRh
T2JqZWN0LmdldCgpKSA6IGdldFRleHRIVE1MKCZtX2RyYWdEYXRhTWFwKTsKKyAgICAgICAgaWYg
KCFkYXRhLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICByZXR1
cm4gbV9kYXRhT2JqZWN0ID8gZ2V0Q0ZIVE1MKG1fZGF0YU9iamVjdC5nZXQoKSkgOiBnZXRDRkhU
TUwoJm1fZHJhZ0RhdGFNYXApOworICAgIH0KKworICAgIHJldHVybiAiIjsKK30KKworVmVjdG9y
PFN0cmluZz4gUGFzdGVib2FyZDo6cmVhZEZpbGVuYW1lcygpCit7CisjaWYgVVNFKENGKQorICAg
IFZlY3RvcjxTdHJpbmc+IGZpbGVOYW1lczsKKworICAgIGlmIChtX2RhdGFPYmplY3QpIHsKKyAg
ICAgICAgU1RHTUVESVVNIG1lZGl1bTsKKyAgICAgICAgaWYgKEZBSUxFRChtX2RhdGFPYmplY3Qt
PkdldERhdGEoY2ZIRHJvcEZvcm1hdCgpLCAmbWVkaXVtKSkpCisgICAgICAgICAgICByZXR1cm4g
ZmlsZU5hbWVzOworCisgICAgICAgIEhEUk9QIGhkcm9wID0gcmVpbnRlcnByZXRfY2FzdDxIRFJP
UD4oR2xvYmFsTG9jayhtZWRpdW0uaEdsb2JhbCkpOworICAgICAgICBpZiAoIWhkcm9wKQorICAg
ICAgICAgICAgcmV0dXJuIGZpbGVOYW1lczsKKworICAgICAgICBXQ0hBUiBmaWxlbmFtZVtNQVhf
UEFUSF07CisgICAgICAgIFVJTlQgZmlsZUNvdW50ID0gRHJhZ1F1ZXJ5RmlsZVcoaGRyb3AsIDB4
RkZGRkZGRkYsIDAsIDApOworICAgICAgICBmb3IgKFVJTlQgaSA9IDA7IGkgPCBmaWxlQ291bnQ7
IGkrKykgeworICAgICAgICAgICAgaWYgKCFEcmFnUXVlcnlGaWxlVyhoZHJvcCwgaSwgZmlsZW5h
bWUsIFdURl9BUlJBWV9MRU5HVEgoZmlsZW5hbWUpKSkKKyAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgIGZpbGVOYW1lcy5hcHBlbmQoZmlsZW5hbWUpOworICAgICAgICB9CisK
KyAgICAgICAgR2xvYmFsVW5sb2NrKG1lZGl1bS5oR2xvYmFsKTsKKyAgICAgICAgUmVsZWFzZVN0
Z01lZGl1bSgmbWVkaXVtKTsKKyAgICAgICAgcmV0dXJuIGZpbGVOYW1lczsKKyAgICB9CisgICAg
aWYgKCFtX2RyYWdEYXRhTWFwLmNvbnRhaW5zKGNmSERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQpKQor
ICAgICAgICByZXR1cm4gZmlsZU5hbWVzOworICAgIHJldHVybiBtX2RyYWdEYXRhTWFwLmdldChj
ZkhEcm9wRm9ybWF0KCktPmNmRm9ybWF0KTsKKyNlbHNlCisgICAgbm90SW1wbGVtZW50ZWQoKTsK
KyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgYm9vbCB3cml0ZVVSTChXQ0RhdGFP
YmplY3QgKmRhdGEsIGNvbnN0IEtVUkwmIHVybCwgU3RyaW5nIHRpdGxlLCBib29sIHdpdGhQbGFp
blRleHQsIGJvb2wgd2l0aEhUTUwpCit7CisgICAgQVNTRVJUKGRhdGEpOworCisgICAgaWYgKHVy
bC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICh0aXRsZS5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgdGl0bGUgPSB1cmwubGFzdFBhdGhDb21wb25lbnQoKTsKKyAgICAg
ICAgaWYgKHRpdGxlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHRpdGxlID0gdXJsLmhvc3QoKTsK
KyAgICB9CisKKyAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OworICAgIG1lZGl1bS50eW1lZCA9
IFRZTUVEX0hHTE9CQUw7CisKKyAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEo
dXJsLCB0aXRsZSk7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgaWYgKG1lZGl1bS5o
R2xvYmFsICYmIEZBSUxFRChkYXRhLT5TZXREYXRhKHVybFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJV
RSkpKQorICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOworICAgIGVsc2UKKyAg
ICAgICAgc3VjY2VzcyA9IHRydWU7CisKKyAgICBpZiAod2l0aEhUTUwpIHsKKyAgICAgICAgVmVj
dG9yPGNoYXI+IGNmaHRtbERhdGE7CisgICAgICAgIG1hcmt1cFRvQ0ZIVE1MKHVybFRvTWFya3Vw
KHVybCwgdGl0bGUpLCAiIiwgY2ZodG1sRGF0YSk7CisgICAgICAgIG1lZGl1bS5oR2xvYmFsID0g
Y3JlYXRlR2xvYmFsRGF0YShjZmh0bWxEYXRhKTsKKyAgICAgICAgaWYgKG1lZGl1bS5oR2xvYmFs
ICYmIEZBSUxFRChkYXRhLT5TZXREYXRhKGh0bWxGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQor
ICAgICAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgfQorCisgICAgaWYgKHdpdGhQbGFpblRl
eHQpIHsKKyAgICAgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKHVybC5zdHJp
bmcoKSk7CisgICAgICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQoZGF0YS0+U2V0RGF0
YShwbGFpblRleHRXRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKKyAgICAgICAgICAgIDo6R2xv
YmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN1Y2Nl
c3MgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiBzdWNjZXNzOworfQorCitib29sIFBhc3Rl
Ym9hcmQ6OndyaXRlU3RyaW5nKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBkYXRh
KQoreworICAgIGlmICghbV93cml0YWJsZURhdGFPYmplY3QpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIENsaXBib2FyZERhdGFUeXBlIHdpblR5cGUgPSBjbGlwYm9hcmRUeXBlRnJvbU1J
TUVUeXBlKHR5cGUpOworCisgICAgaWYgKHdpblR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVVUkwp
CisgICAgICAgIHJldHVybiBXZWJDb3JlOjp3cml0ZVVSTChtX3dyaXRhYmxlRGF0YU9iamVjdC5n
ZXQoKSwgS1VSTChQYXJzZWRVUkxTdHJpbmcsIGRhdGEpLCBTdHJpbmcoKSwgZmFsc2UsIHRydWUp
OworCisgICAgaWYgKHdpblR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KSB7CisgICAgICAg
IFNUR01FRElVTSBtZWRpdW0gPSB7MH07CisgICAgICAgIG1lZGl1bS50eW1lZCA9IFRZTUVEX0hH
TE9CQUw7CisgICAgICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YShkYXRhKTsK
KyAgICAgICAgaWYgKCFtZWRpdW0uaEdsb2JhbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICBpZiAoRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKHBsYWlu
VGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKSB7CisgICAgICAgICAgICA6Okdsb2JhbEZy
ZWUobWVkaXVtLmhHbG9iYWwpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwor
dm9pZCBQYXN0ZWJvYXJkOjpzZXREcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmLCBjb25zdCBJbnRQb2lu
dCYgaG90U3BvdCkKK3sKKyAgICAvLyBEbyBub3RoaW5nIGluIFdpbmRvd3MuCit9CisKK3ZvaWQg
UGFzdGVib2FyZDo6d3JpdGVSYW5nZVRvRGF0YU9iamVjdChSYW5nZSogc2VsZWN0ZWRSYW5nZSwg
RnJhbWUqIGZyYW1lKQoreworICAgIEFTU0VSVChzZWxlY3RlZFJhbmdlKTsKKyAgICBpZiAoIW1f
d3JpdGFibGVEYXRhT2JqZWN0KQorICAgICAgICByZXR1cm47CisKKyAgICBTVEdNRURJVU0gbWVk
aXVtID0gezB9OworICAgIG1lZGl1bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7CisKKyAgICBWZWN0
b3I8Y2hhcj4gZGF0YTsKKyAgICBtYXJrdXBUb0NGSFRNTChjcmVhdGVNYXJrdXAoc2VsZWN0ZWRS
YW5nZSwgMCwgQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSksCisgICAgICAgIHNlbGVjdGVkUmFuZ2Ut
PnN0YXJ0Q29udGFpbmVyKCktPmRvY3VtZW50KCktPnVybCgpLnN0cmluZygpLCBkYXRhKTsKKyAg
ICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7CisgICAgaWYgKG1lZGl1
bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShodG1sRm9y
bWF0KCksICZtZWRpdW0sIFRSVUUpKSkKKyAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xv
YmFsKTsKKworICAgIFN0cmluZyBzdHIgPSBmcmFtZS0+ZWRpdG9yKCkuc2VsZWN0ZWRUZXh0Rm9y
Q2xpcGJvYXJkKCk7CisgICAgcmVwbGFjZU5ld2xpbmVzV2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVz
KHN0cik7CisgICAgcmVwbGFjZU5CU1BXaXRoU3BhY2Uoc3RyKTsKKyAgICBtZWRpdW0uaEdsb2Jh
bCA9IGNyZWF0ZUdsb2JhbERhdGEoc3RyKTsKKyAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJ
TEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKHBsYWluVGV4dFdGb3JtYXQoKSwgJm1l
ZGl1bSwgVFJVRSkpKQorICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOworCisg
ICAgbWVkaXVtLmhHbG9iYWwgPSAwOworICAgIGlmIChmcmFtZS0+ZWRpdG9yKCkuY2FuU21hcnRD
b3B5T3JEZWxldGUoKSkKKyAgICAgICAgbV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEoc21h
cnRQYXN0ZUZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKTsKK30KKwogdm9pZCBQYXN0ZWJvYXJkOjp3
cml0ZVNlbGVjdGlvbihSYW5nZSogc2VsZWN0ZWRSYW5nZSwgYm9vbCBjYW5TbWFydENvcHlPckRl
bGV0ZSwgRnJhbWUqIGZyYW1lLCBTaG91bGRTZXJpYWxpemVTZWxlY3RlZFRleHRGb3JDbGlwYm9h
cmQgc2hvdWxkU2VyaWFsaXplU2VsZWN0ZWRUZXh0Rm9yQ2xpcGJvYXJkKQogewogICAgIGNsZWFy
KCk7CkBAIC0xNDYsMTAgKzQ3OCwyOSBAQA0KICAgICAgICAgICAgIDo6U2V0Q2xpcGJvYXJkRGF0
YShXZWJTbWFydFBhc3RlRm9ybWF0LCAwKTsKICAgICAgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQo
KTsKICAgICAgICAgfQotICAgICAgICAKICAgICB9CisKKyAgICB3cml0ZVJhbmdlVG9EYXRhT2Jq
ZWN0KHNlbGVjdGVkUmFuZ2UsIGZyYW1lKTsKIH0KIAordm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVBs
YWluVGV4dFRvRGF0YU9iamVjdChjb25zdCBTdHJpbmcmIHRleHQsIFNtYXJ0UmVwbGFjZU9wdGlv
biBzbWFydFJlcGxhY2VPcHRpb24pCit7CisgICAgaWYgKCFtX3dyaXRhYmxlRGF0YU9iamVjdCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKKyAgICBtZWRp
dW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOworCisgICAgU3RyaW5nIHN0ciA9IHRleHQ7CisgICAg
cmVwbGFjZU5ld2xpbmVzV2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVzKHN0cik7CisgICAgcmVwbGFj
ZU5CU1BXaXRoU3BhY2Uoc3RyKTsKKyAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERh
dGEoc3RyKTsKKyAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRh
T2JqZWN0LT5TZXREYXRhKHBsYWluVGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQorICAg
ICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOyAgICAgICAgCisKKyAgICBtZWRpdW0u
aEdsb2JhbCA9IDA7Cit9CisKIHZvaWQgUGFzdGVib2FyZDo6d3JpdGVQbGFpblRleHQoY29uc3Qg
U3RyaW5nJiB0ZXh0LCBTbWFydFJlcGxhY2VPcHRpb24gc21hcnRSZXBsYWNlT3B0aW9uKQogewog
ICAgIGNsZWFyKCk7CkBAIC0xNzEsOCArNTIyLDE2NSBAQA0KICAgICAgICAgICAgIDo6Q2xvc2VD
bGlwYm9hcmQoKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHdyaXRlUGxhaW5UZXh0VG9EYXRh
T2JqZWN0KHRleHQsIHNtYXJ0UmVwbGFjZU9wdGlvbik7CiB9CiAKKyNpZiAhT1MoV0lOQ0UpCitz
dGF0aWMgaW5saW5lIHZvaWQgcGF0aFJlbW92ZUJhZEZTQ2hhcmFjdGVycyhQV1NUUiBwc3osIHNp
emVfdCBsZW5ndGgpCit7CisgICAgc2l6ZV90IHdyaXRlVG8gPSAwOworICAgIHNpemVfdCByZWFk
RnJvbSA9IDA7CisgICAgd2hpbGUgKHJlYWRGcm9tIDwgbGVuZ3RoKSB7CisgICAgICAgIFVJTlQg
dHlwZSA9IFBhdGhHZXRDaGFyVHlwZShwc3pbcmVhZEZyb21dKTsKKyAgICAgICAgaWYgKCFwc3pb
cmVhZEZyb21dIHx8IHR5cGUgJiAoR0NUX0xGTkNIQVIgfCBHQ1RfU0hPUlRDSEFSKSkKKyAgICAg
ICAgICAgIHBzelt3cml0ZVRvKytdID0gcHN6W3JlYWRGcm9tXTsKKworICAgICAgICByZWFkRnJv
bSsrOworICAgIH0KKyAgICBwc3pbd3JpdGVUb10gPSAwOworfQorI2VuZGlmCisKK3N0YXRpYyBT
dHJpbmcgZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JUaXRsZShjb25zdCBTdHJpbmcmIHVybCwgY29u
c3QgU3RyaW5nJiB0aXRsZSwgY29uc3QgVUNoYXIqIGV4dGVuc2lvbiwgYm9vbCBpc0xpbmspCit7
CisjaWYgT1MoV0lOQ0UpCisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gU3RyaW5n
KCk7CisjZWxzZQorICAgIHN0YXRpYyBjb25zdCBzaXplX3QgZnNQYXRoTWF4TGVuZ3RoRXhjbHVk
aW5nTnVsbFRlcm1pbmF0b3IgPSBNQVhfUEFUSCAtIDE7CisgICAgYm9vbCB1c2VkVVJMID0gZmFs
c2U7CisgICAgV0NIQVIgZnNQYXRoQnVmZmVyW01BWF9QQVRIXTsKKyAgICBmc1BhdGhCdWZmZXJb
MF0gPSAwOworICAgIGludCBleHRlbnNpb25MZW4gPSBleHRlbnNpb24gPyBsc3RybGVuKGV4dGVu
c2lvbikgOiAwOworICAgIGludCBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24gPSBm
c1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdOdWxsVGVybWluYXRvciAtIGV4dGVuc2lvbkxlbjsKKwor
ICAgIGlmICghdGl0bGUuaXNFbXB0eSgpKSB7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdGQ6Om1p
bjxzaXplX3Q+KHRpdGxlLmxlbmd0aCgpLCBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNp
b24pOworICAgICAgICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgdGl0bGUuY2hhcmFjdGVycygp
LCBsZW4gKiBzaXplb2YoVUNoYXIpKTsKKyAgICAgICAgZnNQYXRoQnVmZmVyW2xlbl0gPSAwOwor
ICAgICAgICBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKGZzUGF0aEJ1ZmZlciwgbGVuKTsKKyAg
ICB9CisKKyAgICBpZiAoIWxzdHJsZW4oZnNQYXRoQnVmZmVyKSkgeworICAgICAgICBLVVJMIGt1
cmwoUGFyc2VkVVJMU3RyaW5nLCB1cmwpOworICAgICAgICB1c2VkVVJMID0gdHJ1ZTsKKyAgICAg
ICAgLy8gVGhlIGZpbGVuYW1lIGZvciBhbnkgY29udGVudCBiYXNlZCBkcmFnIG9yIGZpbGUgdXJs
IHNob3VsZCBiZSB0aGUgbGFzdCBlbGVtZW50IG9mIAorICAgICAgICAvLyB0aGUgcGF0aC4gSWYg
d2UgY2FuJ3QgZmluZCBpdCwgb3Igd2UncmUgY29taW5nIHVwIHdpdGggdGhlIG5hbWUgZm9yIGEg
bGluaworICAgICAgICAvLyB3ZSBqdXN0IHVzZSB0aGUgZW50aXJlIHVybC4KKyAgICAgICAgRFdP
UkQgbGVuID0gZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0ZW5zaW9uOworICAgICAgICBTdHJp
bmcgbGFzdENvbXBvbmVudCA9IGt1cmwubGFzdFBhdGhDb21wb25lbnQoKTsKKyAgICAgICAgaWYg
KGt1cmwuaXNMb2NhbEZpbGUoKSB8fCAoIWlzTGluayAmJiAhbGFzdENvbXBvbmVudC5pc0VtcHR5
KCkpKSB7CisgICAgICAgICAgICBsZW4gPSBzdGQ6Om1pbjxEV09SRD4oZnNQYXRoTWF4TGVuZ3Ro
RXhjbHVkaW5nRXh0ZW5zaW9uLCBsYXN0Q29tcG9uZW50Lmxlbmd0aCgpKTsKKyAgICAgICAgICAg
IENvcHlNZW1vcnkoZnNQYXRoQnVmZmVyLCBsYXN0Q29tcG9uZW50LmNoYXJhY3RlcnMoKSwgbGVu
ICogc2l6ZW9mKFVDaGFyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZW4gPSBz
dGQ6Om1pbjxEV09SRD4oZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0ZW5zaW9uLCB1cmwubGVu
Z3RoKCkpOworICAgICAgICAgICAgQ29weU1lbW9yeShmc1BhdGhCdWZmZXIsIHVybC5jaGFyYWN0
ZXJzKCksIGxlbiAqIHNpemVvZihVQ2hhcikpOworICAgICAgICB9CisgICAgICAgIGZzUGF0aEJ1
ZmZlcltsZW5dID0gMDsKKyAgICAgICAgcGF0aFJlbW92ZUJhZEZTQ2hhcmFjdGVycyhmc1BhdGhC
dWZmZXIsIGxlbik7CisgICAgfQorCisgICAgaWYgKCFleHRlbnNpb24pCisgICAgICAgIHJldHVy
biBTdHJpbmcoc3RhdGljX2Nhc3Q8VUNoYXIqPihmc1BhdGhCdWZmZXIpKTsKKworICAgIGlmICgh
aXNMaW5rICYmIHVzZWRVUkwpIHsKKyAgICAgICAgUGF0aFJlbmFtZUV4dGVuc2lvbihmc1BhdGhC
dWZmZXIsIGV4dGVuc2lvbik7CisgICAgICAgIHJldHVybiBTdHJpbmcoc3RhdGljX2Nhc3Q8VUNo
YXIqPihmc1BhdGhCdWZmZXIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWFrZVN0cmluZyhzdGF0
aWNfY2FzdDxjb25zdCBVQ2hhcio+KGZzUGF0aEJ1ZmZlciksIGV4dGVuc2lvbik7CisjZW5kaWYK
K30KKworLy8gd3JpdGVGaWxlVG9EYXRhT2JqZWN0IHRha2VzIG93bmVyc2hpcCBvZiBmaWxlRGVz
Y3JpcHRvciBhbmQgZmlsZUNvbnRlbnQKK3N0YXRpYyBIUkVTVUxUIHdyaXRlRmlsZVRvRGF0YU9i
amVjdChJRGF0YU9iamVjdCogZGF0YU9iamVjdCwgSEdMT0JBTCBmaWxlRGVzY3JpcHRvciwgSEdM
T0JBTCBmaWxlQ29udGVudCwgSEdMT0JBTCBoRHJvcENvbnRlbnQpCit7CisgICAgSFJFU1VMVCBo
ciA9IFNfT0s7CisgICAgRk9STUFURVRDKiBmZTsKKyAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9
OworICAgIG1lZGl1bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7CisKKyAgICBpZiAoIWZpbGVEZXNj
cmlwdG9yIHx8ICFmaWxlQ29udGVudCkKKyAgICAgICAgZ290byBleGl0OworCisgICAgLy8gRGVz
Y3JpcHRvcgorICAgIGZlID0gZmlsZURlc2NyaXB0b3JGb3JtYXQoKTsKKworICAgIG1lZGl1bS5o
R2xvYmFsID0gZmlsZURlc2NyaXB0b3I7CisKKyAgICBpZiAoRkFJTEVEKGhyID0gZGF0YU9iamVj
dC0+U2V0RGF0YShmZSwgJm1lZGl1bSwgVFJVRSkpKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAg
ICAvLyBDb250ZW50cworICAgIGZlID0gZmlsZUNvbnRlbnRGb3JtYXRaZXJvKCk7CisgICAgbWVk
aXVtLmhHbG9iYWwgPSBmaWxlQ29udGVudDsKKyAgICBpZiAoRkFJTEVEKGhyID0gZGF0YU9iamVj
dC0+U2V0RGF0YShmZSwgJm1lZGl1bSwgVFJVRSkpKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyNp
ZiBVU0UoQ0YpCisgICAgLy8gSERST1AKKyAgICBpZiAoaERyb3BDb250ZW50KSB7CisgICAgICAg
IG1lZGl1bS5oR2xvYmFsID0gaERyb3BDb250ZW50OworICAgICAgICBociA9IGRhdGFPYmplY3Qt
PlNldERhdGEoY2ZIRHJvcEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKTsKKyAgICB9CisjZW5kaWYK
KworZXhpdDoKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBpZiAoZmlsZURlc2NyaXB0
b3IpCisgICAgICAgICAgICBHbG9iYWxGcmVlKGZpbGVEZXNjcmlwdG9yKTsKKyAgICAgICAgaWYg
KGZpbGVDb250ZW50KQorICAgICAgICAgICAgR2xvYmFsRnJlZShmaWxlQ29udGVudCk7CisgICAg
ICAgIGlmIChoRHJvcENvbnRlbnQpCisgICAgICAgICAgICBHbG9iYWxGcmVlKGhEcm9wQ29udGVu
dCk7CisgICAgfQorICAgIHJldHVybiBocjsKK30KKwordm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVVS
TFRvRGF0YU9iamVjdChjb25zdCBLVVJMJiBrdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxlU3RyLCBG
cmFtZSogZnJhbWUpCit7CisgICAgaWYgKCFtX3dyaXRhYmxlRGF0YU9iamVjdCkKKyAgICAgICAg
cmV0dXJuOworICAgIFdlYkNvcmU6OndyaXRlVVJMKG1fd3JpdGFibGVEYXRhT2JqZWN0LmdldCgp
LCBrdXJsLCB0aXRsZVN0ciwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICBTdHJpbmcgdXJsID0ga3VybC5z
dHJpbmcoKTsKKyAgICBBU1NFUlQodXJsLmNvbnRhaW5zT25seUFTQ0lJKCkpOyAvLyBLVVJMOjpz
dHJpbmcoKSBpcyBVUkwgZW5jb2RlZC4KKworICAgIFN0cmluZyBmc1BhdGggPSBmaWxlc3lzdGVt
UGF0aEZyb21VcmxPclRpdGxlKHVybCwgdGl0bGVTdHIsIEwiLlVSTCIsIHRydWUpOworICAgIFN0
cmluZyBjb250ZW50U3RyaW5nKCJbSW50ZXJuZXRTaG9ydGN1dF1cclxuVVJMPSIgKyB1cmwgKyAi
XHJcbiIpOworICAgIENTdHJpbmcgY29udGVudCA9IGNvbnRlbnRTdHJpbmcubGF0aW4xKCk7CisK
KyAgICBpZiAoZnNQYXRoLmxlbmd0aCgpIDw9IDApCisgICAgICAgIHJldHVybjsKKworICAgIEhH
TE9CQUwgdXJsRmlsZURlc2NyaXB0b3IgPSBHbG9iYWxBbGxvYyhHUFRSLCBzaXplb2YoRklMRUdS
T1VQREVTQ1JJUFRPUikpOworICAgIGlmICghdXJsRmlsZURlc2NyaXB0b3IpCisgICAgICAgIHJl
dHVybjsKKworICAgIEhHTE9CQUwgdXJsRmlsZUNvbnRlbnQgPSBHbG9iYWxBbGxvYyhHUFRSLCBj
b250ZW50Lmxlbmd0aCgpKTsKKyAgICBpZiAoIXVybEZpbGVDb250ZW50KSB7CisgICAgICAgIEds
b2JhbEZyZWUodXJsRmlsZURlc2NyaXB0b3IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgRklMRUdST1VQREVTQ1JJUFRPUiogZmdkID0gc3RhdGljX2Nhc3Q8RklMRUdST1VQREVTQ1JJ
UFRPUio+KEdsb2JhbExvY2sodXJsRmlsZURlc2NyaXB0b3IpKTsKKyAgICBaZXJvTWVtb3J5KGZn
ZCwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKKyAgICBmZ2QtPmNJdGVtcyA9IDE7Cisg
ICAgZmdkLT5mZ2RbMF0uZHdGbGFncyA9IEZEX0ZJTEVTSVpFOworICAgIGZnZC0+ZmdkWzBdLm5G
aWxlU2l6ZUxvdyA9IGNvbnRlbnQubGVuZ3RoKCk7CisKKyAgICB1bnNpZ25lZCBtYXhTaXplID0g
c3RkOjptaW4oZnNQYXRoLmxlbmd0aCgpLCBXVEZfQVJSQVlfTEVOR1RIKGZnZC0+ZmdkWzBdLmNG
aWxlTmFtZSkpOworICAgIENvcHlNZW1vcnkoZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lLCBmc1BhdGgu
Y2hhcmFjdGVycygpLCBtYXhTaXplICogc2l6ZW9mKFVDaGFyKSk7CisgICAgR2xvYmFsVW5sb2Nr
KHVybEZpbGVEZXNjcmlwdG9yKTsKKworICAgIGNoYXIqIGZpbGVDb250ZW50cyA9IHN0YXRpY19j
YXN0PGNoYXIqPihHbG9iYWxMb2NrKHVybEZpbGVDb250ZW50KSk7CisgICAgQ29weU1lbW9yeShm
aWxlQ29udGVudHMsIGNvbnRlbnQuZGF0YSgpLCBjb250ZW50Lmxlbmd0aCgpKTsKKyAgICBHbG9i
YWxVbmxvY2sodXJsRmlsZUNvbnRlbnQpOworCisgICAgd3JpdGVGaWxlVG9EYXRhT2JqZWN0KG1f
d3JpdGFibGVEYXRhT2JqZWN0LmdldCgpLCB1cmxGaWxlRGVzY3JpcHRvciwgdXJsRmlsZUNvbnRl
bnQsIDApOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6OndyaXRlVVJMKGNvbnN0IEtVUkwmIHVybCwg
Y29uc3QgU3RyaW5nJiB0aXRsZVN0ciwgRnJhbWUqIGZyYW1lKQogewogICAgIEFTU0VSVCghdXJs
LmlzRW1wdHkoKSk7CkBAIC0yMTEsNiArNzE5LDggQEANCiAgICAgICAgICAgICA6Okdsb2JhbEZy
ZWUoY2JEYXRhKTsKICAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOwogICAgIH0KKworICAgIHdy
aXRlVVJMVG9EYXRhT2JqZWN0KHVybCwgdGl0bGVTdHIsIGZyYW1lKTsKIH0KIAogdm9pZCBQYXN0
ZWJvYXJkOjp3cml0ZUltYWdlKE5vZGUqIG5vZGUsIGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcm
KQpAQCAtMjU2LDYgKzc2NiwxMSBAQA0KICAgICB9CiB9CiAKK3ZvaWQgUGFzdGVib2FyZDo6d3Jp
dGVQYXN0ZWJvYXJkKGNvbnN0IFBhc3RlYm9hcmQmIHNvdXJjZVBhc3RlYm9hcmQpCit7CisgICAg
bm90SW1wbGVtZW50ZWQoKTsKK30KKwogdm9pZCBQYXN0ZWJvYXJkOjp3cml0ZUNsaXBib2FyZChD
bGlwYm9hcmQqKQogewogICAgIG5vdEltcGxlbWVudGVkKCk7CkBAIC0zNTIsNCArODY3LDIwNyBA
QA0KICAgICByZXR1cm4gMDsKIH0KIAordm9pZCBQYXN0ZWJvYXJkOjpzZXRFeHRlcm5hbERhdGFP
YmplY3QoSURhdGFPYmplY3QgKmRhdGFPYmplY3QpCit7CisgICAgbV93cml0YWJsZURhdGFPYmpl
Y3QgPSAwOworICAgIG1fZGF0YU9iamVjdCA9IGRhdGFPYmplY3Q7Cit9CisKK3N0YXRpYyBDYWNo
ZWRJbWFnZSogZ2V0Q2FjaGVkSW1hZ2UoRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICAvLyBBdHRl
bXB0IHRvIHB1bGwgQ2FjaGVkSW1hZ2UgZnJvbSBlbGVtZW50CisgICAgQVNTRVJUKGVsZW1lbnQp
OworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBlbGVtZW50LT5yZW5kZXJlcigpOworICAg
IGlmICghcmVuZGVyZXIgfHwgIXJlbmRlcmVyLT5pc0ltYWdlKCkpIAorICAgICAgICByZXR1cm4g
MDsKKworICAgIFJlbmRlckltYWdlKiBpbWFnZSA9IHRvUmVuZGVySW1hZ2UocmVuZGVyZXIpOwor
ICAgIGlmIChpbWFnZS0+Y2FjaGVkSW1hZ2UoKSAmJiAhaW1hZ2UtPmNhY2hlZEltYWdlKCktPmVy
cm9yT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIGltYWdlLT5jYWNoZWRJbWFnZSgpOworCisg
ICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmlsZURl
c2NyaXB0b3IoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUsIENhY2hlZElt
YWdlKiBpbWFnZSkKK3sKKyAgICBBU1NFUlRfQVJHKGltYWdlLCBpbWFnZSk7CisgICAgQVNTRVJU
KGltYWdlLT5pbWFnZSgpLT5kYXRhKCkpOworCisgICAgSFJFU1VMVCBociA9IFNfT0s7CisgICAg
SEdMT0JBTCBtZW1PYmogPSAwOworICAgIFN0cmluZyBmc1BhdGg7CisgICAgbWVtT2JqID0gR2xv
YmFsQWxsb2MoR1BUUiwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKKyAgICBpZiAoIW1l
bU9iaikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBGSUxFR1JPVVBERVNDUklQVE9SKiBmZ2Qg
PSAoRklMRUdST1VQREVTQ1JJUFRPUiopR2xvYmFsTG9jayhtZW1PYmopOworICAgIG1lbXNldChm
Z2QsIDAsIHNpemVvZihGSUxFR1JPVVBERVNDUklQVE9SKSk7CisgICAgZmdkLT5jSXRlbXMgPSAx
OworICAgIGZnZC0+ZmdkWzBdLmR3RmxhZ3MgPSBGRF9GSUxFU0laRTsKKyAgICBmZ2QtPmZnZFsw
XS5uRmlsZVNpemVMb3cgPSBpbWFnZS0+aW1hZ2UoKS0+ZGF0YSgpLT5zaXplKCk7CisKKyAgICBj
b25zdCBTdHJpbmcmIHByZWZlcnJlZFRpdGxlID0gdGl0bGUuaXNFbXB0eSgpID8gaW1hZ2UtPnJl
c3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5hbWUoKSA6IHRpdGxlOworICAgIFN0cmluZyBleHRlbnNp
b24gPSBpbWFnZS0+aW1hZ2UoKS0+ZmlsZW5hbWVFeHRlbnNpb24oKTsKKyAgICBpZiAoZXh0ZW5z
aW9uLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBEbyBub3QgY29udGludWUgcHJvY2Vzc2luZyBp
biB0aGUgcmFyZSBhbmQgdW51c3VhbCBjYXNlIHdoZXJlIGEgZGVjb2RlZCBpbWFnZSBpcyBub3Qg
YWJsZSAKKyAgICAgICAgLy8gdG8gcHJvdmlkZSBhIGZpbGVuYW1lIGV4dGVuc2lvbi4gU29tZXRo
aW5nIHRyaWNreSAobGlrZSBhIGJhaXQtbi1zd2l0Y2gpIGlzIGdvaW5nIG9uCisgICAgICAgIHJl
dHVybiAwOworICAgIH0KKyAgICBleHRlbnNpb24uaW5zZXJ0KCIuIiwgMCk7CisgICAgZnNQYXRo
ID0gZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JUaXRsZSh1cmwsIHByZWZlcnJlZFRpdGxlLCBleHRl
bnNpb24uY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgZmFsc2UpOworCisgICAgaWYg
KGZzUGF0aC5sZW5ndGgoKSA8PSAwKSB7CisgICAgICAgIEdsb2JhbFVubG9jayhtZW1PYmopOwor
ICAgICAgICBHbG9iYWxGcmVlKG1lbU9iaik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKwor
ICAgIGludCBtYXhTaXplID0gc3RkOjptaW4oZnNQYXRoLmxlbmd0aCgpLCBXVEZfQVJSQVlfTEVO
R1RIKGZnZC0+ZmdkWzBdLmNGaWxlTmFtZSkpOworICAgIENvcHlNZW1vcnkoZmdkLT5mZ2RbMF0u
Y0ZpbGVOYW1lLCAoTFBDV1NUUilmc1BhdGguY2hhcmFjdGVycygpLCBtYXhTaXplICogc2l6ZW9m
KFVDaGFyKSk7CisgICAgR2xvYmFsVW5sb2NrKG1lbU9iaik7CisKKyAgICByZXR1cm4gbWVtT2Jq
OworfQorCitzdGF0aWMgSEdMT0JBTCBjcmVhdGVHbG9iYWxJbWFnZUZpbGVDb250ZW50KFNoYXJl
ZEJ1ZmZlciogZGF0YSkKK3sKKyAgICBIR0xPQkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdQVFIs
IGRhdGEtPnNpemUoKSk7CisgICAgaWYgKCFtZW1PYmopIAorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIGNoYXIqIGZpbGVDb250ZW50cyA9IChQU1RSKUdsb2JhbExvY2sobWVtT2JqKTsKKworICAg
IENvcHlNZW1vcnkoZmlsZUNvbnRlbnRzLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUoKSk7CisK
KyAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKKworICAgIHJldHVybiBtZW1PYmo7Cit9CisKK3N0
YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEhEcm9wQ29udGVudChjb25zdCBLVVJMJiB1cmwsIFN0
cmluZyYgZmlsZU5hbWUsIFNoYXJlZEJ1ZmZlciogZGF0YSkKK3sKKyAgICBpZiAoZmlsZU5hbWUu
aXNFbXB0eSgpIHx8ICFkYXRhKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFdDSEFSIGZpbGVQ
YXRoW01BWF9QQVRIXTsKKworICAgIGlmICh1cmwuaXNMb2NhbEZpbGUoKSkgeworICAgICAgICBT
dHJpbmcgbG9jYWxQYXRoID0gZGVjb2RlVVJMRXNjYXBlU2VxdWVuY2VzKHVybC5wYXRoKCkpOwor
ICAgICAgICAvLyB3aW5kb3dzIGRvZXMgbm90IGVuam95IGEgbGVhZGluZyBzbGFzaCBvbiBwYXRo
cworICAgICAgICBpZiAobG9jYWxQYXRoWzBdID09ICcvJykKKyAgICAgICAgICAgIGxvY2FsUGF0
aCA9IGxvY2FsUGF0aC5zdWJzdHJpbmcoMSk7CisgICAgICAgIExQQ1dTVFIgbG9jYWxQYXRoU3Ry
ID0gbG9jYWxQYXRoLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCk7CisgICAgICAgIGlm
ICh3Y3NsZW4obG9jYWxQYXRoU3RyKSArIDEgPCBNQVhfUEFUSCkKKyAgICAgICAgICAgIHdjc2Nw
eV9zKGZpbGVQYXRoLCBNQVhfUEFUSCwgbG9jYWxQYXRoU3RyKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyNpZiBPUyhXSU5DRSkKKyAgICAgICAg
bm90SW1wbGVtZW50ZWQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisjZWxzZQorICAgICAgICBXQ0hB
UiB0ZW1wUGF0aFtNQVhfUEFUSF07CisgICAgICAgIFdDSEFSIGV4dGVuc2lvbltNQVhfUEFUSF07
CisgICAgICAgIGlmICghOjpHZXRUZW1wUGF0aChXVEZfQVJSQVlfTEVOR1RIKHRlbXBQYXRoKSwg
dGVtcFBhdGgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICghOjpQYXRoQXBw
ZW5kKHRlbXBQYXRoLCBmaWxlTmFtZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKSkK
KyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBMUENXU1RSIGZvdW5kRXh0ZW5zaW9uID0g
OjpQYXRoRmluZEV4dGVuc2lvbih0ZW1wUGF0aCk7CisgICAgICAgIGlmIChmb3VuZEV4dGVuc2lv
bikgeworICAgICAgICAgICAgaWYgKHdjc2NweV9zKGV4dGVuc2lvbiwgTUFYX1BBVEgsIGZvdW5k
RXh0ZW5zaW9uKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlCisg
ICAgICAgICAgICAqZXh0ZW5zaW9uID0gMDsKKyAgICAgICAgOjpQYXRoUmVtb3ZlRXh0ZW5zaW9u
KHRlbXBQYXRoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCAxMDAwMDsgaSsrKSB7Cisg
ICAgICAgICAgICBpZiAoc3dwcmludGZfcyhmaWxlUGF0aCwgTUFYX1BBVEgsIFRFWFQoIiVzLSVk
JXMiKSwgdGVtcFBhdGgsIGksIGV4dGVuc2lvbikgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0
dXJuIDA7CisgICAgICAgICAgICBpZiAoITo6UGF0aEZpbGVFeGlzdHMoZmlsZVBhdGgpKQorICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEhBTkRMRSB0ZW1wRmlsZUhh
bmRsZSA9IENyZWF0ZUZpbGUoZmlsZVBhdGgsIEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUs
IDAsIDAsIENSRUFURV9BTFdBWVMsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgMCk7CisgICAgICAg
IGlmICh0ZW1wRmlsZUhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgICAg
IHJldHVybiAwOworCisgICAgICAgIC8vIFdyaXRlIHRoZSBkYXRhIHRvIHRoaXMgdGVtcCBmaWxl
LgorICAgICAgICBEV09SRCB3cml0dGVuOworICAgICAgICBCT09MIHRlbXBXcml0ZVN1Y2NlZWRl
ZCA9IFdyaXRlRmlsZSh0ZW1wRmlsZUhhbmRsZSwgZGF0YS0+ZGF0YSgpLCBkYXRhLT5zaXplKCks
ICZ3cml0dGVuLCAwKTsKKyAgICAgICAgQ2xvc2VIYW5kbGUodGVtcEZpbGVIYW5kbGUpOworICAg
ICAgICBpZiAoIXRlbXBXcml0ZVN1Y2NlZWRlZCkKKyAgICAgICAgICAgIHJldHVybiAwOworI2Vu
ZGlmCisgICAgfQorCisgICAgU0laRV9UIGRyb3BGaWxlc1NpemUgPSBzaXplb2YoRFJPUEZJTEVT
KSArIChzaXplb2YoV0NIQVIpICogKHdjc2xlbihmaWxlUGF0aCkgKyAyKSk7CisgICAgSEdMT0JB
TCBtZW1PYmogPSBHbG9iYWxBbGxvYyhHSE5EIHwgR01FTV9TSEFSRSwgZHJvcEZpbGVzU2l6ZSk7
CisgICAgaWYgKCFtZW1PYmopIAorICAgICAgICByZXR1cm4gMDsKKworICAgIERST1BGSUxFUyog
ZHJvcEZpbGVzID0gKERST1BGSUxFUyopIEdsb2JhbExvY2sobWVtT2JqKTsKKyAgICBkcm9wRmls
ZXMtPnBGaWxlcyA9IHNpemVvZihEUk9QRklMRVMpOworICAgIGRyb3BGaWxlcy0+ZldpZGUgPSBU
UlVFOworICAgIHdjc2NweSgoTFBXU1RSKShkcm9wRmlsZXMgKyAxKSwgZmlsZVBhdGgpOyAgICAK
KyAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKKworICAgIHJldHVybiBtZW1PYmo7Cit9CisKK3N0
YXRpYyB2b2lkIHdyaXRlSW1hZ2VUb0RhdGFPYmplY3QoSURhdGFPYmplY3QqIGRhdGFPYmplY3Qs
IEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICAvLyBTaG92ZSBpbWFn
ZSBkYXRhIGludG8gYSBEYXRhT2JqZWN0IGZvciB1c2UgYXMgYSBmaWxlCisgICAgQ2FjaGVkSW1h
Z2UqIGNhY2hlZEltYWdlID0gZ2V0Q2FjaGVkSW1hZ2UoZWxlbWVudCk7CisgICAgaWYgKCFjYWNo
ZWRJbWFnZSB8fCAhY2FjaGVkSW1hZ2UtPmltYWdlRm9yUmVuZGVyZXIoZWxlbWVudC0+cmVuZGVy
ZXIoKSkgfHwgIWNhY2hlZEltYWdlLT5pc0xvYWRlZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBTaGFyZWRCdWZmZXIqIGltYWdlQnVmZmVyID0gY2FjaGVkSW1hZ2UtPmltYWdlRm9yUmVuZGVy
ZXIoZWxlbWVudC0+cmVuZGVyZXIoKSktPmRhdGEoKTsKKyAgICBpZiAoIWltYWdlQnVmZmVyIHx8
ICFpbWFnZUJ1ZmZlci0+c2l6ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBIR0xPQkFMIGlt
YWdlRmlsZURlc2NyaXB0b3IgPSBjcmVhdGVHbG9iYWxJbWFnZUZpbGVEZXNjcmlwdG9yKHVybC5z
dHJpbmcoKSwgZWxlbWVudC0+Z2V0QXR0cmlidXRlKEhUTUxOYW1lczo6YWx0QXR0ciksIGNhY2hl
ZEltYWdlKTsKKyAgICBpZiAoIWltYWdlRmlsZURlc2NyaXB0b3IpCisgICAgICAgIHJldHVybjsK
KworICAgIEhHTE9CQUwgaW1hZ2VGaWxlQ29udGVudCA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNv
bnRlbnQoaW1hZ2VCdWZmZXIpOworICAgIGlmICghaW1hZ2VGaWxlQ29udGVudCkgeworICAgICAg
ICBHbG9iYWxGcmVlKGltYWdlRmlsZURlc2NyaXB0b3IpOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgU3RyaW5nIGZpbGVOYW1lID0gY2FjaGVkSW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2Vz
dGVkRmlsZW5hbWUoKTsKKyAgICBIR0xPQkFMIGhEcm9wQ29udGVudCA9IGNyZWF0ZUdsb2JhbEhE
cm9wQ29udGVudCh1cmwsIGZpbGVOYW1lLCBpbWFnZUJ1ZmZlcik7CisgICAgaWYgKCFoRHJvcENv
bnRlbnQpIHsKKyAgICAgICAgR2xvYmFsRnJlZShoRHJvcENvbnRlbnQpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgd3JpdGVGaWxlVG9EYXRhT2JqZWN0KGRhdGFPYmplY3QsIGltYWdl
RmlsZURlc2NyaXB0b3IsIGltYWdlRmlsZUNvbnRlbnQsIGhEcm9wQ29udGVudCk7Cit9CisKK3Zv
aWQgUGFzdGVib2FyZDo6ZGVjbGFyZUFuZFdyaXRlRHJhZ0ltYWdlKEVsZW1lbnQqIGVsZW1lbnQs
IGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgRnJhbWUqIGZyYW1lKQorewor
ICAgIC8vIE9yZGVyIGlzIGltcG9ydGFudCBoZXJlIGZvciBFeHBsb3JlcidzIHNha2UKKyAgICBp
ZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQorICAgICAgICByZXR1cm47CisgICAgV2ViQ29yZTo6
d3JpdGVVUkwobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybCwgdGl0bGUsIHRydWUsIGZh
bHNlKTsKKworICAgIHdyaXRlSW1hZ2VUb0RhdGFPYmplY3QobV93cml0YWJsZURhdGFPYmplY3Qu
Z2V0KCksIGVsZW1lbnQsIHVybCk7CisKKyAgICBBdG9taWNTdHJpbmcgaW1hZ2VVUkwgPSBlbGVt
ZW50LT5nZXRBdHRyaWJ1dGUoSFRNTE5hbWVzOjpzcmNBdHRyKTsKKyAgICBpZiAoaW1hZ2VVUkwu
aXNFbXB0eSgpKSAKKyAgICAgICAgcmV0dXJuOworCisgICAgS1VSTCBmdWxsVVJMID0gZnJhbWUt
PmRvY3VtZW50KCktPmNvbXBsZXRlVVJMKHN0cmlwTGVhZGluZ0FuZFRyYWlsaW5nSFRNTFNwYWNl
cyhpbWFnZVVSTCkpOworICAgIGlmIChmdWxsVVJMLmlzRW1wdHkoKSkgCisgICAgICAgIHJldHVy
bjsKKyAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OworICAgIG1lZGl1bS50eW1lZCA9IFRZTUVE
X0hHTE9CQUw7CisKKyAgICAvLyBQdXQgaW1nIHRhZyBvbiB0aGUgY2xpcGJvYXJkIHJlZmVyZW5j
aW5nIHRoZSBpbWFnZQorICAgIFZlY3RvcjxjaGFyPiBkYXRhOworICAgIG1hcmt1cFRvQ0ZIVE1M
KGNyZWF0ZU1hcmt1cChlbGVtZW50LCBJbmNsdWRlTm9kZSwgMCwgUmVzb2x2ZUFsbFVSTHMpLCAi
IiwgZGF0YSk7CisgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEpOwor
ICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNl
dERhdGEoaHRtbEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIDo6R2xvYmFsRnJl
ZShtZWRpdW0uaEdsb2JhbCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNv
dXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJLaXQv
d2luL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNDk0KQ0KKysrIFNvdXJjZS9XZWJLaXQvd2luL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEsMyArMSwxNCBAQA0KKzIwMTMtMDUtMjEgIFh1
ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgorCisgICAgICAgIE1vdmUgV2lu
ZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJkLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNw
cDoKKyAgICAgICAgKFdlYkRyYWdDbGllbnQ6OndpbGxQZXJmb3JtRHJhZ1NvdXJjZUFjdGlvbik6
IEdldCBJRGF0YU9iamVjdCBmcm9tIFBhc3RlYm9hcmQgaW5zdGVhZCBvZiBDbGlwYm9hcmQuCisg
ICAgICAgIChXZWJEcmFnQ2xpZW50OjpzdGFydERyYWcpOiBEaXR0by4KKwogMjAxMy0wNS0xOSAg
QW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAYXBwbGUuY29tPgogCiAgICAgICAgIFJlbW92ZSBD
aHJvbWVDbGllbnQ6OndlYlZpZXcoKQpJbmRleDogU291cmNlL1dlYktpdC93aW4vV2ViQ29yZVN1
cHBvcnQvV2ViRHJhZ0NsaWVudC5jcHANCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBTb3VyY2UvV2ViS2l0L3dp
bi9XZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcAkocmV2aXNpb24gMTUwNDMzKQ0KKysr
IFNvdXJjZS9XZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQuY3BwCSh3b3Jr
aW5nIGNvcHkpDQpAQCAtMzEsMTAgKzMxLDE3IEBADQogCiAjaW5jbHVkZSA8c2hsb2JqLmg+CiAK
KyNpZiAhVVNFKExFR0FDWV9TVFlMRV9BQlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCisjaW5jbHVk
ZSA8V2ViQ29yZS9DbGlwYm9hcmQuaD4KKyNlbHNlCiAjaW5jbHVkZSA8V2ViQ29yZS9DbGlwYm9h
cmRXaW4uaD4KKyNlbmRpZgogI2luY2x1ZGUgPFdlYkNvcmUvRHJhZ0NvbnRyb2xsZXIuaD4KICNp
bmNsdWRlIDxXZWJDb3JlL0RyYWdEYXRhLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9FdmVudEhhbmRs
ZXIuaD4KKyNpZiAhVVNFKExFR0FDWV9TVFlMRV9BQlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCisj
aW5jbHVkZSA8V2ViQ29yZS9QYXN0ZWJvYXJkLmg+CisjZW5kaWYKICNpbmNsdWRlIDxXZWJDb3Jl
L1BsYXRmb3JtTW91c2VFdmVudC5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRnJhbWUuaD4KICNpbmNs
dWRlIDxXZWJDb3JlL0ZyYW1lVmlldy5oPgpAQCAtMTAzLDEyICsxMTAsMjEgQEANCiAgICAgICAg
IHJldHVybjsKIAogICAgIFBPSU5UIHBvaW50ID0gaW50UG9pbnQ7CisjaWYgVVNFKExFR0FDWV9T
VFlMRV9BQlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCiAgICAgQ09NUHRyPElEYXRhT2JqZWN0PiBk
YXRhT2JqZWN0ID0gc3RhdGljX2Nhc3Q8Q2xpcGJvYXJkV2luKj4oY2xpcGJvYXJkKS0+ZGF0YU9i
amVjdCgpOworI2Vsc2UKKyAgICBQYXN0ZWJvYXJkKiBwYXN0ZWJvYXJkID0gY29uc3RfY2FzdDxQ
YXN0ZWJvYXJkKj4oJmNsaXBib2FyZC0+cGFzdGVib2FyZCgpKTsKKyAgICBDT01QdHI8SURhdGFP
YmplY3Q+IGRhdGFPYmplY3QgPSBwYXN0ZWJvYXJkLT5kYXRhT2JqZWN0KCk7CisjZW5kaWYKIAog
ICAgIENPTVB0cjxJRGF0YU9iamVjdD4gbmV3RGF0YU9iamVjdDsKICAgICBIUkVTVUxUIHJlc3Vs
dCA9IHVpRGVsZWdhdGUtPndpbGxQZXJmb3JtRHJhZ1NvdXJjZUFjdGlvbihtX3dlYlZpZXcsIHN0
YXRpY19jYXN0PFdlYkRyYWdTb3VyY2VBY3Rpb24+KGFjdGlvbiksICZwb2ludCwgZGF0YU9iamVj
dC5nZXQoKSwgJm5ld0RhdGFPYmplY3QpOwogICAgIGlmIChyZXN1bHQgPT0gU19PSyAmJiBuZXdE
YXRhT2JqZWN0ICE9IGRhdGFPYmplY3QpCisjaWYgVVNFKExFR0FDWV9TVFlMRV9BQlNUUkFDVF9D
TElQQk9BUkRfQ0xBU1MpCiAgICAgICAgIHN0YXRpY19jYXN0PENsaXBib2FyZFdpbio+KGNsaXBi
b2FyZCktPnNldEV4dGVybmFsRGF0YU9iamVjdChuZXdEYXRhT2JqZWN0LmdldCgpKTsKKyNlbHNl
CisgICAgICAgIHBhc3RlYm9hcmQtPnNldEV4dGVybmFsRGF0YU9iamVjdChuZXdEYXRhT2JqZWN0
LmdldCgpKTsKKyNlbmRpZgogfQogCiB2b2lkIFdlYkRyYWdDbGllbnQ6OnN0YXJ0RHJhZyhEcmFn
SW1hZ2VSZWYgaW1hZ2UsIGNvbnN0IEludFBvaW50JiBpbWFnZU9yaWdpbiwgY29uc3QgSW50UG9p
bnQmIGRyYWdQb2ludCwgQ2xpcGJvYXJkKiBjbGlwYm9hcmQsIEZyYW1lKiBmcmFtZSwgYm9vbCBp
c0xpbmspCkBAIC0xMjQsNyArMTQwLDEyIEBADQogICAgIGlmIChGQUlMRUQoV2ViRHJvcFNvdXJj
ZTo6Y3JlYXRlSW5zdGFuY2UobV93ZWJWaWV3LCAmc291cmNlKSkpCiAgICAgICAgIHJldHVybjsK
IAorI2lmIFVTRShMRUdBQ1lfU1RZTEVfQUJTVFJBQ1RfQ0xJUEJPQVJEX0NMQVNTKQogICAgIGRh
dGFPYmplY3QgPSBzdGF0aWNfY2FzdDxDbGlwYm9hcmRXaW4qPihjbGlwYm9hcmQpLT5kYXRhT2Jq
ZWN0KCk7CisjZWxzZQorICAgIFBhc3RlYm9hcmQqIHBhc3RlYm9hcmQgPSBjb25zdF9jYXN0PFBh
c3RlYm9hcmQqPigmY2xpcGJvYXJkLT5wYXN0ZWJvYXJkKCkpOworICAgIGRhdGFPYmplY3QgPSBw
YXN0ZWJvYXJkLT5kYXRhT2JqZWN0KCk7CisjZW5kaWYKICAgICBpZiAoc291cmNlICYmIChpbWFn
ZSB8fCBkYXRhT2JqZWN0KSkgewogICAgICAgICBpZiAoaW1hZ2UpIHsKICAgICAgICAgICAgIGlm
KFNVQ0NFRURFRChDb0NyZWF0ZUluc3RhbmNlKENMU0lEX0RyYWdEcm9wSGVscGVyLCAwLCBDTFND
VFhfSU5QUk9DX1NFUlZFUiwK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>202492</attachid>
            <date>2013-05-21 19:54:56 -0700</date>
            <delta_ts>2013-05-24 01:08:21 -0700</delta_ts>
            <desc>patch</desc>
            <filename>116258.patch</filename>
            <type>text/plain</type>
            <size>68076</size>
            <attacher name="huangxueqing">huangxueqing</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9X
ZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNDk0KQ0KKysrIFNvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEsMyArMSw2MiBAQA0KKzIwMTMtMDUtMjEgIFh1
ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgorCisgICAgICAgIE1vdmUgV2lu
ZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJkLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdHM6CisgICAgICAgIENsaXBib2FyZCByZWZhY3Rv
ciwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogZG9tL0NsaXBib2FyZC5oOgorICAgICAgICAq
IHBhZ2Uvd2luL0V2ZW50SGFuZGxlcldpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFdmVudEhh
bmRsZXI6OmNyZWF0ZURyYWdnaW5nQ2xpcGJvYXJkKTogQ3JlYXRlIENsaXBib2FyZCBpbnN0ZWFk
IG9mIENsaXBib2FyZFdpbi4KKyAgICAgICAgKiBwbGF0Zm9ybS9QYXN0ZWJvYXJkLmg6CisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFBhc3RlYm9hcmQpOgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6ZGF0YU9iamVjdCk6IEdldCBJRGF0YU9iamVjdCBieSBDbGlwYm9yYWQuCisg
ICAgICAgICogcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpDbGlwYm9hcmQ6OmNyZWF0ZURyYWdJbWFnZSk6IENoYW5nZSBwYXJhbWV0ZXIgbmFtZSBsb2Mg
dG8gZHJhZ0xvY2F0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q2xpcGJvYXJkOjpkZWNsYXJlQW5k
V3JpdGVEcmFnSW1hZ2UpOiBNb3ZlIGltcGxlbWVudGF0aW9uIGludG8gUGFzdGVib2FyZFdpbi5j
cHAuCisgICAgICAgICogcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5oOiBSZW1vdmVkLgorICAg
ICAgICAqIHBsYXRmb3JtL3dpbi9FZGl0b3JXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6RWRp
dG9yOjpuZXdHZW5lcmFsQ2xpcGJvYXJkKTogQ3JlYXRlIENsaXBib2FyZCBpbnN0ZWFkIG9mIENs
aXBib2FyZFdpbi4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmNyZWF0ZUZv
ckNvcHlBbmRQYXN0ZSk6IENyZWF0ZSBhIFBhc3RlYm9hcmQuCisgICAgICAgIChXZWJDb3JlOjpQ
YXN0ZWJvYXJkOjpjcmVhdGVQcml2YXRlKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0
ZWJvYXJkOjpjcmVhdGVGb3JEcmFnQW5kRHJvcCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6Y3JlYXRlUGFzdGVib2FyZFByaXZhdGUpOiBDcmVhdGUgUGFzdGVib2FyZCB1
c2UgV2luZG93cyBBUEkuCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpQYXN0ZWJvYXJk
KToKKyAgICAgICAgKFdlYkNvcmU6OmNsaXBib2FyZFR5cGVGcm9tTUlNRVR5cGUpOiBDb3BpZWQg
ZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6Y2xl
YXIpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6Omhhc0RhdGEpOiBEaXR0
by4KKyAgICAgICAgKFdlYkNvcmU6OmFkZE1pbWVUeXBlc0ZvckZvcm1hdCk6IERpdHRvLgorICAg
ICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6dHlwZXMpOiBEaXR0by4KKyAgICAgICAgKFdlYkNv
cmU6OlBhc3RlYm9hcmQ6OnJlYWRTdHJpbmcpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBh
c3RlYm9hcmQ6OnJlYWRGaWxlbmFtZXMpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OndyaXRl
VVJMKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVN0cmluZyk6
IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6c2V0RHJhZ0ltYWdlKTogRGl0
dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVJhbmdlVG9EYXRhT2JqZWN0
KTogV3JpdGUgcmFuZ2UgdG8gV0NEYXRhT2JqZWN0LgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVi
b2FyZDo6d3JpdGVTZWxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3Jp
dGVQbGFpblRleHRUb0RhdGFPYmplY3QpOiBXcml0ZSBQbGFpblRleHQgdG8gV0NEYXRhT2JqZWN0
LgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVQbGFpblRleHQpOgorICAgICAg
ICAoV2ViQ29yZTo6cGF0aFJlbW92ZUJhZEZTQ2hhcmFjdGVycyk6IENvcGllZCBmcm9tIENsaXBi
b2FyZFdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRp
dGxlKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjp3cml0ZUZpbGVUb0RhdGFPYmplY3QpOiBE
aXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlVVJMVG9EYXRhT2JqZWN0
KTogV3JpdGUgVVJMIHRvIFdDRGF0YU9iamVjdC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9h
cmQ6OndyaXRlVVJMKTogQ29waWVkIGZyb20gQ2xpcGJvYXJkV2luLmNwcC4KKyAgICAgICAgKFdl
YkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlUGFzdGVib2FyZCk6ICBDb3BpZWQgZnJvbSBQYXN0ZWJv
YXJkOjp3cml0ZUNsaXBib2FyZC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmRvY3Vt
ZW50RnJhZ21lbnQpOiBDb3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6UGFzdGVib2FyZDo6c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KTogQ2xpcGJvYXJkIGNhbiBz
ZXQgbmV3IElEYXRhT2JqZWN0LgorICAgICAgICAoV2ViQ29yZTo6Z2V0Q2FjaGVkSW1hZ2UpOiBD
b3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlR2xv
YmFsSW1hZ2VGaWxlRGVzY3JpcHRvcik6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
R2xvYmFsSW1hZ2VGaWxlQ29udGVudCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
R2xvYmFsSERyb3BDb250ZW50KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjp3cml0ZUltYWdl
VG9EYXRhT2JqZWN0KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpkZWNs
YXJlQW5kV3JpdGVEcmFnSW1hZ2UpOiBDb3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorCiAy
MDEzLTA1LTIxICBBbmR5IEVzdGVzICA8YWVzdGVzQGFwcGxlLmNvbT4KIAogICAgICAgICBBbGxv
dyBzZXNzaW9uIHN0b3JhZ2UgZm9yIHRoaXJkLXBhcnR5IG9yaWdpbnMgZXZlbiBpZiB0aGlyZC1w
YXJ0eSBkYXRhIGFjY2VzcyBpcyBibG9ja2VkLgpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0Ns
aXBib2FyZC5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09DQotLS0gU291cmNlL1dlYkNvcmUvZG9tL0NsaXBib2FyZC5o
CShyZXZpc2lvbiAxNTA0MzMpDQorKysgU291cmNlL1dlYkNvcmUvZG9tL0NsaXBib2FyZC5oCSh3
b3JraW5nIGNvcHkpDQpAQCAtMzQsNyArMzQsNyBAQA0KIC8vIFRoaXMgRE9NIG9iamVjdCBub3cg
d29ya3MgYnkgY2FsbGluZyB0aHJvdWdoIHRvIGNsYXNzZXMgaW4gdGhlIHBsYXRmb3JtIGxheWVy
LgogLy8gU3BlY2lmaWNhbGx5LCB0aGUgY2xhc3MgY3VycmVudGx5IG5hbWVkIFBhc3RlYm9hcmQu
IFRoZSBsZWdhY3kgc3R5bGUgaW5zdGVhZAogLy8gdXNlcyB0aGlzIGFzIGFuIGFic3RyYWN0IGJh
c2UgY2xhc3MuCi0jZGVmaW5lIFdURl9VU0VfTEVHQUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FS
RF9DTEFTUyAoUExBVEZPUk0oSU9TKSB8fCBQTEFURk9STShRVCkgfHwgUExBVEZPUk0oV0lOKSkK
KyNkZWZpbmUgV1RGX1VTRV9MRUdBQ1lfU1RZTEVfQUJTVFJBQ1RfQ0xJUEJPQVJEX0NMQVNTIChQ
TEFURk9STShJT1MpIHx8IFBMQVRGT1JNKFFUKSkKIAogI2lmIFVTRShMRUdBQ1lfU1RZTEVfQUJT
VFJBQ1RfQ0xJUEJPQVJEX0NMQVNTKQogI2RlZmluZSBMRUdBQ1lfVklSVFVBTCB2aXJ0dWFsCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL3dpbi9FdmVudEhhbmRsZXJXaW4uY3BwDQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09DQotLS0gU291cmNlL1dlYkNvcmUvcGFnZS93aW4vRXZlbnRIYW5kbGVyV2luLmNwcAkocmV2
aXNpb24gMTUwNDMzKQ0KKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2Uvd2luL0V2ZW50SGFuZGxlcldp
bi5jcHAJKHdvcmtpbmcgY29weSkNCkBAIC00MywxMSArNDMsMTYgQEANCiAjaW5jbHVkZSAiV0NE
YXRhT2JqZWN0LmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKIAorI2lmICFVU0UoTEVH
QUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFTUykKKyNpbmNsdWRlICJDT01QdHIuaCIK
KyNpbmNsdWRlICJDbGlwYm9hcmQuaCIKKyNlbHNlCiAjaWYgT1MoV0lOQ0UpCiAjaW5jbHVkZSAi
Q2xpcGJvYXJkLmgiCiAjZWxzZQogI2luY2x1ZGUgIkNsaXBib2FyZFdpbi5oIgogI2VuZGlmCisj
ZW5kaWYKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC0xMDEsMTAgKzEwNiwxNCBAQA0KICNp
ZiBPUyhXSU5DRSkKICAgICByZXR1cm4gMDsKICNlbHNlCisjaWYgVVNFKExFR0FDWV9TVFlMRV9B
QlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCiAgICAgQ09NUHRyPFdDRGF0YU9iamVjdD4gZGF0YU9i
amVjdDsKICAgICBXQ0RhdGFPYmplY3Q6OmNyZWF0ZUluc3RhbmNlKCZkYXRhT2JqZWN0KTsKICAg
ICByZXR1cm4gQ2xpcGJvYXJkV2luOjpjcmVhdGUoQ2xpcGJvYXJkOjpEcmFnQW5kRHJvcCwgZGF0
YU9iamVjdC5nZXQoKSwgQ2xpcGJvYXJkV3JpdGFibGUsIG1fZnJhbWUpOworI2Vsc2UKKyAgICBy
ZXR1cm4gQ2xpcGJvYXJkOjpjcmVhdGVGb3JEcmFnQW5kRHJvcCgpOwogI2VuZGlmCisjZW5kaWYK
IH0KICNlbmRpZgogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgN
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0NCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgJKHJl
dmlzaW9uIDE1MDQzMykNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgJ
KHdvcmtpbmcgY29weSkNCkBAIC0zOCw2ICszOCw5IEBADQogI2VuZGlmCiAKICNpZiBQTEFURk9S
TShXSU4pCisjaW5jbHVkZSA8V2ViQ29yZS9DT01QdHIuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1dD
RGF0YU9iamVjdC5oPgorI2luY2x1ZGUgPG9iamlkbC5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4K
IHR5cGVkZWYgc3RydWN0IEhXTkRfXyogSFdORDsKICNlbmRpZgpAQCAtNjQsNiArNjcsOSBAQA0K
IGNsYXNzIENsaXBib2FyZDsKIGNsYXNzIERvY3VtZW50RnJhZ21lbnQ7CiBjbGFzcyBEcmFnRGF0
YTsKKyNpZiBQTEFURk9STShXSU4pCitjbGFzcyBFbGVtZW50OworI2VuZGlmCiBjbGFzcyBGcmFt
ZTsKIGNsYXNzIEhpdFRlc3RSZXN1bHQ7CiBjbGFzcyBLVVJMOwpAQCAtMTAwLDYgKzEwNiwxMiBA
QA0KICAgICBQYXNzUmVmUHRyPERhdGFPYmplY3RHdGs+IGRhdGFPYmplY3QoKSBjb25zdDsKICNl
bmRpZgogCisjaWYgUExBVEZPUk0oV0lOKQorICAgIGV4cGxpY2l0IFBhc3RlYm9hcmQoSURhdGFP
YmplY3QqKTsKKyAgICBleHBsaWNpdCBQYXN0ZWJvYXJkKFdDRGF0YU9iamVjdCopOworICAgIGV4
cGxpY2l0IFBhc3RlYm9hcmQoY29uc3QgRHJhZ0RhdGFNYXAmKTsKKyNlbmRpZgorCiAgICAgLy8g
RGVwcmVjYXRlZC4gVXNlIGNyZWF0ZUZvckNvcHlBbmRQYXN0ZSBpbnN0ZWFkLgogICAgIHN0YXRp
YyBQYXN0ZWJvYXJkKiBnZW5lcmFsUGFzdGVib2FyZCgpOwogCkBAIC0xNTMsNiArMTY1LDEyIEBA
DQogICAgIHZvaWQgc2V0U2VsZWN0aW9uTW9kZShib29sKSB7IH0KICNlbmRpZgogCisjaWYgUExB
VEZPUk0oV0lOKQorICAgIENPTVB0cjxJRGF0YU9iamVjdD4gZGF0YU9iamVjdCgpIHsgcmV0dXJu
IG1fZGF0YU9iamVjdDsgfQorICAgIHZvaWQgc2V0RXh0ZXJuYWxEYXRhT2JqZWN0KElEYXRhT2Jq
ZWN0Kik7CisgICAgdm9pZCBkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UoRWxlbWVudCosIGNvbnN0
IEtVUkwmLCBjb25zdCBTdHJpbmcmLCBGcmFtZSopOworI2VuZGlmCisKICNpZiBQTEFURk9STShH
VEspCiAgICAgflBhc3RlYm9hcmQoKTsKICNlbmRpZgpAQCAtMTc1LDcgKzE5MywxNSBAQA0KICNl
bmRpZgogCiAjaWYgUExBVEZPUk0oV0lOKQorICAgIHZvaWQgY3JlYXRlUGFzdGVib2FyZFByaXZh
dGUoKTsKKyAgICB2b2lkIHdyaXRlUmFuZ2VUb0RhdGFPYmplY3QoUmFuZ2UqLCBGcmFtZSopOwor
ICAgIHZvaWQgd3JpdGVVUkxUb0RhdGFPYmplY3QoY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYs
IEZyYW1lKik7CisgICAgdm9pZCB3cml0ZVBsYWluVGV4dFRvRGF0YU9iamVjdChjb25zdCBTdHJp
bmcmLCBTbWFydFJlcGxhY2VPcHRpb24pOworCiAgICAgSFdORCBtX293bmVyOworICAgIENPTVB0
cjxJRGF0YU9iamVjdD4gbV9kYXRhT2JqZWN0OworICAgIENPTVB0cjxXQ0RhdGFPYmplY3Q+IG1f
d3JpdGFibGVEYXRhT2JqZWN0OworICAgIERyYWdEYXRhTWFwIG1fZHJhZ0RhdGFNYXA7CiAjZW5k
aWYKIAogI2lmIFBMQVRGT1JNKFFUKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2lu
L0NsaXBib2FyZFdpbi5jcHANCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS93aW4vQ2xpcGJvYXJkV2luLmNwcAkocmV2aXNpb24gMTUwNDMzKQ0KKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4uY3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtMSw1
ICsxLDYgQEANCiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgWHVlcWluZyBIdWFuZyA8
aHVhbmd4dWVxaW5nQGJhaWR1LmNvbT4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpA
QCAtMjQsNzk1ICsyNSwzNiBAQA0KICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVk
ZSAiQ2xpcGJvYXJkV2luLmgiCisjaW5jbHVkZSAiQ2xpcGJvYXJkLmgiCiAKICNpbmNsdWRlICJD
YWNoZWRJbWFnZS5oIgotI2luY2x1ZGUgIkNsaXBib2FyZFV0aWxpdGllc1dpbi5oIgogI2luY2x1
ZGUgIkRvY3VtZW50LmgiCi0jaW5jbHVkZSAiRHJhZ0RhdGEuaCIKLSNpbmNsdWRlICJFZGl0b3Iu
aCIKLSNpbmNsdWRlICJFbGVtZW50LmgiCi0jaW5jbHVkZSAiRXZlbnRIYW5kbGVyLmgiCi0jaW5j
bHVkZSAiRmlsZUxpc3QuaCIKICNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIkZyYW1lTG9h
ZGVyLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0j
aW5jbHVkZSAiSFRNTFBhcnNlcklkaW9tcy5oIgotI2luY2x1ZGUgIkltYWdlLmgiCi0jaW5jbHVk
ZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgotI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCi0jaW5j
bHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlBhc3RlYm9hcmQuaCIKLSNpbmNsdWRlICJQbGF0Zm9y
bU1vdXNlRXZlbnQuaCIKLSNpbmNsdWRlICJSYW5nZS5oIgotI2luY2x1ZGUgIlJlbmRlckltYWdl
LmgiCi0jaW5jbHVkZSAiUmVzb3VyY2VSZXNwb25zZS5oIgotI2luY2x1ZGUgIlNoYXJlZEJ1ZmZl
ci5oIgotI2luY2x1ZGUgIldDRGF0YU9iamVjdC5oIgotI2luY2x1ZGUgIm1hcmt1cC5oIgotI2lu
Y2x1ZGUgPHNobHdhcGkuaD4KLSNpbmNsdWRlIDx3aW5pbmV0Lmg+Ci0jaW5jbHVkZSA8d3RmL1Jl
ZlB0ci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KLSNpbmNsdWRlIDx3dGYvdGV4
dC9XVEZTdHJpbmcuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CiAKLXVzaW5n
IG5hbWVzcGFjZSBzdGQ7Ci0KIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNl
IEhUTUxOYW1lczsKLQotLy8gV2UgcHJvdmlkZSB0aGUgSUUgY2xpcGJvYXJkIHR5cGVzIChVUkwg
YW5kIFRleHQpLCBhbmQgdGhlIGNsaXBib2FyZCB0eXBlcyBzcGVjaWZpZWQgaW4gdGhlIFdIQVRX
RyBXZWIgQXBwbGljYXRpb25zIDEuMCBkcmFmdAotLy8gc2VlIGh0dHA6Ly93d3cud2hhdHdnLm9y
Zy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvIFNlY3Rpb24gNi4zLjUuMwotCi1lbnVtIENs
aXBib2FyZERhdGFUeXBlIHsgQ2xpcGJvYXJkRGF0YVR5cGVOb25lLCBDbGlwYm9hcmREYXRhVHlw
ZVVSTCwgQ2xpcGJvYXJkRGF0YVR5cGVUZXh0LCBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MIH07
Ci0KLXN0YXRpYyBDbGlwYm9hcmREYXRhVHlwZSBjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKGNv
bnN0IFN0cmluZyYgdHlwZSkKK0RyYWdJbWFnZVJlZiBDbGlwYm9hcmQ6OmNyZWF0ZURyYWdJbWFn
ZShJbnRQb2ludCYgZHJhZ0xvY2F0aW9uKSBjb25zdAogewotICAgIFN0cmluZyBxVHlwZSA9IHR5
cGUuc3RyaXBXaGl0ZVNwYWNlKCkubG93ZXIoKTsKLQotICAgIC8vIHR3byBzcGVjaWFsIGNhc2Vz
IGZvciBJRSBjb21wYXRpYmlsaXR5Ci0gICAgaWYgKHFUeXBlID09ICJ0ZXh0IiB8fCBxVHlwZSA9
PSAidGV4dC9wbGFpbiIgfHwgcVR5cGUuc3RhcnRzV2l0aCgidGV4dC9wbGFpbjsiKSkKLSAgICAg
ICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVGV4dDsKLSAgICBpZiAocVR5cGUgPT0gInVybCIg
fHwgcVR5cGUgPT0gInRleHQvdXJpLWxpc3QiKQotICAgICAgICByZXR1cm4gQ2xpcGJvYXJkRGF0
YVR5cGVVUkw7Ci0gICAgaWYgKHFUeXBlID09ICJ0ZXh0L2h0bWwiKQotICAgICAgICByZXR1cm4g
Q2xpcGJvYXJkRGF0YVR5cGVUZXh0SFRNTDsKLQotICAgIHJldHVybiBDbGlwYm9hcmREYXRhVHlw
ZU5vbmU7Ci19Ci0KLSNpZiAhT1MoV0lOQ0UpCi1zdGF0aWMgaW5saW5lIHZvaWQgcGF0aFJlbW92
ZUJhZEZTQ2hhcmFjdGVycyhQV1NUUiBwc3osIHNpemVfdCBsZW5ndGgpCi17Ci0gICAgc2l6ZV90
IHdyaXRlVG8gPSAwOwotICAgIHNpemVfdCByZWFkRnJvbSA9IDA7Ci0gICAgd2hpbGUgKHJlYWRG
cm9tIDwgbGVuZ3RoKSB7Ci0gICAgICAgIFVJTlQgdHlwZSA9IFBhdGhHZXRDaGFyVHlwZShwc3pb
cmVhZEZyb21dKTsKLSAgICAgICAgaWYgKCFwc3pbcmVhZEZyb21dIHx8IHR5cGUgJiAoR0NUX0xG
TkNIQVIgfCBHQ1RfU0hPUlRDSEFSKSkKLSAgICAgICAgICAgIHBzelt3cml0ZVRvKytdID0gcHN6
W3JlYWRGcm9tXTsKLQotICAgICAgICByZWFkRnJvbSsrOwotICAgIH0KLSAgICBwc3pbd3JpdGVU
b10gPSAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBTdHJpbmcgZmlsZXN5c3RlbVBhdGhGcm9tVXJs
T3JUaXRsZShjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgY29uc3QgVUNo
YXIqIGV4dGVuc2lvbiwgYm9vbCBpc0xpbmspCi17Ci0jaWYgT1MoV0lOQ0UpCi0gICAgbm90SW1w
bGVtZW50ZWQoKTsKLSAgICByZXR1cm4gU3RyaW5nKCk7Ci0jZWxzZQotICAgIHN0YXRpYyBjb25z
dCBzaXplX3QgZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nTnVsbFRlcm1pbmF0b3IgPSBNQVhfUEFU
SCAtIDE7Ci0gICAgYm9vbCB1c2VkVVJMID0gZmFsc2U7Ci0gICAgV0NIQVIgZnNQYXRoQnVmZmVy
W01BWF9QQVRIXTsKLSAgICBmc1BhdGhCdWZmZXJbMF0gPSAwOwotICAgIGludCBleHRlbnNpb25M
ZW4gPSBleHRlbnNpb24gPyBsc3RybGVuKGV4dGVuc2lvbikgOiAwOwotICAgIGludCBmc1BhdGhN
YXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24gPSBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdOdWxs
VGVybWluYXRvciAtIGV4dGVuc2lvbkxlbjsKLQotICAgIGlmICghdGl0bGUuaXNFbXB0eSgpKSB7
Ci0gICAgICAgIHNpemVfdCBsZW4gPSBtaW48c2l6ZV90Pih0aXRsZS5sZW5ndGgoKSwgZnNQYXRo
TWF4TGVuZ3RoRXhjbHVkaW5nRXh0ZW5zaW9uKTsKLSAgICAgICAgQ29weU1lbW9yeShmc1BhdGhC
dWZmZXIsIHRpdGxlLmNoYXJhY3RlcnMoKSwgbGVuICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgICAg
IGZzUGF0aEJ1ZmZlcltsZW5dID0gMDsKLSAgICAgICAgcGF0aFJlbW92ZUJhZEZTQ2hhcmFjdGVy
cyhmc1BhdGhCdWZmZXIsIGxlbik7Ci0gICAgfQotCi0gICAgaWYgKCFsc3RybGVuKGZzUGF0aEJ1
ZmZlcikpIHsKLSAgICAgICAgS1VSTCBrdXJsKFBhcnNlZFVSTFN0cmluZywgdXJsKTsKLSAgICAg
ICAgdXNlZFVSTCA9IHRydWU7Ci0gICAgICAgIC8vIFRoZSBmaWxlbmFtZSBmb3IgYW55IGNvbnRl
bnQgYmFzZWQgZHJhZyBvciBmaWxlIHVybCBzaG91bGQgYmUgdGhlIGxhc3QgZWxlbWVudCBvZiAK
LSAgICAgICAgLy8gdGhlIHBhdGguICBJZiB3ZSBjYW4ndCBmaW5kIGl0LCBvciB3ZSdyZSBjb21p
bmcgdXAgd2l0aCB0aGUgbmFtZSBmb3IgYSBsaW5rCi0gICAgICAgIC8vIHdlIGp1c3QgdXNlIHRo
ZSBlbnRpcmUgdXJsLgotICAgICAgICBEV09SRCBsZW4gPSBmc1BhdGhNYXhMZW5ndGhFeGNsdWRp
bmdFeHRlbnNpb247Ci0gICAgICAgIFN0cmluZyBsYXN0Q29tcG9uZW50ID0ga3VybC5sYXN0UGF0
aENvbXBvbmVudCgpOwotICAgICAgICBpZiAoa3VybC5pc0xvY2FsRmlsZSgpIHx8ICghaXNMaW5r
ICYmICFsYXN0Q29tcG9uZW50LmlzRW1wdHkoKSkpIHsKLSAgICAgICAgICAgIGxlbiA9IG1pbjxE
V09SRD4oZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0ZW5zaW9uLCBsYXN0Q29tcG9uZW50Lmxl
bmd0aCgpKTsKLSAgICAgICAgICAgIENvcHlNZW1vcnkoZnNQYXRoQnVmZmVyLCBsYXN0Q29tcG9u
ZW50LmNoYXJhY3RlcnMoKSwgbGVuICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICBsZW4gPSBtaW48RFdPUkQ+KGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4
dGVuc2lvbiwgdXJsLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIENvcHlNZW1vcnkoZnNQYXRoQnVm
ZmVyLCB1cmwuY2hhcmFjdGVycygpLCBsZW4gKiBzaXplb2YoVUNoYXIpKTsKLSAgICAgICAgfQot
ICAgICAgICBmc1BhdGhCdWZmZXJbbGVuXSA9IDA7Ci0gICAgICAgIHBhdGhSZW1vdmVCYWRGU0No
YXJhY3RlcnMoZnNQYXRoQnVmZmVyLCBsZW4pOwotICAgIH0KLQotICAgIGlmICghZXh0ZW5zaW9u
KQotICAgICAgICByZXR1cm4gU3RyaW5nKHN0YXRpY19jYXN0PFVDaGFyKj4oZnNQYXRoQnVmZmVy
KSk7Ci0KLSAgICBpZiAoIWlzTGluayAmJiB1c2VkVVJMKSB7Ci0gICAgICAgIFBhdGhSZW5hbWVF
eHRlbnNpb24oZnNQYXRoQnVmZmVyLCBleHRlbnNpb24pOwotICAgICAgICByZXR1cm4gU3RyaW5n
KHN0YXRpY19jYXN0PFVDaGFyKj4oZnNQYXRoQnVmZmVyKSk7Ci0gICAgfQotCi0gICAgcmV0dXJu
IG1ha2VTdHJpbmcoc3RhdGljX2Nhc3Q8Y29uc3QgVUNoYXIqPihmc1BhdGhCdWZmZXIpLCBleHRl
bnNpb24pOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmls
ZUNvbnRlbnQoU2hhcmVkQnVmZmVyKiBkYXRhKQotewotICAgIEhHTE9CQUwgbWVtT2JqID0gR2xv
YmFsQWxsb2MoR1BUUiwgZGF0YS0+c2l6ZSgpKTsKLSAgICBpZiAoIW1lbU9iaikgCi0gICAgICAg
IHJldHVybiAwOwotCi0gICAgY2hhciogZmlsZUNvbnRlbnRzID0gKFBTVFIpR2xvYmFsTG9jayht
ZW1PYmopOwotCi0gICAgQ29weU1lbW9yeShmaWxlQ29udGVudHMsIGRhdGEtPmRhdGEoKSwgZGF0
YS0+c2l6ZSgpKTsKLSAgICAKLSAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKLSAgICAKLSAgICBy
ZXR1cm4gbWVtT2JqOwotfQotCi1zdGF0aWMgSEdMT0JBTCBjcmVhdGVHbG9iYWxIRHJvcENvbnRl
bnQoY29uc3QgS1VSTCYgdXJsLCBTdHJpbmcmIGZpbGVOYW1lLCBTaGFyZWRCdWZmZXIqIGRhdGEp
Ci17Ci0gICAgaWYgKGZpbGVOYW1lLmlzRW1wdHkoKSB8fCAhZGF0YSkKLSAgICAgICAgcmV0dXJu
IDA7Ci0KLSAgICBXQ0hBUiBmaWxlUGF0aFtNQVhfUEFUSF07Ci0KLSAgICBpZiAodXJsLmlzTG9j
YWxGaWxlKCkpIHsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGF0aCA9IGRlY29kZVVSTEVzY2FwZVNl
cXVlbmNlcyh1cmwucGF0aCgpKTsKLSAgICAgICAgLy8gd2luZG93cyBkb2VzIG5vdCBlbmpveSBh
IGxlYWRpbmcgc2xhc2ggb24gcGF0aHMKLSAgICAgICAgaWYgKGxvY2FsUGF0aFswXSA9PSAnLycp
Ci0gICAgICAgICAgICBsb2NhbFBhdGggPSBsb2NhbFBhdGguc3Vic3RyaW5nKDEpOwotICAgICAg
ICBMUENXU1RSIGxvY2FsUGF0aFN0ciA9IGxvY2FsUGF0aC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJt
aW5hdGlvbigpOwotICAgICAgICBpZiAod2NzbGVuKGxvY2FsUGF0aFN0cikgKyAxIDwgTUFYX1BB
VEgpCi0gICAgICAgICAgICB3Y3NjcHlfcyhmaWxlUGF0aCwgTUFYX1BBVEgsIGxvY2FsUGF0aFN0
cik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0j
aWYgT1MoV0lOQ0UpCi0gICAgICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgICAgIHJldHVybiAw
OwotI2Vsc2UKLSAgICAgICAgV0NIQVIgdGVtcFBhdGhbTUFYX1BBVEhdOwotICAgICAgICBXQ0hB
UiBleHRlbnNpb25bTUFYX1BBVEhdOwotICAgICAgICBpZiAoITo6R2V0VGVtcFBhdGgoV1RGX0FS
UkFZX0xFTkdUSCh0ZW1wUGF0aCksIHRlbXBQYXRoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwot
ICAgICAgICBpZiAoITo6UGF0aEFwcGVuZCh0ZW1wUGF0aCwgZmlsZU5hbWUuY2hhcmFjdGVyc1dp
dGhOdWxsVGVybWluYXRpb24oKSkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgTFBD
V1NUUiBmb3VuZEV4dGVuc2lvbiA9IDo6UGF0aEZpbmRFeHRlbnNpb24odGVtcFBhdGgpOwotICAg
ICAgICBpZiAoZm91bmRFeHRlbnNpb24pIHsKLSAgICAgICAgICAgIGlmICh3Y3NjcHlfcyhleHRl
bnNpb24sIE1BWF9QQVRILCBmb3VuZEV4dGVuc2lvbikpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IDA7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgKmV4dGVuc2lvbiA9IDA7Ci0gICAgICAg
IDo6UGF0aFJlbW92ZUV4dGVuc2lvbih0ZW1wUGF0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAx
OyBpIDwgMTAwMDA7IGkrKykgewotICAgICAgICAgICAgaWYgKHN3cHJpbnRmX3MoZmlsZVBhdGgs
IE1BWF9QQVRILCBURVhUKCIlcy0lZCVzIiksIHRlbXBQYXRoLCBpLCBleHRlbnNpb24pID09IC0x
KQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgaWYgKCE6OlBhdGhGaWxl
RXhpc3RzKGZpbGVQYXRoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAg
ICAgICBIQU5ETEUgdGVtcEZpbGVIYW5kbGUgPSBDcmVhdGVGaWxlKGZpbGVQYXRoLCBHRU5FUklD
X1JFQUQgfCBHRU5FUklDX1dSSVRFLCAwLCAwLCBDUkVBVEVfQUxXQVlTLCBGSUxFX0FUVFJJQlVU
RV9OT1JNQUwsIDApOwotICAgICAgICBpZiAodGVtcEZpbGVIYW5kbGUgPT0gSU5WQUxJRF9IQU5E
TEVfVkFMVUUpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAvLyBXcml0ZSB0aGUg
ZGF0YSB0byB0aGlzIHRlbXAgZmlsZS4KLSAgICAgICAgRFdPUkQgd3JpdHRlbjsKLSAgICAgICAg
Qk9PTCB0ZW1wV3JpdGVTdWNjZWVkZWQgPSBXcml0ZUZpbGUodGVtcEZpbGVIYW5kbGUsIGRhdGEt
PmRhdGEoKSwgZGF0YS0+c2l6ZSgpLCAmd3JpdHRlbiwgMCk7Ci0gICAgICAgIENsb3NlSGFuZGxl
KHRlbXBGaWxlSGFuZGxlKTsKLSAgICAgICAgaWYgKCF0ZW1wV3JpdGVTdWNjZWVkZWQpCi0gICAg
ICAgICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIH0KLQotICAgIFNJWkVfVCBkcm9wRmlsZXNT
aXplID0gc2l6ZW9mKERST1BGSUxFUykgKyAoc2l6ZW9mKFdDSEFSKSAqICh3Y3NsZW4oZmlsZVBh
dGgpICsgMikpOwotICAgIEhHTE9CQUwgbWVtT2JqID0gR2xvYmFsQWxsb2MoR0hORCB8IEdNRU1f
U0hBUkUsIGRyb3BGaWxlc1NpemUpOwotICAgIGlmICghbWVtT2JqKSAKLSAgICAgICAgcmV0dXJu
IDA7Ci0KLSAgICBEUk9QRklMRVMqIGRyb3BGaWxlcyA9IChEUk9QRklMRVMqKSBHbG9iYWxMb2Nr
KG1lbU9iaik7Ci0gICAgZHJvcEZpbGVzLT5wRmlsZXMgPSBzaXplb2YoRFJPUEZJTEVTKTsKLSAg
ICBkcm9wRmlsZXMtPmZXaWRlID0gVFJVRTsKLSAgICB3Y3NjcHkoKExQV1NUUikoZHJvcEZpbGVz
ICsgMSksIGZpbGVQYXRoKTsgICAgCi0gICAgR2xvYmFsVW5sb2NrKG1lbU9iaik7Ci0gICAgCi0g
ICAgcmV0dXJuIG1lbU9iajsKLX0KLQotc3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSW1hZ2VG
aWxlRGVzY3JpcHRvcihjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ2Fj
aGVkSW1hZ2UqIGltYWdlKQotewotICAgIEFTU0VSVF9BUkcoaW1hZ2UsIGltYWdlKTsKLSAgICBB
U1NFUlQoaW1hZ2UtPmltYWdlKCktPmRhdGEoKSk7Ci0KLSAgICBIUkVTVUxUIGhyID0gU19PSzsK
LSAgICBIR0xPQkFMIG1lbU9iaiA9IDA7Ci0gICAgU3RyaW5nIGZzUGF0aDsKLSAgICBtZW1PYmog
PSBHbG9iYWxBbGxvYyhHUFRSLCBzaXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOwotICAgIGlm
ICghbWVtT2JqKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIEZJTEVHUk9VUERFU0NSSVBUT1Iq
IGZnZCA9IChGSUxFR1JPVVBERVNDUklQVE9SKilHbG9iYWxMb2NrKG1lbU9iaik7Ci0gICAgbWVt
c2V0KGZnZCwgMCwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKLSAgICBmZ2QtPmNJdGVt
cyA9IDE7Ci0gICAgZmdkLT5mZ2RbMF0uZHdGbGFncyA9IEZEX0ZJTEVTSVpFOwotICAgIGZnZC0+
ZmdkWzBdLm5GaWxlU2l6ZUxvdyA9IGltYWdlLT5pbWFnZSgpLT5kYXRhKCktPnNpemUoKTsKLSAg
ICAKLSAgICBjb25zdCBTdHJpbmcmIHByZWZlcnJlZFRpdGxlID0gdGl0bGUuaXNFbXB0eSgpID8g
aW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5hbWUoKSA6IHRpdGxlOwotICAgIFN0cmlu
ZyBleHRlbnNpb24gPSBpbWFnZS0+aW1hZ2UoKS0+ZmlsZW5hbWVFeHRlbnNpb24oKTsKLSAgICBp
ZiAoZXh0ZW5zaW9uLmlzRW1wdHkoKSkgewotICAgICAgICAvLyBEbyBub3QgY29udGludWUgcHJv
Y2Vzc2luZyBpbiB0aGUgcmFyZSBhbmQgdW51c3VhbCBjYXNlIHdoZXJlIGEgZGVjb2RlZCBpbWFn
ZSBpcyBub3QgYWJsZSAKLSAgICAgICAgLy8gdG8gcHJvdmlkZSBhIGZpbGVuYW1lIGV4dGVuc2lv
bi4gU29tZXRoaW5nIHRyaWNreSAobGlrZSBhIGJhaXQtbi1zd2l0Y2gpIGlzIGdvaW5nIG9uCi0g
ICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBleHRlbnNpb24uaW5zZXJ0KCIuIiwgMCk7Ci0g
ICAgZnNQYXRoID0gZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JUaXRsZSh1cmwsIHByZWZlcnJlZFRp
dGxlLCBleHRlbnNpb24uY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgZmFsc2UpOwot
Ci0gICAgaWYgKGZzUGF0aC5sZW5ndGgoKSA8PSAwKSB7Ci0gICAgICAgIEdsb2JhbFVubG9jayht
ZW1PYmopOwotICAgICAgICBHbG9iYWxGcmVlKG1lbU9iaik7Ci0gICAgICAgIHJldHVybiAwOwot
ICAgIH0KLQotICAgIGludCBtYXhTaXplID0gbWluKGZzUGF0aC5sZW5ndGgoKSwgV1RGX0FSUkFZ
X0xFTkdUSChmZ2QtPmZnZFswXS5jRmlsZU5hbWUpKTsKLSAgICBDb3B5TWVtb3J5KGZnZC0+Zmdk
WzBdLmNGaWxlTmFtZSwgKExQQ1dTVFIpZnNQYXRoLmNoYXJhY3RlcnMoKSwgbWF4U2l6ZSAqIHNp
emVvZihVQ2hhcikpOwotICAgIEdsb2JhbFVubG9jayhtZW1PYmopOwotICAgIAotICAgIHJldHVy
biBtZW1PYmo7Ci19Ci0KLQotLy8gd3JpdGVGaWxlVG9EYXRhT2JqZWN0IHRha2VzIG93bmVyc2hp
cCBvZiBmaWxlRGVzY3JpcHRvciBhbmQgZmlsZUNvbnRlbnQKLXN0YXRpYyBIUkVTVUxUIHdyaXRl
RmlsZVRvRGF0YU9iamVjdChJRGF0YU9iamVjdCogZGF0YU9iamVjdCwgSEdMT0JBTCBmaWxlRGVz
Y3JpcHRvciwgSEdMT0JBTCBmaWxlQ29udGVudCwgSEdMT0JBTCBoRHJvcENvbnRlbnQpCi17Ci0g
ICAgSFJFU1VMVCBociA9IFNfT0s7Ci0gICAgRk9STUFURVRDKiBmZTsKLSAgICBTVEdNRURJVU0g
bWVkaXVtID0gezB9OwotICAgIG1lZGl1bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7Ci0KLSAgICBp
ZiAoIWZpbGVEZXNjcmlwdG9yIHx8ICFmaWxlQ29udGVudCkKLSAgICAgICAgZ290byBleGl0Owot
Ci0gICAgLy8gRGVzY3JpcHRvcgotICAgIGZlID0gZmlsZURlc2NyaXB0b3JGb3JtYXQoKTsKLQot
ICAgIG1lZGl1bS5oR2xvYmFsID0gZmlsZURlc2NyaXB0b3I7Ci0KLSAgICBpZiAoRkFJTEVEKGhy
ID0gZGF0YU9iamVjdC0+U2V0RGF0YShmZSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICBnb3Rv
IGV4aXQ7Ci0KLSAgICAvLyBDb250ZW50cwotICAgIGZlID0gZmlsZUNvbnRlbnRGb3JtYXRaZXJv
KCk7Ci0gICAgbWVkaXVtLmhHbG9iYWwgPSBmaWxlQ29udGVudDsKLSAgICBpZiAoRkFJTEVEKGhy
ID0gZGF0YU9iamVjdC0+U2V0RGF0YShmZSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICBnb3Rv
IGV4aXQ7Ci0KLSNpZiBVU0UoQ0YpCi0gICAgLy8gSERST1AKLSAgICBpZiAoaERyb3BDb250ZW50
KSB7Ci0gICAgICAgIG1lZGl1bS5oR2xvYmFsID0gaERyb3BDb250ZW50OwotICAgICAgICBociA9
IGRhdGFPYmplY3QtPlNldERhdGEoY2ZIRHJvcEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKTsKLSAg
ICB9Ci0jZW5kaWYKLQotZXhpdDoKLSAgICBpZiAoRkFJTEVEKGhyKSkgewotICAgICAgICBpZiAo
ZmlsZURlc2NyaXB0b3IpCi0gICAgICAgICAgICBHbG9iYWxGcmVlKGZpbGVEZXNjcmlwdG9yKTsK
LSAgICAgICAgaWYgKGZpbGVDb250ZW50KQotICAgICAgICAgICAgR2xvYmFsRnJlZShmaWxlQ29u
dGVudCk7Ci0gICAgICAgIGlmIChoRHJvcENvbnRlbnQpCi0gICAgICAgICAgICBHbG9iYWxGcmVl
KGhEcm9wQ29udGVudCk7Ci0gICAgfQotICAgIHJldHVybiBocjsKLX0KLQotUGFzc1JlZlB0cjxD
bGlwYm9hcmQ+IENsaXBib2FyZDo6Y3JlYXRlKENsaXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ks
IERyYWdEYXRhKiBkcmFnRGF0YSwgRnJhbWUqIGZyYW1lKQotewotICAgIGlmIChkcmFnRGF0YS0+
cGxhdGZvcm1EYXRhKCkpCi0gICAgICAgIHJldHVybiBDbGlwYm9hcmRXaW46OmNyZWF0ZShEcmFn
QW5kRHJvcCwgZHJhZ0RhdGEtPnBsYXRmb3JtRGF0YSgpLCBwb2xpY3ksIGZyYW1lKTsKLSAgICBy
ZXR1cm4gQ2xpcGJvYXJkV2luOjpjcmVhdGUoRHJhZ0FuZERyb3AsIGRyYWdEYXRhLT5kcmFnRGF0
YU1hcCgpLCBwb2xpY3ksIGZyYW1lKTsKLX0KLQotQ2xpcGJvYXJkV2luOjpDbGlwYm9hcmRXaW4o
Q2xpcGJvYXJkVHlwZSBjbGlwYm9hcmRUeXBlLCBJRGF0YU9iamVjdCogZGF0YU9iamVjdCwgQ2xp
cGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwgRnJhbWUqIGZyYW1lKQotICAgIDogQ2xpcGJvYXJk
KHBvbGljeSwgY2xpcGJvYXJkVHlwZSkKLSAgICAsIG1fZGF0YU9iamVjdChkYXRhT2JqZWN0KQot
ICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoMCkKLSAgICAsIG1fZnJhbWUoZnJhbWUpCi17Ci19
Ci0KLUNsaXBib2FyZFdpbjo6Q2xpcGJvYXJkV2luKENsaXBib2FyZFR5cGUgY2xpcGJvYXJkVHlw
ZSwgV0NEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5
LCBGcmFtZSogZnJhbWUpCi0gICAgOiBDbGlwYm9hcmQocG9saWN5LCBjbGlwYm9hcmRUeXBlKQot
ICAgICwgbV9kYXRhT2JqZWN0KGRhdGFPYmplY3QpCi0gICAgLCBtX3dyaXRhYmxlRGF0YU9iamVj
dChkYXRhT2JqZWN0KQotICAgICwgbV9mcmFtZShmcmFtZSkKLXsKLX0KLQotQ2xpcGJvYXJkV2lu
OjpDbGlwYm9hcmRXaW4oQ2xpcGJvYXJkVHlwZSBjbGlwYm9hcmRUeXBlLCBjb25zdCBEcmFnRGF0
YU1hcCYgZGF0YU1hcCwgQ2xpcGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwgRnJhbWUqIGZyYW1l
KQotICAgIDogQ2xpcGJvYXJkKHBvbGljeSwgY2xpcGJvYXJkVHlwZSkKLSAgICAsIG1fZGF0YU9i
amVjdCgwKQotICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoMCkKLSAgICAsIG1fZnJhbWUoZnJh
bWUpCi0gICAgLCBtX2RyYWdEYXRhTWFwKGRhdGFNYXApCi17Ci19Ci0KLUNsaXBib2FyZFdpbjo6
fkNsaXBib2FyZFdpbigpCi17Ci0gICAgaWYgKG1fZHJhZ0ltYWdlKQotICAgICAgICBtX2RyYWdJ
bWFnZS0+cmVtb3ZlQ2xpZW50KHRoaXMpOwotfQotCi1zdGF0aWMgYm9vbCB3cml0ZVVSTChXQ0Rh
dGFPYmplY3QgKmRhdGEsIGNvbnN0IEtVUkwmIHVybCwgU3RyaW5nIHRpdGxlLCBib29sIHdpdGhQ
bGFpblRleHQsIGJvb2wgd2l0aEhUTUwpCi17Ci0gICAgQVNTRVJUKGRhdGEpOwotCi0gICAgaWYg
KHVybC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAodGl0
bGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHRpdGxlID0gdXJsLmxhc3RQYXRoQ29tcG9uZW50KCk7
Ci0gICAgICAgIGlmICh0aXRsZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICB0aXRsZSA9IHVybC5o
b3N0KCk7Ci0gICAgfQotCi0gICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAgICBtZWRpdW0u
dHltZWQgPSBUWU1FRF9IR0xPQkFMOwotCi0gICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9i
YWxEYXRhKHVybCwgdGl0bGUpOwotICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotICAgIGlmICht
ZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQoZGF0YS0+U2V0RGF0YSh1cmxXRm9ybWF0KCksICZtZWRp
dW0sIFRSVUUpKSkKLSAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKLSAgICBl
bHNlCi0gICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotCi0gICAgaWYgKHdpdGhIVE1MKSB7Ci0gICAg
ICAgIFZlY3RvcjxjaGFyPiBjZmh0bWxEYXRhOwotICAgICAgICBtYXJrdXBUb0NGSFRNTCh1cmxU
b01hcmt1cCh1cmwsIHRpdGxlKSwgIiIsIGNmaHRtbERhdGEpOwotICAgICAgICBtZWRpdW0uaEds
b2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoY2ZodG1sRGF0YSk7Ci0gICAgICAgIGlmIChtZWRpdW0u
aEdsb2JhbCAmJiBGQUlMRUQoZGF0YS0+U2V0RGF0YShodG1sRm9ybWF0KCksICZtZWRpdW0sIFRS
VUUpKSkKLSAgICAgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7Ci0gICAgICAg
IGVsc2UKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgIH0KLQotICAgIGlmICh3aXRo
UGxhaW5UZXh0KSB7Ci0gICAgICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YSh1
cmwuc3RyaW5nKCkpOwotICAgICAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKGRhdGEt
PlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAgICAg
ICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICBzdWNjZXNzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3VjY2VzczsKLX0KLQotdm9p
ZCBDbGlwYm9hcmRXaW46OmNsZWFyRGF0YShjb25zdCBTdHJpbmcmIHR5cGUpCi17Ci0gICAgLy8g
RklYTUU6IE5lZWQgdG8gYmUgYWJsZSB0byB3cml0ZSB0byB0aGUgc3lzdGVtIGNsaXBib2FyZCA8
cmRhcjovL3Byb2JsZW0vNTAxNTk0MT4KLSAgICBBU1NFUlQoaXNGb3JEcmFnQW5kRHJvcCgpKTsK
LSAgICBpZiAoIWNhbldyaXRlRGF0YSgpIHx8ICFtX3dyaXRhYmxlRGF0YU9iamVjdCkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgQ2xpcGJvYXJkRGF0YVR5cGUgZGF0YVR5cGUgPSBjbGlwYm9hcmRU
eXBlRnJvbU1JTUVUeXBlKHR5cGUpOwotCi0gICAgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERh
dGFUeXBlVVJMKSB7Ci0gICAgICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0LT5jbGVhckRhdGEodXJs
V0Zvcm1hdCgpLT5jZkZvcm1hdCk7Ci0gICAgICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0LT5jbGVh
ckRhdGEodXJsRm9ybWF0KCktPmNmRm9ybWF0KTsKLSAgICB9Ci0gICAgaWYgKGRhdGFUeXBlID09
IENsaXBib2FyZERhdGFUeXBlVGV4dCkgewotICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+
Y2xlYXJEYXRhKHBsYWluVGV4dEZvcm1hdCgpLT5jZkZvcm1hdCk7Ci0gICAgICAgIG1fd3JpdGFi
bGVEYXRhT2JqZWN0LT5jbGVhckRhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLT5jZkZvcm1hdCk7Ci0g
ICAgfQotCi19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjpjbGVhckRhdGEoKQotewotICAgIC8vIEZJ
WE1FOiBOZWVkIHRvIGJlIGFibGUgdG8gd3JpdGUgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQgPHJk
YXI6Ly9wcm9ibGVtLzUwMTU5NDE+Ci0gICAgQVNTRVJUKGlzRm9yRHJhZ0FuZERyb3AoKSk7Ci0g
ICAgaWYgKCFjYW5Xcml0ZURhdGEoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIG1fd3Jp
dGFibGVEYXRhT2JqZWN0ID0gMDsKLSAgICBXQ0RhdGFPYmplY3Q6OmNyZWF0ZUluc3RhbmNlKCZt
X3dyaXRhYmxlRGF0YU9iamVjdCk7Ci0gICAgbV9kYXRhT2JqZWN0ID0gbV93cml0YWJsZURhdGFP
YmplY3Q7Ci19Ci0KLVN0cmluZyBDbGlwYm9hcmRXaW46OmdldERhdGEoY29uc3QgU3RyaW5nJiB0
eXBlKSBjb25zdAoteyAgICAgCi0gICAgaWYgKCFjYW5SZWFkRGF0YSgpIHx8ICghbV9kYXRhT2Jq
ZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKSkKLSAgICAgICAgcmV0dXJuICIiOwotCi0g
ICAgQ2xpcGJvYXJkRGF0YVR5cGUgZGF0YVR5cGUgPSBjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBl
KHR5cGUpOwotICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRleHQpCi0gICAg
ICAgIHJldHVybiBtX2RhdGFPYmplY3QgPyBnZXRQbGFpblRleHQobV9kYXRhT2JqZWN0LmdldCgp
KSA6IGdldFBsYWluVGV4dCgmbV9kcmFnRGF0YU1hcCk7Ci0gICAgaWYgKGRhdGFUeXBlID09IENs
aXBib2FyZERhdGFUeXBlVVJMKQotICAgICAgICByZXR1cm4gbV9kYXRhT2JqZWN0ID8gZ2V0VVJM
KG1fZGF0YU9iamVjdC5nZXQoKSwgRHJhZ0RhdGE6OkRvTm90Q29udmVydEZpbGVuYW1lcykgOiBn
ZXRVUkwoJm1fZHJhZ0RhdGFNYXAsIERyYWdEYXRhOjpEb05vdENvbnZlcnRGaWxlbmFtZXMpOwot
ICAgIGVsc2UgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBlVGV4dEhUTUwpIHsKLSAg
ICAgICAgU3RyaW5nIGRhdGEgPSBtX2RhdGFPYmplY3QgPyBnZXRUZXh0SFRNTChtX2RhdGFPYmpl
Y3QuZ2V0KCkpIDogZ2V0VGV4dEhUTUwoJm1fZHJhZ0RhdGFNYXApOwotICAgICAgICBpZiAoIWRh
dGEuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgICAgIHJldHVybiBt
X2RhdGFPYmplY3QgPyBnZXRDRkhUTUwobV9kYXRhT2JqZWN0LmdldCgpKSA6IGdldENGSFRNTCgm
bV9kcmFnRGF0YU1hcCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAiIjsKLX0KLQotYm9vbCBD
bGlwYm9hcmRXaW46OnNldERhdGEoY29uc3QgU3RyaW5nJiB0eXBlLCBjb25zdCBTdHJpbmcmIGRh
dGEpCi17Ci0gICAgLy8gRklYTUU6IE5lZWQgdG8gYmUgYWJsZSB0byB3cml0ZSB0byB0aGUgc3lz
dGVtIGNsaXBib2FyZCA8cmRhcjovL3Byb2JsZW0vNTAxNTk0MT4KLSAgICBBU1NFUlQoaXNGb3JE
cmFnQW5kRHJvcCgpKTsKLSAgICBpZiAoIWNhbldyaXRlRGF0YSgpIHx8ICFtX3dyaXRhYmxlRGF0
YU9iamVjdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ2xpcGJvYXJkRGF0YVR5cGUg
d2luVHlwZSA9IGNsaXBib2FyZFR5cGVGcm9tTUlNRVR5cGUodHlwZSk7Ci0KLSAgICBpZiAod2lu
VHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVSTCkKLSAgICAgICAgcmV0dXJuIFdlYkNvcmU6Ondy
aXRlVVJMKG1fd3JpdGFibGVEYXRhT2JqZWN0LmdldCgpLCBLVVJMKFBhcnNlZFVSTFN0cmluZywg
ZGF0YSksIFN0cmluZygpLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICBpZiAod2luVHlwZSA9PSBDbGlw
Ym9hcmREYXRhVHlwZVRleHQpIHsKLSAgICAgICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAg
ICAgICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKLSAgICAgICAgbWVkaXVtLmhHbG9i
YWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEpOwotICAgICAgICBpZiAoIW1lZGl1bS5oR2xvYmFs
KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChGQUlMRUQobV93cml0
YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVF
KSkpIHsKLSAgICAgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7Ci0gICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
fQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCBhZGRNaW1lVHlwZXNGb3JG
b3JtYXQoTGlzdEhhc2hTZXQ8U3RyaW5nPiYgcmVzdWx0cywgY29uc3QgRk9STUFURVRDJiBmb3Jt
YXQpCi17Ci0gICAgLy8gVVJMIGFuZCBUZXh0IGFyZSBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0
eSB3aXRoIElFJ3MgbW9kZWwKLSAgICBpZiAoZm9ybWF0LmNmRm9ybWF0ID09IHVybEZvcm1hdCgp
LT5jZkZvcm1hdCB8fCBmb3JtYXQuY2ZGb3JtYXQgPT0gdXJsV0Zvcm1hdCgpLT5jZkZvcm1hdCkg
ewotICAgICAgICByZXN1bHRzLmFkZCgiVVJMIik7Ci0gICAgICAgIHJlc3VsdHMuYWRkKCJ0ZXh0
L3VyaS1saXN0Iik7Ci0gICAgfQotCi0gICAgaWYgKGZvcm1hdC5jZkZvcm1hdCA9PSBwbGFpblRl
eHRXRm9ybWF0KCktPmNmRm9ybWF0IHx8IGZvcm1hdC5jZkZvcm1hdCA9PSBwbGFpblRleHRGb3Jt
YXQoKS0+Y2ZGb3JtYXQpIHsKLSAgICAgICAgcmVzdWx0cy5hZGQoIlRleHQiKTsKLSAgICAgICAg
cmVzdWx0cy5hZGQoInRleHQvcGxhaW4iKTsKLSAgICB9Ci19Ci0KLS8vIGV4dGVuc2lvbnMgYmV5
b25kIElFJ3MgQVBJCi1MaXN0SGFzaFNldDxTdHJpbmc+IENsaXBib2FyZFdpbjo6dHlwZXMoKSBj
b25zdAoteyAKLSAgICBMaXN0SGFzaFNldDxTdHJpbmc+IHJlc3VsdHM7Ci0gICAgaWYgKCFjYW5S
ZWFkVHlwZXMoKSkKLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0KLSAgICBpZiAoIW1fZGF0YU9i
amVjdCAmJiBtX2RyYWdEYXRhTWFwLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7
Ci0KLSAgICBpZiAobV9kYXRhT2JqZWN0KSB7Ci0gICAgICAgIENPTVB0cjxJRW51bUZPUk1BVEVU
Qz4gaXRyOwotCi0gICAgICAgIGlmIChGQUlMRUQobV9kYXRhT2JqZWN0LT5FbnVtRm9ybWF0RXRj
KERBVEFESVJfR0VULCAmaXRyKSkpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKLQotICAg
ICAgICBpZiAoIWl0cikKLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwotCi0gICAgICAgIEZP
Uk1BVEVUQyBkYXRhOwotCi0gICAgICAgIC8vIElFbnVtRk9STUFURVRDOjpOZXh0IHJldHVybnMg
U19GQUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcy4KLSAgICAgICAgd2hpbGUgKGl0ci0+
TmV4dCgxLCAmZGF0YSwgMCkgPT0gU19PSykKLSAgICAgICAgICAgIGFkZE1pbWVUeXBlc0ZvckZv
cm1hdChyZXN1bHRzLCBkYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKERyYWdEYXRh
TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fZHJhZ0RhdGFNYXAuYmVnaW4oKTsgaXQgIT0gbV9k
cmFnRGF0YU1hcC5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgRk9STUFURVRDIGRhdGE7Ci0g
ICAgICAgICAgICBkYXRhLmNmRm9ybWF0ID0gKCppdCkua2V5OwotICAgICAgICAgICAgYWRkTWlt
ZVR5cGVzRm9yRm9ybWF0KHJlc3VsdHMsIGRhdGEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAg
cmV0dXJuIHJlc3VsdHM7Ci19Ci0KLVBhc3NSZWZQdHI8RmlsZUxpc3Q+IENsaXBib2FyZFdpbjo6
ZmlsZXMoKSBjb25zdAotewotI2lmIFVTRShDRikKLSAgICBSZWZQdHI8RmlsZUxpc3Q+IGZpbGVz
ID0gRmlsZUxpc3Q6OmNyZWF0ZSgpOwotICAgIGlmICghY2FuUmVhZERhdGEoKSkKLSAgICAgICAg
cmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKLQotICAgIGlmICghbV9kYXRhT2JqZWN0ICYmIG1fZHJh
Z0RhdGFNYXAuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgpOwotCi0g
ICAgaWYgKG1fZGF0YU9iamVjdCkgewotICAgICAgICBTVEdNRURJVU0gbWVkaXVtOwotICAgICAg
ICBpZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+R2V0RGF0YShjZkhEcm9wRm9ybWF0KCksICZtZWRp
dW0pKSkKLSAgICAgICAgICAgIHJldHVybiBmaWxlcy5yZWxlYXNlKCk7Ci0KLSAgICAgICAgSERS
T1AgaGRyb3AgPSByZWludGVycHJldF9jYXN0PEhEUk9QPihHbG9iYWxMb2NrKG1lZGl1bS5oR2xv
YmFsKSk7Ci0gICAgICAgIGlmICghaGRyb3ApCi0gICAgICAgICAgICByZXR1cm4gZmlsZXMucmVs
ZWFzZSgpOwotCi0gICAgICAgIFdDSEFSIGZpbGVuYW1lW01BWF9QQVRIXTsKLSAgICAgICAgVUlO
VCBmaWxlQ291bnQgPSBEcmFnUXVlcnlGaWxlVyhoZHJvcCwgMHhGRkZGRkZGRiwgMCwgMCk7Ci0g
ICAgICAgIGZvciAoVUlOVCBpID0gMDsgaSA8IGZpbGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAg
ICBpZiAoIURyYWdRdWVyeUZpbGVXKGhkcm9wLCBpLCBmaWxlbmFtZSwgV1RGX0FSUkFZX0xFTkdU
SChmaWxlbmFtZSkpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgZmls
ZXMtPmFwcGVuZChGaWxlOjpjcmVhdGUocmVpbnRlcnByZXRfY2FzdDxVQ2hhcio+KGZpbGVuYW1l
KSwgRmlsZTo6QWxsQ29udGVudFR5cGVzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBHbG9iYWxV
bmxvY2sobWVkaXVtLmhHbG9iYWwpOwotICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZtZWRpdW0p
OwotICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgpOwotICAgIH0KLSAgICBpZiAoIW1fZHJh
Z0RhdGFNYXAuY29udGFpbnMoY2ZIRHJvcEZvcm1hdCgpLT5jZkZvcm1hdCkpCi0gICAgICAgIHJl
dHVybiBmaWxlcy5yZWxlYXNlKCk7Ci0gICAgVmVjdG9yPFN0cmluZz4gZmlsZXNWZWN0b3IgPSBt
X2RyYWdEYXRhTWFwLmdldChjZkhEcm9wRm9ybWF0KCktPmNmRm9ybWF0KTsKLSAgICBmb3IgKFZl
Y3RvcjxTdHJpbmc+OjppdGVyYXRvciBpdCA9IGZpbGVzVmVjdG9yLmJlZ2luKCk7IGl0ICE9IGZp
bGVzVmVjdG9yLmVuZCgpOyArK2l0KQotICAgICAgICBmaWxlcy0+YXBwZW5kKEZpbGU6OmNyZWF0
ZSgqaXQpKTsKLSAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgpOwotI2Vsc2UKLSAgICBub3RJbXBs
ZW1lbnRlZCgpOwotICAgIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLXZvaWQgQ2xpcGJvYXJkV2lu
OjpzZXREcmFnSW1hZ2UoQ2FjaGVkSW1hZ2UqIGltYWdlLCBOb2RlICpub2RlLCBjb25zdCBJbnRQ
b2ludCAmbG9jKQotewotICAgIGlmICghY2FuU2V0RHJhZ0ltYWdlKCkpCi0gICAgICAgIHJldHVy
bjsKLSAgICAgICAgCi0gICAgaWYgKG1fZHJhZ0ltYWdlKQotICAgICAgICBtX2RyYWdJbWFnZS0+
cmVtb3ZlQ2xpZW50KHRoaXMpOwotICAgIG1fZHJhZ0ltYWdlID0gaW1hZ2U7Ci0gICAgaWYgKG1f
ZHJhZ0ltYWdlKQotICAgICAgICBtX2RyYWdJbWFnZS0+YWRkQ2xpZW50KHRoaXMpOwotCi0gICAg
bV9kcmFnTG9jID0gbG9jOwotICAgIG1fZHJhZ0ltYWdlRWxlbWVudCA9IG5vZGU7Ci19Ci0KLXZv
aWQgQ2xpcGJvYXJkV2luOjpzZXREcmFnSW1hZ2UoQ2FjaGVkSW1hZ2UqIGltZywgY29uc3QgSW50
UG9pbnQgJmxvYykKLXsKLSAgICBzZXREcmFnSW1hZ2UoaW1nLCAwLCBsb2MpOwotfQotCi12b2lk
IENsaXBib2FyZFdpbjo6c2V0RHJhZ0ltYWdlRWxlbWVudChOb2RlICpub2RlLCBjb25zdCBJbnRQ
b2ludCAmbG9jKQotewotICAgIHNldERyYWdJbWFnZSgwLCBub2RlLCBsb2MpOwotfQotCi1EcmFn
SW1hZ2VSZWYgQ2xpcGJvYXJkV2luOjpjcmVhdGVEcmFnSW1hZ2UoSW50UG9pbnQmIGxvYykgY29u
c3QKLXsKICAgICBIQklUTUFQIHJlc3VsdCA9IDA7CiAgICAgaWYgKG1fZHJhZ0ltYWdlKSB7CiAj
aWYgVVNFKENBSVJPKSB8fCBVU0UoQ0cpCiAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZURyYWdJbWFn
ZUZyb21JbWFnZShtX2RyYWdJbWFnZS0+aW1hZ2UoKSk7ICAgICAgICAKLSAgICAgICAgbG9jID0g
bV9kcmFnTG9jOworICAgICAgICBkcmFnTG9jYXRpb24gPSBtX2RyYWdMb2M7CiAjZWxzZQogICAg
ICAgICBub3RJbXBsZW1lbnRlZCgpOwogI2VuZGlmCiAgICAgfSBlbHNlIGlmIChtX2RyYWdJbWFn
ZUVsZW1lbnQpIHsKICAgICAgICAgTm9kZSogbm9kZSA9IG1fZHJhZ0ltYWdlRWxlbWVudC5nZXQo
KTsKICAgICAgICAgcmVzdWx0ID0gbm9kZS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKS0+bm9kZUltYWdl
KG5vZGUpOwotICAgICAgICBsb2MgPSBtX2RyYWdMb2M7CisgICAgICAgIGRyYWdMb2NhdGlvbiA9
IG1fZHJhZ0xvYzsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIENhY2hl
ZEltYWdlKiBnZXRDYWNoZWRJbWFnZShFbGVtZW50KiBlbGVtZW50KQordm9pZCBDbGlwYm9hcmQ6
OmRlY2xhcmVBbmRXcml0ZURyYWdJbWFnZShFbGVtZW50KiBlbGVtZW50LCBjb25zdCBLVVJMJiB1
cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUsIEZyYW1lKiBmcmFtZSkKIHsKLSAgICAvLyBBdHRlbXB0
IHRvIHB1bGwgQ2FjaGVkSW1hZ2UgZnJvbSBlbGVtZW50Ci0gICAgQVNTRVJUKGVsZW1lbnQpOwot
ICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBlbGVtZW50LT5yZW5kZXJlcigpOwotICAgIGlm
ICghcmVuZGVyZXIgfHwgIXJlbmRlcmVyLT5pc0ltYWdlKCkpIAotICAgICAgICByZXR1cm4gMDsK
LSAgICAKLSAgICBSZW5kZXJJbWFnZSogaW1hZ2UgPSB0b1JlbmRlckltYWdlKHJlbmRlcmVyKTsK
LSAgICBpZiAoaW1hZ2UtPmNhY2hlZEltYWdlKCkgJiYgIWltYWdlLT5jYWNoZWRJbWFnZSgpLT5l
cnJvck9jY3VycmVkKCkpCi0gICAgICAgIHJldHVybiBpbWFnZS0+Y2FjaGVkSW1hZ2UoKTsKLQot
ICAgIHJldHVybiAwOworICAgIG1fcGFzdGVib2FyZC0+ZGVjbGFyZUFuZFdyaXRlRHJhZ0ltYWdl
KGVsZW1lbnQsIHVybCwgdGl0bGUsIGZyYW1lKTsKIH0KIAotc3RhdGljIHZvaWQgd3JpdGVJbWFn
ZVRvRGF0YU9iamVjdChJRGF0YU9iamVjdCogZGF0YU9iamVjdCwgRWxlbWVudCogZWxlbWVudCwg
Y29uc3QgS1VSTCYgdXJsKQotewotICAgIC8vIFNob3ZlIGltYWdlIGRhdGEgaW50byBhIERhdGFP
YmplY3QgZm9yIHVzZSBhcyBhIGZpbGUKLSAgICBDYWNoZWRJbWFnZSogY2FjaGVkSW1hZ2UgPSBn
ZXRDYWNoZWRJbWFnZShlbGVtZW50KTsKLSAgICBpZiAoIWNhY2hlZEltYWdlIHx8ICFjYWNoZWRJ
bWFnZS0+aW1hZ2VGb3JSZW5kZXJlcihlbGVtZW50LT5yZW5kZXJlcigpKSB8fCAhY2FjaGVkSW1h
Z2UtPmlzTG9hZGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFNoYXJlZEJ1ZmZlciogaW1h
Z2VCdWZmZXIgPSBjYWNoZWRJbWFnZS0+aW1hZ2VGb3JSZW5kZXJlcihlbGVtZW50LT5yZW5kZXJl
cigpKS0+ZGF0YSgpOwotICAgIGlmICghaW1hZ2VCdWZmZXIgfHwgIWltYWdlQnVmZmVyLT5zaXpl
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIEhHTE9CQUwgaW1hZ2VGaWxlRGVzY3JpcHRvciA9
IGNyZWF0ZUdsb2JhbEltYWdlRmlsZURlc2NyaXB0b3IodXJsLnN0cmluZygpLCBlbGVtZW50LT5n
ZXRBdHRyaWJ1dGUoYWx0QXR0ciksIGNhY2hlZEltYWdlKTsKLSAgICBpZiAoIWltYWdlRmlsZURl
c2NyaXB0b3IpCi0gICAgICAgIHJldHVybjsKLQotICAgIEhHTE9CQUwgaW1hZ2VGaWxlQ29udGVu
dCA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoaW1hZ2VCdWZmZXIpOwotICAgIGlmICgh
aW1hZ2VGaWxlQ29udGVudCkgewotICAgICAgICBHbG9iYWxGcmVlKGltYWdlRmlsZURlc2NyaXB0
b3IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgU3RyaW5nIGZpbGVOYW1lID0gY2Fj
aGVkSW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5hbWUoKTsKLSAgICBIR0xPQkFMIGhE
cm9wQ29udGVudCA9IGNyZWF0ZUdsb2JhbEhEcm9wQ29udGVudCh1cmwsIGZpbGVOYW1lLCBpbWFn
ZUJ1ZmZlcik7Ci0gICAgaWYgKCFoRHJvcENvbnRlbnQpIHsKLSAgICAgICAgR2xvYmFsRnJlZSho
RHJvcENvbnRlbnQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd3JpdGVGaWxlVG9E
YXRhT2JqZWN0KGRhdGFPYmplY3QsIGltYWdlRmlsZURlc2NyaXB0b3IsIGltYWdlRmlsZUNvbnRl
bnQsIGhEcm9wQ29udGVudCk7Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjpkZWNsYXJlQW5kV3Jp
dGVEcmFnSW1hZ2UoRWxlbWVudCogZWxlbWVudCwgY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJp
bmcmIHRpdGxlLCBGcmFtZSogZnJhbWUpCi17Ci0gICAgLy8gT3JkZXIgaXMgaW1wb3J0YW50IGhl
cmUgZm9yIEV4cGxvcmVyJ3Mgc2FrZQotICAgIGlmICghbV93cml0YWJsZURhdGFPYmplY3QpCi0g
ICAgICAgICByZXR1cm47Ci0gICAgV2ViQ29yZTo6d3JpdGVVUkwobV93cml0YWJsZURhdGFPYmpl
Y3QuZ2V0KCksIHVybCwgdGl0bGUsIHRydWUsIGZhbHNlKTsKLQotICAgIHdyaXRlSW1hZ2VUb0Rh
dGFPYmplY3QobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIGVsZW1lbnQsIHVybCk7Ci0KLSAg
ICBBdG9taWNTdHJpbmcgaW1hZ2VVUkwgPSBlbGVtZW50LT5nZXRBdHRyaWJ1dGUoc3JjQXR0cik7
Ci0gICAgaWYgKGltYWdlVVJMLmlzRW1wdHkoKSkgCi0gICAgICAgIHJldHVybjsKLQotICAgIEtV
UkwgZnVsbFVSTCA9IGZyYW1lLT5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTChzdHJpcExlYWRpbmdB
bmRUcmFpbGluZ0hUTUxTcGFjZXMoaW1hZ2VVUkwpKTsKLSAgICBpZiAoZnVsbFVSTC5pc0VtcHR5
KCkpIAotICAgICAgICByZXR1cm47Ci0gICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAgICBt
ZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOwotCi0gICAgLy8gUHV0IGltZyB0YWcgb24gdGhl
IGNsaXBib2FyZCByZWZlcmVuY2luZyB0aGUgaW1hZ2UKLSAgICBWZWN0b3I8Y2hhcj4gZGF0YTsK
LSAgICBtYXJrdXBUb0NGSFRNTChjcmVhdGVNYXJrdXAoZWxlbWVudCwgSW5jbHVkZU5vZGUsIDAs
IFJlc29sdmVBbGxVUkxzKSwgIiIsIGRhdGEpOwotICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRl
R2xvYmFsRGF0YShkYXRhKTsKLSAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKG1fd3Jp
dGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKGh0bWxGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQot
ICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOwotfQotCi12b2lkIENsaXBib2Fy
ZFdpbjo6d3JpdGVVUkwoY29uc3QgS1VSTCYga3VybCwgY29uc3QgU3RyaW5nJiB0aXRsZVN0ciwg
RnJhbWUqKQotewotICAgIGlmICghbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgICByZXR1
cm47Ci0gICAgV2ViQ29yZTo6d3JpdGVVUkwobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIGt1
cmwsIHRpdGxlU3RyLCB0cnVlLCB0cnVlKTsKLQotICAgIFN0cmluZyB1cmwgPSBrdXJsLnN0cmlu
ZygpOwotICAgIEFTU0VSVCh1cmwuY29udGFpbnNPbmx5QVNDSUkoKSk7IC8vIEtVUkw6OnN0cmlu
ZygpIGlzIFVSTCBlbmNvZGVkLgotCi0gICAgU3RyaW5nIGZzUGF0aCA9IGZpbGVzeXN0ZW1QYXRo
RnJvbVVybE9yVGl0bGUodXJsLCB0aXRsZVN0ciwgTCIuVVJMIiwgdHJ1ZSk7Ci0gICAgU3RyaW5n
IGNvbnRlbnRTdHJpbmcoIltJbnRlcm5ldFNob3J0Y3V0XVxyXG5VUkw9IiArIHVybCArICJcclxu
Iik7Ci0gICAgQ1N0cmluZyBjb250ZW50ID0gY29udGVudFN0cmluZy5sYXRpbjEoKTsKLQotICAg
IGlmIChmc1BhdGgubGVuZ3RoKCkgPD0gMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgSEdMT0JB
TCB1cmxGaWxlRGVzY3JpcHRvciA9IEdsb2JhbEFsbG9jKEdQVFIsIHNpemVvZihGSUxFR1JPVVBE
RVNDUklQVE9SKSk7Ci0gICAgaWYgKCF1cmxGaWxlRGVzY3JpcHRvcikKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgSEdMT0JBTCB1cmxGaWxlQ29udGVudCA9IEdsb2JhbEFsbG9jKEdQVFIsIGNvbnRl
bnQubGVuZ3RoKCkpOwotICAgIGlmICghdXJsRmlsZUNvbnRlbnQpIHsKLSAgICAgICAgR2xvYmFs
RnJlZSh1cmxGaWxlRGVzY3JpcHRvcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBG
SUxFR1JPVVBERVNDUklQVE9SKiBmZ2QgPSBzdGF0aWNfY2FzdDxGSUxFR1JPVVBERVNDUklQVE9S
Kj4oR2xvYmFsTG9jayh1cmxGaWxlRGVzY3JpcHRvcikpOwotICAgIFplcm9NZW1vcnkoZmdkLCBz
aXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOwotICAgIGZnZC0+Y0l0ZW1zID0gMTsKLSAgICBm
Z2QtPmZnZFswXS5kd0ZsYWdzID0gRkRfRklMRVNJWkU7Ci0gICAgZmdkLT5mZ2RbMF0ubkZpbGVT
aXplTG93ID0gY29udGVudC5sZW5ndGgoKTsKLQotICAgIHVuc2lnbmVkIG1heFNpemUgPSBtaW4o
ZnNQYXRoLmxlbmd0aCgpLCBXVEZfQVJSQVlfTEVOR1RIKGZnZC0+ZmdkWzBdLmNGaWxlTmFtZSkp
OwotICAgIENvcHlNZW1vcnkoZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lLCBmc1BhdGguY2hhcmFjdGVy
cygpLCBtYXhTaXplICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgR2xvYmFsVW5sb2NrKHVybEZpbGVE
ZXNjcmlwdG9yKTsKLQotICAgIGNoYXIqIGZpbGVDb250ZW50cyA9IHN0YXRpY19jYXN0PGNoYXIq
PihHbG9iYWxMb2NrKHVybEZpbGVDb250ZW50KSk7Ci0gICAgQ29weU1lbW9yeShmaWxlQ29udGVu
dHMsIGNvbnRlbnQuZGF0YSgpLCBjb250ZW50Lmxlbmd0aCgpKTsKLSAgICBHbG9iYWxVbmxvY2so
dXJsRmlsZUNvbnRlbnQpOwotCi0gICAgd3JpdGVGaWxlVG9EYXRhT2JqZWN0KG1fd3JpdGFibGVE
YXRhT2JqZWN0LmdldCgpLCB1cmxGaWxlRGVzY3JpcHRvciwgdXJsRmlsZUNvbnRlbnQsIDApOwot
fQotCi12b2lkIENsaXBib2FyZFdpbjo6d3JpdGVSYW5nZShSYW5nZSogc2VsZWN0ZWRSYW5nZSwg
RnJhbWUqIGZyYW1lKQotewotICAgIEFTU0VSVChzZWxlY3RlZFJhbmdlKTsKLSAgICBpZiAoIW1f
d3JpdGFibGVEYXRhT2JqZWN0KQotICAgICAgICAgcmV0dXJuOwotCi0gICAgU1RHTUVESVVNIG1l
ZGl1bSA9IHswfTsKLSAgICBtZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOwotCi0gICAgVmVj
dG9yPGNoYXI+IGRhdGE7Ci0gICAgbWFya3VwVG9DRkhUTUwoY3JlYXRlTWFya3VwKHNlbGVjdGVk
UmFuZ2UsIDAsIEFubm90YXRlRm9ySW50ZXJjaGFuZ2UpLAotICAgICAgICBzZWxlY3RlZFJhbmdl
LT5zdGFydENvbnRhaW5lcigpLT5kb2N1bWVudCgpLT51cmwoKS5zdHJpbmcoKSwgZGF0YSk7Ci0g
ICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEpOwotICAgIGlmIChtZWRp
dW0uaEdsb2JhbCAmJiBGQUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEoaHRtbEZv
cm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEds
b2JhbCk7Ci0KLSAgICBTdHJpbmcgc3RyID0gZnJhbWUtPmVkaXRvcigpLnNlbGVjdGVkVGV4dEZv
ckNsaXBib2FyZCgpOwotICAgIHJlcGxhY2VOZXdsaW5lc1dpdGhXaW5kb3dzU3R5bGVOZXdsaW5l
cyhzdHIpOwotICAgIHJlcGxhY2VOQlNQV2l0aFNwYWNlKHN0cik7Ci0gICAgbWVkaXVtLmhHbG9i
YWwgPSBjcmVhdGVHbG9iYWxEYXRhKHN0cik7Ci0gICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZB
SUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShwbGFpblRleHRXRm9ybWF0KCksICZt
ZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKLQot
ICAgIG1lZGl1bS5oR2xvYmFsID0gMDsKLSAgICBpZiAoZnJhbWUtPmVkaXRvcigpLmNhblNtYXJ0
Q29weU9yRGVsZXRlKCkpCi0gICAgICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKHNt
YXJ0UGFzdGVGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSk7Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2lu
Ojp3cml0ZVBsYWluVGV4dChjb25zdCBTdHJpbmcmIHRleHQpCi17Ci0gICAgaWYgKCFtX3dyaXRh
YmxlRGF0YU9iamVjdCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIFNUR01FRElVTSBtZWRp
dW0gPSB7MH07Ci0gICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKLSAgICAKLSAgICBT
dHJpbmcgc3RyID0gdGV4dDsKLSAgICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3
bGluZXMoc3RyKTsKLSAgICByZXBsYWNlTkJTUFdpdGhTcGFjZShzdHIpOwotICAgIG1lZGl1bS5o
R2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YShzdHIpOwotICAgIGlmIChtZWRpdW0uaEdsb2JhbCAm
JiBGQUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgp
LCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7
ICAgICAgICAKLQotICAgIG1lZGl1bS5oR2xvYmFsID0gMDsKLX0KLSAgICAKLWJvb2wgQ2xpcGJv
YXJkV2luOjpoYXNEYXRhKCkKLXsKLSAgICBpZiAoIW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRh
TWFwLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKG1fZGF0YU9i
amVjdCkgewotICAgICAgICBDT01QdHI8SUVudW1GT1JNQVRFVEM+IGl0cjsKLSAgICAgICAgaWYg
KEZBSUxFRChtX2RhdGFPYmplY3QtPkVudW1Gb3JtYXRFdGMoREFUQURJUl9HRVQsICZpdHIpKSkK
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoIWl0cikKLSAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBGT1JNQVRFVEMgZGF0YTsKLQotICAgICAgICAv
LyBJRW51bUZPUk1BVEVUQzo6TmV4dCByZXR1cm5zIFNfRkFMU0UgaWYgdGhlcmUgYXJlIG5vIG1v
cmUgaXRlbXMuCi0gICAgICAgIGlmIChpdHItPk5leHQoMSwgJmRhdGEsIDApID09IFNfT0spIHsK
LSAgICAgICAgICAgIC8vIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBpdGVtIGluIHRoZSBJRGF0YU9i
amVjdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiAhbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCk7Ci19
Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjpzZXRFeHRlcm5hbERhdGFPYmplY3QoSURhdGFPYmplY3Qg
KmRhdGFPYmplY3QpCi17Ci0gICAgQVNTRVJUKGlzRm9yRHJhZ0FuZERyb3AoKSk7Ci0KLSAgICBt
X3dyaXRhYmxlRGF0YU9iamVjdCA9IDA7Ci0gICAgbV9kYXRhT2JqZWN0ID0gZGF0YU9iamVjdDsK
LX0KLQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vd2luL0NsaXBib2FyZFdpbi5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vd2luL0NsaXBib2FyZFdpbi5oCShyZXZpc2lvbiAxNTA0MzMpDQorKysgU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5oCSh3b3JraW5nIGNvcHkpDQpAQCAtMSwx
MDEgKzAsMCBAQA0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
Ci0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0g
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqLwotCi0jaWZuZGVmIENsaXBib2FyZFdpbl9o
Ci0jZGVmaW5lIENsaXBib2FyZFdpbl9oCi0KLSNpbmNsdWRlICJDT01QdHIuaCIKLSNpbmNsdWRl
ICJDYWNoZWRJbWFnZUNsaWVudC5oIgotI2luY2x1ZGUgIkNsaXBib2FyZC5oIgotI2luY2x1ZGUg
IkRyYWdEYXRhLmgiCi0KLXN0cnVjdCBJRGF0YU9iamVjdDsKLQotbmFtZXNwYWNlIFdlYkNvcmUg
ewotCi1jbGFzcyBDYWNoZWRJbWFnZTsKLWNsYXNzIEZyYW1lOwotY2xhc3MgSW50UG9pbnQ7Ci1j
bGFzcyBXQ0RhdGFPYmplY3Q7Ci0KLS8vIFN0YXRlIGF2YWlsYWJsZSBkdXJpbmcgSUUncyBldmVu
dHMgZm9yIGRyYWcgYW5kIGRyb3AgYW5kIGNvcHkvcGFzdGUKLWNsYXNzIENsaXBib2FyZFdpbiA6
IHB1YmxpYyBDbGlwYm9hcmQsIHB1YmxpYyBDYWNoZWRJbWFnZUNsaWVudCB7Ci0gICAgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8Q2xpcGJv
YXJkV2luPiBjcmVhdGUoQ2xpcGJvYXJkVHlwZSBjbGlwYm9hcmRUeXBlLCBJRGF0YU9iamVjdCog
ZGF0YU9iamVjdCwgQ2xpcGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwgRnJhbWUqIGZyYW1lKQot
ICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBDbGlwYm9hcmRXaW4oY2xpcGJvYXJk
VHlwZSwgZGF0YU9iamVjdCwgcG9saWN5LCBmcmFtZSkpOwotICAgIH0KLSAgICBzdGF0aWMgUGFz
c1JlZlB0cjxDbGlwYm9hcmRXaW4+IGNyZWF0ZShDbGlwYm9hcmRUeXBlIGNsaXBib2FyZFR5cGUs
IFdDRGF0YU9iamVjdCogZGF0YU9iamVjdCwgQ2xpcGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwg
RnJhbWUqIGZyYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBDbGlwYm9h
cmRXaW4oY2xpcGJvYXJkVHlwZSwgZGF0YU9iamVjdCwgcG9saWN5LCBmcmFtZSkpOwotICAgIH0K
LSAgICBzdGF0aWMgUGFzc1JlZlB0cjxDbGlwYm9hcmRXaW4+IGNyZWF0ZShDbGlwYm9hcmRUeXBl
IGNsaXBib2FyZFR5cGUsIGNvbnN0IERyYWdEYXRhTWFwJiBkYXRhTWFwLCBDbGlwYm9hcmRBY2Nl
c3NQb2xpY3kgcG9saWN5LCBGcmFtZSogZnJhbWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRv
cHRSZWYobmV3IENsaXBib2FyZFdpbihjbGlwYm9hcmRUeXBlLCBkYXRhTWFwLCBwb2xpY3ksIGZy
YW1lKSk7Ci0gICAgfQotICAgIH5DbGlwYm9hcmRXaW4oKTsKLQotICAgIHZvaWQgY2xlYXJEYXRh
KGNvbnN0IFN0cmluZyYgdHlwZSk7Ci0gICAgdm9pZCBjbGVhckRhdGEoKTsKLSAgICBTdHJpbmcg
Z2V0RGF0YShjb25zdCBTdHJpbmcmIHR5cGUpIGNvbnN0OwotICAgIGJvb2wgc2V0RGF0YShjb25z
dCBTdHJpbmcmIHR5cGUsIGNvbnN0IFN0cmluZyYgZGF0YSk7Ci0KLSAgICAvLyBleHRlbnNpb25z
IGJleW9uZCBJRSdzIEFQSQotICAgIHZpcnR1YWwgTGlzdEhhc2hTZXQ8U3RyaW5nPiB0eXBlcygp
IGNvbnN0OwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxGaWxlTGlzdD4gZmlsZXMoKSBjb25zdDsK
LQotICAgIHZvaWQgc2V0RHJhZ0ltYWdlKENhY2hlZEltYWdlKiwgY29uc3QgSW50UG9pbnQmKTsK
LSAgICB2b2lkIHNldERyYWdJbWFnZUVsZW1lbnQoTm9kZSosIGNvbnN0IEludFBvaW50Jik7Ci0K
LSAgICB2aXJ0dWFsIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2UoSW50UG9pbnQmIGRyYWdM
b2MpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UoRWxl
bWVudCosIGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBGcmFtZSopOwotICAgIHZp
cnR1YWwgdm9pZCB3cml0ZVVSTChjb25zdCBLVVJMJiwgY29uc3QgU3RyaW5nJiwgRnJhbWUqKTsK
LSAgICB2aXJ0dWFsIHZvaWQgd3JpdGVSYW5nZShSYW5nZSosIEZyYW1lKik7Ci0gICAgdmlydHVh
bCB2b2lkIHdyaXRlUGxhaW5UZXh0KGNvbnN0IFN0cmluZyYpOwotCi0gICAgdmlydHVhbCBib29s
IGhhc0RhdGEoKTsKLQotICAgIENPTVB0cjxJRGF0YU9iamVjdD4gZGF0YU9iamVjdCgpIHsgcmV0
dXJuIG1fZGF0YU9iamVjdDsgfQotCi0gICAgdm9pZCBzZXRFeHRlcm5hbERhdGFPYmplY3QoSURh
dGFPYmplY3QgKmRhdGFPYmplY3QpOwotCi1wcml2YXRlOgotICAgIENsaXBib2FyZFdpbihDbGlw
Ym9hcmRUeXBlLCBJRGF0YU9iamVjdCosIENsaXBib2FyZEFjY2Vzc1BvbGljeSwgRnJhbWUqKTsK
LSAgICBDbGlwYm9hcmRXaW4oQ2xpcGJvYXJkVHlwZSwgV0NEYXRhT2JqZWN0KiwgQ2xpcGJvYXJk
QWNjZXNzUG9saWN5LCBGcmFtZSopOwotICAgIENsaXBib2FyZFdpbihDbGlwYm9hcmRUeXBlLCBj
b25zdCBEcmFnRGF0YU1hcCYsIENsaXBib2FyZEFjY2Vzc1BvbGljeSwgRnJhbWUqKTsKLQotICAg
IHZvaWQgcmVzZXRGcm9tQ2xpcGJvYXJkKCk7Ci0gICAgdm9pZCBzZXREcmFnSW1hZ2UoQ2FjaGVk
SW1hZ2UqLCBOb2RlKiwgY29uc3QgSW50UG9pbnQmKTsKLQotICAgIENPTVB0cjxJRGF0YU9iamVj
dD4gbV9kYXRhT2JqZWN0OwotICAgIENPTVB0cjxXQ0RhdGFPYmplY3Q+IG1fd3JpdGFibGVEYXRh
T2JqZWN0OwotICAgIERyYWdEYXRhTWFwIG1fZHJhZ0RhdGFNYXA7Ci0gICAgRnJhbWUqIG1fZnJh
bWU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCi0KLSNlbmRpZiAvLyBDbGlwYm9hcmRX
aW5faApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0VkaXRvcldpbi5jcHANCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0NCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vRWRpdG9yV2luLmNwcAko
cmV2aXNpb24gMTUwNDMzKQ0KKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9FZGl0b3JX
aW4uY3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtMjcsMTEgKzI3LDE5IEBADQogI2luY2x1ZGUgIkVk
aXRvci5oIgogI2luY2x1ZGUgIkVkaXRvckNsaWVudC5oIgogCisjaWYgIVVTRShMRUdBQ1lfU1RZ
TEVfQUJTVFJBQ1RfQ0xJUEJPQVJEX0NMQVNTKQorI2luY2x1ZGUgIkNPTVB0ci5oIgorI2luY2x1
ZGUgIkNsaXBib2FyZC5oIgorI2Vsc2UKICNpbmNsdWRlICJDbGlwYm9hcmRXaW4uaCIKKyNlbmRp
ZgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUg
IkZyYW1lLmgiCiAjaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKKyNpZiAhVVNFKExFR0FDWV9TVFlM
RV9BQlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCisjaW5jbHVkZSAiUGFzdGVib2FyZC5oIgorI2Vu
ZGlmCiAjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiVmlzaWJsZVVuaXRzLmgi
CiAKQEAgLTQ2LDggKzU0LDE0IEBADQogICAgIGlmICghU1VDQ0VFREVEKE9sZUdldENsaXBib2Fy
ZCgmY2xpcGJvYXJkRGF0YSkpKQogICAgICAgICBjbGlwYm9hcmREYXRhID0gMDsKICNlbmRpZgot
CisjaWYgVVNFKExFR0FDWV9TVFlMRV9BQlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCiAgICAgcmV0
dXJuIENsaXBib2FyZFdpbjo6Y3JlYXRlKENsaXBib2FyZDo6Q29weUFuZFBhc3RlLCBjbGlwYm9h
cmREYXRhLmdldCgpLCBwb2xpY3ksIGZyYW1lKTsKKyNlbHNlCisgICAgUmVmUHRyPENsaXBib2Fy
ZD4gY2xpcGJvYXJkID0gQ2xpcGJvYXJkOjpjcmVhdGVGb3JDb3B5QW5kUGFzdGUocG9saWN5KTsK
KyAgICBQYXN0ZWJvYXJkKiBwYXN0ZWJvYXJkID0gY29uc3RfY2FzdDxQYXN0ZWJvYXJkKj4oJmNs
aXBib2FyZC0+cGFzdGVib2FyZCgpKTsKKyAgICBwYXN0ZWJvYXJkLT5zZXRFeHRlcm5hbERhdGFP
YmplY3QoY2xpcGJvYXJkRGF0YS5nZXQoKSk7CisgICAgcmV0dXJuIGNsaXBib2FyZC5yZWxlYXNl
KCk7CisjZW5kaWYKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vd2luL1Bhc3RlYm9hcmRXaW4uY3BwDQo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL1Bhc3RlYm9hcmRXaW4uY3BwCShyZXZpc2lvbiAxNTA0
MzMpDQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL1Bhc3RlYm9hcmRXaW4uY3BwCSh3
b3JraW5nIGNvcHkpDQpAQCAtMSw1ICsxLDYgQEANCiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA2
LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTMgWHVlcWluZyBIdWFuZyA8aHVhbmd4dWVxaW5nQGJhaWR1LmNvbT4KICAqCiAgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMzQsNiArMzUsOCBAQA0KICNpbmNsdWRlICJFZGl0b3Iu
aCIKICNpbmNsdWRlICJFbGVtZW50LmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJI
VE1MTmFtZXMuaCIKKyNpbmNsdWRlICJIVE1MUGFyc2VySWRpb21zLmgiCiAjaW5jbHVkZSAiSFdu
ZERDLmgiCiAjaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgogI2luY2x1ZGUgIkltYWdlLmgiCkBA
IC00Miw2ICs0NSw3IEBADQogI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNsdWRlICJSYW5nZS5oIgog
I2luY2x1ZGUgIlJlbmRlckltYWdlLmgiCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCiAjaW5j
bHVkZSAiVGV4dEVuY29kaW5nLmgiCiAjaW5jbHVkZSAiV2ViQ29yZUluc3RhbmNlSGFuZGxlLmgi
CiAjaW5jbHVkZSAiV2luZG93c0V4dHJhcy5oIgpAQCAtNTAsNiArNTQsOSBAQA0KIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCisvLyBXZSBwcm92aWRlIHRoZSBJRSBjbGlwYm9hcmQgdHlwZXMgKFVS
TCBhbmQgVGV4dCksIGFuZCB0aGUgY2xpcGJvYXJkIHR5cGVzIHNwZWNpZmllZCBpbiB0aGUgV0hB
VFdHIFdlYiBBcHBsaWNhdGlvbnMgMS4wIGRyYWZ0CisvLyBzZWUgaHR0cDovL3d3dy53aGF0d2cu
b3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8gU2VjdGlvbiA2LjMuNS4zCisKIHN0YXRp
YyBVSU5UIEhUTUxDbGlwYm9hcmRGb3JtYXQgPSAwOwogc3RhdGljIFVJTlQgQm9va21hcmtDbGlw
Ym9hcmRGb3JtYXQgPSAwOwogc3RhdGljIFVJTlQgV2ViU21hcnRQYXN0ZUZvcm1hdCA9IDA7CkBA
IC04OSw4ICs5NiwzOSBAQA0KICAgICByZXR1cm4gcGFzdGVib2FyZDsKIH0KIAotUGFzdGVib2Fy
ZDo6UGFzdGVib2FyZCgpCitQYXNzT3duUHRyPFBhc3RlYm9hcmQ+IFBhc3RlYm9hcmQ6OmNyZWF0
ZUZvckNvcHlBbmRQYXN0ZSgpCiB7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBQYXN0ZWJvYXJk
KTsKK30KKworUGFzc093blB0cjxQYXN0ZWJvYXJkPiBQYXN0ZWJvYXJkOjpjcmVhdGVQcml2YXRl
KCkKK3sKKyAgICAvLyBXaW5kb3dzIGhhcyBub3QgIlByaXZhdGUgcGFzdGVib2FyZCIgY29uY2Vw
dC4KKyAgICByZXR1cm4gY3JlYXRlRm9yQ29weUFuZFBhc3RlKCk7Cit9CisKKyNpZiBFTkFCTEUo
RFJBR19TVVBQT1JUKQorLy8gc3RhdGljCitQYXNzT3duUHRyPFBhc3RlYm9hcmQ+IFBhc3RlYm9h
cmQ6OmNyZWF0ZUZvckRyYWdBbmREcm9wKCkKK3sKKyAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBk
YXRhT2JqZWN0OworICAgIFdDRGF0YU9iamVjdDo6Y3JlYXRlSW5zdGFuY2UoJmRhdGFPYmplY3Qp
OworICAgIHJldHVybiBhZG9wdFB0cihuZXcgUGFzdGVib2FyZChkYXRhT2JqZWN0LmdldCgpKSk7
Cit9CisKKy8vIHN0YXRpYworUGFzc093blB0cjxQYXN0ZWJvYXJkPiBQYXN0ZWJvYXJkOjpjcmVh
dGVGb3JEcmFnQW5kRHJvcChjb25zdCBEcmFnRGF0YSYgZHJhZ0RhdGEpCit7CisgICAgaWYgKGRy
YWdEYXRhLnBsYXRmb3JtRGF0YSgpKQorICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBhc3Rl
Ym9hcmQoZHJhZ0RhdGEucGxhdGZvcm1EYXRhKCkpKTsKKyAgICAvLyBXZSBjb3VsZCBub3QgY2Fs
bCBEcmFnRGF0YTo6ZHJhZ0RhdGFNYXAgdmlhIHxjb25zdCBEcmFnRGF0YSZ8LgorICAgIGNvbnN0
IERyYWdEYXRhTWFwJiBkcmFnRGF0YU1hcCA9IGNvbnN0X2Nhc3Q8RHJhZ0RhdGEqPigoJmRyYWdE
YXRhKSktPmRyYWdEYXRhTWFwKCk7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBQYXN0ZWJvYXJk
KGRyYWdEYXRhTWFwKSk7Cit9CisjZW5kaWYKKwordm9pZCBQYXN0ZWJvYXJkOjpjcmVhdGVQYXN0
ZWJvYXJkUHJpdmF0ZSgpCit7CiAgICAgV05EQ0xBU1Mgd2M7CiAgICAgbWVtc2V0KCZ3YywgMCwg
c2l6ZW9mKFdORENMQVNTKSk7CiAgICAgd2MubHBmblduZFByb2MgICAgPSBQYXN0ZWJvYXJkT3du
ZXJXbmRQcm9jOwpAQCAtMTA2LDYgKzE0NCwzNSBAQA0KICAgICBXZWJTbWFydFBhc3RlRm9ybWF0
ID0gOjpSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIldlYktpdCBTbWFydCBQYXN0ZSBGb3JtYXQi
KTsKIH0KIAorUGFzdGVib2FyZDo6UGFzdGVib2FyZCgpCisgICAgOiBtX2RhdGFPYmplY3QoMCkK
KyAgICAsIG1fd3JpdGFibGVEYXRhT2JqZWN0KDApCit7CisgICAgY3JlYXRlUGFzdGVib2FyZFBy
aXZhdGUoKTsKK30KKworUGFzdGVib2FyZDo6UGFzdGVib2FyZChJRGF0YU9iamVjdCogZGF0YU9i
amVjdCkKKyAgICA6IG1fZGF0YU9iamVjdChkYXRhT2JqZWN0KQorICAgICwgbV93cml0YWJsZURh
dGFPYmplY3QoMCkKK3sKKyAgICBjcmVhdGVQYXN0ZWJvYXJkUHJpdmF0ZSgpOworfQorCitQYXN0
ZWJvYXJkOjpQYXN0ZWJvYXJkKFdDRGF0YU9iamVjdCogZGF0YU9iamVjdCkKKyAgICA6IG1fZGF0
YU9iamVjdChkYXRhT2JqZWN0KQorICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoZGF0YU9iamVj
dCkKK3sKKyAgICBjcmVhdGVQYXN0ZWJvYXJkUHJpdmF0ZSgpOworfQorCitQYXN0ZWJvYXJkOjpQ
YXN0ZWJvYXJkKGNvbnN0IERyYWdEYXRhTWFwJiBkYXRhTWFwKQorICAgIDogbV9kYXRhT2JqZWN0
KDApCisgICAgLCBtX3dyaXRhYmxlRGF0YU9iamVjdCgwKQorICAgICwgbV9kcmFnRGF0YU1hcChk
YXRhTWFwKQoreworICAgIGNyZWF0ZVBhc3RlYm9hcmRQcml2YXRlKCk7Cit9CisKIHZvaWQgUGFz
dGVib2FyZDo6Y2xlYXIoKQogewogICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsK
QEAgLTExNCw2ICsxODEsMjcxIEBADQogICAgIH0KIH0KIAorZW51bSBDbGlwYm9hcmREYXRhVHlw
ZSB7IENsaXBib2FyZERhdGFUeXBlTm9uZSwgQ2xpcGJvYXJkRGF0YVR5cGVVUkwsIENsaXBib2Fy
ZERhdGFUeXBlVGV4dCwgQ2xpcGJvYXJkRGF0YVR5cGVUZXh0SFRNTCB9OworCitzdGF0aWMgQ2xp
cGJvYXJkRGF0YVR5cGUgY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZShjb25zdCBTdHJpbmcmIHR5
cGUpCit7CisgICAgU3RyaW5nIHFUeXBlID0gdHlwZS5zdHJpcFdoaXRlU3BhY2UoKS5sb3dlcigp
OworCisgICAgLy8gdHdvIHNwZWNpYWwgY2FzZXMgZm9yIElFIGNvbXBhdGliaWxpdHkKKyAgICBp
ZiAocVR5cGUgPT0gInRleHQiIHx8IHFUeXBlID09ICJ0ZXh0L3BsYWluIiB8fCBxVHlwZS5zdGFy
dHNXaXRoKCJ0ZXh0L3BsYWluOyIpKQorICAgICAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVU
ZXh0OworICAgIGlmIChxVHlwZSA9PSAidXJsIiB8fCBxVHlwZSA9PSAidGV4dC91cmktbGlzdCIp
CisgICAgICAgIHJldHVybiBDbGlwYm9hcmREYXRhVHlwZVVSTDsKKyAgICBpZiAocVR5cGUgPT0g
InRleHQvaHRtbCIpCisgICAgICAgIHJldHVybiBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MOwor
CisgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlTm9uZTsKK30KKwordm9pZCBQYXN0ZWJvYXJk
OjpjbGVhcihjb25zdCBTdHJpbmcmIHR5cGUpCit7CisgICAgaWYgKCFtX3dyaXRhYmxlRGF0YU9i
amVjdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgQ2xpcGJvYXJkRGF0YVR5cGUgZGF0YVR5cGUg
PSBjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKHR5cGUpOworCisgICAgaWYgKGRhdGFUeXBlID09
IENsaXBib2FyZERhdGFUeXBlVVJMKSB7CisgICAgICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0LT5j
bGVhckRhdGEodXJsV0Zvcm1hdCgpLT5jZkZvcm1hdCk7CisgICAgICAgIG1fd3JpdGFibGVEYXRh
T2JqZWN0LT5jbGVhckRhdGEodXJsRm9ybWF0KCktPmNmRm9ybWF0KTsKKyAgICB9CisgICAgaWYg
KGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBlVGV4dCkgeworICAgICAgICBtX3dyaXRhYmxl
RGF0YU9iamVjdC0+Y2xlYXJEYXRhKHBsYWluVGV4dEZvcm1hdCgpLT5jZkZvcm1hdCk7CisgICAg
ICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0LT5jbGVhckRhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLT5j
ZkZvcm1hdCk7CisgICAgfQorfQorCitib29sIFBhc3RlYm9hcmQ6Omhhc0RhdGEoKQoreworICAg
IGlmICghbV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobV9kYXRhT2JqZWN0KSB7CisgICAgICAgIENPTVB0cjxJ
RW51bUZPUk1BVEVUQz4gaXRyOworICAgICAgICBpZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+RW51
bUZvcm1hdEV0YyhEQVRBRElSX0dFVCwgJml0cikpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgICAgIGlmICghaXRyKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIEZPUk1BVEVUQyBkYXRhOworCisgICAgICAgIC8vIElFbnVtRk9STUFURVRDOjpOZXh0IHJl
dHVybnMgU19GQUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcy4KKyAgICAgICAgaWYgKGl0
ci0+TmV4dCgxLCAmZGF0YSwgMCkgPT0gU19PSykgeworICAgICAgICAgICAgLy8gVGhlcmUgaXMg
YXQgbGVhc3Qgb25lIGl0ZW0gaW4gdGhlIElEYXRhT2JqZWN0CisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0
dXJuICFtX2RyYWdEYXRhTWFwLmlzRW1wdHkoKTsKK30KKworc3RhdGljIHZvaWQgYWRkTWltZVR5
cGVzRm9yRm9ybWF0KExpc3RIYXNoU2V0PFN0cmluZz4mIHJlc3VsdHMsIGNvbnN0IEZPUk1BVEVU
QyYgZm9ybWF0KQoreworICAgIC8vIFVSTCBhbmQgVGV4dCBhcmUgcHJvdmlkZWQgZm9yIGNvbXBh
dGliaWxpdHkgd2l0aCBJRSdzIG1vZGVsCisgICAgaWYgKGZvcm1hdC5jZkZvcm1hdCA9PSB1cmxG
b3JtYXQoKS0+Y2ZGb3JtYXQgfHwgZm9ybWF0LmNmRm9ybWF0ID09IHVybFdGb3JtYXQoKS0+Y2ZG
b3JtYXQpIHsKKyAgICAgICAgcmVzdWx0cy5hZGQoIlVSTCIpOworICAgICAgICByZXN1bHRzLmFk
ZCgidGV4dC91cmktbGlzdCIpOworICAgIH0KKworICAgIGlmIChmb3JtYXQuY2ZGb3JtYXQgPT0g
cGxhaW5UZXh0V0Zvcm1hdCgpLT5jZkZvcm1hdCB8fCBmb3JtYXQuY2ZGb3JtYXQgPT0gcGxhaW5U
ZXh0Rm9ybWF0KCktPmNmRm9ybWF0KSB7CisgICAgICAgIHJlc3VsdHMuYWRkKCJUZXh0Iik7Cisg
ICAgICAgIHJlc3VsdHMuYWRkKCJ0ZXh0L3BsYWluIik7CisgICAgfQorfQorCitMaXN0SGFzaFNl
dDxTdHJpbmc+IFBhc3RlYm9hcmQ6OnR5cGVzKCkKK3sKKyAgICBMaXN0SGFzaFNldDxTdHJpbmc+
IHJlc3VsdHM7CisKKyAgICBpZiAoIW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFwLmlzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisKKyAgICBpZiAobV9kYXRhT2JqZWN0KSB7
CisgICAgICAgIENPTVB0cjxJRW51bUZPUk1BVEVUQz4gaXRyOworCisgICAgICAgIGlmIChGQUlM
RUQobV9kYXRhT2JqZWN0LT5FbnVtRm9ybWF0RXRjKERBVEFESVJfR0VULCAmaXRyKSkpCisgICAg
ICAgICAgICByZXR1cm4gcmVzdWx0czsKKworICAgICAgICBpZiAoIWl0cikKKyAgICAgICAgICAg
IHJldHVybiByZXN1bHRzOworCisgICAgICAgIEZPUk1BVEVUQyBkYXRhOworCisgICAgICAgIC8v
IElFbnVtRk9STUFURVRDOjpOZXh0IHJldHVybnMgU19GQUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9y
ZSBpdGVtcy4KKyAgICAgICAgd2hpbGUgKGl0ci0+TmV4dCgxLCAmZGF0YSwgMCkgPT0gU19PSykK
KyAgICAgICAgICAgIGFkZE1pbWVUeXBlc0ZvckZvcm1hdChyZXN1bHRzLCBkYXRhKTsKKyAgICB9
IGVsc2UgeworICAgICAgICBmb3IgKERyYWdEYXRhTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1f
ZHJhZ0RhdGFNYXAuYmVnaW4oKTsgaXQgIT0gbV9kcmFnRGF0YU1hcC5lbmQoKTsgKytpdCkgewor
ICAgICAgICAgICAgRk9STUFURVRDIGRhdGE7CisgICAgICAgICAgICBkYXRhLmNmRm9ybWF0ID0g
KCppdCkua2V5OworICAgICAgICAgICAgYWRkTWltZVR5cGVzRm9yRm9ybWF0KHJlc3VsdHMsIGRh
dGEpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdHM7Cit9CisKK1N0cmlu
ZyBQYXN0ZWJvYXJkOjpyZWFkU3RyaW5nKGNvbnN0IFN0cmluZyYgdHlwZSkKK3sKKyAgICBpZiAo
IW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFwLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
ICIiOworCisgICAgQ2xpcGJvYXJkRGF0YVR5cGUgZGF0YVR5cGUgPSBjbGlwYm9hcmRUeXBlRnJv
bU1JTUVUeXBlKHR5cGUpOworICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRl
eHQpCisgICAgICAgIHJldHVybiBtX2RhdGFPYmplY3QgPyBnZXRQbGFpblRleHQobV9kYXRhT2Jq
ZWN0LmdldCgpKSA6IGdldFBsYWluVGV4dCgmbV9kcmFnRGF0YU1hcCk7CisgICAgaWYgKGRhdGFU
eXBlID09IENsaXBib2FyZERhdGFUeXBlVVJMKQorICAgICAgICByZXR1cm4gbV9kYXRhT2JqZWN0
ID8gZ2V0VVJMKG1fZGF0YU9iamVjdC5nZXQoKSwgRHJhZ0RhdGE6OkRvTm90Q29udmVydEZpbGVu
YW1lcykgOiBnZXRVUkwoJm1fZHJhZ0RhdGFNYXAsIERyYWdEYXRhOjpEb05vdENvbnZlcnRGaWxl
bmFtZXMpOworICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MKSB7
CisgICAgICAgIFN0cmluZyBkYXRhID0gbV9kYXRhT2JqZWN0ID8gZ2V0VGV4dEhUTUwobV9kYXRh
T2JqZWN0LmdldCgpKSA6IGdldFRleHRIVE1MKCZtX2RyYWdEYXRhTWFwKTsKKyAgICAgICAgaWYg
KCFkYXRhLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICByZXR1
cm4gbV9kYXRhT2JqZWN0ID8gZ2V0Q0ZIVE1MKG1fZGF0YU9iamVjdC5nZXQoKSkgOiBnZXRDRkhU
TUwoJm1fZHJhZ0RhdGFNYXApOworICAgIH0KKworICAgIHJldHVybiAiIjsKK30KKworVmVjdG9y
PFN0cmluZz4gUGFzdGVib2FyZDo6cmVhZEZpbGVuYW1lcygpCit7CisjaWYgVVNFKENGKQorICAg
IFZlY3RvcjxTdHJpbmc+IGZpbGVOYW1lczsKKworICAgIGlmIChtX2RhdGFPYmplY3QpIHsKKyAg
ICAgICAgU1RHTUVESVVNIG1lZGl1bTsKKyAgICAgICAgaWYgKEZBSUxFRChtX2RhdGFPYmplY3Qt
PkdldERhdGEoY2ZIRHJvcEZvcm1hdCgpLCAmbWVkaXVtKSkpCisgICAgICAgICAgICByZXR1cm4g
ZmlsZU5hbWVzOworCisgICAgICAgIEhEUk9QIGhkcm9wID0gcmVpbnRlcnByZXRfY2FzdDxIRFJP
UD4oR2xvYmFsTG9jayhtZWRpdW0uaEdsb2JhbCkpOworICAgICAgICBpZiAoIWhkcm9wKQorICAg
ICAgICAgICAgcmV0dXJuIGZpbGVOYW1lczsKKworICAgICAgICBXQ0hBUiBmaWxlbmFtZVtNQVhf
UEFUSF07CisgICAgICAgIFVJTlQgZmlsZUNvdW50ID0gRHJhZ1F1ZXJ5RmlsZVcoaGRyb3AsIDB4
RkZGRkZGRkYsIDAsIDApOworICAgICAgICBmb3IgKFVJTlQgaSA9IDA7IGkgPCBmaWxlQ291bnQ7
IGkrKykgeworICAgICAgICAgICAgaWYgKCFEcmFnUXVlcnlGaWxlVyhoZHJvcCwgaSwgZmlsZW5h
bWUsIFdURl9BUlJBWV9MRU5HVEgoZmlsZW5hbWUpKSkKKyAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgIGZpbGVOYW1lcy5hcHBlbmQoZmlsZW5hbWUpOworICAgICAgICB9CisK
KyAgICAgICAgR2xvYmFsVW5sb2NrKG1lZGl1bS5oR2xvYmFsKTsKKyAgICAgICAgUmVsZWFzZVN0
Z01lZGl1bSgmbWVkaXVtKTsKKyAgICAgICAgcmV0dXJuIGZpbGVOYW1lczsKKyAgICB9CisgICAg
aWYgKCFtX2RyYWdEYXRhTWFwLmNvbnRhaW5zKGNmSERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQpKQor
ICAgICAgICByZXR1cm4gZmlsZU5hbWVzOworICAgIHJldHVybiBtX2RyYWdEYXRhTWFwLmdldChj
ZkhEcm9wRm9ybWF0KCktPmNmRm9ybWF0KTsKKyNlbHNlCisgICAgbm90SW1wbGVtZW50ZWQoKTsK
KyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgYm9vbCB3cml0ZVVSTChXQ0RhdGFP
YmplY3QgKmRhdGEsIGNvbnN0IEtVUkwmIHVybCwgU3RyaW5nIHRpdGxlLCBib29sIHdpdGhQbGFp
blRleHQsIGJvb2wgd2l0aEhUTUwpCit7CisgICAgQVNTRVJUKGRhdGEpOworCisgICAgaWYgKHVy
bC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICh0aXRsZS5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgdGl0bGUgPSB1cmwubGFzdFBhdGhDb21wb25lbnQoKTsKKyAgICAg
ICAgaWYgKHRpdGxlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHRpdGxlID0gdXJsLmhvc3QoKTsK
KyAgICB9CisKKyAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OworICAgIG1lZGl1bS50eW1lZCA9
IFRZTUVEX0hHTE9CQUw7CisKKyAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEo
dXJsLCB0aXRsZSk7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgaWYgKG1lZGl1bS5o
R2xvYmFsICYmIEZBSUxFRChkYXRhLT5TZXREYXRhKHVybFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJV
RSkpKQorICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOworICAgIGVsc2UKKyAg
ICAgICAgc3VjY2VzcyA9IHRydWU7CisKKyAgICBpZiAod2l0aEhUTUwpIHsKKyAgICAgICAgVmVj
dG9yPGNoYXI+IGNmaHRtbERhdGE7CisgICAgICAgIG1hcmt1cFRvQ0ZIVE1MKHVybFRvTWFya3Vw
KHVybCwgdGl0bGUpLCAiIiwgY2ZodG1sRGF0YSk7CisgICAgICAgIG1lZGl1bS5oR2xvYmFsID0g
Y3JlYXRlR2xvYmFsRGF0YShjZmh0bWxEYXRhKTsKKyAgICAgICAgaWYgKG1lZGl1bS5oR2xvYmFs
ICYmIEZBSUxFRChkYXRhLT5TZXREYXRhKGh0bWxGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQor
ICAgICAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgfQorCisgICAgaWYgKHdpdGhQbGFpblRl
eHQpIHsKKyAgICAgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKHVybC5zdHJp
bmcoKSk7CisgICAgICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQoZGF0YS0+U2V0RGF0
YShwbGFpblRleHRXRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKKyAgICAgICAgICAgIDo6R2xv
YmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN1Y2Nl
c3MgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiBzdWNjZXNzOworfQorCitib29sIFBhc3Rl
Ym9hcmQ6OndyaXRlU3RyaW5nKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBkYXRh
KQoreworICAgIGlmICghbV93cml0YWJsZURhdGFPYmplY3QpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIENsaXBib2FyZERhdGFUeXBlIHdpblR5cGUgPSBjbGlwYm9hcmRUeXBlRnJvbU1J
TUVUeXBlKHR5cGUpOworCisgICAgaWYgKHdpblR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVVUkwp
CisgICAgICAgIHJldHVybiBXZWJDb3JlOjp3cml0ZVVSTChtX3dyaXRhYmxlRGF0YU9iamVjdC5n
ZXQoKSwgS1VSTChQYXJzZWRVUkxTdHJpbmcsIGRhdGEpLCBTdHJpbmcoKSwgZmFsc2UsIHRydWUp
OworCisgICAgaWYgKHdpblR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KSB7CisgICAgICAg
IFNUR01FRElVTSBtZWRpdW0gPSB7MH07CisgICAgICAgIG1lZGl1bS50eW1lZCA9IFRZTUVEX0hH
TE9CQUw7CisgICAgICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YShkYXRhKTsK
KyAgICAgICAgaWYgKCFtZWRpdW0uaEdsb2JhbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICBpZiAoRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKHBsYWlu
VGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKSB7CisgICAgICAgICAgICA6Okdsb2JhbEZy
ZWUobWVkaXVtLmhHbG9iYWwpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwor
dm9pZCBQYXN0ZWJvYXJkOjpzZXREcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmLCBjb25zdCBJbnRQb2lu
dCYgaG90U3BvdCkKK3sKKyAgICAvLyBEbyBub3RoaW5nIGluIFdpbmRvd3MuCit9CisKK3ZvaWQg
UGFzdGVib2FyZDo6d3JpdGVSYW5nZVRvRGF0YU9iamVjdChSYW5nZSogc2VsZWN0ZWRSYW5nZSwg
RnJhbWUqIGZyYW1lKQoreworICAgIEFTU0VSVChzZWxlY3RlZFJhbmdlKTsKKyAgICBpZiAoIW1f
d3JpdGFibGVEYXRhT2JqZWN0KQorICAgICAgICByZXR1cm47CisKKyAgICBTVEdNRURJVU0gbWVk
aXVtID0gezB9OworICAgIG1lZGl1bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7CisKKyAgICBWZWN0
b3I8Y2hhcj4gZGF0YTsKKyAgICBtYXJrdXBUb0NGSFRNTChjcmVhdGVNYXJrdXAoc2VsZWN0ZWRS
YW5nZSwgMCwgQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSksCisgICAgICAgIHNlbGVjdGVkUmFuZ2Ut
PnN0YXJ0Q29udGFpbmVyKCktPmRvY3VtZW50KCktPnVybCgpLnN0cmluZygpLCBkYXRhKTsKKyAg
ICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7CisgICAgaWYgKG1lZGl1
bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShodG1sRm9y
bWF0KCksICZtZWRpdW0sIFRSVUUpKSkKKyAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xv
YmFsKTsKKworICAgIFN0cmluZyBzdHIgPSBmcmFtZS0+ZWRpdG9yKCkuc2VsZWN0ZWRUZXh0Rm9y
Q2xpcGJvYXJkKCk7CisgICAgcmVwbGFjZU5ld2xpbmVzV2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVz
KHN0cik7CisgICAgcmVwbGFjZU5CU1BXaXRoU3BhY2Uoc3RyKTsKKyAgICBtZWRpdW0uaEdsb2Jh
bCA9IGNyZWF0ZUdsb2JhbERhdGEoc3RyKTsKKyAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJ
TEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKHBsYWluVGV4dFdGb3JtYXQoKSwgJm1l
ZGl1bSwgVFJVRSkpKQorICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOworCisg
ICAgbWVkaXVtLmhHbG9iYWwgPSAwOworICAgIGlmIChmcmFtZS0+ZWRpdG9yKCkuY2FuU21hcnRD
b3B5T3JEZWxldGUoKSkKKyAgICAgICAgbV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEoc21h
cnRQYXN0ZUZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKTsKK30KKwogdm9pZCBQYXN0ZWJvYXJkOjp3
cml0ZVNlbGVjdGlvbihSYW5nZSogc2VsZWN0ZWRSYW5nZSwgYm9vbCBjYW5TbWFydENvcHlPckRl
bGV0ZSwgRnJhbWUqIGZyYW1lLCBTaG91bGRTZXJpYWxpemVTZWxlY3RlZFRleHRGb3JDbGlwYm9h
cmQgc2hvdWxkU2VyaWFsaXplU2VsZWN0ZWRUZXh0Rm9yQ2xpcGJvYXJkKQogewogICAgIGNsZWFy
KCk7CkBAIC0xNDYsMTAgKzQ3OCwyOSBAQA0KICAgICAgICAgICAgIDo6U2V0Q2xpcGJvYXJkRGF0
YShXZWJTbWFydFBhc3RlRm9ybWF0LCAwKTsKICAgICAgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQo
KTsKICAgICAgICAgfQotICAgICAgICAKICAgICB9CisKKyAgICB3cml0ZVJhbmdlVG9EYXRhT2Jq
ZWN0KHNlbGVjdGVkUmFuZ2UsIGZyYW1lKTsKIH0KIAordm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVBs
YWluVGV4dFRvRGF0YU9iamVjdChjb25zdCBTdHJpbmcmIHRleHQsIFNtYXJ0UmVwbGFjZU9wdGlv
biBzbWFydFJlcGxhY2VPcHRpb24pCit7CisgICAgaWYgKCFtX3dyaXRhYmxlRGF0YU9iamVjdCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKKyAgICBtZWRp
dW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOworCisgICAgU3RyaW5nIHN0ciA9IHRleHQ7CisgICAg
cmVwbGFjZU5ld2xpbmVzV2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVzKHN0cik7CisgICAgcmVwbGFj
ZU5CU1BXaXRoU3BhY2Uoc3RyKTsKKyAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERh
dGEoc3RyKTsKKyAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRh
T2JqZWN0LT5TZXREYXRhKHBsYWluVGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQorICAg
ICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOyAgICAgICAgCisKKyAgICBtZWRpdW0u
aEdsb2JhbCA9IDA7Cit9CisKIHZvaWQgUGFzdGVib2FyZDo6d3JpdGVQbGFpblRleHQoY29uc3Qg
U3RyaW5nJiB0ZXh0LCBTbWFydFJlcGxhY2VPcHRpb24gc21hcnRSZXBsYWNlT3B0aW9uKQogewog
ICAgIGNsZWFyKCk7CkBAIC0xNzEsOCArNTIyLDE2NSBAQA0KICAgICAgICAgICAgIDo6Q2xvc2VD
bGlwYm9hcmQoKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHdyaXRlUGxhaW5UZXh0VG9EYXRh
T2JqZWN0KHRleHQsIHNtYXJ0UmVwbGFjZU9wdGlvbik7CiB9CiAKKyNpZiAhT1MoV0lOQ0UpCitz
dGF0aWMgaW5saW5lIHZvaWQgcGF0aFJlbW92ZUJhZEZTQ2hhcmFjdGVycyhQV1NUUiBwc3osIHNp
emVfdCBsZW5ndGgpCit7CisgICAgc2l6ZV90IHdyaXRlVG8gPSAwOworICAgIHNpemVfdCByZWFk
RnJvbSA9IDA7CisgICAgd2hpbGUgKHJlYWRGcm9tIDwgbGVuZ3RoKSB7CisgICAgICAgIFVJTlQg
dHlwZSA9IFBhdGhHZXRDaGFyVHlwZShwc3pbcmVhZEZyb21dKTsKKyAgICAgICAgaWYgKCFwc3pb
cmVhZEZyb21dIHx8IHR5cGUgJiAoR0NUX0xGTkNIQVIgfCBHQ1RfU0hPUlRDSEFSKSkKKyAgICAg
ICAgICAgIHBzelt3cml0ZVRvKytdID0gcHN6W3JlYWRGcm9tXTsKKworICAgICAgICByZWFkRnJv
bSsrOworICAgIH0KKyAgICBwc3pbd3JpdGVUb10gPSAwOworfQorI2VuZGlmCisKK3N0YXRpYyBT
dHJpbmcgZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JUaXRsZShjb25zdCBTdHJpbmcmIHVybCwgY29u
c3QgU3RyaW5nJiB0aXRsZSwgY29uc3QgVUNoYXIqIGV4dGVuc2lvbiwgYm9vbCBpc0xpbmspCit7
CisjaWYgT1MoV0lOQ0UpCisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gU3RyaW5n
KCk7CisjZWxzZQorICAgIHN0YXRpYyBjb25zdCBzaXplX3QgZnNQYXRoTWF4TGVuZ3RoRXhjbHVk
aW5nTnVsbFRlcm1pbmF0b3IgPSBNQVhfUEFUSCAtIDE7CisgICAgYm9vbCB1c2VkVVJMID0gZmFs
c2U7CisgICAgV0NIQVIgZnNQYXRoQnVmZmVyW01BWF9QQVRIXTsKKyAgICBmc1BhdGhCdWZmZXJb
MF0gPSAwOworICAgIGludCBleHRlbnNpb25MZW4gPSBleHRlbnNpb24gPyBsc3RybGVuKGV4dGVu
c2lvbikgOiAwOworICAgIGludCBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24gPSBm
c1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdOdWxsVGVybWluYXRvciAtIGV4dGVuc2lvbkxlbjsKKwor
ICAgIGlmICghdGl0bGUuaXNFbXB0eSgpKSB7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdGQ6Om1p
bjxzaXplX3Q+KHRpdGxlLmxlbmd0aCgpLCBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNp
b24pOworICAgICAgICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgdGl0bGUuY2hhcmFjdGVycygp
LCBsZW4gKiBzaXplb2YoVUNoYXIpKTsKKyAgICAgICAgZnNQYXRoQnVmZmVyW2xlbl0gPSAwOwor
ICAgICAgICBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKGZzUGF0aEJ1ZmZlciwgbGVuKTsKKyAg
ICB9CisKKyAgICBpZiAoIWxzdHJsZW4oZnNQYXRoQnVmZmVyKSkgeworICAgICAgICBLVVJMIGt1
cmwoUGFyc2VkVVJMU3RyaW5nLCB1cmwpOworICAgICAgICB1c2VkVVJMID0gdHJ1ZTsKKyAgICAg
ICAgLy8gVGhlIGZpbGVuYW1lIGZvciBhbnkgY29udGVudCBiYXNlZCBkcmFnIG9yIGZpbGUgdXJs
IHNob3VsZCBiZSB0aGUgbGFzdCBlbGVtZW50IG9mIAorICAgICAgICAvLyB0aGUgcGF0aC4gSWYg
d2UgY2FuJ3QgZmluZCBpdCwgb3Igd2UncmUgY29taW5nIHVwIHdpdGggdGhlIG5hbWUgZm9yIGEg
bGluaworICAgICAgICAvLyB3ZSBqdXN0IHVzZSB0aGUgZW50aXJlIHVybC4KKyAgICAgICAgRFdP
UkQgbGVuID0gZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0ZW5zaW9uOworICAgICAgICBTdHJp
bmcgbGFzdENvbXBvbmVudCA9IGt1cmwubGFzdFBhdGhDb21wb25lbnQoKTsKKyAgICAgICAgaWYg
KGt1cmwuaXNMb2NhbEZpbGUoKSB8fCAoIWlzTGluayAmJiAhbGFzdENvbXBvbmVudC5pc0VtcHR5
KCkpKSB7CisgICAgICAgICAgICBsZW4gPSBzdGQ6Om1pbjxEV09SRD4oZnNQYXRoTWF4TGVuZ3Ro
RXhjbHVkaW5nRXh0ZW5zaW9uLCBsYXN0Q29tcG9uZW50Lmxlbmd0aCgpKTsKKyAgICAgICAgICAg
IENvcHlNZW1vcnkoZnNQYXRoQnVmZmVyLCBsYXN0Q29tcG9uZW50LmNoYXJhY3RlcnMoKSwgbGVu
ICogc2l6ZW9mKFVDaGFyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZW4gPSBz
dGQ6Om1pbjxEV09SRD4oZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0ZW5zaW9uLCB1cmwubGVu
Z3RoKCkpOworICAgICAgICAgICAgQ29weU1lbW9yeShmc1BhdGhCdWZmZXIsIHVybC5jaGFyYWN0
ZXJzKCksIGxlbiAqIHNpemVvZihVQ2hhcikpOworICAgICAgICB9CisgICAgICAgIGZzUGF0aEJ1
ZmZlcltsZW5dID0gMDsKKyAgICAgICAgcGF0aFJlbW92ZUJhZEZTQ2hhcmFjdGVycyhmc1BhdGhC
dWZmZXIsIGxlbik7CisgICAgfQorCisgICAgaWYgKCFleHRlbnNpb24pCisgICAgICAgIHJldHVy
biBTdHJpbmcoc3RhdGljX2Nhc3Q8VUNoYXIqPihmc1BhdGhCdWZmZXIpKTsKKworICAgIGlmICgh
aXNMaW5rICYmIHVzZWRVUkwpIHsKKyAgICAgICAgUGF0aFJlbmFtZUV4dGVuc2lvbihmc1BhdGhC
dWZmZXIsIGV4dGVuc2lvbik7CisgICAgICAgIHJldHVybiBTdHJpbmcoc3RhdGljX2Nhc3Q8VUNo
YXIqPihmc1BhdGhCdWZmZXIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWFrZVN0cmluZyhzdGF0
aWNfY2FzdDxjb25zdCBVQ2hhcio+KGZzUGF0aEJ1ZmZlciksIGV4dGVuc2lvbik7CisjZW5kaWYK
K30KKworLy8gd3JpdGVGaWxlVG9EYXRhT2JqZWN0IHRha2VzIG93bmVyc2hpcCBvZiBmaWxlRGVz
Y3JpcHRvciBhbmQgZmlsZUNvbnRlbnQKK3N0YXRpYyBIUkVTVUxUIHdyaXRlRmlsZVRvRGF0YU9i
amVjdChJRGF0YU9iamVjdCogZGF0YU9iamVjdCwgSEdMT0JBTCBmaWxlRGVzY3JpcHRvciwgSEdM
T0JBTCBmaWxlQ29udGVudCwgSEdMT0JBTCBoRHJvcENvbnRlbnQpCit7CisgICAgSFJFU1VMVCBo
ciA9IFNfT0s7CisgICAgRk9STUFURVRDKiBmZTsKKyAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9
OworICAgIG1lZGl1bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7CisKKyAgICBpZiAoIWZpbGVEZXNj
cmlwdG9yIHx8ICFmaWxlQ29udGVudCkKKyAgICAgICAgZ290byBleGl0OworCisgICAgLy8gRGVz
Y3JpcHRvcgorICAgIGZlID0gZmlsZURlc2NyaXB0b3JGb3JtYXQoKTsKKworICAgIG1lZGl1bS5o
R2xvYmFsID0gZmlsZURlc2NyaXB0b3I7CisKKyAgICBpZiAoRkFJTEVEKGhyID0gZGF0YU9iamVj
dC0+U2V0RGF0YShmZSwgJm1lZGl1bSwgVFJVRSkpKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAg
ICAvLyBDb250ZW50cworICAgIGZlID0gZmlsZUNvbnRlbnRGb3JtYXRaZXJvKCk7CisgICAgbWVk
aXVtLmhHbG9iYWwgPSBmaWxlQ29udGVudDsKKyAgICBpZiAoRkFJTEVEKGhyID0gZGF0YU9iamVj
dC0+U2V0RGF0YShmZSwgJm1lZGl1bSwgVFJVRSkpKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyNp
ZiBVU0UoQ0YpCisgICAgLy8gSERST1AKKyAgICBpZiAoaERyb3BDb250ZW50KSB7CisgICAgICAg
IG1lZGl1bS5oR2xvYmFsID0gaERyb3BDb250ZW50OworICAgICAgICBociA9IGRhdGFPYmplY3Qt
PlNldERhdGEoY2ZIRHJvcEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKTsKKyAgICB9CisjZW5kaWYK
KworZXhpdDoKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBpZiAoZmlsZURlc2NyaXB0
b3IpCisgICAgICAgICAgICBHbG9iYWxGcmVlKGZpbGVEZXNjcmlwdG9yKTsKKyAgICAgICAgaWYg
KGZpbGVDb250ZW50KQorICAgICAgICAgICAgR2xvYmFsRnJlZShmaWxlQ29udGVudCk7CisgICAg
ICAgIGlmIChoRHJvcENvbnRlbnQpCisgICAgICAgICAgICBHbG9iYWxGcmVlKGhEcm9wQ29udGVu
dCk7CisgICAgfQorICAgIHJldHVybiBocjsKK30KKwordm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVVS
TFRvRGF0YU9iamVjdChjb25zdCBLVVJMJiBrdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxlU3RyLCBG
cmFtZSogZnJhbWUpCit7CisgICAgaWYgKCFtX3dyaXRhYmxlRGF0YU9iamVjdCkKKyAgICAgICAg
cmV0dXJuOworICAgIFdlYkNvcmU6OndyaXRlVVJMKG1fd3JpdGFibGVEYXRhT2JqZWN0LmdldCgp
LCBrdXJsLCB0aXRsZVN0ciwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICBTdHJpbmcgdXJsID0ga3VybC5z
dHJpbmcoKTsKKyAgICBBU1NFUlQodXJsLmNvbnRhaW5zT25seUFTQ0lJKCkpOyAvLyBLVVJMOjpz
dHJpbmcoKSBpcyBVUkwgZW5jb2RlZC4KKworICAgIFN0cmluZyBmc1BhdGggPSBmaWxlc3lzdGVt
UGF0aEZyb21VcmxPclRpdGxlKHVybCwgdGl0bGVTdHIsIEwiLlVSTCIsIHRydWUpOworICAgIFN0
cmluZyBjb250ZW50U3RyaW5nKCJbSW50ZXJuZXRTaG9ydGN1dF1cclxuVVJMPSIgKyB1cmwgKyAi
XHJcbiIpOworICAgIENTdHJpbmcgY29udGVudCA9IGNvbnRlbnRTdHJpbmcubGF0aW4xKCk7CisK
KyAgICBpZiAoZnNQYXRoLmxlbmd0aCgpIDw9IDApCisgICAgICAgIHJldHVybjsKKworICAgIEhH
TE9CQUwgdXJsRmlsZURlc2NyaXB0b3IgPSBHbG9iYWxBbGxvYyhHUFRSLCBzaXplb2YoRklMRUdS
T1VQREVTQ1JJUFRPUikpOworICAgIGlmICghdXJsRmlsZURlc2NyaXB0b3IpCisgICAgICAgIHJl
dHVybjsKKworICAgIEhHTE9CQUwgdXJsRmlsZUNvbnRlbnQgPSBHbG9iYWxBbGxvYyhHUFRSLCBj
b250ZW50Lmxlbmd0aCgpKTsKKyAgICBpZiAoIXVybEZpbGVDb250ZW50KSB7CisgICAgICAgIEds
b2JhbEZyZWUodXJsRmlsZURlc2NyaXB0b3IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgRklMRUdST1VQREVTQ1JJUFRPUiogZmdkID0gc3RhdGljX2Nhc3Q8RklMRUdST1VQREVTQ1JJ
UFRPUio+KEdsb2JhbExvY2sodXJsRmlsZURlc2NyaXB0b3IpKTsKKyAgICBaZXJvTWVtb3J5KGZn
ZCwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKKyAgICBmZ2QtPmNJdGVtcyA9IDE7Cisg
ICAgZmdkLT5mZ2RbMF0uZHdGbGFncyA9IEZEX0ZJTEVTSVpFOworICAgIGZnZC0+ZmdkWzBdLm5G
aWxlU2l6ZUxvdyA9IGNvbnRlbnQubGVuZ3RoKCk7CisKKyAgICB1bnNpZ25lZCBtYXhTaXplID0g
c3RkOjptaW4oZnNQYXRoLmxlbmd0aCgpLCBXVEZfQVJSQVlfTEVOR1RIKGZnZC0+ZmdkWzBdLmNG
aWxlTmFtZSkpOworICAgIENvcHlNZW1vcnkoZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lLCBmc1BhdGgu
Y2hhcmFjdGVycygpLCBtYXhTaXplICogc2l6ZW9mKFVDaGFyKSk7CisgICAgR2xvYmFsVW5sb2Nr
KHVybEZpbGVEZXNjcmlwdG9yKTsKKworICAgIGNoYXIqIGZpbGVDb250ZW50cyA9IHN0YXRpY19j
YXN0PGNoYXIqPihHbG9iYWxMb2NrKHVybEZpbGVDb250ZW50KSk7CisgICAgQ29weU1lbW9yeShm
aWxlQ29udGVudHMsIGNvbnRlbnQuZGF0YSgpLCBjb250ZW50Lmxlbmd0aCgpKTsKKyAgICBHbG9i
YWxVbmxvY2sodXJsRmlsZUNvbnRlbnQpOworCisgICAgd3JpdGVGaWxlVG9EYXRhT2JqZWN0KG1f
d3JpdGFibGVEYXRhT2JqZWN0LmdldCgpLCB1cmxGaWxlRGVzY3JpcHRvciwgdXJsRmlsZUNvbnRl
bnQsIDApOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6OndyaXRlVVJMKGNvbnN0IEtVUkwmIHVybCwg
Y29uc3QgU3RyaW5nJiB0aXRsZVN0ciwgRnJhbWUqIGZyYW1lKQogewogICAgIEFTU0VSVCghdXJs
LmlzRW1wdHkoKSk7CkBAIC0yMTEsNiArNzE5LDggQEANCiAgICAgICAgICAgICA6Okdsb2JhbEZy
ZWUoY2JEYXRhKTsKICAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOwogICAgIH0KKworICAgIHdy
aXRlVVJMVG9EYXRhT2JqZWN0KHVybCwgdGl0bGVTdHIsIGZyYW1lKTsKIH0KIAogdm9pZCBQYXN0
ZWJvYXJkOjp3cml0ZUltYWdlKE5vZGUqIG5vZGUsIGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcm
KQpAQCAtMjU2LDYgKzc2NiwxMSBAQA0KICAgICB9CiB9CiAKK3ZvaWQgUGFzdGVib2FyZDo6d3Jp
dGVQYXN0ZWJvYXJkKGNvbnN0IFBhc3RlYm9hcmQmIHNvdXJjZVBhc3RlYm9hcmQpCit7CisgICAg
bm90SW1wbGVtZW50ZWQoKTsKK30KKwogdm9pZCBQYXN0ZWJvYXJkOjp3cml0ZUNsaXBib2FyZChD
bGlwYm9hcmQqKQogewogICAgIG5vdEltcGxlbWVudGVkKCk7CkBAIC0zNTIsNCArODY3LDIwNyBA
QA0KICAgICByZXR1cm4gMDsKIH0KIAordm9pZCBQYXN0ZWJvYXJkOjpzZXRFeHRlcm5hbERhdGFP
YmplY3QoSURhdGFPYmplY3QgKmRhdGFPYmplY3QpCit7CisgICAgbV93cml0YWJsZURhdGFPYmpl
Y3QgPSAwOworICAgIG1fZGF0YU9iamVjdCA9IGRhdGFPYmplY3Q7Cit9CisKK3N0YXRpYyBDYWNo
ZWRJbWFnZSogZ2V0Q2FjaGVkSW1hZ2UoRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICAvLyBBdHRl
bXB0IHRvIHB1bGwgQ2FjaGVkSW1hZ2UgZnJvbSBlbGVtZW50CisgICAgQVNTRVJUKGVsZW1lbnQp
OworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBlbGVtZW50LT5yZW5kZXJlcigpOworICAg
IGlmICghcmVuZGVyZXIgfHwgIXJlbmRlcmVyLT5pc0ltYWdlKCkpIAorICAgICAgICByZXR1cm4g
MDsKKworICAgIFJlbmRlckltYWdlKiBpbWFnZSA9IHRvUmVuZGVySW1hZ2UocmVuZGVyZXIpOwor
ICAgIGlmIChpbWFnZS0+Y2FjaGVkSW1hZ2UoKSAmJiAhaW1hZ2UtPmNhY2hlZEltYWdlKCktPmVy
cm9yT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIGltYWdlLT5jYWNoZWRJbWFnZSgpOworCisg
ICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmlsZURl
c2NyaXB0b3IoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUsIENhY2hlZElt
YWdlKiBpbWFnZSkKK3sKKyAgICBBU1NFUlRfQVJHKGltYWdlLCBpbWFnZSk7CisgICAgQVNTRVJU
KGltYWdlLT5pbWFnZSgpLT5kYXRhKCkpOworCisgICAgSFJFU1VMVCBociA9IFNfT0s7CisgICAg
SEdMT0JBTCBtZW1PYmogPSAwOworICAgIFN0cmluZyBmc1BhdGg7CisgICAgbWVtT2JqID0gR2xv
YmFsQWxsb2MoR1BUUiwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKKyAgICBpZiAoIW1l
bU9iaikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBGSUxFR1JPVVBERVNDUklQVE9SKiBmZ2Qg
PSAoRklMRUdST1VQREVTQ1JJUFRPUiopR2xvYmFsTG9jayhtZW1PYmopOworICAgIG1lbXNldChm
Z2QsIDAsIHNpemVvZihGSUxFR1JPVVBERVNDUklQVE9SKSk7CisgICAgZmdkLT5jSXRlbXMgPSAx
OworICAgIGZnZC0+ZmdkWzBdLmR3RmxhZ3MgPSBGRF9GSUxFU0laRTsKKyAgICBmZ2QtPmZnZFsw
XS5uRmlsZVNpemVMb3cgPSBpbWFnZS0+aW1hZ2UoKS0+ZGF0YSgpLT5zaXplKCk7CisKKyAgICBj
b25zdCBTdHJpbmcmIHByZWZlcnJlZFRpdGxlID0gdGl0bGUuaXNFbXB0eSgpID8gaW1hZ2UtPnJl
c3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5hbWUoKSA6IHRpdGxlOworICAgIFN0cmluZyBleHRlbnNp
b24gPSBpbWFnZS0+aW1hZ2UoKS0+ZmlsZW5hbWVFeHRlbnNpb24oKTsKKyAgICBpZiAoZXh0ZW5z
aW9uLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBEbyBub3QgY29udGludWUgcHJvY2Vzc2luZyBp
biB0aGUgcmFyZSBhbmQgdW51c3VhbCBjYXNlIHdoZXJlIGEgZGVjb2RlZCBpbWFnZSBpcyBub3Qg
YWJsZSAKKyAgICAgICAgLy8gdG8gcHJvdmlkZSBhIGZpbGVuYW1lIGV4dGVuc2lvbi4gU29tZXRo
aW5nIHRyaWNreSAobGlrZSBhIGJhaXQtbi1zd2l0Y2gpIGlzIGdvaW5nIG9uCisgICAgICAgIHJl
dHVybiAwOworICAgIH0KKyAgICBleHRlbnNpb24uaW5zZXJ0KCIuIiwgMCk7CisgICAgZnNQYXRo
ID0gZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JUaXRsZSh1cmwsIHByZWZlcnJlZFRpdGxlLCBleHRl
bnNpb24uY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgZmFsc2UpOworCisgICAgaWYg
KGZzUGF0aC5sZW5ndGgoKSA8PSAwKSB7CisgICAgICAgIEdsb2JhbFVubG9jayhtZW1PYmopOwor
ICAgICAgICBHbG9iYWxGcmVlKG1lbU9iaik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKwor
ICAgIGludCBtYXhTaXplID0gc3RkOjptaW4oZnNQYXRoLmxlbmd0aCgpLCBXVEZfQVJSQVlfTEVO
R1RIKGZnZC0+ZmdkWzBdLmNGaWxlTmFtZSkpOworICAgIENvcHlNZW1vcnkoZmdkLT5mZ2RbMF0u
Y0ZpbGVOYW1lLCAoTFBDV1NUUilmc1BhdGguY2hhcmFjdGVycygpLCBtYXhTaXplICogc2l6ZW9m
KFVDaGFyKSk7CisgICAgR2xvYmFsVW5sb2NrKG1lbU9iaik7CisKKyAgICByZXR1cm4gbWVtT2Jq
OworfQorCitzdGF0aWMgSEdMT0JBTCBjcmVhdGVHbG9iYWxJbWFnZUZpbGVDb250ZW50KFNoYXJl
ZEJ1ZmZlciogZGF0YSkKK3sKKyAgICBIR0xPQkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdQVFIs
IGRhdGEtPnNpemUoKSk7CisgICAgaWYgKCFtZW1PYmopIAorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIGNoYXIqIGZpbGVDb250ZW50cyA9IChQU1RSKUdsb2JhbExvY2sobWVtT2JqKTsKKworICAg
IENvcHlNZW1vcnkoZmlsZUNvbnRlbnRzLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUoKSk7CisK
KyAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKKworICAgIHJldHVybiBtZW1PYmo7Cit9CisKK3N0
YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEhEcm9wQ29udGVudChjb25zdCBLVVJMJiB1cmwsIFN0
cmluZyYgZmlsZU5hbWUsIFNoYXJlZEJ1ZmZlciogZGF0YSkKK3sKKyAgICBpZiAoZmlsZU5hbWUu
aXNFbXB0eSgpIHx8ICFkYXRhKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFdDSEFSIGZpbGVQ
YXRoW01BWF9QQVRIXTsKKworICAgIGlmICh1cmwuaXNMb2NhbEZpbGUoKSkgeworICAgICAgICBT
dHJpbmcgbG9jYWxQYXRoID0gZGVjb2RlVVJMRXNjYXBlU2VxdWVuY2VzKHVybC5wYXRoKCkpOwor
ICAgICAgICAvLyB3aW5kb3dzIGRvZXMgbm90IGVuam95IGEgbGVhZGluZyBzbGFzaCBvbiBwYXRo
cworICAgICAgICBpZiAobG9jYWxQYXRoWzBdID09ICcvJykKKyAgICAgICAgICAgIGxvY2FsUGF0
aCA9IGxvY2FsUGF0aC5zdWJzdHJpbmcoMSk7CisgICAgICAgIExQQ1dTVFIgbG9jYWxQYXRoU3Ry
ID0gbG9jYWxQYXRoLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCk7CisgICAgICAgIGlm
ICh3Y3NsZW4obG9jYWxQYXRoU3RyKSArIDEgPCBNQVhfUEFUSCkKKyAgICAgICAgICAgIHdjc2Nw
eV9zKGZpbGVQYXRoLCBNQVhfUEFUSCwgbG9jYWxQYXRoU3RyKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyNpZiBPUyhXSU5DRSkKKyAgICAgICAg
bm90SW1wbGVtZW50ZWQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisjZWxzZQorICAgICAgICBXQ0hB
UiB0ZW1wUGF0aFtNQVhfUEFUSF07CisgICAgICAgIFdDSEFSIGV4dGVuc2lvbltNQVhfUEFUSF07
CisgICAgICAgIGlmICghOjpHZXRUZW1wUGF0aChXVEZfQVJSQVlfTEVOR1RIKHRlbXBQYXRoKSwg
dGVtcFBhdGgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICghOjpQYXRoQXBw
ZW5kKHRlbXBQYXRoLCBmaWxlTmFtZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKSkK
KyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBMUENXU1RSIGZvdW5kRXh0ZW5zaW9uID0g
OjpQYXRoRmluZEV4dGVuc2lvbih0ZW1wUGF0aCk7CisgICAgICAgIGlmIChmb3VuZEV4dGVuc2lv
bikgeworICAgICAgICAgICAgaWYgKHdjc2NweV9zKGV4dGVuc2lvbiwgTUFYX1BBVEgsIGZvdW5k
RXh0ZW5zaW9uKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlCisg
ICAgICAgICAgICAqZXh0ZW5zaW9uID0gMDsKKyAgICAgICAgOjpQYXRoUmVtb3ZlRXh0ZW5zaW9u
KHRlbXBQYXRoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCAxMDAwMDsgaSsrKSB7Cisg
ICAgICAgICAgICBpZiAoc3dwcmludGZfcyhmaWxlUGF0aCwgTUFYX1BBVEgsIFRFWFQoIiVzLSVk
JXMiKSwgdGVtcFBhdGgsIGksIGV4dGVuc2lvbikgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0
dXJuIDA7CisgICAgICAgICAgICBpZiAoITo6UGF0aEZpbGVFeGlzdHMoZmlsZVBhdGgpKQorICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEhBTkRMRSB0ZW1wRmlsZUhh
bmRsZSA9IENyZWF0ZUZpbGUoZmlsZVBhdGgsIEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUs
IDAsIDAsIENSRUFURV9BTFdBWVMsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgMCk7CisgICAgICAg
IGlmICh0ZW1wRmlsZUhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgICAg
IHJldHVybiAwOworCisgICAgICAgIC8vIFdyaXRlIHRoZSBkYXRhIHRvIHRoaXMgdGVtcCBmaWxl
LgorICAgICAgICBEV09SRCB3cml0dGVuOworICAgICAgICBCT09MIHRlbXBXcml0ZVN1Y2NlZWRl
ZCA9IFdyaXRlRmlsZSh0ZW1wRmlsZUhhbmRsZSwgZGF0YS0+ZGF0YSgpLCBkYXRhLT5zaXplKCks
ICZ3cml0dGVuLCAwKTsKKyAgICAgICAgQ2xvc2VIYW5kbGUodGVtcEZpbGVIYW5kbGUpOworICAg
ICAgICBpZiAoIXRlbXBXcml0ZVN1Y2NlZWRlZCkKKyAgICAgICAgICAgIHJldHVybiAwOworI2Vu
ZGlmCisgICAgfQorCisgICAgU0laRV9UIGRyb3BGaWxlc1NpemUgPSBzaXplb2YoRFJPUEZJTEVT
KSArIChzaXplb2YoV0NIQVIpICogKHdjc2xlbihmaWxlUGF0aCkgKyAyKSk7CisgICAgSEdMT0JB
TCBtZW1PYmogPSBHbG9iYWxBbGxvYyhHSE5EIHwgR01FTV9TSEFSRSwgZHJvcEZpbGVzU2l6ZSk7
CisgICAgaWYgKCFtZW1PYmopIAorICAgICAgICByZXR1cm4gMDsKKworICAgIERST1BGSUxFUyog
ZHJvcEZpbGVzID0gKERST1BGSUxFUyopIEdsb2JhbExvY2sobWVtT2JqKTsKKyAgICBkcm9wRmls
ZXMtPnBGaWxlcyA9IHNpemVvZihEUk9QRklMRVMpOworICAgIGRyb3BGaWxlcy0+ZldpZGUgPSBU
UlVFOworICAgIHdjc2NweSgoTFBXU1RSKShkcm9wRmlsZXMgKyAxKSwgZmlsZVBhdGgpOyAgICAK
KyAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKKworICAgIHJldHVybiBtZW1PYmo7Cit9CisKK3N0
YXRpYyB2b2lkIHdyaXRlSW1hZ2VUb0RhdGFPYmplY3QoSURhdGFPYmplY3QqIGRhdGFPYmplY3Qs
IEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICAvLyBTaG92ZSBpbWFn
ZSBkYXRhIGludG8gYSBEYXRhT2JqZWN0IGZvciB1c2UgYXMgYSBmaWxlCisgICAgQ2FjaGVkSW1h
Z2UqIGNhY2hlZEltYWdlID0gZ2V0Q2FjaGVkSW1hZ2UoZWxlbWVudCk7CisgICAgaWYgKCFjYWNo
ZWRJbWFnZSB8fCAhY2FjaGVkSW1hZ2UtPmltYWdlRm9yUmVuZGVyZXIoZWxlbWVudC0+cmVuZGVy
ZXIoKSkgfHwgIWNhY2hlZEltYWdlLT5pc0xvYWRlZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBTaGFyZWRCdWZmZXIqIGltYWdlQnVmZmVyID0gY2FjaGVkSW1hZ2UtPmltYWdlRm9yUmVuZGVy
ZXIoZWxlbWVudC0+cmVuZGVyZXIoKSktPmRhdGEoKTsKKyAgICBpZiAoIWltYWdlQnVmZmVyIHx8
ICFpbWFnZUJ1ZmZlci0+c2l6ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBIR0xPQkFMIGlt
YWdlRmlsZURlc2NyaXB0b3IgPSBjcmVhdGVHbG9iYWxJbWFnZUZpbGVEZXNjcmlwdG9yKHVybC5z
dHJpbmcoKSwgZWxlbWVudC0+Z2V0QXR0cmlidXRlKEhUTUxOYW1lczo6YWx0QXR0ciksIGNhY2hl
ZEltYWdlKTsKKyAgICBpZiAoIWltYWdlRmlsZURlc2NyaXB0b3IpCisgICAgICAgIHJldHVybjsK
KworICAgIEhHTE9CQUwgaW1hZ2VGaWxlQ29udGVudCA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNv
bnRlbnQoaW1hZ2VCdWZmZXIpOworICAgIGlmICghaW1hZ2VGaWxlQ29udGVudCkgeworICAgICAg
ICBHbG9iYWxGcmVlKGltYWdlRmlsZURlc2NyaXB0b3IpOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgU3RyaW5nIGZpbGVOYW1lID0gY2FjaGVkSW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2Vz
dGVkRmlsZW5hbWUoKTsKKyAgICBIR0xPQkFMIGhEcm9wQ29udGVudCA9IGNyZWF0ZUdsb2JhbEhE
cm9wQ29udGVudCh1cmwsIGZpbGVOYW1lLCBpbWFnZUJ1ZmZlcik7CisgICAgaWYgKCFoRHJvcENv
bnRlbnQpIHsKKyAgICAgICAgR2xvYmFsRnJlZShoRHJvcENvbnRlbnQpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgd3JpdGVGaWxlVG9EYXRhT2JqZWN0KGRhdGFPYmplY3QsIGltYWdl
RmlsZURlc2NyaXB0b3IsIGltYWdlRmlsZUNvbnRlbnQsIGhEcm9wQ29udGVudCk7Cit9CisKK3Zv
aWQgUGFzdGVib2FyZDo6ZGVjbGFyZUFuZFdyaXRlRHJhZ0ltYWdlKEVsZW1lbnQqIGVsZW1lbnQs
IGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgRnJhbWUqIGZyYW1lKQorewor
ICAgIC8vIE9yZGVyIGlzIGltcG9ydGFudCBoZXJlIGZvciBFeHBsb3JlcidzIHNha2UKKyAgICBp
ZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQorICAgICAgICByZXR1cm47CisgICAgV2ViQ29yZTo6
d3JpdGVVUkwobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybCwgdGl0bGUsIHRydWUsIGZh
bHNlKTsKKworICAgIHdyaXRlSW1hZ2VUb0RhdGFPYmplY3QobV93cml0YWJsZURhdGFPYmplY3Qu
Z2V0KCksIGVsZW1lbnQsIHVybCk7CisKKyAgICBBdG9taWNTdHJpbmcgaW1hZ2VVUkwgPSBlbGVt
ZW50LT5nZXRBdHRyaWJ1dGUoSFRNTE5hbWVzOjpzcmNBdHRyKTsKKyAgICBpZiAoaW1hZ2VVUkwu
aXNFbXB0eSgpKSAKKyAgICAgICAgcmV0dXJuOworCisgICAgS1VSTCBmdWxsVVJMID0gZnJhbWUt
PmRvY3VtZW50KCktPmNvbXBsZXRlVVJMKHN0cmlwTGVhZGluZ0FuZFRyYWlsaW5nSFRNTFNwYWNl
cyhpbWFnZVVSTCkpOworICAgIGlmIChmdWxsVVJMLmlzRW1wdHkoKSkgCisgICAgICAgIHJldHVy
bjsKKyAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OworICAgIG1lZGl1bS50eW1lZCA9IFRZTUVE
X0hHTE9CQUw7CisKKyAgICAvLyBQdXQgaW1nIHRhZyBvbiB0aGUgY2xpcGJvYXJkIHJlZmVyZW5j
aW5nIHRoZSBpbWFnZQorICAgIFZlY3RvcjxjaGFyPiBkYXRhOworICAgIG1hcmt1cFRvQ0ZIVE1M
KGNyZWF0ZU1hcmt1cChlbGVtZW50LCBJbmNsdWRlTm9kZSwgMCwgUmVzb2x2ZUFsbFVSTHMpLCAi
IiwgZGF0YSk7CisgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEpOwor
ICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNl
dERhdGEoaHRtbEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIDo6R2xvYmFsRnJl
ZShtZWRpdW0uaEdsb2JhbCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNv
dXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJLaXQv
d2luL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNDk0KQ0KKysrIFNvdXJjZS9XZWJLaXQvd2luL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEsMyArMSwxNCBAQA0KKzIwMTMtMDUtMjEgIFh1
ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgorCisgICAgICAgIE1vdmUgV2lu
ZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJkLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNw
cDoKKyAgICAgICAgKFdlYkRyYWdDbGllbnQ6OndpbGxQZXJmb3JtRHJhZ1NvdXJjZUFjdGlvbik6
IEdldCBJRGF0YU9iamVjdCBmcm9tIFBhc3RlYm9hcmQgaW5zdGVhZCBvZiBDbGlwYm9hcmQuCisg
ICAgICAgIChXZWJEcmFnQ2xpZW50OjpzdGFydERyYWcpOiBEaXR0by4KKwogMjAxMy0wNS0xOSAg
QW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAYXBwbGUuY29tPgogCiAgICAgICAgIFJlbW92ZSBD
aHJvbWVDbGllbnQ6OndlYlZpZXcoKQpJbmRleDogU291cmNlL1dlYktpdC93aW4vV2ViQ29yZVN1
cHBvcnQvV2ViRHJhZ0NsaWVudC5jcHANCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBTb3VyY2UvV2ViS2l0L3dp
bi9XZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcAkocmV2aXNpb24gMTUwNDMzKQ0KKysr
IFNvdXJjZS9XZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQuY3BwCSh3b3Jr
aW5nIGNvcHkpDQpAQCAtMzEsMTAgKzMxLDE3IEBADQogCiAjaW5jbHVkZSA8c2hsb2JqLmg+CiAK
KyNpZiAhVVNFKExFR0FDWV9TVFlMRV9BQlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCisjaW5jbHVk
ZSA8V2ViQ29yZS9DbGlwYm9hcmQuaD4KKyNlbHNlCiAjaW5jbHVkZSA8V2ViQ29yZS9DbGlwYm9h
cmRXaW4uaD4KKyNlbmRpZgogI2luY2x1ZGUgPFdlYkNvcmUvRHJhZ0NvbnRyb2xsZXIuaD4KICNp
bmNsdWRlIDxXZWJDb3JlL0RyYWdEYXRhLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9FdmVudEhhbmRs
ZXIuaD4KKyNpZiAhVVNFKExFR0FDWV9TVFlMRV9BQlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCisj
aW5jbHVkZSA8V2ViQ29yZS9QYXN0ZWJvYXJkLmg+CisjZW5kaWYKICNpbmNsdWRlIDxXZWJDb3Jl
L1BsYXRmb3JtTW91c2VFdmVudC5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRnJhbWUuaD4KICNpbmNs
dWRlIDxXZWJDb3JlL0ZyYW1lVmlldy5oPgpAQCAtMTAzLDEyICsxMTAsMjEgQEANCiAgICAgICAg
IHJldHVybjsKIAogICAgIFBPSU5UIHBvaW50ID0gaW50UG9pbnQ7CisjaWYgVVNFKExFR0FDWV9T
VFlMRV9BQlNUUkFDVF9DTElQQk9BUkRfQ0xBU1MpCiAgICAgQ09NUHRyPElEYXRhT2JqZWN0PiBk
YXRhT2JqZWN0ID0gc3RhdGljX2Nhc3Q8Q2xpcGJvYXJkV2luKj4oY2xpcGJvYXJkKS0+ZGF0YU9i
amVjdCgpOworI2Vsc2UKKyAgICBQYXN0ZWJvYXJkKiBwYXN0ZWJvYXJkID0gY29uc3RfY2FzdDxQ
YXN0ZWJvYXJkKj4oJmNsaXBib2FyZC0+cGFzdGVib2FyZCgpKTsKKyAgICBDT01QdHI8SURhdGFP
YmplY3Q+IGRhdGFPYmplY3QgPSBwYXN0ZWJvYXJkLT5kYXRhT2JqZWN0KCk7CisjZW5kaWYKIAog
ICAgIENPTVB0cjxJRGF0YU9iamVjdD4gbmV3RGF0YU9iamVjdDsKICAgICBIUkVTVUxUIHJlc3Vs
dCA9IHVpRGVsZWdhdGUtPndpbGxQZXJmb3JtRHJhZ1NvdXJjZUFjdGlvbihtX3dlYlZpZXcsIHN0
YXRpY19jYXN0PFdlYkRyYWdTb3VyY2VBY3Rpb24+KGFjdGlvbiksICZwb2ludCwgZGF0YU9iamVj
dC5nZXQoKSwgJm5ld0RhdGFPYmplY3QpOwogICAgIGlmIChyZXN1bHQgPT0gU19PSyAmJiBuZXdE
YXRhT2JqZWN0ICE9IGRhdGFPYmplY3QpCisjaWYgVVNFKExFR0FDWV9TVFlMRV9BQlNUUkFDVF9D
TElQQk9BUkRfQ0xBU1MpCiAgICAgICAgIHN0YXRpY19jYXN0PENsaXBib2FyZFdpbio+KGNsaXBi
b2FyZCktPnNldEV4dGVybmFsRGF0YU9iamVjdChuZXdEYXRhT2JqZWN0LmdldCgpKTsKKyNlbHNl
CisgICAgICAgIHBhc3RlYm9hcmQtPnNldEV4dGVybmFsRGF0YU9iamVjdChuZXdEYXRhT2JqZWN0
LmdldCgpKTsKKyNlbmRpZgogfQogCiB2b2lkIFdlYkRyYWdDbGllbnQ6OnN0YXJ0RHJhZyhEcmFn
SW1hZ2VSZWYgaW1hZ2UsIGNvbnN0IEludFBvaW50JiBpbWFnZU9yaWdpbiwgY29uc3QgSW50UG9p
bnQmIGRyYWdQb2ludCwgQ2xpcGJvYXJkKiBjbGlwYm9hcmQsIEZyYW1lKiBmcmFtZSwgYm9vbCBp
c0xpbmspCkBAIC0xMjQsNyArMTQwLDEyIEBADQogICAgIGlmIChGQUlMRUQoV2ViRHJvcFNvdXJj
ZTo6Y3JlYXRlSW5zdGFuY2UobV93ZWJWaWV3LCAmc291cmNlKSkpCiAgICAgICAgIHJldHVybjsK
IAorI2lmIFVTRShMRUdBQ1lfU1RZTEVfQUJTVFJBQ1RfQ0xJUEJPQVJEX0NMQVNTKQogICAgIGRh
dGFPYmplY3QgPSBzdGF0aWNfY2FzdDxDbGlwYm9hcmRXaW4qPihjbGlwYm9hcmQpLT5kYXRhT2Jq
ZWN0KCk7CisjZWxzZQorICAgIFBhc3RlYm9hcmQqIHBhc3RlYm9hcmQgPSBjb25zdF9jYXN0PFBh
c3RlYm9hcmQqPigmY2xpcGJvYXJkLT5wYXN0ZWJvYXJkKCkpOworICAgIGRhdGFPYmplY3QgPSBw
YXN0ZWJvYXJkLT5kYXRhT2JqZWN0KCk7CisjZW5kaWYKICAgICBpZiAoc291cmNlICYmIChpbWFn
ZSB8fCBkYXRhT2JqZWN0KSkgewogICAgICAgICBpZiAoaW1hZ2UpIHsKICAgICAgICAgICAgIGlm
KFNVQ0NFRURFRChDb0NyZWF0ZUluc3RhbmNlKENMU0lEX0RyYWdEcm9wSGVscGVyLCAwLCBDTFND
VFhfSU5QUk9DX1NFUlZFUiwK
</data>
<flag name="review"
          id="223915"
          type_id="1"
          status="-"
          setter="darin"
    />
    <flag name="commit-queue"
          id="223916"
          type_id="3"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>202780</attachid>
            <date>2013-05-24 01:08:21 -0700</date>
            <delta_ts>2013-05-24 01:29:23 -0700</delta_ts>
            <desc>patch</desc>
            <filename>116258_2.patch</filename>
            <type>text/plain</type>
            <size>66989</size>
            <attacher name="huangxueqing">huangxueqing</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9X
ZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNjMyKQ0KKysrIFNvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEsMyArMSw2MyBAQA0KKzIwMTMtMDUtMjQgIFh1
ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgorCisgICAgICAgIE1vdmUgV2lu
ZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJkLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdHM6CisgICAgICAgIENsaXBib2FyZCByZWZhY3Rv
ciwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogZG9tL0NsaXBib2FyZC5oOgorICAgICAgICAq
IHBhZ2Uvd2luL0V2ZW50SGFuZGxlcldpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFdmVudEhh
bmRsZXI6OmNyZWF0ZURyYWdnaW5nQ2xpcGJvYXJkKTogQ3JlYXRlIENsaXBib2FyZCBpbnN0ZWFk
IG9mIENsaXBib2FyZFdpbi4KKyAgICAgICAgKiBwbGF0Zm9ybS9QYXN0ZWJvYXJkLmg6CisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFBhc3RlYm9hcmQpOgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6ZGF0YU9iamVjdCk6IEdldCBJRGF0YU9iamVjdCBieSBDbGlwYm9yYWQuCisg
ICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0YWJsZURhdGFPYmplY3QpOiBHZXQgV0NE
YXRhT2JqZWN0IGJ5IENsaXBib3JhZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vQ2xpcGJvYXJk
V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNsaXBib2FyZDo6Y3JlYXRlRHJhZ0ltYWdlKTog
Q2hhbmdlIHBhcmFtZXRlciBuYW1lIGxvYyB0byBkcmFnTG9jYXRpb24uCisgICAgICAgIChXZWJD
b3JlOjpDbGlwYm9hcmQ6OmRlY2xhcmVBbmRXcml0ZURyYWdJbWFnZSk6IEltcGxlbWVudCBkZWNs
YXJlQW5kV3JpdGVEcmFnSW1hZ2UgdXNlIFdDRGF0YU9iamVjdCBleHBvc2VkIGJ5IFBhc3RlYm9h
cmQuCisgICAgICAgICogcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5oOiBSZW1vdmVkLgorICAg
ICAgICAqIHBsYXRmb3JtL3dpbi9FZGl0b3JXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6RWRp
dG9yOjpuZXdHZW5lcmFsQ2xpcGJvYXJkKTogQ3JlYXRlIENsaXBib2FyZCBpbnN0ZWFkIG9mIENs
aXBib2FyZFdpbi4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmNyZWF0ZUZv
ckNvcHlBbmRQYXN0ZSk6IENyZWF0ZSBhIFBhc3RlYm9hcmQuCisgICAgICAgIChXZWJDb3JlOjpQ
YXN0ZWJvYXJkOjpjcmVhdGVQcml2YXRlKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0
ZWJvYXJkOjpjcmVhdGVGb3JEcmFnQW5kRHJvcCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6ZmluaXNoQ3JlYXRpbmdQYXN0ZWJvYXJkKTogQ3JlYXRlIFBhc3RlYm9hcmQg
dXNlIFdpbmRvd3MgQVBJLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6UGFzdGVib2Fy
ZCk6CisgICAgICAgIChXZWJDb3JlOjpjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKTogQ29waWVk
IGZyb20gQ2xpcGJvYXJkV2luLmNwcC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmNs
ZWFyKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpoYXNEYXRhKTogRGl0
dG8uCisgICAgICAgIChXZWJDb3JlOjphZGRNaW1lVHlwZXNGb3JGb3JtYXQpOiBEaXR0by4KKyAg
ICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OnR5cGVzKTogRGl0dG8uCisgICAgICAgIChXZWJD
b3JlOjpQYXN0ZWJvYXJkOjpyZWFkU3RyaW5nKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQ
YXN0ZWJvYXJkOjpyZWFkRmlsZW5hbWVzKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjp3cml0
ZVVSTCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVTdHJpbmcp
OiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OnNldERyYWdJbWFnZSk6IERp
dHRvLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVSYW5nZVRvRGF0YU9iamVj
dCk6IFdyaXRlIHJhbmdlIHRvIFdDRGF0YU9iamVjdC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3Rl
Ym9hcmQ6OndyaXRlU2VsZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6Ondy
aXRlUGxhaW5UZXh0VG9EYXRhT2JqZWN0KTogV3JpdGUgUGxhaW5UZXh0IHRvIFdDRGF0YU9iamVj
dC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlUGxhaW5UZXh0KToKKyAgICAg
ICAgKFdlYkNvcmU6OnBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMpOiBDb3BpZWQgZnJvbSBDbGlw
Ym9hcmRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6ZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JU
aXRsZSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6d3JpdGVGaWxlVG9EYXRhT2JqZWN0KTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVVSTFRvRGF0YU9iamVj
dCk6IFdyaXRlIFVSTCB0byBXQ0RhdGFPYmplY3QuCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJv
YXJkOjp3cml0ZVVSTCk6IENvcGllZCBmcm9tIENsaXBib2FyZFdpbi5jcHAuCisgICAgICAgIChX
ZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVBhc3RlYm9hcmQpOiBDb3BpZWQgZnJvbSBQYXN0ZWJv
YXJkOjp3cml0ZUNsaXBib2FyZC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmRvY3Vt
ZW50RnJhZ21lbnQpOiBDb3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6UGFzdGVib2FyZDo6c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KTogQ2xpcGJvYXJkIGNhbiBz
ZXQgbmV3IElEYXRhT2JqZWN0LgorICAgICAgICAoV2ViQ29yZTo6Z2V0Q2FjaGVkSW1hZ2UpOiBD
b3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlR2xv
YmFsSW1hZ2VGaWxlRGVzY3JpcHRvcik6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
R2xvYmFsSW1hZ2VGaWxlQ29udGVudCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
R2xvYmFsSERyb3BDb250ZW50KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJk
Ojp3cml0ZUltYWdlVG9EYXRhT2JqZWN0KTogRXhwb3NlIHRvIG1ha2UgQ2xpcGJvYXJkIGltcGxl
bWVudCBkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UuCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJv
YXJkOjp3cml0ZVVSTFRvV3JpdGFibGVEYXRhT2JqZWN0KTogRGl0dG8uCisKIDIwMTMtMDUtMjMg
IEJldGggRGFraW4gIDxiZGFraW5AYXBwbGUuY29tPgogCiAgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTY3MDIKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Rv
bS9DbGlwYm9hcmQuaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9DbGlwYm9h
cmQuaAkocmV2aXNpb24gMTUwNjI5KQ0KKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9DbGlwYm9hcmQu
aAkod29ya2luZyBjb3B5KQ0KQEAgLTM0LDcgKzM0LDcgQEANCiAvLyBUaGlzIERPTSBvYmplY3Qg
bm93IHdvcmtzIGJ5IGNhbGxpbmcgdGhyb3VnaCB0byBjbGFzc2VzIGluIHRoZSBwbGF0Zm9ybSBs
YXllci4KIC8vIFNwZWNpZmljYWxseSwgdGhlIGNsYXNzIGN1cnJlbnRseSBuYW1lZCBQYXN0ZWJv
YXJkLiBUaGUgbGVnYWN5IHN0eWxlIGluc3RlYWQKIC8vIHVzZXMgdGhpcyBhcyBhbiBhYnN0cmFj
dCBiYXNlIGNsYXNzLgotI2RlZmluZSBXVEZfVVNFX0xFR0FDWV9TVFlMRV9BQlNUUkFDVF9DTElQ
Qk9BUkRfQ0xBU1MgKFBMQVRGT1JNKElPUykgfHwgUExBVEZPUk0oUVQpIHx8IFBMQVRGT1JNKFdJ
TikpCisjZGVmaW5lIFdURl9VU0VfTEVHQUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFT
UyAoUExBVEZPUk0oSU9TKSB8fCBQTEFURk9STShRVCkpCiAKICNpZiBVU0UoTEVHQUNZX1NUWUxF
X0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFTUykKICNkZWZpbmUgTEVHQUNZX1ZJUlRVQUwgdmlydHVh
bApJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS93aW4vRXZlbnRIYW5kbGVyV2luLmNwcA0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2Uvd2luL0V2ZW50SGFuZGxlcldpbi5jcHAJ
KHJldmlzaW9uIDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL3dpbi9FdmVudEhhbmRs
ZXJXaW4uY3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtMjcsNiArMjcsOCBAQA0KICNpbmNsdWRlICJj
b25maWcuaCIKICNpbmNsdWRlICJFdmVudEhhbmRsZXIuaCIKIAorI2luY2x1ZGUgIkNPTVB0ci5o
IgorI2luY2x1ZGUgIkNsaXBib2FyZC5oIgogI2luY2x1ZGUgIkN1cnNvci5oIgogI2luY2x1ZGUg
IkZsb2F0UG9pbnQuaCIKICNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKQEAgLTQzLDEyICs0
NSw2IEBADQogI2luY2x1ZGUgIldDRGF0YU9iamVjdC5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVu
dGVkLmgiCiAKLSNpZiBPUyhXSU5DRSkKLSNpbmNsdWRlICJDbGlwYm9hcmQuaCIKLSNlbHNlCi0j
aW5jbHVkZSAiQ2xpcGJvYXJkV2luLmgiCi0jZW5kaWYKLQogbmFtZXNwYWNlIFdlYkNvcmUgewog
CiAjaWYgRU5BQkxFKERSQUdfU1VQUE9SVCkKQEAgLTEwMSw5ICs5Nyw3IEBADQogI2lmIE9TKFdJ
TkNFKQogICAgIHJldHVybiAwOwogI2Vsc2UKLSAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBkYXRh
T2JqZWN0OwotICAgIFdDRGF0YU9iamVjdDo6Y3JlYXRlSW5zdGFuY2UoJmRhdGFPYmplY3QpOwot
ICAgIHJldHVybiBDbGlwYm9hcmRXaW46OmNyZWF0ZShDbGlwYm9hcmQ6OkRyYWdBbmREcm9wLCBk
YXRhT2JqZWN0LmdldCgpLCBDbGlwYm9hcmRXcml0YWJsZSwgbV9mcmFtZSk7CisgICAgcmV0dXJu
IENsaXBib2FyZDo6Y3JlYXRlRm9yRHJhZ0FuZERyb3AoKTsKICNlbmRpZgogfQogI2VuZGlmCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgNCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgJKHJldmlzaW9uIDE1MDYyOSkN
CisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgJKHdvcmtpbmcgY29weSkN
CkBAIC0zOCw2ICszOCw5IEBADQogI2VuZGlmCiAKICNpZiBQTEFURk9STShXSU4pCisjaW5jbHVk
ZSA8V2ViQ29yZS9DT01QdHIuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1dDRGF0YU9iamVjdC5oPgor
I2luY2x1ZGUgPG9iamlkbC5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KIHR5cGVkZWYgc3RydWN0
IEhXTkRfXyogSFdORDsKICNlbmRpZgpAQCAtNjQsNiArNjcsNyBAQA0KIGNsYXNzIENsaXBib2Fy
ZDsKIGNsYXNzIERvY3VtZW50RnJhZ21lbnQ7CiBjbGFzcyBEcmFnRGF0YTsKK2NsYXNzIEVsZW1l
bnQ7CiBjbGFzcyBGcmFtZTsKIGNsYXNzIEhpdFRlc3RSZXN1bHQ7CiBjbGFzcyBLVVJMOwpAQCAt
MTAwLDYgKzEwNCwxMiBAQA0KICAgICBQYXNzUmVmUHRyPERhdGFPYmplY3RHdGs+IGRhdGFPYmpl
Y3QoKSBjb25zdDsKICNlbmRpZgogCisjaWYgUExBVEZPUk0oV0lOKQorICAgIGV4cGxpY2l0IFBh
c3RlYm9hcmQoSURhdGFPYmplY3QqKTsKKyAgICBleHBsaWNpdCBQYXN0ZWJvYXJkKFdDRGF0YU9i
amVjdCopOworICAgIGV4cGxpY2l0IFBhc3RlYm9hcmQoY29uc3QgRHJhZ0RhdGFNYXAmKTsKKyNl
bmRpZgorCiAgICAgLy8gRGVwcmVjYXRlZC4gVXNlIGNyZWF0ZUZvckNvcHlBbmRQYXN0ZSBpbnN0
ZWFkLgogICAgIHN0YXRpYyBQYXN0ZWJvYXJkKiBnZW5lcmFsUGFzdGVib2FyZCgpOwogCkBAIC0x
NTMsNiArMTYzLDE0IEBADQogICAgIHZvaWQgc2V0U2VsZWN0aW9uTW9kZShib29sKSB7IH0KICNl
bmRpZgogCisjaWYgUExBVEZPUk0oV0lOKQorICAgIENPTVB0cjxJRGF0YU9iamVjdD4gZGF0YU9i
amVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YU9iamVjdDsgfQorICAgIHZvaWQgc2V0RXh0ZXJu
YWxEYXRhT2JqZWN0KElEYXRhT2JqZWN0Kik7CisgICAgdm9pZCB3cml0ZVVSTFRvV3JpdGFibGVE
YXRhT2JqZWN0KGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmKTsKKyAgICBDT01QdHI8V0NEYXRh
T2JqZWN0PiB3cml0YWJsZURhdGFPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX3dyaXRhYmxlRGF0
YU9iamVjdDsgfQorICAgIHZvaWQgd3JpdGVJbWFnZVRvRGF0YU9iamVjdChFbGVtZW50KiwgY29u
c3QgS1VSTCYpOworI2VuZGlmCisKICNpZiBQTEFURk9STShHVEspCiAgICAgflBhc3RlYm9hcmQo
KTsKICNlbmRpZgpAQCAtMTc1LDcgKzE5MywxNSBAQA0KICNlbmRpZgogCiAjaWYgUExBVEZPUk0o
V0lOKQorICAgIHZvaWQgZmluaXNoQ3JlYXRpbmdQYXN0ZWJvYXJkKCk7CisgICAgdm9pZCB3cml0
ZVJhbmdlVG9EYXRhT2JqZWN0KFJhbmdlKiwgRnJhbWUqKTsKKyAgICB2b2lkIHdyaXRlVVJMVG9E
YXRhT2JqZWN0KGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmLCBGcmFtZSopOworICAgIHZvaWQg
d3JpdGVQbGFpblRleHRUb0RhdGFPYmplY3QoY29uc3QgU3RyaW5nJiwgU21hcnRSZXBsYWNlT3B0
aW9uKTsKKwogICAgIEhXTkQgbV9vd25lcjsKKyAgICBDT01QdHI8SURhdGFPYmplY3Q+IG1fZGF0
YU9iamVjdDsKKyAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBtX3dyaXRhYmxlRGF0YU9iamVjdDsK
KyAgICBEcmFnRGF0YU1hcCBtX2RyYWdEYXRhTWFwOwogI2VuZGlmCiAKICNpZiBQTEFURk9STShR
VCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4uY3BwDQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09DQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5j
cHAJKHJldmlzaW9uIDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xp
cGJvYXJkV2luLmNwcAkod29ya2luZyBjb3B5KQ0KQEAgLTEsNSArMSw2IEBADQogLyoKICAqIENv
cHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDEzIFh1ZXFpbmcgSHVhbmcgPGh1YW5neHVlcWluZ0BiYWlkdS5j
b20+CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI0LDY1NyArMjUsNDYgQEAN
CiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkNsaXBib2FyZFdpbi5oIgor
I2luY2x1ZGUgIkNsaXBib2FyZC5oIgogCiAjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKICNpbmNs
dWRlICJDbGlwYm9hcmRVdGlsaXRpZXNXaW4uaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgotI2lu
Y2x1ZGUgIkRyYWdEYXRhLmgiCi0jaW5jbHVkZSAiRWRpdG9yLmgiCiAjaW5jbHVkZSAiRWxlbWVu
dC5oIgotI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgotI2luY2x1ZGUgIkZpbGVMaXN0LmgiCiAj
aW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgotI2luY2x1ZGUgIkZy
YW1lVmlldy5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIkhUTUxQYXJzZXJJ
ZGlvbXMuaCIKLSNpbmNsdWRlICJJbWFnZS5oIgotI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnku
aCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNs
dWRlICJQYXN0ZWJvYXJkLmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCi0jaW5j
bHVkZSAiUmFuZ2UuaCIKLSNpbmNsdWRlICJSZW5kZXJJbWFnZS5oIgotI2luY2x1ZGUgIlJlc291
cmNlUmVzcG9uc2UuaCIKLSNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKLSNpbmNsdWRlICJXQ0Rh
dGFPYmplY3QuaCIKICNpbmNsdWRlICJtYXJrdXAuaCIKLSNpbmNsdWRlIDxzaGx3YXBpLmg+Ci0j
aW5jbHVkZSA8d2luaW5ldC5oPgotI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KLSNpbmNsdWRlIDx3
dGYvdGV4dC9DU3RyaW5nLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+Ci0jaW5j
bHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLS8vIFdl
IHByb3ZpZGUgdGhlIElFIGNsaXBib2FyZCB0eXBlcyAoVVJMIGFuZCBUZXh0KSwgYW5kIHRoZSBj
bGlwYm9hcmQgdHlwZXMgc3BlY2lmaWVkIGluIHRoZSBXSEFUV0cgV2ViIEFwcGxpY2F0aW9ucyAx
LjAgZHJhZnQKLS8vIHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3Vy
cmVudC13b3JrLyBTZWN0aW9uIDYuMy41LjMKLQotZW51bSBDbGlwYm9hcmREYXRhVHlwZSB7IENs
aXBib2FyZERhdGFUeXBlTm9uZSwgQ2xpcGJvYXJkRGF0YVR5cGVVUkwsIENsaXBib2FyZERhdGFU
eXBlVGV4dCwgQ2xpcGJvYXJkRGF0YVR5cGVUZXh0SFRNTCB9OwotCi1zdGF0aWMgQ2xpcGJvYXJk
RGF0YVR5cGUgY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZShjb25zdCBTdHJpbmcmIHR5cGUpCitE
cmFnSW1hZ2VSZWYgQ2xpcGJvYXJkOjpjcmVhdGVEcmFnSW1hZ2UoSW50UG9pbnQmIGRyYWdMb2Nh
dGlvbikgY29uc3QKIHsKLSAgICBTdHJpbmcgcVR5cGUgPSB0eXBlLnN0cmlwV2hpdGVTcGFjZSgp
Lmxvd2VyKCk7Ci0KLSAgICAvLyB0d28gc3BlY2lhbCBjYXNlcyBmb3IgSUUgY29tcGF0aWJpbGl0
eQotICAgIGlmIChxVHlwZSA9PSAidGV4dCIgfHwgcVR5cGUgPT0gInRleHQvcGxhaW4iIHx8IHFU
eXBlLnN0YXJ0c1dpdGgoInRleHQvcGxhaW47IikpCi0gICAgICAgIHJldHVybiBDbGlwYm9hcmRE
YXRhVHlwZVRleHQ7Ci0gICAgaWYgKHFUeXBlID09ICJ1cmwiIHx8IHFUeXBlID09ICJ0ZXh0L3Vy
aS1saXN0IikKLSAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVVJMOwotICAgIGlmIChx
VHlwZSA9PSAidGV4dC9odG1sIikKLSAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVGV4
dEhUTUw7Ci0KLSAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVOb25lOwotfQotCi0jaWYgIU9T
KFdJTkNFKQotc3RhdGljIGlubGluZSB2b2lkIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoUFdT
VFIgcHN6LCBzaXplX3QgbGVuZ3RoKQotewotICAgIHNpemVfdCB3cml0ZVRvID0gMDsKLSAgICBz
aXplX3QgcmVhZEZyb20gPSAwOwotICAgIHdoaWxlIChyZWFkRnJvbSA8IGxlbmd0aCkgewotICAg
ICAgICBVSU5UIHR5cGUgPSBQYXRoR2V0Q2hhclR5cGUocHN6W3JlYWRGcm9tXSk7Ci0gICAgICAg
IGlmICghcHN6W3JlYWRGcm9tXSB8fCB0eXBlICYgKEdDVF9MRk5DSEFSIHwgR0NUX1NIT1JUQ0hB
UikpCi0gICAgICAgICAgICBwc3pbd3JpdGVUbysrXSA9IHBzeltyZWFkRnJvbV07Ci0KLSAgICAg
ICAgcmVhZEZyb20rKzsKLSAgICB9Ci0gICAgcHN6W3dyaXRlVG9dID0gMDsKLX0KLSNlbmRpZgot
Ci1zdGF0aWMgU3RyaW5nIGZpbGVzeXN0ZW1QYXRoRnJvbVVybE9yVGl0bGUoY29uc3QgU3RyaW5n
JiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUsIGNvbnN0IFVDaGFyKiBleHRlbnNpb24sIGJvb2wg
aXNMaW5rKQotewotI2lmIE9TKFdJTkNFKQotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0
dXJuIFN0cmluZygpOwotI2Vsc2UKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGZzUGF0aE1heExl
bmd0aEV4Y2x1ZGluZ051bGxUZXJtaW5hdG9yID0gTUFYX1BBVEggLSAxOwotICAgIGJvb2wgdXNl
ZFVSTCA9IGZhbHNlOwotICAgIFdDSEFSIGZzUGF0aEJ1ZmZlcltNQVhfUEFUSF07Ci0gICAgZnNQ
YXRoQnVmZmVyWzBdID0gMDsKLSAgICBpbnQgZXh0ZW5zaW9uTGVuID0gZXh0ZW5zaW9uID8gbHN0
cmxlbihleHRlbnNpb24pIDogMDsKLSAgICBpbnQgZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0
ZW5zaW9uID0gZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nTnVsbFRlcm1pbmF0b3IgLSBleHRlbnNp
b25MZW47Ci0KLSAgICBpZiAoIXRpdGxlLmlzRW1wdHkoKSkgewotICAgICAgICBzaXplX3QgbGVu
ID0gbWluPHNpemVfdD4odGl0bGUubGVuZ3RoKCksIGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4
dGVuc2lvbik7Ci0gICAgICAgIENvcHlNZW1vcnkoZnNQYXRoQnVmZmVyLCB0aXRsZS5jaGFyYWN0
ZXJzKCksIGxlbiAqIHNpemVvZihVQ2hhcikpOwotICAgICAgICBmc1BhdGhCdWZmZXJbbGVuXSA9
IDA7Ci0gICAgICAgIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoZnNQYXRoQnVmZmVyLCBsZW4p
OwotICAgIH0KLQotICAgIGlmICghbHN0cmxlbihmc1BhdGhCdWZmZXIpKSB7Ci0gICAgICAgIEtV
Ukwga3VybChQYXJzZWRVUkxTdHJpbmcsIHVybCk7Ci0gICAgICAgIHVzZWRVUkwgPSB0cnVlOwot
ICAgICAgICAvLyBUaGUgZmlsZW5hbWUgZm9yIGFueSBjb250ZW50IGJhc2VkIGRyYWcgb3IgZmls
ZSB1cmwgc2hvdWxkIGJlIHRoZSBsYXN0IGVsZW1lbnQgb2YgCi0gICAgICAgIC8vIHRoZSBwYXRo
LiAgSWYgd2UgY2FuJ3QgZmluZCBpdCwgb3Igd2UncmUgY29taW5nIHVwIHdpdGggdGhlIG5hbWUg
Zm9yIGEgbGluawotICAgICAgICAvLyB3ZSBqdXN0IHVzZSB0aGUgZW50aXJlIHVybC4KLSAgICAg
ICAgRFdPUkQgbGVuID0gZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0ZW5zaW9uOwotICAgICAg
ICBTdHJpbmcgbGFzdENvbXBvbmVudCA9IGt1cmwubGFzdFBhdGhDb21wb25lbnQoKTsKLSAgICAg
ICAgaWYgKGt1cmwuaXNMb2NhbEZpbGUoKSB8fCAoIWlzTGluayAmJiAhbGFzdENvbXBvbmVudC5p
c0VtcHR5KCkpKSB7Ci0gICAgICAgICAgICBsZW4gPSBtaW48RFdPUkQ+KGZzUGF0aE1heExlbmd0
aEV4Y2x1ZGluZ0V4dGVuc2lvbiwgbGFzdENvbXBvbmVudC5sZW5ndGgoKSk7Ci0gICAgICAgICAg
ICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgbGFzdENvbXBvbmVudC5jaGFyYWN0ZXJzKCksIGxl
biAqIHNpemVvZihVQ2hhcikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVuID0g
bWluPERXT1JEPihmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24sIHVybC5sZW5ndGgo
KSk7Ci0gICAgICAgICAgICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgdXJsLmNoYXJhY3RlcnMo
KSwgbGVuICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZnNQYXRoQnVmZmVy
W2xlbl0gPSAwOwotICAgICAgICBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKGZzUGF0aEJ1ZmZl
ciwgbGVuKTsKLSAgICB9Ci0KLSAgICBpZiAoIWV4dGVuc2lvbikKLSAgICAgICAgcmV0dXJuIFN0
cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+KGZzUGF0aEJ1ZmZlcikpOwotCi0gICAgaWYgKCFpc0xp
bmsgJiYgdXNlZFVSTCkgewotICAgICAgICBQYXRoUmVuYW1lRXh0ZW5zaW9uKGZzUGF0aEJ1ZmZl
ciwgZXh0ZW5zaW9uKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+
KGZzUGF0aEJ1ZmZlcikpOwotICAgIH0KLQotICAgIHJldHVybiBtYWtlU3RyaW5nKHN0YXRpY19j
YXN0PGNvbnN0IFVDaGFyKj4oZnNQYXRoQnVmZmVyKSwgZXh0ZW5zaW9uKTsKLSNlbmRpZgotfQot
Ci1zdGF0aWMgSEdMT0JBTCBjcmVhdGVHbG9iYWxJbWFnZUZpbGVDb250ZW50KFNoYXJlZEJ1ZmZl
ciogZGF0YSkKLXsKLSAgICBIR0xPQkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdQVFIsIGRhdGEt
PnNpemUoKSk7Ci0gICAgaWYgKCFtZW1PYmopIAotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNo
YXIqIGZpbGVDb250ZW50cyA9IChQU1RSKUdsb2JhbExvY2sobWVtT2JqKTsKLQotICAgIENvcHlN
ZW1vcnkoZmlsZUNvbnRlbnRzLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUoKSk7Ci0gICAgCi0g
ICAgR2xvYmFsVW5sb2NrKG1lbU9iaik7Ci0gICAgCi0gICAgcmV0dXJuIG1lbU9iajsKLX0KLQot
c3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSERyb3BDb250ZW50KGNvbnN0IEtVUkwmIHVybCwg
U3RyaW5nJiBmaWxlTmFtZSwgU2hhcmVkQnVmZmVyKiBkYXRhKQotewotICAgIGlmIChmaWxlTmFt
ZS5pc0VtcHR5KCkgfHwgIWRhdGEpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgV0NIQVIgZmls
ZVBhdGhbTUFYX1BBVEhdOwotCi0gICAgaWYgKHVybC5pc0xvY2FsRmlsZSgpKSB7Ci0gICAgICAg
IFN0cmluZyBsb2NhbFBhdGggPSBkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXModXJsLnBhdGgoKSk7
Ci0gICAgICAgIC8vIHdpbmRvd3MgZG9lcyBub3QgZW5qb3kgYSBsZWFkaW5nIHNsYXNoIG9uIHBh
dGhzCi0gICAgICAgIGlmIChsb2NhbFBhdGhbMF0gPT0gJy8nKQotICAgICAgICAgICAgbG9jYWxQ
YXRoID0gbG9jYWxQYXRoLnN1YnN0cmluZygxKTsKLSAgICAgICAgTFBDV1NUUiBsb2NhbFBhdGhT
dHIgPSBsb2NhbFBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKTsKLSAgICAgICAg
aWYgKHdjc2xlbihsb2NhbFBhdGhTdHIpICsgMSA8IE1BWF9QQVRIKQotICAgICAgICAgICAgd2Nz
Y3B5X3MoZmlsZVBhdGgsIE1BWF9QQVRILCBsb2NhbFBhdGhTdHIpOwotICAgICAgICBlbHNlCi0g
ICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotI2lmIE9TKFdJTkNFKQotICAgICAg
ICBub3RJbXBsZW1lbnRlZCgpOwotICAgICAgICByZXR1cm4gMDsKLSNlbHNlCi0gICAgICAgIFdD
SEFSIHRlbXBQYXRoW01BWF9QQVRIXTsKLSAgICAgICAgV0NIQVIgZXh0ZW5zaW9uW01BWF9QQVRI
XTsKLSAgICAgICAgaWYgKCE6OkdldFRlbXBQYXRoKFdURl9BUlJBWV9MRU5HVEgodGVtcFBhdGgp
LCB0ZW1wUGF0aCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCE6OlBhdGhB
cHBlbmQodGVtcFBhdGgsIGZpbGVOYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkp
KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIExQQ1dTVFIgZm91bmRFeHRlbnNpb24g
PSA6OlBhdGhGaW5kRXh0ZW5zaW9uKHRlbXBQYXRoKTsKLSAgICAgICAgaWYgKGZvdW5kRXh0ZW5z
aW9uKSB7Ci0gICAgICAgICAgICBpZiAod2NzY3B5X3MoZXh0ZW5zaW9uLCBNQVhfUEFUSCwgZm91
bmRFeHRlbnNpb24pKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IGVsc2UK
LSAgICAgICAgICAgICpleHRlbnNpb24gPSAwOwotICAgICAgICA6OlBhdGhSZW1vdmVFeHRlbnNp
b24odGVtcFBhdGgpOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwOyBpKyspIHsK
LSAgICAgICAgICAgIGlmIChzd3ByaW50Zl9zKGZpbGVQYXRoLCBNQVhfUEFUSCwgVEVYVCgiJXMt
JWQlcyIpLCB0ZW1wUGF0aCwgaSwgZXh0ZW5zaW9uKSA9PSAtMSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKLSAgICAgICAgICAgIGlmICghOjpQYXRoRmlsZUV4aXN0cyhmaWxlUGF0aCkpCi0g
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgSEFORExFIHRlbXBGaWxl
SGFuZGxlID0gQ3JlYXRlRmlsZShmaWxlUGF0aCwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklU
RSwgMCwgMCwgQ1JFQVRFX0FMV0FZUywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCAwKTsKLSAgICAg
ICAgaWYgKHRlbXBGaWxlSGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgICAgICAg
ICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgdG8gdGhpcyB0ZW1wIGZp
bGUuCi0gICAgICAgIERXT1JEIHdyaXR0ZW47Ci0gICAgICAgIEJPT0wgdGVtcFdyaXRlU3VjY2Vl
ZGVkID0gV3JpdGVGaWxlKHRlbXBGaWxlSGFuZGxlLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUo
KSwgJndyaXR0ZW4sIDApOwotICAgICAgICBDbG9zZUhhbmRsZSh0ZW1wRmlsZUhhbmRsZSk7Ci0g
ICAgICAgIGlmICghdGVtcFdyaXRlU3VjY2VlZGVkKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0j
ZW5kaWYKLSAgICB9Ci0KLSAgICBTSVpFX1QgZHJvcEZpbGVzU2l6ZSA9IHNpemVvZihEUk9QRklM
RVMpICsgKHNpemVvZihXQ0hBUikgKiAod2NzbGVuKGZpbGVQYXRoKSArIDIpKTsKLSAgICBIR0xP
QkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdITkQgfCBHTUVNX1NIQVJFLCBkcm9wRmlsZXNTaXpl
KTsKLSAgICBpZiAoIW1lbU9iaikgCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgRFJPUEZJTEVT
KiBkcm9wRmlsZXMgPSAoRFJPUEZJTEVTKikgR2xvYmFsTG9jayhtZW1PYmopOwotICAgIGRyb3BG
aWxlcy0+cEZpbGVzID0gc2l6ZW9mKERST1BGSUxFUyk7Ci0gICAgZHJvcEZpbGVzLT5mV2lkZSA9
IFRSVUU7Ci0gICAgd2NzY3B5KChMUFdTVFIpKGRyb3BGaWxlcyArIDEpLCBmaWxlUGF0aCk7ICAg
IAotICAgIEdsb2JhbFVubG9jayhtZW1PYmopOwotICAgIAotICAgIHJldHVybiBtZW1PYmo7Ci19
Ci0KLXN0YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmlsZURlc2NyaXB0b3IoY29uc3Qg
U3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUsIENhY2hlZEltYWdlKiBpbWFnZSkKLXsK
LSAgICBBU1NFUlRfQVJHKGltYWdlLCBpbWFnZSk7Ci0gICAgQVNTRVJUKGltYWdlLT5pbWFnZSgp
LT5kYXRhKCkpOwotCi0gICAgSFJFU1VMVCBociA9IFNfT0s7Ci0gICAgSEdMT0JBTCBtZW1PYmog
PSAwOwotICAgIFN0cmluZyBmc1BhdGg7Ci0gICAgbWVtT2JqID0gR2xvYmFsQWxsb2MoR1BUUiwg
c2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKLSAgICBpZiAoIW1lbU9iaikKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICBGSUxFR1JPVVBERVNDUklQVE9SKiBmZ2QgPSAoRklMRUdST1VQREVT
Q1JJUFRPUiopR2xvYmFsTG9jayhtZW1PYmopOwotICAgIG1lbXNldChmZ2QsIDAsIHNpemVvZihG
SUxFR1JPVVBERVNDUklQVE9SKSk7Ci0gICAgZmdkLT5jSXRlbXMgPSAxOwotICAgIGZnZC0+Zmdk
WzBdLmR3RmxhZ3MgPSBGRF9GSUxFU0laRTsKLSAgICBmZ2QtPmZnZFswXS5uRmlsZVNpemVMb3cg
PSBpbWFnZS0+aW1hZ2UoKS0+ZGF0YSgpLT5zaXplKCk7Ci0gICAgCi0gICAgY29uc3QgU3RyaW5n
JiBwcmVmZXJyZWRUaXRsZSA9IHRpdGxlLmlzRW1wdHkoKSA/IGltYWdlLT5yZXNwb25zZSgpLnN1
Z2dlc3RlZEZpbGVuYW1lKCkgOiB0aXRsZTsKLSAgICBTdHJpbmcgZXh0ZW5zaW9uID0gaW1hZ2Ut
PmltYWdlKCktPmZpbGVuYW1lRXh0ZW5zaW9uKCk7Ci0gICAgaWYgKGV4dGVuc2lvbi5pc0VtcHR5
KCkpIHsKLSAgICAgICAgLy8gRG8gbm90IGNvbnRpbnVlIHByb2Nlc3NpbmcgaW4gdGhlIHJhcmUg
YW5kIHVudXN1YWwgY2FzZSB3aGVyZSBhIGRlY29kZWQgaW1hZ2UgaXMgbm90IGFibGUgCi0gICAg
ICAgIC8vIHRvIHByb3ZpZGUgYSBmaWxlbmFtZSBleHRlbnNpb24uIFNvbWV0aGluZyB0cmlja3kg
KGxpa2UgYSBiYWl0LW4tc3dpdGNoKSBpcyBnb2luZyBvbgotICAgICAgICByZXR1cm4gMDsKLSAg
ICB9Ci0gICAgZXh0ZW5zaW9uLmluc2VydCgiLiIsIDApOwotICAgIGZzUGF0aCA9IGZpbGVzeXN0
ZW1QYXRoRnJvbVVybE9yVGl0bGUodXJsLCBwcmVmZXJyZWRUaXRsZSwgZXh0ZW5zaW9uLmNoYXJh
Y3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIGZhbHNlKTsKLQotICAgIGlmIChmc1BhdGgubGVu
Z3RoKCkgPD0gMCkgewotICAgICAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKLSAgICAgICAgR2xv
YmFsRnJlZShtZW1PYmopOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpbnQgbWF4
U2l6ZSA9IG1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgoZmdkLT5mZ2RbMF0u
Y0ZpbGVOYW1lKSk7Ci0gICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmlsZU5hbWUsIChMUENX
U1RSKWZzUGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKLSAgICBH
bG9iYWxVbmxvY2sobWVtT2JqKTsKLSAgICAKLSAgICByZXR1cm4gbWVtT2JqOwotfQotCi0KLS8v
IHdyaXRlRmlsZVRvRGF0YU9iamVjdCB0YWtlcyBvd25lcnNoaXAgb2YgZmlsZURlc2NyaXB0b3Ig
YW5kIGZpbGVDb250ZW50Ci1zdGF0aWMgSFJFU1VMVCB3cml0ZUZpbGVUb0RhdGFPYmplY3QoSURh
dGFPYmplY3QqIGRhdGFPYmplY3QsIEhHTE9CQUwgZmlsZURlc2NyaXB0b3IsIEhHTE9CQUwgZmls
ZUNvbnRlbnQsIEhHTE9CQUwgaERyb3BDb250ZW50KQotewotICAgIEhSRVNVTFQgaHIgPSBTX09L
OwotICAgIEZPUk1BVEVUQyogZmU7Ci0gICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAgICBt
ZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOwotCi0gICAgaWYgKCFmaWxlRGVzY3JpcHRvciB8
fCAhZmlsZUNvbnRlbnQpCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgIC8vIERlc2NyaXB0b3IK
LSAgICBmZSA9IGZpbGVEZXNjcmlwdG9yRm9ybWF0KCk7Ci0KLSAgICBtZWRpdW0uaEdsb2JhbCA9
IGZpbGVEZXNjcmlwdG9yOwotCi0gICAgaWYgKEZBSUxFRChociA9IGRhdGFPYmplY3QtPlNldERh
dGEoZmUsICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgZ290byBleGl0OwotCi0gICAgLy8gQ29u
dGVudHMKLSAgICBmZSA9IGZpbGVDb250ZW50Rm9ybWF0WmVybygpOwotICAgIG1lZGl1bS5oR2xv
YmFsID0gZmlsZUNvbnRlbnQ7Ci0gICAgaWYgKEZBSUxFRChociA9IGRhdGFPYmplY3QtPlNldERh
dGEoZmUsICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgZ290byBleGl0OwotCi0jaWYgVVNFKENG
KQotICAgIC8vIEhEUk9QCi0gICAgaWYgKGhEcm9wQ29udGVudCkgewotICAgICAgICBtZWRpdW0u
aEdsb2JhbCA9IGhEcm9wQ29udGVudDsKLSAgICAgICAgaHIgPSBkYXRhT2JqZWN0LT5TZXREYXRh
KGNmSERyb3BGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSk7Ci0gICAgfQotI2VuZGlmCi0KLWV4aXQ6
Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgaWYgKGZpbGVEZXNjcmlwdG9yKQotICAg
ICAgICAgICAgR2xvYmFsRnJlZShmaWxlRGVzY3JpcHRvcik7Ci0gICAgICAgIGlmIChmaWxlQ29u
dGVudCkKLSAgICAgICAgICAgIEdsb2JhbEZyZWUoZmlsZUNvbnRlbnQpOwotICAgICAgICBpZiAo
aERyb3BDb250ZW50KQotICAgICAgICAgICAgR2xvYmFsRnJlZShoRHJvcENvbnRlbnQpOwotICAg
IH0KLSAgICByZXR1cm4gaHI7Ci19Ci0KLVBhc3NSZWZQdHI8Q2xpcGJvYXJkPiBDbGlwYm9hcmQ6
OmNyZWF0ZShDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBEcmFnRGF0YSogZHJhZ0RhdGEs
IEZyYW1lKiBmcmFtZSkKLXsKLSAgICBpZiAoZHJhZ0RhdGEtPnBsYXRmb3JtRGF0YSgpKQotICAg
ICAgICByZXR1cm4gQ2xpcGJvYXJkV2luOjpjcmVhdGUoRHJhZ0FuZERyb3AsIGRyYWdEYXRhLT5w
bGF0Zm9ybURhdGEoKSwgcG9saWN5LCBmcmFtZSk7Ci0gICAgcmV0dXJuIENsaXBib2FyZFdpbjo6
Y3JlYXRlKERyYWdBbmREcm9wLCBkcmFnRGF0YS0+ZHJhZ0RhdGFNYXAoKSwgcG9saWN5LCBmcmFt
ZSk7Ci19Ci0KLUNsaXBib2FyZFdpbjo6Q2xpcGJvYXJkV2luKENsaXBib2FyZFR5cGUgY2xpcGJv
YXJkVHlwZSwgSURhdGFPYmplY3QqIGRhdGFPYmplY3QsIENsaXBib2FyZEFjY2Vzc1BvbGljeSBw
b2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAgICA6IENsaXBib2FyZChwb2xpY3ksIGNsaXBib2FyZFR5
cGUpCi0gICAgLCBtX2RhdGFPYmplY3QoZGF0YU9iamVjdCkKLSAgICAsIG1fd3JpdGFibGVEYXRh
T2JqZWN0KDApCi0gICAgLCBtX2ZyYW1lKGZyYW1lKQotewotfQotCi1DbGlwYm9hcmRXaW46OkNs
aXBib2FyZFdpbihDbGlwYm9hcmRUeXBlIGNsaXBib2FyZFR5cGUsIFdDRGF0YU9iamVjdCogZGF0
YU9iamVjdCwgQ2xpcGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwgRnJhbWUqIGZyYW1lKQotICAg
IDogQ2xpcGJvYXJkKHBvbGljeSwgY2xpcGJvYXJkVHlwZSkKLSAgICAsIG1fZGF0YU9iamVjdChk
YXRhT2JqZWN0KQotICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoZGF0YU9iamVjdCkKLSAgICAs
IG1fZnJhbWUoZnJhbWUpCi17Ci19Ci0KLUNsaXBib2FyZFdpbjo6Q2xpcGJvYXJkV2luKENsaXBi
b2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgY29uc3QgRHJhZ0RhdGFNYXAmIGRhdGFNYXAsIENsaXBi
b2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAgICA6IENsaXBib2FyZChw
b2xpY3ksIGNsaXBib2FyZFR5cGUpCi0gICAgLCBtX2RhdGFPYmplY3QoMCkKLSAgICAsIG1fd3Jp
dGFibGVEYXRhT2JqZWN0KDApCi0gICAgLCBtX2ZyYW1lKGZyYW1lKQotICAgICwgbV9kcmFnRGF0
YU1hcChkYXRhTWFwKQotewotfQotCi1DbGlwYm9hcmRXaW46On5DbGlwYm9hcmRXaW4oKQotewot
ICAgIGlmIChtX2RyYWdJbWFnZSkKLSAgICAgICAgbV9kcmFnSW1hZ2UtPnJlbW92ZUNsaWVudCh0
aGlzKTsKLX0KLQotc3RhdGljIGJvb2wgd3JpdGVVUkwoV0NEYXRhT2JqZWN0ICpkYXRhLCBjb25z
dCBLVVJMJiB1cmwsIFN0cmluZyB0aXRsZSwgYm9vbCB3aXRoUGxhaW5UZXh0LCBib29sIHdpdGhI
VE1MKQotewotICAgIEFTU0VSVChkYXRhKTsKLQotICAgIGlmICh1cmwuaXNFbXB0eSgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKHRpdGxlLmlzRW1wdHkoKSkgewotICAg
ICAgICB0aXRsZSA9IHVybC5sYXN0UGF0aENvbXBvbmVudCgpOwotICAgICAgICBpZiAodGl0bGUu
aXNFbXB0eSgpKQotICAgICAgICAgICAgdGl0bGUgPSB1cmwuaG9zdCgpOwotICAgIH0KLQotICAg
IFNUR01FRElVTSBtZWRpdW0gPSB7MH07Ci0gICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JB
TDsKLQotICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YSh1cmwsIHRpdGxlKTsK
LSAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJ
TEVEKGRhdGEtPlNldERhdGEodXJsV0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAg
IDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7Ci0gICAgZWxzZQotICAgICAgICBzdWNjZXNz
ID0gdHJ1ZTsKLQotICAgIGlmICh3aXRoSFRNTCkgewotICAgICAgICBWZWN0b3I8Y2hhcj4gY2Zo
dG1sRGF0YTsKLSAgICAgICAgbWFya3VwVG9DRkhUTUwodXJsVG9NYXJrdXAodXJsLCB0aXRsZSks
ICIiLCBjZmh0bWxEYXRhKTsKLSAgICAgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxE
YXRhKGNmaHRtbERhdGEpOwotICAgICAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKGRh
dGEtPlNldERhdGEoaHRtbEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAgICAgICA6
Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBz
dWNjZXNzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAod2l0aFBsYWluVGV4dCkgewotICAgICAg
ICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEodXJsLnN0cmluZygpKTsKLSAgICAg
ICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChkYXRhLT5TZXREYXRhKHBsYWluVGV4dFdG
b3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1
bS5oR2xvYmFsKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjpjbGVh
ckRhdGEoY29uc3QgU3RyaW5nJiB0eXBlKQotewotICAgIC8vIEZJWE1FOiBOZWVkIHRvIGJlIGFi
bGUgdG8gd3JpdGUgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQgPHJkYXI6Ly9wcm9ibGVtLzUwMTU5
NDE+Ci0gICAgQVNTRVJUKGlzRm9yRHJhZ0FuZERyb3AoKSk7Ci0gICAgaWYgKCFjYW5Xcml0ZURh
dGEoKSB8fCAhbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgIHJldHVybjsKLQotICAgIENs
aXBib2FyZERhdGFUeXBlIGRhdGFUeXBlID0gY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZSh0eXBl
KTsKLQotICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVSTCkgewotICAgICAg
ICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJEYXRhKHVybFdGb3JtYXQoKS0+Y2ZGb3JtYXQp
OwotICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJEYXRhKHVybEZvcm1hdCgpLT5j
ZkZvcm1hdCk7Ci0gICAgfQotICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRl
eHQpIHsKLSAgICAgICAgbV93cml0YWJsZURhdGFPYmplY3QtPmNsZWFyRGF0YShwbGFpblRleHRG
b3JtYXQoKS0+Y2ZGb3JtYXQpOwotICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJE
YXRhKHBsYWluVGV4dFdGb3JtYXQoKS0+Y2ZGb3JtYXQpOwotICAgIH0KLQotfQotCi12b2lkIENs
aXBib2FyZFdpbjo6Y2xlYXJEYXRhKCkKLXsKLSAgICAvLyBGSVhNRTogTmVlZCB0byBiZSBhYmxl
IHRvIHdyaXRlIHRvIHRoZSBzeXN0ZW0gY2xpcGJvYXJkIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQx
PgotICAgIEFTU0VSVChpc0ZvckRyYWdBbmREcm9wKCkpOwotICAgIGlmICghY2FuV3JpdGVEYXRh
KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBtX3dyaXRhYmxlRGF0YU9iamVjdCA9IDA7
Ci0gICAgV0NEYXRhT2JqZWN0OjpjcmVhdGVJbnN0YW5jZSgmbV93cml0YWJsZURhdGFPYmplY3Qp
OwotICAgIG1fZGF0YU9iamVjdCA9IG1fd3JpdGFibGVEYXRhT2JqZWN0OwotfQotCi1TdHJpbmcg
Q2xpcGJvYXJkV2luOjpnZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSkgY29uc3QKLXsgICAgIAot
ICAgIGlmICghY2FuUmVhZERhdGEoKSB8fCAoIW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFw
LmlzRW1wdHkoKSkpCi0gICAgICAgIHJldHVybiAiIjsKLQotICAgIENsaXBib2FyZERhdGFUeXBl
IGRhdGFUeXBlID0gY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZSh0eXBlKTsKLSAgICBpZiAoZGF0
YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KQotICAgICAgICByZXR1cm4gbV9kYXRhT2Jq
ZWN0ID8gZ2V0UGxhaW5UZXh0KG1fZGF0YU9iamVjdC5nZXQoKSkgOiBnZXRQbGFpblRleHQoJm1f
ZHJhZ0RhdGFNYXApOwotICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVSTCkK
LSAgICAgICAgcmV0dXJuIG1fZGF0YU9iamVjdCA/IGdldFVSTChtX2RhdGFPYmplY3QuZ2V0KCks
IERyYWdEYXRhOjpEb05vdENvbnZlcnRGaWxlbmFtZXMpIDogZ2V0VVJMKCZtX2RyYWdEYXRhTWFw
LCBEcmFnRGF0YTo6RG9Ob3RDb252ZXJ0RmlsZW5hbWVzKTsKLSAgICBlbHNlIGlmIChkYXRhVHlw
ZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MKSB7Ci0gICAgICAgIFN0cmluZyBkYXRhID0g
bV9kYXRhT2JqZWN0ID8gZ2V0VGV4dEhUTUwobV9kYXRhT2JqZWN0LmdldCgpKSA6IGdldFRleHRI
VE1MKCZtX2RyYWdEYXRhTWFwKTsKLSAgICAgICAgaWYgKCFkYXRhLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgIHJldHVybiBkYXRhOwotICAgICAgICByZXR1cm4gbV9kYXRhT2JqZWN0ID8gZ2V0Q0ZI
VE1MKG1fZGF0YU9iamVjdC5nZXQoKSkgOiBnZXRDRkhUTUwoJm1fZHJhZ0RhdGFNYXApOwotICAg
IH0KLSAgICAKLSAgICByZXR1cm4gIiI7Ci19Ci0KLWJvb2wgQ2xpcGJvYXJkV2luOjpzZXREYXRh
KGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBkYXRhKQotewotICAgIC8vIEZJWE1F
OiBOZWVkIHRvIGJlIGFibGUgdG8gd3JpdGUgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQgPHJkYXI6
Ly9wcm9ibGVtLzUwMTU5NDE+Ci0gICAgQVNTRVJUKGlzRm9yRHJhZ0FuZERyb3AoKSk7Ci0gICAg
aWYgKCFjYW5Xcml0ZURhdGEoKSB8fCAhbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIENsaXBib2FyZERhdGFUeXBlIHdpblR5cGUgPSBjbGlwYm9hcmRU
eXBlRnJvbU1JTUVUeXBlKHR5cGUpOwotCi0gICAgaWYgKHdpblR5cGUgPT0gQ2xpcGJvYXJkRGF0
YVR5cGVVUkwpCi0gICAgICAgIHJldHVybiBXZWJDb3JlOjp3cml0ZVVSTChtX3dyaXRhYmxlRGF0
YU9iamVjdC5nZXQoKSwgS1VSTChQYXJzZWRVUkxTdHJpbmcsIGRhdGEpLCBTdHJpbmcoKSwgZmFs
c2UsIHRydWUpOwotCi0gICAgaWYgKHdpblR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KSB7
Ci0gICAgICAgIFNUR01FRElVTSBtZWRpdW0gPSB7MH07Ci0gICAgICAgIG1lZGl1bS50eW1lZCA9
IFRZTUVEX0hHTE9CQUw7Ci0gICAgICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0
YShkYXRhKTsKLSAgICAgICAgaWYgKCFtZWRpdW0uaEdsb2JhbCkKLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgICAgICBpZiAoRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXRE
YXRhKHBsYWluVGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKSB7Ci0gICAgICAgICAgICA6
Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxz
ZTsKLX0KLQotc3RhdGljIHZvaWQgYWRkTWltZVR5cGVzRm9yRm9ybWF0KExpc3RIYXNoU2V0PFN0
cmluZz4mIHJlc3VsdHMsIGNvbnN0IEZPUk1BVEVUQyYgZm9ybWF0KQotewotICAgIC8vIFVSTCBh
bmQgVGV4dCBhcmUgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBJRSdzIG1vZGVsCi0g
ICAgaWYgKGZvcm1hdC5jZkZvcm1hdCA9PSB1cmxGb3JtYXQoKS0+Y2ZGb3JtYXQgfHwgZm9ybWF0
LmNmRm9ybWF0ID09IHVybFdGb3JtYXQoKS0+Y2ZGb3JtYXQpIHsKLSAgICAgICAgcmVzdWx0cy5h
ZGQoIlVSTCIpOwotICAgICAgICByZXN1bHRzLmFkZCgidGV4dC91cmktbGlzdCIpOwotICAgIH0K
LQotICAgIGlmIChmb3JtYXQuY2ZGb3JtYXQgPT0gcGxhaW5UZXh0V0Zvcm1hdCgpLT5jZkZvcm1h
dCB8fCBmb3JtYXQuY2ZGb3JtYXQgPT0gcGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0KSB7Ci0g
ICAgICAgIHJlc3VsdHMuYWRkKCJUZXh0Iik7Ci0gICAgICAgIHJlc3VsdHMuYWRkKCJ0ZXh0L3Bs
YWluIik7Ci0gICAgfQotfQotCi0vLyBleHRlbnNpb25zIGJleW9uZCBJRSdzIEFQSQotTGlzdEhh
c2hTZXQ8U3RyaW5nPiBDbGlwYm9hcmRXaW46OnR5cGVzKCkgY29uc3QKLXsgCi0gICAgTGlzdEhh
c2hTZXQ8U3RyaW5nPiByZXN1bHRzOwotICAgIGlmICghY2FuUmVhZFR5cGVzKCkpCi0gICAgICAg
IHJldHVybiByZXN1bHRzOwotCi0gICAgaWYgKCFtX2RhdGFPYmplY3QgJiYgbV9kcmFnRGF0YU1h
cC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiByZXN1bHRzOwotCi0gICAgaWYgKG1fZGF0YU9i
amVjdCkgewotICAgICAgICBDT01QdHI8SUVudW1GT1JNQVRFVEM+IGl0cjsKLQotICAgICAgICBp
ZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+RW51bUZvcm1hdEV0YyhEQVRBRElSX0dFVCwgJml0cikp
KQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0KLSAgICAgICAgaWYgKCFpdHIpCi0gICAg
ICAgICAgICByZXR1cm4gcmVzdWx0czsKLQotICAgICAgICBGT1JNQVRFVEMgZGF0YTsKLQotICAg
ICAgICAvLyBJRW51bUZPUk1BVEVUQzo6TmV4dCByZXR1cm5zIFNfRkFMU0UgaWYgdGhlcmUgYXJl
IG5vIG1vcmUgaXRlbXMuCi0gICAgICAgIHdoaWxlIChpdHItPk5leHQoMSwgJmRhdGEsIDApID09
IFNfT0spCi0gICAgICAgICAgICBhZGRNaW1lVHlwZXNGb3JGb3JtYXQocmVzdWx0cywgZGF0YSk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChEcmFnRGF0YU1hcDo6Y29uc3RfaXRlcmF0b3Ig
aXQgPSBtX2RyYWdEYXRhTWFwLmJlZ2luKCk7IGl0ICE9IG1fZHJhZ0RhdGFNYXAuZW5kKCk7ICsr
aXQpIHsKLSAgICAgICAgICAgIEZPUk1BVEVUQyBkYXRhOwotICAgICAgICAgICAgZGF0YS5jZkZv
cm1hdCA9ICgqaXQpLmtleTsKLSAgICAgICAgICAgIGFkZE1pbWVUeXBlc0ZvckZvcm1hdChyZXN1
bHRzLCBkYXRhKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHRzOwotfQot
Ci1QYXNzUmVmUHRyPEZpbGVMaXN0PiBDbGlwYm9hcmRXaW46OmZpbGVzKCkgY29uc3QKLXsKLSNp
ZiBVU0UoQ0YpCi0gICAgUmVmUHRyPEZpbGVMaXN0PiBmaWxlcyA9IEZpbGVMaXN0OjpjcmVhdGUo
KTsKLSAgICBpZiAoIWNhblJlYWREYXRhKCkpCi0gICAgICAgIHJldHVybiBmaWxlcy5yZWxlYXNl
KCk7Ci0KLSAgICBpZiAoIW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFwLmlzRW1wdHkoKSkK
LSAgICAgICAgcmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKLQotICAgIGlmIChtX2RhdGFPYmplY3Qp
IHsKLSAgICAgICAgU1RHTUVESVVNIG1lZGl1bTsKLSAgICAgICAgaWYgKEZBSUxFRChtX2RhdGFP
YmplY3QtPkdldERhdGEoY2ZIRHJvcEZvcm1hdCgpLCAmbWVkaXVtKSkpCi0gICAgICAgICAgICBy
ZXR1cm4gZmlsZXMucmVsZWFzZSgpOwotCi0gICAgICAgIEhEUk9QIGhkcm9wID0gcmVpbnRlcnBy
ZXRfY2FzdDxIRFJPUD4oR2xvYmFsTG9jayhtZWRpdW0uaEdsb2JhbCkpOwotICAgICAgICBpZiAo
IWhkcm9wKQotICAgICAgICAgICAgcmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKLQotICAgICAgICBX
Q0hBUiBmaWxlbmFtZVtNQVhfUEFUSF07Ci0gICAgICAgIFVJTlQgZmlsZUNvdW50ID0gRHJhZ1F1
ZXJ5RmlsZVcoaGRyb3AsIDB4RkZGRkZGRkYsIDAsIDApOwotICAgICAgICBmb3IgKFVJTlQgaSA9
IDA7IGkgPCBmaWxlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKCFEcmFnUXVlcnlGaWxl
VyhoZHJvcCwgaSwgZmlsZW5hbWUsIFdURl9BUlJBWV9MRU5HVEgoZmlsZW5hbWUpKSkKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGZpbGVzLT5hcHBlbmQoRmlsZTo6Y3Jl
YXRlKHJlaW50ZXJwcmV0X2Nhc3Q8VUNoYXIqPihmaWxlbmFtZSksIEZpbGU6OkFsbENvbnRlbnRU
eXBlcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgR2xvYmFsVW5sb2NrKG1lZGl1bS5oR2xvYmFs
KTsKLSAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmbWVkaXVtKTsKLSAgICAgICAgcmV0dXJuIGZp
bGVzLnJlbGVhc2UoKTsKLSAgICB9Ci0gICAgaWYgKCFtX2RyYWdEYXRhTWFwLmNvbnRhaW5zKGNm
SERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQpKQotICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgp
OwotICAgIFZlY3RvcjxTdHJpbmc+IGZpbGVzVmVjdG9yID0gbV9kcmFnRGF0YU1hcC5nZXQoY2ZI
RHJvcEZvcm1hdCgpLT5jZkZvcm1hdCk7Ci0gICAgZm9yIChWZWN0b3I8U3RyaW5nPjo6aXRlcmF0
b3IgaXQgPSBmaWxlc1ZlY3Rvci5iZWdpbigpOyBpdCAhPSBmaWxlc1ZlY3Rvci5lbmQoKTsgKytp
dCkKLSAgICAgICAgZmlsZXMtPmFwcGVuZChGaWxlOjpjcmVhdGUoKml0KSk7Ci0gICAgcmV0dXJu
IGZpbGVzLnJlbGVhc2UoKTsKLSNlbHNlCi0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1
cm4gMDsKLSNlbmRpZgotfQotCi12b2lkIENsaXBib2FyZFdpbjo6c2V0RHJhZ0ltYWdlKENhY2hl
ZEltYWdlKiBpbWFnZSwgTm9kZSAqbm9kZSwgY29uc3QgSW50UG9pbnQgJmxvYykKLXsKLSAgICBp
ZiAoIWNhblNldERyYWdJbWFnZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIGlm
IChtX2RyYWdJbWFnZSkKLSAgICAgICAgbV9kcmFnSW1hZ2UtPnJlbW92ZUNsaWVudCh0aGlzKTsK
LSAgICBtX2RyYWdJbWFnZSA9IGltYWdlOwotICAgIGlmIChtX2RyYWdJbWFnZSkKLSAgICAgICAg
bV9kcmFnSW1hZ2UtPmFkZENsaWVudCh0aGlzKTsKLQotICAgIG1fZHJhZ0xvYyA9IGxvYzsKLSAg
ICBtX2RyYWdJbWFnZUVsZW1lbnQgPSBub2RlOwotfQotCi12b2lkIENsaXBib2FyZFdpbjo6c2V0
RHJhZ0ltYWdlKENhY2hlZEltYWdlKiBpbWcsIGNvbnN0IEludFBvaW50ICZsb2MpCi17Ci0gICAg
c2V0RHJhZ0ltYWdlKGltZywgMCwgbG9jKTsKLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OnNldERy
YWdJbWFnZUVsZW1lbnQoTm9kZSAqbm9kZSwgY29uc3QgSW50UG9pbnQgJmxvYykKLXsKLSAgICBz
ZXREcmFnSW1hZ2UoMCwgbm9kZSwgbG9jKTsKLX0KLQotRHJhZ0ltYWdlUmVmIENsaXBib2FyZFdp
bjo6Y3JlYXRlRHJhZ0ltYWdlKEludFBvaW50JiBsb2MpIGNvbnN0Ci17CiAgICAgSEJJVE1BUCBy
ZXN1bHQgPSAwOwogICAgIGlmIChtX2RyYWdJbWFnZSkgewogI2lmIFVTRShDQUlSTykgfHwgVVNF
KENHKQogICAgICAgICByZXN1bHQgPSBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UobV9kcmFnSW1h
Z2UtPmltYWdlKCkpOyAgICAgICAgCi0gICAgICAgIGxvYyA9IG1fZHJhZ0xvYzsKKyAgICAgICAg
ZHJhZ0xvY2F0aW9uID0gbV9kcmFnTG9jOwogI2Vsc2UKICAgICAgICAgbm90SW1wbGVtZW50ZWQo
KTsKICNlbmRpZgogICAgIH0gZWxzZSBpZiAobV9kcmFnSW1hZ2VFbGVtZW50KSB7CiAgICAgICAg
IE5vZGUqIG5vZGUgPSBtX2RyYWdJbWFnZUVsZW1lbnQuZ2V0KCk7CiAgICAgICAgIHJlc3VsdCA9
IG5vZGUtPmRvY3VtZW50KCktPmZyYW1lKCktPm5vZGVJbWFnZShub2RlKTsKLSAgICAgICAgbG9j
ID0gbV9kcmFnTG9jOworICAgICAgICBkcmFnTG9jYXRpb24gPSBtX2RyYWdMb2M7CiAgICAgfQog
ICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBDYWNoZWRJbWFnZSogZ2V0Q2FjaGVkSW1h
Z2UoRWxlbWVudCogZWxlbWVudCkKK3ZvaWQgQ2xpcGJvYXJkOjpkZWNsYXJlQW5kV3JpdGVEcmFn
SW1hZ2UoRWxlbWVudCogZWxlbWVudCwgY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRp
dGxlLCBGcmFtZSogZnJhbWUpCiB7Ci0gICAgLy8gQXR0ZW1wdCB0byBwdWxsIENhY2hlZEltYWdl
IGZyb20gZWxlbWVudAotICAgIEFTU0VSVChlbGVtZW50KTsKLSAgICBSZW5kZXJPYmplY3QqIHJl
bmRlcmVyID0gZWxlbWVudC0+cmVuZGVyZXIoKTsKLSAgICBpZiAoIXJlbmRlcmVyIHx8ICFyZW5k
ZXJlci0+aXNJbWFnZSgpKSAKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgUmVuZGVySW1h
Z2UqIGltYWdlID0gdG9SZW5kZXJJbWFnZShyZW5kZXJlcik7Ci0gICAgaWYgKGltYWdlLT5jYWNo
ZWRJbWFnZSgpICYmICFpbWFnZS0+Y2FjaGVkSW1hZ2UoKS0+ZXJyb3JPY2N1cnJlZCgpKQotICAg
ICAgICByZXR1cm4gaW1hZ2UtPmNhY2hlZEltYWdlKCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQot
c3RhdGljIHZvaWQgd3JpdGVJbWFnZVRvRGF0YU9iamVjdChJRGF0YU9iamVjdCogZGF0YU9iamVj
dCwgRWxlbWVudCogZWxlbWVudCwgY29uc3QgS1VSTCYgdXJsKQotewotICAgIC8vIFNob3ZlIGlt
YWdlIGRhdGEgaW50byBhIERhdGFPYmplY3QgZm9yIHVzZSBhcyBhIGZpbGUKLSAgICBDYWNoZWRJ
bWFnZSogY2FjaGVkSW1hZ2UgPSBnZXRDYWNoZWRJbWFnZShlbGVtZW50KTsKLSAgICBpZiAoIWNh
Y2hlZEltYWdlIHx8ICFjYWNoZWRJbWFnZS0+aW1hZ2VGb3JSZW5kZXJlcihlbGVtZW50LT5yZW5k
ZXJlcigpKSB8fCAhY2FjaGVkSW1hZ2UtPmlzTG9hZGVkKCkpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIFNoYXJlZEJ1ZmZlciogaW1hZ2VCdWZmZXIgPSBjYWNoZWRJbWFnZS0+aW1hZ2VGb3JSZW5k
ZXJlcihlbGVtZW50LT5yZW5kZXJlcigpKS0+ZGF0YSgpOwotICAgIGlmICghaW1hZ2VCdWZmZXIg
fHwgIWltYWdlQnVmZmVyLT5zaXplKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIEhHTE9CQUwg
aW1hZ2VGaWxlRGVzY3JpcHRvciA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZURlc2NyaXB0b3IodXJs
LnN0cmluZygpLCBlbGVtZW50LT5nZXRBdHRyaWJ1dGUoYWx0QXR0ciksIGNhY2hlZEltYWdlKTsK
LSAgICBpZiAoIWltYWdlRmlsZURlc2NyaXB0b3IpCi0gICAgICAgIHJldHVybjsKLQotICAgIEhH
TE9CQUwgaW1hZ2VGaWxlQ29udGVudCA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoaW1h
Z2VCdWZmZXIpOwotICAgIGlmICghaW1hZ2VGaWxlQ29udGVudCkgewotICAgICAgICBHbG9iYWxG
cmVlKGltYWdlRmlsZURlc2NyaXB0b3IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
U3RyaW5nIGZpbGVOYW1lID0gY2FjaGVkSW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5h
bWUoKTsKLSAgICBIR0xPQkFMIGhEcm9wQ29udGVudCA9IGNyZWF0ZUdsb2JhbEhEcm9wQ29udGVu
dCh1cmwsIGZpbGVOYW1lLCBpbWFnZUJ1ZmZlcik7Ci0gICAgaWYgKCFoRHJvcENvbnRlbnQpIHsK
LSAgICAgICAgR2xvYmFsRnJlZShoRHJvcENvbnRlbnQpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgd3JpdGVGaWxlVG9EYXRhT2JqZWN0KGRhdGFPYmplY3QsIGltYWdlRmlsZURlc2Ny
aXB0b3IsIGltYWdlRmlsZUNvbnRlbnQsIGhEcm9wQ29udGVudCk7Ci19Ci0KLXZvaWQgQ2xpcGJv
YXJkV2luOjpkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UoRWxlbWVudCogZWxlbWVudCwgY29uc3Qg
S1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBGcmFtZSogZnJhbWUpCi17CiAgICAgLy8g
T3JkZXIgaXMgaW1wb3J0YW50IGhlcmUgZm9yIEV4cGxvcmVyJ3Mgc2FrZQotICAgIGlmICghbV93
cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgICByZXR1cm47Ci0gICAgV2ViQ29yZTo6d3JpdGVV
UkwobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybCwgdGl0bGUsIHRydWUsIGZhbHNlKTsK
LQotICAgIHdyaXRlSW1hZ2VUb0RhdGFPYmplY3QobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCks
IGVsZW1lbnQsIHVybCk7Ci0KLSAgICBBdG9taWNTdHJpbmcgaW1hZ2VVUkwgPSBlbGVtZW50LT5n
ZXRBdHRyaWJ1dGUoc3JjQXR0cik7CisgICAgaWYgKCFtX3Bhc3RlYm9hcmQtPndyaXRhYmxlRGF0
YU9iamVjdCgpKQorICAgICAgICByZXR1cm47CisgICAgbV9wYXN0ZWJvYXJkLT53cml0ZVVSTFRv
V3JpdGFibGVEYXRhT2JqZWN0KHVybCwgdGl0bGUpOworICAgIG1fcGFzdGVib2FyZC0+d3JpdGVJ
bWFnZVRvRGF0YU9iamVjdChlbGVtZW50LCB1cmwpOworICAgIEF0b21pY1N0cmluZyBpbWFnZVVS
TCA9IGVsZW1lbnQtPmdldEF0dHJpYnV0ZShIVE1MTmFtZXM6OnNyY0F0dHIpOwogICAgIGlmIChp
bWFnZVVSTC5pc0VtcHR5KCkpIAogICAgICAgICByZXR1cm47CiAKQEAgLTY4OCwxMzEgKzc4LDgg
QEANCiAgICAgVmVjdG9yPGNoYXI+IGRhdGE7CiAgICAgbWFya3VwVG9DRkhUTUwoY3JlYXRlTWFy
a3VwKGVsZW1lbnQsIEluY2x1ZGVOb2RlLCAwLCBSZXNvbHZlQWxsVVJMcyksICIiLCBkYXRhKTsK
ICAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7Ci0gICAgaWYgKG1l
ZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShodG1s
Rm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKKyAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJ
TEVEKG1fcGFzdGVib2FyZC0+d3JpdGFibGVEYXRhT2JqZWN0KCktPlNldERhdGEoaHRtbEZvcm1h
dCgpLCAmbWVkaXVtLCBUUlVFKSkpCiAgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2Jh
bCk7CiB9CiAKLXZvaWQgQ2xpcGJvYXJkV2luOjp3cml0ZVVSTChjb25zdCBLVVJMJiBrdXJsLCBj
b25zdCBTdHJpbmcmIHRpdGxlU3RyLCBGcmFtZSopCi17Ci0gICAgaWYgKCFtX3dyaXRhYmxlRGF0
YU9iamVjdCkKLSAgICAgICAgIHJldHVybjsKLSAgICBXZWJDb3JlOjp3cml0ZVVSTChtX3dyaXRh
YmxlRGF0YU9iamVjdC5nZXQoKSwga3VybCwgdGl0bGVTdHIsIHRydWUsIHRydWUpOwotCi0gICAg
U3RyaW5nIHVybCA9IGt1cmwuc3RyaW5nKCk7Ci0gICAgQVNTRVJUKHVybC5jb250YWluc09ubHlB
U0NJSSgpKTsgLy8gS1VSTDo6c3RyaW5nKCkgaXMgVVJMIGVuY29kZWQuCi0KLSAgICBTdHJpbmcg
ZnNQYXRoID0gZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JUaXRsZSh1cmwsIHRpdGxlU3RyLCBMIi5V
UkwiLCB0cnVlKTsKLSAgICBTdHJpbmcgY29udGVudFN0cmluZygiW0ludGVybmV0U2hvcnRjdXRd
XHJcblVSTD0iICsgdXJsICsgIlxyXG4iKTsKLSAgICBDU3RyaW5nIGNvbnRlbnQgPSBjb250ZW50
U3RyaW5nLmxhdGluMSgpOwotCi0gICAgaWYgKGZzUGF0aC5sZW5ndGgoKSA8PSAwKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBIR0xPQkFMIHVybEZpbGVEZXNjcmlwdG9yID0gR2xvYmFsQWxsb2Mo
R1BUUiwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKLSAgICBpZiAoIXVybEZpbGVEZXNj
cmlwdG9yKQotICAgICAgICByZXR1cm47Ci0KLSAgICBIR0xPQkFMIHVybEZpbGVDb250ZW50ID0g
R2xvYmFsQWxsb2MoR1BUUiwgY29udGVudC5sZW5ndGgoKSk7Ci0gICAgaWYgKCF1cmxGaWxlQ29u
dGVudCkgewotICAgICAgICBHbG9iYWxGcmVlKHVybEZpbGVEZXNjcmlwdG9yKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIEZJTEVHUk9VUERFU0NSSVBUT1IqIGZnZCA9IHN0YXRpY19j
YXN0PEZJTEVHUk9VUERFU0NSSVBUT1IqPihHbG9iYWxMb2NrKHVybEZpbGVEZXNjcmlwdG9yKSk7
Ci0gICAgWmVyb01lbW9yeShmZ2QsIHNpemVvZihGSUxFR1JPVVBERVNDUklQVE9SKSk7Ci0gICAg
ZmdkLT5jSXRlbXMgPSAxOwotICAgIGZnZC0+ZmdkWzBdLmR3RmxhZ3MgPSBGRF9GSUxFU0laRTsK
LSAgICBmZ2QtPmZnZFswXS5uRmlsZVNpemVMb3cgPSBjb250ZW50Lmxlbmd0aCgpOwotCi0gICAg
dW5zaWduZWQgbWF4U2l6ZSA9IG1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgo
ZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lKSk7Ci0gICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmls
ZU5hbWUsIGZzUGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKLSAg
ICBHbG9iYWxVbmxvY2sodXJsRmlsZURlc2NyaXB0b3IpOwotCi0gICAgY2hhciogZmlsZUNvbnRl
bnRzID0gc3RhdGljX2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2sodXJsRmlsZUNvbnRlbnQpKTsKLSAg
ICBDb3B5TWVtb3J5KGZpbGVDb250ZW50cywgY29udGVudC5kYXRhKCksIGNvbnRlbnQubGVuZ3Ro
KCkpOwotICAgIEdsb2JhbFVubG9jayh1cmxGaWxlQ29udGVudCk7Ci0KLSAgICB3cml0ZUZpbGVU
b0RhdGFPYmplY3QobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybEZpbGVEZXNjcmlwdG9y
LCB1cmxGaWxlQ29udGVudCwgMCk7Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjp3cml0ZVJhbmdl
KFJhbmdlKiBzZWxlY3RlZFJhbmdlLCBGcmFtZSogZnJhbWUpCi17Ci0gICAgQVNTRVJUKHNlbGVj
dGVkUmFuZ2UpOwotICAgIGlmICghbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgICByZXR1
cm47Ci0KLSAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OwotICAgIG1lZGl1bS50eW1lZCA9IFRZ
TUVEX0hHTE9CQUw7Ci0KLSAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKLSAgICBtYXJrdXBUb0NGSFRN
TChjcmVhdGVNYXJrdXAoc2VsZWN0ZWRSYW5nZSwgMCwgQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSks
Ci0gICAgICAgIHNlbGVjdGVkUmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCktPmRvY3VtZW50KCktPnVy
bCgpLnN0cmluZygpLCBkYXRhKTsKLSAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERh
dGEoZGF0YSk7Ci0gICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0
YU9iamVjdC0+U2V0RGF0YShodG1sRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAg
OjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKLQotICAgIFN0cmluZyBzdHIgPSBmcmFtZS0+
ZWRpdG9yKCkuc2VsZWN0ZWRUZXh0Rm9yQ2xpcGJvYXJkKCk7Ci0gICAgcmVwbGFjZU5ld2xpbmVz
V2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVzKHN0cik7Ci0gICAgcmVwbGFjZU5CU1BXaXRoU3BhY2Uo
c3RyKTsKLSAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoc3RyKTsKLSAgICBp
ZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRh
KHBsYWluVGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICA6Okdsb2JhbEZy
ZWUobWVkaXVtLmhHbG9iYWwpOwotCi0gICAgbWVkaXVtLmhHbG9iYWwgPSAwOwotICAgIGlmIChm
cmFtZS0+ZWRpdG9yKCkuY2FuU21hcnRDb3B5T3JEZWxldGUoKSkKLSAgICAgICAgbV93cml0YWJs
ZURhdGFPYmplY3QtPlNldERhdGEoc21hcnRQYXN0ZUZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKTsK
LX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OndyaXRlUGxhaW5UZXh0KGNvbnN0IFN0cmluZyYgdGV4
dCkKLXsKLSAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQotICAgICAgICByZXR1cm47Ci0g
ICAgCi0gICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAgICBtZWRpdW0udHltZWQgPSBUWU1F
RF9IR0xPQkFMOwotICAgIAotICAgIFN0cmluZyBzdHIgPSB0ZXh0OwotICAgIHJlcGxhY2VOZXds
aW5lc1dpdGhXaW5kb3dzU3R5bGVOZXdsaW5lcyhzdHIpOwotICAgIHJlcGxhY2VOQlNQV2l0aFNw
YWNlKHN0cik7Ci0gICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKHN0cik7Ci0g
ICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0
RGF0YShwbGFpblRleHRXRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgOjpHbG9i
YWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsgICAgICAgIAotCi0gICAgbWVkaXVtLmhHbG9iYWwgPSAw
OwotfQotICAgIAotYm9vbCBDbGlwYm9hcmRXaW46Omhhc0RhdGEoKQotewotICAgIGlmICghbV9k
YXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBpZiAobV9kYXRhT2JqZWN0KSB7Ci0gICAgICAgIENPTVB0cjxJRW51bUZPUk1B
VEVUQz4gaXRyOwotICAgICAgICBpZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+RW51bUZvcm1hdEV0
YyhEQVRBRElSX0dFVCwgJml0cikpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
ICAgIGlmICghaXRyKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEZPUk1B
VEVUQyBkYXRhOwotCi0gICAgICAgIC8vIElFbnVtRk9STUFURVRDOjpOZXh0IHJldHVybnMgU19G
QUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcy4KLSAgICAgICAgaWYgKGl0ci0+TmV4dCgx
LCAmZGF0YSwgMCkgPT0gU19PSykgewotICAgICAgICAgICAgLy8gVGhlcmUgaXMgYXQgbGVhc3Qg
b25lIGl0ZW0gaW4gdGhlIElEYXRhT2JqZWN0Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuICFtX2Ry
YWdEYXRhTWFwLmlzRW1wdHkoKTsKLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OnNldEV4dGVybmFs
RGF0YU9iamVjdChJRGF0YU9iamVjdCAqZGF0YU9iamVjdCkKLXsKLSAgICBBU1NFUlQoaXNGb3JE
cmFnQW5kRHJvcCgpKTsKLQotICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0ID0gMDsKLSAgICBtX2Rh
dGFPYmplY3QgPSBkYXRhT2JqZWN0OwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgNCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgJKHJldmlzaW9u
IDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgJ
KHdvcmtpbmcgY29weSkNCkBAIC0xLDEwMSArMCwwIEBADQotLyoKLSAqIENvcHlyaWdodCAoQykg
MjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0K
LSNpZm5kZWYgQ2xpcGJvYXJkV2luX2gKLSNkZWZpbmUgQ2xpcGJvYXJkV2luX2gKLQotI2luY2x1
ZGUgIkNPTVB0ci5oIgotI2luY2x1ZGUgIkNhY2hlZEltYWdlQ2xpZW50LmgiCi0jaW5jbHVkZSAi
Q2xpcGJvYXJkLmgiCi0jaW5jbHVkZSAiRHJhZ0RhdGEuaCIKLQotc3RydWN0IElEYXRhT2JqZWN0
OwotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIENhY2hlZEltYWdlOwotY2xhc3MgRnJh
bWU7Ci1jbGFzcyBJbnRQb2ludDsKLWNsYXNzIFdDRGF0YU9iamVjdDsKLQotLy8gU3RhdGUgYXZh
aWxhYmxlIGR1cmluZyBJRSdzIGV2ZW50cyBmb3IgZHJhZyBhbmQgZHJvcCBhbmQgY29weS9wYXN0
ZQotY2xhc3MgQ2xpcGJvYXJkV2luIDogcHVibGljIENsaXBib2FyZCwgcHVibGljIENhY2hlZElt
YWdlQ2xpZW50IHsKLSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBz
dGF0aWMgUGFzc1JlZlB0cjxDbGlwYm9hcmRXaW4+IGNyZWF0ZShDbGlwYm9hcmRUeXBlIGNsaXBi
b2FyZFR5cGUsIElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3kg
cG9saWN5LCBGcmFtZSogZnJhbWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3
IENsaXBib2FyZFdpbihjbGlwYm9hcmRUeXBlLCBkYXRhT2JqZWN0LCBwb2xpY3ksIGZyYW1lKSk7
Ci0gICAgfQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPENsaXBib2FyZFdpbj4gY3JlYXRlKENsaXBi
b2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgV0NEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBDbGlwYm9h
cmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBGcmFtZSogZnJhbWUpCi0gICAgewotICAgICAgICByZXR1
cm4gYWRvcHRSZWYobmV3IENsaXBib2FyZFdpbihjbGlwYm9hcmRUeXBlLCBkYXRhT2JqZWN0LCBw
b2xpY3ksIGZyYW1lKSk7Ci0gICAgfQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPENsaXBib2FyZFdp
bj4gY3JlYXRlKENsaXBib2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgY29uc3QgRHJhZ0RhdGFNYXAm
IGRhdGFNYXAsIENsaXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2xpcGJvYXJkV2luKGNsaXBib2FyZFR5
cGUsIGRhdGFNYXAsIHBvbGljeSwgZnJhbWUpKTsKLSAgICB9Ci0gICAgfkNsaXBib2FyZFdpbigp
OwotCi0gICAgdm9pZCBjbGVhckRhdGEoY29uc3QgU3RyaW5nJiB0eXBlKTsKLSAgICB2b2lkIGNs
ZWFyRGF0YSgpOwotICAgIFN0cmluZyBnZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSkgY29uc3Q7
Ci0gICAgYm9vbCBzZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBkYXRh
KTsKLQotICAgIC8vIGV4dGVuc2lvbnMgYmV5b25kIElFJ3MgQVBJCi0gICAgdmlydHVhbCBMaXN0
SGFzaFNldDxTdHJpbmc+IHR5cGVzKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPEZp
bGVMaXN0PiBmaWxlcygpIGNvbnN0OwotCi0gICAgdm9pZCBzZXREcmFnSW1hZ2UoQ2FjaGVkSW1h
Z2UqLCBjb25zdCBJbnRQb2ludCYpOwotICAgIHZvaWQgc2V0RHJhZ0ltYWdlRWxlbWVudChOb2Rl
KiwgY29uc3QgSW50UG9pbnQmKTsKLQotICAgIHZpcnR1YWwgRHJhZ0ltYWdlUmVmIGNyZWF0ZURy
YWdJbWFnZShJbnRQb2ludCYgZHJhZ0xvYykgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGRlY2xh
cmVBbmRXcml0ZURyYWdJbWFnZShFbGVtZW50KiwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYg
dGl0bGUsIEZyYW1lKik7Ci0gICAgdmlydHVhbCB2b2lkIHdyaXRlVVJMKGNvbnN0IEtVUkwmLCBj
b25zdCBTdHJpbmcmLCBGcmFtZSopOwotICAgIHZpcnR1YWwgdm9pZCB3cml0ZVJhbmdlKFJhbmdl
KiwgRnJhbWUqKTsKLSAgICB2aXJ0dWFsIHZvaWQgd3JpdGVQbGFpblRleHQoY29uc3QgU3RyaW5n
Jik7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzRGF0YSgpOwotCi0gICAgQ09NUHRyPElEYXRhT2Jq
ZWN0PiBkYXRhT2JqZWN0KCkgeyByZXR1cm4gbV9kYXRhT2JqZWN0OyB9Ci0KLSAgICB2b2lkIHNl
dEV4dGVybmFsRGF0YU9iamVjdChJRGF0YU9iamVjdCAqZGF0YU9iamVjdCk7Ci0KLXByaXZhdGU6
Ci0gICAgQ2xpcGJvYXJkV2luKENsaXBib2FyZFR5cGUsIElEYXRhT2JqZWN0KiwgQ2xpcGJvYXJk
QWNjZXNzUG9saWN5LCBGcmFtZSopOwotICAgIENsaXBib2FyZFdpbihDbGlwYm9hcmRUeXBlLCBX
Q0RhdGFPYmplY3QqLCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3ksIEZyYW1lKik7Ci0gICAgQ2xpcGJv
YXJkV2luKENsaXBib2FyZFR5cGUsIGNvbnN0IERyYWdEYXRhTWFwJiwgQ2xpcGJvYXJkQWNjZXNz
UG9saWN5LCBGcmFtZSopOwotCi0gICAgdm9pZCByZXNldEZyb21DbGlwYm9hcmQoKTsKLSAgICB2
b2lkIHNldERyYWdJbWFnZShDYWNoZWRJbWFnZSosIE5vZGUqLCBjb25zdCBJbnRQb2ludCYpOwot
Ci0gICAgQ09NUHRyPElEYXRhT2JqZWN0PiBtX2RhdGFPYmplY3Q7Ci0gICAgQ09NUHRyPFdDRGF0
YU9iamVjdD4gbV93cml0YWJsZURhdGFPYmplY3Q7Ci0gICAgRHJhZ0RhdGFNYXAgbV9kcmFnRGF0
YU1hcDsKLSAgICBGcmFtZSogbV9mcmFtZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
LQotI2VuZGlmIC8vIENsaXBib2FyZFdpbl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS93aW4vRWRpdG9yV2luLmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL3dpbi9FZGl0b3JXaW4uY3BwCShyZXZpc2lvbiAxNTA2MjkpDQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vd2luL0VkaXRvcldpbi5jcHAJKHdvcmtpbmcgY29weSkNCkBAIC0yNSwxNSAr
MjUsMTcgQEANCiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJFZGl0b3IuaCIKLSNp
bmNsdWRlICJFZGl0b3JDbGllbnQuaCIKIAotI2luY2x1ZGUgIkNsaXBib2FyZFdpbi5oIgorI2lu
Y2x1ZGUgIkNPTVB0ci5oIgorI2luY2x1ZGUgIkNsaXBib2FyZC5oIgogI2luY2x1ZGUgIkRvY3Vt
ZW50LmgiCisjaW5jbHVkZSAiRWRpdG9yQ2xpZW50LmgiCiAjaW5jbHVkZSAiRWxlbWVudC5oIgog
I2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKKyNpbmNsdWRlICJQ
YXN0ZWJvYXJkLmgiCiAjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiVmlzaWJs
ZVVuaXRzLmgiCisjaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKIAogI2luY2x1ZGUgPHdpbmRvd3Mu
aD4KIApAQCAtNDYsOCArNDgsOSBAQA0KICAgICBpZiAoIVNVQ0NFRURFRChPbGVHZXRDbGlwYm9h
cmQoJmNsaXBib2FyZERhdGEpKSkKICAgICAgICAgY2xpcGJvYXJkRGF0YSA9IDA7CiAjZW5kaWYK
LQotICAgIHJldHVybiBDbGlwYm9hcmRXaW46OmNyZWF0ZShDbGlwYm9hcmQ6OkNvcHlBbmRQYXN0
ZSwgY2xpcGJvYXJkRGF0YS5nZXQoKSwgcG9saWN5LCBmcmFtZSk7CisgICAgUmVmUHRyPENsaXBi
b2FyZD4gY2xpcGJvYXJkID0gQ2xpcGJvYXJkOjpjcmVhdGVGb3JDb3B5QW5kUGFzdGUocG9saWN5
KTsKKyAgICBjb25zdF9jYXN0PFBhc3RlYm9hcmQmPihjbGlwYm9hcmQtPnBhc3RlYm9hcmQoKSku
c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KGNsaXBib2FyZERhdGEuZ2V0KCkpOworICAgIHJldHVybiBj
bGlwYm9hcmQucmVsZWFzZSgpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHANCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHAJKHJldmlz
aW9uIDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdp
bi5jcHAJKHdvcmtpbmcgY29weSkNCkBAIC0xLDUgKzEsNiBAQA0KIC8qCiAgKiBDb3B5cmlnaHQg
KEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly
aWdodCAoQykgMjAxMyBYdWVxaW5nIEh1YW5nIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgogICoK
ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zNCw2ICszNSw4IEBADQogI2luY2x1ZGUg
IkVkaXRvci5oIgogI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJGcmFtZS5oIgorI2lu
Y2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhUTUxQYXJzZXJJZGlvbXMuaCIKICNpbmNs
dWRlICJIV25kREMuaCIKICNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCiAjaW5jbHVkZSAiSW1h
Z2UuaCIKQEAgLTQyLDYgKzQ1LDcgQEANCiAjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlJh
bmdlLmgiCiAjaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmZXIu
aCIKICNpbmNsdWRlICJUZXh0RW5jb2RpbmcuaCIKICNpbmNsdWRlICJXZWJDb3JlSW5zdGFuY2VI
YW5kbGUuaCIKICNpbmNsdWRlICJXaW5kb3dzRXh0cmFzLmgiCkBAIC01MCw2ICs1NCw5IEBADQog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKKy8vIFdlIHByb3ZpZGUgdGhlIElFIGNsaXBib2FyZCB0
eXBlcyAoVVJMIGFuZCBUZXh0KSwgYW5kIHRoZSBjbGlwYm9hcmQgdHlwZXMgc3BlY2lmaWVkIGlu
IHRoZSBXSEFUV0cgV2ViIEFwcGxpY2F0aW9ucyAxLjAgZHJhZnQKKy8vIHNlZSBodHRwOi8vd3d3
LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyBTZWN0aW9uIDYuMy41LjMK
Kwogc3RhdGljIFVJTlQgSFRNTENsaXBib2FyZEZvcm1hdCA9IDA7CiBzdGF0aWMgVUlOVCBCb29r
bWFya0NsaXBib2FyZEZvcm1hdCA9IDA7CiBzdGF0aWMgVUlOVCBXZWJTbWFydFBhc3RlRm9ybWF0
ID0gMDsKQEAgLTg5LDggKzk2LDM4IEBADQogICAgIHJldHVybiBwYXN0ZWJvYXJkOwogfQogCi1Q
YXN0ZWJvYXJkOjpQYXN0ZWJvYXJkKCkKK1Bhc3NPd25QdHI8UGFzdGVib2FyZD4gUGFzdGVib2Fy
ZDo6Y3JlYXRlRm9yQ29weUFuZFBhc3RlKCkKIHsKKyAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBh
c3RlYm9hcmQpOworfQorCitQYXNzT3duUHRyPFBhc3RlYm9hcmQ+IFBhc3RlYm9hcmQ6OmNyZWF0
ZVByaXZhdGUoKQoreworICAgIC8vIFdpbmRvd3MgaGFzIG5vdCAiUHJpdmF0ZSBwYXN0ZWJvYXJk
IiBjb25jZXB0LgorICAgIHJldHVybiBjcmVhdGVGb3JDb3B5QW5kUGFzdGUoKTsKK30KKworI2lm
IEVOQUJMRShEUkFHX1NVUFBPUlQpCitQYXNzT3duUHRyPFBhc3RlYm9hcmQ+IFBhc3RlYm9hcmQ6
OmNyZWF0ZUZvckRyYWdBbmREcm9wKCkKK3sKKyAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBkYXRh
T2JqZWN0OworICAgIFdDRGF0YU9iamVjdDo6Y3JlYXRlSW5zdGFuY2UoJmRhdGFPYmplY3QpOwor
ICAgIHJldHVybiBhZG9wdFB0cihuZXcgUGFzdGVib2FyZChkYXRhT2JqZWN0LmdldCgpKSk7Cit9
CisKKy8vIHN0YXRpYworUGFzc093blB0cjxQYXN0ZWJvYXJkPiBQYXN0ZWJvYXJkOjpjcmVhdGVG
b3JEcmFnQW5kRHJvcChjb25zdCBEcmFnRGF0YSYgZHJhZ0RhdGEpCit7CisgICAgaWYgKGRyYWdE
YXRhLnBsYXRmb3JtRGF0YSgpKQorICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBhc3RlYm9h
cmQoZHJhZ0RhdGEucGxhdGZvcm1EYXRhKCkpKTsKKyAgICAvLyBXZSBjb3VsZCBub3QgY2FsbCBE
cmFnRGF0YTo6ZHJhZ0RhdGFNYXAgdmlhIHxjb25zdCBEcmFnRGF0YSZ8LgorICAgIGNvbnN0IERy
YWdEYXRhTWFwJiBkcmFnRGF0YU1hcCA9IGNvbnN0X2Nhc3Q8RHJhZ0RhdGEqPigoJmRyYWdEYXRh
KSktPmRyYWdEYXRhTWFwKCk7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBQYXN0ZWJvYXJkKGRy
YWdEYXRhTWFwKSk7Cit9CisjZW5kaWYKKwordm9pZCBQYXN0ZWJvYXJkOjpmaW5pc2hDcmVhdGlu
Z1Bhc3RlYm9hcmQoKQorewogICAgIFdORENMQVNTIHdjOwogICAgIG1lbXNldCgmd2MsIDAsIHNp
emVvZihXTkRDTEFTUykpOwogICAgIHdjLmxwZm5XbmRQcm9jICAgID0gUGFzdGVib2FyZE93bmVy
V25kUHJvYzsKQEAgLTEwNiw2ICsxNDMsMzUgQEANCiAgICAgV2ViU21hcnRQYXN0ZUZvcm1hdCA9
IDo6UmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJXZWJLaXQgU21hcnQgUGFzdGUgRm9ybWF0Iik7
CiB9CiAKK1Bhc3RlYm9hcmQ6OlBhc3RlYm9hcmQoKQorICAgIDogbV9kYXRhT2JqZWN0KDApCisg
ICAgLCBtX3dyaXRhYmxlRGF0YU9iamVjdCgwKQoreworICAgIGZpbmlzaENyZWF0aW5nUGFzdGVi
b2FyZCgpOworfQorCitQYXN0ZWJvYXJkOjpQYXN0ZWJvYXJkKElEYXRhT2JqZWN0KiBkYXRhT2Jq
ZWN0KQorICAgIDogbV9kYXRhT2JqZWN0KGRhdGFPYmplY3QpCisgICAgLCBtX3dyaXRhYmxlRGF0
YU9iamVjdCgwKQoreworICAgIGZpbmlzaENyZWF0aW5nUGFzdGVib2FyZCgpOworfQorCitQYXN0
ZWJvYXJkOjpQYXN0ZWJvYXJkKFdDRGF0YU9iamVjdCogZGF0YU9iamVjdCkKKyAgICA6IG1fZGF0
YU9iamVjdChkYXRhT2JqZWN0KQorICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoZGF0YU9iamVj
dCkKK3sKKyAgICBmaW5pc2hDcmVhdGluZ1Bhc3RlYm9hcmQoKTsKK30KKworUGFzdGVib2FyZDo6
UGFzdGVib2FyZChjb25zdCBEcmFnRGF0YU1hcCYgZGF0YU1hcCkKKyAgICA6IG1fZGF0YU9iamVj
dCgwKQorICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoMCkKKyAgICAsIG1fZHJhZ0RhdGFNYXAo
ZGF0YU1hcCkKK3sKKyAgICBmaW5pc2hDcmVhdGluZ1Bhc3RlYm9hcmQoKTsKK30KKwogdm9pZCBQ
YXN0ZWJvYXJkOjpjbGVhcigpCiB7CiAgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkg
ewpAQCAtMTE0LDYgKzE4MCwyNzEgQEANCiAgICAgfQogfQogCitlbnVtIENsaXBib2FyZERhdGFU
eXBlIHsgQ2xpcGJvYXJkRGF0YVR5cGVOb25lLCBDbGlwYm9hcmREYXRhVHlwZVVSTCwgQ2xpcGJv
YXJkRGF0YVR5cGVUZXh0LCBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MIH07CisKK3N0YXRpYyBD
bGlwYm9hcmREYXRhVHlwZSBjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKGNvbnN0IFN0cmluZyYg
dHlwZSkKK3sKKyAgICBTdHJpbmcgcVR5cGUgPSB0eXBlLnN0cmlwV2hpdGVTcGFjZSgpLmxvd2Vy
KCk7CisKKyAgICAvLyB0d28gc3BlY2lhbCBjYXNlcyBmb3IgSUUgY29tcGF0aWJpbGl0eQorICAg
IGlmIChxVHlwZSA9PSAidGV4dCIgfHwgcVR5cGUgPT0gInRleHQvcGxhaW4iIHx8IHFUeXBlLnN0
YXJ0c1dpdGgoInRleHQvcGxhaW47IikpCisgICAgICAgIHJldHVybiBDbGlwYm9hcmREYXRhVHlw
ZVRleHQ7CisgICAgaWYgKHFUeXBlID09ICJ1cmwiIHx8IHFUeXBlID09ICJ0ZXh0L3VyaS1saXN0
IikKKyAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVVJMOworICAgIGlmIChxVHlwZSA9
PSAidGV4dC9odG1sIikKKyAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVGV4dEhUTUw7
CisKKyAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVOb25lOworfQorCit2b2lkIFBhc3RlYm9h
cmQ6OmNsZWFyKGNvbnN0IFN0cmluZyYgdHlwZSkKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRh
T2JqZWN0KQorICAgICAgICByZXR1cm47CisKKyAgICBDbGlwYm9hcmREYXRhVHlwZSBkYXRhVHlw
ZSA9IGNsaXBib2FyZFR5cGVGcm9tTUlNRVR5cGUodHlwZSk7CisKKyAgICBpZiAoZGF0YVR5cGUg
PT0gQ2xpcGJvYXJkRGF0YVR5cGVVUkwpIHsKKyAgICAgICAgbV93cml0YWJsZURhdGFPYmplY3Qt
PmNsZWFyRGF0YSh1cmxXRm9ybWF0KCktPmNmRm9ybWF0KTsKKyAgICAgICAgbV93cml0YWJsZURh
dGFPYmplY3QtPmNsZWFyRGF0YSh1cmxGb3JtYXQoKS0+Y2ZGb3JtYXQpOworICAgIH0KKyAgICBp
ZiAoZGF0YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KSB7CisgICAgICAgIG1fd3JpdGFi
bGVEYXRhT2JqZWN0LT5jbGVhckRhdGEocGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0KTsKKyAg
ICAgICAgbV93cml0YWJsZURhdGFPYmplY3QtPmNsZWFyRGF0YShwbGFpblRleHRXRm9ybWF0KCkt
PmNmRm9ybWF0KTsKKyAgICB9Cit9CisKK2Jvb2wgUGFzdGVib2FyZDo6aGFzRGF0YSgpCit7Cisg
ICAgaWYgKCFtX2RhdGFPYmplY3QgJiYgbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGlmIChtX2RhdGFPYmplY3QpIHsKKyAgICAgICAgQ09NUHRy
PElFbnVtRk9STUFURVRDPiBpdHI7CisgICAgICAgIGlmIChGQUlMRUQobV9kYXRhT2JqZWN0LT5F
bnVtRm9ybWF0RXRjKERBVEFESVJfR0VULCAmaXRyKSkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgaWYgKCFpdHIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAgICAgRk9STUFURVRDIGRhdGE7CisKKyAgICAgICAgLy8gSUVudW1GT1JNQVRFVEM6Ok5leHQg
cmV0dXJucyBTX0ZBTFNFIGlmIHRoZXJlIGFyZSBubyBtb3JlIGl0ZW1zLgorICAgICAgICBpZiAo
aXRyLT5OZXh0KDEsICZkYXRhLCAwKSA9PSBTX09LKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBp
cyBhdCBsZWFzdCBvbmUgaXRlbSBpbiB0aGUgSURhdGFPYmplY3QKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBy
ZXR1cm4gIW1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpOworfQorCitzdGF0aWMgdm9pZCBhZGRNaW1l
VHlwZXNGb3JGb3JtYXQoTGlzdEhhc2hTZXQ8U3RyaW5nPiYgcmVzdWx0cywgY29uc3QgRk9STUFU
RVRDJiBmb3JtYXQpCit7CisgICAgLy8gVVJMIGFuZCBUZXh0IGFyZSBwcm92aWRlZCBmb3IgY29t
cGF0aWJpbGl0eSB3aXRoIElFJ3MgbW9kZWwKKyAgICBpZiAoZm9ybWF0LmNmRm9ybWF0ID09IHVy
bEZvcm1hdCgpLT5jZkZvcm1hdCB8fCBmb3JtYXQuY2ZGb3JtYXQgPT0gdXJsV0Zvcm1hdCgpLT5j
ZkZvcm1hdCkgeworICAgICAgICByZXN1bHRzLmFkZCgiVVJMIik7CisgICAgICAgIHJlc3VsdHMu
YWRkKCJ0ZXh0L3VyaS1saXN0Iik7CisgICAgfQorCisgICAgaWYgKGZvcm1hdC5jZkZvcm1hdCA9
PSBwbGFpblRleHRXRm9ybWF0KCktPmNmRm9ybWF0IHx8IGZvcm1hdC5jZkZvcm1hdCA9PSBwbGFp
blRleHRGb3JtYXQoKS0+Y2ZGb3JtYXQpIHsKKyAgICAgICAgcmVzdWx0cy5hZGQoIlRleHQiKTsK
KyAgICAgICAgcmVzdWx0cy5hZGQoInRleHQvcGxhaW4iKTsKKyAgICB9Cit9CisKK0xpc3RIYXNo
U2V0PFN0cmluZz4gUGFzdGVib2FyZDo6dHlwZXMoKQoreworICAgIExpc3RIYXNoU2V0PFN0cmlu
Zz4gcmVzdWx0czsKKworICAgIGlmICghbV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNF
bXB0eSgpKQorICAgICAgICByZXR1cm4gcmVzdWx0czsKKworICAgIGlmIChtX2RhdGFPYmplY3Qp
IHsKKyAgICAgICAgQ09NUHRyPElFbnVtRk9STUFURVRDPiBpdHI7CisKKyAgICAgICAgaWYgKEZB
SUxFRChtX2RhdGFPYmplY3QtPkVudW1Gb3JtYXRFdGMoREFUQURJUl9HRVQsICZpdHIpKSkKKyAg
ICAgICAgICAgIHJldHVybiByZXN1bHRzOworCisgICAgICAgIGlmICghaXRyKQorICAgICAgICAg
ICAgcmV0dXJuIHJlc3VsdHM7CisKKyAgICAgICAgRk9STUFURVRDIGRhdGE7CisKKyAgICAgICAg
Ly8gSUVudW1GT1JNQVRFVEM6Ok5leHQgcmV0dXJucyBTX0ZBTFNFIGlmIHRoZXJlIGFyZSBubyBt
b3JlIGl0ZW1zLgorICAgICAgICB3aGlsZSAoaXRyLT5OZXh0KDEsICZkYXRhLCAwKSA9PSBTX09L
KQorICAgICAgICAgICAgYWRkTWltZVR5cGVzRm9yRm9ybWF0KHJlc3VsdHMsIGRhdGEpOworICAg
IH0gZWxzZSB7CisgICAgICAgIGZvciAoRHJhZ0RhdGFNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
bV9kcmFnRGF0YU1hcC5iZWdpbigpOyBpdCAhPSBtX2RyYWdEYXRhTWFwLmVuZCgpOyArK2l0KSB7
CisgICAgICAgICAgICBGT1JNQVRFVEMgZGF0YTsKKyAgICAgICAgICAgIGRhdGEuY2ZGb3JtYXQg
PSAoKml0KS5rZXk7CisgICAgICAgICAgICBhZGRNaW1lVHlwZXNGb3JGb3JtYXQocmVzdWx0cywg
ZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0czsKK30KKworU3Ry
aW5nIFBhc3RlYm9hcmQ6OnJlYWRTdHJpbmcoY29uc3QgU3RyaW5nJiB0eXBlKQoreworICAgIGlm
ICghbV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm4gIiI7CisKKyAgICBDbGlwYm9hcmREYXRhVHlwZSBkYXRhVHlwZSA9IGNsaXBib2FyZFR5cGVG
cm9tTUlNRVR5cGUodHlwZSk7CisgICAgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBl
VGV4dCkKKyAgICAgICAgcmV0dXJuIG1fZGF0YU9iamVjdCA/IGdldFBsYWluVGV4dChtX2RhdGFP
YmplY3QuZ2V0KCkpIDogZ2V0UGxhaW5UZXh0KCZtX2RyYWdEYXRhTWFwKTsKKyAgICBpZiAoZGF0
YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVVUkwpCisgICAgICAgIHJldHVybiBtX2RhdGFPYmpl
Y3QgPyBnZXRVUkwobV9kYXRhT2JqZWN0LmdldCgpLCBEcmFnRGF0YTo6RG9Ob3RDb252ZXJ0Rmls
ZW5hbWVzKSA6IGdldFVSTCgmbV9kcmFnRGF0YU1hcCwgRHJhZ0RhdGE6OkRvTm90Q29udmVydEZp
bGVuYW1lcyk7CisgICAgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBlVGV4dEhUTUwp
IHsKKyAgICAgICAgU3RyaW5nIGRhdGEgPSBtX2RhdGFPYmplY3QgPyBnZXRUZXh0SFRNTChtX2Rh
dGFPYmplY3QuZ2V0KCkpIDogZ2V0VGV4dEhUTUwoJm1fZHJhZ0RhdGFNYXApOworICAgICAgICBp
ZiAoIWRhdGEuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgIHJl
dHVybiBtX2RhdGFPYmplY3QgPyBnZXRDRkhUTUwobV9kYXRhT2JqZWN0LmdldCgpKSA6IGdldENG
SFRNTCgmbV9kcmFnRGF0YU1hcCk7CisgICAgfQorCisgICAgcmV0dXJuICIiOworfQorCitWZWN0
b3I8U3RyaW5nPiBQYXN0ZWJvYXJkOjpyZWFkRmlsZW5hbWVzKCkKK3sKKyNpZiBVU0UoQ0YpCisg
ICAgVmVjdG9yPFN0cmluZz4gZmlsZU5hbWVzOworCisgICAgaWYgKG1fZGF0YU9iamVjdCkgewor
ICAgICAgICBTVEdNRURJVU0gbWVkaXVtOworICAgICAgICBpZiAoRkFJTEVEKG1fZGF0YU9iamVj
dC0+R2V0RGF0YShjZkhEcm9wRm9ybWF0KCksICZtZWRpdW0pKSkKKyAgICAgICAgICAgIHJldHVy
biBmaWxlTmFtZXM7CisKKyAgICAgICAgSERST1AgaGRyb3AgPSByZWludGVycHJldF9jYXN0PEhE
Uk9QPihHbG9iYWxMb2NrKG1lZGl1bS5oR2xvYmFsKSk7CisgICAgICAgIGlmICghaGRyb3ApCisg
ICAgICAgICAgICByZXR1cm4gZmlsZU5hbWVzOworCisgICAgICAgIFdDSEFSIGZpbGVuYW1lW01B
WF9QQVRIXTsKKyAgICAgICAgVUlOVCBmaWxlQ291bnQgPSBEcmFnUXVlcnlGaWxlVyhoZHJvcCwg
MHhGRkZGRkZGRiwgMCwgMCk7CisgICAgICAgIGZvciAoVUlOVCBpID0gMDsgaSA8IGZpbGVDb3Vu
dDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIURyYWdRdWVyeUZpbGVXKGhkcm9wLCBpLCBmaWxl
bmFtZSwgV1RGX0FSUkFZX0xFTkdUSChmaWxlbmFtZSkpKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgZmlsZU5hbWVzLmFwcGVuZChmaWxlbmFtZSk7CisgICAgICAgIH0K
KworICAgICAgICBHbG9iYWxVbmxvY2sobWVkaXVtLmhHbG9iYWwpOworICAgICAgICBSZWxlYXNl
U3RnTWVkaXVtKCZtZWRpdW0pOworICAgICAgICByZXR1cm4gZmlsZU5hbWVzOworICAgIH0KKyAg
ICBpZiAoIW1fZHJhZ0RhdGFNYXAuY29udGFpbnMoY2ZIRHJvcEZvcm1hdCgpLT5jZkZvcm1hdCkp
CisgICAgICAgIHJldHVybiBmaWxlTmFtZXM7CisgICAgcmV0dXJuIG1fZHJhZ0RhdGFNYXAuZ2V0
KGNmSERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQpOworI2Vsc2UKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBib29sIHdyaXRlVVJMKFdDRGF0
YU9iamVjdCAqZGF0YSwgY29uc3QgS1VSTCYgdXJsLCBTdHJpbmcgdGl0bGUsIGJvb2wgd2l0aFBs
YWluVGV4dCwgYm9vbCB3aXRoSFRNTCkKK3sKKyAgICBBU1NFUlQoZGF0YSk7CisKKyAgICBpZiAo
dXJsLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHRpdGxlLmlz
RW1wdHkoKSkgeworICAgICAgICB0aXRsZSA9IHVybC5sYXN0UGF0aENvbXBvbmVudCgpOworICAg
ICAgICBpZiAodGl0bGUuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGl0bGUgPSB1cmwuaG9zdCgp
OworICAgIH0KKworICAgIFNUR01FRElVTSBtZWRpdW0gPSB7MH07CisgICAgbWVkaXVtLnR5bWVk
ID0gVFlNRURfSEdMT0JBTDsKKworICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0
YSh1cmwsIHRpdGxlKTsKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBpZiAobWVkaXVt
LmhHbG9iYWwgJiYgRkFJTEVEKGRhdGEtPlNldERhdGEodXJsV0Zvcm1hdCgpLCAmbWVkaXVtLCBU
UlVFKSkpCisgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7CisgICAgZWxzZQor
ICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKworICAgIGlmICh3aXRoSFRNTCkgeworICAgICAgICBW
ZWN0b3I8Y2hhcj4gY2ZodG1sRGF0YTsKKyAgICAgICAgbWFya3VwVG9DRkhUTUwodXJsVG9NYXJr
dXAodXJsLCB0aXRsZSksICIiLCBjZmh0bWxEYXRhKTsKKyAgICAgICAgbWVkaXVtLmhHbG9iYWwg
PSBjcmVhdGVHbG9iYWxEYXRhKGNmaHRtbERhdGEpOworICAgICAgICBpZiAobWVkaXVtLmhHbG9i
YWwgJiYgRkFJTEVEKGRhdGEtPlNldERhdGEoaHRtbEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkp
CisgICAgICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOworICAgICAgICBlbHNl
CisgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAod2l0aFBsYWlu
VGV4dCkgeworICAgICAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEodXJsLnN0
cmluZygpKTsKKyAgICAgICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChkYXRhLT5TZXRE
YXRhKHBsYWluVGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQorICAgICAgICAgICAgOjpH
bG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3Vj
Y2VzcyA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK2Jvb2wgUGFz
dGVib2FyZDo6d3JpdGVTdHJpbmcoY29uc3QgU3RyaW5nJiB0eXBlLCBjb25zdCBTdHJpbmcmIGRh
dGEpCit7CisgICAgaWYgKCFtX3dyaXRhYmxlRGF0YU9iamVjdCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgQ2xpcGJvYXJkRGF0YVR5cGUgd2luVHlwZSA9IGNsaXBib2FyZFR5cGVGcm9t
TUlNRVR5cGUodHlwZSk7CisKKyAgICBpZiAod2luVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVS
TCkKKyAgICAgICAgcmV0dXJuIFdlYkNvcmU6OndyaXRlVVJMKG1fd3JpdGFibGVEYXRhT2JqZWN0
LmdldCgpLCBLVVJMKFBhcnNlZFVSTFN0cmluZywgZGF0YSksIFN0cmluZygpLCBmYWxzZSwgdHJ1
ZSk7CisKKyAgICBpZiAod2luVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRleHQpIHsKKyAgICAg
ICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKKyAgICAgICAgbWVkaXVtLnR5bWVkID0gVFlNRURf
SEdMT0JBTDsKKyAgICAgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEp
OworICAgICAgICBpZiAoIW1lZGl1bS5oR2xvYmFsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgICAgIGlmIChGQUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxh
aW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpIHsKKyAgICAgICAgICAgIDo6R2xvYmFs
RnJlZShtZWRpdW0uaEdsb2JhbCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQor
Cit2b2lkIFBhc3RlYm9hcmQ6OnNldERyYWdJbWFnZShEcmFnSW1hZ2VSZWYsIGNvbnN0IEludFBv
aW50JiBob3RTcG90KQoreworICAgIC8vIERvIG5vdGhpbmcgaW4gV2luZG93cy4KK30KKwordm9p
ZCBQYXN0ZWJvYXJkOjp3cml0ZVJhbmdlVG9EYXRhT2JqZWN0KFJhbmdlKiBzZWxlY3RlZFJhbmdl
LCBGcmFtZSogZnJhbWUpCit7CisgICAgQVNTRVJUKHNlbGVjdGVkUmFuZ2UpOworICAgIGlmICgh
bV93cml0YWJsZURhdGFPYmplY3QpCisgICAgICAgIHJldHVybjsKKworICAgIFNUR01FRElVTSBt
ZWRpdW0gPSB7MH07CisgICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKKworICAgIFZl
Y3RvcjxjaGFyPiBkYXRhOworICAgIG1hcmt1cFRvQ0ZIVE1MKGNyZWF0ZU1hcmt1cChzZWxlY3Rl
ZFJhbmdlLCAwLCBBbm5vdGF0ZUZvckludGVyY2hhbmdlKSwKKyAgICAgICAgc2VsZWN0ZWRSYW5n
ZS0+c3RhcnRDb250YWluZXIoKS0+ZG9jdW1lbnQoKS0+dXJsKCkuc3RyaW5nKCksIGRhdGEpOwor
ICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YShkYXRhKTsKKyAgICBpZiAobWVk
aXVtLmhHbG9iYWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKGh0bWxG
b3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQorICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhH
bG9iYWwpOworCisgICAgU3RyaW5nIHN0ciA9IGZyYW1lLT5lZGl0b3IoKS5zZWxlY3RlZFRleHRG
b3JDbGlwYm9hcmQoKTsKKyAgICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3bGlu
ZXMoc3RyKTsKKyAgICByZXBsYWNlTkJTUFdpdGhTcGFjZShzdHIpOworICAgIG1lZGl1bS5oR2xv
YmFsID0gY3JlYXRlR2xvYmFsRGF0YShzdHIpOworICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBG
QUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAm
bWVkaXVtLCBUUlVFKSkpCisgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7CisK
KyAgICBtZWRpdW0uaEdsb2JhbCA9IDA7CisgICAgaWYgKGZyYW1lLT5lZGl0b3IoKS5jYW5TbWFy
dENvcHlPckRlbGV0ZSgpKQorICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShz
bWFydFBhc3RlRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6
OndyaXRlU2VsZWN0aW9uKFJhbmdlKiBzZWxlY3RlZFJhbmdlLCBib29sIGNhblNtYXJ0Q29weU9y
RGVsZXRlLCBGcmFtZSogZnJhbWUsIFNob3VsZFNlcmlhbGl6ZVNlbGVjdGVkVGV4dEZvckNsaXBi
b2FyZCBzaG91bGRTZXJpYWxpemVTZWxlY3RlZFRleHRGb3JDbGlwYm9hcmQpCiB7CiAgICAgY2xl
YXIoKTsKQEAgLTE0NiwxMCArNDc3LDI5IEBADQogICAgICAgICAgICAgOjpTZXRDbGlwYm9hcmRE
YXRhKFdlYlNtYXJ0UGFzdGVGb3JtYXQsIDApOwogICAgICAgICAgICAgOjpDbG9zZUNsaXBib2Fy
ZCgpOwogICAgICAgICB9Ci0gICAgICAgIAogICAgIH0KKworICAgIHdyaXRlUmFuZ2VUb0RhdGFP
YmplY3Qoc2VsZWN0ZWRSYW5nZSwgZnJhbWUpOwogfQogCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRl
UGxhaW5UZXh0VG9EYXRhT2JqZWN0KGNvbnN0IFN0cmluZyYgdGV4dCwgU21hcnRSZXBsYWNlT3B0
aW9uIHNtYXJ0UmVwbGFjZU9wdGlvbikKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0
KQorICAgICAgICByZXR1cm47CisKKyAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OworICAgIG1l
ZGl1bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7CisKKyAgICBTdHJpbmcgc3RyID0gdGV4dDsKKyAg
ICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3bGluZXMoc3RyKTsKKyAgICByZXBs
YWNlTkJTUFdpdGhTcGFjZShzdHIpOworICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFs
RGF0YShzdHIpOworICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQobV93cml0YWJsZURh
dGFPYmplY3QtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCisg
ICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7ICAgICAgICAKKworICAgIG1lZGl1
bS5oR2xvYmFsID0gMDsKK30KKwogdm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVBsYWluVGV4dChjb25z
dCBTdHJpbmcmIHRleHQsIFNtYXJ0UmVwbGFjZU9wdGlvbiBzbWFydFJlcGxhY2VPcHRpb24pCiB7
CiAgICAgY2xlYXIoKTsKQEAgLTE3MSw4ICs1MjEsMTY1IEBADQogICAgICAgICAgICAgOjpDbG9z
ZUNsaXBib2FyZCgpOwogICAgICAgICB9CiAgICAgfQorCisgICAgd3JpdGVQbGFpblRleHRUb0Rh
dGFPYmplY3QodGV4dCwgc21hcnRSZXBsYWNlT3B0aW9uKTsKIH0KIAorI2lmICFPUyhXSU5DRSkK
K3N0YXRpYyBpbmxpbmUgdm9pZCBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKFBXU1RSIHBzeiwg
c2l6ZV90IGxlbmd0aCkKK3sKKyAgICBzaXplX3Qgd3JpdGVUbyA9IDA7CisgICAgc2l6ZV90IHJl
YWRGcm9tID0gMDsKKyAgICB3aGlsZSAocmVhZEZyb20gPCBsZW5ndGgpIHsKKyAgICAgICAgVUlO
VCB0eXBlID0gUGF0aEdldENoYXJUeXBlKHBzeltyZWFkRnJvbV0pOworICAgICAgICBpZiAoIXBz
eltyZWFkRnJvbV0gfHwgdHlwZSAmIChHQ1RfTEZOQ0hBUiB8IEdDVF9TSE9SVENIQVIpKQorICAg
ICAgICAgICAgcHN6W3dyaXRlVG8rK10gPSBwc3pbcmVhZEZyb21dOworCisgICAgICAgIHJlYWRG
cm9tKys7CisgICAgfQorICAgIHBzelt3cml0ZVRvXSA9IDA7Cit9CisjZW5kaWYKKworc3RhdGlj
IFN0cmluZyBmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRpdGxlKGNvbnN0IFN0cmluZyYgdXJsLCBj
b25zdCBTdHJpbmcmIHRpdGxlLCBjb25zdCBVQ2hhciogZXh0ZW5zaW9uLCBib29sIGlzTGluaykK
K3sKKyNpZiBPUyhXSU5DRSkKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBTdHJp
bmcoKTsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBmc1BhdGhNYXhMZW5ndGhFeGNs
dWRpbmdOdWxsVGVybWluYXRvciA9IE1BWF9QQVRIIC0gMTsKKyAgICBib29sIHVzZWRVUkwgPSBm
YWxzZTsKKyAgICBXQ0hBUiBmc1BhdGhCdWZmZXJbTUFYX1BBVEhdOworICAgIGZzUGF0aEJ1ZmZl
clswXSA9IDA7CisgICAgaW50IGV4dGVuc2lvbkxlbiA9IGV4dGVuc2lvbiA/IGxzdHJsZW4oZXh0
ZW5zaW9uKSA6IDA7CisgICAgaW50IGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4dGVuc2lvbiA9
IGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ051bGxUZXJtaW5hdG9yIC0gZXh0ZW5zaW9uTGVuOwor
CisgICAgaWYgKCF0aXRsZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0ZDo6
bWluPHNpemVfdD4odGl0bGUubGVuZ3RoKCksIGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4dGVu
c2lvbik7CisgICAgICAgIENvcHlNZW1vcnkoZnNQYXRoQnVmZmVyLCB0aXRsZS5jaGFyYWN0ZXJz
KCksIGxlbiAqIHNpemVvZihVQ2hhcikpOworICAgICAgICBmc1BhdGhCdWZmZXJbbGVuXSA9IDA7
CisgICAgICAgIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoZnNQYXRoQnVmZmVyLCBsZW4pOwor
ICAgIH0KKworICAgIGlmICghbHN0cmxlbihmc1BhdGhCdWZmZXIpKSB7CisgICAgICAgIEtVUkwg
a3VybChQYXJzZWRVUkxTdHJpbmcsIHVybCk7CisgICAgICAgIHVzZWRVUkwgPSB0cnVlOworICAg
ICAgICAvLyBUaGUgZmlsZW5hbWUgZm9yIGFueSBjb250ZW50IGJhc2VkIGRyYWcgb3IgZmlsZSB1
cmwgc2hvdWxkIGJlIHRoZSBsYXN0IGVsZW1lbnQgb2YgCisgICAgICAgIC8vIHRoZSBwYXRoLiBJ
ZiB3ZSBjYW4ndCBmaW5kIGl0LCBvciB3ZSdyZSBjb21pbmcgdXAgd2l0aCB0aGUgbmFtZSBmb3Ig
YSBsaW5rCisgICAgICAgIC8vIHdlIGp1c3QgdXNlIHRoZSBlbnRpcmUgdXJsLgorICAgICAgICBE
V09SRCBsZW4gPSBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb247CisgICAgICAgIFN0
cmluZyBsYXN0Q29tcG9uZW50ID0ga3VybC5sYXN0UGF0aENvbXBvbmVudCgpOworICAgICAgICBp
ZiAoa3VybC5pc0xvY2FsRmlsZSgpIHx8ICghaXNMaW5rICYmICFsYXN0Q29tcG9uZW50LmlzRW1w
dHkoKSkpIHsKKyAgICAgICAgICAgIGxlbiA9IHN0ZDo6bWluPERXT1JEPihmc1BhdGhNYXhMZW5n
dGhFeGNsdWRpbmdFeHRlbnNpb24sIGxhc3RDb21wb25lbnQubGVuZ3RoKCkpOworICAgICAgICAg
ICAgQ29weU1lbW9yeShmc1BhdGhCdWZmZXIsIGxhc3RDb21wb25lbnQuY2hhcmFjdGVycygpLCBs
ZW4gKiBzaXplb2YoVUNoYXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlbiA9
IHN0ZDo6bWluPERXT1JEPihmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24sIHVybC5s
ZW5ndGgoKSk7CisgICAgICAgICAgICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgdXJsLmNoYXJh
Y3RlcnMoKSwgbGVuICogc2l6ZW9mKFVDaGFyKSk7CisgICAgICAgIH0KKyAgICAgICAgZnNQYXRo
QnVmZmVyW2xlbl0gPSAwOworICAgICAgICBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKGZzUGF0
aEJ1ZmZlciwgbGVuKTsKKyAgICB9CisKKyAgICBpZiAoIWV4dGVuc2lvbikKKyAgICAgICAgcmV0
dXJuIFN0cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+KGZzUGF0aEJ1ZmZlcikpOworCisgICAgaWYg
KCFpc0xpbmsgJiYgdXNlZFVSTCkgeworICAgICAgICBQYXRoUmVuYW1lRXh0ZW5zaW9uKGZzUGF0
aEJ1ZmZlciwgZXh0ZW5zaW9uKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZyhzdGF0aWNfY2FzdDxV
Q2hhcio+KGZzUGF0aEJ1ZmZlcikpOworICAgIH0KKworICAgIHJldHVybiBtYWtlU3RyaW5nKHN0
YXRpY19jYXN0PGNvbnN0IFVDaGFyKj4oZnNQYXRoQnVmZmVyKSwgZXh0ZW5zaW9uKTsKKyNlbmRp
ZgorfQorCisvLyB3cml0ZUZpbGVUb0RhdGFPYmplY3QgdGFrZXMgb3duZXJzaGlwIG9mIGZpbGVE
ZXNjcmlwdG9yIGFuZCBmaWxlQ29udGVudAorc3RhdGljIEhSRVNVTFQgd3JpdGVGaWxlVG9EYXRh
T2JqZWN0KElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBIR0xPQkFMIGZpbGVEZXNjcmlwdG9yLCBI
R0xPQkFMIGZpbGVDb250ZW50LCBIR0xPQkFMIGhEcm9wQ29udGVudCkKK3sKKyAgICBIUkVTVUxU
IGhyID0gU19PSzsKKyAgICBGT1JNQVRFVEMqIGZlOworICAgIFNUR01FRElVTSBtZWRpdW0gPSB7
MH07CisgICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKKworICAgIGlmICghZmlsZURl
c2NyaXB0b3IgfHwgIWZpbGVDb250ZW50KQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICAvLyBE
ZXNjcmlwdG9yCisgICAgZmUgPSBmaWxlRGVzY3JpcHRvckZvcm1hdCgpOworCisgICAgbWVkaXVt
LmhHbG9iYWwgPSBmaWxlRGVzY3JpcHRvcjsKKworICAgIGlmIChGQUlMRUQoaHIgPSBkYXRhT2Jq
ZWN0LT5TZXREYXRhKGZlLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIGdvdG8gZXhpdDsKKwor
ICAgIC8vIENvbnRlbnRzCisgICAgZmUgPSBmaWxlQ29udGVudEZvcm1hdFplcm8oKTsKKyAgICBt
ZWRpdW0uaEdsb2JhbCA9IGZpbGVDb250ZW50OworICAgIGlmIChGQUlMRUQoaHIgPSBkYXRhT2Jq
ZWN0LT5TZXREYXRhKGZlLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIGdvdG8gZXhpdDsKKwor
I2lmIFVTRShDRikKKyAgICAvLyBIRFJPUAorICAgIGlmIChoRHJvcENvbnRlbnQpIHsKKyAgICAg
ICAgbWVkaXVtLmhHbG9iYWwgPSBoRHJvcENvbnRlbnQ7CisgICAgICAgIGhyID0gZGF0YU9iamVj
dC0+U2V0RGF0YShjZkhEcm9wRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpOworICAgIH0KKyNlbmRp
ZgorCitleGl0OgorICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGlmIChmaWxlRGVzY3Jp
cHRvcikKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoZmlsZURlc2NyaXB0b3IpOworICAgICAgICBp
ZiAoZmlsZUNvbnRlbnQpCisgICAgICAgICAgICBHbG9iYWxGcmVlKGZpbGVDb250ZW50KTsKKyAg
ICAgICAgaWYgKGhEcm9wQ29udGVudCkKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoaERyb3BDb250
ZW50KTsKKyAgICB9CisgICAgcmV0dXJuIGhyOworfQorCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRl
VVJMVG9EYXRhT2JqZWN0KGNvbnN0IEtVUkwmIGt1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGVTdHIs
IEZyYW1lKiBmcmFtZSkKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQorICAgICAg
ICByZXR1cm47CisgICAgV2ViQ29yZTo6d3JpdGVVUkwobV93cml0YWJsZURhdGFPYmplY3QuZ2V0
KCksIGt1cmwsIHRpdGxlU3RyLCB0cnVlLCB0cnVlKTsKKworICAgIFN0cmluZyB1cmwgPSBrdXJs
LnN0cmluZygpOworICAgIEFTU0VSVCh1cmwuY29udGFpbnNPbmx5QVNDSUkoKSk7IC8vIEtVUkw6
OnN0cmluZygpIGlzIFVSTCBlbmNvZGVkLgorCisgICAgU3RyaW5nIGZzUGF0aCA9IGZpbGVzeXN0
ZW1QYXRoRnJvbVVybE9yVGl0bGUodXJsLCB0aXRsZVN0ciwgTCIuVVJMIiwgdHJ1ZSk7CisgICAg
U3RyaW5nIGNvbnRlbnRTdHJpbmcoIltJbnRlcm5ldFNob3J0Y3V0XVxyXG5VUkw9IiArIHVybCAr
ICJcclxuIik7CisgICAgQ1N0cmluZyBjb250ZW50ID0gY29udGVudFN0cmluZy5sYXRpbjEoKTsK
KworICAgIGlmIChmc1BhdGgubGVuZ3RoKCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAg
SEdMT0JBTCB1cmxGaWxlRGVzY3JpcHRvciA9IEdsb2JhbEFsbG9jKEdQVFIsIHNpemVvZihGSUxF
R1JPVVBERVNDUklQVE9SKSk7CisgICAgaWYgKCF1cmxGaWxlRGVzY3JpcHRvcikKKyAgICAgICAg
cmV0dXJuOworCisgICAgSEdMT0JBTCB1cmxGaWxlQ29udGVudCA9IEdsb2JhbEFsbG9jKEdQVFIs
IGNvbnRlbnQubGVuZ3RoKCkpOworICAgIGlmICghdXJsRmlsZUNvbnRlbnQpIHsKKyAgICAgICAg
R2xvYmFsRnJlZSh1cmxGaWxlRGVzY3JpcHRvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBGSUxFR1JPVVBERVNDUklQVE9SKiBmZ2QgPSBzdGF0aWNfY2FzdDxGSUxFR1JPVVBERVND
UklQVE9SKj4oR2xvYmFsTG9jayh1cmxGaWxlRGVzY3JpcHRvcikpOworICAgIFplcm9NZW1vcnko
ZmdkLCBzaXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOworICAgIGZnZC0+Y0l0ZW1zID0gMTsK
KyAgICBmZ2QtPmZnZFswXS5kd0ZsYWdzID0gRkRfRklMRVNJWkU7CisgICAgZmdkLT5mZ2RbMF0u
bkZpbGVTaXplTG93ID0gY29udGVudC5sZW5ndGgoKTsKKworICAgIHVuc2lnbmVkIG1heFNpemUg
PSBzdGQ6Om1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgoZmdkLT5mZ2RbMF0u
Y0ZpbGVOYW1lKSk7CisgICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmlsZU5hbWUsIGZzUGF0
aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKKyAgICBHbG9iYWxVbmxv
Y2sodXJsRmlsZURlc2NyaXB0b3IpOworCisgICAgY2hhciogZmlsZUNvbnRlbnRzID0gc3RhdGlj
X2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2sodXJsRmlsZUNvbnRlbnQpKTsKKyAgICBDb3B5TWVtb3J5
KGZpbGVDb250ZW50cywgY29udGVudC5kYXRhKCksIGNvbnRlbnQubGVuZ3RoKCkpOworICAgIEds
b2JhbFVubG9jayh1cmxGaWxlQ29udGVudCk7CisKKyAgICB3cml0ZUZpbGVUb0RhdGFPYmplY3Qo
bV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybEZpbGVEZXNjcmlwdG9yLCB1cmxGaWxlQ29u
dGVudCwgMCk7Cit9CisKIHZvaWQgUGFzdGVib2FyZDo6d3JpdGVVUkwoY29uc3QgS1VSTCYgdXJs
LCBjb25zdCBTdHJpbmcmIHRpdGxlU3RyLCBGcmFtZSogZnJhbWUpCiB7CiAgICAgQVNTRVJUKCF1
cmwuaXNFbXB0eSgpKTsKQEAgLTIxMSw2ICs3MTgsOCBAQA0KICAgICAgICAgICAgIDo6R2xvYmFs
RnJlZShjYkRhdGEpOwogICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7CiAgICAgfQorCisgICAg
d3JpdGVVUkxUb0RhdGFPYmplY3QodXJsLCB0aXRsZVN0ciwgZnJhbWUpOwogfQogCiB2b2lkIFBh
c3RlYm9hcmQ6OndyaXRlSW1hZ2UoTm9kZSogbm9kZSwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmlu
ZyYpCkBAIC0yNTYsNiArNzY1LDExIEBADQogICAgIH0KIH0KIAordm9pZCBQYXN0ZWJvYXJkOjp3
cml0ZVBhc3RlYm9hcmQoY29uc3QgUGFzdGVib2FyZCYgc291cmNlUGFzdGVib2FyZCkKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6OndyaXRlQ2xpcGJvYXJk
KENsaXBib2FyZCopCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKQEAgLTM1Miw0ICs4NjYsMTg1
IEBADQogICAgIHJldHVybiAwOwogfQogCit2b2lkIFBhc3RlYm9hcmQ6OnNldEV4dGVybmFsRGF0
YU9iamVjdChJRGF0YU9iamVjdCAqZGF0YU9iamVjdCkKK3sKKyAgICBtX3dyaXRhYmxlRGF0YU9i
amVjdCA9IDA7CisgICAgbV9kYXRhT2JqZWN0ID0gZGF0YU9iamVjdDsKK30KKworc3RhdGljIENh
Y2hlZEltYWdlKiBnZXRDYWNoZWRJbWFnZShFbGVtZW50KiBlbGVtZW50KQoreworICAgIC8vIEF0
dGVtcHQgdG8gcHVsbCBDYWNoZWRJbWFnZSBmcm9tIGVsZW1lbnQKKyAgICBBU1NFUlQoZWxlbWVu
dCk7CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGVsZW1lbnQtPnJlbmRlcmVyKCk7Cisg
ICAgaWYgKCFyZW5kZXJlciB8fCAhcmVuZGVyZXItPmlzSW1hZ2UoKSkgCisgICAgICAgIHJldHVy
biAwOworCisgICAgUmVuZGVySW1hZ2UqIGltYWdlID0gdG9SZW5kZXJJbWFnZShyZW5kZXJlcik7
CisgICAgaWYgKGltYWdlLT5jYWNoZWRJbWFnZSgpICYmICFpbWFnZS0+Y2FjaGVkSW1hZ2UoKS0+
ZXJyb3JPY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gaW1hZ2UtPmNhY2hlZEltYWdlKCk7CisK
KyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSW1hZ2VGaWxl
RGVzY3JpcHRvcihjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ2FjaGVk
SW1hZ2UqIGltYWdlKQoreworICAgIEFTU0VSVF9BUkcoaW1hZ2UsIGltYWdlKTsKKyAgICBBU1NF
UlQoaW1hZ2UtPmltYWdlKCktPmRhdGEoKSk7CisKKyAgICBIUkVTVUxUIGhyID0gU19PSzsKKyAg
ICBIR0xPQkFMIG1lbU9iaiA9IDA7CisgICAgU3RyaW5nIGZzUGF0aDsKKyAgICBtZW1PYmogPSBH
bG9iYWxBbGxvYyhHUFRSLCBzaXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOworICAgIGlmICgh
bWVtT2JqKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEZJTEVHUk9VUERFU0NSSVBUT1IqIGZn
ZCA9IChGSUxFR1JPVVBERVNDUklQVE9SKilHbG9iYWxMb2NrKG1lbU9iaik7CisgICAgbWVtc2V0
KGZnZCwgMCwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKKyAgICBmZ2QtPmNJdGVtcyA9
IDE7CisgICAgZmdkLT5mZ2RbMF0uZHdGbGFncyA9IEZEX0ZJTEVTSVpFOworICAgIGZnZC0+Zmdk
WzBdLm5GaWxlU2l6ZUxvdyA9IGltYWdlLT5pbWFnZSgpLT5kYXRhKCktPnNpemUoKTsKKworICAg
IGNvbnN0IFN0cmluZyYgcHJlZmVycmVkVGl0bGUgPSB0aXRsZS5pc0VtcHR5KCkgPyBpbWFnZS0+
cmVzcG9uc2UoKS5zdWdnZXN0ZWRGaWxlbmFtZSgpIDogdGl0bGU7CisgICAgU3RyaW5nIGV4dGVu
c2lvbiA9IGltYWdlLT5pbWFnZSgpLT5maWxlbmFtZUV4dGVuc2lvbigpOworICAgIGlmIChleHRl
bnNpb24uaXNFbXB0eSgpKSB7CisgICAgICAgIC8vIERvIG5vdCBjb250aW51ZSBwcm9jZXNzaW5n
IGluIHRoZSByYXJlIGFuZCB1bnVzdWFsIGNhc2Ugd2hlcmUgYSBkZWNvZGVkIGltYWdlIGlzIG5v
dCBhYmxlIAorICAgICAgICAvLyB0byBwcm92aWRlIGEgZmlsZW5hbWUgZXh0ZW5zaW9uLiBTb21l
dGhpbmcgdHJpY2t5IChsaWtlIGEgYmFpdC1uLXN3aXRjaCkgaXMgZ29pbmcgb24KKyAgICAgICAg
cmV0dXJuIDA7CisgICAgfQorICAgIGV4dGVuc2lvbi5pbnNlcnQoIi4iLCAwKTsKKyAgICBmc1Bh
dGggPSBmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRpdGxlKHVybCwgcHJlZmVycmVkVGl0bGUsIGV4
dGVuc2lvbi5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCBmYWxzZSk7CisKKyAgICBp
ZiAoZnNQYXRoLmxlbmd0aCgpIDw9IDApIHsKKyAgICAgICAgR2xvYmFsVW5sb2NrKG1lbU9iaik7
CisgICAgICAgIEdsb2JhbEZyZWUobWVtT2JqKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQor
CisgICAgaW50IG1heFNpemUgPSBzdGQ6Om1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9M
RU5HVEgoZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lKSk7CisgICAgQ29weU1lbW9yeShmZ2QtPmZnZFsw
XS5jRmlsZU5hbWUsIChMUENXU1RSKWZzUGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXpl
b2YoVUNoYXIpKTsKKyAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKKworICAgIHJldHVybiBtZW1P
Ymo7Cit9CisKK3N0YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoU2hh
cmVkQnVmZmVyKiBkYXRhKQoreworICAgIEhHTE9CQUwgbWVtT2JqID0gR2xvYmFsQWxsb2MoR1BU
UiwgZGF0YS0+c2l6ZSgpKTsKKyAgICBpZiAoIW1lbU9iaikgCisgICAgICAgIHJldHVybiAwOwor
CisgICAgY2hhciogZmlsZUNvbnRlbnRzID0gKFBTVFIpR2xvYmFsTG9jayhtZW1PYmopOworCisg
ICAgQ29weU1lbW9yeShmaWxlQ29udGVudHMsIGRhdGEtPmRhdGEoKSwgZGF0YS0+c2l6ZSgpKTsK
KworICAgIEdsb2JhbFVubG9jayhtZW1PYmopOworCisgICAgcmV0dXJuIG1lbU9iajsKK30KKwor
c3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSERyb3BDb250ZW50KGNvbnN0IEtVUkwmIHVybCwg
U3RyaW5nJiBmaWxlTmFtZSwgU2hhcmVkQnVmZmVyKiBkYXRhKQoreworICAgIGlmIChmaWxlTmFt
ZS5pc0VtcHR5KCkgfHwgIWRhdGEpCisgICAgICAgIHJldHVybiAwOworCisgICAgV0NIQVIgZmls
ZVBhdGhbTUFYX1BBVEhdOworCisgICAgaWYgKHVybC5pc0xvY2FsRmlsZSgpKSB7CisgICAgICAg
IFN0cmluZyBsb2NhbFBhdGggPSBkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXModXJsLnBhdGgoKSk7
CisgICAgICAgIC8vIHdpbmRvd3MgZG9lcyBub3QgZW5qb3kgYSBsZWFkaW5nIHNsYXNoIG9uIHBh
dGhzCisgICAgICAgIGlmIChsb2NhbFBhdGhbMF0gPT0gJy8nKQorICAgICAgICAgICAgbG9jYWxQ
YXRoID0gbG9jYWxQYXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgTFBDV1NUUiBsb2NhbFBhdGhT
dHIgPSBsb2NhbFBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKTsKKyAgICAgICAg
aWYgKHdjc2xlbihsb2NhbFBhdGhTdHIpICsgMSA8IE1BWF9QQVRIKQorICAgICAgICAgICAgd2Nz
Y3B5X3MoZmlsZVBhdGgsIE1BWF9QQVRILCBsb2NhbFBhdGhTdHIpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworI2lmIE9TKFdJTkNFKQorICAgICAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgICAgIFdD
SEFSIHRlbXBQYXRoW01BWF9QQVRIXTsKKyAgICAgICAgV0NIQVIgZXh0ZW5zaW9uW01BWF9QQVRI
XTsKKyAgICAgICAgaWYgKCE6OkdldFRlbXBQYXRoKFdURl9BUlJBWV9MRU5HVEgodGVtcFBhdGgp
LCB0ZW1wUGF0aCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCE6OlBhdGhB
cHBlbmQodGVtcFBhdGgsIGZpbGVOYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkp
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIExQQ1dTVFIgZm91bmRFeHRlbnNpb24g
PSA6OlBhdGhGaW5kRXh0ZW5zaW9uKHRlbXBQYXRoKTsKKyAgICAgICAgaWYgKGZvdW5kRXh0ZW5z
aW9uKSB7CisgICAgICAgICAgICBpZiAod2NzY3B5X3MoZXh0ZW5zaW9uLCBNQVhfUEFUSCwgZm91
bmRFeHRlbnNpb24pKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UK
KyAgICAgICAgICAgICpleHRlbnNpb24gPSAwOworICAgICAgICA6OlBhdGhSZW1vdmVFeHRlbnNp
b24odGVtcFBhdGgpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwOyBpKyspIHsK
KyAgICAgICAgICAgIGlmIChzd3ByaW50Zl9zKGZpbGVQYXRoLCBNQVhfUEFUSCwgVEVYVCgiJXMt
JWQlcyIpLCB0ZW1wUGF0aCwgaSwgZXh0ZW5zaW9uKSA9PSAtMSkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgICAgIGlmICghOjpQYXRoRmlsZUV4aXN0cyhmaWxlUGF0aCkpCisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgSEFORExFIHRlbXBGaWxl
SGFuZGxlID0gQ3JlYXRlRmlsZShmaWxlUGF0aCwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklU
RSwgMCwgMCwgQ1JFQVRFX0FMV0FZUywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCAwKTsKKyAgICAg
ICAgaWYgKHRlbXBGaWxlSGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgdG8gdGhpcyB0ZW1wIGZp
bGUuCisgICAgICAgIERXT1JEIHdyaXR0ZW47CisgICAgICAgIEJPT0wgdGVtcFdyaXRlU3VjY2Vl
ZGVkID0gV3JpdGVGaWxlKHRlbXBGaWxlSGFuZGxlLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUo
KSwgJndyaXR0ZW4sIDApOworICAgICAgICBDbG9zZUhhbmRsZSh0ZW1wRmlsZUhhbmRsZSk7Cisg
ICAgICAgIGlmICghdGVtcFdyaXRlU3VjY2VlZGVkKQorICAgICAgICAgICAgcmV0dXJuIDA7Cisj
ZW5kaWYKKyAgICB9CisKKyAgICBTSVpFX1QgZHJvcEZpbGVzU2l6ZSA9IHNpemVvZihEUk9QRklM
RVMpICsgKHNpemVvZihXQ0hBUikgKiAod2NzbGVuKGZpbGVQYXRoKSArIDIpKTsKKyAgICBIR0xP
QkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdITkQgfCBHTUVNX1NIQVJFLCBkcm9wRmlsZXNTaXpl
KTsKKyAgICBpZiAoIW1lbU9iaikgCisgICAgICAgIHJldHVybiAwOworCisgICAgRFJPUEZJTEVT
KiBkcm9wRmlsZXMgPSAoRFJPUEZJTEVTKikgR2xvYmFsTG9jayhtZW1PYmopOworICAgIGRyb3BG
aWxlcy0+cEZpbGVzID0gc2l6ZW9mKERST1BGSUxFUyk7CisgICAgZHJvcEZpbGVzLT5mV2lkZSA9
IFRSVUU7CisgICAgd2NzY3B5KChMUFdTVFIpKGRyb3BGaWxlcyArIDEpLCBmaWxlUGF0aCk7ICAg
IAorICAgIEdsb2JhbFVubG9jayhtZW1PYmopOworCisgICAgcmV0dXJuIG1lbU9iajsKK30KKwor
dm9pZCBQYXN0ZWJvYXJkOjp3cml0ZUltYWdlVG9EYXRhT2JqZWN0KEVsZW1lbnQqIGVsZW1lbnQs
IGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICAvLyBTaG92ZSBpbWFnZSBkYXRhIGludG8gYSBEYXRh
T2JqZWN0IGZvciB1c2UgYXMgYSBmaWxlCisgICAgQ2FjaGVkSW1hZ2UqIGNhY2hlZEltYWdlID0g
Z2V0Q2FjaGVkSW1hZ2UoZWxlbWVudCk7CisgICAgaWYgKCFjYWNoZWRJbWFnZSB8fCAhY2FjaGVk
SW1hZ2UtPmltYWdlRm9yUmVuZGVyZXIoZWxlbWVudC0+cmVuZGVyZXIoKSkgfHwgIWNhY2hlZElt
YWdlLT5pc0xvYWRlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTaGFyZWRCdWZmZXIqIGlt
YWdlQnVmZmVyID0gY2FjaGVkSW1hZ2UtPmltYWdlRm9yUmVuZGVyZXIoZWxlbWVudC0+cmVuZGVy
ZXIoKSktPmRhdGEoKTsKKyAgICBpZiAoIWltYWdlQnVmZmVyIHx8ICFpbWFnZUJ1ZmZlci0+c2l6
ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBIR0xPQkFMIGltYWdlRmlsZURlc2NyaXB0b3Ig
PSBjcmVhdGVHbG9iYWxJbWFnZUZpbGVEZXNjcmlwdG9yKHVybC5zdHJpbmcoKSwgZWxlbWVudC0+
Z2V0QXR0cmlidXRlKEhUTUxOYW1lczo6YWx0QXR0ciksIGNhY2hlZEltYWdlKTsKKyAgICBpZiAo
IWltYWdlRmlsZURlc2NyaXB0b3IpCisgICAgICAgIHJldHVybjsKKworICAgIEhHTE9CQUwgaW1h
Z2VGaWxlQ29udGVudCA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoaW1hZ2VCdWZmZXIp
OworICAgIGlmICghaW1hZ2VGaWxlQ29udGVudCkgeworICAgICAgICBHbG9iYWxGcmVlKGltYWdl
RmlsZURlc2NyaXB0b3IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nIGZp
bGVOYW1lID0gY2FjaGVkSW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5hbWUoKTsKKyAg
ICBIR0xPQkFMIGhEcm9wQ29udGVudCA9IGNyZWF0ZUdsb2JhbEhEcm9wQ29udGVudCh1cmwsIGZp
bGVOYW1lLCBpbWFnZUJ1ZmZlcik7CisgICAgaWYgKCFoRHJvcENvbnRlbnQpIHsKKyAgICAgICAg
R2xvYmFsRnJlZShoRHJvcENvbnRlbnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
d3JpdGVGaWxlVG9EYXRhT2JqZWN0KG1fd3JpdGFibGVEYXRhT2JqZWN0LmdldCgpLCBpbWFnZUZp
bGVEZXNjcmlwdG9yLCBpbWFnZUZpbGVDb250ZW50LCBoRHJvcENvbnRlbnQpOworfQorCit2b2lk
IFBhc3RlYm9hcmQ6OndyaXRlVVJMVG9Xcml0YWJsZURhdGFPYmplY3QoY29uc3QgS1VSTCYgdXJs
LCBjb25zdCBTdHJpbmcmIHRpdGxlKQoreworICAgIFdlYkNvcmU6OndyaXRlVVJMKG1fd3JpdGFi
bGVEYXRhT2JqZWN0LmdldCgpLCB1cmwsIHRpdGxlLCB0cnVlLCBmYWxzZSk7Cit9CisKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZw0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNjMy
KQ0KKysrIFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEs
MyArMSwxNCBAQA0KKzIwMTMtMDUtMjQgIFh1ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFp
ZHUuY29tPgorCisgICAgICAgIE1vdmUgV2luZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJk
LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBXZWJD
b3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcDoKKyAgICAgICAgKFdlYkRyYWdDbGllbnQ6Ondp
bGxQZXJmb3JtRHJhZ1NvdXJjZUFjdGlvbik6IEdldCBJRGF0YU9iamVjdCBmcm9tIFBhc3RlYm9h
cmQgaW5zdGVhZCBvZiBDbGlwYm9hcmQuCisgICAgICAgIChXZWJEcmFnQ2xpZW50OjpzdGFydERy
YWcpOiBEaXR0by4KKwogMjAxMy0wNS0yMSAgTWFyayBTYWxpc2J1cnkgIDxtYXJrLnNhbGlzYnVy
eUBocC5jb20+CiAKICAgICAgICAgW1dpbmRvd3MsIGN1cmxdIFdlYkRvd25sb2FkQ3VybC5jcHAg
c2hvdWxkIG5vdCBpbmNsdWRlIFN5c3RlbVRpbWUuaApJbmRleDogU291cmNlL1dlYktpdC93aW4v
V2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5jcHANCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBTb3VyY2Uv
V2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcAkocmV2aXNpb24gMTUw
NjI5KQ0KKysrIFNvdXJjZS9XZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQu
Y3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtMzEsMTAgKzMxLDExIEBADQogCiAjaW5jbHVkZSA8c2hs
b2JqLmg+CiAKLSNpbmNsdWRlIDxXZWJDb3JlL0NsaXBib2FyZFdpbi5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvQ2xpcGJvYXJkLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9EcmFnQ29udHJvbGxlci5oPgog
I2luY2x1ZGUgPFdlYkNvcmUvRHJhZ0RhdGEuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0V2ZW50SGFu
ZGxlci5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUGFzdGVib2FyZC5oPgogI2luY2x1ZGUgPFdlYkNv
cmUvUGxhdGZvcm1Nb3VzZUV2ZW50Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9GcmFtZS5oPgogI2lu
Y2x1ZGUgPFdlYkNvcmUvRnJhbWVWaWV3Lmg+CkBAIC0xMDMsMTIgKzEwNCwxMiBAQA0KICAgICAg
ICAgcmV0dXJuOwogCiAgICAgUE9JTlQgcG9pbnQgPSBpbnRQb2ludDsKLSAgICBDT01QdHI8SURh
dGFPYmplY3Q+IGRhdGFPYmplY3QgPSBzdGF0aWNfY2FzdDxDbGlwYm9hcmRXaW4qPihjbGlwYm9h
cmQpLT5kYXRhT2JqZWN0KCk7CisgICAgQ09NUHRyPElEYXRhT2JqZWN0PiBkYXRhT2JqZWN0ID0g
Y2xpcGJvYXJkLT5wYXN0ZWJvYXJkKCkuZGF0YU9iamVjdCgpOwogCiAgICAgQ09NUHRyPElEYXRh
T2JqZWN0PiBuZXdEYXRhT2JqZWN0OwogICAgIEhSRVNVTFQgcmVzdWx0ID0gdWlEZWxlZ2F0ZS0+
d2lsbFBlcmZvcm1EcmFnU291cmNlQWN0aW9uKG1fd2ViVmlldywgc3RhdGljX2Nhc3Q8V2ViRHJh
Z1NvdXJjZUFjdGlvbj4oYWN0aW9uKSwgJnBvaW50LCBkYXRhT2JqZWN0LmdldCgpLCAmbmV3RGF0
YU9iamVjdCk7CiAgICAgaWYgKHJlc3VsdCA9PSBTX09LICYmIG5ld0RhdGFPYmplY3QgIT0gZGF0
YU9iamVjdCkKLSAgICAgICAgc3RhdGljX2Nhc3Q8Q2xpcGJvYXJkV2luKj4oY2xpcGJvYXJkKS0+
c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KG5ld0RhdGFPYmplY3QuZ2V0KCkpOworICAgICAgICBjb25z
dF9jYXN0PFBhc3RlYm9hcmQmPihjbGlwYm9hcmQtPnBhc3RlYm9hcmQoKSkuc2V0RXh0ZXJuYWxE
YXRhT2JqZWN0KG5ld0RhdGFPYmplY3QuZ2V0KCkpOwogfQogCiB2b2lkIFdlYkRyYWdDbGllbnQ6
OnN0YXJ0RHJhZyhEcmFnSW1hZ2VSZWYgaW1hZ2UsIGNvbnN0IEludFBvaW50JiBpbWFnZU9yaWdp
biwgY29uc3QgSW50UG9pbnQmIGRyYWdQb2ludCwgQ2xpcGJvYXJkKiBjbGlwYm9hcmQsIEZyYW1l
KiBmcmFtZSwgYm9vbCBpc0xpbmspCkBAIC0xMjQsNyArMTI1LDcgQEANCiAgICAgaWYgKEZBSUxF
RChXZWJEcm9wU291cmNlOjpjcmVhdGVJbnN0YW5jZShtX3dlYlZpZXcsICZzb3VyY2UpKSkKICAg
ICAgICAgcmV0dXJuOwogCi0gICAgZGF0YU9iamVjdCA9IHN0YXRpY19jYXN0PENsaXBib2FyZFdp
bio+KGNsaXBib2FyZCktPmRhdGFPYmplY3QoKTsKKyAgICBkYXRhT2JqZWN0ID0gY2xpcGJvYXJk
LT5wYXN0ZWJvYXJkKCkuZGF0YU9iamVjdCgpOwogICAgIGlmIChzb3VyY2UgJiYgKGltYWdlIHx8
IGRhdGFPYmplY3QpKSB7CiAgICAgICAgIGlmIChpbWFnZSkgewogICAgICAgICAgICAgaWYoU1VD
Q0VFREVEKENvQ3JlYXRlSW5zdGFuY2UoQ0xTSURfRHJhZ0Ryb3BIZWxwZXIsIDAsIENMU0NUWF9J
TlBST0NfU0VSVkVSLAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>202784</attachid>
            <date>2013-05-24 01:29:23 -0700</date>
            <delta_ts>2013-05-24 01:30:18 -0700</delta_ts>
            <desc>patch</desc>
            <filename>116258_3.patch</filename>
            <type>text/plain</type>
            <size>67111</size>
            <attacher name="huangxueqing">huangxueqing</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9X
ZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNjMyKQ0KKysrIFNvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEsMyArMSw2MyBAQA0KKzIwMTMtMDUtMjQgIFh1
ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgorCisgICAgICAgIE1vdmUgV2lu
ZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJkLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdHM6CisgICAgICAgIENsaXBib2FyZCByZWZhY3Rv
ciwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogZG9tL0NsaXBib2FyZC5oOgorICAgICAgICAq
IHBhZ2Uvd2luL0V2ZW50SGFuZGxlcldpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFdmVudEhh
bmRsZXI6OmNyZWF0ZURyYWdnaW5nQ2xpcGJvYXJkKTogQ3JlYXRlIENsaXBib2FyZCBpbnN0ZWFk
IG9mIENsaXBib2FyZFdpbi4KKyAgICAgICAgKiBwbGF0Zm9ybS9QYXN0ZWJvYXJkLmg6CisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFBhc3RlYm9hcmQpOgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6ZGF0YU9iamVjdCk6IEdldCBJRGF0YU9iamVjdCBieSBDbGlwYm9yYWQuCisg
ICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0YWJsZURhdGFPYmplY3QpOiBHZXQgV0NE
YXRhT2JqZWN0IGJ5IENsaXBib3JhZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vQ2xpcGJvYXJk
V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNsaXBib2FyZDo6Y3JlYXRlRHJhZ0ltYWdlKTog
Q2hhbmdlIHBhcmFtZXRlciBuYW1lIGxvYyB0byBkcmFnTG9jYXRpb24uCisgICAgICAgIChXZWJD
b3JlOjpDbGlwYm9hcmQ6OmRlY2xhcmVBbmRXcml0ZURyYWdJbWFnZSk6IEltcGxlbWVudCBkZWNs
YXJlQW5kV3JpdGVEcmFnSW1hZ2UgdXNlIFdDRGF0YU9iamVjdCBleHBvc2VkIGJ5IFBhc3RlYm9h
cmQuCisgICAgICAgICogcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5oOiBSZW1vdmVkLgorICAg
ICAgICAqIHBsYXRmb3JtL3dpbi9FZGl0b3JXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6RWRp
dG9yOjpuZXdHZW5lcmFsQ2xpcGJvYXJkKTogQ3JlYXRlIENsaXBib2FyZCBpbnN0ZWFkIG9mIENs
aXBib2FyZFdpbi4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmNyZWF0ZUZv
ckNvcHlBbmRQYXN0ZSk6IENyZWF0ZSBhIFBhc3RlYm9hcmQuCisgICAgICAgIChXZWJDb3JlOjpQ
YXN0ZWJvYXJkOjpjcmVhdGVQcml2YXRlKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0
ZWJvYXJkOjpjcmVhdGVGb3JEcmFnQW5kRHJvcCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6ZmluaXNoQ3JlYXRpbmdQYXN0ZWJvYXJkKTogQ3JlYXRlIFBhc3RlYm9hcmQg
dXNlIFdpbmRvd3MgQVBJLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6UGFzdGVib2Fy
ZCk6CisgICAgICAgIChXZWJDb3JlOjpjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKTogQ29waWVk
IGZyb20gQ2xpcGJvYXJkV2luLmNwcC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmNs
ZWFyKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpoYXNEYXRhKTogRGl0
dG8uCisgICAgICAgIChXZWJDb3JlOjphZGRNaW1lVHlwZXNGb3JGb3JtYXQpOiBEaXR0by4KKyAg
ICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OnR5cGVzKTogRGl0dG8uCisgICAgICAgIChXZWJD
b3JlOjpQYXN0ZWJvYXJkOjpyZWFkU3RyaW5nKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQ
YXN0ZWJvYXJkOjpyZWFkRmlsZW5hbWVzKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjp3cml0
ZVVSTCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVTdHJpbmcp
OiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OnNldERyYWdJbWFnZSk6IERp
dHRvLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVSYW5nZVRvRGF0YU9iamVj
dCk6IFdyaXRlIHJhbmdlIHRvIFdDRGF0YU9iamVjdC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3Rl
Ym9hcmQ6OndyaXRlU2VsZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6Ondy
aXRlUGxhaW5UZXh0VG9EYXRhT2JqZWN0KTogV3JpdGUgUGxhaW5UZXh0IHRvIFdDRGF0YU9iamVj
dC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlUGxhaW5UZXh0KToKKyAgICAg
ICAgKFdlYkNvcmU6OnBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMpOiBDb3BpZWQgZnJvbSBDbGlw
Ym9hcmRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6ZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JU
aXRsZSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6d3JpdGVGaWxlVG9EYXRhT2JqZWN0KTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVVSTFRvRGF0YU9iamVj
dCk6IFdyaXRlIFVSTCB0byBXQ0RhdGFPYmplY3QuCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJv
YXJkOjp3cml0ZVVSTCk6IENvcGllZCBmcm9tIENsaXBib2FyZFdpbi5jcHAuCisgICAgICAgIChX
ZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVBhc3RlYm9hcmQpOiBDb3BpZWQgZnJvbSBQYXN0ZWJv
YXJkOjp3cml0ZUNsaXBib2FyZC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmRvY3Vt
ZW50RnJhZ21lbnQpOiBDb3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6UGFzdGVib2FyZDo6c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KTogQ2xpcGJvYXJkIGNhbiBz
ZXQgbmV3IElEYXRhT2JqZWN0LgorICAgICAgICAoV2ViQ29yZTo6Z2V0Q2FjaGVkSW1hZ2UpOiBD
b3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlR2xv
YmFsSW1hZ2VGaWxlRGVzY3JpcHRvcik6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
R2xvYmFsSW1hZ2VGaWxlQ29udGVudCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
R2xvYmFsSERyb3BDb250ZW50KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJk
Ojp3cml0ZUltYWdlVG9EYXRhT2JqZWN0KTogRXhwb3NlIHRvIG1ha2UgQ2xpcGJvYXJkIGltcGxl
bWVudCBkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UuCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJv
YXJkOjp3cml0ZVVSTFRvV3JpdGFibGVEYXRhT2JqZWN0KTogRGl0dG8uCisKIDIwMTMtMDUtMjMg
IEJldGggRGFraW4gIDxiZGFraW5AYXBwbGUuY29tPgogCiAgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTY3MDIKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Rv
bS9DbGlwYm9hcmQuaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9DbGlwYm9h
cmQuaAkocmV2aXNpb24gMTUwNjI5KQ0KKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9DbGlwYm9hcmQu
aAkod29ya2luZyBjb3B5KQ0KQEAgLTM0LDcgKzM0LDcgQEANCiAvLyBUaGlzIERPTSBvYmplY3Qg
bm93IHdvcmtzIGJ5IGNhbGxpbmcgdGhyb3VnaCB0byBjbGFzc2VzIGluIHRoZSBwbGF0Zm9ybSBs
YXllci4KIC8vIFNwZWNpZmljYWxseSwgdGhlIGNsYXNzIGN1cnJlbnRseSBuYW1lZCBQYXN0ZWJv
YXJkLiBUaGUgbGVnYWN5IHN0eWxlIGluc3RlYWQKIC8vIHVzZXMgdGhpcyBhcyBhbiBhYnN0cmFj
dCBiYXNlIGNsYXNzLgotI2RlZmluZSBXVEZfVVNFX0xFR0FDWV9TVFlMRV9BQlNUUkFDVF9DTElQ
Qk9BUkRfQ0xBU1MgKFBMQVRGT1JNKElPUykgfHwgUExBVEZPUk0oUVQpIHx8IFBMQVRGT1JNKFdJ
TikpCisjZGVmaW5lIFdURl9VU0VfTEVHQUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFT
UyAoUExBVEZPUk0oSU9TKSB8fCBQTEFURk9STShRVCkpCiAKICNpZiBVU0UoTEVHQUNZX1NUWUxF
X0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFTUykKICNkZWZpbmUgTEVHQUNZX1ZJUlRVQUwgdmlydHVh
bApJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS93aW4vRXZlbnRIYW5kbGVyV2luLmNwcA0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2Uvd2luL0V2ZW50SGFuZGxlcldpbi5jcHAJ
KHJldmlzaW9uIDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL3dpbi9FdmVudEhhbmRs
ZXJXaW4uY3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtMjcsNiArMjcsOCBAQA0KICNpbmNsdWRlICJj
b25maWcuaCIKICNpbmNsdWRlICJFdmVudEhhbmRsZXIuaCIKIAorI2luY2x1ZGUgIkNPTVB0ci5o
IgorI2luY2x1ZGUgIkNsaXBib2FyZC5oIgogI2luY2x1ZGUgIkN1cnNvci5oIgogI2luY2x1ZGUg
IkZsb2F0UG9pbnQuaCIKICNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKQEAgLTQzLDEyICs0
NSw2IEBADQogI2luY2x1ZGUgIldDRGF0YU9iamVjdC5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVu
dGVkLmgiCiAKLSNpZiBPUyhXSU5DRSkKLSNpbmNsdWRlICJDbGlwYm9hcmQuaCIKLSNlbHNlCi0j
aW5jbHVkZSAiQ2xpcGJvYXJkV2luLmgiCi0jZW5kaWYKLQogbmFtZXNwYWNlIFdlYkNvcmUgewog
CiAjaWYgRU5BQkxFKERSQUdfU1VQUE9SVCkKQEAgLTEwMSw5ICs5Nyw3IEBADQogI2lmIE9TKFdJ
TkNFKQogICAgIHJldHVybiAwOwogI2Vsc2UKLSAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBkYXRh
T2JqZWN0OwotICAgIFdDRGF0YU9iamVjdDo6Y3JlYXRlSW5zdGFuY2UoJmRhdGFPYmplY3QpOwot
ICAgIHJldHVybiBDbGlwYm9hcmRXaW46OmNyZWF0ZShDbGlwYm9hcmQ6OkRyYWdBbmREcm9wLCBk
YXRhT2JqZWN0LmdldCgpLCBDbGlwYm9hcmRXcml0YWJsZSwgbV9mcmFtZSk7CisgICAgcmV0dXJu
IENsaXBib2FyZDo6Y3JlYXRlRm9yRHJhZ0FuZERyb3AoKTsKICNlbmRpZgogfQogI2VuZGlmCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgNCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgJKHJldmlzaW9uIDE1MDYyOSkN
CisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgJKHdvcmtpbmcgY29weSkN
CkBAIC0zOCw2ICszOCw5IEBADQogI2VuZGlmCiAKICNpZiBQTEFURk9STShXSU4pCisjaW5jbHVk
ZSA8V2ViQ29yZS9DT01QdHIuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1dDRGF0YU9iamVjdC5oPgor
I2luY2x1ZGUgPG9iamlkbC5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KIHR5cGVkZWYgc3RydWN0
IEhXTkRfXyogSFdORDsKICNlbmRpZgpAQCAtNjQsNiArNjcsNyBAQA0KIGNsYXNzIENsaXBib2Fy
ZDsKIGNsYXNzIERvY3VtZW50RnJhZ21lbnQ7CiBjbGFzcyBEcmFnRGF0YTsKK2NsYXNzIEVsZW1l
bnQ7CiBjbGFzcyBGcmFtZTsKIGNsYXNzIEhpdFRlc3RSZXN1bHQ7CiBjbGFzcyBLVVJMOwpAQCAt
MTAwLDYgKzEwNCwxMiBAQA0KICAgICBQYXNzUmVmUHRyPERhdGFPYmplY3RHdGs+IGRhdGFPYmpl
Y3QoKSBjb25zdDsKICNlbmRpZgogCisjaWYgUExBVEZPUk0oV0lOKQorICAgIGV4cGxpY2l0IFBh
c3RlYm9hcmQoSURhdGFPYmplY3QqKTsKKyAgICBleHBsaWNpdCBQYXN0ZWJvYXJkKFdDRGF0YU9i
amVjdCopOworICAgIGV4cGxpY2l0IFBhc3RlYm9hcmQoY29uc3QgRHJhZ0RhdGFNYXAmKTsKKyNl
bmRpZgorCiAgICAgLy8gRGVwcmVjYXRlZC4gVXNlIGNyZWF0ZUZvckNvcHlBbmRQYXN0ZSBpbnN0
ZWFkLgogICAgIHN0YXRpYyBQYXN0ZWJvYXJkKiBnZW5lcmFsUGFzdGVib2FyZCgpOwogCkBAIC0x
NTMsNiArMTYzLDE0IEBADQogICAgIHZvaWQgc2V0U2VsZWN0aW9uTW9kZShib29sKSB7IH0KICNl
bmRpZgogCisjaWYgUExBVEZPUk0oV0lOKQorICAgIENPTVB0cjxJRGF0YU9iamVjdD4gZGF0YU9i
amVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YU9iamVjdDsgfQorICAgIHZvaWQgc2V0RXh0ZXJu
YWxEYXRhT2JqZWN0KElEYXRhT2JqZWN0Kik7CisgICAgdm9pZCB3cml0ZVVSTFRvV3JpdGFibGVE
YXRhT2JqZWN0KGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmKTsKKyAgICBDT01QdHI8V0NEYXRh
T2JqZWN0PiB3cml0YWJsZURhdGFPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX3dyaXRhYmxlRGF0
YU9iamVjdDsgfQorICAgIHZvaWQgd3JpdGVJbWFnZVRvRGF0YU9iamVjdChFbGVtZW50KiwgY29u
c3QgS1VSTCYpOworI2VuZGlmCisKICNpZiBQTEFURk9STShHVEspCiAgICAgflBhc3RlYm9hcmQo
KTsKICNlbmRpZgpAQCAtMTc1LDcgKzE5MywxNSBAQA0KICNlbmRpZgogCiAjaWYgUExBVEZPUk0o
V0lOKQorICAgIHZvaWQgZmluaXNoQ3JlYXRpbmdQYXN0ZWJvYXJkKCk7CisgICAgdm9pZCB3cml0
ZVJhbmdlVG9EYXRhT2JqZWN0KFJhbmdlKiwgRnJhbWUqKTsKKyAgICB2b2lkIHdyaXRlVVJMVG9E
YXRhT2JqZWN0KGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmLCBGcmFtZSopOworICAgIHZvaWQg
d3JpdGVQbGFpblRleHRUb0RhdGFPYmplY3QoY29uc3QgU3RyaW5nJiwgU21hcnRSZXBsYWNlT3B0
aW9uKTsKKwogICAgIEhXTkQgbV9vd25lcjsKKyAgICBDT01QdHI8SURhdGFPYmplY3Q+IG1fZGF0
YU9iamVjdDsKKyAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBtX3dyaXRhYmxlRGF0YU9iamVjdDsK
KyAgICBEcmFnRGF0YU1hcCBtX2RyYWdEYXRhTWFwOwogI2VuZGlmCiAKICNpZiBQTEFURk9STShR
VCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4uY3BwDQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09DQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5j
cHAJKHJldmlzaW9uIDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xp
cGJvYXJkV2luLmNwcAkod29ya2luZyBjb3B5KQ0KQEAgLTEsNSArMSw2IEBADQogLyoKICAqIENv
cHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDEzIFh1ZXFpbmcgSHVhbmcgPGh1YW5neHVlcWluZ0BiYWlkdS5j
b20+CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI0LDY1NyArMjUsNDYgQEAN
CiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkNsaXBib2FyZFdpbi5oIgor
I2luY2x1ZGUgIkNsaXBib2FyZC5oIgogCiAjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKICNpbmNs
dWRlICJDbGlwYm9hcmRVdGlsaXRpZXNXaW4uaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgotI2lu
Y2x1ZGUgIkRyYWdEYXRhLmgiCi0jaW5jbHVkZSAiRWRpdG9yLmgiCiAjaW5jbHVkZSAiRWxlbWVu
dC5oIgotI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgotI2luY2x1ZGUgIkZpbGVMaXN0LmgiCiAj
aW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgotI2luY2x1ZGUgIkZy
YW1lVmlldy5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIkhUTUxQYXJzZXJJ
ZGlvbXMuaCIKLSNpbmNsdWRlICJJbWFnZS5oIgotI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnku
aCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNs
dWRlICJQYXN0ZWJvYXJkLmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCi0jaW5j
bHVkZSAiUmFuZ2UuaCIKLSNpbmNsdWRlICJSZW5kZXJJbWFnZS5oIgotI2luY2x1ZGUgIlJlc291
cmNlUmVzcG9uc2UuaCIKLSNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKLSNpbmNsdWRlICJXQ0Rh
dGFPYmplY3QuaCIKICNpbmNsdWRlICJtYXJrdXAuaCIKLSNpbmNsdWRlIDxzaGx3YXBpLmg+Ci0j
aW5jbHVkZSA8d2luaW5ldC5oPgotI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KLSNpbmNsdWRlIDx3
dGYvdGV4dC9DU3RyaW5nLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+Ci0jaW5j
bHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLS8vIFdl
IHByb3ZpZGUgdGhlIElFIGNsaXBib2FyZCB0eXBlcyAoVVJMIGFuZCBUZXh0KSwgYW5kIHRoZSBj
bGlwYm9hcmQgdHlwZXMgc3BlY2lmaWVkIGluIHRoZSBXSEFUV0cgV2ViIEFwcGxpY2F0aW9ucyAx
LjAgZHJhZnQKLS8vIHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3Vy
cmVudC13b3JrLyBTZWN0aW9uIDYuMy41LjMKLQotZW51bSBDbGlwYm9hcmREYXRhVHlwZSB7IENs
aXBib2FyZERhdGFUeXBlTm9uZSwgQ2xpcGJvYXJkRGF0YVR5cGVVUkwsIENsaXBib2FyZERhdGFU
eXBlVGV4dCwgQ2xpcGJvYXJkRGF0YVR5cGVUZXh0SFRNTCB9OwotCi1zdGF0aWMgQ2xpcGJvYXJk
RGF0YVR5cGUgY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZShjb25zdCBTdHJpbmcmIHR5cGUpCitE
cmFnSW1hZ2VSZWYgQ2xpcGJvYXJkOjpjcmVhdGVEcmFnSW1hZ2UoSW50UG9pbnQmIGRyYWdMb2Nh
dGlvbikgY29uc3QKIHsKLSAgICBTdHJpbmcgcVR5cGUgPSB0eXBlLnN0cmlwV2hpdGVTcGFjZSgp
Lmxvd2VyKCk7Ci0KLSAgICAvLyB0d28gc3BlY2lhbCBjYXNlcyBmb3IgSUUgY29tcGF0aWJpbGl0
eQotICAgIGlmIChxVHlwZSA9PSAidGV4dCIgfHwgcVR5cGUgPT0gInRleHQvcGxhaW4iIHx8IHFU
eXBlLnN0YXJ0c1dpdGgoInRleHQvcGxhaW47IikpCi0gICAgICAgIHJldHVybiBDbGlwYm9hcmRE
YXRhVHlwZVRleHQ7Ci0gICAgaWYgKHFUeXBlID09ICJ1cmwiIHx8IHFUeXBlID09ICJ0ZXh0L3Vy
aS1saXN0IikKLSAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVVJMOwotICAgIGlmIChx
VHlwZSA9PSAidGV4dC9odG1sIikKLSAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVGV4
dEhUTUw7Ci0KLSAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVOb25lOwotfQotCi0jaWYgIU9T
KFdJTkNFKQotc3RhdGljIGlubGluZSB2b2lkIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoUFdT
VFIgcHN6LCBzaXplX3QgbGVuZ3RoKQotewotICAgIHNpemVfdCB3cml0ZVRvID0gMDsKLSAgICBz
aXplX3QgcmVhZEZyb20gPSAwOwotICAgIHdoaWxlIChyZWFkRnJvbSA8IGxlbmd0aCkgewotICAg
ICAgICBVSU5UIHR5cGUgPSBQYXRoR2V0Q2hhclR5cGUocHN6W3JlYWRGcm9tXSk7Ci0gICAgICAg
IGlmICghcHN6W3JlYWRGcm9tXSB8fCB0eXBlICYgKEdDVF9MRk5DSEFSIHwgR0NUX1NIT1JUQ0hB
UikpCi0gICAgICAgICAgICBwc3pbd3JpdGVUbysrXSA9IHBzeltyZWFkRnJvbV07Ci0KLSAgICAg
ICAgcmVhZEZyb20rKzsKLSAgICB9Ci0gICAgcHN6W3dyaXRlVG9dID0gMDsKLX0KLSNlbmRpZgot
Ci1zdGF0aWMgU3RyaW5nIGZpbGVzeXN0ZW1QYXRoRnJvbVVybE9yVGl0bGUoY29uc3QgU3RyaW5n
JiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUsIGNvbnN0IFVDaGFyKiBleHRlbnNpb24sIGJvb2wg
aXNMaW5rKQotewotI2lmIE9TKFdJTkNFKQotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0
dXJuIFN0cmluZygpOwotI2Vsc2UKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGZzUGF0aE1heExl
bmd0aEV4Y2x1ZGluZ051bGxUZXJtaW5hdG9yID0gTUFYX1BBVEggLSAxOwotICAgIGJvb2wgdXNl
ZFVSTCA9IGZhbHNlOwotICAgIFdDSEFSIGZzUGF0aEJ1ZmZlcltNQVhfUEFUSF07Ci0gICAgZnNQ
YXRoQnVmZmVyWzBdID0gMDsKLSAgICBpbnQgZXh0ZW5zaW9uTGVuID0gZXh0ZW5zaW9uID8gbHN0
cmxlbihleHRlbnNpb24pIDogMDsKLSAgICBpbnQgZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0
ZW5zaW9uID0gZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nTnVsbFRlcm1pbmF0b3IgLSBleHRlbnNp
b25MZW47Ci0KLSAgICBpZiAoIXRpdGxlLmlzRW1wdHkoKSkgewotICAgICAgICBzaXplX3QgbGVu
ID0gbWluPHNpemVfdD4odGl0bGUubGVuZ3RoKCksIGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4
dGVuc2lvbik7Ci0gICAgICAgIENvcHlNZW1vcnkoZnNQYXRoQnVmZmVyLCB0aXRsZS5jaGFyYWN0
ZXJzKCksIGxlbiAqIHNpemVvZihVQ2hhcikpOwotICAgICAgICBmc1BhdGhCdWZmZXJbbGVuXSA9
IDA7Ci0gICAgICAgIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoZnNQYXRoQnVmZmVyLCBsZW4p
OwotICAgIH0KLQotICAgIGlmICghbHN0cmxlbihmc1BhdGhCdWZmZXIpKSB7Ci0gICAgICAgIEtV
Ukwga3VybChQYXJzZWRVUkxTdHJpbmcsIHVybCk7Ci0gICAgICAgIHVzZWRVUkwgPSB0cnVlOwot
ICAgICAgICAvLyBUaGUgZmlsZW5hbWUgZm9yIGFueSBjb250ZW50IGJhc2VkIGRyYWcgb3IgZmls
ZSB1cmwgc2hvdWxkIGJlIHRoZSBsYXN0IGVsZW1lbnQgb2YgCi0gICAgICAgIC8vIHRoZSBwYXRo
LiAgSWYgd2UgY2FuJ3QgZmluZCBpdCwgb3Igd2UncmUgY29taW5nIHVwIHdpdGggdGhlIG5hbWUg
Zm9yIGEgbGluawotICAgICAgICAvLyB3ZSBqdXN0IHVzZSB0aGUgZW50aXJlIHVybC4KLSAgICAg
ICAgRFdPUkQgbGVuID0gZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0ZW5zaW9uOwotICAgICAg
ICBTdHJpbmcgbGFzdENvbXBvbmVudCA9IGt1cmwubGFzdFBhdGhDb21wb25lbnQoKTsKLSAgICAg
ICAgaWYgKGt1cmwuaXNMb2NhbEZpbGUoKSB8fCAoIWlzTGluayAmJiAhbGFzdENvbXBvbmVudC5p
c0VtcHR5KCkpKSB7Ci0gICAgICAgICAgICBsZW4gPSBtaW48RFdPUkQ+KGZzUGF0aE1heExlbmd0
aEV4Y2x1ZGluZ0V4dGVuc2lvbiwgbGFzdENvbXBvbmVudC5sZW5ndGgoKSk7Ci0gICAgICAgICAg
ICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgbGFzdENvbXBvbmVudC5jaGFyYWN0ZXJzKCksIGxl
biAqIHNpemVvZihVQ2hhcikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVuID0g
bWluPERXT1JEPihmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24sIHVybC5sZW5ndGgo
KSk7Ci0gICAgICAgICAgICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgdXJsLmNoYXJhY3RlcnMo
KSwgbGVuICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZnNQYXRoQnVmZmVy
W2xlbl0gPSAwOwotICAgICAgICBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKGZzUGF0aEJ1ZmZl
ciwgbGVuKTsKLSAgICB9Ci0KLSAgICBpZiAoIWV4dGVuc2lvbikKLSAgICAgICAgcmV0dXJuIFN0
cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+KGZzUGF0aEJ1ZmZlcikpOwotCi0gICAgaWYgKCFpc0xp
bmsgJiYgdXNlZFVSTCkgewotICAgICAgICBQYXRoUmVuYW1lRXh0ZW5zaW9uKGZzUGF0aEJ1ZmZl
ciwgZXh0ZW5zaW9uKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+
KGZzUGF0aEJ1ZmZlcikpOwotICAgIH0KLQotICAgIHJldHVybiBtYWtlU3RyaW5nKHN0YXRpY19j
YXN0PGNvbnN0IFVDaGFyKj4oZnNQYXRoQnVmZmVyKSwgZXh0ZW5zaW9uKTsKLSNlbmRpZgotfQot
Ci1zdGF0aWMgSEdMT0JBTCBjcmVhdGVHbG9iYWxJbWFnZUZpbGVDb250ZW50KFNoYXJlZEJ1ZmZl
ciogZGF0YSkKLXsKLSAgICBIR0xPQkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdQVFIsIGRhdGEt
PnNpemUoKSk7Ci0gICAgaWYgKCFtZW1PYmopIAotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNo
YXIqIGZpbGVDb250ZW50cyA9IChQU1RSKUdsb2JhbExvY2sobWVtT2JqKTsKLQotICAgIENvcHlN
ZW1vcnkoZmlsZUNvbnRlbnRzLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUoKSk7Ci0gICAgCi0g
ICAgR2xvYmFsVW5sb2NrKG1lbU9iaik7Ci0gICAgCi0gICAgcmV0dXJuIG1lbU9iajsKLX0KLQot
c3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSERyb3BDb250ZW50KGNvbnN0IEtVUkwmIHVybCwg
U3RyaW5nJiBmaWxlTmFtZSwgU2hhcmVkQnVmZmVyKiBkYXRhKQotewotICAgIGlmIChmaWxlTmFt
ZS5pc0VtcHR5KCkgfHwgIWRhdGEpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgV0NIQVIgZmls
ZVBhdGhbTUFYX1BBVEhdOwotCi0gICAgaWYgKHVybC5pc0xvY2FsRmlsZSgpKSB7Ci0gICAgICAg
IFN0cmluZyBsb2NhbFBhdGggPSBkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXModXJsLnBhdGgoKSk7
Ci0gICAgICAgIC8vIHdpbmRvd3MgZG9lcyBub3QgZW5qb3kgYSBsZWFkaW5nIHNsYXNoIG9uIHBh
dGhzCi0gICAgICAgIGlmIChsb2NhbFBhdGhbMF0gPT0gJy8nKQotICAgICAgICAgICAgbG9jYWxQ
YXRoID0gbG9jYWxQYXRoLnN1YnN0cmluZygxKTsKLSAgICAgICAgTFBDV1NUUiBsb2NhbFBhdGhT
dHIgPSBsb2NhbFBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKTsKLSAgICAgICAg
aWYgKHdjc2xlbihsb2NhbFBhdGhTdHIpICsgMSA8IE1BWF9QQVRIKQotICAgICAgICAgICAgd2Nz
Y3B5X3MoZmlsZVBhdGgsIE1BWF9QQVRILCBsb2NhbFBhdGhTdHIpOwotICAgICAgICBlbHNlCi0g
ICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotI2lmIE9TKFdJTkNFKQotICAgICAg
ICBub3RJbXBsZW1lbnRlZCgpOwotICAgICAgICByZXR1cm4gMDsKLSNlbHNlCi0gICAgICAgIFdD
SEFSIHRlbXBQYXRoW01BWF9QQVRIXTsKLSAgICAgICAgV0NIQVIgZXh0ZW5zaW9uW01BWF9QQVRI
XTsKLSAgICAgICAgaWYgKCE6OkdldFRlbXBQYXRoKFdURl9BUlJBWV9MRU5HVEgodGVtcFBhdGgp
LCB0ZW1wUGF0aCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCE6OlBhdGhB
cHBlbmQodGVtcFBhdGgsIGZpbGVOYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkp
KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIExQQ1dTVFIgZm91bmRFeHRlbnNpb24g
PSA6OlBhdGhGaW5kRXh0ZW5zaW9uKHRlbXBQYXRoKTsKLSAgICAgICAgaWYgKGZvdW5kRXh0ZW5z
aW9uKSB7Ci0gICAgICAgICAgICBpZiAod2NzY3B5X3MoZXh0ZW5zaW9uLCBNQVhfUEFUSCwgZm91
bmRFeHRlbnNpb24pKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IGVsc2UK
LSAgICAgICAgICAgICpleHRlbnNpb24gPSAwOwotICAgICAgICA6OlBhdGhSZW1vdmVFeHRlbnNp
b24odGVtcFBhdGgpOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwOyBpKyspIHsK
LSAgICAgICAgICAgIGlmIChzd3ByaW50Zl9zKGZpbGVQYXRoLCBNQVhfUEFUSCwgVEVYVCgiJXMt
JWQlcyIpLCB0ZW1wUGF0aCwgaSwgZXh0ZW5zaW9uKSA9PSAtMSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKLSAgICAgICAgICAgIGlmICghOjpQYXRoRmlsZUV4aXN0cyhmaWxlUGF0aCkpCi0g
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgSEFORExFIHRlbXBGaWxl
SGFuZGxlID0gQ3JlYXRlRmlsZShmaWxlUGF0aCwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklU
RSwgMCwgMCwgQ1JFQVRFX0FMV0FZUywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCAwKTsKLSAgICAg
ICAgaWYgKHRlbXBGaWxlSGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgICAgICAg
ICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgdG8gdGhpcyB0ZW1wIGZp
bGUuCi0gICAgICAgIERXT1JEIHdyaXR0ZW47Ci0gICAgICAgIEJPT0wgdGVtcFdyaXRlU3VjY2Vl
ZGVkID0gV3JpdGVGaWxlKHRlbXBGaWxlSGFuZGxlLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUo
KSwgJndyaXR0ZW4sIDApOwotICAgICAgICBDbG9zZUhhbmRsZSh0ZW1wRmlsZUhhbmRsZSk7Ci0g
ICAgICAgIGlmICghdGVtcFdyaXRlU3VjY2VlZGVkKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0j
ZW5kaWYKLSAgICB9Ci0KLSAgICBTSVpFX1QgZHJvcEZpbGVzU2l6ZSA9IHNpemVvZihEUk9QRklM
RVMpICsgKHNpemVvZihXQ0hBUikgKiAod2NzbGVuKGZpbGVQYXRoKSArIDIpKTsKLSAgICBIR0xP
QkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdITkQgfCBHTUVNX1NIQVJFLCBkcm9wRmlsZXNTaXpl
KTsKLSAgICBpZiAoIW1lbU9iaikgCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgRFJPUEZJTEVT
KiBkcm9wRmlsZXMgPSAoRFJPUEZJTEVTKikgR2xvYmFsTG9jayhtZW1PYmopOwotICAgIGRyb3BG
aWxlcy0+cEZpbGVzID0gc2l6ZW9mKERST1BGSUxFUyk7Ci0gICAgZHJvcEZpbGVzLT5mV2lkZSA9
IFRSVUU7Ci0gICAgd2NzY3B5KChMUFdTVFIpKGRyb3BGaWxlcyArIDEpLCBmaWxlUGF0aCk7ICAg
IAotICAgIEdsb2JhbFVubG9jayhtZW1PYmopOwotICAgIAotICAgIHJldHVybiBtZW1PYmo7Ci19
Ci0KLXN0YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmlsZURlc2NyaXB0b3IoY29uc3Qg
U3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUsIENhY2hlZEltYWdlKiBpbWFnZSkKLXsK
LSAgICBBU1NFUlRfQVJHKGltYWdlLCBpbWFnZSk7Ci0gICAgQVNTRVJUKGltYWdlLT5pbWFnZSgp
LT5kYXRhKCkpOwotCi0gICAgSFJFU1VMVCBociA9IFNfT0s7Ci0gICAgSEdMT0JBTCBtZW1PYmog
PSAwOwotICAgIFN0cmluZyBmc1BhdGg7Ci0gICAgbWVtT2JqID0gR2xvYmFsQWxsb2MoR1BUUiwg
c2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKLSAgICBpZiAoIW1lbU9iaikKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICBGSUxFR1JPVVBERVNDUklQVE9SKiBmZ2QgPSAoRklMRUdST1VQREVT
Q1JJUFRPUiopR2xvYmFsTG9jayhtZW1PYmopOwotICAgIG1lbXNldChmZ2QsIDAsIHNpemVvZihG
SUxFR1JPVVBERVNDUklQVE9SKSk7Ci0gICAgZmdkLT5jSXRlbXMgPSAxOwotICAgIGZnZC0+Zmdk
WzBdLmR3RmxhZ3MgPSBGRF9GSUxFU0laRTsKLSAgICBmZ2QtPmZnZFswXS5uRmlsZVNpemVMb3cg
PSBpbWFnZS0+aW1hZ2UoKS0+ZGF0YSgpLT5zaXplKCk7Ci0gICAgCi0gICAgY29uc3QgU3RyaW5n
JiBwcmVmZXJyZWRUaXRsZSA9IHRpdGxlLmlzRW1wdHkoKSA/IGltYWdlLT5yZXNwb25zZSgpLnN1
Z2dlc3RlZEZpbGVuYW1lKCkgOiB0aXRsZTsKLSAgICBTdHJpbmcgZXh0ZW5zaW9uID0gaW1hZ2Ut
PmltYWdlKCktPmZpbGVuYW1lRXh0ZW5zaW9uKCk7Ci0gICAgaWYgKGV4dGVuc2lvbi5pc0VtcHR5
KCkpIHsKLSAgICAgICAgLy8gRG8gbm90IGNvbnRpbnVlIHByb2Nlc3NpbmcgaW4gdGhlIHJhcmUg
YW5kIHVudXN1YWwgY2FzZSB3aGVyZSBhIGRlY29kZWQgaW1hZ2UgaXMgbm90IGFibGUgCi0gICAg
ICAgIC8vIHRvIHByb3ZpZGUgYSBmaWxlbmFtZSBleHRlbnNpb24uIFNvbWV0aGluZyB0cmlja3kg
KGxpa2UgYSBiYWl0LW4tc3dpdGNoKSBpcyBnb2luZyBvbgotICAgICAgICByZXR1cm4gMDsKLSAg
ICB9Ci0gICAgZXh0ZW5zaW9uLmluc2VydCgiLiIsIDApOwotICAgIGZzUGF0aCA9IGZpbGVzeXN0
ZW1QYXRoRnJvbVVybE9yVGl0bGUodXJsLCBwcmVmZXJyZWRUaXRsZSwgZXh0ZW5zaW9uLmNoYXJh
Y3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIGZhbHNlKTsKLQotICAgIGlmIChmc1BhdGgubGVu
Z3RoKCkgPD0gMCkgewotICAgICAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKLSAgICAgICAgR2xv
YmFsRnJlZShtZW1PYmopOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpbnQgbWF4
U2l6ZSA9IG1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgoZmdkLT5mZ2RbMF0u
Y0ZpbGVOYW1lKSk7Ci0gICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmlsZU5hbWUsIChMUENX
U1RSKWZzUGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKLSAgICBH
bG9iYWxVbmxvY2sobWVtT2JqKTsKLSAgICAKLSAgICByZXR1cm4gbWVtT2JqOwotfQotCi0KLS8v
IHdyaXRlRmlsZVRvRGF0YU9iamVjdCB0YWtlcyBvd25lcnNoaXAgb2YgZmlsZURlc2NyaXB0b3Ig
YW5kIGZpbGVDb250ZW50Ci1zdGF0aWMgSFJFU1VMVCB3cml0ZUZpbGVUb0RhdGFPYmplY3QoSURh
dGFPYmplY3QqIGRhdGFPYmplY3QsIEhHTE9CQUwgZmlsZURlc2NyaXB0b3IsIEhHTE9CQUwgZmls
ZUNvbnRlbnQsIEhHTE9CQUwgaERyb3BDb250ZW50KQotewotICAgIEhSRVNVTFQgaHIgPSBTX09L
OwotICAgIEZPUk1BVEVUQyogZmU7Ci0gICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAgICBt
ZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOwotCi0gICAgaWYgKCFmaWxlRGVzY3JpcHRvciB8
fCAhZmlsZUNvbnRlbnQpCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgIC8vIERlc2NyaXB0b3IK
LSAgICBmZSA9IGZpbGVEZXNjcmlwdG9yRm9ybWF0KCk7Ci0KLSAgICBtZWRpdW0uaEdsb2JhbCA9
IGZpbGVEZXNjcmlwdG9yOwotCi0gICAgaWYgKEZBSUxFRChociA9IGRhdGFPYmplY3QtPlNldERh
dGEoZmUsICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgZ290byBleGl0OwotCi0gICAgLy8gQ29u
dGVudHMKLSAgICBmZSA9IGZpbGVDb250ZW50Rm9ybWF0WmVybygpOwotICAgIG1lZGl1bS5oR2xv
YmFsID0gZmlsZUNvbnRlbnQ7Ci0gICAgaWYgKEZBSUxFRChociA9IGRhdGFPYmplY3QtPlNldERh
dGEoZmUsICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgZ290byBleGl0OwotCi0jaWYgVVNFKENG
KQotICAgIC8vIEhEUk9QCi0gICAgaWYgKGhEcm9wQ29udGVudCkgewotICAgICAgICBtZWRpdW0u
aEdsb2JhbCA9IGhEcm9wQ29udGVudDsKLSAgICAgICAgaHIgPSBkYXRhT2JqZWN0LT5TZXREYXRh
KGNmSERyb3BGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSk7Ci0gICAgfQotI2VuZGlmCi0KLWV4aXQ6
Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgaWYgKGZpbGVEZXNjcmlwdG9yKQotICAg
ICAgICAgICAgR2xvYmFsRnJlZShmaWxlRGVzY3JpcHRvcik7Ci0gICAgICAgIGlmIChmaWxlQ29u
dGVudCkKLSAgICAgICAgICAgIEdsb2JhbEZyZWUoZmlsZUNvbnRlbnQpOwotICAgICAgICBpZiAo
aERyb3BDb250ZW50KQotICAgICAgICAgICAgR2xvYmFsRnJlZShoRHJvcENvbnRlbnQpOwotICAg
IH0KLSAgICByZXR1cm4gaHI7Ci19Ci0KLVBhc3NSZWZQdHI8Q2xpcGJvYXJkPiBDbGlwYm9hcmQ6
OmNyZWF0ZShDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBEcmFnRGF0YSogZHJhZ0RhdGEs
IEZyYW1lKiBmcmFtZSkKLXsKLSAgICBpZiAoZHJhZ0RhdGEtPnBsYXRmb3JtRGF0YSgpKQotICAg
ICAgICByZXR1cm4gQ2xpcGJvYXJkV2luOjpjcmVhdGUoRHJhZ0FuZERyb3AsIGRyYWdEYXRhLT5w
bGF0Zm9ybURhdGEoKSwgcG9saWN5LCBmcmFtZSk7Ci0gICAgcmV0dXJuIENsaXBib2FyZFdpbjo6
Y3JlYXRlKERyYWdBbmREcm9wLCBkcmFnRGF0YS0+ZHJhZ0RhdGFNYXAoKSwgcG9saWN5LCBmcmFt
ZSk7Ci19Ci0KLUNsaXBib2FyZFdpbjo6Q2xpcGJvYXJkV2luKENsaXBib2FyZFR5cGUgY2xpcGJv
YXJkVHlwZSwgSURhdGFPYmplY3QqIGRhdGFPYmplY3QsIENsaXBib2FyZEFjY2Vzc1BvbGljeSBw
b2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAgICA6IENsaXBib2FyZChwb2xpY3ksIGNsaXBib2FyZFR5
cGUpCi0gICAgLCBtX2RhdGFPYmplY3QoZGF0YU9iamVjdCkKLSAgICAsIG1fd3JpdGFibGVEYXRh
T2JqZWN0KDApCi0gICAgLCBtX2ZyYW1lKGZyYW1lKQotewotfQotCi1DbGlwYm9hcmRXaW46OkNs
aXBib2FyZFdpbihDbGlwYm9hcmRUeXBlIGNsaXBib2FyZFR5cGUsIFdDRGF0YU9iamVjdCogZGF0
YU9iamVjdCwgQ2xpcGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwgRnJhbWUqIGZyYW1lKQotICAg
IDogQ2xpcGJvYXJkKHBvbGljeSwgY2xpcGJvYXJkVHlwZSkKLSAgICAsIG1fZGF0YU9iamVjdChk
YXRhT2JqZWN0KQotICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoZGF0YU9iamVjdCkKLSAgICAs
IG1fZnJhbWUoZnJhbWUpCi17Ci19Ci0KLUNsaXBib2FyZFdpbjo6Q2xpcGJvYXJkV2luKENsaXBi
b2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgY29uc3QgRHJhZ0RhdGFNYXAmIGRhdGFNYXAsIENsaXBi
b2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAgICA6IENsaXBib2FyZChw
b2xpY3ksIGNsaXBib2FyZFR5cGUpCi0gICAgLCBtX2RhdGFPYmplY3QoMCkKLSAgICAsIG1fd3Jp
dGFibGVEYXRhT2JqZWN0KDApCi0gICAgLCBtX2ZyYW1lKGZyYW1lKQotICAgICwgbV9kcmFnRGF0
YU1hcChkYXRhTWFwKQotewotfQotCi1DbGlwYm9hcmRXaW46On5DbGlwYm9hcmRXaW4oKQotewot
ICAgIGlmIChtX2RyYWdJbWFnZSkKLSAgICAgICAgbV9kcmFnSW1hZ2UtPnJlbW92ZUNsaWVudCh0
aGlzKTsKLX0KLQotc3RhdGljIGJvb2wgd3JpdGVVUkwoV0NEYXRhT2JqZWN0ICpkYXRhLCBjb25z
dCBLVVJMJiB1cmwsIFN0cmluZyB0aXRsZSwgYm9vbCB3aXRoUGxhaW5UZXh0LCBib29sIHdpdGhI
VE1MKQotewotICAgIEFTU0VSVChkYXRhKTsKLQotICAgIGlmICh1cmwuaXNFbXB0eSgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKHRpdGxlLmlzRW1wdHkoKSkgewotICAg
ICAgICB0aXRsZSA9IHVybC5sYXN0UGF0aENvbXBvbmVudCgpOwotICAgICAgICBpZiAodGl0bGUu
aXNFbXB0eSgpKQotICAgICAgICAgICAgdGl0bGUgPSB1cmwuaG9zdCgpOwotICAgIH0KLQotICAg
IFNUR01FRElVTSBtZWRpdW0gPSB7MH07Ci0gICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JB
TDsKLQotICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YSh1cmwsIHRpdGxlKTsK
LSAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJ
TEVEKGRhdGEtPlNldERhdGEodXJsV0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAg
IDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7Ci0gICAgZWxzZQotICAgICAgICBzdWNjZXNz
ID0gdHJ1ZTsKLQotICAgIGlmICh3aXRoSFRNTCkgewotICAgICAgICBWZWN0b3I8Y2hhcj4gY2Zo
dG1sRGF0YTsKLSAgICAgICAgbWFya3VwVG9DRkhUTUwodXJsVG9NYXJrdXAodXJsLCB0aXRsZSks
ICIiLCBjZmh0bWxEYXRhKTsKLSAgICAgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxE
YXRhKGNmaHRtbERhdGEpOwotICAgICAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKGRh
dGEtPlNldERhdGEoaHRtbEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAgICAgICA6
Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBz
dWNjZXNzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAod2l0aFBsYWluVGV4dCkgewotICAgICAg
ICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEodXJsLnN0cmluZygpKTsKLSAgICAg
ICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChkYXRhLT5TZXREYXRhKHBsYWluVGV4dFdG
b3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1
bS5oR2xvYmFsKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjpjbGVh
ckRhdGEoY29uc3QgU3RyaW5nJiB0eXBlKQotewotICAgIC8vIEZJWE1FOiBOZWVkIHRvIGJlIGFi
bGUgdG8gd3JpdGUgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQgPHJkYXI6Ly9wcm9ibGVtLzUwMTU5
NDE+Ci0gICAgQVNTRVJUKGlzRm9yRHJhZ0FuZERyb3AoKSk7Ci0gICAgaWYgKCFjYW5Xcml0ZURh
dGEoKSB8fCAhbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgIHJldHVybjsKLQotICAgIENs
aXBib2FyZERhdGFUeXBlIGRhdGFUeXBlID0gY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZSh0eXBl
KTsKLQotICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVSTCkgewotICAgICAg
ICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJEYXRhKHVybFdGb3JtYXQoKS0+Y2ZGb3JtYXQp
OwotICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJEYXRhKHVybEZvcm1hdCgpLT5j
ZkZvcm1hdCk7Ci0gICAgfQotICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRl
eHQpIHsKLSAgICAgICAgbV93cml0YWJsZURhdGFPYmplY3QtPmNsZWFyRGF0YShwbGFpblRleHRG
b3JtYXQoKS0+Y2ZGb3JtYXQpOwotICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJE
YXRhKHBsYWluVGV4dFdGb3JtYXQoKS0+Y2ZGb3JtYXQpOwotICAgIH0KLQotfQotCi12b2lkIENs
aXBib2FyZFdpbjo6Y2xlYXJEYXRhKCkKLXsKLSAgICAvLyBGSVhNRTogTmVlZCB0byBiZSBhYmxl
IHRvIHdyaXRlIHRvIHRoZSBzeXN0ZW0gY2xpcGJvYXJkIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQx
PgotICAgIEFTU0VSVChpc0ZvckRyYWdBbmREcm9wKCkpOwotICAgIGlmICghY2FuV3JpdGVEYXRh
KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBtX3dyaXRhYmxlRGF0YU9iamVjdCA9IDA7
Ci0gICAgV0NEYXRhT2JqZWN0OjpjcmVhdGVJbnN0YW5jZSgmbV93cml0YWJsZURhdGFPYmplY3Qp
OwotICAgIG1fZGF0YU9iamVjdCA9IG1fd3JpdGFibGVEYXRhT2JqZWN0OwotfQotCi1TdHJpbmcg
Q2xpcGJvYXJkV2luOjpnZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSkgY29uc3QKLXsgICAgIAot
ICAgIGlmICghY2FuUmVhZERhdGEoKSB8fCAoIW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFw
LmlzRW1wdHkoKSkpCi0gICAgICAgIHJldHVybiAiIjsKLQotICAgIENsaXBib2FyZERhdGFUeXBl
IGRhdGFUeXBlID0gY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZSh0eXBlKTsKLSAgICBpZiAoZGF0
YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KQotICAgICAgICByZXR1cm4gbV9kYXRhT2Jq
ZWN0ID8gZ2V0UGxhaW5UZXh0KG1fZGF0YU9iamVjdC5nZXQoKSkgOiBnZXRQbGFpblRleHQoJm1f
ZHJhZ0RhdGFNYXApOwotICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVSTCkK
LSAgICAgICAgcmV0dXJuIG1fZGF0YU9iamVjdCA/IGdldFVSTChtX2RhdGFPYmplY3QuZ2V0KCks
IERyYWdEYXRhOjpEb05vdENvbnZlcnRGaWxlbmFtZXMpIDogZ2V0VVJMKCZtX2RyYWdEYXRhTWFw
LCBEcmFnRGF0YTo6RG9Ob3RDb252ZXJ0RmlsZW5hbWVzKTsKLSAgICBlbHNlIGlmIChkYXRhVHlw
ZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MKSB7Ci0gICAgICAgIFN0cmluZyBkYXRhID0g
bV9kYXRhT2JqZWN0ID8gZ2V0VGV4dEhUTUwobV9kYXRhT2JqZWN0LmdldCgpKSA6IGdldFRleHRI
VE1MKCZtX2RyYWdEYXRhTWFwKTsKLSAgICAgICAgaWYgKCFkYXRhLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgIHJldHVybiBkYXRhOwotICAgICAgICByZXR1cm4gbV9kYXRhT2JqZWN0ID8gZ2V0Q0ZI
VE1MKG1fZGF0YU9iamVjdC5nZXQoKSkgOiBnZXRDRkhUTUwoJm1fZHJhZ0RhdGFNYXApOwotICAg
IH0KLSAgICAKLSAgICByZXR1cm4gIiI7Ci19Ci0KLWJvb2wgQ2xpcGJvYXJkV2luOjpzZXREYXRh
KGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBkYXRhKQotewotICAgIC8vIEZJWE1F
OiBOZWVkIHRvIGJlIGFibGUgdG8gd3JpdGUgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQgPHJkYXI6
Ly9wcm9ibGVtLzUwMTU5NDE+Ci0gICAgQVNTRVJUKGlzRm9yRHJhZ0FuZERyb3AoKSk7Ci0gICAg
aWYgKCFjYW5Xcml0ZURhdGEoKSB8fCAhbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIENsaXBib2FyZERhdGFUeXBlIHdpblR5cGUgPSBjbGlwYm9hcmRU
eXBlRnJvbU1JTUVUeXBlKHR5cGUpOwotCi0gICAgaWYgKHdpblR5cGUgPT0gQ2xpcGJvYXJkRGF0
YVR5cGVVUkwpCi0gICAgICAgIHJldHVybiBXZWJDb3JlOjp3cml0ZVVSTChtX3dyaXRhYmxlRGF0
YU9iamVjdC5nZXQoKSwgS1VSTChQYXJzZWRVUkxTdHJpbmcsIGRhdGEpLCBTdHJpbmcoKSwgZmFs
c2UsIHRydWUpOwotCi0gICAgaWYgKHdpblR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KSB7
Ci0gICAgICAgIFNUR01FRElVTSBtZWRpdW0gPSB7MH07Ci0gICAgICAgIG1lZGl1bS50eW1lZCA9
IFRZTUVEX0hHTE9CQUw7Ci0gICAgICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0
YShkYXRhKTsKLSAgICAgICAgaWYgKCFtZWRpdW0uaEdsb2JhbCkKLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgICAgICBpZiAoRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXRE
YXRhKHBsYWluVGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKSB7Ci0gICAgICAgICAgICA6
Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxz
ZTsKLX0KLQotc3RhdGljIHZvaWQgYWRkTWltZVR5cGVzRm9yRm9ybWF0KExpc3RIYXNoU2V0PFN0
cmluZz4mIHJlc3VsdHMsIGNvbnN0IEZPUk1BVEVUQyYgZm9ybWF0KQotewotICAgIC8vIFVSTCBh
bmQgVGV4dCBhcmUgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBJRSdzIG1vZGVsCi0g
ICAgaWYgKGZvcm1hdC5jZkZvcm1hdCA9PSB1cmxGb3JtYXQoKS0+Y2ZGb3JtYXQgfHwgZm9ybWF0
LmNmRm9ybWF0ID09IHVybFdGb3JtYXQoKS0+Y2ZGb3JtYXQpIHsKLSAgICAgICAgcmVzdWx0cy5h
ZGQoIlVSTCIpOwotICAgICAgICByZXN1bHRzLmFkZCgidGV4dC91cmktbGlzdCIpOwotICAgIH0K
LQotICAgIGlmIChmb3JtYXQuY2ZGb3JtYXQgPT0gcGxhaW5UZXh0V0Zvcm1hdCgpLT5jZkZvcm1h
dCB8fCBmb3JtYXQuY2ZGb3JtYXQgPT0gcGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0KSB7Ci0g
ICAgICAgIHJlc3VsdHMuYWRkKCJUZXh0Iik7Ci0gICAgICAgIHJlc3VsdHMuYWRkKCJ0ZXh0L3Bs
YWluIik7Ci0gICAgfQotfQotCi0vLyBleHRlbnNpb25zIGJleW9uZCBJRSdzIEFQSQotTGlzdEhh
c2hTZXQ8U3RyaW5nPiBDbGlwYm9hcmRXaW46OnR5cGVzKCkgY29uc3QKLXsgCi0gICAgTGlzdEhh
c2hTZXQ8U3RyaW5nPiByZXN1bHRzOwotICAgIGlmICghY2FuUmVhZFR5cGVzKCkpCi0gICAgICAg
IHJldHVybiByZXN1bHRzOwotCi0gICAgaWYgKCFtX2RhdGFPYmplY3QgJiYgbV9kcmFnRGF0YU1h
cC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiByZXN1bHRzOwotCi0gICAgaWYgKG1fZGF0YU9i
amVjdCkgewotICAgICAgICBDT01QdHI8SUVudW1GT1JNQVRFVEM+IGl0cjsKLQotICAgICAgICBp
ZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+RW51bUZvcm1hdEV0YyhEQVRBRElSX0dFVCwgJml0cikp
KQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0KLSAgICAgICAgaWYgKCFpdHIpCi0gICAg
ICAgICAgICByZXR1cm4gcmVzdWx0czsKLQotICAgICAgICBGT1JNQVRFVEMgZGF0YTsKLQotICAg
ICAgICAvLyBJRW51bUZPUk1BVEVUQzo6TmV4dCByZXR1cm5zIFNfRkFMU0UgaWYgdGhlcmUgYXJl
IG5vIG1vcmUgaXRlbXMuCi0gICAgICAgIHdoaWxlIChpdHItPk5leHQoMSwgJmRhdGEsIDApID09
IFNfT0spCi0gICAgICAgICAgICBhZGRNaW1lVHlwZXNGb3JGb3JtYXQocmVzdWx0cywgZGF0YSk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChEcmFnRGF0YU1hcDo6Y29uc3RfaXRlcmF0b3Ig
aXQgPSBtX2RyYWdEYXRhTWFwLmJlZ2luKCk7IGl0ICE9IG1fZHJhZ0RhdGFNYXAuZW5kKCk7ICsr
aXQpIHsKLSAgICAgICAgICAgIEZPUk1BVEVUQyBkYXRhOwotICAgICAgICAgICAgZGF0YS5jZkZv
cm1hdCA9ICgqaXQpLmtleTsKLSAgICAgICAgICAgIGFkZE1pbWVUeXBlc0ZvckZvcm1hdChyZXN1
bHRzLCBkYXRhKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHRzOwotfQot
Ci1QYXNzUmVmUHRyPEZpbGVMaXN0PiBDbGlwYm9hcmRXaW46OmZpbGVzKCkgY29uc3QKLXsKLSNp
ZiBVU0UoQ0YpCi0gICAgUmVmUHRyPEZpbGVMaXN0PiBmaWxlcyA9IEZpbGVMaXN0OjpjcmVhdGUo
KTsKLSAgICBpZiAoIWNhblJlYWREYXRhKCkpCi0gICAgICAgIHJldHVybiBmaWxlcy5yZWxlYXNl
KCk7Ci0KLSAgICBpZiAoIW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFwLmlzRW1wdHkoKSkK
LSAgICAgICAgcmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKLQotICAgIGlmIChtX2RhdGFPYmplY3Qp
IHsKLSAgICAgICAgU1RHTUVESVVNIG1lZGl1bTsKLSAgICAgICAgaWYgKEZBSUxFRChtX2RhdGFP
YmplY3QtPkdldERhdGEoY2ZIRHJvcEZvcm1hdCgpLCAmbWVkaXVtKSkpCi0gICAgICAgICAgICBy
ZXR1cm4gZmlsZXMucmVsZWFzZSgpOwotCi0gICAgICAgIEhEUk9QIGhkcm9wID0gcmVpbnRlcnBy
ZXRfY2FzdDxIRFJPUD4oR2xvYmFsTG9jayhtZWRpdW0uaEdsb2JhbCkpOwotICAgICAgICBpZiAo
IWhkcm9wKQotICAgICAgICAgICAgcmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKLQotICAgICAgICBX
Q0hBUiBmaWxlbmFtZVtNQVhfUEFUSF07Ci0gICAgICAgIFVJTlQgZmlsZUNvdW50ID0gRHJhZ1F1
ZXJ5RmlsZVcoaGRyb3AsIDB4RkZGRkZGRkYsIDAsIDApOwotICAgICAgICBmb3IgKFVJTlQgaSA9
IDA7IGkgPCBmaWxlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKCFEcmFnUXVlcnlGaWxl
VyhoZHJvcCwgaSwgZmlsZW5hbWUsIFdURl9BUlJBWV9MRU5HVEgoZmlsZW5hbWUpKSkKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGZpbGVzLT5hcHBlbmQoRmlsZTo6Y3Jl
YXRlKHJlaW50ZXJwcmV0X2Nhc3Q8VUNoYXIqPihmaWxlbmFtZSksIEZpbGU6OkFsbENvbnRlbnRU
eXBlcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgR2xvYmFsVW5sb2NrKG1lZGl1bS5oR2xvYmFs
KTsKLSAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmbWVkaXVtKTsKLSAgICAgICAgcmV0dXJuIGZp
bGVzLnJlbGVhc2UoKTsKLSAgICB9Ci0gICAgaWYgKCFtX2RyYWdEYXRhTWFwLmNvbnRhaW5zKGNm
SERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQpKQotICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgp
OwotICAgIFZlY3RvcjxTdHJpbmc+IGZpbGVzVmVjdG9yID0gbV9kcmFnRGF0YU1hcC5nZXQoY2ZI
RHJvcEZvcm1hdCgpLT5jZkZvcm1hdCk7Ci0gICAgZm9yIChWZWN0b3I8U3RyaW5nPjo6aXRlcmF0
b3IgaXQgPSBmaWxlc1ZlY3Rvci5iZWdpbigpOyBpdCAhPSBmaWxlc1ZlY3Rvci5lbmQoKTsgKytp
dCkKLSAgICAgICAgZmlsZXMtPmFwcGVuZChGaWxlOjpjcmVhdGUoKml0KSk7Ci0gICAgcmV0dXJu
IGZpbGVzLnJlbGVhc2UoKTsKLSNlbHNlCi0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1
cm4gMDsKLSNlbmRpZgotfQotCi12b2lkIENsaXBib2FyZFdpbjo6c2V0RHJhZ0ltYWdlKENhY2hl
ZEltYWdlKiBpbWFnZSwgTm9kZSAqbm9kZSwgY29uc3QgSW50UG9pbnQgJmxvYykKLXsKLSAgICBp
ZiAoIWNhblNldERyYWdJbWFnZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIGlm
IChtX2RyYWdJbWFnZSkKLSAgICAgICAgbV9kcmFnSW1hZ2UtPnJlbW92ZUNsaWVudCh0aGlzKTsK
LSAgICBtX2RyYWdJbWFnZSA9IGltYWdlOwotICAgIGlmIChtX2RyYWdJbWFnZSkKLSAgICAgICAg
bV9kcmFnSW1hZ2UtPmFkZENsaWVudCh0aGlzKTsKLQotICAgIG1fZHJhZ0xvYyA9IGxvYzsKLSAg
ICBtX2RyYWdJbWFnZUVsZW1lbnQgPSBub2RlOwotfQotCi12b2lkIENsaXBib2FyZFdpbjo6c2V0
RHJhZ0ltYWdlKENhY2hlZEltYWdlKiBpbWcsIGNvbnN0IEludFBvaW50ICZsb2MpCi17Ci0gICAg
c2V0RHJhZ0ltYWdlKGltZywgMCwgbG9jKTsKLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OnNldERy
YWdJbWFnZUVsZW1lbnQoTm9kZSAqbm9kZSwgY29uc3QgSW50UG9pbnQgJmxvYykKLXsKLSAgICBz
ZXREcmFnSW1hZ2UoMCwgbm9kZSwgbG9jKTsKLX0KLQotRHJhZ0ltYWdlUmVmIENsaXBib2FyZFdp
bjo6Y3JlYXRlRHJhZ0ltYWdlKEludFBvaW50JiBsb2MpIGNvbnN0Ci17CiAgICAgSEJJVE1BUCBy
ZXN1bHQgPSAwOwogICAgIGlmIChtX2RyYWdJbWFnZSkgewogI2lmIFVTRShDQUlSTykgfHwgVVNF
KENHKQogICAgICAgICByZXN1bHQgPSBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UobV9kcmFnSW1h
Z2UtPmltYWdlKCkpOyAgICAgICAgCi0gICAgICAgIGxvYyA9IG1fZHJhZ0xvYzsKKyAgICAgICAg
ZHJhZ0xvY2F0aW9uID0gbV9kcmFnTG9jOwogI2Vsc2UKICAgICAgICAgbm90SW1wbGVtZW50ZWQo
KTsKICNlbmRpZgogICAgIH0gZWxzZSBpZiAobV9kcmFnSW1hZ2VFbGVtZW50KSB7CiAgICAgICAg
IE5vZGUqIG5vZGUgPSBtX2RyYWdJbWFnZUVsZW1lbnQuZ2V0KCk7CiAgICAgICAgIHJlc3VsdCA9
IG5vZGUtPmRvY3VtZW50KCktPmZyYW1lKCktPm5vZGVJbWFnZShub2RlKTsKLSAgICAgICAgbG9j
ID0gbV9kcmFnTG9jOworICAgICAgICBkcmFnTG9jYXRpb24gPSBtX2RyYWdMb2M7CiAgICAgfQog
ICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBDYWNoZWRJbWFnZSogZ2V0Q2FjaGVkSW1h
Z2UoRWxlbWVudCogZWxlbWVudCkKK3ZvaWQgQ2xpcGJvYXJkOjpkZWNsYXJlQW5kV3JpdGVEcmFn
SW1hZ2UoRWxlbWVudCogZWxlbWVudCwgY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRp
dGxlLCBGcmFtZSogZnJhbWUpCiB7Ci0gICAgLy8gQXR0ZW1wdCB0byBwdWxsIENhY2hlZEltYWdl
IGZyb20gZWxlbWVudAotICAgIEFTU0VSVChlbGVtZW50KTsKLSAgICBSZW5kZXJPYmplY3QqIHJl
bmRlcmVyID0gZWxlbWVudC0+cmVuZGVyZXIoKTsKLSAgICBpZiAoIXJlbmRlcmVyIHx8ICFyZW5k
ZXJlci0+aXNJbWFnZSgpKSAKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgUmVuZGVySW1h
Z2UqIGltYWdlID0gdG9SZW5kZXJJbWFnZShyZW5kZXJlcik7Ci0gICAgaWYgKGltYWdlLT5jYWNo
ZWRJbWFnZSgpICYmICFpbWFnZS0+Y2FjaGVkSW1hZ2UoKS0+ZXJyb3JPY2N1cnJlZCgpKQotICAg
ICAgICByZXR1cm4gaW1hZ2UtPmNhY2hlZEltYWdlKCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQot
c3RhdGljIHZvaWQgd3JpdGVJbWFnZVRvRGF0YU9iamVjdChJRGF0YU9iamVjdCogZGF0YU9iamVj
dCwgRWxlbWVudCogZWxlbWVudCwgY29uc3QgS1VSTCYgdXJsKQotewotICAgIC8vIFNob3ZlIGlt
YWdlIGRhdGEgaW50byBhIERhdGFPYmplY3QgZm9yIHVzZSBhcyBhIGZpbGUKLSAgICBDYWNoZWRJ
bWFnZSogY2FjaGVkSW1hZ2UgPSBnZXRDYWNoZWRJbWFnZShlbGVtZW50KTsKLSAgICBpZiAoIWNh
Y2hlZEltYWdlIHx8ICFjYWNoZWRJbWFnZS0+aW1hZ2VGb3JSZW5kZXJlcihlbGVtZW50LT5yZW5k
ZXJlcigpKSB8fCAhY2FjaGVkSW1hZ2UtPmlzTG9hZGVkKCkpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIFNoYXJlZEJ1ZmZlciogaW1hZ2VCdWZmZXIgPSBjYWNoZWRJbWFnZS0+aW1hZ2VGb3JSZW5k
ZXJlcihlbGVtZW50LT5yZW5kZXJlcigpKS0+ZGF0YSgpOwotICAgIGlmICghaW1hZ2VCdWZmZXIg
fHwgIWltYWdlQnVmZmVyLT5zaXplKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIEhHTE9CQUwg
aW1hZ2VGaWxlRGVzY3JpcHRvciA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZURlc2NyaXB0b3IodXJs
LnN0cmluZygpLCBlbGVtZW50LT5nZXRBdHRyaWJ1dGUoYWx0QXR0ciksIGNhY2hlZEltYWdlKTsK
LSAgICBpZiAoIWltYWdlRmlsZURlc2NyaXB0b3IpCi0gICAgICAgIHJldHVybjsKLQotICAgIEhH
TE9CQUwgaW1hZ2VGaWxlQ29udGVudCA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoaW1h
Z2VCdWZmZXIpOwotICAgIGlmICghaW1hZ2VGaWxlQ29udGVudCkgewotICAgICAgICBHbG9iYWxG
cmVlKGltYWdlRmlsZURlc2NyaXB0b3IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
U3RyaW5nIGZpbGVOYW1lID0gY2FjaGVkSW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5h
bWUoKTsKLSAgICBIR0xPQkFMIGhEcm9wQ29udGVudCA9IGNyZWF0ZUdsb2JhbEhEcm9wQ29udGVu
dCh1cmwsIGZpbGVOYW1lLCBpbWFnZUJ1ZmZlcik7Ci0gICAgaWYgKCFoRHJvcENvbnRlbnQpIHsK
LSAgICAgICAgR2xvYmFsRnJlZShoRHJvcENvbnRlbnQpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgd3JpdGVGaWxlVG9EYXRhT2JqZWN0KGRhdGFPYmplY3QsIGltYWdlRmlsZURlc2Ny
aXB0b3IsIGltYWdlRmlsZUNvbnRlbnQsIGhEcm9wQ29udGVudCk7Ci19Ci0KLXZvaWQgQ2xpcGJv
YXJkV2luOjpkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UoRWxlbWVudCogZWxlbWVudCwgY29uc3Qg
S1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBGcmFtZSogZnJhbWUpCi17CiAgICAgLy8g
T3JkZXIgaXMgaW1wb3J0YW50IGhlcmUgZm9yIEV4cGxvcmVyJ3Mgc2FrZQotICAgIGlmICghbV93
cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgICByZXR1cm47Ci0gICAgV2ViQ29yZTo6d3JpdGVV
UkwobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybCwgdGl0bGUsIHRydWUsIGZhbHNlKTsK
LQotICAgIHdyaXRlSW1hZ2VUb0RhdGFPYmplY3QobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCks
IGVsZW1lbnQsIHVybCk7Ci0KLSAgICBBdG9taWNTdHJpbmcgaW1hZ2VVUkwgPSBlbGVtZW50LT5n
ZXRBdHRyaWJ1dGUoc3JjQXR0cik7CisgICAgaWYgKCFtX3Bhc3RlYm9hcmQtPndyaXRhYmxlRGF0
YU9iamVjdCgpKQorICAgICAgICByZXR1cm47CisgICAgbV9wYXN0ZWJvYXJkLT53cml0ZVVSTFRv
V3JpdGFibGVEYXRhT2JqZWN0KHVybCwgdGl0bGUpOworICAgIG1fcGFzdGVib2FyZC0+d3JpdGVJ
bWFnZVRvRGF0YU9iamVjdChlbGVtZW50LCB1cmwpOworICAgIEF0b21pY1N0cmluZyBpbWFnZVVS
TCA9IGVsZW1lbnQtPmdldEF0dHJpYnV0ZShIVE1MTmFtZXM6OnNyY0F0dHIpOwogICAgIGlmIChp
bWFnZVVSTC5pc0VtcHR5KCkpIAogICAgICAgICByZXR1cm47CiAKQEAgLTY4OCwxMzEgKzc4LDgg
QEANCiAgICAgVmVjdG9yPGNoYXI+IGRhdGE7CiAgICAgbWFya3VwVG9DRkhUTUwoY3JlYXRlTWFy
a3VwKGVsZW1lbnQsIEluY2x1ZGVOb2RlLCAwLCBSZXNvbHZlQWxsVVJMcyksICIiLCBkYXRhKTsK
ICAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7Ci0gICAgaWYgKG1l
ZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShodG1s
Rm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKKyAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJ
TEVEKG1fcGFzdGVib2FyZC0+d3JpdGFibGVEYXRhT2JqZWN0KCktPlNldERhdGEoaHRtbEZvcm1h
dCgpLCAmbWVkaXVtLCBUUlVFKSkpCiAgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2Jh
bCk7CiB9CiAKLXZvaWQgQ2xpcGJvYXJkV2luOjp3cml0ZVVSTChjb25zdCBLVVJMJiBrdXJsLCBj
b25zdCBTdHJpbmcmIHRpdGxlU3RyLCBGcmFtZSopCi17Ci0gICAgaWYgKCFtX3dyaXRhYmxlRGF0
YU9iamVjdCkKLSAgICAgICAgIHJldHVybjsKLSAgICBXZWJDb3JlOjp3cml0ZVVSTChtX3dyaXRh
YmxlRGF0YU9iamVjdC5nZXQoKSwga3VybCwgdGl0bGVTdHIsIHRydWUsIHRydWUpOwotCi0gICAg
U3RyaW5nIHVybCA9IGt1cmwuc3RyaW5nKCk7Ci0gICAgQVNTRVJUKHVybC5jb250YWluc09ubHlB
U0NJSSgpKTsgLy8gS1VSTDo6c3RyaW5nKCkgaXMgVVJMIGVuY29kZWQuCi0KLSAgICBTdHJpbmcg
ZnNQYXRoID0gZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JUaXRsZSh1cmwsIHRpdGxlU3RyLCBMIi5V
UkwiLCB0cnVlKTsKLSAgICBTdHJpbmcgY29udGVudFN0cmluZygiW0ludGVybmV0U2hvcnRjdXRd
XHJcblVSTD0iICsgdXJsICsgIlxyXG4iKTsKLSAgICBDU3RyaW5nIGNvbnRlbnQgPSBjb250ZW50
U3RyaW5nLmxhdGluMSgpOwotCi0gICAgaWYgKGZzUGF0aC5sZW5ndGgoKSA8PSAwKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBIR0xPQkFMIHVybEZpbGVEZXNjcmlwdG9yID0gR2xvYmFsQWxsb2Mo
R1BUUiwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKLSAgICBpZiAoIXVybEZpbGVEZXNj
cmlwdG9yKQotICAgICAgICByZXR1cm47Ci0KLSAgICBIR0xPQkFMIHVybEZpbGVDb250ZW50ID0g
R2xvYmFsQWxsb2MoR1BUUiwgY29udGVudC5sZW5ndGgoKSk7Ci0gICAgaWYgKCF1cmxGaWxlQ29u
dGVudCkgewotICAgICAgICBHbG9iYWxGcmVlKHVybEZpbGVEZXNjcmlwdG9yKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIEZJTEVHUk9VUERFU0NSSVBUT1IqIGZnZCA9IHN0YXRpY19j
YXN0PEZJTEVHUk9VUERFU0NSSVBUT1IqPihHbG9iYWxMb2NrKHVybEZpbGVEZXNjcmlwdG9yKSk7
Ci0gICAgWmVyb01lbW9yeShmZ2QsIHNpemVvZihGSUxFR1JPVVBERVNDUklQVE9SKSk7Ci0gICAg
ZmdkLT5jSXRlbXMgPSAxOwotICAgIGZnZC0+ZmdkWzBdLmR3RmxhZ3MgPSBGRF9GSUxFU0laRTsK
LSAgICBmZ2QtPmZnZFswXS5uRmlsZVNpemVMb3cgPSBjb250ZW50Lmxlbmd0aCgpOwotCi0gICAg
dW5zaWduZWQgbWF4U2l6ZSA9IG1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgo
ZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lKSk7Ci0gICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmls
ZU5hbWUsIGZzUGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKLSAg
ICBHbG9iYWxVbmxvY2sodXJsRmlsZURlc2NyaXB0b3IpOwotCi0gICAgY2hhciogZmlsZUNvbnRl
bnRzID0gc3RhdGljX2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2sodXJsRmlsZUNvbnRlbnQpKTsKLSAg
ICBDb3B5TWVtb3J5KGZpbGVDb250ZW50cywgY29udGVudC5kYXRhKCksIGNvbnRlbnQubGVuZ3Ro
KCkpOwotICAgIEdsb2JhbFVubG9jayh1cmxGaWxlQ29udGVudCk7Ci0KLSAgICB3cml0ZUZpbGVU
b0RhdGFPYmplY3QobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybEZpbGVEZXNjcmlwdG9y
LCB1cmxGaWxlQ29udGVudCwgMCk7Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjp3cml0ZVJhbmdl
KFJhbmdlKiBzZWxlY3RlZFJhbmdlLCBGcmFtZSogZnJhbWUpCi17Ci0gICAgQVNTRVJUKHNlbGVj
dGVkUmFuZ2UpOwotICAgIGlmICghbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgICByZXR1
cm47Ci0KLSAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OwotICAgIG1lZGl1bS50eW1lZCA9IFRZ
TUVEX0hHTE9CQUw7Ci0KLSAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKLSAgICBtYXJrdXBUb0NGSFRN
TChjcmVhdGVNYXJrdXAoc2VsZWN0ZWRSYW5nZSwgMCwgQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSks
Ci0gICAgICAgIHNlbGVjdGVkUmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCktPmRvY3VtZW50KCktPnVy
bCgpLnN0cmluZygpLCBkYXRhKTsKLSAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERh
dGEoZGF0YSk7Ci0gICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0
YU9iamVjdC0+U2V0RGF0YShodG1sRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAg
OjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKLQotICAgIFN0cmluZyBzdHIgPSBmcmFtZS0+
ZWRpdG9yKCkuc2VsZWN0ZWRUZXh0Rm9yQ2xpcGJvYXJkKCk7Ci0gICAgcmVwbGFjZU5ld2xpbmVz
V2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVzKHN0cik7Ci0gICAgcmVwbGFjZU5CU1BXaXRoU3BhY2Uo
c3RyKTsKLSAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoc3RyKTsKLSAgICBp
ZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRh
KHBsYWluVGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICA6Okdsb2JhbEZy
ZWUobWVkaXVtLmhHbG9iYWwpOwotCi0gICAgbWVkaXVtLmhHbG9iYWwgPSAwOwotICAgIGlmIChm
cmFtZS0+ZWRpdG9yKCkuY2FuU21hcnRDb3B5T3JEZWxldGUoKSkKLSAgICAgICAgbV93cml0YWJs
ZURhdGFPYmplY3QtPlNldERhdGEoc21hcnRQYXN0ZUZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKTsK
LX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OndyaXRlUGxhaW5UZXh0KGNvbnN0IFN0cmluZyYgdGV4
dCkKLXsKLSAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQotICAgICAgICByZXR1cm47Ci0g
ICAgCi0gICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAgICBtZWRpdW0udHltZWQgPSBUWU1F
RF9IR0xPQkFMOwotICAgIAotICAgIFN0cmluZyBzdHIgPSB0ZXh0OwotICAgIHJlcGxhY2VOZXds
aW5lc1dpdGhXaW5kb3dzU3R5bGVOZXdsaW5lcyhzdHIpOwotICAgIHJlcGxhY2VOQlNQV2l0aFNw
YWNlKHN0cik7Ci0gICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKHN0cik7Ci0g
ICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0
RGF0YShwbGFpblRleHRXRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgOjpHbG9i
YWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsgICAgICAgIAotCi0gICAgbWVkaXVtLmhHbG9iYWwgPSAw
OwotfQotICAgIAotYm9vbCBDbGlwYm9hcmRXaW46Omhhc0RhdGEoKQotewotICAgIGlmICghbV9k
YXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBpZiAobV9kYXRhT2JqZWN0KSB7Ci0gICAgICAgIENPTVB0cjxJRW51bUZPUk1B
VEVUQz4gaXRyOwotICAgICAgICBpZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+RW51bUZvcm1hdEV0
YyhEQVRBRElSX0dFVCwgJml0cikpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
ICAgIGlmICghaXRyKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEZPUk1B
VEVUQyBkYXRhOwotCi0gICAgICAgIC8vIElFbnVtRk9STUFURVRDOjpOZXh0IHJldHVybnMgU19G
QUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcy4KLSAgICAgICAgaWYgKGl0ci0+TmV4dCgx
LCAmZGF0YSwgMCkgPT0gU19PSykgewotICAgICAgICAgICAgLy8gVGhlcmUgaXMgYXQgbGVhc3Qg
b25lIGl0ZW0gaW4gdGhlIElEYXRhT2JqZWN0Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuICFtX2Ry
YWdEYXRhTWFwLmlzRW1wdHkoKTsKLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OnNldEV4dGVybmFs
RGF0YU9iamVjdChJRGF0YU9iamVjdCAqZGF0YU9iamVjdCkKLXsKLSAgICBBU1NFUlQoaXNGb3JE
cmFnQW5kRHJvcCgpKTsKLQotICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0ID0gMDsKLSAgICBtX2Rh
dGFPYmplY3QgPSBkYXRhT2JqZWN0OwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgNCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgJKHJldmlzaW9u
IDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgJ
KHdvcmtpbmcgY29weSkNCkBAIC0xLDEwMSArMCwwIEBADQotLyoKLSAqIENvcHlyaWdodCAoQykg
MjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0K
LSNpZm5kZWYgQ2xpcGJvYXJkV2luX2gKLSNkZWZpbmUgQ2xpcGJvYXJkV2luX2gKLQotI2luY2x1
ZGUgIkNPTVB0ci5oIgotI2luY2x1ZGUgIkNhY2hlZEltYWdlQ2xpZW50LmgiCi0jaW5jbHVkZSAi
Q2xpcGJvYXJkLmgiCi0jaW5jbHVkZSAiRHJhZ0RhdGEuaCIKLQotc3RydWN0IElEYXRhT2JqZWN0
OwotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIENhY2hlZEltYWdlOwotY2xhc3MgRnJh
bWU7Ci1jbGFzcyBJbnRQb2ludDsKLWNsYXNzIFdDRGF0YU9iamVjdDsKLQotLy8gU3RhdGUgYXZh
aWxhYmxlIGR1cmluZyBJRSdzIGV2ZW50cyBmb3IgZHJhZyBhbmQgZHJvcCBhbmQgY29weS9wYXN0
ZQotY2xhc3MgQ2xpcGJvYXJkV2luIDogcHVibGljIENsaXBib2FyZCwgcHVibGljIENhY2hlZElt
YWdlQ2xpZW50IHsKLSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBz
dGF0aWMgUGFzc1JlZlB0cjxDbGlwYm9hcmRXaW4+IGNyZWF0ZShDbGlwYm9hcmRUeXBlIGNsaXBi
b2FyZFR5cGUsIElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3kg
cG9saWN5LCBGcmFtZSogZnJhbWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3
IENsaXBib2FyZFdpbihjbGlwYm9hcmRUeXBlLCBkYXRhT2JqZWN0LCBwb2xpY3ksIGZyYW1lKSk7
Ci0gICAgfQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPENsaXBib2FyZFdpbj4gY3JlYXRlKENsaXBi
b2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgV0NEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBDbGlwYm9h
cmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBGcmFtZSogZnJhbWUpCi0gICAgewotICAgICAgICByZXR1
cm4gYWRvcHRSZWYobmV3IENsaXBib2FyZFdpbihjbGlwYm9hcmRUeXBlLCBkYXRhT2JqZWN0LCBw
b2xpY3ksIGZyYW1lKSk7Ci0gICAgfQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPENsaXBib2FyZFdp
bj4gY3JlYXRlKENsaXBib2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgY29uc3QgRHJhZ0RhdGFNYXAm
IGRhdGFNYXAsIENsaXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2xpcGJvYXJkV2luKGNsaXBib2FyZFR5
cGUsIGRhdGFNYXAsIHBvbGljeSwgZnJhbWUpKTsKLSAgICB9Ci0gICAgfkNsaXBib2FyZFdpbigp
OwotCi0gICAgdm9pZCBjbGVhckRhdGEoY29uc3QgU3RyaW5nJiB0eXBlKTsKLSAgICB2b2lkIGNs
ZWFyRGF0YSgpOwotICAgIFN0cmluZyBnZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSkgY29uc3Q7
Ci0gICAgYm9vbCBzZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBkYXRh
KTsKLQotICAgIC8vIGV4dGVuc2lvbnMgYmV5b25kIElFJ3MgQVBJCi0gICAgdmlydHVhbCBMaXN0
SGFzaFNldDxTdHJpbmc+IHR5cGVzKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPEZp
bGVMaXN0PiBmaWxlcygpIGNvbnN0OwotCi0gICAgdm9pZCBzZXREcmFnSW1hZ2UoQ2FjaGVkSW1h
Z2UqLCBjb25zdCBJbnRQb2ludCYpOwotICAgIHZvaWQgc2V0RHJhZ0ltYWdlRWxlbWVudChOb2Rl
KiwgY29uc3QgSW50UG9pbnQmKTsKLQotICAgIHZpcnR1YWwgRHJhZ0ltYWdlUmVmIGNyZWF0ZURy
YWdJbWFnZShJbnRQb2ludCYgZHJhZ0xvYykgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGRlY2xh
cmVBbmRXcml0ZURyYWdJbWFnZShFbGVtZW50KiwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYg
dGl0bGUsIEZyYW1lKik7Ci0gICAgdmlydHVhbCB2b2lkIHdyaXRlVVJMKGNvbnN0IEtVUkwmLCBj
b25zdCBTdHJpbmcmLCBGcmFtZSopOwotICAgIHZpcnR1YWwgdm9pZCB3cml0ZVJhbmdlKFJhbmdl
KiwgRnJhbWUqKTsKLSAgICB2aXJ0dWFsIHZvaWQgd3JpdGVQbGFpblRleHQoY29uc3QgU3RyaW5n
Jik7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzRGF0YSgpOwotCi0gICAgQ09NUHRyPElEYXRhT2Jq
ZWN0PiBkYXRhT2JqZWN0KCkgeyByZXR1cm4gbV9kYXRhT2JqZWN0OyB9Ci0KLSAgICB2b2lkIHNl
dEV4dGVybmFsRGF0YU9iamVjdChJRGF0YU9iamVjdCAqZGF0YU9iamVjdCk7Ci0KLXByaXZhdGU6
Ci0gICAgQ2xpcGJvYXJkV2luKENsaXBib2FyZFR5cGUsIElEYXRhT2JqZWN0KiwgQ2xpcGJvYXJk
QWNjZXNzUG9saWN5LCBGcmFtZSopOwotICAgIENsaXBib2FyZFdpbihDbGlwYm9hcmRUeXBlLCBX
Q0RhdGFPYmplY3QqLCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3ksIEZyYW1lKik7Ci0gICAgQ2xpcGJv
YXJkV2luKENsaXBib2FyZFR5cGUsIGNvbnN0IERyYWdEYXRhTWFwJiwgQ2xpcGJvYXJkQWNjZXNz
UG9saWN5LCBGcmFtZSopOwotCi0gICAgdm9pZCByZXNldEZyb21DbGlwYm9hcmQoKTsKLSAgICB2
b2lkIHNldERyYWdJbWFnZShDYWNoZWRJbWFnZSosIE5vZGUqLCBjb25zdCBJbnRQb2ludCYpOwot
Ci0gICAgQ09NUHRyPElEYXRhT2JqZWN0PiBtX2RhdGFPYmplY3Q7Ci0gICAgQ09NUHRyPFdDRGF0
YU9iamVjdD4gbV93cml0YWJsZURhdGFPYmplY3Q7Ci0gICAgRHJhZ0RhdGFNYXAgbV9kcmFnRGF0
YU1hcDsKLSAgICBGcmFtZSogbV9mcmFtZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
LQotI2VuZGlmIC8vIENsaXBib2FyZFdpbl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS93aW4vRWRpdG9yV2luLmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL3dpbi9FZGl0b3JXaW4uY3BwCShyZXZpc2lvbiAxNTA2MjkpDQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vd2luL0VkaXRvcldpbi5jcHAJKHdvcmtpbmcgY29weSkNCkBAIC0yNSwxNSAr
MjUsMTcgQEANCiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJFZGl0b3IuaCIKLSNp
bmNsdWRlICJFZGl0b3JDbGllbnQuaCIKIAotI2luY2x1ZGUgIkNsaXBib2FyZFdpbi5oIgorI2lu
Y2x1ZGUgIkNPTVB0ci5oIgorI2luY2x1ZGUgIkNsaXBib2FyZC5oIgogI2luY2x1ZGUgIkRvY3Vt
ZW50LmgiCisjaW5jbHVkZSAiRWRpdG9yQ2xpZW50LmgiCiAjaW5jbHVkZSAiRWxlbWVudC5oIgog
I2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKKyNpbmNsdWRlICJQ
YXN0ZWJvYXJkLmgiCiAjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiVmlzaWJs
ZVVuaXRzLmgiCisjaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKIAogI2luY2x1ZGUgPHdpbmRvd3Mu
aD4KIApAQCAtNDYsOCArNDgsOSBAQA0KICAgICBpZiAoIVNVQ0NFRURFRChPbGVHZXRDbGlwYm9h
cmQoJmNsaXBib2FyZERhdGEpKSkKICAgICAgICAgY2xpcGJvYXJkRGF0YSA9IDA7CiAjZW5kaWYK
LQotICAgIHJldHVybiBDbGlwYm9hcmRXaW46OmNyZWF0ZShDbGlwYm9hcmQ6OkNvcHlBbmRQYXN0
ZSwgY2xpcGJvYXJkRGF0YS5nZXQoKSwgcG9saWN5LCBmcmFtZSk7CisgICAgUmVmUHRyPENsaXBi
b2FyZD4gY2xpcGJvYXJkID0gQ2xpcGJvYXJkOjpjcmVhdGVGb3JDb3B5QW5kUGFzdGUocG9saWN5
KTsKKyAgICBjb25zdF9jYXN0PFBhc3RlYm9hcmQmPihjbGlwYm9hcmQtPnBhc3RlYm9hcmQoKSku
c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KGNsaXBib2FyZERhdGEuZ2V0KCkpOworICAgIHJldHVybiBj
bGlwYm9hcmQucmVsZWFzZSgpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHANCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHAJKHJldmlz
aW9uIDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdp
bi5jcHAJKHdvcmtpbmcgY29weSkNCkBAIC0xLDUgKzEsNiBAQA0KIC8qCiAgKiBDb3B5cmlnaHQg
KEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly
aWdodCAoQykgMjAxMyBYdWVxaW5nIEh1YW5nIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgogICoK
ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zNCw2ICszNSw4IEBADQogI2luY2x1ZGUg
IkVkaXRvci5oIgogI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJGcmFtZS5oIgorI2lu
Y2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhUTUxQYXJzZXJJZGlvbXMuaCIKICNpbmNs
dWRlICJIV25kREMuaCIKICNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCiAjaW5jbHVkZSAiSW1h
Z2UuaCIKQEAgLTQyLDYgKzQ1LDcgQEANCiAjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlJh
bmdlLmgiCiAjaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmZXIu
aCIKICNpbmNsdWRlICJUZXh0RW5jb2RpbmcuaCIKICNpbmNsdWRlICJXZWJDb3JlSW5zdGFuY2VI
YW5kbGUuaCIKICNpbmNsdWRlICJXaW5kb3dzRXh0cmFzLmgiCkBAIC01MCw2ICs1NCw5IEBADQog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKKy8vIFdlIHByb3ZpZGUgdGhlIElFIGNsaXBib2FyZCB0
eXBlcyAoVVJMIGFuZCBUZXh0KSwgYW5kIHRoZSBjbGlwYm9hcmQgdHlwZXMgc3BlY2lmaWVkIGlu
IHRoZSBXSEFUV0cgV2ViIEFwcGxpY2F0aW9ucyAxLjAgZHJhZnQKKy8vIHNlZSBodHRwOi8vd3d3
LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyBTZWN0aW9uIDYuMy41LjMK
Kwogc3RhdGljIFVJTlQgSFRNTENsaXBib2FyZEZvcm1hdCA9IDA7CiBzdGF0aWMgVUlOVCBCb29r
bWFya0NsaXBib2FyZEZvcm1hdCA9IDA7CiBzdGF0aWMgVUlOVCBXZWJTbWFydFBhc3RlRm9ybWF0
ID0gMDsKQEAgLTg5LDggKzk2LDM4IEBADQogICAgIHJldHVybiBwYXN0ZWJvYXJkOwogfQogCi1Q
YXN0ZWJvYXJkOjpQYXN0ZWJvYXJkKCkKK1Bhc3NPd25QdHI8UGFzdGVib2FyZD4gUGFzdGVib2Fy
ZDo6Y3JlYXRlRm9yQ29weUFuZFBhc3RlKCkKIHsKKyAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBh
c3RlYm9hcmQpOworfQorCitQYXNzT3duUHRyPFBhc3RlYm9hcmQ+IFBhc3RlYm9hcmQ6OmNyZWF0
ZVByaXZhdGUoKQoreworICAgIC8vIFdpbmRvd3MgaGFzIG5vdCAiUHJpdmF0ZSBwYXN0ZWJvYXJk
IiBjb25jZXB0LgorICAgIHJldHVybiBjcmVhdGVGb3JDb3B5QW5kUGFzdGUoKTsKK30KKworI2lm
IEVOQUJMRShEUkFHX1NVUFBPUlQpCitQYXNzT3duUHRyPFBhc3RlYm9hcmQ+IFBhc3RlYm9hcmQ6
OmNyZWF0ZUZvckRyYWdBbmREcm9wKCkKK3sKKyAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBkYXRh
T2JqZWN0OworICAgIFdDRGF0YU9iamVjdDo6Y3JlYXRlSW5zdGFuY2UoJmRhdGFPYmplY3QpOwor
ICAgIHJldHVybiBhZG9wdFB0cihuZXcgUGFzdGVib2FyZChkYXRhT2JqZWN0LmdldCgpKSk7Cit9
CisKKy8vIHN0YXRpYworUGFzc093blB0cjxQYXN0ZWJvYXJkPiBQYXN0ZWJvYXJkOjpjcmVhdGVG
b3JEcmFnQW5kRHJvcChjb25zdCBEcmFnRGF0YSYgZHJhZ0RhdGEpCit7CisgICAgaWYgKGRyYWdE
YXRhLnBsYXRmb3JtRGF0YSgpKQorICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBhc3RlYm9h
cmQoZHJhZ0RhdGEucGxhdGZvcm1EYXRhKCkpKTsKKyAgICAvLyBXZSBjb3VsZCBub3QgY2FsbCBE
cmFnRGF0YTo6ZHJhZ0RhdGFNYXAgdmlhIHxjb25zdCBEcmFnRGF0YSZ8LgorICAgIGNvbnN0IERy
YWdEYXRhTWFwJiBkcmFnRGF0YU1hcCA9IGNvbnN0X2Nhc3Q8RHJhZ0RhdGEqPigoJmRyYWdEYXRh
KSktPmRyYWdEYXRhTWFwKCk7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBQYXN0ZWJvYXJkKGRy
YWdEYXRhTWFwKSk7Cit9CisjZW5kaWYKKwordm9pZCBQYXN0ZWJvYXJkOjpmaW5pc2hDcmVhdGlu
Z1Bhc3RlYm9hcmQoKQorewogICAgIFdORENMQVNTIHdjOwogICAgIG1lbXNldCgmd2MsIDAsIHNp
emVvZihXTkRDTEFTUykpOwogICAgIHdjLmxwZm5XbmRQcm9jICAgID0gUGFzdGVib2FyZE93bmVy
V25kUHJvYzsKQEAgLTEwNiw2ICsxNDMsMzUgQEANCiAgICAgV2ViU21hcnRQYXN0ZUZvcm1hdCA9
IDo6UmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJXZWJLaXQgU21hcnQgUGFzdGUgRm9ybWF0Iik7
CiB9CiAKK1Bhc3RlYm9hcmQ6OlBhc3RlYm9hcmQoKQorICAgIDogbV9kYXRhT2JqZWN0KDApCisg
ICAgLCBtX3dyaXRhYmxlRGF0YU9iamVjdCgwKQoreworICAgIGZpbmlzaENyZWF0aW5nUGFzdGVi
b2FyZCgpOworfQorCitQYXN0ZWJvYXJkOjpQYXN0ZWJvYXJkKElEYXRhT2JqZWN0KiBkYXRhT2Jq
ZWN0KQorICAgIDogbV9kYXRhT2JqZWN0KGRhdGFPYmplY3QpCisgICAgLCBtX3dyaXRhYmxlRGF0
YU9iamVjdCgwKQoreworICAgIGZpbmlzaENyZWF0aW5nUGFzdGVib2FyZCgpOworfQorCitQYXN0
ZWJvYXJkOjpQYXN0ZWJvYXJkKFdDRGF0YU9iamVjdCogZGF0YU9iamVjdCkKKyAgICA6IG1fZGF0
YU9iamVjdChkYXRhT2JqZWN0KQorICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoZGF0YU9iamVj
dCkKK3sKKyAgICBmaW5pc2hDcmVhdGluZ1Bhc3RlYm9hcmQoKTsKK30KKworUGFzdGVib2FyZDo6
UGFzdGVib2FyZChjb25zdCBEcmFnRGF0YU1hcCYgZGF0YU1hcCkKKyAgICA6IG1fZGF0YU9iamVj
dCgwKQorICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoMCkKKyAgICAsIG1fZHJhZ0RhdGFNYXAo
ZGF0YU1hcCkKK3sKKyAgICBmaW5pc2hDcmVhdGluZ1Bhc3RlYm9hcmQoKTsKK30KKwogdm9pZCBQ
YXN0ZWJvYXJkOjpjbGVhcigpCiB7CiAgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkg
ewpAQCAtMTE0LDYgKzE4MCwyNzEgQEANCiAgICAgfQogfQogCitlbnVtIENsaXBib2FyZERhdGFU
eXBlIHsgQ2xpcGJvYXJkRGF0YVR5cGVOb25lLCBDbGlwYm9hcmREYXRhVHlwZVVSTCwgQ2xpcGJv
YXJkRGF0YVR5cGVUZXh0LCBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MIH07CisKK3N0YXRpYyBD
bGlwYm9hcmREYXRhVHlwZSBjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKGNvbnN0IFN0cmluZyYg
dHlwZSkKK3sKKyAgICBTdHJpbmcgcVR5cGUgPSB0eXBlLnN0cmlwV2hpdGVTcGFjZSgpLmxvd2Vy
KCk7CisKKyAgICAvLyB0d28gc3BlY2lhbCBjYXNlcyBmb3IgSUUgY29tcGF0aWJpbGl0eQorICAg
IGlmIChxVHlwZSA9PSAidGV4dCIgfHwgcVR5cGUgPT0gInRleHQvcGxhaW4iIHx8IHFUeXBlLnN0
YXJ0c1dpdGgoInRleHQvcGxhaW47IikpCisgICAgICAgIHJldHVybiBDbGlwYm9hcmREYXRhVHlw
ZVRleHQ7CisgICAgaWYgKHFUeXBlID09ICJ1cmwiIHx8IHFUeXBlID09ICJ0ZXh0L3VyaS1saXN0
IikKKyAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVVJMOworICAgIGlmIChxVHlwZSA9
PSAidGV4dC9odG1sIikKKyAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVGV4dEhUTUw7
CisKKyAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVOb25lOworfQorCit2b2lkIFBhc3RlYm9h
cmQ6OmNsZWFyKGNvbnN0IFN0cmluZyYgdHlwZSkKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRh
T2JqZWN0KQorICAgICAgICByZXR1cm47CisKKyAgICBDbGlwYm9hcmREYXRhVHlwZSBkYXRhVHlw
ZSA9IGNsaXBib2FyZFR5cGVGcm9tTUlNRVR5cGUodHlwZSk7CisKKyAgICBpZiAoZGF0YVR5cGUg
PT0gQ2xpcGJvYXJkRGF0YVR5cGVVUkwpIHsKKyAgICAgICAgbV93cml0YWJsZURhdGFPYmplY3Qt
PmNsZWFyRGF0YSh1cmxXRm9ybWF0KCktPmNmRm9ybWF0KTsKKyAgICAgICAgbV93cml0YWJsZURh
dGFPYmplY3QtPmNsZWFyRGF0YSh1cmxGb3JtYXQoKS0+Y2ZGb3JtYXQpOworICAgIH0KKyAgICBp
ZiAoZGF0YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KSB7CisgICAgICAgIG1fd3JpdGFi
bGVEYXRhT2JqZWN0LT5jbGVhckRhdGEocGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0KTsKKyAg
ICAgICAgbV93cml0YWJsZURhdGFPYmplY3QtPmNsZWFyRGF0YShwbGFpblRleHRXRm9ybWF0KCkt
PmNmRm9ybWF0KTsKKyAgICB9Cit9CisKK2Jvb2wgUGFzdGVib2FyZDo6aGFzRGF0YSgpCit7Cisg
ICAgaWYgKCFtX2RhdGFPYmplY3QgJiYgbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGlmIChtX2RhdGFPYmplY3QpIHsKKyAgICAgICAgQ09NUHRy
PElFbnVtRk9STUFURVRDPiBpdHI7CisgICAgICAgIGlmIChGQUlMRUQobV9kYXRhT2JqZWN0LT5F
bnVtRm9ybWF0RXRjKERBVEFESVJfR0VULCAmaXRyKSkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgaWYgKCFpdHIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAgICAgRk9STUFURVRDIGRhdGE7CisKKyAgICAgICAgLy8gSUVudW1GT1JNQVRFVEM6Ok5leHQg
cmV0dXJucyBTX0ZBTFNFIGlmIHRoZXJlIGFyZSBubyBtb3JlIGl0ZW1zLgorICAgICAgICBpZiAo
aXRyLT5OZXh0KDEsICZkYXRhLCAwKSA9PSBTX09LKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBp
cyBhdCBsZWFzdCBvbmUgaXRlbSBpbiB0aGUgSURhdGFPYmplY3QKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBy
ZXR1cm4gIW1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpOworfQorCitzdGF0aWMgdm9pZCBhZGRNaW1l
VHlwZXNGb3JGb3JtYXQoTGlzdEhhc2hTZXQ8U3RyaW5nPiYgcmVzdWx0cywgY29uc3QgRk9STUFU
RVRDJiBmb3JtYXQpCit7CisgICAgLy8gVVJMIGFuZCBUZXh0IGFyZSBwcm92aWRlZCBmb3IgY29t
cGF0aWJpbGl0eSB3aXRoIElFJ3MgbW9kZWwKKyAgICBpZiAoZm9ybWF0LmNmRm9ybWF0ID09IHVy
bEZvcm1hdCgpLT5jZkZvcm1hdCB8fCBmb3JtYXQuY2ZGb3JtYXQgPT0gdXJsV0Zvcm1hdCgpLT5j
ZkZvcm1hdCkgeworICAgICAgICByZXN1bHRzLmFkZCgiVVJMIik7CisgICAgICAgIHJlc3VsdHMu
YWRkKCJ0ZXh0L3VyaS1saXN0Iik7CisgICAgfQorCisgICAgaWYgKGZvcm1hdC5jZkZvcm1hdCA9
PSBwbGFpblRleHRXRm9ybWF0KCktPmNmRm9ybWF0IHx8IGZvcm1hdC5jZkZvcm1hdCA9PSBwbGFp
blRleHRGb3JtYXQoKS0+Y2ZGb3JtYXQpIHsKKyAgICAgICAgcmVzdWx0cy5hZGQoIlRleHQiKTsK
KyAgICAgICAgcmVzdWx0cy5hZGQoInRleHQvcGxhaW4iKTsKKyAgICB9Cit9CisKK0xpc3RIYXNo
U2V0PFN0cmluZz4gUGFzdGVib2FyZDo6dHlwZXMoKQoreworICAgIExpc3RIYXNoU2V0PFN0cmlu
Zz4gcmVzdWx0czsKKworICAgIGlmICghbV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNF
bXB0eSgpKQorICAgICAgICByZXR1cm4gcmVzdWx0czsKKworICAgIGlmIChtX2RhdGFPYmplY3Qp
IHsKKyAgICAgICAgQ09NUHRyPElFbnVtRk9STUFURVRDPiBpdHI7CisKKyAgICAgICAgaWYgKEZB
SUxFRChtX2RhdGFPYmplY3QtPkVudW1Gb3JtYXRFdGMoREFUQURJUl9HRVQsICZpdHIpKSkKKyAg
ICAgICAgICAgIHJldHVybiByZXN1bHRzOworCisgICAgICAgIGlmICghaXRyKQorICAgICAgICAg
ICAgcmV0dXJuIHJlc3VsdHM7CisKKyAgICAgICAgRk9STUFURVRDIGRhdGE7CisKKyAgICAgICAg
Ly8gSUVudW1GT1JNQVRFVEM6Ok5leHQgcmV0dXJucyBTX0ZBTFNFIGlmIHRoZXJlIGFyZSBubyBt
b3JlIGl0ZW1zLgorICAgICAgICB3aGlsZSAoaXRyLT5OZXh0KDEsICZkYXRhLCAwKSA9PSBTX09L
KQorICAgICAgICAgICAgYWRkTWltZVR5cGVzRm9yRm9ybWF0KHJlc3VsdHMsIGRhdGEpOworICAg
IH0gZWxzZSB7CisgICAgICAgIGZvciAoRHJhZ0RhdGFNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
bV9kcmFnRGF0YU1hcC5iZWdpbigpOyBpdCAhPSBtX2RyYWdEYXRhTWFwLmVuZCgpOyArK2l0KSB7
CisgICAgICAgICAgICBGT1JNQVRFVEMgZGF0YTsKKyAgICAgICAgICAgIGRhdGEuY2ZGb3JtYXQg
PSAoKml0KS5rZXk7CisgICAgICAgICAgICBhZGRNaW1lVHlwZXNGb3JGb3JtYXQocmVzdWx0cywg
ZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0czsKK30KKworU3Ry
aW5nIFBhc3RlYm9hcmQ6OnJlYWRTdHJpbmcoY29uc3QgU3RyaW5nJiB0eXBlKQoreworICAgIGlm
ICghbV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm4gIiI7CisKKyAgICBDbGlwYm9hcmREYXRhVHlwZSBkYXRhVHlwZSA9IGNsaXBib2FyZFR5cGVG
cm9tTUlNRVR5cGUodHlwZSk7CisgICAgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBl
VGV4dCkKKyAgICAgICAgcmV0dXJuIG1fZGF0YU9iamVjdCA/IGdldFBsYWluVGV4dChtX2RhdGFP
YmplY3QuZ2V0KCkpIDogZ2V0UGxhaW5UZXh0KCZtX2RyYWdEYXRhTWFwKTsKKyAgICBpZiAoZGF0
YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVVUkwpCisgICAgICAgIHJldHVybiBtX2RhdGFPYmpl
Y3QgPyBnZXRVUkwobV9kYXRhT2JqZWN0LmdldCgpLCBEcmFnRGF0YTo6RG9Ob3RDb252ZXJ0Rmls
ZW5hbWVzKSA6IGdldFVSTCgmbV9kcmFnRGF0YU1hcCwgRHJhZ0RhdGE6OkRvTm90Q29udmVydEZp
bGVuYW1lcyk7CisgICAgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBlVGV4dEhUTUwp
IHsKKyAgICAgICAgU3RyaW5nIGRhdGEgPSBtX2RhdGFPYmplY3QgPyBnZXRUZXh0SFRNTChtX2Rh
dGFPYmplY3QuZ2V0KCkpIDogZ2V0VGV4dEhUTUwoJm1fZHJhZ0RhdGFNYXApOworICAgICAgICBp
ZiAoIWRhdGEuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgIHJl
dHVybiBtX2RhdGFPYmplY3QgPyBnZXRDRkhUTUwobV9kYXRhT2JqZWN0LmdldCgpKSA6IGdldENG
SFRNTCgmbV9kcmFnRGF0YU1hcCk7CisgICAgfQorCisgICAgcmV0dXJuICIiOworfQorCitWZWN0
b3I8U3RyaW5nPiBQYXN0ZWJvYXJkOjpyZWFkRmlsZW5hbWVzKCkKK3sKKyNpZiBVU0UoQ0YpCisg
ICAgVmVjdG9yPFN0cmluZz4gZmlsZU5hbWVzOworCisgICAgaWYgKG1fZGF0YU9iamVjdCkgewor
ICAgICAgICBTVEdNRURJVU0gbWVkaXVtOworICAgICAgICBpZiAoRkFJTEVEKG1fZGF0YU9iamVj
dC0+R2V0RGF0YShjZkhEcm9wRm9ybWF0KCksICZtZWRpdW0pKSkKKyAgICAgICAgICAgIHJldHVy
biBmaWxlTmFtZXM7CisKKyAgICAgICAgSERST1AgaGRyb3AgPSByZWludGVycHJldF9jYXN0PEhE
Uk9QPihHbG9iYWxMb2NrKG1lZGl1bS5oR2xvYmFsKSk7CisgICAgICAgIGlmICghaGRyb3ApCisg
ICAgICAgICAgICByZXR1cm4gZmlsZU5hbWVzOworCisgICAgICAgIFdDSEFSIGZpbGVuYW1lW01B
WF9QQVRIXTsKKyAgICAgICAgVUlOVCBmaWxlQ291bnQgPSBEcmFnUXVlcnlGaWxlVyhoZHJvcCwg
MHhGRkZGRkZGRiwgMCwgMCk7CisgICAgICAgIGZvciAoVUlOVCBpID0gMDsgaSA8IGZpbGVDb3Vu
dDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIURyYWdRdWVyeUZpbGVXKGhkcm9wLCBpLCBmaWxl
bmFtZSwgV1RGX0FSUkFZX0xFTkdUSChmaWxlbmFtZSkpKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgZmlsZU5hbWVzLmFwcGVuZChmaWxlbmFtZSk7CisgICAgICAgIH0K
KworICAgICAgICBHbG9iYWxVbmxvY2sobWVkaXVtLmhHbG9iYWwpOworICAgICAgICBSZWxlYXNl
U3RnTWVkaXVtKCZtZWRpdW0pOworICAgICAgICByZXR1cm4gZmlsZU5hbWVzOworICAgIH0KKyAg
ICBpZiAoIW1fZHJhZ0RhdGFNYXAuY29udGFpbnMoY2ZIRHJvcEZvcm1hdCgpLT5jZkZvcm1hdCkp
CisgICAgICAgIHJldHVybiBmaWxlTmFtZXM7CisgICAgcmV0dXJuIG1fZHJhZ0RhdGFNYXAuZ2V0
KGNmSERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQpOworI2Vsc2UKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBib29sIHdyaXRlVVJMKFdDRGF0
YU9iamVjdCAqZGF0YSwgY29uc3QgS1VSTCYgdXJsLCBTdHJpbmcgdGl0bGUsIGJvb2wgd2l0aFBs
YWluVGV4dCwgYm9vbCB3aXRoSFRNTCkKK3sKKyAgICBBU1NFUlQoZGF0YSk7CisKKyAgICBpZiAo
dXJsLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHRpdGxlLmlz
RW1wdHkoKSkgeworICAgICAgICB0aXRsZSA9IHVybC5sYXN0UGF0aENvbXBvbmVudCgpOworICAg
ICAgICBpZiAodGl0bGUuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGl0bGUgPSB1cmwuaG9zdCgp
OworICAgIH0KKworICAgIFNUR01FRElVTSBtZWRpdW0gPSB7MH07CisgICAgbWVkaXVtLnR5bWVk
ID0gVFlNRURfSEdMT0JBTDsKKworICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0
YSh1cmwsIHRpdGxlKTsKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBpZiAobWVkaXVt
LmhHbG9iYWwgJiYgRkFJTEVEKGRhdGEtPlNldERhdGEodXJsV0Zvcm1hdCgpLCAmbWVkaXVtLCBU
UlVFKSkpCisgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7CisgICAgZWxzZQor
ICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKworICAgIGlmICh3aXRoSFRNTCkgeworICAgICAgICBW
ZWN0b3I8Y2hhcj4gY2ZodG1sRGF0YTsKKyAgICAgICAgbWFya3VwVG9DRkhUTUwodXJsVG9NYXJr
dXAodXJsLCB0aXRsZSksICIiLCBjZmh0bWxEYXRhKTsKKyAgICAgICAgbWVkaXVtLmhHbG9iYWwg
PSBjcmVhdGVHbG9iYWxEYXRhKGNmaHRtbERhdGEpOworICAgICAgICBpZiAobWVkaXVtLmhHbG9i
YWwgJiYgRkFJTEVEKGRhdGEtPlNldERhdGEoaHRtbEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkp
CisgICAgICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOworICAgICAgICBlbHNl
CisgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAod2l0aFBsYWlu
VGV4dCkgeworICAgICAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEodXJsLnN0
cmluZygpKTsKKyAgICAgICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChkYXRhLT5TZXRE
YXRhKHBsYWluVGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQorICAgICAgICAgICAgOjpH
bG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3Vj
Y2VzcyA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK2Jvb2wgUGFz
dGVib2FyZDo6d3JpdGVTdHJpbmcoY29uc3QgU3RyaW5nJiB0eXBlLCBjb25zdCBTdHJpbmcmIGRh
dGEpCit7CisgICAgaWYgKCFtX3dyaXRhYmxlRGF0YU9iamVjdCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgQ2xpcGJvYXJkRGF0YVR5cGUgd2luVHlwZSA9IGNsaXBib2FyZFR5cGVGcm9t
TUlNRVR5cGUodHlwZSk7CisKKyAgICBpZiAod2luVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVS
TCkKKyAgICAgICAgcmV0dXJuIFdlYkNvcmU6OndyaXRlVVJMKG1fd3JpdGFibGVEYXRhT2JqZWN0
LmdldCgpLCBLVVJMKFBhcnNlZFVSTFN0cmluZywgZGF0YSksIFN0cmluZygpLCBmYWxzZSwgdHJ1
ZSk7CisKKyAgICBpZiAod2luVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRleHQpIHsKKyAgICAg
ICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKKyAgICAgICAgbWVkaXVtLnR5bWVkID0gVFlNRURf
SEdMT0JBTDsKKyAgICAgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEp
OworICAgICAgICBpZiAoIW1lZGl1bS5oR2xvYmFsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgICAgIGlmIChGQUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxh
aW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpIHsKKyAgICAgICAgICAgIDo6R2xvYmFs
RnJlZShtZWRpdW0uaEdsb2JhbCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQor
Cit2b2lkIFBhc3RlYm9hcmQ6OnNldERyYWdJbWFnZShEcmFnSW1hZ2VSZWYsIGNvbnN0IEludFBv
aW50JiBob3RTcG90KQoreworICAgIC8vIERvIG5vdGhpbmcgaW4gV2luZG93cy4KK30KKwordm9p
ZCBQYXN0ZWJvYXJkOjp3cml0ZVJhbmdlVG9EYXRhT2JqZWN0KFJhbmdlKiBzZWxlY3RlZFJhbmdl
LCBGcmFtZSogZnJhbWUpCit7CisgICAgQVNTRVJUKHNlbGVjdGVkUmFuZ2UpOworICAgIGlmICgh
bV93cml0YWJsZURhdGFPYmplY3QpCisgICAgICAgIHJldHVybjsKKworICAgIFNUR01FRElVTSBt
ZWRpdW0gPSB7MH07CisgICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKKworICAgIFZl
Y3RvcjxjaGFyPiBkYXRhOworICAgIG1hcmt1cFRvQ0ZIVE1MKGNyZWF0ZU1hcmt1cChzZWxlY3Rl
ZFJhbmdlLCAwLCBBbm5vdGF0ZUZvckludGVyY2hhbmdlKSwKKyAgICAgICAgc2VsZWN0ZWRSYW5n
ZS0+c3RhcnRDb250YWluZXIoKS0+ZG9jdW1lbnQoKS0+dXJsKCkuc3RyaW5nKCksIGRhdGEpOwor
ICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YShkYXRhKTsKKyAgICBpZiAobWVk
aXVtLmhHbG9iYWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKGh0bWxG
b3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQorICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhH
bG9iYWwpOworCisgICAgU3RyaW5nIHN0ciA9IGZyYW1lLT5lZGl0b3IoKS5zZWxlY3RlZFRleHRG
b3JDbGlwYm9hcmQoKTsKKyAgICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3bGlu
ZXMoc3RyKTsKKyAgICByZXBsYWNlTkJTUFdpdGhTcGFjZShzdHIpOworICAgIG1lZGl1bS5oR2xv
YmFsID0gY3JlYXRlR2xvYmFsRGF0YShzdHIpOworICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBG
QUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAm
bWVkaXVtLCBUUlVFKSkpCisgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7CisK
KyAgICBtZWRpdW0uaEdsb2JhbCA9IDA7CisgICAgaWYgKGZyYW1lLT5lZGl0b3IoKS5jYW5TbWFy
dENvcHlPckRlbGV0ZSgpKQorICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShz
bWFydFBhc3RlRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6
OndyaXRlU2VsZWN0aW9uKFJhbmdlKiBzZWxlY3RlZFJhbmdlLCBib29sIGNhblNtYXJ0Q29weU9y
RGVsZXRlLCBGcmFtZSogZnJhbWUsIFNob3VsZFNlcmlhbGl6ZVNlbGVjdGVkVGV4dEZvckNsaXBi
b2FyZCBzaG91bGRTZXJpYWxpemVTZWxlY3RlZFRleHRGb3JDbGlwYm9hcmQpCiB7CiAgICAgY2xl
YXIoKTsKQEAgLTE0NiwxMCArNDc3LDI5IEBADQogICAgICAgICAgICAgOjpTZXRDbGlwYm9hcmRE
YXRhKFdlYlNtYXJ0UGFzdGVGb3JtYXQsIDApOwogICAgICAgICAgICAgOjpDbG9zZUNsaXBib2Fy
ZCgpOwogICAgICAgICB9Ci0gICAgICAgIAogICAgIH0KKworICAgIHdyaXRlUmFuZ2VUb0RhdGFP
YmplY3Qoc2VsZWN0ZWRSYW5nZSwgZnJhbWUpOwogfQogCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRl
UGxhaW5UZXh0VG9EYXRhT2JqZWN0KGNvbnN0IFN0cmluZyYgdGV4dCwgU21hcnRSZXBsYWNlT3B0
aW9uIHNtYXJ0UmVwbGFjZU9wdGlvbikKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0
KQorICAgICAgICByZXR1cm47CisKKyAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OworICAgIG1l
ZGl1bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7CisKKyAgICBTdHJpbmcgc3RyID0gdGV4dDsKKyAg
ICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3bGluZXMoc3RyKTsKKyAgICByZXBs
YWNlTkJTUFdpdGhTcGFjZShzdHIpOworICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFs
RGF0YShzdHIpOworICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQobV93cml0YWJsZURh
dGFPYmplY3QtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCisg
ICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7ICAgICAgICAKKworICAgIG1lZGl1
bS5oR2xvYmFsID0gMDsKK30KKwogdm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVBsYWluVGV4dChjb25z
dCBTdHJpbmcmIHRleHQsIFNtYXJ0UmVwbGFjZU9wdGlvbiBzbWFydFJlcGxhY2VPcHRpb24pCiB7
CiAgICAgY2xlYXIoKTsKQEAgLTE3MSw4ICs1MjEsMTY1IEBADQogICAgICAgICAgICAgOjpDbG9z
ZUNsaXBib2FyZCgpOwogICAgICAgICB9CiAgICAgfQorCisgICAgd3JpdGVQbGFpblRleHRUb0Rh
dGFPYmplY3QodGV4dCwgc21hcnRSZXBsYWNlT3B0aW9uKTsKIH0KIAorI2lmICFPUyhXSU5DRSkK
K3N0YXRpYyBpbmxpbmUgdm9pZCBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKFBXU1RSIHBzeiwg
c2l6ZV90IGxlbmd0aCkKK3sKKyAgICBzaXplX3Qgd3JpdGVUbyA9IDA7CisgICAgc2l6ZV90IHJl
YWRGcm9tID0gMDsKKyAgICB3aGlsZSAocmVhZEZyb20gPCBsZW5ndGgpIHsKKyAgICAgICAgVUlO
VCB0eXBlID0gUGF0aEdldENoYXJUeXBlKHBzeltyZWFkRnJvbV0pOworICAgICAgICBpZiAoIXBz
eltyZWFkRnJvbV0gfHwgdHlwZSAmIChHQ1RfTEZOQ0hBUiB8IEdDVF9TSE9SVENIQVIpKQorICAg
ICAgICAgICAgcHN6W3dyaXRlVG8rK10gPSBwc3pbcmVhZEZyb21dOworCisgICAgICAgIHJlYWRG
cm9tKys7CisgICAgfQorICAgIHBzelt3cml0ZVRvXSA9IDA7Cit9CisjZW5kaWYKKworc3RhdGlj
IFN0cmluZyBmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRpdGxlKGNvbnN0IFN0cmluZyYgdXJsLCBj
b25zdCBTdHJpbmcmIHRpdGxlLCBjb25zdCBVQ2hhciogZXh0ZW5zaW9uLCBib29sIGlzTGluaykK
K3sKKyNpZiBPUyhXSU5DRSkKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBTdHJp
bmcoKTsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBmc1BhdGhNYXhMZW5ndGhFeGNs
dWRpbmdOdWxsVGVybWluYXRvciA9IE1BWF9QQVRIIC0gMTsKKyAgICBib29sIHVzZWRVUkwgPSBm
YWxzZTsKKyAgICBXQ0hBUiBmc1BhdGhCdWZmZXJbTUFYX1BBVEhdOworICAgIGZzUGF0aEJ1ZmZl
clswXSA9IDA7CisgICAgaW50IGV4dGVuc2lvbkxlbiA9IGV4dGVuc2lvbiA/IGxzdHJsZW4oZXh0
ZW5zaW9uKSA6IDA7CisgICAgaW50IGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4dGVuc2lvbiA9
IGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ051bGxUZXJtaW5hdG9yIC0gZXh0ZW5zaW9uTGVuOwor
CisgICAgaWYgKCF0aXRsZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0ZDo6
bWluPHNpemVfdD4odGl0bGUubGVuZ3RoKCksIGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4dGVu
c2lvbik7CisgICAgICAgIENvcHlNZW1vcnkoZnNQYXRoQnVmZmVyLCB0aXRsZS5jaGFyYWN0ZXJz
KCksIGxlbiAqIHNpemVvZihVQ2hhcikpOworICAgICAgICBmc1BhdGhCdWZmZXJbbGVuXSA9IDA7
CisgICAgICAgIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoZnNQYXRoQnVmZmVyLCBsZW4pOwor
ICAgIH0KKworICAgIGlmICghbHN0cmxlbihmc1BhdGhCdWZmZXIpKSB7CisgICAgICAgIEtVUkwg
a3VybChQYXJzZWRVUkxTdHJpbmcsIHVybCk7CisgICAgICAgIHVzZWRVUkwgPSB0cnVlOworICAg
ICAgICAvLyBUaGUgZmlsZW5hbWUgZm9yIGFueSBjb250ZW50IGJhc2VkIGRyYWcgb3IgZmlsZSB1
cmwgc2hvdWxkIGJlIHRoZSBsYXN0IGVsZW1lbnQgb2YgCisgICAgICAgIC8vIHRoZSBwYXRoLiBJ
ZiB3ZSBjYW4ndCBmaW5kIGl0LCBvciB3ZSdyZSBjb21pbmcgdXAgd2l0aCB0aGUgbmFtZSBmb3Ig
YSBsaW5rCisgICAgICAgIC8vIHdlIGp1c3QgdXNlIHRoZSBlbnRpcmUgdXJsLgorICAgICAgICBE
V09SRCBsZW4gPSBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb247CisgICAgICAgIFN0
cmluZyBsYXN0Q29tcG9uZW50ID0ga3VybC5sYXN0UGF0aENvbXBvbmVudCgpOworICAgICAgICBp
ZiAoa3VybC5pc0xvY2FsRmlsZSgpIHx8ICghaXNMaW5rICYmICFsYXN0Q29tcG9uZW50LmlzRW1w
dHkoKSkpIHsKKyAgICAgICAgICAgIGxlbiA9IHN0ZDo6bWluPERXT1JEPihmc1BhdGhNYXhMZW5n
dGhFeGNsdWRpbmdFeHRlbnNpb24sIGxhc3RDb21wb25lbnQubGVuZ3RoKCkpOworICAgICAgICAg
ICAgQ29weU1lbW9yeShmc1BhdGhCdWZmZXIsIGxhc3RDb21wb25lbnQuY2hhcmFjdGVycygpLCBs
ZW4gKiBzaXplb2YoVUNoYXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlbiA9
IHN0ZDo6bWluPERXT1JEPihmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24sIHVybC5s
ZW5ndGgoKSk7CisgICAgICAgICAgICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgdXJsLmNoYXJh
Y3RlcnMoKSwgbGVuICogc2l6ZW9mKFVDaGFyKSk7CisgICAgICAgIH0KKyAgICAgICAgZnNQYXRo
QnVmZmVyW2xlbl0gPSAwOworICAgICAgICBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKGZzUGF0
aEJ1ZmZlciwgbGVuKTsKKyAgICB9CisKKyAgICBpZiAoIWV4dGVuc2lvbikKKyAgICAgICAgcmV0
dXJuIFN0cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+KGZzUGF0aEJ1ZmZlcikpOworCisgICAgaWYg
KCFpc0xpbmsgJiYgdXNlZFVSTCkgeworICAgICAgICBQYXRoUmVuYW1lRXh0ZW5zaW9uKGZzUGF0
aEJ1ZmZlciwgZXh0ZW5zaW9uKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZyhzdGF0aWNfY2FzdDxV
Q2hhcio+KGZzUGF0aEJ1ZmZlcikpOworICAgIH0KKworICAgIHJldHVybiBtYWtlU3RyaW5nKHN0
YXRpY19jYXN0PGNvbnN0IFVDaGFyKj4oZnNQYXRoQnVmZmVyKSwgZXh0ZW5zaW9uKTsKKyNlbmRp
ZgorfQorCisvLyB3cml0ZUZpbGVUb0RhdGFPYmplY3QgdGFrZXMgb3duZXJzaGlwIG9mIGZpbGVE
ZXNjcmlwdG9yIGFuZCBmaWxlQ29udGVudAorc3RhdGljIEhSRVNVTFQgd3JpdGVGaWxlVG9EYXRh
T2JqZWN0KElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBIR0xPQkFMIGZpbGVEZXNjcmlwdG9yLCBI
R0xPQkFMIGZpbGVDb250ZW50LCBIR0xPQkFMIGhEcm9wQ29udGVudCkKK3sKKyAgICBIUkVTVUxU
IGhyID0gU19PSzsKKyAgICBGT1JNQVRFVEMqIGZlOworICAgIFNUR01FRElVTSBtZWRpdW0gPSB7
MH07CisgICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKKworICAgIGlmICghZmlsZURl
c2NyaXB0b3IgfHwgIWZpbGVDb250ZW50KQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICAvLyBE
ZXNjcmlwdG9yCisgICAgZmUgPSBmaWxlRGVzY3JpcHRvckZvcm1hdCgpOworCisgICAgbWVkaXVt
LmhHbG9iYWwgPSBmaWxlRGVzY3JpcHRvcjsKKworICAgIGlmIChGQUlMRUQoaHIgPSBkYXRhT2Jq
ZWN0LT5TZXREYXRhKGZlLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIGdvdG8gZXhpdDsKKwor
ICAgIC8vIENvbnRlbnRzCisgICAgZmUgPSBmaWxlQ29udGVudEZvcm1hdFplcm8oKTsKKyAgICBt
ZWRpdW0uaEdsb2JhbCA9IGZpbGVDb250ZW50OworICAgIGlmIChGQUlMRUQoaHIgPSBkYXRhT2Jq
ZWN0LT5TZXREYXRhKGZlLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIGdvdG8gZXhpdDsKKwor
I2lmIFVTRShDRikKKyAgICAvLyBIRFJPUAorICAgIGlmIChoRHJvcENvbnRlbnQpIHsKKyAgICAg
ICAgbWVkaXVtLmhHbG9iYWwgPSBoRHJvcENvbnRlbnQ7CisgICAgICAgIGhyID0gZGF0YU9iamVj
dC0+U2V0RGF0YShjZkhEcm9wRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpOworICAgIH0KKyNlbmRp
ZgorCitleGl0OgorICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGlmIChmaWxlRGVzY3Jp
cHRvcikKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoZmlsZURlc2NyaXB0b3IpOworICAgICAgICBp
ZiAoZmlsZUNvbnRlbnQpCisgICAgICAgICAgICBHbG9iYWxGcmVlKGZpbGVDb250ZW50KTsKKyAg
ICAgICAgaWYgKGhEcm9wQ29udGVudCkKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoaERyb3BDb250
ZW50KTsKKyAgICB9CisgICAgcmV0dXJuIGhyOworfQorCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRl
VVJMVG9EYXRhT2JqZWN0KGNvbnN0IEtVUkwmIGt1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGVTdHIs
IEZyYW1lKiBmcmFtZSkKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQorICAgICAg
ICByZXR1cm47CisgICAgV2ViQ29yZTo6d3JpdGVVUkwobV93cml0YWJsZURhdGFPYmplY3QuZ2V0
KCksIGt1cmwsIHRpdGxlU3RyLCB0cnVlLCB0cnVlKTsKKworICAgIFN0cmluZyB1cmwgPSBrdXJs
LnN0cmluZygpOworICAgIEFTU0VSVCh1cmwuY29udGFpbnNPbmx5QVNDSUkoKSk7IC8vIEtVUkw6
OnN0cmluZygpIGlzIFVSTCBlbmNvZGVkLgorCisgICAgU3RyaW5nIGZzUGF0aCA9IGZpbGVzeXN0
ZW1QYXRoRnJvbVVybE9yVGl0bGUodXJsLCB0aXRsZVN0ciwgTCIuVVJMIiwgdHJ1ZSk7CisgICAg
U3RyaW5nIGNvbnRlbnRTdHJpbmcoIltJbnRlcm5ldFNob3J0Y3V0XVxyXG5VUkw9IiArIHVybCAr
ICJcclxuIik7CisgICAgQ1N0cmluZyBjb250ZW50ID0gY29udGVudFN0cmluZy5sYXRpbjEoKTsK
KworICAgIGlmIChmc1BhdGgubGVuZ3RoKCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAg
SEdMT0JBTCB1cmxGaWxlRGVzY3JpcHRvciA9IEdsb2JhbEFsbG9jKEdQVFIsIHNpemVvZihGSUxF
R1JPVVBERVNDUklQVE9SKSk7CisgICAgaWYgKCF1cmxGaWxlRGVzY3JpcHRvcikKKyAgICAgICAg
cmV0dXJuOworCisgICAgSEdMT0JBTCB1cmxGaWxlQ29udGVudCA9IEdsb2JhbEFsbG9jKEdQVFIs
IGNvbnRlbnQubGVuZ3RoKCkpOworICAgIGlmICghdXJsRmlsZUNvbnRlbnQpIHsKKyAgICAgICAg
R2xvYmFsRnJlZSh1cmxGaWxlRGVzY3JpcHRvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBGSUxFR1JPVVBERVNDUklQVE9SKiBmZ2QgPSBzdGF0aWNfY2FzdDxGSUxFR1JPVVBERVND
UklQVE9SKj4oR2xvYmFsTG9jayh1cmxGaWxlRGVzY3JpcHRvcikpOworICAgIFplcm9NZW1vcnko
ZmdkLCBzaXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOworICAgIGZnZC0+Y0l0ZW1zID0gMTsK
KyAgICBmZ2QtPmZnZFswXS5kd0ZsYWdzID0gRkRfRklMRVNJWkU7CisgICAgZmdkLT5mZ2RbMF0u
bkZpbGVTaXplTG93ID0gY29udGVudC5sZW5ndGgoKTsKKworICAgIHVuc2lnbmVkIG1heFNpemUg
PSBzdGQ6Om1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgoZmdkLT5mZ2RbMF0u
Y0ZpbGVOYW1lKSk7CisgICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmlsZU5hbWUsIGZzUGF0
aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKKyAgICBHbG9iYWxVbmxv
Y2sodXJsRmlsZURlc2NyaXB0b3IpOworCisgICAgY2hhciogZmlsZUNvbnRlbnRzID0gc3RhdGlj
X2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2sodXJsRmlsZUNvbnRlbnQpKTsKKyAgICBDb3B5TWVtb3J5
KGZpbGVDb250ZW50cywgY29udGVudC5kYXRhKCksIGNvbnRlbnQubGVuZ3RoKCkpOworICAgIEds
b2JhbFVubG9jayh1cmxGaWxlQ29udGVudCk7CisKKyAgICB3cml0ZUZpbGVUb0RhdGFPYmplY3Qo
bV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybEZpbGVEZXNjcmlwdG9yLCB1cmxGaWxlQ29u
dGVudCwgMCk7Cit9CisKIHZvaWQgUGFzdGVib2FyZDo6d3JpdGVVUkwoY29uc3QgS1VSTCYgdXJs
LCBjb25zdCBTdHJpbmcmIHRpdGxlU3RyLCBGcmFtZSogZnJhbWUpCiB7CiAgICAgQVNTRVJUKCF1
cmwuaXNFbXB0eSgpKTsKQEAgLTIxMSw2ICs3MTgsOCBAQA0KICAgICAgICAgICAgIDo6R2xvYmFs
RnJlZShjYkRhdGEpOwogICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7CiAgICAgfQorCisgICAg
d3JpdGVVUkxUb0RhdGFPYmplY3QodXJsLCB0aXRsZVN0ciwgZnJhbWUpOwogfQogCiB2b2lkIFBh
c3RlYm9hcmQ6OndyaXRlSW1hZ2UoTm9kZSogbm9kZSwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmlu
ZyYpCkBAIC0yNTYsNiArNzY1LDExIEBADQogICAgIH0KIH0KIAordm9pZCBQYXN0ZWJvYXJkOjp3
cml0ZVBhc3RlYm9hcmQoY29uc3QgUGFzdGVib2FyZCYgc291cmNlUGFzdGVib2FyZCkKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6OndyaXRlQ2xpcGJvYXJk
KENsaXBib2FyZCopCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKQEAgLTM1Miw0ICs4NjYsMTg1
IEBADQogICAgIHJldHVybiAwOwogfQogCit2b2lkIFBhc3RlYm9hcmQ6OnNldEV4dGVybmFsRGF0
YU9iamVjdChJRGF0YU9iamVjdCAqZGF0YU9iamVjdCkKK3sKKyAgICBtX3dyaXRhYmxlRGF0YU9i
amVjdCA9IDA7CisgICAgbV9kYXRhT2JqZWN0ID0gZGF0YU9iamVjdDsKK30KKworc3RhdGljIENh
Y2hlZEltYWdlKiBnZXRDYWNoZWRJbWFnZShFbGVtZW50KiBlbGVtZW50KQoreworICAgIC8vIEF0
dGVtcHQgdG8gcHVsbCBDYWNoZWRJbWFnZSBmcm9tIGVsZW1lbnQKKyAgICBBU1NFUlQoZWxlbWVu
dCk7CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGVsZW1lbnQtPnJlbmRlcmVyKCk7Cisg
ICAgaWYgKCFyZW5kZXJlciB8fCAhcmVuZGVyZXItPmlzSW1hZ2UoKSkgCisgICAgICAgIHJldHVy
biAwOworCisgICAgUmVuZGVySW1hZ2UqIGltYWdlID0gdG9SZW5kZXJJbWFnZShyZW5kZXJlcik7
CisgICAgaWYgKGltYWdlLT5jYWNoZWRJbWFnZSgpICYmICFpbWFnZS0+Y2FjaGVkSW1hZ2UoKS0+
ZXJyb3JPY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gaW1hZ2UtPmNhY2hlZEltYWdlKCk7CisK
KyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSW1hZ2VGaWxl
RGVzY3JpcHRvcihjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ2FjaGVk
SW1hZ2UqIGltYWdlKQoreworICAgIEFTU0VSVF9BUkcoaW1hZ2UsIGltYWdlKTsKKyAgICBBU1NF
UlQoaW1hZ2UtPmltYWdlKCktPmRhdGEoKSk7CisKKyAgICBIUkVTVUxUIGhyID0gU19PSzsKKyAg
ICBIR0xPQkFMIG1lbU9iaiA9IDA7CisgICAgU3RyaW5nIGZzUGF0aDsKKyAgICBtZW1PYmogPSBH
bG9iYWxBbGxvYyhHUFRSLCBzaXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOworICAgIGlmICgh
bWVtT2JqKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEZJTEVHUk9VUERFU0NSSVBUT1IqIGZn
ZCA9IChGSUxFR1JPVVBERVNDUklQVE9SKilHbG9iYWxMb2NrKG1lbU9iaik7CisgICAgbWVtc2V0
KGZnZCwgMCwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKKyAgICBmZ2QtPmNJdGVtcyA9
IDE7CisgICAgZmdkLT5mZ2RbMF0uZHdGbGFncyA9IEZEX0ZJTEVTSVpFOworICAgIGZnZC0+Zmdk
WzBdLm5GaWxlU2l6ZUxvdyA9IGltYWdlLT5pbWFnZSgpLT5kYXRhKCktPnNpemUoKTsKKworICAg
IGNvbnN0IFN0cmluZyYgcHJlZmVycmVkVGl0bGUgPSB0aXRsZS5pc0VtcHR5KCkgPyBpbWFnZS0+
cmVzcG9uc2UoKS5zdWdnZXN0ZWRGaWxlbmFtZSgpIDogdGl0bGU7CisgICAgU3RyaW5nIGV4dGVu
c2lvbiA9IGltYWdlLT5pbWFnZSgpLT5maWxlbmFtZUV4dGVuc2lvbigpOworICAgIGlmIChleHRl
bnNpb24uaXNFbXB0eSgpKSB7CisgICAgICAgIC8vIERvIG5vdCBjb250aW51ZSBwcm9jZXNzaW5n
IGluIHRoZSByYXJlIGFuZCB1bnVzdWFsIGNhc2Ugd2hlcmUgYSBkZWNvZGVkIGltYWdlIGlzIG5v
dCBhYmxlIAorICAgICAgICAvLyB0byBwcm92aWRlIGEgZmlsZW5hbWUgZXh0ZW5zaW9uLiBTb21l
dGhpbmcgdHJpY2t5IChsaWtlIGEgYmFpdC1uLXN3aXRjaCkgaXMgZ29pbmcgb24KKyAgICAgICAg
cmV0dXJuIDA7CisgICAgfQorICAgIGV4dGVuc2lvbi5pbnNlcnQoIi4iLCAwKTsKKyAgICBmc1Bh
dGggPSBmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRpdGxlKHVybCwgcHJlZmVycmVkVGl0bGUsIGV4
dGVuc2lvbi5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCBmYWxzZSk7CisKKyAgICBp
ZiAoZnNQYXRoLmxlbmd0aCgpIDw9IDApIHsKKyAgICAgICAgR2xvYmFsVW5sb2NrKG1lbU9iaik7
CisgICAgICAgIEdsb2JhbEZyZWUobWVtT2JqKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQor
CisgICAgaW50IG1heFNpemUgPSBzdGQ6Om1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9M
RU5HVEgoZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lKSk7CisgICAgQ29weU1lbW9yeShmZ2QtPmZnZFsw
XS5jRmlsZU5hbWUsIChMUENXU1RSKWZzUGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXpl
b2YoVUNoYXIpKTsKKyAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKKworICAgIHJldHVybiBtZW1P
Ymo7Cit9CisKK3N0YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoU2hh
cmVkQnVmZmVyKiBkYXRhKQoreworICAgIEhHTE9CQUwgbWVtT2JqID0gR2xvYmFsQWxsb2MoR1BU
UiwgZGF0YS0+c2l6ZSgpKTsKKyAgICBpZiAoIW1lbU9iaikgCisgICAgICAgIHJldHVybiAwOwor
CisgICAgY2hhciogZmlsZUNvbnRlbnRzID0gKFBTVFIpR2xvYmFsTG9jayhtZW1PYmopOworCisg
ICAgQ29weU1lbW9yeShmaWxlQ29udGVudHMsIGRhdGEtPmRhdGEoKSwgZGF0YS0+c2l6ZSgpKTsK
KworICAgIEdsb2JhbFVubG9jayhtZW1PYmopOworCisgICAgcmV0dXJuIG1lbU9iajsKK30KKwor
c3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSERyb3BDb250ZW50KGNvbnN0IEtVUkwmIHVybCwg
U3RyaW5nJiBmaWxlTmFtZSwgU2hhcmVkQnVmZmVyKiBkYXRhKQoreworICAgIGlmIChmaWxlTmFt
ZS5pc0VtcHR5KCkgfHwgIWRhdGEpCisgICAgICAgIHJldHVybiAwOworCisgICAgV0NIQVIgZmls
ZVBhdGhbTUFYX1BBVEhdOworCisgICAgaWYgKHVybC5pc0xvY2FsRmlsZSgpKSB7CisgICAgICAg
IFN0cmluZyBsb2NhbFBhdGggPSBkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXModXJsLnBhdGgoKSk7
CisgICAgICAgIC8vIHdpbmRvd3MgZG9lcyBub3QgZW5qb3kgYSBsZWFkaW5nIHNsYXNoIG9uIHBh
dGhzCisgICAgICAgIGlmIChsb2NhbFBhdGhbMF0gPT0gJy8nKQorICAgICAgICAgICAgbG9jYWxQ
YXRoID0gbG9jYWxQYXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgTFBDV1NUUiBsb2NhbFBhdGhT
dHIgPSBsb2NhbFBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKTsKKyAgICAgICAg
aWYgKHdjc2xlbihsb2NhbFBhdGhTdHIpICsgMSA8IE1BWF9QQVRIKQorICAgICAgICAgICAgd2Nz
Y3B5X3MoZmlsZVBhdGgsIE1BWF9QQVRILCBsb2NhbFBhdGhTdHIpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworI2lmIE9TKFdJTkNFKQorICAgICAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgICAgIFdD
SEFSIHRlbXBQYXRoW01BWF9QQVRIXTsKKyAgICAgICAgV0NIQVIgZXh0ZW5zaW9uW01BWF9QQVRI
XTsKKyAgICAgICAgaWYgKCE6OkdldFRlbXBQYXRoKFdURl9BUlJBWV9MRU5HVEgodGVtcFBhdGgp
LCB0ZW1wUGF0aCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCE6OlBhdGhB
cHBlbmQodGVtcFBhdGgsIGZpbGVOYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkp
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIExQQ1dTVFIgZm91bmRFeHRlbnNpb24g
PSA6OlBhdGhGaW5kRXh0ZW5zaW9uKHRlbXBQYXRoKTsKKyAgICAgICAgaWYgKGZvdW5kRXh0ZW5z
aW9uKSB7CisgICAgICAgICAgICBpZiAod2NzY3B5X3MoZXh0ZW5zaW9uLCBNQVhfUEFUSCwgZm91
bmRFeHRlbnNpb24pKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UK
KyAgICAgICAgICAgICpleHRlbnNpb24gPSAwOworICAgICAgICA6OlBhdGhSZW1vdmVFeHRlbnNp
b24odGVtcFBhdGgpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwOyBpKyspIHsK
KyAgICAgICAgICAgIGlmIChzd3ByaW50Zl9zKGZpbGVQYXRoLCBNQVhfUEFUSCwgVEVYVCgiJXMt
JWQlcyIpLCB0ZW1wUGF0aCwgaSwgZXh0ZW5zaW9uKSA9PSAtMSkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgICAgIGlmICghOjpQYXRoRmlsZUV4aXN0cyhmaWxlUGF0aCkpCisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgSEFORExFIHRlbXBGaWxl
SGFuZGxlID0gQ3JlYXRlRmlsZShmaWxlUGF0aCwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklU
RSwgMCwgMCwgQ1JFQVRFX0FMV0FZUywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCAwKTsKKyAgICAg
ICAgaWYgKHRlbXBGaWxlSGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgdG8gdGhpcyB0ZW1wIGZp
bGUuCisgICAgICAgIERXT1JEIHdyaXR0ZW47CisgICAgICAgIEJPT0wgdGVtcFdyaXRlU3VjY2Vl
ZGVkID0gV3JpdGVGaWxlKHRlbXBGaWxlSGFuZGxlLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUo
KSwgJndyaXR0ZW4sIDApOworICAgICAgICBDbG9zZUhhbmRsZSh0ZW1wRmlsZUhhbmRsZSk7Cisg
ICAgICAgIGlmICghdGVtcFdyaXRlU3VjY2VlZGVkKQorICAgICAgICAgICAgcmV0dXJuIDA7Cisj
ZW5kaWYKKyAgICB9CisKKyAgICBTSVpFX1QgZHJvcEZpbGVzU2l6ZSA9IHNpemVvZihEUk9QRklM
RVMpICsgKHNpemVvZihXQ0hBUikgKiAod2NzbGVuKGZpbGVQYXRoKSArIDIpKTsKKyAgICBIR0xP
QkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdITkQgfCBHTUVNX1NIQVJFLCBkcm9wRmlsZXNTaXpl
KTsKKyAgICBpZiAoIW1lbU9iaikgCisgICAgICAgIHJldHVybiAwOworCisgICAgRFJPUEZJTEVT
KiBkcm9wRmlsZXMgPSAoRFJPUEZJTEVTKikgR2xvYmFsTG9jayhtZW1PYmopOworICAgIGRyb3BG
aWxlcy0+cEZpbGVzID0gc2l6ZW9mKERST1BGSUxFUyk7CisgICAgZHJvcEZpbGVzLT5mV2lkZSA9
IFRSVUU7CisgICAgd2NzY3B5KChMUFdTVFIpKGRyb3BGaWxlcyArIDEpLCBmaWxlUGF0aCk7ICAg
IAorICAgIEdsb2JhbFVubG9jayhtZW1PYmopOworCisgICAgcmV0dXJuIG1lbU9iajsKK30KKwor
dm9pZCBQYXN0ZWJvYXJkOjp3cml0ZUltYWdlVG9EYXRhT2JqZWN0KEVsZW1lbnQqIGVsZW1lbnQs
IGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICAvLyBTaG92ZSBpbWFnZSBkYXRhIGludG8gYSBEYXRh
T2JqZWN0IGZvciB1c2UgYXMgYSBmaWxlCisgICAgQ2FjaGVkSW1hZ2UqIGNhY2hlZEltYWdlID0g
Z2V0Q2FjaGVkSW1hZ2UoZWxlbWVudCk7CisgICAgaWYgKCFjYWNoZWRJbWFnZSB8fCAhY2FjaGVk
SW1hZ2UtPmltYWdlRm9yUmVuZGVyZXIoZWxlbWVudC0+cmVuZGVyZXIoKSkgfHwgIWNhY2hlZElt
YWdlLT5pc0xvYWRlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTaGFyZWRCdWZmZXIqIGlt
YWdlQnVmZmVyID0gY2FjaGVkSW1hZ2UtPmltYWdlRm9yUmVuZGVyZXIoZWxlbWVudC0+cmVuZGVy
ZXIoKSktPmRhdGEoKTsKKyAgICBpZiAoIWltYWdlQnVmZmVyIHx8ICFpbWFnZUJ1ZmZlci0+c2l6
ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBIR0xPQkFMIGltYWdlRmlsZURlc2NyaXB0b3Ig
PSBjcmVhdGVHbG9iYWxJbWFnZUZpbGVEZXNjcmlwdG9yKHVybC5zdHJpbmcoKSwgZWxlbWVudC0+
Z2V0QXR0cmlidXRlKEhUTUxOYW1lczo6YWx0QXR0ciksIGNhY2hlZEltYWdlKTsKKyAgICBpZiAo
IWltYWdlRmlsZURlc2NyaXB0b3IpCisgICAgICAgIHJldHVybjsKKworICAgIEhHTE9CQUwgaW1h
Z2VGaWxlQ29udGVudCA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoaW1hZ2VCdWZmZXIp
OworICAgIGlmICghaW1hZ2VGaWxlQ29udGVudCkgeworICAgICAgICBHbG9iYWxGcmVlKGltYWdl
RmlsZURlc2NyaXB0b3IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nIGZp
bGVOYW1lID0gY2FjaGVkSW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5hbWUoKTsKKyAg
ICBIR0xPQkFMIGhEcm9wQ29udGVudCA9IGNyZWF0ZUdsb2JhbEhEcm9wQ29udGVudCh1cmwsIGZp
bGVOYW1lLCBpbWFnZUJ1ZmZlcik7CisgICAgaWYgKCFoRHJvcENvbnRlbnQpIHsKKyAgICAgICAg
R2xvYmFsRnJlZShoRHJvcENvbnRlbnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
d3JpdGVGaWxlVG9EYXRhT2JqZWN0KG1fd3JpdGFibGVEYXRhT2JqZWN0LmdldCgpLCBpbWFnZUZp
bGVEZXNjcmlwdG9yLCBpbWFnZUZpbGVDb250ZW50LCBoRHJvcENvbnRlbnQpOworfQorCit2b2lk
IFBhc3RlYm9hcmQ6OndyaXRlVVJMVG9Xcml0YWJsZURhdGFPYmplY3QoY29uc3QgS1VSTCYgdXJs
LCBjb25zdCBTdHJpbmcmIHRpdGxlKQoreworICAgIFdlYkNvcmU6OndyaXRlVVJMKG1fd3JpdGFi
bGVEYXRhT2JqZWN0LmdldCgpLCB1cmwsIHRpdGxlLCB0cnVlLCBmYWxzZSk7Cit9CisKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZw0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNjMy
KQ0KKysrIFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEs
MyArMSwxNCBAQA0KKzIwMTMtMDUtMjQgIFh1ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFp
ZHUuY29tPgorCisgICAgICAgIE1vdmUgV2luZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJk
LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBXZWJD
b3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcDoKKyAgICAgICAgKFdlYkRyYWdDbGllbnQ6Ondp
bGxQZXJmb3JtRHJhZ1NvdXJjZUFjdGlvbik6IEdldCBJRGF0YU9iamVjdCBmcm9tIFBhc3RlYm9h
cmQgaW5zdGVhZCBvZiBDbGlwYm9hcmQuCisgICAgICAgIChXZWJEcmFnQ2xpZW50OjpzdGFydERy
YWcpOiBEaXR0by4KKwogMjAxMy0wNS0yMSAgTWFyayBTYWxpc2J1cnkgIDxtYXJrLnNhbGlzYnVy
eUBocC5jb20+CiAKICAgICAgICAgW1dpbmRvd3MsIGN1cmxdIFdlYkRvd25sb2FkQ3VybC5jcHAg
c2hvdWxkIG5vdCBpbmNsdWRlIFN5c3RlbVRpbWUuaApJbmRleDogU291cmNlL1dlYktpdC93aW4v
V2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5jcHANCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBTb3VyY2Uv
V2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcAkocmV2aXNpb24gMTUw
NjI5KQ0KKysrIFNvdXJjZS9XZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQu
Y3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtMzEsMTUgKzMxLDE2IEBADQogCiAjaW5jbHVkZSA8c2hs
b2JqLmg+CiAKLSNpbmNsdWRlIDxXZWJDb3JlL0NsaXBib2FyZFdpbi5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvQ2xpcGJvYXJkLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9EcmFnQ29udHJvbGxlci5oPgog
I2luY2x1ZGUgPFdlYkNvcmUvRHJhZ0RhdGEuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0V2ZW50SGFu
ZGxlci5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUGFnZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUGFz
dGVib2FyZC5oPgogI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1Nb3VzZUV2ZW50Lmg+CiAjaW5j
bHVkZSA8V2ViQ29yZS9GcmFtZS5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRnJhbWVWaWV3Lmg+CiAj
aW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0NvbnRleHQuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1Bh
Z2UuaD4KIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKQEAgLTEwMywxMiArMTA0LDEyIEBA
DQogICAgICAgICByZXR1cm47CiAKICAgICBQT0lOVCBwb2ludCA9IGludFBvaW50OwotICAgIENP
TVB0cjxJRGF0YU9iamVjdD4gZGF0YU9iamVjdCA9IHN0YXRpY19jYXN0PENsaXBib2FyZFdpbio+
KGNsaXBib2FyZCktPmRhdGFPYmplY3QoKTsKKyAgICBDT01QdHI8SURhdGFPYmplY3Q+IGRhdGFP
YmplY3QgPSBjbGlwYm9hcmQtPnBhc3RlYm9hcmQoKS5kYXRhT2JqZWN0KCk7CiAKICAgICBDT01Q
dHI8SURhdGFPYmplY3Q+IG5ld0RhdGFPYmplY3Q7CiAgICAgSFJFU1VMVCByZXN1bHQgPSB1aURl
bGVnYXRlLT53aWxsUGVyZm9ybURyYWdTb3VyY2VBY3Rpb24obV93ZWJWaWV3LCBzdGF0aWNfY2Fz
dDxXZWJEcmFnU291cmNlQWN0aW9uPihhY3Rpb24pLCAmcG9pbnQsIGRhdGFPYmplY3QuZ2V0KCks
ICZuZXdEYXRhT2JqZWN0KTsKICAgICBpZiAocmVzdWx0ID09IFNfT0sgJiYgbmV3RGF0YU9iamVj
dCAhPSBkYXRhT2JqZWN0KQotICAgICAgICBzdGF0aWNfY2FzdDxDbGlwYm9hcmRXaW4qPihjbGlw
Ym9hcmQpLT5zZXRFeHRlcm5hbERhdGFPYmplY3QobmV3RGF0YU9iamVjdC5nZXQoKSk7CisgICAg
ICAgIGNvbnN0X2Nhc3Q8UGFzdGVib2FyZCY+KGNsaXBib2FyZC0+cGFzdGVib2FyZCgpKS5zZXRF
eHRlcm5hbERhdGFPYmplY3QobmV3RGF0YU9iamVjdC5nZXQoKSk7CiB9CiAKIHZvaWQgV2ViRHJh
Z0NsaWVudDo6c3RhcnREcmFnKERyYWdJbWFnZVJlZiBpbWFnZSwgY29uc3QgSW50UG9pbnQmIGlt
YWdlT3JpZ2luLCBjb25zdCBJbnRQb2ludCYgZHJhZ1BvaW50LCBDbGlwYm9hcmQqIGNsaXBib2Fy
ZCwgRnJhbWUqIGZyYW1lLCBib29sIGlzTGluaykKQEAgLTEyNCw3ICsxMjUsNyBAQA0KICAgICBp
ZiAoRkFJTEVEKFdlYkRyb3BTb3VyY2U6OmNyZWF0ZUluc3RhbmNlKG1fd2ViVmlldywgJnNvdXJj
ZSkpKQogICAgICAgICByZXR1cm47CiAKLSAgICBkYXRhT2JqZWN0ID0gc3RhdGljX2Nhc3Q8Q2xp
cGJvYXJkV2luKj4oY2xpcGJvYXJkKS0+ZGF0YU9iamVjdCgpOworICAgIGRhdGFPYmplY3QgPSBj
bGlwYm9hcmQtPnBhc3RlYm9hcmQoKS5kYXRhT2JqZWN0KCk7CiAgICAgaWYgKHNvdXJjZSAmJiAo
aW1hZ2UgfHwgZGF0YU9iamVjdCkpIHsKICAgICAgICAgaWYgKGltYWdlKSB7CiAgICAgICAgICAg
ICBpZihTVUNDRUVERUQoQ29DcmVhdGVJbnN0YW5jZShDTFNJRF9EcmFnRHJvcEhlbHBlciwgMCwg
Q0xTQ1RYX0lOUFJPQ19TRVJWRVIsCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>202785</attachid>
            <date>2013-05-24 01:30:18 -0700</date>
            <delta_ts>2013-05-24 01:37:55 -0700</delta_ts>
            <desc>patch</desc>
            <filename>116258_3.patch</filename>
            <type>text/plain</type>
            <size>67111</size>
            <attacher name="huangxueqing">huangxueqing</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9X
ZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNjMyKQ0KKysrIFNvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEsMyArMSw2MyBAQA0KKzIwMTMtMDUtMjQgIFh1
ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgorCisgICAgICAgIE1vdmUgV2lu
ZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJkLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdHM6CisgICAgICAgIENsaXBib2FyZCByZWZhY3Rv
ciwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogZG9tL0NsaXBib2FyZC5oOgorICAgICAgICAq
IHBhZ2Uvd2luL0V2ZW50SGFuZGxlcldpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFdmVudEhh
bmRsZXI6OmNyZWF0ZURyYWdnaW5nQ2xpcGJvYXJkKTogQ3JlYXRlIENsaXBib2FyZCBpbnN0ZWFk
IG9mIENsaXBib2FyZFdpbi4KKyAgICAgICAgKiBwbGF0Zm9ybS9QYXN0ZWJvYXJkLmg6CisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFBhc3RlYm9hcmQpOgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6ZGF0YU9iamVjdCk6IEdldCBJRGF0YU9iamVjdCBieSBDbGlwYm9yYWQuCisg
ICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0YWJsZURhdGFPYmplY3QpOiBHZXQgV0NE
YXRhT2JqZWN0IGJ5IENsaXBib3JhZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vQ2xpcGJvYXJk
V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNsaXBib2FyZDo6Y3JlYXRlRHJhZ0ltYWdlKTog
Q2hhbmdlIHBhcmFtZXRlciBuYW1lIGxvYyB0byBkcmFnTG9jYXRpb24uCisgICAgICAgIChXZWJD
b3JlOjpDbGlwYm9hcmQ6OmRlY2xhcmVBbmRXcml0ZURyYWdJbWFnZSk6IEltcGxlbWVudCBkZWNs
YXJlQW5kV3JpdGVEcmFnSW1hZ2UgdXNlIFdDRGF0YU9iamVjdCBleHBvc2VkIGJ5IFBhc3RlYm9h
cmQuCisgICAgICAgICogcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5oOiBSZW1vdmVkLgorICAg
ICAgICAqIHBsYXRmb3JtL3dpbi9FZGl0b3JXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6RWRp
dG9yOjpuZXdHZW5lcmFsQ2xpcGJvYXJkKTogQ3JlYXRlIENsaXBib2FyZCBpbnN0ZWFkIG9mIENs
aXBib2FyZFdpbi4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmNyZWF0ZUZv
ckNvcHlBbmRQYXN0ZSk6IENyZWF0ZSBhIFBhc3RlYm9hcmQuCisgICAgICAgIChXZWJDb3JlOjpQ
YXN0ZWJvYXJkOjpjcmVhdGVQcml2YXRlKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0
ZWJvYXJkOjpjcmVhdGVGb3JEcmFnQW5kRHJvcCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6ZmluaXNoQ3JlYXRpbmdQYXN0ZWJvYXJkKTogQ3JlYXRlIFBhc3RlYm9hcmQg
dXNlIFdpbmRvd3MgQVBJLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6UGFzdGVib2Fy
ZCk6CisgICAgICAgIChXZWJDb3JlOjpjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKTogQ29waWVk
IGZyb20gQ2xpcGJvYXJkV2luLmNwcC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmNs
ZWFyKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpoYXNEYXRhKTogRGl0
dG8uCisgICAgICAgIChXZWJDb3JlOjphZGRNaW1lVHlwZXNGb3JGb3JtYXQpOiBEaXR0by4KKyAg
ICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OnR5cGVzKTogRGl0dG8uCisgICAgICAgIChXZWJD
b3JlOjpQYXN0ZWJvYXJkOjpyZWFkU3RyaW5nKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQ
YXN0ZWJvYXJkOjpyZWFkRmlsZW5hbWVzKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjp3cml0
ZVVSTCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVTdHJpbmcp
OiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OnNldERyYWdJbWFnZSk6IERp
dHRvLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVSYW5nZVRvRGF0YU9iamVj
dCk6IFdyaXRlIHJhbmdlIHRvIFdDRGF0YU9iamVjdC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3Rl
Ym9hcmQ6OndyaXRlU2VsZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6Ondy
aXRlUGxhaW5UZXh0VG9EYXRhT2JqZWN0KTogV3JpdGUgUGxhaW5UZXh0IHRvIFdDRGF0YU9iamVj
dC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlUGxhaW5UZXh0KToKKyAgICAg
ICAgKFdlYkNvcmU6OnBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMpOiBDb3BpZWQgZnJvbSBDbGlw
Ym9hcmRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6ZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JU
aXRsZSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6d3JpdGVGaWxlVG9EYXRhT2JqZWN0KTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVVSTFRvRGF0YU9iamVj
dCk6IFdyaXRlIFVSTCB0byBXQ0RhdGFPYmplY3QuCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJv
YXJkOjp3cml0ZVVSTCk6IENvcGllZCBmcm9tIENsaXBib2FyZFdpbi5jcHAuCisgICAgICAgIChX
ZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVBhc3RlYm9hcmQpOiBDb3BpZWQgZnJvbSBQYXN0ZWJv
YXJkOjp3cml0ZUNsaXBib2FyZC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmRvY3Vt
ZW50RnJhZ21lbnQpOiBDb3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6UGFzdGVib2FyZDo6c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KTogQ2xpcGJvYXJkIGNhbiBz
ZXQgbmV3IElEYXRhT2JqZWN0LgorICAgICAgICAoV2ViQ29yZTo6Z2V0Q2FjaGVkSW1hZ2UpOiBD
b3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlR2xv
YmFsSW1hZ2VGaWxlRGVzY3JpcHRvcik6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
R2xvYmFsSW1hZ2VGaWxlQ29udGVudCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
R2xvYmFsSERyb3BDb250ZW50KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJk
Ojp3cml0ZUltYWdlVG9EYXRhT2JqZWN0KTogRXhwb3NlIHRvIG1ha2UgQ2xpcGJvYXJkIGltcGxl
bWVudCBkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UuCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJv
YXJkOjp3cml0ZVVSTFRvV3JpdGFibGVEYXRhT2JqZWN0KTogRGl0dG8uCisKIDIwMTMtMDUtMjMg
IEJldGggRGFraW4gIDxiZGFraW5AYXBwbGUuY29tPgogCiAgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTY3MDIKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Rv
bS9DbGlwYm9hcmQuaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9DbGlwYm9h
cmQuaAkocmV2aXNpb24gMTUwNjI5KQ0KKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9DbGlwYm9hcmQu
aAkod29ya2luZyBjb3B5KQ0KQEAgLTM0LDcgKzM0LDcgQEANCiAvLyBUaGlzIERPTSBvYmplY3Qg
bm93IHdvcmtzIGJ5IGNhbGxpbmcgdGhyb3VnaCB0byBjbGFzc2VzIGluIHRoZSBwbGF0Zm9ybSBs
YXllci4KIC8vIFNwZWNpZmljYWxseSwgdGhlIGNsYXNzIGN1cnJlbnRseSBuYW1lZCBQYXN0ZWJv
YXJkLiBUaGUgbGVnYWN5IHN0eWxlIGluc3RlYWQKIC8vIHVzZXMgdGhpcyBhcyBhbiBhYnN0cmFj
dCBiYXNlIGNsYXNzLgotI2RlZmluZSBXVEZfVVNFX0xFR0FDWV9TVFlMRV9BQlNUUkFDVF9DTElQ
Qk9BUkRfQ0xBU1MgKFBMQVRGT1JNKElPUykgfHwgUExBVEZPUk0oUVQpIHx8IFBMQVRGT1JNKFdJ
TikpCisjZGVmaW5lIFdURl9VU0VfTEVHQUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFT
UyAoUExBVEZPUk0oSU9TKSB8fCBQTEFURk9STShRVCkpCiAKICNpZiBVU0UoTEVHQUNZX1NUWUxF
X0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFTUykKICNkZWZpbmUgTEVHQUNZX1ZJUlRVQUwgdmlydHVh
bApJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS93aW4vRXZlbnRIYW5kbGVyV2luLmNwcA0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2Uvd2luL0V2ZW50SGFuZGxlcldpbi5jcHAJ
KHJldmlzaW9uIDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL3dpbi9FdmVudEhhbmRs
ZXJXaW4uY3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtMjcsNiArMjcsOCBAQA0KICNpbmNsdWRlICJj
b25maWcuaCIKICNpbmNsdWRlICJFdmVudEhhbmRsZXIuaCIKIAorI2luY2x1ZGUgIkNPTVB0ci5o
IgorI2luY2x1ZGUgIkNsaXBib2FyZC5oIgogI2luY2x1ZGUgIkN1cnNvci5oIgogI2luY2x1ZGUg
IkZsb2F0UG9pbnQuaCIKICNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKQEAgLTQzLDEyICs0
NSw2IEBADQogI2luY2x1ZGUgIldDRGF0YU9iamVjdC5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVu
dGVkLmgiCiAKLSNpZiBPUyhXSU5DRSkKLSNpbmNsdWRlICJDbGlwYm9hcmQuaCIKLSNlbHNlCi0j
aW5jbHVkZSAiQ2xpcGJvYXJkV2luLmgiCi0jZW5kaWYKLQogbmFtZXNwYWNlIFdlYkNvcmUgewog
CiAjaWYgRU5BQkxFKERSQUdfU1VQUE9SVCkKQEAgLTEwMSw5ICs5Nyw3IEBADQogI2lmIE9TKFdJ
TkNFKQogICAgIHJldHVybiAwOwogI2Vsc2UKLSAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBkYXRh
T2JqZWN0OwotICAgIFdDRGF0YU9iamVjdDo6Y3JlYXRlSW5zdGFuY2UoJmRhdGFPYmplY3QpOwot
ICAgIHJldHVybiBDbGlwYm9hcmRXaW46OmNyZWF0ZShDbGlwYm9hcmQ6OkRyYWdBbmREcm9wLCBk
YXRhT2JqZWN0LmdldCgpLCBDbGlwYm9hcmRXcml0YWJsZSwgbV9mcmFtZSk7CisgICAgcmV0dXJu
IENsaXBib2FyZDo6Y3JlYXRlRm9yRHJhZ0FuZERyb3AoKTsKICNlbmRpZgogfQogI2VuZGlmCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgNCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgJKHJldmlzaW9uIDE1MDYyOSkN
CisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgJKHdvcmtpbmcgY29weSkN
CkBAIC0zOCw2ICszOCw5IEBADQogI2VuZGlmCiAKICNpZiBQTEFURk9STShXSU4pCisjaW5jbHVk
ZSA8V2ViQ29yZS9DT01QdHIuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1dDRGF0YU9iamVjdC5oPgor
I2luY2x1ZGUgPG9iamlkbC5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KIHR5cGVkZWYgc3RydWN0
IEhXTkRfXyogSFdORDsKICNlbmRpZgpAQCAtNjQsNiArNjcsNyBAQA0KIGNsYXNzIENsaXBib2Fy
ZDsKIGNsYXNzIERvY3VtZW50RnJhZ21lbnQ7CiBjbGFzcyBEcmFnRGF0YTsKK2NsYXNzIEVsZW1l
bnQ7CiBjbGFzcyBGcmFtZTsKIGNsYXNzIEhpdFRlc3RSZXN1bHQ7CiBjbGFzcyBLVVJMOwpAQCAt
MTAwLDYgKzEwNCwxMiBAQA0KICAgICBQYXNzUmVmUHRyPERhdGFPYmplY3RHdGs+IGRhdGFPYmpl
Y3QoKSBjb25zdDsKICNlbmRpZgogCisjaWYgUExBVEZPUk0oV0lOKQorICAgIGV4cGxpY2l0IFBh
c3RlYm9hcmQoSURhdGFPYmplY3QqKTsKKyAgICBleHBsaWNpdCBQYXN0ZWJvYXJkKFdDRGF0YU9i
amVjdCopOworICAgIGV4cGxpY2l0IFBhc3RlYm9hcmQoY29uc3QgRHJhZ0RhdGFNYXAmKTsKKyNl
bmRpZgorCiAgICAgLy8gRGVwcmVjYXRlZC4gVXNlIGNyZWF0ZUZvckNvcHlBbmRQYXN0ZSBpbnN0
ZWFkLgogICAgIHN0YXRpYyBQYXN0ZWJvYXJkKiBnZW5lcmFsUGFzdGVib2FyZCgpOwogCkBAIC0x
NTMsNiArMTYzLDE0IEBADQogICAgIHZvaWQgc2V0U2VsZWN0aW9uTW9kZShib29sKSB7IH0KICNl
bmRpZgogCisjaWYgUExBVEZPUk0oV0lOKQorICAgIENPTVB0cjxJRGF0YU9iamVjdD4gZGF0YU9i
amVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YU9iamVjdDsgfQorICAgIHZvaWQgc2V0RXh0ZXJu
YWxEYXRhT2JqZWN0KElEYXRhT2JqZWN0Kik7CisgICAgdm9pZCB3cml0ZVVSTFRvV3JpdGFibGVE
YXRhT2JqZWN0KGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmKTsKKyAgICBDT01QdHI8V0NEYXRh
T2JqZWN0PiB3cml0YWJsZURhdGFPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX3dyaXRhYmxlRGF0
YU9iamVjdDsgfQorICAgIHZvaWQgd3JpdGVJbWFnZVRvRGF0YU9iamVjdChFbGVtZW50KiwgY29u
c3QgS1VSTCYpOworI2VuZGlmCisKICNpZiBQTEFURk9STShHVEspCiAgICAgflBhc3RlYm9hcmQo
KTsKICNlbmRpZgpAQCAtMTc1LDcgKzE5MywxNSBAQA0KICNlbmRpZgogCiAjaWYgUExBVEZPUk0o
V0lOKQorICAgIHZvaWQgZmluaXNoQ3JlYXRpbmdQYXN0ZWJvYXJkKCk7CisgICAgdm9pZCB3cml0
ZVJhbmdlVG9EYXRhT2JqZWN0KFJhbmdlKiwgRnJhbWUqKTsKKyAgICB2b2lkIHdyaXRlVVJMVG9E
YXRhT2JqZWN0KGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmLCBGcmFtZSopOworICAgIHZvaWQg
d3JpdGVQbGFpblRleHRUb0RhdGFPYmplY3QoY29uc3QgU3RyaW5nJiwgU21hcnRSZXBsYWNlT3B0
aW9uKTsKKwogICAgIEhXTkQgbV9vd25lcjsKKyAgICBDT01QdHI8SURhdGFPYmplY3Q+IG1fZGF0
YU9iamVjdDsKKyAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBtX3dyaXRhYmxlRGF0YU9iamVjdDsK
KyAgICBEcmFnRGF0YU1hcCBtX2RyYWdEYXRhTWFwOwogI2VuZGlmCiAKICNpZiBQTEFURk9STShR
VCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4uY3BwDQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09DQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5j
cHAJKHJldmlzaW9uIDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xp
cGJvYXJkV2luLmNwcAkod29ya2luZyBjb3B5KQ0KQEAgLTEsNSArMSw2IEBADQogLyoKICAqIENv
cHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDEzIFh1ZXFpbmcgSHVhbmcgPGh1YW5neHVlcWluZ0BiYWlkdS5j
b20+CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI0LDY1NyArMjUsNDYgQEAN
CiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkNsaXBib2FyZFdpbi5oIgor
I2luY2x1ZGUgIkNsaXBib2FyZC5oIgogCiAjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKICNpbmNs
dWRlICJDbGlwYm9hcmRVdGlsaXRpZXNXaW4uaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgotI2lu
Y2x1ZGUgIkRyYWdEYXRhLmgiCi0jaW5jbHVkZSAiRWRpdG9yLmgiCiAjaW5jbHVkZSAiRWxlbWVu
dC5oIgotI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgotI2luY2x1ZGUgIkZpbGVMaXN0LmgiCiAj
aW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgotI2luY2x1ZGUgIkZy
YW1lVmlldy5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIkhUTUxQYXJzZXJJ
ZGlvbXMuaCIKLSNpbmNsdWRlICJJbWFnZS5oIgotI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnku
aCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNs
dWRlICJQYXN0ZWJvYXJkLmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCi0jaW5j
bHVkZSAiUmFuZ2UuaCIKLSNpbmNsdWRlICJSZW5kZXJJbWFnZS5oIgotI2luY2x1ZGUgIlJlc291
cmNlUmVzcG9uc2UuaCIKLSNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKLSNpbmNsdWRlICJXQ0Rh
dGFPYmplY3QuaCIKICNpbmNsdWRlICJtYXJrdXAuaCIKLSNpbmNsdWRlIDxzaGx3YXBpLmg+Ci0j
aW5jbHVkZSA8d2luaW5ldC5oPgotI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KLSNpbmNsdWRlIDx3
dGYvdGV4dC9DU3RyaW5nLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+Ci0jaW5j
bHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLS8vIFdl
IHByb3ZpZGUgdGhlIElFIGNsaXBib2FyZCB0eXBlcyAoVVJMIGFuZCBUZXh0KSwgYW5kIHRoZSBj
bGlwYm9hcmQgdHlwZXMgc3BlY2lmaWVkIGluIHRoZSBXSEFUV0cgV2ViIEFwcGxpY2F0aW9ucyAx
LjAgZHJhZnQKLS8vIHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3Vy
cmVudC13b3JrLyBTZWN0aW9uIDYuMy41LjMKLQotZW51bSBDbGlwYm9hcmREYXRhVHlwZSB7IENs
aXBib2FyZERhdGFUeXBlTm9uZSwgQ2xpcGJvYXJkRGF0YVR5cGVVUkwsIENsaXBib2FyZERhdGFU
eXBlVGV4dCwgQ2xpcGJvYXJkRGF0YVR5cGVUZXh0SFRNTCB9OwotCi1zdGF0aWMgQ2xpcGJvYXJk
RGF0YVR5cGUgY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZShjb25zdCBTdHJpbmcmIHR5cGUpCitE
cmFnSW1hZ2VSZWYgQ2xpcGJvYXJkOjpjcmVhdGVEcmFnSW1hZ2UoSW50UG9pbnQmIGRyYWdMb2Nh
dGlvbikgY29uc3QKIHsKLSAgICBTdHJpbmcgcVR5cGUgPSB0eXBlLnN0cmlwV2hpdGVTcGFjZSgp
Lmxvd2VyKCk7Ci0KLSAgICAvLyB0d28gc3BlY2lhbCBjYXNlcyBmb3IgSUUgY29tcGF0aWJpbGl0
eQotICAgIGlmIChxVHlwZSA9PSAidGV4dCIgfHwgcVR5cGUgPT0gInRleHQvcGxhaW4iIHx8IHFU
eXBlLnN0YXJ0c1dpdGgoInRleHQvcGxhaW47IikpCi0gICAgICAgIHJldHVybiBDbGlwYm9hcmRE
YXRhVHlwZVRleHQ7Ci0gICAgaWYgKHFUeXBlID09ICJ1cmwiIHx8IHFUeXBlID09ICJ0ZXh0L3Vy
aS1saXN0IikKLSAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVVJMOwotICAgIGlmIChx
VHlwZSA9PSAidGV4dC9odG1sIikKLSAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVGV4
dEhUTUw7Ci0KLSAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVOb25lOwotfQotCi0jaWYgIU9T
KFdJTkNFKQotc3RhdGljIGlubGluZSB2b2lkIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoUFdT
VFIgcHN6LCBzaXplX3QgbGVuZ3RoKQotewotICAgIHNpemVfdCB3cml0ZVRvID0gMDsKLSAgICBz
aXplX3QgcmVhZEZyb20gPSAwOwotICAgIHdoaWxlIChyZWFkRnJvbSA8IGxlbmd0aCkgewotICAg
ICAgICBVSU5UIHR5cGUgPSBQYXRoR2V0Q2hhclR5cGUocHN6W3JlYWRGcm9tXSk7Ci0gICAgICAg
IGlmICghcHN6W3JlYWRGcm9tXSB8fCB0eXBlICYgKEdDVF9MRk5DSEFSIHwgR0NUX1NIT1JUQ0hB
UikpCi0gICAgICAgICAgICBwc3pbd3JpdGVUbysrXSA9IHBzeltyZWFkRnJvbV07Ci0KLSAgICAg
ICAgcmVhZEZyb20rKzsKLSAgICB9Ci0gICAgcHN6W3dyaXRlVG9dID0gMDsKLX0KLSNlbmRpZgot
Ci1zdGF0aWMgU3RyaW5nIGZpbGVzeXN0ZW1QYXRoRnJvbVVybE9yVGl0bGUoY29uc3QgU3RyaW5n
JiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUsIGNvbnN0IFVDaGFyKiBleHRlbnNpb24sIGJvb2wg
aXNMaW5rKQotewotI2lmIE9TKFdJTkNFKQotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0
dXJuIFN0cmluZygpOwotI2Vsc2UKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGZzUGF0aE1heExl
bmd0aEV4Y2x1ZGluZ051bGxUZXJtaW5hdG9yID0gTUFYX1BBVEggLSAxOwotICAgIGJvb2wgdXNl
ZFVSTCA9IGZhbHNlOwotICAgIFdDSEFSIGZzUGF0aEJ1ZmZlcltNQVhfUEFUSF07Ci0gICAgZnNQ
YXRoQnVmZmVyWzBdID0gMDsKLSAgICBpbnQgZXh0ZW5zaW9uTGVuID0gZXh0ZW5zaW9uID8gbHN0
cmxlbihleHRlbnNpb24pIDogMDsKLSAgICBpbnQgZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0
ZW5zaW9uID0gZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nTnVsbFRlcm1pbmF0b3IgLSBleHRlbnNp
b25MZW47Ci0KLSAgICBpZiAoIXRpdGxlLmlzRW1wdHkoKSkgewotICAgICAgICBzaXplX3QgbGVu
ID0gbWluPHNpemVfdD4odGl0bGUubGVuZ3RoKCksIGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4
dGVuc2lvbik7Ci0gICAgICAgIENvcHlNZW1vcnkoZnNQYXRoQnVmZmVyLCB0aXRsZS5jaGFyYWN0
ZXJzKCksIGxlbiAqIHNpemVvZihVQ2hhcikpOwotICAgICAgICBmc1BhdGhCdWZmZXJbbGVuXSA9
IDA7Ci0gICAgICAgIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoZnNQYXRoQnVmZmVyLCBsZW4p
OwotICAgIH0KLQotICAgIGlmICghbHN0cmxlbihmc1BhdGhCdWZmZXIpKSB7Ci0gICAgICAgIEtV
Ukwga3VybChQYXJzZWRVUkxTdHJpbmcsIHVybCk7Ci0gICAgICAgIHVzZWRVUkwgPSB0cnVlOwot
ICAgICAgICAvLyBUaGUgZmlsZW5hbWUgZm9yIGFueSBjb250ZW50IGJhc2VkIGRyYWcgb3IgZmls
ZSB1cmwgc2hvdWxkIGJlIHRoZSBsYXN0IGVsZW1lbnQgb2YgCi0gICAgICAgIC8vIHRoZSBwYXRo
LiAgSWYgd2UgY2FuJ3QgZmluZCBpdCwgb3Igd2UncmUgY29taW5nIHVwIHdpdGggdGhlIG5hbWUg
Zm9yIGEgbGluawotICAgICAgICAvLyB3ZSBqdXN0IHVzZSB0aGUgZW50aXJlIHVybC4KLSAgICAg
ICAgRFdPUkQgbGVuID0gZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0ZW5zaW9uOwotICAgICAg
ICBTdHJpbmcgbGFzdENvbXBvbmVudCA9IGt1cmwubGFzdFBhdGhDb21wb25lbnQoKTsKLSAgICAg
ICAgaWYgKGt1cmwuaXNMb2NhbEZpbGUoKSB8fCAoIWlzTGluayAmJiAhbGFzdENvbXBvbmVudC5p
c0VtcHR5KCkpKSB7Ci0gICAgICAgICAgICBsZW4gPSBtaW48RFdPUkQ+KGZzUGF0aE1heExlbmd0
aEV4Y2x1ZGluZ0V4dGVuc2lvbiwgbGFzdENvbXBvbmVudC5sZW5ndGgoKSk7Ci0gICAgICAgICAg
ICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgbGFzdENvbXBvbmVudC5jaGFyYWN0ZXJzKCksIGxl
biAqIHNpemVvZihVQ2hhcikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVuID0g
bWluPERXT1JEPihmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24sIHVybC5sZW5ndGgo
KSk7Ci0gICAgICAgICAgICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgdXJsLmNoYXJhY3RlcnMo
KSwgbGVuICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZnNQYXRoQnVmZmVy
W2xlbl0gPSAwOwotICAgICAgICBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKGZzUGF0aEJ1ZmZl
ciwgbGVuKTsKLSAgICB9Ci0KLSAgICBpZiAoIWV4dGVuc2lvbikKLSAgICAgICAgcmV0dXJuIFN0
cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+KGZzUGF0aEJ1ZmZlcikpOwotCi0gICAgaWYgKCFpc0xp
bmsgJiYgdXNlZFVSTCkgewotICAgICAgICBQYXRoUmVuYW1lRXh0ZW5zaW9uKGZzUGF0aEJ1ZmZl
ciwgZXh0ZW5zaW9uKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+
KGZzUGF0aEJ1ZmZlcikpOwotICAgIH0KLQotICAgIHJldHVybiBtYWtlU3RyaW5nKHN0YXRpY19j
YXN0PGNvbnN0IFVDaGFyKj4oZnNQYXRoQnVmZmVyKSwgZXh0ZW5zaW9uKTsKLSNlbmRpZgotfQot
Ci1zdGF0aWMgSEdMT0JBTCBjcmVhdGVHbG9iYWxJbWFnZUZpbGVDb250ZW50KFNoYXJlZEJ1ZmZl
ciogZGF0YSkKLXsKLSAgICBIR0xPQkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdQVFIsIGRhdGEt
PnNpemUoKSk7Ci0gICAgaWYgKCFtZW1PYmopIAotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNo
YXIqIGZpbGVDb250ZW50cyA9IChQU1RSKUdsb2JhbExvY2sobWVtT2JqKTsKLQotICAgIENvcHlN
ZW1vcnkoZmlsZUNvbnRlbnRzLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUoKSk7Ci0gICAgCi0g
ICAgR2xvYmFsVW5sb2NrKG1lbU9iaik7Ci0gICAgCi0gICAgcmV0dXJuIG1lbU9iajsKLX0KLQot
c3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSERyb3BDb250ZW50KGNvbnN0IEtVUkwmIHVybCwg
U3RyaW5nJiBmaWxlTmFtZSwgU2hhcmVkQnVmZmVyKiBkYXRhKQotewotICAgIGlmIChmaWxlTmFt
ZS5pc0VtcHR5KCkgfHwgIWRhdGEpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgV0NIQVIgZmls
ZVBhdGhbTUFYX1BBVEhdOwotCi0gICAgaWYgKHVybC5pc0xvY2FsRmlsZSgpKSB7Ci0gICAgICAg
IFN0cmluZyBsb2NhbFBhdGggPSBkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXModXJsLnBhdGgoKSk7
Ci0gICAgICAgIC8vIHdpbmRvd3MgZG9lcyBub3QgZW5qb3kgYSBsZWFkaW5nIHNsYXNoIG9uIHBh
dGhzCi0gICAgICAgIGlmIChsb2NhbFBhdGhbMF0gPT0gJy8nKQotICAgICAgICAgICAgbG9jYWxQ
YXRoID0gbG9jYWxQYXRoLnN1YnN0cmluZygxKTsKLSAgICAgICAgTFBDV1NUUiBsb2NhbFBhdGhT
dHIgPSBsb2NhbFBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKTsKLSAgICAgICAg
aWYgKHdjc2xlbihsb2NhbFBhdGhTdHIpICsgMSA8IE1BWF9QQVRIKQotICAgICAgICAgICAgd2Nz
Y3B5X3MoZmlsZVBhdGgsIE1BWF9QQVRILCBsb2NhbFBhdGhTdHIpOwotICAgICAgICBlbHNlCi0g
ICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotI2lmIE9TKFdJTkNFKQotICAgICAg
ICBub3RJbXBsZW1lbnRlZCgpOwotICAgICAgICByZXR1cm4gMDsKLSNlbHNlCi0gICAgICAgIFdD
SEFSIHRlbXBQYXRoW01BWF9QQVRIXTsKLSAgICAgICAgV0NIQVIgZXh0ZW5zaW9uW01BWF9QQVRI
XTsKLSAgICAgICAgaWYgKCE6OkdldFRlbXBQYXRoKFdURl9BUlJBWV9MRU5HVEgodGVtcFBhdGgp
LCB0ZW1wUGF0aCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCE6OlBhdGhB
cHBlbmQodGVtcFBhdGgsIGZpbGVOYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkp
KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIExQQ1dTVFIgZm91bmRFeHRlbnNpb24g
PSA6OlBhdGhGaW5kRXh0ZW5zaW9uKHRlbXBQYXRoKTsKLSAgICAgICAgaWYgKGZvdW5kRXh0ZW5z
aW9uKSB7Ci0gICAgICAgICAgICBpZiAod2NzY3B5X3MoZXh0ZW5zaW9uLCBNQVhfUEFUSCwgZm91
bmRFeHRlbnNpb24pKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IGVsc2UK
LSAgICAgICAgICAgICpleHRlbnNpb24gPSAwOwotICAgICAgICA6OlBhdGhSZW1vdmVFeHRlbnNp
b24odGVtcFBhdGgpOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwOyBpKyspIHsK
LSAgICAgICAgICAgIGlmIChzd3ByaW50Zl9zKGZpbGVQYXRoLCBNQVhfUEFUSCwgVEVYVCgiJXMt
JWQlcyIpLCB0ZW1wUGF0aCwgaSwgZXh0ZW5zaW9uKSA9PSAtMSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKLSAgICAgICAgICAgIGlmICghOjpQYXRoRmlsZUV4aXN0cyhmaWxlUGF0aCkpCi0g
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgSEFORExFIHRlbXBGaWxl
SGFuZGxlID0gQ3JlYXRlRmlsZShmaWxlUGF0aCwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklU
RSwgMCwgMCwgQ1JFQVRFX0FMV0FZUywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCAwKTsKLSAgICAg
ICAgaWYgKHRlbXBGaWxlSGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgICAgICAg
ICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgdG8gdGhpcyB0ZW1wIGZp
bGUuCi0gICAgICAgIERXT1JEIHdyaXR0ZW47Ci0gICAgICAgIEJPT0wgdGVtcFdyaXRlU3VjY2Vl
ZGVkID0gV3JpdGVGaWxlKHRlbXBGaWxlSGFuZGxlLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUo
KSwgJndyaXR0ZW4sIDApOwotICAgICAgICBDbG9zZUhhbmRsZSh0ZW1wRmlsZUhhbmRsZSk7Ci0g
ICAgICAgIGlmICghdGVtcFdyaXRlU3VjY2VlZGVkKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0j
ZW5kaWYKLSAgICB9Ci0KLSAgICBTSVpFX1QgZHJvcEZpbGVzU2l6ZSA9IHNpemVvZihEUk9QRklM
RVMpICsgKHNpemVvZihXQ0hBUikgKiAod2NzbGVuKGZpbGVQYXRoKSArIDIpKTsKLSAgICBIR0xP
QkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdITkQgfCBHTUVNX1NIQVJFLCBkcm9wRmlsZXNTaXpl
KTsKLSAgICBpZiAoIW1lbU9iaikgCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgRFJPUEZJTEVT
KiBkcm9wRmlsZXMgPSAoRFJPUEZJTEVTKikgR2xvYmFsTG9jayhtZW1PYmopOwotICAgIGRyb3BG
aWxlcy0+cEZpbGVzID0gc2l6ZW9mKERST1BGSUxFUyk7Ci0gICAgZHJvcEZpbGVzLT5mV2lkZSA9
IFRSVUU7Ci0gICAgd2NzY3B5KChMUFdTVFIpKGRyb3BGaWxlcyArIDEpLCBmaWxlUGF0aCk7ICAg
IAotICAgIEdsb2JhbFVubG9jayhtZW1PYmopOwotICAgIAotICAgIHJldHVybiBtZW1PYmo7Ci19
Ci0KLXN0YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmlsZURlc2NyaXB0b3IoY29uc3Qg
U3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUsIENhY2hlZEltYWdlKiBpbWFnZSkKLXsK
LSAgICBBU1NFUlRfQVJHKGltYWdlLCBpbWFnZSk7Ci0gICAgQVNTRVJUKGltYWdlLT5pbWFnZSgp
LT5kYXRhKCkpOwotCi0gICAgSFJFU1VMVCBociA9IFNfT0s7Ci0gICAgSEdMT0JBTCBtZW1PYmog
PSAwOwotICAgIFN0cmluZyBmc1BhdGg7Ci0gICAgbWVtT2JqID0gR2xvYmFsQWxsb2MoR1BUUiwg
c2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKLSAgICBpZiAoIW1lbU9iaikKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICBGSUxFR1JPVVBERVNDUklQVE9SKiBmZ2QgPSAoRklMRUdST1VQREVT
Q1JJUFRPUiopR2xvYmFsTG9jayhtZW1PYmopOwotICAgIG1lbXNldChmZ2QsIDAsIHNpemVvZihG
SUxFR1JPVVBERVNDUklQVE9SKSk7Ci0gICAgZmdkLT5jSXRlbXMgPSAxOwotICAgIGZnZC0+Zmdk
WzBdLmR3RmxhZ3MgPSBGRF9GSUxFU0laRTsKLSAgICBmZ2QtPmZnZFswXS5uRmlsZVNpemVMb3cg
PSBpbWFnZS0+aW1hZ2UoKS0+ZGF0YSgpLT5zaXplKCk7Ci0gICAgCi0gICAgY29uc3QgU3RyaW5n
JiBwcmVmZXJyZWRUaXRsZSA9IHRpdGxlLmlzRW1wdHkoKSA/IGltYWdlLT5yZXNwb25zZSgpLnN1
Z2dlc3RlZEZpbGVuYW1lKCkgOiB0aXRsZTsKLSAgICBTdHJpbmcgZXh0ZW5zaW9uID0gaW1hZ2Ut
PmltYWdlKCktPmZpbGVuYW1lRXh0ZW5zaW9uKCk7Ci0gICAgaWYgKGV4dGVuc2lvbi5pc0VtcHR5
KCkpIHsKLSAgICAgICAgLy8gRG8gbm90IGNvbnRpbnVlIHByb2Nlc3NpbmcgaW4gdGhlIHJhcmUg
YW5kIHVudXN1YWwgY2FzZSB3aGVyZSBhIGRlY29kZWQgaW1hZ2UgaXMgbm90IGFibGUgCi0gICAg
ICAgIC8vIHRvIHByb3ZpZGUgYSBmaWxlbmFtZSBleHRlbnNpb24uIFNvbWV0aGluZyB0cmlja3kg
KGxpa2UgYSBiYWl0LW4tc3dpdGNoKSBpcyBnb2luZyBvbgotICAgICAgICByZXR1cm4gMDsKLSAg
ICB9Ci0gICAgZXh0ZW5zaW9uLmluc2VydCgiLiIsIDApOwotICAgIGZzUGF0aCA9IGZpbGVzeXN0
ZW1QYXRoRnJvbVVybE9yVGl0bGUodXJsLCBwcmVmZXJyZWRUaXRsZSwgZXh0ZW5zaW9uLmNoYXJh
Y3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIGZhbHNlKTsKLQotICAgIGlmIChmc1BhdGgubGVu
Z3RoKCkgPD0gMCkgewotICAgICAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKLSAgICAgICAgR2xv
YmFsRnJlZShtZW1PYmopOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpbnQgbWF4
U2l6ZSA9IG1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgoZmdkLT5mZ2RbMF0u
Y0ZpbGVOYW1lKSk7Ci0gICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmlsZU5hbWUsIChMUENX
U1RSKWZzUGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKLSAgICBH
bG9iYWxVbmxvY2sobWVtT2JqKTsKLSAgICAKLSAgICByZXR1cm4gbWVtT2JqOwotfQotCi0KLS8v
IHdyaXRlRmlsZVRvRGF0YU9iamVjdCB0YWtlcyBvd25lcnNoaXAgb2YgZmlsZURlc2NyaXB0b3Ig
YW5kIGZpbGVDb250ZW50Ci1zdGF0aWMgSFJFU1VMVCB3cml0ZUZpbGVUb0RhdGFPYmplY3QoSURh
dGFPYmplY3QqIGRhdGFPYmplY3QsIEhHTE9CQUwgZmlsZURlc2NyaXB0b3IsIEhHTE9CQUwgZmls
ZUNvbnRlbnQsIEhHTE9CQUwgaERyb3BDb250ZW50KQotewotICAgIEhSRVNVTFQgaHIgPSBTX09L
OwotICAgIEZPUk1BVEVUQyogZmU7Ci0gICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAgICBt
ZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOwotCi0gICAgaWYgKCFmaWxlRGVzY3JpcHRvciB8
fCAhZmlsZUNvbnRlbnQpCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgIC8vIERlc2NyaXB0b3IK
LSAgICBmZSA9IGZpbGVEZXNjcmlwdG9yRm9ybWF0KCk7Ci0KLSAgICBtZWRpdW0uaEdsb2JhbCA9
IGZpbGVEZXNjcmlwdG9yOwotCi0gICAgaWYgKEZBSUxFRChociA9IGRhdGFPYmplY3QtPlNldERh
dGEoZmUsICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgZ290byBleGl0OwotCi0gICAgLy8gQ29u
dGVudHMKLSAgICBmZSA9IGZpbGVDb250ZW50Rm9ybWF0WmVybygpOwotICAgIG1lZGl1bS5oR2xv
YmFsID0gZmlsZUNvbnRlbnQ7Ci0gICAgaWYgKEZBSUxFRChociA9IGRhdGFPYmplY3QtPlNldERh
dGEoZmUsICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgZ290byBleGl0OwotCi0jaWYgVVNFKENG
KQotICAgIC8vIEhEUk9QCi0gICAgaWYgKGhEcm9wQ29udGVudCkgewotICAgICAgICBtZWRpdW0u
aEdsb2JhbCA9IGhEcm9wQ29udGVudDsKLSAgICAgICAgaHIgPSBkYXRhT2JqZWN0LT5TZXREYXRh
KGNmSERyb3BGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSk7Ci0gICAgfQotI2VuZGlmCi0KLWV4aXQ6
Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgaWYgKGZpbGVEZXNjcmlwdG9yKQotICAg
ICAgICAgICAgR2xvYmFsRnJlZShmaWxlRGVzY3JpcHRvcik7Ci0gICAgICAgIGlmIChmaWxlQ29u
dGVudCkKLSAgICAgICAgICAgIEdsb2JhbEZyZWUoZmlsZUNvbnRlbnQpOwotICAgICAgICBpZiAo
aERyb3BDb250ZW50KQotICAgICAgICAgICAgR2xvYmFsRnJlZShoRHJvcENvbnRlbnQpOwotICAg
IH0KLSAgICByZXR1cm4gaHI7Ci19Ci0KLVBhc3NSZWZQdHI8Q2xpcGJvYXJkPiBDbGlwYm9hcmQ6
OmNyZWF0ZShDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBEcmFnRGF0YSogZHJhZ0RhdGEs
IEZyYW1lKiBmcmFtZSkKLXsKLSAgICBpZiAoZHJhZ0RhdGEtPnBsYXRmb3JtRGF0YSgpKQotICAg
ICAgICByZXR1cm4gQ2xpcGJvYXJkV2luOjpjcmVhdGUoRHJhZ0FuZERyb3AsIGRyYWdEYXRhLT5w
bGF0Zm9ybURhdGEoKSwgcG9saWN5LCBmcmFtZSk7Ci0gICAgcmV0dXJuIENsaXBib2FyZFdpbjo6
Y3JlYXRlKERyYWdBbmREcm9wLCBkcmFnRGF0YS0+ZHJhZ0RhdGFNYXAoKSwgcG9saWN5LCBmcmFt
ZSk7Ci19Ci0KLUNsaXBib2FyZFdpbjo6Q2xpcGJvYXJkV2luKENsaXBib2FyZFR5cGUgY2xpcGJv
YXJkVHlwZSwgSURhdGFPYmplY3QqIGRhdGFPYmplY3QsIENsaXBib2FyZEFjY2Vzc1BvbGljeSBw
b2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAgICA6IENsaXBib2FyZChwb2xpY3ksIGNsaXBib2FyZFR5
cGUpCi0gICAgLCBtX2RhdGFPYmplY3QoZGF0YU9iamVjdCkKLSAgICAsIG1fd3JpdGFibGVEYXRh
T2JqZWN0KDApCi0gICAgLCBtX2ZyYW1lKGZyYW1lKQotewotfQotCi1DbGlwYm9hcmRXaW46OkNs
aXBib2FyZFdpbihDbGlwYm9hcmRUeXBlIGNsaXBib2FyZFR5cGUsIFdDRGF0YU9iamVjdCogZGF0
YU9iamVjdCwgQ2xpcGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwgRnJhbWUqIGZyYW1lKQotICAg
IDogQ2xpcGJvYXJkKHBvbGljeSwgY2xpcGJvYXJkVHlwZSkKLSAgICAsIG1fZGF0YU9iamVjdChk
YXRhT2JqZWN0KQotICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoZGF0YU9iamVjdCkKLSAgICAs
IG1fZnJhbWUoZnJhbWUpCi17Ci19Ci0KLUNsaXBib2FyZFdpbjo6Q2xpcGJvYXJkV2luKENsaXBi
b2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgY29uc3QgRHJhZ0RhdGFNYXAmIGRhdGFNYXAsIENsaXBi
b2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAgICA6IENsaXBib2FyZChw
b2xpY3ksIGNsaXBib2FyZFR5cGUpCi0gICAgLCBtX2RhdGFPYmplY3QoMCkKLSAgICAsIG1fd3Jp
dGFibGVEYXRhT2JqZWN0KDApCi0gICAgLCBtX2ZyYW1lKGZyYW1lKQotICAgICwgbV9kcmFnRGF0
YU1hcChkYXRhTWFwKQotewotfQotCi1DbGlwYm9hcmRXaW46On5DbGlwYm9hcmRXaW4oKQotewot
ICAgIGlmIChtX2RyYWdJbWFnZSkKLSAgICAgICAgbV9kcmFnSW1hZ2UtPnJlbW92ZUNsaWVudCh0
aGlzKTsKLX0KLQotc3RhdGljIGJvb2wgd3JpdGVVUkwoV0NEYXRhT2JqZWN0ICpkYXRhLCBjb25z
dCBLVVJMJiB1cmwsIFN0cmluZyB0aXRsZSwgYm9vbCB3aXRoUGxhaW5UZXh0LCBib29sIHdpdGhI
VE1MKQotewotICAgIEFTU0VSVChkYXRhKTsKLQotICAgIGlmICh1cmwuaXNFbXB0eSgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKHRpdGxlLmlzRW1wdHkoKSkgewotICAg
ICAgICB0aXRsZSA9IHVybC5sYXN0UGF0aENvbXBvbmVudCgpOwotICAgICAgICBpZiAodGl0bGUu
aXNFbXB0eSgpKQotICAgICAgICAgICAgdGl0bGUgPSB1cmwuaG9zdCgpOwotICAgIH0KLQotICAg
IFNUR01FRElVTSBtZWRpdW0gPSB7MH07Ci0gICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JB
TDsKLQotICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YSh1cmwsIHRpdGxlKTsK
LSAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJ
TEVEKGRhdGEtPlNldERhdGEodXJsV0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAg
IDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7Ci0gICAgZWxzZQotICAgICAgICBzdWNjZXNz
ID0gdHJ1ZTsKLQotICAgIGlmICh3aXRoSFRNTCkgewotICAgICAgICBWZWN0b3I8Y2hhcj4gY2Zo
dG1sRGF0YTsKLSAgICAgICAgbWFya3VwVG9DRkhUTUwodXJsVG9NYXJrdXAodXJsLCB0aXRsZSks
ICIiLCBjZmh0bWxEYXRhKTsKLSAgICAgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxE
YXRhKGNmaHRtbERhdGEpOwotICAgICAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKGRh
dGEtPlNldERhdGEoaHRtbEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAgICAgICA6
Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBz
dWNjZXNzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAod2l0aFBsYWluVGV4dCkgewotICAgICAg
ICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEodXJsLnN0cmluZygpKTsKLSAgICAg
ICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChkYXRhLT5TZXREYXRhKHBsYWluVGV4dFdG
b3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1
bS5oR2xvYmFsKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjpjbGVh
ckRhdGEoY29uc3QgU3RyaW5nJiB0eXBlKQotewotICAgIC8vIEZJWE1FOiBOZWVkIHRvIGJlIGFi
bGUgdG8gd3JpdGUgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQgPHJkYXI6Ly9wcm9ibGVtLzUwMTU5
NDE+Ci0gICAgQVNTRVJUKGlzRm9yRHJhZ0FuZERyb3AoKSk7Ci0gICAgaWYgKCFjYW5Xcml0ZURh
dGEoKSB8fCAhbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgIHJldHVybjsKLQotICAgIENs
aXBib2FyZERhdGFUeXBlIGRhdGFUeXBlID0gY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZSh0eXBl
KTsKLQotICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVSTCkgewotICAgICAg
ICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJEYXRhKHVybFdGb3JtYXQoKS0+Y2ZGb3JtYXQp
OwotICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJEYXRhKHVybEZvcm1hdCgpLT5j
ZkZvcm1hdCk7Ci0gICAgfQotICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRl
eHQpIHsKLSAgICAgICAgbV93cml0YWJsZURhdGFPYmplY3QtPmNsZWFyRGF0YShwbGFpblRleHRG
b3JtYXQoKS0+Y2ZGb3JtYXQpOwotICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJE
YXRhKHBsYWluVGV4dFdGb3JtYXQoKS0+Y2ZGb3JtYXQpOwotICAgIH0KLQotfQotCi12b2lkIENs
aXBib2FyZFdpbjo6Y2xlYXJEYXRhKCkKLXsKLSAgICAvLyBGSVhNRTogTmVlZCB0byBiZSBhYmxl
IHRvIHdyaXRlIHRvIHRoZSBzeXN0ZW0gY2xpcGJvYXJkIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQx
PgotICAgIEFTU0VSVChpc0ZvckRyYWdBbmREcm9wKCkpOwotICAgIGlmICghY2FuV3JpdGVEYXRh
KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBtX3dyaXRhYmxlRGF0YU9iamVjdCA9IDA7
Ci0gICAgV0NEYXRhT2JqZWN0OjpjcmVhdGVJbnN0YW5jZSgmbV93cml0YWJsZURhdGFPYmplY3Qp
OwotICAgIG1fZGF0YU9iamVjdCA9IG1fd3JpdGFibGVEYXRhT2JqZWN0OwotfQotCi1TdHJpbmcg
Q2xpcGJvYXJkV2luOjpnZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSkgY29uc3QKLXsgICAgIAot
ICAgIGlmICghY2FuUmVhZERhdGEoKSB8fCAoIW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFw
LmlzRW1wdHkoKSkpCi0gICAgICAgIHJldHVybiAiIjsKLQotICAgIENsaXBib2FyZERhdGFUeXBl
IGRhdGFUeXBlID0gY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZSh0eXBlKTsKLSAgICBpZiAoZGF0
YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KQotICAgICAgICByZXR1cm4gbV9kYXRhT2Jq
ZWN0ID8gZ2V0UGxhaW5UZXh0KG1fZGF0YU9iamVjdC5nZXQoKSkgOiBnZXRQbGFpblRleHQoJm1f
ZHJhZ0RhdGFNYXApOwotICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVSTCkK
LSAgICAgICAgcmV0dXJuIG1fZGF0YU9iamVjdCA/IGdldFVSTChtX2RhdGFPYmplY3QuZ2V0KCks
IERyYWdEYXRhOjpEb05vdENvbnZlcnRGaWxlbmFtZXMpIDogZ2V0VVJMKCZtX2RyYWdEYXRhTWFw
LCBEcmFnRGF0YTo6RG9Ob3RDb252ZXJ0RmlsZW5hbWVzKTsKLSAgICBlbHNlIGlmIChkYXRhVHlw
ZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MKSB7Ci0gICAgICAgIFN0cmluZyBkYXRhID0g
bV9kYXRhT2JqZWN0ID8gZ2V0VGV4dEhUTUwobV9kYXRhT2JqZWN0LmdldCgpKSA6IGdldFRleHRI
VE1MKCZtX2RyYWdEYXRhTWFwKTsKLSAgICAgICAgaWYgKCFkYXRhLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgIHJldHVybiBkYXRhOwotICAgICAgICByZXR1cm4gbV9kYXRhT2JqZWN0ID8gZ2V0Q0ZI
VE1MKG1fZGF0YU9iamVjdC5nZXQoKSkgOiBnZXRDRkhUTUwoJm1fZHJhZ0RhdGFNYXApOwotICAg
IH0KLSAgICAKLSAgICByZXR1cm4gIiI7Ci19Ci0KLWJvb2wgQ2xpcGJvYXJkV2luOjpzZXREYXRh
KGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBkYXRhKQotewotICAgIC8vIEZJWE1F
OiBOZWVkIHRvIGJlIGFibGUgdG8gd3JpdGUgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQgPHJkYXI6
Ly9wcm9ibGVtLzUwMTU5NDE+Ci0gICAgQVNTRVJUKGlzRm9yRHJhZ0FuZERyb3AoKSk7Ci0gICAg
aWYgKCFjYW5Xcml0ZURhdGEoKSB8fCAhbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIENsaXBib2FyZERhdGFUeXBlIHdpblR5cGUgPSBjbGlwYm9hcmRU
eXBlRnJvbU1JTUVUeXBlKHR5cGUpOwotCi0gICAgaWYgKHdpblR5cGUgPT0gQ2xpcGJvYXJkRGF0
YVR5cGVVUkwpCi0gICAgICAgIHJldHVybiBXZWJDb3JlOjp3cml0ZVVSTChtX3dyaXRhYmxlRGF0
YU9iamVjdC5nZXQoKSwgS1VSTChQYXJzZWRVUkxTdHJpbmcsIGRhdGEpLCBTdHJpbmcoKSwgZmFs
c2UsIHRydWUpOwotCi0gICAgaWYgKHdpblR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KSB7
Ci0gICAgICAgIFNUR01FRElVTSBtZWRpdW0gPSB7MH07Ci0gICAgICAgIG1lZGl1bS50eW1lZCA9
IFRZTUVEX0hHTE9CQUw7Ci0gICAgICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0
YShkYXRhKTsKLSAgICAgICAgaWYgKCFtZWRpdW0uaEdsb2JhbCkKLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgICAgICBpZiAoRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXRE
YXRhKHBsYWluVGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKSB7Ci0gICAgICAgICAgICA6
Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxz
ZTsKLX0KLQotc3RhdGljIHZvaWQgYWRkTWltZVR5cGVzRm9yRm9ybWF0KExpc3RIYXNoU2V0PFN0
cmluZz4mIHJlc3VsdHMsIGNvbnN0IEZPUk1BVEVUQyYgZm9ybWF0KQotewotICAgIC8vIFVSTCBh
bmQgVGV4dCBhcmUgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBJRSdzIG1vZGVsCi0g
ICAgaWYgKGZvcm1hdC5jZkZvcm1hdCA9PSB1cmxGb3JtYXQoKS0+Y2ZGb3JtYXQgfHwgZm9ybWF0
LmNmRm9ybWF0ID09IHVybFdGb3JtYXQoKS0+Y2ZGb3JtYXQpIHsKLSAgICAgICAgcmVzdWx0cy5h
ZGQoIlVSTCIpOwotICAgICAgICByZXN1bHRzLmFkZCgidGV4dC91cmktbGlzdCIpOwotICAgIH0K
LQotICAgIGlmIChmb3JtYXQuY2ZGb3JtYXQgPT0gcGxhaW5UZXh0V0Zvcm1hdCgpLT5jZkZvcm1h
dCB8fCBmb3JtYXQuY2ZGb3JtYXQgPT0gcGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0KSB7Ci0g
ICAgICAgIHJlc3VsdHMuYWRkKCJUZXh0Iik7Ci0gICAgICAgIHJlc3VsdHMuYWRkKCJ0ZXh0L3Bs
YWluIik7Ci0gICAgfQotfQotCi0vLyBleHRlbnNpb25zIGJleW9uZCBJRSdzIEFQSQotTGlzdEhh
c2hTZXQ8U3RyaW5nPiBDbGlwYm9hcmRXaW46OnR5cGVzKCkgY29uc3QKLXsgCi0gICAgTGlzdEhh
c2hTZXQ8U3RyaW5nPiByZXN1bHRzOwotICAgIGlmICghY2FuUmVhZFR5cGVzKCkpCi0gICAgICAg
IHJldHVybiByZXN1bHRzOwotCi0gICAgaWYgKCFtX2RhdGFPYmplY3QgJiYgbV9kcmFnRGF0YU1h
cC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiByZXN1bHRzOwotCi0gICAgaWYgKG1fZGF0YU9i
amVjdCkgewotICAgICAgICBDT01QdHI8SUVudW1GT1JNQVRFVEM+IGl0cjsKLQotICAgICAgICBp
ZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+RW51bUZvcm1hdEV0YyhEQVRBRElSX0dFVCwgJml0cikp
KQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0KLSAgICAgICAgaWYgKCFpdHIpCi0gICAg
ICAgICAgICByZXR1cm4gcmVzdWx0czsKLQotICAgICAgICBGT1JNQVRFVEMgZGF0YTsKLQotICAg
ICAgICAvLyBJRW51bUZPUk1BVEVUQzo6TmV4dCByZXR1cm5zIFNfRkFMU0UgaWYgdGhlcmUgYXJl
IG5vIG1vcmUgaXRlbXMuCi0gICAgICAgIHdoaWxlIChpdHItPk5leHQoMSwgJmRhdGEsIDApID09
IFNfT0spCi0gICAgICAgICAgICBhZGRNaW1lVHlwZXNGb3JGb3JtYXQocmVzdWx0cywgZGF0YSk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChEcmFnRGF0YU1hcDo6Y29uc3RfaXRlcmF0b3Ig
aXQgPSBtX2RyYWdEYXRhTWFwLmJlZ2luKCk7IGl0ICE9IG1fZHJhZ0RhdGFNYXAuZW5kKCk7ICsr
aXQpIHsKLSAgICAgICAgICAgIEZPUk1BVEVUQyBkYXRhOwotICAgICAgICAgICAgZGF0YS5jZkZv
cm1hdCA9ICgqaXQpLmtleTsKLSAgICAgICAgICAgIGFkZE1pbWVUeXBlc0ZvckZvcm1hdChyZXN1
bHRzLCBkYXRhKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHRzOwotfQot
Ci1QYXNzUmVmUHRyPEZpbGVMaXN0PiBDbGlwYm9hcmRXaW46OmZpbGVzKCkgY29uc3QKLXsKLSNp
ZiBVU0UoQ0YpCi0gICAgUmVmUHRyPEZpbGVMaXN0PiBmaWxlcyA9IEZpbGVMaXN0OjpjcmVhdGUo
KTsKLSAgICBpZiAoIWNhblJlYWREYXRhKCkpCi0gICAgICAgIHJldHVybiBmaWxlcy5yZWxlYXNl
KCk7Ci0KLSAgICBpZiAoIW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFwLmlzRW1wdHkoKSkK
LSAgICAgICAgcmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKLQotICAgIGlmIChtX2RhdGFPYmplY3Qp
IHsKLSAgICAgICAgU1RHTUVESVVNIG1lZGl1bTsKLSAgICAgICAgaWYgKEZBSUxFRChtX2RhdGFP
YmplY3QtPkdldERhdGEoY2ZIRHJvcEZvcm1hdCgpLCAmbWVkaXVtKSkpCi0gICAgICAgICAgICBy
ZXR1cm4gZmlsZXMucmVsZWFzZSgpOwotCi0gICAgICAgIEhEUk9QIGhkcm9wID0gcmVpbnRlcnBy
ZXRfY2FzdDxIRFJPUD4oR2xvYmFsTG9jayhtZWRpdW0uaEdsb2JhbCkpOwotICAgICAgICBpZiAo
IWhkcm9wKQotICAgICAgICAgICAgcmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKLQotICAgICAgICBX
Q0hBUiBmaWxlbmFtZVtNQVhfUEFUSF07Ci0gICAgICAgIFVJTlQgZmlsZUNvdW50ID0gRHJhZ1F1
ZXJ5RmlsZVcoaGRyb3AsIDB4RkZGRkZGRkYsIDAsIDApOwotICAgICAgICBmb3IgKFVJTlQgaSA9
IDA7IGkgPCBmaWxlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKCFEcmFnUXVlcnlGaWxl
VyhoZHJvcCwgaSwgZmlsZW5hbWUsIFdURl9BUlJBWV9MRU5HVEgoZmlsZW5hbWUpKSkKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGZpbGVzLT5hcHBlbmQoRmlsZTo6Y3Jl
YXRlKHJlaW50ZXJwcmV0X2Nhc3Q8VUNoYXIqPihmaWxlbmFtZSksIEZpbGU6OkFsbENvbnRlbnRU
eXBlcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgR2xvYmFsVW5sb2NrKG1lZGl1bS5oR2xvYmFs
KTsKLSAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmbWVkaXVtKTsKLSAgICAgICAgcmV0dXJuIGZp
bGVzLnJlbGVhc2UoKTsKLSAgICB9Ci0gICAgaWYgKCFtX2RyYWdEYXRhTWFwLmNvbnRhaW5zKGNm
SERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQpKQotICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgp
OwotICAgIFZlY3RvcjxTdHJpbmc+IGZpbGVzVmVjdG9yID0gbV9kcmFnRGF0YU1hcC5nZXQoY2ZI
RHJvcEZvcm1hdCgpLT5jZkZvcm1hdCk7Ci0gICAgZm9yIChWZWN0b3I8U3RyaW5nPjo6aXRlcmF0
b3IgaXQgPSBmaWxlc1ZlY3Rvci5iZWdpbigpOyBpdCAhPSBmaWxlc1ZlY3Rvci5lbmQoKTsgKytp
dCkKLSAgICAgICAgZmlsZXMtPmFwcGVuZChGaWxlOjpjcmVhdGUoKml0KSk7Ci0gICAgcmV0dXJu
IGZpbGVzLnJlbGVhc2UoKTsKLSNlbHNlCi0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1
cm4gMDsKLSNlbmRpZgotfQotCi12b2lkIENsaXBib2FyZFdpbjo6c2V0RHJhZ0ltYWdlKENhY2hl
ZEltYWdlKiBpbWFnZSwgTm9kZSAqbm9kZSwgY29uc3QgSW50UG9pbnQgJmxvYykKLXsKLSAgICBp
ZiAoIWNhblNldERyYWdJbWFnZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIGlm
IChtX2RyYWdJbWFnZSkKLSAgICAgICAgbV9kcmFnSW1hZ2UtPnJlbW92ZUNsaWVudCh0aGlzKTsK
LSAgICBtX2RyYWdJbWFnZSA9IGltYWdlOwotICAgIGlmIChtX2RyYWdJbWFnZSkKLSAgICAgICAg
bV9kcmFnSW1hZ2UtPmFkZENsaWVudCh0aGlzKTsKLQotICAgIG1fZHJhZ0xvYyA9IGxvYzsKLSAg
ICBtX2RyYWdJbWFnZUVsZW1lbnQgPSBub2RlOwotfQotCi12b2lkIENsaXBib2FyZFdpbjo6c2V0
RHJhZ0ltYWdlKENhY2hlZEltYWdlKiBpbWcsIGNvbnN0IEludFBvaW50ICZsb2MpCi17Ci0gICAg
c2V0RHJhZ0ltYWdlKGltZywgMCwgbG9jKTsKLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OnNldERy
YWdJbWFnZUVsZW1lbnQoTm9kZSAqbm9kZSwgY29uc3QgSW50UG9pbnQgJmxvYykKLXsKLSAgICBz
ZXREcmFnSW1hZ2UoMCwgbm9kZSwgbG9jKTsKLX0KLQotRHJhZ0ltYWdlUmVmIENsaXBib2FyZFdp
bjo6Y3JlYXRlRHJhZ0ltYWdlKEludFBvaW50JiBsb2MpIGNvbnN0Ci17CiAgICAgSEJJVE1BUCBy
ZXN1bHQgPSAwOwogICAgIGlmIChtX2RyYWdJbWFnZSkgewogI2lmIFVTRShDQUlSTykgfHwgVVNF
KENHKQogICAgICAgICByZXN1bHQgPSBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UobV9kcmFnSW1h
Z2UtPmltYWdlKCkpOyAgICAgICAgCi0gICAgICAgIGxvYyA9IG1fZHJhZ0xvYzsKKyAgICAgICAg
ZHJhZ0xvY2F0aW9uID0gbV9kcmFnTG9jOwogI2Vsc2UKICAgICAgICAgbm90SW1wbGVtZW50ZWQo
KTsKICNlbmRpZgogICAgIH0gZWxzZSBpZiAobV9kcmFnSW1hZ2VFbGVtZW50KSB7CiAgICAgICAg
IE5vZGUqIG5vZGUgPSBtX2RyYWdJbWFnZUVsZW1lbnQuZ2V0KCk7CiAgICAgICAgIHJlc3VsdCA9
IG5vZGUtPmRvY3VtZW50KCktPmZyYW1lKCktPm5vZGVJbWFnZShub2RlKTsKLSAgICAgICAgbG9j
ID0gbV9kcmFnTG9jOworICAgICAgICBkcmFnTG9jYXRpb24gPSBtX2RyYWdMb2M7CiAgICAgfQog
ICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBDYWNoZWRJbWFnZSogZ2V0Q2FjaGVkSW1h
Z2UoRWxlbWVudCogZWxlbWVudCkKK3ZvaWQgQ2xpcGJvYXJkOjpkZWNsYXJlQW5kV3JpdGVEcmFn
SW1hZ2UoRWxlbWVudCogZWxlbWVudCwgY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRp
dGxlLCBGcmFtZSogZnJhbWUpCiB7Ci0gICAgLy8gQXR0ZW1wdCB0byBwdWxsIENhY2hlZEltYWdl
IGZyb20gZWxlbWVudAotICAgIEFTU0VSVChlbGVtZW50KTsKLSAgICBSZW5kZXJPYmplY3QqIHJl
bmRlcmVyID0gZWxlbWVudC0+cmVuZGVyZXIoKTsKLSAgICBpZiAoIXJlbmRlcmVyIHx8ICFyZW5k
ZXJlci0+aXNJbWFnZSgpKSAKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgUmVuZGVySW1h
Z2UqIGltYWdlID0gdG9SZW5kZXJJbWFnZShyZW5kZXJlcik7Ci0gICAgaWYgKGltYWdlLT5jYWNo
ZWRJbWFnZSgpICYmICFpbWFnZS0+Y2FjaGVkSW1hZ2UoKS0+ZXJyb3JPY2N1cnJlZCgpKQotICAg
ICAgICByZXR1cm4gaW1hZ2UtPmNhY2hlZEltYWdlKCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQot
c3RhdGljIHZvaWQgd3JpdGVJbWFnZVRvRGF0YU9iamVjdChJRGF0YU9iamVjdCogZGF0YU9iamVj
dCwgRWxlbWVudCogZWxlbWVudCwgY29uc3QgS1VSTCYgdXJsKQotewotICAgIC8vIFNob3ZlIGlt
YWdlIGRhdGEgaW50byBhIERhdGFPYmplY3QgZm9yIHVzZSBhcyBhIGZpbGUKLSAgICBDYWNoZWRJ
bWFnZSogY2FjaGVkSW1hZ2UgPSBnZXRDYWNoZWRJbWFnZShlbGVtZW50KTsKLSAgICBpZiAoIWNh
Y2hlZEltYWdlIHx8ICFjYWNoZWRJbWFnZS0+aW1hZ2VGb3JSZW5kZXJlcihlbGVtZW50LT5yZW5k
ZXJlcigpKSB8fCAhY2FjaGVkSW1hZ2UtPmlzTG9hZGVkKCkpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIFNoYXJlZEJ1ZmZlciogaW1hZ2VCdWZmZXIgPSBjYWNoZWRJbWFnZS0+aW1hZ2VGb3JSZW5k
ZXJlcihlbGVtZW50LT5yZW5kZXJlcigpKS0+ZGF0YSgpOwotICAgIGlmICghaW1hZ2VCdWZmZXIg
fHwgIWltYWdlQnVmZmVyLT5zaXplKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIEhHTE9CQUwg
aW1hZ2VGaWxlRGVzY3JpcHRvciA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZURlc2NyaXB0b3IodXJs
LnN0cmluZygpLCBlbGVtZW50LT5nZXRBdHRyaWJ1dGUoYWx0QXR0ciksIGNhY2hlZEltYWdlKTsK
LSAgICBpZiAoIWltYWdlRmlsZURlc2NyaXB0b3IpCi0gICAgICAgIHJldHVybjsKLQotICAgIEhH
TE9CQUwgaW1hZ2VGaWxlQ29udGVudCA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoaW1h
Z2VCdWZmZXIpOwotICAgIGlmICghaW1hZ2VGaWxlQ29udGVudCkgewotICAgICAgICBHbG9iYWxG
cmVlKGltYWdlRmlsZURlc2NyaXB0b3IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
U3RyaW5nIGZpbGVOYW1lID0gY2FjaGVkSW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5h
bWUoKTsKLSAgICBIR0xPQkFMIGhEcm9wQ29udGVudCA9IGNyZWF0ZUdsb2JhbEhEcm9wQ29udGVu
dCh1cmwsIGZpbGVOYW1lLCBpbWFnZUJ1ZmZlcik7Ci0gICAgaWYgKCFoRHJvcENvbnRlbnQpIHsK
LSAgICAgICAgR2xvYmFsRnJlZShoRHJvcENvbnRlbnQpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgd3JpdGVGaWxlVG9EYXRhT2JqZWN0KGRhdGFPYmplY3QsIGltYWdlRmlsZURlc2Ny
aXB0b3IsIGltYWdlRmlsZUNvbnRlbnQsIGhEcm9wQ29udGVudCk7Ci19Ci0KLXZvaWQgQ2xpcGJv
YXJkV2luOjpkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UoRWxlbWVudCogZWxlbWVudCwgY29uc3Qg
S1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBGcmFtZSogZnJhbWUpCi17CiAgICAgLy8g
T3JkZXIgaXMgaW1wb3J0YW50IGhlcmUgZm9yIEV4cGxvcmVyJ3Mgc2FrZQotICAgIGlmICghbV93
cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgICByZXR1cm47Ci0gICAgV2ViQ29yZTo6d3JpdGVV
UkwobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybCwgdGl0bGUsIHRydWUsIGZhbHNlKTsK
LQotICAgIHdyaXRlSW1hZ2VUb0RhdGFPYmplY3QobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCks
IGVsZW1lbnQsIHVybCk7Ci0KLSAgICBBdG9taWNTdHJpbmcgaW1hZ2VVUkwgPSBlbGVtZW50LT5n
ZXRBdHRyaWJ1dGUoc3JjQXR0cik7CisgICAgaWYgKCFtX3Bhc3RlYm9hcmQtPndyaXRhYmxlRGF0
YU9iamVjdCgpKQorICAgICAgICByZXR1cm47CisgICAgbV9wYXN0ZWJvYXJkLT53cml0ZVVSTFRv
V3JpdGFibGVEYXRhT2JqZWN0KHVybCwgdGl0bGUpOworICAgIG1fcGFzdGVib2FyZC0+d3JpdGVJ
bWFnZVRvRGF0YU9iamVjdChlbGVtZW50LCB1cmwpOworICAgIEF0b21pY1N0cmluZyBpbWFnZVVS
TCA9IGVsZW1lbnQtPmdldEF0dHJpYnV0ZShIVE1MTmFtZXM6OnNyY0F0dHIpOwogICAgIGlmIChp
bWFnZVVSTC5pc0VtcHR5KCkpIAogICAgICAgICByZXR1cm47CiAKQEAgLTY4OCwxMzEgKzc4LDgg
QEANCiAgICAgVmVjdG9yPGNoYXI+IGRhdGE7CiAgICAgbWFya3VwVG9DRkhUTUwoY3JlYXRlTWFy
a3VwKGVsZW1lbnQsIEluY2x1ZGVOb2RlLCAwLCBSZXNvbHZlQWxsVVJMcyksICIiLCBkYXRhKTsK
ICAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7Ci0gICAgaWYgKG1l
ZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShodG1s
Rm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKKyAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJ
TEVEKG1fcGFzdGVib2FyZC0+d3JpdGFibGVEYXRhT2JqZWN0KCktPlNldERhdGEoaHRtbEZvcm1h
dCgpLCAmbWVkaXVtLCBUUlVFKSkpCiAgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2Jh
bCk7CiB9CiAKLXZvaWQgQ2xpcGJvYXJkV2luOjp3cml0ZVVSTChjb25zdCBLVVJMJiBrdXJsLCBj
b25zdCBTdHJpbmcmIHRpdGxlU3RyLCBGcmFtZSopCi17Ci0gICAgaWYgKCFtX3dyaXRhYmxlRGF0
YU9iamVjdCkKLSAgICAgICAgIHJldHVybjsKLSAgICBXZWJDb3JlOjp3cml0ZVVSTChtX3dyaXRh
YmxlRGF0YU9iamVjdC5nZXQoKSwga3VybCwgdGl0bGVTdHIsIHRydWUsIHRydWUpOwotCi0gICAg
U3RyaW5nIHVybCA9IGt1cmwuc3RyaW5nKCk7Ci0gICAgQVNTRVJUKHVybC5jb250YWluc09ubHlB
U0NJSSgpKTsgLy8gS1VSTDo6c3RyaW5nKCkgaXMgVVJMIGVuY29kZWQuCi0KLSAgICBTdHJpbmcg
ZnNQYXRoID0gZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JUaXRsZSh1cmwsIHRpdGxlU3RyLCBMIi5V
UkwiLCB0cnVlKTsKLSAgICBTdHJpbmcgY29udGVudFN0cmluZygiW0ludGVybmV0U2hvcnRjdXRd
XHJcblVSTD0iICsgdXJsICsgIlxyXG4iKTsKLSAgICBDU3RyaW5nIGNvbnRlbnQgPSBjb250ZW50
U3RyaW5nLmxhdGluMSgpOwotCi0gICAgaWYgKGZzUGF0aC5sZW5ndGgoKSA8PSAwKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBIR0xPQkFMIHVybEZpbGVEZXNjcmlwdG9yID0gR2xvYmFsQWxsb2Mo
R1BUUiwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKLSAgICBpZiAoIXVybEZpbGVEZXNj
cmlwdG9yKQotICAgICAgICByZXR1cm47Ci0KLSAgICBIR0xPQkFMIHVybEZpbGVDb250ZW50ID0g
R2xvYmFsQWxsb2MoR1BUUiwgY29udGVudC5sZW5ndGgoKSk7Ci0gICAgaWYgKCF1cmxGaWxlQ29u
dGVudCkgewotICAgICAgICBHbG9iYWxGcmVlKHVybEZpbGVEZXNjcmlwdG9yKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIEZJTEVHUk9VUERFU0NSSVBUT1IqIGZnZCA9IHN0YXRpY19j
YXN0PEZJTEVHUk9VUERFU0NSSVBUT1IqPihHbG9iYWxMb2NrKHVybEZpbGVEZXNjcmlwdG9yKSk7
Ci0gICAgWmVyb01lbW9yeShmZ2QsIHNpemVvZihGSUxFR1JPVVBERVNDUklQVE9SKSk7Ci0gICAg
ZmdkLT5jSXRlbXMgPSAxOwotICAgIGZnZC0+ZmdkWzBdLmR3RmxhZ3MgPSBGRF9GSUxFU0laRTsK
LSAgICBmZ2QtPmZnZFswXS5uRmlsZVNpemVMb3cgPSBjb250ZW50Lmxlbmd0aCgpOwotCi0gICAg
dW5zaWduZWQgbWF4U2l6ZSA9IG1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgo
ZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lKSk7Ci0gICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmls
ZU5hbWUsIGZzUGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKLSAg
ICBHbG9iYWxVbmxvY2sodXJsRmlsZURlc2NyaXB0b3IpOwotCi0gICAgY2hhciogZmlsZUNvbnRl
bnRzID0gc3RhdGljX2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2sodXJsRmlsZUNvbnRlbnQpKTsKLSAg
ICBDb3B5TWVtb3J5KGZpbGVDb250ZW50cywgY29udGVudC5kYXRhKCksIGNvbnRlbnQubGVuZ3Ro
KCkpOwotICAgIEdsb2JhbFVubG9jayh1cmxGaWxlQ29udGVudCk7Ci0KLSAgICB3cml0ZUZpbGVU
b0RhdGFPYmplY3QobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybEZpbGVEZXNjcmlwdG9y
LCB1cmxGaWxlQ29udGVudCwgMCk7Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjp3cml0ZVJhbmdl
KFJhbmdlKiBzZWxlY3RlZFJhbmdlLCBGcmFtZSogZnJhbWUpCi17Ci0gICAgQVNTRVJUKHNlbGVj
dGVkUmFuZ2UpOwotICAgIGlmICghbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgICByZXR1
cm47Ci0KLSAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OwotICAgIG1lZGl1bS50eW1lZCA9IFRZ
TUVEX0hHTE9CQUw7Ci0KLSAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKLSAgICBtYXJrdXBUb0NGSFRN
TChjcmVhdGVNYXJrdXAoc2VsZWN0ZWRSYW5nZSwgMCwgQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSks
Ci0gICAgICAgIHNlbGVjdGVkUmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCktPmRvY3VtZW50KCktPnVy
bCgpLnN0cmluZygpLCBkYXRhKTsKLSAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERh
dGEoZGF0YSk7Ci0gICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0
YU9iamVjdC0+U2V0RGF0YShodG1sRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAg
OjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKLQotICAgIFN0cmluZyBzdHIgPSBmcmFtZS0+
ZWRpdG9yKCkuc2VsZWN0ZWRUZXh0Rm9yQ2xpcGJvYXJkKCk7Ci0gICAgcmVwbGFjZU5ld2xpbmVz
V2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVzKHN0cik7Ci0gICAgcmVwbGFjZU5CU1BXaXRoU3BhY2Uo
c3RyKTsKLSAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoc3RyKTsKLSAgICBp
ZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRh
KHBsYWluVGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICA6Okdsb2JhbEZy
ZWUobWVkaXVtLmhHbG9iYWwpOwotCi0gICAgbWVkaXVtLmhHbG9iYWwgPSAwOwotICAgIGlmIChm
cmFtZS0+ZWRpdG9yKCkuY2FuU21hcnRDb3B5T3JEZWxldGUoKSkKLSAgICAgICAgbV93cml0YWJs
ZURhdGFPYmplY3QtPlNldERhdGEoc21hcnRQYXN0ZUZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKTsK
LX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OndyaXRlUGxhaW5UZXh0KGNvbnN0IFN0cmluZyYgdGV4
dCkKLXsKLSAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQotICAgICAgICByZXR1cm47Ci0g
ICAgCi0gICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAgICBtZWRpdW0udHltZWQgPSBUWU1F
RF9IR0xPQkFMOwotICAgIAotICAgIFN0cmluZyBzdHIgPSB0ZXh0OwotICAgIHJlcGxhY2VOZXds
aW5lc1dpdGhXaW5kb3dzU3R5bGVOZXdsaW5lcyhzdHIpOwotICAgIHJlcGxhY2VOQlNQV2l0aFNw
YWNlKHN0cik7Ci0gICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKHN0cik7Ci0g
ICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0
RGF0YShwbGFpblRleHRXRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgOjpHbG9i
YWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsgICAgICAgIAotCi0gICAgbWVkaXVtLmhHbG9iYWwgPSAw
OwotfQotICAgIAotYm9vbCBDbGlwYm9hcmRXaW46Omhhc0RhdGEoKQotewotICAgIGlmICghbV9k
YXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBpZiAobV9kYXRhT2JqZWN0KSB7Ci0gICAgICAgIENPTVB0cjxJRW51bUZPUk1B
VEVUQz4gaXRyOwotICAgICAgICBpZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+RW51bUZvcm1hdEV0
YyhEQVRBRElSX0dFVCwgJml0cikpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
ICAgIGlmICghaXRyKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEZPUk1B
VEVUQyBkYXRhOwotCi0gICAgICAgIC8vIElFbnVtRk9STUFURVRDOjpOZXh0IHJldHVybnMgU19G
QUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcy4KLSAgICAgICAgaWYgKGl0ci0+TmV4dCgx
LCAmZGF0YSwgMCkgPT0gU19PSykgewotICAgICAgICAgICAgLy8gVGhlcmUgaXMgYXQgbGVhc3Qg
b25lIGl0ZW0gaW4gdGhlIElEYXRhT2JqZWN0Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuICFtX2Ry
YWdEYXRhTWFwLmlzRW1wdHkoKTsKLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OnNldEV4dGVybmFs
RGF0YU9iamVjdChJRGF0YU9iamVjdCAqZGF0YU9iamVjdCkKLXsKLSAgICBBU1NFUlQoaXNGb3JE
cmFnQW5kRHJvcCgpKTsKLQotICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0ID0gMDsKLSAgICBtX2Rh
dGFPYmplY3QgPSBkYXRhT2JqZWN0OwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgNCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgJKHJldmlzaW9u
IDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgJ
KHdvcmtpbmcgY29weSkNCkBAIC0xLDEwMSArMCwwIEBADQotLyoKLSAqIENvcHlyaWdodCAoQykg
MjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0K
LSNpZm5kZWYgQ2xpcGJvYXJkV2luX2gKLSNkZWZpbmUgQ2xpcGJvYXJkV2luX2gKLQotI2luY2x1
ZGUgIkNPTVB0ci5oIgotI2luY2x1ZGUgIkNhY2hlZEltYWdlQ2xpZW50LmgiCi0jaW5jbHVkZSAi
Q2xpcGJvYXJkLmgiCi0jaW5jbHVkZSAiRHJhZ0RhdGEuaCIKLQotc3RydWN0IElEYXRhT2JqZWN0
OwotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIENhY2hlZEltYWdlOwotY2xhc3MgRnJh
bWU7Ci1jbGFzcyBJbnRQb2ludDsKLWNsYXNzIFdDRGF0YU9iamVjdDsKLQotLy8gU3RhdGUgYXZh
aWxhYmxlIGR1cmluZyBJRSdzIGV2ZW50cyBmb3IgZHJhZyBhbmQgZHJvcCBhbmQgY29weS9wYXN0
ZQotY2xhc3MgQ2xpcGJvYXJkV2luIDogcHVibGljIENsaXBib2FyZCwgcHVibGljIENhY2hlZElt
YWdlQ2xpZW50IHsKLSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBz
dGF0aWMgUGFzc1JlZlB0cjxDbGlwYm9hcmRXaW4+IGNyZWF0ZShDbGlwYm9hcmRUeXBlIGNsaXBi
b2FyZFR5cGUsIElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3kg
cG9saWN5LCBGcmFtZSogZnJhbWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3
IENsaXBib2FyZFdpbihjbGlwYm9hcmRUeXBlLCBkYXRhT2JqZWN0LCBwb2xpY3ksIGZyYW1lKSk7
Ci0gICAgfQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPENsaXBib2FyZFdpbj4gY3JlYXRlKENsaXBi
b2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgV0NEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBDbGlwYm9h
cmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBGcmFtZSogZnJhbWUpCi0gICAgewotICAgICAgICByZXR1
cm4gYWRvcHRSZWYobmV3IENsaXBib2FyZFdpbihjbGlwYm9hcmRUeXBlLCBkYXRhT2JqZWN0LCBw
b2xpY3ksIGZyYW1lKSk7Ci0gICAgfQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPENsaXBib2FyZFdp
bj4gY3JlYXRlKENsaXBib2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgY29uc3QgRHJhZ0RhdGFNYXAm
IGRhdGFNYXAsIENsaXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2xpcGJvYXJkV2luKGNsaXBib2FyZFR5
cGUsIGRhdGFNYXAsIHBvbGljeSwgZnJhbWUpKTsKLSAgICB9Ci0gICAgfkNsaXBib2FyZFdpbigp
OwotCi0gICAgdm9pZCBjbGVhckRhdGEoY29uc3QgU3RyaW5nJiB0eXBlKTsKLSAgICB2b2lkIGNs
ZWFyRGF0YSgpOwotICAgIFN0cmluZyBnZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSkgY29uc3Q7
Ci0gICAgYm9vbCBzZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBkYXRh
KTsKLQotICAgIC8vIGV4dGVuc2lvbnMgYmV5b25kIElFJ3MgQVBJCi0gICAgdmlydHVhbCBMaXN0
SGFzaFNldDxTdHJpbmc+IHR5cGVzKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPEZp
bGVMaXN0PiBmaWxlcygpIGNvbnN0OwotCi0gICAgdm9pZCBzZXREcmFnSW1hZ2UoQ2FjaGVkSW1h
Z2UqLCBjb25zdCBJbnRQb2ludCYpOwotICAgIHZvaWQgc2V0RHJhZ0ltYWdlRWxlbWVudChOb2Rl
KiwgY29uc3QgSW50UG9pbnQmKTsKLQotICAgIHZpcnR1YWwgRHJhZ0ltYWdlUmVmIGNyZWF0ZURy
YWdJbWFnZShJbnRQb2ludCYgZHJhZ0xvYykgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGRlY2xh
cmVBbmRXcml0ZURyYWdJbWFnZShFbGVtZW50KiwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYg
dGl0bGUsIEZyYW1lKik7Ci0gICAgdmlydHVhbCB2b2lkIHdyaXRlVVJMKGNvbnN0IEtVUkwmLCBj
b25zdCBTdHJpbmcmLCBGcmFtZSopOwotICAgIHZpcnR1YWwgdm9pZCB3cml0ZVJhbmdlKFJhbmdl
KiwgRnJhbWUqKTsKLSAgICB2aXJ0dWFsIHZvaWQgd3JpdGVQbGFpblRleHQoY29uc3QgU3RyaW5n
Jik7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzRGF0YSgpOwotCi0gICAgQ09NUHRyPElEYXRhT2Jq
ZWN0PiBkYXRhT2JqZWN0KCkgeyByZXR1cm4gbV9kYXRhT2JqZWN0OyB9Ci0KLSAgICB2b2lkIHNl
dEV4dGVybmFsRGF0YU9iamVjdChJRGF0YU9iamVjdCAqZGF0YU9iamVjdCk7Ci0KLXByaXZhdGU6
Ci0gICAgQ2xpcGJvYXJkV2luKENsaXBib2FyZFR5cGUsIElEYXRhT2JqZWN0KiwgQ2xpcGJvYXJk
QWNjZXNzUG9saWN5LCBGcmFtZSopOwotICAgIENsaXBib2FyZFdpbihDbGlwYm9hcmRUeXBlLCBX
Q0RhdGFPYmplY3QqLCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3ksIEZyYW1lKik7Ci0gICAgQ2xpcGJv
YXJkV2luKENsaXBib2FyZFR5cGUsIGNvbnN0IERyYWdEYXRhTWFwJiwgQ2xpcGJvYXJkQWNjZXNz
UG9saWN5LCBGcmFtZSopOwotCi0gICAgdm9pZCByZXNldEZyb21DbGlwYm9hcmQoKTsKLSAgICB2
b2lkIHNldERyYWdJbWFnZShDYWNoZWRJbWFnZSosIE5vZGUqLCBjb25zdCBJbnRQb2ludCYpOwot
Ci0gICAgQ09NUHRyPElEYXRhT2JqZWN0PiBtX2RhdGFPYmplY3Q7Ci0gICAgQ09NUHRyPFdDRGF0
YU9iamVjdD4gbV93cml0YWJsZURhdGFPYmplY3Q7Ci0gICAgRHJhZ0RhdGFNYXAgbV9kcmFnRGF0
YU1hcDsKLSAgICBGcmFtZSogbV9mcmFtZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
LQotI2VuZGlmIC8vIENsaXBib2FyZFdpbl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS93aW4vRWRpdG9yV2luLmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL3dpbi9FZGl0b3JXaW4uY3BwCShyZXZpc2lvbiAxNTA2MjkpDQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vd2luL0VkaXRvcldpbi5jcHAJKHdvcmtpbmcgY29weSkNCkBAIC0yNSwxNSAr
MjUsMTcgQEANCiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJFZGl0b3IuaCIKLSNp
bmNsdWRlICJFZGl0b3JDbGllbnQuaCIKIAotI2luY2x1ZGUgIkNsaXBib2FyZFdpbi5oIgorI2lu
Y2x1ZGUgIkNPTVB0ci5oIgorI2luY2x1ZGUgIkNsaXBib2FyZC5oIgogI2luY2x1ZGUgIkRvY3Vt
ZW50LmgiCisjaW5jbHVkZSAiRWRpdG9yQ2xpZW50LmgiCiAjaW5jbHVkZSAiRWxlbWVudC5oIgog
I2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKKyNpbmNsdWRlICJQ
YXN0ZWJvYXJkLmgiCiAjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiVmlzaWJs
ZVVuaXRzLmgiCisjaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKIAogI2luY2x1ZGUgPHdpbmRvd3Mu
aD4KIApAQCAtNDYsOCArNDgsOSBAQA0KICAgICBpZiAoIVNVQ0NFRURFRChPbGVHZXRDbGlwYm9h
cmQoJmNsaXBib2FyZERhdGEpKSkKICAgICAgICAgY2xpcGJvYXJkRGF0YSA9IDA7CiAjZW5kaWYK
LQotICAgIHJldHVybiBDbGlwYm9hcmRXaW46OmNyZWF0ZShDbGlwYm9hcmQ6OkNvcHlBbmRQYXN0
ZSwgY2xpcGJvYXJkRGF0YS5nZXQoKSwgcG9saWN5LCBmcmFtZSk7CisgICAgUmVmUHRyPENsaXBi
b2FyZD4gY2xpcGJvYXJkID0gQ2xpcGJvYXJkOjpjcmVhdGVGb3JDb3B5QW5kUGFzdGUocG9saWN5
KTsKKyAgICBjb25zdF9jYXN0PFBhc3RlYm9hcmQmPihjbGlwYm9hcmQtPnBhc3RlYm9hcmQoKSku
c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KGNsaXBib2FyZERhdGEuZ2V0KCkpOworICAgIHJldHVybiBj
bGlwYm9hcmQucmVsZWFzZSgpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHANCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHAJKHJldmlz
aW9uIDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdp
bi5jcHAJKHdvcmtpbmcgY29weSkNCkBAIC0xLDUgKzEsNiBAQA0KIC8qCiAgKiBDb3B5cmlnaHQg
KEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly
aWdodCAoQykgMjAxMyBYdWVxaW5nIEh1YW5nIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgogICoK
ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zNCw2ICszNSw4IEBADQogI2luY2x1ZGUg
IkVkaXRvci5oIgogI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJGcmFtZS5oIgorI2lu
Y2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhUTUxQYXJzZXJJZGlvbXMuaCIKICNpbmNs
dWRlICJIV25kREMuaCIKICNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCiAjaW5jbHVkZSAiSW1h
Z2UuaCIKQEAgLTQyLDYgKzQ1LDcgQEANCiAjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlJh
bmdlLmgiCiAjaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmZXIu
aCIKICNpbmNsdWRlICJUZXh0RW5jb2RpbmcuaCIKICNpbmNsdWRlICJXZWJDb3JlSW5zdGFuY2VI
YW5kbGUuaCIKICNpbmNsdWRlICJXaW5kb3dzRXh0cmFzLmgiCkBAIC01MCw2ICs1NCw5IEBADQog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKKy8vIFdlIHByb3ZpZGUgdGhlIElFIGNsaXBib2FyZCB0
eXBlcyAoVVJMIGFuZCBUZXh0KSwgYW5kIHRoZSBjbGlwYm9hcmQgdHlwZXMgc3BlY2lmaWVkIGlu
IHRoZSBXSEFUV0cgV2ViIEFwcGxpY2F0aW9ucyAxLjAgZHJhZnQKKy8vIHNlZSBodHRwOi8vd3d3
LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyBTZWN0aW9uIDYuMy41LjMK
Kwogc3RhdGljIFVJTlQgSFRNTENsaXBib2FyZEZvcm1hdCA9IDA7CiBzdGF0aWMgVUlOVCBCb29r
bWFya0NsaXBib2FyZEZvcm1hdCA9IDA7CiBzdGF0aWMgVUlOVCBXZWJTbWFydFBhc3RlRm9ybWF0
ID0gMDsKQEAgLTg5LDggKzk2LDM4IEBADQogICAgIHJldHVybiBwYXN0ZWJvYXJkOwogfQogCi1Q
YXN0ZWJvYXJkOjpQYXN0ZWJvYXJkKCkKK1Bhc3NPd25QdHI8UGFzdGVib2FyZD4gUGFzdGVib2Fy
ZDo6Y3JlYXRlRm9yQ29weUFuZFBhc3RlKCkKIHsKKyAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBh
c3RlYm9hcmQpOworfQorCitQYXNzT3duUHRyPFBhc3RlYm9hcmQ+IFBhc3RlYm9hcmQ6OmNyZWF0
ZVByaXZhdGUoKQoreworICAgIC8vIFdpbmRvd3MgaGFzIG5vdCAiUHJpdmF0ZSBwYXN0ZWJvYXJk
IiBjb25jZXB0LgorICAgIHJldHVybiBjcmVhdGVGb3JDb3B5QW5kUGFzdGUoKTsKK30KKworI2lm
IEVOQUJMRShEUkFHX1NVUFBPUlQpCitQYXNzT3duUHRyPFBhc3RlYm9hcmQ+IFBhc3RlYm9hcmQ6
OmNyZWF0ZUZvckRyYWdBbmREcm9wKCkKK3sKKyAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBkYXRh
T2JqZWN0OworICAgIFdDRGF0YU9iamVjdDo6Y3JlYXRlSW5zdGFuY2UoJmRhdGFPYmplY3QpOwor
ICAgIHJldHVybiBhZG9wdFB0cihuZXcgUGFzdGVib2FyZChkYXRhT2JqZWN0LmdldCgpKSk7Cit9
CisKKy8vIHN0YXRpYworUGFzc093blB0cjxQYXN0ZWJvYXJkPiBQYXN0ZWJvYXJkOjpjcmVhdGVG
b3JEcmFnQW5kRHJvcChjb25zdCBEcmFnRGF0YSYgZHJhZ0RhdGEpCit7CisgICAgaWYgKGRyYWdE
YXRhLnBsYXRmb3JtRGF0YSgpKQorICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBhc3RlYm9h
cmQoZHJhZ0RhdGEucGxhdGZvcm1EYXRhKCkpKTsKKyAgICAvLyBXZSBjb3VsZCBub3QgY2FsbCBE
cmFnRGF0YTo6ZHJhZ0RhdGFNYXAgdmlhIHxjb25zdCBEcmFnRGF0YSZ8LgorICAgIGNvbnN0IERy
YWdEYXRhTWFwJiBkcmFnRGF0YU1hcCA9IGNvbnN0X2Nhc3Q8RHJhZ0RhdGEqPigoJmRyYWdEYXRh
KSktPmRyYWdEYXRhTWFwKCk7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBQYXN0ZWJvYXJkKGRy
YWdEYXRhTWFwKSk7Cit9CisjZW5kaWYKKwordm9pZCBQYXN0ZWJvYXJkOjpmaW5pc2hDcmVhdGlu
Z1Bhc3RlYm9hcmQoKQorewogICAgIFdORENMQVNTIHdjOwogICAgIG1lbXNldCgmd2MsIDAsIHNp
emVvZihXTkRDTEFTUykpOwogICAgIHdjLmxwZm5XbmRQcm9jICAgID0gUGFzdGVib2FyZE93bmVy
V25kUHJvYzsKQEAgLTEwNiw2ICsxNDMsMzUgQEANCiAgICAgV2ViU21hcnRQYXN0ZUZvcm1hdCA9
IDo6UmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJXZWJLaXQgU21hcnQgUGFzdGUgRm9ybWF0Iik7
CiB9CiAKK1Bhc3RlYm9hcmQ6OlBhc3RlYm9hcmQoKQorICAgIDogbV9kYXRhT2JqZWN0KDApCisg
ICAgLCBtX3dyaXRhYmxlRGF0YU9iamVjdCgwKQoreworICAgIGZpbmlzaENyZWF0aW5nUGFzdGVi
b2FyZCgpOworfQorCitQYXN0ZWJvYXJkOjpQYXN0ZWJvYXJkKElEYXRhT2JqZWN0KiBkYXRhT2Jq
ZWN0KQorICAgIDogbV9kYXRhT2JqZWN0KGRhdGFPYmplY3QpCisgICAgLCBtX3dyaXRhYmxlRGF0
YU9iamVjdCgwKQoreworICAgIGZpbmlzaENyZWF0aW5nUGFzdGVib2FyZCgpOworfQorCitQYXN0
ZWJvYXJkOjpQYXN0ZWJvYXJkKFdDRGF0YU9iamVjdCogZGF0YU9iamVjdCkKKyAgICA6IG1fZGF0
YU9iamVjdChkYXRhT2JqZWN0KQorICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoZGF0YU9iamVj
dCkKK3sKKyAgICBmaW5pc2hDcmVhdGluZ1Bhc3RlYm9hcmQoKTsKK30KKworUGFzdGVib2FyZDo6
UGFzdGVib2FyZChjb25zdCBEcmFnRGF0YU1hcCYgZGF0YU1hcCkKKyAgICA6IG1fZGF0YU9iamVj
dCgwKQorICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoMCkKKyAgICAsIG1fZHJhZ0RhdGFNYXAo
ZGF0YU1hcCkKK3sKKyAgICBmaW5pc2hDcmVhdGluZ1Bhc3RlYm9hcmQoKTsKK30KKwogdm9pZCBQ
YXN0ZWJvYXJkOjpjbGVhcigpCiB7CiAgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkg
ewpAQCAtMTE0LDYgKzE4MCwyNzEgQEANCiAgICAgfQogfQogCitlbnVtIENsaXBib2FyZERhdGFU
eXBlIHsgQ2xpcGJvYXJkRGF0YVR5cGVOb25lLCBDbGlwYm9hcmREYXRhVHlwZVVSTCwgQ2xpcGJv
YXJkRGF0YVR5cGVUZXh0LCBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MIH07CisKK3N0YXRpYyBD
bGlwYm9hcmREYXRhVHlwZSBjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKGNvbnN0IFN0cmluZyYg
dHlwZSkKK3sKKyAgICBTdHJpbmcgcVR5cGUgPSB0eXBlLnN0cmlwV2hpdGVTcGFjZSgpLmxvd2Vy
KCk7CisKKyAgICAvLyB0d28gc3BlY2lhbCBjYXNlcyBmb3IgSUUgY29tcGF0aWJpbGl0eQorICAg
IGlmIChxVHlwZSA9PSAidGV4dCIgfHwgcVR5cGUgPT0gInRleHQvcGxhaW4iIHx8IHFUeXBlLnN0
YXJ0c1dpdGgoInRleHQvcGxhaW47IikpCisgICAgICAgIHJldHVybiBDbGlwYm9hcmREYXRhVHlw
ZVRleHQ7CisgICAgaWYgKHFUeXBlID09ICJ1cmwiIHx8IHFUeXBlID09ICJ0ZXh0L3VyaS1saXN0
IikKKyAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVVJMOworICAgIGlmIChxVHlwZSA9
PSAidGV4dC9odG1sIikKKyAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVGV4dEhUTUw7
CisKKyAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVOb25lOworfQorCit2b2lkIFBhc3RlYm9h
cmQ6OmNsZWFyKGNvbnN0IFN0cmluZyYgdHlwZSkKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRh
T2JqZWN0KQorICAgICAgICByZXR1cm47CisKKyAgICBDbGlwYm9hcmREYXRhVHlwZSBkYXRhVHlw
ZSA9IGNsaXBib2FyZFR5cGVGcm9tTUlNRVR5cGUodHlwZSk7CisKKyAgICBpZiAoZGF0YVR5cGUg
PT0gQ2xpcGJvYXJkRGF0YVR5cGVVUkwpIHsKKyAgICAgICAgbV93cml0YWJsZURhdGFPYmplY3Qt
PmNsZWFyRGF0YSh1cmxXRm9ybWF0KCktPmNmRm9ybWF0KTsKKyAgICAgICAgbV93cml0YWJsZURh
dGFPYmplY3QtPmNsZWFyRGF0YSh1cmxGb3JtYXQoKS0+Y2ZGb3JtYXQpOworICAgIH0KKyAgICBp
ZiAoZGF0YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KSB7CisgICAgICAgIG1fd3JpdGFi
bGVEYXRhT2JqZWN0LT5jbGVhckRhdGEocGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0KTsKKyAg
ICAgICAgbV93cml0YWJsZURhdGFPYmplY3QtPmNsZWFyRGF0YShwbGFpblRleHRXRm9ybWF0KCkt
PmNmRm9ybWF0KTsKKyAgICB9Cit9CisKK2Jvb2wgUGFzdGVib2FyZDo6aGFzRGF0YSgpCit7Cisg
ICAgaWYgKCFtX2RhdGFPYmplY3QgJiYgbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGlmIChtX2RhdGFPYmplY3QpIHsKKyAgICAgICAgQ09NUHRy
PElFbnVtRk9STUFURVRDPiBpdHI7CisgICAgICAgIGlmIChGQUlMRUQobV9kYXRhT2JqZWN0LT5F
bnVtRm9ybWF0RXRjKERBVEFESVJfR0VULCAmaXRyKSkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgaWYgKCFpdHIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAgICAgRk9STUFURVRDIGRhdGE7CisKKyAgICAgICAgLy8gSUVudW1GT1JNQVRFVEM6Ok5leHQg
cmV0dXJucyBTX0ZBTFNFIGlmIHRoZXJlIGFyZSBubyBtb3JlIGl0ZW1zLgorICAgICAgICBpZiAo
aXRyLT5OZXh0KDEsICZkYXRhLCAwKSA9PSBTX09LKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBp
cyBhdCBsZWFzdCBvbmUgaXRlbSBpbiB0aGUgSURhdGFPYmplY3QKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBy
ZXR1cm4gIW1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpOworfQorCitzdGF0aWMgdm9pZCBhZGRNaW1l
VHlwZXNGb3JGb3JtYXQoTGlzdEhhc2hTZXQ8U3RyaW5nPiYgcmVzdWx0cywgY29uc3QgRk9STUFU
RVRDJiBmb3JtYXQpCit7CisgICAgLy8gVVJMIGFuZCBUZXh0IGFyZSBwcm92aWRlZCBmb3IgY29t
cGF0aWJpbGl0eSB3aXRoIElFJ3MgbW9kZWwKKyAgICBpZiAoZm9ybWF0LmNmRm9ybWF0ID09IHVy
bEZvcm1hdCgpLT5jZkZvcm1hdCB8fCBmb3JtYXQuY2ZGb3JtYXQgPT0gdXJsV0Zvcm1hdCgpLT5j
ZkZvcm1hdCkgeworICAgICAgICByZXN1bHRzLmFkZCgiVVJMIik7CisgICAgICAgIHJlc3VsdHMu
YWRkKCJ0ZXh0L3VyaS1saXN0Iik7CisgICAgfQorCisgICAgaWYgKGZvcm1hdC5jZkZvcm1hdCA9
PSBwbGFpblRleHRXRm9ybWF0KCktPmNmRm9ybWF0IHx8IGZvcm1hdC5jZkZvcm1hdCA9PSBwbGFp
blRleHRGb3JtYXQoKS0+Y2ZGb3JtYXQpIHsKKyAgICAgICAgcmVzdWx0cy5hZGQoIlRleHQiKTsK
KyAgICAgICAgcmVzdWx0cy5hZGQoInRleHQvcGxhaW4iKTsKKyAgICB9Cit9CisKK0xpc3RIYXNo
U2V0PFN0cmluZz4gUGFzdGVib2FyZDo6dHlwZXMoKQoreworICAgIExpc3RIYXNoU2V0PFN0cmlu
Zz4gcmVzdWx0czsKKworICAgIGlmICghbV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNF
bXB0eSgpKQorICAgICAgICByZXR1cm4gcmVzdWx0czsKKworICAgIGlmIChtX2RhdGFPYmplY3Qp
IHsKKyAgICAgICAgQ09NUHRyPElFbnVtRk9STUFURVRDPiBpdHI7CisKKyAgICAgICAgaWYgKEZB
SUxFRChtX2RhdGFPYmplY3QtPkVudW1Gb3JtYXRFdGMoREFUQURJUl9HRVQsICZpdHIpKSkKKyAg
ICAgICAgICAgIHJldHVybiByZXN1bHRzOworCisgICAgICAgIGlmICghaXRyKQorICAgICAgICAg
ICAgcmV0dXJuIHJlc3VsdHM7CisKKyAgICAgICAgRk9STUFURVRDIGRhdGE7CisKKyAgICAgICAg
Ly8gSUVudW1GT1JNQVRFVEM6Ok5leHQgcmV0dXJucyBTX0ZBTFNFIGlmIHRoZXJlIGFyZSBubyBt
b3JlIGl0ZW1zLgorICAgICAgICB3aGlsZSAoaXRyLT5OZXh0KDEsICZkYXRhLCAwKSA9PSBTX09L
KQorICAgICAgICAgICAgYWRkTWltZVR5cGVzRm9yRm9ybWF0KHJlc3VsdHMsIGRhdGEpOworICAg
IH0gZWxzZSB7CisgICAgICAgIGZvciAoRHJhZ0RhdGFNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
bV9kcmFnRGF0YU1hcC5iZWdpbigpOyBpdCAhPSBtX2RyYWdEYXRhTWFwLmVuZCgpOyArK2l0KSB7
CisgICAgICAgICAgICBGT1JNQVRFVEMgZGF0YTsKKyAgICAgICAgICAgIGRhdGEuY2ZGb3JtYXQg
PSAoKml0KS5rZXk7CisgICAgICAgICAgICBhZGRNaW1lVHlwZXNGb3JGb3JtYXQocmVzdWx0cywg
ZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0czsKK30KKworU3Ry
aW5nIFBhc3RlYm9hcmQ6OnJlYWRTdHJpbmcoY29uc3QgU3RyaW5nJiB0eXBlKQoreworICAgIGlm
ICghbV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm4gIiI7CisKKyAgICBDbGlwYm9hcmREYXRhVHlwZSBkYXRhVHlwZSA9IGNsaXBib2FyZFR5cGVG
cm9tTUlNRVR5cGUodHlwZSk7CisgICAgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBl
VGV4dCkKKyAgICAgICAgcmV0dXJuIG1fZGF0YU9iamVjdCA/IGdldFBsYWluVGV4dChtX2RhdGFP
YmplY3QuZ2V0KCkpIDogZ2V0UGxhaW5UZXh0KCZtX2RyYWdEYXRhTWFwKTsKKyAgICBpZiAoZGF0
YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVVUkwpCisgICAgICAgIHJldHVybiBtX2RhdGFPYmpl
Y3QgPyBnZXRVUkwobV9kYXRhT2JqZWN0LmdldCgpLCBEcmFnRGF0YTo6RG9Ob3RDb252ZXJ0Rmls
ZW5hbWVzKSA6IGdldFVSTCgmbV9kcmFnRGF0YU1hcCwgRHJhZ0RhdGE6OkRvTm90Q29udmVydEZp
bGVuYW1lcyk7CisgICAgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBlVGV4dEhUTUwp
IHsKKyAgICAgICAgU3RyaW5nIGRhdGEgPSBtX2RhdGFPYmplY3QgPyBnZXRUZXh0SFRNTChtX2Rh
dGFPYmplY3QuZ2V0KCkpIDogZ2V0VGV4dEhUTUwoJm1fZHJhZ0RhdGFNYXApOworICAgICAgICBp
ZiAoIWRhdGEuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgIHJl
dHVybiBtX2RhdGFPYmplY3QgPyBnZXRDRkhUTUwobV9kYXRhT2JqZWN0LmdldCgpKSA6IGdldENG
SFRNTCgmbV9kcmFnRGF0YU1hcCk7CisgICAgfQorCisgICAgcmV0dXJuICIiOworfQorCitWZWN0
b3I8U3RyaW5nPiBQYXN0ZWJvYXJkOjpyZWFkRmlsZW5hbWVzKCkKK3sKKyNpZiBVU0UoQ0YpCisg
ICAgVmVjdG9yPFN0cmluZz4gZmlsZU5hbWVzOworCisgICAgaWYgKG1fZGF0YU9iamVjdCkgewor
ICAgICAgICBTVEdNRURJVU0gbWVkaXVtOworICAgICAgICBpZiAoRkFJTEVEKG1fZGF0YU9iamVj
dC0+R2V0RGF0YShjZkhEcm9wRm9ybWF0KCksICZtZWRpdW0pKSkKKyAgICAgICAgICAgIHJldHVy
biBmaWxlTmFtZXM7CisKKyAgICAgICAgSERST1AgaGRyb3AgPSByZWludGVycHJldF9jYXN0PEhE
Uk9QPihHbG9iYWxMb2NrKG1lZGl1bS5oR2xvYmFsKSk7CisgICAgICAgIGlmICghaGRyb3ApCisg
ICAgICAgICAgICByZXR1cm4gZmlsZU5hbWVzOworCisgICAgICAgIFdDSEFSIGZpbGVuYW1lW01B
WF9QQVRIXTsKKyAgICAgICAgVUlOVCBmaWxlQ291bnQgPSBEcmFnUXVlcnlGaWxlVyhoZHJvcCwg
MHhGRkZGRkZGRiwgMCwgMCk7CisgICAgICAgIGZvciAoVUlOVCBpID0gMDsgaSA8IGZpbGVDb3Vu
dDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIURyYWdRdWVyeUZpbGVXKGhkcm9wLCBpLCBmaWxl
bmFtZSwgV1RGX0FSUkFZX0xFTkdUSChmaWxlbmFtZSkpKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgZmlsZU5hbWVzLmFwcGVuZChmaWxlbmFtZSk7CisgICAgICAgIH0K
KworICAgICAgICBHbG9iYWxVbmxvY2sobWVkaXVtLmhHbG9iYWwpOworICAgICAgICBSZWxlYXNl
U3RnTWVkaXVtKCZtZWRpdW0pOworICAgICAgICByZXR1cm4gZmlsZU5hbWVzOworICAgIH0KKyAg
ICBpZiAoIW1fZHJhZ0RhdGFNYXAuY29udGFpbnMoY2ZIRHJvcEZvcm1hdCgpLT5jZkZvcm1hdCkp
CisgICAgICAgIHJldHVybiBmaWxlTmFtZXM7CisgICAgcmV0dXJuIG1fZHJhZ0RhdGFNYXAuZ2V0
KGNmSERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQpOworI2Vsc2UKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBib29sIHdyaXRlVVJMKFdDRGF0
YU9iamVjdCAqZGF0YSwgY29uc3QgS1VSTCYgdXJsLCBTdHJpbmcgdGl0bGUsIGJvb2wgd2l0aFBs
YWluVGV4dCwgYm9vbCB3aXRoSFRNTCkKK3sKKyAgICBBU1NFUlQoZGF0YSk7CisKKyAgICBpZiAo
dXJsLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHRpdGxlLmlz
RW1wdHkoKSkgeworICAgICAgICB0aXRsZSA9IHVybC5sYXN0UGF0aENvbXBvbmVudCgpOworICAg
ICAgICBpZiAodGl0bGUuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGl0bGUgPSB1cmwuaG9zdCgp
OworICAgIH0KKworICAgIFNUR01FRElVTSBtZWRpdW0gPSB7MH07CisgICAgbWVkaXVtLnR5bWVk
ID0gVFlNRURfSEdMT0JBTDsKKworICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0
YSh1cmwsIHRpdGxlKTsKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBpZiAobWVkaXVt
LmhHbG9iYWwgJiYgRkFJTEVEKGRhdGEtPlNldERhdGEodXJsV0Zvcm1hdCgpLCAmbWVkaXVtLCBU
UlVFKSkpCisgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7CisgICAgZWxzZQor
ICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKworICAgIGlmICh3aXRoSFRNTCkgeworICAgICAgICBW
ZWN0b3I8Y2hhcj4gY2ZodG1sRGF0YTsKKyAgICAgICAgbWFya3VwVG9DRkhUTUwodXJsVG9NYXJr
dXAodXJsLCB0aXRsZSksICIiLCBjZmh0bWxEYXRhKTsKKyAgICAgICAgbWVkaXVtLmhHbG9iYWwg
PSBjcmVhdGVHbG9iYWxEYXRhKGNmaHRtbERhdGEpOworICAgICAgICBpZiAobWVkaXVtLmhHbG9i
YWwgJiYgRkFJTEVEKGRhdGEtPlNldERhdGEoaHRtbEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkp
CisgICAgICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOworICAgICAgICBlbHNl
CisgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAod2l0aFBsYWlu
VGV4dCkgeworICAgICAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEodXJsLnN0
cmluZygpKTsKKyAgICAgICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChkYXRhLT5TZXRE
YXRhKHBsYWluVGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQorICAgICAgICAgICAgOjpH
bG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3Vj
Y2VzcyA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK2Jvb2wgUGFz
dGVib2FyZDo6d3JpdGVTdHJpbmcoY29uc3QgU3RyaW5nJiB0eXBlLCBjb25zdCBTdHJpbmcmIGRh
dGEpCit7CisgICAgaWYgKCFtX3dyaXRhYmxlRGF0YU9iamVjdCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgQ2xpcGJvYXJkRGF0YVR5cGUgd2luVHlwZSA9IGNsaXBib2FyZFR5cGVGcm9t
TUlNRVR5cGUodHlwZSk7CisKKyAgICBpZiAod2luVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVS
TCkKKyAgICAgICAgcmV0dXJuIFdlYkNvcmU6OndyaXRlVVJMKG1fd3JpdGFibGVEYXRhT2JqZWN0
LmdldCgpLCBLVVJMKFBhcnNlZFVSTFN0cmluZywgZGF0YSksIFN0cmluZygpLCBmYWxzZSwgdHJ1
ZSk7CisKKyAgICBpZiAod2luVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRleHQpIHsKKyAgICAg
ICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKKyAgICAgICAgbWVkaXVtLnR5bWVkID0gVFlNRURf
SEdMT0JBTDsKKyAgICAgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEp
OworICAgICAgICBpZiAoIW1lZGl1bS5oR2xvYmFsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgICAgIGlmIChGQUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxh
aW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpIHsKKyAgICAgICAgICAgIDo6R2xvYmFs
RnJlZShtZWRpdW0uaEdsb2JhbCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQor
Cit2b2lkIFBhc3RlYm9hcmQ6OnNldERyYWdJbWFnZShEcmFnSW1hZ2VSZWYsIGNvbnN0IEludFBv
aW50JiBob3RTcG90KQoreworICAgIC8vIERvIG5vdGhpbmcgaW4gV2luZG93cy4KK30KKwordm9p
ZCBQYXN0ZWJvYXJkOjp3cml0ZVJhbmdlVG9EYXRhT2JqZWN0KFJhbmdlKiBzZWxlY3RlZFJhbmdl
LCBGcmFtZSogZnJhbWUpCit7CisgICAgQVNTRVJUKHNlbGVjdGVkUmFuZ2UpOworICAgIGlmICgh
bV93cml0YWJsZURhdGFPYmplY3QpCisgICAgICAgIHJldHVybjsKKworICAgIFNUR01FRElVTSBt
ZWRpdW0gPSB7MH07CisgICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKKworICAgIFZl
Y3RvcjxjaGFyPiBkYXRhOworICAgIG1hcmt1cFRvQ0ZIVE1MKGNyZWF0ZU1hcmt1cChzZWxlY3Rl
ZFJhbmdlLCAwLCBBbm5vdGF0ZUZvckludGVyY2hhbmdlKSwKKyAgICAgICAgc2VsZWN0ZWRSYW5n
ZS0+c3RhcnRDb250YWluZXIoKS0+ZG9jdW1lbnQoKS0+dXJsKCkuc3RyaW5nKCksIGRhdGEpOwor
ICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YShkYXRhKTsKKyAgICBpZiAobWVk
aXVtLmhHbG9iYWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKGh0bWxG
b3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQorICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhH
bG9iYWwpOworCisgICAgU3RyaW5nIHN0ciA9IGZyYW1lLT5lZGl0b3IoKS5zZWxlY3RlZFRleHRG
b3JDbGlwYm9hcmQoKTsKKyAgICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3bGlu
ZXMoc3RyKTsKKyAgICByZXBsYWNlTkJTUFdpdGhTcGFjZShzdHIpOworICAgIG1lZGl1bS5oR2xv
YmFsID0gY3JlYXRlR2xvYmFsRGF0YShzdHIpOworICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBG
QUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAm
bWVkaXVtLCBUUlVFKSkpCisgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7CisK
KyAgICBtZWRpdW0uaEdsb2JhbCA9IDA7CisgICAgaWYgKGZyYW1lLT5lZGl0b3IoKS5jYW5TbWFy
dENvcHlPckRlbGV0ZSgpKQorICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShz
bWFydFBhc3RlRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6
OndyaXRlU2VsZWN0aW9uKFJhbmdlKiBzZWxlY3RlZFJhbmdlLCBib29sIGNhblNtYXJ0Q29weU9y
RGVsZXRlLCBGcmFtZSogZnJhbWUsIFNob3VsZFNlcmlhbGl6ZVNlbGVjdGVkVGV4dEZvckNsaXBi
b2FyZCBzaG91bGRTZXJpYWxpemVTZWxlY3RlZFRleHRGb3JDbGlwYm9hcmQpCiB7CiAgICAgY2xl
YXIoKTsKQEAgLTE0NiwxMCArNDc3LDI5IEBADQogICAgICAgICAgICAgOjpTZXRDbGlwYm9hcmRE
YXRhKFdlYlNtYXJ0UGFzdGVGb3JtYXQsIDApOwogICAgICAgICAgICAgOjpDbG9zZUNsaXBib2Fy
ZCgpOwogICAgICAgICB9Ci0gICAgICAgIAogICAgIH0KKworICAgIHdyaXRlUmFuZ2VUb0RhdGFP
YmplY3Qoc2VsZWN0ZWRSYW5nZSwgZnJhbWUpOwogfQogCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRl
UGxhaW5UZXh0VG9EYXRhT2JqZWN0KGNvbnN0IFN0cmluZyYgdGV4dCwgU21hcnRSZXBsYWNlT3B0
aW9uIHNtYXJ0UmVwbGFjZU9wdGlvbikKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0
KQorICAgICAgICByZXR1cm47CisKKyAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OworICAgIG1l
ZGl1bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7CisKKyAgICBTdHJpbmcgc3RyID0gdGV4dDsKKyAg
ICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3bGluZXMoc3RyKTsKKyAgICByZXBs
YWNlTkJTUFdpdGhTcGFjZShzdHIpOworICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFs
RGF0YShzdHIpOworICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQobV93cml0YWJsZURh
dGFPYmplY3QtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCisg
ICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7ICAgICAgICAKKworICAgIG1lZGl1
bS5oR2xvYmFsID0gMDsKK30KKwogdm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVBsYWluVGV4dChjb25z
dCBTdHJpbmcmIHRleHQsIFNtYXJ0UmVwbGFjZU9wdGlvbiBzbWFydFJlcGxhY2VPcHRpb24pCiB7
CiAgICAgY2xlYXIoKTsKQEAgLTE3MSw4ICs1MjEsMTY1IEBADQogICAgICAgICAgICAgOjpDbG9z
ZUNsaXBib2FyZCgpOwogICAgICAgICB9CiAgICAgfQorCisgICAgd3JpdGVQbGFpblRleHRUb0Rh
dGFPYmplY3QodGV4dCwgc21hcnRSZXBsYWNlT3B0aW9uKTsKIH0KIAorI2lmICFPUyhXSU5DRSkK
K3N0YXRpYyBpbmxpbmUgdm9pZCBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKFBXU1RSIHBzeiwg
c2l6ZV90IGxlbmd0aCkKK3sKKyAgICBzaXplX3Qgd3JpdGVUbyA9IDA7CisgICAgc2l6ZV90IHJl
YWRGcm9tID0gMDsKKyAgICB3aGlsZSAocmVhZEZyb20gPCBsZW5ndGgpIHsKKyAgICAgICAgVUlO
VCB0eXBlID0gUGF0aEdldENoYXJUeXBlKHBzeltyZWFkRnJvbV0pOworICAgICAgICBpZiAoIXBz
eltyZWFkRnJvbV0gfHwgdHlwZSAmIChHQ1RfTEZOQ0hBUiB8IEdDVF9TSE9SVENIQVIpKQorICAg
ICAgICAgICAgcHN6W3dyaXRlVG8rK10gPSBwc3pbcmVhZEZyb21dOworCisgICAgICAgIHJlYWRG
cm9tKys7CisgICAgfQorICAgIHBzelt3cml0ZVRvXSA9IDA7Cit9CisjZW5kaWYKKworc3RhdGlj
IFN0cmluZyBmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRpdGxlKGNvbnN0IFN0cmluZyYgdXJsLCBj
b25zdCBTdHJpbmcmIHRpdGxlLCBjb25zdCBVQ2hhciogZXh0ZW5zaW9uLCBib29sIGlzTGluaykK
K3sKKyNpZiBPUyhXSU5DRSkKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBTdHJp
bmcoKTsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBmc1BhdGhNYXhMZW5ndGhFeGNs
dWRpbmdOdWxsVGVybWluYXRvciA9IE1BWF9QQVRIIC0gMTsKKyAgICBib29sIHVzZWRVUkwgPSBm
YWxzZTsKKyAgICBXQ0hBUiBmc1BhdGhCdWZmZXJbTUFYX1BBVEhdOworICAgIGZzUGF0aEJ1ZmZl
clswXSA9IDA7CisgICAgaW50IGV4dGVuc2lvbkxlbiA9IGV4dGVuc2lvbiA/IGxzdHJsZW4oZXh0
ZW5zaW9uKSA6IDA7CisgICAgaW50IGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4dGVuc2lvbiA9
IGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ051bGxUZXJtaW5hdG9yIC0gZXh0ZW5zaW9uTGVuOwor
CisgICAgaWYgKCF0aXRsZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0ZDo6
bWluPHNpemVfdD4odGl0bGUubGVuZ3RoKCksIGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4dGVu
c2lvbik7CisgICAgICAgIENvcHlNZW1vcnkoZnNQYXRoQnVmZmVyLCB0aXRsZS5jaGFyYWN0ZXJz
KCksIGxlbiAqIHNpemVvZihVQ2hhcikpOworICAgICAgICBmc1BhdGhCdWZmZXJbbGVuXSA9IDA7
CisgICAgICAgIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoZnNQYXRoQnVmZmVyLCBsZW4pOwor
ICAgIH0KKworICAgIGlmICghbHN0cmxlbihmc1BhdGhCdWZmZXIpKSB7CisgICAgICAgIEtVUkwg
a3VybChQYXJzZWRVUkxTdHJpbmcsIHVybCk7CisgICAgICAgIHVzZWRVUkwgPSB0cnVlOworICAg
ICAgICAvLyBUaGUgZmlsZW5hbWUgZm9yIGFueSBjb250ZW50IGJhc2VkIGRyYWcgb3IgZmlsZSB1
cmwgc2hvdWxkIGJlIHRoZSBsYXN0IGVsZW1lbnQgb2YgCisgICAgICAgIC8vIHRoZSBwYXRoLiBJ
ZiB3ZSBjYW4ndCBmaW5kIGl0LCBvciB3ZSdyZSBjb21pbmcgdXAgd2l0aCB0aGUgbmFtZSBmb3Ig
YSBsaW5rCisgICAgICAgIC8vIHdlIGp1c3QgdXNlIHRoZSBlbnRpcmUgdXJsLgorICAgICAgICBE
V09SRCBsZW4gPSBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb247CisgICAgICAgIFN0
cmluZyBsYXN0Q29tcG9uZW50ID0ga3VybC5sYXN0UGF0aENvbXBvbmVudCgpOworICAgICAgICBp
ZiAoa3VybC5pc0xvY2FsRmlsZSgpIHx8ICghaXNMaW5rICYmICFsYXN0Q29tcG9uZW50LmlzRW1w
dHkoKSkpIHsKKyAgICAgICAgICAgIGxlbiA9IHN0ZDo6bWluPERXT1JEPihmc1BhdGhNYXhMZW5n
dGhFeGNsdWRpbmdFeHRlbnNpb24sIGxhc3RDb21wb25lbnQubGVuZ3RoKCkpOworICAgICAgICAg
ICAgQ29weU1lbW9yeShmc1BhdGhCdWZmZXIsIGxhc3RDb21wb25lbnQuY2hhcmFjdGVycygpLCBs
ZW4gKiBzaXplb2YoVUNoYXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlbiA9
IHN0ZDo6bWluPERXT1JEPihmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24sIHVybC5s
ZW5ndGgoKSk7CisgICAgICAgICAgICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgdXJsLmNoYXJh
Y3RlcnMoKSwgbGVuICogc2l6ZW9mKFVDaGFyKSk7CisgICAgICAgIH0KKyAgICAgICAgZnNQYXRo
QnVmZmVyW2xlbl0gPSAwOworICAgICAgICBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKGZzUGF0
aEJ1ZmZlciwgbGVuKTsKKyAgICB9CisKKyAgICBpZiAoIWV4dGVuc2lvbikKKyAgICAgICAgcmV0
dXJuIFN0cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+KGZzUGF0aEJ1ZmZlcikpOworCisgICAgaWYg
KCFpc0xpbmsgJiYgdXNlZFVSTCkgeworICAgICAgICBQYXRoUmVuYW1lRXh0ZW5zaW9uKGZzUGF0
aEJ1ZmZlciwgZXh0ZW5zaW9uKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZyhzdGF0aWNfY2FzdDxV
Q2hhcio+KGZzUGF0aEJ1ZmZlcikpOworICAgIH0KKworICAgIHJldHVybiBtYWtlU3RyaW5nKHN0
YXRpY19jYXN0PGNvbnN0IFVDaGFyKj4oZnNQYXRoQnVmZmVyKSwgZXh0ZW5zaW9uKTsKKyNlbmRp
ZgorfQorCisvLyB3cml0ZUZpbGVUb0RhdGFPYmplY3QgdGFrZXMgb3duZXJzaGlwIG9mIGZpbGVE
ZXNjcmlwdG9yIGFuZCBmaWxlQ29udGVudAorc3RhdGljIEhSRVNVTFQgd3JpdGVGaWxlVG9EYXRh
T2JqZWN0KElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBIR0xPQkFMIGZpbGVEZXNjcmlwdG9yLCBI
R0xPQkFMIGZpbGVDb250ZW50LCBIR0xPQkFMIGhEcm9wQ29udGVudCkKK3sKKyAgICBIUkVTVUxU
IGhyID0gU19PSzsKKyAgICBGT1JNQVRFVEMqIGZlOworICAgIFNUR01FRElVTSBtZWRpdW0gPSB7
MH07CisgICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKKworICAgIGlmICghZmlsZURl
c2NyaXB0b3IgfHwgIWZpbGVDb250ZW50KQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICAvLyBE
ZXNjcmlwdG9yCisgICAgZmUgPSBmaWxlRGVzY3JpcHRvckZvcm1hdCgpOworCisgICAgbWVkaXVt
LmhHbG9iYWwgPSBmaWxlRGVzY3JpcHRvcjsKKworICAgIGlmIChGQUlMRUQoaHIgPSBkYXRhT2Jq
ZWN0LT5TZXREYXRhKGZlLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIGdvdG8gZXhpdDsKKwor
ICAgIC8vIENvbnRlbnRzCisgICAgZmUgPSBmaWxlQ29udGVudEZvcm1hdFplcm8oKTsKKyAgICBt
ZWRpdW0uaEdsb2JhbCA9IGZpbGVDb250ZW50OworICAgIGlmIChGQUlMRUQoaHIgPSBkYXRhT2Jq
ZWN0LT5TZXREYXRhKGZlLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIGdvdG8gZXhpdDsKKwor
I2lmIFVTRShDRikKKyAgICAvLyBIRFJPUAorICAgIGlmIChoRHJvcENvbnRlbnQpIHsKKyAgICAg
ICAgbWVkaXVtLmhHbG9iYWwgPSBoRHJvcENvbnRlbnQ7CisgICAgICAgIGhyID0gZGF0YU9iamVj
dC0+U2V0RGF0YShjZkhEcm9wRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpOworICAgIH0KKyNlbmRp
ZgorCitleGl0OgorICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGlmIChmaWxlRGVzY3Jp
cHRvcikKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoZmlsZURlc2NyaXB0b3IpOworICAgICAgICBp
ZiAoZmlsZUNvbnRlbnQpCisgICAgICAgICAgICBHbG9iYWxGcmVlKGZpbGVDb250ZW50KTsKKyAg
ICAgICAgaWYgKGhEcm9wQ29udGVudCkKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoaERyb3BDb250
ZW50KTsKKyAgICB9CisgICAgcmV0dXJuIGhyOworfQorCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRl
VVJMVG9EYXRhT2JqZWN0KGNvbnN0IEtVUkwmIGt1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGVTdHIs
IEZyYW1lKiBmcmFtZSkKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQorICAgICAg
ICByZXR1cm47CisgICAgV2ViQ29yZTo6d3JpdGVVUkwobV93cml0YWJsZURhdGFPYmplY3QuZ2V0
KCksIGt1cmwsIHRpdGxlU3RyLCB0cnVlLCB0cnVlKTsKKworICAgIFN0cmluZyB1cmwgPSBrdXJs
LnN0cmluZygpOworICAgIEFTU0VSVCh1cmwuY29udGFpbnNPbmx5QVNDSUkoKSk7IC8vIEtVUkw6
OnN0cmluZygpIGlzIFVSTCBlbmNvZGVkLgorCisgICAgU3RyaW5nIGZzUGF0aCA9IGZpbGVzeXN0
ZW1QYXRoRnJvbVVybE9yVGl0bGUodXJsLCB0aXRsZVN0ciwgTCIuVVJMIiwgdHJ1ZSk7CisgICAg
U3RyaW5nIGNvbnRlbnRTdHJpbmcoIltJbnRlcm5ldFNob3J0Y3V0XVxyXG5VUkw9IiArIHVybCAr
ICJcclxuIik7CisgICAgQ1N0cmluZyBjb250ZW50ID0gY29udGVudFN0cmluZy5sYXRpbjEoKTsK
KworICAgIGlmIChmc1BhdGgubGVuZ3RoKCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAg
SEdMT0JBTCB1cmxGaWxlRGVzY3JpcHRvciA9IEdsb2JhbEFsbG9jKEdQVFIsIHNpemVvZihGSUxF
R1JPVVBERVNDUklQVE9SKSk7CisgICAgaWYgKCF1cmxGaWxlRGVzY3JpcHRvcikKKyAgICAgICAg
cmV0dXJuOworCisgICAgSEdMT0JBTCB1cmxGaWxlQ29udGVudCA9IEdsb2JhbEFsbG9jKEdQVFIs
IGNvbnRlbnQubGVuZ3RoKCkpOworICAgIGlmICghdXJsRmlsZUNvbnRlbnQpIHsKKyAgICAgICAg
R2xvYmFsRnJlZSh1cmxGaWxlRGVzY3JpcHRvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBGSUxFR1JPVVBERVNDUklQVE9SKiBmZ2QgPSBzdGF0aWNfY2FzdDxGSUxFR1JPVVBERVND
UklQVE9SKj4oR2xvYmFsTG9jayh1cmxGaWxlRGVzY3JpcHRvcikpOworICAgIFplcm9NZW1vcnko
ZmdkLCBzaXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOworICAgIGZnZC0+Y0l0ZW1zID0gMTsK
KyAgICBmZ2QtPmZnZFswXS5kd0ZsYWdzID0gRkRfRklMRVNJWkU7CisgICAgZmdkLT5mZ2RbMF0u
bkZpbGVTaXplTG93ID0gY29udGVudC5sZW5ndGgoKTsKKworICAgIHVuc2lnbmVkIG1heFNpemUg
PSBzdGQ6Om1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgoZmdkLT5mZ2RbMF0u
Y0ZpbGVOYW1lKSk7CisgICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmlsZU5hbWUsIGZzUGF0
aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKKyAgICBHbG9iYWxVbmxv
Y2sodXJsRmlsZURlc2NyaXB0b3IpOworCisgICAgY2hhciogZmlsZUNvbnRlbnRzID0gc3RhdGlj
X2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2sodXJsRmlsZUNvbnRlbnQpKTsKKyAgICBDb3B5TWVtb3J5
KGZpbGVDb250ZW50cywgY29udGVudC5kYXRhKCksIGNvbnRlbnQubGVuZ3RoKCkpOworICAgIEds
b2JhbFVubG9jayh1cmxGaWxlQ29udGVudCk7CisKKyAgICB3cml0ZUZpbGVUb0RhdGFPYmplY3Qo
bV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybEZpbGVEZXNjcmlwdG9yLCB1cmxGaWxlQ29u
dGVudCwgMCk7Cit9CisKIHZvaWQgUGFzdGVib2FyZDo6d3JpdGVVUkwoY29uc3QgS1VSTCYgdXJs
LCBjb25zdCBTdHJpbmcmIHRpdGxlU3RyLCBGcmFtZSogZnJhbWUpCiB7CiAgICAgQVNTRVJUKCF1
cmwuaXNFbXB0eSgpKTsKQEAgLTIxMSw2ICs3MTgsOCBAQA0KICAgICAgICAgICAgIDo6R2xvYmFs
RnJlZShjYkRhdGEpOwogICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7CiAgICAgfQorCisgICAg
d3JpdGVVUkxUb0RhdGFPYmplY3QodXJsLCB0aXRsZVN0ciwgZnJhbWUpOwogfQogCiB2b2lkIFBh
c3RlYm9hcmQ6OndyaXRlSW1hZ2UoTm9kZSogbm9kZSwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmlu
ZyYpCkBAIC0yNTYsNiArNzY1LDExIEBADQogICAgIH0KIH0KIAordm9pZCBQYXN0ZWJvYXJkOjp3
cml0ZVBhc3RlYm9hcmQoY29uc3QgUGFzdGVib2FyZCYgc291cmNlUGFzdGVib2FyZCkKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6OndyaXRlQ2xpcGJvYXJk
KENsaXBib2FyZCopCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKQEAgLTM1Miw0ICs4NjYsMTg1
IEBADQogICAgIHJldHVybiAwOwogfQogCit2b2lkIFBhc3RlYm9hcmQ6OnNldEV4dGVybmFsRGF0
YU9iamVjdChJRGF0YU9iamVjdCAqZGF0YU9iamVjdCkKK3sKKyAgICBtX3dyaXRhYmxlRGF0YU9i
amVjdCA9IDA7CisgICAgbV9kYXRhT2JqZWN0ID0gZGF0YU9iamVjdDsKK30KKworc3RhdGljIENh
Y2hlZEltYWdlKiBnZXRDYWNoZWRJbWFnZShFbGVtZW50KiBlbGVtZW50KQoreworICAgIC8vIEF0
dGVtcHQgdG8gcHVsbCBDYWNoZWRJbWFnZSBmcm9tIGVsZW1lbnQKKyAgICBBU1NFUlQoZWxlbWVu
dCk7CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGVsZW1lbnQtPnJlbmRlcmVyKCk7Cisg
ICAgaWYgKCFyZW5kZXJlciB8fCAhcmVuZGVyZXItPmlzSW1hZ2UoKSkgCisgICAgICAgIHJldHVy
biAwOworCisgICAgUmVuZGVySW1hZ2UqIGltYWdlID0gdG9SZW5kZXJJbWFnZShyZW5kZXJlcik7
CisgICAgaWYgKGltYWdlLT5jYWNoZWRJbWFnZSgpICYmICFpbWFnZS0+Y2FjaGVkSW1hZ2UoKS0+
ZXJyb3JPY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gaW1hZ2UtPmNhY2hlZEltYWdlKCk7CisK
KyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSW1hZ2VGaWxl
RGVzY3JpcHRvcihjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ2FjaGVk
SW1hZ2UqIGltYWdlKQoreworICAgIEFTU0VSVF9BUkcoaW1hZ2UsIGltYWdlKTsKKyAgICBBU1NF
UlQoaW1hZ2UtPmltYWdlKCktPmRhdGEoKSk7CisKKyAgICBIUkVTVUxUIGhyID0gU19PSzsKKyAg
ICBIR0xPQkFMIG1lbU9iaiA9IDA7CisgICAgU3RyaW5nIGZzUGF0aDsKKyAgICBtZW1PYmogPSBH
bG9iYWxBbGxvYyhHUFRSLCBzaXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOworICAgIGlmICgh
bWVtT2JqKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEZJTEVHUk9VUERFU0NSSVBUT1IqIGZn
ZCA9IChGSUxFR1JPVVBERVNDUklQVE9SKilHbG9iYWxMb2NrKG1lbU9iaik7CisgICAgbWVtc2V0
KGZnZCwgMCwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKKyAgICBmZ2QtPmNJdGVtcyA9
IDE7CisgICAgZmdkLT5mZ2RbMF0uZHdGbGFncyA9IEZEX0ZJTEVTSVpFOworICAgIGZnZC0+Zmdk
WzBdLm5GaWxlU2l6ZUxvdyA9IGltYWdlLT5pbWFnZSgpLT5kYXRhKCktPnNpemUoKTsKKworICAg
IGNvbnN0IFN0cmluZyYgcHJlZmVycmVkVGl0bGUgPSB0aXRsZS5pc0VtcHR5KCkgPyBpbWFnZS0+
cmVzcG9uc2UoKS5zdWdnZXN0ZWRGaWxlbmFtZSgpIDogdGl0bGU7CisgICAgU3RyaW5nIGV4dGVu
c2lvbiA9IGltYWdlLT5pbWFnZSgpLT5maWxlbmFtZUV4dGVuc2lvbigpOworICAgIGlmIChleHRl
bnNpb24uaXNFbXB0eSgpKSB7CisgICAgICAgIC8vIERvIG5vdCBjb250aW51ZSBwcm9jZXNzaW5n
IGluIHRoZSByYXJlIGFuZCB1bnVzdWFsIGNhc2Ugd2hlcmUgYSBkZWNvZGVkIGltYWdlIGlzIG5v
dCBhYmxlIAorICAgICAgICAvLyB0byBwcm92aWRlIGEgZmlsZW5hbWUgZXh0ZW5zaW9uLiBTb21l
dGhpbmcgdHJpY2t5IChsaWtlIGEgYmFpdC1uLXN3aXRjaCkgaXMgZ29pbmcgb24KKyAgICAgICAg
cmV0dXJuIDA7CisgICAgfQorICAgIGV4dGVuc2lvbi5pbnNlcnQoIi4iLCAwKTsKKyAgICBmc1Bh
dGggPSBmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRpdGxlKHVybCwgcHJlZmVycmVkVGl0bGUsIGV4
dGVuc2lvbi5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCBmYWxzZSk7CisKKyAgICBp
ZiAoZnNQYXRoLmxlbmd0aCgpIDw9IDApIHsKKyAgICAgICAgR2xvYmFsVW5sb2NrKG1lbU9iaik7
CisgICAgICAgIEdsb2JhbEZyZWUobWVtT2JqKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQor
CisgICAgaW50IG1heFNpemUgPSBzdGQ6Om1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9M
RU5HVEgoZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lKSk7CisgICAgQ29weU1lbW9yeShmZ2QtPmZnZFsw
XS5jRmlsZU5hbWUsIChMUENXU1RSKWZzUGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXpl
b2YoVUNoYXIpKTsKKyAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKKworICAgIHJldHVybiBtZW1P
Ymo7Cit9CisKK3N0YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoU2hh
cmVkQnVmZmVyKiBkYXRhKQoreworICAgIEhHTE9CQUwgbWVtT2JqID0gR2xvYmFsQWxsb2MoR1BU
UiwgZGF0YS0+c2l6ZSgpKTsKKyAgICBpZiAoIW1lbU9iaikgCisgICAgICAgIHJldHVybiAwOwor
CisgICAgY2hhciogZmlsZUNvbnRlbnRzID0gKFBTVFIpR2xvYmFsTG9jayhtZW1PYmopOworCisg
ICAgQ29weU1lbW9yeShmaWxlQ29udGVudHMsIGRhdGEtPmRhdGEoKSwgZGF0YS0+c2l6ZSgpKTsK
KworICAgIEdsb2JhbFVubG9jayhtZW1PYmopOworCisgICAgcmV0dXJuIG1lbU9iajsKK30KKwor
c3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSERyb3BDb250ZW50KGNvbnN0IEtVUkwmIHVybCwg
U3RyaW5nJiBmaWxlTmFtZSwgU2hhcmVkQnVmZmVyKiBkYXRhKQoreworICAgIGlmIChmaWxlTmFt
ZS5pc0VtcHR5KCkgfHwgIWRhdGEpCisgICAgICAgIHJldHVybiAwOworCisgICAgV0NIQVIgZmls
ZVBhdGhbTUFYX1BBVEhdOworCisgICAgaWYgKHVybC5pc0xvY2FsRmlsZSgpKSB7CisgICAgICAg
IFN0cmluZyBsb2NhbFBhdGggPSBkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXModXJsLnBhdGgoKSk7
CisgICAgICAgIC8vIHdpbmRvd3MgZG9lcyBub3QgZW5qb3kgYSBsZWFkaW5nIHNsYXNoIG9uIHBh
dGhzCisgICAgICAgIGlmIChsb2NhbFBhdGhbMF0gPT0gJy8nKQorICAgICAgICAgICAgbG9jYWxQ
YXRoID0gbG9jYWxQYXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgTFBDV1NUUiBsb2NhbFBhdGhT
dHIgPSBsb2NhbFBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKTsKKyAgICAgICAg
aWYgKHdjc2xlbihsb2NhbFBhdGhTdHIpICsgMSA8IE1BWF9QQVRIKQorICAgICAgICAgICAgd2Nz
Y3B5X3MoZmlsZVBhdGgsIE1BWF9QQVRILCBsb2NhbFBhdGhTdHIpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworI2lmIE9TKFdJTkNFKQorICAgICAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgICAgIFdD
SEFSIHRlbXBQYXRoW01BWF9QQVRIXTsKKyAgICAgICAgV0NIQVIgZXh0ZW5zaW9uW01BWF9QQVRI
XTsKKyAgICAgICAgaWYgKCE6OkdldFRlbXBQYXRoKFdURl9BUlJBWV9MRU5HVEgodGVtcFBhdGgp
LCB0ZW1wUGF0aCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCE6OlBhdGhB
cHBlbmQodGVtcFBhdGgsIGZpbGVOYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkp
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIExQQ1dTVFIgZm91bmRFeHRlbnNpb24g
PSA6OlBhdGhGaW5kRXh0ZW5zaW9uKHRlbXBQYXRoKTsKKyAgICAgICAgaWYgKGZvdW5kRXh0ZW5z
aW9uKSB7CisgICAgICAgICAgICBpZiAod2NzY3B5X3MoZXh0ZW5zaW9uLCBNQVhfUEFUSCwgZm91
bmRFeHRlbnNpb24pKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UK
KyAgICAgICAgICAgICpleHRlbnNpb24gPSAwOworICAgICAgICA6OlBhdGhSZW1vdmVFeHRlbnNp
b24odGVtcFBhdGgpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwOyBpKyspIHsK
KyAgICAgICAgICAgIGlmIChzd3ByaW50Zl9zKGZpbGVQYXRoLCBNQVhfUEFUSCwgVEVYVCgiJXMt
JWQlcyIpLCB0ZW1wUGF0aCwgaSwgZXh0ZW5zaW9uKSA9PSAtMSkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgICAgIGlmICghOjpQYXRoRmlsZUV4aXN0cyhmaWxlUGF0aCkpCisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgSEFORExFIHRlbXBGaWxl
SGFuZGxlID0gQ3JlYXRlRmlsZShmaWxlUGF0aCwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklU
RSwgMCwgMCwgQ1JFQVRFX0FMV0FZUywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCAwKTsKKyAgICAg
ICAgaWYgKHRlbXBGaWxlSGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgdG8gdGhpcyB0ZW1wIGZp
bGUuCisgICAgICAgIERXT1JEIHdyaXR0ZW47CisgICAgICAgIEJPT0wgdGVtcFdyaXRlU3VjY2Vl
ZGVkID0gV3JpdGVGaWxlKHRlbXBGaWxlSGFuZGxlLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUo
KSwgJndyaXR0ZW4sIDApOworICAgICAgICBDbG9zZUhhbmRsZSh0ZW1wRmlsZUhhbmRsZSk7Cisg
ICAgICAgIGlmICghdGVtcFdyaXRlU3VjY2VlZGVkKQorICAgICAgICAgICAgcmV0dXJuIDA7Cisj
ZW5kaWYKKyAgICB9CisKKyAgICBTSVpFX1QgZHJvcEZpbGVzU2l6ZSA9IHNpemVvZihEUk9QRklM
RVMpICsgKHNpemVvZihXQ0hBUikgKiAod2NzbGVuKGZpbGVQYXRoKSArIDIpKTsKKyAgICBIR0xP
QkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdITkQgfCBHTUVNX1NIQVJFLCBkcm9wRmlsZXNTaXpl
KTsKKyAgICBpZiAoIW1lbU9iaikgCisgICAgICAgIHJldHVybiAwOworCisgICAgRFJPUEZJTEVT
KiBkcm9wRmlsZXMgPSAoRFJPUEZJTEVTKikgR2xvYmFsTG9jayhtZW1PYmopOworICAgIGRyb3BG
aWxlcy0+cEZpbGVzID0gc2l6ZW9mKERST1BGSUxFUyk7CisgICAgZHJvcEZpbGVzLT5mV2lkZSA9
IFRSVUU7CisgICAgd2NzY3B5KChMUFdTVFIpKGRyb3BGaWxlcyArIDEpLCBmaWxlUGF0aCk7ICAg
IAorICAgIEdsb2JhbFVubG9jayhtZW1PYmopOworCisgICAgcmV0dXJuIG1lbU9iajsKK30KKwor
dm9pZCBQYXN0ZWJvYXJkOjp3cml0ZUltYWdlVG9EYXRhT2JqZWN0KEVsZW1lbnQqIGVsZW1lbnQs
IGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICAvLyBTaG92ZSBpbWFnZSBkYXRhIGludG8gYSBEYXRh
T2JqZWN0IGZvciB1c2UgYXMgYSBmaWxlCisgICAgQ2FjaGVkSW1hZ2UqIGNhY2hlZEltYWdlID0g
Z2V0Q2FjaGVkSW1hZ2UoZWxlbWVudCk7CisgICAgaWYgKCFjYWNoZWRJbWFnZSB8fCAhY2FjaGVk
SW1hZ2UtPmltYWdlRm9yUmVuZGVyZXIoZWxlbWVudC0+cmVuZGVyZXIoKSkgfHwgIWNhY2hlZElt
YWdlLT5pc0xvYWRlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTaGFyZWRCdWZmZXIqIGlt
YWdlQnVmZmVyID0gY2FjaGVkSW1hZ2UtPmltYWdlRm9yUmVuZGVyZXIoZWxlbWVudC0+cmVuZGVy
ZXIoKSktPmRhdGEoKTsKKyAgICBpZiAoIWltYWdlQnVmZmVyIHx8ICFpbWFnZUJ1ZmZlci0+c2l6
ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBIR0xPQkFMIGltYWdlRmlsZURlc2NyaXB0b3Ig
PSBjcmVhdGVHbG9iYWxJbWFnZUZpbGVEZXNjcmlwdG9yKHVybC5zdHJpbmcoKSwgZWxlbWVudC0+
Z2V0QXR0cmlidXRlKEhUTUxOYW1lczo6YWx0QXR0ciksIGNhY2hlZEltYWdlKTsKKyAgICBpZiAo
IWltYWdlRmlsZURlc2NyaXB0b3IpCisgICAgICAgIHJldHVybjsKKworICAgIEhHTE9CQUwgaW1h
Z2VGaWxlQ29udGVudCA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoaW1hZ2VCdWZmZXIp
OworICAgIGlmICghaW1hZ2VGaWxlQ29udGVudCkgeworICAgICAgICBHbG9iYWxGcmVlKGltYWdl
RmlsZURlc2NyaXB0b3IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nIGZp
bGVOYW1lID0gY2FjaGVkSW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5hbWUoKTsKKyAg
ICBIR0xPQkFMIGhEcm9wQ29udGVudCA9IGNyZWF0ZUdsb2JhbEhEcm9wQ29udGVudCh1cmwsIGZp
bGVOYW1lLCBpbWFnZUJ1ZmZlcik7CisgICAgaWYgKCFoRHJvcENvbnRlbnQpIHsKKyAgICAgICAg
R2xvYmFsRnJlZShoRHJvcENvbnRlbnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
d3JpdGVGaWxlVG9EYXRhT2JqZWN0KG1fd3JpdGFibGVEYXRhT2JqZWN0LmdldCgpLCBpbWFnZUZp
bGVEZXNjcmlwdG9yLCBpbWFnZUZpbGVDb250ZW50LCBoRHJvcENvbnRlbnQpOworfQorCit2b2lk
IFBhc3RlYm9hcmQ6OndyaXRlVVJMVG9Xcml0YWJsZURhdGFPYmplY3QoY29uc3QgS1VSTCYgdXJs
LCBjb25zdCBTdHJpbmcmIHRpdGxlKQoreworICAgIFdlYkNvcmU6OndyaXRlVVJMKG1fd3JpdGFi
bGVEYXRhT2JqZWN0LmdldCgpLCB1cmwsIHRpdGxlLCB0cnVlLCBmYWxzZSk7Cit9CisKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZw0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNjMy
KQ0KKysrIFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEs
MyArMSwxNCBAQA0KKzIwMTMtMDUtMjQgIFh1ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFp
ZHUuY29tPgorCisgICAgICAgIE1vdmUgV2luZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJk
LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBXZWJD
b3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcDoKKyAgICAgICAgKFdlYkRyYWdDbGllbnQ6Ondp
bGxQZXJmb3JtRHJhZ1NvdXJjZUFjdGlvbik6IEdldCBJRGF0YU9iamVjdCBmcm9tIFBhc3RlYm9h
cmQgaW5zdGVhZCBvZiBDbGlwYm9hcmQuCisgICAgICAgIChXZWJEcmFnQ2xpZW50OjpzdGFydERy
YWcpOiBEaXR0by4KKwogMjAxMy0wNS0yMSAgTWFyayBTYWxpc2J1cnkgIDxtYXJrLnNhbGlzYnVy
eUBocC5jb20+CiAKICAgICAgICAgW1dpbmRvd3MsIGN1cmxdIFdlYkRvd25sb2FkQ3VybC5jcHAg
c2hvdWxkIG5vdCBpbmNsdWRlIFN5c3RlbVRpbWUuaApJbmRleDogU291cmNlL1dlYktpdC93aW4v
V2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5jcHANCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBTb3VyY2Uv
V2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcAkocmV2aXNpb24gMTUw
NjI5KQ0KKysrIFNvdXJjZS9XZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQu
Y3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtMzEsMTUgKzMxLDE2IEBADQogCiAjaW5jbHVkZSA8c2hs
b2JqLmg+CiAKLSNpbmNsdWRlIDxXZWJDb3JlL0NsaXBib2FyZFdpbi5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvQ2xpcGJvYXJkLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9EcmFnQ29udHJvbGxlci5oPgog
I2luY2x1ZGUgPFdlYkNvcmUvRHJhZ0RhdGEuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0V2ZW50SGFu
ZGxlci5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUGFnZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUGFz
dGVib2FyZC5oPgogI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1Nb3VzZUV2ZW50Lmg+CiAjaW5j
bHVkZSA8V2ViQ29yZS9GcmFtZS5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRnJhbWVWaWV3Lmg+CiAj
aW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0NvbnRleHQuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1Bh
Z2UuaD4KIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKQEAgLTEwMywxMiArMTA0LDEyIEBA
DQogICAgICAgICByZXR1cm47CiAKICAgICBQT0lOVCBwb2ludCA9IGludFBvaW50OwotICAgIENP
TVB0cjxJRGF0YU9iamVjdD4gZGF0YU9iamVjdCA9IHN0YXRpY19jYXN0PENsaXBib2FyZFdpbio+
KGNsaXBib2FyZCktPmRhdGFPYmplY3QoKTsKKyAgICBDT01QdHI8SURhdGFPYmplY3Q+IGRhdGFP
YmplY3QgPSBjbGlwYm9hcmQtPnBhc3RlYm9hcmQoKS5kYXRhT2JqZWN0KCk7CiAKICAgICBDT01Q
dHI8SURhdGFPYmplY3Q+IG5ld0RhdGFPYmplY3Q7CiAgICAgSFJFU1VMVCByZXN1bHQgPSB1aURl
bGVnYXRlLT53aWxsUGVyZm9ybURyYWdTb3VyY2VBY3Rpb24obV93ZWJWaWV3LCBzdGF0aWNfY2Fz
dDxXZWJEcmFnU291cmNlQWN0aW9uPihhY3Rpb24pLCAmcG9pbnQsIGRhdGFPYmplY3QuZ2V0KCks
ICZuZXdEYXRhT2JqZWN0KTsKICAgICBpZiAocmVzdWx0ID09IFNfT0sgJiYgbmV3RGF0YU9iamVj
dCAhPSBkYXRhT2JqZWN0KQotICAgICAgICBzdGF0aWNfY2FzdDxDbGlwYm9hcmRXaW4qPihjbGlw
Ym9hcmQpLT5zZXRFeHRlcm5hbERhdGFPYmplY3QobmV3RGF0YU9iamVjdC5nZXQoKSk7CisgICAg
ICAgIGNvbnN0X2Nhc3Q8UGFzdGVib2FyZCY+KGNsaXBib2FyZC0+cGFzdGVib2FyZCgpKS5zZXRF
eHRlcm5hbERhdGFPYmplY3QobmV3RGF0YU9iamVjdC5nZXQoKSk7CiB9CiAKIHZvaWQgV2ViRHJh
Z0NsaWVudDo6c3RhcnREcmFnKERyYWdJbWFnZVJlZiBpbWFnZSwgY29uc3QgSW50UG9pbnQmIGlt
YWdlT3JpZ2luLCBjb25zdCBJbnRQb2ludCYgZHJhZ1BvaW50LCBDbGlwYm9hcmQqIGNsaXBib2Fy
ZCwgRnJhbWUqIGZyYW1lLCBib29sIGlzTGluaykKQEAgLTEyNCw3ICsxMjUsNyBAQA0KICAgICBp
ZiAoRkFJTEVEKFdlYkRyb3BTb3VyY2U6OmNyZWF0ZUluc3RhbmNlKG1fd2ViVmlldywgJnNvdXJj
ZSkpKQogICAgICAgICByZXR1cm47CiAKLSAgICBkYXRhT2JqZWN0ID0gc3RhdGljX2Nhc3Q8Q2xp
cGJvYXJkV2luKj4oY2xpcGJvYXJkKS0+ZGF0YU9iamVjdCgpOworICAgIGRhdGFPYmplY3QgPSBj
bGlwYm9hcmQtPnBhc3RlYm9hcmQoKS5kYXRhT2JqZWN0KCk7CiAgICAgaWYgKHNvdXJjZSAmJiAo
aW1hZ2UgfHwgZGF0YU9iamVjdCkpIHsKICAgICAgICAgaWYgKGltYWdlKSB7CiAgICAgICAgICAg
ICBpZihTVUNDRUVERUQoQ29DcmVhdGVJbnN0YW5jZShDTFNJRF9EcmFnRHJvcEhlbHBlciwgMCwg
Q0xTQ1RYX0lOUFJPQ19TRVJWRVIsCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>202787</attachid>
            <date>2013-05-24 01:37:55 -0700</date>
            <delta_ts>2013-05-26 21:23:19 -0700</delta_ts>
            <desc>patch</desc>
            <filename>116258_4.patch</filename>
            <type>text/plain</type>
            <size>67183</size>
            <attacher name="huangxueqing">huangxueqing</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9X
ZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNjMyKQ0KKysrIFNvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEsMyArMSw2MyBAQA0KKzIwMTMtMDUtMjQgIFh1
ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgorCisgICAgICAgIE1vdmUgV2lu
ZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJkLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdHM6CisgICAgICAgIENsaXBib2FyZCByZWZhY3Rv
ciwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogZG9tL0NsaXBib2FyZC5oOgorICAgICAgICAq
IHBhZ2Uvd2luL0V2ZW50SGFuZGxlcldpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFdmVudEhh
bmRsZXI6OmNyZWF0ZURyYWdnaW5nQ2xpcGJvYXJkKTogQ3JlYXRlIENsaXBib2FyZCBpbnN0ZWFk
IG9mIENsaXBib2FyZFdpbi4KKyAgICAgICAgKiBwbGF0Zm9ybS9QYXN0ZWJvYXJkLmg6CisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFBhc3RlYm9hcmQpOgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6ZGF0YU9iamVjdCk6IEdldCBJRGF0YU9iamVjdCBieSBDbGlwYm9yYWQuCisg
ICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0YWJsZURhdGFPYmplY3QpOiBHZXQgV0NE
YXRhT2JqZWN0IGJ5IENsaXBib3JhZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vQ2xpcGJvYXJk
V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNsaXBib2FyZDo6Y3JlYXRlRHJhZ0ltYWdlKTog
Q2hhbmdlIHBhcmFtZXRlciBuYW1lIGxvYyB0byBkcmFnTG9jYXRpb24uCisgICAgICAgIChXZWJD
b3JlOjpDbGlwYm9hcmQ6OmRlY2xhcmVBbmRXcml0ZURyYWdJbWFnZSk6IEltcGxlbWVudCBkZWNs
YXJlQW5kV3JpdGVEcmFnSW1hZ2UgdXNlIFdDRGF0YU9iamVjdCBleHBvc2VkIGJ5IFBhc3RlYm9h
cmQuCisgICAgICAgICogcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5oOiBSZW1vdmVkLgorICAg
ICAgICAqIHBsYXRmb3JtL3dpbi9FZGl0b3JXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6RWRp
dG9yOjpuZXdHZW5lcmFsQ2xpcGJvYXJkKTogQ3JlYXRlIENsaXBib2FyZCBpbnN0ZWFkIG9mIENs
aXBib2FyZFdpbi4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmNyZWF0ZUZv
ckNvcHlBbmRQYXN0ZSk6IENyZWF0ZSBhIFBhc3RlYm9hcmQuCisgICAgICAgIChXZWJDb3JlOjpQ
YXN0ZWJvYXJkOjpjcmVhdGVQcml2YXRlKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0
ZWJvYXJkOjpjcmVhdGVGb3JEcmFnQW5kRHJvcCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6ZmluaXNoQ3JlYXRpbmdQYXN0ZWJvYXJkKTogQ3JlYXRlIFBhc3RlYm9hcmQg
dXNlIFdpbmRvd3MgQVBJLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6UGFzdGVib2Fy
ZCk6CisgICAgICAgIChXZWJDb3JlOjpjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKTogQ29waWVk
IGZyb20gQ2xpcGJvYXJkV2luLmNwcC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmNs
ZWFyKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpoYXNEYXRhKTogRGl0
dG8uCisgICAgICAgIChXZWJDb3JlOjphZGRNaW1lVHlwZXNGb3JGb3JtYXQpOiBEaXR0by4KKyAg
ICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OnR5cGVzKTogRGl0dG8uCisgICAgICAgIChXZWJD
b3JlOjpQYXN0ZWJvYXJkOjpyZWFkU3RyaW5nKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQ
YXN0ZWJvYXJkOjpyZWFkRmlsZW5hbWVzKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjp3cml0
ZVVSTCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVTdHJpbmcp
OiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OnNldERyYWdJbWFnZSk6IERp
dHRvLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVSYW5nZVRvRGF0YU9iamVj
dCk6IFdyaXRlIHJhbmdlIHRvIFdDRGF0YU9iamVjdC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3Rl
Ym9hcmQ6OndyaXRlU2VsZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6Ondy
aXRlUGxhaW5UZXh0VG9EYXRhT2JqZWN0KTogV3JpdGUgUGxhaW5UZXh0IHRvIFdDRGF0YU9iamVj
dC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlUGxhaW5UZXh0KToKKyAgICAg
ICAgKFdlYkNvcmU6OnBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMpOiBDb3BpZWQgZnJvbSBDbGlw
Ym9hcmRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6ZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JU
aXRsZSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6d3JpdGVGaWxlVG9EYXRhT2JqZWN0KTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVVSTFRvRGF0YU9iamVj
dCk6IFdyaXRlIFVSTCB0byBXQ0RhdGFPYmplY3QuCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJv
YXJkOjp3cml0ZVVSTCk6IENvcGllZCBmcm9tIENsaXBib2FyZFdpbi5jcHAuCisgICAgICAgIChX
ZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVBhc3RlYm9hcmQpOiBDb3BpZWQgZnJvbSBQYXN0ZWJv
YXJkOjp3cml0ZUNsaXBib2FyZC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmRvY3Vt
ZW50RnJhZ21lbnQpOiBDb3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6UGFzdGVib2FyZDo6c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KTogQ2xpcGJvYXJkIGNhbiBz
ZXQgbmV3IElEYXRhT2JqZWN0LgorICAgICAgICAoV2ViQ29yZTo6Z2V0Q2FjaGVkSW1hZ2UpOiBD
b3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlR2xv
YmFsSW1hZ2VGaWxlRGVzY3JpcHRvcik6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
R2xvYmFsSW1hZ2VGaWxlQ29udGVudCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
R2xvYmFsSERyb3BDb250ZW50KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJk
Ojp3cml0ZUltYWdlVG9EYXRhT2JqZWN0KTogRXhwb3NlIHRvIG1ha2UgQ2xpcGJvYXJkIGltcGxl
bWVudCBkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UuCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJv
YXJkOjp3cml0ZVVSTFRvV3JpdGFibGVEYXRhT2JqZWN0KTogRGl0dG8uCisKIDIwMTMtMDUtMjMg
IEJldGggRGFraW4gIDxiZGFraW5AYXBwbGUuY29tPgogCiAgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTY3MDIKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Rv
bS9DbGlwYm9hcmQuaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9DbGlwYm9h
cmQuaAkocmV2aXNpb24gMTUwNjI5KQ0KKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9DbGlwYm9hcmQu
aAkod29ya2luZyBjb3B5KQ0KQEAgLTM0LDcgKzM0LDcgQEANCiAvLyBUaGlzIERPTSBvYmplY3Qg
bm93IHdvcmtzIGJ5IGNhbGxpbmcgdGhyb3VnaCB0byBjbGFzc2VzIGluIHRoZSBwbGF0Zm9ybSBs
YXllci4KIC8vIFNwZWNpZmljYWxseSwgdGhlIGNsYXNzIGN1cnJlbnRseSBuYW1lZCBQYXN0ZWJv
YXJkLiBUaGUgbGVnYWN5IHN0eWxlIGluc3RlYWQKIC8vIHVzZXMgdGhpcyBhcyBhbiBhYnN0cmFj
dCBiYXNlIGNsYXNzLgotI2RlZmluZSBXVEZfVVNFX0xFR0FDWV9TVFlMRV9BQlNUUkFDVF9DTElQ
Qk9BUkRfQ0xBU1MgKFBMQVRGT1JNKElPUykgfHwgUExBVEZPUk0oUVQpIHx8IFBMQVRGT1JNKFdJ
TikpCisjZGVmaW5lIFdURl9VU0VfTEVHQUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFT
UyAoUExBVEZPUk0oSU9TKSB8fCBQTEFURk9STShRVCkpCiAKICNpZiBVU0UoTEVHQUNZX1NUWUxF
X0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFTUykKICNkZWZpbmUgTEVHQUNZX1ZJUlRVQUwgdmlydHVh
bApJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS93aW4vRXZlbnRIYW5kbGVyV2luLmNwcA0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2Uvd2luL0V2ZW50SGFuZGxlcldpbi5jcHAJ
KHJldmlzaW9uIDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL3dpbi9FdmVudEhhbmRs
ZXJXaW4uY3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtMjcsNiArMjcsOCBAQA0KICNpbmNsdWRlICJj
b25maWcuaCIKICNpbmNsdWRlICJFdmVudEhhbmRsZXIuaCIKIAorI2luY2x1ZGUgIkNPTVB0ci5o
IgorI2luY2x1ZGUgIkNsaXBib2FyZC5oIgogI2luY2x1ZGUgIkN1cnNvci5oIgogI2luY2x1ZGUg
IkZsb2F0UG9pbnQuaCIKICNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKQEAgLTQzLDEyICs0
NSw2IEBADQogI2luY2x1ZGUgIldDRGF0YU9iamVjdC5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVu
dGVkLmgiCiAKLSNpZiBPUyhXSU5DRSkKLSNpbmNsdWRlICJDbGlwYm9hcmQuaCIKLSNlbHNlCi0j
aW5jbHVkZSAiQ2xpcGJvYXJkV2luLmgiCi0jZW5kaWYKLQogbmFtZXNwYWNlIFdlYkNvcmUgewog
CiAjaWYgRU5BQkxFKERSQUdfU1VQUE9SVCkKQEAgLTEwMSw5ICs5Nyw3IEBADQogI2lmIE9TKFdJ
TkNFKQogICAgIHJldHVybiAwOwogI2Vsc2UKLSAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBkYXRh
T2JqZWN0OwotICAgIFdDRGF0YU9iamVjdDo6Y3JlYXRlSW5zdGFuY2UoJmRhdGFPYmplY3QpOwot
ICAgIHJldHVybiBDbGlwYm9hcmRXaW46OmNyZWF0ZShDbGlwYm9hcmQ6OkRyYWdBbmREcm9wLCBk
YXRhT2JqZWN0LmdldCgpLCBDbGlwYm9hcmRXcml0YWJsZSwgbV9mcmFtZSk7CisgICAgcmV0dXJu
IENsaXBib2FyZDo6Y3JlYXRlRm9yRHJhZ0FuZERyb3AoKTsKICNlbmRpZgogfQogI2VuZGlmCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgNCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgJKHJldmlzaW9uIDE1MDYyOSkN
CisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9QYXN0ZWJvYXJkLmgJKHdvcmtpbmcgY29weSkN
CkBAIC0zOCw2ICszOCw5IEBADQogI2VuZGlmCiAKICNpZiBQTEFURk9STShXSU4pCisjaW5jbHVk
ZSA8V2ViQ29yZS9DT01QdHIuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1dDRGF0YU9iamVjdC5oPgor
I2luY2x1ZGUgPG9iamlkbC5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KIHR5cGVkZWYgc3RydWN0
IEhXTkRfXyogSFdORDsKICNlbmRpZgpAQCAtNjQsNiArNjcsNyBAQA0KIGNsYXNzIENsaXBib2Fy
ZDsKIGNsYXNzIERvY3VtZW50RnJhZ21lbnQ7CiBjbGFzcyBEcmFnRGF0YTsKK2NsYXNzIEVsZW1l
bnQ7CiBjbGFzcyBGcmFtZTsKIGNsYXNzIEhpdFRlc3RSZXN1bHQ7CiBjbGFzcyBLVVJMOwpAQCAt
MTAwLDYgKzEwNCwxMiBAQA0KICAgICBQYXNzUmVmUHRyPERhdGFPYmplY3RHdGs+IGRhdGFPYmpl
Y3QoKSBjb25zdDsKICNlbmRpZgogCisjaWYgUExBVEZPUk0oV0lOKQorICAgIGV4cGxpY2l0IFBh
c3RlYm9hcmQoSURhdGFPYmplY3QqKTsKKyAgICBleHBsaWNpdCBQYXN0ZWJvYXJkKFdDRGF0YU9i
amVjdCopOworICAgIGV4cGxpY2l0IFBhc3RlYm9hcmQoY29uc3QgRHJhZ0RhdGFNYXAmKTsKKyNl
bmRpZgorCiAgICAgLy8gRGVwcmVjYXRlZC4gVXNlIGNyZWF0ZUZvckNvcHlBbmRQYXN0ZSBpbnN0
ZWFkLgogICAgIHN0YXRpYyBQYXN0ZWJvYXJkKiBnZW5lcmFsUGFzdGVib2FyZCgpOwogCkBAIC0x
NTMsNiArMTYzLDE0IEBADQogICAgIHZvaWQgc2V0U2VsZWN0aW9uTW9kZShib29sKSB7IH0KICNl
bmRpZgogCisjaWYgUExBVEZPUk0oV0lOKQorICAgIENPTVB0cjxJRGF0YU9iamVjdD4gZGF0YU9i
amVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YU9iamVjdDsgfQorICAgIHZvaWQgc2V0RXh0ZXJu
YWxEYXRhT2JqZWN0KElEYXRhT2JqZWN0Kik7CisgICAgdm9pZCB3cml0ZVVSTFRvV3JpdGFibGVE
YXRhT2JqZWN0KGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmKTsKKyAgICBDT01QdHI8V0NEYXRh
T2JqZWN0PiB3cml0YWJsZURhdGFPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX3dyaXRhYmxlRGF0
YU9iamVjdDsgfQorICAgIHZvaWQgd3JpdGVJbWFnZVRvRGF0YU9iamVjdChFbGVtZW50KiwgY29u
c3QgS1VSTCYpOworI2VuZGlmCisKICNpZiBQTEFURk9STShHVEspCiAgICAgflBhc3RlYm9hcmQo
KTsKICNlbmRpZgpAQCAtMTc1LDcgKzE5MywxNSBAQA0KICNlbmRpZgogCiAjaWYgUExBVEZPUk0o
V0lOKQorICAgIHZvaWQgZmluaXNoQ3JlYXRpbmdQYXN0ZWJvYXJkKCk7CisgICAgdm9pZCB3cml0
ZVJhbmdlVG9EYXRhT2JqZWN0KFJhbmdlKiwgRnJhbWUqKTsKKyAgICB2b2lkIHdyaXRlVVJMVG9E
YXRhT2JqZWN0KGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmLCBGcmFtZSopOworICAgIHZvaWQg
d3JpdGVQbGFpblRleHRUb0RhdGFPYmplY3QoY29uc3QgU3RyaW5nJiwgU21hcnRSZXBsYWNlT3B0
aW9uKTsKKwogICAgIEhXTkQgbV9vd25lcjsKKyAgICBDT01QdHI8SURhdGFPYmplY3Q+IG1fZGF0
YU9iamVjdDsKKyAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBtX3dyaXRhYmxlRGF0YU9iamVjdDsK
KyAgICBEcmFnRGF0YU1hcCBtX2RyYWdEYXRhTWFwOwogI2VuZGlmCiAKICNpZiBQTEFURk9STShR
VCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4uY3BwDQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09DQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5j
cHAJKHJldmlzaW9uIDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xp
cGJvYXJkV2luLmNwcAkod29ya2luZyBjb3B5KQ0KQEAgLTEsNSArMSw2IEBADQogLyoKICAqIENv
cHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDEzIFh1ZXFpbmcgSHVhbmcgPGh1YW5neHVlcWluZ0BiYWlkdS5j
b20+CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI0LDY1NyArMjUsNDYgQEAN
CiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkNsaXBib2FyZFdpbi5oIgor
I2luY2x1ZGUgIkNsaXBib2FyZC5oIgogCiAjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKICNpbmNs
dWRlICJDbGlwYm9hcmRVdGlsaXRpZXNXaW4uaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgotI2lu
Y2x1ZGUgIkRyYWdEYXRhLmgiCi0jaW5jbHVkZSAiRWRpdG9yLmgiCiAjaW5jbHVkZSAiRWxlbWVu
dC5oIgotI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgotI2luY2x1ZGUgIkZpbGVMaXN0LmgiCiAj
aW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgotI2luY2x1ZGUgIkZy
YW1lVmlldy5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIkhUTUxQYXJzZXJJ
ZGlvbXMuaCIKLSNpbmNsdWRlICJJbWFnZS5oIgotI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnku
aCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNs
dWRlICJQYXN0ZWJvYXJkLmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCi0jaW5j
bHVkZSAiUmFuZ2UuaCIKLSNpbmNsdWRlICJSZW5kZXJJbWFnZS5oIgotI2luY2x1ZGUgIlJlc291
cmNlUmVzcG9uc2UuaCIKLSNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKLSNpbmNsdWRlICJXQ0Rh
dGFPYmplY3QuaCIKICNpbmNsdWRlICJtYXJrdXAuaCIKLSNpbmNsdWRlIDxzaGx3YXBpLmg+Ci0j
aW5jbHVkZSA8d2luaW5ldC5oPgotI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KLSNpbmNsdWRlIDx3
dGYvdGV4dC9DU3RyaW5nLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+Ci0jaW5j
bHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLS8vIFdl
IHByb3ZpZGUgdGhlIElFIGNsaXBib2FyZCB0eXBlcyAoVVJMIGFuZCBUZXh0KSwgYW5kIHRoZSBj
bGlwYm9hcmQgdHlwZXMgc3BlY2lmaWVkIGluIHRoZSBXSEFUV0cgV2ViIEFwcGxpY2F0aW9ucyAx
LjAgZHJhZnQKLS8vIHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3Vy
cmVudC13b3JrLyBTZWN0aW9uIDYuMy41LjMKLQotZW51bSBDbGlwYm9hcmREYXRhVHlwZSB7IENs
aXBib2FyZERhdGFUeXBlTm9uZSwgQ2xpcGJvYXJkRGF0YVR5cGVVUkwsIENsaXBib2FyZERhdGFU
eXBlVGV4dCwgQ2xpcGJvYXJkRGF0YVR5cGVUZXh0SFRNTCB9OwotCi1zdGF0aWMgQ2xpcGJvYXJk
RGF0YVR5cGUgY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZShjb25zdCBTdHJpbmcmIHR5cGUpCitE
cmFnSW1hZ2VSZWYgQ2xpcGJvYXJkOjpjcmVhdGVEcmFnSW1hZ2UoSW50UG9pbnQmIGRyYWdMb2Nh
dGlvbikgY29uc3QKIHsKLSAgICBTdHJpbmcgcVR5cGUgPSB0eXBlLnN0cmlwV2hpdGVTcGFjZSgp
Lmxvd2VyKCk7Ci0KLSAgICAvLyB0d28gc3BlY2lhbCBjYXNlcyBmb3IgSUUgY29tcGF0aWJpbGl0
eQotICAgIGlmIChxVHlwZSA9PSAidGV4dCIgfHwgcVR5cGUgPT0gInRleHQvcGxhaW4iIHx8IHFU
eXBlLnN0YXJ0c1dpdGgoInRleHQvcGxhaW47IikpCi0gICAgICAgIHJldHVybiBDbGlwYm9hcmRE
YXRhVHlwZVRleHQ7Ci0gICAgaWYgKHFUeXBlID09ICJ1cmwiIHx8IHFUeXBlID09ICJ0ZXh0L3Vy
aS1saXN0IikKLSAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVVJMOwotICAgIGlmIChx
VHlwZSA9PSAidGV4dC9odG1sIikKLSAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVGV4
dEhUTUw7Ci0KLSAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVOb25lOwotfQotCi0jaWYgIU9T
KFdJTkNFKQotc3RhdGljIGlubGluZSB2b2lkIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoUFdT
VFIgcHN6LCBzaXplX3QgbGVuZ3RoKQotewotICAgIHNpemVfdCB3cml0ZVRvID0gMDsKLSAgICBz
aXplX3QgcmVhZEZyb20gPSAwOwotICAgIHdoaWxlIChyZWFkRnJvbSA8IGxlbmd0aCkgewotICAg
ICAgICBVSU5UIHR5cGUgPSBQYXRoR2V0Q2hhclR5cGUocHN6W3JlYWRGcm9tXSk7Ci0gICAgICAg
IGlmICghcHN6W3JlYWRGcm9tXSB8fCB0eXBlICYgKEdDVF9MRk5DSEFSIHwgR0NUX1NIT1JUQ0hB
UikpCi0gICAgICAgICAgICBwc3pbd3JpdGVUbysrXSA9IHBzeltyZWFkRnJvbV07Ci0KLSAgICAg
ICAgcmVhZEZyb20rKzsKLSAgICB9Ci0gICAgcHN6W3dyaXRlVG9dID0gMDsKLX0KLSNlbmRpZgot
Ci1zdGF0aWMgU3RyaW5nIGZpbGVzeXN0ZW1QYXRoRnJvbVVybE9yVGl0bGUoY29uc3QgU3RyaW5n
JiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUsIGNvbnN0IFVDaGFyKiBleHRlbnNpb24sIGJvb2wg
aXNMaW5rKQotewotI2lmIE9TKFdJTkNFKQotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0
dXJuIFN0cmluZygpOwotI2Vsc2UKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGZzUGF0aE1heExl
bmd0aEV4Y2x1ZGluZ051bGxUZXJtaW5hdG9yID0gTUFYX1BBVEggLSAxOwotICAgIGJvb2wgdXNl
ZFVSTCA9IGZhbHNlOwotICAgIFdDSEFSIGZzUGF0aEJ1ZmZlcltNQVhfUEFUSF07Ci0gICAgZnNQ
YXRoQnVmZmVyWzBdID0gMDsKLSAgICBpbnQgZXh0ZW5zaW9uTGVuID0gZXh0ZW5zaW9uID8gbHN0
cmxlbihleHRlbnNpb24pIDogMDsKLSAgICBpbnQgZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0
ZW5zaW9uID0gZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nTnVsbFRlcm1pbmF0b3IgLSBleHRlbnNp
b25MZW47Ci0KLSAgICBpZiAoIXRpdGxlLmlzRW1wdHkoKSkgewotICAgICAgICBzaXplX3QgbGVu
ID0gbWluPHNpemVfdD4odGl0bGUubGVuZ3RoKCksIGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4
dGVuc2lvbik7Ci0gICAgICAgIENvcHlNZW1vcnkoZnNQYXRoQnVmZmVyLCB0aXRsZS5jaGFyYWN0
ZXJzKCksIGxlbiAqIHNpemVvZihVQ2hhcikpOwotICAgICAgICBmc1BhdGhCdWZmZXJbbGVuXSA9
IDA7Ci0gICAgICAgIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoZnNQYXRoQnVmZmVyLCBsZW4p
OwotICAgIH0KLQotICAgIGlmICghbHN0cmxlbihmc1BhdGhCdWZmZXIpKSB7Ci0gICAgICAgIEtV
Ukwga3VybChQYXJzZWRVUkxTdHJpbmcsIHVybCk7Ci0gICAgICAgIHVzZWRVUkwgPSB0cnVlOwot
ICAgICAgICAvLyBUaGUgZmlsZW5hbWUgZm9yIGFueSBjb250ZW50IGJhc2VkIGRyYWcgb3IgZmls
ZSB1cmwgc2hvdWxkIGJlIHRoZSBsYXN0IGVsZW1lbnQgb2YgCi0gICAgICAgIC8vIHRoZSBwYXRo
LiAgSWYgd2UgY2FuJ3QgZmluZCBpdCwgb3Igd2UncmUgY29taW5nIHVwIHdpdGggdGhlIG5hbWUg
Zm9yIGEgbGluawotICAgICAgICAvLyB3ZSBqdXN0IHVzZSB0aGUgZW50aXJlIHVybC4KLSAgICAg
ICAgRFdPUkQgbGVuID0gZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0ZW5zaW9uOwotICAgICAg
ICBTdHJpbmcgbGFzdENvbXBvbmVudCA9IGt1cmwubGFzdFBhdGhDb21wb25lbnQoKTsKLSAgICAg
ICAgaWYgKGt1cmwuaXNMb2NhbEZpbGUoKSB8fCAoIWlzTGluayAmJiAhbGFzdENvbXBvbmVudC5p
c0VtcHR5KCkpKSB7Ci0gICAgICAgICAgICBsZW4gPSBtaW48RFdPUkQ+KGZzUGF0aE1heExlbmd0
aEV4Y2x1ZGluZ0V4dGVuc2lvbiwgbGFzdENvbXBvbmVudC5sZW5ndGgoKSk7Ci0gICAgICAgICAg
ICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgbGFzdENvbXBvbmVudC5jaGFyYWN0ZXJzKCksIGxl
biAqIHNpemVvZihVQ2hhcikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVuID0g
bWluPERXT1JEPihmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24sIHVybC5sZW5ndGgo
KSk7Ci0gICAgICAgICAgICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgdXJsLmNoYXJhY3RlcnMo
KSwgbGVuICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZnNQYXRoQnVmZmVy
W2xlbl0gPSAwOwotICAgICAgICBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKGZzUGF0aEJ1ZmZl
ciwgbGVuKTsKLSAgICB9Ci0KLSAgICBpZiAoIWV4dGVuc2lvbikKLSAgICAgICAgcmV0dXJuIFN0
cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+KGZzUGF0aEJ1ZmZlcikpOwotCi0gICAgaWYgKCFpc0xp
bmsgJiYgdXNlZFVSTCkgewotICAgICAgICBQYXRoUmVuYW1lRXh0ZW5zaW9uKGZzUGF0aEJ1ZmZl
ciwgZXh0ZW5zaW9uKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+
KGZzUGF0aEJ1ZmZlcikpOwotICAgIH0KLQotICAgIHJldHVybiBtYWtlU3RyaW5nKHN0YXRpY19j
YXN0PGNvbnN0IFVDaGFyKj4oZnNQYXRoQnVmZmVyKSwgZXh0ZW5zaW9uKTsKLSNlbmRpZgotfQot
Ci1zdGF0aWMgSEdMT0JBTCBjcmVhdGVHbG9iYWxJbWFnZUZpbGVDb250ZW50KFNoYXJlZEJ1ZmZl
ciogZGF0YSkKLXsKLSAgICBIR0xPQkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdQVFIsIGRhdGEt
PnNpemUoKSk7Ci0gICAgaWYgKCFtZW1PYmopIAotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNo
YXIqIGZpbGVDb250ZW50cyA9IChQU1RSKUdsb2JhbExvY2sobWVtT2JqKTsKLQotICAgIENvcHlN
ZW1vcnkoZmlsZUNvbnRlbnRzLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUoKSk7Ci0gICAgCi0g
ICAgR2xvYmFsVW5sb2NrKG1lbU9iaik7Ci0gICAgCi0gICAgcmV0dXJuIG1lbU9iajsKLX0KLQot
c3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSERyb3BDb250ZW50KGNvbnN0IEtVUkwmIHVybCwg
U3RyaW5nJiBmaWxlTmFtZSwgU2hhcmVkQnVmZmVyKiBkYXRhKQotewotICAgIGlmIChmaWxlTmFt
ZS5pc0VtcHR5KCkgfHwgIWRhdGEpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgV0NIQVIgZmls
ZVBhdGhbTUFYX1BBVEhdOwotCi0gICAgaWYgKHVybC5pc0xvY2FsRmlsZSgpKSB7Ci0gICAgICAg
IFN0cmluZyBsb2NhbFBhdGggPSBkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXModXJsLnBhdGgoKSk7
Ci0gICAgICAgIC8vIHdpbmRvd3MgZG9lcyBub3QgZW5qb3kgYSBsZWFkaW5nIHNsYXNoIG9uIHBh
dGhzCi0gICAgICAgIGlmIChsb2NhbFBhdGhbMF0gPT0gJy8nKQotICAgICAgICAgICAgbG9jYWxQ
YXRoID0gbG9jYWxQYXRoLnN1YnN0cmluZygxKTsKLSAgICAgICAgTFBDV1NUUiBsb2NhbFBhdGhT
dHIgPSBsb2NhbFBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKTsKLSAgICAgICAg
aWYgKHdjc2xlbihsb2NhbFBhdGhTdHIpICsgMSA8IE1BWF9QQVRIKQotICAgICAgICAgICAgd2Nz
Y3B5X3MoZmlsZVBhdGgsIE1BWF9QQVRILCBsb2NhbFBhdGhTdHIpOwotICAgICAgICBlbHNlCi0g
ICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotI2lmIE9TKFdJTkNFKQotICAgICAg
ICBub3RJbXBsZW1lbnRlZCgpOwotICAgICAgICByZXR1cm4gMDsKLSNlbHNlCi0gICAgICAgIFdD
SEFSIHRlbXBQYXRoW01BWF9QQVRIXTsKLSAgICAgICAgV0NIQVIgZXh0ZW5zaW9uW01BWF9QQVRI
XTsKLSAgICAgICAgaWYgKCE6OkdldFRlbXBQYXRoKFdURl9BUlJBWV9MRU5HVEgodGVtcFBhdGgp
LCB0ZW1wUGF0aCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCE6OlBhdGhB
cHBlbmQodGVtcFBhdGgsIGZpbGVOYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkp
KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIExQQ1dTVFIgZm91bmRFeHRlbnNpb24g
PSA6OlBhdGhGaW5kRXh0ZW5zaW9uKHRlbXBQYXRoKTsKLSAgICAgICAgaWYgKGZvdW5kRXh0ZW5z
aW9uKSB7Ci0gICAgICAgICAgICBpZiAod2NzY3B5X3MoZXh0ZW5zaW9uLCBNQVhfUEFUSCwgZm91
bmRFeHRlbnNpb24pKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IGVsc2UK
LSAgICAgICAgICAgICpleHRlbnNpb24gPSAwOwotICAgICAgICA6OlBhdGhSZW1vdmVFeHRlbnNp
b24odGVtcFBhdGgpOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwOyBpKyspIHsK
LSAgICAgICAgICAgIGlmIChzd3ByaW50Zl9zKGZpbGVQYXRoLCBNQVhfUEFUSCwgVEVYVCgiJXMt
JWQlcyIpLCB0ZW1wUGF0aCwgaSwgZXh0ZW5zaW9uKSA9PSAtMSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKLSAgICAgICAgICAgIGlmICghOjpQYXRoRmlsZUV4aXN0cyhmaWxlUGF0aCkpCi0g
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgSEFORExFIHRlbXBGaWxl
SGFuZGxlID0gQ3JlYXRlRmlsZShmaWxlUGF0aCwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklU
RSwgMCwgMCwgQ1JFQVRFX0FMV0FZUywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCAwKTsKLSAgICAg
ICAgaWYgKHRlbXBGaWxlSGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgICAgICAg
ICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgdG8gdGhpcyB0ZW1wIGZp
bGUuCi0gICAgICAgIERXT1JEIHdyaXR0ZW47Ci0gICAgICAgIEJPT0wgdGVtcFdyaXRlU3VjY2Vl
ZGVkID0gV3JpdGVGaWxlKHRlbXBGaWxlSGFuZGxlLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUo
KSwgJndyaXR0ZW4sIDApOwotICAgICAgICBDbG9zZUhhbmRsZSh0ZW1wRmlsZUhhbmRsZSk7Ci0g
ICAgICAgIGlmICghdGVtcFdyaXRlU3VjY2VlZGVkKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0j
ZW5kaWYKLSAgICB9Ci0KLSAgICBTSVpFX1QgZHJvcEZpbGVzU2l6ZSA9IHNpemVvZihEUk9QRklM
RVMpICsgKHNpemVvZihXQ0hBUikgKiAod2NzbGVuKGZpbGVQYXRoKSArIDIpKTsKLSAgICBIR0xP
QkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdITkQgfCBHTUVNX1NIQVJFLCBkcm9wRmlsZXNTaXpl
KTsKLSAgICBpZiAoIW1lbU9iaikgCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgRFJPUEZJTEVT
KiBkcm9wRmlsZXMgPSAoRFJPUEZJTEVTKikgR2xvYmFsTG9jayhtZW1PYmopOwotICAgIGRyb3BG
aWxlcy0+cEZpbGVzID0gc2l6ZW9mKERST1BGSUxFUyk7Ci0gICAgZHJvcEZpbGVzLT5mV2lkZSA9
IFRSVUU7Ci0gICAgd2NzY3B5KChMUFdTVFIpKGRyb3BGaWxlcyArIDEpLCBmaWxlUGF0aCk7ICAg
IAotICAgIEdsb2JhbFVubG9jayhtZW1PYmopOwotICAgIAotICAgIHJldHVybiBtZW1PYmo7Ci19
Ci0KLXN0YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmlsZURlc2NyaXB0b3IoY29uc3Qg
U3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUsIENhY2hlZEltYWdlKiBpbWFnZSkKLXsK
LSAgICBBU1NFUlRfQVJHKGltYWdlLCBpbWFnZSk7Ci0gICAgQVNTRVJUKGltYWdlLT5pbWFnZSgp
LT5kYXRhKCkpOwotCi0gICAgSFJFU1VMVCBociA9IFNfT0s7Ci0gICAgSEdMT0JBTCBtZW1PYmog
PSAwOwotICAgIFN0cmluZyBmc1BhdGg7Ci0gICAgbWVtT2JqID0gR2xvYmFsQWxsb2MoR1BUUiwg
c2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKLSAgICBpZiAoIW1lbU9iaikKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICBGSUxFR1JPVVBERVNDUklQVE9SKiBmZ2QgPSAoRklMRUdST1VQREVT
Q1JJUFRPUiopR2xvYmFsTG9jayhtZW1PYmopOwotICAgIG1lbXNldChmZ2QsIDAsIHNpemVvZihG
SUxFR1JPVVBERVNDUklQVE9SKSk7Ci0gICAgZmdkLT5jSXRlbXMgPSAxOwotICAgIGZnZC0+Zmdk
WzBdLmR3RmxhZ3MgPSBGRF9GSUxFU0laRTsKLSAgICBmZ2QtPmZnZFswXS5uRmlsZVNpemVMb3cg
PSBpbWFnZS0+aW1hZ2UoKS0+ZGF0YSgpLT5zaXplKCk7Ci0gICAgCi0gICAgY29uc3QgU3RyaW5n
JiBwcmVmZXJyZWRUaXRsZSA9IHRpdGxlLmlzRW1wdHkoKSA/IGltYWdlLT5yZXNwb25zZSgpLnN1
Z2dlc3RlZEZpbGVuYW1lKCkgOiB0aXRsZTsKLSAgICBTdHJpbmcgZXh0ZW5zaW9uID0gaW1hZ2Ut
PmltYWdlKCktPmZpbGVuYW1lRXh0ZW5zaW9uKCk7Ci0gICAgaWYgKGV4dGVuc2lvbi5pc0VtcHR5
KCkpIHsKLSAgICAgICAgLy8gRG8gbm90IGNvbnRpbnVlIHByb2Nlc3NpbmcgaW4gdGhlIHJhcmUg
YW5kIHVudXN1YWwgY2FzZSB3aGVyZSBhIGRlY29kZWQgaW1hZ2UgaXMgbm90IGFibGUgCi0gICAg
ICAgIC8vIHRvIHByb3ZpZGUgYSBmaWxlbmFtZSBleHRlbnNpb24uIFNvbWV0aGluZyB0cmlja3kg
KGxpa2UgYSBiYWl0LW4tc3dpdGNoKSBpcyBnb2luZyBvbgotICAgICAgICByZXR1cm4gMDsKLSAg
ICB9Ci0gICAgZXh0ZW5zaW9uLmluc2VydCgiLiIsIDApOwotICAgIGZzUGF0aCA9IGZpbGVzeXN0
ZW1QYXRoRnJvbVVybE9yVGl0bGUodXJsLCBwcmVmZXJyZWRUaXRsZSwgZXh0ZW5zaW9uLmNoYXJh
Y3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIGZhbHNlKTsKLQotICAgIGlmIChmc1BhdGgubGVu
Z3RoKCkgPD0gMCkgewotICAgICAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKLSAgICAgICAgR2xv
YmFsRnJlZShtZW1PYmopOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpbnQgbWF4
U2l6ZSA9IG1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgoZmdkLT5mZ2RbMF0u
Y0ZpbGVOYW1lKSk7Ci0gICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmlsZU5hbWUsIChMUENX
U1RSKWZzUGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKLSAgICBH
bG9iYWxVbmxvY2sobWVtT2JqKTsKLSAgICAKLSAgICByZXR1cm4gbWVtT2JqOwotfQotCi0KLS8v
IHdyaXRlRmlsZVRvRGF0YU9iamVjdCB0YWtlcyBvd25lcnNoaXAgb2YgZmlsZURlc2NyaXB0b3Ig
YW5kIGZpbGVDb250ZW50Ci1zdGF0aWMgSFJFU1VMVCB3cml0ZUZpbGVUb0RhdGFPYmplY3QoSURh
dGFPYmplY3QqIGRhdGFPYmplY3QsIEhHTE9CQUwgZmlsZURlc2NyaXB0b3IsIEhHTE9CQUwgZmls
ZUNvbnRlbnQsIEhHTE9CQUwgaERyb3BDb250ZW50KQotewotICAgIEhSRVNVTFQgaHIgPSBTX09L
OwotICAgIEZPUk1BVEVUQyogZmU7Ci0gICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAgICBt
ZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOwotCi0gICAgaWYgKCFmaWxlRGVzY3JpcHRvciB8
fCAhZmlsZUNvbnRlbnQpCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgIC8vIERlc2NyaXB0b3IK
LSAgICBmZSA9IGZpbGVEZXNjcmlwdG9yRm9ybWF0KCk7Ci0KLSAgICBtZWRpdW0uaEdsb2JhbCA9
IGZpbGVEZXNjcmlwdG9yOwotCi0gICAgaWYgKEZBSUxFRChociA9IGRhdGFPYmplY3QtPlNldERh
dGEoZmUsICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgZ290byBleGl0OwotCi0gICAgLy8gQ29u
dGVudHMKLSAgICBmZSA9IGZpbGVDb250ZW50Rm9ybWF0WmVybygpOwotICAgIG1lZGl1bS5oR2xv
YmFsID0gZmlsZUNvbnRlbnQ7Ci0gICAgaWYgKEZBSUxFRChociA9IGRhdGFPYmplY3QtPlNldERh
dGEoZmUsICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgZ290byBleGl0OwotCi0jaWYgVVNFKENG
KQotICAgIC8vIEhEUk9QCi0gICAgaWYgKGhEcm9wQ29udGVudCkgewotICAgICAgICBtZWRpdW0u
aEdsb2JhbCA9IGhEcm9wQ29udGVudDsKLSAgICAgICAgaHIgPSBkYXRhT2JqZWN0LT5TZXREYXRh
KGNmSERyb3BGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSk7Ci0gICAgfQotI2VuZGlmCi0KLWV4aXQ6
Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgaWYgKGZpbGVEZXNjcmlwdG9yKQotICAg
ICAgICAgICAgR2xvYmFsRnJlZShmaWxlRGVzY3JpcHRvcik7Ci0gICAgICAgIGlmIChmaWxlQ29u
dGVudCkKLSAgICAgICAgICAgIEdsb2JhbEZyZWUoZmlsZUNvbnRlbnQpOwotICAgICAgICBpZiAo
aERyb3BDb250ZW50KQotICAgICAgICAgICAgR2xvYmFsRnJlZShoRHJvcENvbnRlbnQpOwotICAg
IH0KLSAgICByZXR1cm4gaHI7Ci19Ci0KLVBhc3NSZWZQdHI8Q2xpcGJvYXJkPiBDbGlwYm9hcmQ6
OmNyZWF0ZShDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBEcmFnRGF0YSogZHJhZ0RhdGEs
IEZyYW1lKiBmcmFtZSkKLXsKLSAgICBpZiAoZHJhZ0RhdGEtPnBsYXRmb3JtRGF0YSgpKQotICAg
ICAgICByZXR1cm4gQ2xpcGJvYXJkV2luOjpjcmVhdGUoRHJhZ0FuZERyb3AsIGRyYWdEYXRhLT5w
bGF0Zm9ybURhdGEoKSwgcG9saWN5LCBmcmFtZSk7Ci0gICAgcmV0dXJuIENsaXBib2FyZFdpbjo6
Y3JlYXRlKERyYWdBbmREcm9wLCBkcmFnRGF0YS0+ZHJhZ0RhdGFNYXAoKSwgcG9saWN5LCBmcmFt
ZSk7Ci19Ci0KLUNsaXBib2FyZFdpbjo6Q2xpcGJvYXJkV2luKENsaXBib2FyZFR5cGUgY2xpcGJv
YXJkVHlwZSwgSURhdGFPYmplY3QqIGRhdGFPYmplY3QsIENsaXBib2FyZEFjY2Vzc1BvbGljeSBw
b2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAgICA6IENsaXBib2FyZChwb2xpY3ksIGNsaXBib2FyZFR5
cGUpCi0gICAgLCBtX2RhdGFPYmplY3QoZGF0YU9iamVjdCkKLSAgICAsIG1fd3JpdGFibGVEYXRh
T2JqZWN0KDApCi0gICAgLCBtX2ZyYW1lKGZyYW1lKQotewotfQotCi1DbGlwYm9hcmRXaW46OkNs
aXBib2FyZFdpbihDbGlwYm9hcmRUeXBlIGNsaXBib2FyZFR5cGUsIFdDRGF0YU9iamVjdCogZGF0
YU9iamVjdCwgQ2xpcGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwgRnJhbWUqIGZyYW1lKQotICAg
IDogQ2xpcGJvYXJkKHBvbGljeSwgY2xpcGJvYXJkVHlwZSkKLSAgICAsIG1fZGF0YU9iamVjdChk
YXRhT2JqZWN0KQotICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoZGF0YU9iamVjdCkKLSAgICAs
IG1fZnJhbWUoZnJhbWUpCi17Ci19Ci0KLUNsaXBib2FyZFdpbjo6Q2xpcGJvYXJkV2luKENsaXBi
b2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgY29uc3QgRHJhZ0RhdGFNYXAmIGRhdGFNYXAsIENsaXBi
b2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAgICA6IENsaXBib2FyZChw
b2xpY3ksIGNsaXBib2FyZFR5cGUpCi0gICAgLCBtX2RhdGFPYmplY3QoMCkKLSAgICAsIG1fd3Jp
dGFibGVEYXRhT2JqZWN0KDApCi0gICAgLCBtX2ZyYW1lKGZyYW1lKQotICAgICwgbV9kcmFnRGF0
YU1hcChkYXRhTWFwKQotewotfQotCi1DbGlwYm9hcmRXaW46On5DbGlwYm9hcmRXaW4oKQotewot
ICAgIGlmIChtX2RyYWdJbWFnZSkKLSAgICAgICAgbV9kcmFnSW1hZ2UtPnJlbW92ZUNsaWVudCh0
aGlzKTsKLX0KLQotc3RhdGljIGJvb2wgd3JpdGVVUkwoV0NEYXRhT2JqZWN0ICpkYXRhLCBjb25z
dCBLVVJMJiB1cmwsIFN0cmluZyB0aXRsZSwgYm9vbCB3aXRoUGxhaW5UZXh0LCBib29sIHdpdGhI
VE1MKQotewotICAgIEFTU0VSVChkYXRhKTsKLQotICAgIGlmICh1cmwuaXNFbXB0eSgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKHRpdGxlLmlzRW1wdHkoKSkgewotICAg
ICAgICB0aXRsZSA9IHVybC5sYXN0UGF0aENvbXBvbmVudCgpOwotICAgICAgICBpZiAodGl0bGUu
aXNFbXB0eSgpKQotICAgICAgICAgICAgdGl0bGUgPSB1cmwuaG9zdCgpOwotICAgIH0KLQotICAg
IFNUR01FRElVTSBtZWRpdW0gPSB7MH07Ci0gICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JB
TDsKLQotICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YSh1cmwsIHRpdGxlKTsK
LSAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJ
TEVEKGRhdGEtPlNldERhdGEodXJsV0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAg
IDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7Ci0gICAgZWxzZQotICAgICAgICBzdWNjZXNz
ID0gdHJ1ZTsKLQotICAgIGlmICh3aXRoSFRNTCkgewotICAgICAgICBWZWN0b3I8Y2hhcj4gY2Zo
dG1sRGF0YTsKLSAgICAgICAgbWFya3VwVG9DRkhUTUwodXJsVG9NYXJrdXAodXJsLCB0aXRsZSks
ICIiLCBjZmh0bWxEYXRhKTsKLSAgICAgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxE
YXRhKGNmaHRtbERhdGEpOwotICAgICAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKGRh
dGEtPlNldERhdGEoaHRtbEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAgICAgICA6
Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBz
dWNjZXNzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAod2l0aFBsYWluVGV4dCkgewotICAgICAg
ICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEodXJsLnN0cmluZygpKTsKLSAgICAg
ICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChkYXRhLT5TZXREYXRhKHBsYWluVGV4dFdG
b3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1
bS5oR2xvYmFsKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjpjbGVh
ckRhdGEoY29uc3QgU3RyaW5nJiB0eXBlKQotewotICAgIC8vIEZJWE1FOiBOZWVkIHRvIGJlIGFi
bGUgdG8gd3JpdGUgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQgPHJkYXI6Ly9wcm9ibGVtLzUwMTU5
NDE+Ci0gICAgQVNTRVJUKGlzRm9yRHJhZ0FuZERyb3AoKSk7Ci0gICAgaWYgKCFjYW5Xcml0ZURh
dGEoKSB8fCAhbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgIHJldHVybjsKLQotICAgIENs
aXBib2FyZERhdGFUeXBlIGRhdGFUeXBlID0gY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZSh0eXBl
KTsKLQotICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVSTCkgewotICAgICAg
ICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJEYXRhKHVybFdGb3JtYXQoKS0+Y2ZGb3JtYXQp
OwotICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJEYXRhKHVybEZvcm1hdCgpLT5j
ZkZvcm1hdCk7Ci0gICAgfQotICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRl
eHQpIHsKLSAgICAgICAgbV93cml0YWJsZURhdGFPYmplY3QtPmNsZWFyRGF0YShwbGFpblRleHRG
b3JtYXQoKS0+Y2ZGb3JtYXQpOwotICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJE
YXRhKHBsYWluVGV4dFdGb3JtYXQoKS0+Y2ZGb3JtYXQpOwotICAgIH0KLQotfQotCi12b2lkIENs
aXBib2FyZFdpbjo6Y2xlYXJEYXRhKCkKLXsKLSAgICAvLyBGSVhNRTogTmVlZCB0byBiZSBhYmxl
IHRvIHdyaXRlIHRvIHRoZSBzeXN0ZW0gY2xpcGJvYXJkIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQx
PgotICAgIEFTU0VSVChpc0ZvckRyYWdBbmREcm9wKCkpOwotICAgIGlmICghY2FuV3JpdGVEYXRh
KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBtX3dyaXRhYmxlRGF0YU9iamVjdCA9IDA7
Ci0gICAgV0NEYXRhT2JqZWN0OjpjcmVhdGVJbnN0YW5jZSgmbV93cml0YWJsZURhdGFPYmplY3Qp
OwotICAgIG1fZGF0YU9iamVjdCA9IG1fd3JpdGFibGVEYXRhT2JqZWN0OwotfQotCi1TdHJpbmcg
Q2xpcGJvYXJkV2luOjpnZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSkgY29uc3QKLXsgICAgIAot
ICAgIGlmICghY2FuUmVhZERhdGEoKSB8fCAoIW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFw
LmlzRW1wdHkoKSkpCi0gICAgICAgIHJldHVybiAiIjsKLQotICAgIENsaXBib2FyZERhdGFUeXBl
IGRhdGFUeXBlID0gY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZSh0eXBlKTsKLSAgICBpZiAoZGF0
YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KQotICAgICAgICByZXR1cm4gbV9kYXRhT2Jq
ZWN0ID8gZ2V0UGxhaW5UZXh0KG1fZGF0YU9iamVjdC5nZXQoKSkgOiBnZXRQbGFpblRleHQoJm1f
ZHJhZ0RhdGFNYXApOwotICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVSTCkK
LSAgICAgICAgcmV0dXJuIG1fZGF0YU9iamVjdCA/IGdldFVSTChtX2RhdGFPYmplY3QuZ2V0KCks
IERyYWdEYXRhOjpEb05vdENvbnZlcnRGaWxlbmFtZXMpIDogZ2V0VVJMKCZtX2RyYWdEYXRhTWFw
LCBEcmFnRGF0YTo6RG9Ob3RDb252ZXJ0RmlsZW5hbWVzKTsKLSAgICBlbHNlIGlmIChkYXRhVHlw
ZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MKSB7Ci0gICAgICAgIFN0cmluZyBkYXRhID0g
bV9kYXRhT2JqZWN0ID8gZ2V0VGV4dEhUTUwobV9kYXRhT2JqZWN0LmdldCgpKSA6IGdldFRleHRI
VE1MKCZtX2RyYWdEYXRhTWFwKTsKLSAgICAgICAgaWYgKCFkYXRhLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgIHJldHVybiBkYXRhOwotICAgICAgICByZXR1cm4gbV9kYXRhT2JqZWN0ID8gZ2V0Q0ZI
VE1MKG1fZGF0YU9iamVjdC5nZXQoKSkgOiBnZXRDRkhUTUwoJm1fZHJhZ0RhdGFNYXApOwotICAg
IH0KLSAgICAKLSAgICByZXR1cm4gIiI7Ci19Ci0KLWJvb2wgQ2xpcGJvYXJkV2luOjpzZXREYXRh
KGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBkYXRhKQotewotICAgIC8vIEZJWE1F
OiBOZWVkIHRvIGJlIGFibGUgdG8gd3JpdGUgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQgPHJkYXI6
Ly9wcm9ibGVtLzUwMTU5NDE+Ci0gICAgQVNTRVJUKGlzRm9yRHJhZ0FuZERyb3AoKSk7Ci0gICAg
aWYgKCFjYW5Xcml0ZURhdGEoKSB8fCAhbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIENsaXBib2FyZERhdGFUeXBlIHdpblR5cGUgPSBjbGlwYm9hcmRU
eXBlRnJvbU1JTUVUeXBlKHR5cGUpOwotCi0gICAgaWYgKHdpblR5cGUgPT0gQ2xpcGJvYXJkRGF0
YVR5cGVVUkwpCi0gICAgICAgIHJldHVybiBXZWJDb3JlOjp3cml0ZVVSTChtX3dyaXRhYmxlRGF0
YU9iamVjdC5nZXQoKSwgS1VSTChQYXJzZWRVUkxTdHJpbmcsIGRhdGEpLCBTdHJpbmcoKSwgZmFs
c2UsIHRydWUpOwotCi0gICAgaWYgKHdpblR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KSB7
Ci0gICAgICAgIFNUR01FRElVTSBtZWRpdW0gPSB7MH07Ci0gICAgICAgIG1lZGl1bS50eW1lZCA9
IFRZTUVEX0hHTE9CQUw7Ci0gICAgICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0
YShkYXRhKTsKLSAgICAgICAgaWYgKCFtZWRpdW0uaEdsb2JhbCkKLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgICAgICBpZiAoRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXRE
YXRhKHBsYWluVGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKSB7Ci0gICAgICAgICAgICA6
Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxz
ZTsKLX0KLQotc3RhdGljIHZvaWQgYWRkTWltZVR5cGVzRm9yRm9ybWF0KExpc3RIYXNoU2V0PFN0
cmluZz4mIHJlc3VsdHMsIGNvbnN0IEZPUk1BVEVUQyYgZm9ybWF0KQotewotICAgIC8vIFVSTCBh
bmQgVGV4dCBhcmUgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBJRSdzIG1vZGVsCi0g
ICAgaWYgKGZvcm1hdC5jZkZvcm1hdCA9PSB1cmxGb3JtYXQoKS0+Y2ZGb3JtYXQgfHwgZm9ybWF0
LmNmRm9ybWF0ID09IHVybFdGb3JtYXQoKS0+Y2ZGb3JtYXQpIHsKLSAgICAgICAgcmVzdWx0cy5h
ZGQoIlVSTCIpOwotICAgICAgICByZXN1bHRzLmFkZCgidGV4dC91cmktbGlzdCIpOwotICAgIH0K
LQotICAgIGlmIChmb3JtYXQuY2ZGb3JtYXQgPT0gcGxhaW5UZXh0V0Zvcm1hdCgpLT5jZkZvcm1h
dCB8fCBmb3JtYXQuY2ZGb3JtYXQgPT0gcGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0KSB7Ci0g
ICAgICAgIHJlc3VsdHMuYWRkKCJUZXh0Iik7Ci0gICAgICAgIHJlc3VsdHMuYWRkKCJ0ZXh0L3Bs
YWluIik7Ci0gICAgfQotfQotCi0vLyBleHRlbnNpb25zIGJleW9uZCBJRSdzIEFQSQotTGlzdEhh
c2hTZXQ8U3RyaW5nPiBDbGlwYm9hcmRXaW46OnR5cGVzKCkgY29uc3QKLXsgCi0gICAgTGlzdEhh
c2hTZXQ8U3RyaW5nPiByZXN1bHRzOwotICAgIGlmICghY2FuUmVhZFR5cGVzKCkpCi0gICAgICAg
IHJldHVybiByZXN1bHRzOwotCi0gICAgaWYgKCFtX2RhdGFPYmplY3QgJiYgbV9kcmFnRGF0YU1h
cC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiByZXN1bHRzOwotCi0gICAgaWYgKG1fZGF0YU9i
amVjdCkgewotICAgICAgICBDT01QdHI8SUVudW1GT1JNQVRFVEM+IGl0cjsKLQotICAgICAgICBp
ZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+RW51bUZvcm1hdEV0YyhEQVRBRElSX0dFVCwgJml0cikp
KQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0KLSAgICAgICAgaWYgKCFpdHIpCi0gICAg
ICAgICAgICByZXR1cm4gcmVzdWx0czsKLQotICAgICAgICBGT1JNQVRFVEMgZGF0YTsKLQotICAg
ICAgICAvLyBJRW51bUZPUk1BVEVUQzo6TmV4dCByZXR1cm5zIFNfRkFMU0UgaWYgdGhlcmUgYXJl
IG5vIG1vcmUgaXRlbXMuCi0gICAgICAgIHdoaWxlIChpdHItPk5leHQoMSwgJmRhdGEsIDApID09
IFNfT0spCi0gICAgICAgICAgICBhZGRNaW1lVHlwZXNGb3JGb3JtYXQocmVzdWx0cywgZGF0YSk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChEcmFnRGF0YU1hcDo6Y29uc3RfaXRlcmF0b3Ig
aXQgPSBtX2RyYWdEYXRhTWFwLmJlZ2luKCk7IGl0ICE9IG1fZHJhZ0RhdGFNYXAuZW5kKCk7ICsr
aXQpIHsKLSAgICAgICAgICAgIEZPUk1BVEVUQyBkYXRhOwotICAgICAgICAgICAgZGF0YS5jZkZv
cm1hdCA9ICgqaXQpLmtleTsKLSAgICAgICAgICAgIGFkZE1pbWVUeXBlc0ZvckZvcm1hdChyZXN1
bHRzLCBkYXRhKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHRzOwotfQot
Ci1QYXNzUmVmUHRyPEZpbGVMaXN0PiBDbGlwYm9hcmRXaW46OmZpbGVzKCkgY29uc3QKLXsKLSNp
ZiBVU0UoQ0YpCi0gICAgUmVmUHRyPEZpbGVMaXN0PiBmaWxlcyA9IEZpbGVMaXN0OjpjcmVhdGUo
KTsKLSAgICBpZiAoIWNhblJlYWREYXRhKCkpCi0gICAgICAgIHJldHVybiBmaWxlcy5yZWxlYXNl
KCk7Ci0KLSAgICBpZiAoIW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFwLmlzRW1wdHkoKSkK
LSAgICAgICAgcmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKLQotICAgIGlmIChtX2RhdGFPYmplY3Qp
IHsKLSAgICAgICAgU1RHTUVESVVNIG1lZGl1bTsKLSAgICAgICAgaWYgKEZBSUxFRChtX2RhdGFP
YmplY3QtPkdldERhdGEoY2ZIRHJvcEZvcm1hdCgpLCAmbWVkaXVtKSkpCi0gICAgICAgICAgICBy
ZXR1cm4gZmlsZXMucmVsZWFzZSgpOwotCi0gICAgICAgIEhEUk9QIGhkcm9wID0gcmVpbnRlcnBy
ZXRfY2FzdDxIRFJPUD4oR2xvYmFsTG9jayhtZWRpdW0uaEdsb2JhbCkpOwotICAgICAgICBpZiAo
IWhkcm9wKQotICAgICAgICAgICAgcmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKLQotICAgICAgICBX
Q0hBUiBmaWxlbmFtZVtNQVhfUEFUSF07Ci0gICAgICAgIFVJTlQgZmlsZUNvdW50ID0gRHJhZ1F1
ZXJ5RmlsZVcoaGRyb3AsIDB4RkZGRkZGRkYsIDAsIDApOwotICAgICAgICBmb3IgKFVJTlQgaSA9
IDA7IGkgPCBmaWxlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKCFEcmFnUXVlcnlGaWxl
VyhoZHJvcCwgaSwgZmlsZW5hbWUsIFdURl9BUlJBWV9MRU5HVEgoZmlsZW5hbWUpKSkKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGZpbGVzLT5hcHBlbmQoRmlsZTo6Y3Jl
YXRlKHJlaW50ZXJwcmV0X2Nhc3Q8VUNoYXIqPihmaWxlbmFtZSksIEZpbGU6OkFsbENvbnRlbnRU
eXBlcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgR2xvYmFsVW5sb2NrKG1lZGl1bS5oR2xvYmFs
KTsKLSAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmbWVkaXVtKTsKLSAgICAgICAgcmV0dXJuIGZp
bGVzLnJlbGVhc2UoKTsKLSAgICB9Ci0gICAgaWYgKCFtX2RyYWdEYXRhTWFwLmNvbnRhaW5zKGNm
SERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQpKQotICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgp
OwotICAgIFZlY3RvcjxTdHJpbmc+IGZpbGVzVmVjdG9yID0gbV9kcmFnRGF0YU1hcC5nZXQoY2ZI
RHJvcEZvcm1hdCgpLT5jZkZvcm1hdCk7Ci0gICAgZm9yIChWZWN0b3I8U3RyaW5nPjo6aXRlcmF0
b3IgaXQgPSBmaWxlc1ZlY3Rvci5iZWdpbigpOyBpdCAhPSBmaWxlc1ZlY3Rvci5lbmQoKTsgKytp
dCkKLSAgICAgICAgZmlsZXMtPmFwcGVuZChGaWxlOjpjcmVhdGUoKml0KSk7Ci0gICAgcmV0dXJu
IGZpbGVzLnJlbGVhc2UoKTsKLSNlbHNlCi0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1
cm4gMDsKLSNlbmRpZgotfQotCi12b2lkIENsaXBib2FyZFdpbjo6c2V0RHJhZ0ltYWdlKENhY2hl
ZEltYWdlKiBpbWFnZSwgTm9kZSAqbm9kZSwgY29uc3QgSW50UG9pbnQgJmxvYykKLXsKLSAgICBp
ZiAoIWNhblNldERyYWdJbWFnZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIGlm
IChtX2RyYWdJbWFnZSkKLSAgICAgICAgbV9kcmFnSW1hZ2UtPnJlbW92ZUNsaWVudCh0aGlzKTsK
LSAgICBtX2RyYWdJbWFnZSA9IGltYWdlOwotICAgIGlmIChtX2RyYWdJbWFnZSkKLSAgICAgICAg
bV9kcmFnSW1hZ2UtPmFkZENsaWVudCh0aGlzKTsKLQotICAgIG1fZHJhZ0xvYyA9IGxvYzsKLSAg
ICBtX2RyYWdJbWFnZUVsZW1lbnQgPSBub2RlOwotfQotCi12b2lkIENsaXBib2FyZFdpbjo6c2V0
RHJhZ0ltYWdlKENhY2hlZEltYWdlKiBpbWcsIGNvbnN0IEludFBvaW50ICZsb2MpCi17Ci0gICAg
c2V0RHJhZ0ltYWdlKGltZywgMCwgbG9jKTsKLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OnNldERy
YWdJbWFnZUVsZW1lbnQoTm9kZSAqbm9kZSwgY29uc3QgSW50UG9pbnQgJmxvYykKLXsKLSAgICBz
ZXREcmFnSW1hZ2UoMCwgbm9kZSwgbG9jKTsKLX0KLQotRHJhZ0ltYWdlUmVmIENsaXBib2FyZFdp
bjo6Y3JlYXRlRHJhZ0ltYWdlKEludFBvaW50JiBsb2MpIGNvbnN0Ci17CiAgICAgSEJJVE1BUCBy
ZXN1bHQgPSAwOwogICAgIGlmIChtX2RyYWdJbWFnZSkgewogI2lmIFVTRShDQUlSTykgfHwgVVNF
KENHKQogICAgICAgICByZXN1bHQgPSBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UobV9kcmFnSW1h
Z2UtPmltYWdlKCkpOyAgICAgICAgCi0gICAgICAgIGxvYyA9IG1fZHJhZ0xvYzsKKyAgICAgICAg
ZHJhZ0xvY2F0aW9uID0gbV9kcmFnTG9jOwogI2Vsc2UKICAgICAgICAgbm90SW1wbGVtZW50ZWQo
KTsKICNlbmRpZgogICAgIH0gZWxzZSBpZiAobV9kcmFnSW1hZ2VFbGVtZW50KSB7CiAgICAgICAg
IE5vZGUqIG5vZGUgPSBtX2RyYWdJbWFnZUVsZW1lbnQuZ2V0KCk7CiAgICAgICAgIHJlc3VsdCA9
IG5vZGUtPmRvY3VtZW50KCktPmZyYW1lKCktPm5vZGVJbWFnZShub2RlKTsKLSAgICAgICAgbG9j
ID0gbV9kcmFnTG9jOworICAgICAgICBkcmFnTG9jYXRpb24gPSBtX2RyYWdMb2M7CiAgICAgfQog
ICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBDYWNoZWRJbWFnZSogZ2V0Q2FjaGVkSW1h
Z2UoRWxlbWVudCogZWxlbWVudCkKK3ZvaWQgQ2xpcGJvYXJkOjpkZWNsYXJlQW5kV3JpdGVEcmFn
SW1hZ2UoRWxlbWVudCogZWxlbWVudCwgY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRp
dGxlLCBGcmFtZSogZnJhbWUpCiB7Ci0gICAgLy8gQXR0ZW1wdCB0byBwdWxsIENhY2hlZEltYWdl
IGZyb20gZWxlbWVudAotICAgIEFTU0VSVChlbGVtZW50KTsKLSAgICBSZW5kZXJPYmplY3QqIHJl
bmRlcmVyID0gZWxlbWVudC0+cmVuZGVyZXIoKTsKLSAgICBpZiAoIXJlbmRlcmVyIHx8ICFyZW5k
ZXJlci0+aXNJbWFnZSgpKSAKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgUmVuZGVySW1h
Z2UqIGltYWdlID0gdG9SZW5kZXJJbWFnZShyZW5kZXJlcik7Ci0gICAgaWYgKGltYWdlLT5jYWNo
ZWRJbWFnZSgpICYmICFpbWFnZS0+Y2FjaGVkSW1hZ2UoKS0+ZXJyb3JPY2N1cnJlZCgpKQotICAg
ICAgICByZXR1cm4gaW1hZ2UtPmNhY2hlZEltYWdlKCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQot
c3RhdGljIHZvaWQgd3JpdGVJbWFnZVRvRGF0YU9iamVjdChJRGF0YU9iamVjdCogZGF0YU9iamVj
dCwgRWxlbWVudCogZWxlbWVudCwgY29uc3QgS1VSTCYgdXJsKQotewotICAgIC8vIFNob3ZlIGlt
YWdlIGRhdGEgaW50byBhIERhdGFPYmplY3QgZm9yIHVzZSBhcyBhIGZpbGUKLSAgICBDYWNoZWRJ
bWFnZSogY2FjaGVkSW1hZ2UgPSBnZXRDYWNoZWRJbWFnZShlbGVtZW50KTsKLSAgICBpZiAoIWNh
Y2hlZEltYWdlIHx8ICFjYWNoZWRJbWFnZS0+aW1hZ2VGb3JSZW5kZXJlcihlbGVtZW50LT5yZW5k
ZXJlcigpKSB8fCAhY2FjaGVkSW1hZ2UtPmlzTG9hZGVkKCkpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIFNoYXJlZEJ1ZmZlciogaW1hZ2VCdWZmZXIgPSBjYWNoZWRJbWFnZS0+aW1hZ2VGb3JSZW5k
ZXJlcihlbGVtZW50LT5yZW5kZXJlcigpKS0+ZGF0YSgpOwotICAgIGlmICghaW1hZ2VCdWZmZXIg
fHwgIWltYWdlQnVmZmVyLT5zaXplKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIEhHTE9CQUwg
aW1hZ2VGaWxlRGVzY3JpcHRvciA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZURlc2NyaXB0b3IodXJs
LnN0cmluZygpLCBlbGVtZW50LT5nZXRBdHRyaWJ1dGUoYWx0QXR0ciksIGNhY2hlZEltYWdlKTsK
LSAgICBpZiAoIWltYWdlRmlsZURlc2NyaXB0b3IpCi0gICAgICAgIHJldHVybjsKLQotICAgIEhH
TE9CQUwgaW1hZ2VGaWxlQ29udGVudCA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoaW1h
Z2VCdWZmZXIpOwotICAgIGlmICghaW1hZ2VGaWxlQ29udGVudCkgewotICAgICAgICBHbG9iYWxG
cmVlKGltYWdlRmlsZURlc2NyaXB0b3IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
U3RyaW5nIGZpbGVOYW1lID0gY2FjaGVkSW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5h
bWUoKTsKLSAgICBIR0xPQkFMIGhEcm9wQ29udGVudCA9IGNyZWF0ZUdsb2JhbEhEcm9wQ29udGVu
dCh1cmwsIGZpbGVOYW1lLCBpbWFnZUJ1ZmZlcik7Ci0gICAgaWYgKCFoRHJvcENvbnRlbnQpIHsK
LSAgICAgICAgR2xvYmFsRnJlZShoRHJvcENvbnRlbnQpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgd3JpdGVGaWxlVG9EYXRhT2JqZWN0KGRhdGFPYmplY3QsIGltYWdlRmlsZURlc2Ny
aXB0b3IsIGltYWdlRmlsZUNvbnRlbnQsIGhEcm9wQ29udGVudCk7Ci19Ci0KLXZvaWQgQ2xpcGJv
YXJkV2luOjpkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UoRWxlbWVudCogZWxlbWVudCwgY29uc3Qg
S1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBGcmFtZSogZnJhbWUpCi17CiAgICAgLy8g
T3JkZXIgaXMgaW1wb3J0YW50IGhlcmUgZm9yIEV4cGxvcmVyJ3Mgc2FrZQotICAgIGlmICghbV93
cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgICByZXR1cm47Ci0gICAgV2ViQ29yZTo6d3JpdGVV
UkwobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybCwgdGl0bGUsIHRydWUsIGZhbHNlKTsK
LQotICAgIHdyaXRlSW1hZ2VUb0RhdGFPYmplY3QobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCks
IGVsZW1lbnQsIHVybCk7Ci0KLSAgICBBdG9taWNTdHJpbmcgaW1hZ2VVUkwgPSBlbGVtZW50LT5n
ZXRBdHRyaWJ1dGUoc3JjQXR0cik7CisgICAgaWYgKCFtX3Bhc3RlYm9hcmQtPndyaXRhYmxlRGF0
YU9iamVjdCgpKQorICAgICAgICByZXR1cm47CisgICAgbV9wYXN0ZWJvYXJkLT53cml0ZVVSTFRv
V3JpdGFibGVEYXRhT2JqZWN0KHVybCwgdGl0bGUpOworICAgIG1fcGFzdGVib2FyZC0+d3JpdGVJ
bWFnZVRvRGF0YU9iamVjdChlbGVtZW50LCB1cmwpOworICAgIEF0b21pY1N0cmluZyBpbWFnZVVS
TCA9IGVsZW1lbnQtPmdldEF0dHJpYnV0ZShIVE1MTmFtZXM6OnNyY0F0dHIpOwogICAgIGlmIChp
bWFnZVVSTC5pc0VtcHR5KCkpIAogICAgICAgICByZXR1cm47CiAKQEAgLTY4OCwxMzEgKzc4LDgg
QEANCiAgICAgVmVjdG9yPGNoYXI+IGRhdGE7CiAgICAgbWFya3VwVG9DRkhUTUwoY3JlYXRlTWFy
a3VwKGVsZW1lbnQsIEluY2x1ZGVOb2RlLCAwLCBSZXNvbHZlQWxsVVJMcyksICIiLCBkYXRhKTsK
ICAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7Ci0gICAgaWYgKG1l
ZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShodG1s
Rm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKKyAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJ
TEVEKG1fcGFzdGVib2FyZC0+d3JpdGFibGVEYXRhT2JqZWN0KCktPlNldERhdGEoaHRtbEZvcm1h
dCgpLCAmbWVkaXVtLCBUUlVFKSkpCiAgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2Jh
bCk7CiB9CiAKLXZvaWQgQ2xpcGJvYXJkV2luOjp3cml0ZVVSTChjb25zdCBLVVJMJiBrdXJsLCBj
b25zdCBTdHJpbmcmIHRpdGxlU3RyLCBGcmFtZSopCi17Ci0gICAgaWYgKCFtX3dyaXRhYmxlRGF0
YU9iamVjdCkKLSAgICAgICAgIHJldHVybjsKLSAgICBXZWJDb3JlOjp3cml0ZVVSTChtX3dyaXRh
YmxlRGF0YU9iamVjdC5nZXQoKSwga3VybCwgdGl0bGVTdHIsIHRydWUsIHRydWUpOwotCi0gICAg
U3RyaW5nIHVybCA9IGt1cmwuc3RyaW5nKCk7Ci0gICAgQVNTRVJUKHVybC5jb250YWluc09ubHlB
U0NJSSgpKTsgLy8gS1VSTDo6c3RyaW5nKCkgaXMgVVJMIGVuY29kZWQuCi0KLSAgICBTdHJpbmcg
ZnNQYXRoID0gZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JUaXRsZSh1cmwsIHRpdGxlU3RyLCBMIi5V
UkwiLCB0cnVlKTsKLSAgICBTdHJpbmcgY29udGVudFN0cmluZygiW0ludGVybmV0U2hvcnRjdXRd
XHJcblVSTD0iICsgdXJsICsgIlxyXG4iKTsKLSAgICBDU3RyaW5nIGNvbnRlbnQgPSBjb250ZW50
U3RyaW5nLmxhdGluMSgpOwotCi0gICAgaWYgKGZzUGF0aC5sZW5ndGgoKSA8PSAwKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBIR0xPQkFMIHVybEZpbGVEZXNjcmlwdG9yID0gR2xvYmFsQWxsb2Mo
R1BUUiwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKLSAgICBpZiAoIXVybEZpbGVEZXNj
cmlwdG9yKQotICAgICAgICByZXR1cm47Ci0KLSAgICBIR0xPQkFMIHVybEZpbGVDb250ZW50ID0g
R2xvYmFsQWxsb2MoR1BUUiwgY29udGVudC5sZW5ndGgoKSk7Ci0gICAgaWYgKCF1cmxGaWxlQ29u
dGVudCkgewotICAgICAgICBHbG9iYWxGcmVlKHVybEZpbGVEZXNjcmlwdG9yKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIEZJTEVHUk9VUERFU0NSSVBUT1IqIGZnZCA9IHN0YXRpY19j
YXN0PEZJTEVHUk9VUERFU0NSSVBUT1IqPihHbG9iYWxMb2NrKHVybEZpbGVEZXNjcmlwdG9yKSk7
Ci0gICAgWmVyb01lbW9yeShmZ2QsIHNpemVvZihGSUxFR1JPVVBERVNDUklQVE9SKSk7Ci0gICAg
ZmdkLT5jSXRlbXMgPSAxOwotICAgIGZnZC0+ZmdkWzBdLmR3RmxhZ3MgPSBGRF9GSUxFU0laRTsK
LSAgICBmZ2QtPmZnZFswXS5uRmlsZVNpemVMb3cgPSBjb250ZW50Lmxlbmd0aCgpOwotCi0gICAg
dW5zaWduZWQgbWF4U2l6ZSA9IG1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgo
ZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lKSk7Ci0gICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmls
ZU5hbWUsIGZzUGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKLSAg
ICBHbG9iYWxVbmxvY2sodXJsRmlsZURlc2NyaXB0b3IpOwotCi0gICAgY2hhciogZmlsZUNvbnRl
bnRzID0gc3RhdGljX2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2sodXJsRmlsZUNvbnRlbnQpKTsKLSAg
ICBDb3B5TWVtb3J5KGZpbGVDb250ZW50cywgY29udGVudC5kYXRhKCksIGNvbnRlbnQubGVuZ3Ro
KCkpOwotICAgIEdsb2JhbFVubG9jayh1cmxGaWxlQ29udGVudCk7Ci0KLSAgICB3cml0ZUZpbGVU
b0RhdGFPYmplY3QobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybEZpbGVEZXNjcmlwdG9y
LCB1cmxGaWxlQ29udGVudCwgMCk7Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjp3cml0ZVJhbmdl
KFJhbmdlKiBzZWxlY3RlZFJhbmdlLCBGcmFtZSogZnJhbWUpCi17Ci0gICAgQVNTRVJUKHNlbGVj
dGVkUmFuZ2UpOwotICAgIGlmICghbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgICByZXR1
cm47Ci0KLSAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OwotICAgIG1lZGl1bS50eW1lZCA9IFRZ
TUVEX0hHTE9CQUw7Ci0KLSAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKLSAgICBtYXJrdXBUb0NGSFRN
TChjcmVhdGVNYXJrdXAoc2VsZWN0ZWRSYW5nZSwgMCwgQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSks
Ci0gICAgICAgIHNlbGVjdGVkUmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCktPmRvY3VtZW50KCktPnVy
bCgpLnN0cmluZygpLCBkYXRhKTsKLSAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERh
dGEoZGF0YSk7Ci0gICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0
YU9iamVjdC0+U2V0RGF0YShodG1sRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAg
OjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKLQotICAgIFN0cmluZyBzdHIgPSBmcmFtZS0+
ZWRpdG9yKCkuc2VsZWN0ZWRUZXh0Rm9yQ2xpcGJvYXJkKCk7Ci0gICAgcmVwbGFjZU5ld2xpbmVz
V2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVzKHN0cik7Ci0gICAgcmVwbGFjZU5CU1BXaXRoU3BhY2Uo
c3RyKTsKLSAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoc3RyKTsKLSAgICBp
ZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRh
KHBsYWluVGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICA6Okdsb2JhbEZy
ZWUobWVkaXVtLmhHbG9iYWwpOwotCi0gICAgbWVkaXVtLmhHbG9iYWwgPSAwOwotICAgIGlmIChm
cmFtZS0+ZWRpdG9yKCkuY2FuU21hcnRDb3B5T3JEZWxldGUoKSkKLSAgICAgICAgbV93cml0YWJs
ZURhdGFPYmplY3QtPlNldERhdGEoc21hcnRQYXN0ZUZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKTsK
LX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OndyaXRlUGxhaW5UZXh0KGNvbnN0IFN0cmluZyYgdGV4
dCkKLXsKLSAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQotICAgICAgICByZXR1cm47Ci0g
ICAgCi0gICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAgICBtZWRpdW0udHltZWQgPSBUWU1F
RF9IR0xPQkFMOwotICAgIAotICAgIFN0cmluZyBzdHIgPSB0ZXh0OwotICAgIHJlcGxhY2VOZXds
aW5lc1dpdGhXaW5kb3dzU3R5bGVOZXdsaW5lcyhzdHIpOwotICAgIHJlcGxhY2VOQlNQV2l0aFNw
YWNlKHN0cik7Ci0gICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKHN0cik7Ci0g
ICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0
RGF0YShwbGFpblRleHRXRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgOjpHbG9i
YWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsgICAgICAgIAotCi0gICAgbWVkaXVtLmhHbG9iYWwgPSAw
OwotfQotICAgIAotYm9vbCBDbGlwYm9hcmRXaW46Omhhc0RhdGEoKQotewotICAgIGlmICghbV9k
YXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBpZiAobV9kYXRhT2JqZWN0KSB7Ci0gICAgICAgIENPTVB0cjxJRW51bUZPUk1B
VEVUQz4gaXRyOwotICAgICAgICBpZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+RW51bUZvcm1hdEV0
YyhEQVRBRElSX0dFVCwgJml0cikpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
ICAgIGlmICghaXRyKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEZPUk1B
VEVUQyBkYXRhOwotCi0gICAgICAgIC8vIElFbnVtRk9STUFURVRDOjpOZXh0IHJldHVybnMgU19G
QUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcy4KLSAgICAgICAgaWYgKGl0ci0+TmV4dCgx
LCAmZGF0YSwgMCkgPT0gU19PSykgewotICAgICAgICAgICAgLy8gVGhlcmUgaXMgYXQgbGVhc3Qg
b25lIGl0ZW0gaW4gdGhlIElEYXRhT2JqZWN0Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuICFtX2Ry
YWdEYXRhTWFwLmlzRW1wdHkoKTsKLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OnNldEV4dGVybmFs
RGF0YU9iamVjdChJRGF0YU9iamVjdCAqZGF0YU9iamVjdCkKLXsKLSAgICBBU1NFUlQoaXNGb3JE
cmFnQW5kRHJvcCgpKTsKLQotICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0ID0gMDsKLSAgICBtX2Rh
dGFPYmplY3QgPSBkYXRhT2JqZWN0OwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgNCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgJKHJldmlzaW9u
IDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgJ
KHdvcmtpbmcgY29weSkNCkBAIC0xLDEwMSArMCwwIEBADQotLyoKLSAqIENvcHlyaWdodCAoQykg
MjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0K
LSNpZm5kZWYgQ2xpcGJvYXJkV2luX2gKLSNkZWZpbmUgQ2xpcGJvYXJkV2luX2gKLQotI2luY2x1
ZGUgIkNPTVB0ci5oIgotI2luY2x1ZGUgIkNhY2hlZEltYWdlQ2xpZW50LmgiCi0jaW5jbHVkZSAi
Q2xpcGJvYXJkLmgiCi0jaW5jbHVkZSAiRHJhZ0RhdGEuaCIKLQotc3RydWN0IElEYXRhT2JqZWN0
OwotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIENhY2hlZEltYWdlOwotY2xhc3MgRnJh
bWU7Ci1jbGFzcyBJbnRQb2ludDsKLWNsYXNzIFdDRGF0YU9iamVjdDsKLQotLy8gU3RhdGUgYXZh
aWxhYmxlIGR1cmluZyBJRSdzIGV2ZW50cyBmb3IgZHJhZyBhbmQgZHJvcCBhbmQgY29weS9wYXN0
ZQotY2xhc3MgQ2xpcGJvYXJkV2luIDogcHVibGljIENsaXBib2FyZCwgcHVibGljIENhY2hlZElt
YWdlQ2xpZW50IHsKLSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBz
dGF0aWMgUGFzc1JlZlB0cjxDbGlwYm9hcmRXaW4+IGNyZWF0ZShDbGlwYm9hcmRUeXBlIGNsaXBi
b2FyZFR5cGUsIElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3kg
cG9saWN5LCBGcmFtZSogZnJhbWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3
IENsaXBib2FyZFdpbihjbGlwYm9hcmRUeXBlLCBkYXRhT2JqZWN0LCBwb2xpY3ksIGZyYW1lKSk7
Ci0gICAgfQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPENsaXBib2FyZFdpbj4gY3JlYXRlKENsaXBi
b2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgV0NEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBDbGlwYm9h
cmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBGcmFtZSogZnJhbWUpCi0gICAgewotICAgICAgICByZXR1
cm4gYWRvcHRSZWYobmV3IENsaXBib2FyZFdpbihjbGlwYm9hcmRUeXBlLCBkYXRhT2JqZWN0LCBw
b2xpY3ksIGZyYW1lKSk7Ci0gICAgfQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPENsaXBib2FyZFdp
bj4gY3JlYXRlKENsaXBib2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgY29uc3QgRHJhZ0RhdGFNYXAm
IGRhdGFNYXAsIENsaXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2xpcGJvYXJkV2luKGNsaXBib2FyZFR5
cGUsIGRhdGFNYXAsIHBvbGljeSwgZnJhbWUpKTsKLSAgICB9Ci0gICAgfkNsaXBib2FyZFdpbigp
OwotCi0gICAgdm9pZCBjbGVhckRhdGEoY29uc3QgU3RyaW5nJiB0eXBlKTsKLSAgICB2b2lkIGNs
ZWFyRGF0YSgpOwotICAgIFN0cmluZyBnZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSkgY29uc3Q7
Ci0gICAgYm9vbCBzZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBkYXRh
KTsKLQotICAgIC8vIGV4dGVuc2lvbnMgYmV5b25kIElFJ3MgQVBJCi0gICAgdmlydHVhbCBMaXN0
SGFzaFNldDxTdHJpbmc+IHR5cGVzKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPEZp
bGVMaXN0PiBmaWxlcygpIGNvbnN0OwotCi0gICAgdm9pZCBzZXREcmFnSW1hZ2UoQ2FjaGVkSW1h
Z2UqLCBjb25zdCBJbnRQb2ludCYpOwotICAgIHZvaWQgc2V0RHJhZ0ltYWdlRWxlbWVudChOb2Rl
KiwgY29uc3QgSW50UG9pbnQmKTsKLQotICAgIHZpcnR1YWwgRHJhZ0ltYWdlUmVmIGNyZWF0ZURy
YWdJbWFnZShJbnRQb2ludCYgZHJhZ0xvYykgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGRlY2xh
cmVBbmRXcml0ZURyYWdJbWFnZShFbGVtZW50KiwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYg
dGl0bGUsIEZyYW1lKik7Ci0gICAgdmlydHVhbCB2b2lkIHdyaXRlVVJMKGNvbnN0IEtVUkwmLCBj
b25zdCBTdHJpbmcmLCBGcmFtZSopOwotICAgIHZpcnR1YWwgdm9pZCB3cml0ZVJhbmdlKFJhbmdl
KiwgRnJhbWUqKTsKLSAgICB2aXJ0dWFsIHZvaWQgd3JpdGVQbGFpblRleHQoY29uc3QgU3RyaW5n
Jik7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzRGF0YSgpOwotCi0gICAgQ09NUHRyPElEYXRhT2Jq
ZWN0PiBkYXRhT2JqZWN0KCkgeyByZXR1cm4gbV9kYXRhT2JqZWN0OyB9Ci0KLSAgICB2b2lkIHNl
dEV4dGVybmFsRGF0YU9iamVjdChJRGF0YU9iamVjdCAqZGF0YU9iamVjdCk7Ci0KLXByaXZhdGU6
Ci0gICAgQ2xpcGJvYXJkV2luKENsaXBib2FyZFR5cGUsIElEYXRhT2JqZWN0KiwgQ2xpcGJvYXJk
QWNjZXNzUG9saWN5LCBGcmFtZSopOwotICAgIENsaXBib2FyZFdpbihDbGlwYm9hcmRUeXBlLCBX
Q0RhdGFPYmplY3QqLCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3ksIEZyYW1lKik7Ci0gICAgQ2xpcGJv
YXJkV2luKENsaXBib2FyZFR5cGUsIGNvbnN0IERyYWdEYXRhTWFwJiwgQ2xpcGJvYXJkQWNjZXNz
UG9saWN5LCBGcmFtZSopOwotCi0gICAgdm9pZCByZXNldEZyb21DbGlwYm9hcmQoKTsKLSAgICB2
b2lkIHNldERyYWdJbWFnZShDYWNoZWRJbWFnZSosIE5vZGUqLCBjb25zdCBJbnRQb2ludCYpOwot
Ci0gICAgQ09NUHRyPElEYXRhT2JqZWN0PiBtX2RhdGFPYmplY3Q7Ci0gICAgQ09NUHRyPFdDRGF0
YU9iamVjdD4gbV93cml0YWJsZURhdGFPYmplY3Q7Ci0gICAgRHJhZ0RhdGFNYXAgbV9kcmFnRGF0
YU1hcDsKLSAgICBGcmFtZSogbV9mcmFtZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
LQotI2VuZGlmIC8vIENsaXBib2FyZFdpbl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS93aW4vRWRpdG9yV2luLmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL3dpbi9FZGl0b3JXaW4uY3BwCShyZXZpc2lvbiAxNTA2MjkpDQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vd2luL0VkaXRvcldpbi5jcHAJKHdvcmtpbmcgY29weSkNCkBAIC0yNSwxNSAr
MjUsMTcgQEANCiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJFZGl0b3IuaCIKLSNp
bmNsdWRlICJFZGl0b3JDbGllbnQuaCIKIAotI2luY2x1ZGUgIkNsaXBib2FyZFdpbi5oIgorI2lu
Y2x1ZGUgIkNPTVB0ci5oIgorI2luY2x1ZGUgIkNsaXBib2FyZC5oIgogI2luY2x1ZGUgIkRvY3Vt
ZW50LmgiCisjaW5jbHVkZSAiRWRpdG9yQ2xpZW50LmgiCiAjaW5jbHVkZSAiRWxlbWVudC5oIgog
I2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKKyNpbmNsdWRlICJQ
YXN0ZWJvYXJkLmgiCiAjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiVmlzaWJs
ZVVuaXRzLmgiCisjaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKIAogI2luY2x1ZGUgPHdpbmRvd3Mu
aD4KIApAQCAtNDYsOCArNDgsOSBAQA0KICAgICBpZiAoIVNVQ0NFRURFRChPbGVHZXRDbGlwYm9h
cmQoJmNsaXBib2FyZERhdGEpKSkKICAgICAgICAgY2xpcGJvYXJkRGF0YSA9IDA7CiAjZW5kaWYK
LQotICAgIHJldHVybiBDbGlwYm9hcmRXaW46OmNyZWF0ZShDbGlwYm9hcmQ6OkNvcHlBbmRQYXN0
ZSwgY2xpcGJvYXJkRGF0YS5nZXQoKSwgcG9saWN5LCBmcmFtZSk7CisgICAgUmVmUHRyPENsaXBi
b2FyZD4gY2xpcGJvYXJkID0gQ2xpcGJvYXJkOjpjcmVhdGVGb3JDb3B5QW5kUGFzdGUocG9saWN5
KTsKKyAgICBjb25zdF9jYXN0PFBhc3RlYm9hcmQmPihjbGlwYm9hcmQtPnBhc3RlYm9hcmQoKSku
c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KGNsaXBib2FyZERhdGEuZ2V0KCkpOworICAgIHJldHVybiBj
bGlwYm9hcmQucmVsZWFzZSgpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHANCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdpbi5jcHAJKHJldmlz
aW9uIDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGFzdGVib2FyZFdp
bi5jcHAJKHdvcmtpbmcgY29weSkNCkBAIC0xLDUgKzEsNiBAQA0KIC8qCiAgKiBDb3B5cmlnaHQg
KEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly
aWdodCAoQykgMjAxMyBYdWVxaW5nIEh1YW5nIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgogICoK
ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zNCw2ICszNSw4IEBADQogI2luY2x1ZGUg
IkVkaXRvci5oIgogI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJGcmFtZS5oIgorI2lu
Y2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhUTUxQYXJzZXJJZGlvbXMuaCIKICNpbmNs
dWRlICJIV25kREMuaCIKICNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCiAjaW5jbHVkZSAiSW1h
Z2UuaCIKQEAgLTQyLDYgKzQ1LDcgQEANCiAjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlJh
bmdlLmgiCiAjaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmZXIu
aCIKICNpbmNsdWRlICJUZXh0RW5jb2RpbmcuaCIKICNpbmNsdWRlICJXZWJDb3JlSW5zdGFuY2VI
YW5kbGUuaCIKICNpbmNsdWRlICJXaW5kb3dzRXh0cmFzLmgiCkBAIC01MCw2ICs1NCw5IEBADQog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKKy8vIFdlIHByb3ZpZGUgdGhlIElFIGNsaXBib2FyZCB0
eXBlcyAoVVJMIGFuZCBUZXh0KSwgYW5kIHRoZSBjbGlwYm9hcmQgdHlwZXMgc3BlY2lmaWVkIGlu
IHRoZSBXSEFUV0cgV2ViIEFwcGxpY2F0aW9ucyAxLjAgZHJhZnQKKy8vIHNlZSBodHRwOi8vd3d3
LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyBTZWN0aW9uIDYuMy41LjMK
Kwogc3RhdGljIFVJTlQgSFRNTENsaXBib2FyZEZvcm1hdCA9IDA7CiBzdGF0aWMgVUlOVCBCb29r
bWFya0NsaXBib2FyZEZvcm1hdCA9IDA7CiBzdGF0aWMgVUlOVCBXZWJTbWFydFBhc3RlRm9ybWF0
ID0gMDsKQEAgLTg5LDggKzk2LDM4IEBADQogICAgIHJldHVybiBwYXN0ZWJvYXJkOwogfQogCi1Q
YXN0ZWJvYXJkOjpQYXN0ZWJvYXJkKCkKK1Bhc3NPd25QdHI8UGFzdGVib2FyZD4gUGFzdGVib2Fy
ZDo6Y3JlYXRlRm9yQ29weUFuZFBhc3RlKCkKIHsKKyAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBh
c3RlYm9hcmQpOworfQorCitQYXNzT3duUHRyPFBhc3RlYm9hcmQ+IFBhc3RlYm9hcmQ6OmNyZWF0
ZVByaXZhdGUoKQoreworICAgIC8vIFdpbmRvd3MgaGFzIG5vdCAiUHJpdmF0ZSBwYXN0ZWJvYXJk
IiBjb25jZXB0LgorICAgIHJldHVybiBjcmVhdGVGb3JDb3B5QW5kUGFzdGUoKTsKK30KKworI2lm
IEVOQUJMRShEUkFHX1NVUFBPUlQpCitQYXNzT3duUHRyPFBhc3RlYm9hcmQ+IFBhc3RlYm9hcmQ6
OmNyZWF0ZUZvckRyYWdBbmREcm9wKCkKK3sKKyAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBkYXRh
T2JqZWN0OworICAgIFdDRGF0YU9iamVjdDo6Y3JlYXRlSW5zdGFuY2UoJmRhdGFPYmplY3QpOwor
ICAgIHJldHVybiBhZG9wdFB0cihuZXcgUGFzdGVib2FyZChkYXRhT2JqZWN0LmdldCgpKSk7Cit9
CisKKy8vIHN0YXRpYworUGFzc093blB0cjxQYXN0ZWJvYXJkPiBQYXN0ZWJvYXJkOjpjcmVhdGVG
b3JEcmFnQW5kRHJvcChjb25zdCBEcmFnRGF0YSYgZHJhZ0RhdGEpCit7CisgICAgaWYgKGRyYWdE
YXRhLnBsYXRmb3JtRGF0YSgpKQorICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBhc3RlYm9h
cmQoZHJhZ0RhdGEucGxhdGZvcm1EYXRhKCkpKTsKKyAgICAvLyBXZSBjb3VsZCBub3QgY2FsbCBE
cmFnRGF0YTo6ZHJhZ0RhdGFNYXAgdmlhIHxjb25zdCBEcmFnRGF0YSZ8LgorICAgIGNvbnN0IERy
YWdEYXRhTWFwJiBkcmFnRGF0YU1hcCA9IGNvbnN0X2Nhc3Q8RHJhZ0RhdGEqPigoJmRyYWdEYXRh
KSktPmRyYWdEYXRhTWFwKCk7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBQYXN0ZWJvYXJkKGRy
YWdEYXRhTWFwKSk7Cit9CisjZW5kaWYKKwordm9pZCBQYXN0ZWJvYXJkOjpmaW5pc2hDcmVhdGlu
Z1Bhc3RlYm9hcmQoKQorewogICAgIFdORENMQVNTIHdjOwogICAgIG1lbXNldCgmd2MsIDAsIHNp
emVvZihXTkRDTEFTUykpOwogICAgIHdjLmxwZm5XbmRQcm9jICAgID0gUGFzdGVib2FyZE93bmVy
V25kUHJvYzsKQEAgLTEwNiw2ICsxNDMsMzUgQEANCiAgICAgV2ViU21hcnRQYXN0ZUZvcm1hdCA9
IDo6UmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJXZWJLaXQgU21hcnQgUGFzdGUgRm9ybWF0Iik7
CiB9CiAKK1Bhc3RlYm9hcmQ6OlBhc3RlYm9hcmQoKQorICAgIDogbV9kYXRhT2JqZWN0KDApCisg
ICAgLCBtX3dyaXRhYmxlRGF0YU9iamVjdCgwKQoreworICAgIGZpbmlzaENyZWF0aW5nUGFzdGVi
b2FyZCgpOworfQorCitQYXN0ZWJvYXJkOjpQYXN0ZWJvYXJkKElEYXRhT2JqZWN0KiBkYXRhT2Jq
ZWN0KQorICAgIDogbV9kYXRhT2JqZWN0KGRhdGFPYmplY3QpCisgICAgLCBtX3dyaXRhYmxlRGF0
YU9iamVjdCgwKQoreworICAgIGZpbmlzaENyZWF0aW5nUGFzdGVib2FyZCgpOworfQorCitQYXN0
ZWJvYXJkOjpQYXN0ZWJvYXJkKFdDRGF0YU9iamVjdCogZGF0YU9iamVjdCkKKyAgICA6IG1fZGF0
YU9iamVjdChkYXRhT2JqZWN0KQorICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoZGF0YU9iamVj
dCkKK3sKKyAgICBmaW5pc2hDcmVhdGluZ1Bhc3RlYm9hcmQoKTsKK30KKworUGFzdGVib2FyZDo6
UGFzdGVib2FyZChjb25zdCBEcmFnRGF0YU1hcCYgZGF0YU1hcCkKKyAgICA6IG1fZGF0YU9iamVj
dCgwKQorICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoMCkKKyAgICAsIG1fZHJhZ0RhdGFNYXAo
ZGF0YU1hcCkKK3sKKyAgICBmaW5pc2hDcmVhdGluZ1Bhc3RlYm9hcmQoKTsKK30KKwogdm9pZCBQ
YXN0ZWJvYXJkOjpjbGVhcigpCiB7CiAgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkg
ewpAQCAtMTE0LDYgKzE4MCwyNzEgQEANCiAgICAgfQogfQogCitlbnVtIENsaXBib2FyZERhdGFU
eXBlIHsgQ2xpcGJvYXJkRGF0YVR5cGVOb25lLCBDbGlwYm9hcmREYXRhVHlwZVVSTCwgQ2xpcGJv
YXJkRGF0YVR5cGVUZXh0LCBDbGlwYm9hcmREYXRhVHlwZVRleHRIVE1MIH07CisKK3N0YXRpYyBD
bGlwYm9hcmREYXRhVHlwZSBjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKGNvbnN0IFN0cmluZyYg
dHlwZSkKK3sKKyAgICBTdHJpbmcgcVR5cGUgPSB0eXBlLnN0cmlwV2hpdGVTcGFjZSgpLmxvd2Vy
KCk7CisKKyAgICAvLyB0d28gc3BlY2lhbCBjYXNlcyBmb3IgSUUgY29tcGF0aWJpbGl0eQorICAg
IGlmIChxVHlwZSA9PSAidGV4dCIgfHwgcVR5cGUgPT0gInRleHQvcGxhaW4iIHx8IHFUeXBlLnN0
YXJ0c1dpdGgoInRleHQvcGxhaW47IikpCisgICAgICAgIHJldHVybiBDbGlwYm9hcmREYXRhVHlw
ZVRleHQ7CisgICAgaWYgKHFUeXBlID09ICJ1cmwiIHx8IHFUeXBlID09ICJ0ZXh0L3VyaS1saXN0
IikKKyAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVVJMOworICAgIGlmIChxVHlwZSA9
PSAidGV4dC9odG1sIikKKyAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVGV4dEhUTUw7
CisKKyAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVOb25lOworfQorCit2b2lkIFBhc3RlYm9h
cmQ6OmNsZWFyKGNvbnN0IFN0cmluZyYgdHlwZSkKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRh
T2JqZWN0KQorICAgICAgICByZXR1cm47CisKKyAgICBDbGlwYm9hcmREYXRhVHlwZSBkYXRhVHlw
ZSA9IGNsaXBib2FyZFR5cGVGcm9tTUlNRVR5cGUodHlwZSk7CisKKyAgICBpZiAoZGF0YVR5cGUg
PT0gQ2xpcGJvYXJkRGF0YVR5cGVVUkwpIHsKKyAgICAgICAgbV93cml0YWJsZURhdGFPYmplY3Qt
PmNsZWFyRGF0YSh1cmxXRm9ybWF0KCktPmNmRm9ybWF0KTsKKyAgICAgICAgbV93cml0YWJsZURh
dGFPYmplY3QtPmNsZWFyRGF0YSh1cmxGb3JtYXQoKS0+Y2ZGb3JtYXQpOworICAgIH0KKyAgICBp
ZiAoZGF0YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0KSB7CisgICAgICAgIG1fd3JpdGFi
bGVEYXRhT2JqZWN0LT5jbGVhckRhdGEocGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0KTsKKyAg
ICAgICAgbV93cml0YWJsZURhdGFPYmplY3QtPmNsZWFyRGF0YShwbGFpblRleHRXRm9ybWF0KCkt
PmNmRm9ybWF0KTsKKyAgICB9Cit9CisKK2Jvb2wgUGFzdGVib2FyZDo6aGFzRGF0YSgpCit7Cisg
ICAgaWYgKCFtX2RhdGFPYmplY3QgJiYgbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGlmIChtX2RhdGFPYmplY3QpIHsKKyAgICAgICAgQ09NUHRy
PElFbnVtRk9STUFURVRDPiBpdHI7CisgICAgICAgIGlmIChGQUlMRUQobV9kYXRhT2JqZWN0LT5F
bnVtRm9ybWF0RXRjKERBVEFESVJfR0VULCAmaXRyKSkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgaWYgKCFpdHIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAgICAgRk9STUFURVRDIGRhdGE7CisKKyAgICAgICAgLy8gSUVudW1GT1JNQVRFVEM6Ok5leHQg
cmV0dXJucyBTX0ZBTFNFIGlmIHRoZXJlIGFyZSBubyBtb3JlIGl0ZW1zLgorICAgICAgICBpZiAo
aXRyLT5OZXh0KDEsICZkYXRhLCAwKSA9PSBTX09LKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBp
cyBhdCBsZWFzdCBvbmUgaXRlbSBpbiB0aGUgSURhdGFPYmplY3QKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBy
ZXR1cm4gIW1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpOworfQorCitzdGF0aWMgdm9pZCBhZGRNaW1l
VHlwZXNGb3JGb3JtYXQoTGlzdEhhc2hTZXQ8U3RyaW5nPiYgcmVzdWx0cywgY29uc3QgRk9STUFU
RVRDJiBmb3JtYXQpCit7CisgICAgLy8gVVJMIGFuZCBUZXh0IGFyZSBwcm92aWRlZCBmb3IgY29t
cGF0aWJpbGl0eSB3aXRoIElFJ3MgbW9kZWwKKyAgICBpZiAoZm9ybWF0LmNmRm9ybWF0ID09IHVy
bEZvcm1hdCgpLT5jZkZvcm1hdCB8fCBmb3JtYXQuY2ZGb3JtYXQgPT0gdXJsV0Zvcm1hdCgpLT5j
ZkZvcm1hdCkgeworICAgICAgICByZXN1bHRzLmFkZCgiVVJMIik7CisgICAgICAgIHJlc3VsdHMu
YWRkKCJ0ZXh0L3VyaS1saXN0Iik7CisgICAgfQorCisgICAgaWYgKGZvcm1hdC5jZkZvcm1hdCA9
PSBwbGFpblRleHRXRm9ybWF0KCktPmNmRm9ybWF0IHx8IGZvcm1hdC5jZkZvcm1hdCA9PSBwbGFp
blRleHRGb3JtYXQoKS0+Y2ZGb3JtYXQpIHsKKyAgICAgICAgcmVzdWx0cy5hZGQoIlRleHQiKTsK
KyAgICAgICAgcmVzdWx0cy5hZGQoInRleHQvcGxhaW4iKTsKKyAgICB9Cit9CisKK0xpc3RIYXNo
U2V0PFN0cmluZz4gUGFzdGVib2FyZDo6dHlwZXMoKQoreworICAgIExpc3RIYXNoU2V0PFN0cmlu
Zz4gcmVzdWx0czsKKworICAgIGlmICghbV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNF
bXB0eSgpKQorICAgICAgICByZXR1cm4gcmVzdWx0czsKKworICAgIGlmIChtX2RhdGFPYmplY3Qp
IHsKKyAgICAgICAgQ09NUHRyPElFbnVtRk9STUFURVRDPiBpdHI7CisKKyAgICAgICAgaWYgKEZB
SUxFRChtX2RhdGFPYmplY3QtPkVudW1Gb3JtYXRFdGMoREFUQURJUl9HRVQsICZpdHIpKSkKKyAg
ICAgICAgICAgIHJldHVybiByZXN1bHRzOworCisgICAgICAgIGlmICghaXRyKQorICAgICAgICAg
ICAgcmV0dXJuIHJlc3VsdHM7CisKKyAgICAgICAgRk9STUFURVRDIGRhdGE7CisKKyAgICAgICAg
Ly8gSUVudW1GT1JNQVRFVEM6Ok5leHQgcmV0dXJucyBTX0ZBTFNFIGlmIHRoZXJlIGFyZSBubyBt
b3JlIGl0ZW1zLgorICAgICAgICB3aGlsZSAoaXRyLT5OZXh0KDEsICZkYXRhLCAwKSA9PSBTX09L
KQorICAgICAgICAgICAgYWRkTWltZVR5cGVzRm9yRm9ybWF0KHJlc3VsdHMsIGRhdGEpOworICAg
IH0gZWxzZSB7CisgICAgICAgIGZvciAoRHJhZ0RhdGFNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
bV9kcmFnRGF0YU1hcC5iZWdpbigpOyBpdCAhPSBtX2RyYWdEYXRhTWFwLmVuZCgpOyArK2l0KSB7
CisgICAgICAgICAgICBGT1JNQVRFVEMgZGF0YTsKKyAgICAgICAgICAgIGRhdGEuY2ZGb3JtYXQg
PSAoKml0KS5rZXk7CisgICAgICAgICAgICBhZGRNaW1lVHlwZXNGb3JGb3JtYXQocmVzdWx0cywg
ZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0czsKK30KKworU3Ry
aW5nIFBhc3RlYm9hcmQ6OnJlYWRTdHJpbmcoY29uc3QgU3RyaW5nJiB0eXBlKQoreworICAgIGlm
ICghbV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm4gIiI7CisKKyAgICBDbGlwYm9hcmREYXRhVHlwZSBkYXRhVHlwZSA9IGNsaXBib2FyZFR5cGVG
cm9tTUlNRVR5cGUodHlwZSk7CisgICAgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBl
VGV4dCkKKyAgICAgICAgcmV0dXJuIG1fZGF0YU9iamVjdCA/IGdldFBsYWluVGV4dChtX2RhdGFP
YmplY3QuZ2V0KCkpIDogZ2V0UGxhaW5UZXh0KCZtX2RyYWdEYXRhTWFwKTsKKyAgICBpZiAoZGF0
YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVVUkwpCisgICAgICAgIHJldHVybiBtX2RhdGFPYmpl
Y3QgPyBnZXRVUkwobV9kYXRhT2JqZWN0LmdldCgpLCBEcmFnRGF0YTo6RG9Ob3RDb252ZXJ0Rmls
ZW5hbWVzKSA6IGdldFVSTCgmbV9kcmFnRGF0YU1hcCwgRHJhZ0RhdGE6OkRvTm90Q29udmVydEZp
bGVuYW1lcyk7CisgICAgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBlVGV4dEhUTUwp
IHsKKyAgICAgICAgU3RyaW5nIGRhdGEgPSBtX2RhdGFPYmplY3QgPyBnZXRUZXh0SFRNTChtX2Rh
dGFPYmplY3QuZ2V0KCkpIDogZ2V0VGV4dEhUTUwoJm1fZHJhZ0RhdGFNYXApOworICAgICAgICBp
ZiAoIWRhdGEuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgIHJl
dHVybiBtX2RhdGFPYmplY3QgPyBnZXRDRkhUTUwobV9kYXRhT2JqZWN0LmdldCgpKSA6IGdldENG
SFRNTCgmbV9kcmFnRGF0YU1hcCk7CisgICAgfQorCisgICAgcmV0dXJuICIiOworfQorCitWZWN0
b3I8U3RyaW5nPiBQYXN0ZWJvYXJkOjpyZWFkRmlsZW5hbWVzKCkKK3sKKyNpZiBVU0UoQ0YpCisg
ICAgVmVjdG9yPFN0cmluZz4gZmlsZU5hbWVzOworCisgICAgaWYgKG1fZGF0YU9iamVjdCkgewor
ICAgICAgICBTVEdNRURJVU0gbWVkaXVtOworICAgICAgICBpZiAoRkFJTEVEKG1fZGF0YU9iamVj
dC0+R2V0RGF0YShjZkhEcm9wRm9ybWF0KCksICZtZWRpdW0pKSkKKyAgICAgICAgICAgIHJldHVy
biBmaWxlTmFtZXM7CisKKyAgICAgICAgSERST1AgaGRyb3AgPSByZWludGVycHJldF9jYXN0PEhE
Uk9QPihHbG9iYWxMb2NrKG1lZGl1bS5oR2xvYmFsKSk7CisgICAgICAgIGlmICghaGRyb3ApCisg
ICAgICAgICAgICByZXR1cm4gZmlsZU5hbWVzOworCisgICAgICAgIFdDSEFSIGZpbGVuYW1lW01B
WF9QQVRIXTsKKyAgICAgICAgVUlOVCBmaWxlQ291bnQgPSBEcmFnUXVlcnlGaWxlVyhoZHJvcCwg
MHhGRkZGRkZGRiwgMCwgMCk7CisgICAgICAgIGZvciAoVUlOVCBpID0gMDsgaSA8IGZpbGVDb3Vu
dDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIURyYWdRdWVyeUZpbGVXKGhkcm9wLCBpLCBmaWxl
bmFtZSwgV1RGX0FSUkFZX0xFTkdUSChmaWxlbmFtZSkpKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgZmlsZU5hbWVzLmFwcGVuZChmaWxlbmFtZSk7CisgICAgICAgIH0K
KworICAgICAgICBHbG9iYWxVbmxvY2sobWVkaXVtLmhHbG9iYWwpOworICAgICAgICBSZWxlYXNl
U3RnTWVkaXVtKCZtZWRpdW0pOworICAgICAgICByZXR1cm4gZmlsZU5hbWVzOworICAgIH0KKyAg
ICBpZiAoIW1fZHJhZ0RhdGFNYXAuY29udGFpbnMoY2ZIRHJvcEZvcm1hdCgpLT5jZkZvcm1hdCkp
CisgICAgICAgIHJldHVybiBmaWxlTmFtZXM7CisgICAgcmV0dXJuIG1fZHJhZ0RhdGFNYXAuZ2V0
KGNmSERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQpOworI2Vsc2UKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBib29sIHdyaXRlVVJMKFdDRGF0
YU9iamVjdCAqZGF0YSwgY29uc3QgS1VSTCYgdXJsLCBTdHJpbmcgdGl0bGUsIGJvb2wgd2l0aFBs
YWluVGV4dCwgYm9vbCB3aXRoSFRNTCkKK3sKKyAgICBBU1NFUlQoZGF0YSk7CisKKyAgICBpZiAo
dXJsLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHRpdGxlLmlz
RW1wdHkoKSkgeworICAgICAgICB0aXRsZSA9IHVybC5sYXN0UGF0aENvbXBvbmVudCgpOworICAg
ICAgICBpZiAodGl0bGUuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGl0bGUgPSB1cmwuaG9zdCgp
OworICAgIH0KKworICAgIFNUR01FRElVTSBtZWRpdW0gPSB7MH07CisgICAgbWVkaXVtLnR5bWVk
ID0gVFlNRURfSEdMT0JBTDsKKworICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0
YSh1cmwsIHRpdGxlKTsKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBpZiAobWVkaXVt
LmhHbG9iYWwgJiYgRkFJTEVEKGRhdGEtPlNldERhdGEodXJsV0Zvcm1hdCgpLCAmbWVkaXVtLCBU
UlVFKSkpCisgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7CisgICAgZWxzZQor
ICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKworICAgIGlmICh3aXRoSFRNTCkgeworICAgICAgICBW
ZWN0b3I8Y2hhcj4gY2ZodG1sRGF0YTsKKyAgICAgICAgbWFya3VwVG9DRkhUTUwodXJsVG9NYXJr
dXAodXJsLCB0aXRsZSksICIiLCBjZmh0bWxEYXRhKTsKKyAgICAgICAgbWVkaXVtLmhHbG9iYWwg
PSBjcmVhdGVHbG9iYWxEYXRhKGNmaHRtbERhdGEpOworICAgICAgICBpZiAobWVkaXVtLmhHbG9i
YWwgJiYgRkFJTEVEKGRhdGEtPlNldERhdGEoaHRtbEZvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkp
CisgICAgICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOworICAgICAgICBlbHNl
CisgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAod2l0aFBsYWlu
VGV4dCkgeworICAgICAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEodXJsLnN0
cmluZygpKTsKKyAgICAgICAgaWYgKG1lZGl1bS5oR2xvYmFsICYmIEZBSUxFRChkYXRhLT5TZXRE
YXRhKHBsYWluVGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQorICAgICAgICAgICAgOjpH
bG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3Vj
Y2VzcyA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK2Jvb2wgUGFz
dGVib2FyZDo6d3JpdGVTdHJpbmcoY29uc3QgU3RyaW5nJiB0eXBlLCBjb25zdCBTdHJpbmcmIGRh
dGEpCit7CisgICAgaWYgKCFtX3dyaXRhYmxlRGF0YU9iamVjdCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgQ2xpcGJvYXJkRGF0YVR5cGUgd2luVHlwZSA9IGNsaXBib2FyZFR5cGVGcm9t
TUlNRVR5cGUodHlwZSk7CisKKyAgICBpZiAod2luVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVS
TCkKKyAgICAgICAgcmV0dXJuIFdlYkNvcmU6OndyaXRlVVJMKG1fd3JpdGFibGVEYXRhT2JqZWN0
LmdldCgpLCBLVVJMKFBhcnNlZFVSTFN0cmluZywgZGF0YSksIFN0cmluZygpLCBmYWxzZSwgdHJ1
ZSk7CisKKyAgICBpZiAod2luVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRleHQpIHsKKyAgICAg
ICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKKyAgICAgICAgbWVkaXVtLnR5bWVkID0gVFlNRURf
SEdMT0JBTDsKKyAgICAgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEp
OworICAgICAgICBpZiAoIW1lZGl1bS5oR2xvYmFsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgICAgIGlmIChGQUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxh
aW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpIHsKKyAgICAgICAgICAgIDo6R2xvYmFs
RnJlZShtZWRpdW0uaEdsb2JhbCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQor
Cit2b2lkIFBhc3RlYm9hcmQ6OnNldERyYWdJbWFnZShEcmFnSW1hZ2VSZWYsIGNvbnN0IEludFBv
aW50JiBob3RTcG90KQoreworICAgIC8vIERvIG5vdGhpbmcgaW4gV2luZG93cy4KK30KKwordm9p
ZCBQYXN0ZWJvYXJkOjp3cml0ZVJhbmdlVG9EYXRhT2JqZWN0KFJhbmdlKiBzZWxlY3RlZFJhbmdl
LCBGcmFtZSogZnJhbWUpCit7CisgICAgQVNTRVJUKHNlbGVjdGVkUmFuZ2UpOworICAgIGlmICgh
bV93cml0YWJsZURhdGFPYmplY3QpCisgICAgICAgIHJldHVybjsKKworICAgIFNUR01FRElVTSBt
ZWRpdW0gPSB7MH07CisgICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKKworICAgIFZl
Y3RvcjxjaGFyPiBkYXRhOworICAgIG1hcmt1cFRvQ0ZIVE1MKGNyZWF0ZU1hcmt1cChzZWxlY3Rl
ZFJhbmdlLCAwLCBBbm5vdGF0ZUZvckludGVyY2hhbmdlKSwKKyAgICAgICAgc2VsZWN0ZWRSYW5n
ZS0+c3RhcnRDb250YWluZXIoKS0+ZG9jdW1lbnQoKS0+dXJsKCkuc3RyaW5nKCksIGRhdGEpOwor
ICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YShkYXRhKTsKKyAgICBpZiAobWVk
aXVtLmhHbG9iYWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKGh0bWxG
b3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQorICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhH
bG9iYWwpOworCisgICAgU3RyaW5nIHN0ciA9IGZyYW1lLT5lZGl0b3IoKS5zZWxlY3RlZFRleHRG
b3JDbGlwYm9hcmQoKTsKKyAgICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3bGlu
ZXMoc3RyKTsKKyAgICByZXBsYWNlTkJTUFdpdGhTcGFjZShzdHIpOworICAgIG1lZGl1bS5oR2xv
YmFsID0gY3JlYXRlR2xvYmFsRGF0YShzdHIpOworICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBG
QUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAm
bWVkaXVtLCBUUlVFKSkpCisgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7CisK
KyAgICBtZWRpdW0uaEdsb2JhbCA9IDA7CisgICAgaWYgKGZyYW1lLT5lZGl0b3IoKS5jYW5TbWFy
dENvcHlPckRlbGV0ZSgpKQorICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShz
bWFydFBhc3RlRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6
OndyaXRlU2VsZWN0aW9uKFJhbmdlKiBzZWxlY3RlZFJhbmdlLCBib29sIGNhblNtYXJ0Q29weU9y
RGVsZXRlLCBGcmFtZSogZnJhbWUsIFNob3VsZFNlcmlhbGl6ZVNlbGVjdGVkVGV4dEZvckNsaXBi
b2FyZCBzaG91bGRTZXJpYWxpemVTZWxlY3RlZFRleHRGb3JDbGlwYm9hcmQpCiB7CiAgICAgY2xl
YXIoKTsKQEAgLTE0NiwxMCArNDc3LDI5IEBADQogICAgICAgICAgICAgOjpTZXRDbGlwYm9hcmRE
YXRhKFdlYlNtYXJ0UGFzdGVGb3JtYXQsIDApOwogICAgICAgICAgICAgOjpDbG9zZUNsaXBib2Fy
ZCgpOwogICAgICAgICB9Ci0gICAgICAgIAogICAgIH0KKworICAgIHdyaXRlUmFuZ2VUb0RhdGFP
YmplY3Qoc2VsZWN0ZWRSYW5nZSwgZnJhbWUpOwogfQogCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRl
UGxhaW5UZXh0VG9EYXRhT2JqZWN0KGNvbnN0IFN0cmluZyYgdGV4dCwgU21hcnRSZXBsYWNlT3B0
aW9uIHNtYXJ0UmVwbGFjZU9wdGlvbikKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0
KQorICAgICAgICByZXR1cm47CisKKyAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OworICAgIG1l
ZGl1bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7CisKKyAgICBTdHJpbmcgc3RyID0gdGV4dDsKKyAg
ICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3bGluZXMoc3RyKTsKKyAgICByZXBs
YWNlTkJTUFdpdGhTcGFjZShzdHIpOworICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFs
RGF0YShzdHIpOworICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQobV93cml0YWJsZURh
dGFPYmplY3QtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCisg
ICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7ICAgICAgICAKKworICAgIG1lZGl1
bS5oR2xvYmFsID0gMDsKK30KKwogdm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVBsYWluVGV4dChjb25z
dCBTdHJpbmcmIHRleHQsIFNtYXJ0UmVwbGFjZU9wdGlvbiBzbWFydFJlcGxhY2VPcHRpb24pCiB7
CiAgICAgY2xlYXIoKTsKQEAgLTE3MSw4ICs1MjEsMTY1IEBADQogICAgICAgICAgICAgOjpDbG9z
ZUNsaXBib2FyZCgpOwogICAgICAgICB9CiAgICAgfQorCisgICAgd3JpdGVQbGFpblRleHRUb0Rh
dGFPYmplY3QodGV4dCwgc21hcnRSZXBsYWNlT3B0aW9uKTsKIH0KIAorI2lmICFPUyhXSU5DRSkK
K3N0YXRpYyBpbmxpbmUgdm9pZCBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKFBXU1RSIHBzeiwg
c2l6ZV90IGxlbmd0aCkKK3sKKyAgICBzaXplX3Qgd3JpdGVUbyA9IDA7CisgICAgc2l6ZV90IHJl
YWRGcm9tID0gMDsKKyAgICB3aGlsZSAocmVhZEZyb20gPCBsZW5ndGgpIHsKKyAgICAgICAgVUlO
VCB0eXBlID0gUGF0aEdldENoYXJUeXBlKHBzeltyZWFkRnJvbV0pOworICAgICAgICBpZiAoIXBz
eltyZWFkRnJvbV0gfHwgdHlwZSAmIChHQ1RfTEZOQ0hBUiB8IEdDVF9TSE9SVENIQVIpKQorICAg
ICAgICAgICAgcHN6W3dyaXRlVG8rK10gPSBwc3pbcmVhZEZyb21dOworCisgICAgICAgIHJlYWRG
cm9tKys7CisgICAgfQorICAgIHBzelt3cml0ZVRvXSA9IDA7Cit9CisjZW5kaWYKKworc3RhdGlj
IFN0cmluZyBmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRpdGxlKGNvbnN0IFN0cmluZyYgdXJsLCBj
b25zdCBTdHJpbmcmIHRpdGxlLCBjb25zdCBVQ2hhciogZXh0ZW5zaW9uLCBib29sIGlzTGluaykK
K3sKKyNpZiBPUyhXSU5DRSkKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBTdHJp
bmcoKTsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBmc1BhdGhNYXhMZW5ndGhFeGNs
dWRpbmdOdWxsVGVybWluYXRvciA9IE1BWF9QQVRIIC0gMTsKKyAgICBib29sIHVzZWRVUkwgPSBm
YWxzZTsKKyAgICBXQ0hBUiBmc1BhdGhCdWZmZXJbTUFYX1BBVEhdOworICAgIGZzUGF0aEJ1ZmZl
clswXSA9IDA7CisgICAgaW50IGV4dGVuc2lvbkxlbiA9IGV4dGVuc2lvbiA/IGxzdHJsZW4oZXh0
ZW5zaW9uKSA6IDA7CisgICAgaW50IGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4dGVuc2lvbiA9
IGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ051bGxUZXJtaW5hdG9yIC0gZXh0ZW5zaW9uTGVuOwor
CisgICAgaWYgKCF0aXRsZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0ZDo6
bWluPHNpemVfdD4odGl0bGUubGVuZ3RoKCksIGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4dGVu
c2lvbik7CisgICAgICAgIENvcHlNZW1vcnkoZnNQYXRoQnVmZmVyLCB0aXRsZS5jaGFyYWN0ZXJz
KCksIGxlbiAqIHNpemVvZihVQ2hhcikpOworICAgICAgICBmc1BhdGhCdWZmZXJbbGVuXSA9IDA7
CisgICAgICAgIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoZnNQYXRoQnVmZmVyLCBsZW4pOwor
ICAgIH0KKworICAgIGlmICghbHN0cmxlbihmc1BhdGhCdWZmZXIpKSB7CisgICAgICAgIEtVUkwg
a3VybChQYXJzZWRVUkxTdHJpbmcsIHVybCk7CisgICAgICAgIHVzZWRVUkwgPSB0cnVlOworICAg
ICAgICAvLyBUaGUgZmlsZW5hbWUgZm9yIGFueSBjb250ZW50IGJhc2VkIGRyYWcgb3IgZmlsZSB1
cmwgc2hvdWxkIGJlIHRoZSBsYXN0IGVsZW1lbnQgb2YgCisgICAgICAgIC8vIHRoZSBwYXRoLiBJ
ZiB3ZSBjYW4ndCBmaW5kIGl0LCBvciB3ZSdyZSBjb21pbmcgdXAgd2l0aCB0aGUgbmFtZSBmb3Ig
YSBsaW5rCisgICAgICAgIC8vIHdlIGp1c3QgdXNlIHRoZSBlbnRpcmUgdXJsLgorICAgICAgICBE
V09SRCBsZW4gPSBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb247CisgICAgICAgIFN0
cmluZyBsYXN0Q29tcG9uZW50ID0ga3VybC5sYXN0UGF0aENvbXBvbmVudCgpOworICAgICAgICBp
ZiAoa3VybC5pc0xvY2FsRmlsZSgpIHx8ICghaXNMaW5rICYmICFsYXN0Q29tcG9uZW50LmlzRW1w
dHkoKSkpIHsKKyAgICAgICAgICAgIGxlbiA9IHN0ZDo6bWluPERXT1JEPihmc1BhdGhNYXhMZW5n
dGhFeGNsdWRpbmdFeHRlbnNpb24sIGxhc3RDb21wb25lbnQubGVuZ3RoKCkpOworICAgICAgICAg
ICAgQ29weU1lbW9yeShmc1BhdGhCdWZmZXIsIGxhc3RDb21wb25lbnQuY2hhcmFjdGVycygpLCBs
ZW4gKiBzaXplb2YoVUNoYXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlbiA9
IHN0ZDo6bWluPERXT1JEPihmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24sIHVybC5s
ZW5ndGgoKSk7CisgICAgICAgICAgICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgdXJsLmNoYXJh
Y3RlcnMoKSwgbGVuICogc2l6ZW9mKFVDaGFyKSk7CisgICAgICAgIH0KKyAgICAgICAgZnNQYXRo
QnVmZmVyW2xlbl0gPSAwOworICAgICAgICBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKGZzUGF0
aEJ1ZmZlciwgbGVuKTsKKyAgICB9CisKKyAgICBpZiAoIWV4dGVuc2lvbikKKyAgICAgICAgcmV0
dXJuIFN0cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+KGZzUGF0aEJ1ZmZlcikpOworCisgICAgaWYg
KCFpc0xpbmsgJiYgdXNlZFVSTCkgeworICAgICAgICBQYXRoUmVuYW1lRXh0ZW5zaW9uKGZzUGF0
aEJ1ZmZlciwgZXh0ZW5zaW9uKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZyhzdGF0aWNfY2FzdDxV
Q2hhcio+KGZzUGF0aEJ1ZmZlcikpOworICAgIH0KKworICAgIHJldHVybiBtYWtlU3RyaW5nKHN0
YXRpY19jYXN0PGNvbnN0IFVDaGFyKj4oZnNQYXRoQnVmZmVyKSwgZXh0ZW5zaW9uKTsKKyNlbmRp
ZgorfQorCisvLyB3cml0ZUZpbGVUb0RhdGFPYmplY3QgdGFrZXMgb3duZXJzaGlwIG9mIGZpbGVE
ZXNjcmlwdG9yIGFuZCBmaWxlQ29udGVudAorc3RhdGljIEhSRVNVTFQgd3JpdGVGaWxlVG9EYXRh
T2JqZWN0KElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBIR0xPQkFMIGZpbGVEZXNjcmlwdG9yLCBI
R0xPQkFMIGZpbGVDb250ZW50LCBIR0xPQkFMIGhEcm9wQ29udGVudCkKK3sKKyAgICBIUkVTVUxU
IGhyID0gU19PSzsKKyAgICBGT1JNQVRFVEMqIGZlOworICAgIFNUR01FRElVTSBtZWRpdW0gPSB7
MH07CisgICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKKworICAgIGlmICghZmlsZURl
c2NyaXB0b3IgfHwgIWZpbGVDb250ZW50KQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICAvLyBE
ZXNjcmlwdG9yCisgICAgZmUgPSBmaWxlRGVzY3JpcHRvckZvcm1hdCgpOworCisgICAgbWVkaXVt
LmhHbG9iYWwgPSBmaWxlRGVzY3JpcHRvcjsKKworICAgIGlmIChGQUlMRUQoaHIgPSBkYXRhT2Jq
ZWN0LT5TZXREYXRhKGZlLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIGdvdG8gZXhpdDsKKwor
ICAgIC8vIENvbnRlbnRzCisgICAgZmUgPSBmaWxlQ29udGVudEZvcm1hdFplcm8oKTsKKyAgICBt
ZWRpdW0uaEdsb2JhbCA9IGZpbGVDb250ZW50OworICAgIGlmIChGQUlMRUQoaHIgPSBkYXRhT2Jq
ZWN0LT5TZXREYXRhKGZlLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIGdvdG8gZXhpdDsKKwor
I2lmIFVTRShDRikKKyAgICAvLyBIRFJPUAorICAgIGlmIChoRHJvcENvbnRlbnQpIHsKKyAgICAg
ICAgbWVkaXVtLmhHbG9iYWwgPSBoRHJvcENvbnRlbnQ7CisgICAgICAgIGhyID0gZGF0YU9iamVj
dC0+U2V0RGF0YShjZkhEcm9wRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpOworICAgIH0KKyNlbmRp
ZgorCitleGl0OgorICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGlmIChmaWxlRGVzY3Jp
cHRvcikKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoZmlsZURlc2NyaXB0b3IpOworICAgICAgICBp
ZiAoZmlsZUNvbnRlbnQpCisgICAgICAgICAgICBHbG9iYWxGcmVlKGZpbGVDb250ZW50KTsKKyAg
ICAgICAgaWYgKGhEcm9wQ29udGVudCkKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoaERyb3BDb250
ZW50KTsKKyAgICB9CisgICAgcmV0dXJuIGhyOworfQorCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRl
VVJMVG9EYXRhT2JqZWN0KGNvbnN0IEtVUkwmIGt1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGVTdHIs
IEZyYW1lKiBmcmFtZSkKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQorICAgICAg
ICByZXR1cm47CisgICAgV2ViQ29yZTo6d3JpdGVVUkwobV93cml0YWJsZURhdGFPYmplY3QuZ2V0
KCksIGt1cmwsIHRpdGxlU3RyLCB0cnVlLCB0cnVlKTsKKworICAgIFN0cmluZyB1cmwgPSBrdXJs
LnN0cmluZygpOworICAgIEFTU0VSVCh1cmwuY29udGFpbnNPbmx5QVNDSUkoKSk7IC8vIEtVUkw6
OnN0cmluZygpIGlzIFVSTCBlbmNvZGVkLgorCisgICAgU3RyaW5nIGZzUGF0aCA9IGZpbGVzeXN0
ZW1QYXRoRnJvbVVybE9yVGl0bGUodXJsLCB0aXRsZVN0ciwgTCIuVVJMIiwgdHJ1ZSk7CisgICAg
U3RyaW5nIGNvbnRlbnRTdHJpbmcoIltJbnRlcm5ldFNob3J0Y3V0XVxyXG5VUkw9IiArIHVybCAr
ICJcclxuIik7CisgICAgQ1N0cmluZyBjb250ZW50ID0gY29udGVudFN0cmluZy5sYXRpbjEoKTsK
KworICAgIGlmIChmc1BhdGgubGVuZ3RoKCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAg
SEdMT0JBTCB1cmxGaWxlRGVzY3JpcHRvciA9IEdsb2JhbEFsbG9jKEdQVFIsIHNpemVvZihGSUxF
R1JPVVBERVNDUklQVE9SKSk7CisgICAgaWYgKCF1cmxGaWxlRGVzY3JpcHRvcikKKyAgICAgICAg
cmV0dXJuOworCisgICAgSEdMT0JBTCB1cmxGaWxlQ29udGVudCA9IEdsb2JhbEFsbG9jKEdQVFIs
IGNvbnRlbnQubGVuZ3RoKCkpOworICAgIGlmICghdXJsRmlsZUNvbnRlbnQpIHsKKyAgICAgICAg
R2xvYmFsRnJlZSh1cmxGaWxlRGVzY3JpcHRvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBGSUxFR1JPVVBERVNDUklQVE9SKiBmZ2QgPSBzdGF0aWNfY2FzdDxGSUxFR1JPVVBERVND
UklQVE9SKj4oR2xvYmFsTG9jayh1cmxGaWxlRGVzY3JpcHRvcikpOworICAgIFplcm9NZW1vcnko
ZmdkLCBzaXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOworICAgIGZnZC0+Y0l0ZW1zID0gMTsK
KyAgICBmZ2QtPmZnZFswXS5kd0ZsYWdzID0gRkRfRklMRVNJWkU7CisgICAgZmdkLT5mZ2RbMF0u
bkZpbGVTaXplTG93ID0gY29udGVudC5sZW5ndGgoKTsKKworICAgIHVuc2lnbmVkIG1heFNpemUg
PSBzdGQ6Om1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgoZmdkLT5mZ2RbMF0u
Y0ZpbGVOYW1lKSk7CisgICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmlsZU5hbWUsIGZzUGF0
aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKKyAgICBHbG9iYWxVbmxv
Y2sodXJsRmlsZURlc2NyaXB0b3IpOworCisgICAgY2hhciogZmlsZUNvbnRlbnRzID0gc3RhdGlj
X2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2sodXJsRmlsZUNvbnRlbnQpKTsKKyAgICBDb3B5TWVtb3J5
KGZpbGVDb250ZW50cywgY29udGVudC5kYXRhKCksIGNvbnRlbnQubGVuZ3RoKCkpOworICAgIEds
b2JhbFVubG9jayh1cmxGaWxlQ29udGVudCk7CisKKyAgICB3cml0ZUZpbGVUb0RhdGFPYmplY3Qo
bV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIHVybEZpbGVEZXNjcmlwdG9yLCB1cmxGaWxlQ29u
dGVudCwgMCk7Cit9CisKIHZvaWQgUGFzdGVib2FyZDo6d3JpdGVVUkwoY29uc3QgS1VSTCYgdXJs
LCBjb25zdCBTdHJpbmcmIHRpdGxlU3RyLCBGcmFtZSogZnJhbWUpCiB7CiAgICAgQVNTRVJUKCF1
cmwuaXNFbXB0eSgpKTsKQEAgLTIxMSw2ICs3MTgsOCBAQA0KICAgICAgICAgICAgIDo6R2xvYmFs
RnJlZShjYkRhdGEpOwogICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7CiAgICAgfQorCisgICAg
d3JpdGVVUkxUb0RhdGFPYmplY3QodXJsLCB0aXRsZVN0ciwgZnJhbWUpOwogfQogCiB2b2lkIFBh
c3RlYm9hcmQ6OndyaXRlSW1hZ2UoTm9kZSogbm9kZSwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmlu
ZyYpCkBAIC0yNTYsNiArNzY1LDExIEBADQogICAgIH0KIH0KIAordm9pZCBQYXN0ZWJvYXJkOjp3
cml0ZVBhc3RlYm9hcmQoY29uc3QgUGFzdGVib2FyZCYgc291cmNlUGFzdGVib2FyZCkKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6OndyaXRlQ2xpcGJvYXJk
KENsaXBib2FyZCopCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKQEAgLTM1Miw0ICs4NjYsMTg1
IEBADQogICAgIHJldHVybiAwOwogfQogCit2b2lkIFBhc3RlYm9hcmQ6OnNldEV4dGVybmFsRGF0
YU9iamVjdChJRGF0YU9iamVjdCAqZGF0YU9iamVjdCkKK3sKKyAgICBtX3dyaXRhYmxlRGF0YU9i
amVjdCA9IDA7CisgICAgbV9kYXRhT2JqZWN0ID0gZGF0YU9iamVjdDsKK30KKworc3RhdGljIENh
Y2hlZEltYWdlKiBnZXRDYWNoZWRJbWFnZShFbGVtZW50KiBlbGVtZW50KQoreworICAgIC8vIEF0
dGVtcHQgdG8gcHVsbCBDYWNoZWRJbWFnZSBmcm9tIGVsZW1lbnQKKyAgICBBU1NFUlQoZWxlbWVu
dCk7CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGVsZW1lbnQtPnJlbmRlcmVyKCk7Cisg
ICAgaWYgKCFyZW5kZXJlciB8fCAhcmVuZGVyZXItPmlzSW1hZ2UoKSkgCisgICAgICAgIHJldHVy
biAwOworCisgICAgUmVuZGVySW1hZ2UqIGltYWdlID0gdG9SZW5kZXJJbWFnZShyZW5kZXJlcik7
CisgICAgaWYgKGltYWdlLT5jYWNoZWRJbWFnZSgpICYmICFpbWFnZS0+Y2FjaGVkSW1hZ2UoKS0+
ZXJyb3JPY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gaW1hZ2UtPmNhY2hlZEltYWdlKCk7CisK
KyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSW1hZ2VGaWxl
RGVzY3JpcHRvcihjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ2FjaGVk
SW1hZ2UqIGltYWdlKQoreworICAgIEFTU0VSVF9BUkcoaW1hZ2UsIGltYWdlKTsKKyAgICBBU1NF
UlQoaW1hZ2UtPmltYWdlKCktPmRhdGEoKSk7CisKKyAgICBIUkVTVUxUIGhyID0gU19PSzsKKyAg
ICBIR0xPQkFMIG1lbU9iaiA9IDA7CisgICAgU3RyaW5nIGZzUGF0aDsKKyAgICBtZW1PYmogPSBH
bG9iYWxBbGxvYyhHUFRSLCBzaXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOworICAgIGlmICgh
bWVtT2JqKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEZJTEVHUk9VUERFU0NSSVBUT1IqIGZn
ZCA9IChGSUxFR1JPVVBERVNDUklQVE9SKilHbG9iYWxMb2NrKG1lbU9iaik7CisgICAgbWVtc2V0
KGZnZCwgMCwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKKyAgICBmZ2QtPmNJdGVtcyA9
IDE7CisgICAgZmdkLT5mZ2RbMF0uZHdGbGFncyA9IEZEX0ZJTEVTSVpFOworICAgIGZnZC0+Zmdk
WzBdLm5GaWxlU2l6ZUxvdyA9IGltYWdlLT5pbWFnZSgpLT5kYXRhKCktPnNpemUoKTsKKworICAg
IGNvbnN0IFN0cmluZyYgcHJlZmVycmVkVGl0bGUgPSB0aXRsZS5pc0VtcHR5KCkgPyBpbWFnZS0+
cmVzcG9uc2UoKS5zdWdnZXN0ZWRGaWxlbmFtZSgpIDogdGl0bGU7CisgICAgU3RyaW5nIGV4dGVu
c2lvbiA9IGltYWdlLT5pbWFnZSgpLT5maWxlbmFtZUV4dGVuc2lvbigpOworICAgIGlmIChleHRl
bnNpb24uaXNFbXB0eSgpKSB7CisgICAgICAgIC8vIERvIG5vdCBjb250aW51ZSBwcm9jZXNzaW5n
IGluIHRoZSByYXJlIGFuZCB1bnVzdWFsIGNhc2Ugd2hlcmUgYSBkZWNvZGVkIGltYWdlIGlzIG5v
dCBhYmxlIAorICAgICAgICAvLyB0byBwcm92aWRlIGEgZmlsZW5hbWUgZXh0ZW5zaW9uLiBTb21l
dGhpbmcgdHJpY2t5IChsaWtlIGEgYmFpdC1uLXN3aXRjaCkgaXMgZ29pbmcgb24KKyAgICAgICAg
cmV0dXJuIDA7CisgICAgfQorICAgIGV4dGVuc2lvbi5pbnNlcnQoIi4iLCAwKTsKKyAgICBmc1Bh
dGggPSBmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRpdGxlKHVybCwgcHJlZmVycmVkVGl0bGUsIGV4
dGVuc2lvbi5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCBmYWxzZSk7CisKKyAgICBp
ZiAoZnNQYXRoLmxlbmd0aCgpIDw9IDApIHsKKyAgICAgICAgR2xvYmFsVW5sb2NrKG1lbU9iaik7
CisgICAgICAgIEdsb2JhbEZyZWUobWVtT2JqKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQor
CisgICAgaW50IG1heFNpemUgPSBzdGQ6Om1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9M
RU5HVEgoZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lKSk7CisgICAgQ29weU1lbW9yeShmZ2QtPmZnZFsw
XS5jRmlsZU5hbWUsIChMUENXU1RSKWZzUGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXpl
b2YoVUNoYXIpKTsKKyAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKKworICAgIHJldHVybiBtZW1P
Ymo7Cit9CisKK3N0YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoU2hh
cmVkQnVmZmVyKiBkYXRhKQoreworICAgIEhHTE9CQUwgbWVtT2JqID0gR2xvYmFsQWxsb2MoR1BU
UiwgZGF0YS0+c2l6ZSgpKTsKKyAgICBpZiAoIW1lbU9iaikgCisgICAgICAgIHJldHVybiAwOwor
CisgICAgY2hhciogZmlsZUNvbnRlbnRzID0gKFBTVFIpR2xvYmFsTG9jayhtZW1PYmopOworCisg
ICAgQ29weU1lbW9yeShmaWxlQ29udGVudHMsIGRhdGEtPmRhdGEoKSwgZGF0YS0+c2l6ZSgpKTsK
KworICAgIEdsb2JhbFVubG9jayhtZW1PYmopOworCisgICAgcmV0dXJuIG1lbU9iajsKK30KKwor
c3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSERyb3BDb250ZW50KGNvbnN0IEtVUkwmIHVybCwg
U3RyaW5nJiBmaWxlTmFtZSwgU2hhcmVkQnVmZmVyKiBkYXRhKQoreworICAgIGlmIChmaWxlTmFt
ZS5pc0VtcHR5KCkgfHwgIWRhdGEpCisgICAgICAgIHJldHVybiAwOworCisgICAgV0NIQVIgZmls
ZVBhdGhbTUFYX1BBVEhdOworCisgICAgaWYgKHVybC5pc0xvY2FsRmlsZSgpKSB7CisgICAgICAg
IFN0cmluZyBsb2NhbFBhdGggPSBkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXModXJsLnBhdGgoKSk7
CisgICAgICAgIC8vIHdpbmRvd3MgZG9lcyBub3QgZW5qb3kgYSBsZWFkaW5nIHNsYXNoIG9uIHBh
dGhzCisgICAgICAgIGlmIChsb2NhbFBhdGhbMF0gPT0gJy8nKQorICAgICAgICAgICAgbG9jYWxQ
YXRoID0gbG9jYWxQYXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgTFBDV1NUUiBsb2NhbFBhdGhT
dHIgPSBsb2NhbFBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKTsKKyAgICAgICAg
aWYgKHdjc2xlbihsb2NhbFBhdGhTdHIpICsgMSA8IE1BWF9QQVRIKQorICAgICAgICAgICAgd2Nz
Y3B5X3MoZmlsZVBhdGgsIE1BWF9QQVRILCBsb2NhbFBhdGhTdHIpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworI2lmIE9TKFdJTkNFKQorICAgICAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgICAgIFdD
SEFSIHRlbXBQYXRoW01BWF9QQVRIXTsKKyAgICAgICAgV0NIQVIgZXh0ZW5zaW9uW01BWF9QQVRI
XTsKKyAgICAgICAgaWYgKCE6OkdldFRlbXBQYXRoKFdURl9BUlJBWV9MRU5HVEgodGVtcFBhdGgp
LCB0ZW1wUGF0aCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCE6OlBhdGhB
cHBlbmQodGVtcFBhdGgsIGZpbGVOYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkp
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIExQQ1dTVFIgZm91bmRFeHRlbnNpb24g
PSA6OlBhdGhGaW5kRXh0ZW5zaW9uKHRlbXBQYXRoKTsKKyAgICAgICAgaWYgKGZvdW5kRXh0ZW5z
aW9uKSB7CisgICAgICAgICAgICBpZiAod2NzY3B5X3MoZXh0ZW5zaW9uLCBNQVhfUEFUSCwgZm91
bmRFeHRlbnNpb24pKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UK
KyAgICAgICAgICAgICpleHRlbnNpb24gPSAwOworICAgICAgICA6OlBhdGhSZW1vdmVFeHRlbnNp
b24odGVtcFBhdGgpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwOyBpKyspIHsK
KyAgICAgICAgICAgIGlmIChzd3ByaW50Zl9zKGZpbGVQYXRoLCBNQVhfUEFUSCwgVEVYVCgiJXMt
JWQlcyIpLCB0ZW1wUGF0aCwgaSwgZXh0ZW5zaW9uKSA9PSAtMSkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgICAgIGlmICghOjpQYXRoRmlsZUV4aXN0cyhmaWxlUGF0aCkpCisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgSEFORExFIHRlbXBGaWxl
SGFuZGxlID0gQ3JlYXRlRmlsZShmaWxlUGF0aCwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklU
RSwgMCwgMCwgQ1JFQVRFX0FMV0FZUywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCAwKTsKKyAgICAg
ICAgaWYgKHRlbXBGaWxlSGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgdG8gdGhpcyB0ZW1wIGZp
bGUuCisgICAgICAgIERXT1JEIHdyaXR0ZW47CisgICAgICAgIEJPT0wgdGVtcFdyaXRlU3VjY2Vl
ZGVkID0gV3JpdGVGaWxlKHRlbXBGaWxlSGFuZGxlLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUo
KSwgJndyaXR0ZW4sIDApOworICAgICAgICBDbG9zZUhhbmRsZSh0ZW1wRmlsZUhhbmRsZSk7Cisg
ICAgICAgIGlmICghdGVtcFdyaXRlU3VjY2VlZGVkKQorICAgICAgICAgICAgcmV0dXJuIDA7Cisj
ZW5kaWYKKyAgICB9CisKKyAgICBTSVpFX1QgZHJvcEZpbGVzU2l6ZSA9IHNpemVvZihEUk9QRklM
RVMpICsgKHNpemVvZihXQ0hBUikgKiAod2NzbGVuKGZpbGVQYXRoKSArIDIpKTsKKyAgICBIR0xP
QkFMIG1lbU9iaiA9IEdsb2JhbEFsbG9jKEdITkQgfCBHTUVNX1NIQVJFLCBkcm9wRmlsZXNTaXpl
KTsKKyAgICBpZiAoIW1lbU9iaikgCisgICAgICAgIHJldHVybiAwOworCisgICAgRFJPUEZJTEVT
KiBkcm9wRmlsZXMgPSAoRFJPUEZJTEVTKikgR2xvYmFsTG9jayhtZW1PYmopOworICAgIGRyb3BG
aWxlcy0+cEZpbGVzID0gc2l6ZW9mKERST1BGSUxFUyk7CisgICAgZHJvcEZpbGVzLT5mV2lkZSA9
IFRSVUU7CisgICAgd2NzY3B5KChMUFdTVFIpKGRyb3BGaWxlcyArIDEpLCBmaWxlUGF0aCk7ICAg
IAorICAgIEdsb2JhbFVubG9jayhtZW1PYmopOworCisgICAgcmV0dXJuIG1lbU9iajsKK30KKwor
dm9pZCBQYXN0ZWJvYXJkOjp3cml0ZUltYWdlVG9EYXRhT2JqZWN0KEVsZW1lbnQqIGVsZW1lbnQs
IGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICAvLyBTaG92ZSBpbWFnZSBkYXRhIGludG8gYSBEYXRh
T2JqZWN0IGZvciB1c2UgYXMgYSBmaWxlCisgICAgQ2FjaGVkSW1hZ2UqIGNhY2hlZEltYWdlID0g
Z2V0Q2FjaGVkSW1hZ2UoZWxlbWVudCk7CisgICAgaWYgKCFjYWNoZWRJbWFnZSB8fCAhY2FjaGVk
SW1hZ2UtPmltYWdlRm9yUmVuZGVyZXIoZWxlbWVudC0+cmVuZGVyZXIoKSkgfHwgIWNhY2hlZElt
YWdlLT5pc0xvYWRlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTaGFyZWRCdWZmZXIqIGlt
YWdlQnVmZmVyID0gY2FjaGVkSW1hZ2UtPmltYWdlRm9yUmVuZGVyZXIoZWxlbWVudC0+cmVuZGVy
ZXIoKSktPmRhdGEoKTsKKyAgICBpZiAoIWltYWdlQnVmZmVyIHx8ICFpbWFnZUJ1ZmZlci0+c2l6
ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBIR0xPQkFMIGltYWdlRmlsZURlc2NyaXB0b3Ig
PSBjcmVhdGVHbG9iYWxJbWFnZUZpbGVEZXNjcmlwdG9yKHVybC5zdHJpbmcoKSwgZWxlbWVudC0+
Z2V0QXR0cmlidXRlKEhUTUxOYW1lczo6YWx0QXR0ciksIGNhY2hlZEltYWdlKTsKKyAgICBpZiAo
IWltYWdlRmlsZURlc2NyaXB0b3IpCisgICAgICAgIHJldHVybjsKKworICAgIEhHTE9CQUwgaW1h
Z2VGaWxlQ29udGVudCA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoaW1hZ2VCdWZmZXIp
OworICAgIGlmICghaW1hZ2VGaWxlQ29udGVudCkgeworICAgICAgICBHbG9iYWxGcmVlKGltYWdl
RmlsZURlc2NyaXB0b3IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nIGZp
bGVOYW1lID0gY2FjaGVkSW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5hbWUoKTsKKyAg
ICBIR0xPQkFMIGhEcm9wQ29udGVudCA9IGNyZWF0ZUdsb2JhbEhEcm9wQ29udGVudCh1cmwsIGZp
bGVOYW1lLCBpbWFnZUJ1ZmZlcik7CisgICAgaWYgKCFoRHJvcENvbnRlbnQpIHsKKyAgICAgICAg
R2xvYmFsRnJlZShoRHJvcENvbnRlbnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
d3JpdGVGaWxlVG9EYXRhT2JqZWN0KG1fd3JpdGFibGVEYXRhT2JqZWN0LmdldCgpLCBpbWFnZUZp
bGVEZXNjcmlwdG9yLCBpbWFnZUZpbGVDb250ZW50LCBoRHJvcENvbnRlbnQpOworfQorCit2b2lk
IFBhc3RlYm9hcmQ6OndyaXRlVVJMVG9Xcml0YWJsZURhdGFPYmplY3QoY29uc3QgS1VSTCYgdXJs
LCBjb25zdCBTdHJpbmcmIHRpdGxlKQoreworICAgIFdlYkNvcmU6OndyaXRlVVJMKG1fd3JpdGFi
bGVEYXRhT2JqZWN0LmdldCgpLCB1cmwsIHRpdGxlLCB0cnVlLCBmYWxzZSk7Cit9CisKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZw0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNjMy
KQ0KKysrIFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEs
MyArMSwxNCBAQA0KKzIwMTMtMDUtMjQgIFh1ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFp
ZHUuY29tPgorCisgICAgICAgIE1vdmUgV2luZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJk
LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBXZWJD
b3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcDoKKyAgICAgICAgKFdlYkRyYWdDbGllbnQ6Ondp
bGxQZXJmb3JtRHJhZ1NvdXJjZUFjdGlvbik6IEdldCBJRGF0YU9iamVjdCBmcm9tIFBhc3RlYm9h
cmQgaW5zdGVhZCBvZiBDbGlwYm9hcmQuCisgICAgICAgIChXZWJEcmFnQ2xpZW50OjpzdGFydERy
YWcpOiBEaXR0by4KKwogMjAxMy0wNS0yMSAgTWFyayBTYWxpc2J1cnkgIDxtYXJrLnNhbGlzYnVy
eUBocC5jb20+CiAKICAgICAgICAgW1dpbmRvd3MsIGN1cmxdIFdlYkRvd25sb2FkQ3VybC5jcHAg
c2hvdWxkIG5vdCBpbmNsdWRlIFN5c3RlbVRpbWUuaApJbmRleDogU291cmNlL1dlYktpdC93aW4v
V2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5jcHANCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBTb3VyY2Uv
V2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcAkocmV2aXNpb24gMTUw
NjI5KQ0KKysrIFNvdXJjZS9XZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQu
Y3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtMjksMTcgKzI5LDE3IEBADQogI2luY2x1ZGUgIldlYktp
dEdyYXBoaWNzLmgiCiAjaW5jbHVkZSAiV2ViVmlldy5oIgogCi0jaW5jbHVkZSA8c2hsb2JqLmg+
Ci0KLSNpbmNsdWRlIDxXZWJDb3JlL0NsaXBib2FyZFdpbi5oPgorI2luY2x1ZGUgPFdlYkNvcmUv
Q2xpcGJvYXJkLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9EcmFnQ29udHJvbGxlci5oPgogI2luY2x1
ZGUgPFdlYkNvcmUvRHJhZ0RhdGEuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0V2ZW50SGFuZGxlci5o
PgorI2luY2x1ZGUgPFdlYkNvcmUvUGFnZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUGFzdGVib2Fy
ZC5oPgogI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1Nb3VzZUV2ZW50Lmg+CiAjaW5jbHVkZSA8
V2ViQ29yZS9GcmFtZS5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRnJhbWVWaWV3Lmg+CiAjaW5jbHVk
ZSA8V2ViQ29yZS9HcmFwaGljc0NvbnRleHQuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1BhZ2UuaD4K
KyNpbmNsdWRlIDxzaGxvYmouaD4KIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKQEAgLTEw
MywxMiArMTAzLDEyIEBADQogICAgICAgICByZXR1cm47CiAKICAgICBQT0lOVCBwb2ludCA9IGlu
dFBvaW50OwotICAgIENPTVB0cjxJRGF0YU9iamVjdD4gZGF0YU9iamVjdCA9IHN0YXRpY19jYXN0
PENsaXBib2FyZFdpbio+KGNsaXBib2FyZCktPmRhdGFPYmplY3QoKTsKKyAgICBDT01QdHI8SURh
dGFPYmplY3Q+IGRhdGFPYmplY3QgPSBjbGlwYm9hcmQtPnBhc3RlYm9hcmQoKS5kYXRhT2JqZWN0
KCk7CiAKICAgICBDT01QdHI8SURhdGFPYmplY3Q+IG5ld0RhdGFPYmplY3Q7CiAgICAgSFJFU1VM
VCByZXN1bHQgPSB1aURlbGVnYXRlLT53aWxsUGVyZm9ybURyYWdTb3VyY2VBY3Rpb24obV93ZWJW
aWV3LCBzdGF0aWNfY2FzdDxXZWJEcmFnU291cmNlQWN0aW9uPihhY3Rpb24pLCAmcG9pbnQsIGRh
dGFPYmplY3QuZ2V0KCksICZuZXdEYXRhT2JqZWN0KTsKICAgICBpZiAocmVzdWx0ID09IFNfT0sg
JiYgbmV3RGF0YU9iamVjdCAhPSBkYXRhT2JqZWN0KQotICAgICAgICBzdGF0aWNfY2FzdDxDbGlw
Ym9hcmRXaW4qPihjbGlwYm9hcmQpLT5zZXRFeHRlcm5hbERhdGFPYmplY3QobmV3RGF0YU9iamVj
dC5nZXQoKSk7CisgICAgICAgIGNvbnN0X2Nhc3Q8UGFzdGVib2FyZCY+KGNsaXBib2FyZC0+cGFz
dGVib2FyZCgpKS5zZXRFeHRlcm5hbERhdGFPYmplY3QobmV3RGF0YU9iamVjdC5nZXQoKSk7CiB9
CiAKIHZvaWQgV2ViRHJhZ0NsaWVudDo6c3RhcnREcmFnKERyYWdJbWFnZVJlZiBpbWFnZSwgY29u
c3QgSW50UG9pbnQmIGltYWdlT3JpZ2luLCBjb25zdCBJbnRQb2ludCYgZHJhZ1BvaW50LCBDbGlw
Ym9hcmQqIGNsaXBib2FyZCwgRnJhbWUqIGZyYW1lLCBib29sIGlzTGluaykKQEAgLTEyNCw3ICsx
MjQsNyBAQA0KICAgICBpZiAoRkFJTEVEKFdlYkRyb3BTb3VyY2U6OmNyZWF0ZUluc3RhbmNlKG1f
d2ViVmlldywgJnNvdXJjZSkpKQogICAgICAgICByZXR1cm47CiAKLSAgICBkYXRhT2JqZWN0ID0g
c3RhdGljX2Nhc3Q8Q2xpcGJvYXJkV2luKj4oY2xpcGJvYXJkKS0+ZGF0YU9iamVjdCgpOworICAg
IGRhdGFPYmplY3QgPSBjbGlwYm9hcmQtPnBhc3RlYm9hcmQoKS5kYXRhT2JqZWN0KCk7CiAgICAg
aWYgKHNvdXJjZSAmJiAoaW1hZ2UgfHwgZGF0YU9iamVjdCkpIHsKICAgICAgICAgaWYgKGltYWdl
KSB7CiAgICAgICAgICAgICBpZihTVUNDRUVERUQoQ29DcmVhdGVJbnN0YW5jZShDTFNJRF9EcmFn
RHJvcEhlbHBlciwgMCwgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsCg==
</data>
<flag name="review"
          id="224174"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>202948</attachid>
            <date>2013-05-26 21:23:19 -0700</date>
            <delta_ts>2013-05-27 12:51:33 -0700</delta_ts>
            <desc>patch</desc>
            <filename>116258_5.patch</filename>
            <type>text/plain</type>
            <size>67000</size>
            <attacher name="huangxueqing">huangxueqing</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9X
ZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNjMyKQ0KKysrIFNvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEsMyArMSw1OSBAQA0KKzIwMTMtMDUtMjQgIFh1
ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgorCisgICAgICAgIE1vdmUgV2lu
ZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJkLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgQ2xpcGJvYXJkIHJlZmFjdG9yLCBubyBuZXcgdGVzdHMu
CisKKyAgICAgICAgKiBkb20vQ2xpcGJvYXJkLmg6CisgICAgICAgICogcGFnZS93aW4vRXZlbnRI
YW5kbGVyV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkV2ZW50SGFuZGxlcjo6Y3JlYXRlRHJh
Z2dpbmdDbGlwYm9hcmQpOiBDcmVhdGUgQ2xpcGJvYXJkIGluc3RlYWQgb2YgQ2xpcGJvYXJkV2lu
LgorICAgICAgICAqIHBsYXRmb3JtL1Bhc3RlYm9hcmQuaDoKKyAgICAgICAgKFdlYkNvcmU6OlBh
c3RlYm9hcmQ6OmRhdGFPYmplY3QpOiBHZXQgSURhdGFPYmplY3QgYnkgQ2xpcGJvcmFkLgorICAg
ICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGFibGVEYXRhT2JqZWN0KTogR2V0IFdDRGF0
YU9iamVjdCBieSBDbGlwYm9yYWQuCisgICAgICAgICogcGxhdGZvcm0vd2luL0NsaXBib2FyZFdp
bi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDbGlwYm9hcmQ6OmNyZWF0ZURyYWdJbWFnZSk6IENo
YW5nZSBwYXJhbWV0ZXIgbmFtZSBsb2MgdG8gZHJhZ0xvY2F0aW9uLgorICAgICAgICAoV2ViQ29y
ZTo6Q2xpcGJvYXJkOjpkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UpOiBJbXBsZW1lbnQgZGVjbGFy
ZUFuZFdyaXRlRHJhZ0ltYWdlIHVzZSBXQ0RhdGFPYmplY3QgZXhwb3NlZCBieSBQYXN0ZWJvYXJk
LgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4uaDogUmVtb3ZlZC4KKyAgICAg
ICAgKiBwbGF0Zm9ybS93aW4vRWRpdG9yV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkVkaXRv
cjo6bmV3R2VuZXJhbENsaXBib2FyZCk6IENyZWF0ZSBDbGlwYm9hcmQgaW5zdGVhZCBvZiBDbGlw
Ym9hcmRXaW4uCisgICAgICAgICogcGxhdGZvcm0vd2luL1Bhc3RlYm9hcmRXaW4uY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6Y3JlYXRlRm9yQ29weUFuZFBhc3RlKTogQ3JlYXRl
IGEgUGFzdGVib2FyZC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmNyZWF0ZVByaXZh
dGUpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OmNyZWF0ZUZvckRyYWdB
bmREcm9wKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpmaW5pc2hDcmVh
dGluZ1Bhc3RlYm9hcmQpOiBDcmVhdGUgUGFzdGVib2FyZCB1c2UgV2luZG93cyBBUEkuCisgICAg
ICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpQYXN0ZWJvYXJkKToKKyAgICAgICAgKFdlYkNvcmU6
OmNsaXBib2FyZFR5cGVGcm9tTUlNRVR5cGUpOiBDb3BpZWQgZnJvbSBDbGlwYm9hcmRXaW4uY3Bw
LgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6Y2xlYXIpOiBEaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OlBhc3RlYm9hcmQ6Omhhc0RhdGEpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6
OmFkZE1pbWVUeXBlc0ZvckZvcm1hdCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVi
b2FyZDo6dHlwZXMpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OnJlYWRT
dHJpbmcpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OnJlYWRGaWxlbmFt
ZXMpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OndyaXRlVVJMKTogRGl0dG8uCisgICAgICAg
IChXZWJDb3JlOjpQYXN0ZWJvYXJkOjp3cml0ZVN0cmluZyk6IERpdHRvLgorICAgICAgICAoV2Vi
Q29yZTo6UGFzdGVib2FyZDo6c2V0RHJhZ0ltYWdlKTogRGl0dG8uCisgICAgICAgIChXZWJDb3Jl
OjpQYXN0ZWJvYXJkOjp3cml0ZVJhbmdlVG9EYXRhT2JqZWN0KTogV3JpdGUgcmFuZ2UgdG8gV0NE
YXRhT2JqZWN0LgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVTZWxlY3Rpb24p
OgorICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6d3JpdGVQbGFpblRleHRUb0RhdGFPYmpl
Y3QpOiBXcml0ZSBQbGFpblRleHQgdG8gV0NEYXRhT2JqZWN0LgorICAgICAgICAoV2ViQ29yZTo6
UGFzdGVib2FyZDo6d3JpdGVQbGFpblRleHQpOgorICAgICAgICAoV2ViQ29yZTo6cGF0aFJlbW92
ZUJhZEZTQ2hhcmFjdGVycyk6IENvcGllZCBmcm9tIENsaXBib2FyZFdpbi5jcHAuCisgICAgICAg
IChXZWJDb3JlOjpmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRpdGxlKTogRGl0dG8uCisgICAgICAg
IChXZWJDb3JlOjp3cml0ZUZpbGVUb0RhdGFPYmplY3QpOiBEaXR0by4KKyAgICAgICAgKFdlYkNv
cmU6OlBhc3RlYm9hcmQ6OndyaXRlVVJMVG9EYXRhT2JqZWN0KTogV3JpdGUgVVJMIHRvIFdDRGF0
YU9iamVjdC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlVVJMKTogQ29waWVk
IGZyb20gQ2xpcGJvYXJkV2luLmNwcC4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6Ondy
aXRlUGFzdGVib2FyZCk6IENvcGllZCBmcm9tIFBhc3RlYm9hcmQ6OndyaXRlQ2xpcGJvYXJkLgor
ICAgICAgICAoV2ViQ29yZTo6UGFzdGVib2FyZDo6ZG9jdW1lbnRGcmFnbWVudCk6IENvcGllZCBm
cm9tIENsaXBib2FyZFdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpQYXN0ZWJvYXJkOjpzZXRF
eHRlcm5hbERhdGFPYmplY3QpOiBDbGlwYm9hcmQgY2FuIHNldCBuZXcgSURhdGFPYmplY3QuCisg
ICAgICAgIChXZWJDb3JlOjpnZXRDYWNoZWRJbWFnZSk6IENvcGllZCBmcm9tIENsaXBib2FyZFdp
bi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVHbG9iYWxJbWFnZUZpbGVEZXNjcmlwdG9y
KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVHbG9iYWxJbWFnZUZpbGVDb250ZW50
KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVHbG9iYWxIRHJvcENvbnRlbnQpOiBE
aXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlSW1hZ2VUb0RhdGFPYmpl
Y3QpOiBFeHBvc2UgdG8gbWFrZSBDbGlwYm9hcmQgaW1wbGVtZW50IGRlY2xhcmVBbmRXcml0ZURy
YWdJbWFnZS4KKyAgICAgICAgKFdlYkNvcmU6OlBhc3RlYm9hcmQ6OndyaXRlVVJMVG9Xcml0YWJs
ZURhdGFPYmplY3QpOiBEaXR0by4KKwogMjAxMy0wNS0yMyAgQmV0aCBEYWtpbiAgPGJkYWtpbkBh
cHBsZS5jb20+CiAKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTExNjcwMgpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0NsaXBib2FyZC5oDQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09DQotLS0gU291cmNlL1dlYkNvcmUvZG9tL0NsaXBib2FyZC5oCShyZXZpc2lvbiAxNTA2Mjkp
DQorKysgU291cmNlL1dlYkNvcmUvZG9tL0NsaXBib2FyZC5oCSh3b3JraW5nIGNvcHkpDQpAQCAt
MzQsNyArMzQsNyBAQA0KIC8vIFRoaXMgRE9NIG9iamVjdCBub3cgd29ya3MgYnkgY2FsbGluZyB0
aHJvdWdoIHRvIGNsYXNzZXMgaW4gdGhlIHBsYXRmb3JtIGxheWVyLgogLy8gU3BlY2lmaWNhbGx5
LCB0aGUgY2xhc3MgY3VycmVudGx5IG5hbWVkIFBhc3RlYm9hcmQuIFRoZSBsZWdhY3kgc3R5bGUg
aW5zdGVhZAogLy8gdXNlcyB0aGlzIGFzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MuCi0jZGVmaW5l
IFdURl9VU0VfTEVHQUNZX1NUWUxFX0FCU1RSQUNUX0NMSVBCT0FSRF9DTEFTUyAoUExBVEZPUk0o
SU9TKSB8fCBQTEFURk9STShRVCkgfHwgUExBVEZPUk0oV0lOKSkKKyNkZWZpbmUgV1RGX1VTRV9M
RUdBQ1lfU1RZTEVfQUJTVFJBQ1RfQ0xJUEJPQVJEX0NMQVNTIChQTEFURk9STShJT1MpIHx8IFBM
QVRGT1JNKFFUKSkKIAogI2lmIFVTRShMRUdBQ1lfU1RZTEVfQUJTVFJBQ1RfQ0xJUEJPQVJEX0NM
QVNTKQogI2RlZmluZSBMRUdBQ1lfVklSVFVBTCB2aXJ0dWFsCkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9wYWdlL3dpbi9FdmVudEhhbmRsZXJXaW4uY3BwDQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gU291cmNlL1dl
YkNvcmUvcGFnZS93aW4vRXZlbnRIYW5kbGVyV2luLmNwcAkocmV2aXNpb24gMTUwNjI5KQ0KKysr
IFNvdXJjZS9XZWJDb3JlL3BhZ2Uvd2luL0V2ZW50SGFuZGxlcldpbi5jcHAJKHdvcmtpbmcgY29w
eSkNCkBAIC0yNyw2ICsyNyw4IEBADQogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkV2
ZW50SGFuZGxlci5oIgogCisjaW5jbHVkZSAiQ09NUHRyLmgiCisjaW5jbHVkZSAiQ2xpcGJvYXJk
LmgiCiAjaW5jbHVkZSAiQ3Vyc29yLmgiCiAjaW5jbHVkZSAiRmxvYXRQb2ludC5oIgogI2luY2x1
ZGUgIkZvY3VzQ29udHJvbGxlci5oIgpAQCAtNDMsMTIgKzQ1LDYgQEANCiAjaW5jbHVkZSAiV0NE
YXRhT2JqZWN0LmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKIAotI2lmIE9TKFdJTkNF
KQotI2luY2x1ZGUgIkNsaXBib2FyZC5oIgotI2Vsc2UKLSNpbmNsdWRlICJDbGlwYm9hcmRXaW4u
aCIKLSNlbmRpZgotCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKICNpZiBFTkFCTEUoRFJBR19TVVBQ
T1JUKQpAQCAtMTAxLDkgKzk3LDcgQEANCiAjaWYgT1MoV0lOQ0UpCiAgICAgcmV0dXJuIDA7CiAj
ZWxzZQotICAgIENPTVB0cjxXQ0RhdGFPYmplY3Q+IGRhdGFPYmplY3Q7Ci0gICAgV0NEYXRhT2Jq
ZWN0OjpjcmVhdGVJbnN0YW5jZSgmZGF0YU9iamVjdCk7Ci0gICAgcmV0dXJuIENsaXBib2FyZFdp
bjo6Y3JlYXRlKENsaXBib2FyZDo6RHJhZ0FuZERyb3AsIGRhdGFPYmplY3QuZ2V0KCksIENsaXBi
b2FyZFdyaXRhYmxlLCBtX2ZyYW1lKTsKKyAgICByZXR1cm4gQ2xpcGJvYXJkOjpjcmVhdGVGb3JE
cmFnQW5kRHJvcCgpOwogI2VuZGlmCiB9CiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL1Bhc3RlYm9hcmQuaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL1Bhc3RlYm9hcmQuaAkocmV2aXNpb24gMTUwNjI5KQ0KKysrIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL1Bhc3RlYm9hcmQuaAkod29ya2luZyBjb3B5KQ0KQEAgLTM4LDYgKzM4LDkgQEANCiAj
ZW5kaWYKIAogI2lmIFBMQVRGT1JNKFdJTikKKyNpbmNsdWRlICJDT01QdHIuaCIKKyNpbmNsdWRl
ICJXQ0RhdGFPYmplY3QuaCIKKyNpbmNsdWRlIDxvYmppZGwuaD4KICNpbmNsdWRlIDx3aW5kb3dz
Lmg+CiB0eXBlZGVmIHN0cnVjdCBIV05EX18qIEhXTkQ7CiAjZW5kaWYKQEAgLTY0LDYgKzY3LDcg
QEANCiBjbGFzcyBDbGlwYm9hcmQ7CiBjbGFzcyBEb2N1bWVudEZyYWdtZW50OwogY2xhc3MgRHJh
Z0RhdGE7CitjbGFzcyBFbGVtZW50OwogY2xhc3MgRnJhbWU7CiBjbGFzcyBIaXRUZXN0UmVzdWx0
OwogY2xhc3MgS1VSTDsKQEAgLTE1Myw2ICsxNTcsMTQgQEANCiAgICAgdm9pZCBzZXRTZWxlY3Rp
b25Nb2RlKGJvb2wpIHsgfQogI2VuZGlmCiAKKyNpZiBQTEFURk9STShXSU4pCisgICAgQ09NUHRy
PElEYXRhT2JqZWN0PiBkYXRhT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gbV9kYXRhT2JqZWN0OyB9
CisgICAgdm9pZCBzZXRFeHRlcm5hbERhdGFPYmplY3QoSURhdGFPYmplY3QqKTsKKyAgICB2b2lk
IHdyaXRlVVJMVG9Xcml0YWJsZURhdGFPYmplY3QoY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYp
OworICAgIENPTVB0cjxXQ0RhdGFPYmplY3Q+IHdyaXRhYmxlRGF0YU9iamVjdCgpIGNvbnN0IHsg
cmV0dXJuIG1fd3JpdGFibGVEYXRhT2JqZWN0OyB9CisgICAgdm9pZCB3cml0ZUltYWdlVG9EYXRh
T2JqZWN0KEVsZW1lbnQqLCBjb25zdCBLVVJMJik7CisjZW5kaWYKKwogI2lmIFBMQVRGT1JNKEdU
SykKICAgICB+UGFzdGVib2FyZCgpOwogI2VuZGlmCkBAIC0xNjUsNiArMTc3LDEyIEBADQogICAg
IFBhc3RlYm9hcmQoR3RrQ2xpcGJvYXJkKik7CiAjZW5kaWYKIAorI2lmIFBMQVRGT1JNKFdJTikK
KyAgICBleHBsaWNpdCBQYXN0ZWJvYXJkKElEYXRhT2JqZWN0Kik7CisgICAgZXhwbGljaXQgUGFz
dGVib2FyZChXQ0RhdGFPYmplY3QqKTsKKyAgICBleHBsaWNpdCBQYXN0ZWJvYXJkKGNvbnN0IERy
YWdEYXRhTWFwJik7CisjZW5kaWYKKwogI2lmIFBMQVRGT1JNKE1BQykgJiYgIVBMQVRGT1JNKElP
UykKICAgICBTdHJpbmcgbV9wYXN0ZWJvYXJkTmFtZTsKICAgICBsb25nIG1fY2hhbmdlQ291bnQ7
CkBAIC0xNzUsNyArMTkzLDE1IEBADQogI2VuZGlmCiAKICNpZiBQTEFURk9STShXSU4pCisgICAg
dm9pZCBmaW5pc2hDcmVhdGluZ1Bhc3RlYm9hcmQoKTsKKyAgICB2b2lkIHdyaXRlUmFuZ2VUb0Rh
dGFPYmplY3QoUmFuZ2UqLCBGcmFtZSopOworICAgIHZvaWQgd3JpdGVVUkxUb0RhdGFPYmplY3Qo
Y29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYsIEZyYW1lKik7CisgICAgdm9pZCB3cml0ZVBsYWlu
VGV4dFRvRGF0YU9iamVjdChjb25zdCBTdHJpbmcmLCBTbWFydFJlcGxhY2VPcHRpb24pOworCiAg
ICAgSFdORCBtX293bmVyOworICAgIENPTVB0cjxJRGF0YU9iamVjdD4gbV9kYXRhT2JqZWN0Owor
ICAgIENPTVB0cjxXQ0RhdGFPYmplY3Q+IG1fd3JpdGFibGVEYXRhT2JqZWN0OworICAgIERyYWdE
YXRhTWFwIG1fZHJhZ0RhdGFNYXA7CiAjZW5kaWYKIAogI2lmIFBMQVRGT1JNKFFUKQpJbmRleDog
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5jcHANCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmNwcAkocmV2aXNp
b24gMTUwNjI5KQ0KKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4u
Y3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtMSw1ICsxLDYgQEANCiAvKgogICogQ29weXJpZ2h0IChD
KSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmln
aHQgKEMpIDIwMTMgWHVlcWluZyBIdWFuZyA8aHVhbmd4dWVxaW5nQGJhaWR1LmNvbT4KICAqCiAg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjQsNjU3ICsyNSw0NiBAQA0KICAqLwogCiAj
aW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiQ2xpcGJvYXJkV2luLmgiCisjaW5jbHVkZSAi
Q2xpcGJvYXJkLmgiCiAKICNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgogI2luY2x1ZGUgIkNsaXBi
b2FyZFV0aWxpdGllc1dpbi5oIgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCi0jaW5jbHVkZSAiRHJh
Z0RhdGEuaCIKLSNpbmNsdWRlICJFZGl0b3IuaCIKICNpbmNsdWRlICJFbGVtZW50LmgiCi0jaW5j
bHVkZSAiRXZlbnRIYW5kbGVyLmgiCi0jaW5jbHVkZSAiRmlsZUxpc3QuaCIKICNpbmNsdWRlICJG
cmFtZS5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3Lmgi
CiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAiSFRNTFBhcnNlcklkaW9tcy5oIgot
I2luY2x1ZGUgIkltYWdlLmgiCi0jaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgotI2luY2x1
ZGUgIk5vdEltcGxlbWVudGVkLmgiCi0jaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlBhc3Rl
Ym9hcmQuaCIKLSNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQuaCIKLSNpbmNsdWRlICJSYW5n
ZS5oIgotI2luY2x1ZGUgIlJlbmRlckltYWdlLmgiCi0jaW5jbHVkZSAiUmVzb3VyY2VSZXNwb25z
ZS5oIgotI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgotI2luY2x1ZGUgIldDRGF0YU9iamVjdC5o
IgogI2luY2x1ZGUgIm1hcmt1cC5oIgotI2luY2x1ZGUgPHNobHdhcGkuaD4KLSNpbmNsdWRlIDx3
aW5pbmV0Lmg+Ci0jaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NT
dHJpbmcuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KLSNpbmNsdWRlIDx3dGYv
dGV4dC9TdHJpbmdIYXNoLmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKLQotLy8gV2UgcHJvdmlkZSB0
aGUgSUUgY2xpcGJvYXJkIHR5cGVzIChVUkwgYW5kIFRleHQpLCBhbmQgdGhlIGNsaXBib2FyZCB0
eXBlcyBzcGVjaWZpZWQgaW4gdGhlIFdIQVRXRyBXZWIgQXBwbGljYXRpb25zIDEuMCBkcmFmdAot
Ly8gc2VlIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsv
IFNlY3Rpb24gNi4zLjUuMwotCi1lbnVtIENsaXBib2FyZERhdGFUeXBlIHsgQ2xpcGJvYXJkRGF0
YVR5cGVOb25lLCBDbGlwYm9hcmREYXRhVHlwZVVSTCwgQ2xpcGJvYXJkRGF0YVR5cGVUZXh0LCBD
bGlwYm9hcmREYXRhVHlwZVRleHRIVE1MIH07Ci0KLXN0YXRpYyBDbGlwYm9hcmREYXRhVHlwZSBj
bGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKGNvbnN0IFN0cmluZyYgdHlwZSkKK0RyYWdJbWFnZVJl
ZiBDbGlwYm9hcmQ6OmNyZWF0ZURyYWdJbWFnZShJbnRQb2ludCYgZHJhZ0xvY2F0aW9uKSBjb25z
dAogewotICAgIFN0cmluZyBxVHlwZSA9IHR5cGUuc3RyaXBXaGl0ZVNwYWNlKCkubG93ZXIoKTsK
LQotICAgIC8vIHR3byBzcGVjaWFsIGNhc2VzIGZvciBJRSBjb21wYXRpYmlsaXR5Ci0gICAgaWYg
KHFUeXBlID09ICJ0ZXh0IiB8fCBxVHlwZSA9PSAidGV4dC9wbGFpbiIgfHwgcVR5cGUuc3RhcnRz
V2l0aCgidGV4dC9wbGFpbjsiKSkKLSAgICAgICAgcmV0dXJuIENsaXBib2FyZERhdGFUeXBlVGV4
dDsKLSAgICBpZiAocVR5cGUgPT0gInVybCIgfHwgcVR5cGUgPT0gInRleHQvdXJpLWxpc3QiKQot
ICAgICAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVVUkw7Ci0gICAgaWYgKHFUeXBlID09ICJ0
ZXh0L2h0bWwiKQotICAgICAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0SFRNTDsKLQot
ICAgIHJldHVybiBDbGlwYm9hcmREYXRhVHlwZU5vbmU7Ci19Ci0KLSNpZiAhT1MoV0lOQ0UpCi1z
dGF0aWMgaW5saW5lIHZvaWQgcGF0aFJlbW92ZUJhZEZTQ2hhcmFjdGVycyhQV1NUUiBwc3osIHNp
emVfdCBsZW5ndGgpCi17Ci0gICAgc2l6ZV90IHdyaXRlVG8gPSAwOwotICAgIHNpemVfdCByZWFk
RnJvbSA9IDA7Ci0gICAgd2hpbGUgKHJlYWRGcm9tIDwgbGVuZ3RoKSB7Ci0gICAgICAgIFVJTlQg
dHlwZSA9IFBhdGhHZXRDaGFyVHlwZShwc3pbcmVhZEZyb21dKTsKLSAgICAgICAgaWYgKCFwc3pb
cmVhZEZyb21dIHx8IHR5cGUgJiAoR0NUX0xGTkNIQVIgfCBHQ1RfU0hPUlRDSEFSKSkKLSAgICAg
ICAgICAgIHBzelt3cml0ZVRvKytdID0gcHN6W3JlYWRGcm9tXTsKLQotICAgICAgICByZWFkRnJv
bSsrOwotICAgIH0KLSAgICBwc3pbd3JpdGVUb10gPSAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBT
dHJpbmcgZmlsZXN5c3RlbVBhdGhGcm9tVXJsT3JUaXRsZShjb25zdCBTdHJpbmcmIHVybCwgY29u
c3QgU3RyaW5nJiB0aXRsZSwgY29uc3QgVUNoYXIqIGV4dGVuc2lvbiwgYm9vbCBpc0xpbmspCi17
Ci0jaWYgT1MoV0lOQ0UpCi0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gU3RyaW5n
KCk7Ci0jZWxzZQotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgZnNQYXRoTWF4TGVuZ3RoRXhjbHVk
aW5nTnVsbFRlcm1pbmF0b3IgPSBNQVhfUEFUSCAtIDE7Ci0gICAgYm9vbCB1c2VkVVJMID0gZmFs
c2U7Ci0gICAgV0NIQVIgZnNQYXRoQnVmZmVyW01BWF9QQVRIXTsKLSAgICBmc1BhdGhCdWZmZXJb
MF0gPSAwOwotICAgIGludCBleHRlbnNpb25MZW4gPSBleHRlbnNpb24gPyBsc3RybGVuKGV4dGVu
c2lvbikgOiAwOwotICAgIGludCBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24gPSBm
c1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdOdWxsVGVybWluYXRvciAtIGV4dGVuc2lvbkxlbjsKLQot
ICAgIGlmICghdGl0bGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNpemVfdCBsZW4gPSBtaW48c2l6
ZV90Pih0aXRsZS5sZW5ndGgoKSwgZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5nRXh0ZW5zaW9uKTsK
LSAgICAgICAgQ29weU1lbW9yeShmc1BhdGhCdWZmZXIsIHRpdGxlLmNoYXJhY3RlcnMoKSwgbGVu
ICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgICAgIGZzUGF0aEJ1ZmZlcltsZW5dID0gMDsKLSAgICAg
ICAgcGF0aFJlbW92ZUJhZEZTQ2hhcmFjdGVycyhmc1BhdGhCdWZmZXIsIGxlbik7Ci0gICAgfQot
Ci0gICAgaWYgKCFsc3RybGVuKGZzUGF0aEJ1ZmZlcikpIHsKLSAgICAgICAgS1VSTCBrdXJsKFBh
cnNlZFVSTFN0cmluZywgdXJsKTsKLSAgICAgICAgdXNlZFVSTCA9IHRydWU7Ci0gICAgICAgIC8v
IFRoZSBmaWxlbmFtZSBmb3IgYW55IGNvbnRlbnQgYmFzZWQgZHJhZyBvciBmaWxlIHVybCBzaG91
bGQgYmUgdGhlIGxhc3QgZWxlbWVudCBvZiAKLSAgICAgICAgLy8gdGhlIHBhdGguICBJZiB3ZSBj
YW4ndCBmaW5kIGl0LCBvciB3ZSdyZSBjb21pbmcgdXAgd2l0aCB0aGUgbmFtZSBmb3IgYSBsaW5r
Ci0gICAgICAgIC8vIHdlIGp1c3QgdXNlIHRoZSBlbnRpcmUgdXJsLgotICAgICAgICBEV09SRCBs
ZW4gPSBmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb247Ci0gICAgICAgIFN0cmluZyBs
YXN0Q29tcG9uZW50ID0ga3VybC5sYXN0UGF0aENvbXBvbmVudCgpOwotICAgICAgICBpZiAoa3Vy
bC5pc0xvY2FsRmlsZSgpIHx8ICghaXNMaW5rICYmICFsYXN0Q29tcG9uZW50LmlzRW1wdHkoKSkp
IHsKLSAgICAgICAgICAgIGxlbiA9IG1pbjxEV09SRD4oZnNQYXRoTWF4TGVuZ3RoRXhjbHVkaW5n
RXh0ZW5zaW9uLCBsYXN0Q29tcG9uZW50Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgIENvcHlNZW1v
cnkoZnNQYXRoQnVmZmVyLCBsYXN0Q29tcG9uZW50LmNoYXJhY3RlcnMoKSwgbGVuICogc2l6ZW9m
KFVDaGFyKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZW4gPSBtaW48RFdPUkQ+
KGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4dGVuc2lvbiwgdXJsLmxlbmd0aCgpKTsKLSAgICAg
ICAgICAgIENvcHlNZW1vcnkoZnNQYXRoQnVmZmVyLCB1cmwuY2hhcmFjdGVycygpLCBsZW4gKiBz
aXplb2YoVUNoYXIpKTsKLSAgICAgICAgfQotICAgICAgICBmc1BhdGhCdWZmZXJbbGVuXSA9IDA7
Ci0gICAgICAgIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoZnNQYXRoQnVmZmVyLCBsZW4pOwot
ICAgIH0KLQotICAgIGlmICghZXh0ZW5zaW9uKQotICAgICAgICByZXR1cm4gU3RyaW5nKHN0YXRp
Y19jYXN0PFVDaGFyKj4oZnNQYXRoQnVmZmVyKSk7Ci0KLSAgICBpZiAoIWlzTGluayAmJiB1c2Vk
VVJMKSB7Ci0gICAgICAgIFBhdGhSZW5hbWVFeHRlbnNpb24oZnNQYXRoQnVmZmVyLCBleHRlbnNp
b24pOwotICAgICAgICByZXR1cm4gU3RyaW5nKHN0YXRpY19jYXN0PFVDaGFyKj4oZnNQYXRoQnVm
ZmVyKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1ha2VTdHJpbmcoc3RhdGljX2Nhc3Q8Y29uc3Qg
VUNoYXIqPihmc1BhdGhCdWZmZXIpLCBleHRlbnNpb24pOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBI
R0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoU2hhcmVkQnVmZmVyKiBkYXRhKQot
ewotICAgIEhHTE9CQUwgbWVtT2JqID0gR2xvYmFsQWxsb2MoR1BUUiwgZGF0YS0+c2l6ZSgpKTsK
LSAgICBpZiAoIW1lbU9iaikgCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgY2hhciogZmlsZUNv
bnRlbnRzID0gKFBTVFIpR2xvYmFsTG9jayhtZW1PYmopOwotCi0gICAgQ29weU1lbW9yeShmaWxl
Q29udGVudHMsIGRhdGEtPmRhdGEoKSwgZGF0YS0+c2l6ZSgpKTsKLSAgICAKLSAgICBHbG9iYWxV
bmxvY2sobWVtT2JqKTsKLSAgICAKLSAgICByZXR1cm4gbWVtT2JqOwotfQotCi1zdGF0aWMgSEdM
T0JBTCBjcmVhdGVHbG9iYWxIRHJvcENvbnRlbnQoY29uc3QgS1VSTCYgdXJsLCBTdHJpbmcmIGZp
bGVOYW1lLCBTaGFyZWRCdWZmZXIqIGRhdGEpCi17Ci0gICAgaWYgKGZpbGVOYW1lLmlzRW1wdHko
KSB8fCAhZGF0YSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBXQ0hBUiBmaWxlUGF0aFtNQVhf
UEFUSF07Ci0KLSAgICBpZiAodXJsLmlzTG9jYWxGaWxlKCkpIHsKLSAgICAgICAgU3RyaW5nIGxv
Y2FsUGF0aCA9IGRlY29kZVVSTEVzY2FwZVNlcXVlbmNlcyh1cmwucGF0aCgpKTsKLSAgICAgICAg
Ly8gd2luZG93cyBkb2VzIG5vdCBlbmpveSBhIGxlYWRpbmcgc2xhc2ggb24gcGF0aHMKLSAgICAg
ICAgaWYgKGxvY2FsUGF0aFswXSA9PSAnLycpCi0gICAgICAgICAgICBsb2NhbFBhdGggPSBsb2Nh
bFBhdGguc3Vic3RyaW5nKDEpOwotICAgICAgICBMUENXU1RSIGxvY2FsUGF0aFN0ciA9IGxvY2Fs
UGF0aC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpOwotICAgICAgICBpZiAod2NzbGVu
KGxvY2FsUGF0aFN0cikgKyAxIDwgTUFYX1BBVEgpCi0gICAgICAgICAgICB3Y3NjcHlfcyhmaWxl
UGF0aCwgTUFYX1BBVEgsIGxvY2FsUGF0aFN0cik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAg
IHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0jaWYgT1MoV0lOQ0UpCi0gICAgICAgIG5vdEltcGxl
bWVudGVkKCk7Ci0gICAgICAgIHJldHVybiAwOwotI2Vsc2UKLSAgICAgICAgV0NIQVIgdGVtcFBh
dGhbTUFYX1BBVEhdOwotICAgICAgICBXQ0hBUiBleHRlbnNpb25bTUFYX1BBVEhdOwotICAgICAg
ICBpZiAoITo6R2V0VGVtcFBhdGgoV1RGX0FSUkFZX0xFTkdUSCh0ZW1wUGF0aCksIHRlbXBQYXRo
KSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoITo6UGF0aEFwcGVuZCh0ZW1w
UGF0aCwgZmlsZU5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSkpCi0gICAgICAg
ICAgICByZXR1cm4gMDsKLSAgICAgICAgTFBDV1NUUiBmb3VuZEV4dGVuc2lvbiA9IDo6UGF0aEZp
bmRFeHRlbnNpb24odGVtcFBhdGgpOwotICAgICAgICBpZiAoZm91bmRFeHRlbnNpb24pIHsKLSAg
ICAgICAgICAgIGlmICh3Y3NjcHlfcyhleHRlbnNpb24sIE1BWF9QQVRILCBmb3VuZEV4dGVuc2lv
bikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAg
ICAgKmV4dGVuc2lvbiA9IDA7Ci0gICAgICAgIDo6UGF0aFJlbW92ZUV4dGVuc2lvbih0ZW1wUGF0
aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMTAwMDA7IGkrKykgewotICAgICAgICAg
ICAgaWYgKHN3cHJpbnRmX3MoZmlsZVBhdGgsIE1BWF9QQVRILCBURVhUKCIlcy0lZCVzIiksIHRl
bXBQYXRoLCBpLCBleHRlbnNpb24pID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwot
ICAgICAgICAgICAgaWYgKCE6OlBhdGhGaWxlRXhpc3RzKGZpbGVQYXRoKSkKLSAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBIQU5ETEUgdGVtcEZpbGVIYW5kbGUgPSBD
cmVhdGVGaWxlKGZpbGVQYXRoLCBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLCAwLCAwLCBD
UkVBVEVfQUxXQVlTLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIDApOwotICAgICAgICBpZiAodGVt
cEZpbGVIYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0gICAgICAgICAgICByZXR1cm4g
MDsKLQotICAgICAgICAvLyBXcml0ZSB0aGUgZGF0YSB0byB0aGlzIHRlbXAgZmlsZS4KLSAgICAg
ICAgRFdPUkQgd3JpdHRlbjsKLSAgICAgICAgQk9PTCB0ZW1wV3JpdGVTdWNjZWVkZWQgPSBXcml0
ZUZpbGUodGVtcEZpbGVIYW5kbGUsIGRhdGEtPmRhdGEoKSwgZGF0YS0+c2l6ZSgpLCAmd3JpdHRl
biwgMCk7Ci0gICAgICAgIENsb3NlSGFuZGxlKHRlbXBGaWxlSGFuZGxlKTsKLSAgICAgICAgaWYg
KCF0ZW1wV3JpdGVTdWNjZWVkZWQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAg
IH0KLQotICAgIFNJWkVfVCBkcm9wRmlsZXNTaXplID0gc2l6ZW9mKERST1BGSUxFUykgKyAoc2l6
ZW9mKFdDSEFSKSAqICh3Y3NsZW4oZmlsZVBhdGgpICsgMikpOwotICAgIEhHTE9CQUwgbWVtT2Jq
ID0gR2xvYmFsQWxsb2MoR0hORCB8IEdNRU1fU0hBUkUsIGRyb3BGaWxlc1NpemUpOwotICAgIGlm
ICghbWVtT2JqKSAKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBEUk9QRklMRVMqIGRyb3BGaWxl
cyA9IChEUk9QRklMRVMqKSBHbG9iYWxMb2NrKG1lbU9iaik7Ci0gICAgZHJvcEZpbGVzLT5wRmls
ZXMgPSBzaXplb2YoRFJPUEZJTEVTKTsKLSAgICBkcm9wRmlsZXMtPmZXaWRlID0gVFJVRTsKLSAg
ICB3Y3NjcHkoKExQV1NUUikoZHJvcEZpbGVzICsgMSksIGZpbGVQYXRoKTsgICAgCi0gICAgR2xv
YmFsVW5sb2NrKG1lbU9iaik7Ci0gICAgCi0gICAgcmV0dXJuIG1lbU9iajsKLX0KLQotc3RhdGlj
IEhHTE9CQUwgY3JlYXRlR2xvYmFsSW1hZ2VGaWxlRGVzY3JpcHRvcihjb25zdCBTdHJpbmcmIHVy
bCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ2FjaGVkSW1hZ2UqIGltYWdlKQotewotICAgIEFTU0VS
VF9BUkcoaW1hZ2UsIGltYWdlKTsKLSAgICBBU1NFUlQoaW1hZ2UtPmltYWdlKCktPmRhdGEoKSk7
Ci0KLSAgICBIUkVTVUxUIGhyID0gU19PSzsKLSAgICBIR0xPQkFMIG1lbU9iaiA9IDA7Ci0gICAg
U3RyaW5nIGZzUGF0aDsKLSAgICBtZW1PYmogPSBHbG9iYWxBbGxvYyhHUFRSLCBzaXplb2YoRklM
RUdST1VQREVTQ1JJUFRPUikpOwotICAgIGlmICghbWVtT2JqKQotICAgICAgICByZXR1cm4gMDsK
LQotICAgIEZJTEVHUk9VUERFU0NSSVBUT1IqIGZnZCA9IChGSUxFR1JPVVBERVNDUklQVE9SKilH
bG9iYWxMb2NrKG1lbU9iaik7Ci0gICAgbWVtc2V0KGZnZCwgMCwgc2l6ZW9mKEZJTEVHUk9VUERF
U0NSSVBUT1IpKTsKLSAgICBmZ2QtPmNJdGVtcyA9IDE7Ci0gICAgZmdkLT5mZ2RbMF0uZHdGbGFn
cyA9IEZEX0ZJTEVTSVpFOwotICAgIGZnZC0+ZmdkWzBdLm5GaWxlU2l6ZUxvdyA9IGltYWdlLT5p
bWFnZSgpLT5kYXRhKCktPnNpemUoKTsKLSAgICAKLSAgICBjb25zdCBTdHJpbmcmIHByZWZlcnJl
ZFRpdGxlID0gdGl0bGUuaXNFbXB0eSgpID8gaW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2VzdGVkRmls
ZW5hbWUoKSA6IHRpdGxlOwotICAgIFN0cmluZyBleHRlbnNpb24gPSBpbWFnZS0+aW1hZ2UoKS0+
ZmlsZW5hbWVFeHRlbnNpb24oKTsKLSAgICBpZiAoZXh0ZW5zaW9uLmlzRW1wdHkoKSkgewotICAg
ICAgICAvLyBEbyBub3QgY29udGludWUgcHJvY2Vzc2luZyBpbiB0aGUgcmFyZSBhbmQgdW51c3Vh
bCBjYXNlIHdoZXJlIGEgZGVjb2RlZCBpbWFnZSBpcyBub3QgYWJsZSAKLSAgICAgICAgLy8gdG8g
cHJvdmlkZSBhIGZpbGVuYW1lIGV4dGVuc2lvbi4gU29tZXRoaW5nIHRyaWNreSAobGlrZSBhIGJh
aXQtbi1zd2l0Y2gpIGlzIGdvaW5nIG9uCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBl
eHRlbnNpb24uaW5zZXJ0KCIuIiwgMCk7Ci0gICAgZnNQYXRoID0gZmlsZXN5c3RlbVBhdGhGcm9t
VXJsT3JUaXRsZSh1cmwsIHByZWZlcnJlZFRpdGxlLCBleHRlbnNpb24uY2hhcmFjdGVyc1dpdGhO
dWxsVGVybWluYXRpb24oKSwgZmFsc2UpOwotCi0gICAgaWYgKGZzUGF0aC5sZW5ndGgoKSA8PSAw
KSB7Ci0gICAgICAgIEdsb2JhbFVubG9jayhtZW1PYmopOwotICAgICAgICBHbG9iYWxGcmVlKG1l
bU9iaik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGludCBtYXhTaXplID0gbWlu
KGZzUGF0aC5sZW5ndGgoKSwgV1RGX0FSUkFZX0xFTkdUSChmZ2QtPmZnZFswXS5jRmlsZU5hbWUp
KTsKLSAgICBDb3B5TWVtb3J5KGZnZC0+ZmdkWzBdLmNGaWxlTmFtZSwgKExQQ1dTVFIpZnNQYXRo
LmNoYXJhY3RlcnMoKSwgbWF4U2l6ZSAqIHNpemVvZihVQ2hhcikpOwotICAgIEdsb2JhbFVubG9j
ayhtZW1PYmopOwotICAgIAotICAgIHJldHVybiBtZW1PYmo7Ci19Ci0KLQotLy8gd3JpdGVGaWxl
VG9EYXRhT2JqZWN0IHRha2VzIG93bmVyc2hpcCBvZiBmaWxlRGVzY3JpcHRvciBhbmQgZmlsZUNv
bnRlbnQKLXN0YXRpYyBIUkVTVUxUIHdyaXRlRmlsZVRvRGF0YU9iamVjdChJRGF0YU9iamVjdCog
ZGF0YU9iamVjdCwgSEdMT0JBTCBmaWxlRGVzY3JpcHRvciwgSEdMT0JBTCBmaWxlQ29udGVudCwg
SEdMT0JBTCBoRHJvcENvbnRlbnQpCi17Ci0gICAgSFJFU1VMVCBociA9IFNfT0s7Ci0gICAgRk9S
TUFURVRDKiBmZTsKLSAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OwotICAgIG1lZGl1bS50eW1l
ZCA9IFRZTUVEX0hHTE9CQUw7Ci0KLSAgICBpZiAoIWZpbGVEZXNjcmlwdG9yIHx8ICFmaWxlQ29u
dGVudCkKLSAgICAgICAgZ290byBleGl0OwotCi0gICAgLy8gRGVzY3JpcHRvcgotICAgIGZlID0g
ZmlsZURlc2NyaXB0b3JGb3JtYXQoKTsKLQotICAgIG1lZGl1bS5oR2xvYmFsID0gZmlsZURlc2Ny
aXB0b3I7Ci0KLSAgICBpZiAoRkFJTEVEKGhyID0gZGF0YU9iamVjdC0+U2V0RGF0YShmZSwgJm1l
ZGl1bSwgVFJVRSkpKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICAvLyBDb250ZW50cwotICAg
IGZlID0gZmlsZUNvbnRlbnRGb3JtYXRaZXJvKCk7Ci0gICAgbWVkaXVtLmhHbG9iYWwgPSBmaWxl
Q29udGVudDsKLSAgICBpZiAoRkFJTEVEKGhyID0gZGF0YU9iamVjdC0+U2V0RGF0YShmZSwgJm1l
ZGl1bSwgVFJVRSkpKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSNpZiBVU0UoQ0YpCi0gICAgLy8g
SERST1AKLSAgICBpZiAoaERyb3BDb250ZW50KSB7Ci0gICAgICAgIG1lZGl1bS5oR2xvYmFsID0g
aERyb3BDb250ZW50OwotICAgICAgICBociA9IGRhdGFPYmplY3QtPlNldERhdGEoY2ZIRHJvcEZv
cm1hdCgpLCAmbWVkaXVtLCBUUlVFKTsKLSAgICB9Ci0jZW5kaWYKLQotZXhpdDoKLSAgICBpZiAo
RkFJTEVEKGhyKSkgewotICAgICAgICBpZiAoZmlsZURlc2NyaXB0b3IpCi0gICAgICAgICAgICBH
bG9iYWxGcmVlKGZpbGVEZXNjcmlwdG9yKTsKLSAgICAgICAgaWYgKGZpbGVDb250ZW50KQotICAg
ICAgICAgICAgR2xvYmFsRnJlZShmaWxlQ29udGVudCk7Ci0gICAgICAgIGlmIChoRHJvcENvbnRl
bnQpCi0gICAgICAgICAgICBHbG9iYWxGcmVlKGhEcm9wQ29udGVudCk7Ci0gICAgfQotICAgIHJl
dHVybiBocjsKLX0KLQotUGFzc1JlZlB0cjxDbGlwYm9hcmQ+IENsaXBib2FyZDo6Y3JlYXRlKENs
aXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIERyYWdEYXRhKiBkcmFnRGF0YSwgRnJhbWUqIGZy
YW1lKQotewotICAgIGlmIChkcmFnRGF0YS0+cGxhdGZvcm1EYXRhKCkpCi0gICAgICAgIHJldHVy
biBDbGlwYm9hcmRXaW46OmNyZWF0ZShEcmFnQW5kRHJvcCwgZHJhZ0RhdGEtPnBsYXRmb3JtRGF0
YSgpLCBwb2xpY3ksIGZyYW1lKTsKLSAgICByZXR1cm4gQ2xpcGJvYXJkV2luOjpjcmVhdGUoRHJh
Z0FuZERyb3AsIGRyYWdEYXRhLT5kcmFnRGF0YU1hcCgpLCBwb2xpY3ksIGZyYW1lKTsKLX0KLQot
Q2xpcGJvYXJkV2luOjpDbGlwYm9hcmRXaW4oQ2xpcGJvYXJkVHlwZSBjbGlwYm9hcmRUeXBlLCBJ
RGF0YU9iamVjdCogZGF0YU9iamVjdCwgQ2xpcGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwgRnJh
bWUqIGZyYW1lKQotICAgIDogQ2xpcGJvYXJkKHBvbGljeSwgY2xpcGJvYXJkVHlwZSkKLSAgICAs
IG1fZGF0YU9iamVjdChkYXRhT2JqZWN0KQotICAgICwgbV93cml0YWJsZURhdGFPYmplY3QoMCkK
LSAgICAsIG1fZnJhbWUoZnJhbWUpCi17Ci19Ci0KLUNsaXBib2FyZFdpbjo6Q2xpcGJvYXJkV2lu
KENsaXBib2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgV0NEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBD
bGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBGcmFtZSogZnJhbWUpCi0gICAgOiBDbGlwYm9h
cmQocG9saWN5LCBjbGlwYm9hcmRUeXBlKQotICAgICwgbV9kYXRhT2JqZWN0KGRhdGFPYmplY3Qp
Ci0gICAgLCBtX3dyaXRhYmxlRGF0YU9iamVjdChkYXRhT2JqZWN0KQotICAgICwgbV9mcmFtZShm
cmFtZSkKLXsKLX0KLQotQ2xpcGJvYXJkV2luOjpDbGlwYm9hcmRXaW4oQ2xpcGJvYXJkVHlwZSBj
bGlwYm9hcmRUeXBlLCBjb25zdCBEcmFnRGF0YU1hcCYgZGF0YU1hcCwgQ2xpcGJvYXJkQWNjZXNz
UG9saWN5IHBvbGljeSwgRnJhbWUqIGZyYW1lKQotICAgIDogQ2xpcGJvYXJkKHBvbGljeSwgY2xp
cGJvYXJkVHlwZSkKLSAgICAsIG1fZGF0YU9iamVjdCgwKQotICAgICwgbV93cml0YWJsZURhdGFP
YmplY3QoMCkKLSAgICAsIG1fZnJhbWUoZnJhbWUpCi0gICAgLCBtX2RyYWdEYXRhTWFwKGRhdGFN
YXApCi17Ci19Ci0KLUNsaXBib2FyZFdpbjo6fkNsaXBib2FyZFdpbigpCi17Ci0gICAgaWYgKG1f
ZHJhZ0ltYWdlKQotICAgICAgICBtX2RyYWdJbWFnZS0+cmVtb3ZlQ2xpZW50KHRoaXMpOwotfQot
Ci1zdGF0aWMgYm9vbCB3cml0ZVVSTChXQ0RhdGFPYmplY3QgKmRhdGEsIGNvbnN0IEtVUkwmIHVy
bCwgU3RyaW5nIHRpdGxlLCBib29sIHdpdGhQbGFpblRleHQsIGJvb2wgd2l0aEhUTUwpCi17Ci0g
ICAgQVNTRVJUKGRhdGEpOwotCi0gICAgaWYgKHVybC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAKLSAgICBpZiAodGl0bGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHRpdGxl
ID0gdXJsLmxhc3RQYXRoQ29tcG9uZW50KCk7Ci0gICAgICAgIGlmICh0aXRsZS5pc0VtcHR5KCkp
Ci0gICAgICAgICAgICB0aXRsZSA9IHVybC5ob3N0KCk7Ci0gICAgfQotCi0gICAgU1RHTUVESVVN
IG1lZGl1bSA9IHswfTsKLSAgICBtZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOwotCi0gICAg
bWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKHVybCwgdGl0bGUpOwotICAgIGJvb2wg
c3VjY2VzcyA9IGZhbHNlOwotICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQoZGF0YS0+
U2V0RGF0YSh1cmxXRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgOjpHbG9iYWxG
cmVlKG1lZGl1bS5oR2xvYmFsKTsKLSAgICBlbHNlCi0gICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwot
Ci0gICAgaWYgKHdpdGhIVE1MKSB7Ci0gICAgICAgIFZlY3RvcjxjaGFyPiBjZmh0bWxEYXRhOwot
ICAgICAgICBtYXJrdXBUb0NGSFRNTCh1cmxUb01hcmt1cCh1cmwsIHRpdGxlKSwgIiIsIGNmaHRt
bERhdGEpOwotICAgICAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoY2ZodG1s
RGF0YSk7Ci0gICAgICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQoZGF0YS0+U2V0RGF0
YShodG1sRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkKLSAgICAgICAgICAgIDo6R2xvYmFsRnJl
ZShtZWRpdW0uaEdsb2JhbCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSB0
cnVlOwotICAgIH0KLQotICAgIGlmICh3aXRoUGxhaW5UZXh0KSB7Ci0gICAgICAgIG1lZGl1bS5o
R2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YSh1cmwuc3RyaW5nKCkpOwotICAgICAgICBpZiAobWVk
aXVtLmhHbG9iYWwgJiYgRkFJTEVEKGRhdGEtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAm
bWVkaXVtLCBUUlVFKSkpCi0gICAgICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwp
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICB9Ci0KLSAg
ICByZXR1cm4gc3VjY2VzczsKLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OmNsZWFyRGF0YShjb25z
dCBTdHJpbmcmIHR5cGUpCi17Ci0gICAgLy8gRklYTUU6IE5lZWQgdG8gYmUgYWJsZSB0byB3cml0
ZSB0byB0aGUgc3lzdGVtIGNsaXBib2FyZCA8cmRhcjovL3Byb2JsZW0vNTAxNTk0MT4KLSAgICBB
U1NFUlQoaXNGb3JEcmFnQW5kRHJvcCgpKTsKLSAgICBpZiAoIWNhbldyaXRlRGF0YSgpIHx8ICFt
X3dyaXRhYmxlRGF0YU9iamVjdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQ2xpcGJvYXJkRGF0
YVR5cGUgZGF0YVR5cGUgPSBjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKHR5cGUpOwotCi0gICAg
aWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBlVVJMKSB7Ci0gICAgICAgIG1fd3JpdGFi
bGVEYXRhT2JqZWN0LT5jbGVhckRhdGEodXJsV0Zvcm1hdCgpLT5jZkZvcm1hdCk7Ci0gICAgICAg
IG1fd3JpdGFibGVEYXRhT2JqZWN0LT5jbGVhckRhdGEodXJsRm9ybWF0KCktPmNmRm9ybWF0KTsK
LSAgICB9Ci0gICAgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBlVGV4dCkgewotICAg
ICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJEYXRhKHBsYWluVGV4dEZvcm1hdCgpLT5j
ZkZvcm1hdCk7Ci0gICAgICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0LT5jbGVhckRhdGEocGxhaW5U
ZXh0V0Zvcm1hdCgpLT5jZkZvcm1hdCk7Ci0gICAgfQotCi19Ci0KLXZvaWQgQ2xpcGJvYXJkV2lu
OjpjbGVhckRhdGEoKQotewotICAgIC8vIEZJWE1FOiBOZWVkIHRvIGJlIGFibGUgdG8gd3JpdGUg
dG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQgPHJkYXI6Ly9wcm9ibGVtLzUwMTU5NDE+Ci0gICAgQVNT
RVJUKGlzRm9yRHJhZ0FuZERyb3AoKSk7Ci0gICAgaWYgKCFjYW5Xcml0ZURhdGEoKSkKLSAgICAg
ICAgcmV0dXJuOwotICAgIAotICAgIG1fd3JpdGFibGVEYXRhT2JqZWN0ID0gMDsKLSAgICBXQ0Rh
dGFPYmplY3Q6OmNyZWF0ZUluc3RhbmNlKCZtX3dyaXRhYmxlRGF0YU9iamVjdCk7Ci0gICAgbV9k
YXRhT2JqZWN0ID0gbV93cml0YWJsZURhdGFPYmplY3Q7Ci19Ci0KLVN0cmluZyBDbGlwYm9hcmRX
aW46OmdldERhdGEoY29uc3QgU3RyaW5nJiB0eXBlKSBjb25zdAoteyAgICAgCi0gICAgaWYgKCFj
YW5SZWFkRGF0YSgpIHx8ICghbV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgp
KSkKLSAgICAgICAgcmV0dXJuICIiOwotCi0gICAgQ2xpcGJvYXJkRGF0YVR5cGUgZGF0YVR5cGUg
PSBjbGlwYm9hcmRUeXBlRnJvbU1JTUVUeXBlKHR5cGUpOwotICAgIGlmIChkYXRhVHlwZSA9PSBD
bGlwYm9hcmREYXRhVHlwZVRleHQpCi0gICAgICAgIHJldHVybiBtX2RhdGFPYmplY3QgPyBnZXRQ
bGFpblRleHQobV9kYXRhT2JqZWN0LmdldCgpKSA6IGdldFBsYWluVGV4dCgmbV9kcmFnRGF0YU1h
cCk7Ci0gICAgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBlVVJMKQotICAgICAgICBy
ZXR1cm4gbV9kYXRhT2JqZWN0ID8gZ2V0VVJMKG1fZGF0YU9iamVjdC5nZXQoKSwgRHJhZ0RhdGE6
OkRvTm90Q29udmVydEZpbGVuYW1lcykgOiBnZXRVUkwoJm1fZHJhZ0RhdGFNYXAsIERyYWdEYXRh
OjpEb05vdENvbnZlcnRGaWxlbmFtZXMpOwotICAgIGVsc2UgaWYgKGRhdGFUeXBlID09IENsaXBi
b2FyZERhdGFUeXBlVGV4dEhUTUwpIHsKLSAgICAgICAgU3RyaW5nIGRhdGEgPSBtX2RhdGFPYmpl
Y3QgPyBnZXRUZXh0SFRNTChtX2RhdGFPYmplY3QuZ2V0KCkpIDogZ2V0VGV4dEhUTUwoJm1fZHJh
Z0RhdGFNYXApOwotICAgICAgICBpZiAoIWRhdGEuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0
dXJuIGRhdGE7Ci0gICAgICAgIHJldHVybiBtX2RhdGFPYmplY3QgPyBnZXRDRkhUTUwobV9kYXRh
T2JqZWN0LmdldCgpKSA6IGdldENGSFRNTCgmbV9kcmFnRGF0YU1hcCk7Ci0gICAgfQotICAgIAot
ICAgIHJldHVybiAiIjsKLX0KLQotYm9vbCBDbGlwYm9hcmRXaW46OnNldERhdGEoY29uc3QgU3Ry
aW5nJiB0eXBlLCBjb25zdCBTdHJpbmcmIGRhdGEpCi17Ci0gICAgLy8gRklYTUU6IE5lZWQgdG8g
YmUgYWJsZSB0byB3cml0ZSB0byB0aGUgc3lzdGVtIGNsaXBib2FyZCA8cmRhcjovL3Byb2JsZW0v
NTAxNTk0MT4KLSAgICBBU1NFUlQoaXNGb3JEcmFnQW5kRHJvcCgpKTsKLSAgICBpZiAoIWNhbldy
aXRlRGF0YSgpIHx8ICFtX3dyaXRhYmxlRGF0YU9iamVjdCkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgQ2xpcGJvYXJkRGF0YVR5cGUgd2luVHlwZSA9IGNsaXBib2FyZFR5cGVGcm9tTUlN
RVR5cGUodHlwZSk7Ci0KLSAgICBpZiAod2luVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVSTCkK
LSAgICAgICAgcmV0dXJuIFdlYkNvcmU6OndyaXRlVVJMKG1fd3JpdGFibGVEYXRhT2JqZWN0Lmdl
dCgpLCBLVVJMKFBhcnNlZFVSTFN0cmluZywgZGF0YSksIFN0cmluZygpLCBmYWxzZSwgdHJ1ZSk7
Ci0KLSAgICBpZiAod2luVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRleHQpIHsKLSAgICAgICAg
U1RHTUVESVVNIG1lZGl1bSA9IHswfTsKLSAgICAgICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdM
T0JBTDsKLSAgICAgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEpOwot
ICAgICAgICBpZiAoIW1lZGl1bS5oR2xvYmFsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgICAgIGlmIChGQUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxhaW5U
ZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpIHsKLSAgICAgICAgICAgIDo6R2xvYmFsRnJl
ZShtZWRpdW0uaEdsb2JhbCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0K
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1z
dGF0aWMgdm9pZCBhZGRNaW1lVHlwZXNGb3JGb3JtYXQoTGlzdEhhc2hTZXQ8U3RyaW5nPiYgcmVz
dWx0cywgY29uc3QgRk9STUFURVRDJiBmb3JtYXQpCi17Ci0gICAgLy8gVVJMIGFuZCBUZXh0IGFy
ZSBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIElFJ3MgbW9kZWwKLSAgICBpZiAoZm9y
bWF0LmNmRm9ybWF0ID09IHVybEZvcm1hdCgpLT5jZkZvcm1hdCB8fCBmb3JtYXQuY2ZGb3JtYXQg
PT0gdXJsV0Zvcm1hdCgpLT5jZkZvcm1hdCkgewotICAgICAgICByZXN1bHRzLmFkZCgiVVJMIik7
Ci0gICAgICAgIHJlc3VsdHMuYWRkKCJ0ZXh0L3VyaS1saXN0Iik7Ci0gICAgfQotCi0gICAgaWYg
KGZvcm1hdC5jZkZvcm1hdCA9PSBwbGFpblRleHRXRm9ybWF0KCktPmNmRm9ybWF0IHx8IGZvcm1h
dC5jZkZvcm1hdCA9PSBwbGFpblRleHRGb3JtYXQoKS0+Y2ZGb3JtYXQpIHsKLSAgICAgICAgcmVz
dWx0cy5hZGQoIlRleHQiKTsKLSAgICAgICAgcmVzdWx0cy5hZGQoInRleHQvcGxhaW4iKTsKLSAg
ICB9Ci19Ci0KLS8vIGV4dGVuc2lvbnMgYmV5b25kIElFJ3MgQVBJCi1MaXN0SGFzaFNldDxTdHJp
bmc+IENsaXBib2FyZFdpbjo6dHlwZXMoKSBjb25zdAoteyAKLSAgICBMaXN0SGFzaFNldDxTdHJp
bmc+IHJlc3VsdHM7Ci0gICAgaWYgKCFjYW5SZWFkVHlwZXMoKSkKLSAgICAgICAgcmV0dXJuIHJl
c3VsdHM7Ci0KLSAgICBpZiAoIW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFwLmlzRW1wdHko
KSkKLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0KLSAgICBpZiAobV9kYXRhT2JqZWN0KSB7Ci0g
ICAgICAgIENPTVB0cjxJRW51bUZPUk1BVEVUQz4gaXRyOwotCi0gICAgICAgIGlmIChGQUlMRUQo
bV9kYXRhT2JqZWN0LT5FbnVtRm9ybWF0RXRjKERBVEFESVJfR0VULCAmaXRyKSkpCi0gICAgICAg
ICAgICByZXR1cm4gcmVzdWx0czsKLQotICAgICAgICBpZiAoIWl0cikKLSAgICAgICAgICAgIHJl
dHVybiByZXN1bHRzOwotCi0gICAgICAgIEZPUk1BVEVUQyBkYXRhOwotCi0gICAgICAgIC8vIElF
bnVtRk9STUFURVRDOjpOZXh0IHJldHVybnMgU19GQUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBp
dGVtcy4KLSAgICAgICAgd2hpbGUgKGl0ci0+TmV4dCgxLCAmZGF0YSwgMCkgPT0gU19PSykKLSAg
ICAgICAgICAgIGFkZE1pbWVUeXBlc0ZvckZvcm1hdChyZXN1bHRzLCBkYXRhKTsKLSAgICB9IGVs
c2UgewotICAgICAgICBmb3IgKERyYWdEYXRhTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fZHJh
Z0RhdGFNYXAuYmVnaW4oKTsgaXQgIT0gbV9kcmFnRGF0YU1hcC5lbmQoKTsgKytpdCkgewotICAg
ICAgICAgICAgRk9STUFURVRDIGRhdGE7Ci0gICAgICAgICAgICBkYXRhLmNmRm9ybWF0ID0gKCpp
dCkua2V5OwotICAgICAgICAgICAgYWRkTWltZVR5cGVzRm9yRm9ybWF0KHJlc3VsdHMsIGRhdGEp
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdHM7Ci19Ci0KLVBhc3NSZWZQ
dHI8RmlsZUxpc3Q+IENsaXBib2FyZFdpbjo6ZmlsZXMoKSBjb25zdAotewotI2lmIFVTRShDRikK
LSAgICBSZWZQdHI8RmlsZUxpc3Q+IGZpbGVzID0gRmlsZUxpc3Q6OmNyZWF0ZSgpOwotICAgIGlm
ICghY2FuUmVhZERhdGEoKSkKLSAgICAgICAgcmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKLQotICAg
IGlmICghbV9kYXRhT2JqZWN0ICYmIG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQotICAgICAgICBy
ZXR1cm4gZmlsZXMucmVsZWFzZSgpOwotCi0gICAgaWYgKG1fZGF0YU9iamVjdCkgewotICAgICAg
ICBTVEdNRURJVU0gbWVkaXVtOwotICAgICAgICBpZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+R2V0
RGF0YShjZkhEcm9wRm9ybWF0KCksICZtZWRpdW0pKSkKLSAgICAgICAgICAgIHJldHVybiBmaWxl
cy5yZWxlYXNlKCk7Ci0KLSAgICAgICAgSERST1AgaGRyb3AgPSByZWludGVycHJldF9jYXN0PEhE
Uk9QPihHbG9iYWxMb2NrKG1lZGl1bS5oR2xvYmFsKSk7Ci0gICAgICAgIGlmICghaGRyb3ApCi0g
ICAgICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgpOwotCi0gICAgICAgIFdDSEFSIGZpbGVu
YW1lW01BWF9QQVRIXTsKLSAgICAgICAgVUlOVCBmaWxlQ291bnQgPSBEcmFnUXVlcnlGaWxlVyho
ZHJvcCwgMHhGRkZGRkZGRiwgMCwgMCk7Ci0gICAgICAgIGZvciAoVUlOVCBpID0gMDsgaSA8IGZp
bGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIURyYWdRdWVyeUZpbGVXKGhkcm9wLCBp
LCBmaWxlbmFtZSwgV1RGX0FSUkFZX0xFTkdUSChmaWxlbmFtZSkpKQotICAgICAgICAgICAgICAg
IGNvbnRpbnVlOwotICAgICAgICAgICAgZmlsZXMtPmFwcGVuZChGaWxlOjpjcmVhdGUocmVpbnRl
cnByZXRfY2FzdDxVQ2hhcio+KGZpbGVuYW1lKSwgRmlsZTo6QWxsQ29udGVudFR5cGVzKSk7Ci0g
ICAgICAgIH0KLQotICAgICAgICBHbG9iYWxVbmxvY2sobWVkaXVtLmhHbG9iYWwpOwotICAgICAg
ICBSZWxlYXNlU3RnTWVkaXVtKCZtZWRpdW0pOwotICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFz
ZSgpOwotICAgIH0KLSAgICBpZiAoIW1fZHJhZ0RhdGFNYXAuY29udGFpbnMoY2ZIRHJvcEZvcm1h
dCgpLT5jZkZvcm1hdCkpCi0gICAgICAgIHJldHVybiBmaWxlcy5yZWxlYXNlKCk7Ci0gICAgVmVj
dG9yPFN0cmluZz4gZmlsZXNWZWN0b3IgPSBtX2RyYWdEYXRhTWFwLmdldChjZkhEcm9wRm9ybWF0
KCktPmNmRm9ybWF0KTsKLSAgICBmb3IgKFZlY3RvcjxTdHJpbmc+OjppdGVyYXRvciBpdCA9IGZp
bGVzVmVjdG9yLmJlZ2luKCk7IGl0ICE9IGZpbGVzVmVjdG9yLmVuZCgpOyArK2l0KQotICAgICAg
ICBmaWxlcy0+YXBwZW5kKEZpbGU6OmNyZWF0ZSgqaXQpKTsKLSAgICByZXR1cm4gZmlsZXMucmVs
ZWFzZSgpOwotI2Vsc2UKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVybiAwOwotI2Vu
ZGlmCi19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjpzZXREcmFnSW1hZ2UoQ2FjaGVkSW1hZ2UqIGlt
YWdlLCBOb2RlICpub2RlLCBjb25zdCBJbnRQb2ludCAmbG9jKQotewotICAgIGlmICghY2FuU2V0
RHJhZ0ltYWdlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgaWYgKG1fZHJhZ0lt
YWdlKQotICAgICAgICBtX2RyYWdJbWFnZS0+cmVtb3ZlQ2xpZW50KHRoaXMpOwotICAgIG1fZHJh
Z0ltYWdlID0gaW1hZ2U7Ci0gICAgaWYgKG1fZHJhZ0ltYWdlKQotICAgICAgICBtX2RyYWdJbWFn
ZS0+YWRkQ2xpZW50KHRoaXMpOwotCi0gICAgbV9kcmFnTG9jID0gbG9jOwotICAgIG1fZHJhZ0lt
YWdlRWxlbWVudCA9IG5vZGU7Ci19Ci0KLXZvaWQgQ2xpcGJvYXJkV2luOjpzZXREcmFnSW1hZ2Uo
Q2FjaGVkSW1hZ2UqIGltZywgY29uc3QgSW50UG9pbnQgJmxvYykKLXsKLSAgICBzZXREcmFnSW1h
Z2UoaW1nLCAwLCBsb2MpOwotfQotCi12b2lkIENsaXBib2FyZFdpbjo6c2V0RHJhZ0ltYWdlRWxl
bWVudChOb2RlICpub2RlLCBjb25zdCBJbnRQb2ludCAmbG9jKQotewotICAgIHNldERyYWdJbWFn
ZSgwLCBub2RlLCBsb2MpOwotfQotCi1EcmFnSW1hZ2VSZWYgQ2xpcGJvYXJkV2luOjpjcmVhdGVE
cmFnSW1hZ2UoSW50UG9pbnQmIGxvYykgY29uc3QKLXsKICAgICBIQklUTUFQIHJlc3VsdCA9IDA7
CiAgICAgaWYgKG1fZHJhZ0ltYWdlKSB7CiAjaWYgVVNFKENBSVJPKSB8fCBVU0UoQ0cpCiAgICAg
ICAgIHJlc3VsdCA9IGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShtX2RyYWdJbWFnZS0+aW1hZ2Uo
KSk7ICAgICAgICAKLSAgICAgICAgbG9jID0gbV9kcmFnTG9jOworICAgICAgICBkcmFnTG9jYXRp
b24gPSBtX2RyYWdMb2M7CiAjZWxzZQogICAgICAgICBub3RJbXBsZW1lbnRlZCgpOwogI2VuZGlm
CiAgICAgfSBlbHNlIGlmIChtX2RyYWdJbWFnZUVsZW1lbnQpIHsKICAgICAgICAgTm9kZSogbm9k
ZSA9IG1fZHJhZ0ltYWdlRWxlbWVudC5nZXQoKTsKICAgICAgICAgcmVzdWx0ID0gbm9kZS0+ZG9j
dW1lbnQoKS0+ZnJhbWUoKS0+bm9kZUltYWdlKG5vZGUpOwotICAgICAgICBsb2MgPSBtX2RyYWdM
b2M7CisgICAgICAgIGRyYWdMb2NhdGlvbiA9IG1fZHJhZ0xvYzsKICAgICB9CiAgICAgcmV0dXJu
IHJlc3VsdDsKIH0KIAotc3RhdGljIENhY2hlZEltYWdlKiBnZXRDYWNoZWRJbWFnZShFbGVtZW50
KiBlbGVtZW50KQordm9pZCBDbGlwYm9hcmQ6OmRlY2xhcmVBbmRXcml0ZURyYWdJbWFnZShFbGVt
ZW50KiBlbGVtZW50LCBjb25zdCBLVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUsIEZyYW1l
KiBmcmFtZSkKIHsKLSAgICAvLyBBdHRlbXB0IHRvIHB1bGwgQ2FjaGVkSW1hZ2UgZnJvbSBlbGVt
ZW50Ci0gICAgQVNTRVJUKGVsZW1lbnQpOwotICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBl
bGVtZW50LT5yZW5kZXJlcigpOwotICAgIGlmICghcmVuZGVyZXIgfHwgIXJlbmRlcmVyLT5pc0lt
YWdlKCkpIAotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBSZW5kZXJJbWFnZSogaW1hZ2Ug
PSB0b1JlbmRlckltYWdlKHJlbmRlcmVyKTsKLSAgICBpZiAoaW1hZ2UtPmNhY2hlZEltYWdlKCkg
JiYgIWltYWdlLT5jYWNoZWRJbWFnZSgpLT5lcnJvck9jY3VycmVkKCkpCi0gICAgICAgIHJldHVy
biBpbWFnZS0+Y2FjaGVkSW1hZ2UoKTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9p
ZCB3cml0ZUltYWdlVG9EYXRhT2JqZWN0KElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBFbGVtZW50
KiBlbGVtZW50LCBjb25zdCBLVVJMJiB1cmwpCi17Ci0gICAgLy8gU2hvdmUgaW1hZ2UgZGF0YSBp
bnRvIGEgRGF0YU9iamVjdCBmb3IgdXNlIGFzIGEgZmlsZQotICAgIENhY2hlZEltYWdlKiBjYWNo
ZWRJbWFnZSA9IGdldENhY2hlZEltYWdlKGVsZW1lbnQpOwotICAgIGlmICghY2FjaGVkSW1hZ2Ug
fHwgIWNhY2hlZEltYWdlLT5pbWFnZUZvclJlbmRlcmVyKGVsZW1lbnQtPnJlbmRlcmVyKCkpIHx8
ICFjYWNoZWRJbWFnZS0+aXNMb2FkZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU2hhcmVk
QnVmZmVyKiBpbWFnZUJ1ZmZlciA9IGNhY2hlZEltYWdlLT5pbWFnZUZvclJlbmRlcmVyKGVsZW1l
bnQtPnJlbmRlcmVyKCkpLT5kYXRhKCk7Ci0gICAgaWYgKCFpbWFnZUJ1ZmZlciB8fCAhaW1hZ2VC
dWZmZXItPnNpemUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgSEdMT0JBTCBpbWFnZUZpbGVE
ZXNjcmlwdG9yID0gY3JlYXRlR2xvYmFsSW1hZ2VGaWxlRGVzY3JpcHRvcih1cmwuc3RyaW5nKCks
IGVsZW1lbnQtPmdldEF0dHJpYnV0ZShhbHRBdHRyKSwgY2FjaGVkSW1hZ2UpOwotICAgIGlmICgh
aW1hZ2VGaWxlRGVzY3JpcHRvcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgSEdMT0JBTCBpbWFn
ZUZpbGVDb250ZW50ID0gY3JlYXRlR2xvYmFsSW1hZ2VGaWxlQ29udGVudChpbWFnZUJ1ZmZlcik7
Ci0gICAgaWYgKCFpbWFnZUZpbGVDb250ZW50KSB7Ci0gICAgICAgIEdsb2JhbEZyZWUoaW1hZ2VG
aWxlRGVzY3JpcHRvcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZmls
ZU5hbWUgPSBjYWNoZWRJbWFnZS0+cmVzcG9uc2UoKS5zdWdnZXN0ZWRGaWxlbmFtZSgpOwotICAg
IEhHTE9CQUwgaERyb3BDb250ZW50ID0gY3JlYXRlR2xvYmFsSERyb3BDb250ZW50KHVybCwgZmls
ZU5hbWUsIGltYWdlQnVmZmVyKTsKLSAgICBpZiAoIWhEcm9wQ29udGVudCkgewotICAgICAgICBH
bG9iYWxGcmVlKGhEcm9wQ29udGVudCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3
cml0ZUZpbGVUb0RhdGFPYmplY3QoZGF0YU9iamVjdCwgaW1hZ2VGaWxlRGVzY3JpcHRvciwgaW1h
Z2VGaWxlQ29udGVudCwgaERyb3BDb250ZW50KTsKLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OmRl
Y2xhcmVBbmRXcml0ZURyYWdJbWFnZShFbGVtZW50KiBlbGVtZW50LCBjb25zdCBLVVJMJiB1cmws
IGNvbnN0IFN0cmluZyYgdGl0bGUsIEZyYW1lKiBmcmFtZSkKLXsKICAgICAvLyBPcmRlciBpcyBp
bXBvcnRhbnQgaGVyZSBmb3IgRXhwbG9yZXIncyBzYWtlCi0gICAgaWYgKCFtX3dyaXRhYmxlRGF0
YU9iamVjdCkKLSAgICAgICAgIHJldHVybjsKLSAgICBXZWJDb3JlOjp3cml0ZVVSTChtX3dyaXRh
YmxlRGF0YU9iamVjdC5nZXQoKSwgdXJsLCB0aXRsZSwgdHJ1ZSwgZmFsc2UpOwotCi0gICAgd3Jp
dGVJbWFnZVRvRGF0YU9iamVjdChtX3dyaXRhYmxlRGF0YU9iamVjdC5nZXQoKSwgZWxlbWVudCwg
dXJsKTsKLQotICAgIEF0b21pY1N0cmluZyBpbWFnZVVSTCA9IGVsZW1lbnQtPmdldEF0dHJpYnV0
ZShzcmNBdHRyKTsKKyAgICBpZiAoIW1fcGFzdGVib2FyZC0+d3JpdGFibGVEYXRhT2JqZWN0KCkp
CisgICAgICAgIHJldHVybjsKKyAgICBtX3Bhc3RlYm9hcmQtPndyaXRlVVJMVG9Xcml0YWJsZURh
dGFPYmplY3QodXJsLCB0aXRsZSk7CisgICAgbV9wYXN0ZWJvYXJkLT53cml0ZUltYWdlVG9EYXRh
T2JqZWN0KGVsZW1lbnQsIHVybCk7CisgICAgQXRvbWljU3RyaW5nIGltYWdlVVJMID0gZWxlbWVu
dC0+Z2V0QXR0cmlidXRlKEhUTUxOYW1lczo6c3JjQXR0cik7CiAgICAgaWYgKGltYWdlVVJMLmlz
RW1wdHkoKSkgCiAgICAgICAgIHJldHVybjsKIApAQCAtNjg4LDEzMSArNzgsOCBAQA0KICAgICBW
ZWN0b3I8Y2hhcj4gZGF0YTsKICAgICBtYXJrdXBUb0NGSFRNTChjcmVhdGVNYXJrdXAoZWxlbWVu
dCwgSW5jbHVkZU5vZGUsIDAsIFJlc29sdmVBbGxVUkxzKSwgIiIsIGRhdGEpOwogICAgIG1lZGl1
bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YShkYXRhKTsKLSAgICBpZiAobWVkaXVtLmhHbG9i
YWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKGh0bWxGb3JtYXQoKSwg
Jm1lZGl1bSwgVFJVRSkpKQorICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQobV9wYXN0
ZWJvYXJkLT53cml0YWJsZURhdGFPYmplY3QoKS0+U2V0RGF0YShodG1sRm9ybWF0KCksICZtZWRp
dW0sIFRSVUUpKSkKICAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKIH0KIAot
dm9pZCBDbGlwYm9hcmRXaW46OndyaXRlVVJMKGNvbnN0IEtVUkwmIGt1cmwsIGNvbnN0IFN0cmlu
ZyYgdGl0bGVTdHIsIEZyYW1lKikKLXsKLSAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQot
ICAgICAgICAgcmV0dXJuOwotICAgIFdlYkNvcmU6OndyaXRlVVJMKG1fd3JpdGFibGVEYXRhT2Jq
ZWN0LmdldCgpLCBrdXJsLCB0aXRsZVN0ciwgdHJ1ZSwgdHJ1ZSk7Ci0KLSAgICBTdHJpbmcgdXJs
ID0ga3VybC5zdHJpbmcoKTsKLSAgICBBU1NFUlQodXJsLmNvbnRhaW5zT25seUFTQ0lJKCkpOyAv
LyBLVVJMOjpzdHJpbmcoKSBpcyBVUkwgZW5jb2RlZC4KLQotICAgIFN0cmluZyBmc1BhdGggPSBm
aWxlc3lzdGVtUGF0aEZyb21VcmxPclRpdGxlKHVybCwgdGl0bGVTdHIsIEwiLlVSTCIsIHRydWUp
OwotICAgIFN0cmluZyBjb250ZW50U3RyaW5nKCJbSW50ZXJuZXRTaG9ydGN1dF1cclxuVVJMPSIg
KyB1cmwgKyAiXHJcbiIpOwotICAgIENTdHJpbmcgY29udGVudCA9IGNvbnRlbnRTdHJpbmcubGF0
aW4xKCk7Ci0KLSAgICBpZiAoZnNQYXRoLmxlbmd0aCgpIDw9IDApCi0gICAgICAgIHJldHVybjsK
LQotICAgIEhHTE9CQUwgdXJsRmlsZURlc2NyaXB0b3IgPSBHbG9iYWxBbGxvYyhHUFRSLCBzaXpl
b2YoRklMRUdST1VQREVTQ1JJUFRPUikpOwotICAgIGlmICghdXJsRmlsZURlc2NyaXB0b3IpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIEhHTE9CQUwgdXJsRmlsZUNvbnRlbnQgPSBHbG9iYWxBbGxv
YyhHUFRSLCBjb250ZW50Lmxlbmd0aCgpKTsKLSAgICBpZiAoIXVybEZpbGVDb250ZW50KSB7Ci0g
ICAgICAgIEdsb2JhbEZyZWUodXJsRmlsZURlc2NyaXB0b3IpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgRklMRUdST1VQREVTQ1JJUFRPUiogZmdkID0gc3RhdGljX2Nhc3Q8RklMRUdS
T1VQREVTQ1JJUFRPUio+KEdsb2JhbExvY2sodXJsRmlsZURlc2NyaXB0b3IpKTsKLSAgICBaZXJv
TWVtb3J5KGZnZCwgc2l6ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKLSAgICBmZ2QtPmNJdGVt
cyA9IDE7Ci0gICAgZmdkLT5mZ2RbMF0uZHdGbGFncyA9IEZEX0ZJTEVTSVpFOwotICAgIGZnZC0+
ZmdkWzBdLm5GaWxlU2l6ZUxvdyA9IGNvbnRlbnQubGVuZ3RoKCk7Ci0KLSAgICB1bnNpZ25lZCBt
YXhTaXplID0gbWluKGZzUGF0aC5sZW5ndGgoKSwgV1RGX0FSUkFZX0xFTkdUSChmZ2QtPmZnZFsw
XS5jRmlsZU5hbWUpKTsKLSAgICBDb3B5TWVtb3J5KGZnZC0+ZmdkWzBdLmNGaWxlTmFtZSwgZnNQ
YXRoLmNoYXJhY3RlcnMoKSwgbWF4U2l6ZSAqIHNpemVvZihVQ2hhcikpOwotICAgIEdsb2JhbFVu
bG9jayh1cmxGaWxlRGVzY3JpcHRvcik7Ci0KLSAgICBjaGFyKiBmaWxlQ29udGVudHMgPSBzdGF0
aWNfY2FzdDxjaGFyKj4oR2xvYmFsTG9jayh1cmxGaWxlQ29udGVudCkpOwotICAgIENvcHlNZW1v
cnkoZmlsZUNvbnRlbnRzLCBjb250ZW50LmRhdGEoKSwgY29udGVudC5sZW5ndGgoKSk7Ci0gICAg
R2xvYmFsVW5sb2NrKHVybEZpbGVDb250ZW50KTsKLQotICAgIHdyaXRlRmlsZVRvRGF0YU9iamVj
dChtX3dyaXRhYmxlRGF0YU9iamVjdC5nZXQoKSwgdXJsRmlsZURlc2NyaXB0b3IsIHVybEZpbGVD
b250ZW50LCAwKTsKLX0KLQotdm9pZCBDbGlwYm9hcmRXaW46OndyaXRlUmFuZ2UoUmFuZ2UqIHNl
bGVjdGVkUmFuZ2UsIEZyYW1lKiBmcmFtZSkKLXsKLSAgICBBU1NFUlQoc2VsZWN0ZWRSYW5nZSk7
Ci0gICAgaWYgKCFtX3dyaXRhYmxlRGF0YU9iamVjdCkKLSAgICAgICAgIHJldHVybjsKLQotICAg
IFNUR01FRElVTSBtZWRpdW0gPSB7MH07Ci0gICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JB
TDsKLQotICAgIFZlY3RvcjxjaGFyPiBkYXRhOwotICAgIG1hcmt1cFRvQ0ZIVE1MKGNyZWF0ZU1h
cmt1cChzZWxlY3RlZFJhbmdlLCAwLCBBbm5vdGF0ZUZvckludGVyY2hhbmdlKSwKLSAgICAgICAg
c2VsZWN0ZWRSYW5nZS0+c3RhcnRDb250YWluZXIoKS0+ZG9jdW1lbnQoKS0+dXJsKCkuc3RyaW5n
KCksIGRhdGEpOwotICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YShkYXRhKTsK
LSAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5T
ZXREYXRhKGh0bWxGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICA6Okdsb2JhbEZy
ZWUobWVkaXVtLmhHbG9iYWwpOwotCi0gICAgU3RyaW5nIHN0ciA9IGZyYW1lLT5lZGl0b3IoKS5z
ZWxlY3RlZFRleHRGb3JDbGlwYm9hcmQoKTsKLSAgICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93
c1N0eWxlTmV3bGluZXMoc3RyKTsKLSAgICByZXBsYWNlTkJTUFdpdGhTcGFjZShzdHIpOwotICAg
IG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YShzdHIpOwotICAgIGlmIChtZWRpdW0u
aEdsb2JhbCAmJiBGQUlMRUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxhaW5UZXh0
V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCi0gICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0u
aEdsb2JhbCk7Ci0KLSAgICBtZWRpdW0uaEdsb2JhbCA9IDA7Ci0gICAgaWYgKGZyYW1lLT5lZGl0
b3IoKS5jYW5TbWFydENvcHlPckRlbGV0ZSgpKQotICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVj
dC0+U2V0RGF0YShzbWFydFBhc3RlRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpOwotfQotCi12b2lk
IENsaXBib2FyZFdpbjo6d3JpdGVQbGFpblRleHQoY29uc3QgU3RyaW5nJiB0ZXh0KQotewotICAg
IGlmICghbV93cml0YWJsZURhdGFPYmplY3QpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBT
VEdNRURJVU0gbWVkaXVtID0gezB9OwotICAgIG1lZGl1bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7
Ci0gICAgCi0gICAgU3RyaW5nIHN0ciA9IHRleHQ7Ci0gICAgcmVwbGFjZU5ld2xpbmVzV2l0aFdp
bmRvd3NTdHlsZU5ld2xpbmVzKHN0cik7Ci0gICAgcmVwbGFjZU5CU1BXaXRoU3BhY2Uoc3RyKTsK
LSAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoc3RyKTsKLSAgICBpZiAobWVk
aXVtLmhHbG9iYWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKHBsYWlu
VGV4dFdGb3JtYXQoKSwgJm1lZGl1bSwgVFJVRSkpKQotICAgICAgICA6Okdsb2JhbEZyZWUobWVk
aXVtLmhHbG9iYWwpOyAgICAgICAgCi0KLSAgICBtZWRpdW0uaEdsb2JhbCA9IDA7Ci19Ci0gICAg
Ci1ib29sIENsaXBib2FyZFdpbjo6aGFzRGF0YSgpCi17Ci0gICAgaWYgKCFtX2RhdGFPYmplY3Qg
JiYgbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IGlmIChtX2RhdGFPYmplY3QpIHsKLSAgICAgICAgQ09NUHRyPElFbnVtRk9STUFURVRDPiBpdHI7
Ci0gICAgICAgIGlmIChGQUlMRUQobV9kYXRhT2JqZWN0LT5FbnVtRm9ybWF0RXRjKERBVEFESVJf
R0VULCAmaXRyKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCFp
dHIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgRk9STUFURVRDIGRhdGE7
Ci0KLSAgICAgICAgLy8gSUVudW1GT1JNQVRFVEM6Ok5leHQgcmV0dXJucyBTX0ZBTFNFIGlmIHRo
ZXJlIGFyZSBubyBtb3JlIGl0ZW1zLgotICAgICAgICBpZiAoaXRyLT5OZXh0KDEsICZkYXRhLCAw
KSA9PSBTX09LKSB7Ci0gICAgICAgICAgICAvLyBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgaXRlbSBp
biB0aGUgSURhdGFPYmplY3QKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0K
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gIW1fZHJhZ0RhdGFNYXAu
aXNFbXB0eSgpOwotfQotCi12b2lkIENsaXBib2FyZFdpbjo6c2V0RXh0ZXJuYWxEYXRhT2JqZWN0
KElEYXRhT2JqZWN0ICpkYXRhT2JqZWN0KQotewotICAgIEFTU0VSVChpc0ZvckRyYWdBbmREcm9w
KCkpOwotCi0gICAgbV93cml0YWJsZURhdGFPYmplY3QgPSAwOwotICAgIG1fZGF0YU9iamVjdCA9
IGRhdGFPYmplY3Q7Ci19Ci0KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4uaA0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4uaAkocmV2aXNpb24gMTUwNjI5KQ0K
KysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4uaAkod29ya2luZyBj
b3B5KQ0KQEAgLTEsMTAxICswLDAgQEANCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3
LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
LSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0g
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCi0gKi8KLQotI2lmbmRlZiBD
bGlwYm9hcmRXaW5faAotI2RlZmluZSBDbGlwYm9hcmRXaW5faAotCi0jaW5jbHVkZSAiQ09NUHRy
LmgiCi0jaW5jbHVkZSAiQ2FjaGVkSW1hZ2VDbGllbnQuaCIKLSNpbmNsdWRlICJDbGlwYm9hcmQu
aCIKLSNpbmNsdWRlICJEcmFnRGF0YS5oIgotCi1zdHJ1Y3QgSURhdGFPYmplY3Q7Ci0KLW5hbWVz
cGFjZSBXZWJDb3JlIHsKLQotY2xhc3MgQ2FjaGVkSW1hZ2U7Ci1jbGFzcyBGcmFtZTsKLWNsYXNz
IEludFBvaW50OwotY2xhc3MgV0NEYXRhT2JqZWN0OwotCi0vLyBTdGF0ZSBhdmFpbGFibGUgZHVy
aW5nIElFJ3MgZXZlbnRzIGZvciBkcmFnIGFuZCBkcm9wIGFuZCBjb3B5L3Bhc3RlCi1jbGFzcyBD
bGlwYm9hcmRXaW4gOiBwdWJsaWMgQ2xpcGJvYXJkLCBwdWJsaWMgQ2FjaGVkSW1hZ2VDbGllbnQg
ewotICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwotcHVibGljOgotICAgIHN0YXRpYyBQYXNz
UmVmUHRyPENsaXBib2FyZFdpbj4gY3JlYXRlKENsaXBib2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwg
SURhdGFPYmplY3QqIGRhdGFPYmplY3QsIENsaXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIEZy
YW1lKiBmcmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2xpcGJvYXJk
V2luKGNsaXBib2FyZFR5cGUsIGRhdGFPYmplY3QsIHBvbGljeSwgZnJhbWUpKTsKLSAgICB9Ci0g
ICAgc3RhdGljIFBhc3NSZWZQdHI8Q2xpcGJvYXJkV2luPiBjcmVhdGUoQ2xpcGJvYXJkVHlwZSBj
bGlwYm9hcmRUeXBlLCBXQ0RhdGFPYmplY3QqIGRhdGFPYmplY3QsIENsaXBib2FyZEFjY2Vzc1Bv
bGljeSBwb2xpY3ksIEZyYW1lKiBmcmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJl
ZihuZXcgQ2xpcGJvYXJkV2luKGNsaXBib2FyZFR5cGUsIGRhdGFPYmplY3QsIHBvbGljeSwgZnJh
bWUpKTsKLSAgICB9Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8Q2xpcGJvYXJkV2luPiBjcmVhdGUo
Q2xpcGJvYXJkVHlwZSBjbGlwYm9hcmRUeXBlLCBjb25zdCBEcmFnRGF0YU1hcCYgZGF0YU1hcCwg
Q2xpcGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwgRnJhbWUqIGZyYW1lKQotICAgIHsKLSAgICAg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBDbGlwYm9hcmRXaW4oY2xpcGJvYXJkVHlwZSwgZGF0YU1h
cCwgcG9saWN5LCBmcmFtZSkpOwotICAgIH0KLSAgICB+Q2xpcGJvYXJkV2luKCk7Ci0KLSAgICB2
b2lkIGNsZWFyRGF0YShjb25zdCBTdHJpbmcmIHR5cGUpOwotICAgIHZvaWQgY2xlYXJEYXRhKCk7
Ci0gICAgU3RyaW5nIGdldERhdGEoY29uc3QgU3RyaW5nJiB0eXBlKSBjb25zdDsKLSAgICBib29s
IHNldERhdGEoY29uc3QgU3RyaW5nJiB0eXBlLCBjb25zdCBTdHJpbmcmIGRhdGEpOwotCi0gICAg
Ly8gZXh0ZW5zaW9ucyBiZXlvbmQgSUUncyBBUEkKLSAgICB2aXJ0dWFsIExpc3RIYXNoU2V0PFN0
cmluZz4gdHlwZXMoKSBjb25zdDsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8RmlsZUxpc3Q+IGZp
bGVzKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldERyYWdJbWFnZShDYWNoZWRJbWFnZSosIGNvbnN0
IEludFBvaW50Jik7Ci0gICAgdm9pZCBzZXREcmFnSW1hZ2VFbGVtZW50KE5vZGUqLCBjb25zdCBJ
bnRQb2ludCYpOwotCi0gICAgdmlydHVhbCBEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlKElu
dFBvaW50JiBkcmFnTG9jKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgZGVjbGFyZUFuZFdyaXRl
RHJhZ0ltYWdlKEVsZW1lbnQqLCBjb25zdCBLVVJMJiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgRnJh
bWUqKTsKLSAgICB2aXJ0dWFsIHZvaWQgd3JpdGVVUkwoY29uc3QgS1VSTCYsIGNvbnN0IFN0cmlu
ZyYsIEZyYW1lKik7Ci0gICAgdmlydHVhbCB2b2lkIHdyaXRlUmFuZ2UoUmFuZ2UqLCBGcmFtZSop
OwotICAgIHZpcnR1YWwgdm9pZCB3cml0ZVBsYWluVGV4dChjb25zdCBTdHJpbmcmKTsKLQotICAg
IHZpcnR1YWwgYm9vbCBoYXNEYXRhKCk7Ci0KLSAgICBDT01QdHI8SURhdGFPYmplY3Q+IGRhdGFP
YmplY3QoKSB7IHJldHVybiBtX2RhdGFPYmplY3Q7IH0KLQotICAgIHZvaWQgc2V0RXh0ZXJuYWxE
YXRhT2JqZWN0KElEYXRhT2JqZWN0ICpkYXRhT2JqZWN0KTsKLQotcHJpdmF0ZToKLSAgICBDbGlw
Ym9hcmRXaW4oQ2xpcGJvYXJkVHlwZSwgSURhdGFPYmplY3QqLCBDbGlwYm9hcmRBY2Nlc3NQb2xp
Y3ksIEZyYW1lKik7Ci0gICAgQ2xpcGJvYXJkV2luKENsaXBib2FyZFR5cGUsIFdDRGF0YU9iamVj
dCosIENsaXBib2FyZEFjY2Vzc1BvbGljeSwgRnJhbWUqKTsKLSAgICBDbGlwYm9hcmRXaW4oQ2xp
cGJvYXJkVHlwZSwgY29uc3QgRHJhZ0RhdGFNYXAmLCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3ksIEZy
YW1lKik7Ci0KLSAgICB2b2lkIHJlc2V0RnJvbUNsaXBib2FyZCgpOwotICAgIHZvaWQgc2V0RHJh
Z0ltYWdlKENhY2hlZEltYWdlKiwgTm9kZSosIGNvbnN0IEludFBvaW50Jik7Ci0KLSAgICBDT01Q
dHI8SURhdGFPYmplY3Q+IG1fZGF0YU9iamVjdDsKLSAgICBDT01QdHI8V0NEYXRhT2JqZWN0PiBt
X3dyaXRhYmxlRGF0YU9iamVjdDsKLSAgICBEcmFnRGF0YU1hcCBtX2RyYWdEYXRhTWFwOwotICAg
IEZyYW1lKiBtX2ZyYW1lOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQotCi0jZW5kaWYg
Ly8gQ2xpcGJvYXJkV2luX2gKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9FZGl0
b3JXaW4uY3BwDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09DQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0Vk
aXRvcldpbi5jcHAJKHJldmlzaW9uIDE1MDYyOSkNCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS93aW4vRWRpdG9yV2luLmNwcAkod29ya2luZyBjb3B5KQ0KQEAgLTI1LDE1ICsyNSwxNyBAQA0K
IAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkVkaXRvci5oIgotI2luY2x1ZGUgIkVk
aXRvckNsaWVudC5oIgogCi0jaW5jbHVkZSAiQ2xpcGJvYXJkV2luLmgiCisjaW5jbHVkZSAiQ09N
UHRyLmgiCisjaW5jbHVkZSAiQ2xpcGJvYXJkLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNp
bmNsdWRlICJFZGl0b3JDbGllbnQuaCIKICNpbmNsdWRlICJFbGVtZW50LmgiCiAjaW5jbHVkZSAi
RnJhbWUuaCIKLSNpbmNsdWRlICJodG1sZWRpdGluZy5oIgorI2luY2x1ZGUgIlBhc3RlYm9hcmQu
aCIKICNpbmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKICNpbmNsdWRlICJWaXNpYmxlVW5pdHMuaCIK
KyNpbmNsdWRlICJodG1sZWRpdGluZy5oIgogCiAjaW5jbHVkZSA8d2luZG93cy5oPgogCkBAIC00
Niw4ICs0OCw5IEBADQogICAgIGlmICghU1VDQ0VFREVEKE9sZUdldENsaXBib2FyZCgmY2xpcGJv
YXJkRGF0YSkpKQogICAgICAgICBjbGlwYm9hcmREYXRhID0gMDsKICNlbmRpZgotCi0gICAgcmV0
dXJuIENsaXBib2FyZFdpbjo6Y3JlYXRlKENsaXBib2FyZDo6Q29weUFuZFBhc3RlLCBjbGlwYm9h
cmREYXRhLmdldCgpLCBwb2xpY3ksIGZyYW1lKTsKKyAgICBSZWZQdHI8Q2xpcGJvYXJkPiBjbGlw
Ym9hcmQgPSBDbGlwYm9hcmQ6OmNyZWF0ZUZvckNvcHlBbmRQYXN0ZShwb2xpY3kpOworICAgIGNv
bnN0X2Nhc3Q8UGFzdGVib2FyZCY+KGNsaXBib2FyZC0+cGFzdGVib2FyZCgpKS5zZXRFeHRlcm5h
bERhdGFPYmplY3QoY2xpcGJvYXJkRGF0YS5nZXQoKSk7CisgICAgcmV0dXJuIGNsaXBib2FyZC5y
ZWxlYXNlKCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL3dpbi9QYXN0ZWJvYXJkV2luLmNwcA0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9QYXN0ZWJvYXJkV2luLmNwcAkocmV2aXNpb24gMTUwNjI5
KQ0KKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9QYXN0ZWJvYXJkV2luLmNwcAkod29y
a2luZyBjb3B5KQ0KQEAgLTEsNSArMSw2IEBADQogLyoKICAqIENvcHlyaWdodCAoQykgMjAwNiwg
MjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAy
MDEzIFh1ZXFpbmcgSHVhbmcgPGh1YW5neHVlcWluZ0BiYWlkdS5jb20+CiAgKgogICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKQEAgLTM0LDYgKzM1LDggQEANCiAjaW5jbHVkZSAiRWRpdG9yLmgi
CiAjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiSFRN
TE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTFBhcnNlcklkaW9tcy5oIgogI2luY2x1ZGUgIkhXbmRE
Qy5oIgogI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKICNpbmNsdWRlICJJbWFnZS5oIgpAQCAt
NDIsNiArNDUsNyBAQA0KICNpbmNsdWRlICJQYWdlLmgiCiAjaW5jbHVkZSAiUmFuZ2UuaCIKICNp
bmNsdWRlICJSZW5kZXJJbWFnZS5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgogI2luY2x1
ZGUgIlRleHRFbmNvZGluZy5oIgogI2luY2x1ZGUgIldlYkNvcmVJbnN0YW5jZUhhbmRsZS5oIgog
I2luY2x1ZGUgIldpbmRvd3NFeHRyYXMuaCIKQEAgLTUwLDYgKzU0LDkgQEANCiAKIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIAorLy8gV2UgcHJvdmlkZSB0aGUgSUUgY2xpcGJvYXJkIHR5cGVzIChVUkwg
YW5kIFRleHQpLCBhbmQgdGhlIGNsaXBib2FyZCB0eXBlcyBzcGVjaWZpZWQgaW4gdGhlIFdIQVRX
RyBXZWIgQXBwbGljYXRpb25zIDEuMCBkcmFmdAorLy8gc2VlIGh0dHA6Ly93d3cud2hhdHdnLm9y
Zy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvIFNlY3Rpb24gNi4zLjUuMworCiBzdGF0aWMg
VUlOVCBIVE1MQ2xpcGJvYXJkRm9ybWF0ID0gMDsKIHN0YXRpYyBVSU5UIEJvb2ttYXJrQ2xpcGJv
YXJkRm9ybWF0ID0gMDsKIHN0YXRpYyBVSU5UIFdlYlNtYXJ0UGFzdGVGb3JtYXQgPSAwOwpAQCAt
ODksOCArOTYsMzcgQEANCiAgICAgcmV0dXJuIHBhc3RlYm9hcmQ7CiB9CiAKLVBhc3RlYm9hcmQ6
OlBhc3RlYm9hcmQoKQorUGFzc093blB0cjxQYXN0ZWJvYXJkPiBQYXN0ZWJvYXJkOjpjcmVhdGVG
b3JDb3B5QW5kUGFzdGUoKQogeworICAgIHJldHVybiBhZG9wdFB0cihuZXcgUGFzdGVib2FyZCk7
Cit9CisKK1Bhc3NPd25QdHI8UGFzdGVib2FyZD4gUGFzdGVib2FyZDo6Y3JlYXRlUHJpdmF0ZSgp
Cit7CisgICAgLy8gV2luZG93cyBoYXMgbm8gIlByaXZhdGUgcGFzdGVib2FyZCIgY29uY2VwdC4K
KyAgICByZXR1cm4gY3JlYXRlRm9yQ29weUFuZFBhc3RlKCk7Cit9CisKKyNpZiBFTkFCTEUoRFJB
R19TVVBQT1JUKQorUGFzc093blB0cjxQYXN0ZWJvYXJkPiBQYXN0ZWJvYXJkOjpjcmVhdGVGb3JE
cmFnQW5kRHJvcCgpCit7CisgICAgQ09NUHRyPFdDRGF0YU9iamVjdD4gZGF0YU9iamVjdDsKKyAg
ICBXQ0RhdGFPYmplY3Q6OmNyZWF0ZUluc3RhbmNlKCZkYXRhT2JqZWN0KTsKKyAgICByZXR1cm4g
YWRvcHRQdHIobmV3IFBhc3RlYm9hcmQoZGF0YU9iamVjdC5nZXQoKSkpOworfQorCisvLyBzdGF0
aWMKK1Bhc3NPd25QdHI8UGFzdGVib2FyZD4gUGFzdGVib2FyZDo6Y3JlYXRlRm9yRHJhZ0FuZERy
b3AoY29uc3QgRHJhZ0RhdGEmIGRyYWdEYXRhKQoreworICAgIGlmIChkcmFnRGF0YS5wbGF0Zm9y
bURhdGEoKSkKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBQYXN0ZWJvYXJkKGRyYWdEYXRh
LnBsYXRmb3JtRGF0YSgpKSk7CisgICAgLy8gRklYTUU6IFNob3VsZCBhZGQgYSBjb25zdCBvdmVy
bG9hZCBvZiBkcmFnRGF0YU1hcCBzbyB3ZSBkb24ndCBuZWVkIGEgY29uc3RfY2FzdCBoZXJlLgor
ICAgIHJldHVybiBhZG9wdFB0cihuZXcgUGFzdGVib2FyZChjb25zdF9jYXN0PERyYWdEYXRhJj4o
ZHJhZ0RhdGEpLmRyYWdEYXRhTWFwKCkpKTsKK30KKyNlbmRpZgorCit2b2lkIFBhc3RlYm9hcmQ6
OmZpbmlzaENyZWF0aW5nUGFzdGVib2FyZCgpCit7CiAgICAgV05EQ0xBU1Mgd2M7CiAgICAgbWVt
c2V0KCZ3YywgMCwgc2l6ZW9mKFdORENMQVNTKSk7CiAgICAgd2MubHBmblduZFByb2MgICAgPSBQ
YXN0ZWJvYXJkT3duZXJXbmRQcm9jOwpAQCAtMTA2LDYgKzE0MiwzNSBAQA0KICAgICBXZWJTbWFy
dFBhc3RlRm9ybWF0ID0gOjpSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIldlYktpdCBTbWFydCBQ
YXN0ZSBGb3JtYXQiKTsKIH0KIAorUGFzdGVib2FyZDo6UGFzdGVib2FyZCgpCisgICAgOiBtX2Rh
dGFPYmplY3QoMCkKKyAgICAsIG1fd3JpdGFibGVEYXRhT2JqZWN0KDApCit7CisgICAgZmluaXNo
Q3JlYXRpbmdQYXN0ZWJvYXJkKCk7Cit9CisKK1Bhc3RlYm9hcmQ6OlBhc3RlYm9hcmQoSURhdGFP
YmplY3QqIGRhdGFPYmplY3QpCisgICAgOiBtX2RhdGFPYmplY3QoZGF0YU9iamVjdCkKKyAgICAs
IG1fd3JpdGFibGVEYXRhT2JqZWN0KDApCit7CisgICAgZmluaXNoQ3JlYXRpbmdQYXN0ZWJvYXJk
KCk7Cit9CisKK1Bhc3RlYm9hcmQ6OlBhc3RlYm9hcmQoV0NEYXRhT2JqZWN0KiBkYXRhT2JqZWN0
KQorICAgIDogbV9kYXRhT2JqZWN0KGRhdGFPYmplY3QpCisgICAgLCBtX3dyaXRhYmxlRGF0YU9i
amVjdChkYXRhT2JqZWN0KQoreworICAgIGZpbmlzaENyZWF0aW5nUGFzdGVib2FyZCgpOworfQor
CitQYXN0ZWJvYXJkOjpQYXN0ZWJvYXJkKGNvbnN0IERyYWdEYXRhTWFwJiBkYXRhTWFwKQorICAg
IDogbV9kYXRhT2JqZWN0KDApCisgICAgLCBtX3dyaXRhYmxlRGF0YU9iamVjdCgwKQorICAgICwg
bV9kcmFnRGF0YU1hcChkYXRhTWFwKQoreworICAgIGZpbmlzaENyZWF0aW5nUGFzdGVib2FyZCgp
OworfQorCiB2b2lkIFBhc3RlYm9hcmQ6OmNsZWFyKCkKIHsKICAgICBpZiAoOjpPcGVuQ2xpcGJv
YXJkKG1fb3duZXIpKSB7CkBAIC0xMTQsNiArMTc5LDI3MSBAQA0KICAgICB9CiB9CiAKK2VudW0g
Q2xpcGJvYXJkRGF0YVR5cGUgeyBDbGlwYm9hcmREYXRhVHlwZU5vbmUsIENsaXBib2FyZERhdGFU
eXBlVVJMLCBDbGlwYm9hcmREYXRhVHlwZVRleHQsIENsaXBib2FyZERhdGFUeXBlVGV4dEhUTUwg
fTsKKworc3RhdGljIENsaXBib2FyZERhdGFUeXBlIGNsaXBib2FyZFR5cGVGcm9tTUlNRVR5cGUo
Y29uc3QgU3RyaW5nJiB0eXBlKQoreworICAgIFN0cmluZyBxVHlwZSA9IHR5cGUuc3RyaXBXaGl0
ZVNwYWNlKCkubG93ZXIoKTsKKworICAgIC8vIHR3byBzcGVjaWFsIGNhc2VzIGZvciBJRSBjb21w
YXRpYmlsaXR5CisgICAgaWYgKHFUeXBlID09ICJ0ZXh0IiB8fCBxVHlwZSA9PSAidGV4dC9wbGFp
biIgfHwgcVR5cGUuc3RhcnRzV2l0aCgidGV4dC9wbGFpbjsiKSkKKyAgICAgICAgcmV0dXJuIENs
aXBib2FyZERhdGFUeXBlVGV4dDsKKyAgICBpZiAocVR5cGUgPT0gInVybCIgfHwgcVR5cGUgPT0g
InRleHQvdXJpLWxpc3QiKQorICAgICAgICByZXR1cm4gQ2xpcGJvYXJkRGF0YVR5cGVVUkw7Cisg
ICAgaWYgKHFUeXBlID09ICJ0ZXh0L2h0bWwiKQorICAgICAgICByZXR1cm4gQ2xpcGJvYXJkRGF0
YVR5cGVUZXh0SFRNTDsKKworICAgIHJldHVybiBDbGlwYm9hcmREYXRhVHlwZU5vbmU7Cit9CisK
K3ZvaWQgUGFzdGVib2FyZDo6Y2xlYXIoY29uc3QgU3RyaW5nJiB0eXBlKQoreworICAgIGlmICgh
bV93cml0YWJsZURhdGFPYmplY3QpCisgICAgICAgIHJldHVybjsKKworICAgIENsaXBib2FyZERh
dGFUeXBlIGRhdGFUeXBlID0gY2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZSh0eXBlKTsKKworICAg
IGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVSTCkgeworICAgICAgICBtX3dyaXRh
YmxlRGF0YU9iamVjdC0+Y2xlYXJEYXRhKHVybFdGb3JtYXQoKS0+Y2ZGb3JtYXQpOworICAgICAg
ICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJEYXRhKHVybEZvcm1hdCgpLT5jZkZvcm1hdCk7
CisgICAgfQorICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRleHQpIHsKKyAg
ICAgICAgbV93cml0YWJsZURhdGFPYmplY3QtPmNsZWFyRGF0YShwbGFpblRleHRGb3JtYXQoKS0+
Y2ZGb3JtYXQpOworICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+Y2xlYXJEYXRhKHBsYWlu
VGV4dFdGb3JtYXQoKS0+Y2ZGb3JtYXQpOworICAgIH0KK30KKworYm9vbCBQYXN0ZWJvYXJkOjpo
YXNEYXRhKCkKK3sKKyAgICBpZiAoIW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFwLmlzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG1fZGF0YU9iamVjdCkgewor
ICAgICAgICBDT01QdHI8SUVudW1GT1JNQVRFVEM+IGl0cjsKKyAgICAgICAgaWYgKEZBSUxFRCht
X2RhdGFPYmplY3QtPkVudW1Gb3JtYXRFdGMoREFUQURJUl9HRVQsICZpdHIpKSkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoIWl0cikKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgICAgICBGT1JNQVRFVEMgZGF0YTsKKworICAgICAgICAvLyBJRW51bUZP
Uk1BVEVUQzo6TmV4dCByZXR1cm5zIFNfRkFMU0UgaWYgdGhlcmUgYXJlIG5vIG1vcmUgaXRlbXMu
CisgICAgICAgIGlmIChpdHItPk5leHQoMSwgJmRhdGEsIDApID09IFNfT0spIHsKKyAgICAgICAg
ICAgIC8vIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBpdGVtIGluIHRoZSBJRGF0YU9iamVjdAorICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorICAgIHJldHVybiAhbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCk7Cit9CisKK3N0YXRp
YyB2b2lkIGFkZE1pbWVUeXBlc0ZvckZvcm1hdChMaXN0SGFzaFNldDxTdHJpbmc+JiByZXN1bHRz
LCBjb25zdCBGT1JNQVRFVEMmIGZvcm1hdCkKK3sKKyAgICAvLyBVUkwgYW5kIFRleHQgYXJlIHBy
b3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggSUUncyBtb2RlbAorICAgIGlmIChmb3JtYXQu
Y2ZGb3JtYXQgPT0gdXJsRm9ybWF0KCktPmNmRm9ybWF0IHx8IGZvcm1hdC5jZkZvcm1hdCA9PSB1
cmxXRm9ybWF0KCktPmNmRm9ybWF0KSB7CisgICAgICAgIHJlc3VsdHMuYWRkKCJVUkwiKTsKKyAg
ICAgICAgcmVzdWx0cy5hZGQoInRleHQvdXJpLWxpc3QiKTsKKyAgICB9CisKKyAgICBpZiAoZm9y
bWF0LmNmRm9ybWF0ID09IHBsYWluVGV4dFdGb3JtYXQoKS0+Y2ZGb3JtYXQgfHwgZm9ybWF0LmNm
Rm9ybWF0ID09IHBsYWluVGV4dEZvcm1hdCgpLT5jZkZvcm1hdCkgeworICAgICAgICByZXN1bHRz
LmFkZCgiVGV4dCIpOworICAgICAgICByZXN1bHRzLmFkZCgidGV4dC9wbGFpbiIpOworICAgIH0K
K30KKworTGlzdEhhc2hTZXQ8U3RyaW5nPiBQYXN0ZWJvYXJkOjp0eXBlcygpCit7CisgICAgTGlz
dEhhc2hTZXQ8U3RyaW5nPiByZXN1bHRzOworCisgICAgaWYgKCFtX2RhdGFPYmplY3QgJiYgbV9k
cmFnRGF0YU1hcC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiByZXN1bHRzOworCisgICAgaWYg
KG1fZGF0YU9iamVjdCkgeworICAgICAgICBDT01QdHI8SUVudW1GT1JNQVRFVEM+IGl0cjsKKwor
ICAgICAgICBpZiAoRkFJTEVEKG1fZGF0YU9iamVjdC0+RW51bUZvcm1hdEV0YyhEQVRBRElSX0dF
VCwgJml0cikpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisKKyAgICAgICAgaWYgKCFp
dHIpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKworICAgICAgICBGT1JNQVRFVEMgZGF0
YTsKKworICAgICAgICAvLyBJRW51bUZPUk1BVEVUQzo6TmV4dCByZXR1cm5zIFNfRkFMU0UgaWYg
dGhlcmUgYXJlIG5vIG1vcmUgaXRlbXMuCisgICAgICAgIHdoaWxlIChpdHItPk5leHQoMSwgJmRh
dGEsIDApID09IFNfT0spCisgICAgICAgICAgICBhZGRNaW1lVHlwZXNGb3JGb3JtYXQocmVzdWx0
cywgZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChEcmFnRGF0YU1hcDo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBtX2RyYWdEYXRhTWFwLmJlZ2luKCk7IGl0ICE9IG1fZHJhZ0RhdGFNYXAu
ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIEZPUk1BVEVUQyBkYXRhOworICAgICAgICAgICAg
ZGF0YS5jZkZvcm1hdCA9ICgqaXQpLmtleTsKKyAgICAgICAgICAgIGFkZE1pbWVUeXBlc0ZvckZv
cm1hdChyZXN1bHRzLCBkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1
bHRzOworfQorCitTdHJpbmcgUGFzdGVib2FyZDo6cmVhZFN0cmluZyhjb25zdCBTdHJpbmcmIHR5
cGUpCit7CisgICAgaWYgKCFtX2RhdGFPYmplY3QgJiYgbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCkp
CisgICAgICAgIHJldHVybiAiIjsKKworICAgIENsaXBib2FyZERhdGFUeXBlIGRhdGFUeXBlID0g
Y2xpcGJvYXJkVHlwZUZyb21NSU1FVHlwZSh0eXBlKTsKKyAgICBpZiAoZGF0YVR5cGUgPT0gQ2xp
cGJvYXJkRGF0YVR5cGVUZXh0KQorICAgICAgICByZXR1cm4gbV9kYXRhT2JqZWN0ID8gZ2V0UGxh
aW5UZXh0KG1fZGF0YU9iamVjdC5nZXQoKSkgOiBnZXRQbGFpblRleHQoJm1fZHJhZ0RhdGFNYXAp
OworICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVSTCkKKyAgICAgICAgcmV0
dXJuIG1fZGF0YU9iamVjdCA/IGdldFVSTChtX2RhdGFPYmplY3QuZ2V0KCksIERyYWdEYXRhOjpE
b05vdENvbnZlcnRGaWxlbmFtZXMpIDogZ2V0VVJMKCZtX2RyYWdEYXRhTWFwLCBEcmFnRGF0YTo6
RG9Ob3RDb252ZXJ0RmlsZW5hbWVzKTsKKyAgICBpZiAoZGF0YVR5cGUgPT0gQ2xpcGJvYXJkRGF0
YVR5cGVUZXh0SFRNTCkgeworICAgICAgICBTdHJpbmcgZGF0YSA9IG1fZGF0YU9iamVjdCA/IGdl
dFRleHRIVE1MKG1fZGF0YU9iamVjdC5nZXQoKSkgOiBnZXRUZXh0SFRNTCgmbV9kcmFnRGF0YU1h
cCk7CisgICAgICAgIGlmICghZGF0YS5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZGF0
YTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YU9iamVjdCA/IGdldENGSFRNTChtX2RhdGFPYmplY3Qu
Z2V0KCkpIDogZ2V0Q0ZIVE1MKCZtX2RyYWdEYXRhTWFwKTsKKyAgICB9CisKKyAgICByZXR1cm4g
IiI7Cit9CisKK1ZlY3RvcjxTdHJpbmc+IFBhc3RlYm9hcmQ6OnJlYWRGaWxlbmFtZXMoKQorewor
I2lmIFVTRShDRikKKyAgICBWZWN0b3I8U3RyaW5nPiBmaWxlTmFtZXM7CisKKyAgICBpZiAobV9k
YXRhT2JqZWN0KSB7CisgICAgICAgIFNUR01FRElVTSBtZWRpdW07CisgICAgICAgIGlmIChGQUlM
RUQobV9kYXRhT2JqZWN0LT5HZXREYXRhKGNmSERyb3BGb3JtYXQoKSwgJm1lZGl1bSkpKQorICAg
ICAgICAgICAgcmV0dXJuIGZpbGVOYW1lczsKKworICAgICAgICBIRFJPUCBoZHJvcCA9IHJlaW50
ZXJwcmV0X2Nhc3Q8SERST1A+KEdsb2JhbExvY2sobWVkaXVtLmhHbG9iYWwpKTsKKyAgICAgICAg
aWYgKCFoZHJvcCkKKyAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZXM7CisKKyAgICAgICAgV0NI
QVIgZmlsZW5hbWVbTUFYX1BBVEhdOworICAgICAgICBVSU5UIGZpbGVDb3VudCA9IERyYWdRdWVy
eUZpbGVXKGhkcm9wLCAweEZGRkZGRkZGLCAwLCAwKTsKKyAgICAgICAgZm9yIChVSU5UIGkgPSAw
OyBpIDwgZmlsZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmICghRHJhZ1F1ZXJ5RmlsZVco
aGRyb3AsIGksIGZpbGVuYW1lLCBXVEZfQVJSQVlfTEVOR1RIKGZpbGVuYW1lKSkpCisgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBmaWxlTmFtZXMuYXBwZW5kKGZpbGVuYW1l
KTsKKyAgICAgICAgfQorCisgICAgICAgIEdsb2JhbFVubG9jayhtZWRpdW0uaEdsb2JhbCk7Cisg
ICAgICAgIFJlbGVhc2VTdGdNZWRpdW0oJm1lZGl1bSk7CisgICAgICAgIHJldHVybiBmaWxlTmFt
ZXM7CisgICAgfQorICAgIGlmICghbV9kcmFnRGF0YU1hcC5jb250YWlucyhjZkhEcm9wRm9ybWF0
KCktPmNmRm9ybWF0KSkKKyAgICAgICAgcmV0dXJuIGZpbGVOYW1lczsKKyAgICByZXR1cm4gbV9k
cmFnRGF0YU1hcC5nZXQoY2ZIRHJvcEZvcm1hdCgpLT5jZkZvcm1hdCk7CisjZWxzZQorICAgIG5v
dEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGJvb2wg
d3JpdGVVUkwoV0NEYXRhT2JqZWN0ICpkYXRhLCBjb25zdCBLVVJMJiB1cmwsIFN0cmluZyB0aXRs
ZSwgYm9vbCB3aXRoUGxhaW5UZXh0LCBib29sIHdpdGhIVE1MKQoreworICAgIEFTU0VSVChkYXRh
KTsKKworICAgIGlmICh1cmwuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBpZiAodGl0bGUuaXNFbXB0eSgpKSB7CisgICAgICAgIHRpdGxlID0gdXJsLmxhc3RQYXRoQ29t
cG9uZW50KCk7CisgICAgICAgIGlmICh0aXRsZS5pc0VtcHR5KCkpCisgICAgICAgICAgICB0aXRs
ZSA9IHVybC5ob3N0KCk7CisgICAgfQorCisgICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKKyAg
ICBtZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOworCisgICAgbWVkaXVtLmhHbG9iYWwgPSBj
cmVhdGVHbG9iYWxEYXRhKHVybCwgdGl0bGUpOworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwor
ICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQoZGF0YS0+U2V0RGF0YSh1cmxXRm9ybWF0
KCksICZtZWRpdW0sIFRSVUUpKSkKKyAgICAgICAgOjpHbG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFs
KTsKKyAgICBlbHNlCisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworCisgICAgaWYgKHdpdGhIVE1M
KSB7CisgICAgICAgIFZlY3RvcjxjaGFyPiBjZmh0bWxEYXRhOworICAgICAgICBtYXJrdXBUb0NG
SFRNTCh1cmxUb01hcmt1cCh1cmwsIHRpdGxlKSwgIiIsIGNmaHRtbERhdGEpOworICAgICAgICBt
ZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEoY2ZodG1sRGF0YSk7CisgICAgICAgIGlm
IChtZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQoZGF0YS0+U2V0RGF0YShodG1sRm9ybWF0KCksICZt
ZWRpdW0sIFRSVUUpKSkKKyAgICAgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgIH0KKworICAg
IGlmICh3aXRoUGxhaW5UZXh0KSB7CisgICAgICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xv
YmFsRGF0YSh1cmwuc3RyaW5nKCkpOworICAgICAgICBpZiAobWVkaXVtLmhHbG9iYWwgJiYgRkFJ
TEVEKGRhdGEtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCisg
ICAgICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9iYWwpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VjY2VzczsK
K30KKworYm9vbCBQYXN0ZWJvYXJkOjp3cml0ZVN0cmluZyhjb25zdCBTdHJpbmcmIHR5cGUsIGNv
bnN0IFN0cmluZyYgZGF0YSkKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBDbGlwYm9hcmREYXRhVHlwZSB3aW5UeXBlID0gY2xp
cGJvYXJkVHlwZUZyb21NSU1FVHlwZSh0eXBlKTsKKworICAgIGlmICh3aW5UeXBlID09IENsaXBi
b2FyZERhdGFUeXBlVVJMKQorICAgICAgICByZXR1cm4gV2ViQ29yZTo6d3JpdGVVUkwobV93cml0
YWJsZURhdGFPYmplY3QuZ2V0KCksIEtVUkwoS1VSTCgpLCBkYXRhKSwgU3RyaW5nKCksIGZhbHNl
LCB0cnVlKTsKKworICAgIGlmICh3aW5UeXBlID09IENsaXBib2FyZERhdGFUeXBlVGV4dCkgewor
ICAgICAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OworICAgICAgICBtZWRpdW0udHltZWQgPSBU
WU1FRF9IR0xPQkFMOworICAgICAgICBtZWRpdW0uaEdsb2JhbCA9IGNyZWF0ZUdsb2JhbERhdGEo
ZGF0YSk7CisgICAgICAgIGlmICghbWVkaXVtLmhHbG9iYWwpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAgICAgaWYgKEZBSUxFRChtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0
YShwbGFpblRleHRXRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpKSkgeworICAgICAgICAgICAgOjpH
bG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK3ZvaWQgUGFzdGVib2FyZDo6c2V0RHJhZ0ltYWdlKERyYWdJbWFnZVJlZiwgY29uc3Qg
SW50UG9pbnQmKQoreworICAgIC8vIERvIG5vdGhpbmcgaW4gV2luZG93cy4KK30KKwordm9pZCBQ
YXN0ZWJvYXJkOjp3cml0ZVJhbmdlVG9EYXRhT2JqZWN0KFJhbmdlKiBzZWxlY3RlZFJhbmdlLCBG
cmFtZSogZnJhbWUpCit7CisgICAgQVNTRVJUKHNlbGVjdGVkUmFuZ2UpOworICAgIGlmICghbV93
cml0YWJsZURhdGFPYmplY3QpCisgICAgICAgIHJldHVybjsKKworICAgIFNUR01FRElVTSBtZWRp
dW0gPSB7MH07CisgICAgbWVkaXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKKworICAgIFZlY3Rv
cjxjaGFyPiBkYXRhOworICAgIG1hcmt1cFRvQ0ZIVE1MKGNyZWF0ZU1hcmt1cChzZWxlY3RlZFJh
bmdlLCAwLCBBbm5vdGF0ZUZvckludGVyY2hhbmdlKSwKKyAgICAgICAgc2VsZWN0ZWRSYW5nZS0+
c3RhcnRDb250YWluZXIoKS0+ZG9jdW1lbnQoKS0+dXJsKCkuc3RyaW5nKCksIGRhdGEpOworICAg
IG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0YShkYXRhKTsKKyAgICBpZiAobWVkaXVt
LmhHbG9iYWwgJiYgRkFJTEVEKG1fd3JpdGFibGVEYXRhT2JqZWN0LT5TZXREYXRhKGh0bWxGb3Jt
YXQoKSwgJm1lZGl1bSwgVFJVRSkpKQorICAgICAgICA6Okdsb2JhbEZyZWUobWVkaXVtLmhHbG9i
YWwpOworCisgICAgU3RyaW5nIHN0ciA9IGZyYW1lLT5lZGl0b3IoKS5zZWxlY3RlZFRleHRGb3JD
bGlwYm9hcmQoKTsKKyAgICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3bGluZXMo
c3RyKTsKKyAgICByZXBsYWNlTkJTUFdpdGhTcGFjZShzdHIpOworICAgIG1lZGl1bS5oR2xvYmFs
ID0gY3JlYXRlR2xvYmFsRGF0YShzdHIpOworICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBGQUlM
RUQobV93cml0YWJsZURhdGFPYmplY3QtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAmbWVk
aXVtLCBUUlVFKSkpCisgICAgICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7CisKKyAg
ICBtZWRpdW0uaEdsb2JhbCA9IDA7CisgICAgaWYgKGZyYW1lLT5lZGl0b3IoKS5jYW5TbWFydENv
cHlPckRlbGV0ZSgpKQorICAgICAgICBtX3dyaXRhYmxlRGF0YU9iamVjdC0+U2V0RGF0YShzbWFy
dFBhc3RlRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6Ondy
aXRlU2VsZWN0aW9uKFJhbmdlKiBzZWxlY3RlZFJhbmdlLCBib29sIGNhblNtYXJ0Q29weU9yRGVs
ZXRlLCBGcmFtZSogZnJhbWUsIFNob3VsZFNlcmlhbGl6ZVNlbGVjdGVkVGV4dEZvckNsaXBib2Fy
ZCBzaG91bGRTZXJpYWxpemVTZWxlY3RlZFRleHRGb3JDbGlwYm9hcmQpCiB7CiAgICAgY2xlYXIo
KTsKQEAgLTE0NiwxMCArNDc2LDI5IEBADQogICAgICAgICAgICAgOjpTZXRDbGlwYm9hcmREYXRh
KFdlYlNtYXJ0UGFzdGVGb3JtYXQsIDApOwogICAgICAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgp
OwogICAgICAgICB9Ci0gICAgICAgIAogICAgIH0KKworICAgIHdyaXRlUmFuZ2VUb0RhdGFPYmpl
Y3Qoc2VsZWN0ZWRSYW5nZSwgZnJhbWUpOwogfQogCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRlUGxh
aW5UZXh0VG9EYXRhT2JqZWN0KGNvbnN0IFN0cmluZyYgdGV4dCwgU21hcnRSZXBsYWNlT3B0aW9u
IHNtYXJ0UmVwbGFjZU9wdGlvbikKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQor
ICAgICAgICByZXR1cm47CisKKyAgICBTVEdNRURJVU0gbWVkaXVtID0gezB9OworICAgIG1lZGl1
bS50eW1lZCA9IFRZTUVEX0hHTE9CQUw7CisKKyAgICBTdHJpbmcgc3RyID0gdGV4dDsKKyAgICBy
ZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3bGluZXMoc3RyKTsKKyAgICByZXBsYWNl
TkJTUFdpdGhTcGFjZShzdHIpOworICAgIG1lZGl1bS5oR2xvYmFsID0gY3JlYXRlR2xvYmFsRGF0
YShzdHIpOworICAgIGlmIChtZWRpdW0uaEdsb2JhbCAmJiBGQUlMRUQobV93cml0YWJsZURhdGFP
YmplY3QtPlNldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAmbWVkaXVtLCBUUlVFKSkpCisgICAg
ICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7ICAgICAgICAKKworICAgIG1lZGl1bS5o
R2xvYmFsID0gMDsKK30KKwogdm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVBsYWluVGV4dChjb25zdCBT
dHJpbmcmIHRleHQsIFNtYXJ0UmVwbGFjZU9wdGlvbiBzbWFydFJlcGxhY2VPcHRpb24pCiB7CiAg
ICAgY2xlYXIoKTsKQEAgLTE3MSw4ICs1MjAsMTY1IEBADQogICAgICAgICAgICAgOjpDbG9zZUNs
aXBib2FyZCgpOwogICAgICAgICB9CiAgICAgfQorCisgICAgd3JpdGVQbGFpblRleHRUb0RhdGFP
YmplY3QodGV4dCwgc21hcnRSZXBsYWNlT3B0aW9uKTsKIH0KIAorI2lmICFPUyhXSU5DRSkKK3N0
YXRpYyBpbmxpbmUgdm9pZCBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKFBXU1RSIHBzeiwgc2l6
ZV90IGxlbmd0aCkKK3sKKyAgICBzaXplX3Qgd3JpdGVUbyA9IDA7CisgICAgc2l6ZV90IHJlYWRG
cm9tID0gMDsKKyAgICB3aGlsZSAocmVhZEZyb20gPCBsZW5ndGgpIHsKKyAgICAgICAgVUlOVCB0
eXBlID0gUGF0aEdldENoYXJUeXBlKHBzeltyZWFkRnJvbV0pOworICAgICAgICBpZiAoIXBzelty
ZWFkRnJvbV0gfHwgdHlwZSAmIChHQ1RfTEZOQ0hBUiB8IEdDVF9TSE9SVENIQVIpKQorICAgICAg
ICAgICAgcHN6W3dyaXRlVG8rK10gPSBwc3pbcmVhZEZyb21dOworCisgICAgICAgIHJlYWRGcm9t
Kys7CisgICAgfQorICAgIHBzelt3cml0ZVRvXSA9IDA7Cit9CisjZW5kaWYKKworc3RhdGljIFN0
cmluZyBmaWxlc3lzdGVtUGF0aEZyb21VcmxPclRpdGxlKGNvbnN0IFN0cmluZyYgdXJsLCBjb25z
dCBTdHJpbmcmIHRpdGxlLCBjb25zdCBVQ2hhciogZXh0ZW5zaW9uLCBib29sIGlzTGluaykKK3sK
KyNpZiBPUyhXSU5DRSkKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBTdHJpbmco
KTsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBmc1BhdGhNYXhMZW5ndGhFeGNsdWRp
bmdOdWxsVGVybWluYXRvciA9IE1BWF9QQVRIIC0gMTsKKyAgICBib29sIHVzZWRVUkwgPSBmYWxz
ZTsKKyAgICBXQ0hBUiBmc1BhdGhCdWZmZXJbTUFYX1BBVEhdOworICAgIGZzUGF0aEJ1ZmZlclsw
XSA9IDA7CisgICAgaW50IGV4dGVuc2lvbkxlbiA9IGV4dGVuc2lvbiA/IGxzdHJsZW4oZXh0ZW5z
aW9uKSA6IDA7CisgICAgaW50IGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4dGVuc2lvbiA9IGZz
UGF0aE1heExlbmd0aEV4Y2x1ZGluZ051bGxUZXJtaW5hdG9yIC0gZXh0ZW5zaW9uTGVuOworCisg
ICAgaWYgKCF0aXRsZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0ZDo6bWlu
PHNpemVfdD4odGl0bGUubGVuZ3RoKCksIGZzUGF0aE1heExlbmd0aEV4Y2x1ZGluZ0V4dGVuc2lv
bik7CisgICAgICAgIENvcHlNZW1vcnkoZnNQYXRoQnVmZmVyLCB0aXRsZS5jaGFyYWN0ZXJzKCks
IGxlbiAqIHNpemVvZihVQ2hhcikpOworICAgICAgICBmc1BhdGhCdWZmZXJbbGVuXSA9IDA7Cisg
ICAgICAgIHBhdGhSZW1vdmVCYWRGU0NoYXJhY3RlcnMoZnNQYXRoQnVmZmVyLCBsZW4pOworICAg
IH0KKworICAgIGlmICghbHN0cmxlbihmc1BhdGhCdWZmZXIpKSB7CisgICAgICAgIEtVUkwga3Vy
bChLVVJMKCksIHVybCk7CisgICAgICAgIHVzZWRVUkwgPSB0cnVlOworICAgICAgICAvLyBUaGUg
ZmlsZW5hbWUgZm9yIGFueSBjb250ZW50IGJhc2VkIGRyYWcgb3IgZmlsZSB1cmwgc2hvdWxkIGJl
IHRoZSBsYXN0IGVsZW1lbnQgb2YgCisgICAgICAgIC8vIHRoZSBwYXRoLiBJZiB3ZSBjYW4ndCBm
aW5kIGl0LCBvciB3ZSdyZSBjb21pbmcgdXAgd2l0aCB0aGUgbmFtZSBmb3IgYSBsaW5rCisgICAg
ICAgIC8vIHdlIGp1c3QgdXNlIHRoZSBlbnRpcmUgdXJsLgorICAgICAgICBEV09SRCBsZW4gPSBm
c1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb247CisgICAgICAgIFN0cmluZyBsYXN0Q29t
cG9uZW50ID0ga3VybC5sYXN0UGF0aENvbXBvbmVudCgpOworICAgICAgICBpZiAoa3VybC5pc0xv
Y2FsRmlsZSgpIHx8ICghaXNMaW5rICYmICFsYXN0Q29tcG9uZW50LmlzRW1wdHkoKSkpIHsKKyAg
ICAgICAgICAgIGxlbiA9IHN0ZDo6bWluPERXT1JEPihmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdF
eHRlbnNpb24sIGxhc3RDb21wb25lbnQubGVuZ3RoKCkpOworICAgICAgICAgICAgQ29weU1lbW9y
eShmc1BhdGhCdWZmZXIsIGxhc3RDb21wb25lbnQuY2hhcmFjdGVycygpLCBsZW4gKiBzaXplb2Yo
VUNoYXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlbiA9IHN0ZDo6bWluPERX
T1JEPihmc1BhdGhNYXhMZW5ndGhFeGNsdWRpbmdFeHRlbnNpb24sIHVybC5sZW5ndGgoKSk7Cisg
ICAgICAgICAgICBDb3B5TWVtb3J5KGZzUGF0aEJ1ZmZlciwgdXJsLmNoYXJhY3RlcnMoKSwgbGVu
ICogc2l6ZW9mKFVDaGFyKSk7CisgICAgICAgIH0KKyAgICAgICAgZnNQYXRoQnVmZmVyW2xlbl0g
PSAwOworICAgICAgICBwYXRoUmVtb3ZlQmFkRlNDaGFyYWN0ZXJzKGZzUGF0aEJ1ZmZlciwgbGVu
KTsKKyAgICB9CisKKyAgICBpZiAoIWV4dGVuc2lvbikKKyAgICAgICAgcmV0dXJuIFN0cmluZyhz
dGF0aWNfY2FzdDxVQ2hhcio+KGZzUGF0aEJ1ZmZlcikpOworCisgICAgaWYgKCFpc0xpbmsgJiYg
dXNlZFVSTCkgeworICAgICAgICBQYXRoUmVuYW1lRXh0ZW5zaW9uKGZzUGF0aEJ1ZmZlciwgZXh0
ZW5zaW9uKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+KGZzUGF0
aEJ1ZmZlcikpOworICAgIH0KKworICAgIHJldHVybiBtYWtlU3RyaW5nKHN0YXRpY19jYXN0PGNv
bnN0IFVDaGFyKj4oZnNQYXRoQnVmZmVyKSwgZXh0ZW5zaW9uKTsKKyNlbmRpZgorfQorCisvLyB3
cml0ZUZpbGVUb0RhdGFPYmplY3QgdGFrZXMgb3duZXJzaGlwIG9mIGZpbGVEZXNjcmlwdG9yIGFu
ZCBmaWxlQ29udGVudAorc3RhdGljIEhSRVNVTFQgd3JpdGVGaWxlVG9EYXRhT2JqZWN0KElEYXRh
T2JqZWN0KiBkYXRhT2JqZWN0LCBIR0xPQkFMIGZpbGVEZXNjcmlwdG9yLCBIR0xPQkFMIGZpbGVD
b250ZW50LCBIR0xPQkFMIGhEcm9wQ29udGVudCkKK3sKKyAgICBIUkVTVUxUIGhyID0gU19PSzsK
KyAgICBGT1JNQVRFVEMqIGZlOworICAgIFNUR01FRElVTSBtZWRpdW0gPSB7MH07CisgICAgbWVk
aXVtLnR5bWVkID0gVFlNRURfSEdMT0JBTDsKKworICAgIGlmICghZmlsZURlc2NyaXB0b3IgfHwg
IWZpbGVDb250ZW50KQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICAvLyBEZXNjcmlwdG9yCisg
ICAgZmUgPSBmaWxlRGVzY3JpcHRvckZvcm1hdCgpOworCisgICAgbWVkaXVtLmhHbG9iYWwgPSBm
aWxlRGVzY3JpcHRvcjsKKworICAgIGlmIChGQUlMRUQoaHIgPSBkYXRhT2JqZWN0LT5TZXREYXRh
KGZlLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIGdvdG8gZXhpdDsKKworICAgIC8vIENvbnRl
bnRzCisgICAgZmUgPSBmaWxlQ29udGVudEZvcm1hdFplcm8oKTsKKyAgICBtZWRpdW0uaEdsb2Jh
bCA9IGZpbGVDb250ZW50OworICAgIGlmIChGQUlMRUQoaHIgPSBkYXRhT2JqZWN0LT5TZXREYXRh
KGZlLCAmbWVkaXVtLCBUUlVFKSkpCisgICAgICAgIGdvdG8gZXhpdDsKKworI2lmIFVTRShDRikK
KyAgICAvLyBIRFJPUAorICAgIGlmIChoRHJvcENvbnRlbnQpIHsKKyAgICAgICAgbWVkaXVtLmhH
bG9iYWwgPSBoRHJvcENvbnRlbnQ7CisgICAgICAgIGhyID0gZGF0YU9iamVjdC0+U2V0RGF0YShj
ZkhEcm9wRm9ybWF0KCksICZtZWRpdW0sIFRSVUUpOworICAgIH0KKyNlbmRpZgorCitleGl0Ogor
ICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGlmIChmaWxlRGVzY3JpcHRvcikKKyAgICAg
ICAgICAgIEdsb2JhbEZyZWUoZmlsZURlc2NyaXB0b3IpOworICAgICAgICBpZiAoZmlsZUNvbnRl
bnQpCisgICAgICAgICAgICBHbG9iYWxGcmVlKGZpbGVDb250ZW50KTsKKyAgICAgICAgaWYgKGhE
cm9wQ29udGVudCkKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoaERyb3BDb250ZW50KTsKKyAgICB9
CisgICAgcmV0dXJuIGhyOworfQorCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRlVVJMVG9EYXRhT2Jq
ZWN0KGNvbnN0IEtVUkwmIGt1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGVTdHIsIEZyYW1lKiBmcmFt
ZSkKK3sKKyAgICBpZiAoIW1fd3JpdGFibGVEYXRhT2JqZWN0KQorICAgICAgICByZXR1cm47Cisg
ICAgV2ViQ29yZTo6d3JpdGVVUkwobV93cml0YWJsZURhdGFPYmplY3QuZ2V0KCksIGt1cmwsIHRp
dGxlU3RyLCB0cnVlLCB0cnVlKTsKKworICAgIFN0cmluZyB1cmwgPSBrdXJsLnN0cmluZygpOwor
ICAgIEFTU0VSVCh1cmwuY29udGFpbnNPbmx5QVNDSUkoKSk7IC8vIEtVUkw6OnN0cmluZygpIGlz
IFVSTCBlbmNvZGVkLgorCisgICAgU3RyaW5nIGZzUGF0aCA9IGZpbGVzeXN0ZW1QYXRoRnJvbVVy
bE9yVGl0bGUodXJsLCB0aXRsZVN0ciwgTCIuVVJMIiwgdHJ1ZSk7CisgICAgU3RyaW5nIGNvbnRl
bnRTdHJpbmcoIltJbnRlcm5ldFNob3J0Y3V0XVxyXG5VUkw9IiArIHVybCArICJcclxuIik7Cisg
ICAgQ1N0cmluZyBjb250ZW50ID0gY29udGVudFN0cmluZy5sYXRpbjEoKTsKKworICAgIGlmIChm
c1BhdGgubGVuZ3RoKCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgSEdMT0JBTCB1cmxG
aWxlRGVzY3JpcHRvciA9IEdsb2JhbEFsbG9jKEdQVFIsIHNpemVvZihGSUxFR1JPVVBERVNDUklQ
VE9SKSk7CisgICAgaWYgKCF1cmxGaWxlRGVzY3JpcHRvcikKKyAgICAgICAgcmV0dXJuOworCisg
ICAgSEdMT0JBTCB1cmxGaWxlQ29udGVudCA9IEdsb2JhbEFsbG9jKEdQVFIsIGNvbnRlbnQubGVu
Z3RoKCkpOworICAgIGlmICghdXJsRmlsZUNvbnRlbnQpIHsKKyAgICAgICAgR2xvYmFsRnJlZSh1
cmxGaWxlRGVzY3JpcHRvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBGSUxFR1JP
VVBERVNDUklQVE9SKiBmZ2QgPSBzdGF0aWNfY2FzdDxGSUxFR1JPVVBERVNDUklQVE9SKj4oR2xv
YmFsTG9jayh1cmxGaWxlRGVzY3JpcHRvcikpOworICAgIFplcm9NZW1vcnkoZmdkLCBzaXplb2Yo
RklMRUdST1VQREVTQ1JJUFRPUikpOworICAgIGZnZC0+Y0l0ZW1zID0gMTsKKyAgICBmZ2QtPmZn
ZFswXS5kd0ZsYWdzID0gRkRfRklMRVNJWkU7CisgICAgZmdkLT5mZ2RbMF0ubkZpbGVTaXplTG93
ID0gY29udGVudC5sZW5ndGgoKTsKKworICAgIHVuc2lnbmVkIG1heFNpemUgPSBzdGQ6Om1pbihm
c1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgoZmdkLT5mZ2RbMF0uY0ZpbGVOYW1lKSk7
CisgICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmlsZU5hbWUsIGZzUGF0aC5jaGFyYWN0ZXJz
KCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsKKyAgICBHbG9iYWxVbmxvY2sodXJsRmlsZURl
c2NyaXB0b3IpOworCisgICAgY2hhciogZmlsZUNvbnRlbnRzID0gc3RhdGljX2Nhc3Q8Y2hhcio+
KEdsb2JhbExvY2sodXJsRmlsZUNvbnRlbnQpKTsKKyAgICBDb3B5TWVtb3J5KGZpbGVDb250ZW50
cywgY29udGVudC5kYXRhKCksIGNvbnRlbnQubGVuZ3RoKCkpOworICAgIEdsb2JhbFVubG9jayh1
cmxGaWxlQ29udGVudCk7CisKKyAgICB3cml0ZUZpbGVUb0RhdGFPYmplY3QobV93cml0YWJsZURh
dGFPYmplY3QuZ2V0KCksIHVybEZpbGVEZXNjcmlwdG9yLCB1cmxGaWxlQ29udGVudCwgMCk7Cit9
CisKIHZvaWQgUGFzdGVib2FyZDo6d3JpdGVVUkwoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJp
bmcmIHRpdGxlU3RyLCBGcmFtZSogZnJhbWUpCiB7CiAgICAgQVNTRVJUKCF1cmwuaXNFbXB0eSgp
KTsKQEAgLTIxMSw2ICs3MTcsOCBAQA0KICAgICAgICAgICAgIDo6R2xvYmFsRnJlZShjYkRhdGEp
OwogICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7CiAgICAgfQorCisgICAgd3JpdGVVUkxUb0Rh
dGFPYmplY3QodXJsLCB0aXRsZVN0ciwgZnJhbWUpOwogfQogCiB2b2lkIFBhc3RlYm9hcmQ6Ondy
aXRlSW1hZ2UoTm9kZSogbm9kZSwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYpCkBAIC0yNTYs
NiArNzY0LDExIEBADQogICAgIH0KIH0KIAordm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVBhc3RlYm9h
cmQoY29uc3QgUGFzdGVib2FyZCYgc291cmNlUGFzdGVib2FyZCkKK3sKKyAgICBub3RJbXBsZW1l
bnRlZCgpOworfQorCiB2b2lkIFBhc3RlYm9hcmQ6OndyaXRlQ2xpcGJvYXJkKENsaXBib2FyZCop
CiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKQEAgLTM1Miw0ICs4NjUsMTg1IEBADQogICAgIHJl
dHVybiAwOwogfQogCit2b2lkIFBhc3RlYm9hcmQ6OnNldEV4dGVybmFsRGF0YU9iamVjdChJRGF0
YU9iamVjdCAqZGF0YU9iamVjdCkKK3sKKyAgICBtX3dyaXRhYmxlRGF0YU9iamVjdCA9IDA7Cisg
ICAgbV9kYXRhT2JqZWN0ID0gZGF0YU9iamVjdDsKK30KKworc3RhdGljIENhY2hlZEltYWdlKiBn
ZXRDYWNoZWRJbWFnZShFbGVtZW50KiBlbGVtZW50KQoreworICAgIC8vIEF0dGVtcHQgdG8gcHVs
bCBDYWNoZWRJbWFnZSBmcm9tIGVsZW1lbnQKKyAgICBBU1NFUlQoZWxlbWVudCk7CisgICAgUmVu
ZGVyT2JqZWN0KiByZW5kZXJlciA9IGVsZW1lbnQtPnJlbmRlcmVyKCk7CisgICAgaWYgKCFyZW5k
ZXJlciB8fCAhcmVuZGVyZXItPmlzSW1hZ2UoKSkgCisgICAgICAgIHJldHVybiAwOworCisgICAg
UmVuZGVySW1hZ2UqIGltYWdlID0gdG9SZW5kZXJJbWFnZShyZW5kZXJlcik7CisgICAgaWYgKGlt
YWdlLT5jYWNoZWRJbWFnZSgpICYmICFpbWFnZS0+Y2FjaGVkSW1hZ2UoKS0+ZXJyb3JPY2N1cnJl
ZCgpKQorICAgICAgICByZXR1cm4gaW1hZ2UtPmNhY2hlZEltYWdlKCk7CisKKyAgICByZXR1cm4g
MDsKK30KKworc3RhdGljIEhHTE9CQUwgY3JlYXRlR2xvYmFsSW1hZ2VGaWxlRGVzY3JpcHRvcihj
b25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ2FjaGVkSW1hZ2UqIGltYWdl
KQoreworICAgIEFTU0VSVF9BUkcoaW1hZ2UsIGltYWdlKTsKKyAgICBBU1NFUlQoaW1hZ2UtPmlt
YWdlKCktPmRhdGEoKSk7CisKKyAgICBIUkVTVUxUIGhyID0gU19PSzsKKyAgICBIR0xPQkFMIG1l
bU9iaiA9IDA7CisgICAgU3RyaW5nIGZzUGF0aDsKKyAgICBtZW1PYmogPSBHbG9iYWxBbGxvYyhH
UFRSLCBzaXplb2YoRklMRUdST1VQREVTQ1JJUFRPUikpOworICAgIGlmICghbWVtT2JqKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIEZJTEVHUk9VUERFU0NSSVBUT1IqIGZnZCA9IChGSUxFR1JP
VVBERVNDUklQVE9SKilHbG9iYWxMb2NrKG1lbU9iaik7CisgICAgbWVtc2V0KGZnZCwgMCwgc2l6
ZW9mKEZJTEVHUk9VUERFU0NSSVBUT1IpKTsKKyAgICBmZ2QtPmNJdGVtcyA9IDE7CisgICAgZmdk
LT5mZ2RbMF0uZHdGbGFncyA9IEZEX0ZJTEVTSVpFOworICAgIGZnZC0+ZmdkWzBdLm5GaWxlU2l6
ZUxvdyA9IGltYWdlLT5pbWFnZSgpLT5kYXRhKCktPnNpemUoKTsKKworICAgIGNvbnN0IFN0cmlu
ZyYgcHJlZmVycmVkVGl0bGUgPSB0aXRsZS5pc0VtcHR5KCkgPyBpbWFnZS0+cmVzcG9uc2UoKS5z
dWdnZXN0ZWRGaWxlbmFtZSgpIDogdGl0bGU7CisgICAgU3RyaW5nIGV4dGVuc2lvbiA9IGltYWdl
LT5pbWFnZSgpLT5maWxlbmFtZUV4dGVuc2lvbigpOworICAgIGlmIChleHRlbnNpb24uaXNFbXB0
eSgpKSB7CisgICAgICAgIC8vIERvIG5vdCBjb250aW51ZSBwcm9jZXNzaW5nIGluIHRoZSByYXJl
IGFuZCB1bnVzdWFsIGNhc2Ugd2hlcmUgYSBkZWNvZGVkIGltYWdlIGlzIG5vdCBhYmxlIAorICAg
ICAgICAvLyB0byBwcm92aWRlIGEgZmlsZW5hbWUgZXh0ZW5zaW9uLiBTb21ldGhpbmcgdHJpY2t5
IChsaWtlIGEgYmFpdC1uLXN3aXRjaCkgaXMgZ29pbmcgb24KKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorICAgIGV4dGVuc2lvbi5pbnNlcnQoIi4iLCAwKTsKKyAgICBmc1BhdGggPSBmaWxlc3lz
dGVtUGF0aEZyb21VcmxPclRpdGxlKHVybCwgcHJlZmVycmVkVGl0bGUsIGV4dGVuc2lvbi5jaGFy
YWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCBmYWxzZSk7CisKKyAgICBpZiAoZnNQYXRoLmxl
bmd0aCgpIDw9IDApIHsKKyAgICAgICAgR2xvYmFsVW5sb2NrKG1lbU9iaik7CisgICAgICAgIEds
b2JhbEZyZWUobWVtT2JqKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50IG1h
eFNpemUgPSBzdGQ6Om1pbihmc1BhdGgubGVuZ3RoKCksIFdURl9BUlJBWV9MRU5HVEgoZmdkLT5m
Z2RbMF0uY0ZpbGVOYW1lKSk7CisgICAgQ29weU1lbW9yeShmZ2QtPmZnZFswXS5jRmlsZU5hbWUs
IChMUENXU1RSKWZzUGF0aC5jaGFyYWN0ZXJzKCksIG1heFNpemUgKiBzaXplb2YoVUNoYXIpKTsK
KyAgICBHbG9iYWxVbmxvY2sobWVtT2JqKTsKKworICAgIHJldHVybiBtZW1PYmo7Cit9CisKK3N0
YXRpYyBIR0xPQkFMIGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoU2hhcmVkQnVmZmVyKiBk
YXRhKQoreworICAgIEhHTE9CQUwgbWVtT2JqID0gR2xvYmFsQWxsb2MoR1BUUiwgZGF0YS0+c2l6
ZSgpKTsKKyAgICBpZiAoIW1lbU9iaikgCisgICAgICAgIHJldHVybiAwOworCisgICAgY2hhciog
ZmlsZUNvbnRlbnRzID0gKFBTVFIpR2xvYmFsTG9jayhtZW1PYmopOworCisgICAgQ29weU1lbW9y
eShmaWxlQ29udGVudHMsIGRhdGEtPmRhdGEoKSwgZGF0YS0+c2l6ZSgpKTsKKworICAgIEdsb2Jh
bFVubG9jayhtZW1PYmopOworCisgICAgcmV0dXJuIG1lbU9iajsKK30KKworc3RhdGljIEhHTE9C
QUwgY3JlYXRlR2xvYmFsSERyb3BDb250ZW50KGNvbnN0IEtVUkwmIHVybCwgU3RyaW5nJiBmaWxl
TmFtZSwgU2hhcmVkQnVmZmVyKiBkYXRhKQoreworICAgIGlmIChmaWxlTmFtZS5pc0VtcHR5KCkg
fHwgIWRhdGEpCisgICAgICAgIHJldHVybiAwOworCisgICAgV0NIQVIgZmlsZVBhdGhbTUFYX1BB
VEhdOworCisgICAgaWYgKHVybC5pc0xvY2FsRmlsZSgpKSB7CisgICAgICAgIFN0cmluZyBsb2Nh
bFBhdGggPSBkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXModXJsLnBhdGgoKSk7CisgICAgICAgIC8v
IHdpbmRvd3MgZG9lcyBub3QgZW5qb3kgYSBsZWFkaW5nIHNsYXNoIG9uIHBhdGhzCisgICAgICAg
IGlmIChsb2NhbFBhdGhbMF0gPT0gJy8nKQorICAgICAgICAgICAgbG9jYWxQYXRoID0gbG9jYWxQ
YXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgTFBDV1NUUiBsb2NhbFBhdGhTdHIgPSBsb2NhbFBh
dGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKTsKKyAgICAgICAgaWYgKHdjc2xlbihs
b2NhbFBhdGhTdHIpICsgMSA8IE1BWF9QQVRIKQorICAgICAgICAgICAgd2NzY3B5X3MoZmlsZVBh
dGgsIE1BWF9QQVRILCBsb2NhbFBhdGhTdHIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICB9IGVsc2UgeworI2lmIE9TKFdJTkNFKQorICAgICAgICBub3RJbXBsZW1l
bnRlZCgpOworICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgICAgIFdDSEFSIHRlbXBQYXRo
W01BWF9QQVRIXTsKKyAgICAgICAgV0NIQVIgZXh0ZW5zaW9uW01BWF9QQVRIXTsKKyAgICAgICAg
aWYgKCE6OkdldFRlbXBQYXRoKFdURl9BUlJBWV9MRU5HVEgodGVtcFBhdGgpLCB0ZW1wUGF0aCkp
CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCE6OlBhdGhBcHBlbmQodGVtcFBh
dGgsIGZpbGVOYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpKQorICAgICAgICAg
ICAgcmV0dXJuIDA7CisgICAgICAgIExQQ1dTVFIgZm91bmRFeHRlbnNpb24gPSA6OlBhdGhGaW5k
RXh0ZW5zaW9uKHRlbXBQYXRoKTsKKyAgICAgICAgaWYgKGZvdW5kRXh0ZW5zaW9uKSB7CisgICAg
ICAgICAgICBpZiAod2NzY3B5X3MoZXh0ZW5zaW9uLCBNQVhfUEFUSCwgZm91bmRFeHRlbnNpb24p
KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAg
ICpleHRlbnNpb24gPSAwOworICAgICAgICA6OlBhdGhSZW1vdmVFeHRlbnNpb24odGVtcFBhdGgp
OworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwOyBpKyspIHsKKyAgICAgICAgICAg
IGlmIChzd3ByaW50Zl9zKGZpbGVQYXRoLCBNQVhfUEFUSCwgVEVYVCgiJXMtJWQlcyIpLCB0ZW1w
UGF0aCwgaSwgZXh0ZW5zaW9uKSA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgICAgIGlmICghOjpQYXRoRmlsZUV4aXN0cyhmaWxlUGF0aCkpCisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgSEFORExFIHRlbXBGaWxlSGFuZGxlID0gQ3Jl
YXRlRmlsZShmaWxlUGF0aCwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURSwgMCwgMCwgQ1JF
QVRFX0FMV0FZUywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCAwKTsKKyAgICAgICAgaWYgKHRlbXBG
aWxlSGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICAgICAgcmV0dXJuIDA7
CisKKyAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgdG8gdGhpcyB0ZW1wIGZpbGUuCisgICAgICAg
IERXT1JEIHdyaXR0ZW47CisgICAgICAgIEJPT0wgdGVtcFdyaXRlU3VjY2VlZGVkID0gV3JpdGVG
aWxlKHRlbXBGaWxlSGFuZGxlLCBkYXRhLT5kYXRhKCksIGRhdGEtPnNpemUoKSwgJndyaXR0ZW4s
IDApOworICAgICAgICBDbG9zZUhhbmRsZSh0ZW1wRmlsZUhhbmRsZSk7CisgICAgICAgIGlmICgh
dGVtcFdyaXRlU3VjY2VlZGVkKQorICAgICAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICB9
CisKKyAgICBTSVpFX1QgZHJvcEZpbGVzU2l6ZSA9IHNpemVvZihEUk9QRklMRVMpICsgKHNpemVv
ZihXQ0hBUikgKiAod2NzbGVuKGZpbGVQYXRoKSArIDIpKTsKKyAgICBIR0xPQkFMIG1lbU9iaiA9
IEdsb2JhbEFsbG9jKEdITkQgfCBHTUVNX1NIQVJFLCBkcm9wRmlsZXNTaXplKTsKKyAgICBpZiAo
IW1lbU9iaikgCisgICAgICAgIHJldHVybiAwOworCisgICAgRFJPUEZJTEVTKiBkcm9wRmlsZXMg
PSAoRFJPUEZJTEVTKikgR2xvYmFsTG9jayhtZW1PYmopOworICAgIGRyb3BGaWxlcy0+cEZpbGVz
ID0gc2l6ZW9mKERST1BGSUxFUyk7CisgICAgZHJvcEZpbGVzLT5mV2lkZSA9IFRSVUU7CisgICAg
d2NzY3B5KChMUFdTVFIpKGRyb3BGaWxlcyArIDEpLCBmaWxlUGF0aCk7ICAgIAorICAgIEdsb2Jh
bFVubG9jayhtZW1PYmopOworCisgICAgcmV0dXJuIG1lbU9iajsKK30KKwordm9pZCBQYXN0ZWJv
YXJkOjp3cml0ZUltYWdlVG9EYXRhT2JqZWN0KEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEtVUkwm
IHVybCkKK3sKKyAgICAvLyBTaG92ZSBpbWFnZSBkYXRhIGludG8gYSBEYXRhT2JqZWN0IGZvciB1
c2UgYXMgYSBmaWxlCisgICAgQ2FjaGVkSW1hZ2UqIGNhY2hlZEltYWdlID0gZ2V0Q2FjaGVkSW1h
Z2UoZWxlbWVudCk7CisgICAgaWYgKCFjYWNoZWRJbWFnZSB8fCAhY2FjaGVkSW1hZ2UtPmltYWdl
Rm9yUmVuZGVyZXIoZWxlbWVudC0+cmVuZGVyZXIoKSkgfHwgIWNhY2hlZEltYWdlLT5pc0xvYWRl
ZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTaGFyZWRCdWZmZXIqIGltYWdlQnVmZmVyID0g
Y2FjaGVkSW1hZ2UtPmltYWdlRm9yUmVuZGVyZXIoZWxlbWVudC0+cmVuZGVyZXIoKSktPmRhdGEo
KTsKKyAgICBpZiAoIWltYWdlQnVmZmVyIHx8ICFpbWFnZUJ1ZmZlci0+c2l6ZSgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBIR0xPQkFMIGltYWdlRmlsZURlc2NyaXB0b3IgPSBjcmVhdGVHbG9i
YWxJbWFnZUZpbGVEZXNjcmlwdG9yKHVybC5zdHJpbmcoKSwgZWxlbWVudC0+Z2V0QXR0cmlidXRl
KEhUTUxOYW1lczo6YWx0QXR0ciksIGNhY2hlZEltYWdlKTsKKyAgICBpZiAoIWltYWdlRmlsZURl
c2NyaXB0b3IpCisgICAgICAgIHJldHVybjsKKworICAgIEhHTE9CQUwgaW1hZ2VGaWxlQ29udGVu
dCA9IGNyZWF0ZUdsb2JhbEltYWdlRmlsZUNvbnRlbnQoaW1hZ2VCdWZmZXIpOworICAgIGlmICgh
aW1hZ2VGaWxlQ29udGVudCkgeworICAgICAgICBHbG9iYWxGcmVlKGltYWdlRmlsZURlc2NyaXB0
b3IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nIGZpbGVOYW1lID0gY2Fj
aGVkSW1hZ2UtPnJlc3BvbnNlKCkuc3VnZ2VzdGVkRmlsZW5hbWUoKTsKKyAgICBIR0xPQkFMIGhE
cm9wQ29udGVudCA9IGNyZWF0ZUdsb2JhbEhEcm9wQ29udGVudCh1cmwsIGZpbGVOYW1lLCBpbWFn
ZUJ1ZmZlcik7CisgICAgaWYgKCFoRHJvcENvbnRlbnQpIHsKKyAgICAgICAgR2xvYmFsRnJlZSho
RHJvcENvbnRlbnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd3JpdGVGaWxlVG9E
YXRhT2JqZWN0KG1fd3JpdGFibGVEYXRhT2JqZWN0LmdldCgpLCBpbWFnZUZpbGVEZXNjcmlwdG9y
LCBpbWFnZUZpbGVDb250ZW50LCBoRHJvcENvbnRlbnQpOworfQorCit2b2lkIFBhc3RlYm9hcmQ6
OndyaXRlVVJMVG9Xcml0YWJsZURhdGFPYmplY3QoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJp
bmcmIHRpdGxlKQoreworICAgIFdlYkNvcmU6OndyaXRlVVJMKG1fd3JpdGFibGVEYXRhT2JqZWN0
LmdldCgpLCB1cmwsIHRpdGxlLCB0cnVlLCBmYWxzZSk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZw0KPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0t
IFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZwkocmV2aXNpb24gMTUwNjMyKQ0KKysrIFNvdXJj
ZS9XZWJLaXQvd2luL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEsMyArMSwxNCBAQA0K
KzIwMTMtMDUtMjQgIFh1ZXFpbmcgSHVhbmcgIDxodWFuZ3h1ZXFpbmdAYmFpZHUuY29tPgorCisg
ICAgICAgIE1vdmUgV2luZG93cyBwb3J0IG9mZiBsZWdhY3kgY2xpcGJvYXJkLgorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjU4CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9X
ZWJEcmFnQ2xpZW50LmNwcDoKKyAgICAgICAgKFdlYkRyYWdDbGllbnQ6OndpbGxQZXJmb3JtRHJh
Z1NvdXJjZUFjdGlvbik6IEdldCBJRGF0YU9iamVjdCBmcm9tIFBhc3RlYm9hcmQgaW5zdGVhZCBv
ZiBDbGlwYm9hcmQuCisgICAgICAgIChXZWJEcmFnQ2xpZW50OjpzdGFydERyYWcpOiBEaXR0by4K
KwogMjAxMy0wNS0yMSAgTWFyayBTYWxpc2J1cnkgIDxtYXJrLnNhbGlzYnVyeUBocC5jb20+CiAK
ICAgICAgICAgW1dpbmRvd3MsIGN1cmxdIFdlYkRvd25sb2FkQ3VybC5jcHAgc2hvdWxkIG5vdCBp
bmNsdWRlIFN5c3RlbVRpbWUuaApJbmRleDogU291cmNlL1dlYktpdC93aW4vV2ViQ29yZVN1cHBv
cnQvV2ViRHJhZ0NsaWVudC5jcHANCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBTb3VyY2UvV2ViS2l0L3dpbi9X
ZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcAkocmV2aXNpb24gMTUwNjI5KQ0KKysrIFNv
dXJjZS9XZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQuY3BwCSh3b3JraW5n
IGNvcHkpDQpAQCAtMjksMTcgKzI5LDE3IEBADQogI2luY2x1ZGUgIldlYktpdEdyYXBoaWNzLmgi
CiAjaW5jbHVkZSAiV2ViVmlldy5oIgogCi0jaW5jbHVkZSA8c2hsb2JqLmg+Ci0KLSNpbmNsdWRl
IDxXZWJDb3JlL0NsaXBib2FyZFdpbi5oPgorI2luY2x1ZGUgPFdlYkNvcmUvQ2xpcGJvYXJkLmg+
CiAjaW5jbHVkZSA8V2ViQ29yZS9EcmFnQ29udHJvbGxlci5oPgogI2luY2x1ZGUgPFdlYkNvcmUv
RHJhZ0RhdGEuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0V2ZW50SGFuZGxlci5oPgorI2luY2x1ZGUg
PFdlYkNvcmUvUGFnZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUGFzdGVib2FyZC5oPgogI2luY2x1
ZGUgPFdlYkNvcmUvUGxhdGZvcm1Nb3VzZUV2ZW50Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9GcmFt
ZS5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRnJhbWVWaWV3Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9H
cmFwaGljc0NvbnRleHQuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1BhZ2UuaD4KKyNpbmNsdWRlIDxz
aGxvYmouaD4KIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKQEAgLTEwMywxMiArMTAzLDEy
IEBADQogICAgICAgICByZXR1cm47CiAKICAgICBQT0lOVCBwb2ludCA9IGludFBvaW50OwotICAg
IENPTVB0cjxJRGF0YU9iamVjdD4gZGF0YU9iamVjdCA9IHN0YXRpY19jYXN0PENsaXBib2FyZFdp
bio+KGNsaXBib2FyZCktPmRhdGFPYmplY3QoKTsKKyAgICBDT01QdHI8SURhdGFPYmplY3Q+IGRh
dGFPYmplY3QgPSBjbGlwYm9hcmQtPnBhc3RlYm9hcmQoKS5kYXRhT2JqZWN0KCk7CiAKICAgICBD
T01QdHI8SURhdGFPYmplY3Q+IG5ld0RhdGFPYmplY3Q7CiAgICAgSFJFU1VMVCByZXN1bHQgPSB1
aURlbGVnYXRlLT53aWxsUGVyZm9ybURyYWdTb3VyY2VBY3Rpb24obV93ZWJWaWV3LCBzdGF0aWNf
Y2FzdDxXZWJEcmFnU291cmNlQWN0aW9uPihhY3Rpb24pLCAmcG9pbnQsIGRhdGFPYmplY3QuZ2V0
KCksICZuZXdEYXRhT2JqZWN0KTsKICAgICBpZiAocmVzdWx0ID09IFNfT0sgJiYgbmV3RGF0YU9i
amVjdCAhPSBkYXRhT2JqZWN0KQotICAgICAgICBzdGF0aWNfY2FzdDxDbGlwYm9hcmRXaW4qPihj
bGlwYm9hcmQpLT5zZXRFeHRlcm5hbERhdGFPYmplY3QobmV3RGF0YU9iamVjdC5nZXQoKSk7Cisg
ICAgICAgIGNvbnN0X2Nhc3Q8UGFzdGVib2FyZCY+KGNsaXBib2FyZC0+cGFzdGVib2FyZCgpKS5z
ZXRFeHRlcm5hbERhdGFPYmplY3QobmV3RGF0YU9iamVjdC5nZXQoKSk7CiB9CiAKIHZvaWQgV2Vi
RHJhZ0NsaWVudDo6c3RhcnREcmFnKERyYWdJbWFnZVJlZiBpbWFnZSwgY29uc3QgSW50UG9pbnQm
IGltYWdlT3JpZ2luLCBjb25zdCBJbnRQb2ludCYgZHJhZ1BvaW50LCBDbGlwYm9hcmQqIGNsaXBi
b2FyZCwgRnJhbWUqIGZyYW1lLCBib29sIGlzTGluaykKQEAgLTEyNCw3ICsxMjQsNyBAQA0KICAg
ICBpZiAoRkFJTEVEKFdlYkRyb3BTb3VyY2U6OmNyZWF0ZUluc3RhbmNlKG1fd2ViVmlldywgJnNv
dXJjZSkpKQogICAgICAgICByZXR1cm47CiAKLSAgICBkYXRhT2JqZWN0ID0gc3RhdGljX2Nhc3Q8
Q2xpcGJvYXJkV2luKj4oY2xpcGJvYXJkKS0+ZGF0YU9iamVjdCgpOworICAgIGRhdGFPYmplY3Qg
PSBjbGlwYm9hcmQtPnBhc3RlYm9hcmQoKS5kYXRhT2JqZWN0KCk7CiAgICAgaWYgKHNvdXJjZSAm
JiAoaW1hZ2UgfHwgZGF0YU9iamVjdCkpIHsKICAgICAgICAgaWYgKGltYWdlKSB7CiAgICAgICAg
ICAgICBpZihTVUNDRUVERUQoQ29DcmVhdGVJbnN0YW5jZShDTFNJRF9EcmFnRHJvcEhlbHBlciwg
MCwgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>