<?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>22131</bug_id>
          
          <creation_ts>2008-11-07 15:36:02 -0800</creation_ts>
          <short_desc>Ports should be able to provide their own visited link hashing and types</short_desc>
          <delta_ts>2008-11-21 09:09:10 -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="Brett Wilson (Google)">brettw</reporter>
          <assigned_to name="Brett Wilson (Google)">brettw</assigned_to>
          <cc>darin</cc>
    
    <cc>eric</cc>
    
    <cc>mjs</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>97975</commentid>
    <comment_count>0</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-11-07 15:36:02 -0800</bug_when>
    <thetext>The current visited link system uses 32-bit hash values computed by Document to identify URLs.

Chromium needs to implement its own hashing for visited link coloring. We use 64 bit values because one of the design goals of history is to scale to ~1 million URLs (all your history forever) without any problems. Using a 32-bit hash would give unacceptably high collision rates. Safari only keeps history for a month, so this is less of an issue.

Chromium&apos;s visited link system is also a complex multiprocess hashtable which internally computes its own hash values. It uses salting (to avoid things like bug 22130) that must be kept in sync with all processes and its own hash algorithm, so this logic can not be moved to WebCore.

I think this can be done very cleanly be creating a new LinkHash.h file. It would contain a typedef for the hash value (so it can be 32 or 64 bits), and also a function for computing a hash of a string (moving the code from Document::visitedLinkHash). This would be nice for both the current WebKit code, as well as provide the ability for ports to provide their own hashing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>98229</commentid>
    <comment_count>1</comment_count>
      <attachid>25033</attachid>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-11-10 16:36:51 -0800</bug_when>
    <thetext>Created attachment 25033
Patch for using 64 bits from a separate file

This implements 64-bit hashes and separates them out into another file only. It doesn&apos;t actually use the additional 32 bits since I wasn&apos;t sure which hashing algorithm to use. The easy way out would be to just generate a salt on startup (I think the hashes are not persisted, right?) and use that as the top 32-bits.

For reference, Chromium uses MD5.

There was some additional discussion in this thread:
https://lists.webkit.org/pipermail/webkit-dev/2008-November/005641.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>99395</commentid>
    <comment_count>2</comment_count>
      <attachid>25033</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2008-11-19 17:34:25 -0800</bug_when>
    <thetext>Comment on attachment 25033
Patch for using 64 bits from a separate file

This looks great!

You use &quot;hash&quot; as an overloaded term, we need to qualify it&apos;s usage to make more sense.

 38 // Just use the low 32-bits of the 64-bit hash as the &quot;hash&quot; (which must be 32 bits).

Should be something like:
// Use the low 32 bits of the 64-bit LinkHash as the key for the HashSet


LinkHashHash needs a better name.  yes, I understand that I follows the pattern of other *Hash structs, but it&apos;s confusing. :)  LinkHashHashFunctions would be better.

Otherwise you&apos;re good to go.  I don&apos;t need to see this again.  There are obviously things which could be used to further improve hashing here, but this is a nice cleanup step at least.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>99396</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2008-11-19 17:34:50 -0800</bug_when>
    <thetext>CCing darin and mjs just in case they would have otherwise missed this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>99496</commentid>
    <comment_count>4</comment_count>
      <attachid>25316</attachid>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-11-20 09:54:57 -0800</bug_when>
    <thetext>Created attachment 25316
Patch with Eric&apos;s suggsetions

I&apos;ll wait for Darin or Maciej&apos;s input before checking this in.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>99498</commentid>
    <comment_count>5</comment_count>
      <attachid>25316</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-11-20 10:12:27 -0800</bug_when>
    <thetext>Comment on attachment 25316
Patch with Eric&apos;s suggsetions

This looks great to me. Excellent direction to go.

