<?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>73791</bug_id>
          
          <creation_ts>2011-12-04 18:38:37 -0800</creation_ts>
          <short_desc>Upstream platform/network/blackberry/DeferredData.{h, cpp}, NetworkJob.{h, cpp} and NetworkManager.{h, cpp}</short_desc>
          <delta_ts>2011-12-08 22:44:03 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</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>73144</blocked>
    
    <blocked>73869</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Leo Yang">leo.yang</reporter>
          <assigned_to name="Leo Yang">leo.yang</assigned_to>
          <cc>charles.wei</cc>
    
    <cc>dbates</cc>
    
    <cc>rwlbuis</cc>
    
    <cc>staikos</cc>
    
    <cc>zimmermann</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>514822</commentid>
    <comment_count>0</comment_count>
    <who name="Leo Yang">leo.yang</who>
    <bug_when>2011-12-04 18:38:37 -0800</bug_when>
    <thetext>This is the main part of the BlackBerry networking porting.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>514826</commentid>
    <comment_count>1</comment_count>
      <attachid>117823</attachid>
    <who name="Leo Yang">leo.yang</who>
    <bug_when>2011-12-04 18:50:10 -0800</bug_when>
    <thetext>Created attachment 117823
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>517415</commentid>
    <comment_count>2</comment_count>
      <attachid>117823</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2011-12-08 07:48:01 -0800</bug_when>
    <thetext>Comment on attachment 117823
Patch

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

Still some stuff to fix.

&gt; Source/WebCore/platform/network/blackberry/DeferredData.cpp:40
&gt; +void DeferredData::deferOpen(int status, const WTF::String&amp; message)

Do we need the WTF:: prefix?

&gt; Source/WebCore/platform/network/blackberry/NetworkJob.cpp:69
&gt; +}

I wonder if we can use toASCIIHexValue from wtf/ASCIICType.h?

&gt; Source/WebCore/platform/network/blackberry/NetworkManager.cpp:117
&gt; +#if OS(QNX)

Can be removed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518034</commentid>
    <comment_count>3</comment_count>
      <attachid>118515</attachid>
    <who name="Leo Yang">leo.yang</who>
    <bug_when>2011-12-08 19:15:52 -0800</bug_when>
    <thetext>Created attachment 118515
Patch v2

Following Rob&apos;s comments. Also fixing many style issues of code comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518045</commentid>
    <comment_count>4</comment_count>
      <attachid>118515</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2011-12-08 19:34:04 -0800</bug_when>
    <thetext>Comment on attachment 118515
Patch v2

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

Assuming toASCIIHexValue usage was tested, r+.

&gt; Source/WebCore/platform/network/blackberry/DeferredData.h:34
&gt; +    RecursionGuard(bool &amp;guard)

bool&amp; . Please run check-webkit-style :)

&gt; Source/WebCore/platform/network/blackberry/NetworkJob.h:144
&gt; +    }

Should be moved above the private: to join the other private methods.

&gt; Source/WebCore/platform/network/blackberry/NetworkJob.h:179
&gt; +    bool m_needsRetryAsFTPDirectory;

Note: you can pack the bools together if you want to save some memory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518049</commentid>
    <comment_count>5</comment_count>
    <who name="Leo Yang">leo.yang</who>
    <bug_when>2011-12-08 19:41:06 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 118515 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=118515&amp;action=review
&gt; 
&gt; Assuming toASCIIHexValue usage was tested, r+.
&gt; 
&gt; &gt; Source/WebCore/platform/network/blackberry/DeferredData.h:34
&gt; &gt; +    RecursionGuard(bool &amp;guard)
&gt; 
&gt; bool&amp; . Please run check-webkit-style :)
Good catch. I did run, but check-webkit-style didn&apos;t catch this. Will fix before landing.

&gt; 
&gt; &gt; Source/WebCore/platform/network/blackberry/NetworkJob.h:144
&gt; &gt; +    }
&gt; 
&gt; Should be moved above the private: to join the other private methods.
Good catch.

&gt; 
&gt; &gt; Source/WebCore/platform/network/blackberry/NetworkJob.h:179
&gt; &gt; +    bool m_needsRetryAsFTPDirectory;
&gt; 
&gt; Note: you can pack the bools together if you want to save some memory.
Hmmm, yes. But it hurts perf a bit. I wanted to do the same thing in other place, seems GS didn&apos;t like packing.

Thanks for review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518051</commentid>
    <comment_count>6</comment_count>
    <who name="Leo Yang">leo.yang</who>
    <bug_when>2011-12-08 19:42:32 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #4)
&gt; &gt; (From update of attachment 118515 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=118515&amp;action=review
&gt; &gt; 
&gt; &gt; Assuming toASCIIHexValue usage was tested, r+.
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/network/blackberry/DeferredData.h:34
&gt; &gt; &gt; +    RecursionGuard(bool &amp;guard)
&gt; &gt; 
&gt; &gt; bool&amp; . Please run check-webkit-style :)
&gt; Good catch. I did run, but check-webkit-style didn&apos;t catch this. Will fix before landing.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/network/blackberry/NetworkJob.h:144
&gt; &gt; &gt; +    }
&gt; &gt; 
&gt; &gt; Should be moved above the private: to join the other private methods.
&gt; Good catch.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/network/blackberry/NetworkJob.h:179
&gt; &gt; &gt; +    bool m_needsRetryAsFTPDirectory;
&gt; &gt; 
&gt; &gt; Note: you can pack the bools together if you want to save some memory.
&gt; Hmmm, yes. But it hurts perf a bit. I wanted to do the same thing in other place, seems GS didn&apos;t like packing.
Oh, sorry. I misunderstood what you meant. Yes, I will move them above.
&gt; 
&gt; Thanks for review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518125</commentid>
    <comment_count>7</comment_count>
    <who name="Leo Yang">leo.yang</who>
    <bug_when>2011-12-08 22:44:03 -0800</bug_when>
    <thetext>Committed r102433: &lt;http://trac.webkit.org/changeset/102433&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117823</attachid>
            <date>2011-12-04 18:50:10 -0800</date>
            <delta_ts>2011-12-08 19:15:52 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>0001-Upstream-platform-network-blackberry-DeferredData.-h.patch</filename>
            <type>text/plain</type>
            <size>69367</size>
            <attacher name="Leo Yang">leo.yang</attacher>
            
              <data encoding="base64">RnJvbSA4ODc0Y2FjMjJjOWFiNDk1NDVkMWYyMjYzOTFhMmY5ZGU2MmMyMmMyIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBMZW8gWWFuZyA8bGVvLnlhbmdAdG9yY2htb2JpbGUuY29tLmNu
