<?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>37771</bug_id>
          
          <creation_ts>2010-04-18 03:15:01 -0700</creation_ts>
          <short_desc>XMLHttpRequestUpload events do not fire when sending a raw file or FormData object</short_desc>
          <delta_ts>2010-05-05 15:46:22 -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>XML</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac (Intel)</rep_platform>
          <op_sys>OS X 10.6</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P1</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="eLod">pota</reporter>
          <assigned_to name="Jian Li">jianli</assigned_to>
          <cc>ap</cc>
    
    <cc>jchaffraix</cc>
    
    <cc>jianli</cc>
    
    <cc>steffen.weber</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>213741</commentid>
    <comment_count>0</comment_count>
    <who name="eLod">pota</who>
    <bug_when>2010-04-18 03:15:01 -0700</bug_when>
    <thetext>Webkit does not seem to fire various events (onload, onprogress) when uploading files with XMLHTTPRequest.send. I found bug https://bugs.webkit.org/show_bug.cgi?id=26979 and used FormData to send the files (I added Firefox&apos;s get/sendAsBinary way to test FF, see: https://developer.mozilla.org/en/Using_files_from_web_applications and http://blog.igstan.ro/2009/01/pure-javascript-file-upload.html, hopefully FF soon lands FormData too, so it automatically handles headers).

The test I used: http://pastie.org/925509, server side: http://pastie.org/925510. (I tested with &quot;real server&quot; with my home connection, uploading a pdf file about 700KB.)

Output with webkit (nighlty, r57720):
(0) request readystatechange: 1
(0) request start
(0) upload start
(0) request readystatechange: 2
(0) request progress: 60 / 60 = 100%
(0) request readystatechange: 3
(0) request readystatechange: 4
(0) request finished: upload success fileinput : file.pdf

The inspector shows 2.4s for the XHR.

The same test with Firefox (v3.6.3):
(0) request readystatechange: 1
(0) request readystatechange: 1
(0) request start
(0) upload start
(0) upload progress: 126361 / 693664 = 18.21645638234073%
(0) upload progress: 132601 / 693664 = 19.116027356183974%
(0) upload progress: 146841 / 693664 = 21.16889445033907%
(0) upload progress: 167321 / 693664 = 24.121332518337407%
(0) upload progress: 186177 / 693664 = 26.839651473912443%
(0) upload progress: 208281 / 693664 = 30.026208654334088%
(0) upload progress: 224665 / 693664 = 32.38815910873276%
(0) upload progress: 244097 / 693664 = 35.18951538497024%
(0) upload progress: 264369 / 693664 = 38.111967753840474%
(0) upload progress: 282009 / 693664 = 40.654985699128105%
(0) upload progress: 302489 / 693664 = 43.60742376712645%
(0) upload progress: 322969 / 693664 = 46.559861835124785%
(0) upload progress: 342561 / 693664 = 49.38428403376851%
(0) upload progress: 359833 / 693664 = 51.874250357521795%
(0) upload progress: 380313 / 693664 = 54.82668842552014%
(0) upload progress: 400793 / 693664 = 57.779126493518476%
(0) upload progress: 421273 / 693664 = 60.73156456151681%
(0) upload progress: 441753 / 693664 = 63.684002629515156%
(0) upload progress: 458137 / 693664 = 66.04595308391383%
(0) upload progress: 478617 / 693664 = 68.99839115191216%
(0) upload progress: 499097 / 693664 = 71.9508292199105%
(0) upload progress: 519577 / 693664 = 74.90326728790885%
(0) upload progress: 538041 / 693664 = 77.5650747335886%
(0) upload progress: 560537 / 693664 = 80.80814342390552%
(0) upload progress: 575441 / 693664 = 82.9567340960465%
(0) upload progress: 595961 / 693664 = 85.9149386446464%
(0) upload progress: 616233 / 693664 = 88.83739101351664%
(0) upload progress: 638361 / 693664 = 92.02740808229922%
(0) upload progress: 658841 / 693664 = 94.97984615029755%
(0) upload progress: 679321 / 693664 = 97.93228421829589%
(0) upload progress: 687513 / 693664 = 99.11325944549523%
(0) request readystatechange: 2
(0) upload finished
(0) request readystatechange: 3
(0) request readystatechange: 4
(0) request finished: upload success fileinput : file.pdf

Firebug reports 1.87s for the XHR.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213747</commentid>
    <comment_count>1</comment_count>
    <who name="eLod">pota</who>
    <bug_when>2010-04-18 04:38:52 -0700</bug_when>
    <thetext>same with nightly r57791</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213784</commentid>
    <comment_count>2</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-04-18 11:27:18 -0700</bug_when>
    <thetext>I see upload progress events when sending a string, but not with FormData indeed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218653</commentid>
    <comment_count>3</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-04-28 14:56:05 -0700</bug_when>
    <thetext>

*** This bug has been marked as a duplicate of bug 36661 ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218655</commentid>
    <comment_count>4</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-04-28 15:01:39 -0700</bug_when>
    <thetext>Bug 36661 seems to be about a general improvement to upload events, while this seems to be specific to DOMFormData. Is this indeed a duplicate?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218659</commentid>
    <comment_count>5</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-04-28 15:10:44 -0700</bug_when>
    <thetext>Yes, upload progress event for sending a raw file is broken since the patch introduced in 18654. 

No matter whether we send a file or a FormData, I only see progress event fired, not upload progress event. This happens in the recent nightly build.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218734</commentid>
    <comment_count>6</comment_count>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2010-04-28 17:55:23 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Yes, upload progress event for sending a raw file is broken since the patch
&gt; introduced in 18654. 
&gt; 
&gt; No matter whether we send a file or a FormData, I only see progress event
&gt; fired, not upload progress event. This happens in the recent nightly build.

I agree with Alexey and I don&apos;t follow your thinking. If bug 18654 broke the upload progress events - that is we do not dispatch them for each byte send - then you should file a REGRESSION bug about it and blame me.

Bug 36661 is about bringing the same behaviour as bug 18654 to upload progress events.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218739</commentid>
    <comment_count>7</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-04-28 18:08:10 -0700</bug_when>
    <thetext>Sorry I do not get what you mean for bug 18654. Let me reopen this bug as the bucket to track the upload progress event firing problem. I&apos;ve updated the bug title to reflect this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218753</commentid>
    <comment_count>8</comment_count>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2010-04-28 18:33:26 -0700</bug_when>
    <thetext>&gt; Sorry I do not get what you mean for bug 18654.

Ok, let me explain: we used to dispatch a download progress event for each byte received. The XHR2 specification is different here and states that: we should &quot;dispatch a progress event called progress about every 50ms or for every byte received, whichever is least frequent.&quot;
Matching this behaviour was the purpose of bug 18654 (bug 36661 is about bringing this same change to upload progress events).

&gt; Let me reopen this bug as the
&gt; bucket to track the upload progress event firing problem. I&apos;ve updated the bug
&gt; title to reflect this.

Thanks. You seem to say that this is a regression from bug 18654 (r56394). Maybe worth flagging it as REGRESSION and upgrading it to P1?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219222</commentid>
    <comment_count>9</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-04-29 15:45:18 -0700</bug_when>
    <thetext>This seems to be caused by r47291, specially the following change in XMLHttpRequest::createRequest():

    // We also remember whether upload events should be allowed for this request in case the upload listeners are
    // added after the request is started.
    m_uploadEventsAllowed = !isSimpleCrossOriginAccessRequest(m_method, m_requestHeaders);