&gt; +// Use the low 32-bits of the 64-bit LinkHash as the key for HashSets.
&gt; +struct LinkHashHashFunction {

I understand the need/desire to not call this LinkHashHash. However, the other such structs are not named &quot;hash function&quot; for a reason -- they specify more than just the hash function; it&apos;s a complete specification of &quot;how to hash this&quot; that includes equality and key comparison.

I can certainly live with the current name, but maybe HashForLinkHash or LinkHashing would be better. Or perhaps the integer type is what should be renamed; it could be called LinkHashValue. Sorry I can&apos;t think of something better.

By the way, Maciej and I have an ongoing debate about the best types to use for 32-bit and 64-bit values. If we wanted to use the stdint.h types, then there are thousands of places where we do int and unsigned where we should do int32_t and uint32_t, and even then we&apos;d have problems because those types don&apos;t work well with functions like printf and strtod and the like. But if we&apos;re using unsigned for uint32_t, then it seems strange to use uint64_t instead of just unsigned long long, which works on all the platforms we need it to. Anyway, no reason for you to get caught up in this debate. Consider this an aside.

&gt; +// Resolves the potentially relative URL &quot;attributeURL&quot; relative to the given
&gt; +// base URL, and returns the hash of the string that will be used for visited
&gt; +// link coloring. It will return the special value of 0 if attributeURL does not
&gt; +// look like a relative URL.
&gt; +LinkHash visitedLinkHash(const KURL&amp; base, const AtomicString&amp; attributeURL);

I think the comment about the value of 0 is confusing. For one thing, attributeURL can be an absolute URL. And the implementation of this function only returns 0 if the passed in string is empty, so I think &quot;does not look like a relative URL&quot; is unnecessarily vague and confusing. Maybe there&apos;s some future direction you&apos;re pointing at here?

I have to admit I don&apos;t follow the rationale for landing code that makes 32-bit hashes and pretending they are 64-bit hashes and then rehashes it. We want actual 64-bit hashes for this change to really pay off, right? Please, lets do that. I don&apos;t think we need to use MD5 just to get good 64-bit hashes, but maybe that&apos;s a good choice. I&apos;d hate to add an external dependency just for that, though. I don&apos;t understand the road map here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>99502</commentid>
    <comment_count>6</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-11-20 10:41:19 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; I have to admit I don&apos;t follow the rationale for landing code that makes 32-bit
&gt; hashes and pretending they are 64-bit hashes and then rehashes it. We want
&gt; actual 64-bit hashes for this change to really pay off, right? Please, lets do
&gt; that. I don&apos;t think we need to use MD5 just to get good 64-bit hashes, but
&gt; maybe that&apos;s a good choice. I&apos;d hate to add an external dependency just for
&gt; that, though. I don&apos;t understand the road map here.

My original version of this code (which I didn&apos;t upload) had an ifdef for LinkHash so it could be 64 bits under PLATFORM(CHROMIUM) and remain 32 bits on other platforms. Maciej said on IRC he would prefer it be 64 bits for everybody.

I already have a hash function and everything implemented on the Chromium side that gives 64 bit values, and this code/requirement can&apos;t easily be changed. On the other hand, you guys have only 32-bit string hashing, and people on IRC (and you in your post here) seem undecided about what 64-bit hash function you want on your end.

If you tell me what you want, I&apos;m happy to integrate it here for you. But I was trying not to get bogged down in this decision if you can&apos;t decide yet. If you would prefer, I can go back to my previous approach to keep you guys on 32 bit string hashes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>99516</commentid>
    <comment_count>7</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-11-20 11:36:47 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; My original version of this code (which I didn&apos;t upload) had an ifdef for
&gt; LinkHash so it could be 64 bits under PLATFORM(CHROMIUM) and remain 32 bits on
&gt; other platforms. Maciej said on IRC he would prefer it be 64 bits for
&gt; everybody.

Yes, I think it should be 64-bit for everybody. I can&apos;t see any reason why some ports would want a 32-bit hash function.

&gt; I already have a hash function and everything implemented on the Chromium side
&gt; that gives 64 bit values, and this code/requirement can&apos;t easily be changed. On
&gt; the other hand, you guys have only 32-bit string hashing, and people on IRC
&gt; (and you in your post here) seem undecided about what 64-bit hash function you
&gt; want on your end.

OK. But &quot;you guys have only 32-bit string hashing&quot; is referring to the WebKit project and you&apos;re a part of it! Lets find a 64-bit hash function. I wouldn&apos;t say so much that we&apos;re undecided. No one has made a concrete proposal yet.

Another way to put this is that I&apos;d like to see code that treats everything as if it was 64-bit, all the way down to the actual hash computation function itself. If we&apos;re temporarily stuck using the 32-bit hash function, then only that single call site should know it. I don&apos;t want code that knows the hash is really 32-bit to be distributed in multiple places.

Then we just have to change that one spot to do the good hashing.

What about the &quot;salting&quot; issue?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>99529</commentid>
    <comment_count>8</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-11-20 12:40:45 -0800</bug_when>
    <thetext>It&apos;s not practical to move our visited link hashing logic into WebCore. It&apos;s a separate component of Chromium that manages the visited link database file I/O, multiprocess issues, etc. In this way, you can think of it like Qt&apos;s visited link system, where it needs to call out to a separate component.

The difference is that our implementation works pretty well with the way that your code handles visited link hashing, and it&apos;s possible to integrate the two in a reasonable way, while I don&apos;t think Qt has this option (I don&apos;t know what they can do to make it work, actually). We would integrate by routing the hash requests through the bridge layer to our application-specific visited link system. It would return the hash value which fits nicely with your current system.

Our visited link hash table maintains a hash table of 64-bit URL hashes with salting. We don&apos;t store the URL. URLs are added in the browser process where they&apos;re hashed (and where we don&apos;t use WebKit types), and the salt and hash table information is shared with each renderer process.

This hashtable is serialized to disk, so changing any aspect of the hash function would require regenerating every user&apos;s visited link database. In fact, even if you decided to use the exact same hash function as us, I would be inclined to keep our implementation separate. The visited link system is a nice self-contained component that internally handles this kind of thing. Parts of it run in the browser process where we don&apos;t have WebKit types.

We could create a bridging layer to call back to the WebKit hash function for adding URLs. But since we store URLs as 8-bit, doing bridging in this direction would require a string conversion or KURL construction for every addition to the database to WebCore::String types. 

Because of this, it makes a lot more sense to bridge the opposite way. We implement the visited link hashing function as a single line of code to call into our shared visited link system. This is already set up to work with 8-bit strings, which is also how we implement KURL, so there are no conversions necessary.

But even if your hashing function was identical to ours, I would still bridge out for this computation for the purposes of clean separation of our hashing code and backwards compatibility: our on-disk structures on our user&apos;s machines would then depend directly on how your hash functions are implemented so any changes on your end would break our existing users.

I hope that you agree this is a reasonable approach. This is for our protection as well as yours. I don&apos;t think WebKit would look kindly on me complaining about changes to the hashing algorithm because it breaks our users.

I&apos;m happy to improve WebKit for the sake of improving WebKit and I&apos;ll implement hashing function you would prefer for your use. This is why I posted a question about what approach you wanted when I uploaded my patch in comment 1. Since you said there were no proposals, it were up to me I would use 16-bits of MD5 since that&apos;s what I already worked out for Chrome. I can implement this for this patch if you would like, or I can implement a different algorithm.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>99530</commentid>
    <comment_count>9</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-11-20 12:42:15 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; Another way to put this is that I&apos;d like to see code that treats everything as
&gt; if it was 64-bit, all the way down to the actual hash computation function
&gt; itself. If we&apos;re temporarily stuck using the 32-bit hash function, then only
&gt; that single call site should know it. I don&apos;t want code that knows the hash is
&gt; really 32-bit to be distributed in multiple places.
&gt; 
&gt; Then we just have to change that one spot to do the good hashing.

This is already the case with my patch. Nothing makes any assumptions about the number of used bits in the hash outside of the hash function.

&gt; What about the &quot;salting&quot; issue?

This patch does not address salting.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>99531</commentid>
    <comment_count>10</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-11-20 12:58:45 -0800</bug_when>
    <thetext>OK, everything seems fine. It would be even better if we made the hash function be 64-bit and address the salting issue, but neither seems to be a hard requirement for checking in this change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>99533</commentid>
    <comment_count>11</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-11-20 13:25:05 -0800</bug_when>
    <thetext>Thanks! (Sorry for the long previous post, I didn&apos;t want you to feel that I was trying to replace stuff in WebKit when I should be fixing it.)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>25033</attachid>
            <date>2008-11-10 16:36:51 -0800</date>
            <delta_ts>2008-11-20 09:55:11 -0800</delta_ts>
            <desc>Patch for using 64 bits from a separate file</desc>
            <filename>linkhash.diff</filename>
            <type>text/plain</type>
            <size>29391</size>
            <attacher name="Brett Wilson (Google)">brettw</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZGZlMzNkNS4uMDI0NTEzMyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MCBAQAorMjAwOC0xMS0xMCAgQnJldHQgV2lsc29u
ICA8YnJldHR3QGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBGYWN0b3Igb3V0IHZpc2l0ZWQgbGluayBoYXNoaW5nIGFuZCB0eXBl
cyBpbnRvIGEgbmV3IGZpbGUsIExpbmtIYXNoLgorICAgICAgICBUaGlzIGFsc28gY2hhbmdlcyB0
aGUgaGFzaCB0eXBlIHRvIDY0IGJpdHMsIGJ1dCBkb2VzIG5vdCBhY3R1YWxseSB1c2UKKyAgICAg
ICAgdGhlIGV4dHJhIGJpdHMuIFRoaXMgd2lsbCBiZSBwYXJ0IG9mIGEgZnV0dXJlIGNoYW5nZS4K
KworICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAg
KiBjc3MvQ1NTU3R5bGVTZWxlY3Rvci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDU1NTdHlsZVNl
bGVjdG9yOjpTZWxlY3RvckNoZWNrZXI6OmNoZWNrUHNldWRvU3RhdGUpOgorICAgICAgICAoV2Vi
Q29yZTo6Q1NTU3R5bGVTZWxlY3Rvcjo6U2VsZWN0b3JDaGVja2VyOjp2aXNpdGVkU3RhdGVDaGFu
Z2VkKToKKyAgICAgICAgKiBjc3MvQ1NTU3R5bGVTZWxlY3Rvci5oOgorICAgICAgICAoV2ViQ29y
ZTo6Q1NTU3R5bGVTZWxlY3Rvcjo6dmlzaXRlZFN0YXRlQ2hhbmdlZCk6CisgICAgICAgICogZG9t
L0RvY3VtZW50LmNwcDoKKyAgICAgICAgKiBkb20vRG9jdW1lbnQuaDoKKyAgICAgICAgKiBwYWdl
L1BhZ2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UGFnZTo6dmlzaXRlZFN0YXRlQ2hhbmdlZCk6
CisgICAgICAgICogcGFnZS9QYWdlLmg6CisgICAgICAgICogcGFnZS9QYWdlR3JvdXAuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6UGFnZUdyb3VwOjppc0xpbmtWaXNpdGVkKToKKyAgICAgICAgKFdl
YkNvcmU6OlBhZ2VHcm91cDo6YWRkVmlzaXRlZExpbmspOgorICAgICAgICAqIHBhZ2UvUGFnZUdy
b3VwLmg6CisgICAgICAgICogcGxhdGZvcm0vTGlua0hhc2guY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OmZpbmRTbGFzaERvdERvdFNsYXNoKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRT
bGFzaFNsYXNoKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRTbGFzaERvdFNsYXNoKToKKyAgICAg
ICAgKFdlYkNvcmU6OmNvbnRhaW5zQ29sb25TbGFzaFNsYXNoKToKKyAgICAgICAgKFdlYkNvcmU6
OmNsZWFuUGF0aCk6CisgICAgICAgIChXZWJDb3JlOjptYXRjaExldHRlcik6CisgICAgICAgIChX
ZWJDb3JlOjpuZWVkc1RyYWlsaW5nU2xhc2gpOgorICAgICAgICAoV2ViQ29yZTo6dmlzaXRlZExp
bmtIYXNoKToKKyAgICAgICAgKiBwbGF0Zm9ybS9MaW5rSGFzaC5oOiBBZGRlZAorICAgICAgICAo
V2ViQ29yZTo6TGlua0hhc2hIYXNoOjpoYXNoKToKKyAgICAgICAgKFdlYkNvcmU6OkxpbmtIYXNo
SGFzaDo6ZXF1YWwpOgorICAgICAgICAoV2ViQ29yZTo6TGlua0hhc2hIYXNoOjphdm9pZERlbGV0
ZWRWYWx1ZSk6CisKIDIwMDgtMTAtMjkgIEJyZXR0IFdpbHNvbiAgPGJyZXR0d0BjaHJvbWl1bS5v
cmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvV2ViQ29yZS9XZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXggYWMyZGNlYy4uNmRkMTE1YSAxMDA2NDQKLS0t
IGEvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKKysrIGIvV2ViQ29y
ZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTE5MzgsNiArMTkzOCw4IEBA
CiAJCUE3ODQ5NDFCMEI1RkU1MDcwMDFFMjM3QSAvKiBDbGlwYm9hcmQuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTc4NDk0MUEwQjVGRTUwNzAwMUUy
MzdBIC8qIENsaXBib2FyZC5jcHAgKi87IH07CiAJCUE3OTU0NjNFMEI1QzRDODAwMDdCNDM4RiAv
KiBEcmFnRGF0YU1hYy5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEE3OTU0NjNEMEI1QzRDODAwMDdCNDM4RiAvKiBEcmFnRGF0YU1hYy5tbSAqLzsgfTsK
IAkJQTc5NTQ2NDMwQjVDNENCNDAwN0I0MzhGIC8qIERyYWdEYXRhLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE3OTU0NjQyMEI1QzRDQjQwMDdCNDM4
RiAvKiBEcmFnRGF0YS5jcHAgKi87IH07CisJCUE3QUQyRjg3MEVDODlEMDcwMDhBQjAwMiAvKiBM
aW5rSGFzaC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBBN0FEMkY4NTBFQzg5RDA3MDA4QUIwMDIgLyogTGlua0hhc2guY3BwICovOyB9OworCQlBN0FE
MkY4ODBFQzg5RDA3MDA4QUIwMDIgLyogTGlua0hhc2guaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE3QUQyRjg2MEVDODlEMDcwMDhBQjAwMiAvKiBMaW5r
SGFzaC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJ
CUE3QjZFNjlGMEIyOTFBOTYwMEQwNTI5RiAvKiBEcmFnRGF0YS5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTdCNkU2OUQwQjI5MUE5NjAwRDA1MjlGIC8q
IERyYWdEYXRhLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsg
fTsKIAkJQTdDQTU5NUQwQjI3QkQ5RTAwRkEwMjFEIC8qIERyYWdDb250cm9sbGVyLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBN0NBNTk1QjBCMjdCRDlF
MDBGQTAyMUQgLyogRHJhZ0NvbnRyb2xsZXIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9
IChQcml2YXRlLCApOyB9OyB9OwogCQlBN0NBNTk1RTBCMjdCRDlFMDBGQTAyMUQgLyogRHJhZ0Nv
bnRyb2xsZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gQTdDQTU5NUMwQjI3QkQ5RTAwRkEwMjFEIC8qIERyYWdDb250cm9sbGVyLmNwcCAqLzsgfTsK
QEAgLTY2MzIsNiArNjYzNCw4IEBACiAJCUE3ODQ5NDFBMEI1RkU1MDcwMDFFMjM3QSAvKiBDbGlw
Ym9hcmQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMw
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENsaXBib2Fy
ZC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUE3OTU0NjNEMEI1QzRDODAwMDdC
NDM4RiAvKiBEcmFnRGF0YU1hYy5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7
IHBhdGggPSBEcmFnRGF0YU1hYy5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQTc5
NTQ2NDIwQjVDNENCNDAwN0I0MzhGIC8qIERyYWdEYXRhLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgcGF0aCA9IERyYWdEYXRhLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJQTdBRDJGODUwRUM4OUQwNzAwOEFCMDAyIC8qIExpbmtIYXNoLmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IExpbmtIYXNoLmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKKwkJQTdBRDJGODYwRUM4OUQwNzAwOEFCMDAyIC8qIExpbmtIYXNoLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IExpbmtIYXNoLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCUE3QjZFNjlEMEIyOTFBOTYwMEQwNTI5RiAvKiBEcmFnRGF0YS5oICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBEcmFnRGF0YS5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlBN0NBNTk1QjBCMjdCRDlFMDBGQTAyMUQgLyogRHJhZ0NvbnRyb2xs
ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRHJhZ0NvbnRyb2xsZXIuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQTdDQTU5NUMwQjI3QkQ5RTAwRkEwMjFEIC8q
IERyYWdDb250cm9sbGVyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9
IERyYWdDb250cm9sbGVyLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTEzMzA0
LDYgKzEzMzA4LDggQEAKIAkJCQlCQ0U2NUJFOTBFQUNERjE2MDA3RTQ1MzMgLyogTGVuZ3RoLmgg
Ki8sCiAJCQkJQkNGRjY0OEYwRUFEMTVDMjAwQzFENkY3IC8qIExlbmd0aEJveC5oICovLAogCQkJ
CUJDRkY2NDkwMEVBRDE1QzIwMEMxRDZGNyAvKiBMZW5ndGhTaXplLmggKi8sCisJCQkJQTdBRDJG
ODUwRUM4OUQwNzAwOEFCMDAyIC8qIExpbmtIYXNoLmNwcCAqLywKKwkJCQlBN0FEMkY4NjBFQzg5
RDA3MDA4QUIwMDIgLyogTGlua0hhc2guaCAqLywKIAkJCQk5MzUyMDdCRDA5QkQ0MTBBMDBGMjAz
OEQgLyogTG9jYWxpemVkU3RyaW5ncy5oICovLAogCQkJCUE4MjM5REZFMDlCM0NGOEEwMEI2MDY0
MSAvKiBMb2dnaW5nLmNwcCAqLywKIAkJCQlBODIzOURGRjA5QjNDRjhBMDBCNjA2NDEgLyogTG9n
Z2luZy5oICovLApAQCAtMTYxNjEsNiArMTYxNjcsNyBAQAogCQkJCUUxQzM2QzAzMEVCMDc2RDYw
MDc0MTBCQyAvKiBKU0RPTUdsb2JhbE9iamVjdC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEZDNzA1
MjEwRUIxODE1NjAwQjkwQUQ4IC8qIEF0b21pY1N0cmluZ0hhc2guaCBpbiBIZWFkZXJzICovLAog
CQkJCUUxMUM5RDlCMEVCMzY4MTIwMEU0MDlEQiAvKiBTY3JpcHRFeGVjdXRpb25Db250ZXh0Lmgg
aW4gSGVhZGVycyAqLywKKwkJCQlBN0FEMkY4ODBFQzg5RDA3MDA4QUIwMDIgLyogTGlua0hhc2gu
aCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nl
c3NpbmcgPSAwOwogCQl9OwpAQCAtMTgwNDcsNiArMTgwNTQsNyBAQAogCQkJCUJDRTY1RDMyMEVB
RDEyMTEwMDdFNDUzMyAvKiBUaGVtZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlFMUMzNkNCRDBF
QjA4MDYyMDA3NDEwQkMgLyogSlNET01HbG9iYWxPYmplY3QuY3BwIGluIFNvdXJjZXMgKi8sCiAJ
CQkJRTExQzlEQjAwRUIzNjk5NTAwRTQwOURCIC8qIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQuY3Bw
IGluIFNvdXJjZXMgKi8sCisJCQkJQTdBRDJGODcwRUM4OUQwNzAwOEFCMDAyIC8qIExpbmtIYXNo
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHBy
b2Nlc3NpbmcgPSAwOwogCQl9OwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9jc3MvQ1NTU3R5bGVTZWxl
Y3Rvci5jcHAgYi9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNlbGVjdG9yLmNwcAppbmRleCA0NDZhYWY0
Li4yZWE0NzQ1IDEwMDY0NAotLS0gYS9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNlbGVjdG9yLmNwcAor
KysgYi9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNlbGVjdG9yLmNwcApAQCAtNjAsNiArNjAsNyBAQAog
I2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKICNp
bmNsdWRlICJIVE1MVGV4dEFyZWFFbGVtZW50LmgiCisjaW5jbHVkZSAiTGlua0hhc2guaCIKICNp
bmNsdWRlICJNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb24uaCIKICNpbmNsdWRlICJNZWRpYUxpc3Qu
aCIKICNpbmNsdWRlICJNZWRpYVF1ZXJ5RXZhbHVhdG9yLmgiCkBAIC04MzIsNyArODMzLDcgQEAg
UHNldWRvU3RhdGUgQ1NTU3R5bGVTZWxlY3Rvcjo6U2VsZWN0b3JDaGVja2VyOjpjaGVja1BzZXVk
b1N0YXRlKEVsZW1lbnQqIGVsZW1lbnQKICAgICBpZiAoIWNoZWNrVmlzaXRlZCkKICAgICAgICAg
cmV0dXJuIFBzZXVkb0FueUxpbms7CiAKLSAgICB1bnNpZ25lZCBoYXNoID0gbV9kb2N1bWVudC0+
dmlzaXRlZExpbmtIYXNoKCphdHRyKTsKKyAgICBMaW5rSGFzaCBoYXNoID0gdmlzaXRlZExpbmtI
YXNoKG1fZG9jdW1lbnQtPmJhc2VVUkwoKSwgKmF0dHIpOwogICAgIGlmICghaGFzaCkKICAgICAg
ICAgcmV0dXJuIFBzZXVkb0xpbms7CiAKQEAgLTU2NTgsMTMgKzU2NTksMTMgQEAgdm9pZCBDU1NT
dHlsZVNlbGVjdG9yOjpTZWxlY3RvckNoZWNrZXI6OmFsbFZpc2l0ZWRTdGF0ZUNoYW5nZWQoKQog
ICAgIH0KIH0KIAotdm9pZCBDU1NTdHlsZVNlbGVjdG9yOjpTZWxlY3RvckNoZWNrZXI6OnZpc2l0
ZWRTdGF0ZUNoYW5nZWQodW5zaWduZWQgdmlzaXRlZEhhc2gpCit2b2lkIENTU1N0eWxlU2VsZWN0
b3I6OlNlbGVjdG9yQ2hlY2tlcjo6dmlzaXRlZFN0YXRlQ2hhbmdlZChMaW5rSGFzaCB2aXNpdGVk
SGFzaCkKIHsKICAgICBpZiAoIW1fbGlua3NDaGVja2VkRm9yVmlzaXRlZFN0YXRlLmNvbnRhaW5z
KHZpc2l0ZWRIYXNoKSkKICAgICAgICAgcmV0dXJuOwogICAgIGZvciAoTm9kZSogbm9kZSA9IG1f
ZG9jdW1lbnQ7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKICAgICAg
ICAgY29uc3QgQXRvbWljU3RyaW5nKiBhdHRyID0gbGlua0F0dHJpYnV0ZShub2RlKTsKLSAgICAg
ICAgaWYgKGF0dHIgJiYgbV9kb2N1bWVudC0+dmlzaXRlZExpbmtIYXNoKCphdHRyKSA9PSB2aXNp
dGVkSGFzaCkKKyAgICAgICAgaWYgKGF0dHIgJiYgdmlzaXRlZExpbmtIYXNoKG1fZG9jdW1lbnQt
PmJhc2VVUkwoKSwgKmF0dHIpID09IHZpc2l0ZWRIYXNoKQogICAgICAgICAgICAgbm9kZS0+c2V0
Q2hhbmdlZCgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL1dlYkNvcmUvY3NzL0NTU1N0eWxlU2Vs
ZWN0b3IuaCBiL1dlYkNvcmUvY3NzL0NTU1N0eWxlU2VsZWN0b3IuaAppbmRleCAzODhkYzlmLi43
NGY5ZGQ3IDEwMDY0NAotLS0gYS9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNlbGVjdG9yLmgKKysrIGIv
V2ViQ29yZS9jc3MvQ1NTU3R5bGVTZWxlY3Rvci5oCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNs
dWRlICJDU1NGb250U2VsZWN0b3IuaCIKICNpbmNsdWRlICJLZXlmcmFtZUxpc3QuaCIKKyNpbmNs
dWRlICJMaW5rSGFzaC5oIgogI2luY2x1ZGUgIk1lZGlhUXVlcnlFeHAuaCIKICNpbmNsdWRlICJS
ZW5kZXJTdHlsZS5oIgogI2luY2x1ZGUgIlN0cmluZ0hhc2guaCIKQEAgLTEzNiw3ICsxMzcsNyBA
QCBwdWJsaWM6CiAgICAgICAgIGJvb2wgYWZmZWN0ZWRCeVZpZXdwb3J0Q2hhbmdlKCkgY29uc3Q7
CiAKICAgICAgICAgdm9pZCBhbGxWaXNpdGVkU3RhdGVDaGFuZ2VkKCkgeyBtX2NoZWNrZXIuYWxs
VmlzaXRlZFN0YXRlQ2hhbmdlZCgpOyB9Ci0gICAgICAgIHZvaWQgdmlzaXRlZFN0YXRlQ2hhbmdl
ZCh1bnNpZ25lZCB2aXNpdGVkSGFzaCkgeyBtX2NoZWNrZXIudmlzaXRlZFN0YXRlQ2hhbmdlZCh2
aXNpdGVkSGFzaCk7IH0KKyAgICAgICAgdm9pZCB2aXNpdGVkU3RhdGVDaGFuZ2VkKExpbmtIYXNo
IHZpc2l0ZWRIYXNoKSB7IG1fY2hlY2tlci52aXNpdGVkU3RhdGVDaGFuZ2VkKHZpc2l0ZWRIYXNo
KTsgfQogCiAgICAgICAgIHZvaWQgYWRkVmFyaWFibGVzKENTU1ZhcmlhYmxlc1J1bGUqIHZhcmlh
Ymxlcyk7CiAgICAgICAgIENTU1ZhbHVlKiByZXNvbHZlVmFyaWFibGVEZXBlbmRlbnRWYWx1ZShD
U1NWYXJpYWJsZURlcGVuZGVudFZhbHVlKik7CkBAIC0xOTEsMTQgKzE5MiwxNCBAQCBwdWJsaWM6
CiAgICAgICAgICAgICBib29sIGNoZWNrU2Nyb2xsYmFyUHNldWRvQ2xhc3MoQ1NTU2VsZWN0b3Iq
LCBSZW5kZXJTdHlsZTo6UHNldWRvSWQmIGR5bmFtaWNQc2V1ZG8pIGNvbnN0OwogCiAgICAgICAg
ICAgICB2b2lkIGFsbFZpc2l0ZWRTdGF0ZUNoYW5nZWQoKTsKLSAgICAgICAgICAgIHZvaWQgdmlz
aXRlZFN0YXRlQ2hhbmdlZCh1bnNpZ25lZCB2aXNpdGVkSGFzaCk7CisgICAgICAgICAgICB2b2lk
IHZpc2l0ZWRTdGF0ZUNoYW5nZWQoTGlua0hhc2ggdmlzaXRlZEhhc2gpOwogCiAgICAgICAgICAg
ICBEb2N1bWVudCogbV9kb2N1bWVudDsKICAgICAgICAgICAgIGJvb2wgbV9zdHJpY3RQYXJzaW5n
OwogICAgICAgICAgICAgYm9vbCBtX2NvbGxlY3RSdWxlc09ubHk7CiAgICAgICAgICAgICBSZW5k
ZXJTdHlsZTo6UHNldWRvSWQgbV9wc2V1ZG9TdHlsZTsKICAgICAgICAgICAgIGJvb2wgbV9kb2N1
bWVudElzSFRNTDsKLSAgICAgICAgICAgIG11dGFibGUgSGFzaFNldDx1bnNpZ25lZCwgQWxyZWFk
eUhhc2hlZD4gbV9saW5rc0NoZWNrZWRGb3JWaXNpdGVkU3RhdGU7CisgICAgICAgICAgICBtdXRh
YmxlIEhhc2hTZXQ8TGlua0hhc2gsIExpbmtIYXNoSGFzaD4gbV9saW5rc0NoZWNrZWRGb3JWaXNp
dGVkU3RhdGU7CiAgICAgICAgIH07CiAKICAgICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9kb20vRG9jdW1lbnQuY3BwIGIvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwCmluZGV4IDQ4N2Iz
NDcuLjZmZDM5OWEgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcAorKysgYi9X
ZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAKQEAgLTk2LDcgKzk2LDYgQEAKICNpbmNsdWRlICJTZWdt
ZW50ZWRTdHJpbmcuaCIKICNpbmNsdWRlICJTZWxlY3Rpb25Db250cm9sbGVyLmgiCiAjaW5jbHVk
ZSAiU2V0dGluZ3MuaCIKLSNpbmNsdWRlICJTdHJpbmdIYXNoLmgiCiAjaW5jbHVkZSAiU3R5bGVT
aGVldExpc3QuaCIKICNpbmNsdWRlICJTeXN0ZW1UaW1lLmgiCiAjaW5jbHVkZSAiVGV4dEV2ZW50
LmgiCkBAIC00MDgyLDE3NiArNDA4MSw2IEBAIERPTVNlbGVjdGlvbiogRG9jdW1lbnQ6OmdldFNl
bGVjdGlvbigpIGNvbnN0CiAgICAgcmV0dXJuIGZyYW1lKCkgPyBmcmFtZSgpLT5kb21XaW5kb3co
KS0+Z2V0U2VsZWN0aW9uKCkgOiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmaW5kU2xhc2hE
b3REb3RTbGFzaChjb25zdCBVQ2hhciogY2hhcmFjdGVycywgc2l6ZV90IGxlbmd0aCkKLXsKLSAg
ICBpZiAobGVuZ3RoIDwgNCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHVuc2lnbmVkIGxvb3BM
aW1pdCA9IGxlbmd0aCAtIDM7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxvb3BMaW1p
dDsgKytpKSB7Ci0gICAgICAgIGlmIChjaGFyYWN0ZXJzW2ldID09ICcvJyAmJiBjaGFyYWN0ZXJz
W2kgKyAxXSA9PSAnLicgJiYgY2hhcmFjdGVyc1tpICsgMl0gPT0gJy4nICYmIGNoYXJhY3RlcnNb
aSArIDNdID09ICcvJykKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgIH0KLSAgICByZXR1cm4g
LTE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGZpbmRTbGFzaFNsYXNoKGNvbnN0IFVDaGFyKiBj
aGFyYWN0ZXJzLCBzaXplX3QgbGVuZ3RoLCBpbnQgcG9zaXRpb24pCi17Ci0gICAgaWYgKGxlbmd0
aCA8IDIpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB1bnNpZ25lZCBsb29wTGltaXQgPSBsZW5n
dGggLSAxOwotICAgIGZvciAodW5zaWduZWQgaSA9IHBvc2l0aW9uOyBpIDwgbG9vcExpbWl0OyAr
K2kpIHsKLSAgICAgICAgaWYgKGNoYXJhY3RlcnNbaV0gPT0gJy8nICYmIGNoYXJhY3RlcnNbaSAr
IDFdID09ICcvJykKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgIH0KLSAgICByZXR1cm4gLTE7
Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGZpbmRTbGFzaERvdFNsYXNoKGNvbnN0IFVDaGFyKiBj
aGFyYWN0ZXJzLCBzaXplX3QgbGVuZ3RoKQotewotICAgIGlmIChsZW5ndGggPCAzKQotICAgICAg
ICByZXR1cm4gLTE7Ci0gICAgdW5zaWduZWQgbG9vcExpbWl0ID0gbGVuZ3RoIC0gMjsKLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbG9vcExpbWl0OyArK2kpIHsKLSAgICAgICAgaWYgKGNo
YXJhY3RlcnNbaV0gPT0gJy8nICYmIGNoYXJhY3RlcnNbaSArIDFdID09ICcuJyAmJiBjaGFyYWN0
ZXJzW2kgKyAyXSA9PSAnLycpCi0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0gICAgcmV0
dXJuIC0xOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY29udGFpbnNDb2xvblNsYXNoU2xhc2go
Y29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICBpZiAobGVu
Z3RoIDwgMykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHVuc2lnbmVkIGxvb3BMaW1pdCA9
IGxlbmd0aCAtIDI7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxvb3BMaW1pdDsgKytp
KSB7Ci0gICAgICAgIGlmIChjaGFyYWN0ZXJzW2ldID09ICc6JyAmJiBjaGFyYWN0ZXJzW2kgKyAx
XSA9PSAnLycgJiYgY2hhcmFjdGVyc1tpICsgMl0gPT0gJy8nKQotICAgICAgICAgICAgcmV0dXJu
IHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lk
IGNsZWFuUGF0aChWZWN0b3I8VUNoYXIsIDUxMj4mIHBhdGgpCi17Ci0gICAgLy8gRklYTUU6IFNo
b2xkIG5vdCBkbyB0aGlzIGluIHRoZSBxdWVyeSBvciBhbmNob3IgcGFydC4KLSAgICBpbnQgcG9z
OwotICAgIHdoaWxlICgocG9zID0gZmluZFNsYXNoRG90RG90U2xhc2gocGF0aC5kYXRhKCksIHBh
dGguc2l6ZSgpKSkgIT0gLTEpIHsKLSAgICAgICAgaW50IHByZXYgPSByZXZlcnNlRmluZChwYXRo
LmRhdGEoKSwgcGF0aC5zaXplKCksICcvJywgcG9zIC0gMSk7Ci0gICAgICAgIC8vIGRvbid0IHJl
bW92ZSB0aGUgaG9zdCwgaS5lLiBodHRwOi8vZm9vLm9yZy8uLi9mb28uaHRtbAotICAgICAgICBp
ZiAocHJldiA8IDAgfHwgKHByZXYgPiAzICYmIHBhdGhbcHJldiAtIDJdID09ICc6JyAmJiBwYXRo
W3ByZXYgLSAxXSA9PSAnLycpKQotICAgICAgICAgICAgcGF0aC5yZW1vdmUocG9zLCAzKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgcGF0aC5yZW1vdmUocHJldiwgcG9zIC0gcHJldiArIDMp
OwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBTaG9sZCBub3QgZG8gdGhpcyBpbiB0aGUgcXVlcnkg
cGFydC4KLSAgICAvLyBTZXQgcmVmUG9zIHRvIC0yIHRvIG1lYW4gIkkgaGF2ZW4ndCBsb29rZWQg
Zm9yIHRoZSBhbmNob3IgeWV0Ii4KLSAgICAvLyBXZSBkb24ndCB3YW50IHRvIHdhc3RlIGEgZnVu
Y3Rpb24gY2FsbCBvbiB0aGUgc2VhcmNoIGZvciB0aGUgdGhlIGFuY2hvcgotICAgIC8vIGluIHRo
ZSB2YXN0IG1ham9yaXR5IG9mIGNhc2VzIHdoZXJlIHRoZXJlIGlzIG5vICIvLyIgaW4gdGhlIHBh
dGguCi0gICAgcG9zID0gMDsKLSAgICBpbnQgcmVmUG9zID0gLTI7Ci0gICAgd2hpbGUgKChwb3Mg
PSBmaW5kU2xhc2hTbGFzaChwYXRoLmRhdGEoKSwgcGF0aC5zaXplKCksIHBvcykpICE9IC0xKSB7
Ci0gICAgICAgIGlmIChyZWZQb3MgPT0gLTIpCi0gICAgICAgICAgICByZWZQb3MgPSBmaW5kKHBh
dGguZGF0YSgpLCBwYXRoLnNpemUoKSwgJyMnKTsKLSAgICAgICAgaWYgKHJlZlBvcyA+IDAgJiYg
cG9zID49IHJlZlBvcykKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmIChwb3MgPT0g
MCB8fCBwYXRoW3BvcyAtIDFdICE9ICc6JykKLSAgICAgICAgICAgIHBhdGgucmVtb3ZlKHBvcyk7
Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBvcyArPSAyOwotICAgIH0KLQotICAgIC8vIEZJ
WE1FOiBTaG9sZCBub3QgZG8gdGhpcyBpbiB0aGUgcXVlcnkgb3IgYW5jaG9yIHBhcnQuCi0gICAg
d2hpbGUgKChwb3MgPSBmaW5kU2xhc2hEb3RTbGFzaChwYXRoLmRhdGEoKSwgcGF0aC5zaXplKCkp
KSAhPSAtMSkKLSAgICAgICAgcGF0aC5yZW1vdmUocG9zLCAyKTsKLX0KLQotc3RhdGljIGlubGlu
ZSBib29sIG1hdGNoTGV0dGVyKFVDaGFyIGMsIFVDaGFyIGxvd2VyY2FzZUxldHRlcikKLXsKLSAg
ICByZXR1cm4gKGMgfCAweDIwKSA9PSBsb3dlcmNhc2VMZXR0ZXI7Ci19Ci0KLXN0YXRpYyBpbmxp
bmUgYm9vbCBuZWVkc1RyYWlsaW5nU2xhc2goY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2ln
bmVkIGxlbmd0aCkKLXsKLSAgICBpZiAobGVuZ3RoIDwgNikKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIGlmICghbWF0Y2hMZXR0ZXIoY2hhcmFjdGVyc1swXSwgJ2gnKQotICAgICAgICAgICAg
fHwgIW1hdGNoTGV0dGVyKGNoYXJhY3RlcnNbMV0sICd0JykKLSAgICAgICAgICAgIHx8ICFtYXRj
aExldHRlcihjaGFyYWN0ZXJzWzJdLCAndCcpCi0gICAgICAgICAgICB8fCAhbWF0Y2hMZXR0ZXIo
Y2hhcmFjdGVyc1szXSwgJ3AnKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghKGNo
YXJhY3RlcnNbNF0gPT0gJzonCi0gICAgICAgICAgICB8fCAobWF0Y2hMZXR0ZXIoY2hhcmFjdGVy
c1s0XSwgJ3MnKSAmJiBjaGFyYWN0ZXJzWzVdID09ICc6JykpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICB1bnNpZ25lZCBwb3MgPSBjaGFyYWN0ZXJzWzRdID09ICc6JyA/IDUgOiA2Owot
Ci0gICAgLy8gU2tpcCBpbml0aWFsIHR3byBzbGFzaGVzIGlmIHByZXNlbnQuCi0gICAgaWYgKHBv
cyArIDEgPCBsZW5ndGggJiYgY2hhcmFjdGVyc1twb3NdID09ICcvJyAmJiBjaGFyYWN0ZXJzW3Bv
cyArIDFdID09ICcvJykKLSAgICAgICAgcG9zICs9IDI7Ci0KLSAgICAvLyBGaW5kIG5leHQgc2xh
c2guCi0gICAgd2hpbGUgKHBvcyA8IGxlbmd0aCAmJiBjaGFyYWN0ZXJzW3Bvc10gIT0gJy8nKQot
ICAgICAgICArK3BvczsKLQotICAgIHJldHVybiBwb3MgPT0gbGVuZ3RoOwotfQotCi11bnNpZ25l
ZCBEb2N1bWVudDo6dmlzaXRlZExpbmtIYXNoKGNvbnN0IEF0b21pY1N0cmluZyYgYXR0cmlidXRl
VVJMKSBjb25zdAotewotICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzID0gYXR0cmlidXRlVVJM
LmNoYXJhY3RlcnMoKTsKLSAgICB1bnNpZ25lZCBsZW5ndGggPSBhdHRyaWJ1dGVVUkwubGVuZ3Ro
KCk7Ci0gICAgaWYgKCFsZW5ndGgpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gVGhpcyBp
cyBhIHBvb3IgbWFuJ3MgY29tcGxldGVVUkwuIEZhc3RlciB3aXRoIGxlc3MgbWVtb3J5IGFsbG9j
YXRpb24uCi0gICAgLy8gRklYTUU6IEl0J3MgbWlzc2luZyBhIGxvdCBvZiB3aGF0IGNvbXBsZXRl
VVJMIGRvZXMgYW5kIGEgbG90IG9mIHdoYXQgS1VSTCBkb2VzLgotICAgIC8vIEZvciBleGFtcGxl
LCBpdCBkb2VzIG5vdCBoYW5kbGUgaW50ZXJuYXRpb25hbCBkb21haW4gbmFtZXMgcHJvcGVybHku
Ci0KLSAgICAvLyBGSVhNRTogSXQgaXMgd3JvbmcgdGhhdCB3ZSBkbyBub3QgZG8gZnVydGhlciBw
cm9jZXNzaW5nIG9uIHN0cmluZ3MgdGhhdCBoYXZlICI6Ly8iIGluIHRoZW06Ci0gICAgLy8gICAg
MSkgVGhlICI6Ly8iIGNvdWxkIGJlIGluIHRoZSBxdWVyeSBvciBhbmNob3IuCi0gICAgLy8gICAg
MikgVGhlIFVSTCdzIHBhdGggY291bGQgaGF2ZSBhICIvLi8iIG9yIGEgIi8uLi8iIG9yIGEgIi8v
IiBzZXF1ZW5jZSBpbiBpdC4KLQotICAgIC8vIEZJWE1FOiBuZWVkc1RyYWlsaW5nU2xhc2ggZG9l
cyBub3QgcHJvcGVybHkgcmV0dXJuIHRydWUgZm9yIGEgVVJMIHRoYXQgaGFzIG5vIHBhdGgsIGJ1
dCBkb2VzCi0gICAgLy8gaGF2ZSBhIHF1ZXJ5IG9yIGFuY2hvci4KLQotICAgIGJvb2wgaGFzQ29s
b25TbGFzaFNsYXNoID0gY29udGFpbnNDb2xvblNsYXNoU2xhc2goY2hhcmFjdGVycywgbGVuZ3Ro
KTsKLQotICAgIGlmIChoYXNDb2xvblNsYXNoU2xhc2ggJiYgIW5lZWRzVHJhaWxpbmdTbGFzaChj
aGFyYWN0ZXJzLCBsZW5ndGgpKQotICAgICAgICByZXR1cm4gQWxyZWFkeUhhc2hlZDo6YXZvaWRE
ZWxldGVkVmFsdWUoYXR0cmlidXRlVVJMLnN0cmluZygpLmltcGwoKS0+aGFzaCgpKTsKLQotICAg
IFZlY3RvcjxVQ2hhciwgNTEyPiBidWZmZXI7Ci0KLSAgICBpZiAoaGFzQ29sb25TbGFzaFNsYXNo
KSB7Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIGluY29ycmVjdCBmb3IgVVJMcyB0aGF0IGhh
dmUgYSBxdWVyeSBvciBhbmNob3I7IHRoZSAiLyIgbmVlZHMgdG8gZ28gYXQgdGhlCi0gICAgICAg
IC8vIGVuZCBvZiB0aGUgcGF0aCwgKmJlZm9yZSogdGhlIHF1ZXJ5IG9yIGFuY2hvci4KLSAgICAg
ICAgYnVmZmVyLmFwcGVuZChjaGFyYWN0ZXJzLCBsZW5ndGgpOwotICAgICAgICBidWZmZXIuYXBw
ZW5kKCcvJyk7Ci0gICAgICAgIHJldHVybiBBbHJlYWR5SGFzaGVkOjphdm9pZERlbGV0ZWRWYWx1
ZShTdHJpbmdJbXBsOjpjb21wdXRlSGFzaChidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKSk7
Ci0gICAgfQotCi0gICAgc3dpdGNoIChjaGFyYWN0ZXJzWzBdKSB7Ci0gICAgICAgIGNhc2UgJy8n
OgotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChtX2Jhc2VVUkwuc3RyaW5nKCkuY2hhcmFjdGVy
cygpLCBtX2Jhc2VVUkwucGF0aFN0YXJ0KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGNhc2UgJyMnOgotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChtX2Jhc2VVUkwuc3RyaW5nKCku
Y2hhcmFjdGVycygpLCBtX2Jhc2VVUkwucGF0aEVuZCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChtX2Jhc2VVUkwuc3Ry
aW5nKCkuY2hhcmFjdGVycygpLCBtX2Jhc2VVUkwucGF0aEFmdGVyTGFzdFNsYXNoKCkpOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGJ1ZmZlci5hcHBlbmQoY2hhcmFjdGVycywgbGVu
Z3RoKTsKLSAgICBjbGVhblBhdGgoYnVmZmVyKTsKLSAgICBpZiAobmVlZHNUcmFpbGluZ1NsYXNo
KGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCkpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlz
IGlzIGluY29ycmVjdCBmb3IgVVJMcyB0aGF0IGhhdmUgYSBxdWVyeSBvciBhbmNob3I7IHRoZSAi
LyIgbmVlZHMgdG8gZ28gYXQgdGhlCi0gICAgICAgIC8vIGVuZCBvZiB0aGUgcGF0aCwgKmJlZm9y
ZSogdGhlIHF1ZXJ5IG9yIGFuY2hvci4KLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnLycpOwotICAg
IH0KLQotICAgIHJldHVybiBBbHJlYWR5SGFzaGVkOjphdm9pZERlbGV0ZWRWYWx1ZShTdHJpbmdJ
bXBsOjpjb21wdXRlSGFzaChidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKSk7Ci19Ci0KICNp
ZiBFTkFCTEUoREFUQUJBU0UpCiAKIHZvaWQgRG9jdW1lbnQ6OmFkZE9wZW5EYXRhYmFzZShEYXRh
YmFzZSogZGF0YWJhc2UpCmRpZmYgLS1naXQgYS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5oIGIvV2Vi
Q29yZS9kb20vRG9jdW1lbnQuaAppbmRleCA5MGI2OTM1Li44MWUwZjExIDEwMDY0NAotLS0gYS9X
ZWJDb3JlL2RvbS9Eb2N1bWVudC5oCisrKyBiL1dlYkNvcmUvZG9tL0RvY3VtZW50LmgKQEAgLTQy
Myw4ICs0MjMsNiBAQCBwdWJsaWM6CiAKICAgICBLVVJMIGNvbXBsZXRlVVJMKGNvbnN0IFN0cmlu
ZyYpIGNvbnN0OwogCi0gICAgdW5zaWduZWQgdmlzaXRlZExpbmtIYXNoKGNvbnN0IEF0b21pY1N0
cmluZyYgYXR0cmlidXRlVVJMKSBjb25zdDsKLQogICAgIC8vIGZyb20gY2FjaGVkT2JqZWN0Q2xp
ZW50CiAgICAgdmlydHVhbCB2b2lkIHNldENTU1N0eWxlU2hlZXQoY29uc3QgU3RyaW5nJiB1cmws
IGNvbnN0IFN0cmluZyYgY2hhcnNldCwgY29uc3QgQ2FjaGVkQ1NTU3R5bGVTaGVldCopOwogCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL3BhZ2UvUGFnZS5jcHAgYi9XZWJDb3JlL3BhZ2UvUGFnZS5jcHAK
aW5kZXggMGRjY2VmZC4uOTY4NzcwNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wYWdlL1BhZ2UuY3Bw
CisrKyBiL1dlYkNvcmUvcGFnZS9QYWdlLmNwcApAQCAtNDcwLDcgKzQ3MCw3IEBAIHZvaWQgUGFn
ZTo6YWxsVmlzaXRlZFN0YXRlQ2hhbmdlZChQYWdlR3JvdXAqIGdyb3VwKQogICAgIH0KIH0KIAot
dm9pZCBQYWdlOjp2aXNpdGVkU3RhdGVDaGFuZ2VkKFBhZ2VHcm91cCogZ3JvdXAsIHVuc2lnbmVk
IHZpc2l0ZWRMaW5rSGFzaCkKK3ZvaWQgUGFnZTo6dmlzaXRlZFN0YXRlQ2hhbmdlZChQYWdlR3Jv
dXAqIGdyb3VwLCBMaW5rSGFzaCB2aXNpdGVkTGlua0hhc2gpCiB7CiAgICAgQVNTRVJUKGdyb3Vw
KTsKICAgICBBU1NFUlQoYWxsUGFnZXMpOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wYWdlL1BhZ2Uu
aCBiL1dlYkNvcmUvcGFnZS9QYWdlLmgKaW5kZXggYTZjY2JkMC4uNjQ1ZTU1ZSAxMDA2NDQKLS0t
IGEvV2ViQ29yZS9wYWdlL1BhZ2UuaAorKysgYi9XZWJDb3JlL3BhZ2UvUGFnZS5oCkBAIC0yNCw2
ICsyNCw3IEBACiAjaW5jbHVkZSAiQ2hyb21lLmgiCiAjaW5jbHVkZSAiQ29udGV4dE1lbnVDb250
cm9sbGVyLmgiCiAjaW5jbHVkZSAiRnJhbWVMb2FkZXJUeXBlcy5oIgorI2luY2x1ZGUgIkxpbmtI
YXNoLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKICNpZiBQTEFURk9STShNQUMpCiAj
aW5jbHVkZSAiU2NoZWR1bGVQYWlyLmgiCkBAIC0xNjAsNyArMTYxLDcgQEAgbmFtZXNwYWNlIFdl
YkNvcmUgewogICAgICAgICBzdGF0aWMgdm9pZCByZW1vdmVBbGxWaXNpdGVkTGlua3MoKTsKIAog
ICAgICAgICBzdGF0aWMgdm9pZCBhbGxWaXNpdGVkU3RhdGVDaGFuZ2VkKFBhZ2VHcm91cCopOwot
ICAgICAgICBzdGF0aWMgdm9pZCB2aXNpdGVkU3RhdGVDaGFuZ2VkKFBhZ2VHcm91cCosIHVuc2ln
bmVkIHZpc2l0ZWRIYXNoKTsKKyAgICAgICAgc3RhdGljIHZvaWQgdmlzaXRlZFN0YXRlQ2hhbmdl
ZChQYWdlR3JvdXAqLCBMaW5rSGFzaCB2aXNpdGVkSGFzaCk7CiAKICNpZiBFTkFCTEUoRE9NX1NU
T1JBR0UpCiAgICAgICAgIFNlc3Npb25TdG9yYWdlKiBzZXNzaW9uU3RvcmFnZShib29sIG9wdGlv
bmFsQ3JlYXRlID0gdHJ1ZSk7CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BhZ2UvUGFnZUdyb3VwLmNw
cCBiL1dlYkNvcmUvcGFnZS9QYWdlR3JvdXAuY3BwCmluZGV4IDZiNzJiZTIuLjIxNGIyNTMgMTAw
NjQ0Ci0tLSBhL1dlYkNvcmUvcGFnZS9QYWdlR3JvdXAuY3BwCisrKyBiL1dlYkNvcmUvcGFnZS9Q
YWdlR3JvdXAuY3BwCkBAIC0xMTcsNyArMTE3LDcgQEAgdm9pZCBQYWdlR3JvdXA6OnJlbW92ZVBh
Z2UoUGFnZSogcGFnZSkKICAgICBtX3BhZ2VzLnJlbW92ZShwYWdlKTsKIH0KIAotYm9vbCBQYWdl
R3JvdXA6OmlzTGlua1Zpc2l0ZWQodW5zaWduZWQgdmlzaXRlZExpbmtIYXNoKQorYm9vbCBQYWdl
R3JvdXA6OmlzTGlua1Zpc2l0ZWQoTGlua0hhc2ggdmlzaXRlZExpbmtIYXNoKQogewogICAgIGlm
ICghbV92aXNpdGVkTGlua3NQb3B1bGF0ZWQpIHsKICAgICAgICAgbV92aXNpdGVkTGlua3NQb3B1
bGF0ZWQgPSB0cnVlOwpAQCAtMTI3LDEwICsxMjcsMTAgQEAgYm9vbCBQYWdlR3JvdXA6OmlzTGlu
a1Zpc2l0ZWQodW5zaWduZWQgdmlzaXRlZExpbmtIYXNoKQogICAgIHJldHVybiBtX3Zpc2l0ZWRM
aW5rSGFzaGVzLmNvbnRhaW5zKHZpc2l0ZWRMaW5rSGFzaCk7CiB9CiAKLWlubGluZSB2b2lkIFBh
Z2VHcm91cDo6YWRkVmlzaXRlZExpbmsodW5zaWduZWQgc3RyaW5nSGFzaCkKK2lubGluZSB2b2lk
IFBhZ2VHcm91cDo6YWRkVmlzaXRlZExpbmsoTGlua0hhc2ggc3RyaW5nSGFzaCkKIHsKICAgICBB
U1NFUlQoc2hvdWxkVHJhY2tWaXNpdGVkTGlua3MpOwotICAgIHVuc2lnbmVkIHZpc2l0ZWRMaW5r
SGFzaCA9IEFscmVhZHlIYXNoZWQ6OmF2b2lkRGVsZXRlZFZhbHVlKHN0cmluZ0hhc2gpOworICAg
IExpbmtIYXNoIHZpc2l0ZWRMaW5rSGFzaCA9IExpbmtIYXNoSGFzaDo6YXZvaWREZWxldGVkVmFs
dWUoc3RyaW5nSGFzaCk7CiAgICAgaWYgKCFtX3Zpc2l0ZWRMaW5rSGFzaGVzLmFkZCh2aXNpdGVk
TGlua0hhc2gpLnNlY29uZCkKICAgICAgICAgcmV0dXJuOwogICAgIFBhZ2U6OnZpc2l0ZWRTdGF0
ZUNoYW5nZWQodGhpcywgdmlzaXRlZExpbmtIYXNoKTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGFn
ZS9QYWdlR3JvdXAuaCBiL1dlYkNvcmUvcGFnZS9QYWdlR3JvdXAuaAppbmRleCBiMjU4OTJkLi4w
OTdmYjg3IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BhZ2UvUGFnZUdyb3VwLmgKKysrIGIvV2ViQ29y
ZS9wYWdlL1BhZ2VHcm91cC5oCkBAIC0yOCw2ICsyOCw3IEBACiAKICNpbmNsdWRlIDx3dGYvSGFz
aFNldC5oPgogI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgIkxpbmtIYXNo
LmgiCiAjaW5jbHVkZSAiU3RyaW5nSGFzaC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC00
OSw3ICs1MCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdm9pZCBhZGRQYWdlKFBh
Z2UqKTsKICAgICAgICAgdm9pZCByZW1vdmVQYWdlKFBhZ2UqKTsKIAotICAgICAgICBib29sIGlz
TGlua1Zpc2l0ZWQodW5zaWduZWQgdmlzaXRlZExpbmtIYXNoKTsKKyAgICAgICAgYm9vbCBpc0xp
bmtWaXNpdGVkKExpbmtIYXNoKTsKIAogICAgICAgICB2b2lkIGFkZFZpc2l0ZWRMaW5rKGNvbnN0
IEtVUkwmKTsKICAgICAgICAgdm9pZCBhZGRWaXNpdGVkTGluayhjb25zdCBVQ2hhciosIHNpemVf
dCk7CkBAIC02NiwxMiArNjcsMTMgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogI2VuZGlmCiAKICAg
ICBwcml2YXRlOgotICAgICAgICB2b2lkIGFkZFZpc2l0ZWRMaW5rKHVuc2lnbmVkIHN0cmluZ0hh
c2gpOworICAgICAgICB2b2lkIGFkZFZpc2l0ZWRMaW5rKExpbmtIYXNoIHN0cmluZ0hhc2gpOwog
CiAgICAgICAgIFN0cmluZyBtX25hbWU7CiAKICAgICAgICAgSGFzaFNldDxQYWdlKj4gbV9wYWdl
czsKLSAgICAgICAgSGFzaFNldDx1bnNpZ25lZCwgQWxyZWFkeUhhc2hlZD4gbV92aXNpdGVkTGlu
a0hhc2hlczsKKworICAgICAgICBIYXNoU2V0PExpbmtIYXNoLCBMaW5rSGFzaEhhc2g+IG1fdmlz
aXRlZExpbmtIYXNoZXM7CiAgICAgICAgIGJvb2wgbV92aXNpdGVkTGlua3NQb3B1bGF0ZWQ7CiAK
ICAgICAgICAgdW5zaWduZWQgbV9pZGVudGlmaWVyOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0
Zm9ybS9MaW5rSGFzaC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL0xpbmtIYXNoLmNwcAppbmRleCBl
NjlkZTI5Li4zOGNmNDI0IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL0xpbmtIYXNoLmNw
cAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL0xpbmtIYXNoLmNwcApAQCAtMCwwICsxLDIwNCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICog
ICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQorICog
ICAgICAgICAgIChDKSAyMDAxIERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQorICogICAg
ICAgICAgIChDKSAyMDA2IEFsZXhleSBQcm9za3VyeWFrb3YgKGFwQHdlYmtpdC5vcmcpCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQXRvbWljU3Ry
aW5nLmgiCisjaW5jbHVkZSAiS1VSTC5oIgorI2luY2x1ZGUgIkxpbmtIYXNoLmgiCisjaW5jbHVk
ZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJTdHJpbmdIYXNoLmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworc3RhdGljIGlubGluZSBpbnQgZmluZFNsYXNoRG90RG90U2xhc2goY29u
c3QgVUNoYXIqIGNoYXJhY3RlcnMsIHNpemVfdCBsZW5ndGgpCit7CisgICAgaWYgKGxlbmd0aCA8
IDQpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB1bnNpZ25lZCBsb29wTGltaXQgPSBsZW5ndGgg
LSAzOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsb29wTGltaXQ7ICsraSkgeworICAg
ICAgICBpZiAoY2hhcmFjdGVyc1tpXSA9PSAnLycgJiYgY2hhcmFjdGVyc1tpICsgMV0gPT0gJy4n
ICYmIGNoYXJhY3RlcnNbaSArIDJdID09ICcuJyAmJiBjaGFyYWN0ZXJzW2kgKyAzXSA9PSAnLycp
CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0
aWMgaW5saW5lIGludCBmaW5kU2xhc2hTbGFzaChjb25zdCBVQ2hhciogY2hhcmFjdGVycywgc2l6
ZV90IGxlbmd0aCwgaW50IHBvc2l0aW9uKQoreworICAgIGlmIChsZW5ndGggPCAyKQorICAgICAg
ICByZXR1cm4gLTE7CisgICAgdW5zaWduZWQgbG9vcExpbWl0ID0gbGVuZ3RoIC0gMTsKKyAgICBm
b3IgKHVuc2lnbmVkIGkgPSBwb3NpdGlvbjsgaSA8IGxvb3BMaW1pdDsgKytpKSB7CisgICAgICAg
IGlmIChjaGFyYWN0ZXJzW2ldID09ICcvJyAmJiBjaGFyYWN0ZXJzW2kgKyAxXSA9PSAnLycpCisg
ICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMg
aW5saW5lIGludCBmaW5kU2xhc2hEb3RTbGFzaChjb25zdCBVQ2hhciogY2hhcmFjdGVycywgc2l6
ZV90IGxlbmd0aCkKK3sKKyAgICBpZiAobGVuZ3RoIDwgMykKKyAgICAgICAgcmV0dXJuIC0xOwor
ICAgIHVuc2lnbmVkIGxvb3BMaW1pdCA9IGxlbmd0aCAtIDI7CisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IGxvb3BMaW1pdDsgKytpKSB7CisgICAgICAgIGlmIChjaGFyYWN0ZXJzW2ldID09
ICcvJyAmJiBjaGFyYWN0ZXJzW2kgKyAxXSA9PSAnLicgJiYgY2hhcmFjdGVyc1tpICsgMl0gPT0g
Jy8nKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKwor
c3RhdGljIGlubGluZSBib29sIGNvbnRhaW5zQ29sb25TbGFzaFNsYXNoKGNvbnN0IFVDaGFyKiBj
aGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCit7CisgICAgaWYgKGxlbmd0aCA8IDMpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB1bnNpZ25lZCBsb29wTGltaXQgPSBsZW5ndGggLSAyOwor
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsb29wTGltaXQ7ICsraSkgeworICAgICAgICBp
ZiAoY2hhcmFjdGVyc1tpXSA9PSAnOicgJiYgY2hhcmFjdGVyc1tpICsgMV0gPT0gJy8nICYmIGNo
YXJhY3RlcnNbaSArIDJdID09ICcvJykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhblBhdGgoVmVj
dG9yPFVDaGFyLCA1MTI+JiBwYXRoKQoreworICAgIC8vIEZJWE1FOiBTaG9sZCBub3QgZG8gdGhp
cyBpbiB0aGUgcXVlcnkgb3IgYW5jaG9yIHBhcnQuCisgICAgaW50IHBvczsKKyAgICB3aGlsZSAo
KHBvcyA9IGZpbmRTbGFzaERvdERvdFNsYXNoKHBhdGguZGF0YSgpLCBwYXRoLnNpemUoKSkpICE9
IC0xKSB7CisgICAgICAgIGludCBwcmV2ID0gcmV2ZXJzZUZpbmQocGF0aC5kYXRhKCksIHBhdGgu
c2l6ZSgpLCAnLycsIHBvcyAtIDEpOworICAgICAgICAvLyBkb24ndCByZW1vdmUgdGhlIGhvc3Qs
IGkuZS4gaHR0cDovL2Zvby5vcmcvLi4vZm9vLmh0bWwKKyAgICAgICAgaWYgKHByZXYgPCAwIHx8
IChwcmV2ID4gMyAmJiBwYXRoW3ByZXYgLSAyXSA9PSAnOicgJiYgcGF0aFtwcmV2IC0gMV0gPT0g
Jy8nKSkKKyAgICAgICAgICAgIHBhdGgucmVtb3ZlKHBvcywgMyk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIHBhdGgucmVtb3ZlKHByZXYsIHBvcyAtIHByZXYgKyAzKTsKKyAgICB9CisKKyAg
ICAvLyBGSVhNRTogU2hvbGQgbm90IGRvIHRoaXMgaW4gdGhlIHF1ZXJ5IHBhcnQuCisgICAgLy8g
U2V0IHJlZlBvcyB0byAtMiB0byBtZWFuICJJIGhhdmVuJ3QgbG9va2VkIGZvciB0aGUgYW5jaG9y
IHlldCIuCisgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byB3YXN0ZSBhIGZ1bmN0aW9uIGNhbGwgb24g
dGhlIHNlYXJjaCBmb3IgdGhlIHRoZSBhbmNob3IKKyAgICAvLyBpbiB0aGUgdmFzdCBtYWpvcml0
eSBvZiBjYXNlcyB3aGVyZSB0aGVyZSBpcyBubyAiLy8iIGluIHRoZSBwYXRoLgorICAgIHBvcyA9
IDA7CisgICAgaW50IHJlZlBvcyA9IC0yOworICAgIHdoaWxlICgocG9zID0gZmluZFNsYXNoU2xh
c2gocGF0aC5kYXRhKCksIHBhdGguc2l6ZSgpLCBwb3MpKSAhPSAtMSkgeworICAgICAgICBpZiAo
cmVmUG9zID09IC0yKQorICAgICAgICAgICAgcmVmUG9zID0gZmluZChwYXRoLmRhdGEoKSwgcGF0
aC5zaXplKCksICcjJyk7CisgICAgICAgIGlmIChyZWZQb3MgPiAwICYmIHBvcyA+PSByZWZQb3Mp
CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAocG9zID09IDAgfHwgcGF0aFtwb3Mg
LSAxXSAhPSAnOicpCisgICAgICAgICAgICBwYXRoLnJlbW92ZShwb3MpOworICAgICAgICBlbHNl
CisgICAgICAgICAgICBwb3MgKz0gMjsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogU2hvbGQgbm90
IGRvIHRoaXMgaW4gdGhlIHF1ZXJ5IG9yIGFuY2hvciBwYXJ0LgorICAgIHdoaWxlICgocG9zID0g
ZmluZFNsYXNoRG90U2xhc2gocGF0aC5kYXRhKCksIHBhdGguc2l6ZSgpKSkgIT0gLTEpCisgICAg
ICAgIHBhdGgucmVtb3ZlKHBvcywgMik7Cit9CisKKworc3RhdGljIGlubGluZSBib29sIG1hdGNo
TGV0dGVyKFVDaGFyIGMsIFVDaGFyIGxvd2VyY2FzZUxldHRlcikKK3sKKyAgICByZXR1cm4gKGMg
fCAweDIwKSA9PSBsb3dlcmNhc2VMZXR0ZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBuZWVk
c1RyYWlsaW5nU2xhc2goY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkK
K3sKKyAgICBpZiAobGVuZ3RoIDwgNikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICgh
bWF0Y2hMZXR0ZXIoY2hhcmFjdGVyc1swXSwgJ2gnKQorICAgICAgICAgICAgfHwgIW1hdGNoTGV0
dGVyKGNoYXJhY3RlcnNbMV0sICd0JykKKyAgICAgICAgICAgIHx8ICFtYXRjaExldHRlcihjaGFy
YWN0ZXJzWzJdLCAndCcpCisgICAgICAgICAgICB8fCAhbWF0Y2hMZXR0ZXIoY2hhcmFjdGVyc1sz
XSwgJ3AnKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghKGNoYXJhY3RlcnNbNF0g
PT0gJzonCisgICAgICAgICAgICB8fCAobWF0Y2hMZXR0ZXIoY2hhcmFjdGVyc1s0XSwgJ3MnKSAm
JiBjaGFyYWN0ZXJzWzVdID09ICc6JykpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB1
bnNpZ25lZCBwb3MgPSBjaGFyYWN0ZXJzWzRdID09ICc6JyA/IDUgOiA2OworCisgICAgLy8gU2tp
cCBpbml0aWFsIHR3byBzbGFzaGVzIGlmIHByZXNlbnQuCisgICAgaWYgKHBvcyArIDEgPCBsZW5n
dGggJiYgY2hhcmFjdGVyc1twb3NdID09ICcvJyAmJiBjaGFyYWN0ZXJzW3BvcyArIDFdID09ICcv
JykKKyAgICAgICAgcG9zICs9IDI7CisKKyAgICAvLyBGaW5kIG5leHQgc2xhc2guCisgICAgd2hp
bGUgKHBvcyA8IGxlbmd0aCAmJiBjaGFyYWN0ZXJzW3Bvc10gIT0gJy8nKQorICAgICAgICArK3Bv
czsKKworICAgIHJldHVybiBwb3MgPT0gbGVuZ3RoOworfQorCitMaW5rSGFzaCB2aXNpdGVkTGlu
a0hhc2goY29uc3QgS1VSTCYgYmFzZSwgY29uc3QgQXRvbWljU3RyaW5nJiBhdHRyaWJ1dGVVUkwp
Cit7CisgICAgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMgPSBhdHRyaWJ1dGVVUkwuY2hhcmFjdGVy
cygpOworICAgIHVuc2lnbmVkIGxlbmd0aCA9IGF0dHJpYnV0ZVVSTC5sZW5ndGgoKTsKKyAgICBp
ZiAoIWxlbmd0aCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBUaGlzIGlzIGEgcG9vciBt
YW4ncyBjb21wbGV0ZVVSTC4gRmFzdGVyIHdpdGggbGVzcyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAg
ICAvLyBGSVhNRTogSXQncyBtaXNzaW5nIGEgbG90IG9mIHdoYXQgY29tcGxldGVVUkwgZG9lcyBh
bmQgYSBsb3Qgb2Ygd2hhdCBLVVJMIGRvZXMuCisgICAgLy8gRm9yIGV4YW1wbGUsIGl0IGRvZXMg
bm90IGhhbmRsZSBpbnRlcm5hdGlvbmFsIGRvbWFpbiBuYW1lcyBwcm9wZXJseS4KKworICAgIC8v
IEZJWE1FOiBJdCBpcyB3cm9uZyB0aGF0IHdlIGRvIG5vdCBkbyBmdXJ0aGVyIHByb2Nlc3Npbmcg
b24gc3RyaW5ncyB0aGF0IGhhdmUgIjovLyIgaW4gdGhlbToKKyAgICAvLyAgICAxKSBUaGUgIjov
LyIgY291bGQgYmUgaW4gdGhlIHF1ZXJ5IG9yIGFuY2hvci4KKyAgICAvLyAgICAyKSBUaGUgVVJM
J3MgcGF0aCBjb3VsZCBoYXZlIGEgIi8uLyIgb3IgYSAiLy4uLyIgb3IgYSAiLy8iIHNlcXVlbmNl
IGluIGl0LgorCisgICAgLy8gRklYTUU6IG5lZWRzVHJhaWxpbmdTbGFzaCBkb2VzIG5vdCBwcm9w
ZXJseSByZXR1cm4gdHJ1ZSBmb3IgYSBVUkwgdGhhdCBoYXMgbm8gcGF0aCwgYnV0IGRvZXMKKyAg
ICAvLyBoYXZlIGEgcXVlcnkgb3IgYW5jaG9yLgorCisgICAgYm9vbCBoYXNDb2xvblNsYXNoU2xh
c2ggPSBjb250YWluc0NvbG9uU2xhc2hTbGFzaChjaGFyYWN0ZXJzLCBsZW5ndGgpOworCisgICAg
aWYgKGhhc0NvbG9uU2xhc2hTbGFzaCAmJiAhbmVlZHNUcmFpbGluZ1NsYXNoKGNoYXJhY3RlcnMs
IGxlbmd0aCkpCisgICAgICAgIHJldHVybiBBbHJlYWR5SGFzaGVkOjphdm9pZERlbGV0ZWRWYWx1
ZShhdHRyaWJ1dGVVUkwuc3RyaW5nKCkuaW1wbCgpLT5oYXNoKCkpOworCisgICAgVmVjdG9yPFVD
aGFyLCA1MTI+IGJ1ZmZlcjsKKworICAgIGlmIChoYXNDb2xvblNsYXNoU2xhc2gpIHsKKyAgICAg
ICAgLy8gRklYTUU6IFRoaXMgaXMgaW5jb3JyZWN0IGZvciBVUkxzIHRoYXQgaGF2ZSBhIHF1ZXJ5
IG9yIGFuY2hvcjsgdGhlICIvIiBuZWVkcyB0byBnbyBhdCB0aGUKKyAgICAgICAgLy8gZW5kIG9m
IHRoZSBwYXRoLCAqYmVmb3JlKiB0aGUgcXVlcnkgb3IgYW5jaG9yLgorICAgICAgICBidWZmZXIu
YXBwZW5kKGNoYXJhY3RlcnMsIGxlbmd0aCk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoJy8nKTsK
KyAgICAgICAgcmV0dXJuIEFscmVhZHlIYXNoZWQ6OmF2b2lkRGVsZXRlZFZhbHVlKFN0cmluZ0lt
cGw6OmNvbXB1dGVIYXNoKGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCkpKTsKKyAgICB9CisK
KyAgICBzd2l0Y2ggKGNoYXJhY3RlcnNbMF0pIHsKKyAgICAgICAgY2FzZSAnLyc6CisgICAgICAg
ICAgICBidWZmZXIuYXBwZW5kKGJhc2Uuc3RyaW5nKCkuY2hhcmFjdGVycygpLCBiYXNlLnBhdGhT
dGFydCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcjJzoKKyAgICAgICAg
ICAgIGJ1ZmZlci5hcHBlbmQoYmFzZS5zdHJpbmcoKS5jaGFyYWN0ZXJzKCksIGJhc2UucGF0aEVu
ZCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAg
YnVmZmVyLmFwcGVuZChiYXNlLnN0cmluZygpLmNoYXJhY3RlcnMoKSwgYmFzZS5wYXRoQWZ0ZXJM
YXN0U2xhc2goKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgYnVmZmVyLmFwcGVu
ZChjaGFyYWN0ZXJzLCBsZW5ndGgpOworICAgIGNsZWFuUGF0aChidWZmZXIpOworICAgIGlmIChu
ZWVkc1RyYWlsaW5nU2xhc2goYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSkpIHsKKyAgICAg
ICAgLy8gRklYTUU6IFRoaXMgaXMgaW5jb3JyZWN0IGZvciBVUkxzIHRoYXQgaGF2ZSBhIHF1ZXJ5
IG9yIGFuY2hvcjsgdGhlICIvIiBuZWVkcyB0byBnbyBhdCB0aGUKKyAgICAgICAgLy8gZW5kIG9m
IHRoZSBwYXRoLCAqYmVmb3JlKiB0aGUgcXVlcnkgb3IgYW5jaG9yLgorICAgICAgICBidWZmZXIu
YXBwZW5kKCcvJyk7CisgICAgfQorCisgICAgcmV0dXJuIEFscmVhZHlIYXNoZWQ6OmF2b2lkRGVs
ZXRlZFZhbHVlKFN0cmluZ0ltcGw6OmNvbXB1dGVIYXNoKGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5z
aXplKCkpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvcGxhdGZvcm0vTGlua0hhc2guaCBiL1dlYkNvcmUvcGxhdGZvcm0vTGlua0hhc2guaAppbmRl
eCBlNjlkZTI5Li4xZjZiMWYzIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL0xpbmtIYXNo
LmgKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9MaW5rSGFzaC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBV
VEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVU
RVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI2lmbmRlZiBMaW5rSGFzaF9oCisjZGVmaW5lIExpbmtIYXNoX2gKKworI2luY2x1
ZGUgIlN0cmluZ0hhc2guaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBBdG9taWNT
dHJpbmc7CitjbGFzcyBLVVJMOworCit0eXBlZGVmIHVpbnQ2NF90IExpbmtIYXNoOworCisvLyBK
dXN0IHVzZSB0aGUgbG93IDMyLWJpdHMgb2YgdGhlIDY0LWJpdCBoYXNoIGFzIHRoZSAiaGFzaCIg
KHdoaWNoIG11c3QgYmUgMzIgYml0cykuCitzdHJ1Y3QgTGlua0hhc2hIYXNoIHsKKyAgICBzdGF0
aWMgdW5zaWduZWQgaGFzaChMaW5rSGFzaCBrZXkpIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2ln
bmVkPihrZXkpOyB9CisgICAgc3RhdGljIGJvb2wgZXF1YWwoTGlua0hhc2ggYSwgTGlua0hhc2gg
YikgeyByZXR1cm4gYSA9PSBiOyB9CisgICAgc3RhdGljIGNvbnN0IGJvb2wgc2FmZVRvQ29tcGFy
ZVRvRW1wdHlPckRlbGV0ZWQgPSB0cnVlOworCisgICAgLy8gU2VlIEFscmVhZHlIYXNoZWQ6OmF2
b2lkRGVsZXRlZFZhbHVlLgorICAgIHN0YXRpYyB1bnNpZ25lZCBhdm9pZERlbGV0ZWRWYWx1ZShM
aW5rSGFzaCBoYXNoNjQpCisgICAgeworICAgICAgICBBU1NFUlQoaGFzaCk7CisgICAgICAgIHVu
c2lnbmVkIGhhc2ggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oaGFzaDY0KTsKKyAgICAgICAgdW5z
aWduZWQgbmV3SGFzaCA9IGhhc2ggfCAoIShoYXNoICsgMSkgPDwgMzEpOworICAgICAgICBBU1NF
UlQobmV3SGFzaCk7CisgICAgICAgIEFTU0VSVChuZXdIYXNoICE9IDB4RkZGRkZGRkYpOworICAg
ICAgICByZXR1cm4gbmV3SGFzaDsKKyAgICB9Cit9OworCisvLyBSZXNvbHZlcyB0aGUgcG90ZW50
aWFsbHkgcmVsYXRpdmUgVVJMICJhdHRyaWJ1dGVVUkwiIHJlbGF0aXZlIHRvIHRoZSBnaXZlbgor
Ly8gYmFzZSBVUkwsIGFuZCByZXR1cm5zIHRoZSBoYXNoIG9mIHRoZSBzdHJpbmcgdGhhdCB3aWxs
IGJlIHVzZWQgZm9yIHZpc2l0ZWQKKy8vIGxpbmsgY29sb3JpbmcuIEl0IHdpbGwgcmV0dXJuIHRo
ZSBzcGVjaWFsIHZhbHVlIG9mIDAgaWYgYXR0cmlidXRlVVJMIGRvZXMgbm90CisvLyBsb29rIGxp
a2UgYSByZWxhdGl2ZSBVUkwuCitMaW5rSGFzaCB2aXNpdGVkTGlua0hhc2goY29uc3QgS1VSTCYg
YmFzZSwgY29uc3QgQXRvbWljU3RyaW5nJiBhdHRyaWJ1dGVVUkwpOworCit9ICAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYgIC8vIExpbmtIYXNoX2gK
</data>
<flag name="review"
          id="11498"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>25316</attachid>
            <date>2008-11-20 09:54:57 -0800</date>
            <delta_ts>2008-11-20 09:54:57 -0800</delta_ts>
            <desc>Patch with Eric&apos;s suggsetions</desc>
            <filename>linkhash.diff</filename>
            <type>text/plain</type>
            <size>29419</size>
            <attacher name="Brett Wilson (Google)">brettw</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NTlmMDFhYS4uMjhkMjIzZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MCBAQAorMjAwOC0xMS0yMCAgQnJldHQgV2lsc29u
ICA8YnJldHR3QGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBFcmljIFNlaWRl
bC4KKworICAgICAgICBGYWN0b3Igb3V0IHZpc2l0ZWQgbGluayBoYXNoaW5nIGFuZCB0eXBlcyBp
bnRvIGEgbmV3IGZpbGUsIExpbmtIYXNoLgorICAgICAgICBUaGlzIGFsc28gY2hhbmdlcyB0aGUg
aGFzaCB0eXBlIHRvIDY0IGJpdHMsIGJ1dCBkb2VzIG5vdCBhY3R1YWxseSB1c2UKKyAgICAgICAg
dGhlIGV4dHJhIGJpdHMuIFRoaXMgd2lsbCBiZSBwYXJ0IG9mIGEgZnV0dXJlIGNoYW5nZS4KKwor
ICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBj
c3MvQ1NTU3R5bGVTZWxlY3Rvci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDU1NTdHlsZVNlbGVj
dG9yOjpTZWxlY3RvckNoZWNrZXI6OmNoZWNrUHNldWRvU3RhdGUpOgorICAgICAgICAoV2ViQ29y
ZTo6Q1NTU3R5bGVTZWxlY3Rvcjo6U2VsZWN0b3JDaGVja2VyOjp2aXNpdGVkU3RhdGVDaGFuZ2Vk
KToKKyAgICAgICAgKiBjc3MvQ1NTU3R5bGVTZWxlY3Rvci5oOgorICAgICAgICAoV2ViQ29yZTo6
Q1NTU3R5bGVTZWxlY3Rvcjo6dmlzaXRlZFN0YXRlQ2hhbmdlZCk6CisgICAgICAgICogZG9tL0Rv
Y3VtZW50LmNwcDoKKyAgICAgICAgKiBkb20vRG9jdW1lbnQuaDoKKyAgICAgICAgKiBwYWdlL1Bh
Z2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UGFnZTo6dmlzaXRlZFN0YXRlQ2hhbmdlZCk6Cisg
ICAgICAgICogcGFnZS9QYWdlLmg6CisgICAgICAgICogcGFnZS9QYWdlR3JvdXAuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6UGFnZUdyb3VwOjppc0xpbmtWaXNpdGVkKToKKyAgICAgICAgKFdlYkNv
cmU6OlBhZ2VHcm91cDo6YWRkVmlzaXRlZExpbmspOgorICAgICAgICAqIHBhZ2UvUGFnZUdyb3Vw
Lmg6CisgICAgICAgICogcGxhdGZvcm0vTGlua0hhc2guY3BwOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OmZpbmRTbGFzaERvdERvdFNsYXNoKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRTbGFz
aFNsYXNoKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRTbGFzaERvdFNsYXNoKToKKyAgICAgICAg
KFdlYkNvcmU6OmNvbnRhaW5zQ29sb25TbGFzaFNsYXNoKToKKyAgICAgICAgKFdlYkNvcmU6OmNs
ZWFuUGF0aCk6CisgICAgICAgIChXZWJDb3JlOjptYXRjaExldHRlcik6CisgICAgICAgIChXZWJD
b3JlOjpuZWVkc1RyYWlsaW5nU2xhc2gpOgorICAgICAgICAoV2ViQ29yZTo6dmlzaXRlZExpbmtI
YXNoKToKKyAgICAgICAgKiBwbGF0Zm9ybS9MaW5rSGFzaC5oOiBBZGRlZAorICAgICAgICAoV2Vi
Q29yZTo6TGlua0hhc2hIYXNoRnVuY3Rpb25zOjpoYXNoKToKKyAgICAgICAgKFdlYkNvcmU6Okxp
bmtIYXNoSGFzaEZ1bmN0aW9uczo6ZXF1YWwpOgorICAgICAgICAoV2ViQ29yZTo6TGlua0hhc2hI
YXNoRnVuY3Rpb25zOjphdm9pZERlbGV0ZWRWYWx1ZSk6CisKIDIwMDgtMTEtMjAgIEpvZXJnIEJv
cm5lbWFubiAgPGpvZXJnLmJvcm5lbWFubkB0cm9sbHRlY2guY29tPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IFNpbW9uIEhhdXNtYW5uLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2ogYi9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvagppbmRleCAwOWQ2NWVkLi5lMDQ5YWE1IDEwMDY0NAotLS0gYS9XZWJDb3JlL1dlYkNv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9XZWJDb3JlL1dlYkNvcmUueGNvZGVw
cm9qL3Byb2plY3QucGJ4cHJvagpAQCAtMTk2Miw2ICsxOTYyLDggQEAKIAkJQTc4NDk0MUIwQjVG
RTUwNzAwMUUyMzdBIC8qIENsaXBib2FyZC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBBNzg0OTQxQTBCNUZFNTA3MDAxRTIzN0EgLyogQ2xpcGJvYXJk
LmNwcCAqLzsgfTsKIAkJQTc5NTQ2M0UwQjVDNEM4MDAwN0I0MzhGIC8qIERyYWdEYXRhTWFjLm1t
IGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTc5NTQ2M0Qw
QjVDNEM4MDAwN0I0MzhGIC8qIERyYWdEYXRhTWFjLm1tICovOyB9OwogCQlBNzk1NDY0MzBCNUM0
Q0I0MDA3QjQzOEYgLyogRHJhZ0RhdGEuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gQTc5NTQ2NDIwQjVDNENCNDAwN0I0MzhGIC8qIERyYWdEYXRhLmNw
cCAqLzsgfTsKKwkJQTdBRDJGODcwRUM4OUQwNzAwOEFCMDAyIC8qIExpbmtIYXNoLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE3QUQyRjg1MEVDODlE
MDcwMDhBQjAwMiAvKiBMaW5rSGFzaC5jcHAgKi87IH07CisJCUE3QUQyRjg4MEVDODlEMDcwMDhB
QjAwMiAvKiBMaW5rSGFzaC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gQTdBRDJGODYwRUM4OUQwNzAwOEFCMDAyIC8qIExpbmtIYXNoLmggKi87IHNldHRp
bmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJQTdCNkU2OUYwQjI5MUE5
NjAwRDA1MjlGIC8qIERyYWdEYXRhLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBBN0I2RTY5RDBCMjkxQTk2MDBEMDUyOUYgLyogRHJhZ0RhdGEuaCAqLzsg
c2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQlBN0NBNTk1RDBC
MjdCRDlFMDBGQTAyMUQgLyogRHJhZ0NvbnRyb2xsZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE3Q0E1OTVCMEIyN0JEOUUwMEZBMDIxRCAvKiBEcmFn
Q29udHJvbGxlci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07
IH07CiAJCUE3Q0E1OTVFMEIyN0JEOUUwMEZBMDIxRCAvKiBEcmFnQ29udHJvbGxlci5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBN0NBNTk1QzBCMjdC
RDlFMDBGQTAyMUQgLyogRHJhZ0NvbnRyb2xsZXIuY3BwICovOyB9OwpAQCAtNjY5Nyw2ICs2Njk5
LDggQEAKIAkJQTc4NDk0MUEwQjVGRTUwNzAwMUUyMzdBIC8qIENsaXBib2FyZC5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQ2xpcGJvYXJkLmNwcDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQTc5NTQ2M0QwQjVDNEM4MDAwN0I0MzhGIC8qIERyYWdEYXRh
TWFjLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IERyYWdEYXRh
TWFjLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBNzk1NDY0MjBCNUM0Q0I0MDA3
QjQzOEYgLyogRHJhZ0RhdGEuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gRHJhZ0RhdGEuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBN0FEMkY4NTBF
Qzg5RDA3MDA4QUIwMDIgLyogTGlua0hhc2guY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gTGlua0hhc2guY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlB
N0FEMkY4NjBFQzg5RDA3MDA4QUIwMDIgLyogTGlua0hhc2guaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gTGlua0hhc2guaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
QTdCNkU2OUQwQjI5MUE5NjAwRDA1MjlGIC8qIERyYWdEYXRhLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IERyYWdEYXRhLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CUE3Q0E1OTVCMEIyN0JEOUUwMEZBMDIxRCAvKiBEcmFnQ29udHJvbGxlci5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBEcmFnQ29udHJvbGxlci5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQlBN0NBNTk1QzBCMjdCRDlFMDBGQTAyMUQgLyogRHJhZ0NvbnRyb2xsZXIu
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRHJhZ0NvbnRyb2xsZXIu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTM0MjAsNiArMTM0MjQsOCBAQAog
CQkJCUJDRTY1QkU5MEVBQ0RGMTYwMDdFNDUzMyAvKiBMZW5ndGguaCAqLywKIAkJCQlCQ0ZGNjQ4
RjBFQUQxNUMyMDBDMUQ2RjcgLyogTGVuZ3RoQm94LmggKi8sCiAJCQkJQkNGRjY0OTAwRUFEMTVD
MjAwQzFENkY3IC8qIExlbmd0aFNpemUuaCAqLywKKwkJCQlBN0FEMkY4NTBFQzg5RDA3MDA4QUIw
MDIgLyogTGlua0hhc2guY3BwICovLAorCQkJCUE3QUQyRjg2MEVDODlEMDcwMDhBQjAwMiAvKiBM
aW5rSGFzaC5oICovLAogCQkJCTkzNTIwN0JEMDlCRDQxMEEwMEYyMDM4RCAvKiBMb2NhbGl6ZWRT
dHJpbmdzLmggKi8sCiAJCQkJQTgyMzlERkUwOUIzQ0Y4QTAwQjYwNjQxIC8qIExvZ2dpbmcuY3Bw
ICovLAogCQkJCUE4MjM5REZGMDlCM0NGOEEwMEI2MDY0MSAvKiBMb2dnaW5nLmggKi8sCkBAIC0x
NjMxMCw2ICsxNjMxNiw3IEBACiAJCQkJRTE0Nzk5QTcwRUNERTNBNDAwMjkyQkYzIC8qIFdvcmtl
ck1lc3NhZ2luZ1Byb3h5LmggaW4gSGVhZGVycyAqLywKIAkJCQk5MzRDQzBFMjBFRDM5RDZGMDBB
NjU4RjIgLyogU2NyaXB0VmFsdWUuaCBpbiBIZWFkZXJzICovLAogCQkJCTA4OTdDMTREMEVEMkVC
QTUwMEFFMDZEQiAvKiBXTUxCUkVsZW1lbnQuaCBpbiBIZWFkZXJzICovLAorCQkJCUE3QUQyRjg4
MEVDODlEMDcwMDhBQjAwMiAvKiBMaW5rSGFzaC5oIGluIEhlYWRlcnMgKi8sCiAJCQkpOwogCQkJ
cnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkBAIC0xODIzMiw2
ICsxODIzOSw3IEBACiAJCQkJMDg5N0MxNEMwRUQyRUJBNTAwQUUwNkRCIC8qIFdNTEJSRWxlbWVu
dC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlFMTgyNTA0RjBFRDJGMjAyMDA0OTlBOEYgLyogRnJh
bWVMb2FkZXJDbGllbnQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTM0Q0MwRTEwRUQzOUQ2RjAw
QTY1OEYyIC8qIFNjcmlwdFZhbHVlLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUE3QUQyRjg3MEVD
ODlEMDcwMDhBQjAwMiAvKiBMaW5rSGFzaC5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQly
dW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKZGlmZiAtLWdpdCBh
L1dlYkNvcmUvY3NzL0NTU1N0eWxlU2VsZWN0b3IuY3BwIGIvV2ViQ29yZS9jc3MvQ1NTU3R5bGVT
ZWxlY3Rvci5jcHAKaW5kZXggODdmZDZhMC4uMTAyNWQyYyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9j
c3MvQ1NTU3R5bGVTZWxlY3Rvci5jcHAKKysrIGIvV2ViQ29yZS9jc3MvQ1NTU3R5bGVTZWxlY3Rv
ci5jcHAKQEAgLTYyLDYgKzYyLDcgQEAKICNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCiAj
aW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAiSFRNTFRleHRBcmVhRWxlbWVudC5oIgor
I2luY2x1ZGUgIkxpbmtIYXNoLmgiCiAjaW5jbHVkZSAiTWF0cml4VHJhbnNmb3JtT3BlcmF0aW9u
LmgiCiAjaW5jbHVkZSAiTWVkaWFMaXN0LmgiCiAjaW5jbHVkZSAiTWVkaWFRdWVyeUV2YWx1YXRv
ci5oIgpAQCAtODQxLDcgKzg0Miw3IEBAIFBzZXVkb1N0YXRlIENTU1N0eWxlU2VsZWN0b3I6OlNl
bGVjdG9yQ2hlY2tlcjo6Y2hlY2tQc2V1ZG9TdGF0ZShFbGVtZW50KiBlbGVtZW50CiAgICAgaWYg
KCFjaGVja1Zpc2l0ZWQpCiAgICAgICAgIHJldHVybiBQc2V1ZG9BbnlMaW5rOwogCi0gICAgdW5z
aWduZWQgaGFzaCA9IG1fZG9jdW1lbnQtPnZpc2l0ZWRMaW5rSGFzaCgqYXR0cik7CisgICAgTGlu
a0hhc2ggaGFzaCA9IHZpc2l0ZWRMaW5rSGFzaChtX2RvY3VtZW50LT5iYXNlVVJMKCksICphdHRy
KTsKICAgICBpZiAoIWhhc2gpCiAgICAgICAgIHJldHVybiBQc2V1ZG9MaW5rOwogCkBAIC01Njc5
LDEzICs1NjgwLDEzIEBAIHZvaWQgQ1NTU3R5bGVTZWxlY3Rvcjo6U2VsZWN0b3JDaGVja2VyOjph
bGxWaXNpdGVkU3RhdGVDaGFuZ2VkKCkKICAgICB9CiB9CiAKLXZvaWQgQ1NTU3R5bGVTZWxlY3Rv
cjo6U2VsZWN0b3JDaGVja2VyOjp2aXNpdGVkU3RhdGVDaGFuZ2VkKHVuc2lnbmVkIHZpc2l0ZWRI
YXNoKQordm9pZCBDU1NTdHlsZVNlbGVjdG9yOjpTZWxlY3RvckNoZWNrZXI6OnZpc2l0ZWRTdGF0
ZUNoYW5nZWQoTGlua0hhc2ggdmlzaXRlZEhhc2gpCiB7CiAgICAgaWYgKCFtX2xpbmtzQ2hlY2tl
ZEZvclZpc2l0ZWRTdGF0ZS5jb250YWlucyh2aXNpdGVkSGFzaCkpCiAgICAgICAgIHJldHVybjsK
ICAgICBmb3IgKE5vZGUqIG5vZGUgPSBtX2RvY3VtZW50OyBub2RlOyBub2RlID0gbm9kZS0+dHJh
dmVyc2VOZXh0Tm9kZSgpKSB7CiAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyogYXR0ciA9IGxp
bmtBdHRyaWJ1dGUobm9kZSk7Ci0gICAgICAgIGlmIChhdHRyICYmIG1fZG9jdW1lbnQtPnZpc2l0
ZWRMaW5rSGFzaCgqYXR0cikgPT0gdmlzaXRlZEhhc2gpCisgICAgICAgIGlmIChhdHRyICYmIHZp
c2l0ZWRMaW5rSGFzaChtX2RvY3VtZW50LT5iYXNlVVJMKCksICphdHRyKSA9PSB2aXNpdGVkSGFz
aCkKICAgICAgICAgICAgIG5vZGUtPnNldENoYW5nZWQoKTsKICAgICB9CiB9CmRpZmYgLS1naXQg
YS9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNlbGVjdG9yLmggYi9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNl
bGVjdG9yLmgKaW5kZXggMzg4ZGM5Zi4uMjJlZTNmZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9jc3Mv
Q1NTU3R5bGVTZWxlY3Rvci5oCisrKyBiL1dlYkNvcmUvY3NzL0NTU1N0eWxlU2VsZWN0b3IuaApA
QCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSAiQ1NTRm9udFNlbGVjdG9yLmgiCiAjaW5jbHVk
ZSAiS2V5ZnJhbWVMaXN0LmgiCisjaW5jbHVkZSAiTGlua0hhc2guaCIKICNpbmNsdWRlICJNZWRp
YVF1ZXJ5RXhwLmgiCiAjaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKICNpbmNsdWRlICJTdHJpbmdI
YXNoLmgiCkBAIC0xMzYsNyArMTM3LDcgQEAgcHVibGljOgogICAgICAgICBib29sIGFmZmVjdGVk
QnlWaWV3cG9ydENoYW5nZSgpIGNvbnN0OwogCiAgICAgICAgIHZvaWQgYWxsVmlzaXRlZFN0YXRl
Q2hhbmdlZCgpIHsgbV9jaGVja2VyLmFsbFZpc2l0ZWRTdGF0ZUNoYW5nZWQoKTsgfQotICAgICAg
ICB2b2lkIHZpc2l0ZWRTdGF0ZUNoYW5nZWQodW5zaWduZWQgdmlzaXRlZEhhc2gpIHsgbV9jaGVj
a2VyLnZpc2l0ZWRTdGF0ZUNoYW5nZWQodmlzaXRlZEhhc2gpOyB9CisgICAgICAgIHZvaWQgdmlz
aXRlZFN0YXRlQ2hhbmdlZChMaW5rSGFzaCB2aXNpdGVkSGFzaCkgeyBtX2NoZWNrZXIudmlzaXRl
ZFN0YXRlQ2hhbmdlZCh2aXNpdGVkSGFzaCk7IH0KIAogICAgICAgICB2b2lkIGFkZFZhcmlhYmxl
cyhDU1NWYXJpYWJsZXNSdWxlKiB2YXJpYWJsZXMpOwogICAgICAgICBDU1NWYWx1ZSogcmVzb2x2
ZVZhcmlhYmxlRGVwZW5kZW50VmFsdWUoQ1NTVmFyaWFibGVEZXBlbmRlbnRWYWx1ZSopOwpAQCAt
MTkxLDE0ICsxOTIsMTQgQEAgcHVibGljOgogICAgICAgICAgICAgYm9vbCBjaGVja1Njcm9sbGJh
clBzZXVkb0NsYXNzKENTU1NlbGVjdG9yKiwgUmVuZGVyU3R5bGU6OlBzZXVkb0lkJiBkeW5hbWlj
UHNldWRvKSBjb25zdDsKIAogICAgICAgICAgICAgdm9pZCBhbGxWaXNpdGVkU3RhdGVDaGFuZ2Vk
KCk7Ci0gICAgICAgICAgICB2b2lkIHZpc2l0ZWRTdGF0ZUNoYW5nZWQodW5zaWduZWQgdmlzaXRl
ZEhhc2gpOworICAgICAgICAgICAgdm9pZCB2aXNpdGVkU3RhdGVDaGFuZ2VkKExpbmtIYXNoIHZp
c2l0ZWRIYXNoKTsKIAogICAgICAgICAgICAgRG9jdW1lbnQqIG1fZG9jdW1lbnQ7CiAgICAgICAg
ICAgICBib29sIG1fc3RyaWN0UGFyc2luZzsKICAgICAgICAgICAgIGJvb2wgbV9jb2xsZWN0UnVs
ZXNPbmx5OwogICAgICAgICAgICAgUmVuZGVyU3R5bGU6OlBzZXVkb0lkIG1fcHNldWRvU3R5bGU7
CiAgICAgICAgICAgICBib29sIG1fZG9jdW1lbnRJc0hUTUw7Ci0gICAgICAgICAgICBtdXRhYmxl
IEhhc2hTZXQ8dW5zaWduZWQsIEFscmVhZHlIYXNoZWQ+IG1fbGlua3NDaGVja2VkRm9yVmlzaXRl
ZFN0YXRlOworICAgICAgICAgICAgbXV0YWJsZSBIYXNoU2V0PExpbmtIYXNoLCBMaW5rSGFzaEhh
c2hGdW5jdGlvbj4gbV9saW5rc0NoZWNrZWRGb3JWaXNpdGVkU3RhdGU7CiAgICAgICAgIH07CiAK
ICAgICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwIGIvV2Vi
Q29yZS9kb20vRG9jdW1lbnQuY3BwCmluZGV4IDVlYjlkYWIuLjcxZGY2ZDQgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcAorKysgYi9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAK
QEAgLTk5LDcgKzk5LDYgQEAKICNpbmNsdWRlICJTZWdtZW50ZWRTdHJpbmcuaCIKICNpbmNsdWRl
ICJTZWxlY3Rpb25Db250cm9sbGVyLmgiCiAjaW5jbHVkZSAiU2V0dGluZ3MuaCIKLSNpbmNsdWRl
ICJTdHJpbmdIYXNoLmgiCiAjaW5jbHVkZSAiU3R5bGVTaGVldExpc3QuaCIKICNpbmNsdWRlICJT
eXN0ZW1UaW1lLmgiCiAjaW5jbHVkZSAiVGV4dEV2ZW50LmgiCkBAIC00MTIzLDE3NiArNDEyMiw2
IEBAIERPTVNlbGVjdGlvbiogRG9jdW1lbnQ6OmdldFNlbGVjdGlvbigpIGNvbnN0CiAgICAgcmV0
dXJuIGZyYW1lKCkgPyBmcmFtZSgpLT5kb21XaW5kb3coKS0+Z2V0U2VsZWN0aW9uKCkgOiAwOwog
fQogCi1zdGF0aWMgaW5saW5lIGludCBmaW5kU2xhc2hEb3REb3RTbGFzaChjb25zdCBVQ2hhciog
Y2hhcmFjdGVycywgc2l6ZV90IGxlbmd0aCkKLXsKLSAgICBpZiAobGVuZ3RoIDwgNCkKLSAgICAg
ICAgcmV0dXJuIC0xOwotICAgIHVuc2lnbmVkIGxvb3BMaW1pdCA9IGxlbmd0aCAtIDM7Ci0gICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxvb3BMaW1pdDsgKytpKSB7Ci0gICAgICAgIGlmIChj
aGFyYWN0ZXJzW2ldID09ICcvJyAmJiBjaGFyYWN0ZXJzW2kgKyAxXSA9PSAnLicgJiYgY2hhcmFj
dGVyc1tpICsgMl0gPT0gJy4nICYmIGNoYXJhY3RlcnNbaSArIDNdID09ICcvJykKLSAgICAgICAg
ICAgIHJldHVybiBpOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUg
aW50IGZpbmRTbGFzaFNsYXNoKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBzaXplX3QgbGVuZ3Ro
LCBpbnQgcG9zaXRpb24pCi17Ci0gICAgaWYgKGxlbmd0aCA8IDIpCi0gICAgICAgIHJldHVybiAt
MTsKLSAgICB1bnNpZ25lZCBsb29wTGltaXQgPSBsZW5ndGggLSAxOwotICAgIGZvciAodW5zaWdu
ZWQgaSA9IHBvc2l0aW9uOyBpIDwgbG9vcExpbWl0OyArK2kpIHsKLSAgICAgICAgaWYgKGNoYXJh
Y3RlcnNbaV0gPT0gJy8nICYmIGNoYXJhY3RlcnNbaSArIDFdID09ICcvJykKLSAgICAgICAgICAg
IHJldHVybiBpOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50
IGZpbmRTbGFzaERvdFNsYXNoKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBzaXplX3QgbGVuZ3Ro
KQotewotICAgIGlmIChsZW5ndGggPCAzKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgdW5zaWdu
ZWQgbG9vcExpbWl0ID0gbGVuZ3RoIC0gMjsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bG9vcExpbWl0OyArK2kpIHsKLSAgICAgICAgaWYgKGNoYXJhY3RlcnNbaV0gPT0gJy8nICYmIGNo
YXJhY3RlcnNbaSArIDFdID09ICcuJyAmJiBjaGFyYWN0ZXJzW2kgKyAyXSA9PSAnLycpCi0gICAg
ICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW5s
aW5lIGJvb2wgY29udGFpbnNDb2xvblNsYXNoU2xhc2goY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMs
IHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICBpZiAobGVuZ3RoIDwgMykKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIHVuc2lnbmVkIGxvb3BMaW1pdCA9IGxlbmd0aCAtIDI7Ci0gICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IGxvb3BMaW1pdDsgKytpKSB7Ci0gICAgICAgIGlmIChjaGFyYWN0
ZXJzW2ldID09ICc6JyAmJiBjaGFyYWN0ZXJzW2kgKyAxXSA9PSAnLycgJiYgY2hhcmFjdGVyc1tp
ICsgMl0gPT0gJy8nKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVy
biBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNsZWFuUGF0aChWZWN0b3I8VUNoYXIs
IDUxMj4mIHBhdGgpCi17Ci0gICAgLy8gRklYTUU6IFNob2xkIG5vdCBkbyB0aGlzIGluIHRoZSBx
dWVyeSBvciBhbmNob3IgcGFydC4KLSAgICBpbnQgcG9zOwotICAgIHdoaWxlICgocG9zID0gZmlu
ZFNsYXNoRG90RG90U2xhc2gocGF0aC5kYXRhKCksIHBhdGguc2l6ZSgpKSkgIT0gLTEpIHsKLSAg
ICAgICAgaW50IHByZXYgPSByZXZlcnNlRmluZChwYXRoLmRhdGEoKSwgcGF0aC5zaXplKCksICcv
JywgcG9zIC0gMSk7Ci0gICAgICAgIC8vIGRvbid0IHJlbW92ZSB0aGUgaG9zdCwgaS5lLiBodHRw
Oi8vZm9vLm9yZy8uLi9mb28uaHRtbAotICAgICAgICBpZiAocHJldiA8IDAgfHwgKHByZXYgPiAz
ICYmIHBhdGhbcHJldiAtIDJdID09ICc6JyAmJiBwYXRoW3ByZXYgLSAxXSA9PSAnLycpKQotICAg
ICAgICAgICAgcGF0aC5yZW1vdmUocG9zLCAzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAg
cGF0aC5yZW1vdmUocHJldiwgcG9zIC0gcHJldiArIDMpOwotICAgIH0KLQotICAgIC8vIEZJWE1F
OiBTaG9sZCBub3QgZG8gdGhpcyBpbiB0aGUgcXVlcnkgcGFydC4KLSAgICAvLyBTZXQgcmVmUG9z
IHRvIC0yIHRvIG1lYW4gIkkgaGF2ZW4ndCBsb29rZWQgZm9yIHRoZSBhbmNob3IgeWV0Ii4KLSAg
ICAvLyBXZSBkb24ndCB3YW50IHRvIHdhc3RlIGEgZnVuY3Rpb24gY2FsbCBvbiB0aGUgc2VhcmNo
IGZvciB0aGUgdGhlIGFuY2hvcgotICAgIC8vIGluIHRoZSB2YXN0IG1ham9yaXR5IG9mIGNhc2Vz
IHdoZXJlIHRoZXJlIGlzIG5vICIvLyIgaW4gdGhlIHBhdGguCi0gICAgcG9zID0gMDsKLSAgICBp
bnQgcmVmUG9zID0gLTI7Ci0gICAgd2hpbGUgKChwb3MgPSBmaW5kU2xhc2hTbGFzaChwYXRoLmRh
dGEoKSwgcGF0aC5zaXplKCksIHBvcykpICE9IC0xKSB7Ci0gICAgICAgIGlmIChyZWZQb3MgPT0g
LTIpCi0gICAgICAgICAgICByZWZQb3MgPSBmaW5kKHBhdGguZGF0YSgpLCBwYXRoLnNpemUoKSwg
JyMnKTsKLSAgICAgICAgaWYgKHJlZlBvcyA+IDAgJiYgcG9zID49IHJlZlBvcykKLSAgICAgICAg
ICAgIGJyZWFrOwotCi0gICAgICAgIGlmIChwb3MgPT0gMCB8fCBwYXRoW3BvcyAtIDFdICE9ICc6
JykKLSAgICAgICAgICAgIHBhdGgucmVtb3ZlKHBvcyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAg
ICAgIHBvcyArPSAyOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBTaG9sZCBub3QgZG8gdGhpcyBp
biB0aGUgcXVlcnkgb3IgYW5jaG9yIHBhcnQuCi0gICAgd2hpbGUgKChwb3MgPSBmaW5kU2xhc2hE
b3RTbGFzaChwYXRoLmRhdGEoKSwgcGF0aC5zaXplKCkpKSAhPSAtMSkKLSAgICAgICAgcGF0aC5y
ZW1vdmUocG9zLCAyKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIG1hdGNoTGV0dGVyKFVDaGFy
IGMsIFVDaGFyIGxvd2VyY2FzZUxldHRlcikKLXsKLSAgICByZXR1cm4gKGMgfCAweDIwKSA9PSBs
b3dlcmNhc2VMZXR0ZXI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBuZWVkc1RyYWlsaW5nU2xh
c2goY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICBpZiAo
bGVuZ3RoIDwgNikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghbWF0Y2hMZXR0ZXIo
Y2hhcmFjdGVyc1swXSwgJ2gnKQotICAgICAgICAgICAgfHwgIW1hdGNoTGV0dGVyKGNoYXJhY3Rl
cnNbMV0sICd0JykKLSAgICAgICAgICAgIHx8ICFtYXRjaExldHRlcihjaGFyYWN0ZXJzWzJdLCAn
dCcpCi0gICAgICAgICAgICB8fCAhbWF0Y2hMZXR0ZXIoY2hhcmFjdGVyc1szXSwgJ3AnKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghKGNoYXJhY3RlcnNbNF0gPT0gJzonCi0gICAg
ICAgICAgICB8fCAobWF0Y2hMZXR0ZXIoY2hhcmFjdGVyc1s0XSwgJ3MnKSAmJiBjaGFyYWN0ZXJz
WzVdID09ICc6JykpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICB1bnNpZ25lZCBwb3Mg
PSBjaGFyYWN0ZXJzWzRdID09ICc6JyA/IDUgOiA2OwotCi0gICAgLy8gU2tpcCBpbml0aWFsIHR3
byBzbGFzaGVzIGlmIHByZXNlbnQuCi0gICAgaWYgKHBvcyArIDEgPCBsZW5ndGggJiYgY2hhcmFj
dGVyc1twb3NdID09ICcvJyAmJiBjaGFyYWN0ZXJzW3BvcyArIDFdID09ICcvJykKLSAgICAgICAg
cG9zICs9IDI7Ci0KLSAgICAvLyBGaW5kIG5leHQgc2xhc2guCi0gICAgd2hpbGUgKHBvcyA8IGxl
bmd0aCAmJiBjaGFyYWN0ZXJzW3Bvc10gIT0gJy8nKQotICAgICAgICArK3BvczsKLQotICAgIHJl
dHVybiBwb3MgPT0gbGVuZ3RoOwotfQotCi11bnNpZ25lZCBEb2N1bWVudDo6dmlzaXRlZExpbmtI
YXNoKGNvbnN0IEF0b21pY1N0cmluZyYgYXR0cmlidXRlVVJMKSBjb25zdAotewotICAgIGNvbnN0
IFVDaGFyKiBjaGFyYWN0ZXJzID0gYXR0cmlidXRlVVJMLmNoYXJhY3RlcnMoKTsKLSAgICB1bnNp
Z25lZCBsZW5ndGggPSBhdHRyaWJ1dGVVUkwubGVuZ3RoKCk7Ci0gICAgaWYgKCFsZW5ndGgpCi0g
ICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gVGhpcyBpcyBhIHBvb3IgbWFuJ3MgY29tcGxldGVV
UkwuIEZhc3RlciB3aXRoIGxlc3MgbWVtb3J5IGFsbG9jYXRpb24uCi0gICAgLy8gRklYTUU6IEl0
J3MgbWlzc2luZyBhIGxvdCBvZiB3aGF0IGNvbXBsZXRlVVJMIGRvZXMgYW5kIGEgbG90IG9mIHdo
YXQgS1VSTCBkb2VzLgotICAgIC8vIEZvciBleGFtcGxlLCBpdCBkb2VzIG5vdCBoYW5kbGUgaW50
ZXJuYXRpb25hbCBkb21haW4gbmFtZXMgcHJvcGVybHkuCi0KLSAgICAvLyBGSVhNRTogSXQgaXMg
d3JvbmcgdGhhdCB3ZSBkbyBub3QgZG8gZnVydGhlciBwcm9jZXNzaW5nIG9uIHN0cmluZ3MgdGhh
dCBoYXZlICI6Ly8iIGluIHRoZW06Ci0gICAgLy8gICAgMSkgVGhlICI6Ly8iIGNvdWxkIGJlIGlu
IHRoZSBxdWVyeSBvciBhbmNob3IuCi0gICAgLy8gICAgMikgVGhlIFVSTCdzIHBhdGggY291bGQg
aGF2ZSBhICIvLi8iIG9yIGEgIi8uLi8iIG9yIGEgIi8vIiBzZXF1ZW5jZSBpbiBpdC4KLQotICAg
IC8vIEZJWE1FOiBuZWVkc1RyYWlsaW5nU2xhc2ggZG9lcyBub3QgcHJvcGVybHkgcmV0dXJuIHRy
dWUgZm9yIGEgVVJMIHRoYXQgaGFzIG5vIHBhdGgsIGJ1dCBkb2VzCi0gICAgLy8gaGF2ZSBhIHF1
ZXJ5IG9yIGFuY2hvci4KLQotICAgIGJvb2wgaGFzQ29sb25TbGFzaFNsYXNoID0gY29udGFpbnND
b2xvblNsYXNoU2xhc2goY2hhcmFjdGVycywgbGVuZ3RoKTsKLQotICAgIGlmIChoYXNDb2xvblNs
YXNoU2xhc2ggJiYgIW5lZWRzVHJhaWxpbmdTbGFzaChjaGFyYWN0ZXJzLCBsZW5ndGgpKQotICAg
ICAgICByZXR1cm4gQWxyZWFkeUhhc2hlZDo6YXZvaWREZWxldGVkVmFsdWUoYXR0cmlidXRlVVJM
LnN0cmluZygpLmltcGwoKS0+aGFzaCgpKTsKLQotICAgIFZlY3RvcjxVQ2hhciwgNTEyPiBidWZm
ZXI7Ci0KLSAgICBpZiAoaGFzQ29sb25TbGFzaFNsYXNoKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBU
aGlzIGlzIGluY29ycmVjdCBmb3IgVVJMcyB0aGF0IGhhdmUgYSBxdWVyeSBvciBhbmNob3I7IHRo
ZSAiLyIgbmVlZHMgdG8gZ28gYXQgdGhlCi0gICAgICAgIC8vIGVuZCBvZiB0aGUgcGF0aCwgKmJl
Zm9yZSogdGhlIHF1ZXJ5IG9yIGFuY2hvci4KLSAgICAgICAgYnVmZmVyLmFwcGVuZChjaGFyYWN0
ZXJzLCBsZW5ndGgpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCcvJyk7Ci0gICAgICAgIHJldHVy
biBBbHJlYWR5SGFzaGVkOjphdm9pZERlbGV0ZWRWYWx1ZShTdHJpbmdJbXBsOjpjb21wdXRlSGFz
aChidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKSk7Ci0gICAgfQotCi0gICAgc3dpdGNoIChj
aGFyYWN0ZXJzWzBdKSB7Ci0gICAgICAgIGNhc2UgJy8nOgotICAgICAgICAgICAgYnVmZmVyLmFw
cGVuZChtX2Jhc2VVUkwuc3RyaW5nKCkuY2hhcmFjdGVycygpLCBtX2Jhc2VVUkwucGF0aFN0YXJ0
KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJyMnOgotICAgICAgICAgICAg
YnVmZmVyLmFwcGVuZChtX2Jhc2VVUkwuc3RyaW5nKCkuY2hhcmFjdGVycygpLCBtX2Jhc2VVUkwu
cGF0aEVuZCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAg
ICAgICAgYnVmZmVyLmFwcGVuZChtX2Jhc2VVUkwuc3RyaW5nKCkuY2hhcmFjdGVycygpLCBtX2Jh
c2VVUkwucGF0aEFmdGVyTGFzdFNsYXNoKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQot
ICAgIGJ1ZmZlci5hcHBlbmQoY2hhcmFjdGVycywgbGVuZ3RoKTsKLSAgICBjbGVhblBhdGgoYnVm
ZmVyKTsKLSAgICBpZiAobmVlZHNUcmFpbGluZ1NsYXNoKGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5z
aXplKCkpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIGluY29ycmVjdCBmb3IgVVJMcyB0
aGF0IGhhdmUgYSBxdWVyeSBvciBhbmNob3I7IHRoZSAiLyIgbmVlZHMgdG8gZ28gYXQgdGhlCi0g
ICAgICAgIC8vIGVuZCBvZiB0aGUgcGF0aCwgKmJlZm9yZSogdGhlIHF1ZXJ5IG9yIGFuY2hvci4K
LSAgICAgICAgYnVmZmVyLmFwcGVuZCgnLycpOwotICAgIH0KLQotICAgIHJldHVybiBBbHJlYWR5
SGFzaGVkOjphdm9pZERlbGV0ZWRWYWx1ZShTdHJpbmdJbXBsOjpjb21wdXRlSGFzaChidWZmZXIu
ZGF0YSgpLCBidWZmZXIuc2l6ZSgpKSk7Ci19Ci0KICNpZiBFTkFCTEUoREFUQUJBU0UpCiAKIHZv
aWQgRG9jdW1lbnQ6OmFkZE9wZW5EYXRhYmFzZShEYXRhYmFzZSogZGF0YWJhc2UpCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5oIGIvV2ViQ29yZS9kb20vRG9jdW1lbnQuaAppbmRl
eCA2OGIwZWM1Li4yMmVmM2FhIDEwMDY0NAotLS0gYS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5oCisr
KyBiL1dlYkNvcmUvZG9tL0RvY3VtZW50LmgKQEAgLTQyOCw4ICs0MjgsNiBAQCBwdWJsaWM6CiAK
ICAgICBLVVJMIGNvbXBsZXRlVVJMKGNvbnN0IFN0cmluZyYpIGNvbnN0OwogCi0gICAgdW5zaWdu
ZWQgdmlzaXRlZExpbmtIYXNoKGNvbnN0IEF0b21pY1N0cmluZyYgYXR0cmlidXRlVVJMKSBjb25z
dDsKLQogICAgIC8vIGZyb20gY2FjaGVkT2JqZWN0Q2xpZW50CiAgICAgdmlydHVhbCB2b2lkIHNl
dENTU1N0eWxlU2hlZXQoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgY2hhcnNldCwg
Y29uc3QgQ2FjaGVkQ1NTU3R5bGVTaGVldCopOwogCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BhZ2Uv
UGFnZS5jcHAgYi9XZWJDb3JlL3BhZ2UvUGFnZS5jcHAKaW5kZXggNDQ2NzQ3Yi4uMDYzZjUwNiAx
MDA2NDQKLS0tIGEvV2ViQ29yZS9wYWdlL1BhZ2UuY3BwCisrKyBiL1dlYkNvcmUvcGFnZS9QYWdl
LmNwcApAQCAtNDkzLDcgKzQ5Myw3IEBAIHZvaWQgUGFnZTo6YWxsVmlzaXRlZFN0YXRlQ2hhbmdl
ZChQYWdlR3JvdXAqIGdyb3VwKQogICAgIH0KIH0KIAotdm9pZCBQYWdlOjp2aXNpdGVkU3RhdGVD
aGFuZ2VkKFBhZ2VHcm91cCogZ3JvdXAsIHVuc2lnbmVkIHZpc2l0ZWRMaW5rSGFzaCkKK3ZvaWQg
UGFnZTo6dmlzaXRlZFN0YXRlQ2hhbmdlZChQYWdlR3JvdXAqIGdyb3VwLCBMaW5rSGFzaCB2aXNp
dGVkTGlua0hhc2gpCiB7CiAgICAgQVNTRVJUKGdyb3VwKTsKICAgICBBU1NFUlQoYWxsUGFnZXMp
OwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wYWdlL1BhZ2UuaCBiL1dlYkNvcmUvcGFnZS9QYWdlLmgK
aW5kZXggOTU3NjU0MS4uNzQwOGM3ZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wYWdlL1BhZ2UuaAor
KysgYi9XZWJDb3JlL3BhZ2UvUGFnZS5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAiQ2hy
b21lLmgiCiAjaW5jbHVkZSAiQ29udGV4dE1lbnVDb250cm9sbGVyLmgiCiAjaW5jbHVkZSAiRnJh
bWVMb2FkZXJUeXBlcy5oIgorI2luY2x1ZGUgIkxpbmtIYXNoLmgiCiAjaW5jbHVkZSAiUGxhdGZv
cm1TdHJpbmcuaCIKICNpZiBQTEFURk9STShNQUMpCiAjaW5jbHVkZSAiU2NoZWR1bGVQYWlyLmgi
CkBAIC0xNzEsNyArMTcyLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBzdGF0aWMg
dm9pZCByZW1vdmVBbGxWaXNpdGVkTGlua3MoKTsKIAogICAgICAgICBzdGF0aWMgdm9pZCBhbGxW
aXNpdGVkU3RhdGVDaGFuZ2VkKFBhZ2VHcm91cCopOwotICAgICAgICBzdGF0aWMgdm9pZCB2aXNp
dGVkU3RhdGVDaGFuZ2VkKFBhZ2VHcm91cCosIHVuc2lnbmVkIHZpc2l0ZWRIYXNoKTsKKyAgICAg
ICAgc3RhdGljIHZvaWQgdmlzaXRlZFN0YXRlQ2hhbmdlZChQYWdlR3JvdXAqLCBMaW5rSGFzaCB2
aXNpdGVkSGFzaCk7CiAKICNpZiBFTkFCTEUoRE9NX1NUT1JBR0UpCiAgICAgICAgIFNlc3Npb25T
dG9yYWdlKiBzZXNzaW9uU3RvcmFnZShib29sIG9wdGlvbmFsQ3JlYXRlID0gdHJ1ZSk7CmRpZmYg
LS1naXQgYS9XZWJDb3JlL3BhZ2UvUGFnZUdyb3VwLmNwcCBiL1dlYkNvcmUvcGFnZS9QYWdlR3Jv
dXAuY3BwCmluZGV4IDZiNzJiZTIuLmRhZWEwNDggMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGFnZS9Q
YWdlR3JvdXAuY3BwCisrKyBiL1dlYkNvcmUvcGFnZS9QYWdlR3JvdXAuY3BwCkBAIC0xMTcsNyAr
MTE3LDcgQEAgdm9pZCBQYWdlR3JvdXA6OnJlbW92ZVBhZ2UoUGFnZSogcGFnZSkKICAgICBtX3Bh
Z2VzLnJlbW92ZShwYWdlKTsKIH0KIAotYm9vbCBQYWdlR3JvdXA6OmlzTGlua1Zpc2l0ZWQodW5z
aWduZWQgdmlzaXRlZExpbmtIYXNoKQorYm9vbCBQYWdlR3JvdXA6OmlzTGlua1Zpc2l0ZWQoTGlu
a0hhc2ggdmlzaXRlZExpbmtIYXNoKQogewogICAgIGlmICghbV92aXNpdGVkTGlua3NQb3B1bGF0
ZWQpIHsKICAgICAgICAgbV92aXNpdGVkTGlua3NQb3B1bGF0ZWQgPSB0cnVlOwpAQCAtMTI3LDEw
ICsxMjcsMTAgQEAgYm9vbCBQYWdlR3JvdXA6OmlzTGlua1Zpc2l0ZWQodW5zaWduZWQgdmlzaXRl
ZExpbmtIYXNoKQogICAgIHJldHVybiBtX3Zpc2l0ZWRMaW5rSGFzaGVzLmNvbnRhaW5zKHZpc2l0
ZWRMaW5rSGFzaCk7CiB9CiAKLWlubGluZSB2b2lkIFBhZ2VHcm91cDo6YWRkVmlzaXRlZExpbmso
dW5zaWduZWQgc3RyaW5nSGFzaCkKK2lubGluZSB2b2lkIFBhZ2VHcm91cDo6YWRkVmlzaXRlZExp
bmsoTGlua0hhc2ggc3RyaW5nSGFzaCkKIHsKICAgICBBU1NFUlQoc2hvdWxkVHJhY2tWaXNpdGVk
TGlua3MpOwotICAgIHVuc2lnbmVkIHZpc2l0ZWRMaW5rSGFzaCA9IEFscmVhZHlIYXNoZWQ6OmF2
b2lkRGVsZXRlZFZhbHVlKHN0cmluZ0hhc2gpOworICAgIExpbmtIYXNoIHZpc2l0ZWRMaW5rSGFz
aCA9IExpbmtIYXNoSGFzaEZ1bmN0aW9uOjphdm9pZERlbGV0ZWRWYWx1ZShzdHJpbmdIYXNoKTsK
ICAgICBpZiAoIW1fdmlzaXRlZExpbmtIYXNoZXMuYWRkKHZpc2l0ZWRMaW5rSGFzaCkuc2Vjb25k
KQogICAgICAgICByZXR1cm47CiAgICAgUGFnZTo6dmlzaXRlZFN0YXRlQ2hhbmdlZCh0aGlzLCB2
aXNpdGVkTGlua0hhc2gpOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wYWdlL1BhZ2VHcm91cC5oIGIv
V2ViQ29yZS9wYWdlL1BhZ2VHcm91cC5oCmluZGV4IGIyNTg5MmQuLjU4OTgyOGQgMTAwNjQ0Ci0t
LSBhL1dlYkNvcmUvcGFnZS9QYWdlR3JvdXAuaAorKysgYi9XZWJDb3JlL3BhZ2UvUGFnZUdyb3Vw
LmgKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CiAjaW5jbHVk
ZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5jbHVkZSAiTGlua0hhc2guaCIKICNpbmNsdWRlICJT
dHJpbmdIYXNoLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTQ5LDcgKzUwLDcgQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB2b2lkIGFkZFBhZ2UoUGFnZSopOwogICAgICAgICB2
b2lkIHJlbW92ZVBhZ2UoUGFnZSopOwogCi0gICAgICAgIGJvb2wgaXNMaW5rVmlzaXRlZCh1bnNp
Z25lZCB2aXNpdGVkTGlua0hhc2gpOworICAgICAgICBib29sIGlzTGlua1Zpc2l0ZWQoTGlua0hh
c2gpOwogCiAgICAgICAgIHZvaWQgYWRkVmlzaXRlZExpbmsoY29uc3QgS1VSTCYpOwogICAgICAg
ICB2b2lkIGFkZFZpc2l0ZWRMaW5rKGNvbnN0IFVDaGFyKiwgc2l6ZV90KTsKQEAgLTY2LDEyICs2
NywxMyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAjZW5kaWYKIAogICAgIHByaXZhdGU6Ci0gICAg
ICAgIHZvaWQgYWRkVmlzaXRlZExpbmsodW5zaWduZWQgc3RyaW5nSGFzaCk7CisgICAgICAgIHZv
aWQgYWRkVmlzaXRlZExpbmsoTGlua0hhc2ggc3RyaW5nSGFzaCk7CiAKICAgICAgICAgU3RyaW5n
IG1fbmFtZTsKIAogICAgICAgICBIYXNoU2V0PFBhZ2UqPiBtX3BhZ2VzOwotICAgICAgICBIYXNo
U2V0PHVuc2lnbmVkLCBBbHJlYWR5SGFzaGVkPiBtX3Zpc2l0ZWRMaW5rSGFzaGVzOworCisgICAg
ICAgIEhhc2hTZXQ8TGlua0hhc2gsIExpbmtIYXNoSGFzaEZ1bmN0aW9uPiBtX3Zpc2l0ZWRMaW5r
SGFzaGVzOwogICAgICAgICBib29sIG1fdmlzaXRlZExpbmtzUG9wdWxhdGVkOwogCiAgICAgICAg
IHVuc2lnbmVkIG1faWRlbnRpZmllcjsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vTGlu
a0hhc2guY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9MaW5rSGFzaC5jcHAKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uMzhjZjQyNAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vTGlua0hhc2guY3BwCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDE5
OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDIw
MDEgRGlyayBNdWVsbGVyIChtdWVsbGVyQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDIwMDYg
QWxleGV5IFByb3NrdXJ5YWtvdiAoYXBAd2Via2l0Lm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAw
NCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBdG9taWNTdHJpbmcuaCIKKyNpbmNsdWRl
ICJLVVJMLmgiCisjaW5jbHVkZSAiTGlua0hhc2guaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmlu
Zy5oIgorI2luY2x1ZGUgIlN0cmluZ0hhc2guaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitz
dGF0aWMgaW5saW5lIGludCBmaW5kU2xhc2hEb3REb3RTbGFzaChjb25zdCBVQ2hhciogY2hhcmFj
dGVycywgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICBpZiAobGVuZ3RoIDwgNCkKKyAgICAgICAgcmV0
dXJuIC0xOworICAgIHVuc2lnbmVkIGxvb3BMaW1pdCA9IGxlbmd0aCAtIDM7CisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IGxvb3BMaW1pdDsgKytpKSB7CisgICAgICAgIGlmIChjaGFyYWN0
ZXJzW2ldID09ICcvJyAmJiBjaGFyYWN0ZXJzW2kgKyAxXSA9PSAnLicgJiYgY2hhcmFjdGVyc1tp
ICsgMl0gPT0gJy4nICYmIGNoYXJhY3RlcnNbaSArIDNdID09ICcvJykKKyAgICAgICAgICAgIHJl
dHVybiBpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZp
bmRTbGFzaFNsYXNoKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBzaXplX3QgbGVuZ3RoLCBpbnQg
cG9zaXRpb24pCit7CisgICAgaWYgKGxlbmd0aCA8IDIpCisgICAgICAgIHJldHVybiAtMTsKKyAg
ICB1bnNpZ25lZCBsb29wTGltaXQgPSBsZW5ndGggLSAxOworICAgIGZvciAodW5zaWduZWQgaSA9
IHBvc2l0aW9uOyBpIDwgbG9vcExpbWl0OyArK2kpIHsKKyAgICAgICAgaWYgKGNoYXJhY3RlcnNb
aV0gPT0gJy8nICYmIGNoYXJhY3RlcnNbaSArIDFdID09ICcvJykKKyAgICAgICAgICAgIHJldHVy
biBpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZpbmRT
bGFzaERvdFNsYXNoKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBzaXplX3QgbGVuZ3RoKQorewor
ICAgIGlmIChsZW5ndGggPCAzKQorICAgICAgICByZXR1cm4gLTE7CisgICAgdW5zaWduZWQgbG9v
cExpbWl0ID0gbGVuZ3RoIC0gMjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbG9vcExp
bWl0OyArK2kpIHsKKyAgICAgICAgaWYgKGNoYXJhY3RlcnNbaV0gPT0gJy8nICYmIGNoYXJhY3Rl
cnNbaSArIDFdID09ICcuJyAmJiBjaGFyYWN0ZXJzW2kgKyAyXSA9PSAnLycpCisgICAgICAgICAg
ICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGJv
b2wgY29udGFpbnNDb2xvblNsYXNoU2xhc2goY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2ln
bmVkIGxlbmd0aCkKK3sKKyAgICBpZiAobGVuZ3RoIDwgMykKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIHVuc2lnbmVkIGxvb3BMaW1pdCA9IGxlbmd0aCAtIDI7CisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IGxvb3BMaW1pdDsgKytpKSB7CisgICAgICAgIGlmIChjaGFyYWN0ZXJzW2ld
ID09ICc6JyAmJiBjaGFyYWN0ZXJzW2kgKyAxXSA9PSAnLycgJiYgY2hhcmFjdGVyc1tpICsgMl0g
PT0gJy8nKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxz
ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFuUGF0aChWZWN0b3I8VUNoYXIsIDUxMj4m
IHBhdGgpCit7CisgICAgLy8gRklYTUU6IFNob2xkIG5vdCBkbyB0aGlzIGluIHRoZSBxdWVyeSBv
ciBhbmNob3IgcGFydC4KKyAgICBpbnQgcG9zOworICAgIHdoaWxlICgocG9zID0gZmluZFNsYXNo
RG90RG90U2xhc2gocGF0aC5kYXRhKCksIHBhdGguc2l6ZSgpKSkgIT0gLTEpIHsKKyAgICAgICAg
aW50IHByZXYgPSByZXZlcnNlRmluZChwYXRoLmRhdGEoKSwgcGF0aC5zaXplKCksICcvJywgcG9z
IC0gMSk7CisgICAgICAgIC8vIGRvbid0IHJlbW92ZSB0aGUgaG9zdCwgaS5lLiBodHRwOi8vZm9v
Lm9yZy8uLi9mb28uaHRtbAorICAgICAgICBpZiAocHJldiA8IDAgfHwgKHByZXYgPiAzICYmIHBh
dGhbcHJldiAtIDJdID09ICc6JyAmJiBwYXRoW3ByZXYgLSAxXSA9PSAnLycpKQorICAgICAgICAg
ICAgcGF0aC5yZW1vdmUocG9zLCAzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGF0aC5y
ZW1vdmUocHJldiwgcG9zIC0gcHJldiArIDMpOworICAgIH0KKworICAgIC8vIEZJWE1FOiBTaG9s
ZCBub3QgZG8gdGhpcyBpbiB0aGUgcXVlcnkgcGFydC4KKyAgICAvLyBTZXQgcmVmUG9zIHRvIC0y
IHRvIG1lYW4gIkkgaGF2ZW4ndCBsb29rZWQgZm9yIHRoZSBhbmNob3IgeWV0Ii4KKyAgICAvLyBX
ZSBkb24ndCB3YW50IHRvIHdhc3RlIGEgZnVuY3Rpb24gY2FsbCBvbiB0aGUgc2VhcmNoIGZvciB0
aGUgdGhlIGFuY2hvcgorICAgIC8vIGluIHRoZSB2YXN0IG1ham9yaXR5IG9mIGNhc2VzIHdoZXJl
IHRoZXJlIGlzIG5vICIvLyIgaW4gdGhlIHBhdGguCisgICAgcG9zID0gMDsKKyAgICBpbnQgcmVm
UG9zID0gLTI7CisgICAgd2hpbGUgKChwb3MgPSBmaW5kU2xhc2hTbGFzaChwYXRoLmRhdGEoKSwg
cGF0aC5zaXplKCksIHBvcykpICE9IC0xKSB7CisgICAgICAgIGlmIChyZWZQb3MgPT0gLTIpCisg
ICAgICAgICAgICByZWZQb3MgPSBmaW5kKHBhdGguZGF0YSgpLCBwYXRoLnNpemUoKSwgJyMnKTsK
KyAgICAgICAgaWYgKHJlZlBvcyA+IDAgJiYgcG9zID49IHJlZlBvcykKKyAgICAgICAgICAgIGJy
ZWFrOworCisgICAgICAgIGlmIChwb3MgPT0gMCB8fCBwYXRoW3BvcyAtIDFdICE9ICc6JykKKyAg
ICAgICAgICAgIHBhdGgucmVtb3ZlKHBvcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBv
cyArPSAyOworICAgIH0KKworICAgIC8vIEZJWE1FOiBTaG9sZCBub3QgZG8gdGhpcyBpbiB0aGUg
cXVlcnkgb3IgYW5jaG9yIHBhcnQuCisgICAgd2hpbGUgKChwb3MgPSBmaW5kU2xhc2hEb3RTbGFz
aChwYXRoLmRhdGEoKSwgcGF0aC5zaXplKCkpKSAhPSAtMSkKKyAgICAgICAgcGF0aC5yZW1vdmUo
cG9zLCAyKTsKK30KKworCitzdGF0aWMgaW5saW5lIGJvb2wgbWF0Y2hMZXR0ZXIoVUNoYXIgYywg
VUNoYXIgbG93ZXJjYXNlTGV0dGVyKQoreworICAgIHJldHVybiAoYyB8IDB4MjApID09IGxvd2Vy
Y2FzZUxldHRlcjsKK30KKworc3RhdGljIGlubGluZSBib29sIG5lZWRzVHJhaWxpbmdTbGFzaChj
b25zdCBVQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKQoreworICAgIGlmIChsZW5n
dGggPCA2KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFtYXRjaExldHRlcihjaGFy
YWN0ZXJzWzBdLCAnaCcpCisgICAgICAgICAgICB8fCAhbWF0Y2hMZXR0ZXIoY2hhcmFjdGVyc1sx
XSwgJ3QnKQorICAgICAgICAgICAgfHwgIW1hdGNoTGV0dGVyKGNoYXJhY3RlcnNbMl0sICd0JykK
KyAgICAgICAgICAgIHx8ICFtYXRjaExldHRlcihjaGFyYWN0ZXJzWzNdLCAncCcpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCEoY2hhcmFjdGVyc1s0XSA9PSAnOicKKyAgICAgICAg
ICAgIHx8IChtYXRjaExldHRlcihjaGFyYWN0ZXJzWzRdLCAncycpICYmIGNoYXJhY3RlcnNbNV0g
PT0gJzonKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHBvcyA9IGNo
YXJhY3RlcnNbNF0gPT0gJzonID8gNSA6IDY7CisKKyAgICAvLyBTa2lwIGluaXRpYWwgdHdvIHNs
YXNoZXMgaWYgcHJlc2VudC4KKyAgICBpZiAocG9zICsgMSA8IGxlbmd0aCAmJiBjaGFyYWN0ZXJz
W3Bvc10gPT0gJy8nICYmIGNoYXJhY3RlcnNbcG9zICsgMV0gPT0gJy8nKQorICAgICAgICBwb3Mg
Kz0gMjsKKworICAgIC8vIEZpbmQgbmV4dCBzbGFzaC4KKyAgICB3aGlsZSAocG9zIDwgbGVuZ3Ro
ICYmIGNoYXJhY3RlcnNbcG9zXSAhPSAnLycpCisgICAgICAgICsrcG9zOworCisgICAgcmV0dXJu
IHBvcyA9PSBsZW5ndGg7Cit9CisKK0xpbmtIYXNoIHZpc2l0ZWRMaW5rSGFzaChjb25zdCBLVVJM
JiBiYXNlLCBjb25zdCBBdG9taWNTdHJpbmcmIGF0dHJpYnV0ZVVSTCkKK3sKKyAgICBjb25zdCBV
Q2hhciogY2hhcmFjdGVycyA9IGF0dHJpYnV0ZVVSTC5jaGFyYWN0ZXJzKCk7CisgICAgdW5zaWdu
ZWQgbGVuZ3RoID0gYXR0cmlidXRlVVJMLmxlbmd0aCgpOworICAgIGlmICghbGVuZ3RoKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIC8vIFRoaXMgaXMgYSBwb29yIG1hbidzIGNvbXBsZXRlVVJM
LiBGYXN0ZXIgd2l0aCBsZXNzIG1lbW9yeSBhbGxvY2F0aW9uLgorICAgIC8vIEZJWE1FOiBJdCdz
IG1pc3NpbmcgYSBsb3Qgb2Ygd2hhdCBjb21wbGV0ZVVSTCBkb2VzIGFuZCBhIGxvdCBvZiB3aGF0
IEtVUkwgZG9lcy4KKyAgICAvLyBGb3IgZXhhbXBsZSwgaXQgZG9lcyBub3QgaGFuZGxlIGludGVy
bmF0aW9uYWwgZG9tYWluIG5hbWVzIHByb3Blcmx5LgorCisgICAgLy8gRklYTUU6IEl0IGlzIHdy
b25nIHRoYXQgd2UgZG8gbm90IGRvIGZ1cnRoZXIgcHJvY2Vzc2luZyBvbiBzdHJpbmdzIHRoYXQg
aGF2ZSAiOi8vIiBpbiB0aGVtOgorICAgIC8vICAgIDEpIFRoZSAiOi8vIiBjb3VsZCBiZSBpbiB0
aGUgcXVlcnkgb3IgYW5jaG9yLgorICAgIC8vICAgIDIpIFRoZSBVUkwncyBwYXRoIGNvdWxkIGhh
dmUgYSAiLy4vIiBvciBhICIvLi4vIiBvciBhICIvLyIgc2VxdWVuY2UgaW4gaXQuCisKKyAgICAv
LyBGSVhNRTogbmVlZHNUcmFpbGluZ1NsYXNoIGRvZXMgbm90IHByb3Blcmx5IHJldHVybiB0cnVl
IGZvciBhIFVSTCB0aGF0IGhhcyBubyBwYXRoLCBidXQgZG9lcworICAgIC8vIGhhdmUgYSBxdWVy
eSBvciBhbmNob3IuCisKKyAgICBib29sIGhhc0NvbG9uU2xhc2hTbGFzaCA9IGNvbnRhaW5zQ29s
b25TbGFzaFNsYXNoKGNoYXJhY3RlcnMsIGxlbmd0aCk7CisKKyAgICBpZiAoaGFzQ29sb25TbGFz
aFNsYXNoICYmICFuZWVkc1RyYWlsaW5nU2xhc2goY2hhcmFjdGVycywgbGVuZ3RoKSkKKyAgICAg
ICAgcmV0dXJuIEFscmVhZHlIYXNoZWQ6OmF2b2lkRGVsZXRlZFZhbHVlKGF0dHJpYnV0ZVVSTC5z
dHJpbmcoKS5pbXBsKCktPmhhc2goKSk7CisKKyAgICBWZWN0b3I8VUNoYXIsIDUxMj4gYnVmZmVy
OworCisgICAgaWYgKGhhc0NvbG9uU2xhc2hTbGFzaCkgeworICAgICAgICAvLyBGSVhNRTogVGhp
cyBpcyBpbmNvcnJlY3QgZm9yIFVSTHMgdGhhdCBoYXZlIGEgcXVlcnkgb3IgYW5jaG9yOyB0aGUg
Ii8iIG5lZWRzIHRvIGdvIGF0IHRoZQorICAgICAgICAvLyBlbmQgb2YgdGhlIHBhdGgsICpiZWZv
cmUqIHRoZSBxdWVyeSBvciBhbmNob3IuCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoY2hhcmFjdGVy
cywgbGVuZ3RoKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgnLycpOworICAgICAgICByZXR1cm4g
QWxyZWFkeUhhc2hlZDo6YXZvaWREZWxldGVkVmFsdWUoU3RyaW5nSW1wbDo6Y29tcHV0ZUhhc2go
YnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSkpOworICAgIH0KKworICAgIHN3aXRjaCAoY2hh
cmFjdGVyc1swXSkgeworICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBl
bmQoYmFzZS5zdHJpbmcoKS5jaGFyYWN0ZXJzKCksIGJhc2UucGF0aFN0YXJ0KCkpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyMnOgorICAgICAgICAgICAgYnVmZmVyLmFwcGVu
ZChiYXNlLnN0cmluZygpLmNoYXJhY3RlcnMoKSwgYmFzZS5wYXRoRW5kKCkpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGJh
c2Uuc3RyaW5nKCkuY2hhcmFjdGVycygpLCBiYXNlLnBhdGhBZnRlckxhc3RTbGFzaCgpKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBidWZmZXIuYXBwZW5kKGNoYXJhY3RlcnMsIGxl
bmd0aCk7CisgICAgY2xlYW5QYXRoKGJ1ZmZlcik7CisgICAgaWYgKG5lZWRzVHJhaWxpbmdTbGFz
aChidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKSkgeworICAgICAgICAvLyBGSVhNRTogVGhp
cyBpcyBpbmNvcnJlY3QgZm9yIFVSTHMgdGhhdCBoYXZlIGEgcXVlcnkgb3IgYW5jaG9yOyB0aGUg
Ii8iIG5lZWRzIHRvIGdvIGF0IHRoZQorICAgICAgICAvLyBlbmQgb2YgdGhlIHBhdGgsICpiZWZv
cmUqIHRoZSBxdWVyeSBvciBhbmNob3IuCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoJy8nKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gQWxyZWFkeUhhc2hlZDo6YXZvaWREZWxldGVkVmFsdWUoU3RyaW5n
SW1wbDo6Y29tcHV0ZUhhc2goYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSkpOworfQorCit9
ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9MaW5r
SGFzaC5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9MaW5rSGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLjAxZDNjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRm
b3JtL0xpbmtIYXNoLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIExpbmtI
YXNoX2gKKyNkZWZpbmUgTGlua0hhc2hfaAorCisjaW5jbHVkZSAiU3RyaW5nSGFzaC5oIgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEF0b21pY1N0cmluZzsKK2NsYXNzIEtVUkw7CisK
K3R5cGVkZWYgdWludDY0X3QgTGlua0hhc2g7CisKKy8vIFVzZSB0aGUgbG93IDMyLWJpdHMgb2Yg
dGhlIDY0LWJpdCBMaW5rSGFzaCBhcyB0aGUga2V5IGZvciBIYXNoU2V0cy4KK3N0cnVjdCBMaW5r
SGFzaEhhc2hGdW5jdGlvbiB7CisgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goTGlua0hhc2gga2V5
KSB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oa2V5KTsgfQorICAgIHN0YXRpYyBib29s
IGVxdWFsKExpbmtIYXNoIGEsIExpbmtIYXNoIGIpIHsgcmV0dXJuIGEgPT0gYjsgfQorICAgIHN0
YXRpYyBjb25zdCBib29sIHNhZmVUb0NvbXBhcmVUb0VtcHR5T3JEZWxldGVkID0gdHJ1ZTsKKwor
ICAgIC8vIFNlZSBBbHJlYWR5SGFzaGVkOjphdm9pZERlbGV0ZWRWYWx1ZS4KKyAgICBzdGF0aWMg
dW5zaWduZWQgYXZvaWREZWxldGVkVmFsdWUoTGlua0hhc2ggaGFzaDY0KQorICAgIHsKKyAgICAg
ICAgQVNTRVJUKGhhc2gpOworICAgICAgICB1bnNpZ25lZCBoYXNoID0gc3RhdGljX2Nhc3Q8dW5z
aWduZWQ+KGhhc2g2NCk7CisgICAgICAgIHVuc2lnbmVkIG5ld0hhc2ggPSBoYXNoIHwgKCEoaGFz
aCArIDEpIDw8IDMxKTsKKyAgICAgICAgQVNTRVJUKG5ld0hhc2gpOworICAgICAgICBBU1NFUlQo
bmV3SGFzaCAhPSAweEZGRkZGRkZGKTsKKyAgICAgICAgcmV0dXJuIG5ld0hhc2g7CisgICAgfQor
fTsKKworLy8gUmVzb2x2ZXMgdGhlIHBvdGVudGlhbGx5IHJlbGF0aXZlIFVSTCAiYXR0cmlidXRl
VVJMIiByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4KKy8vIGJhc2UgVVJMLCBhbmQgcmV0dXJucyB0aGUg
aGFzaCBvZiB0aGUgc3RyaW5nIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB2aXNpdGVkCisvLyBsaW5r
IGNvbG9yaW5nLiBJdCB3aWxsIHJldHVybiB0aGUgc3BlY2lhbCB2YWx1ZSBvZiAwIGlmIGF0dHJp
YnV0ZVVSTCBkb2VzIG5vdAorLy8gbG9vayBsaWtlIGEgcmVsYXRpdmUgVVJMLgorTGlua0hhc2gg
dmlzaXRlZExpbmtIYXNoKGNvbnN0IEtVUkwmIGJhc2UsIGNvbnN0IEF0b21pY1N0cmluZyYgYXR0
cmlidXRlVVJMKTsKKworfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmICAvLyBMaW5r
SGFzaF9oCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>