<?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>23546</bug_id>
          
          <creation_ts>2009-01-26 09:44:18 -0800</creation_ts>
          <short_desc>Upstream GoogleURL implementation of KURL</short_desc>
          <delta_ts>2009-01-28 00:20:26 -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>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Darin Fisher (:fishd, Google)">fishd</reporter>
          <assigned_to name="Darin Fisher (:fishd, Google)">fishd</assigned_to>
          <cc>brettw</cc>
    
    <cc>darin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>107037</commentid>
    <comment_count>0</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-01-26 09:44:18 -0800</bug_when>
    <thetext>Upstream GoogleURL implementation of KURL

From here:
http://src.chromium.org/viewvc/chrome/trunk/deps/third_party/WebKit/WebCore/platform/GKURL.cpp
http://src.chromium.org/viewvc/chrome/trunk/deps/third_party/WebKit/WebCore/platform/GoogleURLPrivate.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107038</commentid>
    <comment_count>1</comment_count>
      <attachid>27037</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-01-26 09:48:46 -0800</bug_when>
    <thetext>Created attachment 27037
v1 patch

See corresponding USE(GOOGLEURL) defines in KURL.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107206</commentid>
    <comment_count>2</comment_count>
      <attachid>27037</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-27 09:48:20 -0800</bug_when>
    <thetext>Comment on attachment 27037
v1 patch

Since we&apos;re planning to change KURL&apos;s name to URL in the future, it&apos;s unfortunate the the new filename is GKURL.cpp. I think URLGoogle.cpp might fit in better with the naming in the platform layer in general. Just like KURLMac.mm, only forward-looking in that it omits the K.

&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;KURL.h&quot;
&gt; +
&gt; +#include &quot;CString.h&quot;
&gt; +#include &quot;NotImplemented.h&quot;
&gt; +#include &quot;TextEncoding.h&quot;
&gt; +#include &lt;wtf/Vector.h&gt;
&gt; +
&gt; +#if USE(GOOGLEURL)

It&apos;s better to put the #if up a little higher, before the includes. That&apos;s how we do it in all the SVG source files.

&gt; +    WebCoreCharsetConverter(const TextEncoding* encoding)

Since a TextEncoding is really just a wrapped const char*, it makes sense to pass it by value rather than using a TextEncoding*. Unless you&apos;re just using TextEncoding* as a way to pass the null value. I guess it&apos;s OK to leave it that way since that&apos;s how it&apos;s done in the KURL constructor, but that really seems like something weak we may later want to change.

&gt; +inline void assertProtocolIsGood(const char* protocol)

&gt; +inline const url_parse::UTF16Char* CharactersOrEmpty(const String&amp; str)

&gt; +inline bool isUnicodeEncoding(const TextEncoding* encoding)

&gt; +bool lowerCaseEqualsASCII(const char* begin, const char* end, const char* str)

Functions used only inside a source file should be qualified with the word &quot;static&quot; to give them internal linkage. lowerCaseEqualsASCII seems like something that should be in a shared source file, not inside this one particular Google-specific one. Also, it should assert that the string has no non-ASCII or uppercase characters in it. I could have sworn we already have something similar somewhere in the tree, but I couldn&apos;t quickly find it.

&gt; +GoogleURLPrivate::GoogleURLPrivate()

Why isn&apos;t this in the WebCore namespace?

