<?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>45088</bug_id>
          
          <creation_ts>2010-09-01 22:43:37 -0700</creation_ts>
          <short_desc>[WTFURL] Add URLQueryCanonicalizer</short_desc>
          <delta_ts>2010-10-13 14:06:18 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</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="Adam Barth">abarth</reporter>
          <assigned_to name="Adam Barth">abarth</assigned_to>
          <cc>abarth</cc>
    
    <cc>ap</cc>
    
    <cc>eric</cc>
    
    <cc>mjs</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>273227</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-09-01 22:43:37 -0700</bug_when>
    <thetext>[WTFURL] Add URLQueryCanonicalizer</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273228</commentid>
    <comment_count>1</comment_count>
      <attachid>66334</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-09-01 22:45:37 -0700</bug_when>
    <thetext>Created attachment 66334
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>293295</commentid>
    <comment_count>2</comment_count>
      <attachid>66334</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2010-10-13 00:50:32 -0700</bug_when>
    <thetext>Comment on attachment 66334
Patch

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

r- because at least the all-capts typenames definitely need to be fixed

&gt; JavaScriptCore/wtf/url/src/URLEscape.h:37
&gt; +extern const char hexCharacterTable[0x10];

It would be more conventional to say [16] instead of [0x10]/

&gt; JavaScriptCore/wtf/url/src/URLEscape.h:42
&gt; +// Write a single character, escaped, to the output. This always escapes: it
&gt; +// does no checking that thee character requires escaping.
&gt; +// Escaping makes sense only 8 bit chars, so code works in all cases of
&gt; +// input parameters (8/16bit).

Comment seems excessive - the function name is reasonably descriptive as it is.

&gt; JavaScriptCore/wtf/url/src/URLEscape.h:44
&gt; +template&lt;typename INCHAR, typename OUTCHAR&gt;
&gt; +inline void appendEscapedCharacter(INCHAR ch, URLBuffer&lt;OUTCHAR&gt;&amp; buffer)

- All-caps typenames are not standard WebKit style.

- Consider naming the function appendURLEscapedCharacter. Given only the context of the WTF namespace, it might not be clear what kind of escaping is intended, but &quot;URL escaped&quot; or &quot;percent escaped&quot; would be pretty unambiguous.

&gt; JavaScriptCore/wtf/url/src/URLQueryCanonicalizer.h:69
&gt; +// Query canonicalization in IE
&gt; +// ----------------------------
&gt; +// IE is very permissive for query parameters specified in links on the page
&gt; +// (in contrast to links that it constructs itself based on form data). It does
&gt; +// not unescape any character. It does not reject any escape sequence (be they
&gt; +// invalid like &quot;%2y&quot; or freaky like %00).
&gt; +//
&gt; +// IE only escapes spaces and nothing else. Embedded NULLs, tabs (0x09),
&gt; +// LF (0x0a), and CR (0x0d) are removed (this probably happens at an earlier
&gt; +// layer since they are removed from all portions of the URL). All other
&gt; +// characters are passed unmodified. Invalid UTF-16 sequences are preserved as
&gt; +// well, with each character in the input being converted to UTF-8. It is the
&gt; +// server&apos;s job to make sense of this invalid query.
&gt; +//
&gt; +// Invalid multibyte sequences (for example, invalid UTF-8 on a UTF-8 page)
&gt; +// are converted to the invalid character and sent as unescaped UTF-8 (0xef,
&gt; +// 0xbf, 0xbd). This may not be canonicalization, the parser may generate these
&gt; +// strings before the URL handler ever sees them.
&gt; +//
&gt; +// Our query canonicalization
&gt; +// --------------------------
&gt; +// We escape all non-ASCII characters and control characters, like Firefox.
&gt; +// This is more conformant to the URL spec, and there do not seem to be many
&gt; +// problems relating to Firefox&apos;s behavior.
&gt; +//
&gt; +// Like IE, we will never unescape (although the application may want to try
&gt; +// unescaping to present the user with a more understandable URL). We will
&gt; +// replace all invalid sequences (including invalid UTF-16 sequences, which IE
&gt; +// doesn&apos;t) with the &quot;invalid character,&quot; and we will escape it.

Does this comment really need to be essay-length? Perhaps it could be pared down to the key non-obvious information. In particular, anything that someone needing to read or modify this code is likely to need to know. I&apos;m not sure a detailed spec of IE&apos;s behavior, which is not in fact implemented here, is likely to be all that relevant.

&gt; JavaScriptCore/wtf/url/src/URLQueryCanonicalizer.h:71
&gt; +template&lt;typename CHAR, typename OUTCHAR, void convertCharset(const CHAR*, int length, URLBuffer&lt;char&gt;&amp;)&gt;

Please don&apos;t use all-caps for template parameters. Also, why CHAR/OUTCHAR here instead of INCHAR/OUTCHAR as in the code above?

&gt; JavaScriptCore/wtf/url/src/URLQueryCanonicalizer.h:74
&gt; +    static void DoCanonicalizeQuery(const CHAR* spec, const URLComponent&amp; query, URLBuffer&lt;OUTCHAR&gt;&amp; buffer, URLComponent&amp; resultQuery)

Member function names should not start with a capital letter in WebKit style. Also &quot;do&quot; seems redundant - why not just &quot;canonicalizeQuery&quot;?

&gt; JavaScriptCore/wtf/url/src/URLQueryCanonicalizer.h:92
&gt; +            // FIXME: This should be an unsigned comparison.

Does this FIXME really need fixing? If so, please do. Tentatively, it seems like it might be broken when CHAR is &quot;char&quot; and the platform has signed char.

&gt; JavaScriptCore/wtf/url/src/URLQueryCanonicalizer.h:102
&gt; +    // Appends the given string to the output, escaping characters that do not
&gt; +    // match the given |type| in SharedCharTypes. This version will accept 8 or 16
&gt; +    // bit characters, but assumes that they have only 7-bit values. It also assumes
&gt; +    // that all UTF-8 values are correct, so doesn&apos;t bother checking

Comment is too verbose. I can see how it&apos;s useful to document the preconditions of the function, but that would be even better done with assertions than with comments. From reading the source, it&apos;s not clear how SharedCharTypes gets involved. SharedCharTypes does not appear elsewhere in this patch. Is that part of the comment accurate?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>293297</commentid>
    <comment_count>3</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-10-13 00:56:49 -0700</bug_when>
    <thetext>Thanks for the review.  I&apos;ll be more aggressive about removing comments in the future.  :)  I&apos;m sad the stylebot and I both missed the capitalization issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>293504</commentid>
    <comment_count>4</comment_count>
      <attachid>70625</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-10-13 10:38:52 -0700</bug_when>
    <thetext>Created attachment 70625
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>293639</commentid>
    <comment_count>5</comment_count>
      <attachid>70625</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2010-10-13 12:48:54 -0700</bug_when>
    <thetext>Comment on attachment 70625
Patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>293646</commentid>
    <comment_count>6</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-10-13 12:54:40 -0700</bug_when>
    <thetext>thanks</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>293651</commentid>
    <comment_count>7</comment_count>
      <attachid>70625</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-10-13 13:02:08 -0700</bug_when>
    <thetext>Comment on attachment 70625
Patch

Clearing flags on attachment: 70625

Committed r69686: &lt;http://trac.webkit.org/changeset/69686&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>293652</commentid>
    <comment_count>8</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-10-13 13:02:13 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>293699</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-10-13 14:06:18 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/69686 might have broken Chromium Mac Release</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66334</attachid>
            <date>2010-09-01 22:45:37 -0700</date>
            <delta_ts>2010-10-13 10:38:41 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45088-20100901224535.patch</filename>
            <type>text/plain</type>
            <size>16748</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZyBiL0phdmFTY3JpcHRDb3JlL0No
YW5nZUxvZwppbmRleCBhNzhkZmQzMzlhZjcyNzdiOGI3Njc5ZjRkZTk5YzY4OGY3N2EzMGFlLi44
MWIxNzA3YjZmOTIzNjJmY2YxMmQ5ZWQ0OWY4ZjY1NGY5ZTc1YThlIDEwMDY0NAotLS0gYS9KYXZh
U2NyaXB0Q29yZS9DaGFuZ2VMb2cKKysrIGIvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCkBAIC0y
LDYgKzIsMjggQEAKIAogICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KIAorICAg
ICAgICBbV1RGVVJMXSBBZGQgVVJMUXVlcnlDYW5vbmljYWxpemVyCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NTA4OAorCisgICAgICAgIFRoaXMgY2xh
c3MgY2Fub25pY2FsaXplcyB0aGUgcXVlcnkgY29tcG9uZW50IG9mIFVSTHMuICBUaGUgbWFpbiB0
cmlja3kKKyAgICAgICAgYml0IHRoZXJlIGlzIHRoZSBjb252ZXJ0Q2hhcnNldCBmdW5jdGlvbiwg
d2hpY2ggSSd2ZSBtb3ZlZCB0byBhCisgICAgICAgIHRlbXBsYXRlZCBkZXBlbmRlbmN5LiAgVGhl
cmUnbGwgbGlrZWx5IGJlIG1vcmUgYWJvdXQgdGhhdCBpbiBmdXR1cmUKKyAgICAgICAgcGF0Y2hl
cy4KKworICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6
CisgICAgICAgICogd3RmL3VybC9zcmMvVVJMRXNjYXBlLmNwcDogQWRkZWQuCisgICAgICAgICog
d3RmL3VybC9zcmMvVVJMRXNjYXBlLmg6IEFkZGVkLgorICAgICAgICAoV1RGOjphcHBlbmRFc2Nh
cGVkQ2hhcmFjdGVyKToKKyAgICAgICAgKiB3dGYvdXJsL3NyYy9VUkxRdWVyeUNhbm9uaWNhbGl6
ZXIuaDogQWRkZWQuCisgICAgICAgIChXVEY6OlVSTFF1ZXJ5Q2Fub25pY2FsaXplcjo6RG9DYW5v
bmljYWxpemVRdWVyeSk6CisgICAgICAgIChXVEY6OlVSTFF1ZXJ5Q2Fub25pY2FsaXplcjo6aXNB
bGxBU0NJSSk6CisgICAgICAgIChXVEY6OlVSTFF1ZXJ5Q2Fub25pY2FsaXplcjo6YXBwZW5kUmF3
OEJpdFF1ZXJ5U3RyaW5nKToKKyAgICAgICAgKFdURjo6VVJMUXVlcnlDYW5vbmljYWxpemVyOjpj
b252ZXJ0VG9RdWVyeUVuY29kaW5nKToKKworMjAxMC0wOS0wMSAgQWRhbSBCYXJ0aCAgPGFiYXJ0
aEB3ZWJraXQub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCiAg
ICAgICAgIFtXVEZVUkxdIEFkZCBhIG1lY2hhbmlzbSBmb3IgY2xhc3NpZnlpbmcgdHlwZXMgb2Yg
Y2hhcmFjdGVycwogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9NDUwODUKIApkaWZmIC0tZ2l0IGEvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXggZDUyNWZjMDYyN2FlYzA1NTBlZWRjNjFmZDA4
ZTkwZjdlNWNjMWRhNC4uNjM2MDExN2E2OGI2NDViYTE3OWRhNTAwOWEwOWE1NDAwZjI1YjdhMSAx
MDA2NDQKLS0tIGEvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvagorKysgYi9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qCkBAIC0zMDgsNiArMzA4LDkgQEAKIAkJOTcxNEFGNjAxMjJGMzIwNzAw
OTJEOUY1IC8qIFVSTFN0cmluZy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gOTcxNEFGNTkxMjJGMzFGNTAwOTJEOUY1IC8qIFVSTFN0cmluZy5oICovOyB9
OwogCQk5NzE0QjA5OTEyMkY0N0E2MDA5MkQ5RjUgLyogVVJMQ2hhcmFjdGVyVHlwZXMuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTcxNEIwOTcxMjJG
NDc5RjAwOTJEOUY1IC8qIFVSTENoYXJhY3RlclR5cGVzLmNwcCAqLzsgfTsKIAkJOTcxNEIwOUEx
MjJGNDdBNjAwOTJEOUY1IC8qIFVSTENoYXJhY3RlclR5cGVzLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5NzE0QjA5ODEyMkY0NzlGMDA5MkQ5RjUgLyog
VVJMQ2hhcmFjdGVyVHlwZXMuaCAqLzsgfTsKKwkJOTcxNEIwQjMxMjJGNkU1MTAwOTJEOUY1IC8q
IFVSTEVzY2FwZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSA5NzE0QjBCMDEyMkY2RTUxMDA5MkQ5RjUgLyogVVJMRXNjYXBlLmNwcCAqLzsgfTsKKwkJ
OTcxNEIwQjQxMjJGNkU1MTAwOTJEOUY1IC8qIFVSTEVzY2FwZS5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTcxNEIwQjExMjJGNkU1MTAwOTJEOUY1IC8q
IFVSTEVzY2FwZS5oICovOyB9OworCQk5NzE0QjBCNTEyMkY2RTUxMDA5MkQ5RjUgLyogVVJMUXVl
cnlDYW5vbmljYWxpemVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSA5NzE0QjBCMjEyMkY2RTUxMDA5MkQ5RjUgLyogVVJMUXVlcnlDYW5vbmljYWxpemVy
LmggKi87IH07CiAJCTk3MUVERUE2MTE2OUUwRDMwMDVFNDI2MiAvKiBUZXJtaW5hdG9yLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5N0Y2OTAzQTExNjlE
RjdGMDBBNkJCNDYgLyogVGVybWluYXRvci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0g
KFByaXZhdGUsICk7IH07IH07CiAJCUExNzEyQjNCMTFDN0IyMTIwMDdBNTMxNSAvKiBSZWdFeHBD
YWNoZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBB
MTcxMkIzQTExQzdCMjEyMDA3QTUzMTUgLyogUmVnRXhwQ2FjaGUuY3BwICovOyB9OwogCQlBMTcx
MkIzRjExQzdCMjI4MDA3QTUzMTUgLyogUmVnRXhwQ2FjaGUuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEExNzEyQjNFMTFDN0IyMjgwMDdBNTMxNSAvKiBS
ZWdFeHBDYWNoZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07
IH07CkBAIC05MzcsNiArOTQwLDkgQEAKIAkJOTcxNEFGNTkxMjJGMzFGNTAwOTJEOUY1IC8qIFVS
TFN0cmluZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBVUkxTdHJpbmcuaDsg
cGF0aCA9IHVybC9hcGkvVVJMU3RyaW5nLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CTk3MTRCMDk3MTIyRjQ3OUYwMDkyRDlGNSAvKiBVUkxDaGFyYWN0ZXJUeXBlcy5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBVUkxDaGFyYWN0ZXJUeXBlcy5jcHA7IHBh
dGggPSB1cmwvc3JjL1VSTENoYXJhY3RlclR5cGVzLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJOTcxNEIwOTgxMjJGNDc5RjAwOTJEOUY1IC8qIFVSTENoYXJhY3RlclR5cGVzLmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFVSTENoYXJhY3RlclR5cGVzLmg7IHBh
dGggPSB1cmwvc3JjL1VSTENoYXJhY3RlclR5cGVzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CisJCTk3MTRCMEIwMTIyRjZFNTEwMDkyRDlGNSAvKiBVUkxFc2NhcGUuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gVVJMRXNjYXBlLmNwcDsgcGF0aCA9IHVybC9z
cmMvVVJMRXNjYXBlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOTcxNEIwQjEx
MjJGNkU1MTAwOTJEOUY1IC8qIFVSTEVzY2FwZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IG5hbWUgPSBVUkxFc2NhcGUuaDsgcGF0aCA9IHVybC9zcmMvVVJMRXNjYXBlLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CisJCTk3MTRCMEIyMTIyRjZFNTEwMDkyRDlGNSAvKiBVUkxRdWVy
eUNhbm9uaWNhbGl6ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gVVJMUXVl
cnlDYW5vbmljYWxpemVyLmg7IHBhdGggPSB1cmwvc3JjL1VSTFF1ZXJ5Q2Fub25pY2FsaXplci5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk5N0Y2OTAzQTExNjlERjdGMDBBNkJCNDYg
LyogVGVybWluYXRvci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBUZXJtaW5h
dG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUExNzEyQjNBMTFDN0IyMTIwMDdB
NTMxNSAvKiBSZWdFeHBDYWNoZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBSZWdFeHBDYWNoZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUExNzEy
QjNFMTFDN0IyMjgwMDdBNTMxNSAvKiBSZWdFeHBDYWNoZS5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jLmg7IHBhdGggPSBSZWdFeHBDYWNoZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpA
QCAtMTk0Miw3ICsxOTQ4LDEwIEBACiAJCQkJOTcxNEIwOTcxMjJGNDc5RjAwOTJEOUY1IC8qIFVS
TENoYXJhY3RlclR5cGVzLmNwcCAqLywKIAkJCQk5NzE0QjA5ODEyMkY0NzlGMDA5MkQ5RjUgLyog
VVJMQ2hhcmFjdGVyVHlwZXMuaCAqLywKIAkJCQk5NzE0QUYzMzEyMkYyN0U3MDA5MkQ5RjUgLyog
VVJMQ29tcG9uZW50LmggKi8sCisJCQkJOTcxNEIwQjAxMjJGNkU1MTAwOTJEOUY1IC8qIFVSTEVz
Y2FwZS5jcHAgKi8sCisJCQkJOTcxNEIwQjExMjJGNkU1MTAwOTJEOUY1IC8qIFVSTEVzY2FwZS5o
ICovLAogCQkJCTk3MTRBRjM0MTIyRjI3RTcwMDkyRDlGNSAvKiBVUkxQYXJzZXIuaCAqLywKKwkJ
CQk5NzE0QjBCMjEyMkY2RTUxMDA5MkQ5RjUgLyogVVJMUXVlcnlDYW5vbmljYWxpemVyLmggKi8s
CiAJCQkJOTcxNEFGMzUxMjJGMjdFNzAwOTJEOUY1IC8qIFVSTFNlZ21lbnRzLmNwcCAqLywKIAkJ
CQk5NzE0QUYzNjEyMkYyN0U3MDA5MkQ5RjUgLyogVVJMU2VnbWVudHMuaCAqLywKIAkJCSk7CkBA
IC0yMzEwLDYgKzIzMTksOCBAQAogCQkJCTk3MTRBRjVGMTIyRjMyMDcwMDkyRDlGNSAvKiBQYXJz
ZWRVUkwuaCBpbiBIZWFkZXJzICovLAogCQkJCTk3MTRBRjYwMTIyRjMyMDcwMDkyRDlGNSAvKiBV
UkxTdHJpbmcuaCBpbiBIZWFkZXJzICovLAogCQkJCTk3MTRCMDlBMTIyRjQ3QTYwMDkyRDlGNSAv
KiBVUkxDaGFyYWN0ZXJUeXBlcy5oIGluIEhlYWRlcnMgKi8sCisJCQkJOTcxNEIwQjQxMjJGNkU1
MTAwOTJEOUY1IC8qIFVSTEVzY2FwZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJOTcxNEIwQjUxMjJG
NkU1MTAwOTJEOUY1IC8qIFVSTFF1ZXJ5Q2Fub25pY2FsaXplci5oIGluIEhlYWRlcnMgKi8sCiAJ
CQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkBA
IC0yNzY0LDYgKzI3NzUsNyBAQAogCQkJCTk3MTRBRjQ2MTIyRjI4ODUwMDkyRDlGNSAvKiBVUkxT
ZWdtZW50cy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5NzE0QUY1RTEyMkYzMjA3MDA5MkQ5RjUg
LyogUGFyc2VkVVJMLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTk3MTRCMDk5MTIyRjQ3QTYwMDky
RDlGNSAvKiBVUkxDaGFyYWN0ZXJUeXBlcy5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk5NzE0QjBC
MzEyMkY2RTUxMDA5MkQ5RjUgLyogVVJMRXNjYXBlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsK
IAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpkaWZmIC0t
Z2l0IGEvSmF2YVNjcmlwdENvcmUvd3RmL3VybC9zcmMvVVJMRXNjYXBlLmNwcCBiL0phdmFTY3Jp
cHRDb3JlL3d0Zi91cmwvc3JjL1VSTEVzY2FwZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZDE3Y2EzMzM2YWYw
NjczZTJjNDYyYzUxODZhNjdiMWIwYjM3NzE0YwotLS0gL2Rldi9udWxsCisrKyBiL0phdmFTY3Jp
cHRDb3JlL3d0Zi91cmwvc3JjL1VSTEVzY2FwZS5jcHAKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29w
eXJpZ2h0IDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8v
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlv
bi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1l
cyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJ
UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8v
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJVUkxFc2NhcGUuaCIKKworbmFtZXNwYWNlIFdURiB7CisKK2NvbnN0IGNoYXIg
aGV4Q2hhcmFjdGVyVGFibGVbMHgxMF0gPSB7CisgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcs
ICc1JywgJzYnLCAnNycsCisgICAgJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAn
RicsCit9OworCit9CmRpZmYgLS1naXQgYS9KYXZhU2NyaXB0Q29yZS93dGYvdXJsL3NyYy9VUkxF
c2NhcGUuaCBiL0phdmFTY3JpcHRDb3JlL3d0Zi91cmwvc3JjL1VSTEVzY2FwZS5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjYwYjhhNWY1YzY3Y2VlYjY4MDU1OTk4YmJjNTNlMzgwYTI1Y2U3ZTEKLS0tIC9kZXYvbnVs
bAorKysgYi9KYXZhU2NyaXB0Q29yZS93dGYvdXJsL3NyYy9VUkxFc2NhcGUuaApAQCAtMCwwICsx
LDUzIEBACisvLyBDb3B5cmlnaHQgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQor
Ly8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5j
LiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
Ky8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaWZu
ZGVmIFVSTEVzY2FwZV9oCisjZGVmaW5lIFVSTEVzY2FwZV9oCisKKyNpbmNsdWRlICJVUkxCdWZm
ZXIuaCIKKworbmFtZXNwYWNlIFdURiB7CisKK2V4dGVybiBjb25zdCBjaGFyIGhleENoYXJhY3Rl
clRhYmxlWzB4MTBdOworCisvLyBXcml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIsIGVzY2FwZWQsIHRv
IHRoZSBvdXRwdXQuIFRoaXMgYWx3YXlzIGVzY2FwZXM6IGl0CisvLyBkb2VzIG5vIGNoZWNraW5n
IHRoYXQgdGhlZSBjaGFyYWN0ZXIgcmVxdWlyZXMgZXNjYXBpbmcuCisvLyBFc2NhcGluZyBtYWtl
cyBzZW5zZSBvbmx5IDggYml0IGNoYXJzLCBzbyBjb2RlIHdvcmtzIGluIGFsbCBjYXNlcyBvZgor
Ly8gaW5wdXQgcGFyYW1ldGVycyAoOC8xNmJpdCkuCit0ZW1wbGF0ZTx0eXBlbmFtZSBJTkNIQVIs
IHR5cGVuYW1lIE9VVENIQVI+CitpbmxpbmUgdm9pZCBhcHBlbmRFc2NhcGVkQ2hhcmFjdGVyKElO
Q0hBUiBjaCwgVVJMQnVmZmVyPE9VVENIQVI+JiBidWZmZXIpCit7CisgICAgYnVmZmVyLmFwcGVu
ZCgnJScpOworICAgIGJ1ZmZlci5hcHBlbmQoaGV4Q2hhcmFjdGVyVGFibGVbY2ggPj4gNF0pOwor
ICAgIGJ1ZmZlci5hcHBlbmQoaGV4Q2hhcmFjdGVyVGFibGVbY2ggJiAweGZdKTsKK30KKworfQor
CisjZW5kaWYKZGlmZiAtLWdpdCBhL0phdmFTY3JpcHRDb3JlL3d0Zi91cmwvc3JjL1VSTFF1ZXJ5
Q2Fub25pY2FsaXplci5oIGIvSmF2YVNjcmlwdENvcmUvd3RmL3VybC9zcmMvVVJMUXVlcnlDYW5v
bmljYWxpemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMTM4MjZmOTc0ZmI1ZTlkNmU2YmI1YmZiN2ZlOTM3MTIz
NTI2OWQ0OAotLS0gL2Rldi9udWxsCisrKyBiL0phdmFTY3JpcHRDb3JlL3d0Zi91cmwvc3JjL1VS
TFF1ZXJ5Q2Fub25pY2FsaXplci5oCkBAIC0wLDAgKzEsMTMwIEBACisvLyBDb3B5cmlnaHQgMjAx
MCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8v
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8g
ICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwor
Ly8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU
SEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAor
Ly8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaWZuZGVmIFVSTFF1ZXJ5Q2Fub25pY2FsaXpl
cl9oCisjZGVmaW5lIFVSTFF1ZXJ5Q2Fub25pY2FsaXplcl9oCisKKyNpbmNsdWRlICJSYXdVUkxC
dWZmZXIuaCIKKyNpbmNsdWRlICJVUkxCdWZmZXIuaCIKKyNpbmNsdWRlICJVUkxDaGFyYWN0ZXJU
eXBlcy5oIgorI2luY2x1ZGUgIlVSTENvbXBvbmVudC5oIgorI2luY2x1ZGUgIlVSTEVzY2FwZS5o
IgorCituYW1lc3BhY2UgV1RGIHsKKworLy8gUXVlcnkgY2Fub25pY2FsaXphdGlvbiBpbiBJRQor
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSUUgaXMgdmVyeSBwZXJtaXNzaXZl
IGZvciBxdWVyeSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiBsaW5rcyBvbiB0aGUgcGFnZQorLy8g
KGluIGNvbnRyYXN0IHRvIGxpbmtzIHRoYXQgaXQgY29uc3RydWN0cyBpdHNlbGYgYmFzZWQgb24g
Zm9ybSBkYXRhKS4gSXQgZG9lcworLy8gbm90IHVuZXNjYXBlIGFueSBjaGFyYWN0ZXIuIEl0IGRv
ZXMgbm90IHJlamVjdCBhbnkgZXNjYXBlIHNlcXVlbmNlIChiZSB0aGV5CisvLyBpbnZhbGlkIGxp
a2UgIiUyeSIgb3IgZnJlYWt5IGxpa2UgJTAwKS4KKy8vCisvLyBJRSBvbmx5IGVzY2FwZXMgc3Bh
Y2VzIGFuZCBub3RoaW5nIGVsc2UuIEVtYmVkZGVkIE5VTExzLCB0YWJzICgweDA5KSwKKy8vIExG
ICgweDBhKSwgYW5kIENSICgweDBkKSBhcmUgcmVtb3ZlZCAodGhpcyBwcm9iYWJseSBoYXBwZW5z
IGF0IGFuIGVhcmxpZXIKKy8vIGxheWVyIHNpbmNlIHRoZXkgYXJlIHJlbW92ZWQgZnJvbSBhbGwg
cG9ydGlvbnMgb2YgdGhlIFVSTCkuIEFsbCBvdGhlcgorLy8gY2hhcmFjdGVycyBhcmUgcGFzc2Vk
IHVubW9kaWZpZWQuIEludmFsaWQgVVRGLTE2IHNlcXVlbmNlcyBhcmUgcHJlc2VydmVkIGFzCisv
LyB3ZWxsLCB3aXRoIGVhY2ggY2hhcmFjdGVyIGluIHRoZSBpbnB1dCBiZWluZyBjb252ZXJ0ZWQg
dG8gVVRGLTguIEl0IGlzIHRoZQorLy8gc2VydmVyJ3Mgam9iIHRvIG1ha2Ugc2Vuc2Ugb2YgdGhp
cyBpbnZhbGlkIHF1ZXJ5LgorLy8KKy8vIEludmFsaWQgbXVsdGlieXRlIHNlcXVlbmNlcyAoZm9y
IGV4YW1wbGUsIGludmFsaWQgVVRGLTggb24gYSBVVEYtOCBwYWdlKQorLy8gYXJlIGNvbnZlcnRl
ZCB0byB0aGUgaW52YWxpZCBjaGFyYWN0ZXIgYW5kIHNlbnQgYXMgdW5lc2NhcGVkIFVURi04ICgw
eGVmLAorLy8gMHhiZiwgMHhiZCkuIFRoaXMgbWF5IG5vdCBiZSBjYW5vbmljYWxpemF0aW9uLCB0
aGUgcGFyc2VyIG1heSBnZW5lcmF0ZSB0aGVzZQorLy8gc3RyaW5ncyBiZWZvcmUgdGhlIFVSTCBo
YW5kbGVyIGV2ZXIgc2VlcyB0aGVtLgorLy8KKy8vIE91ciBxdWVyeSBjYW5vbmljYWxpemF0aW9u
CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2UgZXNjYXBlIGFsbCBub24tQVND
SUkgY2hhcmFjdGVycyBhbmQgY29udHJvbCBjaGFyYWN0ZXJzLCBsaWtlIEZpcmVmb3guCisvLyBU
aGlzIGlzIG1vcmUgY29uZm9ybWFudCB0byB0aGUgVVJMIHNwZWMsIGFuZCB0aGVyZSBkbyBub3Qg
c2VlbSB0byBiZSBtYW55CisvLyBwcm9ibGVtcyByZWxhdGluZyB0byBGaXJlZm94J3MgYmVoYXZp
b3IuCisvLworLy8gTGlrZSBJRSwgd2Ugd2lsbCBuZXZlciB1bmVzY2FwZSAoYWx0aG91Z2ggdGhl
IGFwcGxpY2F0aW9uIG1heSB3YW50IHRvIHRyeQorLy8gdW5lc2NhcGluZyB0byBwcmVzZW50IHRo
ZSB1c2VyIHdpdGggYSBtb3JlIHVuZGVyc3RhbmRhYmxlIFVSTCkuIFdlIHdpbGwKKy8vIHJlcGxh
Y2UgYWxsIGludmFsaWQgc2VxdWVuY2VzIChpbmNsdWRpbmcgaW52YWxpZCBVVEYtMTYgc2VxdWVu
Y2VzLCB3aGljaCBJRQorLy8gZG9lc24ndCkgd2l0aCB0aGUgImludmFsaWQgY2hhcmFjdGVyLCIg
YW5kIHdlIHdpbGwgZXNjYXBlIGl0LgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBDSEFSLCB0eXBlbmFt
ZSBPVVRDSEFSLCB2b2lkIGNvbnZlcnRDaGFyc2V0KGNvbnN0IENIQVIqLCBpbnQgbGVuZ3RoLCBV
UkxCdWZmZXI8Y2hhcj4mKT4KK2NsYXNzIFVSTFF1ZXJ5Q2Fub25pY2FsaXplciB7CitwdWJsaWM6
CisgICAgc3RhdGljIHZvaWQgRG9DYW5vbmljYWxpemVRdWVyeShjb25zdCBDSEFSKiBzcGVjLCBj
b25zdCBVUkxDb21wb25lbnQmIHF1ZXJ5LCBVUkxCdWZmZXI8T1VUQ0hBUj4mIGJ1ZmZlciwgVVJM
Q29tcG9uZW50JiByZXN1bHRRdWVyeSkKKyAgICB7CisgICAgICAgIGlmIChxdWVyeS5sZW5ndGgo
KSA8IDApIHsKKyAgICAgICAgICAgIHJlc3VsdFF1ZXJ5ID0gVVJMQ29tcG9uZW50KCk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBidWZmZXItPmFwcGVuZCgnPycp
OworICAgICAgICByZXN1bHRRdWVyeS5zZXRCZWdpbihidWZmZXItPmxlbmd0aCgpKTsKKyAgICAg
ICAgY29udmVydFRvUXVlcnlFbmNvZGluZyhzcGVjLCBxdWVyeSwgYnVmZmVyKTsKKyAgICAgICAg
cmVzdWx0UXVlcnkuc2V0TGVuZ3RoKGJ1ZmZlci0+bGVuZ3RoKCkgLSByZXN1bHRRdWVyeS5iZWdp
bigpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGJvb2wgaXNBbGxBU0NJSShjb25z
dCBDSEFSKiBzcGVjLCBjb25zdCBVUkxDb21wb25lbnQmIHF1ZXJ5KQorICAgIHsKKyAgICAgICAg
aW50IGVuZCA9IHF1ZXJ5LmVuZCgpOworICAgICAgICBmb3IgKGludCBpID0gcXVlcnkuYmVnaW4o
KTsgaSA8IGVuZDsgKytpKSB7CisgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUg
YW4gdW5zaWduZWQgY29tcGFyaXNvbi4KKyAgICAgICAgICAgIGlmIChzcGVjW2ldID49IDB4ODAp
CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKworICAgIC8vIEFwcGVuZHMgdGhlIGdpdmVuIHN0cmluZyB0byB0aGUg
b3V0cHV0LCBlc2NhcGluZyBjaGFyYWN0ZXJzIHRoYXQgZG8gbm90CisgICAgLy8gbWF0Y2ggdGhl
IGdpdmVuIHx0eXBlfCBpbiBTaGFyZWRDaGFyVHlwZXMuIFRoaXMgdmVyc2lvbiB3aWxsIGFjY2Vw
dCA4IG9yIDE2CisgICAgLy8gYml0IGNoYXJhY3RlcnMsIGJ1dCBhc3N1bWVzIHRoYXQgdGhleSBo
YXZlIG9ubHkgNy1iaXQgdmFsdWVzLiBJdCBhbHNvIGFzc3VtZXMKKyAgICAvLyB0aGF0IGFsbCBV
VEYtOCB2YWx1ZXMgYXJlIGNvcnJlY3QsIHNvIGRvZXNuJ3QgYm90aGVyIGNoZWNraW5nCisgICAg
c3RhdGljIHZvaWQgYXBwZW5kUmF3OEJpdFF1ZXJ5U3RyaW5nKGNvbnN0IENIQVIqIHNvdXJjZSwg
aW50IGxlbmd0aCwgVVJMQnVmZmVyPE9VVENIQVI+KiBidWZmZXIpCisgICAgeworICAgICAgICBm
b3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIVVSTENo
YXJhY3RlclR5cGVzOjppc1F1ZXJ5Q2hhcihzb3VyY2VbaV0pKQorICAgICAgICAgICAgICAgIGFw
cGVuZEVzY2FwZWRDaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc291cmNlW2ld
KSwgYnVmZmVyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBidWZmZXItPmFw
cGVuZChzdGF0aWNfY2FzdDxjaGFyPihzb3VyY2VbaV0pKTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRUb1F1ZXJ5RW5jb2RpbmcoY29uc3QgQ0hBUiogc3BlYywg
Y29uc3QgVVJMQ29tcG9uZW50JiBxdWVyeSwgVVJMQnVmZmVyPE9VVENIQVI+JiBidWZmZXIpCisg
ICAgeworICAgICAgICBpZiAoaXNBbGxBU0NJSShzcGVjLCBxdWVyeSkpIHsKKyAgICAgICAgICAg
IGFwcGVuZFJhdzhCaXRRdWVyeVN0cmluZygmc3BlY1txdWVyeS5iZWdpbigpXSwgcXVlcnkubGVu
Z3RoKCksIGJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAg
ICBSYXdVUkxCdWZmZXI8Y2hhciwgMTAyND4gY29udmVydGVkUXVlcnk7CisgICAgICAgIGNvbnZl
cnRDaGFyc2V0KHNwZWMsIHF1ZXJ5LCBjb252ZXJ0ZWRRdWVyeSk7CisgICAgICAgIGFwcGVuZFJh
dzhCaXRRdWVyeVN0cmluZyhjb252ZXJ0ZWRRdWVyeS5kYXRhKCksIGNvbnZlcnRlZFF1ZXJ5Lmxl
bmd0aCgpLCBidWZmZXIpOworICAgIH0KK307CisKK30KKworI2VuZGlmCisKKwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>70625</attachid>
            <date>2010-10-13 10:38:52 -0700</date>
            <delta_ts>2010-10-13 13:02:08 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45088-20101013103851.patch</filename>
            <type>text/plain</type>
            <size>13830</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDY5NjY5KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjUgQEAKKzIwMTAtMTAtMTMgIEFkYW0gQmFy
dGggIDxhYmFydGhAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBbV1RGVVJMXSBBZGQgVVJMUXVlcnlDYW5vbmljYWxpemVyCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NTA4OAorCisgICAg
ICAgIFRoaXMgY2xhc3MgY2Fub25pY2FsaXplcyB0aGUgcXVlcnkgY29tcG9uZW50IG9mIFVSTHMu
ICBUaGUgbWFpbiB0cmlja3kKKyAgICAgICAgYml0IHRoZXJlIGlzIHRoZSBjb252ZXJ0Q2hhcnNl
dCBmdW5jdGlvbiwgd2hpY2ggSSd2ZSBtb3ZlZCB0byBhCisgICAgICAgIHRlbXBsYXRlZCBkZXBl
bmRlbmN5LiAgVGhlcmUnbGwgbGlrZWx5IGJlIG1vcmUgYWJvdXQgdGhhdCBpbiBmdXR1cmUKKyAg
ICAgICAgcGF0Y2hlcy4KKworICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2o6CisgICAgICAgICogd3RmL3VybC9zcmMvVVJMRXNjYXBlLmNwcDogQWRkZWQu
CisgICAgICAgICogd3RmL3VybC9zcmMvVVJMRXNjYXBlLmg6IEFkZGVkLgorICAgICAgICAoV1RG
OjphcHBlbmRFc2NhcGVkQ2hhcmFjdGVyKToKKyAgICAgICAgKiB3dGYvdXJsL3NyYy9VUkxRdWVy
eUNhbm9uaWNhbGl6ZXIuaDogQWRkZWQuCisgICAgICAgIChXVEY6OlVSTFF1ZXJ5Q2Fub25pY2Fs
aXplcjo6Y2Fub25pY2FsaXplKToKKyAgICAgICAgKFdURjo6VVJMUXVlcnlDYW5vbmljYWxpemVy
Ojppc0FsbEFTQ0lJKToKKyAgICAgICAgKFdURjo6VVJMUXVlcnlDYW5vbmljYWxpemVyOjphcHBl
bmRSYXc4Qml0UXVlcnlTdHJpbmcpOgorICAgICAgICAoV1RGOjpVUkxRdWVyeUNhbm9uaWNhbGl6
ZXI6OmNvbnZlcnRUb1F1ZXJ5RW5jb2RpbmcpOgorCiAyMDEwLTEwLTEzICBBZGFtIEJhcnRoICA8
YWJhcnRoQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTWFjaWVqIFN0YWNob3dp
YWsuCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDY5NjY5KQorKysgSmF2YVNjcmlwdENv
cmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5
KQpAQCAtMzEyLDYgKzMxMiw3IEBACiAJCTk3MTRBRjYwMTIyRjMyMDcwMDkyRDlGNSAvKiBVUkxT
dHJpbmcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDk3
MTRBRjU5MTIyRjMxRjUwMDkyRDlGNSAvKiBVUkxTdHJpbmcuaCAqLzsgfTsKIAkJOTcxRURFQTYx
MTY5RTBEMzAwNUU0MjYyIC8qIFRlcm1pbmF0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDk3RjY5MDNBMTE2OURGN0YwMEE2QkI0NiAvKiBUZXJtaW5h
dG9yLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJ
OTcyQTQ4NUYxMjY2MUUwODAwRjQ1MTRGIC8qIFVSTENoYXJhY3RlclR5cGVzLmNwcCBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDk3MkE0ODVEMTI2NjFFMDgw
MEY0NTE0RiAvKiBVUkxDaGFyYWN0ZXJUeXBlcy5jcHAgKi87IH07CisJCTk3MkE0ODc3MTI2NjI1
NkYwMEY0NTE0RiAvKiBVUkxFc2NhcGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gOTcyQTQ4NzQxMjY2MjU2RjAwRjQ1MTRGIC8qIFVSTEVzY2FwZS5j
cHAgKi87IH07CiAJCUExNzEyQjNCMTFDN0IyMTIwMDdBNTMxNSAvKiBSZWdFeHBDYWNoZS5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBMTcxMkIzQTEx
QzdCMjEyMDA3QTUzMTUgLyogUmVnRXhwQ2FjaGUuY3BwICovOyB9OwogCQlBMTcxMkIzRjExQzdC
MjI4MDA3QTUzMTUgLyogUmVnRXhwQ2FjaGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEExNzEyQjNFMTFDN0IyMjgwMDdBNTMxNSAvKiBSZWdFeHBDYWNo
ZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCUEx
NzEyQjQxMTFDN0IyMzUwMDdBNTMxNSAvKiBSZWdFeHBLZXkuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEExNzEyQjQwMTFDN0IyMzUwMDdBNTMxNSAvKiBS
ZWdFeHBLZXkuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9
OwpAQCAtOTQ3LDYgKzk0OCw5IEBACiAJCTk3MTRBRjU5MTIyRjMxRjUwMDkyRDlGNSAvKiBVUkxT
dHJpbmcuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gVVJMU3RyaW5nLmg7IHBh
dGggPSB1cmwvYXBpL1VSTFN0cmluZy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk5
NzJBNDg1RDEyNjYxRTA4MDBGNDUxNEYgLyogVVJMQ2hhcmFjdGVyVHlwZXMuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gVVJMQ2hhcmFjdGVyVHlwZXMuY3BwOyBwYXRo
ID0gdXJsL3NyYy9VUkxDaGFyYWN0ZXJUeXBlcy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CiAJCTk3MkE0ODVFMTI2NjFFMDgwMEY0NTE0RiAvKiBVUkxDaGFyYWN0ZXJUeXBlcy5oICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBVUkxDaGFyYWN0ZXJUeXBlcy5oOyBwYXRo
ID0gdXJsL3NyYy9VUkxDaGFyYWN0ZXJUeXBlcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OworCQk5NzJBNDg3NDEyNjYyNTZGMDBGNDUxNEYgLyogVVJMRXNjYXBlLmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IFVSTEVzY2FwZS5jcHA7IHBhdGggPSB1cmwvc3Jj
L1VSTEVzY2FwZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTk3MkE0ODc1MTI2
NjI1NkYwMEY0NTE0RiAvKiBVUkxFc2NhcGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBu
YW1lID0gVVJMRXNjYXBlLmg7IHBhdGggPSB1cmwvc3JjL1VSTEVzY2FwZS5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OworCQk5NzJBNDg3NjEyNjYyNTZGMDBGNDUxNEYgLyogVVJMUXVlcnlD
YW5vbmljYWxpemVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFVSTFF1ZXJ5
Q2Fub25pY2FsaXplci5oOyBwYXRoID0gdXJsL3NyYy9VUkxRdWVyeUNhbm9uaWNhbGl6ZXIuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJOTdGNjkwM0ExMTY5REY3RjAwQTZCQjQ2IC8q
IFRlcm1pbmF0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gVGVybWluYXRv
ci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBMTcxMkIzQTExQzdCMjEyMDA3QTUz
MTUgLyogUmVnRXhwQ2FjaGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gUmVnRXhwQ2FjaGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBMTcxMkIz
RTExQzdCMjI4MDA3QTUzMTUgLyogUmVnRXhwQ2FjaGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gUmVnRXhwQ2FjaGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAg
LTE5NjEsNyArMTk2NSwxMCBAQAogCQkJCTk3MkE0ODVEMTI2NjFFMDgwMEY0NTE0RiAvKiBVUkxD
aGFyYWN0ZXJUeXBlcy5jcHAgKi8sCiAJCQkJOTcyQTQ4NUUxMjY2MUUwODAwRjQ1MTRGIC8qIFVS
TENoYXJhY3RlclR5cGVzLmggKi8sCiAJCQkJOTcxNEFGMzMxMjJGMjdFNzAwOTJEOUY1IC8qIFVS
TENvbXBvbmVudC5oICovLAorCQkJCTk3MkE0ODc0MTI2NjI1NkYwMEY0NTE0RiAvKiBVUkxFc2Nh
cGUuY3BwICovLAorCQkJCTk3MkE0ODc1MTI2NjI1NkYwMEY0NTE0RiAvKiBVUkxFc2NhcGUuaCAq
LywKIAkJCQk5NzE0QUYzNDEyMkYyN0U3MDA5MkQ5RjUgLyogVVJMUGFyc2VyLmggKi8sCisJCQkJ
OTcyQTQ4NzYxMjY2MjU2RjAwRjQ1MTRGIC8qIFVSTFF1ZXJ5Q2Fub25pY2FsaXplci5oICovLAog
CQkJCTk3MTRBRjM1MTIyRjI3RTcwMDkyRDlGNSAvKiBVUkxTZWdtZW50cy5jcHAgKi8sCiAJCQkJ
OTcxNEFGMzYxMjJGMjdFNzAwOTJEOUY1IC8qIFVSTFNlZ21lbnRzLmggKi8sCiAJCQkpOwpAQCAt
Mjc5Nyw2ICsyODA0LDcgQEAKIAkJCQk5MzJGNUJERDA4MjJBMUM3MDA3MzY5NzUgLyoganNjLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCURERTgyQUQzMTIwOUQ5NTUwMDVDMTc1NiAvKiBHQ0hhbmRs
ZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5NzJBNDg1RjEyNjYxRTA4MDBGNDUxNEYgLyogVVJM
Q2hhcmFjdGVyVHlwZXMuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJOTcyQTQ4NzcxMjY2MjU2RjAw
RjQ1MTRGIC8qIFVSTEVzY2FwZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5
Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5kZXg6IEphdmFTY3JpcHRD
b3JlL3d0Zi91cmwvc3JjL1VSTEVzY2FwZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUvd3RmL3VybC9zcmMvVVJMRXNjYXBlLmNwcAkocmV2aXNpb24gMCkKKysrIEphdmFTY3JpcHRD
b3JlL3d0Zi91cmwvc3JjL1VSTEVzY2FwZS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMzkg
QEAKKy8vIENvcHlyaWdodCAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
Ly8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBk
aXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5v
ciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
CisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8g
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiVVJMRXNjYXBlLmgiCisKK25hbWVzcGFjZSBXVEYgeworCitj
b25zdCBjaGFyIGhleENoYXJhY3RlclRhYmxlWzE2XSA9IHsKKyAgICAnMCcsICcxJywgJzInLCAn
MycsICc0JywgJzUnLCAnNicsICc3JywKKyAgICAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0Qn
LCAnRScsICdGJywKK307CisKK30KSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi91cmwvc3JjL1VS
TEVzY2FwZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi91cmwvc3JjL1VSTEVz
Y2FwZS5oCShyZXZpc2lvbiAwKQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3VybC9zcmMvVVJMRXNj
YXBlLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDEwLCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpZm5kZWYgVVJMRXNjYXBlX2gKKyNkZWZpbmUgVVJM
RXNjYXBlX2gKKworI2luY2x1ZGUgIlVSTEJ1ZmZlci5oIgorCituYW1lc3BhY2UgV1RGIHsKKwor
ZXh0ZXJuIGNvbnN0IGNoYXIgaGV4Q2hhcmFjdGVyVGFibGVbMTZdOworCit0ZW1wbGF0ZTx0eXBl
bmFtZSBJbkNoYXIsIHR5cGVuYW1lIE91dENoYXI+CitpbmxpbmUgdm9pZCBhcHBlbmRVUkxFc2Nh
cGVkQ2hhcmFjdGVyKEluQ2hhciBjaCwgVVJMQnVmZmVyPE91dENoYXI+JiBidWZmZXIpCit7Cisg
ICAgYnVmZmVyLmFwcGVuZCgnJScpOworICAgIGJ1ZmZlci5hcHBlbmQoaGV4Q2hhcmFjdGVyVGFi
bGVbY2ggPj4gNF0pOworICAgIGJ1ZmZlci5hcHBlbmQoaGV4Q2hhcmFjdGVyVGFibGVbY2ggJiAw
eGZdKTsKK30KKworfQorCisjZW5kaWYKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi91cmwvc3Jj
L1VSTFF1ZXJ5Q2Fub25pY2FsaXplci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0
Zi91cmwvc3JjL1VSTFF1ZXJ5Q2Fub25pY2FsaXplci5oCShyZXZpc2lvbiAwKQorKysgSmF2YVNj
cmlwdENvcmUvd3RmL3VybC9zcmMvVVJMUXVlcnlDYW5vbmljYWxpemVyLmgJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMTA3IEBACisvLyBDb3B5cmlnaHQgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1l
dDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
cgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBv
ZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisv
LworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
QU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKworCisjaWZuZGVmIFVSTFF1ZXJ5Q2Fub25pY2FsaXplcl9oCisjZGVmaW5lIFVSTFF1ZXJ5
Q2Fub25pY2FsaXplcl9oCisKKyNpbmNsdWRlICJSYXdVUkxCdWZmZXIuaCIKKyNpbmNsdWRlICJV
UkxCdWZmZXIuaCIKKyNpbmNsdWRlICJVUkxDaGFyYWN0ZXJUeXBlcy5oIgorI2luY2x1ZGUgIlVS
TENvbXBvbmVudC5oIgorI2luY2x1ZGUgIlVSTEVzY2FwZS5oIgorCituYW1lc3BhY2UgV1RGIHsK
KwordGVtcGxhdGU8dHlwZW5hbWUgSW5DaGFyLCB0eXBlbmFtZSBPdXRDaGFyLCB2b2lkIGNvbnZl
cnRDaGFyc2V0KGNvbnN0IEluQ2hhciosIGludCBsZW5ndGgsIFVSTEJ1ZmZlcjxjaGFyPiYpPgor
Y2xhc3MgVVJMUXVlcnlDYW5vbmljYWxpemVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgdm9pZCBj
YW5vbmljYWxpemUoY29uc3QgSW5DaGFyKiBzcGVjLCBjb25zdCBVUkxDb21wb25lbnQmIHF1ZXJ5
LCBVUkxCdWZmZXI8T3V0Q2hhcj4mIGJ1ZmZlciwgVVJMQ29tcG9uZW50JiByZXN1bHRRdWVyeSkK
KyAgICB7CisgICAgICAgIGlmIChxdWVyeS5sZW5ndGgoKSA8IDApIHsKKyAgICAgICAgICAgIHJl
c3VsdFF1ZXJ5ID0gVVJMQ29tcG9uZW50KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKworICAgICAgICBidWZmZXItPmFwcGVuZCgnPycpOworICAgICAgICByZXN1bHRRdWVyeS5z
ZXRCZWdpbihidWZmZXItPmxlbmd0aCgpKTsKKyAgICAgICAgY29udmVydFRvUXVlcnlFbmNvZGlu
ZyhzcGVjLCBxdWVyeSwgYnVmZmVyKTsKKyAgICAgICAgcmVzdWx0UXVlcnkuc2V0TGVuZ3RoKGJ1
ZmZlci0+bGVuZ3RoKCkgLSByZXN1bHRRdWVyeS5iZWdpbigpKTsKKyAgICB9CisKK3ByaXZhdGU6
CisgICAgc3RhdGljIGJvb2wgaXNBbGxBU0NJSShjb25zdCBJbkNoYXIqIHNwZWMsIGNvbnN0IFVS
TENvbXBvbmVudCYgcXVlcnkpCisgICAgeworICAgICAgICBpbnQgZW5kID0gcXVlcnkuZW5kKCk7
CisgICAgICAgIGZvciAoaW50IGkgPSBxdWVyeS5iZWdpbigpOyBpIDwgZW5kOyArK2kpIHsKKyAg
ICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc3BlY1tpXSkgPj0gMHg4MCkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorCisjaWZuZGVmIE5ERUJVRworICAgIHN0YXRpYyBib29sIGlzUmF3OEJpdChj
b25zdCBJbkNoYXIqIHNvdXJjZSwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIGZvciAoaW50
IGkgPSBzb3VyY2U7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKHNvdXJjZVtp
XSAmIDB4RkYgIT0gc291cmNlW2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisjZW5kaWYKKworICAgIHN0YXRp
YyB2b2lkIGFwcGVuZFJhdzhCaXRRdWVyeVN0cmluZyhjb25zdCBJbkNoYXIqIHNvdXJjZSwgaW50
IGxlbmd0aCwgVVJMQnVmZmVyPE91dENoYXI+KiBidWZmZXIpCisgICAgeworICAgICAgICBBU1NF
UlQoaXNSYXc4Qml0KHNvdXJjZSwgbGVuZ3RoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghVVJMQ2hhcmFjdGVyVHlwZXM6Omlz
UXVlcnlDaGFyKHNvdXJjZVtpXSkpCisgICAgICAgICAgICAgICAgYXBwZW5kVVJMRXNjYXBlZENo
YXJhY3RlcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihzb3VyY2VbaV0pLCBidWZmZXIpOwor
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJ1ZmZlci0+YXBwZW5kKHN0YXRpY19j
YXN0PGNoYXI+KHNvdXJjZVtpXSkpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZv
aWQgY29udmVydFRvUXVlcnlFbmNvZGluZyhjb25zdCBJbkNoYXIqIHNwZWMsIGNvbnN0IFVSTENv
bXBvbmVudCYgcXVlcnksIFVSTEJ1ZmZlcjxPdXRDaGFyPiYgYnVmZmVyKQorICAgIHsKKyAgICAg
ICAgaWYgKGlzQWxsQVNDSUkoc3BlYywgcXVlcnkpKSB7CisgICAgICAgICAgICBhcHBlbmRSYXc4
Qml0UXVlcnlTdHJpbmcoJnNwZWNbcXVlcnkuYmVnaW4oKV0sIHF1ZXJ5Lmxlbmd0aCgpLCBidWZm
ZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgUmF3VVJMQnVm
ZmVyPGNoYXIsIDEwMjQ+IGNvbnZlcnRlZFF1ZXJ5OworICAgICAgICBjb252ZXJ0Q2hhcnNldChz
cGVjLCBxdWVyeSwgY29udmVydGVkUXVlcnkpOworICAgICAgICBhcHBlbmRSYXc4Qml0UXVlcnlT
dHJpbmcoY29udmVydGVkUXVlcnkuZGF0YSgpLCBjb252ZXJ0ZWRRdWVyeS5sZW5ndGgoKSwgYnVm
ZmVyKTsKKyAgICB9Cit9OworCit9CisKKyNlbmRpZgorCisK
</data>

          </attachment>
      

    </bug>

</bugzilla>