We should change this check to also allow upload events for same origin request. I am going to fix this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219290</commentid>
    <comment_count>10</comment_count>
      <attachid>54758</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-04-29 17:19:13 -0700</bug_when>
    <thetext>Created attachment 54758
Proposed Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219293</commentid>
    <comment_count>11</comment_count>
      <attachid>54759</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-04-29 17:25:00 -0700</bug_when>
    <thetext>Created attachment 54759
Proposed Patch

Updated Skipped list for platforms that do not support the test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221261</commentid>
    <comment_count>12</comment_count>
      <attachid>54759</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-05-05 13:43:40 -0700</bug_when>
    <thetext>Comment on attachment 54759
Proposed Patch

Yep, it is a regression caused by http://trac.webkit.org/changeset/47291. It looks like there are other cases in which we should be sending progress events but aren&apos;t.

However, this is definitely a step in the right direction. Feel free to file a bug on the fact that we probably don&apos;t send progress events in some cases (and reference this bug) and assign it to me.

Just a few comments below. If you do any big changes (like making the test interactive, which would be cool if not too hard) to address them, then I&apos;ll be happy to re-review.

&gt; diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
&gt; +2010-04-29  Jian Li  &lt;jianli@chromium.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        XMLHttpRequestUpload events do not fire when sending a raw file or FormData object.
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=37771
&gt; +
&gt; +        Add a layout test to test upload events firing.
&gt; +
&gt; +        * http/tests/local/formdata/resources/send-form-data-common.js:
&gt; +        (dumpResponse):
&gt; +        (sendFormData):
&gt; +        (testSendingFormData):
&gt; +        * http/tests/local/formdata/script-tests/upload-events.js: Added.
&gt; +        * http/tests/local/formdata/upload-events-expected.txt: Added.
&gt; +        * http/tests/local/formdata/upload-events.html: Added.
&gt; +        * platform/gtk/Skipped:
&gt; +        * platform/qt/Skipped:
&gt; +        * platform/win/Skipped:

Per file or function comments would be nice.

For example, you told me why we are skipping the tests on several of these platforms but it would be nice to note that reason in the ChangeLog.

&gt; +
&gt;  2010-04-29  Anton Muhin  &lt;antonm@chromium.org&gt;
&gt;  
&gt;          Reviewed by Darin Adler.
&gt; diff --git a/LayoutTests/http/tests/local/formdata/resources/send-form-data-common.js b/LayoutTests/http/tests/local/formdata/resources/send-form-data-common.js

&gt; +function sendFormData(formDataList, fileSliced, sendAsAsync, xhrSetupCallback)

Consider s/xhrSetupCallback/addEventHandlers/


&gt; diff --git a/LayoutTests/http/tests/local/formdata/script-tests/upload-events.js b/LayoutTests/http/tests/local/formdata/script-tests/upload-events.js