PgpEYXRlOiBNb24sIDUgRGVjIDIwMTEgMTA6NDg6NDcgKzA4MDAKU3ViamVjdDogW1BBVENIXSBV
cHN0cmVhbSBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLntoLCBjcHB9
LAogTmV0d29ya0pvYi57aCwgY3BwfSBhbmQgTmV0d29ya01hbmFnZXIue2gsIGNwcH0KIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzc5MQoKUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCgpPdGhlciBtYWluIGNvbnRyaWJ1dG9yczoKSm9lIE1hc29uIDxqbWFzb25A
cmltLmNvbT4KTGlhbmdodWkgQ2hlbiAgPGxpYWNoZW5AcmltLmNvbT4KQ2hhcmxlcyBXZWkgPGNo
YXJsZXMud2VpQHRvcmNobW9iaWxlLmNvbS5jbj4KCkluaXRpYWwgdXBzdHJlYW0sIGNhbid0IGJl
IGJ1aWx0IHlldCwgbm8gbmV3IHRlc3RzLgoKKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkv
RGVmZXJyZWREYXRhLmNwcDogQWRkZWQuCihXZWJDb3JlOjpEZWZlcnJlZERhdGE6OkRlZmVycmVk
RGF0YSk6CihXZWJDb3JlOjpEZWZlcnJlZERhdGE6OmRlZmVyT3Blbik6CihXZWJDb3JlOjpEZWZl
cnJlZERhdGE6OmRlZmVyV01MT3ZlcnJpZGUpOgooV2ViQ29yZTo6RGVmZXJyZWREYXRhOjpkZWZl
ckhlYWRlclJlY2VpdmVkKToKKFdlYkNvcmU6OkRlZmVycmVkRGF0YTo6ZGVmZXJEYXRhU2VudCk6
CihXZWJDb3JlOjpEZWZlcnJlZERhdGE6OmRlZmVyRGF0YVJlY2VpdmVkKToKKFdlYkNvcmU6OkRl
ZmVycmVkRGF0YTo6ZGVmZXJDbG9zZSk6CihXZWJDb3JlOjpEZWZlcnJlZERhdGE6OnByb2Nlc3NE
ZWZlcnJlZERhdGEpOgooV2ViQ29yZTo6RGVmZXJyZWREYXRhOjpmaXJlUHJvY2Vzc0RhdGFUaW1l
cik6CiogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L0RlZmVycmVkRGF0YS5oOiBBZGRlZC4K
KFdlYkNvcmU6OlJlY3Vyc2lvbkd1YXJkOjpSZWN1cnNpb25HdWFyZCk6CihXZWJDb3JlOjpSZWN1
cnNpb25HdWFyZDo6flJlY3Vyc2lvbkd1YXJkKToKKFdlYkNvcmU6OkRlZmVycmVkRGF0YTo6aGFz
RGVmZXJyZWREYXRhKToKKFdlYkNvcmU6OkRlZmVycmVkRGF0YTo6c2NoZWR1bGVQcm9jZXNzRGVm
ZXJyZWREYXRhKToKKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya0pvYi5jcHA6
IEFkZGVkLgooV2ViQ29yZTo6aXNJbmZvKToKKFdlYkNvcmU6OmlzUmVkaXJlY3QpOgooV2ViQ29y
ZTo6aXNVbmF1dGhvcml6ZWQpOgooV2ViQ29yZTo6Y2hhclRvSGV4KToKKFdlYkNvcmU6OmVzY2Fw
ZURlY29kZSk6CihXZWJDb3JlOjpOZXR3b3JrSm9iOjpOZXR3b3JrSm9iKToKKFdlYkNvcmU6Ok5l
dHdvcmtKb2I6OmluaXRpYWxpemUpOgooV2ViQ29yZTo6TmV0d29ya0pvYjo6bG9hZEFib3V0VVJM
KToKKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OmNhbmNlbEpvYik6CihXZWJDb3JlOjpOZXR3b3JrSm9i
Ojp1cGRhdGVEZWZlckxvYWRpbmdDb3VudCk6CihXZWJDb3JlOjpOZXR3b3JrSm9iOjpub3RpZnlT
dGF0dXNSZWNlaXZlZCk6CihXZWJDb3JlOjpOZXR3b3JrSm9iOjpoYW5kbGVOb3RpZnlTdGF0dXNS
ZWNlaXZlZCk6CihXZWJDb3JlOjpOZXR3b3JrSm9iOjpub3RpZnlXTUxPdmVycmlkZSk6CihXZWJD
b3JlOjpOZXR3b3JrSm9iOjpub3RpZnlIZWFkZXJSZWNlaXZlZCk6CihXZWJDb3JlOjpOZXR3b3Jr
Sm9iOjpub3RpZnlTdHJpbmdIZWFkZXJSZWNlaXZlZCk6CihXZWJDb3JlOjpOZXR3b3JrSm9iOjpo
YW5kbGVOb3RpZnlIZWFkZXJSZWNlaXZlZCk6CihXZWJDb3JlOjpOZXR3b3JrSm9iOjpoYW5kbGVT
ZXRDb29raWVIZWFkZXIpOgooV2ViQ29yZTo6TmV0d29ya0pvYjo6bm90aWZ5RGF0YVJlY2VpdmVk
UGxhaW4pOgooV2ViQ29yZTo6TmV0d29ya0pvYjo6aGFuZGxlTm90aWZ5RGF0YVJlY2VpdmVkKToK
KFdlYkNvcmU6Ok5ldHdvcmtKb2I6Om5vdGlmeURhdGFTZW50KToKKFdlYkNvcmU6Ok5ldHdvcmtK
b2I6OmhhbmRsZU5vdGlmeURhdGFTZW50KToKKFdlYkNvcmU6Ok5ldHdvcmtKb2I6Om5vdGlmeUNs
b3NlKToKKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OmhhbmRsZU5vdGlmeUNsb3NlKToKKFdlYkNvcmU6
Ok5ldHdvcmtKb2I6OnNob3VsZE5vdGlmeUNsaWVudEZpbmlzaGVkKToKKFdlYkNvcmU6Ok5ldHdv
cmtKb2I6OnJldHJ5QXNGVFBEaXJlY3RvcnkpOgooV2ViQ29yZTo6TmV0d29ya0pvYjo6c3RhcnRO
ZXdKb2JXaXRoUmVxdWVzdCk6CihXZWJDb3JlOjpOZXR3b3JrSm9iOjpoYW5kbGVSZWRpcmVjdCk6
CihXZWJDb3JlOjpOZXR3b3JrSm9iOjpzZW5kUmVzcG9uc2VJZk5lZWRlZCk6CihXZWJDb3JlOjpO
ZXR3b3JrSm9iOjpwYXJzZURhdGEpOgooV2ViQ29yZTo6TmV0d29ya0pvYjo6aGFuZGxlQXV0aEhl
YWRlcik6CihXZWJDb3JlOjpOZXR3b3JrSm9iOjpoYW5kbGVGVFBIZWFkZXIpOgooV2ViQ29yZTo6
TmV0d29ya0pvYjo6c2VuZFJlcXVlc3RXaXRoQ3JlZGVudGlhbHMpOgooV2ViQ29yZTo6TmV0d29y
a0pvYjo6c3RvcmVDcmVkZW50aWFscyk6CihXZWJDb3JlOjpOZXR3b3JrSm9iOjpwdXJnZUNyZWRl
bnRpYWxzKToKKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OnNob3VsZFNlbmRDbGllbnREYXRhKToKKFdl
YkNvcmU6Ok5ldHdvcmtKb2I6OmZpcmVEZWxldGVKb2JUaW1lcik6CihXZWJDb3JlOjpOZXR3b3Jr
Sm9iOjpoYW5kbGVBYm91dCk6CiogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtK
b2IuaDogQWRkZWQuCihXZWJDb3JlOjpOZXR3b3JrSm9iOjpoYW5kbGUpOgooV2ViQ29yZTo6TmV0
d29ya0pvYjo6aXNSdW5uaW5nKToKKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OmlzQ2FuY2VsbGVkKToK
KFdlYkNvcmU6Ok5ldHdvcmtKb2I6OmNsaWVudElzT2spOgooV2ViQ29yZTo6TmV0d29ya0pvYjo6
bG9hZERhdGFVUkwpOgooV2ViQ29yZTo6TmV0d29ya0pvYjo6aXNEZWZlcnJpbmdMb2FkaW5nKToK
KFdlYkNvcmU6Ok5ldHdvcmtKb2I6OmhhbmRsZU5vdGlmeVdNTE92ZXJyaWRlKToKKFdlYkNvcmU6
Ok5ldHdvcmtKb2I6Om5vdGlmeURhdGFSZWNlaXZlZCk6CihXZWJDb3JlOjpOZXR3b3JrSm9iOjpz
ZXRXYXNEaXNrQ2FjaGVkKToKKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OnNob3VsZERlZmVyTG9hZGlu
Zyk6CihXZWJDb3JlOjpOZXR3b3JrSm9iOjpmaXJlTG9hZERhdGFUaW1lcik6CihXZWJDb3JlOjpO
ZXR3b3JrSm9iOjpmaXJlTG9hZEFib3V0VGltZXIpOgooV2ViQ29yZTo6TmV0d29ya0pvYjo6aXNF
cnJvcik6CiogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtNYW5hZ2VyLmNwcDog
QWRkZWQuCihXZWJDb3JlOjpOZXR3b3JrTWFuYWdlcjo6aW5zdGFuY2UpOgooV2ViQ29yZTo6TmV0
d29ya01hbmFnZXI6OnN0YXJ0Sm9iKToKKFdlYkNvcmU6Ok5ldHdvcmtNYW5hZ2VyOjpzdG9wSm9i
KToKKFdlYkNvcmU6Ok5ldHdvcmtNYW5hZ2VyOjpmaW5kSm9iRm9ySGFuZGxlKToKKFdlYkNvcmU6
Ok5ldHdvcmtNYW5hZ2VyOjpkZWxldGVKb2IpOgooV2ViQ29yZTo6TmV0d29ya01hbmFnZXI6OnNl
dERlZmVyc0xvYWRpbmcpOgooV2ViQ29yZTo6TmV0d29ya01hbmFnZXI6OnBhdXNlTG9hZCk6CihX
ZWJDb3JlOjpOZXR3b3JrTWFuYWdlcjo6c3RyZWFtRm9ySGFuZGxlKToKKiBwbGF0Zm9ybS9uZXR3
b3JrL2JsYWNrYmVycnkvTmV0d29ya01hbmFnZXIuaDogQWRkZWQuCihXZWJDb3JlOjpOZXR3b3Jr
TWFuYWdlcjo6c2V0SW5pdGlhbFVSTCk6CihXZWJDb3JlOjpOZXR3b3JrTWFuYWdlcjo6aW5pdGlh
bFVSTCk6Ci0tLQogU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAg
ICAgICAgfCAgIDk0ICsrCiAuLi4vcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L0RlZmVycmVk
RGF0YS5jcHAgICB8ICAxNzAgKysrKwogLi4uL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9E
ZWZlcnJlZERhdGEuaCAgICAgfCAgIDkzICsrCiAuLi4vcGxhdGZvcm0vbmV0d29yay9ibGFja2Jl
cnJ5L05ldHdvcmtKb2IuY3BwICAgICB8ICA5MTcgKysrKysrKysrKysrKysrKysrKysKIC4uLi9w
bGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya0pvYi5oICAgICAgIHwgIDE4NCArKysr
CiAuLi4vcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtNYW5hZ2VyLmNwcCB8ICAy
MTUgKysrKysKIC4uLi9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya01hbmFnZXIu
aCAgIHwgICA2NCArKwogNyBmaWxlcyBjaGFuZ2VkLCAxNzM3IGluc2VydGlvbnMoKyksIDAgZGVs
ZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L0RlZmVycmVkRGF0YS5jcHAKIGNyZWF0ZSBtb2RlIDEwMDY0NCBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLmgKIGNy
ZWF0ZSBtb2RlIDEwMDY0NCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVy
cnkvTmV0d29ya0pvYi5jcHAKIGNyZWF0ZSBtb2RlIDEwMDY0NCBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya0pvYi5oCiBjcmVhdGUgbW9kZSAxMDA2NDQg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtNYW5hZ2Vy
LmNwcAogY3JlYXRlIG1vZGUgMTAwNjQ0IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
YmxhY2tiZXJyeS9OZXR3b3JrTWFuYWdlci5oCgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
Q2hhbmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IGE2OWIxYjkuLmE0MzVk
OTkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw5NyBAQAorMjAxMS0xMi0wNCAgTGVvIFlhbmcgIDxs
ZW8ueWFuZ0B0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgVXBzdHJlYW0gcGxhdGZvcm0v
bmV0d29yay9ibGFja2JlcnJ5L0RlZmVycmVkRGF0YS57aCwgY3BwfSwgTmV0d29ya0pvYi57aCwg
Y3BwfSBhbmQgTmV0d29ya01hbmFnZXIue2gsIGNwcH0KKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNzkxCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgT3RoZXIgbWFpbiBjb250cmlidXRvcnM6CisgICAgICAg
IEpvZSBNYXNvbiA8am1hc29uQHJpbS5jb20+CisgICAgICAgIExpYW5naHVpIENoZW4gIDxsaWFj
aGVuQHJpbS5jb20+CisgICAgICAgIENoYXJsZXMgV2VpIDxjaGFybGVzLndlaUB0b3JjaG1vYmls
ZS5jb20uY24+CisKKyAgICAgICAgSW5pdGlhbCB1cHN0cmVhbSwgY2FuJ3QgYmUgYnVpbHQgeWV0
LCBubyBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkv
RGVmZXJyZWREYXRhLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpEZWZlcnJlZERhdGE6
OkRlZmVycmVkRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpEZWZlcnJlZERhdGE6OmRlZmVyT3Bl
bik6CisgICAgICAgIChXZWJDb3JlOjpEZWZlcnJlZERhdGE6OmRlZmVyV01MT3ZlcnJpZGUpOgor
ICAgICAgICAoV2ViQ29yZTo6RGVmZXJyZWREYXRhOjpkZWZlckhlYWRlclJlY2VpdmVkKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRlZmVycmVkRGF0YTo6ZGVmZXJEYXRhU2VudCk6CisgICAgICAgIChX
ZWJDb3JlOjpEZWZlcnJlZERhdGE6OmRlZmVyRGF0YVJlY2VpdmVkKToKKyAgICAgICAgKFdlYkNv
cmU6OkRlZmVycmVkRGF0YTo6ZGVmZXJDbG9zZSk6CisgICAgICAgIChXZWJDb3JlOjpEZWZlcnJl
ZERhdGE6OnByb2Nlc3NEZWZlcnJlZERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6RGVmZXJyZWRE
YXRhOjpmaXJlUHJvY2Vzc0RhdGFUaW1lcik6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9i
bGFja2JlcnJ5L0RlZmVycmVkRGF0YS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlY3Vy
c2lvbkd1YXJkOjpSZWN1cnNpb25HdWFyZCk6CisgICAgICAgIChXZWJDb3JlOjpSZWN1cnNpb25H
dWFyZDo6flJlY3Vyc2lvbkd1YXJkKToKKyAgICAgICAgKFdlYkNvcmU6OkRlZmVycmVkRGF0YTo6
aGFzRGVmZXJyZWREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkRlZmVycmVkRGF0YTo6c2NoZWR1
bGVQcm9jZXNzRGVmZXJyZWREYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNr
YmVycnkvTmV0d29ya0pvYi5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6aXNJbmZvKToK
KyAgICAgICAgKFdlYkNvcmU6OmlzUmVkaXJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6aXNVbmF1
dGhvcml6ZWQpOgorICAgICAgICAoV2ViQ29yZTo6Y2hhclRvSGV4KToKKyAgICAgICAgKFdlYkNv
cmU6OmVzY2FwZURlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjpOZXR3b3Jr
Sm9iKToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OmluaXRpYWxpemUpOgorICAgICAg
ICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6bG9hZEFib3V0VVJMKToKKyAgICAgICAgKFdlYkNvcmU6
Ok5ldHdvcmtKb2I6OmNhbmNlbEpvYik6CisgICAgICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjp1
cGRhdGVEZWZlckxvYWRpbmdDb3VudCk6CisgICAgICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjpu
b3RpZnlTdGF0dXNSZWNlaXZlZCk6CisgICAgICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjpoYW5k
bGVOb3RpZnlTdGF0dXNSZWNlaXZlZCk6CisgICAgICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjpu
b3RpZnlXTUxPdmVycmlkZSk6CisgICAgICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjpub3RpZnlI
ZWFkZXJSZWNlaXZlZCk6CisgICAgICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjpub3RpZnlTdHJp
bmdIZWFkZXJSZWNlaXZlZCk6CisgICAgICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjpoYW5kbGVO
b3RpZnlIZWFkZXJSZWNlaXZlZCk6CisgICAgICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjpoYW5k
bGVTZXRDb29raWVIZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6bm90aWZ5
RGF0YVJlY2VpdmVkUGxhaW4pOgorICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6aGFuZGxl
Tm90aWZ5RGF0YVJlY2VpdmVkKToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6Om5vdGlm
eURhdGFTZW50KToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OmhhbmRsZU5vdGlmeURh
dGFTZW50KToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6Om5vdGlmeUNsb3NlKToKKyAg
ICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OmhhbmRsZU5vdGlmeUNsb3NlKToKKyAgICAgICAg
KFdlYkNvcmU6Ok5ldHdvcmtKb2I6OnNob3VsZE5vdGlmeUNsaWVudEZpbmlzaGVkKToKKyAgICAg
ICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OnJldHJ5QXNGVFBEaXJlY3RvcnkpOgorICAgICAgICAo
V2ViQ29yZTo6TmV0d29ya0pvYjo6c3RhcnROZXdKb2JXaXRoUmVxdWVzdCk6CisgICAgICAgIChX
ZWJDb3JlOjpOZXR3b3JrSm9iOjpoYW5kbGVSZWRpcmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpO
ZXR3b3JrSm9iOjpzZW5kUmVzcG9uc2VJZk5lZWRlZCk6CisgICAgICAgIChXZWJDb3JlOjpOZXR3
b3JrSm9iOjpwYXJzZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6aGFuZGxl
QXV0aEhlYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjpoYW5kbGVGVFBIZWFk
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6c2VuZFJlcXVlc3RXaXRoQ3JlZGVu
dGlhbHMpOgorICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6c3RvcmVDcmVkZW50aWFscyk6
CisgICAgICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjpwdXJnZUNyZWRlbnRpYWxzKToKKyAgICAg
ICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OnNob3VsZFNlbmRDbGllbnREYXRhKToKKyAgICAgICAg
KFdlYkNvcmU6Ok5ldHdvcmtKb2I6OmZpcmVEZWxldGVKb2JUaW1lcik6CisgICAgICAgIChXZWJD
b3JlOjpOZXR3b3JrSm9iOjpoYW5kbGVBYm91dCk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29y
ay9ibGFja2JlcnJ5L05ldHdvcmtKb2IuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpOZXR3
b3JrSm9iOjpoYW5kbGUpOgorICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6aXNSdW5uaW5n
KToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OmlzQ2FuY2VsbGVkKToKKyAgICAgICAg
KFdlYkNvcmU6Ok5ldHdvcmtKb2I6OmNsaWVudElzT2spOgorICAgICAgICAoV2ViQ29yZTo6TmV0
d29ya0pvYjo6bG9hZERhdGFVUkwpOgorICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6aXNE
ZWZlcnJpbmdMb2FkaW5nKToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OmhhbmRsZU5v
dGlmeVdNTE92ZXJyaWRlKToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6Om5vdGlmeURh
dGFSZWNlaXZlZCk6CisgICAgICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjpzZXRXYXNEaXNrQ2Fj
aGVkKToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtKb2I6OnNob3VsZERlZmVyTG9hZGluZyk6
CisgICAgICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjpmaXJlTG9hZERhdGFUaW1lcik6CisgICAg
ICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjpmaXJlTG9hZEFib3V0VGltZXIpOgorICAgICAgICAo
V2ViQ29yZTo6TmV0d29ya0pvYjo6aXNFcnJvcik6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29y
ay9ibGFja2JlcnJ5L05ldHdvcmtNYW5hZ2VyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3Jl
OjpOZXR3b3JrTWFuYWdlcjo6aW5zdGFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6TmV0d29ya01h
bmFnZXI6OnN0YXJ0Sm9iKToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtNYW5hZ2VyOjpzdG9w
Sm9iKToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtNYW5hZ2VyOjpmaW5kSm9iRm9ySGFuZGxl
KToKKyAgICAgICAgKFdlYkNvcmU6Ok5ldHdvcmtNYW5hZ2VyOjpkZWxldGVKb2IpOgorICAgICAg
ICAoV2ViQ29yZTo6TmV0d29ya01hbmFnZXI6OnNldERlZmVyc0xvYWRpbmcpOgorICAgICAgICAo
V2ViQ29yZTo6TmV0d29ya01hbmFnZXI6OnBhdXNlTG9hZCk6CisgICAgICAgIChXZWJDb3JlOjpO
ZXR3b3JrTWFuYWdlcjo6c3RyZWFtRm9ySGFuZGxlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3
b3JrL2JsYWNrYmVycnkvTmV0d29ya01hbmFnZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3Jl
OjpOZXR3b3JrTWFuYWdlcjo6c2V0SW5pdGlhbFVSTCk6CisgICAgICAgIChXZWJDb3JlOjpOZXR3
b3JrTWFuYWdlcjo6aW5pdGlhbFVSTCk6CisKIDIwMTEtMTItMDQgIFJ5b3N1a2UgTml3YSAgPHJu
aXdhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSIGNoZWNrIGlu
IGNoZWNrQWNjZXB0Q2hpbGQgc2hvdWxkIGJlIG9wdGltaXplZCBmb3IgbmV3Q2hpbGQgd2l0aG91
dCBjaGlsZHJlbgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9i
bGFja2JlcnJ5L0RlZmVycmVkRGF0YS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi5hYjY3NWJjCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L0RlZmVycmVkRGF0YS5jcHAKQEAgLTAsMCArMSwxNzAg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEgUmVzZWFyY2ggSW4gTW90
aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICog
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
IExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFs
IFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0
ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRlZmVycmVkRGF0YS5oIgorCisjaW5jbHVk
ZSAiTmV0d29ya0pvYi5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0RlZmVycmVkRGF0YTo6
RGVmZXJyZWREYXRhKE5ldHdvcmtKb2ImIGpvYikKKyAgICA6IG1fam9iKGpvYikKKyAgICAsIG1f
cHJvY2Vzc0RhdGFUaW1lcih0aGlzLCAmRGVmZXJyZWREYXRhOjpmaXJlUHJvY2Vzc0RhdGFUaW1l
cikKKyAgICAsIG1fZGVmZXJyZWRTdGF0dXNSZWNlaXZlZChmYWxzZSkKKyAgICAsIG1fc3RhdHVz
KDApCisgICAgLCBtX2RlZmVycmVkV01MT3ZlcnJpZGUoZmFsc2UpCisgICAgLCBtX2J5dGVzU2Vu
dCgwKQorICAgICwgbV90b3RhbEJ5dGVzVG9CZVNlbnQoMCkKKyAgICAsIG1fZGVmZXJyZWRDbG9z
ZVN0YXR1cyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6RmlsdGVyU3RyZWFtOjpTdGF0dXNTdWNjZXNz
KQorICAgICwgbV9kZWZlcnJlZENsb3NlKGZhbHNlKQorICAgICwgbV9pblByb2Nlc3NEZWZlcnJl
ZERhdGEoZmFsc2UpCit7Cit9CisKK3ZvaWQgRGVmZXJyZWREYXRhOjpkZWZlck9wZW4oaW50IHN0
YXR1cywgY29uc3QgV1RGOjpTdHJpbmcmIG1lc3NhZ2UpCit7CisgICAgbV9kZWZlcnJlZFN0YXR1
c1JlY2VpdmVkID0gdHJ1ZTsKKyAgICBtX3N0YXR1cyA9IHN0YXR1czsKKyAgICBtX21lc3NhZ2Ug
PSBtZXNzYWdlOworfQorCit2b2lkIERlZmVycmVkRGF0YTo6ZGVmZXJXTUxPdmVycmlkZSgpCit7
CisgICAgbV9kZWZlcnJlZFdNTE92ZXJyaWRlID0gdHJ1ZTsKK30KKwordm9pZCBEZWZlcnJlZERh
dGE6OmRlZmVySGVhZGVyUmVjZWl2ZWQoY29uc3QgV1RGOjpTdHJpbmcmIGtleSwgY29uc3QgV1RG
OjpTdHJpbmcmIHZhbHVlKQoreworICAgIG1faGVhZGVyS2V5cy5hcHBlbmQoa2V5KTsKKyAgICBt
X2hlYWRlclZhbHVlcy5hcHBlbmQodmFsdWUpOworfQorCit2b2lkIERlZmVycmVkRGF0YTo6ZGVm
ZXJEYXRhU2VudCh1bnNpZ25lZCBsb25nIGxvbmcgYnl0ZXNTZW50LCB1bnNpZ25lZCBsb25nIGxv
bmcgdG90YWxCeXRlc1RvQmVTZW50KQoreworICAgIG1fYnl0ZXNTZW50ID0gYnl0ZXNTZW50Owor
ICAgIG1fdG90YWxCeXRlc1RvQmVTZW50ID0gdG90YWxCeXRlc1RvQmVTZW50OworfQorCit2b2lk
IERlZmVycmVkRGF0YTo6ZGVmZXJEYXRhUmVjZWl2ZWQoY29uc3QgY2hhciogYnVmLCBzaXplX3Qg
bGVuKQoreworICAgIG1fZGF0YVNlZ21lbnRzLmFwcGVuZChWZWN0b3I8Y2hhcj4oKSk7CisgICAg
bV9kYXRhU2VnbWVudHMucmJlZ2luKCktPmFwcGVuZChidWYsIGxlbik7Cit9CisKK3ZvaWQgRGVm
ZXJyZWREYXRhOjpkZWZlckNsb3NlKGludCBzdGF0dXMpCit7CisgICAgbV9kZWZlcnJlZENsb3Nl
U3RhdHVzID0gc3RhdHVzOworICAgIG1fZGVmZXJyZWRDbG9zZSA9IHRydWU7Cit9CisKK3ZvaWQg
RGVmZXJyZWREYXRhOjpwcm9jZXNzRGVmZXJyZWREYXRhKCkKK3sKKyAgICBpZiAobV9pblByb2Nl
c3NEZWZlcnJlZERhdGEpCisgICAgICAgIHJldHVybjsKKworICAgIFJlY3Vyc2lvbkd1YXJkIGd1
YXJkKG1faW5Qcm9jZXNzRGVmZXJyZWREYXRhKTsKKworICAgIC8vIHNlbmRpbmcgZGF0YSB0byB3
ZWJraXQgY2F1c2VzIGl0IHRvIGJlIHBhcnNlZCBhbmQgamF2YXNjcmlwdCBleGVjdXRlZCwKKyAg
ICAvLyB3aGljaCBtaWdodCBjYXVzZSBpdCB0byBjYW5jZWwgdGhlIGpvYiBvciBzZXQgZGVmZXJz
TG9hZGluZyBhZ2Fpbi4gU28KKyAgICAvLyB0byBiZSBzYWZlLCBjaGVjayB0aGlzIGFmdGVyIGV2
ZXJ5IHN0ZXAuCisgICAgaWYgKG1fam9iLmlzRGVmZXJyaW5nTG9hZGluZygpIHx8IG1fam9iLmlz
Q2FuY2VsbGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2RlZmVycmVkU3RhdHVz
UmVjZWl2ZWQpIHsKKyAgICAgICAgbV9qb2IuaGFuZGxlTm90aWZ5U3RhdHVzUmVjZWl2ZWQobV9z
dGF0dXMsIG1fbWVzc2FnZSk7CisgICAgICAgIG1fZGVmZXJyZWRTdGF0dXNSZWNlaXZlZCA9IGZh
bHNlOworICAgICAgICBpZiAobV9qb2IuaXNEZWZlcnJpbmdMb2FkaW5nKCkgfHwgbV9qb2IuaXND
YW5jZWxsZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobV9kZWZl
cnJlZFdNTE92ZXJyaWRlKSB7CisgICAgICAgIG1fam9iLmhhbmRsZU5vdGlmeVdNTE92ZXJyaWRl
KCk7CisgICAgICAgIG1fZGVmZXJyZWRXTUxPdmVycmlkZSA9IGZhbHNlOworICAgICAgICBpZiAo
bV9qb2IuaXNEZWZlcnJpbmdMb2FkaW5nKCkgfHwgbV9qb2IuaXNDYW5jZWxsZWQoKSkKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtSGVhZGVycyA9IG1faGVhZGVy
S2V5cy5zaXplKCk7CisgICAgQVNTRVJUKG1faGVhZGVyVmFsdWVzLnNpemUoKSA9PSBudW1IZWFk
ZXJzKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtSGVhZGVyczsgKytpKSB7Cisg
ICAgICAgIG1fam9iLmhhbmRsZU5vdGlmeUhlYWRlclJlY2VpdmVkKG1faGVhZGVyS2V5c1tpXSwg
bV9oZWFkZXJWYWx1ZXNbaV0pOworCisgICAgICAgIGlmIChtX2pvYi5pc0RlZmVycmluZ0xvYWRp
bmcoKSkgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgaGVhZGVycyB0aGF0IGhhdmUg
YWxyZWFkeSBiZWVuIHByb2Nlc3NlZAorICAgICAgICAgICAgbV9oZWFkZXJLZXlzLnJlbW92ZSgw
LCBpICsgMSk7CisgICAgICAgICAgICBtX2hlYWRlclZhbHVlcy5yZW1vdmUoMCwgaSArIDEpOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fam9iLmlzQ2Fu
Y2VsbGVkKCkpIHsKKyAgICAgICAgICAgIC8vIGRvbid0IGJvdGhlciByZW1vdmluZyBoZWFkZXJz
OyBqb2Igd2lsbCBiZSBkZWxldGVkCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICB9CisgICAgbV9oZWFkZXJLZXlzLmNsZWFyKCk7CisgICAgbV9oZWFkZXJWYWx1ZXMuY2xlYXIo
KTsKKworICAgIC8vIG9ubHkgcHJvY2VzcyAzMmsgb2YgZGF0YSBhdCBhIHRpbWUgdG8gYXZvaWQg
YmxvY2tpbmcgdGhlIGV2ZW50IGxvb3AgZm9yIHRvbyBsb25nCisgICAgc3RhdGljIGNvbnN0IHVu
c2lnbmVkIG1heERhdGEgPSAzMiAqIDEwMjQ7CisKKyAgICB1bnNpZ25lZCB0b3RhbERhdGEgPSAw
OworICAgIHdoaWxlICghbV9kYXRhU2VnbWVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgIGNvbnN0
IFZlY3RvcjxjaGFyPiYgYnVmZmVyID0gbV9kYXRhU2VnbWVudHMuZmlyc3QoKTsKKyAgICAgICAg
bV9qb2IuaGFuZGxlTm90aWZ5RGF0YVJlY2VpdmVkKGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXpl
KCkpOworICAgICAgICB0b3RhbERhdGEgKz0gYnVmZmVyLnNpemUoKTsKKworICAgICAgICBpZiAo
bV9qb2IuaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgLy8gZG9uJ3QgYm90aGVyIHJlbW92
aW5nIHNlZ21lbnQ7IGpvYiB3aWxsIGJlIGRlbGV0ZWQKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorCisgICAgICAgIG1fZGF0YVNlZ21lbnRzLnJlbW92ZUZpcnN0KCk7CisKKyAgICAg
ICAgaWYgKG1fam9iLmlzRGVmZXJyaW5nTG9hZGluZygpKSB7CisgICAgICAgICAgICAvLyBzdG9w
IHByb2Nlc3NpbmcgdW50aWwgZGVmZXJyZWQgbG9hZGluZyBpcyB0dXJuZWQgb2ZmIGFnYWluCisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodG90YWxEYXRhID49
IG1heERhdGEgJiYgIW1fZGF0YVNlZ21lbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8g
cGF1c2UgZm9yIG5vdywgYW5kIHNjaGVkdWxlIGEgdGltZXIgdG8gY29udGludWUgYWZ0ZXIgcnVu
bmluZyB0aGUgZXZlbnQgbG9vcAorICAgICAgICAgICAgc2NoZWR1bGVQcm9jZXNzRGVmZXJyZWRE
YXRhKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAo
bV90b3RhbEJ5dGVzVG9CZVNlbnQpIHsKKyAgICAgICAgbV9qb2IuaGFuZGxlTm90aWZ5RGF0YVNl
bnQobV9ieXRlc1NlbnQsIG1fdG90YWxCeXRlc1RvQmVTZW50KTsKKyAgICAgICAgbV9ieXRlc1Nl
bnQgPSAwOworICAgICAgICBtX3RvdGFsQnl0ZXNUb0JlU2VudCA9IDA7CisgICAgfQorCisgICAg
aWYgKG1fZGVmZXJyZWRDbG9zZSkgeworICAgICAgICBtX2pvYi5oYW5kbGVOb3RpZnlDbG9zZSht
X2RlZmVycmVkQ2xvc2VTdGF0dXMpOworICAgICAgICBtX2RlZmVycmVkQ2xvc2UgPSBmYWxzZTsK
KyAgICAgICAgaWYgKG1fam9iLmlzRGVmZXJyaW5nTG9hZGluZygpIHx8IG1fam9iLmlzQ2FuY2Vs
bGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorfQorCit2b2lkIERlZmVycmVkRGF0
YTo6ZmlyZVByb2Nlc3NEYXRhVGltZXIoVGltZXI8RGVmZXJyZWREYXRhPiopCit7CisgICAgcHJv
Y2Vzc0RlZmVycmVkRGF0YSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWRE
YXRhLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJy
ZWREYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhMDZlNQotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJy
eS9EZWZlcnJlZERhdGEuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA5LCAyMDEwLCAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAq
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3Rv
biwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgRGVmZXJyZWREYXRhX2gKKyNk
ZWZpbmUgRGVmZXJyZWREYXRhX2gKKworI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5j
bHVkZSAiVGltZXIuaCIKKworI2luY2x1ZGUgPHd0Zi9EZXF1ZS5oPgorI2luY2x1ZGUgPHd0Zi9W
ZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBOZXR3b3JrSm9iOworCitj
bGFzcyBSZWN1cnNpb25HdWFyZCB7CitwdWJsaWM6CisgICAgUmVjdXJzaW9uR3VhcmQoYm9vbCAm
Z3VhcmQpCisgICAgICAgIDogbV9ndWFyZChndWFyZCkKKyAgICB7CisgICAgICAgIEFTU0VSVCgh
bV9ndWFyZCk7CisgICAgICAgIG1fZ3VhcmQgPSB0cnVlOworICAgIH0KKworICAgIH5SZWN1cnNp
b25HdWFyZCgpCisgICAgeworICAgICAgICBtX2d1YXJkID0gZmFsc2U7CisgICAgfQorCitwcml2
YXRlOgorICAgIGJvb2wmIG1fZ3VhcmQ7Cit9OworCitjbGFzcyBEZWZlcnJlZERhdGEgeworcHVi
bGljOgorICAgIERlZmVycmVkRGF0YShOZXR3b3JrSm9iJik7CisgICAgdm9pZCBkZWZlck9wZW4o
aW50IHN0YXR1cywgY29uc3QgU3RyaW5nJiBtZXNzYWdlKTsKKyAgICB2b2lkIGRlZmVyV01MT3Zl
cnJpZGUoKTsKKyAgICB2b2lkIGRlZmVySGVhZGVyUmVjZWl2ZWQoY29uc3QgU3RyaW5nJiBrZXks
IGNvbnN0IFN0cmluZyYgdmFsdWUpOworICAgIHZvaWQgZGVmZXJEYXRhUmVjZWl2ZWQoY29uc3Qg
Y2hhciogYnVmLCBzaXplX3QgbGVuKTsKKyAgICB2b2lkIGRlZmVyRGF0YVNlbnQodW5zaWduZWQg
bG9uZyBsb25nIGJ5dGVzU2VudCwgdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsQnl0ZXNUb0JlU2Vu
dCk7CisgICAgdm9pZCBkZWZlckNsb3NlKGludCBzdGF0dXMpOworCisgICAgYm9vbCBoYXNEZWZl
cnJlZERhdGEoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fZGVmZXJyZWRTdGF0dXNS
ZWNlaXZlZCB8fCBtX2RlZmVycmVkV01MT3ZlcnJpZGUgfHwgIW1faGVhZGVyS2V5cy5pc0VtcHR5
KCkgfHwgIW1fZGF0YVNlZ21lbnRzLmlzRW1wdHkoKSB8fCBtX2RlZmVycmVkQ2xvc2U7CisgICAg
fQorCisgICAgdm9pZCBwcm9jZXNzRGVmZXJyZWREYXRhKCk7CisKKyAgICB2b2lkIHNjaGVkdWxl
UHJvY2Vzc0RlZmVycmVkRGF0YSgpCisgICAgeworICAgICAgICBpZiAoIW1fcHJvY2Vzc0RhdGFU
aW1lci5pc0FjdGl2ZSgpKQorICAgICAgICAgICAgbV9wcm9jZXNzRGF0YVRpbWVyLnN0YXJ0T25l
U2hvdCgwKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBmaXJlUHJvY2Vzc0RhdGFUaW1l
cihUaW1lcjxEZWZlcnJlZERhdGE+Kik7CisgICAgTmV0d29ya0pvYiYgbV9qb2I7CisgICAgVGlt
ZXI8RGVmZXJyZWREYXRhPiBtX3Byb2Nlc3NEYXRhVGltZXI7CisgICAgYm9vbCBtX2RlZmVycmVk
U3RhdHVzUmVjZWl2ZWQ7CisgICAgaW50IG1fc3RhdHVzOworICAgIFN0cmluZyBtX21lc3NhZ2U7
CisgICAgYm9vbCBtX2RlZmVycmVkV01MT3ZlcnJpZGU7CisgICAgVmVjdG9yPFN0cmluZz4gbV9o
ZWFkZXJLZXlzOworICAgIFZlY3RvcjxTdHJpbmc+IG1faGVhZGVyVmFsdWVzOworICAgIERlcXVl
PFZlY3RvcjxjaGFyPiA+IG1fZGF0YVNlZ21lbnRzOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBt
X2J5dGVzU2VudDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgbV90b3RhbEJ5dGVzVG9CZVNlbnQ7
CisgICAgaW50IG1fZGVmZXJyZWRDbG9zZVN0YXR1czsKKyAgICBib29sIG1fZGVmZXJyZWRDbG9z
ZTsKKyAgICBib29sIG1faW5Qcm9jZXNzRGVmZXJyZWREYXRhOworfTsKKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRGVmZXJyZWREYXRhX2gKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrSm9iLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrSm9iLmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmVlMDE4Ci0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtK
b2IuY3BwCkBAIC0wLDAgKzEsOTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEw
LCAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJOZXR3
b3JrSm9iLmgiCisKKyNpbmNsdWRlICJBYm91dERhdGEuaCIKKyNpbmNsdWRlICJCYXNlNjQuaCIK
KyNpbmNsdWRlICJCbGFja0JlcnJ5Q29va2llQ2FjaGUuaCIKKyNpbmNsdWRlICJDb29raWVNYW5h
Z2VyLmgiCisjaW5jbHVkZSAiQ3JlZGVudGlhbFN0b3JhZ2UuaCIKKyNpbmNsdWRlICJGcmFtZS5o
IgorI2luY2x1ZGUgIkZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIkhU
VFBQYXJzZXJzLmgiCisjaW5jbHVkZSAiS1VSTC5oIgorI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0
cnkuaCIKKyNpbmNsdWRlICJOZXR3b3JrTWFuYWdlci5oIgorI2luY2x1ZGUgIlJlc291cmNlSGFu
ZGxlQ2xpZW50LmgiCisjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVJbnRlcm5hbC5oIgorI2luY2x1
ZGUgIlJlc291cmNlUmVxdWVzdC5oIgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtQ2xp
ZW50Lmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTG9nLmg+CisjaW5jbHVkZSA8Qmxh
Y2tCZXJyeVBsYXRmb3JtV2ViS2l0Q3JlZGl0cy5oPgorI2luY2x1ZGUgPEJ1aWxkSW5mb3JtYXRp
b24uaD4KKyNpbmNsdWRlIDxuZXR3b3JrL05ldHdvcmtSZXF1ZXN0Lmg+CisjaW5jbHVkZSA8bmV0
d29yay9OZXR3b3JrU3RyZWFtRmFjdG9yeS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0
YXRpYyBjb25zdCBpbnQgc19yZWRpcmVjdE1heGltdW0gPSAxMDsKKworaW5saW5lIHN0YXRpYyBi
b29sIGlzSW5mbyhpbnQgc3RhdHVzQ29kZSkKK3sKKyAgICByZXR1cm4gMTAwIDw9IHN0YXR1c0Nv
ZGUgJiYgc3RhdHVzQ29kZSA8IDIwMDsKK30KKworaW5saW5lIHN0YXRpYyBib29sIGlzUmVkaXJl
Y3QoaW50IHN0YXR1c0NvZGUpCit7CisgICAgcmV0dXJuIDMwMCA8PSBzdGF0dXNDb2RlICYmIHN0
YXR1c0NvZGUgPCA0MDAgJiYgc3RhdHVzQ29kZSAhPSAzMDQ7Cit9CisKK2lubGluZSBzdGF0aWMg
Ym9vbCBpc1VuYXV0aG9yaXplZChpbnQgc3RhdHVzQ29kZSkKK3sKKyAgICByZXR1cm4gc3RhdHVz
Q29kZSA9PSA0MDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoYXJUb0hleChjaGFyIGMpCit7
CisgICAgcmV0dXJuIGMgPj0gJzAnICYmIGMgPD0gJzknID8gYyAtICcwJworICAgICAgICA6IGMg
Pj0gJ2EnICYmIGMgPD0gJ2YnID8gYyAtICdhJyArIDEwCisgICAgICAgIDogYyA+PSAnQScgJiYg
YyA8PSAnRicgPyBjIC0gJ0EnICsgMTAKKyAgICAgICAgOiAwOworfQorCitzdGF0aWMgdm9pZCBl
c2NhcGVEZWNvZGUoY29uc3QgY2hhciogc3JjLCBpbnQgbGVuZ3RoLCBWZWN0b3I8Y2hhcj4mIG91
dCkKK3sKKyAgICBvdXQucmVzaXplKGxlbmd0aCk7CisgICAgY29uc3QgY2hhciogY29uc3Qgc3Jj
RW5kID0gc3JjICsgbGVuZ3RoOworICAgIGNoYXIqIGRzdCA9IG91dC5kYXRhKCk7CisgICAgZm9y
ICg7IHNyYyA8IHNyY0VuZDsgKSB7CisgICAgICAgIGNoYXIgaW5wdXRDaGFyID0gKnNyYysrOwor
ICAgICAgICBpZiAoaW5wdXRDaGFyID09ICclJyAmJiBzcmMgKyAyIDw9IHNyY0VuZCkgeworICAg
ICAgICAgICAgaW50IGRpZ2l0MSA9IGNoYXJUb0hleCgqc3JjKyspOworICAgICAgICAgICAgaW50
IGRpZ2l0MiA9IGNoYXJUb0hleCgqc3JjKyspOworICAgICAgICAgICAgKmRzdCsrID0gKGRpZ2l0
MSA8PCA0KSB8IGRpZ2l0MjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAqZHN0KysgPSBp
bnB1dENoYXI7CisgICAgfQorICAgIG91dC5yZXNpemUoZHN0IC0gb3V0LmRhdGEoKSk7Cit9CisK
K05ldHdvcmtKb2I6Ok5ldHdvcmtKb2IoKQorICAgIDogbV9wbGF5ZXJJZCgwKQorICAgICwgbV9s
b2FkRGF0YVRpbWVyKHRoaXMsICZOZXR3b3JrSm9iOjpmaXJlTG9hZERhdGFUaW1lcikKKyAgICAs
IG1fbG9hZEFib3V0VGltZXIodGhpcywgJk5ldHdvcmtKb2I6OmZpcmVMb2FkQWJvdXRUaW1lcikK
KyAgICAsIG1fZGVsZXRlSm9iVGltZXIodGhpcywgJk5ldHdvcmtKb2I6OmZpcmVEZWxldGVKb2JU
aW1lcikKKyAgICAsIG1fc3RyZWFtRmFjdG9yeSgwKQorICAgICwgbV9pc0ZpbGUoZmFsc2UpCisg
ICAgLCBtX2lzRGF0YShmYWxzZSkKKyAgICAsIG1faXNBYm91dChmYWxzZSkKKyAgICAsIG1faXNG
VFAoZmFsc2UpCisgICAgLCBtX2lzRlRQRGlyKHRydWUpCisgICAgLCBtX2lzUnVubmluZyh0cnVl
KSAvLyBhbHdheXMgc3RhcnRlZCBpbW1lZGlhdGVseSBhZnRlciBjcmVhdGlvbgorICAgICwgbV9j
YW5jZWxsZWQoZmFsc2UpCisgICAgLCBtX3N0YXR1c1JlY2VpdmVkKGZhbHNlKQorICAgICwgbV9k
YXRhUmVjZWl2ZWQoZmFsc2UpCisgICAgLCBtX3Jlc3BvbnNlU2VudChmYWxzZSkKKyAgICAsIG1f
ZXh0ZW5kZWRTdGF0dXNDb2RlKDApCisgICAgLCBtX3JlZGlyZWN0Q291bnQoMCkKKyAgICAsIG1f
ZGVmZXJyZWREYXRhKCp0aGlzKQorICAgICwgbV9kZWZlckxvYWRpbmdDb3VudCgwKQorICAgICwg
bV9jYWxsaW5nQ2xpZW50KGZhbHNlKQorICAgICwgbV9pc1hIUihmYWxzZSkKKyAgICAsIG1fbmVl
ZHNSZXRyeUFzRlRQRGlyZWN0b3J5KGZhbHNlKQoreworfQorCitib29sIE5ldHdvcmtKb2I6Omlu
aXRpYWxpemUoaW50IHBsYXllcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IFN0cmluZyYgcGFnZUdyb3VwTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBLVVJMJiB1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxhY2tCZXJy
eTo6UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFBhc3NSZWZQdHI8UmVzb3VyY2VIYW5kbGU+IGhhbmRsZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1N0cmVhbUZhY3Rv
cnkqIHN0cmVhbUZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJh
bWUmIGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZlckxvYWRpbmdD
b3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVkaXJlY3RDb3VudCkKK3sK
KyAgICBtX3BsYXllcklkID0gcGxheWVySWQ7CisgICAgbV9wYWdlR3JvdXBOYW1lID0gcGFnZUdy
b3VwTmFtZTsKKworICAgIG1fcmVzcG9uc2Uuc2V0VVJMKHVybCk7CisgICAgbV9pc0ZpbGUgPSB1
cmwucHJvdG9jb2xJcygiZmlsZSIpIHx8IHVybC5wcm90b2NvbElzKCJsb2NhbCIpOworICAgIG1f
aXNEYXRhID0gdXJsLnByb3RvY29sSXMoImRhdGEiKTsKKyAgICBtX2lzQWJvdXQgPSB1cmwucHJv
dG9jb2xJcygiYWJvdXQiKTsKKyAgICBtX2lzRlRQID0gdXJsLnByb3RvY29sSXMoImZ0cCIpOwor
CisgICAgbV9oYW5kbGUgPSBoYW5kbGU7CisKKyAgICBtX3N0cmVhbUZhY3RvcnkgPSBzdHJlYW1G
YWN0b3J5OworICAgIG1fZnJhbWUgPSAmZnJhbWU7CisgICAgbV9yZWRpcmVjdENvdW50ID0gcmVk
aXJlY3RDb3VudDsKKyAgICBtX2RlZmVyTG9hZGluZ0NvdW50ID0gZGVmZXJMb2FkaW5nQ291bnQ7
CisKKyAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGV4cGxpY2l0bHkgY2FsbCBub3RpZnlIZWFkZXJS
ZWNlaXZlZCwgYXMgdGhlIENvbnRlbnQtVHlwZQorICAgIC8vIHdpbGwgdWx0aW1hdGVseSBnZXQg
cGFyc2VkIHdoZW4gc2VuZFJlc3BvbnNlSWZOZWVkZWQgZ2V0cyBjYWxsZWQuCisgICAgaWYgKCFy
ZXF1ZXN0LmdldE92ZXJyaWRlQ29udGVudFR5cGUoKS5lbXB0eSgpKQorICAgICAgICBtX2NvbnRl
bnRUeXBlID0gU3RyaW5nKHJlcXVlc3QuZ2V0T3ZlcnJpZGVDb250ZW50VHlwZSgpLmNfc3RyKCkp
OworCisgICAgaWYgKG1faXNEYXRhIHx8IG1faXNBYm91dCkgLy8gTm8gbmVlZCB0byBjcmVhdGUg
dGhlIHN0cmVhbXMgZm9yIGRhdGEgYW5kIGFib3V0CisgICAgICAgIHJldHVybiB0cnVlOworCisg
ICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZpbHRlclN0cmVhbSogd3JhcHBlZFN0cmVhbSA9IG1f
c3RyZWFtRmFjdG9yeS0+Y3JlYXRlTmV0d29ya1N0cmVhbShyZXF1ZXN0LCBtX3BsYXllcklkKTsK
KyAgICBpZiAoIXdyYXBwZWRTdHJlYW0pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBzZXRX
cmFwcGVkU3RyZWFtKHdyYXBwZWRTdHJlYW0pOworCisgICAgbV9pc1hIUiA9IHJlcXVlc3QuZ2V0
VGFyZ2V0VHlwZSgpID09IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6VGFy
Z2V0SXNYTUxIVFRQUmVxdWVzdDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE5ldHdv
cmtKb2I6OmxvYWRBYm91dFVSTCgpCit7CisgICAgU3RyaW5nIGFib3V0V2hhdChtX3Jlc3BvbnNl
LnVybCgpLnN0cmluZygpLnN1YnN0cmluZyg2KSk7IC8vIGZpcnN0IDYgY2hhcnMgYXJlICJhYm91
dDoiCisKKyAgICBpZiAoIWFib3V0V2hhdC5pc0VtcHR5KCkKKyAgICAgICAgICAgICYmICFlcXVh
bElnbm9yaW5nQ2FzZShhYm91dFdoYXQsICJibGFuayIpCisgICAgICAgICAgICAmJiAhZXF1YWxJ
Z25vcmluZ0Nhc2UoYWJvdXRXaGF0LCAiY3JlZGl0cyIpCisjaWYgIWRlZmluZWQoUFVCTElDX0JV
SUxEKSB8fCAhUFVCTElDX0JVSUxECisgICAgICAgICAgICAmJiAhYWJvdXRXaGF0LnN0YXJ0c1dp
dGgoImNhY2hlP3F1ZXJ5PSIsIGZhbHNlKQorICAgICAgICAgICAgJiYgIWVxdWFsSWdub3JpbmdD
YXNlKGFib3V0V2hhdCwgImNhY2hlIikKKyAgICAgICAgICAgICYmICFlcXVhbElnbm9yaW5nQ2Fz
ZShhYm91dFdoYXQsICJjYWNoZS9lbmFibGUiKQorICAgICAgICAgICAgJiYgIWVxdWFsSWdub3Jp
bmdDYXNlKGFib3V0V2hhdCwgImNhY2hlL2Rpc2FibGUiKQorICAgICAgICAgICAgJiYgIWVxdWFs
SWdub3JpbmdDYXNlKGFib3V0V2hhdCwgInZlcnNpb24iKQorICAgICAgICAgICAgJiYgKCFCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6ZGVidWdTZXR0aW5nKCkKKyAgICAgICAgICAgICAgICB8fCAoIWVx
dWFsSWdub3JpbmdDYXNlKGFib3V0V2hhdCwgImNvbmZpZyIpCisgICAgICAgICAgICAgICAgICAg
ICYmICFlcXVhbElnbm9yaW5nQ2FzZShhYm91dFdoYXQsICJidWlsZCIpCisgICAgICAgICAgICAg
ICAgICAgICYmICFlcXVhbElnbm9yaW5nQ2FzZShhYm91dFdoYXQsICJtZW1vcnkiKSkpCisjZW5k
aWYKKyAgICAgICAgICAgICkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbV9sb2FkQWJv
dXRUaW1lci5zdGFydE9uZVNob3QoMCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBOZXR3
b3JrSm9iOjpjYW5jZWxKb2IoKQoreworICAgIG1fY2FuY2VsbGVkID0gdHJ1ZTsKKworICAgIC8v
IGNhbmNlbCBqb2JzIGxvYWRpbmcgbG9jYWwgZGF0YSBieSBraWxsaW5nIHRoZSB0aW1lciwgYW5k
IGpvYnMKKyAgICAvLyBnZXR0aW5nIGRhdGEgZnJvbSB0aGUgbmV0d29yayBieSBjYWxsaW5nIHRo
ZSBpbmhlcml0ZWQKKyAgICAvLyBVUkxTdHJlYW06OmNhbmNlbAorICAgIGlmIChtX2xvYWREYXRh
VGltZXIuaXNBY3RpdmUoKSkgeworICAgICAgICBtX2xvYWREYXRhVGltZXIuc3RvcCgpOworICAg
ICAgICBub3RpZnlDbG9zZShCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6RmlsdGVyU3RyZWFtOjpTdGF0
dXNDYW5jZWxsZWQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAobV9sb2Fk
QWJvdXRUaW1lci5pc0FjdGl2ZSgpKSB7CisgICAgICAgIG1fbG9hZEFib3V0VGltZXIuc3RvcCgp
OworICAgICAgICBub3RpZnlDbG9zZShCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6RmlsdGVyU3RyZWFt
OjpTdGF0dXNDYW5jZWxsZWQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1
cm4gc3RyZWFtQ2FuY2VsKCk7Cit9CisKK3ZvaWQgTmV0d29ya0pvYjo6dXBkYXRlRGVmZXJMb2Fk
aW5nQ291bnQoaW50IGRlbHRhKQoreworICAgIG1fZGVmZXJMb2FkaW5nQ291bnQgKz0gZGVsdGE7
CisgICAgQVNTRVJUKG1fZGVmZXJMb2FkaW5nQ291bnQgPj0gMCk7CisKKyAgICBpZiAoIWlzRGVm
ZXJyaW5nTG9hZGluZygpKSB7CisgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGFscmVhZHkgYmUgYSB0
aW1lciBzZXQgdG8gY2FsbCB0aGlzLCBidXQgaXQncyBzYWZlIHRvIHNjaGVkdWxlIGl0IGFnYWlu
LgorICAgICAgICBtX2RlZmVycmVkRGF0YS5zY2hlZHVsZVByb2Nlc3NEZWZlcnJlZERhdGEoKTsK
KyAgICB9Cit9CisKK3ZvaWQgTmV0d29ya0pvYjo6bm90aWZ5U3RhdHVzUmVjZWl2ZWQoaW50IHN0
YXR1cywgY29uc3QgY2hhciogbWVzc2FnZSkKK3sKKyAgICBpZiAoc2hvdWxkRGVmZXJMb2FkaW5n
KCkpCisgICAgICAgIG1fZGVmZXJyZWREYXRhLmRlZmVyT3BlbihzdGF0dXMsIG1lc3NhZ2UpOwor
ICAgIGVsc2UKKyAgICAgICAgaGFuZGxlTm90aWZ5U3RhdHVzUmVjZWl2ZWQoc3RhdHVzLCBtZXNz
YWdlKTsKK30KKwordm9pZCBOZXR3b3JrSm9iOjpoYW5kbGVOb3RpZnlTdGF0dXNSZWNlaXZlZChp
bnQgc3RhdHVzLCBjb25zdCBTdHJpbmcmIG1lc3NhZ2UpCit7CisgICAgLy8gY2hlY2sgZm9yIG1l
c3NhZ2VzIG91dCBvZiBvcmRlciBvciBhZnRlciBjYW5jZWwKKyAgICBpZiAoKG1fc3RhdHVzUmVj
ZWl2ZWQgJiYgbV9leHRlbmRlZFN0YXR1c0NvZGUgIT0gNDAxKSB8fCBtX3Jlc3BvbnNlU2VudCB8
fCBtX2NhbmNlbGxlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGlzSW5mbyhzdGF0dXMp
KQorICAgICAgICByZXR1cm47IC8vIGlnbm9yZQorCisgICAgbV9zdGF0dXNSZWNlaXZlZCA9IHRy
dWU7CisKKyAgICAvLyBjb252ZXJ0IG5vbi1IVFRQIHN0YXR1cyBjb2RlcyB0byBnZW5lcmljIEhU
VFAgY29kZXMKKyAgICBtX2V4dGVuZGVkU3RhdHVzQ29kZSA9IHN0YXR1czsKKyAgICBpZiAoIXN0
YXR1cykKKyAgICAgICAgbV9yZXNwb25zZS5zZXRIVFRQU3RhdHVzQ29kZSgyMDApOworICAgIGVs
c2UgaWYgKHN0YXR1cyA8IDApCisgICAgICAgIG1fcmVzcG9uc2Uuc2V0SFRUUFN0YXR1c0NvZGUo
NDA0KTsKKyAgICBlbHNlCisgICAgICAgIG1fcmVzcG9uc2Uuc2V0SFRUUFN0YXR1c0NvZGUoc3Rh
dHVzKTsKKworICAgIG1fcmVzcG9uc2Uuc2V0SFRUUFN0YXR1c1RleHQobWVzc2FnZSk7Cit9CisK
K3ZvaWQgTmV0d29ya0pvYjo6bm90aWZ5V01MT3ZlcnJpZGUoKQoreworICAgIGlmIChzaG91bGRE
ZWZlckxvYWRpbmcoKSkKKyAgICAgICAgbV9kZWZlcnJlZERhdGEuZGVmZXJXTUxPdmVycmlkZSgp
OworICAgIGVsc2UKKyAgICAgICAgaGFuZGxlTm90aWZ5V01MT3ZlcnJpZGUoKTsKK30KKwordm9p
ZCBOZXR3b3JrSm9iOjpub3RpZnlIZWFkZXJSZWNlaXZlZChjb25zdCBjaGFyKiBrZXksIGNvbnN0
IGNoYXIqIHZhbHVlKQoreworICAgIGlmIChzaG91bGREZWZlckxvYWRpbmcoKSkKKyAgICAgICAg
bV9kZWZlcnJlZERhdGEuZGVmZXJIZWFkZXJSZWNlaXZlZChrZXksIHZhbHVlKTsKKyAgICBlbHNl
IHsKKyAgICAgICAgU3RyaW5nIGtleVN0cmluZyhrZXkpOworICAgICAgICBTdHJpbmcgdmFsdWVT
dHJpbmc7CisgICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShrZXlTdHJpbmcsICJMb2NhdGlv
biIpKSB7CisgICAgICAgICAgICAvLyBMb2NhdGlvbiwgbGlrZSBhbGwgaGVhZGVycywgaXMgc3Vw
cG9zZWQgdG8gYmUgTGF0aW4tMS4gQnV0IHNvbWUgc2l0ZXMgKHdpa2lwZWRpYSkgc2VuZCBpdCBp
biBVVEYtOC4KKyAgICAgICAgICAgIC8vIEFsbCBieXRlIHN0cmluZ3MgdGhhdCBhcmUgdmFsaWQg
VVRGLTggYXJlIGFsc28gdmFsaWQgTGF0aW4tMSAoYWx0aG91Z2ggb3V0c2lkZSBBU0NJSSwgdGhl
IG1lYW5pbmcgd2lsbAorICAgICAgICAgICAgLy8gZGlmZmVyKSwgYnV0IHRoZSByZXZlcnNlIGlz
bid0IHRydWUuIFNvIHRyeSBVVEYtOCBmaXJzdCBhbmQgZmFsbCBiYWNrIHRvIExhdGluLTEgaWYg
aXQncyBpbnZhbGlkLgorICAgICAgICAgICAgLy8gKEhpZ2ggTGF0aW4tMSBzaG91bGQgYmUgdXJs
LWVuY29kZWQgYW55d2F5LikKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBGSVhNRTog
bWF5YmUgd2Ugc2hvdWxkIGRvIHRoaXMgd2l0aCBvdGhlciBoZWFkZXJzPworICAgICAgICAgICAg
Ly8gU2tpcCBpdCBmb3Igbm93IC0gd2UgZG9uJ3Qgd2FudCB0byByZXdyaXRlIHJhbmRvbSBieXRl
cyB1bmxlc3Mgd2UncmUgc3VyZS4gKERlZmluaXRlbHkgZG9uJ3Qgd2FudCB0bworICAgICAgICAg
ICAgLy8gcmV3cml0ZSBjb29raWVzLCBmb3IgaW5zdGFuY2UuKSBOZWVkcyBtb3JlIGludmVzdGln
YXRpb24uCisgICAgICAgICAgICB2YWx1ZVN0cmluZyA9IFN0cmluZzo6ZnJvbVVURjgodmFsdWUp
OworICAgICAgICAgICAgaWYgKHZhbHVlU3RyaW5nLmlzTnVsbCgpKQorICAgICAgICAgICAgICAg
IHZhbHVlU3RyaW5nID0gdmFsdWU7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdmFsdWVT
dHJpbmcgPSB2YWx1ZTsKKworICAgICAgICBoYW5kbGVOb3RpZnlIZWFkZXJSZWNlaXZlZChrZXlT
dHJpbmcsIHZhbHVlU3RyaW5nKTsKKyAgICB9Cit9CisKK3ZvaWQgTmV0d29ya0pvYjo6bm90aWZ5
U3RyaW5nSGVhZGVyUmVjZWl2ZWQoY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFs
dWUpCit7CisgICAgaWYgKHNob3VsZERlZmVyTG9hZGluZygpKQorICAgICAgICBtX2RlZmVycmVk
RGF0YS5kZWZlckhlYWRlclJlY2VpdmVkKGtleSwgdmFsdWUpOworICAgIGVsc2UKKyAgICAgICAg
aGFuZGxlTm90aWZ5SGVhZGVyUmVjZWl2ZWQoa2V5LCB2YWx1ZSk7Cit9CisKK3ZvaWQgTmV0d29y
a0pvYjo6aGFuZGxlTm90aWZ5SGVhZGVyUmVjZWl2ZWQoY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0
IFN0cmluZyYgdmFsdWUpCit7CisgICAgLy8gY2hlY2sgZm9yIG1lc3NhZ2VzIG91dCBvZiBvcmRl
ciBvciBhZnRlciBjYW5jZWwKKyAgICBpZiAoIW1fc3RhdHVzUmVjZWl2ZWQgfHwgbV9yZXNwb25z
ZVNlbnQgfHwgbV9jYW5jZWxsZWQpCisgICAgICAgIHJldHVybjsKKworICAgIFN0cmluZyBsb3dl
cktleSA9IGtleS5sb3dlcigpOworICAgIGlmIChsb3dlcktleSA9PSAiY29udGVudC10eXBlIikK
KyAgICAgICAgbV9jb250ZW50VHlwZSA9IHZhbHVlLmxvd2VyKCk7CisKKyAgICBpZiAobG93ZXJL
ZXkgPT0gImNvbnRlbnQtZGlzcG9zaXRpb24iKQorICAgICAgICBtX2NvbnRlbnREaXNwb3NpdGlv
biA9IHZhbHVlOworCisgICAgaWYgKGxvd2VyS2V5ID09ICJzZXQtY29va2llIikgeworICAgICAg
ICBpZiAobV9mcmFtZSAmJiBtX2ZyYW1lLT5sb2FkZXIoKSAmJiBtX2ZyYW1lLT5sb2FkZXIoKS0+
Y2xpZW50KCkKKyAgICAgICAgICAgICYmIHN0YXRpY19jYXN0PEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeSo+KG1fZnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKSktPmNvb2tpZXNFbmFibGVkKCkp
CisjaWYgT1MoUU5YKQorICAgICAgICAgICAgaGFuZGxlU2V0Q29va2llSGVhZGVyKHZhbHVlKTsK
KyNlbmRpZgorICAgICAgICAgICAgQmxhY2tCZXJyeUNvb2tpZUNhY2hlOjppbnN0YW5jZSgpLmNs
ZWFyQWxsQ29va2llc0Zvckhvc3QobV9wYWdlR3JvdXBOYW1lLCBtX3Jlc3BvbnNlLnVybCgpKTsK
KworICAgIH0KKworICAgIGlmIChsb3dlcktleSA9PSAid3d3LWF1dGhlbnRpY2F0ZSIpCisgICAg
ICAgIGhhbmRsZUF1dGhIZWFkZXIodmFsdWUpOworCisgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNl
KGtleSwgQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpIRUFERVJfQkxBQ0tC
RVJSWV9GVFApKQorICAgICAgICBoYW5kbGVGVFBIZWFkZXIodmFsdWUpOworCisgICAgbV9yZXNw
b25zZS5zZXRIVFRQSGVhZGVyRmllbGQoa2V5LCB2YWx1ZSk7Cit9CisKK3ZvaWQgTmV0d29ya0pv
Yjo6aGFuZGxlU2V0Q29va2llSGVhZGVyKGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgS1VS
TCB1cmwgPSBtX3Jlc3BvbnNlLnVybCgpOworICAgIENvb2tpZU1hbmFnZXImIG1hbmFnZXIgPSBj
b29raWVNYW5hZ2VyKCk7CisgICAgaWYgKChtYW5hZ2VyLmNvb2tpZVBvbGljeSgpID09IENvb2tp
ZVN0b3JhZ2VBY2NlcHRQb2xpY3lPbmx5RnJvbU1haW5Eb2N1bWVudERvbWFpbikKKyAgICAgICYm
IChtX2hhbmRsZS0+Zmlyc3RSZXF1ZXN0KCkuZmlyc3RQYXJ0eUZvckNvb2tpZXMoKSAhPSB1cmwp
CisgICAgICAmJiBtYW5hZ2VyLmdldENvb2tpZSh1cmwsIFdpdGhIdHRwT25seUNvb2tpZXMpLmlz
RW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAgIG1hbmFnZXIuc2V0Q29va2llcyh1cmwsIHZh
bHVlKTsKK30KKwordm9pZCBOZXR3b3JrSm9iOjpub3RpZnlEYXRhUmVjZWl2ZWRQbGFpbihjb25z
dCBjaGFyKiBidWYsIHNpemVfdCBsZW4pCit7CisgICAgaWYgKHNob3VsZERlZmVyTG9hZGluZygp
KQorICAgICAgICBtX2RlZmVycmVkRGF0YS5kZWZlckRhdGFSZWNlaXZlZChidWYsIGxlbik7Cisg
ICAgZWxzZQorICAgICAgICBoYW5kbGVOb3RpZnlEYXRhUmVjZWl2ZWQoYnVmLCBsZW4pOworfQor
Cit2b2lkIE5ldHdvcmtKb2I6OmhhbmRsZU5vdGlmeURhdGFSZWNlaXZlZChjb25zdCBjaGFyKiBi
dWYsIHNpemVfdCBsZW4pCit7CisgICAgLy8gY2hlY2sgZm9yIG1lc3NhZ2VzIG91dCBvZiBvcmRl
ciBvciBhZnRlciBjYW5jZWwKKyAgICBpZiAoKCFtX2lzRmlsZSAmJiAhbV9zdGF0dXNSZWNlaXZl
ZCkgfHwgbV9jYW5jZWxsZWQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghYnVmIHx8ICFs
ZW4pCisgICAgICAgIHJldHVybjsKKworICAgIG1fZGF0YVJlY2VpdmVkID0gdHJ1ZTsKKworICAg
IC8vIHByb3RlY3QgYWdhaW5zdCByZWVudHJhbmN5CisgICAgdXBkYXRlRGVmZXJMb2FkaW5nQ291
bnQoMSk7CisKKyAgICBpZiAoc2hvdWxkU2VuZENsaWVudERhdGEoKSkgeworICAgICAgICBzZW5k
UmVzcG9uc2VJZk5lZWRlZCgpOworICAgICAgICBpZiAoY2xpZW50SXNPaygpKSB7CisgICAgICAg
ICAgICBpZiAobV9tdWx0aXBhcnREZWxlZ2F0ZSkKKyAgICAgICAgICAgICAgICBtX211bHRpcGFy
dERlbGVnYXRlLT5vblJlY2VpdmVkRGF0YShidWYsIGxlbiwgbGVuKTsKKyAgICAgICAgICAgIGVs
c2UgeworICAgICAgICAgICAgICAgIFJlY3Vyc2lvbkd1YXJkIGd1YXJkKG1fY2FsbGluZ0NsaWVu
dCk7CisgICAgICAgICAgICAgICAgbV9oYW5kbGUtPmNsaWVudCgpLT5kaWRSZWNlaXZlRGF0YSht
X2hhbmRsZS5nZXQoKSwgYnVmLCBsZW4sIGxlbik7CisgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgIH0KKworICAgIHVwZGF0ZURlZmVyTG9hZGluZ0NvdW50KC0xKTsKK30KKwordm9pZCBOZXR3
b3JrSm9iOjpub3RpZnlEYXRhU2VudCh1bnNpZ25lZCBsb25nIGxvbmcgYnl0ZXNTZW50LCB1bnNp
Z25lZCBsb25nIGxvbmcgdG90YWxCeXRlc1RvQmVTZW50KQoreworICAgIGlmIChzaG91bGREZWZl
ckxvYWRpbmcoKSkKKyAgICAgICAgbV9kZWZlcnJlZERhdGEuZGVmZXJEYXRhU2VudChieXRlc1Nl
bnQsIHRvdGFsQnl0ZXNUb0JlU2VudCk7CisgICAgZWxzZQorICAgICAgICBoYW5kbGVOb3RpZnlE
YXRhU2VudChieXRlc1NlbnQsIHRvdGFsQnl0ZXNUb0JlU2VudCk7Cit9CisKK3ZvaWQgTmV0d29y
a0pvYjo6aGFuZGxlTm90aWZ5RGF0YVNlbnQodW5zaWduZWQgbG9uZyBsb25nIGJ5dGVzU2VudCwg
dW5zaWduZWQgbG9uZyBsb25nIHRvdGFsQnl0ZXNUb0JlU2VudCkKK3sKKyAgICBpZiAobV9jYW5j
ZWxsZWQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIHByb3RlY3QgYWdhaW5zdCByZWVudHJh
bmN5CisgICAgdXBkYXRlRGVmZXJMb2FkaW5nQ291bnQoMSk7CisKKyAgICBpZiAoY2xpZW50SXNP
aygpKSB7CisgICAgICAgIFJlY3Vyc2lvbkd1YXJkIGd1YXJkKG1fY2FsbGluZ0NsaWVudCk7Cisg
ICAgICAgIG1faGFuZGxlLT5jbGllbnQoKS0+ZGlkU2VuZERhdGEobV9oYW5kbGUuZ2V0KCksIGJ5
dGVzU2VudCwgdG90YWxCeXRlc1RvQmVTZW50KTsKKyAgICB9CisKKyAgICB1cGRhdGVEZWZlckxv
YWRpbmdDb3VudCgtMSk7Cit9CisKK3ZvaWQgTmV0d29ya0pvYjo6bm90aWZ5Q2xvc2UoaW50IHN0
YXR1cykKK3sKKyAgICBpZiAoc2hvdWxkRGVmZXJMb2FkaW5nKCkpCisgICAgICAgIG1fZGVmZXJy
ZWREYXRhLmRlZmVyQ2xvc2Uoc3RhdHVzKTsKKyAgICBlbHNlCisgICAgICAgIGhhbmRsZU5vdGlm
eUNsb3NlKHN0YXR1cyk7Cit9CisKK3ZvaWQgTmV0d29ya0pvYjo6aGFuZGxlTm90aWZ5Q2xvc2Uo
aW50IHN0YXR1cykKK3sKKyAgICBtX2lzUnVubmluZyA9IGZhbHNlOworCisgICAgaWYgKCFtX2Nh
bmNlbGxlZCkgeworICAgICAgICBpZiAoIW1fc3RhdHVzUmVjZWl2ZWQpIHsKKyAgICAgICAgICAg
IC8vIGNvbm5lY3Rpb24gZmFpbGVkIGJlZm9yZSBzZW5kaW5nIG5vdGlmeVN0YXR1c1JlY2VpdmVk
OiB1c2UgZ2VuZXJpYyBOZXR3b3JrRXJyb3IKKyAgICAgICAgICAgIG5vdGlmeVN0YXR1c1JlY2Vp
dmVkKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpGaWx0ZXJTdHJlYW06OlN0YXR1c05ldHdvcmtFcnJv
ciwgMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBhbiBIVFRQIGF1dGhlbnRpY2F0aW9u
LWVuYWJsZWQgcmVxdWVzdCBpcyBzdWNjZXNzZnVsLCBzYXZlCisgICAgICAgIC8vIHRoZSBjcmVk
ZW50aWFscyBmb3IgbGF0ZXIgcmV1c2UuIElmIHRoZSByZXF1ZXN0IGZhaWxzLCBkZWxldGUKKyAg
ICAgICAgLy8gdGhlIHNhdmVkIGNyZWRlbnRpYWxzLgorICAgICAgICBpZiAoIWlzRXJyb3IobV9l
eHRlbmRlZFN0YXR1c0NvZGUpKQorICAgICAgICAgICAgc3RvcmVDcmVkZW50aWFscygpOworICAg
ICAgICBlbHNlIGlmIChpc1VuYXV0aG9yaXplZChtX2V4dGVuZGVkU3RhdHVzQ29kZSkpCisgICAg
ICAgICAgICBwdXJnZUNyZWRlbnRpYWxzKCk7CisKKyAgICAgICAgaWYgKHNob3VsZE5vdGlmeUNs
aWVudEZpbmlzaGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChpc1JlZGlyZWN0KG1fZXh0ZW5kZWRT
dGF0dXNDb2RlKSAmJiAobV9yZWRpcmVjdENvdW50ID49IHNfcmVkaXJlY3RNYXhpbXVtKSkKKyAg
ICAgICAgICAgICAgICBtX2V4dGVuZGVkU3RhdHVzQ29kZSA9IEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpGaWx0ZXJTdHJlYW06OlN0YXR1c1Rvb01hbnlSZWRpcmVjdHM7CisKKyAgICAgICAgICAgIHNl
bmRSZXNwb25zZUlmTmVlZGVkKCk7CisgICAgICAgICAgICBpZiAoY2xpZW50SXNPaygpKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKG1fbXVsdGlwYXJ0RGVsZWdhdGUpCisgICAgICAgICAgICAgICAg
ICAgIG1fbXVsdGlwYXJ0RGVsZWdhdGUtPm9uQ29tcGxldGVkUmVxdWVzdCgpOworCisgICAgICAg
ICAgICAgICAgUmVjdXJzaW9uR3VhcmQgZ3VhcmQobV9jYWxsaW5nQ2xpZW50KTsKKyAgICAgICAg
ICAgICAgICBpZiAoaXNFcnJvcihtX2V4dGVuZGVkU3RhdHVzQ29kZSkgJiYgIW1fZGF0YVJlY2Vp
dmVkKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBtX2V4dGVuZGVkU3Rh
dHVzQ29kZSA8IDAgPyBSZXNvdXJjZUVycm9yOjpwbGF0Zm9ybUVycm9yRG9tYWluIDogUmVzb3Vy
Y2VFcnJvcjo6aHR0cEVycm9yRG9tYWluOworICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUVy
cm9yIGVycm9yKGRvbWFpbiwgbV9leHRlbmRlZFN0YXR1c0NvZGUsIG1fcmVzcG9uc2UudXJsKCku
c3RyaW5nKCksIG1fcmVzcG9uc2UuaHR0cFN0YXR1c1RleHQoKSk7CisgICAgICAgICAgICAgICAg
ICAgIG1faGFuZGxlLT5jbGllbnQoKS0+ZGlkRmFpbChtX2hhbmRsZS5nZXQoKSwgZXJyb3IpOwor
ICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBtX2hhbmRsZS0+Y2xp
ZW50KCktPmRpZEZpbmlzaExvYWRpbmcobV9oYW5kbGUuZ2V0KCksIDApOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gd2hvZXZlciBjYWxsZWQgbm90aWZ5Q2xvc2Ug
c3RpbGwgaGF2ZSBhIHJlZmVyZW5jZSB0byB0aGUgam9iLCBzbworICAgIC8vIHNjaGVkdWxlIHRo
ZSBkZWxldGlvbiB3aXRoIGEgdGltZXIKKyAgICBtX2RlbGV0ZUpvYlRpbWVyLnN0YXJ0T25lU2hv
dCgwKTsKKworICAgIC8vIERldGFjaCBmcm9tIHRoZSBSZXNvdXJjZUhhbmRsZSBpbiBhbnkgY2Fz
ZS4KKyAgICBtX2hhbmRsZSA9IDA7CisgICAgbV9tdWx0aXBhcnREZWxlZ2F0ZSA9IG51bGxwdHI7
Cit9CisKK2Jvb2wgTmV0d29ya0pvYjo6c2hvdWxkTm90aWZ5Q2xpZW50RmluaXNoZWQoKQorewor
ICAgIGlmIChtX3JlZGlyZWN0Q291bnQgPj0gc19yZWRpcmVjdE1heGltdW0pCisgICAgICAgIHJl
dHVybiB0cnVlOworCisgICAgaWYgKG1fbmVlZHNSZXRyeUFzRlRQRGlyZWN0b3J5ICYmIHJldHJ5
QXNGVFBEaXJlY3RvcnkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGlzUmVk
aXJlY3QobV9leHRlbmRlZFN0YXR1c0NvZGUpICYmIGhhbmRsZVJlZGlyZWN0KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE5ldHdvcmtKb2I6
OnJldHJ5QXNGVFBEaXJlY3RvcnkoKQoreworICAgIG1fbmVlZHNSZXRyeUFzRlRQRGlyZWN0b3J5
ID0gZmFsc2U7CisKKyAgICBBU1NFUlQobV9oYW5kbGUpOworICAgIFJlc291cmNlUmVxdWVzdCBu
ZXdSZXF1ZXN0ID0gbV9oYW5kbGUtPmZpcnN0UmVxdWVzdCgpOworICAgIEtVUkwgdXJsID0gbmV3
UmVxdWVzdC51cmwoKTsKKyAgICB1cmwuc2V0UGF0aCh1cmwucGF0aCgpICsgIi8iKTsKKyAgICBu
ZXdSZXF1ZXN0LnNldFVSTCh1cmwpOworICAgIG5ld1JlcXVlc3Quc2V0TXVzdEhhbmRsZUludGVy
bmFsbHkodHJ1ZSk7CisKKyAgICAvLyBVcGRhdGUgdGhlIFVJCisgICAgaGFuZGxlTm90aWZ5SGVh
ZGVyUmVjZWl2ZWQoIkxvY2F0aW9uIiwgdXJsLnN0cmluZygpKTsKKworICAgIHJldHVybiBzdGFy
dE5ld0pvYldpdGhSZXF1ZXN0KG5ld1JlcXVlc3QpOworfQorCitib29sIE5ldHdvcmtKb2I6OnN0
YXJ0TmV3Sm9iV2l0aFJlcXVlc3QoUmVzb3VyY2VSZXF1ZXN0JiBuZXdSZXF1ZXN0LCBib29sIGlu
Y3JlYXNSZWRpcmVjdENvdW50KQoreworICAgIGlmIChjbGllbnRJc09rKCkpIHsKKyAgICAgICAg
UmVjdXJzaW9uR3VhcmQgZ3VhcmQobV9jYWxsaW5nQ2xpZW50KTsKKyAgICAgICAgbV9oYW5kbGUt
PmNsaWVudCgpLT53aWxsU2VuZFJlcXVlc3QobV9oYW5kbGUuZ2V0KCksIG5ld1JlcXVlc3QsIG1f
cmVzcG9uc2UpOworCisgICAgICAgIC8vIG1fY2FuY2VsbGVkIGNhbiBiZWNvbWUgdHJ1ZSBpZiB0
aGUgdXJsIGZhaWxzIHRoZSBwb2xpY3kgY2hlY2sKKyAgICAgICAgaWYgKG1fY2FuY2VsbGVkKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFBhc3MgdGhlIG93bmVy
c2hpcCBvZiB0aGUgUmVzb3VyY2VIYW5kbGUgdG8gdGhlIG5ldyBOZXR3b3JrSm9iLgorICAgIFJl
ZlB0cjxSZXNvdXJjZUhhbmRsZT4gaGFuZGxlID0gbV9oYW5kbGU7CisgICAgbV9oYW5kbGUgPSAw
OworICAgIG1fbXVsdGlwYXJ0RGVsZWdhdGUgPSBudWxscHRyOworCisgICAgTmV0d29ya01hbmFn
ZXI6Omluc3RhbmNlKCktPnN0YXJ0Sm9iKG1fcGxheWVySWQsCisgICAgICAgIG1fcGFnZUdyb3Vw
TmFtZSwKKyAgICAgICAgaGFuZGxlLAorICAgICAgICBuZXdSZXF1ZXN0LAorICAgICAgICBtX3N0
cmVhbUZhY3RvcnksCisgICAgICAgICptX2ZyYW1lLAorICAgICAgICBtX2RlZmVyTG9hZGluZ0Nv
dW50LAorICAgICAgICBpbmNyZWFzUmVkaXJlY3RDb3VudCA/IG1fcmVkaXJlY3RDb3VudCArIDEg
OiBtX3JlZGlyZWN0Q291bnQpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE5ldHdvcmtK
b2I6OmhhbmRsZVJlZGlyZWN0KCkKK3sKKyAgICBBU1NFUlQobV9oYW5kbGUpOworICAgIGlmICgh
bV9oYW5kbGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFN0cmluZyBsb2NhdGlvbiA9
IG1fcmVzcG9uc2UuaHR0cEhlYWRlckZpZWxkKCJMb2NhdGlvbiIpOworICAgIGlmIChsb2NhdGlv
bi5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgS1VSTCBuZXdVUkwobV9y
ZXNwb25zZS51cmwoKSwgbG9jYXRpb24pOworICAgIGlmICghbmV3VVJMLmlzVmFsaWQoKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgUmVzb3VyY2VSZXF1ZXN0IG5ld1JlcXVlc3QgPSBt
X2hhbmRsZS0+Zmlyc3RSZXF1ZXN0KCk7CisgICAgbmV3UmVxdWVzdC5zZXRVUkwobmV3VVJMKTsK
KyAgICBuZXdSZXF1ZXN0LnNldE11c3RIYW5kbGVJbnRlcm5hbGx5KHRydWUpOworCisgICAgU3Ry
aW5nIG1ldGhvZCA9IG5ld1JlcXVlc3QuaHR0cE1ldGhvZCgpLnVwcGVyKCk7CisgICAgaWYgKCht
ZXRob2QgIT0gIkdFVCIpICYmIChtZXRob2QgIT0gIkhFQUQiKSkgeworICAgICAgICBuZXdSZXF1
ZXN0LnNldEhUVFBNZXRob2QoIkdFVCIpOworICAgICAgICBuZXdSZXF1ZXN0LnNldEhUVFBCb2R5
KDApOworICAgICAgICBuZXdSZXF1ZXN0LnNldEhUVFBIZWFkZXJGaWVsZCgiQ29udGVudC1MZW5n
dGgiLCBTdHJpbmcoKSk7CisgICAgICAgIG5ld1JlcXVlc3Quc2V0SFRUUEhlYWRlckZpZWxkKCJD
b250ZW50LVR5cGUiLCBTdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gRG8gbm90IHNlbmQgZXhp
c3RpbmcgY3JlZGVudGlhbHMgd2l0aCB0aGUgbmV3IHJlcXVlc3QKKyAgICBtX2hhbmRsZS0+Z2V0
SW50ZXJuYWwoKS0+bV9jdXJyZW50V2ViQ2hhbGxlbmdlLm51bGxpZnkoKTsKKworICAgIHJldHVy
biBzdGFydE5ld0pvYldpdGhSZXF1ZXN0KG5ld1JlcXVlc3QsIHRydWUpOworfQorCit2b2lkIE5l
dHdvcmtKb2I6OnNlbmRSZXNwb25zZUlmTmVlZGVkKCkKK3sKKyAgICBpZiAobV9yZXNwb25zZVNl
bnQpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcmVzcG9uc2VTZW50ID0gdHJ1ZTsKKworICAg
IC8vIGNoZWNrIGZvciBlcnJvcnMKKyAgICBpZiAoaXNFcnJvcihtX2V4dGVuZGVkU3RhdHVzQ29k
ZSkgJiYgIW1fZGF0YVJlY2VpdmVkKQorICAgICAgICByZXR1cm47CisKKyAgICBTdHJpbmcgdXJs
RmlsZW5hbWUgPSBtX3Jlc3BvbnNlLnVybCgpLmxhc3RQYXRoQ29tcG9uZW50KCk7CisKKyAgICAv
LyBnZXQgdGhlIE1JTUUgdHlwZSB0aGF0IHdhcyBzZXQgYnkgdGhlIGNvbnRlbnQgc25pZmZlcgor
ICAgIC8vIGlmIHRoZXJlJ3Mgbm8gY3VzdG9tIHNuaWZmZXIgaGVhZGVyLCB0cnkgdG8gc2V0IGl0
IGZyb20gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIKKyAgICAvLyBpZiB0aGlzIGZhaWxzLCBndWVz
cyBpdCBmcm9tIGV4dGVuc2lvbgorICAgIFN0cmluZyBtaW1lVHlwZTsKKyAgICBpZiAobV9pc0ZU
UCAmJiBtX2lzRlRQRGlyKQorICAgICAgICBtaW1lVHlwZSA9ICJhcHBsaWNhdGlvbi94LWZ0cC1k
aXJlY3RvcnkiOworICAgIGVsc2UKKyAgICAgICAgbWltZVR5cGUgPSBtX3Jlc3BvbnNlLmh0dHBI
ZWFkZXJGaWVsZChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkhFQURFUl9S
SU1fU05JRkZFRF9NSU1FX1RZUEUpOworICAgIGlmIChtaW1lVHlwZS5pc051bGwoKSkKKyAgICAg
ICAgbWltZVR5cGUgPSBleHRyYWN0TUlNRVR5cGVGcm9tTWVkaWFUeXBlKG1fY29udGVudFR5cGUp
OworICAgIGlmIChtaW1lVHlwZS5pc051bGwoKSkKKyAgICAgICAgbWltZVR5cGUgPSBNSU1FVHlw
ZVJlZ2lzdHJ5OjpnZXRNSU1FVHlwZUZvclBhdGgodXJsRmlsZW5hbWUpOworICAgIG1fcmVzcG9u
c2Uuc2V0TWltZVR5cGUobWltZVR5cGUpOworCisgICAgLy8gc2V0IGVuY29kaW5nIGZyb20gQ29u
dGVudC1UeXBlIGhlYWRlcgorICAgIG1fcmVzcG9uc2Uuc2V0VGV4dEVuY29kaW5nTmFtZShleHRy
YWN0Q2hhcnNldEZyb21NZWRpYVR5cGUobV9jb250ZW50VHlwZSkpOworCisgICAgLy8gc2V0IGNv
bnRlbnQgbGVuZ3RoIGZyb20gaGVhZGVyCisgICAgU3RyaW5nIGNvbnRlbnRMZW5ndGggPSBtX3Jl
c3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgiQ29udGVudC1MZW5ndGgiKTsKKyAgICBpZiAoIWNvbnRl
bnRMZW5ndGguaXNOdWxsKCkpCisgICAgICAgIG1fcmVzcG9uc2Uuc2V0RXhwZWN0ZWRDb250ZW50
TGVuZ3RoKGNvbnRlbnRMZW5ndGgudG9JbnQ2NCgpKTsKKworICAgIC8vIHNldCBzdWdnZXN0ZWQg
ZmlsZW5hbWUgZm9yIGRvd25sb2FkcyBmcm9tIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRl
cjsgaWYgdGhpcyBmYWlscywgZmlsbCBpdCBpbiBmcm9tIHRoZSB1cmwKKyAgICAvLyBza2lwIHRo
aXMgZm9yIGRhdGEgdXJsJ3MsIGJlY2F1c2UgdGhleSBoYXZlIG5vIENvbnRlbnQtRGlzcG9zaXRp
b24gaGVhZGVyIGFuZCB0aGUgZm9ybWF0IGlzIHdyb25nIHRvIGJlIGEgZmlsZW5hbWUKKyAgICBp
ZiAoIW1faXNEYXRhICYmICFtX2lzQWJvdXQpIHsKKyAgICAgICAgU3RyaW5nIHN1Z2dlc3RlZEZp
bGVuYW1lID0gZmlsZW5hbWVGcm9tSFRUUENvbnRlbnREaXNwb3NpdGlvbihtX2NvbnRlbnREaXNw
b3NpdGlvbik7CisgICAgICAgIGlmIChzdWdnZXN0ZWRGaWxlbmFtZS5pc051bGwoKSkKKyAgICAg
ICAgICAgIHN1Z2dlc3RlZEZpbGVuYW1lID0gdXJsRmlsZW5hbWU7CisgICAgICAgIG1fcmVzcG9u
c2Uuc2V0U3VnZ2VzdGVkRmlsZW5hbWUoc3VnZ2VzdGVkRmlsZW5hbWUpOworICAgIH0KKworICAg
IC8vIG1ha2Ugc3VyZSBsb2NhbCBmaWxlcyBhcmVuJ3QgY2FjaGVkLCBzaW5jZSB0aGlzIGp1c3Qg
ZHVwbGljYXRlcyB0aGVtCisgICAgaWYgKG1faXNGaWxlIHx8IG1faXNEYXRhIHx8IG1faXNBYm91
dCkKKyAgICAgICAgbV9yZXNwb25zZS5zZXRIVFRQSGVhZGVyRmllbGQoIkNhY2hlLUNvbnRyb2wi
LCAibm8tY2FjaGUiKTsKKworICAgIGlmIChjbGllbnRJc09rKCkpIHsKKyAgICAgICAgUmVjdXJz
aW9uR3VhcmQgZ3VhcmQobV9jYWxsaW5nQ2xpZW50KTsKKyAgICAgICAgbV9oYW5kbGUtPmNsaWVu
dCgpLT5kaWRSZWNlaXZlUmVzcG9uc2UobV9oYW5kbGUuZ2V0KCksIG1fcmVzcG9uc2UpOworCisg
ICAgICAgIC8vIG11bHRpcGFydC94LW1peGVkLXJlcGxhY2UKKyAgICAgICAgaWYgKG1pbWVUeXBl
ID09ICJtdWx0aXBhcnQveC1taXhlZC1yZXBsYWNlIikgeworICAgICAgICAgICAgc3RkOjpzdHJp
bmcgYm91bmRhcnk7CisgICAgICAgICAgICBib29sIGlzUmVhZEJvdW5kYXJ5ID0gTXVsdGlwYXJ0
UmVzcG9uc2VEZWxlZ2F0ZTo6cmVhZE11bHRpcGFydEJvdW5kYXJ5KG1fY29udGVudFR5cGUubG93
ZXIoKS51dGY4KCkuZGF0YSgpLCBib3VuZGFyeSk7CisgICAgICAgICAgICBpZiAoaXNSZWFkQm91
bmRhcnkgJiYgIWJvdW5kYXJ5LmVtcHR5KCkpCisgICAgICAgICAgICAgICAgbV9tdWx0aXBhcnRE
ZWxlZ2F0ZSA9IGFkb3B0UHRyKG5ldyBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlKG1faGFuZGxl
LCBtX3Jlc3BvbnNlLCBib3VuZGFyeSkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE5l
dHdvcmtKb2I6OnBhcnNlRGF0YSgpCit7CisgICAgVmVjdG9yPGNoYXI+IHJlc3VsdDsKKworICAg
IFN0cmluZyBjb250ZW50VHlwZSgidGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJIik7CisKKyAg
ICBTdHJpbmcgZGF0YShtX3Jlc3BvbnNlLnVybCgpLnN0cmluZygpLnN1YnN0cmluZyg1KSk7Cisg
ICAgVmVjdG9yPFN0cmluZz4gaHBhcnRzOworICAgIGJvb2wgaXNCYXNlNjQgPSBmYWxzZTsKKwor
ICAgIHNpemVfdCBpbmRleCA9IGRhdGEuZmluZCgnLCcpOworICAgIGlmIChpbmRleCAhPSBub3RG
b3VuZCAmJiBpbmRleCA+IDApIHsKKyAgICAgICAgY29udGVudFR5cGUgPSBkYXRhLmxlZnQoaW5k
ZXgpLmxvd2VyKCk7CisgICAgICAgIGRhdGEgPSBkYXRhLnN1YnN0cmluZyhpbmRleCArIDEpOwor
CisgICAgICAgIGNvbnRlbnRUeXBlLnNwbGl0KCc7JywgaHBhcnRzKTsKKyAgICAgICAgVmVjdG9y
PFN0cmluZz46Oml0ZXJhdG9yIGk7CisgICAgICAgIGZvciAoaSA9IGhwYXJ0cy5iZWdpbigpOyBp
ICE9IGhwYXJ0cy5lbmQoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoaS0+c3RyaXBXaGl0ZVNw
YWNlKCkubG93ZXIoKSA9PSAiYmFzZTY0IikgeworICAgICAgICAgICAgICAgIGlzQmFzZTY0ID0g
dHJ1ZTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAqaTsKKyAgICAgICAgICAgICAg
ICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqaSA9PSB2YWx1ZSkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gaSAtIGhwYXJ0cy5iZWdpbigpOworICAgICAg
ICAgICAgICAgICAgICAgICAgaHBhcnRzLnJlbW92ZShwb3NpdGlvbik7CisgICAgICAgICAgICAg
ICAgICAgICAgICBpID0gaHBhcnRzLmJlZ2luKCkgKyBwb3NpdGlvbjsKKyAgICAgICAgICAgICAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAg
ICAgfSB3aGlsZSAoaSAhPSBocGFydHMuZW5kKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnRlbnRUeXBlID0gU3RyaW5nKCk7
CisgICAgICAgIGZvciAoaSA9IGhwYXJ0cy5iZWdpbigpOyBpICE9IGhwYXJ0cy5lbmQoKTsgKytp
KSB7CisgICAgICAgICAgICBpZiAoaSA+IGhwYXJ0cy5iZWdpbigpKQorICAgICAgICAgICAgICAg
IGNvbnRlbnRUeXBlICs9ICIsIjsKKworICAgICAgICAgICAgY29udGVudFR5cGUgKz0gKmk7Cisg
ICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFpbmRleCkKKyAgICAgICAgZGF0YSA9IGRhdGEuc3Vi
c3RyaW5nKDEpOyAvLyBicm9rZW4gaGVhZGVyCisKKyAgICB7CisgICAgICAgIENTdHJpbmcgbGF0
aW4gPSBkYXRhLmxhdGluMSgpOworICAgICAgICBlc2NhcGVEZWNvZGUobGF0aW4uZGF0YSgpLCBs
YXRpbi5sZW5ndGgoKSwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBpZiAoaXNCYXNlNjQpIHsKKyAg
ICAgICAgU3RyaW5nIHMocmVzdWx0LmRhdGEoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIENT
dHJpbmcgbGF0aW4gPSBzLnJlbW92ZUNoYXJhY3RlcnMoaXNTcGFjZU9yTmV3bGluZSkubGF0aW4x
KCk7CisgICAgICAgIHJlc3VsdC5jbGVhcigpOworICAgICAgICByZXN1bHQuYXBwZW5kKGxhdGlu
LmRhdGEoKSwgbGF0aW4ubGVuZ3RoKCkpOworICAgICAgICBWZWN0b3I8Y2hhcj4gYnl0ZXNPdXQ7
CisgICAgICAgIGlmIChiYXNlNjREZWNvZGUocmVzdWx0LCBieXRlc091dCkpCisgICAgICAgICAg
ICByZXN1bHQuc3dhcChieXRlc091dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3Vs
dC5jbGVhcigpOworICAgIH0KKworICAgIG5vdGlmeVN0YXR1c1JlY2VpdmVkKHJlc3VsdC5pc0Vt
cHR5KCkgPyA0MDQgOiAyMDAsIDApOworICAgIG5vdGlmeVN0cmluZ0hlYWRlclJlY2VpdmVkKCJD
b250ZW50LVR5cGUiLCBjb250ZW50VHlwZSk7CisgICAgbm90aWZ5U3RyaW5nSGVhZGVyUmVjZWl2
ZWQoIkNvbnRlbnQtTGVuZ3RoIiwgU3RyaW5nOjpudW1iZXIocmVzdWx0LnNpemUoKSkpOworICAg
IG5vdGlmeURhdGFSZWNlaXZlZFBsYWluKHJlc3VsdC5kYXRhKCksIHJlc3VsdC5zaXplKCkpOwor
ICAgIG5vdGlmeUNsb3NlKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpGaWx0ZXJTdHJlYW06OlN0YXR1
c1N1Y2Nlc3MpOworfQorCitib29sIE5ldHdvcmtKb2I6OmhhbmRsZUF1dGhIZWFkZXIoY29uc3Qg
U3RyaW5nJiBoZWFkZXIpCit7CisgICAgaWYgKCFtX2hhbmRsZSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgaWYgKCFtX2hhbmRsZS0+Z2V0SW50ZXJuYWwoKS0+bV9jdXJyZW50V2ViQ2hh
bGxlbmdlLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaGVhZGVy
LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGVxdWFsSWdub3Jp
bmdDYXNlKGhlYWRlciwgIm50bG0iKSkKKyAgICAgICAgc2VuZFJlcXVlc3RXaXRoQ3JlZGVudGlh
bHMoUHJvdGVjdGlvblNwYWNlU2VydmVySFRUUCwgUHJvdGVjdGlvblNwYWNlQXV0aGVudGljYXRp
b25TY2hlbWVOVExNLCAiTlRMTSIpOworCisgICAgLy8gRXh0cmFjdCB0aGUgYXV0aCBzY2hlbWUg
YW5kIHJlYWxtIGZyb20gdGhlIGhlYWRlci4KKyAgICBzaXplX3Qgc3BhY2VQb3MgPSBoZWFkZXIu
ZmluZCgnICcpOworICAgIGlmIChzcGFjZVBvcyA9PSBub3RGb3VuZCkgeworICAgICAgICBMT0co
TmV0d29yaywgIldXVy1BdXRoZW50aWNhdGUgZmllbGQgJyVzJyBiYWRseSBmb3JtYXR0ZWQ6IG1p
c3Npbmcgc2NoZW1lLiIsIGhlYWRlci51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIFN0cmluZyBzY2hlbWUgPSBoZWFkZXIubGVmdChzcGFjZVBvcyk7
CisKKyAgICBQcm90ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZSBwcm90ZWN0aW9uU3Bh
Y2VTY2hlbWUgPSBQcm90ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZURlZmF1bHQ7Cisg
ICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHNjaGVtZSwgImJhc2ljIikpCisgICAgICAgIHByb3Rl
Y3Rpb25TcGFjZVNjaGVtZSA9IFByb3RlY3Rpb25TcGFjZUF1dGhlbnRpY2F0aW9uU2NoZW1lSFRU
UEJhc2ljOworICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHNjaGVtZSwgImRpZ2VzdCIp
KQorICAgICAgICBwcm90ZWN0aW9uU3BhY2VTY2hlbWUgPSBQcm90ZWN0aW9uU3BhY2VBdXRoZW50
aWNhdGlvblNjaGVtZUhUVFBEaWdlc3Q7CisgICAgZWxzZSB7CisgICAgICAgIG5vdEltcGxlbWVu
dGVkKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzaXplX3QgcmVhbG1Q
b3MgPSBoZWFkZXIuZmluZElnbm9yaW5nQ2FzZSgicmVhbG09Iiwgc3BhY2VQb3MpOworICAgIGlm
IChyZWFsbVBvcyA9PSBub3RGb3VuZCkgeworICAgICAgICBMT0coTmV0d29yaywgIldXVy1BdXRo
ZW50aWNhdGUgZmllbGQgJyVzJyBiYWRseSBmb3JtYXR0ZWQ6IG1pc3NpbmcgcmVhbG0uIiwgaGVh
ZGVyLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNp
emVfdCBiZWdpblBvcyA9IHJlYWxtUG9zICsgNjsKKyAgICBTdHJpbmcgcmVhbG0gID0gaGVhZGVy
LnJpZ2h0KGhlYWRlci5sZW5ndGgoKSAtIGJlZ2luUG9zKTsKKyAgICBpZiAocmVhbG0uc3RhcnRz
V2l0aCgiXCIiKSkgeworICAgICAgICBiZWdpblBvcyArPSAxOworICAgICAgICBzaXplX3QgZW5k
UG9zID0gaGVhZGVyLmZpbmQoIlwiIiwgYmVnaW5Qb3MpOworICAgICAgICBpZiAoZW5kUG9zID09
IG5vdEZvdW5kKSB7CisgICAgICAgICAgICBMT0coTmV0d29yaywgIldXVy1BdXRoZW50aWNhdGUg
ZmllbGQgJyVzJyBiYWRseSBmb3JtYXR0ZWQ6IGludmFsaWQgcmVhbG0uIiwgaGVhZGVyLnV0Zjgo
KS5kYXRhKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAg
IHJlYWxtID0gaGVhZGVyLnN1YnN0cmluZyhiZWdpblBvcywgZW5kUG9zIC0gYmVnaW5Qb3MpOwor
ICAgIH0KKworICAgIC8vIEdldCB0aGUgdXNlcidzIGNyZWRlbnRpYWxzIGFuZCByZXNlbmQgdGhl
IHJlcXVlc3QKKyAgICBzZW5kUmVxdWVzdFdpdGhDcmVkZW50aWFscyhQcm90ZWN0aW9uU3BhY2VT
ZXJ2ZXJIVFRQLCBwcm90ZWN0aW9uU3BhY2VTY2hlbWUsIHJlYWxtKTsKKworICAgIHJldHVybiB0
cnVlOworfQorCitib29sIE5ldHdvcmtKb2I6OmhhbmRsZUZUUEhlYWRlcihjb25zdCBTdHJpbmcm
IGhlYWRlcikKK3sKKyAgICBzaXplX3Qgc3BhY2VQb3MgPSBoZWFkZXIuZmluZCgnICcpOworICAg
IGlmIChzcGFjZVBvcyA9PSBub3RGb3VuZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIFN0
cmluZyBzdGF0dXNDb2RlID0gaGVhZGVyLmxlZnQoc3BhY2VQb3MpOworICAgIHN3aXRjaCAoc3Rh
dHVzQ29kZS50b0ludCgpKSB7CisgICAgY2FzZSAyMTM6CisgICAgICAgIG1faXNGVFBEaXIgPSBm
YWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1MzA6CisgICAgICAgIHB1cmdlQ3JlZGVu
dGlhbHMoKTsKKyAgICAgICAgc2VuZFJlcXVlc3RXaXRoQ3JlZGVudGlhbHMoUHJvdGVjdGlvblNw
YWNlU2VydmVyRlRQLCBQcm90ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZURlZmF1bHQs
ICJmdHAiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMzA6CisgICAgICAgIHN0b3JlQ3Jl
ZGVudGlhbHMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1NTA6CisgICAgICAgIC8vIFRo
ZSB1c2VyIG1pZ2h0IGhhdmUgZW50ZXJlZCBhbiBVUkwgd2hpY2ggcG9pbnQgdG8gYSBkaXJlY3Rv
cnkgYnV0IGZvcmdvdCB0eXBlICcvJywKKyAgICAgICAgLy8gZS5nLiwgZnRwOi8vZnRwLnRyb2xs
dGVjaC5jb20vcXQvc291cmNlIHdoZXJlICdzb3VyY2UnIGlzIGEgZGlyZWN0b3J5LiBXZSBuZWVk
IHRvCisgICAgICAgIC8vIGFkZGVkICcvJyBhbmQgdHJ5IGFnYWluLgorICAgICAgICBpZiAobV9o
YW5kbGUgJiYgIW1faGFuZGxlLT5maXJzdFJlcXVlc3QoKS51cmwoKS5wYXRoKCkuZW5kc1dpdGgo
Ii8iKSkKKyAgICAgICAgICAgIG1fbmVlZHNSZXRyeUFzRlRQRGlyZWN0b3J5ID0gdHJ1ZTsKKyAg
ICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTmV0d29y
a0pvYjo6c2VuZFJlcXVlc3RXaXRoQ3JlZGVudGlhbHMoUHJvdGVjdGlvblNwYWNlU2VydmVyVHlw
ZSB0eXBlLCBQcm90ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZSBzY2hlbWUsIGNvbnN0
IFN0cmluZyYgcmVhbG0pCit7CisgICAgQVNTRVJUKG1faGFuZGxlKTsKKyAgICBpZiAoIW1faGFu
ZGxlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBLVVJMIG5ld1VSTCA9IG1fcmVzcG9u
c2UudXJsKCk7CisgICAgaWYgKCFuZXdVUkwuaXNWYWxpZCgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBQcm90ZWN0aW9uU3BhY2UgcHJvdGVjdGlvblNwYWNlKG1fcmVzcG9uc2UudXJs
KCkuaG9zdCgpLCBtX3Jlc3BvbnNlLnVybCgpLnBvcnQoKSwgdHlwZSwgcmVhbG0sIHNjaGVtZSk7
CisKKyAgICAvLyBXZSd2ZSBnb3QgdGhlIHNjaGVtZSBhbmQgcmVhbG0uIE5vdyB3ZSBuZWVkIGEg
dXNlcm5hbWUgYW5kIHBhc3N3b3JkLgorICAgIC8vIEZpcnN0IHNlYXJjaCB0aGUgQ3JlZGVudGlh
bFN0b3JhZ2UuCisgICAgQ3JlZGVudGlhbCBjcmVkZW50aWFsID0gQ3JlZGVudGlhbFN0b3JhZ2U6
OmdldChwcm90ZWN0aW9uU3BhY2UpOworICAgIGlmICghY3JlZGVudGlhbC5pc0VtcHR5KCkpIHsK
KyAgICAgICAgbV9oYW5kbGUtPmdldEludGVybmFsKCktPm1fY3VycmVudFdlYkNoYWxsZW5nZSA9
IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKHByb3RlY3Rpb25TcGFjZSwgY3JlZGVudGlhbCwgMCwg
bV9yZXNwb25zZSwgUmVzb3VyY2VFcnJvcigpKTsKKyAgICAgICAgbV9oYW5kbGUtPmdldEludGVy
bmFsKCktPm1fY3VycmVudFdlYkNoYWxsZW5nZS5zZXRTdG9yZWQodHJ1ZSk7CisgICAgfSBlbHNl
IHsKKyAgICAgICAgLy8gQ3JlZGVudGlhbFN0b3JlIGlzIGVtcHR5LiBBc2sgdGhlIHVzZXIgdmlh
IGRpYWxvZy4KKyAgICAgICAgU3RyaW5nIHVzZXJuYW1lOworICAgICAgICBTdHJpbmcgcGFzc3dv
cmQ7CisKKyAgICAgICAgaWYgKCFtX2ZyYW1lIHx8ICFtX2ZyYW1lLT5sb2FkZXIoKSB8fCAhbV9m
cmFtZS0+bG9hZGVyKCktPmNsaWVudCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50KCktPmF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdl
KHJlYWxtLCB1c2VybmFtZSwgcGFzc3dvcmQpOworCisgICAgICAgIGlmICh1c2VybmFtZS5pc0Vt
cHR5KCkgJiYgcGFzc3dvcmQuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgICAgIGNyZWRlbnRpYWwgPSBDcmVkZW50aWFsKHVzZXJuYW1lLCBwYXNzd29yZCwgQ3Jl
ZGVudGlhbFBlcnNpc3RlbmNlRm9yU2Vzc2lvbik7CisKKyAgICAgICAgbV9oYW5kbGUtPmdldElu
dGVybmFsKCktPm1fY3VycmVudFdlYkNoYWxsZW5nZSA9IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdl
KHByb3RlY3Rpb25TcGFjZSwgY3JlZGVudGlhbCwgMCwgbV9yZXNwb25zZSwgUmVzb3VyY2VFcnJv
cigpKTsKKyAgICB9CisKKyAgICAvLyBSZXNlbmQgdGhlIHJlc291cmNlIHJlcXVlc3QuIENsb25l
ZCBmcm9tIGhhbmRsZVJlZGlyZWN0KCkuIE5vdCBzdXJlCisgICAgLy8gaWYgd2UgbmVlZCBldmVy
eXRoaW5nIHRoYXQgZm9sbG93cy4uLgorICAgIFJlc291cmNlUmVxdWVzdCBuZXdSZXF1ZXN0ID0g
bV9oYW5kbGUtPmZpcnN0UmVxdWVzdCgpOworICAgIG5ld1JlcXVlc3Quc2V0VVJMKG5ld1VSTCk7
CisgICAgbmV3UmVxdWVzdC5zZXRNdXN0SGFuZGxlSW50ZXJuYWxseSh0cnVlKTsKKyAgICByZXR1
cm4gc3RhcnROZXdKb2JXaXRoUmVxdWVzdChuZXdSZXF1ZXN0KTsKK30KKwordm9pZCBOZXR3b3Jr
Sm9iOjpzdG9yZUNyZWRlbnRpYWxzKCkKK3sKKyAgICBpZiAoIW1faGFuZGxlKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYgY2hhbGxlbmdlID0gbV9oYW5k
bGUtPmdldEludGVybmFsKCktPm1fY3VycmVudFdlYkNoYWxsZW5nZTsKKyAgICBpZiAoY2hhbGxl
bmdlLmlzTnVsbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoY2hhbGxlbmdlLmlzU3Rv
cmVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIENyZWRlbnRpYWxTdG9yYWdlOjpzZXQoY2hh
bGxlbmdlLnByb3Bvc2VkQ3JlZGVudGlhbCgpLCBjaGFsbGVuZ2UucHJvdGVjdGlvblNwYWNlKCks
IG1fcmVzcG9uc2UudXJsKCkpOworICAgIGNoYWxsZW5nZS5zZXRTdG9yZWQodHJ1ZSk7Cit9CisK
K3ZvaWQgTmV0d29ya0pvYjo6cHVyZ2VDcmVkZW50aWFscygpCit7CisgICAgaWYgKCFtX2hhbmRs
ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmIGNoYWxs
ZW5nZSA9IG1faGFuZGxlLT5nZXRJbnRlcm5hbCgpLT5tX2N1cnJlbnRXZWJDaGFsbGVuZ2U7Cisg
ICAgaWYgKGNoYWxsZW5nZS5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQ3JlZGVu
dGlhbFN0b3JhZ2U6OnJlbW92ZShjaGFsbGVuZ2UucHJvdGVjdGlvblNwYWNlKCkpOworICAgIGNo
YWxsZW5nZS5zZXRTdG9yZWQoZmFsc2UpOworfQorCitib29sIE5ldHdvcmtKb2I6OnNob3VsZFNl
bmRDbGllbnREYXRhKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKCFpc1JlZGlyZWN0KG1fZXh0ZW5k
ZWRTdGF0dXNDb2RlKSB8fCAhbV9yZXNwb25zZS5odHRwSGVhZGVyRmllbGRzKCkuY29udGFpbnMo
IkxvY2F0aW9uIikpCisgICAgICAgICAgICYmICFtX25lZWRzUmV0cnlBc0ZUUERpcmVjdG9yeTsK
K30KKwordm9pZCBOZXR3b3JrSm9iOjpmaXJlRGVsZXRlSm9iVGltZXIoVGltZXI8TmV0d29ya0pv
Yj4qKQoreworICAgIE5ldHdvcmtNYW5hZ2VyOjppbnN0YW5jZSgpLT5kZWxldGVKb2IodGhpcyk7
Cit9CisKK3ZvaWQgTmV0d29ya0pvYjo6aGFuZGxlQWJvdXQoKQoreworICAgIFN0cmluZyBhYm91
dFdoYXQobV9yZXNwb25zZS51cmwoKS5zdHJpbmcoKS5zdWJzdHJpbmcoNikpOyAvLyBmaXJzdCA2
IGNoYXJzIGFyZSAiYWJvdXQ6IgorCisgICAgU3RyaW5nIHJlc3VsdDsKKworICAgIGJvb2wgaGFu
ZGxlZCA9IGZhbHNlOworICAgIGlmIChhYm91dFdoYXQuaXNFbXB0eSgpIHx8IGVxdWFsSWdub3Jp
bmdDYXNlKGFib3V0V2hhdCwgImJsYW5rIikpIHsKKyAgICAgICAgaGFuZGxlZCA9IHRydWU7Cisg
ICAgfSBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhYm91dFdoYXQsICJjcmVkaXRzIikpIHsK
KyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcoIjxodG1sPjxoZWFkPjx0aXRsZT5PcGVuIFNv
dXJjZSBDcmVkaXRzPC90aXRsZT4gPHN0eWxlPiAuYWJvdXQge3BhZGRpbmc6MTRweDt9IDwvc3R5
bGU+IDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgs
IHVzZXItc2NhbGFibGU9bm9cIj48L2hlYWQ+PGJvZHk+IikpOworICAgICAgICByZXN1bHQuYXBw
ZW5kKFN0cmluZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6V0VCS0lUQ1JFRElUUykpOworICAgICAg
ICByZXN1bHQuYXBwZW5kKFN0cmluZygiPC9ib2R5PjwvaHRtbD4iKSk7CisgICAgICAgIGhhbmRs
ZWQgPSB0cnVlOworI2lmICFkZWZpbmVkKFBVQkxJQ19CVUlMRCkgfHwgIVBVQkxJQ19CVUlMRAor
ICAgIH0gZWxzZSBpZiAoYWJvdXRXaGF0LnN0YXJ0c1dpdGgoImNhY2hlP3F1ZXJ5PSIsIGZhbHNl
KSkgeworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Q2xpZW50KiBjbGllbnQgPSBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6Q2xpZW50OjpnZXQoKTsKKyAgICAgICAgQVNTRVJUKGNsaWVudCk7
CisgICAgICAgIHN0ZDo6c3RyaW5nIGtleShhYm91dFdoYXQuc3Vic3RyaW5nKDEyLCBhYm91dFdo
YXQubGVuZ3RoKCkgLSAxMikudXRmOCgpLmRhdGEoKSk7IC8vIDEyIGlzIGxlbmd0aCBvZiAiY2Fj
aGU/cXVlcnk9Ii4KKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcoIjxodG1sPjxoZWFkPjx0
aXRsZT5CbGFja0JlcnJ5IEJyb3dzZXIgRGlzayBDYWNoZTwvdGl0bGU+PC9oZWFkPjxib2R5PiIp
KTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcoa2V5LmRhdGEoKSkpOworICAgICAgICBy
ZXN1bHQuYXBwZW5kKFN0cmluZygiPGhyPiIpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJp
bmcoY2xpZW50LT5nZW5lcmF0ZUh0bWxGcmFnbWVudEZvckNhY2hlSGVhZGVycyhrZXkpLmRhdGEo
KSkpOworICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZygiPC9ib2R5PjwvaHRtbD4iKSk7Cisg
ICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
YWJvdXRXaGF0LCAiY2FjaGUiKSkgeworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Q2xp
ZW50KiBjbGllbnQgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Q2xpZW50OjpnZXQoKTsKKyAgICAg
ICAgQVNTRVJUKGNsaWVudCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nKCI8aHRtbD48
aGVhZD48dGl0bGU+QmxhY2tCZXJyeSBCcm93c2VyIERpc2sgQ2FjaGU8L3RpdGxlPjwvaGVhZD48
Ym9keT4iKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nKGNsaWVudC0+Z2VuZXJhdGVI
dG1sRnJhZ21lbnRGb3JDYWNoZUtleXMoKS5kYXRhKCkpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVu
ZChTdHJpbmcoIjwvYm9keT48L2h0bWw+IikpOworICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAg
ICB9IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGFib3V0V2hhdCwgImNhY2hlL2Rpc2FibGUi
KSkgeworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Q2xpZW50KiBjbGllbnQgPSBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6Q2xpZW50OjpnZXQoKTsKKyAgICAgICAgQVNTRVJUKGNsaWVudCk7
CisgICAgICAgIGNsaWVudC0+c2V0RGlza0NhY2hlRW5hYmxlZChmYWxzZSk7CisgICAgICAgIHJl
c3VsdC5hcHBlbmQoU3RyaW5nKCI8aHRtbD48aGVhZD48dGl0bGU+QmxhY2tCZXJyeSBCcm93c2Vy
IERpc2sgQ2FjaGU8L3RpdGxlPjwvaGVhZD48Ym9keT5IdHRwIGRpc2sgY2FjaGUgaXMgZGlzYWJs
ZWQuPC9ib2R5PjwvaHRtbD4iKSk7CisgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgIH0gZWxz
ZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYWJvdXRXaGF0LCAiY2FjaGUvZW5hYmxlIikpIHsKKyAg
ICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkNsaWVudCogY2xpZW50ID0gQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkNsaWVudDo6Z2V0KCk7CisgICAgICAgIEFTU0VSVChjbGllbnQpOworICAgICAg
ICBjbGllbnQtPnNldERpc2tDYWNoZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHJlc3VsdC5hcHBl
bmQoU3RyaW5nKCI8aHRtbD48aGVhZD48dGl0bGU+QmxhY2tCZXJyeSBCcm93c2VyIERpc2sgQ2Fj
aGU8L3RpdGxlPjwvaGVhZD48Ym9keT5IdHRwIGRpc2sgY2FjaGUgaXMgZW5hYmxlZC48L2JvZHk+
PC9odG1sPiIpKTsKKyAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChlcXVh
bElnbm9yaW5nQ2FzZShhYm91dFdoYXQsICJ2ZXJzaW9uIikpIHsKKyAgICAgICAgcmVzdWx0LmFw
cGVuZChTdHJpbmcoIjxodG1sPjxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0
aD1kZXZpY2Utd2lkdGgsIHVzZXItc2NhbGFibGU9bm9cIj48L2hlYWQ+PGJvZHk+IikpOworICAg
ICAgICByZXN1bHQuYXBwZW5kKFN0cmluZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6QlVJTERUSU1F
KSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nKCI8L2JvZHk+PC9odG1sPiIpKTsKKyAg
ICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6ZGVidWdTZXR0aW5nKCkgPiAwICYmIGVxdWFsSWdub3JpbmdDYXNlKGFib3V0V2hhdCwgImNv
bmZpZyIpKSB7CisgICAgICAgIHJlc3VsdCA9IGNvbmZpZ1BhZ2UoKTsKKyAgICAgICAgaGFuZGxl
ZCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6ZGVidWdTZXR0
aW5nKCkgPiAwICYmIGVxdWFsSWdub3JpbmdDYXNlKGFib3V0V2hhdCwgImJ1aWxkIikpIHsKKyAg
ICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcoIjxodG1sPjxoZWFkPjx0aXRsZT5CbGFja0JlcnJ5
IEJyb3dzZXIgQnVpbGQgSW5mb3JtYXRpb248L3RpdGxlPjwvaGVhZD48Ym9keT48dGFibGU+Iikp
OworICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZygiPHRyPjx0ZD5CdWlsZCBDb21wdXRlcjog
IDwvdGQ+PHRkPiIpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcoQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkJVSUxEQ09NUFVURVIpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmco
IjwvdGQ+PC90cj4iKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nKCI8dHI+PHRkPkJ1
aWxkIFVzZXI6ICA8L3RkPjx0ZD4iKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nKEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpCVUlMRFVTRVIpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChT
dHJpbmcoIjwvdGQ+PC90cj4iKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nKCI8dHI+
PHRkPkJ1aWxkIFRpbWU6ICA8L3RkPjx0ZD4iKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3Ry
aW5nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpCVUlMRFRJTUUpKTsKKyAgICAgICAgcmVzdWx0LmFw
cGVuZChTdHJpbmcoIjwvdGQ+PC90cj48dHI+PHRkPjwvdGQ+PHRkPjwvdGQ+PC90cj4iKSk7Cisg
ICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpCVUlMRElO
Rk9fV0VCS0lUKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nKEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpCVUlMRElORk9fUExBVEZPUk0pKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJp
bmcoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkJVSUxESU5GT19MSUJXRUJWSUVXKSk7CisgICAgICAg
IHJlc3VsdC5hcHBlbmQoU3RyaW5nKCI8L3RhYmxlPjwvYm9keT48L2h0bWw+IikpOworICAgICAg
ICBoYW5kbGVkID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGFib3V0
V2hhdCwgIm1lbW9yeSIpKSB7CisgICAgICAgIHJlc3VsdCA9IG1lbW9yeVBhZ2UoKTsKKyAgICAg
ICAgaGFuZGxlZCA9IHRydWU7CisjZW5kaWYKKyAgICB9CisKKyAgICBDU3RyaW5nIHJlc3VsdFN0
cmluZyA9IHJlc3VsdC51dGY4KCk7CisKKyAgICBub3RpZnlTdGF0dXNSZWNlaXZlZChoYW5kbGVk
ID8gNDA0IDogMjAwLCAwKTsKKyAgICBub3RpZnlTdHJpbmdIZWFkZXJSZWNlaXZlZCgiQ29udGVu
dC1MZW5ndGgiLCBTdHJpbmc6Om51bWJlcihyZXN1bHRTdHJpbmcubGVuZ3RoKCkpKTsKKyAgICBu
b3RpZnlTdHJpbmdIZWFkZXJSZWNlaXZlZCgiQ29udGVudC1UeXBlIiwgInRleHQvaHRtbCIpOwor
ICAgIG5vdGlmeURhdGFSZWNlaXZlZFBsYWluKHJlc3VsdFN0cmluZy5kYXRhKCksIHJlc3VsdFN0
cmluZy5sZW5ndGgoKSk7CisgICAgbm90aWZ5Q2xvc2UoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZp
bHRlclN0cmVhbTo6U3RhdHVzU3VjY2Vzcyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9O
ZXR3b3JrSm9iLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkv
TmV0d29ya0pvYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ODk3ZmEK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNr
YmVycnkvTmV0d29ya0pvYi5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA5LCAyMDEwLCAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUK
KyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJv
c3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgTmV0d29ya0pvYl9oCisj
ZGVmaW5lIE5ldHdvcmtKb2JfaAorCisjaW5jbHVkZSAiRGVmZXJyZWREYXRhLmgiCisjaW5jbHVk
ZSAiTXVsdGlwYXJ0UmVzcG9uc2VEZWxlZ2F0ZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5n
LmgiCisjaW5jbHVkZSAiUHJvdGVjdGlvblNwYWNlLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VIYW5k
bGUuaCIKKyNpbmNsdWRlICJSZXNvdXJjZVJlc3BvbnNlLmgiCisjaW5jbHVkZSAiVGltZXIuaCIK
KworI2luY2x1ZGUgPG5ldHdvcmsvRmlsdGVyU3RyZWFtLmg+CisjaW5jbHVkZSA8d3RmL093blB0
ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKworbmFtZXNwYWNlIEJsYWNrQmVycnkgewor
bmFtZXNwYWNlIFBsYXRmb3JtIHsKK2NsYXNzIE5ldHdvcmtSZXF1ZXN0OworY2xhc3MgTmV0d29y
a1N0cmVhbUZhY3Rvcnk7Cit9Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgRnJh
bWU7CitjbGFzcyBLVVJMOworY2xhc3MgUmVzb3VyY2VSZXF1ZXN0OworCitjbGFzcyBOZXR3b3Jr
Sm9iIDogcHVibGljIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpGaWx0ZXJTdHJlYW0geworcHVibGlj
OgorICAgIE5ldHdvcmtKb2IoKTsKKyAgICBib29sIGluaXRpYWxpemUoaW50IHBsYXllcklkLAor
ICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcmIHBhZ2VHcm91cE5hbWUsCisgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IEtVUkwmLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3QmLAorICAgICAgICAgICAgICAgICAgICBQ
YXNzUmVmUHRyPFJlc291cmNlSGFuZGxlPiwKKyAgICAgICAgICAgICAgICAgICAgQmxhY2tCZXJy
eTo6UGxhdGZvcm06Ok5ldHdvcmtTdHJlYW1GYWN0b3J5KiwKKyAgICAgICAgICAgICAgICAgICAg
Y29uc3QgRnJhbWUmLAorICAgICAgICAgICAgICAgICAgICBpbnQgZGVmZXJMb2FkaW5nQ291bnQs
CisgICAgICAgICAgICAgICAgICAgIGludCByZWRpcmVjdENvdW50KTsKKyAgICBQYXNzUmVmUHRy
PFJlc291cmNlSGFuZGxlPiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtX2hhbmRsZTsgfQorICAg
IGJvb2wgaXNSdW5uaW5nKCkgY29uc3QgeyByZXR1cm4gbV9pc1J1bm5pbmc7IH0KKyAgICBib29s
IGlzQ2FuY2VsbGVkKCkgY29uc3QgeyByZXR1cm4gbV9jYW5jZWxsZWQ7IH0KKyAgICBib29sIGNs
aWVudElzT2soKSBjb25zdCB7IHJldHVybiAhbV9jYW5jZWxsZWQgJiYgbV9oYW5kbGUgJiYgbV9o
YW5kbGUtPmNsaWVudCgpOyB9CisgICAgdm9pZCBsb2FkRGF0YVVSTCgpIHsgbV9sb2FkRGF0YVRp
bWVyLnN0YXJ0T25lU2hvdCgwKTsgfQorICAgIGJvb2wgbG9hZEFib3V0VVJMKCk7CisgICAgaW50
IGNhbmNlbEpvYigpOworICAgIGJvb2wgaXNEZWZlcnJpbmdMb2FkaW5nKCkgY29uc3QgeyByZXR1
cm4gbV9kZWZlckxvYWRpbmdDb3VudCA+IDA7IH0KKyAgICB2b2lkIHVwZGF0ZURlZmVyTG9hZGlu
Z0NvdW50KGludCBkZWx0YSk7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVN0YXR1c1JlY2VpdmVk
KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworICAgIHZvaWQgaGFuZGxlTm90aWZ5
U3RhdHVzUmVjZWl2ZWQoaW50IHN0YXR1cywgY29uc3QgU3RyaW5nJiBtZXNzYWdlKTsKKyAgICB2
aXJ0dWFsIHZvaWQgbm90aWZ5V01MT3ZlcnJpZGUoKTsKKyAgICB2b2lkIGhhbmRsZU5vdGlmeVdN
TE92ZXJyaWRlKCkgeyBtX3Jlc3BvbnNlLnNldElzV01MKHRydWUpOyB9CisgICAgdmlydHVhbCB2
b2lkIG5vdGlmeUhlYWRlclJlY2VpdmVkKGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFs
dWUpOworICAgIC8vIEV4aXN0cyBvbmx5IHRvIHJlc29sdmUgYW1iaWd1aXR5IGJldHdlZW4gY2hh
ciogYW5kIFN0cmluZyBwYXJhbWV0ZXJzCisgICAgdm9pZCBub3RpZnlTdHJpbmdIZWFkZXJSZWNl
aXZlZChjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7CisgICAgdm9pZCBo
YW5kbGVOb3RpZnlIZWFkZXJSZWNlaXZlZChjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5n
JiB2YWx1ZSk7CisgICAgdm9pZCBoYW5kbGVTZXRDb29raWVIZWFkZXIoY29uc3QgU3RyaW5nJiB2
YWx1ZSk7CisgICAgdm9pZCBub3RpZnlEYXRhUmVjZWl2ZWRQbGFpbihjb25zdCBjaGFyKiBidWYs
IHNpemVfdCBsZW4pOworICAgIHZvaWQgaGFuZGxlTm90aWZ5RGF0YVJlY2VpdmVkKGNvbnN0IGNo
YXIqIGJ1Ziwgc2l6ZV90IGxlbik7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeURhdGFTZW50KHVu
c2lnbmVkIGxvbmcgbG9uZyBieXRlc1NlbnQsIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbEJ5dGVz
VG9CZVNlbnQpOworICAgIHZvaWQgaGFuZGxlTm90aWZ5RGF0YVNlbnQodW5zaWduZWQgbG9uZyBs
b25nIGJ5dGVzU2VudCwgdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsQnl0ZXNUb0JlU2VudCk7Cisg
ICAgdmlydHVhbCB2b2lkIG5vdGlmeUNsb3NlKGludCBzdGF0dXMpOworICAgIHZvaWQgaGFuZGxl
Tm90aWZ5Q2xvc2UoaW50IHN0YXR1cyk7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeURhdGFSZWNl
aXZlZChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya0J1ZmZlciogYnVmZmVyKQorICAgIHsK
KyAgICAgICAgbm90aWZ5RGF0YVJlY2VpdmVkUGxhaW4oQmxhY2tCZXJyeTo6UGxhdGZvcm06Om5l
dHdvcmtCdWZmZXJEYXRhKGJ1ZmZlciksIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpuZXR3b3JrQnVm
ZmVyRGF0YUxlbmd0aChidWZmZXIpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdmlydHVhbCB2
b2lkIHNldFdhc0Rpc2tDYWNoZWQoYm9vbCB2YWx1ZSkKKyAgICB7CisgICAgICAgbV9yZXNwb25z
ZS5zZXRXYXNDYWNoZWQodmFsdWUpOworICAgIH0KKworICAgIGJvb2wgc2hvdWxkU2VuZENsaWVu
dERhdGEoKSBjb25zdDsKKworICAgIGJvb2wgc2hvdWxkTm90aWZ5Q2xpZW50RmluaXNoZWQoKTsK
KworICAgIGJvb2wgc2hvdWxkRGVmZXJMb2FkaW5nKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBpc0RlZmVycmluZ0xvYWRpbmcoKSB8fCBtX2RlZmVycmVkRGF0YS5oYXNEZWZlcnJlZERh
dGEoKTsKKyAgICB9CisKKyAgICBib29sIHJldHJ5QXNGVFBEaXJlY3RvcnkoKTsKKworICAgIGJv
b2wgc3RhcnROZXdKb2JXaXRoUmVxdWVzdChSZXNvdXJjZVJlcXVlc3QmIG5ld1JlcXVlc3QsIGJv
b2wgaW5jcmVhc1JlZGlyZWN0Q291bnQgPSBmYWxzZSk7CisKKyAgICBib29sIGhhbmRsZVJlZGly
ZWN0KCk7CisKKyAgICAvLyBUaGlzIGNhbiBjYXVzZSBtX2NhbmNlbGxlZCB0byBiZSBzZXQgdG8g
dHJ1ZSwgaWYgaXQgcGFzc2VzIHVwIGFuIGVycm9yIHRvIG1faGFuZGxlLT5jbGllbnQoKSB3aGlj
aCBjYXVzZXMgdGhlIGpvYiB0byBiZSBjYW5jZWxsZWQKKyAgICB2b2lkIHNlbmRSZXNwb25zZUlm
TmVlZGVkKCk7CisKKyAgICB2b2lkIGZpcmVMb2FkRGF0YVRpbWVyKFRpbWVyPE5ldHdvcmtKb2I+
KikKKyAgICB7CisgICAgICAgIHBhcnNlRGF0YSgpOworICAgIH0KKworICAgIHZvaWQgZmlyZUxv
YWRBYm91dFRpbWVyKFRpbWVyPE5ldHdvcmtKb2I+KikKKyAgICB7CisgICAgICAgIGhhbmRsZUFi
b3V0KCk7CisgICAgfQorCisgICAgdm9pZCBmaXJlRGVsZXRlSm9iVGltZXIoVGltZXI8TmV0d29y
a0pvYj4qKTsKKworICAgIHZvaWQgcGFyc2VEYXRhKCk7CisKKyAgICB2b2lkIGhhbmRsZUFib3V0
KCk7CisKKyAgICAvLyBUaGUgc2VydmVyIG5lZWRzIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxz
LiBTZWFyY2ggaW4gdGhlCisgICAgLy8gQ3JlZGVudGlhbFN0b3JhZ2Ugb3IgcHJvbXB0IHRoZSB1
c2VyIHZpYSBkaWFsb2cuCisgICAgYm9vbCBoYW5kbGVBdXRoSGVhZGVyKGNvbnN0IFN0cmluZyYg
aGVhZGVyKTsKKworICAgIGJvb2wgaGFuZGxlRlRQSGVhZGVyKGNvbnN0IFN0cmluZyYgaGVhZGVy
KTsKKworICAgIGJvb2wgc2VuZFJlcXVlc3RXaXRoQ3JlZGVudGlhbHMoUHJvdGVjdGlvblNwYWNl
U2VydmVyVHlwZSwgUHJvdGVjdGlvblNwYWNlQXV0aGVudGljYXRpb25TY2hlbWUsIGNvbnN0IFN0
cmluZyYgcmVhbG0pOworCisgICAgdm9pZCBzdG9yZUNyZWRlbnRpYWxzKCk7CisKKyAgICB2b2lk
IHB1cmdlQ3JlZGVudGlhbHMoKTsKKworcHJpdmF0ZToKKyAgICBib29sIGlzRXJyb3IoaW50IHN0
YXR1c0NvZGUpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzQ29kZSA8IDAgfHwgKCFtX2lz
WEhSICYmICg0MDAgPD0gc3RhdHVzQ29kZSAmJiBzdGF0dXNDb2RlIDwgNjAwKSk7CisgICAgfQor
CisgICAgaW50IG1fcGxheWVySWQ7CisgICAgU3RyaW5nIG1fcGFnZUdyb3VwTmFtZTsKKyAgICBS
ZWZQdHI8UmVzb3VyY2VIYW5kbGU+IG1faGFuZGxlOworICAgIFJlc291cmNlUmVzcG9uc2UgbV9y
ZXNwb25zZTsKKyAgICBUaW1lcjxOZXR3b3JrSm9iPiBtX2xvYWREYXRhVGltZXI7CisgICAgVGlt
ZXI8TmV0d29ya0pvYj4gbV9sb2FkQWJvdXRUaW1lcjsKKyAgICBPd25QdHI8TXVsdGlwYXJ0UmVz
cG9uc2VEZWxlZ2F0ZT4gbV9tdWx0aXBhcnREZWxlZ2F0ZTsKKyAgICBUaW1lcjxOZXR3b3JrSm9i
PiBtX2RlbGV0ZUpvYlRpbWVyOworICAgIFN0cmluZyBtX2NvbnRlbnRUeXBlOworICAgIFN0cmlu
ZyBtX2NvbnRlbnREaXNwb3NpdGlvbjsKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29y
a1N0cmVhbUZhY3RvcnkqIG1fc3RyZWFtRmFjdG9yeTsKKyAgICBib29sIG1faXNGaWxlOworICAg
IGJvb2wgbV9pc0RhdGE7CisgICAgYm9vbCBtX2lzQWJvdXQ7CisgICAgYm9vbCBtX2lzRlRQOwor
ICAgIGJvb2wgbV9pc0ZUUERpcjsKKyAgICBib29sIG1faXNSdW5uaW5nOworICAgIGJvb2wgbV9j
YW5jZWxsZWQ7CisgICAgYm9vbCBtX3N0YXR1c1JlY2VpdmVkOworICAgIGJvb2wgbV9kYXRhUmVj
ZWl2ZWQ7CisgICAgYm9vbCBtX3Jlc3BvbnNlU2VudDsKKworICAgIC8vIElmIGFuIEhUVFAgc3Rh
dHVzIGNvZGUgaXMgcmVjZWl2ZWQsIG1fZXh0ZW5kZWRTdGF0dXNDb2RlIGFuZCBtX3Jlc3BvbnNl
Lmh0dHBTdGF0dXNDb2RlIHdpbGwgYm90aCBiZSBzZXQgdG8gaXQuCisgICAgLy8gSWYgYSBwbGF0
Zm9ybSBlcnJvciBjb2RlIGlzIHJlY2VpdmVkLCBtX2V4dGVuZGVkU3RhdHVzQ29kZSB3aWxsIGJl
IHNldCB0byBpdCBhbmQgbV9yZXNwb25zZS5odHRwU3RhdHVzQ29kZSB3aWxsIGJlIHNldCB0byA0
MDQuCisgICAgaW50IG1fZXh0ZW5kZWRTdGF0dXNDb2RlOworCisgICAgaW50IG1fcmVkaXJlY3RD
b3VudDsKKworICAgIERlZmVycmVkRGF0YSBtX2RlZmVycmVkRGF0YTsKKyAgICBpbnQgbV9kZWZl
ckxvYWRpbmdDb3VudDsKKyAgICBib29sIG1fY2FsbGluZ0NsaWVudDsKKyAgICBjb25zdCBGcmFt
ZSogbV9mcmFtZTsKKyAgICBib29sIG1faXNYSFI7IC8vIEZJWE1FIC0gQWZ0ZXIgNy4wLCByZW1v
dmUgdGhpcy4gT25seSB0aGUgUXQgcG9ydCByZXBvcnRzIEhUVFAgZXJyb3Igc3RhdHVzZXMgYXMg
ZGlkRmFpbHMsIHNvIHdlIHByb2JhYmx5IHNob3VsZG4ndC4KKyAgICBib29sIG1fbmVlZHNSZXRy
eUFzRlRQRGlyZWN0b3J5OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYg
Ly8gTmV0d29ya0pvYl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL2JsYWNrYmVycnkvTmV0d29ya01hbmFnZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi4zMDlhODYxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtNYW5hZ2VyLmNwcApAQCAt
MCwwICsxLDIxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSBSZXNl
YXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg
UHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVz
c2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBp
ZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBV
U0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiTmV0d29ya01hbmFnZXIu
aCIKKworI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKKyNp
bmNsdWRlICJDcmVkZW50aWFsU3RvcmFnZS5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVk
ZSAiRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5LmgiCisjaW5jbHVkZSAiTmV0d29ya0pvYi5o
IgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZUludGVybmFsLmgi
CisjaW5jbHVkZSAiUmVzb3VyY2VSZXF1ZXN0LmgiCisKKyNpbmNsdWRlIDxuZXR3b3JrL05ldHdv
cmtSZXF1ZXN0Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworTmV0d29ya01hbmFnZXIqIE5l
dHdvcmtNYW5hZ2VyOjppbnN0YW5jZSgpCit7CisgICAgc3RhdGljIE5ldHdvcmtNYW5hZ2VyKiBz
SW5zdGFuY2U7CisgICAgaWYgKCFzSW5zdGFuY2UpIHsKKyAgICAgICAgc0luc3RhbmNlID0gbmV3
IE5ldHdvcmtNYW5hZ2VyOworICAgICAgICBBU1NFUlQoc0luc3RhbmNlKTsKKyAgICB9CisgICAg
cmV0dXJuIHNJbnN0YW5jZTsKK30KKworYm9vbCBOZXR3b3JrTWFuYWdlcjo6c3RhcnRKb2IoaW50
IHBsYXllcklkLCBQYXNzUmVmUHRyPFJlc291cmNlSGFuZGxlPiBqb2IsIGNvbnN0IEZyYW1lJiBm
cmFtZSwgYm9vbCBkZWZlcnNMb2FkaW5nKQoreworICAgIEFTU0VSVChqb2IuZ2V0KCkpOworICAg
IFJlZlB0cjxSZXNvdXJjZUhhbmRsZT4gcmVmSm9iKGpvYik7IC8vIFdlIHNob3VsZG4ndCBjYWxs
IG1ldGhvZHMgb24gUGFzc1JlZlB0ciBzbyBtYWtlIGEgbmV3IFJlZlB0CisgICAgcmV0dXJuIHN0
YXJ0Sm9iKHBsYXllcklkLCByZWZKb2IsIHJlZkpvYi0+Zmlyc3RSZXF1ZXN0KCksIGZyYW1lLCBk
ZWZlcnNMb2FkaW5nKTsKK30KKworYm9vbCBOZXR3b3JrTWFuYWdlcjo6c3RhcnRKb2IoaW50IHBs
YXllcklkLCBQYXNzUmVmUHRyPFJlc291cmNlSGFuZGxlPiBqb2IsIGNvbnN0IFJlc291cmNlUmVx
dWVzdCYgcmVxdWVzdCwgY29uc3QgRnJhbWUmIGZyYW1lLCBib29sIGRlZmVyc0xvYWRpbmcpCit7
CisgICAgUGFnZSogcGFnZSA9IGZyYW1lLnBhZ2UoKTsKKyAgICBpZiAoIXBhZ2UpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1N0cmVhbUZh
Y3RvcnkqIHN0cmVhbUZhY3RvcnkgPSBwYWdlLT5jaHJvbWUoKS0+cGxhdGZvcm1QYWdlQ2xpZW50
KCktPm5ldHdvcmtTdHJlYW1GYWN0b3J5KCk7CisgICAgcmV0dXJuIHN0YXJ0Sm9iKHBsYXllcklk
LCBwYWdlLT5ncm91cE5hbWUoKSwgam9iLCByZXF1ZXN0LCBzdHJlYW1GYWN0b3J5LCBmcmFtZSwg
ZGVmZXJzTG9hZGluZyA/IDEgOiAwKTsKK30KKworYm9vbCBOZXR3b3JrTWFuYWdlcjo6c3RhcnRK
b2IoaW50IHBsYXllcklkLCBjb25zdCBTdHJpbmcmIHBhZ2VHcm91cE5hbWUsIFBhc3NSZWZQdHI8
UmVzb3VyY2VIYW5kbGU+IGpvYiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0LCBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1N0cmVhbUZhY3RvcnkqIHN0cmVhbUZhY3RvcnksIGNv
bnN0IEZyYW1lJiBmcmFtZSwgaW50IGRlZmVyTG9hZGluZ0NvdW50LCBpbnQgcmVkaXJlY3RDb3Vu
dCkKK3sKKyAgICAvLyBtYWtlIHN1cmUgdGhlIFJlc291cmNlSGFuZGxlIGRvZXNuJ3QgZ28gb3V0
IG9mIHNjb3BlIHdoaWxlIGNhbGxpbmcgY2FsbGJhY2tzCisgICAgUmVmUHRyPFJlc291cmNlSGFu
ZGxlPiBndWFyZEpvYihqb2IpOworCisgICAgS1VSTCB1cmwgPSByZXF1ZXN0LnVybCgpOworCisg
ICAgLy8gb25seSBsb2FkIHRoZSBpbml0aWFsIHVybCBvbmNlCisgICAgYm9vbCBpc0luaXRpYWwg
PSAodXJsID09IG1faW5pdGlhbFVSTCk7CisgICAgaWYgKGlzSW5pdGlhbCkKKyAgICAgICAgbV9p
bml0aWFsVVJMID0gS1VSTCgpOworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtS
ZXF1ZXN0IHBsYXRmb3JtUmVxdWVzdDsKKyAgICByZXF1ZXN0LmluaXRpYWxpemVQbGF0Zm9ybVJl
cXVlc3QocGxhdGZvcm1SZXF1ZXN0LCBpc0luaXRpYWwpOworCisgICAgLy8gQXR0YWNoIGFueSBh
cHBsaWNhYmxlIGF1dGggY3JlZGVudGlhbHMgdG8gdGhlIE5ldHdvcmtSZXF1ZXN0LgorICAgIEF1
dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJiBjaGFsbGVuZ2UgPSBndWFyZEpvYi0+Z2V0SW50ZXJuYWwo
KS0+bV9jdXJyZW50V2ViQ2hhbGxlbmdlOworICAgIGlmICghY2hhbGxlbmdlLmlzTnVsbCgpKSB7
CisgICAgICAgIENyZWRlbnRpYWwgY3JlZGVudGlhbCA9IGNoYWxsZW5nZS5wcm9wb3NlZENyZWRl
bnRpYWwoKTsKKyAgICAgICAgUHJvdGVjdGlvblNwYWNlIHByb3RlY3Rpb25TcGFjZSA9IGNoYWxs
ZW5nZS5wcm90ZWN0aW9uU3BhY2UoKTsKKyAgICAgICAgUHJvdGVjdGlvblNwYWNlU2VydmVyVHlw
ZSB0eXBlID0gcHJvdGVjdGlvblNwYWNlLnNlcnZlclR5cGUoKTsKKworICAgICAgICBTdHJpbmcg
dXNlcm5hbWUgPSBjcmVkZW50aWFsLnVzZXIoKTsKKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0g
Y3JlZGVudGlhbC5wYXNzd29yZCgpOworCisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpO
ZXR3b3JrUmVxdWVzdDo6QXV0aFR5cGUgYXV0aFR5cGUgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
TmV0d29ya1JlcXVlc3Q6OkF1dGhOb25lOworICAgICAgICBpZiAodHlwZSA9PSBQcm90ZWN0aW9u
U3BhY2VTZXJ2ZXJIVFRQKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHByb3RlY3Rpb25TcGFjZS5h
dXRoZW50aWNhdGlvblNjaGVtZSgpKSB7CisgICAgICAgICAgICBjYXNlIFByb3RlY3Rpb25TcGFj
ZUF1dGhlbnRpY2F0aW9uU2NoZW1lSFRUUEJhc2ljOgorICAgICAgICAgICAgICAgIGF1dGhUeXBl
ID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpBdXRoSFRUUEJhc2ljOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQcm90ZWN0aW9uU3BhY2VB
dXRoZW50aWNhdGlvblNjaGVtZUhUVFBEaWdlc3Q6CisgICAgICAgICAgICAgICAgYXV0aFR5cGUg
PSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkF1dGhIVFRQRGlnZXN0Owor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQcm90ZWN0aW9uU3BhY2VB
dXRoZW50aWNhdGlvblNjaGVtZU5UTE06CisgICAgICAgICAgICAgICAgYXV0aFR5cGUgPSBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkF1dGhIVFRQTlRMTTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIExvdHMgbW9yZSBjYXNlcyB0byBoYW5kbGUK
KyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gZGVmYXVsdHMgdG8gQXV0
aE5vbmUgYXMgcGVyIGFib3ZlLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
fQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUHJvdGVjdGlvblNwYWNlU2VydmVyRlRQKQor
ICAgICAgICAgICAgYXV0aFR5cGUgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVl
c3Q6OkF1dGhGVFA7CisKKyAgICAgICAgaWYgKGF1dGhUeXBlICE9IEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpOZXR3b3JrUmVxdWVzdDo6QXV0aE5vbmUpCisgICAgICAgICAgICBwbGF0Zm9ybVJlcXVl
c3Quc2V0Q3JlZGVudGlhbHModXNlcm5hbWUudXRmOCgpLmRhdGEoKSwgcGFzc3dvcmQudXRmOCgp
LmRhdGEoKSwgYXV0aFR5cGUpOworICAgIH0gZWxzZSBpZiAodXJsLnByb3RvY29sSW5IVFRQRmFt
aWx5KCkpIHsKKyAgICAgICAgLy8gRm9yIFVSTHMgdGhhdCBtYXRjaCB0aGUgcGF0aHMgb2YgdGhv
c2UgcHJldmlvdXNseSBjaGFsbGVuZ2VkIGZvciBIVFRQIEJhc2ljIGF1dGhlbnRpY2F0aW9uLAor
ICAgICAgICAvLyB0cnkgYW5kIHJldXNlIHRoZSBjcmVkZW50aWFsIHByZWVtcHRpdmVseSwgYXMg
YWxsb3dlZCBieSBSRkMgMjYxNy4KKyAgICAgICAgQ3JlZGVudGlhbCBjcmVkZW50aWFsID0gQ3Jl
ZGVudGlhbFN0b3JhZ2U6OmdldCh1cmwpOworICAgICAgICBpZiAoIWNyZWRlbnRpYWwuaXNFbXB0
eSgpKQorICAgICAgICAgICAgcGxhdGZvcm1SZXF1ZXN0LnNldENyZWRlbnRpYWxzKGNyZWRlbnRp
YWwudXNlcigpLnV0ZjgoKS5kYXRhKCksIGNyZWRlbnRpYWwucGFzc3dvcmQoKS51dGY4KCkuZGF0
YSgpLCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkF1dGhIVFRQQmFzaWMp
OworICAgIH0KKworI2lmIE9TKFFOWCkKKyAgICBpZiAoKCZmcmFtZSkgJiYgKCZmcmFtZSktPmxv
YWRlcigpICYmICgmZnJhbWUpLT5sb2FkZXIoKS0+Y2xpZW50KCkKKyAgICAgICAgJiYgc3RhdGlj
X2Nhc3Q8RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Kj4oKCZmcmFtZSktPmxvYWRlcigpLT5j
bGllbnQoKSktPmNvb2tpZXNFbmFibGVkKCkpIHsKKyAgICAgICAgLy8gUHJlcGFyZSBhIGNvb2tp
ZSBoZWFkZXIgaWYgdGhlcmUgYXJlIGNvb2tpZXMgcmVsYXRlZCB0byB0aGlzIHVybC4KKyAgICAg
ICAgU3RyaW5nIGNvb2tpZVBhaXJzID0gY29va2llTWFuYWdlcigpLmdldENvb2tpZSh1cmwsIFdp
dGhIdHRwT25seUNvb2tpZXMpOworICAgICAgICBpZiAoIWNvb2tpZVBhaXJzLmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgLy8gV2UgZW5jb2RlIHRoZSBjb29raWUgaGVhZGVyIGRhdGEgdXNpbmcg
dXRmOCB0byBzdXBwb3J0IHVuaWNvZGUgY2hhcmFjdGVycworICAgICAgICAgICAgLy8gRm9yIG1v
cmUgaW5mb3JtYXRpb24sIGxvb2sgYXQgUkZDNTk4NyAtIDQuMSAoaHR0cDovL3Rvb2xzLmlldGYu
b3JnL2h0bWwvcmZjNTk4NyNyZWYtSVNPLTg4NTktMSkKKyAgICAgICAgICAgIHBsYXRmb3JtUmVx
dWVzdC5zZXRDb29raWVEYXRhKGNvb2tpZVBhaXJzLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICB9
CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIXJlcXVlc3Qub3ZlcnJpZGVDb250ZW50VHlwZSgp
LmlzRW1wdHkoKSkKKyAgICAgICAgcGxhdGZvcm1SZXF1ZXN0LnNldE92ZXJyaWRlQ29udGVudFR5
cGUocmVxdWVzdC5vdmVycmlkZUNvbnRlbnRUeXBlKCkubGF0aW4xKCkuZGF0YSgpKTsKKworICAg
IE5ldHdvcmtKb2IqIG5ldHdvcmtKb2IgPSBuZXcgTmV0d29ya0pvYjsKKyAgICBpZiAoIW5ldHdv
cmtKb2IpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIW5ldHdvcmtKb2ItPmluaXRp
YWxpemUocGxheWVySWQsIHBhZ2VHcm91cE5hbWUsIHVybCwgcGxhdGZvcm1SZXF1ZXN0LCBndWFy
ZEpvYiwgc3RyZWFtRmFjdG9yeSwgZnJhbWUsIGRlZmVyTG9hZGluZ0NvdW50LCByZWRpcmVjdENv
dW50KSkgeworICAgICAgICBkZWxldGUgbmV0d29ya0pvYjsKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIG9ubHkgb25lIE5ldHdvcmtKb2Ig
Zm9yIG9uZSBSZXNvdXJjZUhhbmRsZQorICAgIEFTU0VSVCghZmluZEpvYkZvckhhbmRsZShndWFy
ZEpvYikpOworCisgICAgbV9qb2JzLmFwcGVuZChuZXR3b3JrSm9iKTsKKworICAgIC8vIGhhbmRs
ZSBkYXRhOiBVUkwncworICAgIGlmICh1cmwucHJvdG9jb2xJcygiZGF0YSIpKSB7CisgICAgICAg
IG5ldHdvcmtKb2ItPmxvYWREYXRhVVJMKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KworICAgIC8vIGhhbmRsZSBhYm91dDogVVJMJ3MKKyAgICBpZiAodXJsLnByb3RvY29sSXMoImFi
b3V0IikpIHsKKyAgICAgICAgLy8gdHJ5IHRvIGhhbmRsZSB0aGUgdXJsIGludGVybmFsbHk7IGlm
IGl0IGlzbid0IHJlY29nbml6ZWQsIGNvbnRpbnVlIGFuZCBwYXNzIGl0IHRvIHRoZSBjbGllbnQK
KyAgICAgICAgaWYgKG5ldHdvcmtKb2ItPmxvYWRBYm91dFVSTCgpKQorICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gaGFuZGxlIGFsbCBvdGhlciBVUkwncworICAgIGlu
dCByZXN1bHQgPSBuZXR3b3JrSm9iLT5zdHJlYW1PcGVuKCk7CisgICAgaWYgKHJlc3VsdCkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTmV0d29y
a01hbmFnZXI6OnN0b3BKb2IoUGFzc1JlZlB0cjxSZXNvdXJjZUhhbmRsZT4gam9iKQoreworICAg
IGlmIChOZXR3b3JrSm9iKiBuZXR3b3JrSm9iID0gZmluZEpvYkZvckhhbmRsZShqb2IpKQorICAg
ICAgICByZXR1cm4gIW5ldHdvcmtKb2ItPmNhbmNlbEpvYigpOworCisgICAgcmV0dXJuIGZhbHNl
OworfQorCitOZXR3b3JrSm9iKiBOZXR3b3JrTWFuYWdlcjo6ZmluZEpvYkZvckhhbmRsZShQYXNz
UmVmUHRyPFJlc291cmNlSGFuZGxlPiBqb2IpCit7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IG1fam9icy5zaXplKCk7ICsraSkgeworICAgICAgICBOZXR3b3JrSm9iKiBuZXR3b3JrSm9i
ID0gbV9qb2JzW2ldOworICAgICAgICBpZiAobmV0d29ya0pvYi0+aGFuZGxlKCkgPT0gam9iKSB7
CisgICAgICAgICAgICAvLyBXZSBoYXZlIG9ubHkgb25lIGpvYiBmb3Igb25lIGhhbmRsZS4KKyAg
ICAgICAgICAgIHJldHVybiBuZXR3b3JrSm9iOworICAgICAgICB9CisgICAgfQorICAgIHJldHVy
biAwOworfQorCit2b2lkIE5ldHdvcmtNYW5hZ2VyOjpkZWxldGVKb2IoTmV0d29ya0pvYiogam9i
KQoreworICAgIEFTU0VSVCgham9iLT5pc1J1bm5pbmcoKSk7CisgICAgc2l6ZV90IHBvc2l0aW9u
ID0gbV9qb2JzLmZpbmQoam9iKTsKKyAgICBpZiAocG9zaXRpb24gIT0gbm90Rm91bmQpCisgICAg
ICAgIG1fam9icy5yZW1vdmUocG9zaXRpb24pOworICAgIGRlbGV0ZSBqb2I7Cit9CisKK3ZvaWQg
TmV0d29ya01hbmFnZXI6OnNldERlZmVyc0xvYWRpbmcoUGFzc1JlZlB0cjxSZXNvdXJjZUhhbmRs
ZT4gam9iLCBib29sIGRlZmVyc0xvYWRpbmcpCit7CisgICAgaWYgKE5ldHdvcmtKb2IqIG5ldHdv
cmtKb2IgPSBmaW5kSm9iRm9ySGFuZGxlKGpvYikpCisgICAgICAgIG5ldHdvcmtKb2ItPnVwZGF0
ZURlZmVyTG9hZGluZ0NvdW50KGRlZmVyc0xvYWRpbmcgPyAxIDogLTEpOworfQorCit2b2lkIE5l
dHdvcmtNYW5hZ2VyOjpwYXVzZUxvYWQoUGFzc1JlZlB0cjxSZXNvdXJjZUhhbmRsZT4gam9iLCBi
b29sIHBhdXNlKQoreworICAgIGlmIChOZXR3b3JrSm9iKiBuZXR3b3JrSm9iID0gZmluZEpvYkZv
ckhhbmRsZShqb2IpKQorICAgICAgICBuZXR3b3JrSm9iLT5zdHJlYW1QYXVzZShwYXVzZSk7Cit9
CisKK0JsYWNrQmVycnk6OlBsYXRmb3JtOjpGaWx0ZXJTdHJlYW0qIE5ldHdvcmtNYW5hZ2VyOjpz
dHJlYW1Gb3JIYW5kbGUoUGFzc1JlZlB0cjxSZXNvdXJjZUhhbmRsZT4gam9iKQoreworICAgIE5l
dHdvcmtKb2IqIG5ldHdvcmtKb2IgPSBmaW5kSm9iRm9ySGFuZGxlKGpvYik7CisKKyAgICByZXR1
cm4gbmV0d29ya0pvYiA/IG5ldHdvcmtKb2ItPndyYXBwZWRTdHJlYW0oKSA6IDA7Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrTWFuYWdlci5oIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2ODYxZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrTWFuYWdlci5oCkBAIC0w
LDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgUmVzZWFyY2ggSW4g
TW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgor
ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3
cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8K
KworI2lmbmRlZiBOZXR3b3JrTWFuYWdlcl9oCisjZGVmaW5lIE5ldHdvcmtNYW5hZ2VyX2gKKwor
I2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZS5oIgorCisjaW5jbHVk
ZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2UgUGxh
dGZvcm0geworY2xhc3MgRmlsdGVyU3RyZWFtOworY2xhc3MgTmV0d29ya1N0cmVhbUZhY3Rvcnk7
Cit9Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgRnJhbWU7CitjbGFzcyBOZXR3
b3JrSm9iOworCitjbGFzcyBOZXR3b3JrTWFuYWdlciB7CitwdWJsaWM6CisgICAgc3RhdGljIE5l
dHdvcmtNYW5hZ2VyKiBpbnN0YW5jZSgpOworICAgIHZvaWQgc2V0SW5pdGlhbFVSTChjb25zdCBL
VVJMJiB1cmwpIHsgbV9pbml0aWFsVVJMID0gdXJsOyB9CisgICAgS1VSTCBpbml0aWFsVVJMKCkg
eyByZXR1cm4gbV9pbml0aWFsVVJMOyB9CisgICAgYm9vbCBzdGFydEpvYihpbnQgcGxheWVySWQs
IFBhc3NSZWZQdHI8UmVzb3VyY2VIYW5kbGU+IGpvYiwgY29uc3QgRnJhbWUmLCBib29sIGRlZmVy
c0xvYWRpbmcpOworICAgIGJvb2wgc3RhcnRKb2IoaW50IHBsYXllcklkLCBQYXNzUmVmUHRyPFJl
c291cmNlSGFuZGxlPiBqb2IsIGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIGNvbnN0IEZyYW1lJiwg
Ym9vbCBkZWZlcnNMb2FkaW5nKTsKKyAgICBib29sIHN0b3BKb2IoUGFzc1JlZlB0cjxSZXNvdXJj
ZUhhbmRsZT4pOworICAgIHZvaWQgc2V0RGVmZXJzTG9hZGluZyhQYXNzUmVmUHRyPFJlc291cmNl
SGFuZGxlPiBqb2IsIGJvb2wgZGVmZXJzTG9hZGluZyk7CisgICAgdm9pZCBwYXVzZUxvYWQoUGFz
c1JlZlB0cjxSZXNvdXJjZUhhbmRsZT4gam9iLCBib29sIHBhdXNlKTsKKyAgICBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6RmlsdGVyU3RyZWFtKiBzdHJlYW1Gb3JIYW5kbGUoUGFzc1JlZlB0cjxSZXNv
dXJjZUhhbmRsZT4pOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBOZXR3b3JrSm9iOwor
CisgICAgTmV0d29ya0pvYiogZmluZEpvYkZvckhhbmRsZShQYXNzUmVmUHRyPFJlc291cmNlSGFu
ZGxlPik7CisgICAgdm9pZCBkZWxldGVKb2IoTmV0d29ya0pvYiopOworICAgIGJvb2wgc3RhcnRK
b2IoaW50IHBsYXllcklkLCBjb25zdCBTdHJpbmcmIHBhZ2VHcm91cE5hbWUsIFBhc3NSZWZQdHI8
UmVzb3VyY2VIYW5kbGU+LCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6TmV0d29ya1N0cmVhbUZhY3RvcnkqLCBjb25zdCBGcmFtZSYsIGludCBkZWZlckxvYWRp
bmdDb3VudCA9IDAsIGludCByZWRpcmVjdENvdW50ID0gMCk7CisKKyAgICBWZWN0b3I8TmV0d29y
a0pvYio+IG1fam9iczsKKyAgICBLVVJMIG1faW5pdGlhbFVSTDsKK307CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIE5ldHdvcmtNYW5hZ2VyX2gKLS0gCjEuNy41LjQKCg==
</data>
<flag name="review"
          id="117386"
          type_id="1"
          status="-"
          setter="rwlbuis"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118515</attachid>
            <date>2011-12-08 19:15:52 -0800</date>
            <delta_ts>2011-12-08 19:34:04 -0800</delta_ts>
            <desc>Patch v2</desc>
            <filename>0001-Upstream-platform-network-blackberry-DeferredData.-h.patch</filename>
            <type>text/plain</type>
            <size>62647</size>
            <attacher name="Leo Yang">leo.yang</attacher>
            
              <data encoding="base64">RnJvbSA2NDMxMDc4NjU5MGEzNGJlNWZkZGQ4MWJhOTY2Y2U3MjA3NTAwMDA5IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBMZW8gWWFuZyA8bGVvLnlhbmdAdG9yY2htb2JpbGUuY29tLmNu
