<?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>47749</bug_id>
          
          <creation_ts>2010-10-15 16:04:42 -0700</creation_ts>
          <short_desc>serializeNodesWithNamespaces should be in MarkupAccumulator</short_desc>
          <delta_ts>2010-10-15 20:16:31 -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>HTML Editing</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>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>47748</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>abarth</cc>
    
    <cc>eric</cc>
    
    <cc>tony</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>294987</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-10-15 16:04:42 -0700</bug_when>
    <thetext>serializeNodesWithNamespaces should be a member function of MarkupAccumulator, and serializeNodes should be a member function of StyledMarkupAccumulator.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295026</commentid>
    <comment_count>1</comment_count>
      <attachid>70925</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-10-15 17:04:54 -0700</bug_when>
    <thetext>Created attachment 70925
cleanup</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295028</commentid>
    <comment_count>2</comment_count>
      <attachid>70925</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-10-15 17:11:07 -0700</bug_when>
    <thetext>Comment on attachment 70925
cleanup

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

I think there are more webkit data structures we can use here to help, but this is clearly an improvement.

&gt; WebCore/editing/MarkupAccumulator.cpp:133
&gt; +    size_t vectorSize = strings.size();
&gt; +    for (size_t i = 0; i &lt; vectorSize; ++i)

No need to make a temporary for strings.size()

&gt; WebCore/editing/MarkupAccumulator.cpp:141
&gt; -String MarkupAccumulator::takeResults()
&gt; +void MarkupAccumulator::concatenateMarkups(Vector&lt;UChar&gt;&amp; out)

concatenateMarkups =&gt; concatenateMarkup ?

&gt; WebCore/editing/MarkupAccumulator.h:78
&gt; +        out.reserveInitialCapacity(length());
&gt; +        concatenateMarkups(out);
&gt; +        return String::adopt(out);

Why not String::createUninitialized?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295033</commentid>
    <comment_count>3</comment_count>
      <attachid>70925</attachid>
    <who name="Tony Chang">tony</who>
    <bug_when>2010-10-15 17:20:20 -0700</bug_when>
    <thetext>Comment on attachment 70925
cleanup

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

&gt; WebCore/editing/MarkupAccumulator.cpp:129
&gt; +size_t MarkupAccumulator::sumOfStringLengths(const Vector&lt;String&gt;&amp; strings) const

This method doesn&apos;t need to be part of MarkupAccumulator.  You can make it a static function (outside the class).

&gt; WebCore/editing/MarkupAccumulator.h:114
&gt; +    void serializeNodes(Node*, Node* nodeToSkip, EChildrenOnly, const Namespaces*);

Shouldn&apos;t this return a String like your ChangeLog says?

&gt; WebCore/editing/markup.cpp:734
&gt; +    return accumulator.serializeNodes(const_cast&lt;Node*&gt;(node), deleteButtonContainerElement, childrenOnly);

Doesn&apos;t serializeNodes return void and we want to return a string?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295038</commentid>
    <comment_count>4</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-10-15 17:27:25 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; &gt; WebCore/editing/MarkupAccumulator.cpp:129
&gt; &gt; +size_t MarkupAccumulator::sumOfStringLengths(const Vector&lt;String&gt;&amp; strings) const
&gt; 
&gt; This method doesn&apos;t need to be part of MarkupAccumulator.  You can make it a static function (outside the class).

It&apos;s used in StyledMarkupAccumulator so it needs to be a protected member.

&gt; &gt; WebCore/editing/MarkupAccumulator.h:114
&gt; &gt; +    void serializeNodes(Node*, Node* nodeToSkip, EChildrenOnly, const Namespaces*);
&gt; 
&gt; Shouldn&apos;t this return a String like your ChangeLog says?

Not this one. This is a helper for the public version of serializeNodes.  Let me rename that to something else so that there&apos;s no confusion.

&gt; &gt; WebCore/editing/markup.cpp:734
&gt; &gt; +    return accumulator.serializeNodes(const_cast&lt;Node*&gt;(node), deleteButtonContainerElement, childrenOnly);
&gt; 
&gt; Doesn&apos;t serializeNodes return void and we want to return a string?