&gt; +var progressEventFired = false;
&gt; +function progressHandler(evt)
&gt; +{
&gt; +    // Dump progress event only once in order to get consistent result.

Consider    // Dump the progress event only once in order to get a consistent result.


&gt; +function setupXMLHttpRequest(xhr, fileSliced)

Consider s/setupXMLHttpRequest/addXHREventHandlers/


&gt; +if (window.eventSender) {
&gt; +    window.jsTestIsAsync = true;
&gt; +    runTest();
&gt; +    // Clean up after ourselves
&gt; +    fileInput.parentNode.removeChild(fileInput);

Why is this needed? (I found it confusing because I didn&apos;t see it being added, but then I found that it is added by the &quot;send-form-data-common.js&quot; script.

&gt; +} else {
&gt; +    testFailed(&quot;This test is not interactive, please run using DumpRenderTree&quot;);

How hard would it be to make it interactive with instructions like &quot;Drag a file to here.&quot;?



&gt; diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
&gt; +2010-04-29  Jian Li  &lt;jianli@chromium.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        XMLHttpRequestUpload events do not fire when sending a raw file or FormData object.
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=37771
&gt; +
&gt; +        Test: http/tests/local/formdata/upload-events.html
&gt; +
&gt; +        * xml/XMLHttpRequest.cpp:
&gt; +        (WebCore::XMLHttpRequest::createRequest):

A function level comment would be nice here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221313</commentid>
    <comment_count>13</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-05-05 15:46:22 -0700</bug_when>
    <thetext>All fixed except commented ones and landed as http://trac.webkit.org/changeset/58841.

&gt; &gt; +if (window.eventSender) {
&gt; &gt; +    window.jsTestIsAsync = true;
&gt; &gt; +    runTest();
&gt; &gt; +    // Clean up after ourselves
&gt; &gt; +    fileInput.parentNode.removeChild(fileInput);
&gt; 
&gt; Why is this needed? (I found it confusing because I didn&apos;t see it being added,
&gt; but then I found that it is added by the &quot;send-form-data-common.js&quot; script.
This is because we need to exclude it from the result. I changed to put it in a helper
function and moved it to the common js file in order to avoid the confusion.

&gt; 
&gt; &gt; +} else {
&gt; &gt; +    testFailed(&quot;This test is not interactive, please run using DumpRenderTree&quot;);
&gt; 
&gt; How hard would it be to make it interactive with instructions like &quot;Drag a file
&gt; to here.&quot;?
&gt; 
I will investigate how we could make the local file test interactive.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54758</attachid>
            <date>2010-04-29 17:19:13 -0700</date>
            <delta_ts>2010-04-29 17:25:00 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>37771</filename>
            <type>text/plain</type>
            <size>7815</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCBiZWI0OWVmLi45MDAzNTk5IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAKKzIwMTAtMDQt
MjkgIEppYW4gTGkgIDxqaWFubGlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkIGV2ZW50cyBk
byBub3QgZmlyZSB3aGVuIHNlbmRpbmcgYSByYXcgZmlsZSBvciBGb3JtRGF0YSBvYmplY3QuCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNzc3MQorCisg
ICAgICAgIEFkZCBhIGxheW91dCB0ZXN0IHRvIHRlc3QgdXBsb2FkIGV2ZW50cyBmaXJpbmcuCisK
KyAgICAgICAgKiBodHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3Jlc291cmNlcy9zZW5kLWZvcm0t
ZGF0YS1jb21tb24uanM6CisgICAgICAgIChkdW1wUmVzcG9uc2UpOgorICAgICAgICAoc2VuZEZv
cm1EYXRhKToKKyAgICAgICAgKHRlc3RTZW5kaW5nRm9ybURhdGEpOgorICAgICAgICAqIGh0dHAv
dGVzdHMvbG9jYWwvZm9ybWRhdGEvc2NyaXB0LXRlc3RzL3VwbG9hZC1ldmVudHMuanM6IEFkZGVk
LgorICAgICAgICAqIGh0dHAvdGVzdHMvbG9jYWwvZm9ybWRhdGEvdXBsb2FkLWV2ZW50cy1leHBl
Y3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGh0dHAvdGVzdHMvbG9jYWwvZm9ybWRhdGEvdXBs
b2FkLWV2ZW50cy5odG1sOiBBZGRlZC4KKwogMjAxMC0wNC0yOSAgQW50b24gTXVoaW4gIDxhbnRv
bm1AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFkbGVyLgpkaWZm
IC0tZ2l0IGEvTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9sb2NhbC9mb3JtZGF0YS9yZXNvdXJjZXMv
c2VuZC1mb3JtLWRhdGEtY29tbW9uLmpzIGIvTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9sb2NhbC9m
b3JtZGF0YS9yZXNvdXJjZXMvc2VuZC1mb3JtLWRhdGEtY29tbW9uLmpzCmluZGV4IGY2Njc3MWMu
LjE3NWM3MTEgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL2h0dHAvdGVzdHMvbG9jYWwvZm9ybWRh
dGEvcmVzb3VyY2VzL3NlbmQtZm9ybS1kYXRhLWNvbW1vbi5qcworKysgYi9MYXlvdXRUZXN0cy9o
dHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3Jlc291cmNlcy9zZW5kLWZvcm0tZGF0YS1jb21tb24u
anMKQEAgLTE5LDE1ICsxOSw4IEBAIGZ1bmN0aW9uIGdldEZpbGVOYW1lKGZpbGVQYXRoKQogICAg
IHJldHVybiBmaWxlUGF0aC5zdWJzdHIoaW5kZXggKyAxKTsKIH0KIAotZnVuY3Rpb24gc2VuZEZv
cm1EYXRhKGZvcm1EYXRhTGlzdCwgZmlsZVNsaWNlZCkKK2Z1bmN0aW9uIGR1bXBSZXNwb25zZSh4
aHIsIGZpbGVTbGljZWQpCiB7Ci0gICAgdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0g
ICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3JtRGF0YUxpc3QubGVuZ3RoOyBpKyspCi0gICAgICAg
IGZvcm1EYXRhLmFwcGVuZChmb3JtRGF0YUxpc3RbaV1bJ25hbWUnXSwgZm9ybURhdGFMaXN0W2ld
Wyd2YWx1ZSddKTsKLQotICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKLSAgICB4
aHIub3BlbigiUE9TVCIsICJodHRwOi8vMTI3LjAuMC4xOjgwMDAveG1saHR0cHJlcXVlc3QvcmVz
b3VyY2VzL211bHRpcGFydC1wb3N0LWVjaG8ucGhwIiwgZmFsc2UpOwotICAgIHhoci5zZW5kKGZv
cm1EYXRhKTsKICAgICB2YXIgcmVzcG9uc2VUZXh0ID0geGhyLnJlc3BvbnNlVGV4dDsKIAogICAg
IC8vIElmIHdlJ3JlIHNlbmRpbmcgYSBzbGljZWQgZmlsZSBhbW9uZyB0aGUgRm9ybURhdGEsIGEg
dW5pcXVlbHkgZ2VuZXJhdGVkIG5hbWUgcHJlZml4ZWQgd2l0aCAiQmxvYiIgaXMgdXNlZC4KQEAg
LTM4LDcgKzMxLDI0IEBAIGZ1bmN0aW9uIHNlbmRGb3JtRGF0YShmb3JtRGF0YUxpc3QsIGZpbGVT
bGljZWQpCiAgICAgZGVidWcocmVzcG9uc2VUZXh0KTsKIH0KIAotZnVuY3Rpb24gdGVzdFNlbmRp
bmdGb3JtRGF0YShkYXRhTGlzdCkKK2Z1bmN0aW9uIHNlbmRGb3JtRGF0YShmb3JtRGF0YUxpc3Qs
IGZpbGVTbGljZWQsIHNlbmRBc0FzeW5jLCB4aHJTZXR1cENhbGxiYWNrKQoreworICAgIHZhciBm
b3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybURh
dGFMaXN0Lmxlbmd0aDsgaSsrKQorICAgICAgICBmb3JtRGF0YS5hcHBlbmQoZm9ybURhdGFMaXN0
W2ldWyduYW1lJ10sIGZvcm1EYXRhTGlzdFtpXVsndmFsdWUnXSk7CisKKyAgICB2YXIgeGhyID0g
bmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisgICAgaWYgKHhoclNldHVwQ2FsbGJhY2spCisgICAgICAg
IHhoclNldHVwQ2FsbGJhY2soeGhyLCBmaWxlU2xpY2VkKTsKKworICAgIHhoci5vcGVuKCJQT1NU
IiwgImh0dHA6Ly8xMjcuMC4wLjE6ODAwMC94bWxodHRwcmVxdWVzdC9yZXNvdXJjZXMvbXVsdGlw
YXJ0LXBvc3QtZWNoby5waHAiLCBzZW5kQXNBc3luYyk7CisgICAgeGhyLnNlbmQoZm9ybURhdGEp
OworCisgICAgaWYgKCFzZW5kQXNBc3luYykKKyAgICAgICAgZHVtcFJlc3BvbnNlKHhociwgZmls
ZVNsaWNlZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RTZW5kaW5nRm9ybURhdGEoZGF0YUxpc3QsIHNl
bmRBc0FzeW5jLCB4aHJTZXR1cENhbGxiYWNrKQogewogICAgIHZhciBmaWxlc1RvRHJhZyA9IFtd
OwogICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YUxpc3QubGVuZ3RoOyBpKyspIHsKQEAgLTc0
LDUgKzg0LDUgQEAgZnVuY3Rpb24gdGVzdFNlbmRpbmdGb3JtRGF0YShkYXRhTGlzdCkKICAgICAg
ICAgfQogICAgIH0KIAotICAgIHNlbmRGb3JtRGF0YShmb3JtRGF0YUxpc3QsIGZpbGVTbGljZWQp
OworICAgIHNlbmRGb3JtRGF0YShmb3JtRGF0YUxpc3QsIGZpbGVTbGljZWQsIHNlbmRBc0FzeW5j
LCB4aHJTZXR1cENhbGxiYWNrKTsKIH0KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2h0dHAvdGVz
dHMvbG9jYWwvZm9ybWRhdGEvc2NyaXB0LXRlc3RzL3VwbG9hZC1ldmVudHMuanMgYi9MYXlvdXRU
ZXN0cy9odHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3NjcmlwdC10ZXN0cy91cGxvYWQtZXZlbnRz
LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNjk1YzMKLS0tIC9kZXYv
bnVsbAorKysgYi9MYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3NjcmlwdC10
ZXN0cy91cGxvYWQtZXZlbnRzLmpzCkBAIC0wLDAgKzEsNjEgQEAKK2Rlc2NyaXB0aW9uKCJUZXN0
IHRoYXQgdXBsb2FkIGV2ZW50cyBhcmUgZmlyZWQgd2hlbiBzZW5kaW5nIEZvcm1EYXRhIHZpYSBY
TUxIdHRwUmVxdWVzdC4iKTsKKwordmFyIHByb2dyZXNzRXZlbnRGaXJlZCA9IGZhbHNlOworZnVu
Y3Rpb24gcHJvZ3Jlc3NIYW5kbGVyKGV2dCkKK3sKKyAgICAvLyBEdW1wIHByb2dyZXNzIGV2ZW50
IG9ubHkgb25jZSBpbiBvcmRlciB0byBnZXQgY29uc2lzdGVudCByZXN1bHQuCisgICAgaWYgKHBy
b2dyZXNzRXZlbnRGaXJlZCkKKyAgICAgICAgcmV0dXJuOworICAgIHByb2dyZXNzRXZlbnRGaXJl
ZCA9IHRydWU7CisKKyAgICBkZWJ1Zygib25wcm9ncmVzcyBldmVudCBmaXJlZCBvbiBYTUxIdHRw
UmVxdWVzdFVwbG9hZDogIiArIGV2dCk7Cit9CisKK2Z1bmN0aW9uIGxvYWRzdGFydEhhbmRsZXIo
ZXZ0KQoreworICAgIGRlYnVnKCJsb2Fkc3RhcnQgZXZlbnQgZmlyZWQgb24gWE1MSHR0cFJlcXVl
c3RVcGxvYWQ6ICIgKyBldnQpOworfQorCitmdW5jdGlvbiBsb2FkSGFuZGxlcihldnQpCit7Cisg
ICAgZGVidWcoImxvYWQgZXZlbnQgZmlyZWQgb24gWE1MSHR0cFJlcXVlc3RVcGxvYWQ6ICIgKyBl
dnQpOworfQorCitmdW5jdGlvbiByZWFkeXN0YXRlY2hhbmdlSGFuZGxlcihldnQsIHhociwgZmls
ZVNsaWNlZCkKK3sKKyAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT0geGhyLkRPTkUpIHsKKyAgICAg
ICAgZHVtcFJlc3BvbnNlKHhociwgZmlsZVNsaWNlZCk7CisgICAgICAgIGZpbmlzaEpTVGVzdCgp
OworICAgIH0KK30KKworZnVuY3Rpb24gc2V0dXBYTUxIdHRwUmVxdWVzdCh4aHIsIGZpbGVTbGlj
ZWQpCit7CisgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gcHJvZ3Jlc3NIYW5kbGVyOworICAg
IHhoci51cGxvYWQub25sb2Fkc3RhcnQgPSBsb2Fkc3RhcnRIYW5kbGVyOworICAgIHhoci51cGxv
YWQub25sb2FkID0gbG9hZEhhbmRsZXI7CisgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1
bmN0aW9uKGV2dCkgeyByZWFkeXN0YXRlY2hhbmdlSGFuZGxlcihldnQsIHhociwgZmlsZVNsaWNl
ZCk7IH07Cit9CisKK2Z1bmN0aW9uIHJ1blRlc3QoKQoreworICAgIHRlc3RTZW5kaW5nRm9ybURh
dGEoCisgICAgICAgIFsKKyAgICAgICAgICAgIHsgJ3R5cGUnOiAnc3RyaW5nJywgJ25hbWUnOiAn
c3RyaW5nMScsICd2YWx1ZSc6ICdmb28nIH0sCisgICAgICAgICAgICB7ICd0eXBlJzogJ2ZpbGUn
LCAnbmFtZSc6ICdmaWxlMScsICd2YWx1ZSc6ICcuLi9yZXNvdXJjZXMvZmlsZS1mb3ItZHJhZy10
by1zZW5kLnR4dCcgfQorICAgICAgICBdLAorICAgICAgICB0cnVlLAorICAgICAgICBzZXR1cFhN
TEh0dHBSZXF1ZXN0CisgICAgKTsKK30KKworaWYgKHdpbmRvdy5ldmVudFNlbmRlcikgeworICAg
IHdpbmRvdy5qc1Rlc3RJc0FzeW5jID0gdHJ1ZTsKKyAgICBydW5UZXN0KCk7CisgICAgLy8gQ2xl
YW4gdXAgYWZ0ZXIgb3Vyc2VsdmVzCisgICAgZmlsZUlucHV0LnBhcmVudE5vZGUucmVtb3ZlQ2hp
bGQoZmlsZUlucHV0KTsKK30gZWxzZSB7CisgICAgdGVzdEZhaWxlZCgiVGhpcyB0ZXN0IGlzIG5v
dCBpbnRlcmFjdGl2ZSwgcGxlYXNlIHJ1biB1c2luZyBEdW1wUmVuZGVyVHJlZSIpOworfQorCit2
YXIgc3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2h0
dHAvdGVzdHMvbG9jYWwvZm9ybWRhdGEvdXBsb2FkLWV2ZW50cy1leHBlY3RlZC50eHQgYi9MYXlv
dXRUZXN0cy9odHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3VwbG9hZC1ldmVudHMtZXhwZWN0ZWQu
dHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDMxOTAKLS0tIC9kZXYv
bnVsbAorKysgYi9MYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3VwbG9hZC1l
dmVudHMtZXhwZWN0ZWQudHh0CkBAIC0wLDAgKzEsMTMgQEAKK1Rlc3QgdGhhdCB1cGxvYWQgZXZl
bnRzIGFyZSBmaXJlZCB3aGVuIHNlbmRpbmcgRm9ybURhdGEgdmlhIFhNTEh0dHBSZXF1ZXN0Lgor
CitPbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBm
b2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIuCisKKworbG9hZHN0YXJ0IGV2ZW50IGZpcmVkIG9u
IFhNTEh0dHBSZXF1ZXN0VXBsb2FkOiBbb2JqZWN0IFhNTEh0dHBSZXF1ZXN0UHJvZ3Jlc3NFdmVu
dF0KK29ucHJvZ3Jlc3MgZXZlbnQgZmlyZWQgb24gWE1MSHR0cFJlcXVlc3RVcGxvYWQ6IFtvYmpl
Y3QgWE1MSHR0cFJlcXVlc3RQcm9ncmVzc0V2ZW50XQorbG9hZCBldmVudCBmaXJlZCBvbiBYTUxI
dHRwUmVxdWVzdFVwbG9hZDogW29iamVjdCBYTUxIdHRwUmVxdWVzdFByb2dyZXNzRXZlbnRdCitz
dHJpbmcxPWZvbyZmaWxlMT1maWxlLWZvci1kcmFnLXRvLXNlbmQudHh0OjEyMzQ1Njc4OTAKK1BB
U1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCmRpZmYgLS1n
aXQgYS9MYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3VwbG9hZC1ldmVudHMu
aHRtbCBiL0xheW91dFRlc3RzL2h0dHAvdGVzdHMvbG9jYWwvZm9ybWRhdGEvdXBsb2FkLWV2ZW50
cy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDFiZTkKLS0tIC9k
ZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3VwbG9h
ZC1ldmVudHMuaHRtbApAQCAtMCwwICsxLDE0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0v
L0lFVEYvL0RURCBIVE1MLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNo
ZWV0IiBocmVmPSIuLi8uLi8uLi8uLi9mYXN0L2pzL3Jlc291cmNlcy9qcy10ZXN0LXN0eWxlLmNz
cyI+Cis8c2NyaXB0IHNyYz0iLi4vLi4vLi4vLi4vZmFzdC9qcy9yZXNvdXJjZXMvanMtdGVzdC1w
cmUuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8cCBpZD0iZGVzY3JpcHRpb24iPjwv
cD4KKzxkaXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgorPHNjcmlwdCBzcmM9InJlc291cmNlcy9zZW5k
LWZvcm0tZGF0YS1jb21tb24uanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdC10ZXN0
cy91cGxvYWQtZXZlbnRzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi8uLi8uLi8uLi9m
YXN0L2pzL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9o
dG1sPgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwpp
bmRleCAyOGUxNDllLi41NmNmMTczIDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysg
Yi9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDEwLTA0LTI5ICBKaWFuIExp
ICA8amlhbmxpQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBYTUxIdHRwUmVxdWVzdFVwbG9hZCBldmVudHMgZG8gbm90IGZpcmUg
d2hlbiBzZW5kaW5nIGEgcmF3IGZpbGUgb3IgRm9ybURhdGEgb2JqZWN0LgorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mzc3NzEKKworICAgICAgICBUZXN0
OiBodHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3VwbG9hZC1ldmVudHMuaHRtbAorCisgICAgICAg
ICogeG1sL1hNTEh0dHBSZXF1ZXN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlhNTEh0dHBSZXF1
ZXN0OjpjcmVhdGVSZXF1ZXN0KToKKwogMjAxMC0wNC0yOSAgQWRhbSBCYXJ0aCAgPGFiYXJ0aEB3
ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEVyaWMgU2VpZGVsLgpkaWZmIC0tZ2l0
IGEvV2ViQ29yZS94bWwvWE1MSHR0cFJlcXVlc3QuY3BwIGIvV2ViQ29yZS94bWwvWE1MSHR0cFJl
cXVlc3QuY3BwCmluZGV4IGUzN2UxNjIuLjVjZGUyNGQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUveG1s
L1hNTEh0dHBSZXF1ZXN0LmNwcAorKysgYi9XZWJDb3JlL3htbC9YTUxIdHRwUmVxdWVzdC5jcHAK
QEAgLTUyOSw3ICs1MjksNyBAQCB2b2lkIFhNTEh0dHBSZXF1ZXN0OjpjcmVhdGVSZXF1ZXN0KEV4
Y2VwdGlvbkNvZGUmIGVjKQogCiAgICAgLy8gV2UgYWxzbyByZW1lbWJlciB3aGV0aGVyIHVwbG9h
ZCBldmVudHMgc2hvdWxkIGJlIGFsbG93ZWQgZm9yIHRoaXMgcmVxdWVzdCBpbiBjYXNlIHRoZSB1
cGxvYWQgbGlzdGVuZXJzIGFyZQogICAgIC8vIGFkZGVkIGFmdGVyIHRoZSByZXF1ZXN0IGlzIHN0
YXJ0ZWQuCi0gICAgbV91cGxvYWRFdmVudHNBbGxvd2VkID0gIWlzU2ltcGxlQ3Jvc3NPcmlnaW5B
Y2Nlc3NSZXF1ZXN0KG1fbWV0aG9kLCBtX3JlcXVlc3RIZWFkZXJzKTsKKyAgICBtX3VwbG9hZEV2
ZW50c0FsbG93ZWQgPSBtX3NhbWVPcmlnaW5SZXF1ZXN0IHx8ICFpc1NpbXBsZUNyb3NzT3JpZ2lu
QWNjZXNzUmVxdWVzdChtX21ldGhvZCwgbV9yZXF1ZXN0SGVhZGVycyk7CiAKICAgICBSZXNvdXJj
ZVJlcXVlc3QgcmVxdWVzdChtX3VybCk7CiAgICAgcmVxdWVzdC5zZXRIVFRQTWV0aG9kKG1fbWV0
aG9kKTsK
</data>
<flag name="commit-queue"
          id="38790"
          type_id="3"
          status="-"
          setter="jianli"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54759</attachid>
            <date>2010-04-29 17:25:00 -0700</date>
            <delta_ts>2010-05-05 13:43:39 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>37771_2</filename>
            <type>text/plain</type>
            <size>9562</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCBiZWI0OWVmLi4zN2RjYTEwIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTAtMDQt
MjkgIEppYW4gTGkgIDxqaWFubGlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFhNTEh0dHBSZXF1ZXN0VXBsb2FkIGV2ZW50cyBk
byBub3QgZmlyZSB3aGVuIHNlbmRpbmcgYSByYXcgZmlsZSBvciBGb3JtRGF0YSBvYmplY3QuCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNzc3MQorCisg
ICAgICAgIEFkZCBhIGxheW91dCB0ZXN0IHRvIHRlc3QgdXBsb2FkIGV2ZW50cyBmaXJpbmcuCisK
KyAgICAgICAgKiBodHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3Jlc291cmNlcy9zZW5kLWZvcm0t
ZGF0YS1jb21tb24uanM6CisgICAgICAgIChkdW1wUmVzcG9uc2UpOgorICAgICAgICAoc2VuZEZv
cm1EYXRhKToKKyAgICAgICAgKHRlc3RTZW5kaW5nRm9ybURhdGEpOgorICAgICAgICAqIGh0dHAv
dGVzdHMvbG9jYWwvZm9ybWRhdGEvc2NyaXB0LXRlc3RzL3VwbG9hZC1ldmVudHMuanM6IEFkZGVk
LgorICAgICAgICAqIGh0dHAvdGVzdHMvbG9jYWwvZm9ybWRhdGEvdXBsb2FkLWV2ZW50cy1leHBl
Y3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGh0dHAvdGVzdHMvbG9jYWwvZm9ybWRhdGEvdXBs
b2FkLWV2ZW50cy5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ndGsvU2tpcHBlZDoK
KyAgICAgICAgKiBwbGF0Zm9ybS9xdC9Ta2lwcGVkOgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9T
a2lwcGVkOgorCiAyMDEwLTA0LTI5ICBBbnRvbiBNdWhpbiAgPGFudG9ubUBjaHJvbWl1bS5vcmc+
CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCmRpZmYgLS1naXQgYS9MYXlvdXRU
ZXN0cy9odHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3Jlc291cmNlcy9zZW5kLWZvcm0tZGF0YS1j
b21tb24uanMgYi9MYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3Jlc291cmNl
cy9zZW5kLWZvcm0tZGF0YS1jb21tb24uanMKaW5kZXggZjY2NzcxYy4uMTc1YzcxMSAxMDA2NDQK
LS0tIGEvTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9sb2NhbC9mb3JtZGF0YS9yZXNvdXJjZXMvc2Vu
ZC1mb3JtLWRhdGEtY29tbW9uLmpzCisrKyBiL0xheW91dFRlc3RzL2h0dHAvdGVzdHMvbG9jYWwv
Zm9ybWRhdGEvcmVzb3VyY2VzL3NlbmQtZm9ybS1kYXRhLWNvbW1vbi5qcwpAQCAtMTksMTUgKzE5
LDggQEAgZnVuY3Rpb24gZ2V0RmlsZU5hbWUoZmlsZVBhdGgpCiAgICAgcmV0dXJuIGZpbGVQYXRo
LnN1YnN0cihpbmRleCArIDEpOwogfQogCi1mdW5jdGlvbiBzZW5kRm9ybURhdGEoZm9ybURhdGFM
aXN0LCBmaWxlU2xpY2VkKQorZnVuY3Rpb24gZHVtcFJlc3BvbnNlKHhociwgZmlsZVNsaWNlZCkK
IHsKLSAgICB2YXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBmb3IgKHZhciBpID0g
MDsgaSA8IGZvcm1EYXRhTGlzdC5sZW5ndGg7IGkrKykKLSAgICAgICAgZm9ybURhdGEuYXBwZW5k
KGZvcm1EYXRhTGlzdFtpXVsnbmFtZSddLCBmb3JtRGF0YUxpc3RbaV1bJ3ZhbHVlJ10pOwotCi0g
ICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwotICAgIHhoci5vcGVuKCJQT1NUIiwg
Imh0dHA6Ly8xMjcuMC4wLjE6ODAwMC94bWxodHRwcmVxdWVzdC9yZXNvdXJjZXMvbXVsdGlwYXJ0
LXBvc3QtZWNoby5waHAiLCBmYWxzZSk7Ci0gICAgeGhyLnNlbmQoZm9ybURhdGEpOwogICAgIHZh
ciByZXNwb25zZVRleHQgPSB4aHIucmVzcG9uc2VUZXh0OwogCiAgICAgLy8gSWYgd2UncmUgc2Vu
ZGluZyBhIHNsaWNlZCBmaWxlIGFtb25nIHRoZSBGb3JtRGF0YSwgYSB1bmlxdWVseSBnZW5lcmF0
ZWQgbmFtZSBwcmVmaXhlZCB3aXRoICJCbG9iIiBpcyB1c2VkLgpAQCAtMzgsNyArMzEsMjQgQEAg
ZnVuY3Rpb24gc2VuZEZvcm1EYXRhKGZvcm1EYXRhTGlzdCwgZmlsZVNsaWNlZCkKICAgICBkZWJ1
ZyhyZXNwb25zZVRleHQpOwogfQogCi1mdW5jdGlvbiB0ZXN0U2VuZGluZ0Zvcm1EYXRhKGRhdGFM
aXN0KQorZnVuY3Rpb24gc2VuZEZvcm1EYXRhKGZvcm1EYXRhTGlzdCwgZmlsZVNsaWNlZCwgc2Vu
ZEFzQXN5bmMsIHhoclNldHVwQ2FsbGJhY2spCit7CisgICAgdmFyIGZvcm1EYXRhID0gbmV3IEZv
cm1EYXRhKCk7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3JtRGF0YUxpc3QubGVuZ3RoOyBp
KyspCisgICAgICAgIGZvcm1EYXRhLmFwcGVuZChmb3JtRGF0YUxpc3RbaV1bJ25hbWUnXSwgZm9y
bURhdGFMaXN0W2ldWyd2YWx1ZSddKTsKKworICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVl
c3QoKTsKKyAgICBpZiAoeGhyU2V0dXBDYWxsYmFjaykKKyAgICAgICAgeGhyU2V0dXBDYWxsYmFj
ayh4aHIsIGZpbGVTbGljZWQpOworCisgICAgeGhyLm9wZW4oIlBPU1QiLCAiaHR0cDovLzEyNy4w
LjAuMTo4MDAwL3htbGh0dHByZXF1ZXN0L3Jlc291cmNlcy9tdWx0aXBhcnQtcG9zdC1lY2hvLnBo
cCIsIHNlbmRBc0FzeW5jKTsKKyAgICB4aHIuc2VuZChmb3JtRGF0YSk7CisKKyAgICBpZiAoIXNl
bmRBc0FzeW5jKQorICAgICAgICBkdW1wUmVzcG9uc2UoeGhyLCBmaWxlU2xpY2VkKTsKK30KKwor
ZnVuY3Rpb24gdGVzdFNlbmRpbmdGb3JtRGF0YShkYXRhTGlzdCwgc2VuZEFzQXN5bmMsIHhoclNl
dHVwQ2FsbGJhY2spCiB7CiAgICAgdmFyIGZpbGVzVG9EcmFnID0gW107CiAgICAgZm9yICh2YXIg
aSA9IDA7IGkgPCBkYXRhTGlzdC5sZW5ndGg7IGkrKykgewpAQCAtNzQsNSArODQsNSBAQCBmdW5j
dGlvbiB0ZXN0U2VuZGluZ0Zvcm1EYXRhKGRhdGFMaXN0KQogICAgICAgICB9CiAgICAgfQogCi0g
ICAgc2VuZEZvcm1EYXRhKGZvcm1EYXRhTGlzdCwgZmlsZVNsaWNlZCk7CisgICAgc2VuZEZvcm1E
YXRhKGZvcm1EYXRhTGlzdCwgZmlsZVNsaWNlZCwgc2VuZEFzQXN5bmMsIHhoclNldHVwQ2FsbGJh
Y2spOwogfQpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9sb2NhbC9mb3JtZGF0
YS9zY3JpcHQtdGVzdHMvdXBsb2FkLWV2ZW50cy5qcyBiL0xheW91dFRlc3RzL2h0dHAvdGVzdHMv
bG9jYWwvZm9ybWRhdGEvc2NyaXB0LXRlc3RzL3VwbG9hZC1ldmVudHMuanMKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2OTVjMwotLS0gL2Rldi9udWxsCisrKyBiL0xheW91
dFRlc3RzL2h0dHAvdGVzdHMvbG9jYWwvZm9ybWRhdGEvc2NyaXB0LXRlc3RzL3VwbG9hZC1ldmVu
dHMuanMKQEAgLTAsMCArMSw2MSBAQAorZGVzY3JpcHRpb24oIlRlc3QgdGhhdCB1cGxvYWQgZXZl
bnRzIGFyZSBmaXJlZCB3aGVuIHNlbmRpbmcgRm9ybURhdGEgdmlhIFhNTEh0dHBSZXF1ZXN0LiIp
OworCit2YXIgcHJvZ3Jlc3NFdmVudEZpcmVkID0gZmFsc2U7CitmdW5jdGlvbiBwcm9ncmVzc0hh
bmRsZXIoZXZ0KQoreworICAgIC8vIER1bXAgcHJvZ3Jlc3MgZXZlbnQgb25seSBvbmNlIGluIG9y
ZGVyIHRvIGdldCBjb25zaXN0ZW50IHJlc3VsdC4KKyAgICBpZiAocHJvZ3Jlc3NFdmVudEZpcmVk
KQorICAgICAgICByZXR1cm47CisgICAgcHJvZ3Jlc3NFdmVudEZpcmVkID0gdHJ1ZTsKKworICAg
IGRlYnVnKCJvbnByb2dyZXNzIGV2ZW50IGZpcmVkIG9uIFhNTEh0dHBSZXF1ZXN0VXBsb2FkOiAi
ICsgZXZ0KTsKK30KKworZnVuY3Rpb24gbG9hZHN0YXJ0SGFuZGxlcihldnQpCit7CisgICAgZGVi
dWcoImxvYWRzdGFydCBldmVudCBmaXJlZCBvbiBYTUxIdHRwUmVxdWVzdFVwbG9hZDogIiArIGV2
dCk7Cit9CisKK2Z1bmN0aW9uIGxvYWRIYW5kbGVyKGV2dCkKK3sKKyAgICBkZWJ1ZygibG9hZCBl
dmVudCBmaXJlZCBvbiBYTUxIdHRwUmVxdWVzdFVwbG9hZDogIiArIGV2dCk7Cit9CisKK2Z1bmN0
aW9uIHJlYWR5c3RhdGVjaGFuZ2VIYW5kbGVyKGV2dCwgeGhyLCBmaWxlU2xpY2VkKQoreworICAg
IGlmICh4aHIucmVhZHlTdGF0ZSA9PSB4aHIuRE9ORSkgeworICAgICAgICBkdW1wUmVzcG9uc2Uo
eGhyLCBmaWxlU2xpY2VkKTsKKyAgICAgICAgZmluaXNoSlNUZXN0KCk7CisgICAgfQorfQorCitm
dW5jdGlvbiBzZXR1cFhNTEh0dHBSZXF1ZXN0KHhociwgZmlsZVNsaWNlZCkKK3sKKyAgICB4aHIu
dXBsb2FkLm9ucHJvZ3Jlc3MgPSBwcm9ncmVzc0hhbmRsZXI7CisgICAgeGhyLnVwbG9hZC5vbmxv
YWRzdGFydCA9IGxvYWRzdGFydEhhbmRsZXI7CisgICAgeGhyLnVwbG9hZC5vbmxvYWQgPSBsb2Fk
SGFuZGxlcjsKKyAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oZXZ0KSB7IHJl
YWR5c3RhdGVjaGFuZ2VIYW5kbGVyKGV2dCwgeGhyLCBmaWxlU2xpY2VkKTsgfTsKK30KKworZnVu
Y3Rpb24gcnVuVGVzdCgpCit7CisgICAgdGVzdFNlbmRpbmdGb3JtRGF0YSgKKyAgICAgICAgWwor
ICAgICAgICAgICAgeyAndHlwZSc6ICdzdHJpbmcnLCAnbmFtZSc6ICdzdHJpbmcxJywgJ3ZhbHVl
JzogJ2ZvbycgfSwKKyAgICAgICAgICAgIHsgJ3R5cGUnOiAnZmlsZScsICduYW1lJzogJ2ZpbGUx
JywgJ3ZhbHVlJzogJy4uL3Jlc291cmNlcy9maWxlLWZvci1kcmFnLXRvLXNlbmQudHh0JyB9Cisg
ICAgICAgIF0sCisgICAgICAgIHRydWUsCisgICAgICAgIHNldHVwWE1MSHR0cFJlcXVlc3QKKyAg
ICApOworfQorCitpZiAod2luZG93LmV2ZW50U2VuZGVyKSB7CisgICAgd2luZG93LmpzVGVzdElz
QXN5bmMgPSB0cnVlOworICAgIHJ1blRlc3QoKTsKKyAgICAvLyBDbGVhbiB1cCBhZnRlciBvdXJz
ZWx2ZXMKKyAgICBmaWxlSW5wdXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmaWxlSW5wdXQpOwor
fSBlbHNlIHsKKyAgICB0ZXN0RmFpbGVkKCJUaGlzIHRlc3QgaXMgbm90IGludGVyYWN0aXZlLCBw
bGVhc2UgcnVuIHVzaW5nIER1bXBSZW5kZXJUcmVlIik7Cit9CisKK3ZhciBzdWNjZXNzZnVsbHlQ
YXJzZWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9sb2NhbC9m
b3JtZGF0YS91cGxvYWQtZXZlbnRzLWV4cGVjdGVkLnR4dCBiL0xheW91dFRlc3RzL2h0dHAvdGVz
dHMvbG9jYWwvZm9ybWRhdGEvdXBsb2FkLWV2ZW50cy1leHBlY3RlZC50eHQKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwMzE5MAotLS0gL2Rldi9udWxsCisrKyBiL0xheW91
dFRlc3RzL2h0dHAvdGVzdHMvbG9jYWwvZm9ybWRhdGEvdXBsb2FkLWV2ZW50cy1leHBlY3RlZC50
eHQKQEAgLTAsMCArMSwxMyBAQAorVGVzdCB0aGF0IHVwbG9hZCBldmVudHMgYXJlIGZpcmVkIHdo
ZW4gc2VuZGluZyBGb3JtRGF0YSB2aWEgWE1MSHR0cFJlcXVlc3QuCisKK09uIHN1Y2Nlc3MsIHlv
dSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNU
IENPTVBMRVRFIi4KKworCitsb2Fkc3RhcnQgZXZlbnQgZmlyZWQgb24gWE1MSHR0cFJlcXVlc3RV
cGxvYWQ6IFtvYmplY3QgWE1MSHR0cFJlcXVlc3RQcm9ncmVzc0V2ZW50XQorb25wcm9ncmVzcyBl
dmVudCBmaXJlZCBvbiBYTUxIdHRwUmVxdWVzdFVwbG9hZDogW29iamVjdCBYTUxIdHRwUmVxdWVz
dFByb2dyZXNzRXZlbnRdCitsb2FkIGV2ZW50IGZpcmVkIG9uIFhNTEh0dHBSZXF1ZXN0VXBsb2Fk
OiBbb2JqZWN0IFhNTEh0dHBSZXF1ZXN0UHJvZ3Jlc3NFdmVudF0KK3N0cmluZzE9Zm9vJmZpbGUx
PWZpbGUtZm9yLWRyYWctdG8tc2VuZC50eHQ6MTIzNDU2Nzg5MAorUEFTUyBzdWNjZXNzZnVsbHlQ
YXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKZGlmZiAtLWdpdCBhL0xheW91dFRlc3Rz
L2h0dHAvdGVzdHMvbG9jYWwvZm9ybWRhdGEvdXBsb2FkLWV2ZW50cy5odG1sIGIvTGF5b3V0VGVz
dHMvaHR0cC90ZXN0cy9sb2NhbC9mb3JtZGF0YS91cGxvYWQtZXZlbnRzLmh0bWwKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwMWJlOQotLS0gL2Rldi9udWxsCisrKyBiL0xh
eW91dFRlc3RzL2h0dHAvdGVzdHMvbG9jYWwvZm9ybWRhdGEvdXBsb2FkLWV2ZW50cy5odG1sCkBA
IC0wLDAgKzEsMTQgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwv
L0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4u
Ly4uLy4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3Qtc3R5bGUuY3NzIj4KKzxzY3JpcHQgc3Jj
PSIuLi8uLi8uLi8uLi9mYXN0L2pzL3Jlc291cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+
Cis8L2hlYWQ+Cis8Ym9keT4KKzxwIGlkPSJkZXNjcmlwdGlvbiI+PC9wPgorPGRpdiBpZD0iY29u
c29sZSI+PC9kaXY+Cis8c2NyaXB0IHNyYz0icmVzb3VyY2VzL3NlbmQtZm9ybS1kYXRhLWNvbW1v
bi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0LXRlc3RzL3VwbG9hZC1ldmVudHMu
anMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uLy4uLy4uL2Zhc3QvanMvcmVzb3VyY2Vz
L2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQg
YS9MYXlvdXRUZXN0cy9wbGF0Zm9ybS9ndGsvU2tpcHBlZCBiL0xheW91dFRlc3RzL3BsYXRmb3Jt
L2d0ay9Ta2lwcGVkCmluZGV4IDFhOWE3YWYuLjE2M2NmMTQgMTAwNjQ0Ci0tLSBhL0xheW91dFRl
c3RzL3BsYXRmb3JtL2d0ay9Ta2lwcGVkCisrKyBiL0xheW91dFRlc3RzL3BsYXRmb3JtL2d0ay9T
a2lwcGVkCkBAIC0zNDI4LDYgKzM0MjgsNyBAQCBodHRwL3Rlc3RzL2xvY2FsL3NlbmQtZHJhZ2dl
ZC1maWxlLmh0bWwKIGh0dHAvdGVzdHMvbG9jYWwvc2VuZC1zbGljZWQtZHJhZ2dlZC1maWxlLmh0
bWwKIGh0dHAvdGVzdHMvbG9jYWwvZm9ybWRhdGEvc2VuZC1mb3JtLWRhdGEuaHRtbAogaHR0cC90
ZXN0cy9sb2NhbC9mb3JtZGF0YS9zZW5kLWZvcm0tZGF0YS13aXRoLXNsaWNlZC1maWxlLmh0bWwK
K2h0dHAvdGVzdHMvbG9jYWwvZm9ybWRhdGEvdXBsb2FkLWV2ZW50cy5odG1sCiBodHRwL3Rlc3Rz
L21lZGlhL3ZpZGVvLXBsYXktc3RhbGwtc2Vlay5odG1sCiBodHRwL3Rlc3RzL21lZGlhL3ZpZGVv
LXBsYXktc3RhbGwuaHRtbAogaHR0cC90ZXN0cy9tZWRpYS92aWRlby1zZWVrYWJsZS1zdGFsbC5o
dG1sCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9wbGF0Zm9ybS9xdC9Ta2lwcGVkIGIvTGF5b3V0
VGVzdHMvcGxhdGZvcm0vcXQvU2tpcHBlZAppbmRleCBiZjU4YmMxLi4xNmFjMjNiIDEwMDY0NAot
LS0gYS9MYXlvdXRUZXN0cy9wbGF0Zm9ybS9xdC9Ta2lwcGVkCisrKyBiL0xheW91dFRlc3RzL3Bs
YXRmb3JtL3F0L1NraXBwZWQKQEAgLTUxLDYgKzUxLDcgQEAgaHR0cC90ZXN0cy9sb2NhbC9zZW5k
LWRyYWdnZWQtZmlsZS5odG1sCiBodHRwL3Rlc3RzL2xvY2FsL3NlbmQtc2xpY2VkLWRyYWdnZWQt
ZmlsZS5odG1sCiBodHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3NlbmQtZm9ybS1kYXRhLmh0bWwK
IGh0dHAvdGVzdHMvbG9jYWwvZm9ybWRhdGEvc2VuZC1mb3JtLWRhdGEtd2l0aC1zbGljZWQtZmls
ZS5odG1sCitodHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3VwbG9hZC1ldmVudHMuaHRtbAogCiAj
IEZhaWxpbmcgbmF2aWdhdGlvbiB0ZXN0cwogaHR0cC90ZXN0cy9uYXZpZ2F0aW9uL2FuY2hvci1m
cmFtZXMuaHRtbApkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL1NraXBwZWQg
Yi9MYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vU2tpcHBlZAppbmRleCA2YWFhYzcyLi41MjczZjk3
IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vU2tpcHBlZAorKysgYi9MYXlv
dXRUZXN0cy9wbGF0Zm9ybS93aW4vU2tpcHBlZApAQCAtNjc4LDYgKzY3OCw3IEBAIGh0dHAvdGVz
dHMvbG9jYWwvc2VuZC1kcmFnZ2VkLWZpbGUuaHRtbAogaHR0cC90ZXN0cy9sb2NhbC9zZW5kLXNs
aWNlZC1kcmFnZ2VkLWZpbGUuaHRtbAogaHR0cC90ZXN0cy9sb2NhbC9mb3JtZGF0YS9zZW5kLWZv
cm0tZGF0YS5odG1sCiBodHRwL3Rlc3RzL2xvY2FsL2Zvcm1kYXRhL3NlbmQtZm9ybS1kYXRhLXdp
dGgtc2xpY2VkLWZpbGUuaHRtbAoraHR0cC90ZXN0cy9sb2NhbC9mb3JtZGF0YS91cGxvYWQtZXZl
bnRzLmh0bWwKIAogIyA8aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5
Mjg5PgogcGx1Z2lucy9kZXN0cm95LWR1cmluZy1ucHAtbmV3Lmh0bWwKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMjhlMTQ5ZS4uNTZjZjE3
MyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2ViQ29yZS9DaGFuZ2VMb2cK
QEAgLTEsMyArMSwxNSBAQAorMjAxMC0wNC0yOSAgSmlhbiBMaSAgPGppYW5saUBjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgWE1M
SHR0cFJlcXVlc3RVcGxvYWQgZXZlbnRzIGRvIG5vdCBmaXJlIHdoZW4gc2VuZGluZyBhIHJhdyBm
aWxlIG9yIEZvcm1EYXRhIG9iamVjdC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTM3NzcxCisKKyAgICAgICAgVGVzdDogaHR0cC90ZXN0cy9sb2NhbC9m
b3JtZGF0YS91cGxvYWQtZXZlbnRzLmh0bWwKKworICAgICAgICAqIHhtbC9YTUxIdHRwUmVxdWVz
dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpYTUxIdHRwUmVxdWVzdDo6Y3JlYXRlUmVxdWVzdCk6
CisKIDIwMTAtMDQtMjkgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9yZz4KIAogICAgICAg
ICBSZXZpZXdlZCBieSBFcmljIFNlaWRlbC4KZGlmZiAtLWdpdCBhL1dlYkNvcmUveG1sL1hNTEh0
dHBSZXF1ZXN0LmNwcCBiL1dlYkNvcmUveG1sL1hNTEh0dHBSZXF1ZXN0LmNwcAppbmRleCBlMzdl
MTYyLi41Y2RlMjRkIDEwMDY0NAotLS0gYS9XZWJDb3JlL3htbC9YTUxIdHRwUmVxdWVzdC5jcHAK
KysrIGIvV2ViQ29yZS94bWwvWE1MSHR0cFJlcXVlc3QuY3BwCkBAIC01MjksNyArNTI5LDcgQEAg
dm9pZCBYTUxIdHRwUmVxdWVzdDo6Y3JlYXRlUmVxdWVzdChFeGNlcHRpb25Db2RlJiBlYykKIAog
ICAgIC8vIFdlIGFsc28gcmVtZW1iZXIgd2hldGhlciB1cGxvYWQgZXZlbnRzIHNob3VsZCBiZSBh
bGxvd2VkIGZvciB0aGlzIHJlcXVlc3QgaW4gY2FzZSB0aGUgdXBsb2FkIGxpc3RlbmVycyBhcmUK
ICAgICAvLyBhZGRlZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBzdGFydGVkLgotICAgIG1fdXBsb2Fk
RXZlbnRzQWxsb3dlZCA9ICFpc1NpbXBsZUNyb3NzT3JpZ2luQWNjZXNzUmVxdWVzdChtX21ldGhv
ZCwgbV9yZXF1ZXN0SGVhZGVycyk7CisgICAgbV91cGxvYWRFdmVudHNBbGxvd2VkID0gbV9zYW1l
T3JpZ2luUmVxdWVzdCB8fCAhaXNTaW1wbGVDcm9zc09yaWdpbkFjY2Vzc1JlcXVlc3QobV9tZXRo
b2QsIG1fcmVxdWVzdEhlYWRlcnMpOwogCiAgICAgUmVzb3VyY2VSZXF1ZXN0IHJlcXVlc3QobV91
cmwpOwogICAgIHJlcXVlc3Quc2V0SFRUUE1ldGhvZChtX21ldGhvZCk7Cg==
</data>
<flag name="review"
          id="38791"
          type_id="1"
          status="+"
          setter="levin"
    />
    <flag name="commit-queue"
          id="38792"
          type_id="3"
          status="-"
          setter="jianli"
    />
          </attachment>
      

    </bug>

</bugzilla>