PgpEYXRlOiBGcmksIDkgRGVjIDIwMTEgMTE6MTM6MTYgKzA4MDAKU3ViamVjdDogW1BBVENIXSBV
cHN0cmVhbSBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLntoLCBjcHB9
LAogTmV0d29ya0pvYi57aCwgY3BwfSBhbmQgTmV0d29ya01hbmFnZXIue2gsIGNwcH0KIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzc5MQoKUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCgpPdGhlciBtYWluIGNvbnRyaWJ1dG9yczoKSm9lIE1hc29uIDxqbWFzb25A
cmltLmNvbT4KTGlhbmdodWkgQ2hlbiA8bGlhY2hlbkByaW0uY29tPgpDaGFybGVzIFdlaSA8Y2hh
cmxlcy53ZWlAdG9yY2htb2JpbGUuY29tLmNuPgoKSW5pdGlhbCB1cHN0cmVhbSwgY2FuJ3QgYmUg
YnVpbHQgeWV0LCBubyBuZXcgdGVzdHMuCgoqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9E
ZWZlcnJlZERhdGEuY3BwOiBBZGRlZC4KKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVm
ZXJyZWREYXRhLmg6IEFkZGVkLgoqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3Jr
Sm9iLmNwcDogQWRkZWQuCiogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtKb2Iu
aDogQWRkZWQuCiogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtNYW5hZ2VyLmNw
cDogQWRkZWQuCiogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtNYW5hZ2VyLmg6
IEFkZGVkLgotLS0KIFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHwgICAyMSArCiAuLi4vcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L0RlZmVycmVk
RGF0YS5jcHAgICB8ICAxNzAgKysrKwogLi4uL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9E
ZWZlcnJlZERhdGEuaCAgICAgfCAgIDkzICsrCiAuLi4vcGxhdGZvcm0vbmV0d29yay9ibGFja2Jl
cnJ5L05ldHdvcmtKb2IuY3BwICAgICB8ICA5MTUgKysrKysrKysrKysrKysrKysrKysKIC4uLi9w
bGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya0pvYi5oICAgICAgIHwgIDE4NCArKysr
CiAuLi4vcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtNYW5hZ2VyLmNwcCB8ICAy
MDkgKysrKysKIC4uLi9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya01hbmFnZXIu
aCAgIHwgICA2NCArKwogNyBmaWxlcyBjaGFuZ2VkLCAxNjU2IGluc2VydGlvbnMoKyksIDAgZGVs
ZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L0RlZmVycmVkRGF0YS5jcHAKIGNyZWF0ZSBtb2RlIDEwMDY0NCBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRhLmgKIGNy
ZWF0ZSBtb2RlIDEwMDY0NCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVy
cnkvTmV0d29ya0pvYi5jcHAKIGNyZWF0ZSBtb2RlIDEwMDY0NCBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya0pvYi5oCiBjcmVhdGUgbW9kZSAxMDA2NDQg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtNYW5hZ2Vy
LmNwcAogY3JlYXRlIG1vZGUgMTAwNjQ0IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
YmxhY2tiZXJyeS9OZXR3b3JrTWFuYWdlci5oCgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
Q2hhbmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IGU0MzcyMzkuLjM2ZTEy
NjMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyNCBAQAorMjAxMS0xMi0wOCAgTGVvIFlhbmcgIDxs
ZW8ueWFuZ0B0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgVXBzdHJlYW0gcGxhdGZvcm0v
bmV0d29yay9ibGFja2JlcnJ5L0RlZmVycmVkRGF0YS57aCwgY3BwfSwgTmV0d29ya0pvYi57aCwg
Y3BwfSBhbmQgTmV0d29ya01hbmFnZXIue2gsIGNwcH0KKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNzkxCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgT3RoZXIgbWFpbiBjb250cmlidXRvcnM6CisgICAgICAg
IEpvZSBNYXNvbiA8am1hc29uQHJpbS5jb20+CisgICAgICAgIExpYW5naHVpIENoZW4gPGxpYWNo
ZW5AcmltLmNvbT4KKyAgICAgICAgQ2hhcmxlcyBXZWkgPGNoYXJsZXMud2VpQHRvcmNobW9iaWxl
LmNvbS5jbj4KKworICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBjYW4ndCBiZSBidWlsdCB5ZXQs
IG5vIG5ldyB0ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9E
ZWZlcnJlZERhdGEuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNr
YmVycnkvRGVmZXJyZWREYXRhLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsv
YmxhY2tiZXJyeS9OZXR3b3JrSm9iLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L05ldHdvcmtKb2IuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0v
bmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtNYW5hZ2VyLmNwcDogQWRkZWQuCisgICAgICAgICog
cGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtNYW5hZ2VyLmg6IEFkZGVkLgorCiAy
MDExLTEyLTA3ICBEbWl0cnkgTG9tb3YgIDxkc2xvbW92QGdvb2dsZS5jb20+CiAKICAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDM4CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvRGVmZXJyZWREYXRh
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9EZWZlcnJl
ZERhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YThiZWYKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVy
cnkvRGVmZXJyZWREYXRhLmNwcApAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwOSwgMjAxMCwgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl
CisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiRGVmZXJyZWREYXRhLmgiCisKKyNpbmNsdWRlICJOZXR3b3JrSm9iLmgiCisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworRGVmZXJyZWREYXRhOjpEZWZlcnJlZERhdGEoTmV0d29ya0pv
YiYgam9iKQorICAgIDogbV9qb2Ioam9iKQorICAgICwgbV9wcm9jZXNzRGF0YVRpbWVyKHRoaXMs
ICZEZWZlcnJlZERhdGE6OmZpcmVQcm9jZXNzRGF0YVRpbWVyKQorICAgICwgbV9kZWZlcnJlZFN0
YXR1c1JlY2VpdmVkKGZhbHNlKQorICAgICwgbV9zdGF0dXMoMCkKKyAgICAsIG1fZGVmZXJyZWRX
TUxPdmVycmlkZShmYWxzZSkKKyAgICAsIG1fYnl0ZXNTZW50KDApCisgICAgLCBtX3RvdGFsQnl0
ZXNUb0JlU2VudCgwKQorICAgICwgbV9kZWZlcnJlZENsb3NlU3RhdHVzKEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpGaWx0ZXJTdHJlYW06OlN0YXR1c1N1Y2Nlc3MpCisgICAgLCBtX2RlZmVycmVkQ2xv
c2UoZmFsc2UpCisgICAgLCBtX2luUHJvY2Vzc0RlZmVycmVkRGF0YShmYWxzZSkKK3sKK30KKwor
dm9pZCBEZWZlcnJlZERhdGE6OmRlZmVyT3BlbihpbnQgc3RhdHVzLCBjb25zdCBTdHJpbmcmIG1l
c3NhZ2UpCit7CisgICAgbV9kZWZlcnJlZFN0YXR1c1JlY2VpdmVkID0gdHJ1ZTsKKyAgICBtX3N0
YXR1cyA9IHN0YXR1czsKKyAgICBtX21lc3NhZ2UgPSBtZXNzYWdlOworfQorCit2b2lkIERlZmVy
cmVkRGF0YTo6ZGVmZXJXTUxPdmVycmlkZSgpCit7CisgICAgbV9kZWZlcnJlZFdNTE92ZXJyaWRl
ID0gdHJ1ZTsKK30KKwordm9pZCBEZWZlcnJlZERhdGE6OmRlZmVySGVhZGVyUmVjZWl2ZWQoY29u
c3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgbV9oZWFkZXJLZXlz
LmFwcGVuZChrZXkpOworICAgIG1faGVhZGVyVmFsdWVzLmFwcGVuZCh2YWx1ZSk7Cit9CisKK3Zv
aWQgRGVmZXJyZWREYXRhOjpkZWZlckRhdGFTZW50KHVuc2lnbmVkIGxvbmcgbG9uZyBieXRlc1Nl
bnQsIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbEJ5dGVzVG9CZVNlbnQpCit7CisgICAgbV9ieXRl
c1NlbnQgPSBieXRlc1NlbnQ7CisgICAgbV90b3RhbEJ5dGVzVG9CZVNlbnQgPSB0b3RhbEJ5dGVz
VG9CZVNlbnQ7Cit9CisKK3ZvaWQgRGVmZXJyZWREYXRhOjpkZWZlckRhdGFSZWNlaXZlZChjb25z
dCBjaGFyKiBidWYsIHNpemVfdCBsZW4pCit7CisgICAgbV9kYXRhU2VnbWVudHMuYXBwZW5kKFZl
Y3RvcjxjaGFyPigpKTsKKyAgICBtX2RhdGFTZWdtZW50cy5yYmVnaW4oKS0+YXBwZW5kKGJ1Ziwg
bGVuKTsKK30KKwordm9pZCBEZWZlcnJlZERhdGE6OmRlZmVyQ2xvc2UoaW50IHN0YXR1cykKK3sK
KyAgICBtX2RlZmVycmVkQ2xvc2VTdGF0dXMgPSBzdGF0dXM7CisgICAgbV9kZWZlcnJlZENsb3Nl
ID0gdHJ1ZTsKK30KKwordm9pZCBEZWZlcnJlZERhdGE6OnByb2Nlc3NEZWZlcnJlZERhdGEoKQor
eworICAgIGlmIChtX2luUHJvY2Vzc0RlZmVycmVkRGF0YSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgUmVjdXJzaW9uR3VhcmQgZ3VhcmQobV9pblByb2Nlc3NEZWZlcnJlZERhdGEpOworCisgICAg
Ly8gU2VuZGluZyBkYXRhIHRvIHdlYmtpdCBjYXVzZXMgaXQgdG8gYmUgcGFyc2VkIGFuZCBqYXZh
c2NyaXB0IGV4ZWN1dGVkLAorICAgIC8vIHdoaWNoIG1pZ2h0IGNhdXNlIGl0IHRvIGNhbmNlbCB0
aGUgam9iIG9yIHNldCBkZWZlcnNMb2FkaW5nIGFnYWluLiBTbworICAgIC8vIHRvIGJlIHNhZmUs
IGNoZWNrIHRoaXMgYWZ0ZXIgZXZlcnkgc3RlcC4KKyAgICBpZiAobV9qb2IuaXNEZWZlcnJpbmdM
b2FkaW5nKCkgfHwgbV9qb2IuaXNDYW5jZWxsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
aWYgKG1fZGVmZXJyZWRTdGF0dXNSZWNlaXZlZCkgeworICAgICAgICBtX2pvYi5oYW5kbGVOb3Rp
ZnlTdGF0dXNSZWNlaXZlZChtX3N0YXR1cywgbV9tZXNzYWdlKTsKKyAgICAgICAgbV9kZWZlcnJl
ZFN0YXR1c1JlY2VpdmVkID0gZmFsc2U7CisgICAgICAgIGlmIChtX2pvYi5pc0RlZmVycmluZ0xv
YWRpbmcoKSB8fCBtX2pvYi5pc0NhbmNlbGxlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIGlmIChtX2RlZmVycmVkV01MT3ZlcnJpZGUpIHsKKyAgICAgICAgbV9qb2IuaGFu
ZGxlTm90aWZ5V01MT3ZlcnJpZGUoKTsKKyAgICAgICAgbV9kZWZlcnJlZFdNTE92ZXJyaWRlID0g
ZmFsc2U7CisgICAgICAgIGlmIChtX2pvYi5pc0RlZmVycmluZ0xvYWRpbmcoKSB8fCBtX2pvYi5p
c0NhbmNlbGxlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBu
dW1IZWFkZXJzID0gbV9oZWFkZXJLZXlzLnNpemUoKTsKKyAgICBBU1NFUlQobV9oZWFkZXJWYWx1
ZXMuc2l6ZSgpID09IG51bUhlYWRlcnMpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBu
dW1IZWFkZXJzOyArK2kpIHsKKyAgICAgICAgbV9qb2IuaGFuZGxlTm90aWZ5SGVhZGVyUmVjZWl2
ZWQobV9oZWFkZXJLZXlzW2ldLCBtX2hlYWRlclZhbHVlc1tpXSk7CisKKyAgICAgICAgaWYgKG1f
am9iLmlzRGVmZXJyaW5nTG9hZGluZygpKSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgYWxsIHRo
ZSBoZWFkZXJzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLgorICAgICAgICAgICAg
bV9oZWFkZXJLZXlzLnJlbW92ZSgwLCBpICsgMSk7CisgICAgICAgICAgICBtX2hlYWRlclZhbHVl
cy5yZW1vdmUoMCwgaSArIDEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAg
ICAgICAgaWYgKG1fam9iLmlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgIC8vIERvbid0IGJv
dGhlciByZW1vdmluZyBoZWFkZXJzOyBqb2Igd2lsbCBiZSBkZWxldGVkLgorICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIG1faGVhZGVyS2V5cy5jbGVhcigpOworICAg
IG1faGVhZGVyVmFsdWVzLmNsZWFyKCk7CisKKyAgICAvLyBPbmx5IHByb2Nlc3MgMzJrIG9mIGRh
dGEgYXQgYSB0aW1lIHRvIGF2b2lkIGJsb2NraW5nIHRoZSBldmVudCBsb29wIGZvciB0b28gbG9u
Zy4KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4RGF0YSA9IDMyICogMTAyNDsKKworICAg
IHVuc2lnbmVkIHRvdGFsRGF0YSA9IDA7CisgICAgd2hpbGUgKCFtX2RhdGFTZWdtZW50cy5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgY29uc3QgVmVjdG9yPGNoYXI+JiBidWZmZXIgPSBtX2RhdGFTZWdt
ZW50cy5maXJzdCgpOworICAgICAgICBtX2pvYi5oYW5kbGVOb3RpZnlEYXRhUmVjZWl2ZWQoYnVm
ZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7CisgICAgICAgIHRvdGFsRGF0YSArPSBidWZmZXIu
c2l6ZSgpOworCisgICAgICAgIGlmIChtX2pvYi5pc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAg
ICAvLyBEb24ndCBib3RoZXIgcmVtb3Zpbmcgc2VnbWVudDsgam9iIHdpbGwgYmUgZGVsZXRlZC4K
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1fZGF0YVNlZ21lbnRz
LnJlbW92ZUZpcnN0KCk7CisKKyAgICAgICAgaWYgKG1fam9iLmlzRGVmZXJyaW5nTG9hZGluZygp
KSB7CisgICAgICAgICAgICAvLyBTdG9wIHByb2Nlc3NpbmcgdW50aWwgZGVmZXJyZWQgbG9hZGlu
ZyBpcyB0dXJuZWQgb2ZmIGFnYWluLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisK
KyAgICAgICAgaWYgKHRvdGFsRGF0YSA+PSBtYXhEYXRhICYmICFtX2RhdGFTZWdtZW50cy5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgICAgIC8vIFBhdXNlIGZvciBub3csIGFuZCBzY2hlZHVsZSBhIHRp
bWVyIHRvIGNvbnRpbnVlIGFmdGVyIHJ1bm5pbmcgdGhlIGV2ZW50IGxvb3AuCisgICAgICAgICAg
ICBzY2hlZHVsZVByb2Nlc3NEZWZlcnJlZERhdGEoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIGlmIChtX3RvdGFsQnl0ZXNUb0JlU2VudCkgeworICAgICAg
ICBtX2pvYi5oYW5kbGVOb3RpZnlEYXRhU2VudChtX2J5dGVzU2VudCwgbV90b3RhbEJ5dGVzVG9C
ZVNlbnQpOworICAgICAgICBtX2J5dGVzU2VudCA9IDA7CisgICAgICAgIG1fdG90YWxCeXRlc1Rv
QmVTZW50ID0gMDsKKyAgICB9CisKKyAgICBpZiAobV9kZWZlcnJlZENsb3NlKSB7CisgICAgICAg
IG1fam9iLmhhbmRsZU5vdGlmeUNsb3NlKG1fZGVmZXJyZWRDbG9zZVN0YXR1cyk7CisgICAgICAg
IG1fZGVmZXJyZWRDbG9zZSA9IGZhbHNlOworICAgICAgICBpZiAobV9qb2IuaXNEZWZlcnJpbmdM
b2FkaW5nKCkgfHwgbV9qb2IuaXNDYW5jZWxsZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICB9Cit9CisKK3ZvaWQgRGVmZXJyZWREYXRhOjpmaXJlUHJvY2Vzc0RhdGFUaW1lcihUaW1lcjxE
ZWZlcnJlZERhdGE+KikKK3sKKyAgICBwcm9jZXNzRGVmZXJyZWREYXRhKCk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvYmxhY2tiZXJyeS9EZWZlcnJlZERhdGEuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvYmxhY2tiZXJyeS9EZWZlcnJlZERhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi45OGEwNmU1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L0RlZmVycmVkRGF0YS5oCkBAIC0wLDAgKzEsOTMg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEgUmVzZWFyY2ggSW4gTW90
aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICog
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
IExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFs
IFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0
ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKwor
I2lmbmRlZiBEZWZlcnJlZERhdGFfaAorI2RlZmluZSBEZWZlcnJlZERhdGFfaAorCisjaW5jbHVk
ZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorCisjaW5jbHVkZSA8d3Rm
L0RlcXVlLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIE5ldHdvcmtKb2I7CisKK2NsYXNzIFJlY3Vyc2lvbkd1YXJkIHsKK3B1YmxpYzoK
KyAgICBSZWN1cnNpb25HdWFyZChib29sICZndWFyZCkKKyAgICAgICAgOiBtX2d1YXJkKGd1YXJk
KQorICAgIHsKKyAgICAgICAgQVNTRVJUKCFtX2d1YXJkKTsKKyAgICAgICAgbV9ndWFyZCA9IHRy
dWU7CisgICAgfQorCisgICAgflJlY3Vyc2lvbkd1YXJkKCkKKyAgICB7CisgICAgICAgIG1fZ3Vh
cmQgPSBmYWxzZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCYgbV9ndWFyZDsKK307CisK
K2NsYXNzIERlZmVycmVkRGF0YSB7CitwdWJsaWM6CisgICAgRGVmZXJyZWREYXRhKE5ldHdvcmtK
b2ImKTsKKyAgICB2b2lkIGRlZmVyT3BlbihpbnQgc3RhdHVzLCBjb25zdCBTdHJpbmcmIG1lc3Nh
Z2UpOworICAgIHZvaWQgZGVmZXJXTUxPdmVycmlkZSgpOworICAgIHZvaWQgZGVmZXJIZWFkZXJS
ZWNlaXZlZChjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7CisgICAgdm9p
ZCBkZWZlckRhdGFSZWNlaXZlZChjb25zdCBjaGFyKiBidWYsIHNpemVfdCBsZW4pOworICAgIHZv
aWQgZGVmZXJEYXRhU2VudCh1bnNpZ25lZCBsb25nIGxvbmcgYnl0ZXNTZW50LCB1bnNpZ25lZCBs
b25nIGxvbmcgdG90YWxCeXRlc1RvQmVTZW50KTsKKyAgICB2b2lkIGRlZmVyQ2xvc2UoaW50IHN0
YXR1cyk7CisKKyAgICBib29sIGhhc0RlZmVycmVkRGF0YSgpIGNvbnN0CisgICAgeworICAgICAg
ICByZXR1cm4gbV9kZWZlcnJlZFN0YXR1c1JlY2VpdmVkIHx8IG1fZGVmZXJyZWRXTUxPdmVycmlk
ZSB8fCAhbV9oZWFkZXJLZXlzLmlzRW1wdHkoKSB8fCAhbV9kYXRhU2VnbWVudHMuaXNFbXB0eSgp
IHx8IG1fZGVmZXJyZWRDbG9zZTsKKyAgICB9CisKKyAgICB2b2lkIHByb2Nlc3NEZWZlcnJlZERh
dGEoKTsKKworICAgIHZvaWQgc2NoZWR1bGVQcm9jZXNzRGVmZXJyZWREYXRhKCkKKyAgICB7Cisg
ICAgICAgIGlmICghbV9wcm9jZXNzRGF0YVRpbWVyLmlzQWN0aXZlKCkpCisgICAgICAgICAgICBt
X3Byb2Nlc3NEYXRhVGltZXIuc3RhcnRPbmVTaG90KDApOworICAgIH0KKworcHJpdmF0ZToKKyAg
ICB2b2lkIGZpcmVQcm9jZXNzRGF0YVRpbWVyKFRpbWVyPERlZmVycmVkRGF0YT4qKTsKKyAgICBO
ZXR3b3JrSm9iJiBtX2pvYjsKKyAgICBUaW1lcjxEZWZlcnJlZERhdGE+IG1fcHJvY2Vzc0RhdGFU
aW1lcjsKKyAgICBib29sIG1fZGVmZXJyZWRTdGF0dXNSZWNlaXZlZDsKKyAgICBpbnQgbV9zdGF0
dXM7CisgICAgU3RyaW5nIG1fbWVzc2FnZTsKKyAgICBib29sIG1fZGVmZXJyZWRXTUxPdmVycmlk
ZTsKKyAgICBWZWN0b3I8U3RyaW5nPiBtX2hlYWRlcktleXM7CisgICAgVmVjdG9yPFN0cmluZz4g
bV9oZWFkZXJWYWx1ZXM7CisgICAgRGVxdWU8VmVjdG9yPGNoYXI+ID4gbV9kYXRhU2VnbWVudHM7
CisgICAgdW5zaWduZWQgbG9uZyBsb25nIG1fYnl0ZXNTZW50OworICAgIHVuc2lnbmVkIGxvbmcg
bG9uZyBtX3RvdGFsQnl0ZXNUb0JlU2VudDsKKyAgICBpbnQgbV9kZWZlcnJlZENsb3NlU3RhdHVz
OworICAgIGJvb2wgbV9kZWZlcnJlZENsb3NlOworICAgIGJvb2wgbV9pblByb2Nlc3NEZWZlcnJl
ZERhdGE7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBEZWZlcnJl
ZERhdGFfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFj
a2JlcnJ5L05ldHdvcmtKb2IuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9i
bGFja2JlcnJ5L05ldHdvcmtKb2IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAuLmEwZWEzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya0pvYi5jcHAKQEAgLTAsMCArMSw5MTUgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0
ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUg
RnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIk5ldHdvcmtKb2IuaCIKKworI2luY2x1ZGUgIkFib3V0RGF0
YS5oIgorI2luY2x1ZGUgIkJhc2U2NC5oIgorI2luY2x1ZGUgIkJsYWNrQmVycnlDb29raWVDYWNo
ZS5oIgorI2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJDcmVkZW50aWFsU3Rv
cmFnZS5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5LmgiCisjaW5jbHVkZSAiSFRUUFBhcnNlcnMuaCIKKyNpbmNsdWRlICJLVVJMLmgi
CisjaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgorI2luY2x1ZGUgIk5ldHdvcmtNYW5hZ2Vy
LmgiCisjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVDbGllbnQuaCIKKyNpbmNsdWRlICJSZXNvdXJj
ZUhhbmRsZUludGVybmFsLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VSZXF1ZXN0LmgiCisKKyNpbmNs
dWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1DbGllbnQuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxh
dGZvcm1Mb2cuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1XZWJLaXRDcmVkaXRzLmg+
CisjaW5jbHVkZSA8QnVpbGRJbmZvcm1hdGlvbi5oPgorI2luY2x1ZGUgPG5ldHdvcmsvTmV0d29y
a1JlcXVlc3QuaD4KKyNpbmNsdWRlIDxuZXR3b3JrL05ldHdvcmtTdHJlYW1GYWN0b3J5Lmg+Cisj
aW5jbHVkZSA8d3RmL0FTQ0lJQ1R5cGUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0
aWMgY29uc3QgaW50IHNfcmVkaXJlY3RNYXhpbXVtID0gMTA7CisKK2lubGluZSBzdGF0aWMgYm9v
bCBpc0luZm8oaW50IHN0YXR1c0NvZGUpCit7CisgICAgcmV0dXJuIDEwMCA8PSBzdGF0dXNDb2Rl
ICYmIHN0YXR1c0NvZGUgPCAyMDA7Cit9CisKK2lubGluZSBzdGF0aWMgYm9vbCBpc1JlZGlyZWN0
KGludCBzdGF0dXNDb2RlKQoreworICAgIHJldHVybiAzMDAgPD0gc3RhdHVzQ29kZSAmJiBzdGF0
dXNDb2RlIDwgNDAwICYmIHN0YXR1c0NvZGUgIT0gMzA0OworfQorCitpbmxpbmUgc3RhdGljIGJv
b2wgaXNVbmF1dGhvcml6ZWQoaW50IHN0YXR1c0NvZGUpCit7CisgICAgcmV0dXJuIHN0YXR1c0Nv
ZGUgPT0gNDAxOworfQorCitzdGF0aWMgdm9pZCBlc2NhcGVEZWNvZGUoY29uc3QgY2hhciogc3Jj
LCBpbnQgbGVuZ3RoLCBWZWN0b3I8Y2hhcj4mIG91dCkKK3sKKyAgICBvdXQucmVzaXplKGxlbmd0
aCk7CisgICAgY29uc3QgY2hhciogY29uc3Qgc3JjRW5kID0gc3JjICsgbGVuZ3RoOworICAgIGNo
YXIqIGRzdCA9IG91dC5kYXRhKCk7CisgICAgZm9yICg7IHNyYyA8IHNyY0VuZDsgKSB7CisgICAg
ICAgIGNoYXIgaW5wdXRDaGFyID0gKnNyYysrOworICAgICAgICBpZiAoaW5wdXRDaGFyID09ICcl
JyAmJiBzcmMgKyAyIDw9IHNyY0VuZCkgeworICAgICAgICAgICAgaW50IGRpZ2l0MSA9IDA7Cisg
ICAgICAgICAgICBjaGFyIGNoYXJhY3RlciA9ICpzcmMrKzsKKyAgICAgICAgICAgIGlmIChpc0FT
Q0lJSGV4RGlnaXQoY2hhcmFjdGVyKSkKKyAgICAgICAgICAgICAgICBkaWdpdDEgPSB0b0FTQ0lJ
SGV4VmFsdWUoY2hhcmFjdGVyKTsKKworICAgICAgICAgICAgaW50IGRpZ2l0MiA9IDA7CisgICAg
ICAgICAgICBjaGFyYWN0ZXIgPSAqc3JjKys7CisgICAgICAgICAgICBpZiAoaXNBU0NJSUhleERp
Z2l0KGNoYXJhY3RlcikpCisgICAgICAgICAgICAgICAgZGlnaXQyID0gdG9BU0NJSUhleFZhbHVl
KGNoYXJhY3Rlcik7CisKKyAgICAgICAgICAgICpkc3QrKyA9IChkaWdpdDEgPDwgNCkgfCBkaWdp
dDI7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgKmRzdCsrID0gaW5wdXRDaGFyOworICAg
IH0KKyAgICBvdXQucmVzaXplKGRzdCAtIG91dC5kYXRhKCkpOworfQorCitOZXR3b3JrSm9iOjpO
ZXR3b3JrSm9iKCkKKyAgICA6IG1fcGxheWVySWQoMCkKKyAgICAsIG1fbG9hZERhdGFUaW1lcih0
aGlzLCAmTmV0d29ya0pvYjo6ZmlyZUxvYWREYXRhVGltZXIpCisgICAgLCBtX2xvYWRBYm91dFRp
bWVyKHRoaXMsICZOZXR3b3JrSm9iOjpmaXJlTG9hZEFib3V0VGltZXIpCisgICAgLCBtX2RlbGV0
ZUpvYlRpbWVyKHRoaXMsICZOZXR3b3JrSm9iOjpmaXJlRGVsZXRlSm9iVGltZXIpCisgICAgLCBt
X3N0cmVhbUZhY3RvcnkoMCkKKyAgICAsIG1faXNGaWxlKGZhbHNlKQorICAgICwgbV9pc0RhdGEo
ZmFsc2UpCisgICAgLCBtX2lzQWJvdXQoZmFsc2UpCisgICAgLCBtX2lzRlRQKGZhbHNlKQorICAg
ICwgbV9pc0ZUUERpcih0cnVlKQorICAgICwgbV9pc1J1bm5pbmcodHJ1ZSkgLy8gQWx3YXlzIHN0
YXJ0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY3JlYXRpb24uCisgICAgLCBtX2NhbmNlbGxlZChmYWxz
ZSkKKyAgICAsIG1fc3RhdHVzUmVjZWl2ZWQoZmFsc2UpCisgICAgLCBtX2RhdGFSZWNlaXZlZChm
YWxzZSkKKyAgICAsIG1fcmVzcG9uc2VTZW50KGZhbHNlKQorICAgICwgbV9leHRlbmRlZFN0YXR1
c0NvZGUoMCkKKyAgICAsIG1fcmVkaXJlY3RDb3VudCgwKQorICAgICwgbV9kZWZlcnJlZERhdGEo
KnRoaXMpCisgICAgLCBtX2RlZmVyTG9hZGluZ0NvdW50KDApCisgICAgLCBtX2NhbGxpbmdDbGll
bnQoZmFsc2UpCisgICAgLCBtX2lzWEhSKGZhbHNlKQorICAgICwgbV9uZWVkc1JldHJ5QXNGVFBE
aXJlY3RvcnkoZmFsc2UpCit7Cit9CisKK2Jvb2wgTmV0d29ya0pvYjo6aW5pdGlhbGl6ZShpbnQg
cGxheWVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nJiBwYWdl
R3JvdXBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtVUkwmIHVybCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
TmV0d29ya1JlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFz
c1JlZlB0cjxSZXNvdXJjZUhhbmRsZT4gaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrU3RyZWFtRmFjdG9yeSogc3RyZWFtRmFj
dG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcmFtZSYgZnJhbWUsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmVyTG9hZGluZ0NvdW50LAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGludCByZWRpcmVjdENvdW50KQoreworICAgIG1fcGxheWVy
SWQgPSBwbGF5ZXJJZDsKKyAgICBtX3BhZ2VHcm91cE5hbWUgPSBwYWdlR3JvdXBOYW1lOworCisg
ICAgbV9yZXNwb25zZS5zZXRVUkwodXJsKTsKKyAgICBtX2lzRmlsZSA9IHVybC5wcm90b2NvbElz
KCJmaWxlIikgfHwgdXJsLnByb3RvY29sSXMoImxvY2FsIik7CisgICAgbV9pc0RhdGEgPSB1cmwu
cHJvdG9jb2xJcygiZGF0YSIpOworICAgIG1faXNBYm91dCA9IHVybC5wcm90b2NvbElzKCJhYm91
dCIpOworICAgIG1faXNGVFAgPSB1cmwucHJvdG9jb2xJcygiZnRwIik7CisKKyAgICBtX2hhbmRs
ZSA9IGhhbmRsZTsKKworICAgIG1fc3RyZWFtRmFjdG9yeSA9IHN0cmVhbUZhY3Rvcnk7CisgICAg
bV9mcmFtZSA9ICZmcmFtZTsKKyAgICBtX3JlZGlyZWN0Q291bnQgPSByZWRpcmVjdENvdW50Owor
ICAgIG1fZGVmZXJMb2FkaW5nQ291bnQgPSBkZWZlckxvYWRpbmdDb3VudDsKKworICAgIC8vIFdl
IGRvbid0IG5lZWQgdG8gZXhwbGljaXRseSBjYWxsIG5vdGlmeUhlYWRlclJlY2VpdmVkLCBhcyB0
aGUgQ29udGVudC1UeXBlCisgICAgLy8gd2lsbCB1bHRpbWF0ZWx5IGdldCBwYXJzZWQgd2hlbiBz
ZW5kUmVzcG9uc2VJZk5lZWRlZCBnZXRzIGNhbGxlZC4KKyAgICBpZiAoIXJlcXVlc3QuZ2V0T3Zl
cnJpZGVDb250ZW50VHlwZSgpLmVtcHR5KCkpCisgICAgICAgIG1fY29udGVudFR5cGUgPSBTdHJp
bmcocmVxdWVzdC5nZXRPdmVycmlkZUNvbnRlbnRUeXBlKCkuY19zdHIoKSk7CisKKyAgICAvLyBO
byBuZWVkIHRvIGNyZWF0ZSB0aGUgc3RyZWFtcyBmb3IgZGF0YSBhbmQgYWJvdXQuCisgICAgaWYg
KG1faXNEYXRhIHx8IG1faXNBYm91dCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6RmlsdGVyU3RyZWFtKiB3cmFwcGVkU3RyZWFtID0gbV9zdHJlYW1G
YWN0b3J5LT5jcmVhdGVOZXR3b3JrU3RyZWFtKHJlcXVlc3QsIG1fcGxheWVySWQpOworICAgIGlm
ICghd3JhcHBlZFN0cmVhbSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHNldFdyYXBwZWRT
dHJlYW0od3JhcHBlZFN0cmVhbSk7CisKKyAgICBtX2lzWEhSID0gcmVxdWVzdC5nZXRUYXJnZXRU
eXBlKCkgPT0gQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpUYXJnZXRJc1hN
TEhUVFBSZXF1ZXN0OworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTmV0d29ya0pvYjo6
bG9hZEFib3V0VVJMKCkKK3sKKyAgICAvLyBGaXJzdCA2IGNoYXJzIGFyZSAiYWJvdXQ6Ii4KKyAg
ICBTdHJpbmcgYWJvdXRXaGF0KG1fcmVzcG9uc2UudXJsKCkuc3RyaW5nKCkuc3Vic3RyaW5nKDYp
KTsKKworICAgIGlmICghYWJvdXRXaGF0LmlzRW1wdHkoKQorICAgICAgICAgICAgJiYgIWVxdWFs
SWdub3JpbmdDYXNlKGFib3V0V2hhdCwgImJsYW5rIikKKyAgICAgICAgICAgICYmICFlcXVhbEln
bm9yaW5nQ2FzZShhYm91dFdoYXQsICJjcmVkaXRzIikKKyNpZiAhZGVmaW5lZChQVUJMSUNfQlVJ
TEQpIHx8ICFQVUJMSUNfQlVJTEQKKyAgICAgICAgICAgICYmICFhYm91dFdoYXQuc3RhcnRzV2l0
aCgiY2FjaGU/cXVlcnk9IiwgZmFsc2UpCisgICAgICAgICAgICAmJiAhZXF1YWxJZ25vcmluZ0Nh
c2UoYWJvdXRXaGF0LCAiY2FjaGUiKQorICAgICAgICAgICAgJiYgIWVxdWFsSWdub3JpbmdDYXNl
KGFib3V0V2hhdCwgImNhY2hlL2VuYWJsZSIpCisgICAgICAgICAgICAmJiAhZXF1YWxJZ25vcmlu
Z0Nhc2UoYWJvdXRXaGF0LCAiY2FjaGUvZGlzYWJsZSIpCisgICAgICAgICAgICAmJiAhZXF1YWxJ
Z25vcmluZ0Nhc2UoYWJvdXRXaGF0LCAidmVyc2lvbiIpCisgICAgICAgICAgICAmJiAoIUJsYWNr
QmVycnk6OlBsYXRmb3JtOjpkZWJ1Z1NldHRpbmcoKQorICAgICAgICAgICAgICAgIHx8ICghZXF1
YWxJZ25vcmluZ0Nhc2UoYWJvdXRXaGF0LCAiY29uZmlnIikKKyAgICAgICAgICAgICAgICAgICAg
JiYgIWVxdWFsSWdub3JpbmdDYXNlKGFib3V0V2hhdCwgImJ1aWxkIikKKyAgICAgICAgICAgICAg
ICAgICAgJiYgIWVxdWFsSWdub3JpbmdDYXNlKGFib3V0V2hhdCwgIm1lbW9yeSIpKSkKKyNlbmRp
ZgorICAgICAgICAgICAgKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtX2xvYWRBYm91
dFRpbWVyLnN0YXJ0T25lU2hvdCgwKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IE5ldHdv
cmtKb2I6OmNhbmNlbEpvYigpCit7CisgICAgbV9jYW5jZWxsZWQgPSB0cnVlOworCisgICAgLy8g
Q2FuY2VsIGpvYnMgbG9hZGluZyBsb2NhbCBkYXRhIGJ5IGtpbGxpbmcgdGhlIHRpbWVyLCBhbmQg
am9icworICAgIC8vIGdldHRpbmcgZGF0YSBmcm9tIHRoZSBuZXR3b3JrIGJ5IGNhbGxpbmcgdGhl
IGluaGVyaXRlZCBVUkxTdHJlYW06OmNhbmNlbC4KKyAgICBpZiAobV9sb2FkRGF0YVRpbWVyLmlz
QWN0aXZlKCkpIHsKKyAgICAgICAgbV9sb2FkRGF0YVRpbWVyLnN0b3AoKTsKKyAgICAgICAgbm90
aWZ5Q2xvc2UoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZpbHRlclN0cmVhbTo6U3RhdHVzQ2FuY2Vs
bGVkKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKG1fbG9hZEFib3V0VGlt
ZXIuaXNBY3RpdmUoKSkgeworICAgICAgICBtX2xvYWRBYm91dFRpbWVyLnN0b3AoKTsKKyAgICAg
ICAgbm90aWZ5Q2xvc2UoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZpbHRlclN0cmVhbTo6U3RhdHVz
Q2FuY2VsbGVkKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIHN0cmVh
bUNhbmNlbCgpOworfQorCit2b2lkIE5ldHdvcmtKb2I6OnVwZGF0ZURlZmVyTG9hZGluZ0NvdW50
KGludCBkZWx0YSkKK3sKKyAgICBtX2RlZmVyTG9hZGluZ0NvdW50ICs9IGRlbHRhOworICAgIEFT
U0VSVChtX2RlZmVyTG9hZGluZ0NvdW50ID49IDApOworCisgICAgaWYgKCFpc0RlZmVycmluZ0xv
YWRpbmcoKSkgeworICAgICAgICAvLyBUaGVyZSBtaWdodCBhbHJlYWR5IGJlIGEgdGltZXIgc2V0
IHRvIGNhbGwgdGhpcywgYnV0IGl0J3Mgc2FmZSB0byBzY2hlZHVsZSBpdCBhZ2Fpbi4KKyAgICAg
ICAgbV9kZWZlcnJlZERhdGEuc2NoZWR1bGVQcm9jZXNzRGVmZXJyZWREYXRhKCk7CisgICAgfQor
fQorCit2b2lkIE5ldHdvcmtKb2I6Om5vdGlmeVN0YXR1c1JlY2VpdmVkKGludCBzdGF0dXMsIGNv
bnN0IGNoYXIqIG1lc3NhZ2UpCit7CisgICAgaWYgKHNob3VsZERlZmVyTG9hZGluZygpKQorICAg
ICAgICBtX2RlZmVycmVkRGF0YS5kZWZlck9wZW4oc3RhdHVzLCBtZXNzYWdlKTsKKyAgICBlbHNl
CisgICAgICAgIGhhbmRsZU5vdGlmeVN0YXR1c1JlY2VpdmVkKHN0YXR1cywgbWVzc2FnZSk7Cit9
CisKK3ZvaWQgTmV0d29ya0pvYjo6aGFuZGxlTm90aWZ5U3RhdHVzUmVjZWl2ZWQoaW50IHN0YXR1
cywgY29uc3QgU3RyaW5nJiBtZXNzYWdlKQoreworICAgIC8vIENoZWNrIGZvciBtZXNzYWdlcyBv
dXQgb2Ygb3JkZXIgb3IgYWZ0ZXIgY2FuY2VsLgorICAgIGlmICgobV9zdGF0dXNSZWNlaXZlZCAm
JiBtX2V4dGVuZGVkU3RhdHVzQ29kZSAhPSA0MDEpIHx8IG1fcmVzcG9uc2VTZW50IHx8IG1fY2Fu
Y2VsbGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoaXNJbmZvKHN0YXR1cykpCisgICAg
ICAgIHJldHVybjsgLy8gaWdub3JlCisKKyAgICBtX3N0YXR1c1JlY2VpdmVkID0gdHJ1ZTsKKwor
ICAgIC8vIENvbnZlcnQgbm9uLUhUVFAgc3RhdHVzIGNvZGVzIHRvIGdlbmVyaWMgSFRUUCBjb2Rl
cy4KKyAgICBtX2V4dGVuZGVkU3RhdHVzQ29kZSA9IHN0YXR1czsKKyAgICBpZiAoIXN0YXR1cykK
KyAgICAgICAgbV9yZXNwb25zZS5zZXRIVFRQU3RhdHVzQ29kZSgyMDApOworICAgIGVsc2UgaWYg
KHN0YXR1cyA8IDApCisgICAgICAgIG1fcmVzcG9uc2Uuc2V0SFRUUFN0YXR1c0NvZGUoNDA0KTsK
KyAgICBlbHNlCisgICAgICAgIG1fcmVzcG9uc2Uuc2V0SFRUUFN0YXR1c0NvZGUoc3RhdHVzKTsK
KworICAgIG1fcmVzcG9uc2Uuc2V0SFRUUFN0YXR1c1RleHQobWVzc2FnZSk7Cit9CisKK3ZvaWQg
TmV0d29ya0pvYjo6bm90aWZ5V01MT3ZlcnJpZGUoKQoreworICAgIGlmIChzaG91bGREZWZlckxv
YWRpbmcoKSkKKyAgICAgICAgbV9kZWZlcnJlZERhdGEuZGVmZXJXTUxPdmVycmlkZSgpOworICAg
IGVsc2UKKyAgICAgICAgaGFuZGxlTm90aWZ5V01MT3ZlcnJpZGUoKTsKK30KKwordm9pZCBOZXR3
b3JrSm9iOjpub3RpZnlIZWFkZXJSZWNlaXZlZChjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIq
IHZhbHVlKQoreworICAgIGlmIChzaG91bGREZWZlckxvYWRpbmcoKSkKKyAgICAgICAgbV9kZWZl
cnJlZERhdGEuZGVmZXJIZWFkZXJSZWNlaXZlZChrZXksIHZhbHVlKTsKKyAgICBlbHNlIHsKKyAg
ICAgICAgU3RyaW5nIGtleVN0cmluZyhrZXkpOworICAgICAgICBTdHJpbmcgdmFsdWVTdHJpbmc7
CisgICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShrZXlTdHJpbmcsICJMb2NhdGlvbiIpKSB7
CisgICAgICAgICAgICAvLyBMb2NhdGlvbiwgbGlrZSBhbGwgaGVhZGVycywgaXMgc3VwcG9zZWQg
dG8gYmUgTGF0aW4tMS4gQnV0IHNvbWUgc2l0ZXMgKHdpa2lwZWRpYSkgc2VuZCBpdCBpbiBVVEYt
OC4KKyAgICAgICAgICAgIC8vIEFsbCBieXRlIHN0cmluZ3MgdGhhdCBhcmUgdmFsaWQgVVRGLTgg
YXJlIGFsc28gdmFsaWQgTGF0aW4tMSAoYWx0aG91Z2ggb3V0c2lkZSBBU0NJSSwgdGhlIG1lYW5p
bmcgd2lsbAorICAgICAgICAgICAgLy8gZGlmZmVyKSwgYnV0IHRoZSByZXZlcnNlIGlzbid0IHRy
dWUuIFNvIHRyeSBVVEYtOCBmaXJzdCBhbmQgZmFsbCBiYWNrIHRvIExhdGluLTEgaWYgaXQncyBp
bnZhbGlkLgorICAgICAgICAgICAgLy8gKEhpZ2ggTGF0aW4tMSBzaG91bGQgYmUgdXJsLWVuY29k
ZWQgYW55d2F5LikKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBGSVhNRTogbWF5YmUg
d2Ugc2hvdWxkIGRvIHRoaXMgd2l0aCBvdGhlciBoZWFkZXJzPworICAgICAgICAgICAgLy8gU2tp
cCBpdCBmb3Igbm93IC0gd2UgZG9uJ3Qgd2FudCB0byByZXdyaXRlIHJhbmRvbSBieXRlcyB1bmxl
c3Mgd2UncmUgc3VyZS4gKERlZmluaXRlbHkgZG9uJ3Qgd2FudCB0bworICAgICAgICAgICAgLy8g
cmV3cml0ZSBjb29raWVzLCBmb3IgaW5zdGFuY2UuKSBOZWVkcyBtb3JlIGludmVzdGlnYXRpb24u
CisgICAgICAgICAgICB2YWx1ZVN0cmluZyA9IFN0cmluZzo6ZnJvbVVURjgodmFsdWUpOworICAg
ICAgICAgICAgaWYgKHZhbHVlU3RyaW5nLmlzTnVsbCgpKQorICAgICAgICAgICAgICAgIHZhbHVl
U3RyaW5nID0gdmFsdWU7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdmFsdWVTdHJpbmcg
PSB2YWx1ZTsKKworICAgICAgICBoYW5kbGVOb3RpZnlIZWFkZXJSZWNlaXZlZChrZXlTdHJpbmcs
IHZhbHVlU3RyaW5nKTsKKyAgICB9Cit9CisKK3ZvaWQgTmV0d29ya0pvYjo6bm90aWZ5U3RyaW5n
SGVhZGVyUmVjZWl2ZWQoY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7
CisgICAgaWYgKHNob3VsZERlZmVyTG9hZGluZygpKQorICAgICAgICBtX2RlZmVycmVkRGF0YS5k
ZWZlckhlYWRlclJlY2VpdmVkKGtleSwgdmFsdWUpOworICAgIGVsc2UKKyAgICAgICAgaGFuZGxl
Tm90aWZ5SGVhZGVyUmVjZWl2ZWQoa2V5LCB2YWx1ZSk7Cit9CisKK3ZvaWQgTmV0d29ya0pvYjo6
aGFuZGxlTm90aWZ5SGVhZGVyUmVjZWl2ZWQoY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCit7CisgICAgLy8gQ2hlY2sgZm9yIG1lc3NhZ2VzIG91dCBvZiBvcmRlciBvciBh
ZnRlciBjYW5jZWwuCisgICAgaWYgKCFtX3N0YXR1c1JlY2VpdmVkIHx8IG1fcmVzcG9uc2VTZW50
IHx8IG1fY2FuY2VsbGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBTdHJpbmcgbG93ZXJLZXkg
PSBrZXkubG93ZXIoKTsKKyAgICBpZiAobG93ZXJLZXkgPT0gImNvbnRlbnQtdHlwZSIpCisgICAg
ICAgIG1fY29udGVudFR5cGUgPSB2YWx1ZS5sb3dlcigpOworCisgICAgaWYgKGxvd2VyS2V5ID09
ICJjb250ZW50LWRpc3Bvc2l0aW9uIikKKyAgICAgICAgbV9jb250ZW50RGlzcG9zaXRpb24gPSB2
YWx1ZTsKKworICAgIGlmIChsb3dlcktleSA9PSAic2V0LWNvb2tpZSIpIHsKKyAgICAgICAgaWYg
KG1fZnJhbWUgJiYgbV9mcmFtZS0+bG9hZGVyKCkgJiYgbV9mcmFtZS0+bG9hZGVyKCktPmNsaWVu
dCgpCisgICAgICAgICAgICAmJiBzdGF0aWNfY2FzdDxGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVy
cnkqPihtX2ZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50KCkpLT5jb29raWVzRW5hYmxlZCgpKQorICAg
ICAgICAgICAgaGFuZGxlU2V0Q29va2llSGVhZGVyKHZhbHVlKTsKKyAgICAgICAgQmxhY2tCZXJy
eUNvb2tpZUNhY2hlOjppbnN0YW5jZSgpLmNsZWFyQWxsQ29va2llc0Zvckhvc3QobV9wYWdlR3Jv
dXBOYW1lLCBtX3Jlc3BvbnNlLnVybCgpKTsKKyAgICB9CisKKyAgICBpZiAobG93ZXJLZXkgPT0g
Ind3dy1hdXRoZW50aWNhdGUiKQorICAgICAgICBoYW5kbGVBdXRoSGVhZGVyKHZhbHVlKTsKKwor
ICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShrZXksIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3
b3JrUmVxdWVzdDo6SEVBREVSX0JMQUNLQkVSUllfRlRQKSkKKyAgICAgICAgaGFuZGxlRlRQSGVh
ZGVyKHZhbHVlKTsKKworICAgIG1fcmVzcG9uc2Uuc2V0SFRUUEhlYWRlckZpZWxkKGtleSwgdmFs
dWUpOworfQorCit2b2lkIE5ldHdvcmtKb2I6OmhhbmRsZVNldENvb2tpZUhlYWRlcihjb25zdCBT
dHJpbmcmIHZhbHVlKQoreworICAgIEtVUkwgdXJsID0gbV9yZXNwb25zZS51cmwoKTsKKyAgICBD
b29raWVNYW5hZ2VyJiBtYW5hZ2VyID0gY29va2llTWFuYWdlcigpOworICAgIGlmICgobWFuYWdl
ci5jb29raWVQb2xpY3koKSA9PSBDb29raWVTdG9yYWdlQWNjZXB0UG9saWN5T25seUZyb21NYWlu
RG9jdW1lbnREb21haW4pCisgICAgICAmJiAobV9oYW5kbGUtPmZpcnN0UmVxdWVzdCgpLmZpcnN0
UGFydHlGb3JDb29raWVzKCkgIT0gdXJsKQorICAgICAgJiYgbWFuYWdlci5nZXRDb29raWUodXJs
LCBXaXRoSHR0cE9ubHlDb29raWVzKS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKyAgICBt
YW5hZ2VyLnNldENvb2tpZXModXJsLCB2YWx1ZSk7Cit9CisKK3ZvaWQgTmV0d29ya0pvYjo6bm90
aWZ5RGF0YVJlY2VpdmVkUGxhaW4oY29uc3QgY2hhciogYnVmLCBzaXplX3QgbGVuKQoreworICAg
IGlmIChzaG91bGREZWZlckxvYWRpbmcoKSkKKyAgICAgICAgbV9kZWZlcnJlZERhdGEuZGVmZXJE
YXRhUmVjZWl2ZWQoYnVmLCBsZW4pOworICAgIGVsc2UKKyAgICAgICAgaGFuZGxlTm90aWZ5RGF0
YVJlY2VpdmVkKGJ1ZiwgbGVuKTsKK30KKwordm9pZCBOZXR3b3JrSm9iOjpoYW5kbGVOb3RpZnlE
YXRhUmVjZWl2ZWQoY29uc3QgY2hhciogYnVmLCBzaXplX3QgbGVuKQoreworICAgIC8vIENoZWNr
IGZvciBtZXNzYWdlcyBvdXQgb2Ygb3JkZXIgb3IgYWZ0ZXIgY2FuY2VsLgorICAgIGlmICgoIW1f
aXNGaWxlICYmICFtX3N0YXR1c1JlY2VpdmVkKSB8fCBtX2NhbmNlbGxlZCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKCFidWYgfHwgIWxlbikKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9k
YXRhUmVjZWl2ZWQgPSB0cnVlOworCisgICAgLy8gUHJvdGVjdCBhZ2FpbnN0IHJlZW50cmFuY3ku
CisgICAgdXBkYXRlRGVmZXJMb2FkaW5nQ291bnQoMSk7CisKKyAgICBpZiAoc2hvdWxkU2VuZENs
aWVudERhdGEoKSkgeworICAgICAgICBzZW5kUmVzcG9uc2VJZk5lZWRlZCgpOworICAgICAgICBp
ZiAoY2xpZW50SXNPaygpKSB7CisgICAgICAgICAgICBpZiAobV9tdWx0aXBhcnREZWxlZ2F0ZSkK
KyAgICAgICAgICAgICAgICBtX211bHRpcGFydERlbGVnYXRlLT5vblJlY2VpdmVkRGF0YShidWYs
IGxlbiwgbGVuKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFJlY3Vyc2lv
bkd1YXJkIGd1YXJkKG1fY2FsbGluZ0NsaWVudCk7CisgICAgICAgICAgICAgICAgbV9oYW5kbGUt
PmNsaWVudCgpLT5kaWRSZWNlaXZlRGF0YShtX2hhbmRsZS5nZXQoKSwgYnVmLCBsZW4sIGxlbik7
CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHVwZGF0ZURlZmVyTG9hZGlu
Z0NvdW50KC0xKTsKK30KKwordm9pZCBOZXR3b3JrSm9iOjpub3RpZnlEYXRhU2VudCh1bnNpZ25l
ZCBsb25nIGxvbmcgYnl0ZXNTZW50LCB1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxCeXRlc1RvQmVT
ZW50KQoreworICAgIGlmIChzaG91bGREZWZlckxvYWRpbmcoKSkKKyAgICAgICAgbV9kZWZlcnJl
ZERhdGEuZGVmZXJEYXRhU2VudChieXRlc1NlbnQsIHRvdGFsQnl0ZXNUb0JlU2VudCk7CisgICAg
ZWxzZQorICAgICAgICBoYW5kbGVOb3RpZnlEYXRhU2VudChieXRlc1NlbnQsIHRvdGFsQnl0ZXNU
b0JlU2VudCk7Cit9CisKK3ZvaWQgTmV0d29ya0pvYjo6aGFuZGxlTm90aWZ5RGF0YVNlbnQodW5z
aWduZWQgbG9uZyBsb25nIGJ5dGVzU2VudCwgdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsQnl0ZXNU
b0JlU2VudCkKK3sKKyAgICBpZiAobV9jYW5jZWxsZWQpCisgICAgICAgIHJldHVybjsKKworICAg
IC8vIFByb3RlY3QgYWdhaW5zdCByZWVudHJhbmN5LgorICAgIHVwZGF0ZURlZmVyTG9hZGluZ0Nv
dW50KDEpOworCisgICAgaWYgKGNsaWVudElzT2soKSkgeworICAgICAgICBSZWN1cnNpb25HdWFy
ZCBndWFyZChtX2NhbGxpbmdDbGllbnQpOworICAgICAgICBtX2hhbmRsZS0+Y2xpZW50KCktPmRp
ZFNlbmREYXRhKG1faGFuZGxlLmdldCgpLCBieXRlc1NlbnQsIHRvdGFsQnl0ZXNUb0JlU2VudCk7
CisgICAgfQorCisgICAgdXBkYXRlRGVmZXJMb2FkaW5nQ291bnQoLTEpOworfQorCit2b2lkIE5l
dHdvcmtKb2I6Om5vdGlmeUNsb3NlKGludCBzdGF0dXMpCit7CisgICAgaWYgKHNob3VsZERlZmVy
TG9hZGluZygpKQorICAgICAgICBtX2RlZmVycmVkRGF0YS5kZWZlckNsb3NlKHN0YXR1cyk7Cisg
ICAgZWxzZQorICAgICAgICBoYW5kbGVOb3RpZnlDbG9zZShzdGF0dXMpOworfQorCit2b2lkIE5l
dHdvcmtKb2I6OmhhbmRsZU5vdGlmeUNsb3NlKGludCBzdGF0dXMpCit7CisgICAgbV9pc1J1bm5p
bmcgPSBmYWxzZTsKKworICAgIGlmICghbV9jYW5jZWxsZWQpIHsKKyAgICAgICAgaWYgKCFtX3N0
YXR1c1JlY2VpdmVkKSB7CisgICAgICAgICAgICAvLyBDb25uZWN0aW9uIGZhaWxlZCBiZWZvcmUg
c2VuZGluZyBub3RpZnlTdGF0dXNSZWNlaXZlZDogdXNlIGdlbmVyaWMgTmV0d29ya0Vycm9yLgor
ICAgICAgICAgICAgbm90aWZ5U3RhdHVzUmVjZWl2ZWQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZp
bHRlclN0cmVhbTo6U3RhdHVzTmV0d29ya0Vycm9yLCAwKTsKKyAgICAgICAgfQorCisgICAgICAg
IC8vIElmIGFuIEhUVFAgYXV0aGVudGljYXRpb24tZW5hYmxlZCByZXF1ZXN0IGlzIHN1Y2Nlc3Nm
dWwsIHNhdmUKKyAgICAgICAgLy8gdGhlIGNyZWRlbnRpYWxzIGZvciBsYXRlciByZXVzZS4gSWYg
dGhlIHJlcXVlc3QgZmFpbHMsIGRlbGV0ZQorICAgICAgICAvLyB0aGUgc2F2ZWQgY3JlZGVudGlh
bHMuCisgICAgICAgIGlmICghaXNFcnJvcihtX2V4dGVuZGVkU3RhdHVzQ29kZSkpCisgICAgICAg
ICAgICBzdG9yZUNyZWRlbnRpYWxzKCk7CisgICAgICAgIGVsc2UgaWYgKGlzVW5hdXRob3JpemVk
KG1fZXh0ZW5kZWRTdGF0dXNDb2RlKSkKKyAgICAgICAgICAgIHB1cmdlQ3JlZGVudGlhbHMoKTsK
KworICAgICAgICBpZiAoc2hvdWxkTm90aWZ5Q2xpZW50RmluaXNoZWQoKSkgeworICAgICAgICAg
ICAgaWYgKGlzUmVkaXJlY3QobV9leHRlbmRlZFN0YXR1c0NvZGUpICYmIChtX3JlZGlyZWN0Q291
bnQgPj0gc19yZWRpcmVjdE1heGltdW0pKQorICAgICAgICAgICAgICAgIG1fZXh0ZW5kZWRTdGF0
dXNDb2RlID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZpbHRlclN0cmVhbTo6U3RhdHVzVG9vTWFu
eVJlZGlyZWN0czsKKworICAgICAgICAgICAgc2VuZFJlc3BvbnNlSWZOZWVkZWQoKTsKKyAgICAg
ICAgICAgIGlmIChjbGllbnRJc09rKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9tdWx0aXBh
cnREZWxlZ2F0ZSkKKyAgICAgICAgICAgICAgICAgICAgbV9tdWx0aXBhcnREZWxlZ2F0ZS0+b25D
b21wbGV0ZWRSZXF1ZXN0KCk7CisKKyAgICAgICAgICAgICAgICBSZWN1cnNpb25HdWFyZCBndWFy
ZChtX2NhbGxpbmdDbGllbnQpOworICAgICAgICAgICAgICAgIGlmIChpc0Vycm9yKG1fZXh0ZW5k
ZWRTdGF0dXNDb2RlKSAmJiAhbV9kYXRhUmVjZWl2ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAg
U3RyaW5nIGRvbWFpbiA9IG1fZXh0ZW5kZWRTdGF0dXNDb2RlIDwgMCA/IFJlc291cmNlRXJyb3I6
OnBsYXRmb3JtRXJyb3JEb21haW4gOiBSZXNvdXJjZUVycm9yOjpodHRwRXJyb3JEb21haW47Cisg
ICAgICAgICAgICAgICAgICAgIFJlc291cmNlRXJyb3IgZXJyb3IoZG9tYWluLCBtX2V4dGVuZGVk
U3RhdHVzQ29kZSwgbV9yZXNwb25zZS51cmwoKS5zdHJpbmcoKSwgbV9yZXNwb25zZS5odHRwU3Rh
dHVzVGV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbV9oYW5kbGUtPmNsaWVudCgpLT5kaWRG
YWlsKG1faGFuZGxlLmdldCgpLCBlcnJvcik7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAg
ICAgICAgICAgICAgICAgIG1faGFuZGxlLT5jbGllbnQoKS0+ZGlkRmluaXNoTG9hZGluZyhtX2hh
bmRsZS5nZXQoKSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAv
LyBXaG9ldmVyIGNhbGxlZCBub3RpZnlDbG9zZSBzdGlsbCBoYXZlIGEgcmVmZXJlbmNlIHRvIHRo
ZSBqb2IsIHNvCisgICAgLy8gc2NoZWR1bGUgdGhlIGRlbGV0aW9uIHdpdGggYSB0aW1lci4KKyAg
ICBtX2RlbGV0ZUpvYlRpbWVyLnN0YXJ0T25lU2hvdCgwKTsKKworICAgIC8vIERldGFjaCBmcm9t
IHRoZSBSZXNvdXJjZUhhbmRsZSBpbiBhbnkgY2FzZS4KKyAgICBtX2hhbmRsZSA9IDA7CisgICAg
bV9tdWx0aXBhcnREZWxlZ2F0ZSA9IG51bGxwdHI7Cit9CisKK2Jvb2wgTmV0d29ya0pvYjo6c2hv
dWxkTm90aWZ5Q2xpZW50RmluaXNoZWQoKQoreworICAgIGlmIChtX3JlZGlyZWN0Q291bnQgPj0g
c19yZWRpcmVjdE1heGltdW0pCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKG1fbmVl
ZHNSZXRyeUFzRlRQRGlyZWN0b3J5ICYmIHJldHJ5QXNGVFBEaXJlY3RvcnkoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgaWYgKGlzUmVkaXJlY3QobV9leHRlbmRlZFN0YXR1c0NvZGUp
ICYmIGhhbmRsZVJlZGlyZWN0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVy
biB0cnVlOworfQorCitib29sIE5ldHdvcmtKb2I6OnJldHJ5QXNGVFBEaXJlY3RvcnkoKQorewor
ICAgIG1fbmVlZHNSZXRyeUFzRlRQRGlyZWN0b3J5ID0gZmFsc2U7CisKKyAgICBBU1NFUlQobV9o
YW5kbGUpOworICAgIFJlc291cmNlUmVxdWVzdCBuZXdSZXF1ZXN0ID0gbV9oYW5kbGUtPmZpcnN0
UmVxdWVzdCgpOworICAgIEtVUkwgdXJsID0gbmV3UmVxdWVzdC51cmwoKTsKKyAgICB1cmwuc2V0
UGF0aCh1cmwucGF0aCgpICsgIi8iKTsKKyAgICBuZXdSZXF1ZXN0LnNldFVSTCh1cmwpOworICAg
IG5ld1JlcXVlc3Quc2V0TXVzdEhhbmRsZUludGVybmFsbHkodHJ1ZSk7CisKKyAgICAvLyBVcGRh
dGUgdGhlIFVJLgorICAgIGhhbmRsZU5vdGlmeUhlYWRlclJlY2VpdmVkKCJMb2NhdGlvbiIsIHVy
bC5zdHJpbmcoKSk7CisKKyAgICByZXR1cm4gc3RhcnROZXdKb2JXaXRoUmVxdWVzdChuZXdSZXF1
ZXN0KTsKK30KKworYm9vbCBOZXR3b3JrSm9iOjpzdGFydE5ld0pvYldpdGhSZXF1ZXN0KFJlc291
cmNlUmVxdWVzdCYgbmV3UmVxdWVzdCwgYm9vbCBpbmNyZWFzUmVkaXJlY3RDb3VudCkKK3sKKyAg
ICBpZiAoY2xpZW50SXNPaygpKSB7CisgICAgICAgIFJlY3Vyc2lvbkd1YXJkIGd1YXJkKG1fY2Fs
bGluZ0NsaWVudCk7CisgICAgICAgIG1faGFuZGxlLT5jbGllbnQoKS0+d2lsbFNlbmRSZXF1ZXN0
KG1faGFuZGxlLmdldCgpLCBuZXdSZXF1ZXN0LCBtX3Jlc3BvbnNlKTsKKworICAgICAgICAvLyBt
X2NhbmNlbGxlZCBjYW4gYmVjb21lIHRydWUgaWYgdGhlIHVybCBmYWlscyB0aGUgcG9saWN5IGNo
ZWNrLgorICAgICAgICBpZiAobV9jYW5jZWxsZWQpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgLy8gUGFzcyB0aGUgb3duZXJzaGlwIG9mIHRoZSBSZXNvdXJjZUhhbmRs
ZSB0byB0aGUgbmV3IE5ldHdvcmtKb2IuCisgICAgUmVmUHRyPFJlc291cmNlSGFuZGxlPiBoYW5k
bGUgPSBtX2hhbmRsZTsKKyAgICBtX2hhbmRsZSA9IDA7CisgICAgbV9tdWx0aXBhcnREZWxlZ2F0
ZSA9IG51bGxwdHI7CisKKyAgICBOZXR3b3JrTWFuYWdlcjo6aW5zdGFuY2UoKS0+c3RhcnRKb2Io
bV9wbGF5ZXJJZCwKKyAgICAgICAgbV9wYWdlR3JvdXBOYW1lLAorICAgICAgICBoYW5kbGUsCisg
ICAgICAgIG5ld1JlcXVlc3QsCisgICAgICAgIG1fc3RyZWFtRmFjdG9yeSwKKyAgICAgICAgKm1f
ZnJhbWUsCisgICAgICAgIG1fZGVmZXJMb2FkaW5nQ291bnQsCisgICAgICAgIGluY3JlYXNSZWRp
cmVjdENvdW50ID8gbV9yZWRpcmVjdENvdW50ICsgMSA6IG1fcmVkaXJlY3RDb3VudCk7CisgICAg
cmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTmV0d29ya0pvYjo6aGFuZGxlUmVkaXJlY3QoKQorewor
ICAgIEFTU0VSVChtX2hhbmRsZSk7CisgICAgaWYgKCFtX2hhbmRsZSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgU3RyaW5nIGxvY2F0aW9uID0gbV9yZXNwb25zZS5odHRwSGVhZGVyRmll
bGQoIkxvY2F0aW9uIik7CisgICAgaWYgKGxvY2F0aW9uLmlzTnVsbCgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBLVVJMIG5ld1VSTChtX3Jlc3BvbnNlLnVybCgpLCBsb2NhdGlvbik7
CisgICAgaWYgKCFuZXdVUkwuaXNWYWxpZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBSZXNvdXJjZVJlcXVlc3QgbmV3UmVxdWVzdCA9IG1faGFuZGxlLT5maXJzdFJlcXVlc3QoKTsK
KyAgICBuZXdSZXF1ZXN0LnNldFVSTChuZXdVUkwpOworICAgIG5ld1JlcXVlc3Quc2V0TXVzdEhh
bmRsZUludGVybmFsbHkodHJ1ZSk7CisKKyAgICBTdHJpbmcgbWV0aG9kID0gbmV3UmVxdWVzdC5o
dHRwTWV0aG9kKCkudXBwZXIoKTsKKyAgICBpZiAoKG1ldGhvZCAhPSAiR0VUIikgJiYgKG1ldGhv
ZCAhPSAiSEVBRCIpKSB7CisgICAgICAgIG5ld1JlcXVlc3Quc2V0SFRUUE1ldGhvZCgiR0VUIik7
CisgICAgICAgIG5ld1JlcXVlc3Quc2V0SFRUUEJvZHkoMCk7CisgICAgICAgIG5ld1JlcXVlc3Qu
c2V0SFRUUEhlYWRlckZpZWxkKCJDb250ZW50LUxlbmd0aCIsIFN0cmluZygpKTsKKyAgICAgICAg
bmV3UmVxdWVzdC5zZXRIVFRQSGVhZGVyRmllbGQoIkNvbnRlbnQtVHlwZSIsIFN0cmluZygpKTsK
KyAgICB9CisKKyAgICAvLyBEbyBub3Qgc2VuZCBleGlzdGluZyBjcmVkZW50aWFscyB3aXRoIHRo
ZSBuZXcgcmVxdWVzdC4KKyAgICBtX2hhbmRsZS0+Z2V0SW50ZXJuYWwoKS0+bV9jdXJyZW50V2Vi
Q2hhbGxlbmdlLm51bGxpZnkoKTsKKworICAgIHJldHVybiBzdGFydE5ld0pvYldpdGhSZXF1ZXN0
KG5ld1JlcXVlc3QsIHRydWUpOworfQorCit2b2lkIE5ldHdvcmtKb2I6OnNlbmRSZXNwb25zZUlm
TmVlZGVkKCkKK3sKKyAgICBpZiAobV9yZXNwb25zZVNlbnQpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1fcmVzcG9uc2VTZW50ID0gdHJ1ZTsKKworICAgIGlmIChpc0Vycm9yKG1fZXh0ZW5kZWRT
dGF0dXNDb2RlKSAmJiAhbV9kYXRhUmVjZWl2ZWQpCisgICAgICAgIHJldHVybjsKKworICAgIFN0
cmluZyB1cmxGaWxlbmFtZSA9IG1fcmVzcG9uc2UudXJsKCkubGFzdFBhdGhDb21wb25lbnQoKTsK
KworICAgIC8vIEdldCB0aGUgTUlNRSB0eXBlIHRoYXQgd2FzIHNldCBieSB0aGUgY29udGVudCBz
bmlmZmVyCisgICAgLy8gaWYgdGhlcmUncyBubyBjdXN0b20gc25pZmZlciBoZWFkZXIsIHRyeSB0
byBzZXQgaXQgZnJvbSB0aGUgQ29udGVudC1UeXBlIGhlYWRlcgorICAgIC8vIGlmIHRoaXMgZmFp
bHMsIGd1ZXNzIGl0IGZyb20gZXh0ZW5zaW9uLgorICAgIFN0cmluZyBtaW1lVHlwZTsKKyAgICBp
ZiAobV9pc0ZUUCAmJiBtX2lzRlRQRGlyKQorICAgICAgICBtaW1lVHlwZSA9ICJhcHBsaWNhdGlv
bi94LWZ0cC1kaXJlY3RvcnkiOworICAgIGVsc2UKKyAgICAgICAgbWltZVR5cGUgPSBtX3Jlc3Bv
bnNlLmh0dHBIZWFkZXJGaWVsZChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6
OkhFQURFUl9SSU1fU05JRkZFRF9NSU1FX1RZUEUpOworICAgIGlmIChtaW1lVHlwZS5pc051bGwo
KSkKKyAgICAgICAgbWltZVR5cGUgPSBleHRyYWN0TUlNRVR5cGVGcm9tTWVkaWFUeXBlKG1fY29u
dGVudFR5cGUpOworICAgIGlmIChtaW1lVHlwZS5pc051bGwoKSkKKyAgICAgICAgbWltZVR5cGUg
PSBNSU1FVHlwZVJlZ2lzdHJ5OjpnZXRNSU1FVHlwZUZvclBhdGgodXJsRmlsZW5hbWUpOworICAg
IG1fcmVzcG9uc2Uuc2V0TWltZVR5cGUobWltZVR5cGUpOworCisgICAgLy8gU2V0IGVuY29kaW5n
IGZyb20gQ29udGVudC1UeXBlIGhlYWRlci4KKyAgICBtX3Jlc3BvbnNlLnNldFRleHRFbmNvZGlu
Z05hbWUoZXh0cmFjdENoYXJzZXRGcm9tTWVkaWFUeXBlKG1fY29udGVudFR5cGUpKTsKKworICAg
IC8vIFNldCBjb250ZW50IGxlbmd0aCBmcm9tIGhlYWRlci4KKyAgICBTdHJpbmcgY29udGVudExl
bmd0aCA9IG1fcmVzcG9uc2UuaHR0cEhlYWRlckZpZWxkKCJDb250ZW50LUxlbmd0aCIpOworICAg
IGlmICghY29udGVudExlbmd0aC5pc051bGwoKSkKKyAgICAgICAgbV9yZXNwb25zZS5zZXRFeHBl
Y3RlZENvbnRlbnRMZW5ndGgoY29udGVudExlbmd0aC50b0ludDY0KCkpOworCisgICAgLy8gU2V0
IHN1Z2dlc3RlZCBmaWxlbmFtZSBmb3IgZG93bmxvYWRzIGZyb20gdGhlIENvbnRlbnQtRGlzcG9z
aXRpb24gaGVhZGVyOyBpZiB0aGlzIGZhaWxzLCBmaWxsIGl0IGluIGZyb20gdGhlIHVybAorICAg
IC8vIHNraXAgdGhpcyBmb3IgZGF0YSB1cmwncywgYmVjYXVzZSB0aGV5IGhhdmUgbm8gQ29udGVu
dC1EaXNwb3NpdGlvbiBoZWFkZXIgYW5kIHRoZSBmb3JtYXQgaXMgd3JvbmcgdG8gYmUgYSBmaWxl
bmFtZS4KKyAgICBpZiAoIW1faXNEYXRhICYmICFtX2lzQWJvdXQpIHsKKyAgICAgICAgU3RyaW5n
IHN1Z2dlc3RlZEZpbGVuYW1lID0gZmlsZW5hbWVGcm9tSFRUUENvbnRlbnREaXNwb3NpdGlvbiht
X2NvbnRlbnREaXNwb3NpdGlvbik7CisgICAgICAgIGlmIChzdWdnZXN0ZWRGaWxlbmFtZS5pc051
bGwoKSkKKyAgICAgICAgICAgIHN1Z2dlc3RlZEZpbGVuYW1lID0gdXJsRmlsZW5hbWU7CisgICAg
ICAgIG1fcmVzcG9uc2Uuc2V0U3VnZ2VzdGVkRmlsZW5hbWUoc3VnZ2VzdGVkRmlsZW5hbWUpOwor
ICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSBsb2NhbCBmaWxlcyBhcmVuJ3QgY2FjaGVkLCBzaW5j
ZSB0aGlzIGp1c3QgZHVwbGljYXRlcyB0aGVtLgorICAgIGlmIChtX2lzRmlsZSB8fCBtX2lzRGF0
YSB8fCBtX2lzQWJvdXQpCisgICAgICAgIG1fcmVzcG9uc2Uuc2V0SFRUUEhlYWRlckZpZWxkKCJD
YWNoZS1Db250cm9sIiwgIm5vLWNhY2hlIik7CisKKyAgICBpZiAoY2xpZW50SXNPaygpKSB7Cisg
ICAgICAgIFJlY3Vyc2lvbkd1YXJkIGd1YXJkKG1fY2FsbGluZ0NsaWVudCk7CisgICAgICAgIG1f
aGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZVJlc3BvbnNlKG1faGFuZGxlLmdldCgpLCBtX3Jl
c3BvbnNlKTsKKworICAgICAgICBpZiAobWltZVR5cGUgPT0gIm11bHRpcGFydC94LW1peGVkLXJl
cGxhY2UiKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBib3VuZGFyeTsKKyAgICAgICAgICAg
IGJvb2wgaXNSZWFkQm91bmRhcnkgPSBNdWx0aXBhcnRSZXNwb25zZURlbGVnYXRlOjpyZWFkTXVs
dGlwYXJ0Qm91bmRhcnkobV9jb250ZW50VHlwZS5sb3dlcigpLnV0ZjgoKS5kYXRhKCksIGJvdW5k
YXJ5KTsKKyAgICAgICAgICAgIGlmIChpc1JlYWRCb3VuZGFyeSAmJiAhYm91bmRhcnkuZW1wdHko
KSkKKyAgICAgICAgICAgICAgICBtX211bHRpcGFydERlbGVnYXRlID0gYWRvcHRQdHIobmV3IE11
bHRpcGFydFJlc3BvbnNlRGVsZWdhdGUobV9oYW5kbGUsIG1fcmVzcG9uc2UsIGJvdW5kYXJ5KSk7
CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTmV0d29ya0pvYjo6cGFyc2VEYXRhKCkKK3sK
KyAgICBWZWN0b3I8Y2hhcj4gcmVzdWx0OworCisgICAgU3RyaW5nIGNvbnRlbnRUeXBlKCJ0ZXh0
L3BsYWluO2NoYXJzZXQ9VVMtQVNDSUkiKTsKKworICAgIFN0cmluZyBkYXRhKG1fcmVzcG9uc2Uu
dXJsKCkuc3RyaW5nKCkuc3Vic3RyaW5nKDUpKTsKKyAgICBWZWN0b3I8U3RyaW5nPiBocGFydHM7
CisgICAgYm9vbCBpc0Jhc2U2NCA9IGZhbHNlOworCisgICAgc2l6ZV90IGluZGV4ID0gZGF0YS5m
aW5kKCcsJyk7CisgICAgaWYgKGluZGV4ICE9IG5vdEZvdW5kICYmIGluZGV4ID4gMCkgeworICAg
ICAgICBjb250ZW50VHlwZSA9IGRhdGEubGVmdChpbmRleCkubG93ZXIoKTsKKyAgICAgICAgZGF0
YSA9IGRhdGEuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisKKyAgICAgICAgY29udGVudFR5cGUuc3Bs
aXQoJzsnLCBocGFydHMpOworICAgICAgICBWZWN0b3I8U3RyaW5nPjo6aXRlcmF0b3IgaTsKKyAg
ICAgICAgZm9yIChpID0gaHBhcnRzLmJlZ2luKCk7IGkgIT0gaHBhcnRzLmVuZCgpOyArK2kpIHsK
KyAgICAgICAgICAgIGlmIChpLT5zdHJpcFdoaXRlU3BhY2UoKS5sb3dlcigpID09ICJiYXNlNjQi
KSB7CisgICAgICAgICAgICAgICAgaXNCYXNlNjQgPSB0cnVlOworICAgICAgICAgICAgICAgIFN0
cmluZyB2YWx1ZSA9ICppOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCppID09IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRp
b24gPSBpIC0gaHBhcnRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBocGFydHMu
cmVtb3ZlKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBocGFydHMuYmVn
aW4oKSArIHBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAg
ICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChpICE9IGhwYXJ0cy5l
bmQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgICAgY29udGVudFR5cGUgPSBTdHJpbmcoKTsKKyAgICAgICAgZm9yIChpID0gaHBhcnRz
LmJlZ2luKCk7IGkgIT0gaHBhcnRzLmVuZCgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChpID4g
aHBhcnRzLmJlZ2luKCkpCisgICAgICAgICAgICAgICAgY29udGVudFR5cGUgKz0gIiwiOworCisg
ICAgICAgICAgICBjb250ZW50VHlwZSArPSAqaTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAo
IWluZGV4KQorICAgICAgICBkYXRhID0gZGF0YS5zdWJzdHJpbmcoMSk7IC8vIEJyb2tlbiBoZWFk
ZXIuCisKKyAgICB7CisgICAgICAgIENTdHJpbmcgbGF0aW4gPSBkYXRhLmxhdGluMSgpOworICAg
ICAgICBlc2NhcGVEZWNvZGUobGF0aW4uZGF0YSgpLCBsYXRpbi5sZW5ndGgoKSwgcmVzdWx0KTsK
KyAgICB9CisKKyAgICBpZiAoaXNCYXNlNjQpIHsKKyAgICAgICAgU3RyaW5nIHMocmVzdWx0LmRh
dGEoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIENTdHJpbmcgbGF0aW4gPSBzLnJlbW92ZUNo
YXJhY3RlcnMoaXNTcGFjZU9yTmV3bGluZSkubGF0aW4xKCk7CisgICAgICAgIHJlc3VsdC5jbGVh
cigpOworICAgICAgICByZXN1bHQuYXBwZW5kKGxhdGluLmRhdGEoKSwgbGF0aW4ubGVuZ3RoKCkp
OworICAgICAgICBWZWN0b3I8Y2hhcj4gYnl0ZXNPdXQ7CisgICAgICAgIGlmIChiYXNlNjREZWNv
ZGUocmVzdWx0LCBieXRlc091dCkpCisgICAgICAgICAgICByZXN1bHQuc3dhcChieXRlc091dCk7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdC5jbGVhcigpOworICAgIH0KKworICAg
IG5vdGlmeVN0YXR1c1JlY2VpdmVkKHJlc3VsdC5pc0VtcHR5KCkgPyA0MDQgOiAyMDAsIDApOwor
ICAgIG5vdGlmeVN0cmluZ0hlYWRlclJlY2VpdmVkKCJDb250ZW50LVR5cGUiLCBjb250ZW50VHlw
ZSk7CisgICAgbm90aWZ5U3RyaW5nSGVhZGVyUmVjZWl2ZWQoIkNvbnRlbnQtTGVuZ3RoIiwgU3Ry
aW5nOjpudW1iZXIocmVzdWx0LnNpemUoKSkpOworICAgIG5vdGlmeURhdGFSZWNlaXZlZFBsYWlu
KHJlc3VsdC5kYXRhKCksIHJlc3VsdC5zaXplKCkpOworICAgIG5vdGlmeUNsb3NlKEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpGaWx0ZXJTdHJlYW06OlN0YXR1c1N1Y2Nlc3MpOworfQorCitib29sIE5l
dHdvcmtKb2I6OmhhbmRsZUF1dGhIZWFkZXIoY29uc3QgU3RyaW5nJiBoZWFkZXIpCit7CisgICAg
aWYgKCFtX2hhbmRsZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFtX2hhbmRs
ZS0+Z2V0SW50ZXJuYWwoKS0+bV9jdXJyZW50V2ViQ2hhbGxlbmdlLmlzTnVsbCgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaGVhZGVyLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGhlYWRlciwgIm50bG0iKSkK
KyAgICAgICAgc2VuZFJlcXVlc3RXaXRoQ3JlZGVudGlhbHMoUHJvdGVjdGlvblNwYWNlU2VydmVy
SFRUUCwgUHJvdGVjdGlvblNwYWNlQXV0aGVudGljYXRpb25TY2hlbWVOVExNLCAiTlRMTSIpOwor
CisgICAgLy8gRXh0cmFjdCB0aGUgYXV0aCBzY2hlbWUgYW5kIHJlYWxtIGZyb20gdGhlIGhlYWRl
ci4KKyAgICBzaXplX3Qgc3BhY2VQb3MgPSBoZWFkZXIuZmluZCgnICcpOworICAgIGlmIChzcGFj
ZVBvcyA9PSBub3RGb3VuZCkgeworICAgICAgICBMT0coTmV0d29yaywgIldXVy1BdXRoZW50aWNh
dGUgZmllbGQgJyVzJyBiYWRseSBmb3JtYXR0ZWQ6IG1pc3Npbmcgc2NoZW1lLiIsIGhlYWRlci51
dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFN0cmlu
ZyBzY2hlbWUgPSBoZWFkZXIubGVmdChzcGFjZVBvcyk7CisKKyAgICBQcm90ZWN0aW9uU3BhY2VB
dXRoZW50aWNhdGlvblNjaGVtZSBwcm90ZWN0aW9uU3BhY2VTY2hlbWUgPSBQcm90ZWN0aW9uU3Bh
Y2VBdXRoZW50aWNhdGlvblNjaGVtZURlZmF1bHQ7CisgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNl
KHNjaGVtZSwgImJhc2ljIikpCisgICAgICAgIHByb3RlY3Rpb25TcGFjZVNjaGVtZSA9IFByb3Rl
Y3Rpb25TcGFjZUF1dGhlbnRpY2F0aW9uU2NoZW1lSFRUUEJhc2ljOworICAgIGVsc2UgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKHNjaGVtZSwgImRpZ2VzdCIpKQorICAgICAgICBwcm90ZWN0aW9uU3Bh
Y2VTY2hlbWUgPSBQcm90ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZUhUVFBEaWdlc3Q7
CisgICAgZWxzZSB7CisgICAgICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICBzaXplX3QgcmVhbG1Qb3MgPSBoZWFkZXIuZmluZElnbm9yaW5n
Q2FzZSgicmVhbG09Iiwgc3BhY2VQb3MpOworICAgIGlmIChyZWFsbVBvcyA9PSBub3RGb3VuZCkg
eworICAgICAgICBMT0coTmV0d29yaywgIldXVy1BdXRoZW50aWNhdGUgZmllbGQgJyVzJyBiYWRs
eSBmb3JtYXR0ZWQ6IG1pc3NpbmcgcmVhbG0uIiwgaGVhZGVyLnV0ZjgoKS5kYXRhKCkpOworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNpemVfdCBiZWdpblBvcyA9IHJlYWxtUG9z
ICsgNjsKKyAgICBTdHJpbmcgcmVhbG0gID0gaGVhZGVyLnJpZ2h0KGhlYWRlci5sZW5ndGgoKSAt
IGJlZ2luUG9zKTsKKyAgICBpZiAocmVhbG0uc3RhcnRzV2l0aCgiXCIiKSkgeworICAgICAgICBi
ZWdpblBvcyArPSAxOworICAgICAgICBzaXplX3QgZW5kUG9zID0gaGVhZGVyLmZpbmQoIlwiIiwg
YmVnaW5Qb3MpOworICAgICAgICBpZiAoZW5kUG9zID09IG5vdEZvdW5kKSB7CisgICAgICAgICAg
ICBMT0coTmV0d29yaywgIldXVy1BdXRoZW50aWNhdGUgZmllbGQgJyVzJyBiYWRseSBmb3JtYXR0
ZWQ6IGludmFsaWQgcmVhbG0uIiwgaGVhZGVyLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJlYWxtID0gaGVhZGVyLnN1YnN0cmlu
ZyhiZWdpblBvcywgZW5kUG9zIC0gYmVnaW5Qb3MpOworICAgIH0KKworICAgIC8vIEdldCB0aGUg
dXNlcidzIGNyZWRlbnRpYWxzIGFuZCByZXNlbmQgdGhlIHJlcXVlc3QuCisgICAgc2VuZFJlcXVl
c3RXaXRoQ3JlZGVudGlhbHMoUHJvdGVjdGlvblNwYWNlU2VydmVySFRUUCwgcHJvdGVjdGlvblNw
YWNlU2NoZW1lLCByZWFsbSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBOZXR3b3Jr
Sm9iOjpoYW5kbGVGVFBIZWFkZXIoY29uc3QgU3RyaW5nJiBoZWFkZXIpCit7CisgICAgc2l6ZV90
IHNwYWNlUG9zID0gaGVhZGVyLmZpbmQoJyAnKTsKKyAgICBpZiAoc3BhY2VQb3MgPT0gbm90Rm91
bmQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBTdHJpbmcgc3RhdHVzQ29kZSA9IGhlYWRl
ci5sZWZ0KHNwYWNlUG9zKTsKKyAgICBzd2l0Y2ggKHN0YXR1c0NvZGUudG9JbnQoKSkgeworICAg
IGNhc2UgMjEzOgorICAgICAgICBtX2lzRlRQRGlyID0gZmFsc2U7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgNTMwOgorICAgICAgICBwdXJnZUNyZWRlbnRpYWxzKCk7CisgICAgICAgIHNlbmRS
ZXF1ZXN0V2l0aENyZWRlbnRpYWxzKFByb3RlY3Rpb25TcGFjZVNlcnZlckZUUCwgUHJvdGVjdGlv
blNwYWNlQXV0aGVudGljYXRpb25TY2hlbWVEZWZhdWx0LCAiZnRwIik7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgMjMwOgorICAgICAgICBzdG9yZUNyZWRlbnRpYWxzKCk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgNTUwOgorICAgICAgICAvLyBUaGUgdXNlciBtaWdodCBoYXZlIGVudGVy
ZWQgYW4gVVJMIHdoaWNoIHBvaW50IHRvIGEgZGlyZWN0b3J5IGJ1dCBmb3Jnb3QgdHlwZSAnLycs
CisgICAgICAgIC8vIGUuZy4sIGZ0cDovL2Z0cC50cm9sbHRlY2guY29tL3F0L3NvdXJjZSB3aGVy
ZSAnc291cmNlJyBpcyBhIGRpcmVjdG9yeS4gV2UgbmVlZCB0bworICAgICAgICAvLyBhZGRlZCAn
LycgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICAgaWYgKG1faGFuZGxlICYmICFtX2hhbmRsZS0+Zmly
c3RSZXF1ZXN0KCkudXJsKCkucGF0aCgpLmVuZHNXaXRoKCIvIikpCisgICAgICAgICAgICBtX25l
ZWRzUmV0cnlBc0ZUUERpcmVjdG9yeSA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKwor
ICAgIHJldHVybiB0cnVlOworfQorCitib29sIE5ldHdvcmtKb2I6OnNlbmRSZXF1ZXN0V2l0aENy
ZWRlbnRpYWxzKFByb3RlY3Rpb25TcGFjZVNlcnZlclR5cGUgdHlwZSwgUHJvdGVjdGlvblNwYWNl
QXV0aGVudGljYXRpb25TY2hlbWUgc2NoZW1lLCBjb25zdCBTdHJpbmcmIHJlYWxtKQoreworICAg
IEFTU0VSVChtX2hhbmRsZSk7CisgICAgaWYgKCFtX2hhbmRsZSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgS1VSTCBuZXdVUkwgPSBtX3Jlc3BvbnNlLnVybCgpOworICAgIGlmICghbmV3
VVJMLmlzVmFsaWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgUHJvdGVjdGlvblNw
YWNlIHByb3RlY3Rpb25TcGFjZShtX3Jlc3BvbnNlLnVybCgpLmhvc3QoKSwgbV9yZXNwb25zZS51
cmwoKS5wb3J0KCksIHR5cGUsIHJlYWxtLCBzY2hlbWUpOworCisgICAgLy8gV2UndmUgZ290IHRo
ZSBzY2hlbWUgYW5kIHJlYWxtLiBOb3cgd2UgbmVlZCBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4K
KyAgICAvLyBGaXJzdCBzZWFyY2ggdGhlIENyZWRlbnRpYWxTdG9yYWdlLgorICAgIENyZWRlbnRp
YWwgY3JlZGVudGlhbCA9IENyZWRlbnRpYWxTdG9yYWdlOjpnZXQocHJvdGVjdGlvblNwYWNlKTsK
KyAgICBpZiAoIWNyZWRlbnRpYWwuaXNFbXB0eSgpKSB7CisgICAgICAgIG1faGFuZGxlLT5nZXRJ
bnRlcm5hbCgpLT5tX2N1cnJlbnRXZWJDaGFsbGVuZ2UgPSBBdXRoZW50aWNhdGlvbkNoYWxsZW5n
ZShwcm90ZWN0aW9uU3BhY2UsIGNyZWRlbnRpYWwsIDAsIG1fcmVzcG9uc2UsIFJlc291cmNlRXJy
b3IoKSk7CisgICAgICAgIG1faGFuZGxlLT5nZXRJbnRlcm5hbCgpLT5tX2N1cnJlbnRXZWJDaGFs
bGVuZ2Uuc2V0U3RvcmVkKHRydWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENyZWRlbnRp
YWxTdG9yZSBpcyBlbXB0eS4gQXNrIHRoZSB1c2VyIHZpYSBkaWFsb2cuCisgICAgICAgIFN0cmlu
ZyB1c2VybmFtZTsKKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkOworCisgICAgICAgIGlmICghbV9m
cmFtZSB8fCAhbV9mcmFtZS0+bG9hZGVyKCkgfHwgIW1fZnJhbWUtPmxvYWRlcigpLT5jbGllbnQo
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgbV9mcmFtZS0+bG9hZGVyKCkt
PmNsaWVudCgpLT5hdXRoZW50aWNhdGlvbkNoYWxsZW5nZShyZWFsbSwgdXNlcm5hbWUsIHBhc3N3
b3JkKTsKKworICAgICAgICBpZiAodXNlcm5hbWUuaXNFbXB0eSgpICYmIHBhc3N3b3JkLmlzRW1w
dHkoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBjcmVkZW50aWFsID0g
Q3JlZGVudGlhbCh1c2VybmFtZSwgcGFzc3dvcmQsIENyZWRlbnRpYWxQZXJzaXN0ZW5jZUZvclNl
c3Npb24pOworCisgICAgICAgIG1faGFuZGxlLT5nZXRJbnRlcm5hbCgpLT5tX2N1cnJlbnRXZWJD
aGFsbGVuZ2UgPSBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShwcm90ZWN0aW9uU3BhY2UsIGNyZWRl
bnRpYWwsIDAsIG1fcmVzcG9uc2UsIFJlc291cmNlRXJyb3IoKSk7CisgICAgfQorCisgICAgLy8g
RklYTUU6IFJlc2VuZCB0aGUgcmVzb3VyY2UgcmVxdWVzdC4gQ2xvbmVkIGZyb20gaGFuZGxlUmVk
aXJlY3QoKS4gTm90IHN1cmUKKyAgICAvLyBpZiB3ZSBuZWVkIGV2ZXJ5dGhpbmcgdGhhdCBmb2xs
b3dzLi4uCisgICAgUmVzb3VyY2VSZXF1ZXN0IG5ld1JlcXVlc3QgPSBtX2hhbmRsZS0+Zmlyc3RS
ZXF1ZXN0KCk7CisgICAgbmV3UmVxdWVzdC5zZXRVUkwobmV3VVJMKTsKKyAgICBuZXdSZXF1ZXN0
LnNldE11c3RIYW5kbGVJbnRlcm5hbGx5KHRydWUpOworICAgIHJldHVybiBzdGFydE5ld0pvYldp
dGhSZXF1ZXN0KG5ld1JlcXVlc3QpOworfQorCit2b2lkIE5ldHdvcmtKb2I6OnN0b3JlQ3JlZGVu
dGlhbHMoKQoreworICAgIGlmICghbV9oYW5kbGUpCisgICAgICAgIHJldHVybjsKKworICAgIEF1
dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJiBjaGFsbGVuZ2UgPSBtX2hhbmRsZS0+Z2V0SW50ZXJuYWwo
KS0+bV9jdXJyZW50V2ViQ2hhbGxlbmdlOworICAgIGlmIChjaGFsbGVuZ2UuaXNOdWxsKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIGlmIChjaGFsbGVuZ2UuaXNTdG9yZWQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgQ3JlZGVudGlhbFN0b3JhZ2U6OnNldChjaGFsbGVuZ2UucHJvcG9zZWRD
cmVkZW50aWFsKCksIGNoYWxsZW5nZS5wcm90ZWN0aW9uU3BhY2UoKSwgbV9yZXNwb25zZS51cmwo
KSk7CisgICAgY2hhbGxlbmdlLnNldFN0b3JlZCh0cnVlKTsKK30KKwordm9pZCBOZXR3b3JrSm9i
OjpwdXJnZUNyZWRlbnRpYWxzKCkKK3sKKyAgICBpZiAoIW1faGFuZGxlKQorICAgICAgICByZXR1
cm47CisKKyAgICBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYgY2hhbGxlbmdlID0gbV9oYW5kbGUt
PmdldEludGVybmFsKCktPm1fY3VycmVudFdlYkNoYWxsZW5nZTsKKyAgICBpZiAoY2hhbGxlbmdl
LmlzTnVsbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBDcmVkZW50aWFsU3RvcmFnZTo6cmVt
b3ZlKGNoYWxsZW5nZS5wcm90ZWN0aW9uU3BhY2UoKSk7CisgICAgY2hhbGxlbmdlLnNldFN0b3Jl
ZChmYWxzZSk7Cit9CisKK2Jvb2wgTmV0d29ya0pvYjo6c2hvdWxkU2VuZENsaWVudERhdGEoKSBj
b25zdAoreworICAgIHJldHVybiAoIWlzUmVkaXJlY3QobV9leHRlbmRlZFN0YXR1c0NvZGUpIHx8
ICFtX3Jlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZHMoKS5jb250YWlucygiTG9jYXRpb24iKSkKKyAg
ICAgICAgICAgJiYgIW1fbmVlZHNSZXRyeUFzRlRQRGlyZWN0b3J5OworfQorCit2b2lkIE5ldHdv
cmtKb2I6OmZpcmVEZWxldGVKb2JUaW1lcihUaW1lcjxOZXR3b3JrSm9iPiopCit7CisgICAgTmV0
d29ya01hbmFnZXI6Omluc3RhbmNlKCktPmRlbGV0ZUpvYih0aGlzKTsKK30KKwordm9pZCBOZXR3
b3JrSm9iOjpoYW5kbGVBYm91dCgpCit7CisgICAgLy8gRmlyc3QgNiBjaGFycyBhcmUgImFib3V0
OiIuCisgICAgU3RyaW5nIGFib3V0V2hhdChtX3Jlc3BvbnNlLnVybCgpLnN0cmluZygpLnN1YnN0
cmluZyg2KSk7CisKKyAgICBTdHJpbmcgcmVzdWx0OworCisgICAgYm9vbCBoYW5kbGVkID0gZmFs
c2U7CisgICAgaWYgKGFib3V0V2hhdC5pc0VtcHR5KCkgfHwgZXF1YWxJZ25vcmluZ0Nhc2UoYWJv
dXRXaGF0LCAiYmxhbmsiKSkgeworICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICB9IGVsc2Ug
aWYgKGVxdWFsSWdub3JpbmdDYXNlKGFib3V0V2hhdCwgImNyZWRpdHMiKSkgeworICAgICAgICBy
ZXN1bHQuYXBwZW5kKFN0cmluZygiPGh0bWw+PGhlYWQ+PHRpdGxlPk9wZW4gU291cmNlIENyZWRp
dHM8L3RpdGxlPiA8c3R5bGU+IC5hYm91dCB7cGFkZGluZzoxNHB4O30gPC9zdHlsZT4gPG1ldGEg
bmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2Fs
YWJsZT1ub1wiPjwvaGVhZD48Ym9keT4iKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5n
KEJsYWNrQmVycnk6OlBsYXRmb3JtOjpXRUJLSVRDUkVESVRTKSk7CisgICAgICAgIHJlc3VsdC5h
cHBlbmQoU3RyaW5nKCI8L2JvZHk+PC9odG1sPiIpKTsKKyAgICAgICAgaGFuZGxlZCA9IHRydWU7
CisjaWYgIWRlZmluZWQoUFVCTElDX0JVSUxEKSB8fCAhUFVCTElDX0JVSUxECisgICAgfSBlbHNl
IGlmIChhYm91dFdoYXQuc3RhcnRzV2l0aCgiY2FjaGU/cXVlcnk9IiwgZmFsc2UpKSB7CisgICAg
ICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpDbGllbnQqIGNsaWVudCA9IEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpDbGllbnQ6OmdldCgpOworICAgICAgICBBU1NFUlQoY2xpZW50KTsKKyAgICAgICAg
c3RkOjpzdHJpbmcga2V5KGFib3V0V2hhdC5zdWJzdHJpbmcoMTIsIGFib3V0V2hhdC5sZW5ndGgo
KSAtIDEyKS51dGY4KCkuZGF0YSgpKTsgLy8gMTIgaXMgbGVuZ3RoIG9mICJjYWNoZT9xdWVyeT0i
LgorICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZygiPGh0bWw+PGhlYWQ+PHRpdGxlPkJsYWNr
QmVycnkgQnJvd3NlciBEaXNrIENhY2hlPC90aXRsZT48L2hlYWQ+PGJvZHk+IikpOworICAgICAg
ICByZXN1bHQuYXBwZW5kKFN0cmluZyhrZXkuZGF0YSgpKSk7CisgICAgICAgIHJlc3VsdC5hcHBl
bmQoU3RyaW5nKCI8aHI+IikpOworICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZyhjbGllbnQt
PmdlbmVyYXRlSHRtbEZyYWdtZW50Rm9yQ2FjaGVIZWFkZXJzKGtleSkuZGF0YSgpKSk7CisgICAg
ICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nKCI8L2JvZHk+PC9odG1sPiIpKTsKKyAgICAgICAgaGFu
ZGxlZCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhYm91dFdoYXQs
ICJjYWNoZSIpKSB7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpDbGllbnQqIGNsaWVu
dCA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpDbGllbnQ6OmdldCgpOworICAgICAgICBBU1NFUlQo
Y2xpZW50KTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcoIjxodG1sPjxoZWFkPjx0aXRs
ZT5CbGFja0JlcnJ5IEJyb3dzZXIgRGlzayBDYWNoZTwvdGl0bGU+PC9oZWFkPjxib2R5PiIpKTsK
KyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcoY2xpZW50LT5nZW5lcmF0ZUh0bWxGcmFnbWVu
dEZvckNhY2hlS2V5cygpLmRhdGEoKSkpOworICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZygi
PC9ib2R5PjwvaHRtbD4iKSk7CisgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgIH0gZWxzZSBp
ZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYWJvdXRXaGF0LCAiY2FjaGUvZGlzYWJsZSIpKSB7CisgICAg
ICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpDbGllbnQqIGNsaWVudCA9IEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpDbGllbnQ6OmdldCgpOworICAgICAgICBBU1NFUlQoY2xpZW50KTsKKyAgICAgICAg
Y2xpZW50LT5zZXREaXNrQ2FjaGVFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVu
ZChTdHJpbmcoIjxodG1sPjxoZWFkPjx0aXRsZT5CbGFja0JlcnJ5IEJyb3dzZXIgRGlzayBDYWNo
ZTwvdGl0bGU+PC9oZWFkPjxib2R5Pkh0dHAgZGlzayBjYWNoZSBpcyBkaXNhYmxlZC48L2JvZHk+
PC9odG1sPiIpKTsKKyAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChlcXVh
bElnbm9yaW5nQ2FzZShhYm91dFdoYXQsICJjYWNoZS9lbmFibGUiKSkgeworICAgICAgICBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6Q2xpZW50KiBjbGllbnQgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
Q2xpZW50OjpnZXQoKTsKKyAgICAgICAgQVNTRVJUKGNsaWVudCk7CisgICAgICAgIGNsaWVudC0+
c2V0RGlza0NhY2hlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmco
IjxodG1sPjxoZWFkPjx0aXRsZT5CbGFja0JlcnJ5IEJyb3dzZXIgRGlzayBDYWNoZTwvdGl0bGU+
PC9oZWFkPjxib2R5Pkh0dHAgZGlzayBjYWNoZSBpcyBlbmFibGVkLjwvYm9keT48L2h0bWw+Iikp
OworICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdD
YXNlKGFib3V0V2hhdCwgInZlcnNpb24iKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmlu
ZygiPGh0bWw+PG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13
aWR0aCwgdXNlci1zY2FsYWJsZT1ub1wiPjwvaGVhZD48Ym9keT4iKSk7CisgICAgICAgIHJlc3Vs
dC5hcHBlbmQoU3RyaW5nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpCVUlMRFRJTUUpKTsKKyAgICAg
ICAgcmVzdWx0LmFwcGVuZChTdHJpbmcoIjwvYm9keT48L2h0bWw+IikpOworICAgICAgICBoYW5k
bGVkID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpkZWJ1Z1Nl
dHRpbmcoKSA+IDAgJiYgZXF1YWxJZ25vcmluZ0Nhc2UoYWJvdXRXaGF0LCAiY29uZmlnIikpIHsK
KyAgICAgICAgcmVzdWx0ID0gY29uZmlnUGFnZSgpOworICAgICAgICBoYW5kbGVkID0gdHJ1ZTsK
KyAgICB9IGVsc2UgaWYgKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpkZWJ1Z1NldHRpbmcoKSA+IDAg
JiYgZXF1YWxJZ25vcmluZ0Nhc2UoYWJvdXRXaGF0LCAiYnVpbGQiKSkgeworICAgICAgICByZXN1
bHQuYXBwZW5kKFN0cmluZygiPGh0bWw+PGhlYWQ+PHRpdGxlPkJsYWNrQmVycnkgQnJvd3NlciBC
dWlsZCBJbmZvcm1hdGlvbjwvdGl0bGU+PC9oZWFkPjxib2R5Pjx0YWJsZT4iKSk7CisgICAgICAg
IHJlc3VsdC5hcHBlbmQoU3RyaW5nKCI8dHI+PHRkPkJ1aWxkIENvbXB1dGVyOiAgPC90ZD48dGQ+
IikpOworICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
QlVJTERDT01QVVRFUikpOworICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZygiPC90ZD48L3Ry
PiIpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcoIjx0cj48dGQ+QnVpbGQgVXNlcjog
IDwvdGQ+PHRkPiIpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcoQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkJVSUxEVVNFUikpOworICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZygiPC90
ZD48L3RyPiIpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcoIjx0cj48dGQ+QnVpbGQg
VGltZTogIDwvdGQ+PHRkPiIpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcoQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkJVSUxEVElNRSkpOworICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmlu
ZygiPC90ZD48L3RyPjx0cj48dGQ+PC90ZD48dGQ+PC90ZD48L3RyPiIpKTsKKyAgICAgICAgcmVz
dWx0LmFwcGVuZChTdHJpbmcoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkJVSUxESU5GT19XRUJLSVQp
KTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkJV
SUxESU5GT19QTEFURk9STSkpOworICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZyhCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6QlVJTERJTkZPX0xJQldFQlZJRVcpKTsKKyAgICAgICAgcmVzdWx0LmFw
cGVuZChTdHJpbmcoIjwvdGFibGU+PC9ib2R5PjwvaHRtbD4iKSk7CisgICAgICAgIGhhbmRsZWQg
PSB0cnVlOworICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYWJvdXRXaGF0LCAibWVt
b3J5IikpIHsKKyAgICAgICAgcmVzdWx0ID0gbWVtb3J5UGFnZSgpOworICAgICAgICBoYW5kbGVk
ID0gdHJ1ZTsKKyNlbmRpZgorICAgIH0KKworICAgIENTdHJpbmcgcmVzdWx0U3RyaW5nID0gcmVz
dWx0LnV0ZjgoKTsKKworICAgIG5vdGlmeVN0YXR1c1JlY2VpdmVkKGhhbmRsZWQgPyA0MDQgOiAy
MDAsIDApOworICAgIG5vdGlmeVN0cmluZ0hlYWRlclJlY2VpdmVkKCJDb250ZW50LUxlbmd0aCIs
IFN0cmluZzo6bnVtYmVyKHJlc3VsdFN0cmluZy5sZW5ndGgoKSkpOworICAgIG5vdGlmeVN0cmlu
Z0hlYWRlclJlY2VpdmVkKCJDb250ZW50LVR5cGUiLCAidGV4dC9odG1sIik7CisgICAgbm90aWZ5
RGF0YVJlY2VpdmVkUGxhaW4ocmVzdWx0U3RyaW5nLmRhdGEoKSwgcmVzdWx0U3RyaW5nLmxlbmd0
aCgpKTsKKyAgICBub3RpZnlDbG9zZShCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6RmlsdGVyU3RyZWFt
OjpTdGF0dXNTdWNjZXNzKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtKb2Iu
aCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrSm9i
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4OTdmYQotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3
b3JrSm9iLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIw
MTAsIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAg
MDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBOZXR3b3JrSm9iX2gKKyNkZWZpbmUgTmV0
d29ya0pvYl9oCisKKyNpbmNsdWRlICJEZWZlcnJlZERhdGEuaCIKKyNpbmNsdWRlICJNdWx0aXBh
cnRSZXNwb25zZURlbGVnYXRlLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNs
dWRlICJQcm90ZWN0aW9uU3BhY2UuaCIKKyNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZS5oIgorI2lu
Y2x1ZGUgIlJlc291cmNlUmVzcG9uc2UuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorCisjaW5jbHVk
ZSA8bmV0d29yay9GaWx0ZXJTdHJlYW0uaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5j
bHVkZSA8d3RmL1JlZlB0ci5oPgorCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2Ug
UGxhdGZvcm0geworY2xhc3MgTmV0d29ya1JlcXVlc3Q7CitjbGFzcyBOZXR3b3JrU3RyZWFtRmFj
dG9yeTsKK30KK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBGcmFtZTsKK2NsYXNz
IEtVUkw7CitjbGFzcyBSZXNvdXJjZVJlcXVlc3Q7CisKK2NsYXNzIE5ldHdvcmtKb2IgOiBwdWJs
aWMgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZpbHRlclN0cmVhbSB7CitwdWJsaWM6CisgICAgTmV0
d29ya0pvYigpOworICAgIGJvb2wgaW5pdGlhbGl6ZShpbnQgcGxheWVySWQsCisgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IFN0cmluZyYgcGFnZUdyb3VwTmFtZSwKKyAgICAgICAgICAgICAgICAg
ICAgY29uc3QgS1VSTCYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpOZXR3b3JrUmVxdWVzdCYsCisgICAgICAgICAgICAgICAgICAgIFBhc3NSZWZQdHI8
UmVzb3VyY2VIYW5kbGU+LAorICAgICAgICAgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6TmV0d29ya1N0cmVhbUZhY3RvcnkqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGcmFt
ZSYsCisgICAgICAgICAgICAgICAgICAgIGludCBkZWZlckxvYWRpbmdDb3VudCwKKyAgICAgICAg
ICAgICAgICAgICAgaW50IHJlZGlyZWN0Q291bnQpOworICAgIFBhc3NSZWZQdHI8UmVzb3VyY2VI
YW5kbGU+IGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1faGFuZGxlOyB9CisgICAgYm9vbCBpc1J1
bm5pbmcoKSBjb25zdCB7IHJldHVybiBtX2lzUnVubmluZzsgfQorICAgIGJvb2wgaXNDYW5jZWxs
ZWQoKSBjb25zdCB7IHJldHVybiBtX2NhbmNlbGxlZDsgfQorICAgIGJvb2wgY2xpZW50SXNPaygp
IGNvbnN0IHsgcmV0dXJuICFtX2NhbmNlbGxlZCAmJiBtX2hhbmRsZSAmJiBtX2hhbmRsZS0+Y2xp
ZW50KCk7IH0KKyAgICB2b2lkIGxvYWREYXRhVVJMKCkgeyBtX2xvYWREYXRhVGltZXIuc3RhcnRP
bmVTaG90KDApOyB9CisgICAgYm9vbCBsb2FkQWJvdXRVUkwoKTsKKyAgICBpbnQgY2FuY2VsSm9i
KCk7CisgICAgYm9vbCBpc0RlZmVycmluZ0xvYWRpbmcoKSBjb25zdCB7IHJldHVybiBtX2RlZmVy
TG9hZGluZ0NvdW50ID4gMDsgfQorICAgIHZvaWQgdXBkYXRlRGVmZXJMb2FkaW5nQ291bnQoaW50
IGRlbHRhKTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U3RhdHVzUmVjZWl2ZWQoaW50IHN0YXR1
cywgY29uc3QgY2hhciogbWVzc2FnZSk7CisgICAgdm9pZCBoYW5kbGVOb3RpZnlTdGF0dXNSZWNl
aXZlZChpbnQgc3RhdHVzLCBjb25zdCBTdHJpbmcmIG1lc3NhZ2UpOworICAgIHZpcnR1YWwgdm9p
ZCBub3RpZnlXTUxPdmVycmlkZSgpOworICAgIHZvaWQgaGFuZGxlTm90aWZ5V01MT3ZlcnJpZGUo
KSB7IG1fcmVzcG9uc2Uuc2V0SXNXTUwodHJ1ZSk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5
SGVhZGVyUmVjZWl2ZWQoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisgICAg
Ly8gRXhpc3RzIG9ubHkgdG8gcmVzb2x2ZSBhbWJpZ3VpdHkgYmV0d2VlbiBjaGFyKiBhbmQgU3Ry
aW5nIHBhcmFtZXRlcnMKKyAgICB2b2lkIG5vdGlmeVN0cmluZ0hlYWRlclJlY2VpdmVkKGNvbnN0
IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlKTsKKyAgICB2b2lkIGhhbmRsZU5vdGlm
eUhlYWRlclJlY2VpdmVkKGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlKTsK
KyAgICB2b2lkIGhhbmRsZVNldENvb2tpZUhlYWRlcihjb25zdCBTdHJpbmcmIHZhbHVlKTsKKyAg
ICB2b2lkIG5vdGlmeURhdGFSZWNlaXZlZFBsYWluKGNvbnN0IGNoYXIqIGJ1Ziwgc2l6ZV90IGxl
bik7CisgICAgdm9pZCBoYW5kbGVOb3RpZnlEYXRhUmVjZWl2ZWQoY29uc3QgY2hhciogYnVmLCBz
aXplX3QgbGVuKTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RGF0YVNlbnQodW5zaWduZWQgbG9u
ZyBsb25nIGJ5dGVzU2VudCwgdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsQnl0ZXNUb0JlU2VudCk7
CisgICAgdm9pZCBoYW5kbGVOb3RpZnlEYXRhU2VudCh1bnNpZ25lZCBsb25nIGxvbmcgYnl0ZXNT
ZW50LCB1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxCeXRlc1RvQmVTZW50KTsKKyAgICB2aXJ0dWFs
IHZvaWQgbm90aWZ5Q2xvc2UoaW50IHN0YXR1cyk7CisgICAgdm9pZCBoYW5kbGVOb3RpZnlDbG9z
ZShpbnQgc3RhdHVzKTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RGF0YVJlY2VpdmVkKEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrQnVmZmVyKiBidWZmZXIpCisgICAgeworICAgICAgICBu
b3RpZnlEYXRhUmVjZWl2ZWRQbGFpbihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bmV0d29ya0J1ZmZl
ckRhdGEoYnVmZmVyKSwgQmxhY2tCZXJyeTo6UGxhdGZvcm06Om5ldHdvcmtCdWZmZXJEYXRhTGVu
Z3RoKGJ1ZmZlcikpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgc2V0V2Fz
RGlza0NhY2hlZChib29sIHZhbHVlKQorICAgIHsKKyAgICAgICBtX3Jlc3BvbnNlLnNldFdhc0Nh
Y2hlZCh2YWx1ZSk7CisgICAgfQorCisgICAgYm9vbCBzaG91bGRTZW5kQ2xpZW50RGF0YSgpIGNv
bnN0OworCisgICAgYm9vbCBzaG91bGROb3RpZnlDbGllbnRGaW5pc2hlZCgpOworCisgICAgYm9v
bCBzaG91bGREZWZlckxvYWRpbmcoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRGVm
ZXJyaW5nTG9hZGluZygpIHx8IG1fZGVmZXJyZWREYXRhLmhhc0RlZmVycmVkRGF0YSgpOworICAg
IH0KKworICAgIGJvb2wgcmV0cnlBc0ZUUERpcmVjdG9yeSgpOworCisgICAgYm9vbCBzdGFydE5l
d0pvYldpdGhSZXF1ZXN0KFJlc291cmNlUmVxdWVzdCYgbmV3UmVxdWVzdCwgYm9vbCBpbmNyZWFz
UmVkaXJlY3RDb3VudCA9IGZhbHNlKTsKKworICAgIGJvb2wgaGFuZGxlUmVkaXJlY3QoKTsKKwor
ICAgIC8vIFRoaXMgY2FuIGNhdXNlIG1fY2FuY2VsbGVkIHRvIGJlIHNldCB0byB0cnVlLCBpZiBp
dCBwYXNzZXMgdXAgYW4gZXJyb3IgdG8gbV9oYW5kbGUtPmNsaWVudCgpIHdoaWNoIGNhdXNlcyB0
aGUgam9iIHRvIGJlIGNhbmNlbGxlZAorICAgIHZvaWQgc2VuZFJlc3BvbnNlSWZOZWVkZWQoKTsK
KworICAgIHZvaWQgZmlyZUxvYWREYXRhVGltZXIoVGltZXI8TmV0d29ya0pvYj4qKQorICAgIHsK
KyAgICAgICAgcGFyc2VEYXRhKCk7CisgICAgfQorCisgICAgdm9pZCBmaXJlTG9hZEFib3V0VGlt
ZXIoVGltZXI8TmV0d29ya0pvYj4qKQorICAgIHsKKyAgICAgICAgaGFuZGxlQWJvdXQoKTsKKyAg
ICB9CisKKyAgICB2b2lkIGZpcmVEZWxldGVKb2JUaW1lcihUaW1lcjxOZXR3b3JrSm9iPiopOwor
CisgICAgdm9pZCBwYXJzZURhdGEoKTsKKworICAgIHZvaWQgaGFuZGxlQWJvdXQoKTsKKworICAg
IC8vIFRoZSBzZXJ2ZXIgbmVlZHMgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMuIFNlYXJjaCBp
biB0aGUKKyAgICAvLyBDcmVkZW50aWFsU3RvcmFnZSBvciBwcm9tcHQgdGhlIHVzZXIgdmlhIGRp
YWxvZy4KKyAgICBib29sIGhhbmRsZUF1dGhIZWFkZXIoY29uc3QgU3RyaW5nJiBoZWFkZXIpOwor
CisgICAgYm9vbCBoYW5kbGVGVFBIZWFkZXIoY29uc3QgU3RyaW5nJiBoZWFkZXIpOworCisgICAg
Ym9vbCBzZW5kUmVxdWVzdFdpdGhDcmVkZW50aWFscyhQcm90ZWN0aW9uU3BhY2VTZXJ2ZXJUeXBl
LCBQcm90ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZSwgY29uc3QgU3RyaW5nJiByZWFs
bSk7CisKKyAgICB2b2lkIHN0b3JlQ3JlZGVudGlhbHMoKTsKKworICAgIHZvaWQgcHVyZ2VDcmVk
ZW50aWFscygpOworCitwcml2YXRlOgorICAgIGJvb2wgaXNFcnJvcihpbnQgc3RhdHVzQ29kZSkK
KyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXNDb2RlIDwgMCB8fCAoIW1faXNYSFIgJiYgKDQw
MCA8PSBzdGF0dXNDb2RlICYmIHN0YXR1c0NvZGUgPCA2MDApKTsKKyAgICB9CisKKyAgICBpbnQg
bV9wbGF5ZXJJZDsKKyAgICBTdHJpbmcgbV9wYWdlR3JvdXBOYW1lOworICAgIFJlZlB0cjxSZXNv
dXJjZUhhbmRsZT4gbV9oYW5kbGU7CisgICAgUmVzb3VyY2VSZXNwb25zZSBtX3Jlc3BvbnNlOwor
ICAgIFRpbWVyPE5ldHdvcmtKb2I+IG1fbG9hZERhdGFUaW1lcjsKKyAgICBUaW1lcjxOZXR3b3Jr
Sm9iPiBtX2xvYWRBYm91dFRpbWVyOworICAgIE93blB0cjxNdWx0aXBhcnRSZXNwb25zZURlbGVn
YXRlPiBtX211bHRpcGFydERlbGVnYXRlOworICAgIFRpbWVyPE5ldHdvcmtKb2I+IG1fZGVsZXRl
Sm9iVGltZXI7CisgICAgU3RyaW5nIG1fY29udGVudFR5cGU7CisgICAgU3RyaW5nIG1fY29udGVu
dERpc3Bvc2l0aW9uOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrU3RyZWFtRmFj
dG9yeSogbV9zdHJlYW1GYWN0b3J5OworICAgIGJvb2wgbV9pc0ZpbGU7CisgICAgYm9vbCBtX2lz
RGF0YTsKKyAgICBib29sIG1faXNBYm91dDsKKyAgICBib29sIG1faXNGVFA7CisgICAgYm9vbCBt
X2lzRlRQRGlyOworICAgIGJvb2wgbV9pc1J1bm5pbmc7CisgICAgYm9vbCBtX2NhbmNlbGxlZDsK
KyAgICBib29sIG1fc3RhdHVzUmVjZWl2ZWQ7CisgICAgYm9vbCBtX2RhdGFSZWNlaXZlZDsKKyAg
ICBib29sIG1fcmVzcG9uc2VTZW50OworCisgICAgLy8gSWYgYW4gSFRUUCBzdGF0dXMgY29kZSBp
cyByZWNlaXZlZCwgbV9leHRlbmRlZFN0YXR1c0NvZGUgYW5kIG1fcmVzcG9uc2UuaHR0cFN0YXR1
c0NvZGUgd2lsbCBib3RoIGJlIHNldCB0byBpdC4KKyAgICAvLyBJZiBhIHBsYXRmb3JtIGVycm9y
IGNvZGUgaXMgcmVjZWl2ZWQsIG1fZXh0ZW5kZWRTdGF0dXNDb2RlIHdpbGwgYmUgc2V0IHRvIGl0
IGFuZCBtX3Jlc3BvbnNlLmh0dHBTdGF0dXNDb2RlIHdpbGwgYmUgc2V0IHRvIDQwNC4KKyAgICBp
bnQgbV9leHRlbmRlZFN0YXR1c0NvZGU7CisKKyAgICBpbnQgbV9yZWRpcmVjdENvdW50OworCisg
ICAgRGVmZXJyZWREYXRhIG1fZGVmZXJyZWREYXRhOworICAgIGludCBtX2RlZmVyTG9hZGluZ0Nv
dW50OworICAgIGJvb2wgbV9jYWxsaW5nQ2xpZW50OworICAgIGNvbnN0IEZyYW1lKiBtX2ZyYW1l
OworICAgIGJvb2wgbV9pc1hIUjsgLy8gRklYTUUgLSBBZnRlciA3LjAsIHJlbW92ZSB0aGlzLiBP
bmx5IHRoZSBRdCBwb3J0IHJlcG9ydHMgSFRUUCBlcnJvciBzdGF0dXNlcyBhcyBkaWRGYWlscywg
c28gd2UgcHJvYmFibHkgc2hvdWxkbid0LgorICAgIGJvb2wgbV9uZWVkc1JldHJ5QXNGVFBEaXJl
Y3Rvcnk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBOZXR3b3Jr
Sm9iX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2ti
ZXJyeS9OZXR3b3JrTWFuYWdlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L2JsYWNrYmVycnkvTmV0d29ya01hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjM4ZjA5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya01hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMjA5
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExIFJlc2VhcmNoIEluIE1v
dGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3Jp
dGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJOZXR3b3JrTWFuYWdlci5oIgorCisjaW5j
bHVkZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAiQ29va2llTWFuYWdlci5oIgorI2luY2x1ZGUgIkNy
ZWRlbnRpYWxTdG9yYWdlLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJGcmFtZUxv
YWRlckNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJOZXR3b3JrSm9iLmgiCisjaW5jbHVk
ZSAiUGFnZS5oIgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlSW50ZXJuYWwuaCIKKyNpbmNsdWRl
ICJSZXNvdXJjZVJlcXVlc3QuaCIKKworI2luY2x1ZGUgPG5ldHdvcmsvTmV0d29ya1JlcXVlc3Qu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitOZXR3b3JrTWFuYWdlciogTmV0d29ya01hbmFn
ZXI6Omluc3RhbmNlKCkKK3sKKyAgICBzdGF0aWMgTmV0d29ya01hbmFnZXIqIHNJbnN0YW5jZTsK
KyAgICBpZiAoIXNJbnN0YW5jZSkgeworICAgICAgICBzSW5zdGFuY2UgPSBuZXcgTmV0d29ya01h
bmFnZXI7CisgICAgICAgIEFTU0VSVChzSW5zdGFuY2UpOworICAgIH0KKyAgICByZXR1cm4gc0lu
c3RhbmNlOworfQorCitib29sIE5ldHdvcmtNYW5hZ2VyOjpzdGFydEpvYihpbnQgcGxheWVySWQs
IFBhc3NSZWZQdHI8UmVzb3VyY2VIYW5kbGU+IGpvYiwgY29uc3QgRnJhbWUmIGZyYW1lLCBib29s
IGRlZmVyc0xvYWRpbmcpCit7CisgICAgQVNTRVJUKGpvYi5nZXQoKSk7CisgICAgLy8gV2Ugc2hv
dWxkbid0IGNhbGwgbWV0aG9kcyBvbiBQYXNzUmVmUHRyIHNvIG1ha2UgYSBuZXcgUmVmUHQuCisg
ICAgUmVmUHRyPFJlc291cmNlSGFuZGxlPiByZWZKb2Ioam9iKTsKKyAgICByZXR1cm4gc3RhcnRK
b2IocGxheWVySWQsIHJlZkpvYiwgcmVmSm9iLT5maXJzdFJlcXVlc3QoKSwgZnJhbWUsIGRlZmVy
c0xvYWRpbmcpOworfQorCitib29sIE5ldHdvcmtNYW5hZ2VyOjpzdGFydEpvYihpbnQgcGxheWVy
SWQsIFBhc3NSZWZQdHI8UmVzb3VyY2VIYW5kbGU+IGpvYiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0
JiByZXF1ZXN0LCBjb25zdCBGcmFtZSYgZnJhbWUsIGJvb2wgZGVmZXJzTG9hZGluZykKK3sKKyAg
ICBQYWdlKiBwYWdlID0gZnJhbWUucGFnZSgpOworICAgIGlmICghcGFnZSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrU3RyZWFtRmFjdG9y
eSogc3RyZWFtRmFjdG9yeSA9IHBhZ2UtPmNocm9tZSgpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+
bmV0d29ya1N0cmVhbUZhY3RvcnkoKTsKKyAgICByZXR1cm4gc3RhcnRKb2IocGxheWVySWQsIHBh
Z2UtPmdyb3VwTmFtZSgpLCBqb2IsIHJlcXVlc3QsIHN0cmVhbUZhY3RvcnksIGZyYW1lLCBkZWZl
cnNMb2FkaW5nID8gMSA6IDApOworfQorCitib29sIE5ldHdvcmtNYW5hZ2VyOjpzdGFydEpvYihp
bnQgcGxheWVySWQsIGNvbnN0IFN0cmluZyYgcGFnZUdyb3VwTmFtZSwgUGFzc1JlZlB0cjxSZXNv
dXJjZUhhbmRsZT4gam9iLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpOZXR3b3JrU3RyZWFtRmFjdG9yeSogc3RyZWFtRmFjdG9yeSwgY29uc3Qg
RnJhbWUmIGZyYW1lLCBpbnQgZGVmZXJMb2FkaW5nQ291bnQsIGludCByZWRpcmVjdENvdW50KQor
eworICAgIC8vIE1ha2Ugc3VyZSB0aGUgUmVzb3VyY2VIYW5kbGUgZG9lc24ndCBnbyBvdXQgb2Yg
c2NvcGUgd2hpbGUgY2FsbGluZyBjYWxsYmFja3MuCisgICAgUmVmUHRyPFJlc291cmNlSGFuZGxl
PiBndWFyZEpvYihqb2IpOworCisgICAgS1VSTCB1cmwgPSByZXF1ZXN0LnVybCgpOworCisgICAg
Ly8gT25seSBsb2FkIHRoZSBpbml0aWFsIHVybCBvbmNlLgorICAgIGJvb2wgaXNJbml0aWFsID0g
KHVybCA9PSBtX2luaXRpYWxVUkwpOworICAgIGlmIChpc0luaXRpYWwpCisgICAgICAgIG1faW5p
dGlhbFVSTCA9IEtVUkwoKTsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVx
dWVzdCBwbGF0Zm9ybVJlcXVlc3Q7CisgICAgcmVxdWVzdC5pbml0aWFsaXplUGxhdGZvcm1SZXF1
ZXN0KHBsYXRmb3JtUmVxdWVzdCwgaXNJbml0aWFsKTsKKworICAgIC8vIEF0dGFjaCBhbnkgYXBw
bGljYWJsZSBhdXRoIGNyZWRlbnRpYWxzIHRvIHRoZSBOZXR3b3JrUmVxdWVzdC4KKyAgICBBdXRo
ZW50aWNhdGlvbkNoYWxsZW5nZSYgY2hhbGxlbmdlID0gZ3VhcmRKb2ItPmdldEludGVybmFsKCkt
Pm1fY3VycmVudFdlYkNoYWxsZW5nZTsKKyAgICBpZiAoIWNoYWxsZW5nZS5pc051bGwoKSkgewor
ICAgICAgICBDcmVkZW50aWFsIGNyZWRlbnRpYWwgPSBjaGFsbGVuZ2UucHJvcG9zZWRDcmVkZW50
aWFsKCk7CisgICAgICAgIFByb3RlY3Rpb25TcGFjZSBwcm90ZWN0aW9uU3BhY2UgPSBjaGFsbGVu
Z2UucHJvdGVjdGlvblNwYWNlKCk7CisgICAgICAgIFByb3RlY3Rpb25TcGFjZVNlcnZlclR5cGUg
dHlwZSA9IHByb3RlY3Rpb25TcGFjZS5zZXJ2ZXJUeXBlKCk7CisKKyAgICAgICAgU3RyaW5nIHVz
ZXJuYW1lID0gY3JlZGVudGlhbC51c2VyKCk7CisgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IGNy
ZWRlbnRpYWwucGFzc3dvcmQoKTsKKworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0
d29ya1JlcXVlc3Q6OkF1dGhUeXBlIGF1dGhUeXBlID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5l
dHdvcmtSZXF1ZXN0OjpBdXRoTm9uZTsKKyAgICAgICAgaWYgKHR5cGUgPT0gUHJvdGVjdGlvblNw
YWNlU2VydmVySFRUUCkgeworICAgICAgICAgICAgc3dpdGNoIChwcm90ZWN0aW9uU3BhY2UuYXV0
aGVudGljYXRpb25TY2hlbWUoKSkgeworICAgICAgICAgICAgY2FzZSBQcm90ZWN0aW9uU3BhY2VB
dXRoZW50aWNhdGlvblNjaGVtZUhUVFBCYXNpYzoKKyAgICAgICAgICAgICAgICBhdXRoVHlwZSA9
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6QXV0aEhUVFBCYXNpYzsKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUHJvdGVjdGlvblNwYWNlQXV0
aGVudGljYXRpb25TY2hlbWVIVFRQRGlnZXN0OgorICAgICAgICAgICAgICAgIGF1dGhUeXBlID0g
QmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpBdXRoSFRUUERpZ2VzdDsKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUHJvdGVjdGlvblNwYWNlQXV0
aGVudGljYXRpb25TY2hlbWVOVExNOgorICAgICAgICAgICAgICAgIGF1dGhUeXBlID0gQmxhY2tC
ZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpBdXRoSFRUUE5UTE07CisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBMb3RzIG1vcmUgY2FzZXMgdG8gaGFuZGxlLgor
ICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byBBdXRo
Tm9uZSBhcyBwZXIgYWJvdmUuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9
CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBQcm90ZWN0aW9uU3BhY2VTZXJ2ZXJGVFApCisg
ICAgICAgICAgICBhdXRoVHlwZSA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVz
dDo6QXV0aEZUUDsKKworICAgICAgICBpZiAoYXV0aFR5cGUgIT0gQmxhY2tCZXJyeTo6UGxhdGZv
cm06Ok5ldHdvcmtSZXF1ZXN0OjpBdXRoTm9uZSkKKyAgICAgICAgICAgIHBsYXRmb3JtUmVxdWVz
dC5zZXRDcmVkZW50aWFscyh1c2VybmFtZS51dGY4KCkuZGF0YSgpLCBwYXNzd29yZC51dGY4KCku
ZGF0YSgpLCBhdXRoVHlwZSk7CisgICAgfSBlbHNlIGlmICh1cmwucHJvdG9jb2xJbkhUVFBGYW1p
bHkoKSkgeworICAgICAgICAvLyBGb3IgVVJMcyB0aGF0IG1hdGNoIHRoZSBwYXRocyBvZiB0aG9z
ZSBwcmV2aW91c2x5IGNoYWxsZW5nZWQgZm9yIEhUVFAgQmFzaWMgYXV0aGVudGljYXRpb24sCisg
ICAgICAgIC8vIHRyeSBhbmQgcmV1c2UgdGhlIGNyZWRlbnRpYWwgcHJlZW1wdGl2ZWx5LCBhcyBh
bGxvd2VkIGJ5IFJGQyAyNjE3LgorICAgICAgICBDcmVkZW50aWFsIGNyZWRlbnRpYWwgPSBDcmVk
ZW50aWFsU3RvcmFnZTo6Z2V0KHVybCk7CisgICAgICAgIGlmICghY3JlZGVudGlhbC5pc0VtcHR5
KCkpCisgICAgICAgICAgICBwbGF0Zm9ybVJlcXVlc3Quc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlh
bC51c2VyKCkudXRmOCgpLmRhdGEoKSwgY3JlZGVudGlhbC5wYXNzd29yZCgpLnV0ZjgoKS5kYXRh
KCksIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6QXV0aEhUVFBCYXNpYyk7
CisgICAgfQorCisgICAgaWYgKCgmZnJhbWUpICYmICgmZnJhbWUpLT5sb2FkZXIoKSAmJiAoJmZy
YW1lKS0+bG9hZGVyKCktPmNsaWVudCgpCisgICAgICAgICYmIHN0YXRpY19jYXN0PEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeSo+KCgmZnJhbWUpLT5sb2FkZXIoKS0+Y2xpZW50KCkpLT5jb29r
aWVzRW5hYmxlZCgpKSB7CisgICAgICAgIC8vIFByZXBhcmUgYSBjb29raWUgaGVhZGVyIGlmIHRo
ZXJlIGFyZSBjb29raWVzIHJlbGF0ZWQgdG8gdGhpcyB1cmwuCisgICAgICAgIFN0cmluZyBjb29r
aWVQYWlycyA9IGNvb2tpZU1hbmFnZXIoKS5nZXRDb29raWUodXJsLCBXaXRoSHR0cE9ubHlDb29r
aWVzKTsKKyAgICAgICAgaWYgKCFjb29raWVQYWlycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAg
IC8vIFdlIGVuY29kZSB0aGUgY29va2llIGhlYWRlciBkYXRhIHVzaW5nIHV0ZjggdG8gc3VwcG9y
dCB1bmljb2RlIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAvLyBGb3IgbW9yZSBpbmZvcm1hdGlv
biwgbG9vayBhdCBSRkM1OTg3IC0gNC4xIChodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1
OTg3I3JlZi1JU08tODg1OS0xKS4KKyAgICAgICAgICAgIHBsYXRmb3JtUmVxdWVzdC5zZXRDb29r
aWVEYXRhKGNvb2tpZVBhaXJzLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICB9CisgICAgfQorCisg
ICAgaWYgKCFyZXF1ZXN0Lm92ZXJyaWRlQ29udGVudFR5cGUoKS5pc0VtcHR5KCkpCisgICAgICAg
IHBsYXRmb3JtUmVxdWVzdC5zZXRPdmVycmlkZUNvbnRlbnRUeXBlKHJlcXVlc3Qub3ZlcnJpZGVD
b250ZW50VHlwZSgpLmxhdGluMSgpLmRhdGEoKSk7CisKKyAgICBOZXR3b3JrSm9iKiBuZXR3b3Jr
Sm9iID0gbmV3IE5ldHdvcmtKb2I7CisgICAgaWYgKCFuZXR3b3JrSm9iKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgaWYgKCFuZXR3b3JrSm9iLT5pbml0aWFsaXplKHBsYXllcklkLCBwYWdl
R3JvdXBOYW1lLCB1cmwsIHBsYXRmb3JtUmVxdWVzdCwgZ3VhcmRKb2IsIHN0cmVhbUZhY3Rvcnks
IGZyYW1lLCBkZWZlckxvYWRpbmdDb3VudCwgcmVkaXJlY3RDb3VudCkpIHsKKyAgICAgICAgZGVs
ZXRlIG5ldHdvcmtKb2I7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBN
YWtlIHN1cmUgd2UgaGF2ZSBvbmx5IG9uZSBOZXR3b3JrSm9iIGZvciBvbmUgUmVzb3VyY2VIYW5k
bGUuCisgICAgQVNTRVJUKCFmaW5kSm9iRm9ySGFuZGxlKGd1YXJkSm9iKSk7CisKKyAgICBtX2pv
YnMuYXBwZW5kKG5ldHdvcmtKb2IpOworCisgICAgaWYgKHVybC5wcm90b2NvbElzKCJkYXRhIikp
IHsKKyAgICAgICAgbmV0d29ya0pvYi0+bG9hZERhdGFVUkwoKTsKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorCisgICAgaWYgKHVybC5wcm90b2NvbElzKCJhYm91dCIpKSB7CisgICAgICAg
IC8vIFRyeSB0byBoYW5kbGUgdGhlIHVybCBpbnRlcm5hbGx5OyBpZiBpdCBpc24ndCByZWNvZ25p
emVkLCBjb250aW51ZSBhbmQgcGFzcyBpdCB0byB0aGUgY2xpZW50LgorICAgICAgICBpZiAobmV0
d29ya0pvYi0+bG9hZEFib3V0VVJMKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisKKyAgICBpbnQgcmVzdWx0ID0gbmV0d29ya0pvYi0+c3RyZWFtT3BlbigpOworICAgIGlmIChy
ZXN1bHQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCiti
b29sIE5ldHdvcmtNYW5hZ2VyOjpzdG9wSm9iKFBhc3NSZWZQdHI8UmVzb3VyY2VIYW5kbGU+IGpv
YikKK3sKKyAgICBpZiAoTmV0d29ya0pvYiogbmV0d29ya0pvYiA9IGZpbmRKb2JGb3JIYW5kbGUo
am9iKSkKKyAgICAgICAgcmV0dXJuICFuZXR3b3JrSm9iLT5jYW5jZWxKb2IoKTsKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK05ldHdvcmtKb2IqIE5ldHdvcmtNYW5hZ2VyOjpmaW5kSm9iRm9ySGFu
ZGxlKFBhc3NSZWZQdHI8UmVzb3VyY2VIYW5kbGU+IGpvYikKK3sKKyAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgbV9qb2JzLnNpemUoKTsgKytpKSB7CisgICAgICAgIE5ldHdvcmtKb2IqIG5l
dHdvcmtKb2IgPSBtX2pvYnNbaV07CisgICAgICAgIGlmIChuZXR3b3JrSm9iLT5oYW5kbGUoKSA9
PSBqb2IpIHsKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgb25seSBvbmUgam9iIGZvciBvbmUgaGFu
ZGxlLgorICAgICAgICAgICAgcmV0dXJuIG5ldHdvcmtKb2I7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgTmV0d29ya01hbmFnZXI6OmRlbGV0ZUpvYihOZXR3b3Jr
Sm9iKiBqb2IpCit7CisgICAgQVNTRVJUKCFqb2ItPmlzUnVubmluZygpKTsKKyAgICBzaXplX3Qg
cG9zaXRpb24gPSBtX2pvYnMuZmluZChqb2IpOworICAgIGlmIChwb3NpdGlvbiAhPSBub3RGb3Vu
ZCkKKyAgICAgICAgbV9qb2JzLnJlbW92ZShwb3NpdGlvbik7CisgICAgZGVsZXRlIGpvYjsKK30K
Kwordm9pZCBOZXR3b3JrTWFuYWdlcjo6c2V0RGVmZXJzTG9hZGluZyhQYXNzUmVmUHRyPFJlc291
cmNlSGFuZGxlPiBqb2IsIGJvb2wgZGVmZXJzTG9hZGluZykKK3sKKyAgICBpZiAoTmV0d29ya0pv
YiogbmV0d29ya0pvYiA9IGZpbmRKb2JGb3JIYW5kbGUoam9iKSkKKyAgICAgICAgbmV0d29ya0pv
Yi0+dXBkYXRlRGVmZXJMb2FkaW5nQ291bnQoZGVmZXJzTG9hZGluZyA/IDEgOiAtMSk7Cit9CisK
K3ZvaWQgTmV0d29ya01hbmFnZXI6OnBhdXNlTG9hZChQYXNzUmVmUHRyPFJlc291cmNlSGFuZGxl
PiBqb2IsIGJvb2wgcGF1c2UpCit7CisgICAgaWYgKE5ldHdvcmtKb2IqIG5ldHdvcmtKb2IgPSBm
aW5kSm9iRm9ySGFuZGxlKGpvYikpCisgICAgICAgIG5ldHdvcmtKb2ItPnN0cmVhbVBhdXNlKHBh
dXNlKTsKK30KKworQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZpbHRlclN0cmVhbSogTmV0d29ya01h
bmFnZXI6OnN0cmVhbUZvckhhbmRsZShQYXNzUmVmUHRyPFJlc291cmNlSGFuZGxlPiBqb2IpCit7
CisgICAgTmV0d29ya0pvYiogbmV0d29ya0pvYiA9IGZpbmRKb2JGb3JIYW5kbGUoam9iKTsKKyAg
ICByZXR1cm4gbmV0d29ya0pvYiA/IG5ldHdvcmtKb2ItPndyYXBwZWRTdHJlYW0oKSA6IDA7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrTWFuYWdlci5oIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtNYW5hZ2VyLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2ODYxZgotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrTWFuYWdlci5o
CkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgUmVzZWFy
Y2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgor
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYg
bm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNB
CisgKi8KKworI2lmbmRlZiBOZXR3b3JrTWFuYWdlcl9oCisjZGVmaW5lIE5ldHdvcmtNYW5hZ2Vy
X2gKKworI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZS5oIgorCisj
aW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3Bh
Y2UgUGxhdGZvcm0geworY2xhc3MgRmlsdGVyU3RyZWFtOworY2xhc3MgTmV0d29ya1N0cmVhbUZh
Y3Rvcnk7Cit9Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgRnJhbWU7CitjbGFz
cyBOZXR3b3JrSm9iOworCitjbGFzcyBOZXR3b3JrTWFuYWdlciB7CitwdWJsaWM6CisgICAgc3Rh
dGljIE5ldHdvcmtNYW5hZ2VyKiBpbnN0YW5jZSgpOworICAgIHZvaWQgc2V0SW5pdGlhbFVSTChj
b25zdCBLVVJMJiB1cmwpIHsgbV9pbml0aWFsVVJMID0gdXJsOyB9CisgICAgS1VSTCBpbml0aWFs
VVJMKCkgeyByZXR1cm4gbV9pbml0aWFsVVJMOyB9CisgICAgYm9vbCBzdGFydEpvYihpbnQgcGxh
eWVySWQsIFBhc3NSZWZQdHI8UmVzb3VyY2VIYW5kbGU+IGpvYiwgY29uc3QgRnJhbWUmLCBib29s
IGRlZmVyc0xvYWRpbmcpOworICAgIGJvb2wgc3RhcnRKb2IoaW50IHBsYXllcklkLCBQYXNzUmVm
UHRyPFJlc291cmNlSGFuZGxlPiBqb2IsIGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIGNvbnN0IEZy
YW1lJiwgYm9vbCBkZWZlcnNMb2FkaW5nKTsKKyAgICBib29sIHN0b3BKb2IoUGFzc1JlZlB0cjxS
ZXNvdXJjZUhhbmRsZT4pOworICAgIHZvaWQgc2V0RGVmZXJzTG9hZGluZyhQYXNzUmVmUHRyPFJl
c291cmNlSGFuZGxlPiBqb2IsIGJvb2wgZGVmZXJzTG9hZGluZyk7CisgICAgdm9pZCBwYXVzZUxv
YWQoUGFzc1JlZlB0cjxSZXNvdXJjZUhhbmRsZT4gam9iLCBib29sIHBhdXNlKTsKKyAgICBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6RmlsdGVyU3RyZWFtKiBzdHJlYW1Gb3JIYW5kbGUoUGFzc1JlZlB0
cjxSZXNvdXJjZUhhbmRsZT4pOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBOZXR3b3Jr
Sm9iOworCisgICAgTmV0d29ya0pvYiogZmluZEpvYkZvckhhbmRsZShQYXNzUmVmUHRyPFJlc291
cmNlSGFuZGxlPik7CisgICAgdm9pZCBkZWxldGVKb2IoTmV0d29ya0pvYiopOworICAgIGJvb2wg
c3RhcnRKb2IoaW50IHBsYXllcklkLCBjb25zdCBTdHJpbmcmIHBhZ2VHcm91cE5hbWUsIFBhc3NS
ZWZQdHI8UmVzb3VyY2VIYW5kbGU+LCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6TmV0d29ya1N0cmVhbUZhY3RvcnkqLCBjb25zdCBGcmFtZSYsIGludCBkZWZl
ckxvYWRpbmdDb3VudCA9IDAsIGludCByZWRpcmVjdENvdW50ID0gMCk7CisKKyAgICBWZWN0b3I8
TmV0d29ya0pvYio+IG1fam9iczsKKyAgICBLVVJMIG1faW5pdGlhbFVSTDsKK307CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIE5ldHdvcmtNYW5hZ2VyX2gKLS0gCjEuNy41
LjQKCg==
</data>
<flag name="review"
          id="118284"
          type_id="1"
          status="+"
          setter="rwlbuis"
    />
          </attachment>
      

    </bug>

</bugzilla>