<?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>89088</bug_id>
          
          <creation_ts>2012-06-14 03:19:37 -0700</creation_ts>
          <short_desc>Web Inspector: [WebGL] Simple implementation of the InjectedWebGLScriptSource to support capturing WebGL calls for a frame</short_desc>
          <delta_ts>2012-06-15 01:16:07 -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>Web Inspector (Deprecated)</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>88973</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Andrey Adaikin">aandrey</reporter>
          <assigned_to name="Andrey Adaikin">aandrey</assigned_to>
          <cc>apavlov</cc>
    
    <cc>bweinstein</cc>
    
    <cc>caseq</cc>
    
    <cc>eustas.bug</cc>
    
    <cc>joepeck</cc>
    
    <cc>keishi</cc>
    
    <cc>loislo</cc>
    
    <cc>pfeldman</cc>
    
    <cc>pmuellr</cc>
    
    <cc>rik</cc>
    
    <cc>timothy</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>649034</commentid>
    <comment_count>0</comment_count>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2012-06-14 03:19:37 -0700</bug_when>
    <thetext>Simple experimental implementation of the InjectedWebGLScriptSource.js that allows to wrap a WebGL context and capture names (for now) of the WebGL function calls for a frame being captured.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>649040</commentid>
    <comment_count>1</comment_count>
      <attachid>147543</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2012-06-14 03:22:25 -0700</bug_when>
    <thetext>Created attachment 147543
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>649110</commentid>
    <comment_count>2</comment_count>
      <attachid>147543</attachid>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2012-06-14 06:09:20 -0700</bug_when>
    <thetext>Comment on attachment 147543
Patch

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

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:41
&gt; +    this._lastBoundObjectId = 1;

We use 0 as initial &quot;last&quot; value and prefix increment. Otherwise the proper name would be &quot;nextBoundObjectId&quot;.

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:58
&gt; +        var nameProcessed = {};
&gt; +        nameProcessed[&quot;__proto__&quot;] = null;
&gt; +        nameProcessed[&quot;constructor&quot;] = true;