&gt; +CFURLRef KURL::createCFURL() const {

Wrong formatting.

&gt; +// We handle &quot;parameters&quot; separated be a semicolon, while the old KURL does
&gt; +// not, which can lead to different results in some cases.

Typo here. &quot;be a semicolon&quot;.

I&apos;d like to see a test case demonstrating the effect of this difference. The comment implies it has some observable effect.

&gt; +String KURL::host() const
&gt; +{
&gt; +    // Note: WebKit decode_string()s here.
&gt; +    return m_url.componentString(m_url.m_parsed.host);
&gt; +}

Is that a bug? Test case?

&gt; +// Returns 0 when there is no port or it is invalid.
&gt; +//
&gt; +// We define invalid port numbers to be invalid URLs, and they will be
&gt; +// rejected by the canonicalizer. WebKit&apos;s old one will allow them in
&gt; +// parsing, and return 0 from this port() function.

This comment is confusing. I think what you&apos;re saying is that this function returns 0 when the port number is invalid or missing. I don&apos;t see the point of saying &quot;WebKit&apos;s old one&quot;. This is an implementation of KURL::port too! Both functions have this behavior because it&apos;s the KURL class design.

&gt; +unsigned short int KURL::port() const

Excess &quot;int&quot; here.

&gt; +    // Note: WebKit decode_string()s here.
&gt; +    return m_url.componentString(m_url.m_parsed.password);

Bug? Test case?

&gt; +// Returns the empty string if there is no username.
&gt; +String KURL::user() const
&gt; +{
&gt; +    // Note: WebKit decode_string()s here.
&gt; +    return m_url.componentString(m_url.m_parsed.username);
&gt; +}

Bug? Test case? I have the same question about all those places where you say &quot;WebKit decode_string()s here&quot;. Also, since this code is part of WebKit, it&apos;s a little curious to refer to the other KURL as &quot;WebKit&quot;. Welcome to WebKit, guys!

We need more test cases rather than just code comments about these various behaviors.

&gt; +// This function is used only in the JSC build.
&gt; +void KURL::setHostAndPort(const String&amp; s) {

Misplaced brace here.

&gt; +        // When set with the empty string or something that doesn&apos;t begin with
&gt; +        // a question mark, WebKit will add a question mark for you. The only
&gt; +        // way this isn&apos;t compatible is if you call this function with an empty
&gt; +        // string. Old KURL will leave a &apos;?&apos; with nothing following it in the
&gt; +        // URL, whereas we&apos;ll clear it.

Why is it OK to have this difference in behavior?

&gt; +// Copy the KURL version here on Sept 12, 2008 while doing the webkit merge.

I don&apos;t understand this comment. Maybe it&apos;s just the verb tense that&apos;s confusing me.

&gt; +// FIXME(erg) Somehow share this with KURL? Like we&apos;d theoretically merge with
&gt; +// decodeURLEscapeSequences below?

Our syntax is &quot;FIXME:&quot; without the person&apos;s initials.

&gt; +#ifdef KURL_DECORATE_GLOBALS

What&apos;s this ifdef about?

&gt; +// In WebKit&apos;s implementation, this is called by every component getter.
&gt; +// It will unescape every character, including NULL. This is scary, and may
&gt; +// cause security holes.

Please contribute to the shared WebKit project by creating test cases demonstrating why this is a bad idea. Our project policy is that when you fix a bug, you write a test case demonstrating what was wrong before. Ideally, this policy applies even if you&apos;re fixing the bug by replacing the entire KURL class with your own library!

r=me -- please do consider my comments though; I really think you need test cases demonstrating the many bugs this file claims to be fixing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107209</commentid>
    <comment_count>3</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-01-27 10:07:45 -0800</bug_when>
    <thetext>Hi Darin, thanks for all the thoughtful feedback.  I will revise appropriately, and look into test cases.  This code is actually not my personal work.  I&apos;m just playing code shepherd :)

Brett has filed many bugs against KURL that he believes to be important and which GKURL avoids.  I agree that expressing those differences in terms of layout tests would be good.

I think the issue of decode_string is not about a particular bug per se but about a general rule of thumb that unescaping URL fragments is risky business.  In Mozilla, we had security bugs related to URL unescaping.  It turned out in most cases, that the browser simply didn&apos;t need to be unescaping those strings.  By pushing the unescaping out to only the places where it is really needed (e.g., HTTP authentication code), things got a lot more sane and easy to reason about.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107210</commentid>
    <comment_count>4</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-01-27 10:08:21 -0800</bug_when>
    <thetext>+darin@apple.  forgot to cc you when I replied.  please see comment #3.  thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107212</commentid>
    <comment_count>5</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-01-27 10:14:27 -0800</bug_when>
    <thetext>On the topic of naming, how about I go with KURLGoogle and KURLGooglePrivate for now.  Once we are ready to drop the &quot;K&quot; prefix, we can do so across the board.  Otherwise, things might be a bit confusing in the meantime.  Let me know if you object.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107223</commentid>
    <comment_count>6</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2009-01-27 11:48:31 -0800</bug_when>
    <thetext>&gt;&gt; + // When set with the empty string or something that doesn&apos;t begin with
&gt;&gt; + // a question mark, WebKit will add a question mark for you. The only
&gt;&gt; + // way this isn&apos;t compatible is if you call this function with an empty
&gt;&gt; + // string. Old KURL will leave a &apos;?&apos; with nothing following it in the
&gt;&gt; + // URL, whereas we&apos;ll clear it.
&gt;
&gt; Why is it OK to have this difference in behavior?

I think I did it this way because it would require a little more complexity to support this, and http://foo.com/bar? is the same as http://foo.com/bar

We can add a FIXME if you are concerned about this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107225</commentid>
    <comment_count>7</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-27 11:57:46 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; On the topic of naming, how about I go with KURLGoogle and KURLGooglePrivate
&gt; for now.  Once we are ready to drop the &quot;K&quot; prefix, we can do so across the
&gt; board.

Perfect!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107226</commentid>
    <comment_count>8</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-27 11:58:52 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; I think the issue of decode_string is not about a particular bug per se but
&gt; about a general rule of thumb that unescaping URL fragments is risky business. 
&gt; In Mozilla, we had security bugs related to URL unescaping.  It turned out in
&gt; most cases, that the browser simply didn&apos;t need to be unescaping those strings.
&gt;  By pushing the unescaping out to only the places where it is really needed
&gt; (e.g., HTTP authentication code), things got a lot more sane and easy to reason
&gt; about.

I agree in principle; the current design is influenced by how KDE&apos;s KURL worked, and it could be very easily changed given the small number of callers. That&apos;s why I&apos;m so interested in the test cases. Fixes could be easily done!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107227</commentid>
    <comment_count>9</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-27 12:00:19 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; I think I did it this way because it would require a little more complexity to
&gt; support this, and http://foo.com/bar? is the same as http://foo.com/bar
&gt; 
&gt; We can add a FIXME if you are concerned about this.

I think we should fix the two implementations to match unless there&apos;s a compelling reason for them to differ. If the current KURL behavior without Google URL is no better, then lets do the trivial work to fix it so they can be identical.

A FIXME would be OK. A fix (with a test case demonstrating what changed or demonstrating there is no change) even better.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107282</commentid>
    <comment_count>10</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2009-01-27 18:07:43 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; I think we should fix the two implementations to match unless there&apos;s a
&gt; compelling reason for them to differ. If the current KURL behavior without
&gt; Google URL is no better, then lets do the trivial work to fix it so they can be
&gt; identical.
&gt; 
&gt; A FIXME would be OK. A fix (with a test case demonstrating what changed or
&gt; demonstrating there is no change) even better.

Let&apos;s do the FIXME and I&apos;ll address this once fishd lands this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107298</commentid>
    <comment_count>11</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-01-28 00:20:26 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/40307

I added the FIXME comment and cleaned up the other issues as discussed.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>27037</attachid>
            <date>2009-01-26 09:48:46 -0800</date>
            <delta_ts>2009-01-27 09:48:20 -0800</delta_ts>
            <desc>v1 patch</desc>
            <filename>gkurl_1.diff</filename>
            <type>text/plain</type>
            <size>39328</size>
            <attacher name="Darin Fisher (:fishd, Google)">fishd</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDQwMjUw
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMDktMDEt
MjYgIERhcmluIEZpc2hlciAgPGRhcmluQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MjM1NDYKKyAgICAgICAgVXBzdHJlYW0gR29vZ2xlVVJMIGltcGxlbWVu
dGF0aW9uIG9mIEtVUkwKKworICAgICAgICAqIHBsYXRmb3JtL0dLVVJMLmNwcDogQWRkZWQuCisg
ICAgICAgICogcGxhdGZvcm0vR29vZ2xlVVJMUHJpdmF0ZS5oOiBBZGRlZC4KKwogMjAwOS0wMS0y
NiAgRGltaXRyaSBHbGF6a292ICA8ZGdsYXprb3ZAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IERhcmluIEFkbGVyLgpJbmRleDogcGxhdGZvcm0vR0tVUkwuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIHBsYXRmb3JtL0dLVVJMLmNwcAkocmV2aXNpb24gMCkKKysrIHBsYXRmb3JtL0dLVVJM
LmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw5MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMp
IDIwMDgsIDIwMDksIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0
aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5h
bWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJB
UyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwK
KyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIktVUkwuaCIKKworI2luY2x1ZGUgIkNTdHJpbmcuaCIKKyNpbmNs
dWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlRleHRFbmNvZGluZy5oIgorI2luY2x1
ZGUgPHd0Zi9WZWN0b3IuaD4KKworI2lmIFVTRShHT09HTEVVUkwpCisKKyNpbmNsdWRlIDxnb29n
bGV1cmwvc3JjL3VybF9jYW5vbl9pbnRlcm5hbC5oPgorI2luY2x1ZGUgPGdvb2dsZXVybC9zcmMv
dXJsX3V0aWwuaD4KKwordXNpbmcgV1RGOjp0b0FTQ0lJTG93ZXI7CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworbmFtZXNwYWNlIHsKKworLy8gV3JhcHMgV2ViS2l0J3MgdGV4dCBlbmNvZGluZyBp
biBhIGNoYXJhY3RlciBzZXQgY29udmVydGVyIGZvciB0aGUKKy8vIGNhbm9uaWNhbGl6ZXIuCitj
bGFzcyBXZWJDb3JlQ2hhcnNldENvbnZlcnRlciA6IHB1YmxpYyB1cmxfY2Fub246OkNoYXJzZXRD
b252ZXJ0ZXIgeworcHVibGljOgorICAgIC8vIFRoZSBlbmNvZGluZyBwYXJhbWV0ZXIgbWF5IGJl
IE5VTEwsIGJ1dCBpbiB0aGlzIGNhc2UgdGhlIG9iamVjdCBtdXN0IG5vdAorICAgIC8vIGJlIGNh
bGxlZC4KKyAgICBXZWJDb3JlQ2hhcnNldENvbnZlcnRlcihjb25zdCBUZXh0RW5jb2RpbmcqIGVu
Y29kaW5nKQorICAgICAgICA6IG1fZW5jb2RpbmcoZW5jb2RpbmcpCisgICAgeworICAgIH0KKwor
ICAgIHZpcnR1YWwgdm9pZCBDb252ZXJ0RnJvbVVURjE2KGNvbnN0IHVybF9wYXJzZTo6VVRGMTZD
aGFyKiBpbnB1dCwgaW50IGlucHV0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB1cmxfY2Fub246OkNhbm9uT3V0cHV0KiBvdXRwdXQpCisgICAgeworICAgICAgICBDU3Ry
aW5nIGVuY29kZWQgPSBtX2VuY29kaW5nLT5lbmNvZGUoaW5wdXQsIGlucHV0X2xlbiwgVVJMRW5j
b2RlZEVudGl0aWVzRm9yVW5lbmNvZGFibGVzKTsKKyAgICAgICAgb3V0cHV0LT5BcHBlbmQoZW5j
b2RlZC5kYXRhKCksIHN0YXRpY19jYXN0PGludD4oZW5jb2RlZC5sZW5ndGgoKSkpOworICAgIH0K
KworcHJpdmF0ZToKKyAgICBjb25zdCBUZXh0RW5jb2RpbmcqIG1fZW5jb2Rpbmc7Cit9OworCisv
LyBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIG5hbWVkIGRpZmZlcmVudGx5IHRoYW4g
dGhlIG9uZSBpbiBLVVJMLmNwcAorLy8gc2luY2Ugb3VyIHVuaXQgdGVzdHMgZXZpbGx5IGluY2x1
ZGUgYm90aCBmaWxlcywgYW5kIHRoZWlyIGxvY2FsIGRlZmluaXRpb24KKy8vIHdpbGwgYmUgYW1i
aWd1b3VzLgoraW5saW5lIHZvaWQgYXNzZXJ0UHJvdG9jb2xJc0dvb2QoY29uc3QgY2hhciogcHJv
dG9jb2wpCit7CisjaWZuZGVmIE5ERUJVRworICAgIGNvbnN0IGNoYXIqIHAgPSBwcm90b2NvbDsK
KyAgICB3aGlsZSAoKnApIHsKKyAgICAgICAgQVNTRVJUKCpwID4gJyAnICYmICpwIDwgMHg3RiAm
JiAhKCpwID49ICdBJyAmJiAqcCA8PSAnWicpKTsKKyAgICAgICAgKytwOworICAgIH0KKyNlbmRp
ZgorfQorCisvLyBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLCBv
ciBhIHBvaW50ZXIgdG8gYSBzdGF0aWMgZW1wdHkKKy8vIHN0cmluZyBpZiB0aGUgaW5wdXQgc3Ry
aW5nIGlzIE5VTEwuIFRoaXMgd2lsbCBhbHdheXMgZW5zdXJlIHdlIGhhdmUgYSBub24tCisvLyBO
VUxMIGNoYXJhY3RlciBwb2ludGVyIHNpbmNlIFJlcGxhY2VDb21wb25lbnRzIGhhcyBzcGVjaWFs
IG1lYW5pbmcgZm9yIE5VTEwuCitpbmxpbmUgY29uc3QgdXJsX3BhcnNlOjpVVEYxNkNoYXIqIENo
YXJhY3RlcnNPckVtcHR5KGNvbnN0IFN0cmluZyYgc3RyKQoreworICAgIHN0YXRpYyBjb25zdCB1
cmxfcGFyc2U6OlVURjE2Q2hhciB6ZXJvID0gMDsKKyAgICByZXR1cm4gc3RyLmNoYXJhY3RlcnMo
KSA/CisgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdXJsX3BhcnNlOjpVVEYxNkNo
YXIqPihzdHIuY2hhcmFjdGVycygpKSA6CisgICAgICAgICAgICZ6ZXJvOworfQorCitpbmxpbmUg
Ym9vbCBpc1VuaWNvZGVFbmNvZGluZyhjb25zdCBUZXh0RW5jb2RpbmcqIGVuY29kaW5nKQorewor
ICAgIHJldHVybiBlbmNvZGluZy0+ZW5jb2RpbmdGb3JGb3JtU3VibWlzc2lvbigpID09IFVURjhF
bmNvZGluZygpOworfQorCitib29sIGxvd2VyQ2FzZUVxdWFsc0FTQ0lJKGNvbnN0IGNoYXIqIGJl
Z2luLCBjb25zdCBjaGFyKiBlbmQsIGNvbnN0IGNoYXIqIHN0cikKK3sKKyAgICB3aGlsZSAoYmVn
aW4gIT0gZW5kICYmICpzdHIpIHsKKyAgICAgICAgaWYgKHRvQVNDSUlMb3dlcigqYmVnaW4rKykg
IT0gKnN0cisrKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIEdvb2dsZVVSTFByaXZhdGUgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisK
K0dvb2dsZVVSTFByaXZhdGU6Okdvb2dsZVVSTFByaXZhdGUoKQorICAgIDogbV9pc1ZhbGlkKGZh
bHNlKQorICAgICwgbV91dGY4SXNBU0NJSSh0cnVlKQorICAgICwgbV9zdHJpbmdJc1ZhbGlkKGZh
bHNlKQoreworfQorCitHb29nbGVVUkxQcml2YXRlOjpHb29nbGVVUkxQcml2YXRlKGNvbnN0IHVy
bF9wYXJzZTo6UGFyc2VkJiBwYXJzZWQsIGJvb2wgaXNWYWxpZCkKKyAgICA6IG1faXNWYWxpZChp
c1ZhbGlkKQorICAgICwgbV9wYXJzZWQocGFyc2VkKQorICAgICwgbV91dGY4SXNBU0NJSSh0cnVl
KQorICAgICwgbV9zdHJpbmdJc1ZhbGlkKGZhbHNlKQoreworfQorCisvLyBTZXR0ZXJzIGZvciB0
aGUgZGF0YS4gVXNpbmcgdGhlIEFTQ0lJIHZlcnNpb24gd2hlbiB5b3Uga25vdyB0aGUKKy8vIGRh
dGEgaXMgQVNDSUkgd2lsbCBiZSBzbGlnaHRseSBtb3JlIGVmZmljaWVudC4gVGhlIFVURi04IHZl
cnNpb24KKy8vIHdpbGwgYWx3YXlzIGJlIGNvcnJlY3QgaWYgdGhlIGNhbGxlciBpcyB1bnN1cmUu
Cit2b2lkIEdvb2dsZVVSTFByaXZhdGU6OnNldFV0ZjgoY29uc3QgY2hhciogZGF0YSwgaW50IGRh
dGFfbGVuKQoreworICAgIC8vIFRoZSBtX3V0ZjhJc0FTQ0lJIG11c3QgYWx3YXlzIGJlIGNvcnJl
Y3Qgc2luY2UgdGhlIERlcHJlY2F0ZWRTdHJpbmcKKyAgICAvLyBnZXR0ZXIgbXVzdCBjcmVhdGUg
aXQgd2l0aCB0aGUgcHJvcGVyIGNvbnN0cnVjdG9yLiBUaGlzIHRlc3QgY2FuIGJlCisgICAgLy8g
cmVtb3ZlZCB3aGVuIERlcHJlY2F0ZWRTdHJpbmcgaXMgZ29uZSwgYnV0IGl0IHN0aWxsIG1pZ2h0
IGJlIGEKKyAgICAvLyBwZXJmb3JtYW5jZSB3aW4uCisgICAgbV91dGY4SXNBU0NJSSA9IHRydWU7
CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhX2xlbjsgaSsrKSB7CisgICAgICAgIGlmIChz
dGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihkYXRhW2ldKSA+PSAweDgwKSB7CisgICAgICAgICAg
ICBtX3V0ZjhJc0FTQ0lJID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIG1fdXRmOCA9IENTdHJpbmcoZGF0YSwgZGF0YV9sZW4pOworICAgIG1fc3Ry
aW5nSXNWYWxpZCA9IGZhbHNlOworfQorCit2b2lkIEdvb2dsZVVSTFByaXZhdGU6OnNldEFzY2lp
KGNvbnN0IGNoYXIqIGRhdGEsIGludCBkYXRhX2xlbikKK3sKKyAgICBtX3V0ZjggPSBDU3RyaW5n
KGRhdGEsIGRhdGFfbGVuKTsKKyAgICBtX3V0ZjhJc0FTQ0lJID0gdHJ1ZTsKKyAgICBtX3N0cmlu
Z0lzVmFsaWQgPSBmYWxzZTsKK30KKwordm9pZCBHb29nbGVVUkxQcml2YXRlOjppbml0KGNvbnN0
IEtVUkwmIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nJiBy
ZWxhdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXh0RW5jb2Rpbmcq
IHF1ZXJ5RW5jb2RpbmcpCit7CisgICAgaW5pdChiYXNlLCByZWxhdGl2ZS5jaGFyYWN0ZXJzKCks
IHJlbGF0aXZlLmxlbmd0aCgpLCBxdWVyeUVuY29kaW5nKTsKK30KKworLy8gTm90ZTogY29kZSBt
b3N0bHkgZHVwbGljYXRlZCBiZWxvdy4KK3ZvaWQgR29vZ2xlVVJMUHJpdmF0ZTo6aW5pdChjb25z
dCBLVVJMJiBiYXNlLCBjb25zdCBjaGFyKiByZWwsIGludCByZWxfbGVuLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IFRleHRFbmNvZGluZyogcXVlcnlfZW5jb2RpbmcpCit7Cisg
ICAgLy8gQXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIHdlIGRvIG5vdCB1c2UgdGhlIGNo
YXJzZXQgY29udmVydGVyIGlmCisgICAgLy8gZW5jb2RpbmcgaXMgVVRGLTggb3Igb3RoZXIgVW5p
Y29kZSBlbmNvZGluZ3MuIE5vdGUgdGhhdCB0aGlzIGlzCisgICAgLy8gcGVyIEhUTUw1IDIuNS4z
IChyZXNvbHZpbmcgVVJMKS4gVGhlIFVSTCBjYW5vbmljYWxpemVyIHdpbGwgYmUKKyAgICAvLyBt
b3JlIGVmZmljaWVudCB3aXRoIG5vIGNoYXJzZXQgY29udmVydGVyIG9iamVjdCBiZWNhdXNlIGl0
CisgICAgLy8gY2FuIGRvIFVURi04IGludGVybmFsbHkgd2l0aCBubyBleHRyYSBjb3BpZXMuCisK
KyAgICAvLyBXZSBmZWVsIGZyZWUgdG8gbWFrZSB0aGUgY2hhcnNldCBjb252ZXJ0ZXIgb2JqZWN0
IGV2ZXJ5IHRpbWUgc2luY2UgaXQncworICAgIC8vIGp1c3QgYSB3cmFwcGVyIGFyb3VuZCBhIHJl
ZmVyZW5jZS4KKyAgICBXZWJDb3JlQ2hhcnNldENvbnZlcnRlciBjaGFyc2V0X2NvbnZlcnRlcl9v
YmplY3QocXVlcnlfZW5jb2RpbmcpOworICAgIFdlYkNvcmVDaGFyc2V0Q29udmVydGVyKiBjaGFy
c2V0X2NvbnZlcnRlciA9CisgICAgICAgICghcXVlcnlfZW5jb2RpbmcgfHwgaXNVbmljb2RlRW5j
b2RpbmcocXVlcnlfZW5jb2RpbmcpKSA/IDAgOgorICAgICAgICAmY2hhcnNldF9jb252ZXJ0ZXJf
b2JqZWN0OworCisgICAgdXJsX2Nhbm9uOjpSYXdDYW5vbk91dHB1dFQ8Y2hhcj4gb3V0cHV0Owor
ICAgIGNvbnN0IENTdHJpbmcmIGJhc2VTdHIgPSBiYXNlLm1fdXJsLnV0ZjhTdHJpbmcoKTsKKyAg
ICBtX2lzVmFsaWQgPSB1cmxfdXRpbDo6UmVzb2x2ZVJlbGF0aXZlKGJhc2VTdHIuZGF0YSgpLCBi
YXNlU3RyLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYmFzZS5tX3VybC5tX3BhcnNlZCwgcmVsLCByZWxfbGVuLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldF9jb252ZXJ0ZXIsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LCAmbV9wYXJzZWQpOworCisgICAg
Ly8gU2VlIEZJWE1FIGluIEdvb2dsZVVSTFByaXZhdGUgaW4gdGhlIGhlYWRlci4gSWYgY2Fub25p
Y2FsaXphdGlvbiBoYXMgbm90CisgICAgLy8gY2hhbmdlZCB0aGUgc3RyaW5nLCB3ZSBjYW4gYXZv
aWQgYW4gZXh0cmEgYWxsb2NhdGlvbiBieSB1c2luZyBhc3NpZ25tZW50LgorICAgIC8vCisgICAg
Ly8gV2hlbiBLVVJMIGVuY291bnRlcnMgYW4gZXJyb3Igc3VjaCB0aGF0IHRoZSBVUkwgaXMgaW52
YWxpZCBhbmQgZW1wdHkKKyAgICAvLyAoZm9yIGV4YW1wbGUsIHJlc29sdmluZyBhIHJlbGF0aXZl
IFVSTCBvbiBhIG5vbi1oaWVyYXJjaGljYWwgYmFzZSksIGl0CisgICAgLy8gd2lsbCBwcm9kdWNl
IGFuIGlzTnVsbCBVUkwsIGFuZCBjYWxsaW5nIHNldFV0Zjggd2lsbCBwcm9kdWNlIGFuIGVtcHR5
CisgICAgLy8gbm9uLW51bGwgVVJMLiBUaGlzIGlzIHVubGlrZWx5IHRvIGFmZmVjdCBhbnl0aGlu
ZywgYnV0IHdlIHByZXNlcnZlIHRoaXMKKyAgICAvLyBqdXN0IGluIGNhc2UuCisgICAgaWYgKG1f
aXNWYWxpZCB8fCBvdXRwdXQubGVuZ3RoKCkpIHsKKyAgICAgICAgLy8gV2l0aG91dCByZWYsIHRo
ZSB3aG9sZSB1cmwgaXMgZ3VhcmFudGVlZCB0byBiZSBBU0NJSS1vbmx5LgorICAgICAgICBpZiAo
bV9wYXJzZWQucmVmLmlzX25vbmVtcHR5KCkpCisgICAgICAgICAgICBzZXRVdGY4KG91dHB1dC5k
YXRhKCksIG91dHB1dC5sZW5ndGgoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNldEFz
Y2lpKG91dHB1dC5kYXRhKCksIG91dHB1dC5sZW5ndGgoKSk7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgLy8gV2ViS2l0IGV4cGVjdHMgcmVzb2x2ZWQgVVJMcyB0byBiZSBlbXB0eSByYXRoZXIgdGhh
biBOVUxMLgorICAgICAgICBzZXRVdGY4KCIiLCAwKTsKKyAgICB9Cit9CisKKy8vIE5vdGU6IGNv
ZGUgbW9zdGx5IGR1cGxpY2F0ZWQgYWJvdmUuIFNlZSBGSVhNRXMgYW5kIGNvbW1lbnRzIHRoZXJl
Lgordm9pZCBHb29nbGVVUkxQcml2YXRlOjppbml0KGNvbnN0IEtVUkwmIGJhc2UsIGNvbnN0IFVD
aGFyKiByZWwsIGludCByZWxfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IFRleHRFbmNvZGluZyogcXVlcnlfZW5jb2RpbmcpCit7CisgICAgV2ViQ29yZUNoYXJzZXRDb252
ZXJ0ZXIgY2hhcnNldF9jb252ZXJ0ZXJfb2JqZWN0KHF1ZXJ5X2VuY29kaW5nKTsKKyAgICBXZWJD
b3JlQ2hhcnNldENvbnZlcnRlciogY2hhcnNldF9jb252ZXJ0ZXIgPQorICAgICAgICAoIXF1ZXJ5
X2VuY29kaW5nIHx8IGlzVW5pY29kZUVuY29kaW5nKHF1ZXJ5X2VuY29kaW5nKSkgPyAwIDoKKyAg
ICAgICAgJmNoYXJzZXRfY29udmVydGVyX29iamVjdDsKKworICAgIHVybF9jYW5vbjo6UmF3Q2Fu
b25PdXRwdXRUPGNoYXI+IG91dHB1dDsKKyAgICBjb25zdCBDU3RyaW5nJiBiYXNlU3RyID0gYmFz
ZS5tX3VybC51dGY4U3RyaW5nKCk7CisgICAgbV9pc1ZhbGlkID0gdXJsX3V0aWw6OlJlc29sdmVS
ZWxhdGl2ZShiYXNlU3RyLmRhdGEoKSwgYmFzZVN0ci5sZW5ndGgoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UubV91cmwubV9wYXJzZWQsIHJlbCwgcmVs
X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRf
Y29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91
dHB1dCwgJm1fcGFyc2VkKTsKKworICAgIGlmIChtX2lzVmFsaWQgfHwgb3V0cHV0Lmxlbmd0aCgp
KSB7CisgICAgICAgIGlmIChtX3BhcnNlZC5yZWYuaXNfbm9uZW1wdHkoKSkKKyAgICAgICAgICAg
IHNldFV0Zjgob3V0cHV0LmRhdGEoKSwgb3V0cHV0Lmxlbmd0aCgpKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgc2V0QXNjaWkob3V0cHV0LmRhdGEoKSwgb3V0cHV0Lmxlbmd0aCgpKTsKKyAg
ICB9IGVsc2UKKyAgICAgICAgc2V0VXRmOCgiIiwgMCk7Cit9CisKK3ZvaWQgR29vZ2xlVVJMUHJp
dmF0ZTo6Y29weVRvKEdvb2dsZVVSTFByaXZhdGUqIGRlc3QpIGNvbnN0Cit7CisgICAgZGVzdC0+
bV9pc1ZhbGlkID0gbV9pc1ZhbGlkOworICAgIGRlc3QtPm1fcGFyc2VkID0gbV9wYXJzZWQ7CisK
KyAgICAvLyBEb24ndCBjb3B5IHRoZSAxNi1iaXQgc3RyaW5nIHNpbmNlIHRoYXQgd2lsbCBiZSBy
ZWdlbmVyYXRlZCBhcyBuZWVkZWQuCisgICAgZGVzdC0+bV91dGY4ID0gQ1N0cmluZyhtX3V0Zjgu
ZGF0YSgpLCBtX3V0ZjgubGVuZ3RoKCkpOworICAgIGRlc3QtPm1fdXRmOElzQVNDSUkgPSBtX3V0
ZjhJc0FTQ0lJOworICAgIGRlc3QtPm1fc3RyaW5nSXNWYWxpZCA9IGZhbHNlOworfQorCitTdHJp
bmcgR29vZ2xlVVJMUHJpdmF0ZTo6Y29tcG9uZW50U3RyaW5nKGNvbnN0IHVybF9wYXJzZTo6Q29t
cG9uZW50JiBjb21wKSBjb25zdAoreworICAgIGlmICghbV9pc1ZhbGlkIHx8IGNvbXAubGVuIDw9
IDApIHsKKyAgICAgICAgLy8gS1VSTCByZXR1cm5zIGEgTlVMTCBzdHJpbmcgaWYgdGhlIFVSTCBp
cyBpdHNlbGYgYSBOVUxMIHN0cmluZywgYW5kIGFuCisgICAgICAgIC8vIGVtcHR5IHN0cmluZyBm
b3Igb3RoZXIgbm9uZXhpc3RhbnQgZW50aXRpZXMuCisgICAgICAgIGlmICh1dGY4U3RyaW5nKCku
aXNOdWxsKCkpCisgICAgICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBT
dHJpbmcoIiIsIDApOworICAgIH0KKyAgICAvLyBiZWdpbiBhbmQgbGVuIGFyZSBpbiB0ZXJtcyBv
ZiBieXRlcyB3aGljaCBkbyBub3QgbWF0Y2gKKyAgICAvLyBpZiBzdHJpbmcoKSBpcyBVVEYtMTYg
YW5kIGlucHV0IGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgorICAgIC8vIEhvd2V2ZXIs
IHRoZSBvbmx5IHBhcnQgaW4gdXJsU3RyaW5nIHRoYXQgY2FuIGNvbnRhaW4gbm9uLUFTQ0lJCisg
ICAgLy8gY2hhcmFjdGVycyBpcyAncmVmJyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuIEluIHRo
YXQgY2FzZSwKKyAgICAvLyBiZWdpbiB3aWxsIGFsd2F5cyBtYXRjaCB0aGUgYWN0dWFsIHZhbHVl
IGFuZCBsZW4gKGluIHRlcm1zIG9mCisgICAgLy8gYnl0ZSkgd2lsbCBiZSBsb25nZXIgdGhhbiB3
aGF0J3MgbmVlZGVkIGJ5ICdtaWQnLiBIb3dldmVyLCBtaWQKKyAgICAvLyB0cnVuY2F0ZXMgbGVu
IHRvIGF2b2lkIGdvIHBhc3QgdGhlIGVuZCBvZiBhIHN0cmluZyBzbyB0aGF0IHdlIGNhbgorICAg
IC8vIGdldCBhd2F5IHdpdGh0b3V0IGRvaW5nIGFueXRoaW5nIGhlcmUuCisgICAgcmV0dXJuIHN0
cmluZygpLnN1YnN0cmluZyhjb21wLmJlZ2luLCBjb21wLmxlbik7Cit9CisKK3ZvaWQgR29vZ2xl
VVJMUHJpdmF0ZTo6cmVwbGFjZUNvbXBvbmVudHMoY29uc3QgUmVwbGFjZW1lbnRzJiByZXBsYWNl
bWVudHMpCit7CisgICAgdXJsX2Nhbm9uOjpSYXdDYW5vbk91dHB1dFQ8Y2hhcj4gb3V0cHV0Owor
ICAgIHVybF9wYXJzZTo6UGFyc2VkIG5ld19wYXJzZWQ7CisKKyAgICBtX2lzVmFsaWQgPSB1cmxf
dXRpbDo6UmVwbGFjZUNvbXBvbmVudHModXRmOFN0cmluZygpLmRhdGEoKSwKKyAgICAgICAgdXRm
OFN0cmluZygpLmxlbmd0aCgpLCBtX3BhcnNlZCwgcmVwbGFjZW1lbnRzLCBOVUxMLCAmb3V0cHV0
LCAmbmV3X3BhcnNlZCk7CisKKyAgICBtX3BhcnNlZCA9IG5ld19wYXJzZWQ7CisgICAgaWYgKG1f
cGFyc2VkLnJlZi5pc19ub25lbXB0eSgpKQorICAgICAgICBzZXRVdGY4KG91dHB1dC5kYXRhKCks
IG91dHB1dC5sZW5ndGgoKSk7CisgICAgZWxzZQorICAgICAgICBzZXRBc2NpaShvdXRwdXQuZGF0
YSgpLCBvdXRwdXQubGVuZ3RoKCkpOworfQorCitjb25zdCBTdHJpbmcmIEdvb2dsZVVSTFByaXZh
dGU6OnN0cmluZygpIGNvbnN0Cit7CisgICAgaWYgKCFtX3N0cmluZ0lzVmFsaWQpIHsKKyAgICAg
ICAgLy8gTXVzdCBzcGVjaWFsIGNhc2UgdGhlIE5VTEwgY2FzZSwgc2luY2UgY29uc3RydWN0aW5n
IHRoZQorICAgICAgICAvLyBzdHJpbmcgbGlrZSB3ZSBkbyBiZWxvdyB3aWxsIGdlbmVyYXRlIGFu
IGVtcHR5IHJhdGhlciB0aGFuCisgICAgICAgIC8vIGEgTlVMTCBzdHJpbmcuCisgICAgICAgIGlm
IChtX3V0ZjguaXNOdWxsKCkpCisgICAgICAgICAgICBtX3N0cmluZyA9IFN0cmluZygpOworICAg
ICAgICBlbHNlIGlmIChtX3V0ZjhJc0FTQ0lJKQorICAgICAgICAgICAgbV9zdHJpbmcgPSBTdHJp
bmcobV91dGY4LmRhdGEoKSwgbV91dGY4Lmxlbmd0aCgpKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgbV9zdHJpbmcgPSBTdHJpbmc6OmZyb21VVEY4KG1fdXRmOC5kYXRhKCksIG1fdXRmOC5s
ZW5ndGgoKSk7CisgICAgICAgIG1fc3RyaW5nSXNWYWxpZCA9IHRydWU7CisgICAgfQorICAgIHJl
dHVybiBtX3N0cmluZzsKK30KKworLy8gS1VSTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQ3JlYXRl
cyB3aXRoIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgaW5wdXQgcmVwcmVzZW50aW5nIGFuIGFic29s
dXRlIFVSTC4KKy8vIFdlYkNvcmUgZ2VuZXJhbGx5IGNhbGxzIHRoaXMgb25seSB3aXRoIGhhcmRj
b2RlZCBzdHJpbmdzLCBzbyB0aGUgaW5wdXQgaXMKKy8vIEFTQ0lJLiBXZSB0cmVhdCBpcyBhcyBV
VEYtOCBqdXN0IGluIGNhc2UuCitLVVJMOjpLVVJMKGNvbnN0IGNoYXIgKnVybCkKK3sKKyAgICAv
LyBGSVhNRShicmV0dHcpIHRoZSBNYWMgY29kZSBjaGVja3MgZm9yIGJlZ2lubmluZyB3aXRoIGEg
c2xhc2ggYW5kCisgICAgLy8gY29udmVydGluZyB0byBhIGZpbGU6IFVSTC4gV2Ugd2lsbCB3YW50
IHRvIGFkZCB0aGlzIGFzIHdlbGwgb25jZSB3ZSBjYW4KKyAgICAvLyBjb21waWxlIG9uIGEgc3lz
dGVtIGxpa2UgdGhhdC4KKyAgICBtX3VybC5pbml0KEtVUkwoKSwgdXJsLCBzdHJsZW4odXJsKSwg
TlVMTCk7CisKKyAgICAvLyBUaGUgb25lLWFyZ3VtZW50IGNvbnN0cnVjdG9ycyBzaG91bGQgbmV2
ZXIgZ2VuZXJhdGUgYSBOVUxMIHN0cmluZy4KKyAgICAvLyBUaGlzIGlzIGEgZnVubnkgcXVpcmsg
b2YgS1VSTCAocHJvYmFibHkgYSBidWcpIHdoaWNoIHdlIHByZXNlcnZlLgorICAgIGlmIChtX3Vy
bC51dGY4U3RyaW5nKCkuaXNOdWxsKCkpCisgICAgICAgIG1fdXJsLnNldEFzY2lpKCIiLCAwKTsK
K30KKworLy8gSW5pdGlhbGl6ZXMgd2l0aCBhIHN0cmluZyByZXByZXNlbnRpbmcgYW4gYWJzb2x1
dGUgVVJMLiBObyBlbmNvZGluZworLy8gaW5mb3JtYXRpb24gaXMgc3BlY2lmaWVkLiBUaGlzIGdl
bmVyYWxseSBoYXBwZW5zIHdoZW4gYSBLVVJMIGlzIGNvbnZlcnRlZAorLy8gdG8gYSBzdHJpbmcg
YW5kIHRoZW4gY29udmVydGVkIGJhY2suIEluIHRoaXMgY2FzZSwgdGhlIFVSTCBpcyBhbHJlYWR5
CisvLyBjYW5vbmljYWwgYW5kIGluIHByb3BlciBlc2NhcGVkIGZvcm0gc28gbmVlZHMgbm8gZW5j
b2RpbmcuIFdlIHRyZWF0IGl0IHdhcworLy8gVVRGLTgganVzdCBpbiBjYXNlLgorS1VSTDo6S1VS
TChjb25zdCBTdHJpbmcmIHVybCkKK3sKKyAgICBpZiAoIXVybC5pc051bGwoKSkKKyAgICAgICAg
bV91cmwuaW5pdChLVVJMKCksIHVybCwgTlVMTCk7CisgICAgZWxzZSB7CisgICAgICAgIC8vIFdl
YktpdCBleHBlY3RzIHVzIHRvIHByZXNlcnZlIHRoZSBudWxsbmVzcyBvZiBzdHJpbmdzIHdoZW4g
dGhpcworICAgICAgICAvLyBjb25zdHJ1Y3RvciBpcyB1c2VkLiBJbiBhbGwgb3RoZXIgY2FzZXMs
IGl0IGV4cGVjdHMgYSBub24tbnVsbAorICAgICAgICAvLyBlbXB0eSBzdHJpbmcsIHdoaWNoIGlz
IHdoYXQgaW5pdCgpIHdpbGwgY3JlYXRlLgorICAgICAgICBtX3VybC5tX2lzVmFsaWQgPSBmYWxz
ZTsKKyAgICB9Cit9CisKKy8vIENvbnN0cnVjdHMgYSBuZXcgVVJMIGdpdmVuIGEgYmFzZSBVUkwg
YW5kIGEgcG9zc2libHkgcmVsYXRpdmUgaW5wdXQgVVJMLgorLy8gVGhpcyBhc3N1bWVzIFVURi04
IGVuY29kaW5nLgorS1VSTDo6S1VSTChjb25zdCBLVVJMJiBiYXNlLCBjb25zdCBTdHJpbmcmIHJl
bGF0aXZlKQoreworICAgIG1fdXJsLmluaXQoYmFzZSwgcmVsYXRpdmUsIE5VTEwpOworfQorCisv
LyBDb25zdHJ1Y3RzIGEgbmV3IFVSTCBnaXZlbiBhIGJhc2UgVVJMIGFuZCBhIHBvc3NpYmx5IHJl
bGF0aXZlIGlucHV0IFVSTC4KKy8vIEFueSBxdWVyeSBwb3J0aW9uIG9mIHRoZSByZWxhdGl2ZSBV
Ukwgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSBnaXZlbiBlbmNvZGluZy4KK0tVUkw6OktVUkwoY29u
c3QgS1VSTCYgYmFzZSwKKyAgICAgICAgICAgY29uc3QgU3RyaW5nJiByZWxhdGl2ZSwKKyAgICAg
ICAgICAgY29uc3QgVGV4dEVuY29kaW5nJiBlbmNvZGluZykKK3sKKyAgICBtX3VybC5pbml0KGJh
c2UsIHJlbGF0aXZlLCAmZW5jb2RpbmcuZW5jb2RpbmdGb3JGb3JtU3VibWlzc2lvbigpKTsKK30K
KworS1VSTDo6S1VSTChjb25zdCBjaGFyKiBjYW5vbmljYWxTcGVjLCBpbnQgY2Fub25pY2FsU3Bl
Y0xlbiwKKyAgICAgICAgICAgY29uc3QgdXJsX3BhcnNlOjpQYXJzZWQmIHBhcnNlZCwgYm9vbCBp
c1ZhbGlkKQorICAgIDogbV91cmwocGFyc2VkLCBpc1ZhbGlkKQoreworICAgIC8vIFdlIGtub3cg
dGhlIHJlZmVyZW5jZSBmcmFnbWVudCBpcyB0aGUgb25seSBwYXJ0IHRoYXQgY2FuIGJlIFVURi04
LCBzbworICAgIC8vIHdlIGtub3cgaXQncyBBU0NJSSB3aGVuIHRoZXJlIGlzIG5vIHJlZi4KKyAg
ICBpZiAocGFyc2VkLnJlZi5pc19ub25lbXB0eSgpKQorICAgICAgICBtX3VybC5zZXRVdGY4KGNh
bm9uaWNhbFNwZWMsIGNhbm9uaWNhbFNwZWNMZW4pOworICAgIGVsc2UKKyAgICAgICAgbV91cmwu
c2V0QXNjaWkoY2Fub25pY2FsU3BlYywgY2Fub25pY2FsU3BlY0xlbik7Cit9CisKKyNpZiBQTEFU
Rk9STShDRikKK0tVUkw6OktVUkwoQ0ZVUkxSZWYpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsK
KyAgICBpbnZhbGlkYXRlKCk7Cit9CisKK0NGVVJMUmVmIEtVUkw6OmNyZWF0ZUNGVVJMKCkgY29u
c3QgeworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYK
KworS1VSTCBLVVJMOjpjb3B5KCkgY29uc3QKK3sKKyAgICBLVVJMIHJlc3VsdCA9ICp0aGlzOwor
ICAgIG1fdXJsLmNvcHlUbygmcmVzdWx0Lm1fdXJsKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQor
Citib29sIEtVUkw6OmlzTnVsbCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdXJsLnV0ZjhTdHJp
bmcoKS5pc051bGwoKTsKK30KKworYm9vbCBLVVJMOjppc0VtcHR5KCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV91cmwudXRmOFN0cmluZygpLmxlbmd0aCgpID09IDA7Cit9CisKK2Jvb2wgS1VSTDo6
aXNWYWxpZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdXJsLm1faXNWYWxpZDsKK30KKworYm9v
bCBLVVJMOjpoYXNQYXRoKCkgY29uc3QKK3sKKyAgICAvLyBOb3RlIHRoYXQgaHR0cDovL3d3dy5n
b29nbGUuY29tLyIgaGFzIGEgcGF0aCwgdGhlIHBhdGggaXMgIi8iLiBUaGlzIGNhbgorICAgIC8v
IHJldHVybiBmYWxzZSBvbmx5IGZvciBpbnZhbGlkIG9yIG5vbnN0YW5kYXJkIFVSTHMuCisgICAg
cmV0dXJuIG1fdXJsLm1fcGFyc2VkLnBhdGgubGVuID49IDA7Cit9CisKKy8vIFdlIGhhbmRsZSAi
cGFyYW1ldGVycyIgc2VwYXJhdGVkIGJlIGEgc2VtaWNvbG9uLCB3aGlsZSB0aGUgb2xkIEtVUkwg
ZG9lcworLy8gbm90LCB3aGljaCBjYW4gbGVhZCB0byBkaWZmZXJlbnQgcmVzdWx0cyBpbiBzb21l
IGNhc2VzLgorU3RyaW5nIEtVUkw6Omxhc3RQYXRoQ29tcG9uZW50KCkgY29uc3QKK3sKKyAgICAv
LyBXaGVuIHRoZSBvdXRwdXQgZW5kcyBpbiBhIHNsYXNoLCBXZWJLaXQgaGFzIGRpZmZlcmVudCBl
eHBlY3RhdGlvbnMgdGhhbgorICAgIC8vIG91ciBsaWJyYXJ5LiBGb3IgIi9mb28vYmFyLyIgdGhl
IGxpYnJhcnkgd2lsbCByZXR1cm4gdGhlIGVtcHR5IHN0cmluZywKKyAgICAvLyBidXQgV2ViS2l0
IHdhbnRzICJiYXIiLgorICAgIHVybF9wYXJzZTo6Q29tcG9uZW50IHBhdGggPSBtX3VybC5tX3Bh
cnNlZC5wYXRoOworICAgIGlmIChwYXRoLmxlbiA+IDAgJiYgbV91cmwudXRmOFN0cmluZygpLmRh
dGEoKVtwYXRoLmVuZCgpIC0gMV0gPT0gJy8nKQorICAgICAgICBwYXRoLmxlbi0tOworCisgICAg
dXJsX3BhcnNlOjpDb21wb25lbnQgZmlsZTsKKyAgICB1cmxfcGFyc2U6OkV4dHJhY3RGaWxlTmFt
ZShtX3VybC51dGY4U3RyaW5nKCkuZGF0YSgpLCBwYXRoLCAmZmlsZSk7CisKKyAgICAvLyBCdWc6
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMTAxNSB0aGlzIGZ1bmN0
aW9uIHJldHVybnMKKyAgICAvLyBhIG51bGwgc3RyaW5nIHdoZW4gdGhlIHBhdGggaXMgZW1wdHks
IHdoaWNoIHdlIGR1cGxpY2F0ZSBoZXJlLgorICAgIGlmICghZmlsZS5pc19ub25lbXB0eSgpKQor
ICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgcmV0dXJuIG1fdXJsLmNvbXBvbmVudFN0cmlu
ZyhmaWxlKTsKK30KKworU3RyaW5nIEtVUkw6OnByb3RvY29sKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV91cmwuY29tcG9uZW50U3RyaW5nKG1fdXJsLm1fcGFyc2VkLnNjaGVtZSk7Cit9CisKK1N0
cmluZyBLVVJMOjpob3N0KCkgY29uc3QKK3sKKyAgICAvLyBOb3RlOiBXZWJLaXQgZGVjb2RlX3N0
cmluZygpcyBoZXJlLgorICAgIHJldHVybiBtX3VybC5jb21wb25lbnRTdHJpbmcobV91cmwubV9w
YXJzZWQuaG9zdCk7Cit9CisKKy8vIFJldHVybnMgMCB3aGVuIHRoZXJlIGlzIG5vIHBvcnQgb3Ig
aXQgaXMgaW52YWxpZC4KKy8vCisvLyBXZSBkZWZpbmUgaW52YWxpZCBwb3J0IG51bWJlcnMgdG8g
YmUgaW52YWxpZCBVUkxzLCBhbmQgdGhleSB3aWxsIGJlCisvLyByZWplY3RlZCBieSB0aGUgY2Fu
b25pY2FsaXplci4gV2ViS2l0J3Mgb2xkIG9uZSB3aWxsIGFsbG93IHRoZW0gaW4KKy8vIHBhcnNp
bmcsIGFuZCByZXR1cm4gMCBmcm9tIHRoaXMgcG9ydCgpIGZ1bmN0aW9uLgordW5zaWduZWQgc2hv
cnQgaW50IEtVUkw6OnBvcnQoKSBjb25zdAoreworICAgIGlmICghbV91cmwubV9pc1ZhbGlkIHx8
IG1fdXJsLm1fcGFyc2VkLnBvcnQubGVuIDw9IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlu
dCBwb3J0ID0gdXJsX3BhcnNlOjpQYXJzZVBvcnQobV91cmwudXRmOFN0cmluZygpLmRhdGEoKSwg
bV91cmwubV9wYXJzZWQucG9ydCk7CisgICAgaWYgKHBvcnQgPT0gdXJsX3BhcnNlOjpQT1JUX1VO
U1BFQ0lGSUVEKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5z
aWduZWQgc2hvcnQ+KHBvcnQpOworfQorCisvLyBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYg
dGhlcmUgaXMgbm8gcGFzc3dvcmQuCitTdHJpbmcgS1VSTDo6cGFzcygpIGNvbnN0Cit7CisgICAg
Ly8gQnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjEwMTUgdGhp
cyBmdW5jdGlvbiByZXR1cm5zCisgICAgLy8gYSBudWxsIHN0cmluZyB3aGVuIHRoZSBwYXNzd29y
ZCBpcyBlbXB0eSwgd2hpY2ggd2UgZHVwbGljYXRlIGhlcmUuCisgICAgaWYgKCFtX3VybC5tX3Bh
cnNlZC5wYXNzd29yZC5pc19ub25lbXB0eSgpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisK
KyAgICAvLyBOb3RlOiBXZWJLaXQgZGVjb2RlX3N0cmluZygpcyBoZXJlLgorICAgIHJldHVybiBt
X3VybC5jb21wb25lbnRTdHJpbmcobV91cmwubV9wYXJzZWQucGFzc3dvcmQpOworfQorCisvLyBS
ZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgaXMgbm8gdXNlcm5hbWUuCitTdHJpbmcg
S1VSTDo6dXNlcigpIGNvbnN0Cit7CisgICAgLy8gTm90ZTogV2ViS2l0IGRlY29kZV9zdHJpbmco
KXMgaGVyZS4KKyAgICByZXR1cm4gbV91cmwuY29tcG9uZW50U3RyaW5nKG1fdXJsLm1fcGFyc2Vk
LnVzZXJuYW1lKTsKK30KKworU3RyaW5nIEtVUkw6OnJlZigpIGNvbnN0Cit7CisgICAgLy8gRW1w
dHkgYnV0IHByZXNlbnQgcmVmcyAoImZvby5jb20vYmFyIyIpIHNob3VsZCByZXN1bHQgaW4gdGhl
IGVtcHR5CisgICAgLy8gc3RyaW5nLCB3aGljaCBtX3VybC5jb21wb25lbnRTdHJpbmcgd2lsbCBw
cm9kdWNlLiBOb25leGlzdGFudCByZWZzIHNob3VsZCBiZQorICAgIC8vIHRoZSBOVUxMIHN0cmlu
Zy4KKyAgICBpZiAoIW1fdXJsLm1fcGFyc2VkLnJlZi5pc192YWxpZCgpKQorICAgICAgICByZXR1
cm4gU3RyaW5nKCk7CisKKyAgICAvLyBOb3RlOiBXZWJLaXQgZGVjb2RlX3N0cmluZygpcyBoZXJl
LgorICAgIHJldHVybiBtX3VybC5jb21wb25lbnRTdHJpbmcobV91cmwubV9wYXJzZWQucmVmKTsK
K30KKworYm9vbCBLVVJMOjpoYXNSZWYoKSBjb25zdAoreworICAgIC8vIE5vdGU6IFdlYktpdCBk
ZWNvZGVfc3RyaW5nKClzIGhlcmUuCisgICAgLy8gRklYTUUoYnJldHR3KSBkZXRlcm1pbmUgaWYg
dGhleSBhZ3JlZSBhYm91dCBhbiBlbXB0eSByZWYKKyAgICByZXR1cm4gbV91cmwubV9wYXJzZWQu
cmVmLmxlbiA+PSAwOworfQorCitTdHJpbmcgS1VSTDo6cXVlcnkoKSBjb25zdAoreworICAgIGlm
IChtX3VybC5tX3BhcnNlZC5xdWVyeS5sZW4gPj0gMCkgeworICAgICAgICAvLyBLVVJMJ3MgcXVl
cnkoKSBpbmNsdWRlcyB0aGUgcXVlc3Rpb24gbWFyaywgZXZlbiB0aG91Z2ggdGhlIHJlZmVyZW5j
ZQorICAgICAgICAvLyBkb2Vzbid0LiBNb3ZlIHRoZSBxdWVyeSBjb21wb25lbnQgYmFja3dhcmRz
IG9uZSB0byBhY2NvdW50IGZvciBpdAorICAgICAgICAvLyAob3VyIGxpYnJhcnkgZG9lc24ndCBj
b3VudCB0aGUgcXVlc3Rpb24gbWFyaykuCisgICAgICAgIHVybF9wYXJzZTo6Q29tcG9uZW50IHF1
ZXJ5X2NvbXAgPSBtX3VybC5tX3BhcnNlZC5xdWVyeTsKKyAgICAgICAgcXVlcnlfY29tcC5iZWdp
bi0tOworICAgICAgICBxdWVyeV9jb21wLmxlbisrOworICAgICAgICByZXR1cm4gbV91cmwuY29t
cG9uZW50U3RyaW5nKHF1ZXJ5X2NvbXApOworICAgIH0KKworICAgIC8vIEJ1ZzogaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIxMDE1IHRoaXMgZnVuY3Rpb24gcmV0dXJu
cworICAgIC8vIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBxdWVyeSBpcyBlbXB0eSByYXRoZXIg
dGhhbiBhIG51bGwgKG5vdCBzdXJlCisgICAgLy8gd2hpY2ggaXMgcmlnaHQpLgorICAgIHJldHVy
biBTdHJpbmcoIiIsIDApOworfQorCitTdHJpbmcgS1VSTDo6cGF0aCgpIGNvbnN0Cit7CisgICAg
Ly8gTm90ZTogV2ViS2l0IGRlY29kZV9zdHJpbmcoKXMgaGVyZS4KKyAgICByZXR1cm4gbV91cmwu
Y29tcG9uZW50U3RyaW5nKG1fdXJsLm1fcGFyc2VkLnBhdGgpOworfQorCit2b2lkIEtVUkw6OnNl
dFByb3RvY29sKGNvbnN0IFN0cmluZyYgcHJvdG9jb2wpCit7CisgICAgR29vZ2xlVVJMUHJpdmF0
ZTo6UmVwbGFjZW1lbnRzIHJlcGxhY2VtZW50czsKKyAgICByZXBsYWNlbWVudHMuU2V0U2NoZW1l
KENoYXJhY3RlcnNPckVtcHR5KHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
IHVybF9wYXJzZTo6Q29tcG9uZW50KDAsIHByb3RvY29sLmxlbmd0aCgpKSk7CisgICAgbV91cmwu
cmVwbGFjZUNvbXBvbmVudHMocmVwbGFjZW1lbnRzKTsKK30KKwordm9pZCBLVVJMOjpzZXRIb3N0
KGNvbnN0IFN0cmluZyYgaG9zdCkKK3sKKyAgICBHb29nbGVVUkxQcml2YXRlOjpSZXBsYWNlbWVu
dHMgcmVwbGFjZW1lbnRzOworICAgIHJlcGxhY2VtZW50cy5TZXRIb3N0KENoYXJhY3RlcnNPckVt
cHR5KGhvc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybF9wYXJzZTo6Q29tcG9uZW50
KDAsIGhvc3QubGVuZ3RoKCkpKTsKKyAgICBtX3VybC5yZXBsYWNlQ29tcG9uZW50cyhyZXBsYWNl
bWVudHMpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpbiB0aGUgSlNDIGJ1
aWxkLgordm9pZCBLVVJMOjpzZXRIb3N0QW5kUG9ydChjb25zdCBTdHJpbmcmIHMpIHsKKyAgICBT
dHJpbmcgbmV3aG9zdCA9IHMubGVmdChzLmZpbmQoIjoiKSk7CisgICAgU3RyaW5nIG5ld3BvcnQg
PSBzLnN1YnN0cmluZyhzLmZpbmQoIjoiKSArIDEpOworCisgICAgR29vZ2xlVVJMUHJpdmF0ZTo6
UmVwbGFjZW1lbnRzIHJlcGxhY2VtZW50czsKKyAgICAvLyBIb3N0IGNhbid0IGJlIHJlbW92ZWQs
IHNvIHdlIGFsd2F5cyBzZXQuCisgICAgcmVwbGFjZW1lbnRzLlNldEhvc3QoQ2hhcmFjdGVyc09y
RW1wdHkobmV3aG9zdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJsX3BhcnNlOjpDb21w
b25lbnQoMCwgbmV3aG9zdC5sZW5ndGgoKSkpOworCisgICAgaWYgKG5ld3BvcnQuaXNFbXB0eSgp
KSAgLy8gUG9ydCBtYXkgYmUgcmVtb3ZlZCwgc28gd2Ugc3VwcG9ydCBjbGVhcmluZy4KKyAgICAg
ICAgcmVwbGFjZW1lbnRzLkNsZWFyUG9ydCgpOworICAgIGVsc2UKKyAgICAgICAgcmVwbGFjZW1l
bnRzLlNldFBvcnQoQ2hhcmFjdGVyc09yRW1wdHkobmV3cG9ydCksIHVybF9wYXJzZTo6Q29tcG9u
ZW50KDAsIG5ld3BvcnQubGVuZ3RoKCkpKTsKKyAgICBtX3VybC5yZXBsYWNlQ29tcG9uZW50cyhy
ZXBsYWNlbWVudHMpOworfQorCit2b2lkIEtVUkw6OnNldFBvcnQodW5zaWduZWQgc2hvcnQgaSkK
K3sKKyAgICBHb29nbGVVUkxQcml2YXRlOjpSZXBsYWNlbWVudHMgcmVwbGFjZW1lbnRzOworICAg
IFN0cmluZyBwb3J0U3RyOworICAgIGlmIChpKSB7CisgICAgICAgIHBvcnRTdHIgPSBTdHJpbmc6
Om51bWJlcihzdGF0aWNfY2FzdDxpbnQ+KGkpKTsKKyAgICAgICAgcmVwbGFjZW1lbnRzLlNldFBv
cnQoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVybF9wYXJzZTo6VVRGMTZD
aGFyKj4ocG9ydFN0ci5jaGFyYWN0ZXJzKCkpLAorICAgICAgICAgICAgdXJsX3BhcnNlOjpDb21w
b25lbnQoMCwgcG9ydFN0ci5sZW5ndGgoKSkpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8g
Q2xlYXIgYW55IGV4aXN0aW5nIHBvcnQgd2hlbiBpdCBpcyBzZXQgdG8gMC4KKyAgICAgICAgcmVw
bGFjZW1lbnRzLkNsZWFyUG9ydCgpOworICAgIH0KKyAgICBtX3VybC5yZXBsYWNlQ29tcG9uZW50
cyhyZXBsYWNlbWVudHMpOworfQorCit2b2lkIEtVUkw6OnNldFVzZXIoY29uc3QgU3RyaW5nJiB1
c2VyKQoreworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY29tbW9ubHkgY2FsbGVkIHRvIGNsZWFy
IHRoZSB1c2VybmFtZSwgd2hpY2ggd2UKKyAgICAvLyBub3JtYWxseSBkb24ndCBoYXZlLCBzbyB3
ZSBvcHRpbWl6ZSB0aGlzIGNhc2UuCisgICAgaWYgKHVzZXIuaXNFbXB0eSgpICYmICFtX3VybC5t
X3BhcnNlZC51c2VybmFtZS5pc192YWxpZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBU
aGUgY2Fub25pY2FsaXplciB3aWxsIGNsZWFyIGFueSB1c2VybmFtZXMgdGhhdCBhcmUgZW1wdHks
IHNvIHdlCisgICAgLy8gZG9uJ3QgaGF2ZSB0byBleHBsaWNpdGx5IGNhbGwgQ2xlYXJVc2VybmFt
ZSgpIGhlcmUuCisgICAgR29vZ2xlVVJMUHJpdmF0ZTo6UmVwbGFjZW1lbnRzIHJlcGxhY2VtZW50
czsKKyAgICByZXBsYWNlbWVudHMuU2V0VXNlcm5hbWUoQ2hhcmFjdGVyc09yRW1wdHkodXNlciks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybF9wYXJzZTo6Q29tcG9uZW50KDAsIHVz
ZXIubGVuZ3RoKCkpKTsKKyAgICBtX3VybC5yZXBsYWNlQ29tcG9uZW50cyhyZXBsYWNlbWVudHMp
OworfQorCit2b2lkIEtVUkw6OnNldFBhc3MoY29uc3QgU3RyaW5nJiBwYXNzKQoreworICAgIC8v
IFRoaXMgZnVuY3Rpb24gaXMgY29tbW9ubHkgY2FsbGVkIHRvIGNsZWFyIHRoZSBwYXNzd29yZCwg
d2hpY2ggd2UKKyAgICAvLyBub3JtYWxseSBkb24ndCBoYXZlLCBzbyB3ZSBvcHRpbWl6ZSB0aGlz
IGNhc2UuCisgICAgaWYgKHBhc3MuaXNFbXB0eSgpICYmICFtX3VybC5tX3BhcnNlZC5wYXNzd29y
ZC5pc192YWxpZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGUgY2Fub25pY2FsaXpl
ciB3aWxsIGNsZWFyIGFueSBwYXNzd29yZHMgdGhhdCBhcmUgZW1wdHksIHNvIHdlCisgICAgLy8g
ZG9uJ3QgaGF2ZSB0byBleHBsaWNpdGx5IGNhbGwgQ2xlYXJVc2VybmFtZSgpIGhlcmUuCisgICAg
R29vZ2xlVVJMUHJpdmF0ZTo6UmVwbGFjZW1lbnRzIHJlcGxhY2VtZW50czsKKyAgICByZXBsYWNl
bWVudHMuU2V0UGFzc3dvcmQoQ2hhcmFjdGVyc09yRW1wdHkocGFzcyksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHVybF9wYXJzZTo6Q29tcG9uZW50KDAsIHBhc3MubGVuZ3RoKCkpKTsK
KyAgICBtX3VybC5yZXBsYWNlQ29tcG9uZW50cyhyZXBsYWNlbWVudHMpOworfQorCit2b2lkIEtV
Ukw6OnNldFJlZihjb25zdCBTdHJpbmcmIHJlZikKK3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlz
IGNvbW1vbmx5IGNhbGxlZCB0byBjbGVhciB0aGUgcmVmLCB3aGljaCB3ZQorICAgIC8vIG5vcm1h
bGx5IGRvbid0IGhhdmUsIHNvIHdlIG9wdGltaXplIHRoaXMgY2FzZS4KKyAgICBpZiAocmVmLmlz
TnVsbCgpICYmICFtX3VybC5tX3BhcnNlZC5yZWYuaXNfdmFsaWQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgR29vZ2xlVVJMUHJpdmF0ZTo6UmVwbGFjZW1lbnRzIHJlcGxhY2VtZW50czsKKyAg
ICBpZiAocmVmLmlzTnVsbCgpKQorICAgICAgICByZXBsYWNlbWVudHMuQ2xlYXJSZWYoKTsKKyAg
ICBlbHNlCisgICAgICAgIHJlcGxhY2VtZW50cy5TZXRSZWYoQ2hhcmFjdGVyc09yRW1wdHkocmVm
KSwgdXJsX3BhcnNlOjpDb21wb25lbnQoMCwgcmVmLmxlbmd0aCgpKSk7CisgICAgbV91cmwucmVw
bGFjZUNvbXBvbmVudHMocmVwbGFjZW1lbnRzKTsKK30KKwordm9pZCBLVVJMOjpyZW1vdmVSZWYo
KQoreworICAgIEdvb2dsZVVSTFByaXZhdGU6OlJlcGxhY2VtZW50cyByZXBsYWNlbWVudHM7Cisg
ICAgcmVwbGFjZW1lbnRzLkNsZWFyUmVmKCk7CisgICAgbV91cmwucmVwbGFjZUNvbXBvbmVudHMo
cmVwbGFjZW1lbnRzKTsKK30KKwordm9pZCBLVVJMOjpzZXRRdWVyeShjb25zdCBTdHJpbmcmIHF1
ZXJ5KQoreworICAgIEdvb2dsZVVSTFByaXZhdGU6OlJlcGxhY2VtZW50cyByZXBsYWNlbWVudHM7
CisgICAgaWYgKHF1ZXJ5LmlzTnVsbCgpKSB7CisgICAgICAgIC8vIFdlYktpdCBzZXRzIHRvIE5V
TEwgdG8gY2xlYXIgYW55IHF1ZXJ5LgorICAgICAgICByZXBsYWNlbWVudHMuQ2xlYXJRdWVyeSgp
OworICAgIH0gZWxzZSBpZiAocXVlcnkubGVuZ3RoKCkgPiAwICYmIHF1ZXJ5WzBdID09ICc/Jykg
eworICAgICAgICAvLyBXZWJLaXQgZXhwZWN0cyB0aGUgcXVlcnkgc3RyaW5nIHRvIGJlZ2luIHdp
dGggYSBxdWVzdGlvbiBtYXJrLCBidXQKKyAgICAgICAgLy8gb3VyIGxpYnJhcnkgZG9lc24ndC4g
U28gd2UgdHJpbSBvZmYgdGhlIHF1ZXN0aW9uIG1hcmsgd2hlbiBzZXR0aW5nLgorICAgICAgICBy
ZXBsYWNlbWVudHMuU2V0UXVlcnkoQ2hhcmFjdGVyc09yRW1wdHkocXVlcnkpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdXJsX3BhcnNlOjpDb21wb25lbnQoMSwgcXVlcnkubGVuZ3Ro
KCkgLSAxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2hlbiBzZXQgd2l0aCB0aGUgZW1w
dHkgc3RyaW5nIG9yIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgYmVnaW4gd2l0aAorICAgICAgICAv
LyBhIHF1ZXN0aW9uIG1hcmssIFdlYktpdCB3aWxsIGFkZCBhIHF1ZXN0aW9uIG1hcmsgZm9yIHlv
dS4gVGhlIG9ubHkKKyAgICAgICAgLy8gd2F5IHRoaXMgaXNuJ3QgY29tcGF0aWJsZSBpcyBpZiB5
b3UgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggYW4gZW1wdHkKKyAgICAgICAgLy8gc3RyaW5nLiBP
bGQgS1VSTCB3aWxsIGxlYXZlIGEgJz8nIHdpdGggbm90aGluZyBmb2xsb3dpbmcgaXQgaW4gdGhl
CisgICAgICAgIC8vIFVSTCwgd2hlcmVhcyB3ZSdsbCBjbGVhciBpdC4KKyAgICAgICAgcmVwbGFj
ZW1lbnRzLlNldFF1ZXJ5KENoYXJhY3RlcnNPckVtcHR5KHF1ZXJ5KSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHVybF9wYXJzZTo6Q29tcG9uZW50KDAsIHF1ZXJ5Lmxlbmd0aCgpKSk7
CisgICAgfQorICAgIG1fdXJsLnJlcGxhY2VDb21wb25lbnRzKHJlcGxhY2VtZW50cyk7Cit9CisK
K3ZvaWQgS1VSTDo6c2V0UGF0aChjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgLy8gRW1wdHkg
cGF0aHMgd2lsbCBiZSBjYW5vbmljYWxpemVkIHRvICIvIiwgc28gd2UgZG9uJ3QgaGF2ZSB0byB3
b3JyeQorICAgIC8vIGFib3V0IGNhbGxpbmcgQ2xlYXJQYXRoKCkuCisgICAgR29vZ2xlVVJMUHJp
dmF0ZTo6UmVwbGFjZW1lbnRzIHJlcGxhY2VtZW50czsKKyAgICByZXBsYWNlbWVudHMuU2V0UGF0
aChDaGFyYWN0ZXJzT3JFbXB0eShwYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmxf
cGFyc2U6OkNvbXBvbmVudCgwLCBwYXRoLmxlbmd0aCgpKSk7CisgICAgbV91cmwucmVwbGFjZUNv
bXBvbmVudHMocmVwbGFjZW1lbnRzKTsKK30KKworLy8gT24gTWFjLCB0aGlzIGp1c3Qgc2VlbXMg
dG8gcmV0dXJuIHRoZSBzYW1lIFVSTCwgYnV0IHdpdGggIi9mb28vYmFyIiBmb3IKKy8vIGZpbGU6
IFVSTHMgaW5zdGVhZCBvZiBmaWxlOi8vL2Zvby9iYXIuIFdlIGRvbid0IGJvdGhlciB3aXRoIGFu
eSBvZiB0aGlzLAorLy8gYXQgbGVhc3QgZm9yIG5vdy4KK1N0cmluZyBLVVJMOjpwcmV0dHlVUkwo
KSBjb25zdAoreworICAgIGlmICghbV91cmwubV9pc1ZhbGlkKQorICAgICAgICByZXR1cm4gU3Ry
aW5nKCk7CisgICAgcmV0dXJuIG1fdXJsLnN0cmluZygpOworfQorCisvLyBDb3B5IHRoZSBLVVJM
IHZlcnNpb24gaGVyZSBvbiBTZXB0IDEyLCAyMDA4IHdoaWxlIGRvaW5nIHRoZSB3ZWJraXQgbWVy
Z2UuCisvLyAKKy8vIEZJWE1FKGVyZykgU29tZWhvdyBzaGFyZSB0aGlzIHdpdGggS1VSTD8gTGlr
ZSB3ZSdkIHRoZW9yZXRpY2FsbHkgbWVyZ2Ugd2l0aAorLy8gZGVjb2RlVVJMRXNjYXBlU2VxdWVu
Y2VzIGJlbG93PworI2lmZGVmIEtVUkxfREVDT1JBVEVfR0xPQkFMUworU3RyaW5nIEtVUkw6Om1p
bWVUeXBlRnJvbURhdGFVUkwoY29uc3QgU3RyaW5nJiB1cmwpCisjZWxzZQorU3RyaW5nIG1pbWVU
eXBlRnJvbURhdGFVUkwoY29uc3QgU3RyaW5nJiB1cmwpCisjZW5kaWYKK3sKKyAgICBBU1NFUlQo
cHJvdG9jb2xJcyh1cmwsICJkYXRhIikpOworICAgIGludCBpbmRleCA9IHVybC5maW5kKCc7Jyk7
CisgICAgaWYgKGluZGV4ID09IC0xKQorICAgICAgICBpbmRleCA9IHVybC5maW5kKCcsJyk7Cisg
ICAgaWYgKGluZGV4ICE9IC0xKSB7CisgICAgICAgIGludCBsZW4gPSBpbmRleCAtIDU7CisgICAg
ICAgIGlmIChsZW4gPiAwKQorICAgICAgICAgICAgcmV0dXJuIHVybC5zdWJzdHJpbmcoNSwgbGVu
KTsKKyAgICAgICAgcmV0dXJuICJ0ZXh0L3BsYWluIjsgLy8gRGF0YSBVUkxzIHdpdGggbm8gTUlN
RSB0eXBlIGFyZSBjb25zaWRlcmVkIHRleHQvcGxhaW4uCisgICAgfQorICAgIHJldHVybiAiIjsK
K30KKworI2lmZGVmIEtVUkxfREVDT1JBVEVfR0xPQkFMUworU3RyaW5nIEtVUkw6OmRlY29kZVVS
TEVzY2FwZVNlcXVlbmNlcyhjb25zdCBTdHJpbmcmIHN0cikKKyNlbHNlCitTdHJpbmcgZGVjb2Rl
VVJMRXNjYXBlU2VxdWVuY2VzKGNvbnN0IFN0cmluZyYgc3RyKQorI2VuZGlmCit7CisgICAgcmV0
dXJuIGRlY29kZVVSTEVzY2FwZVNlcXVlbmNlcyhzdHIsIFVURjhFbmNvZGluZygpKTsKK30KKwor
Ly8gSW4gV2ViS2l0J3MgaW1wbGVtZW50YXRpb24sIHRoaXMgaXMgY2FsbGVkIGJ5IGV2ZXJ5IGNv
bXBvbmVudCBnZXR0ZXIuCisvLyBJdCB3aWxsIHVuZXNjYXBlIGV2ZXJ5IGNoYXJhY3RlciwgaW5j
bHVkaW5nIE5VTEwuIFRoaXMgaXMgc2NhcnksIGFuZCBtYXkKKy8vIGNhdXNlIHNlY3VyaXR5IGhv
bGVzLiBXZSBuZXZlciBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIGNvbXBvbmVudHMsIGFuZAorLy8g
anVzdCByZXR1cm4gdGhlIEFTQ0lJIHZlcnNpb25zIGluc3RlYWQuCisvLworLy8gSG93ZXZlciwg
dGhpcyBzdGF0aWMgZnVuY3Rpb24gaXMgY2FsbGVkIGRpcmVjdGx5IGluIHNvbWUgY2FzZXMuIEl0
IGFwcGVhcnMKKy8vIHRoYXQgdGhpcyBvbmx5IGhhcHBlbnMgZm9yIGphdmFzY3JpcHQ6IFVSTHMs
IHNvIHRoaXMgaXMgZXNzZW50aWFsbHkgdGhlCisvLyBKYXZhU2NyaXB0IFVSTCBkZWNvZGVyLiBJ
dCBhc3N1bWVzIFVURi04IGVuY29kaW5nLgorLy8KKy8vIElFIGRvZXNuJ3QgdW5lc2NhcGUgJTAw
LCBmb3JjaW5nIHlvdSB0byB1c2UgXHgwMCBpbiBKUyBzdHJpbmdzLCBzbyB3ZSBkbworLy8gdGhl
IHNhbWUuIFRoaXMgYWxzbyBlbGltaW5hdGVzIE5VTEwtcmVsYXRlZCBwcm9ibGVtcyBzaG91bGQg
YSBjb25zdW1lcgorLy8gaW5jb3JyZWN0bHkgY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBub24tSmF2
YVNjcmlwdC4KKy8vCisvLyBGSVhNRShicmV0dHcpIHRoZXNlIHNob3VsZCBiZSBtZXJnZWQgdG8g
dGhlIHJlZ3VsYXIgS1VSTCBpbXBsZW1lbnRhdGlvbi4KKyNpZmRlZiBLVVJMX0RFQ09SQVRFX0dM
T0JBTFMKK1N0cmluZyBLVVJMOjpkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXMoY29uc3QgU3RyaW5n
JiBzdHIsIGNvbnN0IFRleHRFbmNvZGluZyYgZW5jb2RpbmcpCisjZWxzZQorU3RyaW5nIGRlY29k
ZVVSTEVzY2FwZVNlcXVlbmNlcyhjb25zdCBTdHJpbmcmIHN0ciwgY29uc3QgVGV4dEVuY29kaW5n
JiBlbmNvZGluZykKKyNlbmRpZgoreworICAgIC8vIEZJWE1FKGJyZXR0dykgV2UgY2FuIHByb2Jh
Ymx5IHVzZSBLVVJMJ3MgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uCisgICAgLy8gd2l0aG91dCBt
b2RpZmljYXRpb24uIEhvd2V2ZXIsIEknbSBjb25jZXJuZWQgYWJvdXQKKyAgICAvLyBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA1NTkgc28gYW0ga2VlcGluZyB0aGlz
IG9sZAorICAgIC8vIGN1c3RvbSBjb2RlIGZvciBub3cuIFVzaW5nIHRoZWlyIHZlcnNpb24gd2ls
bCBhbHNvIGZpeCB0aGUgYnVnIHRoYXQKKyAgICAvLyB3ZSBpZ25vcmUgdGhlIGVuY29kaW5nLgor
ICAgIC8vCisgICAgLy8gRklYTUUoYnJldHR3KSBidWcgMTM1MDI5MTogVGhpcyBkb2VzIG5vdCBn
ZXQgY2FsbGVkIHZlcnkgb2Z0ZW4uIFdlIGp1c3QKKyAgICAvLyBjb252ZXJ0IGZpcnN0IHRvIDgt
Yml0IFVURi04LCB0aGVuIHVuZXNjYXBlLCB0aGVuIGJhY2sgdG8gMTYtYml0LiBUaGlzCisgICAg
Ly8ga2luZCBvZiBzdWNrcywgYW5kIHdlIGRvbid0IHVzZSB0aGUgZW5jb2RpbmcgcHJvcGVybHks
IHdoaWNoIHdpbGwgbWFrZQorICAgIC8vIHNvbWUgb2JzY3VyZSBhbmNob3IgbmF2aWdhdGlvbnMg
ZmFpbC4KKyAgICBDU3RyaW5nIGNzdHIgPSBzdHIudXRmOCgpOworCisgICAgY29uc3QgY2hhciog
aW5wdXQgPSBjc3RyLmRhdGEoKTsKKyAgICBpbnQgaW5wdXRfbGVuZ3RoID0gY3N0ci5sZW5ndGgo
KTsKKyAgICB1cmxfY2Fub246OlJhd0Nhbm9uT3V0cHV0VDxjaGFyPiB1bmVzY2FwZWQ7CisgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dF9sZW5ndGg7IGkrKykgeworICAgICAgICBpZiAoaW5w
dXRbaV0gPT0gJyUnKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGNoOworICAgICAgICAg
ICAgaWYgKHVybF9jYW5vbjo6RGVjb2RlRXNjYXBlZChpbnB1dCwgJmksIGlucHV0X2xlbmd0aCwg
JmNoKSkgeworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAwKSB7CisgICAgICAgICAgICAgICAg
ICAgIC8vIE5ldmVyIHVuZXNjYXBlIE5VTExzLgorICAgICAgICAgICAgICAgICAgICB1bmVzY2Fw
ZWQucHVzaF9iYWNrKCclJyk7CisgICAgICAgICAgICAgICAgICAgIHVuZXNjYXBlZC5wdXNoX2Jh
Y2soJzAnKTsKKyAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGVkLnB1c2hfYmFjaygnMCcpOwor
ICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZWQucHVz
aF9iYWNrKGNoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSW52
YWxpZCBlc2NhcGUgc2VxdWVuY2UsIGNvcHkgdGhlIHBlcmNlbnQgbGl0ZXJhbC4KKyAgICAgICAg
ICAgICAgICB1bmVzY2FwZWQucHVzaF9iYWNrKCclJyk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZWd1bGFyIG5vbi1lc2NhcGVkIDgtYml0IGNoYXJh
Y3Rlci4KKyAgICAgICAgICAgIHVuZXNjYXBlZC5wdXNoX2JhY2soaW5wdXRbaV0pOworICAgICAg
ICB9CisgICAgfQorCisgICAgLy8gQ29udmVydCB0aGF0IDgtYml0IHRvIFVURi0xNi4gSXQncyBu
b3QgY2xlYXIgSUUgZG9lcyB0aGlzIGF0IGFsbCB0bworICAgIC8vIEphdmFTY3JpcHQgVVJMcywg
YnV0IEZpcmVmb3ggYW5kIFNhZmFyaSBkby4KKyAgICB1cmxfY2Fub246OlJhd0Nhbm9uT3V0cHV0
VDx1cmxfcGFyc2U6OlVURjE2Q2hhcj4gdXRmMTY7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1
bmVzY2FwZWQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHVjaCA9IHN0
YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHVuZXNjYXBlZC5hdChpKSk7CisgICAgICAgIGlmICh1
Y2ggPCAweDgwKSB7CisgICAgICAgICAgICAvLyBOb24tVVRGLTgsIGp1c3QgYXBwZW5kIGRpcmVj
dGx5CisgICAgICAgICAgICB1dGYxNi5wdXNoX2JhY2sodWNoKTsKKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIC8vIG5leHRfY2ggd2lsbCBwb2ludCB0byB0aGUgbGFzdCBjaGFyYWN0ZXIg
b2YgdGhlIGRlY29kZWQKKyAgICAgICAgICAgIC8vIGNoYXJhY3Rlci4KKyAgICAgICAgICAgIGlu
dCBuZXh0X2NoID0gaTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNvZGVfcG9pbnQ7CisgICAgICAg
ICAgICBpZiAodXJsX2Nhbm9uOjpSZWFkVVRGQ2hhcih1bmVzY2FwZWQuZGF0YSgpLCAmbmV4dF9j
aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXNjYXBlZC5sZW5n
dGgoKSwgJmNvZGVfcG9pbnQpKSB7CisgICAgICAgICAgICAgICAgLy8gVmFsaWQgVVRGLTggY2hh
cmFjdGVyLCBjb252ZXJ0IHRvIFVURi0xNi4KKyAgICAgICAgICAgICAgICB1cmxfY2Fub246OkFw
cGVuZFVURjE2VmFsdWUoY29kZV9wb2ludCwgJnV0ZjE2KTsKKyAgICAgICAgICAgICAgICBpID0g
bmV4dF9jaDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2ViS2l0
IHN0cmlwcyBhbnkgc2VxdWVuY2VzIHRoYXQgYXJlIG5vdCB2YWxpZCBVVEYtOC4gVGhpcworICAg
ICAgICAgICAgICAgIC8vIHNvdW5kcyBzY2FyeS4gSW5zdGVhZCwgd2UganVzdCBrZWVwIHRob3Nl
IGludmFsaWQgY29kZQorICAgICAgICAgICAgICAgIC8vIHBvaW50cyBhbmQgcHJvbW90ZSB0byBV
VEYtMTYuIFdlIGNvcHkgYWxsIGNoYXJhY3RlcnMgZnJvbQorICAgICAgICAgICAgICAgIC8vIHRo
ZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIGlkZW50aWZpZWQgc3FldXFuY2Uu
CisgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBuZXh0X2NoKSB7CisgICAgICAgICAgICAgICAg
ICAgIHV0ZjE2LnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPih1bmVzY2FwZWQu
YXQoaSkpKTsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICB1dGYxNi5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4o
dW5lc2NhcGVkLmF0KGkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4gU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8VUNoYXIqPih1dGYxNi5kYXRhKCkpLCB1
dGYxNi5sZW5ndGgoKSk7Cit9CisKK2Jvb2wgS1VSTDo6cHJvdG9jb2xJcyhjb25zdCBjaGFyKiBw
cm90b2NvbCkgY29uc3QKK3sKKyAgICBhc3NlcnRQcm90b2NvbElzR29vZChwcm90b2NvbCk7Cisg
ICAgaWYgKG1fdXJsLm1fcGFyc2VkLnNjaGVtZS5sZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuIHBy
b3RvY29sID09IE5VTEw7CisgICAgcmV0dXJuIGxvd2VyQ2FzZUVxdWFsc0FTQ0lJKAorICAgICAg
ICBtX3VybC51dGY4U3RyaW5nKCkuZGF0YSgpICsgbV91cmwubV9wYXJzZWQuc2NoZW1lLmJlZ2lu
LAorICAgICAgICBtX3VybC51dGY4U3RyaW5nKCkuZGF0YSgpICsgbV91cmwubV9wYXJzZWQuc2No
ZW1lLmVuZCgpLAorICAgICAgICBwcm90b2NvbCk7Cit9CisgCitib29sIEtVUkw6OmlzTG9jYWxG
aWxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcHJvdG9jb2xJcygiZmlsZSIpOworfQorCisvLyBU
aGlzIGlzIGNhbGxlZCB0byBlc2NhcGUgYSBVUkwgc3RyaW5nLiBJdCBpcyBvbmx5IHVzZWQgZXh0
ZXJuYWxseSB3aGVuCisvLyBjb25zdHJ1Y3RpbmcgbWFpbHRvOiBsaW5rcyB0byBzZXQgdGhlIHF1
ZXJ5IHNlY3Rpb24uIFNpbmNlIG91ciBxdWVyeSBzZXR0ZXIKKy8vIHdpbGwgYXV0b21hdGljYWxs
eSBkbyB0aGUgY29ycmVjdCBlc2NhcGluZywgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRv
CisvLyBkbyBhbnkgd29yay4KKy8vCisvLyBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgYSBm
dXR1cmUgY2FsbGVkIG1heSB1c2UgdGhpcyBmdW5jdGlvbiBpbiBvdGhlcgorLy8gd2F5cywgYW5k
IG1heSBleHBlY3QgdG8gZ2V0IGEgdmFsaWQgVVJMIHN0cmluZy4gVGhlIGRhbmdlcm91cyB0aGlu
ZyB3ZSB3YW50CisvLyB0byBwcm90ZWN0IGFnYWluc3QgaGVyZSBpcyBhY2NpZGVudGFsbHkgZ2V0
dGluZyBOVUxMcyBpbiBhIHN0cmluZyB0aGF0IGlzCisvLyBub3Qgc3VwcG9zZWQgdG8gaGF2ZSBO
VUxMcy4gVGhlcmVmb3JlLCB3ZSBlc2NhcGUgTlVMTHMgaGVyZSB0byBwcmV2ZW50IHRoaXMuCisj
aWZkZWYgS1VSTF9ERUNPUkFURV9HTE9CQUxTCitTdHJpbmcgS1VSTDo6ZW5jb2RlV2l0aFVSTEVz
Y2FwZVNlcXVlbmNlcyhjb25zdCBTdHJpbmcmIG5vdEVuY29kZWRTdHJpbmcpCisjZWxzZQorU3Ry
aW5nIGVuY29kZVdpdGhVUkxFc2NhcGVTZXF1ZW5jZXMoY29uc3QgU3RyaW5nJiBub3RFbmNvZGVk
U3RyaW5nKQorI2VuZGlmCit7CisgICAgQ1N0cmluZyB1dGY4ID0gVVRGOEVuY29kaW5nKCkuZW5j
b2RlKAorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFVDaGFyKj4obm90RW5jb2RlZFN0
cmluZy5jaGFyYWN0ZXJzKCkpLAorICAgICAgICBub3RFbmNvZGVkU3RyaW5nLmxlbmd0aCgpLAor
ICAgICAgICBVUkxFbmNvZGVkRW50aXRpZXNGb3JVbmVuY29kYWJsZXMpOworICAgIGNvbnN0IGNo
YXIqIGlucHV0ID0gdXRmOC5kYXRhKCk7CisgICAgaW50IGlucHV0X2xlbiA9IHV0ZjgubGVuZ3Ro
KCk7CisKKyAgICBWZWN0b3I8Y2hhciwgMjA0OD4gYnVmZmVyOworICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgaW5wdXRfbGVuOyBpKyspIHsKKyAgICAgICAgaWYgKGlucHV0W2ldID09IDApCisgICAg
ICAgICAgICBidWZmZXIuYXBwZW5kKCIlMDAiLCAzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgYnVmZmVyLmFwcGVuZChpbnB1dFtpXSk7CisgICAgfQorICAgIHJldHVybiBTdHJpbmcoYnVm
ZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7Cit9CisKK2Jvb2wgS1VSTDo6aXNIaWVyYXJjaGlj
YWwoKSBjb25zdAoreworICAgIGlmICghbV91cmwubV9wYXJzZWQuc2NoZW1lLmlzX25vbmVtcHR5
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdXJsX3V0aWw6OklzU3RhbmRh
cmQoCisgICAgICAgICZtX3VybC51dGY4U3RyaW5nKCkuZGF0YSgpW21fdXJsLm1fcGFyc2VkLnNj
aGVtZS5iZWdpbl0sCisgICAgICAgIG1fdXJsLnV0ZjhTdHJpbmcoKS5sZW5ndGgoKSwKKyAgICAg
ICAgbV91cmwubV9wYXJzZWQuc2NoZW1lKTsKK30KKworI2lmbmRlZiBOREVCVUcKK3ZvaWQgS1VS
TDo6cHJpbnQoKSBjb25zdAoreworICAgIHByaW50ZigiJXNcbiIsIG1fdXJsLnV0ZjhTdHJpbmco
KS5kYXRhKCkpOworfQorI2VuZGlmCisKK3ZvaWQgS1VSTDo6aW52YWxpZGF0ZSgpCit7CisgICAg
Ly8gVGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvciBzbyByZXNldHRpbmcg
dGhlIChhdXRvbWF0aWNhbGx5CisgICAgLy8gaW5pdGlhbGl6ZWQpIHN0cmluZyBhbmQgcGFyc2Vk
IHN0cnVjdHVyZSB3b3VsZCBiZSBhIHdhc3RlIG9mIHRpbWUuCisgICAgbV91cmwubV9pc1ZhbGlk
ID0gZmFsc2U7Cit9CisKKy8vIEVxdWFsIHVwIHRvIHJlZmVyZW5jZSBmcmFnbWVudHMsIGlmIGFu
eS4KK2Jvb2wgZXF1YWxJZ25vcmluZ1JlZihjb25zdCBLVVJMJiBhLCBjb25zdCBLVVJMJiBiKQor
eworICAgIC8vIENvbXB1dGUgdGhlIGxlbmd0aCBvZiBlYWNoIFVSTCB3aXRob3V0IGl0cyByZWYu
IE5vdGUgdGhhdCB0aGUgcmVmZXJlbmNlCisgICAgLy8gYmVnaW4gKGlmIGl0IGV4aXN0cykgcG9p
bnRzIHRvIHRoZSBjaGFyYWN0ZXIgKmFmdGVyKiB0aGUgJyMnLCBzbyB3ZSBuZWVkCisgICAgLy8g
dG8gc3VidHJhY3Qgb25lLgorICAgIGludCBhX2xlbiA9IGEubV91cmwudXRmOFN0cmluZygpLmxl
bmd0aCgpOworICAgIGlmIChhLm1fdXJsLm1fcGFyc2VkLnJlZi5sZW4gPj0gMCkKKyAgICAgICAg
YV9sZW4gPSBhLm1fdXJsLm1fcGFyc2VkLnJlZi5iZWdpbiAtIDE7CisKKyAgICBpbnQgYl9sZW4g
PSBiLm1fdXJsLnV0ZjhTdHJpbmcoKS5sZW5ndGgoKTsKKyAgICBpZiAoYi5tX3VybC5tX3BhcnNl
ZC5yZWYubGVuID49IDApCisgICAgICAgIGJfbGVuID0gYi5tX3VybC5tX3BhcnNlZC5yZWYuYmVn
aW4gLSAxOworCisgICAgcmV0dXJuIGFfbGVuID09IGJfbGVuCisgICAgICAgICYmIHN0cm5jbXAo
YS5tX3VybC51dGY4U3RyaW5nKCkuZGF0YSgpLCBiLm1fdXJsLnV0ZjhTdHJpbmcoKS5kYXRhKCks
IGFfbGVuKSA9PSAwOworfQorCit1bnNpZ25lZCBLVVJMOjpob3N0U3RhcnQoKSBjb25zdAorewor
ICAgIHJldHVybiBtX3VybC5tX3BhcnNlZC5Db3VudENoYXJhY3RlcnNCZWZvcmUodXJsX3BhcnNl
OjpQYXJzZWQ6OkhPU1QsIGZhbHNlKTsKK30KKwordW5zaWduZWQgS1VSTDo6aG9zdEVuZCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fdXJsLm1fcGFyc2VkLkNvdW50Q2hhcmFjdGVyc0JlZm9yZSh1
cmxfcGFyc2U6OlBhcnNlZDo6UE9SVCwgdHJ1ZSk7Cit9CisKK3Vuc2lnbmVkIEtVUkw6OnBhdGhT
dGFydCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdXJsLm1fcGFyc2VkLkNvdW50Q2hhcmFjdGVy
c0JlZm9yZSh1cmxfcGFyc2U6OlBhcnNlZDo6UEFUSCwgZmFsc2UpOworfQorCit1bnNpZ25lZCBL
VVJMOjpwYXRoRW5kKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV91cmwubV9wYXJzZWQuQ291bnRD
aGFyYWN0ZXJzQmVmb3JlKHVybF9wYXJzZTo6UGFyc2VkOjpRVUVSWSwgdHJ1ZSk7Cit9CisKK3Vu
c2lnbmVkIEtVUkw6OnBhdGhBZnRlckxhc3RTbGFzaCgpIGNvbnN0Cit7CisgICAgLy8gV2hlbiB0
aGVyZSdzIG5vIHBhdGgsIGFzayBmb3Igd2hhdCB3b3VsZCBiZSB0aGUgYmVnaW5uaW5nIG9mIGl0
LgorICAgIGlmICghbV91cmwubV9wYXJzZWQucGF0aC5pc192YWxpZCgpKQorICAgICAgICByZXR1
cm4gbV91cmwubV9wYXJzZWQuQ291bnRDaGFyYWN0ZXJzQmVmb3JlKHVybF9wYXJzZTo6UGFyc2Vk
OjpQQVRILCBmYWxzZSk7CisKKyAgICB1cmxfcGFyc2U6OkNvbXBvbmVudCBmaWxlbmFtZTsKKyAg
ICB1cmxfcGFyc2U6OkV4dHJhY3RGaWxlTmFtZShtX3VybC51dGY4U3RyaW5nKCkuZGF0YSgpLCBt
X3VybC5tX3BhcnNlZC5wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxl
bmFtZSk7CisgICAgcmV0dXJuIGZpbGVuYW1lLmJlZ2luOworfQorCisjaWZkZWYgS1VSTF9ERUNP
UkFURV9HTE9CQUxTCitjb25zdCBLVVJMJiBLVVJMOjpibGFua1VSTCgpCisjZWxzZQorY29uc3Qg
S1VSTCYgYmxhbmtVUkwoKQorI2VuZGlmCit7CisgICAgc3RhdGljIEtVUkwgc3RhdGljQmxhbmtV
UkwoImFib3V0OmJsYW5rIik7CisgICAgcmV0dXJuIHN0YXRpY0JsYW5rVVJMOworfQorCisjaWZk
ZWYgS1VSTF9ERUNPUkFURV9HTE9CQUxTCitib29sIEtVUkw6OnByb3RvY29sSXMoY29uc3QgU3Ry
aW5nJiB1cmwsIGNvbnN0IGNoYXIqIHByb3RvY29sKQorI2Vsc2UKK2Jvb2wgcHJvdG9jb2xJcyhj
b25zdCBTdHJpbmcmIHVybCwgY29uc3QgY2hhciogcHJvdG9jb2wpCisjZW5kaWYKK3sKKyAgICAv
LyBEbyB0aGUgY29tcGFyaXNvbiB3aXRob3V0IG1ha2luZyBhIG5ldyBzdHJpbmcgb2JqZWN0Lgor
ICAgIGFzc2VydFByb3RvY29sSXNHb29kKHByb3RvY29sKTsKKyAgICBmb3IgKGludCBpID0gMDsg
OyArK2kpIHsKKyAgICAgICAgaWYgKCFwcm90b2NvbFtpXSkKKyAgICAgICAgICAgIHJldHVybiB1
cmxbaV0gPT0gJzonOworICAgICAgICBpZiAodG9BU0NJSUxvd2VyKHVybFtpXSkgIT0gcHJvdG9j
b2xbaV0pCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisjaWZuZGVmIEtV
UkxfREVDT1JBVEVfR0xPQkFMUworaW5saW5lIGJvb2wgS1VSTDo6cHJvdG9jb2xJcyhjb25zdCBT
dHJpbmcmIHN0cmluZywgY29uc3QgY2hhciogcHJvdG9jb2wpCit7CisgICAgcmV0dXJuIFdlYkNv
cmU6OnByb3RvY29sSXMoc3RyaW5nLCBwcm90b2NvbCk7Cit9CisjZW5kaWYKKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEdPT0dMRVVSTCkKSW5kZXg6IHBsYXRmb3Jt
L0dvb2dsZVVSTFByaXZhdGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9Hb29nbGVVUkxQcml2
YXRlLmgJKHJldmlzaW9uIDApCisrKyBwbGF0Zm9ybS9Hb29nbGVVUkxQcml2YXRlLmgJKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5
LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgR29vZ2xlVVJMUHJpdmF0
ZV9oCisjZGVmaW5lIEdvb2dsZVVSTFByaXZhdGVfaAorCisjaW5jbHVkZSAiQ1N0cmluZy5oIgor
CisjaW5jbHVkZSA8Z29vZ2xldXJsL3NyYy91cmxfcGFyc2UuaD4KKyNpbmNsdWRlIDxnb29nbGV1
cmwvc3JjL3VybF9jYW5vbi5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBL
VVJMOworICAgIGNsYXNzIFRleHRFbmNvZGluZzsKKworICAgIC8vIFdyYXBzIHRoZSBpbnRlcm5h
bHMgcmVsYXRlZCB0byB1c2luZyBHb29nbGUtVVJMIGFzIHRoZSBibmFja2VuZCBmb3IgS1VSTC4K
KyAgICAvLyBUaGlzIG1haW50YWlucyB0aGUgc3RhdGUgYW5kIGhhcyBhdXhpbGlhcnkgZnVuY3Rp
b25zIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZAorICAgIC8vIHRvIHVnbGlmeSBLVVJMLmggd2hpbGUg
YWxsb3dpbmcgR29vZ2xlLVVSTCB0byBiZSBldmFsdWF0ZWQuCisgICAgY2xhc3MgR29vZ2xlVVJM
UHJpdmF0ZSB7CisgICAgcHVibGljOgorICAgICAgICBHb29nbGVVUkxQcml2YXRlKCk7CisgICAg
ICAgIEdvb2dsZVVSTFByaXZhdGUoY29uc3QgdXJsX3BhcnNlOjpQYXJzZWQmLCBib29sIGlzVmFs
aWQpOworCisgICAgICAgIC8vIEluaXRpYWxpemVzIHRoZSBvYmplY3QuIFRoaXMgd2lsbCBjYWxs
IHRocm91Z2ggdG8gb25lIG9mIHRoZSBiYWNrZW5kCisgICAgICAgIC8vIGluaXRpYWxpemVycyBi
ZWxvdyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgc3RyaW5nJ3MgaW50ZXJuYWwKKyAgICAgICAg
Ly8gcmVwcmVzZW50YXRpb24gaXMgOCBvciAxNiBiaXQuCisgICAgICAgIHZvaWQgaW5pdChjb25z
dCBLVVJMJiBiYXNlLCBjb25zdCBTdHJpbmcmIHJlbGF0aXZlLAorICAgICAgICAgICAgICAgICAg
Y29uc3QgVGV4dEVuY29kaW5nKiBxdWVyeUVuY29kaW5nKTsKKworICAgICAgICAvLyBCYWNrZW5k
IGluaXRpYWxpemVycy4gVGhlIHF1ZXJ5IGVuY29kaW5nIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFs
IGFuZCBjYW4KKyAgICAgICAgLy8gYmUgTlVMTCAodGhpcyBpbXBsaWVzIFVURi04KS4gVGhlc2Ug
aW5pdGlhbGl6ZXJzIHJlcXVpcmUgdGhhdCB0aGUgb2JqZWN0CisgICAgICAgIC8vIGhhcyBqdXN0
IGJlZW4gY3JlYXRlZCBhbmQgdGhlIHN0cmluZ3MgYXJlIE5VTEwuIERvIG5vdCBjYWxsIG9uIGFu
CisgICAgICAgIC8vIGFscmVhZHktY29uc3RydWN0ZWQgb2JqZWN0LgorICAgICAgICB2b2lkIGlu
aXQoY29uc3QgS1VSTCYgYmFzZSwgY29uc3QgY2hhciogcmVsLCBpbnQgcmVsTGVuLAorICAgICAg
ICAgICAgICAgICAgY29uc3QgVGV4dEVuY29kaW5nKiBxdWVyeUVuY29kaW5nKTsKKyAgICAgICAg
dm9pZCBpbml0KGNvbnN0IEtVUkwmIGJhc2UsIGNvbnN0IFVDaGFyKiByZWwsIGludCByZWxMZW4s
CisgICAgICAgICAgICAgICAgICBjb25zdCBUZXh0RW5jb2RpbmcqIHF1ZXJ5RW5jb2RpbmcpOwor
CisgICAgICAgIC8vIERvZXMgYSBkZWVwIGNvcHkgdG8gdGhlIGdpdmVuIG91dHB1dCBvYmplY3Qu
CisgICAgICAgIHZvaWQgY29weVRvKEdvb2dsZVVSTFByaXZhdGUqIGRlc3QpIGNvbnN0OworCisg
ICAgICAgIC8vIFJldHVybnMgdGhlIHN1YnN0cmluZyBvZiB0aGUgaW5wdXQgaWRlbnRpZmllZCBi
eSB0aGUgZ2l2ZW4gY29tcG9uZW50LgorICAgICAgICBTdHJpbmcgY29tcG9uZW50U3RyaW5nKGNv
bnN0IHVybF9wYXJzZTo6Q29tcG9uZW50JikgY29uc3Q7CisKKyAgICAgICAgLy8gUmVwbGFjZXMg
dGhlIGdpdmVuIGNvbXBvbmVudHMsIG1vZGlmeWluZyB0aGUgY3VycmVudCBVUkwuIFRoZSBjdXJy
ZW50CisgICAgICAgIC8vIFVSTCBtdXN0IGJlIHZhbGlkLgorICAgICAgICB0eXBlZGVmIHVybF9j
YW5vbjo6UmVwbGFjZW1lbnRzPHVybF9wYXJzZTo6VVRGMTZDaGFyPiBSZXBsYWNlbWVudHM7Cisg
ICAgICAgIHZvaWQgcmVwbGFjZUNvbXBvbmVudHMoY29uc3QgUmVwbGFjZW1lbnRzJik7CisKKyAg
ICAgICAgLy8gU2V0dGVycyBmb3IgdGhlIGRhdGEuIFVzaW5nIHRoZSBBU0NJSSB2ZXJzaW9uIHdo
ZW4geW91IGtub3cgdGhlCisgICAgICAgIC8vIGRhdGEgaXMgQVNDSUkgd2lsbCBiZSBzbGlnaHRs
eSBtb3JlIGVmZmljaWVudC4gVGhlIFVURi04IHZlcnNpb24KKyAgICAgICAgLy8gd2lsbCBhbHdh
eXMgYmUgY29ycmVjdCBpZiB0aGUgY2FsbGVyIGlzIHVuc3VyZS4KKyAgICAgICAgdm9pZCBzZXRV
dGY4KGNvbnN0IGNoYXIqIGRhdGEsIGludCBkYXRhTGVuKTsKKyAgICAgICAgdm9pZCBzZXRBc2Np
aShjb25zdCBjaGFyKiBkYXRhLCBpbnQgZGF0YUxlbik7CisKKyAgICAgICAgLy8gVE9ETyhicmV0
dHcpIHdlIGNhbiBzdXBwb3J0IGFuIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9uLiAgTWFrZSB0aGlz
CisgICAgICAgIC8vIGJ1ZmZlciBzdXBwb3J0IGJvdGggb3B0aW5hbCBTdHJpbmdzIGFuZCBVVEYt
OCBkYXRhLiBUaGlzIHdheSwgd2UgY2FuIHVzZQorICAgICAgICAvLyB0aGUgb3B0aW1pemF0aW9u
IGZyb20gdGhlIG9yaWdpbmFsIEtVUkwgd2hpY2ggdXNlcyA9IHdpdGggdGhlIG9yaWdpbmFsCisg
ICAgICAgIC8vIHN0cmluZyB3aGVuIGNhbm9uaWNhbGl6YXRpb24gZGlkIG5vdCBjaGFuZ2UgaXQu
IFRoaXMgYWxsb3dzIHRoZSBzdHJpbmdzCisgICAgICAgIC8vIHRvIHNoYXJlIGEgYnVmZmVyIGlu
dGVybmFsbHksIGFuZCBzYXZlcyBhIG1hbGxvYy4KKworICAgICAgICAvLyBHZXR0ZXJzIGZvciB0
aGUgZGF0YS4KKyAgICAgICAgY29uc3QgQ1N0cmluZyYgdXRmOFN0cmluZygpIGNvbnN0IHsgcmV0
dXJuIG1fdXRmODsgfQorICAgICAgICBjb25zdCBTdHJpbmcmIHN0cmluZygpIGNvbnN0OworCisg
ICAgICAgIGJvb2wgbV9pc1ZhbGlkOworICAgICAgICB1cmxfcGFyc2U6OlBhcnNlZCBtX3BhcnNl
ZDsgLy8gSW5kZXhlcyBpbnRvIHRoZSBVVEYtOCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuCisKKyAg
ICBwcml2YXRlOgorICAgICAgICBDU3RyaW5nIG1fdXRmODsKKworICAgICAgICAvLyBTZXQgdG8g
dHJ1ZSB3aGVuIHRoZSBjYWxsZXIgc2V0IHVzIHVzaW5nIHRoZSBBU0NJSSBzZXR0ZXIuIFdlIGNh
bgorICAgICAgICAvLyBiZSBtb3JlIGVmZmljaWVudCB3aGVuIHdlIGtub3cgdGhlcmUgaXMgbm8g
VVRGLTggdG8gd29ycnkgYWJvdXQuCisgICAgICAgIC8vIFRoaXMgZmxhZyBpcyBjdXJyZW50bHkg
YWx3YXlzIGNvcnJlY3QsIGJ1dCBzaG91bGQgYmUgY2hhbmdlZCB0byBiZSBhCisgICAgICAgIC8v
IGhpbnQgKHNlZSBzZXRVdGY4KS4KKyAgICAgICAgYm9vbCBtX3V0ZjhJc0FTQ0lJOworCisgICAg
ICAgIG11dGFibGUgYm9vbCBtX3N0cmluZ0lzVmFsaWQ7CisgICAgICAgIG11dGFibGUgU3RyaW5n
IG1fc3RyaW5nOworICAgIH07CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCg==
</data>
<flag name="review"
          id="12972"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>