There&apos;s a version of serializeNodes that returns String in MarkupAccumulator.h.  But I agree that it&apos;s quite confusing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295042</commentid>
    <comment_count>5</comment_count>
    <who name="Tony Chang">tony</who>
    <bug_when>2010-10-15 17:31:18 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (In reply to comment #3)
&gt; &gt; &gt; WebCore/editing/MarkupAccumulator.cpp:129
&gt; &gt; &gt; +size_t MarkupAccumulator::sumOfStringLengths(const Vector&lt;String&gt;&amp; strings) const
&gt; &gt; 
&gt; &gt; This method doesn&apos;t need to be part of MarkupAccumulator.  You can make it a static function (outside the class).
&gt; 
&gt; It&apos;s used in StyledMarkupAccumulator so it needs to be a protected member.

I see, can it be a static method on the class?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295045</commentid>
    <comment_count>6</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-10-15 17:32:34 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #4)
&gt; &gt; (In reply to comment #3)
&gt; &gt; &gt; &gt; WebCore/editing/MarkupAccumulator.cpp:129
&gt; &gt; &gt; &gt; +size_t MarkupAccumulator::sumOfStringLengths(const Vector&lt;String&gt;&amp; strings) const
&gt; &gt; &gt; 
&gt; &gt; &gt; This method doesn&apos;t need to be part of MarkupAccumulator.  You can make it a static function (outside the class).
&gt; &gt; 
&gt; &gt; It&apos;s used in StyledMarkupAccumulator so it needs to be a protected member.
&gt; 
&gt; I see, can it be a static method on the class?

Mn... if I do that then I have to make a bunch of protected methods public and I don&apos;t really want to do that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295047</commentid>
    <comment_count>7</comment_count>
      <attachid>70930</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-10-15 17:33:07 -0700</bug_when>
    <thetext>Created attachment 70930
fixed per Adam&apos;s &amp; Tony&apos;s comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295058</commentid>
    <comment_count>8</comment_count>
      <attachid>70930</attachid>
    <who name="Tony Chang">tony</who>
    <bug_when>2010-10-15 17:49:21 -0700</bug_when>
    <thetext>Comment on attachment 70930
fixed per Adam&apos;s &amp; Tony&apos;s comments

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

FWIW, you can call protected static methods on a parent class.

Adam asked the following:
&gt; WebCore/editing/MarkupAccumulator.h:78
&gt; +        out.reserveInitialCapacity(length());
&gt; +        concatenateMarkups(out);
&gt; +        return String::adopt(out);

Why not String::createUninitialized?

&gt; WebCore/ChangeLog:22
&gt; +        (WebCore::MarkupAccumulator::length): Added; calls sumOfStringLengths.

Nit: calls totalLength

&gt; WebCore/ChangeLog:26
&gt; +        (WebCore::StyledMarkupAccumulator::takeResults): Calls length, sumOfStringLengths, and concatenateMarkups.

Nit: totalLength, and concatenateMarkup</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295072</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-10-15 18:04:12 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 70930 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=70930&amp;action=review
&gt; 
&gt; FWIW, you can call protected static methods on a parent class.
&gt; 
&gt; Adam asked the following:
&gt; &gt; WebCore/editing/MarkupAccumulator.h:78
&gt; &gt; +        out.reserveInitialCapacity(length());
&gt; &gt; +        concatenateMarkups(out);
&gt; &gt; +        return String::adopt(out);
&gt; 
&gt; Why not String::createUninitialized?

rniwa and I talked about that.  I think we&apos;re going to do that in a subsequent patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295103</commentid>
    <comment_count>10</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-10-15 20:13:39 -0700</bug_when>
    <thetext>Thanks for the review!

(In reply to comment #6)
&gt; (In reply to comment #5)
&gt; &gt; (In reply to comment #4)
&gt; &gt; &gt; (In reply to comment #3)
&gt; &gt; &gt; &gt; &gt; WebCore/editing/MarkupAccumulator.cpp:129
&gt; &gt; &gt; &gt; &gt; +size_t MarkupAccumulator::sumOfStringLengths(const Vector&lt;String&gt;&amp; strings) const
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; This method doesn&apos;t need to be part of MarkupAccumulator.  You can make it a static function (outside the class).
&gt; &gt; &gt; 
&gt; &gt; &gt; It&apos;s used in StyledMarkupAccumulator so it needs to be a protected member.
&gt; &gt; 
&gt; &gt; I see, can it be a static method on the class?
&gt; 
&gt; Mn... if I do that then I have to make a bunch of protected methods public and I don&apos;t really want to do that.

Oops, this comment is totally bogus.  I thought you meant the old serializeNodes (now serializeNodesWithNamespaces).  Will make it static.

(In reply to comment #8)
&gt; Adam asked the following:
&gt; &gt; WebCore/editing/MarkupAccumulator.h:78
&gt; &gt; +        out.reserveInitialCapacity(length());
&gt; &gt; +        concatenateMarkups(out);
&gt; &gt; +        return String::adopt(out);
&gt; 
&gt; Why not String::createUninitialized?

That&apos;s because concatenateMarkups is also used in StyledMarkupAccumulator, and I didn&apos;t want to create two strings there.  We need to figure out a cleaner way of doing this after this patch is landed.

&gt; &gt; WebCore/ChangeLog:22
&gt; &gt; +        (WebCore::MarkupAccumulator::length): Added; calls sumOfStringLengths.
&gt; 
&gt; Nit: calls totalLength
&gt; 
&gt; &gt; WebCore/ChangeLog:26
&gt; &gt; +        (WebCore::StyledMarkupAccumulator::takeResults): Calls length, sumOfStringLengths, and concatenateMarkups.
&gt; 
&gt; Nit: totalLength, and concatenateMarkup

Thanks for noticing those.  Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295104</commentid>
    <comment_count>11</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-10-15 20:16:31 -0700</bug_when>
    <thetext>Committed r69909: &lt;http://trac.webkit.org/changeset/69909&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>70925</attachid>
            <date>2010-10-15 17:04:54 -0700</date>
            <delta_ts>2010-10-15 17:33:04 -0700</delta_ts>
            <desc>cleanup</desc>
            <filename>bug-47749-20101015170453.patch</filename>
            <type>text/plain</type>
            <size>14490</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2OTg5NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzIgQEAKKzIwMTAtMTAtMTUgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgc2Vy
aWFsaXplTm9kZXNXaXRoTmFtZXNwYWNlcyBzaG91bGQgYmUgaW4gTWFya3VwQWNjdW11bGF0b3IK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ3NzQ5CisK
KyAgICAgICAgTW92ZWQgc2VyaWFsaXplTm9kZXNXaXRoTmFtZXNwYWNlcyB0byBNYXJrdXBBY2N1
bXVsYXRvciwgYW5kIHJlbmFtZWQgaXQgdG8gc2VyaWFsaXplTm9kZXMuCisgICAgICAgIE1hcmt1
cEFjY3VtdWxhdG9yOjpzZXJpYWxpemVOb2RlIG5vdyByZXR1cm5zIHRoZSByZXN1bHRhbnQgc3Ry
aW5nIGluc3RlYWQgb2YgaGF2aW5nIGEgc2VwYXJhdGUgdGFrZVJlc3VsdHMoKS4KKyAgICAgICAg
QWRkZWQgc2V2ZXJhbCBoZWxwZXIgZnVuY3Rpb25zIHRvIE1hcmt1cEFjY3VtdWxhdG9yLgorCisg
ICAgICAgIE5vIG5ldyB0ZXN0cyBhcmUgYWRkZWQgc2luY2UgdGhpcyBpcyBhIGNsZWFudXAuCisK
KyAgICAgICAgKiBlZGl0aW5nL01hcmt1cEFjY3VtdWxhdG9yLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjpzZXJpYWxpemVOb2Rlcyk6IE1vdmVkIGZyb20gbWFya3Vw
LmNwcAorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFN0YXJ0VGFn
KTogQ2FsbHMgYXBwZW5kU3RyaW5nIGluc3RlYWQgb2YgYXBwZW5kaW5nIGludG8gbV9zdWNjZWVk
aW5nTWFya3VwIGRpcmVjdGx5LgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6
OmFwcGVuZEVuZFRhZyk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0
b3I6OnN1bU9mU3RyaW5nTGVuZ3Rocyk6IEFkZGVkOyBleHRyYWN0ZWQgZnJvbSB0YWtlUmVzdWx0
cy4KKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjpjb25jYXRlbmF0ZU1hcmt1
cHMpOiBEaXR0by4KKyAgICAgICAgKiBlZGl0aW5nL01hcmt1cEFjY3VtdWxhdG9yLmg6CisgICAg
ICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6c2VyaWFsaXplTm9kZXMpOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjpsZW5ndGgpOiBBZGRlZDsgY2Fs
bHMgc3VtT2ZTdHJpbmdMZW5ndGhzLgorICAgICAgICAqIGVkaXRpbmcvbWFya3VwLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRTdHJpbmcpOiBB
ZGRlZDsgY2FsbHMgTWFya3VwQWNjdW11bGF0b3IncyBhcHBlbmRTdHJpbmcuCisgICAgICAgIChX
ZWJDb3JlOjpTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6d3JhcFdpdGhTdHlsZU5vZGUpOiBDYWxs
cyBhcHBlbmRTdHJpbmcuCisgICAgICAgIChXZWJDb3JlOjpTdHlsZWRNYXJrdXBBY2N1bXVsYXRv
cjo6dGFrZVJlc3VsdHMpOiBDYWxscyBsZW5ndGgsIHN1bU9mU3RyaW5nTGVuZ3RocywgYW5kIGNv
bmNhdGVuYXRlTWFya3Vwcy4KKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlZE1hcmt1cEFjY3VtdWxh
dG9yOjpzZXJpYWxpemVOb2Rlcyk6IEJlY2FtZSBhIG1lbWJlciBmdW5jdGlvbi4KKyAgICAgICAg
KFdlYkNvcmU6OmNyZWF0ZU1hcmt1cCk6IFVzZXMgTWFya3VwQWNjdW11bGF0b3IuCisKIDIwMTAt
MTAtMTUgIE1pa2UgTGF3dGhlciAgPG1pa2VsYXd0aGVyQGNocm9taXVtLm9yZz4KIAogICAgICAg
ICBSZXZpZXdlZCBieSBKYW1lcyBSb2JpbnNvbi4KSW5kZXg6IFdlYkNvcmUvZWRpdGluZy9NYXJr
dXBBY2N1bXVsYXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9lZGl0aW5nL01hcmt1cEFj
Y3VtdWxhdG9yLmNwcAkocmV2aXNpb24gNjk4OTQpCisrKyBXZWJDb3JlL2VkaXRpbmcvTWFya3Vw
QWNjdW11bGF0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENv
cHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwpAQCAtMTAsMTcgKzExLDE3IEBACiAgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgogICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5D
LiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKICNpbmNsdWRlICJjb25m
aWcuaCIKQEAgLTgzLDYgKzg0LDI3IEBAIE1hcmt1cEFjY3VtdWxhdG9yOjp+TWFya3VwQWNjdW11
bGF0b3IoKQogewogfQogCit2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjpzZXJpYWxpemVOb2RlcyhO
b2RlKiBub2RlLCBOb2RlKiBub2RlVG9Ta2lwLCBFQ2hpbGRyZW5Pbmx5IGNoaWxkcmVuT25seSwg
Y29uc3QgTmFtZXNwYWNlcyogbmFtZXNwYWNlcykKK3sKKyAgICBpZiAobm9kZSA9PSBub2RlVG9T
a2lwKQorICAgICAgICByZXR1cm47CisKKyAgICBOYW1lc3BhY2VzIG5hbWVzcGFjZUhhc2g7Cisg
ICAgaWYgKG5hbWVzcGFjZXMpCisgICAgICAgIG5hbWVzcGFjZUhhc2ggPSAqbmFtZXNwYWNlczsK
KworICAgIGlmICghY2hpbGRyZW5Pbmx5KQorICAgICAgICBhcHBlbmRTdGFydFRhZyhub2RlLCAm
bmFtZXNwYWNlSGFzaCk7CisKKyAgICBpZiAoIShub2RlLT5kb2N1bWVudCgpLT5pc0hUTUxEb2N1
bWVudCgpICYmIGVsZW1lbnRDYW5ub3RIYXZlRW5kVGFnKG5vZGUpKSkgeworICAgICAgICBmb3Ig
KE5vZGUqIGN1cnJlbnQgPSBub2RlLT5maXJzdENoaWxkKCk7IGN1cnJlbnQ7IGN1cnJlbnQgPSBj
dXJyZW50LT5uZXh0U2libGluZygpKQorICAgICAgICAgICAgc2VyaWFsaXplTm9kZXMoY3VycmVu
dCwgbm9kZVRvU2tpcCwgSW5jbHVkZU5vZGUsICZuYW1lc3BhY2VIYXNoKTsKKyAgICB9CisKKyAg
ICBpZiAoIWNoaWxkcmVuT25seSkKKyAgICAgICAgYXBwZW5kRW5kVGFnKG5vZGUpOworfQorCiB2
b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRTdHJpbmcoY29uc3QgU3RyaW5nJiBzdHJpbmcp
CiB7CiAgICAgbV9zdWNjZWVkaW5nTWFya3VwLmFwcGVuZChzdHJpbmcpOwpAQCAtOTIsNyArMTE0
LDcgQEAgdm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kU3RhcnRUYWcoTgogewogICAgIFZl
Y3RvcjxVQ2hhcj4gbWFya3VwOwogICAgIGFwcGVuZFN0YXJ0TWFya3VwKG1hcmt1cCwgbm9kZSwg
bmFtZXNwYWNlcyk7Ci0gICAgbV9zdWNjZWVkaW5nTWFya3VwLmFwcGVuZChTdHJpbmc6OmFkb3B0
KG1hcmt1cCkpOworICAgIGFwcGVuZFN0cmluZyhTdHJpbmc6OmFkb3B0KG1hcmt1cCkpOwogICAg
IGlmIChtX25vZGVzKQogICAgICAgICBtX25vZGVzLT5hcHBlbmQobm9kZSk7CiB9CkBAIC0xMDEs
MjcgKzEyMywyNiBAQCB2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRFbmRUYWcoTm9kCiB7
CiAgICAgVmVjdG9yPFVDaGFyPiBtYXJrdXA7CiAgICAgYXBwZW5kRW5kTWFya3VwKG1hcmt1cCwg
bm9kZSk7Ci0gICAgbV9zdWNjZWVkaW5nTWFya3VwLmFwcGVuZChTdHJpbmc6OmFkb3B0KG1hcmt1
cCkpOworICAgIGFwcGVuZFN0cmluZyhTdHJpbmc6OmFkb3B0KG1hcmt1cCkpOworfQorCitzaXpl
X3QgTWFya3VwQWNjdW11bGF0b3I6OnN1bU9mU3RyaW5nTGVuZ3Rocyhjb25zdCBWZWN0b3I8U3Ry
aW5nPiYgc3RyaW5ncykgY29uc3QKK3sKKyAgICBzaXplX3QgbGVuZ3RoID0gMDsKKyAgICBzaXpl
X3QgdmVjdG9yU2l6ZSA9IHN0cmluZ3Muc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgdmVjdG9yU2l6ZTsgKytpKQorICAgICAgICBsZW5ndGggKz0gc3RyaW5nc1tpXS5sZW5ndGgo
KTsKKyAgICByZXR1cm4gbGVuZ3RoOwogfQogCiAvLyBGSVhNRTogVGhpcyBpcyBhIHZlcnkgaW5l
ZmZpY2llbnQgd2F5IG9mIGFjY3VtdWxhdGluZyB0aGUgbWFya3VwLgogLy8gV2UncmUgY29udmVy
dGluZyByZXN1bHRzIG9mIGFwcGVuZFN0YXJ0TWFya3VwIGFuZCBhcHBlbmRFbmRNYXJrdXAgZnJv
bSBWZWN0b3I8VUNoYXI+IHRvIFN0cmluZwogLy8gYW5kIHRoZW4gYmFjayB0byBWZWN0b3I8VUNo
YXI+IGFuZCBhZ2FpbiB0byBTdHJpbmcgaGVyZS4KLVN0cmluZyBNYXJrdXBBY2N1bXVsYXRvcjo6
dGFrZVJlc3VsdHMoKQordm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6Y29uY2F0ZW5hdGVNYXJrdXBz
KFZlY3RvcjxVQ2hhcj4mIG91dCkKIHsKLSAgICBzaXplX3QgbGVuZ3RoID0gMDsKLQotICAgIHNp
emVfdCBwb3N0Q291bnQgPSBtX3N1Y2NlZWRpbmdNYXJrdXAuc2l6ZSgpOwotICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgcG9zdENvdW50OyArK2kpCi0gICAgICAgIGxlbmd0aCArPSBtX3N1Y2Nl
ZWRpbmdNYXJrdXBbaV0ubGVuZ3RoKCk7Ci0KLSAgICBWZWN0b3I8VUNoYXI+IHJlc3VsdDsKLSAg
ICByZXN1bHQucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShsZW5ndGgpOwotCi0gICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBwb3N0Q291bnQ7ICsraSkKLSAgICAgICAgYXBwZW5kKHJlc3VsdCwgbV9z
dWNjZWVkaW5nTWFya3VwW2ldKTsKLQotICAgIHJldHVybiBTdHJpbmc6OmFkb3B0KHJlc3VsdCk7
CisgICAgc2l6ZV90IHZlY3RvclNpemUgPSBtX3N1Y2NlZWRpbmdNYXJrdXAuc2l6ZSgpOworICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmVjdG9yU2l6ZTsgKytpKQorICAgICAgICBhcHBlbmQo
b3V0LCBtX3N1Y2NlZWRpbmdNYXJrdXBbaV0pOwogfQogCiB2b2lkIE1hcmt1cEFjY3VtdWxhdG9y
OjphcHBlbmRBdHRyaWJ1dGVWYWx1ZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IFN0cmlu
ZyYgYXR0cmlidXRlLCBib29sIGRvY3VtZW50SXNIVE1MKQpJbmRleDogV2ViQ29yZS9lZGl0aW5n
L01hcmt1cEFjY3VtdWxhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9lZGl0aW5nL01hcmt1
cEFjY3VtdWxhdG9yLmgJKHJldmlzaW9uIDY5ODk0KQorKysgV2ViQ29yZS9lZGl0aW5nL01hcmt1
cEFjY3VtdWxhdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTY5LDEyICs2OSwyMiBAQCBwdWJsaWM6
CiAgICAgTWFya3VwQWNjdW11bGF0b3IoVmVjdG9yPE5vZGUqPiogbm9kZXMsIEVBYnNvbHV0ZVVS
THMgc2hvdWxkUmVzb2x2ZVVSTHMsIGNvbnN0IFJhbmdlKiByYW5nZSA9IDApOwogICAgIHZpcnR1
YWwgfk1hcmt1cEFjY3VtdWxhdG9yKCk7CiAKKyAgICBTdHJpbmcgc2VyaWFsaXplTm9kZXMoTm9k
ZSogbm9kZSwgTm9kZSogbm9kZVRvU2tpcCwgRUNoaWxkcmVuT25seSBjaGlsZHJlbk9ubHkpCisg
ICAgeworICAgICAgICBWZWN0b3I8VUNoYXI+IG91dDsKKyAgICAgICAgc2VyaWFsaXplTm9kZXMo
bm9kZSwgbm9kZVRvU2tpcCwgY2hpbGRyZW5Pbmx5LCAwKTsKKyAgICAgICAgb3V0LnJlc2VydmVJ
bml0aWFsQ2FwYWNpdHkobGVuZ3RoKCkpOworICAgICAgICBjb25jYXRlbmF0ZU1hcmt1cHMob3V0
KTsKKyAgICAgICAgcmV0dXJuIFN0cmluZzo6YWRvcHQob3V0KTsKKyAgICB9CisKK3Byb3RlY3Rl
ZDoKICAgICB2b2lkIGFwcGVuZFN0cmluZyhjb25zdCBTdHJpbmcmKTsKICAgICB2b2lkIGFwcGVu
ZFN0YXJ0VGFnKE5vZGUqLCBOYW1lc3BhY2VzKiA9IDApOwogICAgIHZvaWQgYXBwZW5kRW5kVGFn
KE5vZGUqKTsKLSAgICB2aXJ0dWFsIFN0cmluZyB0YWtlUmVzdWx0cygpOwotCi1wcm90ZWN0ZWQ6
CisgICAgc2l6ZV90IHN1bU9mU3RyaW5nTGVuZ3Rocyhjb25zdCBWZWN0b3I8U3RyaW5nPiYpIGNv
bnN0OworICAgIHNpemVfdCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBzdW1PZlN0cmluZ0xlbmd0
aHMobV9zdWNjZWVkaW5nTWFya3VwKTsgfQorICAgIHZvaWQgY29uY2F0ZW5hdGVNYXJrdXBzKFZl
Y3RvcjxVQ2hhcj4mIG91dCk7CiAgICAgdm9pZCBhcHBlbmRBdHRyaWJ1dGVWYWx1ZShWZWN0b3I8
VUNoYXI+JiByZXN1bHQsIGNvbnN0IFN0cmluZyYgYXR0cmlidXRlLCBib29sIGRvY3VtZW50SXNI
VE1MKTsKICAgICB2b2lkIGFwcGVuZFF1b3RlZFVSTEF0dHJpYnV0ZVZhbHVlKFZlY3RvcjxVQ2hh
cj4mIHJlc3VsdCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOwogICAgIHZvaWQgYXBwZW5kTm9k
ZVZhbHVlKFZlY3RvcjxVQ2hhcj4mIG91dCwgY29uc3QgTm9kZSosIGNvbnN0IFJhbmdlKiwgRW50
aXR5TWFzayk7CkBAIC05OSw5ICsxMDksMTEgQEAgcHJvdGVjdGVkOgogCiAgICAgVmVjdG9yPE5v
ZGUqPiogY29uc3QgbV9ub2RlczsKICAgICBjb25zdCBSYW5nZSogY29uc3QgbV9yYW5nZTsKLSAg
ICBWZWN0b3I8U3RyaW5nPiBtX3N1Y2NlZWRpbmdNYXJrdXA7CiAKIHByaXZhdGU6CisgICAgdm9p
ZCBzZXJpYWxpemVOb2RlcyhOb2RlKiwgTm9kZSogbm9kZVRvU2tpcCwgRUNoaWxkcmVuT25seSwg
Y29uc3QgTmFtZXNwYWNlcyopOworCisgICAgVmVjdG9yPFN0cmluZz4gbV9zdWNjZWVkaW5nTWFy
a3VwOwogICAgIGNvbnN0IGJvb2wgbV9zaG91bGRSZXNvbHZlVVJMczsKIH07CiAKSW5kZXg6IFdl
YkNvcmUvZWRpdGluZy9tYXJrdXAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZWRpdGluZy9t
YXJrdXAuY3BwCShyZXZpc2lvbiA2OTg5NCkKKysrIFdlYkNvcmUvZWRpdGluZy9tYXJrdXAuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xMzksMTEgKzEzOSwxNCBAQCBwdWJsaWM6CiAgICAgLCBtX3No
b3VsZEFubm90YXRlKHNob3VsZEFubm90YXRlKQogICAgIHsKICAgICB9CisKKyAgICBOb2RlKiBz
ZXJpYWxpemVOb2RlcyhOb2RlKiBzdGFydE5vZGUsIE5vZGUqIHBhc3RFbmQpOworICAgIHZvaWQg
YXBwZW5kU3RyaW5nKGNvbnN0IFN0cmluZyYgcykgeyByZXR1cm4gTWFya3VwQWNjdW11bGF0b3I6
OmFwcGVuZFN0cmluZyhzKTsgfQogICAgIHZvaWQgd3JhcFdpdGhOb2RlKE5vZGUqLCBib29sIGNv
bnZlcnRCbG9ja3NUb0lubGluZXMgPSBmYWxzZSwgUmFuZ2VGdWxseVNlbGVjdHNOb2RlID0gRG9l
c0Z1bGx5U2VsZWN0Tm9kZSk7CiAgICAgdm9pZCB3cmFwV2l0aFN0eWxlTm9kZShDU1NTdHlsZURl
Y2xhcmF0aW9uKiwgRG9jdW1lbnQqLCBib29sIGlzQmxvY2sgPSBmYWxzZSk7CiAgICAgU3RyaW5n
IHRha2VSZXN1bHRzKCk7CiAKLXByb3RlY3RlZDoKK3ByaXZhdGU6CiAgICAgdmlydHVhbCB2b2lk
IGFwcGVuZFRleHQoVmVjdG9yPFVDaGFyPiYgb3V0LCBUZXh0Kik7CiAgICAgU3RyaW5nIHJlbmRl
cmVkVGV4dChjb25zdCBOb2RlKiwgY29uc3QgUmFuZ2UqKTsKICAgICBTdHJpbmcgc3RyaW5nVmFs
dWVGb3JSYW5nZShjb25zdCBOb2RlKiwgY29uc3QgUmFuZ2UqKTsKQEAgLTE1Myw3ICsxNTYsNiBA
QCBwcm90ZWN0ZWQ6CiAKICAgICBib29sIHNob3VsZEFubm90YXRlKCkgeyByZXR1cm4gbV9zaG91
bGRBbm5vdGF0ZSA9PSBBbm5vdGF0ZUZvckludGVyY2hhbmdlOyB9CiAKLXByaXZhdGU6CiAgICAg
VmVjdG9yPFN0cmluZz4gbV9yZXZlcnNlZFByZWNlZGluZ01hcmt1cDsKICAgICBjb25zdCBFQW5u
b3RhdGVGb3JJbnRlcmNoYW5nZSBtX3Nob3VsZEFubm90YXRlOwogfTsKQEAgLTE4NiwyOSArMTg4
LDE5IEBAIHZvaWQgU3R5bGVkTWFya3VwQWNjdW11bGF0b3I6OndyYXBXaXRoU3QKICAgICBvcGVu
VGFnLmFwcGVuZCgnXCInKTsKICAgICBvcGVuVGFnLmFwcGVuZCgnPicpOwogICAgIG1fcmV2ZXJz
ZWRQcmVjZWRpbmdNYXJrdXAuYXBwZW5kKFN0cmluZzo6YWRvcHQob3BlblRhZykpOwotICAgIG1f
c3VjY2VlZGluZ01hcmt1cC5hcHBlbmQoaXNCbG9jayA/IGRpdkNsb3NlIDogc3R5bGVTcGFuQ2xv
c2UpOworICAgIGFwcGVuZFN0cmluZyhpc0Jsb2NrID8gZGl2Q2xvc2UgOiBzdHlsZVNwYW5DbG9z
ZSk7CiB9CiAKIFN0cmluZyBTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6dGFrZVJlc3VsdHMoKQog
ewotICAgIHNpemVfdCBsZW5ndGggPSAwOwotCi0gICAgc2l6ZV90IHByZUNvdW50ID0gbV9yZXZl
cnNlZFByZWNlZGluZ01hcmt1cC5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBw
cmVDb3VudDsgKytpKQotICAgICAgICBsZW5ndGggKz0gbV9yZXZlcnNlZFByZWNlZGluZ01hcmt1
cFtpXS5sZW5ndGgoKTsKLQotICAgIHNpemVfdCBwb3N0Q291bnQgPSBtX3N1Y2NlZWRpbmdNYXJr
dXAuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9zdENvdW50OyArK2kpCi0g
ICAgICAgIGxlbmd0aCArPSBtX3N1Y2NlZWRpbmdNYXJrdXBbaV0ubGVuZ3RoKCk7Ci0KICAgICBW
ZWN0b3I8VUNoYXI+IHJlc3VsdDsKLSAgICByZXN1bHQucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShs
ZW5ndGgpOworICAgIHJlc3VsdC5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KHN1bU9mU3RyaW5nTGVu
Z3RocyhtX3JldmVyc2VkUHJlY2VkaW5nTWFya3VwKSArIGxlbmd0aCgpKTsKIAorICAgIHNpemVf
dCBwcmVDb3VudCA9IG1fcmV2ZXJzZWRQcmVjZWRpbmdNYXJrdXAuc2l6ZSgpOwogICAgIGZvciAo
c2l6ZV90IGkgPSBwcmVDb3VudDsgaSA+IDA7IC0taSkKICAgICAgICAgYXBwZW5kKHJlc3VsdCwg
bV9yZXZlcnNlZFByZWNlZGluZ01hcmt1cFtpIC0gMV0pOwogCi0gICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBwb3N0Q291bnQ7ICsraSkKLSAgICAgICAgYXBwZW5kKHJlc3VsdCwgbV9zdWNjZWVk
aW5nTWFya3VwW2ldKTsKKyAgICBjb25jYXRlbmF0ZU1hcmt1cHMocmVzdWx0KTsKIAogICAgIHJl
dHVybiBTdHJpbmc6OmFkb3B0KHJlc3VsdCk7CiB9CkBAIC0zNDIsNyArMzM0LDcgQEAgdm9pZCBT
dHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6cmVtb3ZlRXh0ZQogICAgIHN0eWxlLT5yZW1vdmVQcm9w
ZXJ0eShDU1NQcm9wZXJ0eUZsb2F0KTsKIH0KIAotc3RhdGljIE5vZGUqIHNlcmlhbGl6ZU5vZGVz
KFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yJiBhY2N1bXVsYXRvciwgTm9kZSogc3RhcnROb2RlLCBO
b2RlKiBwYXN0RW5kKQorTm9kZSogU3R5bGVkTWFya3VwQWNjdW11bGF0b3I6OnNlcmlhbGl6ZU5v
ZGVzKE5vZGUqIHN0YXJ0Tm9kZSwgTm9kZSogcGFzdEVuZCkKIHsKICAgICBWZWN0b3I8Tm9kZSo+
IGFuY2VzdG9yc1RvQ2xvc2U7CiAgICAgTm9kZSogbmV4dDsKQEAgLTM3MCwxMSArMzYyLDExIEBA
IHN0YXRpYyBOb2RlKiBzZXJpYWxpemVOb2RlcyhTdHlsZWRNYXJrdXAKICAgICAgICAgICAgICAg
ICBuZXh0ID0gcGFzdEVuZDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIEFkZCB0
aGUgbm9kZSB0byB0aGUgbWFya3VwIGlmIHdlJ3JlIG5vdCBza2lwcGluZyB0aGUgZGVzY2VuZGFu
dHMKLSAgICAgICAgICAgIGFjY3VtdWxhdG9yLmFwcGVuZFN0YXJ0VGFnKG4pOworICAgICAgICAg
ICAgYXBwZW5kU3RhcnRUYWcobik7CiAKICAgICAgICAgICAgIC8vIElmIG5vZGUgaGFzIG5vIGNo
aWxkcmVuLCBjbG9zZSB0aGUgdGFnIG5vdy4KICAgICAgICAgICAgIGlmICghbi0+Y2hpbGROb2Rl
Q291bnQoKSkgewotICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yLmFwcGVuZEVuZFRhZyhuKTsK
KyAgICAgICAgICAgICAgICBhcHBlbmRFbmRUYWcobik7CiAgICAgICAgICAgICAgICAgbGFzdENs
b3NlZCA9IG47CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG9wZW5lZFRh
ZyA9IHRydWU7CkBAIC0zOTEsNyArMzgzLDcgQEAgc3RhdGljIE5vZGUqIHNlcmlhbGl6ZU5vZGVz
KFN0eWxlZE1hcmt1cAogICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9IHBhc3RFbmQgJiYgbmV4
dC0+aXNEZXNjZW5kYW50T2YoYW5jZXN0b3IpKQogICAgICAgICAgICAgICAgICAgICBicmVhazsK
ICAgICAgICAgICAgICAgICAvLyBOb3QgYXQgdGhlIGVuZCBvZiB0aGUgcmFuZ2UsIGNsb3NlIGFu
Y2VzdG9ycyB1cCB0byBzaWJsaW5nIG9mIG5leHQgbm9kZS4KLSAgICAgICAgICAgICAgICBhY2N1
bXVsYXRvci5hcHBlbmRFbmRUYWcoYW5jZXN0b3IpOworICAgICAgICAgICAgICAgIGFwcGVuZEVu
ZFRhZyhhbmNlc3Rvcik7CiAgICAgICAgICAgICAgICAgbGFzdENsb3NlZCA9IGFuY2VzdG9yOwog
ICAgICAgICAgICAgICAgIGFuY2VzdG9yc1RvQ2xvc2UucmVtb3ZlTGFzdCgpOwogICAgICAgICAg
ICAgfQpAQCAtNDA2LDcgKzM5OCw3IEBAIHN0YXRpYyBOb2RlKiBzZXJpYWxpemVOb2RlcyhTdHls
ZWRNYXJrdXAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAg
ICAgICAgICAvLyBvciBiKSBhbmNlc3RvcnMgdGhhdCB3ZSBuZXZlciBlbmNvdW50ZXJlZCBkdXJp
bmcgYSBwcmUtb3JkZXIgdHJhdmVyc2FsIHN0YXJ0aW5nIGF0IHN0YXJ0Tm9kZToKICAgICAgICAg
ICAgICAgICAgICAgQVNTRVJUKHN0YXJ0Tm9kZS0+aXNEZXNjZW5kYW50T2YocGFyZW50KSk7Ci0g
ICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yLndyYXBXaXRoTm9kZShwYXJlbnQpOworICAg
ICAgICAgICAgICAgICAgICB3cmFwV2l0aE5vZGUocGFyZW50KTsKICAgICAgICAgICAgICAgICAg
ICAgbGFzdENsb3NlZCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9
CkBAIC02MzAsNyArNjIyLDcgQEAgU3RyaW5nIGNyZWF0ZU1hcmt1cChjb25zdCBSYW5nZSogcmFu
Z2UsIAogCiAgICAgTm9kZSogc3BlY2lhbENvbW1vbkFuY2VzdG9yID0gaGlnaGVzdEFuY2VzdG9y
VG9XcmFwTWFya3VwKHVwZGF0ZWRSYW5nZS5nZXQoKSwgZnVsbHlTZWxlY3RlZFJvb3QsIHNob3Vs
ZEFubm90YXRlKTsKIAotICAgIE5vZGUqIGxhc3RDbG9zZWQgPSBzZXJpYWxpemVOb2RlcyhhY2N1
bXVsYXRvciwgc3RhcnROb2RlLCBwYXN0RW5kKTsKKyAgICBOb2RlKiBsYXN0Q2xvc2VkID0gYWNj
dW11bGF0b3Iuc2VyaWFsaXplTm9kZXMoc3RhcnROb2RlLCBwYXN0RW5kKTsKIAogICAgIGlmIChz
cGVjaWFsQ29tbW9uQW5jZXN0b3IgJiYgbGFzdENsb3NlZCkgewogICAgICAgICAvLyBBbHNvIGlu
Y2x1ZGUgYWxsIG9mIHRoZSBhbmNlc3RvcnMgb2YgbGFzdENsb3NlZCB1cCB0byB0aGlzIHNwZWNp
YWwgYW5jZXN0b3IuCkBAIC03MjYsMjcgKzcxOCw2IEBAIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFn
bWVudD4gY3JlYXRlRnJhZ20KICAgICByZXR1cm4gZnJhZ21lbnQucmVsZWFzZSgpOwogfQogCi1z
dGF0aWMgdm9pZCBzZXJpYWxpemVOb2Rlc1dpdGhOYW1lc3BhY2VzKE1hcmt1cEFjY3VtdWxhdG9y
JiBhY2N1bXVsYXRvciwgTm9kZSogbm9kZSwgTm9kZSogbm9kZVRvU2tpcCwgRUNoaWxkcmVuT25s
eSBjaGlsZHJlbk9ubHksIGNvbnN0IE5hbWVzcGFjZXMqIG5hbWVzcGFjZXMpCi17Ci0gICAgaWYg
KG5vZGUgPT0gbm9kZVRvU2tpcCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgTmFtZXNwYWNlcyBu
YW1lc3BhY2VIYXNoOwotICAgIGlmIChuYW1lc3BhY2VzKQotICAgICAgICBuYW1lc3BhY2VIYXNo
ID0gKm5hbWVzcGFjZXM7Ci0KLSAgICBpZiAoIWNoaWxkcmVuT25seSkKLSAgICAgICAgYWNjdW11
bGF0b3IuYXBwZW5kU3RhcnRUYWcobm9kZSwgJm5hbWVzcGFjZUhhc2gpOwotCi0gICAgaWYgKCEo
bm9kZS0+ZG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSAmJiBlbGVtZW50Q2Fubm90SGF2ZUVu
ZFRhZyhub2RlKSkpIHsKLSAgICAgICAgZm9yIChOb2RlKiBjdXJyZW50ID0gbm9kZS0+Zmlyc3RD
aGlsZCgpOyBjdXJyZW50OyBjdXJyZW50ID0gY3VycmVudC0+bmV4dFNpYmxpbmcoKSkKLSAgICAg
ICAgICAgIHNlcmlhbGl6ZU5vZGVzV2l0aE5hbWVzcGFjZXMoYWNjdW11bGF0b3IsIGN1cnJlbnQs
IG5vZGVUb1NraXAsIEluY2x1ZGVOb2RlLCAmbmFtZXNwYWNlSGFzaCk7Ci0gICAgfQotCi0gICAg
aWYgKCFjaGlsZHJlbk9ubHkpCi0gICAgICAgIGFjY3VtdWxhdG9yLmFwcGVuZEVuZFRhZyhub2Rl
KTsKLX0KLQogU3RyaW5nIGNyZWF0ZU1hcmt1cChjb25zdCBOb2RlKiBub2RlLCBFQ2hpbGRyZW5P
bmx5IGNoaWxkcmVuT25seSwgVmVjdG9yPE5vZGUqPiogbm9kZXMsIEVBYnNvbHV0ZVVSTHMgc2hv
dWxkUmVzb2x2ZVVSTHMpCiB7CiAgICAgaWYgKCFub2RlKQpAQCAtNzYwLDggKzczMSw3IEBAIFN0
cmluZyBjcmVhdGVNYXJrdXAoY29uc3QgTm9kZSogbm9kZSwgRUMKICAgICB9CiAKICAgICBNYXJr
dXBBY2N1bXVsYXRvciBhY2N1bXVsYXRvcihub2Rlcywgc2hvdWxkUmVzb2x2ZVVSTHMpOwotICAg
IHNlcmlhbGl6ZU5vZGVzV2l0aE5hbWVzcGFjZXMoYWNjdW11bGF0b3IsIGNvbnN0X2Nhc3Q8Tm9k
ZSo+KG5vZGUpLCBkZWxldGVCdXR0b25Db250YWluZXJFbGVtZW50LCBjaGlsZHJlbk9ubHksIDAp
OwotICAgIHJldHVybiBhY2N1bXVsYXRvci50YWtlUmVzdWx0cygpOworICAgIHJldHVybiBhY2N1
bXVsYXRvci5zZXJpYWxpemVOb2Rlcyhjb25zdF9jYXN0PE5vZGUqPihub2RlKSwgZGVsZXRlQnV0
dG9uQ29udGFpbmVyRWxlbWVudCwgY2hpbGRyZW5Pbmx5KTsKIH0KIAogc3RhdGljIHZvaWQgZmls
bENvbnRhaW5lckZyb21TdHJpbmcoQ29udGFpbmVyTm9kZSogcGFyYWdyYXBoLCBjb25zdCBTdHJp
bmcmIHN0cmluZykK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>70930</attachid>
            <date>2010-10-15 17:33:07 -0700</date>
            <delta_ts>2010-10-15 17:49:21 -0700</delta_ts>
            <desc>fixed per Adam&apos;s &amp; Tony&apos;s comments</desc>
            <filename>bug-47749-20101015173306.patch</filename>
            <type>text/plain</type>
            <size>14574</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2OTg5NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzIgQEAKKzIwMTAtMTAtMTUgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgc2Vy
aWFsaXplTm9kZXNXaXRoTmFtZXNwYWNlcyBzaG91bGQgYmUgaW4gTWFya3VwQWNjdW11bGF0b3IK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ3NzQ5CisK
KyAgICAgICAgTW92ZWQgc2VyaWFsaXplTm9kZXNXaXRoTmFtZXNwYWNlcyB0byBNYXJrdXBBY2N1
bXVsYXRvciwgYW5kIHJlbmFtZWQgaXQgdG8gc2VyaWFsaXplTm9kZXMuCisgICAgICAgIE1hcmt1
cEFjY3VtdWxhdG9yOjpzZXJpYWxpemVOb2RlIG5vdyByZXR1cm5zIHRoZSByZXN1bHRhbnQgc3Ry
aW5nIGluc3RlYWQgb2YgaGF2aW5nIGEgc2VwYXJhdGUgdGFrZVJlc3VsdHMoKS4KKyAgICAgICAg
QWRkZWQgc2V2ZXJhbCBoZWxwZXIgZnVuY3Rpb25zIHRvIE1hcmt1cEFjY3VtdWxhdG9yLgorCisg
ICAgICAgIE5vIG5ldyB0ZXN0cyBhcmUgYWRkZWQgc2luY2UgdGhpcyBpcyBhIGNsZWFudXAuCisK
KyAgICAgICAgKiBlZGl0aW5nL01hcmt1cEFjY3VtdWxhdG9yLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjpzZXJpYWxpemVOb2Rlcyk6IFdyYXBwZXIgZm9yIHNlcmlh
bGl6ZU5vZGVzIGFuZCBjb25jYXRlbmF0ZU1hcmt1cC4KKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1
cEFjY3VtdWxhdG9yOjpzZXJpYWxpemVOb2Rlc1dpdGhOYW1lc3BhY2VzKTogTW92ZWQgZnJvbSBt
YXJrdXAuY3BwCisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kU3Rh
cnRUYWcpOiBDYWxscyBhcHBlbmRTdHJpbmcgaW5zdGVhZCBvZiBhcHBlbmRpbmcgaW50byBtX3N1
Y2NlZWRpbmdNYXJrdXAgZGlyZWN0bHkuCisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVs
YXRvcjo6YXBwZW5kRW5kVGFnKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1
bXVsYXRvcjo6dG90YWxMZW5ndGgpOiBBZGRlZDsgZXh0cmFjdGVkIGZyb20gdGFrZVJlc3VsdHMu
CisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6Y29uY2F0ZW5hdGVNYXJrdXAp
OiBEaXR0by4KKyAgICAgICAgKiBlZGl0aW5nL01hcmt1cEFjY3VtdWxhdG9yLmg6CisgICAgICAg
IChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6bGVuZ3RoKTogQWRkZWQ7IGNhbGxzIHN1bU9m
U3RyaW5nTGVuZ3Rocy4KKyAgICAgICAgKiBlZGl0aW5nL21hcmt1cC5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kU3RyaW5nKTogQWRkZWQ7IGNh
bGxzIE1hcmt1cEFjY3VtdWxhdG9yJ3MgYXBwZW5kU3RyaW5nLgorICAgICAgICAoV2ViQ29yZTo6
U3R5bGVkTWFya3VwQWNjdW11bGF0b3I6OndyYXBXaXRoU3R5bGVOb2RlKTogQ2FsbHMgYXBwZW5k
U3RyaW5nLgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVkTWFya3VwQWNjdW11bGF0b3I6OnRha2VS
ZXN1bHRzKTogQ2FsbHMgbGVuZ3RoLCBzdW1PZlN0cmluZ0xlbmd0aHMsIGFuZCBjb25jYXRlbmF0
ZU1hcmt1cHMuCisgICAgICAgIChXZWJDb3JlOjpTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6c2Vy
aWFsaXplTm9kZXMpOiBCZWNhbWUgYSBtZW1iZXIgZnVuY3Rpb24uCisgICAgICAgIChXZWJDb3Jl
OjpjcmVhdGVNYXJrdXApOiBVc2VzIE1hcmt1cEFjY3VtdWxhdG9yLgorCiAyMDEwLTEwLTE1ICBN
aWtlIExhd3RoZXIgIDxtaWtlbGF3dGhlckBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgSmFtZXMgUm9iaW5zb24uCkluZGV4OiBXZWJDb3JlL2VkaXRpbmcvTWFya3VwQWNjdW11
bGF0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZWRpdGluZy9NYXJrdXBBY2N1bXVsYXRv
ci5jcHAJKHJldmlzaW9uIDY5ODk0KQorKysgV2ViQ29yZS9lZGl0aW5nL01hcmt1cEFjY3VtdWxh
dG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQg
KEMpIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTEw
LDE3ICsxMSwxNyBAQAogICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAqCi0g
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
Ci0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCiAgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCkBA
IC04Myw2ICs4NCwzNiBAQCBNYXJrdXBBY2N1bXVsYXRvcjo6fk1hcmt1cEFjY3VtdWxhdG9yKCkK
IHsKIH0KIAorU3RyaW5nIE1hcmt1cEFjY3VtdWxhdG9yOjpzZXJpYWxpemVOb2RlcyhOb2RlKiBu
b2RlLCBOb2RlKiBub2RlVG9Ta2lwLCBFQ2hpbGRyZW5Pbmx5IGNoaWxkcmVuT25seSkKK3sKKyAg
ICBWZWN0b3I8VUNoYXI+IG91dDsKKyAgICBzZXJpYWxpemVOb2Rlc1dpdGhOYW1lc3BhY2VzKG5v
ZGUsIG5vZGVUb1NraXAsIGNoaWxkcmVuT25seSwgMCk7CisgICAgb3V0LnJlc2VydmVJbml0aWFs
Q2FwYWNpdHkobGVuZ3RoKCkpOworICAgIGNvbmNhdGVuYXRlTWFya3VwKG91dCk7CisgICAgcmV0
dXJuIFN0cmluZzo6YWRvcHQob3V0KTsKK30KKwordm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6c2Vy
aWFsaXplTm9kZXNXaXRoTmFtZXNwYWNlcyhOb2RlKiBub2RlLCBOb2RlKiBub2RlVG9Ta2lwLCBF
Q2hpbGRyZW5Pbmx5IGNoaWxkcmVuT25seSwgY29uc3QgTmFtZXNwYWNlcyogbmFtZXNwYWNlcykK
K3sKKyAgICBpZiAobm9kZSA9PSBub2RlVG9Ta2lwKQorICAgICAgICByZXR1cm47CisKKyAgICBO
YW1lc3BhY2VzIG5hbWVzcGFjZUhhc2g7CisgICAgaWYgKG5hbWVzcGFjZXMpCisgICAgICAgIG5h
bWVzcGFjZUhhc2ggPSAqbmFtZXNwYWNlczsKKworICAgIGlmICghY2hpbGRyZW5Pbmx5KQorICAg
ICAgICBhcHBlbmRTdGFydFRhZyhub2RlLCAmbmFtZXNwYWNlSGFzaCk7CisKKyAgICBpZiAoIShu
b2RlLT5kb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpICYmIGVsZW1lbnRDYW5ub3RIYXZlRW5k
VGFnKG5vZGUpKSkgeworICAgICAgICBmb3IgKE5vZGUqIGN1cnJlbnQgPSBub2RlLT5maXJzdENo
aWxkKCk7IGN1cnJlbnQ7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0U2libGluZygpKQorICAgICAg
ICAgICAgc2VyaWFsaXplTm9kZXNXaXRoTmFtZXNwYWNlcyhjdXJyZW50LCBub2RlVG9Ta2lwLCBJ
bmNsdWRlTm9kZSwgJm5hbWVzcGFjZUhhc2gpOworICAgIH0KKworICAgIGlmICghY2hpbGRyZW5P
bmx5KQorICAgICAgICBhcHBlbmRFbmRUYWcobm9kZSk7Cit9CisKIHZvaWQgTWFya3VwQWNjdW11
bGF0b3I6OmFwcGVuZFN0cmluZyhjb25zdCBTdHJpbmcmIHN0cmluZykKIHsKICAgICBtX3N1Y2Nl
ZWRpbmdNYXJrdXAuYXBwZW5kKHN0cmluZyk7CkBAIC05Miw3ICsxMjMsNyBAQCB2b2lkIE1hcmt1
cEFjY3VtdWxhdG9yOjphcHBlbmRTdGFydFRhZyhOCiB7CiAgICAgVmVjdG9yPFVDaGFyPiBtYXJr
dXA7CiAgICAgYXBwZW5kU3RhcnRNYXJrdXAobWFya3VwLCBub2RlLCBuYW1lc3BhY2VzKTsKLSAg
ICBtX3N1Y2NlZWRpbmdNYXJrdXAuYXBwZW5kKFN0cmluZzo6YWRvcHQobWFya3VwKSk7CisgICAg
YXBwZW5kU3RyaW5nKFN0cmluZzo6YWRvcHQobWFya3VwKSk7CiAgICAgaWYgKG1fbm9kZXMpCiAg
ICAgICAgIG1fbm9kZXMtPmFwcGVuZChub2RlKTsKIH0KQEAgLTEwMSwyNyArMTMyLDI0IEBAIHZv
aWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZEVuZFRhZyhOb2QKIHsKICAgICBWZWN0b3I8VUNo
YXI+IG1hcmt1cDsKICAgICBhcHBlbmRFbmRNYXJrdXAobWFya3VwLCBub2RlKTsKLSAgICBtX3N1
Y2NlZWRpbmdNYXJrdXAuYXBwZW5kKFN0cmluZzo6YWRvcHQobWFya3VwKSk7CisgICAgYXBwZW5k
U3RyaW5nKFN0cmluZzo6YWRvcHQobWFya3VwKSk7Cit9CisKK3NpemVfdCBNYXJrdXBBY2N1bXVs
YXRvcjo6dG90YWxMZW5ndGgoY29uc3QgVmVjdG9yPFN0cmluZz4mIHN0cmluZ3MpIGNvbnN0Cit7
CisgICAgc2l6ZV90IGxlbmd0aCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJp
bmdzLnNpemUoKTsgKytpKQorICAgICAgICBsZW5ndGggKz0gc3RyaW5nc1tpXS5sZW5ndGgoKTsK
KyAgICByZXR1cm4gbGVuZ3RoOwogfQogCiAvLyBGSVhNRTogVGhpcyBpcyBhIHZlcnkgaW5lZmZp
Y2llbnQgd2F5IG9mIGFjY3VtdWxhdGluZyB0aGUgbWFya3VwLgogLy8gV2UncmUgY29udmVydGlu
ZyByZXN1bHRzIG9mIGFwcGVuZFN0YXJ0TWFya3VwIGFuZCBhcHBlbmRFbmRNYXJrdXAgZnJvbSBW
ZWN0b3I8VUNoYXI+IHRvIFN0cmluZwogLy8gYW5kIHRoZW4gYmFjayB0byBWZWN0b3I8VUNoYXI+
IGFuZCBhZ2FpbiB0byBTdHJpbmcgaGVyZS4KLVN0cmluZyBNYXJrdXBBY2N1bXVsYXRvcjo6dGFr
ZVJlc3VsdHMoKQordm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6Y29uY2F0ZW5hdGVNYXJrdXAoVmVj
dG9yPFVDaGFyPiYgb3V0KQogewotICAgIHNpemVfdCBsZW5ndGggPSAwOwotCi0gICAgc2l6ZV90
IHBvc3RDb3VudCA9IG1fc3VjY2VlZGluZ01hcmt1cC5zaXplKCk7Ci0gICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBwb3N0Q291bnQ7ICsraSkKLSAgICAgICAgbGVuZ3RoICs9IG1fc3VjY2VlZGlu
Z01hcmt1cFtpXS5sZW5ndGgoKTsKLQotICAgIFZlY3RvcjxVQ2hhcj4gcmVzdWx0OwotICAgIHJl
c3VsdC5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGxlbmd0aCk7Ci0KLSAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHBvc3RDb3VudDsgKytpKQotICAgICAgICBhcHBlbmQocmVzdWx0LCBtX3N1Y2Nl
ZWRpbmdNYXJrdXBbaV0pOwotCi0gICAgcmV0dXJuIFN0cmluZzo6YWRvcHQocmVzdWx0KTsKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fc3VjY2VlZGluZ01hcmt1cC5zaXplKCk7ICsraSkK
KyAgICAgICAgYXBwZW5kKG91dCwgbV9zdWNjZWVkaW5nTWFya3VwW2ldKTsKIH0KIAogdm9pZCBN
YXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kQXR0cmlidXRlVmFsdWUoVmVjdG9yPFVDaGFyPiYgcmVz
dWx0LCBjb25zdCBTdHJpbmcmIGF0dHJpYnV0ZSwgYm9vbCBkb2N1bWVudElzSFRNTCkKSW5kZXg6
IFdlYkNvcmUvZWRpdGluZy9NYXJrdXBBY2N1bXVsYXRvci5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvZWRpdGluZy9NYXJrdXBBY2N1bXVsYXRvci5oCShyZXZpc2lvbiA2OTg5NCkKKysrIFdlYkNv
cmUvZWRpdGluZy9NYXJrdXBBY2N1bXVsYXRvci5oCSh3b3JraW5nIGNvcHkpCkBAIC02OSwxMiAr
NjksMTUgQEAgcHVibGljOgogICAgIE1hcmt1cEFjY3VtdWxhdG9yKFZlY3RvcjxOb2RlKj4qIG5v
ZGVzLCBFQWJzb2x1dGVVUkxzIHNob3VsZFJlc29sdmVVUkxzLCBjb25zdCBSYW5nZSogcmFuZ2Ug
PSAwKTsKICAgICB2aXJ0dWFsIH5NYXJrdXBBY2N1bXVsYXRvcigpOwogCisgICAgU3RyaW5nIHNl
cmlhbGl6ZU5vZGVzKE5vZGUqIG5vZGUsIE5vZGUqIG5vZGVUb1NraXAsIEVDaGlsZHJlbk9ubHkg
Y2hpbGRyZW5Pbmx5KTsKKworcHJvdGVjdGVkOgogICAgIHZvaWQgYXBwZW5kU3RyaW5nKGNvbnN0
IFN0cmluZyYpOwogICAgIHZvaWQgYXBwZW5kU3RhcnRUYWcoTm9kZSosIE5hbWVzcGFjZXMqID0g
MCk7CiAgICAgdm9pZCBhcHBlbmRFbmRUYWcoTm9kZSopOwotICAgIHZpcnR1YWwgU3RyaW5nIHRh
a2VSZXN1bHRzKCk7Ci0KLXByb3RlY3RlZDoKKyAgICBzaXplX3QgdG90YWxMZW5ndGgoY29uc3Qg
VmVjdG9yPFN0cmluZz4mKSBjb25zdDsKKyAgICBzaXplX3QgbGVuZ3RoKCkgY29uc3QgeyByZXR1
cm4gdG90YWxMZW5ndGgobV9zdWNjZWVkaW5nTWFya3VwKTsgfQorICAgIHZvaWQgY29uY2F0ZW5h
dGVNYXJrdXAoVmVjdG9yPFVDaGFyPiYgb3V0KTsKICAgICB2b2lkIGFwcGVuZEF0dHJpYnV0ZVZh
bHVlKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgU3RyaW5nJiBhdHRyaWJ1dGUsIGJvb2wg
ZG9jdW1lbnRJc0hUTUwpOwogICAgIHZvaWQgYXBwZW5kUXVvdGVkVVJMQXR0cmlidXRlVmFsdWUo
VmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBTdHJpbmcmIHVybFN0cmluZyk7CiAgICAgdm9p
ZCBhcHBlbmROb2RlVmFsdWUoVmVjdG9yPFVDaGFyPiYgb3V0LCBjb25zdCBOb2RlKiwgY29uc3Qg
UmFuZ2UqLCBFbnRpdHlNYXNrKTsKQEAgLTk5LDkgKzEwMiwxMSBAQCBwcm90ZWN0ZWQ6CiAKICAg
ICBWZWN0b3I8Tm9kZSo+KiBjb25zdCBtX25vZGVzOwogICAgIGNvbnN0IFJhbmdlKiBjb25zdCBt
X3JhbmdlOwotICAgIFZlY3RvcjxTdHJpbmc+IG1fc3VjY2VlZGluZ01hcmt1cDsKIAogcHJpdmF0
ZToKKyAgICB2b2lkIHNlcmlhbGl6ZU5vZGVzV2l0aE5hbWVzcGFjZXMoTm9kZSosIE5vZGUqIG5v
ZGVUb1NraXAsIEVDaGlsZHJlbk9ubHksIGNvbnN0IE5hbWVzcGFjZXMqKTsKKworICAgIFZlY3Rv
cjxTdHJpbmc+IG1fc3VjY2VlZGluZ01hcmt1cDsKICAgICBjb25zdCBib29sIG1fc2hvdWxkUmVz
b2x2ZVVSTHM7CiB9OwogCkluZGV4OiBXZWJDb3JlL2VkaXRpbmcvbWFya3VwLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL2VkaXRpbmcvbWFya3VwLmNwcAkocmV2aXNpb24gNjk4OTQpCisrKyBX
ZWJDb3JlL2VkaXRpbmcvbWFya3VwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTM5LDExICsxMzks
MTQgQEAgcHVibGljOgogICAgICwgbV9zaG91bGRBbm5vdGF0ZShzaG91bGRBbm5vdGF0ZSkKICAg
ICB7CiAgICAgfQorCisgICAgTm9kZSogc2VyaWFsaXplTm9kZXMoTm9kZSogc3RhcnROb2RlLCBO
b2RlKiBwYXN0RW5kKTsKKyAgICB2b2lkIGFwcGVuZFN0cmluZyhjb25zdCBTdHJpbmcmIHMpIHsg
cmV0dXJuIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRTdHJpbmcocyk7IH0KICAgICB2b2lkIHdy
YXBXaXRoTm9kZShOb2RlKiwgYm9vbCBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzID0gZmFsc2UsIFJh
bmdlRnVsbHlTZWxlY3RzTm9kZSA9IERvZXNGdWxseVNlbGVjdE5vZGUpOwogICAgIHZvaWQgd3Jh
cFdpdGhTdHlsZU5vZGUoQ1NTU3R5bGVEZWNsYXJhdGlvbiosIERvY3VtZW50KiwgYm9vbCBpc0Js
b2NrID0gZmFsc2UpOwogICAgIFN0cmluZyB0YWtlUmVzdWx0cygpOwogCi1wcm90ZWN0ZWQ6Citw
cml2YXRlOgogICAgIHZpcnR1YWwgdm9pZCBhcHBlbmRUZXh0KFZlY3RvcjxVQ2hhcj4mIG91dCwg
VGV4dCopOwogICAgIFN0cmluZyByZW5kZXJlZFRleHQoY29uc3QgTm9kZSosIGNvbnN0IFJhbmdl
Kik7CiAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlRm9yUmFuZ2UoY29uc3QgTm9kZSosIGNvbnN0IFJh
bmdlKik7CkBAIC0xNTMsNyArMTU2LDYgQEAgcHJvdGVjdGVkOgogCiAgICAgYm9vbCBzaG91bGRB
bm5vdGF0ZSgpIHsgcmV0dXJuIG1fc2hvdWxkQW5ub3RhdGUgPT0gQW5ub3RhdGVGb3JJbnRlcmNo
YW5nZTsgfQogCi1wcml2YXRlOgogICAgIFZlY3RvcjxTdHJpbmc+IG1fcmV2ZXJzZWRQcmVjZWRp
bmdNYXJrdXA7CiAgICAgY29uc3QgRUFubm90YXRlRm9ySW50ZXJjaGFuZ2UgbV9zaG91bGRBbm5v
dGF0ZTsKIH07CkBAIC0xODYsMjkgKzE4OCwxOCBAQCB2b2lkIFN0eWxlZE1hcmt1cEFjY3VtdWxh
dG9yOjp3cmFwV2l0aFN0CiAgICAgb3BlblRhZy5hcHBlbmQoJ1wiJyk7CiAgICAgb3BlblRhZy5h
cHBlbmQoJz4nKTsKICAgICBtX3JldmVyc2VkUHJlY2VkaW5nTWFya3VwLmFwcGVuZChTdHJpbmc6
OmFkb3B0KG9wZW5UYWcpKTsKLSAgICBtX3N1Y2NlZWRpbmdNYXJrdXAuYXBwZW5kKGlzQmxvY2sg
PyBkaXZDbG9zZSA6IHN0eWxlU3BhbkNsb3NlKTsKKyAgICBhcHBlbmRTdHJpbmcoaXNCbG9jayA/
IGRpdkNsb3NlIDogc3R5bGVTcGFuQ2xvc2UpOwogfQogCiBTdHJpbmcgU3R5bGVkTWFya3VwQWNj
dW11bGF0b3I6OnRha2VSZXN1bHRzKCkKIHsKLSAgICBzaXplX3QgbGVuZ3RoID0gMDsKLQotICAg
IHNpemVfdCBwcmVDb3VudCA9IG1fcmV2ZXJzZWRQcmVjZWRpbmdNYXJrdXAuc2l6ZSgpOwotICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJlQ291bnQ7ICsraSkKLSAgICAgICAgbGVuZ3RoICs9
IG1fcmV2ZXJzZWRQcmVjZWRpbmdNYXJrdXBbaV0ubGVuZ3RoKCk7Ci0KLSAgICBzaXplX3QgcG9z
dENvdW50ID0gbV9zdWNjZWVkaW5nTWFya3VwLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IHBvc3RDb3VudDsgKytpKQotICAgICAgICBsZW5ndGggKz0gbV9zdWNjZWVkaW5nTWFy
a3VwW2ldLmxlbmd0aCgpOwotCiAgICAgVmVjdG9yPFVDaGFyPiByZXN1bHQ7Ci0gICAgcmVzdWx0
LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobGVuZ3RoKTsKKyAgICByZXN1bHQucmVzZXJ2ZUluaXRp
YWxDYXBhY2l0eSh0b3RhbExlbmd0aChtX3JldmVyc2VkUHJlY2VkaW5nTWFya3VwKSArIGxlbmd0
aCgpKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSBwcmVDb3VudDsgaSA+IDA7IC0taSkKKyAgICBm
b3IgKHNpemVfdCBpID0gbV9yZXZlcnNlZFByZWNlZGluZ01hcmt1cC5zaXplKCk7IGkgPiAwOyAt
LWkpCiAgICAgICAgIGFwcGVuZChyZXN1bHQsIG1fcmV2ZXJzZWRQcmVjZWRpbmdNYXJrdXBbaSAt
IDFdKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9zdENvdW50OyArK2kpCi0gICAg
ICAgIGFwcGVuZChyZXN1bHQsIG1fc3VjY2VlZGluZ01hcmt1cFtpXSk7CisgICAgY29uY2F0ZW5h
dGVNYXJrdXAocmVzdWx0KTsKIAogICAgIHJldHVybiBTdHJpbmc6OmFkb3B0KHJlc3VsdCk7CiB9
CkBAIC0zNDIsNyArMzMzLDcgQEAgdm9pZCBTdHlsZWRNYXJrdXBBY2N1bXVsYXRvcjo6cmVtb3Zl
RXh0ZQogICAgIHN0eWxlLT5yZW1vdmVQcm9wZXJ0eShDU1NQcm9wZXJ0eUZsb2F0KTsKIH0KIAot
c3RhdGljIE5vZGUqIHNlcmlhbGl6ZU5vZGVzKFN0eWxlZE1hcmt1cEFjY3VtdWxhdG9yJiBhY2N1
bXVsYXRvciwgTm9kZSogc3RhcnROb2RlLCBOb2RlKiBwYXN0RW5kKQorTm9kZSogU3R5bGVkTWFy
a3VwQWNjdW11bGF0b3I6OnNlcmlhbGl6ZU5vZGVzKE5vZGUqIHN0YXJ0Tm9kZSwgTm9kZSogcGFz
dEVuZCkKIHsKICAgICBWZWN0b3I8Tm9kZSo+IGFuY2VzdG9yc1RvQ2xvc2U7CiAgICAgTm9kZSog
bmV4dDsKQEAgLTM3MCwxMSArMzYxLDExIEBAIHN0YXRpYyBOb2RlKiBzZXJpYWxpemVOb2RlcyhT
dHlsZWRNYXJrdXAKICAgICAgICAgICAgICAgICBuZXh0ID0gcGFzdEVuZDsKICAgICAgICAgfSBl
bHNlIHsKICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgbWFya3VwIGlmIHdlJ3Jl
IG5vdCBza2lwcGluZyB0aGUgZGVzY2VuZGFudHMKLSAgICAgICAgICAgIGFjY3VtdWxhdG9yLmFw
cGVuZFN0YXJ0VGFnKG4pOworICAgICAgICAgICAgYXBwZW5kU3RhcnRUYWcobik7CiAKICAgICAg
ICAgICAgIC8vIElmIG5vZGUgaGFzIG5vIGNoaWxkcmVuLCBjbG9zZSB0aGUgdGFnIG5vdy4KICAg
ICAgICAgICAgIGlmICghbi0+Y2hpbGROb2RlQ291bnQoKSkgewotICAgICAgICAgICAgICAgIGFj
Y3VtdWxhdG9yLmFwcGVuZEVuZFRhZyhuKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRFbmRUYWco
bik7CiAgICAgICAgICAgICAgICAgbGFzdENsb3NlZCA9IG47CiAgICAgICAgICAgICB9IGVsc2Ug
ewogICAgICAgICAgICAgICAgIG9wZW5lZFRhZyA9IHRydWU7CkBAIC0zOTEsNyArMzgyLDcgQEAg
c3RhdGljIE5vZGUqIHNlcmlhbGl6ZU5vZGVzKFN0eWxlZE1hcmt1cAogICAgICAgICAgICAgICAg
IGlmIChuZXh0ICE9IHBhc3RFbmQgJiYgbmV4dC0+aXNEZXNjZW5kYW50T2YoYW5jZXN0b3IpKQog
ICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAvLyBOb3QgYXQgdGhl
IGVuZCBvZiB0aGUgcmFuZ2UsIGNsb3NlIGFuY2VzdG9ycyB1cCB0byBzaWJsaW5nIG9mIG5leHQg
bm9kZS4KLSAgICAgICAgICAgICAgICBhY2N1bXVsYXRvci5hcHBlbmRFbmRUYWcoYW5jZXN0b3Ip
OworICAgICAgICAgICAgICAgIGFwcGVuZEVuZFRhZyhhbmNlc3Rvcik7CiAgICAgICAgICAgICAg
ICAgbGFzdENsb3NlZCA9IGFuY2VzdG9yOwogICAgICAgICAgICAgICAgIGFuY2VzdG9yc1RvQ2xv
c2UucmVtb3ZlTGFzdCgpOwogICAgICAgICAgICAgfQpAQCAtNDA2LDcgKzM5Nyw3IEBAIHN0YXRp
YyBOb2RlKiBzZXJpYWxpemVOb2RlcyhTdHlsZWRNYXJrdXAKICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAvLyBvciBiKSBhbmNlc3RvcnMgdGhh
dCB3ZSBuZXZlciBlbmNvdW50ZXJlZCBkdXJpbmcgYSBwcmUtb3JkZXIgdHJhdmVyc2FsIHN0YXJ0
aW5nIGF0IHN0YXJ0Tm9kZToKICAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHN0YXJ0Tm9kZS0+
aXNEZXNjZW5kYW50T2YocGFyZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9y
LndyYXBXaXRoTm9kZShwYXJlbnQpOworICAgICAgICAgICAgICAgICAgICB3cmFwV2l0aE5vZGUo
cGFyZW50KTsKICAgICAgICAgICAgICAgICAgICAgbGFzdENsb3NlZCA9IHBhcmVudDsKICAgICAg
ICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC02MzAsNyArNjIxLDcgQEAgU3RyaW5nIGNy
ZWF0ZU1hcmt1cChjb25zdCBSYW5nZSogcmFuZ2UsIAogCiAgICAgTm9kZSogc3BlY2lhbENvbW1v
bkFuY2VzdG9yID0gaGlnaGVzdEFuY2VzdG9yVG9XcmFwTWFya3VwKHVwZGF0ZWRSYW5nZS5nZXQo
KSwgZnVsbHlTZWxlY3RlZFJvb3QsIHNob3VsZEFubm90YXRlKTsKIAotICAgIE5vZGUqIGxhc3RD
bG9zZWQgPSBzZXJpYWxpemVOb2RlcyhhY2N1bXVsYXRvciwgc3RhcnROb2RlLCBwYXN0RW5kKTsK
KyAgICBOb2RlKiBsYXN0Q2xvc2VkID0gYWNjdW11bGF0b3Iuc2VyaWFsaXplTm9kZXMoc3RhcnRO
b2RlLCBwYXN0RW5kKTsKIAogICAgIGlmIChzcGVjaWFsQ29tbW9uQW5jZXN0b3IgJiYgbGFzdENs
b3NlZCkgewogICAgICAgICAvLyBBbHNvIGluY2x1ZGUgYWxsIG9mIHRoZSBhbmNlc3RvcnMgb2Yg
bGFzdENsb3NlZCB1cCB0byB0aGlzIHNwZWNpYWwgYW5jZXN0b3IuCkBAIC03MjYsMjcgKzcxNyw2
IEBAIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gY3JlYXRlRnJhZ20KICAgICByZXR1cm4g
ZnJhZ21lbnQucmVsZWFzZSgpOwogfQogCi1zdGF0aWMgdm9pZCBzZXJpYWxpemVOb2Rlc1dpdGhO
YW1lc3BhY2VzKE1hcmt1cEFjY3VtdWxhdG9yJiBhY2N1bXVsYXRvciwgTm9kZSogbm9kZSwgTm9k
ZSogbm9kZVRvU2tpcCwgRUNoaWxkcmVuT25seSBjaGlsZHJlbk9ubHksIGNvbnN0IE5hbWVzcGFj
ZXMqIG5hbWVzcGFjZXMpCi17Ci0gICAgaWYgKG5vZGUgPT0gbm9kZVRvU2tpcCkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgTmFtZXNwYWNlcyBuYW1lc3BhY2VIYXNoOwotICAgIGlmIChuYW1lc3Bh
Y2VzKQotICAgICAgICBuYW1lc3BhY2VIYXNoID0gKm5hbWVzcGFjZXM7Ci0KLSAgICBpZiAoIWNo
aWxkcmVuT25seSkKLSAgICAgICAgYWNjdW11bGF0b3IuYXBwZW5kU3RhcnRUYWcobm9kZSwgJm5h
bWVzcGFjZUhhc2gpOwotCi0gICAgaWYgKCEobm9kZS0+ZG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1l
bnQoKSAmJiBlbGVtZW50Q2Fubm90SGF2ZUVuZFRhZyhub2RlKSkpIHsKLSAgICAgICAgZm9yIChO
b2RlKiBjdXJyZW50ID0gbm9kZS0+Zmlyc3RDaGlsZCgpOyBjdXJyZW50OyBjdXJyZW50ID0gY3Vy
cmVudC0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgIHNlcmlhbGl6ZU5vZGVzV2l0aE5hbWVz
cGFjZXMoYWNjdW11bGF0b3IsIGN1cnJlbnQsIG5vZGVUb1NraXAsIEluY2x1ZGVOb2RlLCAmbmFt
ZXNwYWNlSGFzaCk7Ci0gICAgfQotCi0gICAgaWYgKCFjaGlsZHJlbk9ubHkpCi0gICAgICAgIGFj
Y3VtdWxhdG9yLmFwcGVuZEVuZFRhZyhub2RlKTsKLX0KLQogU3RyaW5nIGNyZWF0ZU1hcmt1cChj
b25zdCBOb2RlKiBub2RlLCBFQ2hpbGRyZW5Pbmx5IGNoaWxkcmVuT25seSwgVmVjdG9yPE5vZGUq
Piogbm9kZXMsIEVBYnNvbHV0ZVVSTHMgc2hvdWxkUmVzb2x2ZVVSTHMpCiB7CiAgICAgaWYgKCFu
b2RlKQpAQCAtNzYwLDggKzczMCw3IEBAIFN0cmluZyBjcmVhdGVNYXJrdXAoY29uc3QgTm9kZSog
bm9kZSwgRUMKICAgICB9CiAKICAgICBNYXJrdXBBY2N1bXVsYXRvciBhY2N1bXVsYXRvcihub2Rl
cywgc2hvdWxkUmVzb2x2ZVVSTHMpOwotICAgIHNlcmlhbGl6ZU5vZGVzV2l0aE5hbWVzcGFjZXMo
YWNjdW11bGF0b3IsIGNvbnN0X2Nhc3Q8Tm9kZSo+KG5vZGUpLCBkZWxldGVCdXR0b25Db250YWlu
ZXJFbGVtZW50LCBjaGlsZHJlbk9ubHksIDApOwotICAgIHJldHVybiBhY2N1bXVsYXRvci50YWtl
UmVzdWx0cygpOworICAgIHJldHVybiBhY2N1bXVsYXRvci5zZXJpYWxpemVOb2Rlcyhjb25zdF9j
YXN0PE5vZGUqPihub2RlKSwgZGVsZXRlQnV0dG9uQ29udGFpbmVyRWxlbWVudCwgY2hpbGRyZW5P
bmx5KTsKIH0KIAogc3RhdGljIHZvaWQgZmlsbENvbnRhaW5lckZyb21TdHJpbmcoQ29udGFpbmVy
Tm9kZSogcGFyYWdyYXBoLCBjb25zdCBTdHJpbmcmIHN0cmluZykK
</data>
<flag name="review"
          id="60865"
          type_id="1"
          status="+"
          setter="tony"
    />
          </attachment>
      

    </bug>

</bugzilla>