Why not use object literal for that?

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:60
&gt; +            Object.getOwnPropertyNames(o).forEach(function(name) {

Please split function definition from usage. forEach(function() { ... /* 15 lines */ }.bind(...)) is not readable. This can probably be outside of the loop.

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:66
&gt; +                if (typeof glContext[name] == &quot;function&quot;) {
&gt; +                    proxy[name] = this._wrappedFunction.bind(this, glContext, name);
&gt; +                } else {

braces are redundant.

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:81
&gt; +        proxy[&quot;__proto__&quot;] = glContext[&quot;__proto__&quot;];
&gt; +        proxy[&quot;constructor&quot;] = glContext[&quot;constructor&quot;];

why not name.field instead of name[&quot;field&quot;]?

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:93
&gt; +        var id = this._lastBoundObjectId++;

As above -- look more like nextBoundObjectId.

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:112
&gt; +    _wrappedFunction: function(glContext, functionName, var_args) {

style: { =&gt; new line. also, wrt &apos;var&apos; -- does this compile?

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:121
&gt; +            if (capturedCallsNum == 1) {
&gt; +                this._setZeroTimeouts(this._stopCapturing.bind(this, this._capturingFrameInfo));
&gt; +            }

Braces are redundant.

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:131
&gt; +        var channel = new MessageChannel();
&gt; +        channel.port1.onmessage = callback;
&gt; +        channel.port2.postMessage(&quot;&quot;);

What is this for?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>649114</commentid>
    <comment_count>3</comment_count>
      <attachid>147543</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2012-06-14 06:26:18 -0700</bug_when>
    <thetext>Comment on attachment 147543
Patch

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

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:41
&gt;&gt; +    this._lastBoundObjectId = 1;
&gt; 
&gt; We use 0 as initial &quot;last&quot; value and prefix increment. Otherwise the proper name would be &quot;nextBoundObjectId&quot;.

Done.

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:58
&gt;&gt; +        nameProcessed[&quot;constructor&quot;] = true;
&gt; 
&gt; Why not use object literal for that?

Done.

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:60
&gt;&gt; +            Object.getOwnPropertyNames(o).forEach(function(name) {
&gt; 
&gt; Please split function definition from usage. forEach(function() { ... /* 15 lines */ }.bind(...)) is not readable. This can probably be outside of the loop.

Done.

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:66
&gt;&gt; +                } else {
&gt; 
&gt; braces are redundant.

Done.

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:81
&gt;&gt; +        proxy[&quot;constructor&quot;] = glContext[&quot;constructor&quot;];
&gt; 
&gt; why not name.field instead of name[&quot;field&quot;]?

Done.

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:93
&gt;&gt; +        var id = this._lastBoundObjectId++;
&gt; 
&gt; As above -- look more like nextBoundObjectId.

Done.

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:112
&gt;&gt; +    _wrappedFunction: function(glContext, functionName, var_args) {
&gt; 
&gt; style: { =&gt; new line. also, wrt &apos;var&apos; -- does this compile?

Done. Removed var_args.

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:121
&gt;&gt; +            }
&gt; 
&gt; Braces are redundant.

Done.

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:131
&gt;&gt; +        channel.port2.postMessage(&quot;&quot;);
&gt; 
&gt; What is this for?

This is to emulate the &quot;end frame&quot; event. Later we may want some help here from the backend.
Added comments:
        // We need a fastest async callback, whatever fires first.
        // Usually a postMessage should be faster than a setTimeout(0).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>649116</commentid>
    <comment_count>4</comment_count>
      <attachid>147570</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2012-06-14 06:26:58 -0700</bug_when>
    <thetext>Created attachment 147570
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>649122</commentid>
    <comment_count>5</comment_count>
      <attachid>147570</attachid>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2012-06-14 06:40:28 -0700</bug_when>
    <thetext>Comment on attachment 147570
Patch

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

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:57
&gt; +        nameProcessed.__proto__ = null;

what&apos;s that for?

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:64
&gt; +            if (typeof glContext[name] == &quot;function&quot;)

== =&gt; ===

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:68
&gt; +                    get: function() {

{ =&gt; next line

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:71
&gt; +                    set: function(value) {

ditto

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:121
&gt; +            if (capturedCallsNum == 1)

== =&gt; ===

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:123
&gt; +            InjectedScriptHost.webGLReportFunctionCall(this._capturingFrameInfo.contextId, functionName, &quot;[&quot; + args.join(&quot;, &quot;) + &quot;]&quot;, result + &quot;&quot;);

&quot;, &quot; =&gt; &quot;,&quot;, let&apos;s be cheap :-)
result + &quot;&quot; =&gt; result.toString()? Also, what if a call returns object?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>649137</commentid>
    <comment_count>6</comment_count>
      <attachid>147570</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2012-06-14 06:55:18 -0700</bug_when>
    <thetext>Comment on attachment 147570
Patch

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

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:57
&gt;&gt; +        nameProcessed.__proto__ = null;
&gt; 
&gt; what&apos;s that for?

so that nameProcessed.constructor, nameProcessed.toString and etc. would be undefined. we do this in the InjectedScriptSource.js also.

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:64
&gt;&gt; +            if (typeof glContext[name] == &quot;function&quot;)
&gt; 
&gt; == =&gt; ===

Done.

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:68
&gt;&gt; +                    get: function() {
&gt; 
&gt; { =&gt; next line

Done.

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:71
&gt;&gt; +                    set: function(value) {
&gt; 
&gt; ditto

Done.

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:121
&gt;&gt; +            if (capturedCallsNum == 1)
&gt; 
&gt; == =&gt; ===

Done.

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:123
&gt;&gt; +            InjectedScriptHost.webGLReportFunctionCall(this._capturingFrameInfo.contextId, functionName, &quot;[&quot; + args.join(&quot;, &quot;) + &quot;]&quot;, result + &quot;&quot;);
&gt; 
&gt; &quot;, &quot; =&gt; &quot;,&quot;, let&apos;s be cheap :-)
&gt; result + &quot;&quot; =&gt; result.toString()? Also, what if a call returns object?

By all means, this is only a temporary solution, as we will need to serialize actual arguments and transport them to the front-end in order to be able to &quot;replay&quot;. Right now, for a first demo, we just want to display the names of the functions, with &quot;stubbed&quot; arguments and result.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>649138</commentid>
    <comment_count>7</comment_count>
      <attachid>147577</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2012-06-14 06:55:43 -0700</bug_when>
    <thetext>Created attachment 147577
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>649139</commentid>
    <comment_count>8</comment_count>
      <attachid>147577</attachid>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2012-06-14 06:56:51 -0700</bug_when>
    <thetext>Comment on attachment 147577
Patch

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

LGTM with one nit. Pavel?

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:57
&gt; +        nameProcessed.__proto__ = null;

Does this have any effect?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>649140</commentid>
    <comment_count>9</comment_count>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2012-06-14 07:00:01 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 147577 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=147577&amp;action=review
&gt; 
&gt; LGTM with one nit. Pavel?
&gt; 
&gt; &gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:57
&gt; &gt; +        nameProcessed.__proto__ = null;
&gt; 
&gt; Does this have any effect?

Ah, I see the intent. I think it would be better to use Object.hasOwnProperty when checking for property to be in nameProcessed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>649145</commentid>
    <comment_count>10</comment_count>
      <attachid>147577</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2012-06-14 07:07:36 -0700</bug_when>
    <thetext>Comment on attachment 147577
Patch

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

&gt;&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:57
&gt;&gt;&gt; +        nameProcessed.__proto__ = null;
&gt;&gt; 
&gt;&gt; Does this have any effect?
&gt; 
&gt; Ah, I see the intent. I think it would be better to use Object.hasOwnProperty when checking for property to be in nameProcessed

We will execute nameProcessed[&quot;hasOwnProperty&quot;]=true at some point :)
If we get rid of nameProcessed and use proxy.hasOwnProperty() instead, the same problem will arize after executing proxy.hasOwnProperty = _wrappedFunction(...)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>649168</commentid>
    <comment_count>11</comment_count>
      <attachid>147577</attachid>
    <who name="Vsevolod Vlasov">vsevik</who>
    <bug_when>2012-06-14 07:39:40 -0700</bug_when>
    <thetext>Comment on attachment 147577
Patch

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

&gt;&gt;&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:57
&gt;&gt;&gt;&gt; +        nameProcessed.__proto__ = null;
&gt;&gt;&gt; 
&gt;&gt;&gt; Does this have any effect?
&gt;&gt; 
&gt;&gt; Ah, I see the intent. I think it would be better to use Object.hasOwnProperty when checking for property to be in nameProcessed
&gt; 
&gt; We will execute nameProcessed[&quot;hasOwnProperty&quot;]=true at some point :)
&gt; If we get rid of nameProcessed and use proxy.hasOwnProperty() instead, the same problem will arize after executing proxy.hasOwnProperty = _wrappedFunction(...)

Consider using prefix for storing in nameProcessed or Object.getOwnPropertyDescriptor(object, propertyName)

&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:102
&gt; +    {

Shouldn&apos;t we check that we are not capturing already here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>649189</commentid>
    <comment_count>12</comment_count>
      <attachid>147577</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2012-06-14 08:10:03 -0700</bug_when>
    <thetext>Comment on attachment 147577
Patch

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

&gt;&gt;&gt;&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:57
&gt;&gt;&gt;&gt;&gt; +        nameProcessed.__proto__ = null;
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; Does this have any effect?
&gt;&gt;&gt; 
&gt;&gt;&gt; Ah, I see the intent. I think it would be better to use Object.hasOwnProperty when checking for property to be in nameProcessed
&gt;&gt; 
&gt;&gt; We will execute nameProcessed[&quot;hasOwnProperty&quot;]=true at some point :)
&gt;&gt; If we get rid of nameProcessed and use proxy.hasOwnProperty() instead, the same problem will arize after executing proxy.hasOwnProperty = _wrappedFunction(...)
&gt; 
&gt; Consider using prefix for storing in nameProcessed or Object.getOwnPropertyDescriptor(object, propertyName)

Yes, using prefixes is an option, and __proto__=null is another. I like the latter one, given that we already use this method in the InjectedScriptSource.js

&gt;&gt; Source/WebCore/inspector/InjectedWebGLScriptSource.js:102
&gt;&gt; +    {
&gt; 
&gt; Shouldn&apos;t we check that we are not capturing already here?

Not for now. If we add a frame-ending event to the protocol, then we will have to notify the frontend from here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>650006</commentid>
    <comment_count>13</comment_count>
      <attachid>147577</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-06-15 01:16:02 -0700</bug_when>
    <thetext>Comment on attachment 147577
Patch

Clearing flags on attachment: 147577

Committed r120421: &lt;http://trac.webkit.org/changeset/120421&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>650007</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-06-15 01:16:07 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>147543</attachid>
            <date>2012-06-14 03:22:25 -0700</date>
            <delta_ts>2012-06-14 06:26:51 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-89088-20120614142224.patch</filename>
            <type>text/plain</type>
            <size>5121</size>
            <attacher name="Andrey Adaikin">aandrey</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTIwMjk2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMmUyNzU4NTg2MTkxMTBl
Yjc1ZGE0NGUyODUxYWI0YjM3YmQzNGY4Zi4uZTM0ZDQ2YWZhNDljYzI5ZTkxMjJhNTI0MjkwNzBl
MDk4ZDUyYWFjYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE2IEBACisyMDEyLTA2LTE0ICBBbmRy
ZXkgQWRhaWtpbiAgPGFhbmRyZXlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFdlYiBJbnNwZWN0
b3I6IFtXZWJHTF0gU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJbmplY3RlZFdlYkdMU2Ny
aXB0U291cmNlIHRvIHN1cHBvcnQgY2FwdHVyaW5nIFdlYkdMIGNhbGxzIGZvciBhIGZyYW1lCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04OTA4OAorCisg
ICAgICAgIFNpbXBsZSBleHBlcmltZW50YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEluamVjdGVk
V2ViR0xTY3JpcHRTb3VyY2UuanMgdGhhdCBhbGxvd3MgdG8gd3JhcAorICAgICAgICBhIFdlYkdM
IGNvbnRleHQgYW5kIGNhcHR1cmUgbmFtZXMgKGZvciBub3cpIG9mIHRoZSBXZWJHTCBmdW5jdGlv
biBjYWxscyBmb3IgYSBmcmFtZSBiZWluZyBjYXB0dXJlZC4KKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIGluc3BlY3Rvci9JbmplY3RlZFdlYkdMU2Ny
aXB0U291cmNlLmpzOgorICAgICAgICAoLik6CisKIDIwMTItMDYtMTQgIEVkYWVuYSBTYWxpbmFz
IEphc3NvICA8ZWRhZW5hQGFwcGxlLmNvbT4KIAogICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoJ3R5
cGUnKSByZXR1cm5zICdudWxsJyB3aGVuIHNldHRpbmcgZWwudHlwZSB0byBudWxsCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5qZWN0ZWRXZWJHTFNjcmlwdFNvdXJjZS5q
cyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbmplY3RlZFdlYkdMU2NyaXB0U291cmNlLmpz
CmluZGV4IDZhNTU1NGQzMTJhMGVmMGEzMTIyZjU4ZWM1MWVjMmRkYWQ3ZGIwMmIuLmM3OTM3YTcy
MjBkMmZhZmEzNDlhMjEyOGM2ZDg4MjVhYmQ0MDkzZTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL2luc3BlY3Rvci9JbmplY3RlZFdlYkdMU2NyaXB0U291cmNlLmpzCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL2luc3BlY3Rvci9JbmplY3RlZFdlYkdMU2NyaXB0U291cmNlLmpzCkBAIC0yOCw5ICsy
OCwxMTIgQEAKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAotKGZ1bmN0aW9uKGdsQ29udGV4dCkgewor
LyoqCisgKiBAcGFyYW0ge0luamVjdGVkU2NyaXB0SG9zdH0gSW5qZWN0ZWRTY3JpcHRIb3N0Cisg
Ki8KKyhmdW5jdGlvbiAoSW5qZWN0ZWRTY3JpcHRIb3N0LCBpbnNwZWN0ZWRXaW5kb3csIGluamVj
dGVkU2NyaXB0SWQpIHsKKworLyoqCisgKiBAY29uc3RydWN0b3IKKyAqLwordmFyIEluamVjdGVk
U2NyaXB0ID0gZnVuY3Rpb24oKQoreworICAgIHRoaXMuX2xhc3RCb3VuZE9iamVjdElkID0gMTsK
KyAgICB0aGlzLl9pZFRvV3JhcHBlclByb3h5ID0ge307CisgICAgdGhpcy5faWRUb1JlYWxXZWJH
TENvbnRleHQgPSB7fTsKKyAgICB0aGlzLl9jYXB0dXJpbmdGcmFtZUluZm8gPSBudWxsOworfQor
CitJbmplY3RlZFNjcmlwdC5wcm90b3R5cGUgPSB7CisgICAgd3JhcFdlYkdMQ29udGV4dDogZnVu
Y3Rpb24oZ2xDb250ZXh0KQorICAgIHsKKyAgICAgICAgZm9yICh2YXIgaWQgaW4gdGhpcy5faWRU
b1JlYWxXZWJHTENvbnRleHQpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl9pZFRvUmVhbFdlYkdM
Q29udGV4dFtpZF0gPT09IGdsQ29udGV4dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5f
aWRUb1dyYXBwZXJQcm94eVtpZF07CisgICAgICAgIH0KKworICAgICAgICB2YXIgcHJveHkgPSB7
fTsKKyAgICAgICAgdmFyIG5hbWVQcm9jZXNzZWQgPSB7fTsKKyAgICAgICAgbmFtZVByb2Nlc3Nl
ZFsiX19wcm90b19fIl0gPSBudWxsOworICAgICAgICBuYW1lUHJvY2Vzc2VkWyJjb25zdHJ1Y3Rv
ciJdID0gdHJ1ZTsKKyAgICAgICAgZm9yICh2YXIgbyA9IGdsQ29udGV4dDsgbzsgbyA9IG8uX19w
cm90b19fKSB7CisgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5mb3JF
YWNoKGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgICAgICAgICAgICBpZiAobmFtZVByb2Nlc3NlZFtu
YW1lXSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIG5hbWVQ
cm9jZXNzZWRbbmFtZV0gPSB0cnVlOworICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZ2xDb250
ZXh0W25hbWVdID09ICJmdW5jdGlvbiIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJveHlbbmFt
ZV0gPSB0aGlzLl93cmFwcGVkRnVuY3Rpb24uYmluZCh0aGlzLCBnbENvbnRleHQsIG5hbWUpOwor
ICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZp
bmVQcm9wZXJ0eShwcm94eSwgbmFtZSwgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBm
dW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2xDb250ZXh0
W25hbWVdOworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBn
bENvbnRleHRbbmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS5iaW5k
KHRoaXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluIG9yZGVyIHRvIGVtdWxhdGUgImlu
c3RhbmNlb2YiLgorICAgICAgICBwcm94eVsiX19wcm90b19fIl0gPSBnbENvbnRleHRbIl9fcHJv
dG9fXyJdOworICAgICAgICBwcm94eVsiY29uc3RydWN0b3IiXSA9IGdsQ29udGV4dFsiY29uc3Ry
dWN0b3IiXTsKKworICAgICAgICB2YXIgY29udGV4dElkID0gdGhpcy5fZ2VuZXJhdGVPYmplY3RJ
ZCgpOworICAgICAgICB0aGlzLl9pZFRvV3JhcHBlclByb3h5W2NvbnRleHRJZF0gPSBwcm94eTsK
KyAgICAgICAgdGhpcy5faWRUb1JlYWxXZWJHTENvbnRleHRbY29udGV4dElkXSA9IGdsQ29udGV4
dDsKKyAgICAgICAgSW5qZWN0ZWRTY3JpcHRIb3N0LndlYkdMQ29udGV4dENyZWF0ZWQoY29udGV4
dElkKTsKKworICAgICAgICByZXR1cm4gcHJveHk7CisgICAgfSwKKworICAgIF9nZW5lcmF0ZU9i
amVjdElkOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB2YXIgaWQgPSB0aGlzLl9sYXN0Qm91
bmRPYmplY3RJZCsrOworICAgICAgICB2YXIgb2JqZWN0SWQgPSAie1wiaW5qZWN0ZWRTY3JpcHRJ
ZFwiOiIgKyBpbmplY3RlZFNjcmlwdElkICsgIixcIndlYkdMSWRcIjoiICsgaWQgKyAifSI7Cisg
ICAgICAgIHJldHVybiBvYmplY3RJZDsKKyAgICB9LAorCisgICAgY2FwdHVyZUZyYW1lOiBmdW5j
dGlvbihjb250ZXh0SWQpCisgICAgeworICAgICAgICB0aGlzLl9jYXB0dXJpbmdGcmFtZUluZm8g
PSB7CisgICAgICAgICAgICBjb250ZXh0SWQ6IGNvbnRleHRJZCwKKyAgICAgICAgICAgIGNhcHR1
cmVkQ2FsbHNOdW06IDAKKyAgICAgICAgfTsKKyAgICB9LAorCisgICAgX3N0b3BDYXB0dXJpbmc6
IGZ1bmN0aW9uKGluZm8pCisgICAgeworICAgICAgICBpZiAodGhpcy5fY2FwdHVyaW5nRnJhbWVJ
bmZvID09PSBpbmZvKQorICAgICAgICAgICAgdGhpcy5fY2FwdHVyaW5nRnJhbWVJbmZvID0gbnVs
bDsKKyAgICB9LAorCisgICAgX3dyYXBwZWRGdW5jdGlvbjogZnVuY3Rpb24oZ2xDb250ZXh0LCBm
dW5jdGlvbk5hbWUsIHZhcl9hcmdzKSB7CisgICAgICAgIC8vIENhbGwgcmVhbCBXZWJHTCBmdW5j
dGlvbi4KKyAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1
bWVudHMsIDIpOworICAgICAgICB2YXIgcmVzdWx0ID0gZ2xDb250ZXh0W2Z1bmN0aW9uTmFtZV0u
YXBwbHkoZ2xDb250ZXh0LCBhcmdzKTsKKworICAgICAgICBpZiAodGhpcy5fY2FwdHVyaW5nRnJh
bWVJbmZvICYmIHRoaXMuX2lkVG9SZWFsV2ViR0xDb250ZXh0W3RoaXMuX2NhcHR1cmluZ0ZyYW1l
SW5mby5jb250ZXh0SWRdID09PSBnbENvbnRleHQpIHsKKyAgICAgICAgICAgIHZhciBjYXB0dXJl
ZENhbGxzTnVtID0gKyt0aGlzLl9jYXB0dXJpbmdGcmFtZUluZm8uY2FwdHVyZWRDYWxsc051bTsK
KyAgICAgICAgICAgIGlmIChjYXB0dXJlZENhbGxzTnVtID09IDEpIHsKKyAgICAgICAgICAgICAg
ICB0aGlzLl9zZXRaZXJvVGltZW91dHModGhpcy5fc3RvcENhcHR1cmluZy5iaW5kKHRoaXMsIHRo
aXMuX2NhcHR1cmluZ0ZyYW1lSW5mbykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSW5q
ZWN0ZWRTY3JpcHRIb3N0LndlYkdMUmVwb3J0RnVuY3Rpb25DYWxsKHRoaXMuX2NhcHR1cmluZ0Zy
YW1lSW5mby5jb250ZXh0SWQsIGZ1bmN0aW9uTmFtZSwgIlsiICsgYXJncy5qb2luKCIsICIpICsg
Il0iLCByZXN1bHQgKyAiIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0Owor
ICAgIH0sCisKKyAgICBfc2V0WmVyb1RpbWVvdXRzOiBmdW5jdGlvbihjYWxsYmFjaykgeworICAg
ICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOworICAgICAgICBjaGFubmVs
LnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrOworICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RN
ZXNzYWdlKCIiKTsKKyAgICAgICAgaW5zcGVjdGVkV2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ss
IDApOworICAgIH0KK307CiAKLS8vIEZJWE1FOiBXcmFwIFdlYkdMIGNvbnRleHQgZm9yIGluc3Ry
dW1lbnRhdGlvbi4KLXJldHVybiBnbENvbnRleHQ7Cit2YXIgaW5qZWN0ZWRTY3JpcHQgPSBuZXcg
SW5qZWN0ZWRTY3JpcHQoKTsKK3JldHVybiBpbmplY3RlZFNjcmlwdDsKIAogfSkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>147570</attachid>
            <date>2012-06-14 06:26:58 -0700</date>
            <delta_ts>2012-06-14 06:55:35 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-89088-20120614172657.patch</filename>
            <type>text/plain</type>
            <size>5175</size>
            <attacher name="Andrey Adaikin">aandrey</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTIwMjk2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMmUyNzU4NTg2MTkxMTBl
Yjc1ZGE0NGUyODUxYWI0YjM3YmQzNGY4Zi4uZTM0ZDQ2YWZhNDljYzI5ZTkxMjJhNTI0MjkwNzBl
MDk4ZDUyYWFjYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE2IEBACisyMDEyLTA2LTE0ICBBbmRy
ZXkgQWRhaWtpbiAgPGFhbmRyZXlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFdlYiBJbnNwZWN0
b3I6IFtXZWJHTF0gU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJbmplY3RlZFdlYkdMU2Ny
aXB0U291cmNlIHRvIHN1cHBvcnQgY2FwdHVyaW5nIFdlYkdMIGNhbGxzIGZvciBhIGZyYW1lCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04OTA4OAorCisg
ICAgICAgIFNpbXBsZSBleHBlcmltZW50YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEluamVjdGVk
V2ViR0xTY3JpcHRTb3VyY2UuanMgdGhhdCBhbGxvd3MgdG8gd3JhcAorICAgICAgICBhIFdlYkdM
IGNvbnRleHQgYW5kIGNhcHR1cmUgbmFtZXMgKGZvciBub3cpIG9mIHRoZSBXZWJHTCBmdW5jdGlv
biBjYWxscyBmb3IgYSBmcmFtZSBiZWluZyBjYXB0dXJlZC4KKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIGluc3BlY3Rvci9JbmplY3RlZFdlYkdMU2Ny
aXB0U291cmNlLmpzOgorICAgICAgICAoLik6CisKIDIwMTItMDYtMTQgIEVkYWVuYSBTYWxpbmFz
IEphc3NvICA8ZWRhZW5hQGFwcGxlLmNvbT4KIAogICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoJ3R5
cGUnKSByZXR1cm5zICdudWxsJyB3aGVuIHNldHRpbmcgZWwudHlwZSB0byBudWxsCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5qZWN0ZWRXZWJHTFNjcmlwdFNvdXJjZS5q
cyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbmplY3RlZFdlYkdMU2NyaXB0U291cmNlLmpz
CmluZGV4IDZhNTU1NGQzMTJhMGVmMGEzMTIyZjU4ZWM1MWVjMmRkYWQ3ZGIwMmIuLjU5MTU5NGY2
MmYwYjFmYTQ2NWIxOGNjMGIwYjFhZDk5MjE2NTgwZWYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL2luc3BlY3Rvci9JbmplY3RlZFdlYkdMU2NyaXB0U291cmNlLmpzCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL2luc3BlY3Rvci9JbmplY3RlZFdlYkdMU2NyaXB0U291cmNlLmpzCkBAIC0yOCw5ICsy
OCwxMTYgQEAKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAotKGZ1bmN0aW9uKGdsQ29udGV4dCkgewor
LyoqCisgKiBAcGFyYW0ge0luamVjdGVkU2NyaXB0SG9zdH0gSW5qZWN0ZWRTY3JpcHRIb3N0Cisg
Ki8KKyhmdW5jdGlvbiAoSW5qZWN0ZWRTY3JpcHRIb3N0LCBpbnNwZWN0ZWRXaW5kb3csIGluamVj
dGVkU2NyaXB0SWQpIHsKKworLyoqCisgKiBAY29uc3RydWN0b3IKKyAqLwordmFyIEluamVjdGVk
U2NyaXB0ID0gZnVuY3Rpb24oKQoreworICAgIHRoaXMuX2xhc3RCb3VuZE9iamVjdElkID0gMDsK
KyAgICB0aGlzLl9pZFRvV3JhcHBlclByb3h5ID0ge307CisgICAgdGhpcy5faWRUb1JlYWxXZWJH
TENvbnRleHQgPSB7fTsKKyAgICB0aGlzLl9jYXB0dXJpbmdGcmFtZUluZm8gPSBudWxsOworfQor
CitJbmplY3RlZFNjcmlwdC5wcm90b3R5cGUgPSB7CisgICAgd3JhcFdlYkdMQ29udGV4dDogZnVu
Y3Rpb24oZ2xDb250ZXh0KQorICAgIHsKKyAgICAgICAgZm9yICh2YXIgaWQgaW4gdGhpcy5faWRU
b1JlYWxXZWJHTENvbnRleHQpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl9pZFRvUmVhbFdlYkdM
Q29udGV4dFtpZF0gPT09IGdsQ29udGV4dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5f
aWRUb1dyYXBwZXJQcm94eVtpZF07CisgICAgICAgIH0KKworICAgICAgICB2YXIgcHJveHkgPSB7
fTsKKyAgICAgICAgdmFyIG5hbWVQcm9jZXNzZWQgPSB7fTsKKyAgICAgICAgbmFtZVByb2Nlc3Nl
ZC5fX3Byb3RvX18gPSBudWxsOworICAgICAgICBuYW1lUHJvY2Vzc2VkLmNvbnN0cnVjdG9yID0g
dHJ1ZTsKKworICAgICAgICBmdW5jdGlvbiBwcm9jZXNzTmFtZShuYW1lKSB7CisgICAgICAgICAg
ICBpZiAobmFtZVByb2Nlc3NlZFtuYW1lXSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgICAgICBuYW1lUHJvY2Vzc2VkW25hbWVdID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmICh0eXBl
b2YgZ2xDb250ZXh0W25hbWVdID09ICJmdW5jdGlvbiIpCisgICAgICAgICAgICAgICAgcHJveHlb
bmFtZV0gPSBpbmplY3RlZFNjcmlwdC5fd3JhcHBlZEZ1bmN0aW9uLmJpbmQoaW5qZWN0ZWRTY3Jp
cHQsIGdsQ29udGV4dCwgbmFtZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
T2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3h5LCBuYW1lLCB7CisgICAgICAgICAgICAgICAgICAg
IGdldDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2xDb250
ZXh0W25hbWVdOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBz
ZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnbENvbnRleHRb
bmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0p
OworICAgICAgICB9CisKKyAgICAgICAgZm9yICh2YXIgbyA9IGdsQ29udGV4dDsgbzsgbyA9IG8u
X19wcm90b19fKQorICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobykuZm9y
RWFjaChwcm9jZXNzTmFtZSk7CisKKyAgICAgICAgLy8gSW4gb3JkZXIgdG8gZW11bGF0ZSAiaW5z
dGFuY2VvZiIuCisgICAgICAgIHByb3h5Ll9fcHJvdG9fXyA9IGdsQ29udGV4dC5fX3Byb3RvX187
CisgICAgICAgIHByb3h5LmNvbnN0cnVjdG9yID0gZ2xDb250ZXh0LmNvbnN0cnVjdG9yOworCisg
ICAgICAgIHZhciBjb250ZXh0SWQgPSB0aGlzLl9nZW5lcmF0ZU9iamVjdElkKCk7CisgICAgICAg
IHRoaXMuX2lkVG9XcmFwcGVyUHJveHlbY29udGV4dElkXSA9IHByb3h5OworICAgICAgICB0aGlz
Ll9pZFRvUmVhbFdlYkdMQ29udGV4dFtjb250ZXh0SWRdID0gZ2xDb250ZXh0OworICAgICAgICBJ
bmplY3RlZFNjcmlwdEhvc3Qud2ViR0xDb250ZXh0Q3JlYXRlZChjb250ZXh0SWQpOworCisgICAg
ICAgIHJldHVybiBwcm94eTsKKyAgICB9LAorCisgICAgX2dlbmVyYXRlT2JqZWN0SWQ6IGZ1bmN0
aW9uKCkKKyAgICB7CisgICAgICAgIHZhciBpZCA9ICsrdGhpcy5fbGFzdEJvdW5kT2JqZWN0SWQ7
CisgICAgICAgIHZhciBvYmplY3RJZCA9ICJ7XCJpbmplY3RlZFNjcmlwdElkXCI6IiArIGluamVj
dGVkU2NyaXB0SWQgKyAiLFwid2ViR0xJZFwiOiIgKyBpZCArICJ9IjsKKyAgICAgICAgcmV0dXJu
IG9iamVjdElkOworICAgIH0sCisKKyAgICBjYXB0dXJlRnJhbWU6IGZ1bmN0aW9uKGNvbnRleHRJ
ZCkKKyAgICB7CisgICAgICAgIHRoaXMuX2NhcHR1cmluZ0ZyYW1lSW5mbyA9IHsKKyAgICAgICAg
ICAgIGNvbnRleHRJZDogY29udGV4dElkLAorICAgICAgICAgICAgY2FwdHVyZWRDYWxsc051bTog
MAorICAgICAgICB9OworICAgIH0sCisKKyAgICBfc3RvcENhcHR1cmluZzogZnVuY3Rpb24oaW5m
bykKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9jYXB0dXJpbmdGcmFtZUluZm8gPT09IGluZm8p
CisgICAgICAgICAgICB0aGlzLl9jYXB0dXJpbmdGcmFtZUluZm8gPSBudWxsOworICAgIH0sCisK
KyAgICBfd3JhcHBlZEZ1bmN0aW9uOiBmdW5jdGlvbihnbENvbnRleHQsIGZ1bmN0aW9uTmFtZSkK
KyAgICB7CisgICAgICAgIC8vIENhbGwgcmVhbCBXZWJHTCBmdW5jdGlvbi4KKyAgICAgICAgdmFy
IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOworICAgICAg
ICB2YXIgcmVzdWx0ID0gZ2xDb250ZXh0W2Z1bmN0aW9uTmFtZV0uYXBwbHkoZ2xDb250ZXh0LCBh
cmdzKTsKKworICAgICAgICBpZiAodGhpcy5fY2FwdHVyaW5nRnJhbWVJbmZvICYmIHRoaXMuX2lk
VG9SZWFsV2ViR0xDb250ZXh0W3RoaXMuX2NhcHR1cmluZ0ZyYW1lSW5mby5jb250ZXh0SWRdID09
PSBnbENvbnRleHQpIHsKKyAgICAgICAgICAgIHZhciBjYXB0dXJlZENhbGxzTnVtID0gKyt0aGlz
Ll9jYXB0dXJpbmdGcmFtZUluZm8uY2FwdHVyZWRDYWxsc051bTsKKyAgICAgICAgICAgIGlmIChj
YXB0dXJlZENhbGxzTnVtID09IDEpCisgICAgICAgICAgICAgICAgdGhpcy5fc2V0WmVyb1RpbWVv
dXRzKHRoaXMuX3N0b3BDYXB0dXJpbmcuYmluZCh0aGlzLCB0aGlzLl9jYXB0dXJpbmdGcmFtZUlu
Zm8pKTsKKyAgICAgICAgICAgIEluamVjdGVkU2NyaXB0SG9zdC53ZWJHTFJlcG9ydEZ1bmN0aW9u
Q2FsbCh0aGlzLl9jYXB0dXJpbmdGcmFtZUluZm8uY29udGV4dElkLCBmdW5jdGlvbk5hbWUsICJb
IiArIGFyZ3Muam9pbigiLCAiKSArICJdIiwgcmVzdWx0ICsgIiIpOworICAgICAgICB9CisKKyAg
ICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9LAorCisgICAgX3NldFplcm9UaW1lb3V0czogZnVu
Y3Rpb24oY2FsbGJhY2spCisgICAgeworICAgICAgICAvLyBXZSBuZWVkIGEgZmFzdGVzdCBhc3lu
YyBjYWxsYmFjaywgd2hhdGV2ZXIgZmlyZXMgZmlyc3QuCisgICAgICAgIC8vIFVzdWFsbHkgYSBw
b3N0TWVzc2FnZSBzaG91bGQgYmUgZmFzdGVyIHRoYW4gYSBzZXRUaW1lb3V0KDApLgorICAgICAg
ICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOworICAgICAgICBjaGFubmVsLnBv
cnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrOworICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNz
YWdlKCIiKTsKKyAgICAgICAgaW5zcGVjdGVkV2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDAp
OworICAgIH0KK307CiAKLS8vIEZJWE1FOiBXcmFwIFdlYkdMIGNvbnRleHQgZm9yIGluc3RydW1l
bnRhdGlvbi4KLXJldHVybiBnbENvbnRleHQ7Cit2YXIgaW5qZWN0ZWRTY3JpcHQgPSBuZXcgSW5q
ZWN0ZWRTY3JpcHQoKTsKK3JldHVybiBpbmplY3RlZFNjcmlwdDsKIAogfSkK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>147577</attachid>
            <date>2012-06-14 06:55:43 -0700</date>
            <delta_ts>2012-06-15 01:16:02 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-89088-20120614175542.patch</filename>
            <type>text/plain</type>
            <size>5219</size>
            <attacher name="Andrey Adaikin">aandrey</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTIwMjk2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMmUyNzU4NTg2MTkxMTBl
Yjc1ZGE0NGUyODUxYWI0YjM3YmQzNGY4Zi4uZTM0ZDQ2YWZhNDljYzI5ZTkxMjJhNTI0MjkwNzBl
MDk4ZDUyYWFjYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE2IEBACisyMDEyLTA2LTE0ICBBbmRy
ZXkgQWRhaWtpbiAgPGFhbmRyZXlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFdlYiBJbnNwZWN0
b3I6IFtXZWJHTF0gU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJbmplY3RlZFdlYkdMU2Ny
aXB0U291cmNlIHRvIHN1cHBvcnQgY2FwdHVyaW5nIFdlYkdMIGNhbGxzIGZvciBhIGZyYW1lCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04OTA4OAorCisg
ICAgICAgIFNpbXBsZSBleHBlcmltZW50YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEluamVjdGVk
V2ViR0xTY3JpcHRTb3VyY2UuanMgdGhhdCBhbGxvd3MgdG8gd3JhcAorICAgICAgICBhIFdlYkdM
IGNvbnRleHQgYW5kIGNhcHR1cmUgbmFtZXMgKGZvciBub3cpIG9mIHRoZSBXZWJHTCBmdW5jdGlv
biBjYWxscyBmb3IgYSBmcmFtZSBiZWluZyBjYXB0dXJlZC4KKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIGluc3BlY3Rvci9JbmplY3RlZFdlYkdMU2Ny
aXB0U291cmNlLmpzOgorICAgICAgICAoLik6CisKIDIwMTItMDYtMTQgIEVkYWVuYSBTYWxpbmFz
IEphc3NvICA8ZWRhZW5hQGFwcGxlLmNvbT4KIAogICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoJ3R5
cGUnKSByZXR1cm5zICdudWxsJyB3aGVuIHNldHRpbmcgZWwudHlwZSB0byBudWxsCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5qZWN0ZWRXZWJHTFNjcmlwdFNvdXJjZS5q
cyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbmplY3RlZFdlYkdMU2NyaXB0U291cmNlLmpz
CmluZGV4IDZhNTU1NGQzMTJhMGVmMGEzMTIyZjU4ZWM1MWVjMmRkYWQ3ZGIwMmIuLjQ0ODRiNjk4
YzVmYWZlYWM4ZjAyYzQ0MzgzNmY1OWIwMjE3ZDA3YzcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL2luc3BlY3Rvci9JbmplY3RlZFdlYkdMU2NyaXB0U291cmNlLmpzCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL2luc3BlY3Rvci9JbmplY3RlZFdlYkdMU2NyaXB0U291cmNlLmpzCkBAIC0yOCw5ICsy
OCwxMTggQEAKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAotKGZ1bmN0aW9uKGdsQ29udGV4dCkgewor
LyoqCisgKiBAcGFyYW0ge0luamVjdGVkU2NyaXB0SG9zdH0gSW5qZWN0ZWRTY3JpcHRIb3N0Cisg
Ki8KKyhmdW5jdGlvbiAoSW5qZWN0ZWRTY3JpcHRIb3N0LCBpbnNwZWN0ZWRXaW5kb3csIGluamVj
dGVkU2NyaXB0SWQpIHsKKworLyoqCisgKiBAY29uc3RydWN0b3IKKyAqLwordmFyIEluamVjdGVk
U2NyaXB0ID0gZnVuY3Rpb24oKQoreworICAgIHRoaXMuX2xhc3RCb3VuZE9iamVjdElkID0gMDsK
KyAgICB0aGlzLl9pZFRvV3JhcHBlclByb3h5ID0ge307CisgICAgdGhpcy5faWRUb1JlYWxXZWJH
TENvbnRleHQgPSB7fTsKKyAgICB0aGlzLl9jYXB0dXJpbmdGcmFtZUluZm8gPSBudWxsOworfQor
CitJbmplY3RlZFNjcmlwdC5wcm90b3R5cGUgPSB7CisgICAgd3JhcFdlYkdMQ29udGV4dDogZnVu
Y3Rpb24oZ2xDb250ZXh0KQorICAgIHsKKyAgICAgICAgZm9yICh2YXIgaWQgaW4gdGhpcy5faWRU
b1JlYWxXZWJHTENvbnRleHQpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl9pZFRvUmVhbFdlYkdM
Q29udGV4dFtpZF0gPT09IGdsQ29udGV4dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5f
aWRUb1dyYXBwZXJQcm94eVtpZF07CisgICAgICAgIH0KKworICAgICAgICB2YXIgcHJveHkgPSB7
fTsKKyAgICAgICAgdmFyIG5hbWVQcm9jZXNzZWQgPSB7fTsKKyAgICAgICAgbmFtZVByb2Nlc3Nl
ZC5fX3Byb3RvX18gPSBudWxsOworICAgICAgICBuYW1lUHJvY2Vzc2VkLmNvbnN0cnVjdG9yID0g
dHJ1ZTsKKworICAgICAgICBmdW5jdGlvbiBwcm9jZXNzTmFtZShuYW1lKSB7CisgICAgICAgICAg
ICBpZiAobmFtZVByb2Nlc3NlZFtuYW1lXSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgICAgICBuYW1lUHJvY2Vzc2VkW25hbWVdID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmICh0eXBl
b2YgZ2xDb250ZXh0W25hbWVdID09PSAiZnVuY3Rpb24iKQorICAgICAgICAgICAgICAgIHByb3h5
W25hbWVdID0gaW5qZWN0ZWRTY3JpcHQuX3dyYXBwZWRGdW5jdGlvbi5iaW5kKGluamVjdGVkU2Ny
aXB0LCBnbENvbnRleHQsIG5hbWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg
IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm94eSwgbmFtZSwgeworICAgICAgICAgICAgICAgICAg
ICBnZXQ6IGZ1bmN0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGdsQ29udGV4dFtuYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgfSwK
KyAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkKKyAgICAgICAgICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2xDb250ZXh0W25hbWVdID0gdmFsdWU7
CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQor
CisgICAgICAgIGZvciAodmFyIG8gPSBnbENvbnRleHQ7IG87IG8gPSBvLl9fcHJvdG9fXykKKyAg
ICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pLmZvckVhY2gocHJvY2Vzc05h
bWUpOworCisgICAgICAgIC8vIEluIG9yZGVyIHRvIGVtdWxhdGUgImluc3RhbmNlb2YiLgorICAg
ICAgICBwcm94eS5fX3Byb3RvX18gPSBnbENvbnRleHQuX19wcm90b19fOworICAgICAgICBwcm94
eS5jb25zdHJ1Y3RvciA9IGdsQ29udGV4dC5jb25zdHJ1Y3RvcjsKKworICAgICAgICB2YXIgY29u
dGV4dElkID0gdGhpcy5fZ2VuZXJhdGVPYmplY3RJZCgpOworICAgICAgICB0aGlzLl9pZFRvV3Jh
cHBlclByb3h5W2NvbnRleHRJZF0gPSBwcm94eTsKKyAgICAgICAgdGhpcy5faWRUb1JlYWxXZWJH
TENvbnRleHRbY29udGV4dElkXSA9IGdsQ29udGV4dDsKKyAgICAgICAgSW5qZWN0ZWRTY3JpcHRI
b3N0LndlYkdMQ29udGV4dENyZWF0ZWQoY29udGV4dElkKTsKKworICAgICAgICByZXR1cm4gcHJv
eHk7CisgICAgfSwKKworICAgIF9nZW5lcmF0ZU9iamVjdElkOiBmdW5jdGlvbigpCisgICAgewor
ICAgICAgICB2YXIgaWQgPSArK3RoaXMuX2xhc3RCb3VuZE9iamVjdElkOworICAgICAgICB2YXIg
b2JqZWN0SWQgPSAie1wiaW5qZWN0ZWRTY3JpcHRJZFwiOiIgKyBpbmplY3RlZFNjcmlwdElkICsg
IixcIndlYkdMSWRcIjoiICsgaWQgKyAifSI7CisgICAgICAgIHJldHVybiBvYmplY3RJZDsKKyAg
ICB9LAorCisgICAgY2FwdHVyZUZyYW1lOiBmdW5jdGlvbihjb250ZXh0SWQpCisgICAgeworICAg
ICAgICB0aGlzLl9jYXB0dXJpbmdGcmFtZUluZm8gPSB7CisgICAgICAgICAgICBjb250ZXh0SWQ6
IGNvbnRleHRJZCwKKyAgICAgICAgICAgIGNhcHR1cmVkQ2FsbHNOdW06IDAKKyAgICAgICAgfTsK
KyAgICB9LAorCisgICAgX3N0b3BDYXB0dXJpbmc6IGZ1bmN0aW9uKGluZm8pCisgICAgeworICAg
ICAgICBpZiAodGhpcy5fY2FwdHVyaW5nRnJhbWVJbmZvID09PSBpbmZvKQorICAgICAgICAgICAg
dGhpcy5fY2FwdHVyaW5nRnJhbWVJbmZvID0gbnVsbDsKKyAgICB9LAorCisgICAgX3dyYXBwZWRG
dW5jdGlvbjogZnVuY3Rpb24oZ2xDb250ZXh0LCBmdW5jdGlvbk5hbWUpCisgICAgeworICAgICAg
ICAvLyBDYWxsIHJlYWwgV2ViR0wgZnVuY3Rpb24uCisgICAgICAgIHZhciBhcmdzID0gQXJyYXku
cHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKKyAgICAgICAgdmFyIHJlc3VsdCA9
IGdsQ29udGV4dFtmdW5jdGlvbk5hbWVdLmFwcGx5KGdsQ29udGV4dCwgYXJncyk7CisKKyAgICAg
ICAgaWYgKHRoaXMuX2NhcHR1cmluZ0ZyYW1lSW5mbyAmJiB0aGlzLl9pZFRvUmVhbFdlYkdMQ29u
dGV4dFt0aGlzLl9jYXB0dXJpbmdGcmFtZUluZm8uY29udGV4dElkXSA9PT0gZ2xDb250ZXh0KSB7
CisgICAgICAgICAgICB2YXIgY2FwdHVyZWRDYWxsc051bSA9ICsrdGhpcy5fY2FwdHVyaW5nRnJh
bWVJbmZvLmNhcHR1cmVkQ2FsbHNOdW07CisgICAgICAgICAgICBpZiAoY2FwdHVyZWRDYWxsc051
bSA9PT0gMSkKKyAgICAgICAgICAgICAgICB0aGlzLl9zZXRaZXJvVGltZW91dHModGhpcy5fc3Rv
cENhcHR1cmluZy5iaW5kKHRoaXMsIHRoaXMuX2NhcHR1cmluZ0ZyYW1lSW5mbykpOworICAgICAg
ICAgICAgSW5qZWN0ZWRTY3JpcHRIb3N0LndlYkdMUmVwb3J0RnVuY3Rpb25DYWxsKHRoaXMuX2Nh
cHR1cmluZ0ZyYW1lSW5mby5jb250ZXh0SWQsIGZ1bmN0aW9uTmFtZSwgIlsiICsgYXJncy5qb2lu
KCIsICIpICsgIl0iLCByZXN1bHQgKyAiIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4g
cmVzdWx0OworICAgIH0sCisKKyAgICBfc2V0WmVyb1RpbWVvdXRzOiBmdW5jdGlvbihjYWxsYmFj
aykKKyAgICB7CisgICAgICAgIC8vIFdlIG5lZWQgYSBmYXN0ZXN0IGFzeW5jIGNhbGxiYWNrLCB3
aGF0ZXZlciBmaXJlcyBmaXJzdC4KKyAgICAgICAgLy8gVXN1YWxseSBhIHBvc3RNZXNzYWdlIHNo
b3VsZCBiZSBmYXN0ZXIgdGhhbiBhIHNldFRpbWVvdXQoMCkuCisgICAgICAgIHZhciBjaGFubmVs
ID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7CisgICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdl
ID0gY2FsbGJhY2s7CisgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoIiIpOworICAg
ICAgICBpbnNwZWN0ZWRXaW5kb3cuc2V0VGltZW91dChjYWxsYmFjaywgMCk7CisgICAgfQorfTsK
IAotLy8gRklYTUU6IFdyYXAgV2ViR0wgY29udGV4dCBmb3IgaW5zdHJ1bWVudGF0aW9uLgotcmV0
dXJuIGdsQ29udGV4dDsKK3ZhciBpbmplY3RlZFNjcmlwdCA9IG5ldyBJbmplY3RlZFNjcmlwdCgp
OworcmV0dXJuIGluamVjdGVkU2NyaXB0OwogCiB9KQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>