<?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>58626</bug_id>
          
          <creation_ts>2011-04-14 18:58:36 -0700</creation_ts>
          <short_desc>Add restoreContext() to WEBKIT_lose_context</short_desc>
          <delta_ts>2011-07-20 16:13:41 -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>WebGL</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Kenneth Russell">kbr</reporter>
          <assigned_to name="Kenneth Russell">kbr</assigned_to>
          <cc>amarinichev</cc>
    
    <cc>cmarrin</cc>
    
    <cc>enne</cc>
    
    <cc>jamesr</cc>
    
    <cc>senorblanco</cc>
    
    <cc>zmo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>386288</commentid>
    <comment_count>0</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-04-14 18:58:36 -0700</bug_when>
    <thetext>Based on feedback on the public_webgl list, a restoreContext() method was added to the WebGL WEBKIT_lose_context extension object. To track the extension spec, this needs to be implemented in WebKit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>439997</commentid>
    <comment_count>1</comment_count>
      <attachid>101505</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-07-20 14:01:27 -0700</bug_when>
    <thetext>Created attachment 101505
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>439998</commentid>
    <comment_count>2</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-07-20 14:02:30 -0700</bug_when>
    <thetext>I&apos;d greatly appreciate a quick review as I have another dependent patch to this code to bring it up to spec compliance.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440004</commentid>
    <comment_count>3</comment_count>
      <attachid>101505</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-07-20 14:07:43 -0700</bug_when>
    <thetext>Comment on attachment 101505
Patch

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

Left some comments.

&gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:4768
&gt; +    // There is no direct way to clear errors from a GL implementation and
&gt; +    // looping until getError() becomes NO_ERROR might cause an infinite loop if
&gt; +    // the driver or context implementation had a bug. So, loop a reasonably
&gt; +    // large number of times to clear any existing errors.
&gt; +    for (int i = 0; i &lt; 100; ++i) {
&gt; +        if (m_context-&gt;getError() == GraphicsContext3D::NO_ERROR)
&gt; +            break;
&gt; +    }

I&apos;m not sure why we have to do this - what are the semantics of getError() after a lost context event is fired?  We replace m_context on restoration, so why is it important what errors exist on the old m_context?

&gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:4818
&gt; +    RefPtr&lt;GraphicsContext3D&gt; context(GraphicsContext3D::create(m_attributes, canvas()-&gt;document()-&gt;view()-&gt;root()-&gt;hostWindow()));

Do you need any null checks here?  What if the &lt;canvas&gt; is inside an iframe that&apos;s display:none (I think document()-&gt;view() will be NULL then)?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440010</commentid>
    <comment_count>4</comment_count>
      <attachid>101505</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-07-20 14:16:13 -0700</bug_when>
    <thetext>Comment on attachment 101505
Patch

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

&gt;&gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:4768
&gt;&gt; +    }
&gt; 
&gt; I&apos;m not sure why we have to do this - what are the semantics of getError() after a lost context event is fired?  We replace m_context on restoration, so why is it important what errors exist on the old m_context?

See http://www.khronos.org/registry/webgl/specs/latest/#5.14.3 . This is an attempt to clear the OpenGL error state upon context loss and signal the CONTEXT_LOST_WEBGL OpenGL error to the application. (Note also that this is just a refactoring of existing code.)

&gt;&gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:4818
&gt;&gt; +    RefPtr&lt;GraphicsContext3D&gt; context(GraphicsContext3D::create(m_attributes, canvas()-&gt;document()-&gt;view()-&gt;root()-&gt;hostWindow()));
&gt; 
&gt; Do you need any null checks here?  What if the &lt;canvas&gt; is inside an iframe that&apos;s display:none (I think document()-&gt;view() will be NULL then)?

I&apos;m not sure. This is just a refactoring; that call chain has been there for a while. If we run into problems with it let&apos;s file another bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440064</commentid>
    <comment_count>5</comment_count>
      <attachid>101505</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-07-20 15:33:46 -0700</bug_when>
    <thetext>Comment on attachment 101505
Patch

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

OK, R=me.  Left one suggestion for your consideration.

&gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:347
&gt; +    WebGLRenderingContextLostCallback(WebGLRenderingContext* cb) : m_context(cb) { }

nit: should be explicit

&gt;&gt;&gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:4768
&gt;&gt;&gt; +    }
&gt;&gt; 
&gt;&gt; I&apos;m not sure why we have to do this - what are the semantics of getError() after a lost context event is fired?  We replace m_context on restoration, so why is it important what errors exist on the old m_context?
&gt; 
&gt; See http://www.khronos.org/registry/webgl/specs/latest/#5.14.3 . This is an attempt to clear the OpenGL error state upon context loss and signal the CONTEXT_LOST_WEBGL OpenGL error to the application. (Note also that this is just a refactoring of existing code.)

I see.  Would it be easier to do this faking out in WebGLRenderingContext::getError() and not touch the underlying context at all after it is lost?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440077</commentid>
    <comment_count>6</comment_count>
      <attachid>101505</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-07-20 15:54:35 -0700</bug_when>
    <thetext>Comment on attachment 101505
Patch

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

&gt;&gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:347
&gt;&gt; +    WebGLRenderingContextLostCallback(WebGLRenderingContext* cb) : m_context(cb) { }
&gt; 
&gt; nit: should be explicit

Will fix upon landing (and also the WebGLRenderingContextRestoreTimer constructor in the header).

&gt;&gt;&gt;&gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:4768
&gt;&gt;&gt;&gt; +    }
&gt;&gt;&gt; 
&gt;&gt;&gt; I&apos;m not sure why we have to do this - what are the semantics of getError() after a lost context event is fired?  We replace m_context on restoration, so why is it important what errors exist on the old m_context?
&gt;&gt; 
&gt;&gt; See http://www.khronos.org/registry/webgl/specs/latest/#5.14.3 . This is an attempt to clear the OpenGL error state upon context loss and signal the CONTEXT_LOST_WEBGL OpenGL error to the application. (Note also that this is just a refactoring of existing code.)
&gt; 
&gt; I see.  Would it be easier to do this faking out in WebGLRenderingContext::getError() and not touch the underlying context at all after it is lost?

Possibly. Earlier there were efforts to hande synthetic errors only within the GraphicsContext3D but that probably doesn&apos;t make sense when the context&apos;s been lost. I&apos;ll keep this in mind for future changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440094</commentid>
    <comment_count>7</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-07-20 16:13:41 -0700</bug_when>
    <thetext>Committed r91414: &lt;http://trac.webkit.org/changeset/91414&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>101505</attachid>
            <date>2011-07-20 14:01:27 -0700</date>
            <delta_ts>2011-07-20 15:54:35 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-58626-20110720140125.patch</filename>
            <type>text/plain</type>
            <size>16060</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDkxMzk5KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzMgQEAKKzIwMTEtMDctMjAgIEtlbm5ldGgg
UnVzc2VsbCAgPGtickBnb29nbGUuY29tPgorCisgICAgICAgIEFkZCByZXN0b3JlQ29udGV4dCgp
IHRvIFdFQktJVF9sb3NlX2NvbnRleHQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTU4NjI2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgQWRkZWQgdGhlIHJlc3RvcmVDb250ZXh0KCkgZW50cnkgcG9pbnQgdG8g
dGhlIFdFQktJVF9sb3NlX2NvbnRleHQKKyAgICAgICAgZXh0ZW5zaW9uLiBSZWZhY3RvcmVkIGFu
ZCBzaW1wbGlmaWVkIHRoZSBsb2dpYyBhc3NvY2lhdGVkIHdpdGggY29udGV4dAorICAgICAgICBs
b3NzIGFuZCByZXN0b3JhdGlvbi4KKworICAgICAgICBBIHN1YnNlcXVlbnQgcGF0Y2ggd2lsbCBt
YWtlIHRoZSBkZWxpdmVyeSBvZiB0aGUgd2ViZ2xjb250ZXh0cmVzdG9yZWQKKyAgICAgICAgZXZl
bnQgc3BlYyBjb21wbGlhbnQuCisKKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJHTFJlbmRlcmlu
Z0NvbnRleHQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xSZW5kZXJpbmdDb250ZXh0OjpX
ZWJHTFJlbmRlcmluZ0NvbnRleHRSZXN0b3JlVGltZXI6OmZpcmVkKToKKyAgICAgICAgKFdlYkNv
cmU6OldlYkdMUmVuZGVyaW5nQ29udGV4dExvc3RDYWxsYmFjazo6V2ViR0xSZW5kZXJpbmdDb250
ZXh0TG9zdENhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OldlYkdMUmVuZGVyaW5nQ29udGV4
dExvc3RDYWxsYmFjazo6b25Db250ZXh0TG9zdCk6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJl
bmRlcmluZ0NvbnRleHQ6OmlzQ29udGV4dExvc3QpOgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xS
ZW5kZXJpbmdDb250ZXh0Ojpmb3JjZUxvc3RDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6Oldl
YkdMUmVuZGVyaW5nQ29udGV4dDo6Zm9yY2VSZXN0b3JlQ29udGV4dCk6CisgICAgICAgIChXZWJD
b3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6Omxvc2VDb250ZXh0KToKKyAgICAgICAgKFdlYkNv
cmU6OldlYkdMUmVuZGVyaW5nQ29udGV4dDo6bWF5YmVSZXN0b3JlQ29udGV4dCk6CisgICAgICAg
ICogaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0Lmg6CisgICAgICAgICogaHRtbC9j
YW52YXMvV2ViS2l0TG9zZUNvbnRleHQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6V2ViS2l0TG9z
ZUNvbnRleHQ6Omxvc2VDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OldlYktpdExvc2VDb250
ZXh0OjpyZXN0b3JlQ29udGV4dCk6CisgICAgICAgICogaHRtbC9jYW52YXMvV2ViS2l0TG9zZUNv
bnRleHQuaDoKKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJLaXRMb3NlQ29udGV4dC5pZGw6CisK
IDIwMTEtMDctMjAgIEplZmZyZXkgUGZhdSAgPGpwZmF1QGFwcGxlLmNvbT4KIAogICAgICAgICBO
ZXcgVG9rZW4gY2xhc3MgZm9yIFhNTApJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMv
V2ViR0xSZW5kZXJpbmdDb250ZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9o
dG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCShyZXZpc2lvbiA5MTM5NykKKysr
IFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTMzOSwxNiArMzM5LDE2IEBAIHByaXZhdGU6CiAKIHZvaWQgV2ViR0xS
ZW5kZXJpbmdDb250ZXh0OjpXZWJHTFJlbmRlcmluZ0NvbnRleHRSZXN0b3JlVGltZXI6OmZpcmVk
KCkKIHsKLSAgICBtX2NvbnRleHQtPm1heWJlUmVzdG9yZUNvbnRleHQoKTsKKyAgICBtX2NvbnRl
eHQtPm1heWJlUmVzdG9yZUNvbnRleHQoUmVhbExvc3RDb250ZXh0KTsKIH0KIAogY2xhc3MgV2Vi
R0xSZW5kZXJpbmdDb250ZXh0TG9zdENhbGxiYWNrIDogcHVibGljIEdyYXBoaWNzQ29udGV4dDNE
OjpDb250ZXh0TG9zdENhbGxiYWNrIHsKIHB1YmxpYzoKLSAgICBXZWJHTFJlbmRlcmluZ0NvbnRl
eHRMb3N0Q2FsbGJhY2soV2ViR0xSZW5kZXJpbmdDb250ZXh0KiBjYikgOiBtX2NvbnRleHRMb3N0
Q2FsbGJhY2soY2IpIHt9Ci0gICAgdmlydHVhbCB2b2lkIG9uQ29udGV4dExvc3QoKSB7IG1fY29u
dGV4dExvc3RDYWxsYmFjay0+Zm9yY2VMb3N0Q29udGV4dCgpOyB9CisgICAgV2ViR0xSZW5kZXJp
bmdDb250ZXh0TG9zdENhbGxiYWNrKFdlYkdMUmVuZGVyaW5nQ29udGV4dCogY2IpIDogbV9jb250
ZXh0KGNiKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgb25Db250ZXh0TG9zdCgpIHsgbV9jb250ZXh0
LT5mb3JjZUxvc3RDb250ZXh0KFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6UmVhbExvc3RDb250ZXh0
KTsgfQogICAgIHZpcnR1YWwgfldlYkdMUmVuZGVyaW5nQ29udGV4dExvc3RDYWxsYmFjaygpIHt9
CiBwcml2YXRlOgotICAgIFdlYkdMUmVuZGVyaW5nQ29udGV4dCogbV9jb250ZXh0TG9zdENhbGxi
YWNrOworICAgIFdlYkdMUmVuZGVyaW5nQ29udGV4dCogbV9jb250ZXh0OwogfTsKIAogUGFzc093
blB0cjxXZWJHTFJlbmRlcmluZ0NvbnRleHQ+IFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6Y3JlYXRl
KEhUTUxDYW52YXNFbGVtZW50KiBjYW52YXMsIFdlYkdMQ29udGV4dEF0dHJpYnV0ZXMqIGF0dHJz
KQpAQCAtMjY3NywxNCArMjY3Nyw2IEBAIEdDM0Rib29sZWFuIFdlYkdMUmVuZGVyaW5nQ29udGV4
dDo6aXNCdWYKIAogYm9vbCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmlzQ29udGV4dExvc3QoKQog
ewotICAgIGlmIChtX3Jlc3RvcmVUaW1lci5pc0FjdGl2ZSgpKQotICAgICAgICByZXR1cm4gdHJ1
ZTsKLQotICAgIGJvb2wgbmV3Q29udGV4dExvc3QgPSBtX2NvbnRleHQtPmdldEV4dGVuc2lvbnMo
KS0+Z2V0R3JhcGhpY3NSZXNldFN0YXR1c0FSQigpICE9IEdyYXBoaWNzQ29udGV4dDNEOjpOT19F
UlJPUjsKLQotICAgIGlmIChuZXdDb250ZXh0TG9zdCAhPSBtX2NvbnRleHRMb3N0KQotICAgICAg
ICBtX3Jlc3RvcmVUaW1lci5zdGFydE9uZVNob3Qoc2Vjb25kc0JldHdlZW5SZXN0b3JlQXR0ZW1w
dHMpOwotCiAgICAgcmV0dXJuIG1fY29udGV4dExvc3Q7CiB9CiAKQEAgLTM5MTcsNDUgKzM5MDks
MjcgQEAgdm9pZCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnZpZXdwb3J0KEdDMwogICAgIGNsZWFu
dXBBZnRlckdyYXBoaWNzQ2FsbChmYWxzZSk7CiB9CiAKLXZvaWQgV2ViR0xSZW5kZXJpbmdDb250
ZXh0Ojpmb3JjZUxvc3RDb250ZXh0KCkKK3ZvaWQgV2ViR0xSZW5kZXJpbmdDb250ZXh0Ojpmb3Jj
ZUxvc3RDb250ZXh0KFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6TG9zdENvbnRleHRNb2RlIG1vZGUp
CiB7CiAgICAgaWYgKGlzQ29udGV4dExvc3QoKSkgewogICAgICAgICBtX2NvbnRleHQtPnN5bnRo
ZXNpemVHTEVycm9yKEdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX09QRVJBVElPTik7CiAgICAg
ICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtYXliZVJlc3RvcmVDb250ZXh0KCk7Ci19Ci0KLXZv
aWQgV2ViR0xSZW5kZXJpbmdDb250ZXh0Ojpvbkxvc3RDb250ZXh0KCkKLXsKLSAgICBtX2NvbnRl
eHRMb3N0ID0gdHJ1ZTsKLQotICAgIGRldGFjaEFuZFJlbW92ZUFsbE9iamVjdHMoKTsKLQotICAg
IC8vIFRoZXJlIGlzIG5vIGRpcmVjdCB3YXkgdG8gY2xlYXIgZXJyb3JzIGZyb20gYSBHTCBpbXBs
ZW1lbnRhdGlvbiBhbmQKLSAgICAvLyBsb29waW5nIHVudGlsIGdldEVycm9yKCkgYmVjb21lcyBO
T19FUlJPUiBtaWdodCBjYXVzZSBhbiBpbmZpbml0ZSBsb29wIGlmCi0gICAgLy8gdGhlIGRyaXZl
ciBvciBjb250ZXh0IGltcGxlbWVudGF0aW9uIGhhZCBhIGJ1Zy4gIFNvLCBsb29wIGEgcmVhc29u
YWJseQotICAgIC8vIGxhcmdlIG51bWJlciBvZiB0aW1lcyB0byBjbGVhciBhbnkgZXhpc3Rpbmcg
ZXJyb3JzLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICAgICAgaWYg
KG1fY29udGV4dC0+Z2V0RXJyb3IoKSA9PSBHcmFwaGljc0NvbnRleHQzRDo6Tk9fRVJST1IpCi0g
ICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgbV9jb250ZXh0LT5zeW50aGVzaXplR0xFcnJv
cihHcmFwaGljc0NvbnRleHQzRDo6Q09OVEVYVF9MT1NUX1dFQkdMKTsKKyAgICBsb3NlQ29udGV4
dCgpOwogCi0gICAgY2FudmFzKCktPmRpc3BhdGNoRXZlbnQoV2ViR0xDb250ZXh0RXZlbnQ6OmNy
ZWF0ZShldmVudE5hbWVzKCkud2ViZ2xjb250ZXh0bG9zdEV2ZW50LCBmYWxzZSwgdHJ1ZSwgIiIp
KTsKKyAgICBpZiAobW9kZSA9PSBSZWFsTG9zdENvbnRleHQpCisgICAgICAgIG1fcmVzdG9yZVRp
bWVyLnN0YXJ0T25lU2hvdCgwKTsKIH0KIAotdm9pZCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnJl
c3RvcmVDb250ZXh0KCkKK3ZvaWQgV2ViR0xSZW5kZXJpbmdDb250ZXh0Ojpmb3JjZVJlc3RvcmVD
b250ZXh0KCkKIHsKLSAgICBSZWZQdHI8R3JhcGhpY3NDb250ZXh0M0Q+IGNvbnRleHQoR3JhcGhp
Y3NDb250ZXh0M0Q6OmNyZWF0ZShtX2F0dHJpYnV0ZXMsIGNhbnZhcygpLT5kb2N1bWVudCgpLT52
aWV3KCktPnJvb3QoKS0+aG9zdFdpbmRvdygpKSk7Ci0gICAgaWYgKCFjb250ZXh0KQorICAgIGlm
ICghaXNDb250ZXh0TG9zdCgpKSB7CisgICAgICAgIG1fY29udGV4dC0+c3ludGhlc2l6ZUdMRXJy
b3IoR3JhcGhpY3NDb250ZXh0M0Q6OklOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgcmV0dXJu
OworICAgIH0KIAotICAgIG1fY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgbV9jb250ZXh0TG9zdCA9
IGZhbHNlOwotICAgIGluaXRpYWxpemVOZXdDb250ZXh0KCk7Ci0gICAgY2FudmFzKCktPmRpc3Bh
dGNoRXZlbnQoV2ViR0xDb250ZXh0RXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkud2ViZ2xjb250
ZXh0cmVzdG9yZWRFdmVudCwgZmFsc2UsIHRydWUsICIiKSk7CisgICAgbWF5YmVSZXN0b3JlQ29u
dGV4dChTeW50aGV0aWNMb3N0Q29udGV4dCk7CiB9CiAKIHZvaWQgV2ViR0xSZW5kZXJpbmdDb250
ZXh0OjpyZW1vdmVPYmplY3QoV2ViR0xPYmplY3QqIG9iamVjdCkKQEAgLTQ3NzgsMjUgKzQ3NTIs
NDEgQEAgdm9pZCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnJlc3RvcmVTdGF0ZQogICAgIG1fY29u
dGV4dC0+YmluZEJ1ZmZlcihHcmFwaGljc0NvbnRleHQzRDo6QVJSQVlfQlVGRkVSLCBvYmplY3RP
clplcm8obV9ib3VuZEFycmF5QnVmZmVyLmdldCgpKSk7CiB9CiAKLXZvaWQgV2ViR0xSZW5kZXJp
bmdDb250ZXh0OjptYXliZVJlc3RvcmVDb250ZXh0KCkKK3ZvaWQgV2ViR0xSZW5kZXJpbmdDb250
ZXh0Ojpsb3NlQ29udGV4dCgpCiB7Ci0gICAgLy8gVGltZXIgaXMgc3RhcnRlZCB3aGVuIG1fY29u
dGV4dExvc3QgaXMgZmFsc2UuIEl0IHdpbGwgZmlyc3QgY2FsbAotICAgIC8vIG9uTG9zdENvbnRl
eHQsIHdoaWNoIHdpbGwgc2V0IG1fY29udGV4dExvc3QgdG8gdHJ1ZS4gVGhlbiBpdCB3aWxsIGtl
ZXAKLSAgICAvLyBjYWxsaW5nIHJlc3RvcmVDb250ZXh0IGFuZCByZXNjaGVkdWxlIGl0c2VsZiB1
bnRpbCBtX2NvbnRleHRMb3N0IGlzIGJhY2sKLSAgICAvLyB0byBmYWxzZS4KLSAgICBib29sIHNo
b3VsZFN0YXJ0VGltZXIgPSBmYWxzZTsKLSAgICBib29sIHNob3VsZEF0dGVtcHRSZXN0b3JlTm93
ID0gdHJ1ZTsKKyAgICBtX2NvbnRleHRMb3N0ID0gdHJ1ZTsKIAorICAgIGRldGFjaEFuZFJlbW92
ZUFsbE9iamVjdHMoKTsKKworICAgIC8vIFRoZXJlIGlzIG5vIGRpcmVjdCB3YXkgdG8gY2xlYXIg
ZXJyb3JzIGZyb20gYSBHTCBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAvLyBsb29waW5nIHVudGls
IGdldEVycm9yKCkgYmVjb21lcyBOT19FUlJPUiBtaWdodCBjYXVzZSBhbiBpbmZpbml0ZSBsb29w
IGlmCisgICAgLy8gdGhlIGRyaXZlciBvciBjb250ZXh0IGltcGxlbWVudGF0aW9uIGhhZCBhIGJ1
Zy4gU28sIGxvb3AgYSByZWFzb25hYmx5CisgICAgLy8gbGFyZ2UgbnVtYmVyIG9mIHRpbWVzIHRv
IGNsZWFyIGFueSBleGlzdGluZyBlcnJvcnMuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7
ICsraSkgeworICAgICAgICBpZiAobV9jb250ZXh0LT5nZXRFcnJvcigpID09IEdyYXBoaWNzQ29u
dGV4dDNEOjpOT19FUlJPUikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtX2NvbnRl
eHQtPnN5bnRoZXNpemVHTEVycm9yKEdyYXBoaWNzQ29udGV4dDNEOjpDT05URVhUX0xPU1RfV0VC
R0wpOworCisgICAgY2FudmFzKCktPmRpc3BhdGNoRXZlbnQoV2ViR0xDb250ZXh0RXZlbnQ6OmNy
ZWF0ZShldmVudE5hbWVzKCkud2ViZ2xjb250ZXh0bG9zdEV2ZW50LCBmYWxzZSwgdHJ1ZSwgIiIp
KTsKK30KKwordm9pZCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6Om1heWJlUmVzdG9yZUNvbnRleHQo
V2ViR0xSZW5kZXJpbmdDb250ZXh0OjpMb3N0Q29udGV4dE1vZGUgbW9kZSkKK3sKICAgICBpZiAo
IW1fY29udGV4dExvc3QpIHsKLSAgICAgICAgb25Mb3N0Q29udGV4dCgpOwotICAgICAgICBzaG91
bGRTdGFydFRpbWVyID0gdHJ1ZTsKLSAgICAgICAgc2hvdWxkQXR0ZW1wdFJlc3RvcmVOb3cgPSBm
YWxzZTsKKyAgICAgICAgQVNTRVJUKG1vZGUgPT0gU3ludGhldGljTG9zdENvbnRleHQpOworICAg
ICAgICBtX2NvbnRleHQtPnN5bnRoZXNpemVHTEVycm9yKEdyYXBoaWNzQ29udGV4dDNEOjpJTlZB
TElEX09QRVJBVElPTik7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyBUaGUgcmVu
ZGVyaW5nIGNvbnRleHQgaXMgbm90IHJlc3RvcmVkIGlmIHRoZXJlIGlzIG5vIGhhbmRsZXIgZm9y
Ci0gICAgLy8gdGhlIGNvbnRleHQgcmVzdG9yZWQgZXZlbnQuCi0gICAgaWYgKCFjYW52YXMoKS0+
aGFzRXZlbnRMaXN0ZW5lcnMoZXZlbnROYW1lcygpLndlYmdsY29udGV4dHJlc3RvcmVkRXZlbnQp
KQorICAgIC8vIFRoZSByZW5kZXJpbmcgY29udGV4dCBpcyBub3QgcmVzdG9yZWQgaWYgdGhlcmUg
aXMgbm8gaGFuZGxlciBmb3IgdGhlCisgICAgLy8gY29udGV4dCByZXN0b3JlZCBldmVudC4gKEZJ
WE1FOiB0aGlzIGlzIG5vdCBzcGVjIGNvbXBsaWFudC4gQSBmb2xsb3ctb24KKyAgICAvLyBwYXRj
aCB3aWxsIGJyaW5nIHRoaXMgdG8gc3BlYyBjb21wbGlhbmNlLikKKyAgICBpZiAoIWNhbnZhcygp
LT5oYXNFdmVudExpc3RlbmVycyhldmVudE5hbWVzKCkud2ViZ2xjb250ZXh0cmVzdG9yZWRFdmVu
dCkpIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gU3ludGhldGljTG9zdENvbnRleHQpCisgICAgICAg
ICAgICBtX2NvbnRleHQtPnN5bnRoZXNpemVHTEVycm9yKEdyYXBoaWNzQ29udGV4dDNEOjpJTlZB
TElEX09QRVJBVElPTik7CiAgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBpbnQgY29udGV4
dExvc3RSZWFzb24gPSBtX2NvbnRleHQtPmdldEV4dGVuc2lvbnMoKS0+Z2V0R3JhcGhpY3NSZXNl
dFN0YXR1c0FSQigpOwogCkBAIC00ODI1LDE0ICs0ODE1LDIwIEBAIHZvaWQgV2ViR0xSZW5kZXJp
bmdDb250ZXh0OjptYXliZVJlc3RvcmUKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYg
KHNob3VsZEF0dGVtcHRSZXN0b3JlTm93KSB7Ci0gICAgICAgIHJlc3RvcmVDb250ZXh0KCk7Ci0g
ICAgICAgIGlmIChtX2NvbnRleHRMb3N0KQotICAgICAgICAgICAgc2hvdWxkU3RhcnRUaW1lciA9
IHRydWU7CisgICAgUmVmUHRyPEdyYXBoaWNzQ29udGV4dDNEPiBjb250ZXh0KEdyYXBoaWNzQ29u
dGV4dDNEOjpjcmVhdGUobV9hdHRyaWJ1dGVzLCBjYW52YXMoKS0+ZG9jdW1lbnQoKS0+dmlldygp
LT5yb290KCktPmhvc3RXaW5kb3coKSkpOworICAgIGlmICghY29udGV4dCkgeworICAgICAgICBp
ZiAobW9kZSA9PSBSZWFsTG9zdENvbnRleHQpCisgICAgICAgICAgICBtX3Jlc3RvcmVUaW1lci5z
dGFydE9uZVNob3Qoc2Vjb25kc0JldHdlZW5SZXN0b3JlQXR0ZW1wdHMpOworICAgICAgICBlbHNl
CisgICAgICAgICAgICAvLyBUaGlzIGxpa2VseSBzaG91bGRuJ3QgaGFwcGVuIGJ1dCBpcyB0aGUg
YmVzdCB3YXkgdG8gcmVwb3J0IGl0IHRvIHRoZSBXZWJHTCBhcHAuCisgICAgICAgICAgICBtX2Nv
bnRleHQtPnN5bnRoZXNpemVHTEVycm9yKEdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX09QRVJB
VElPTik7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoc2hvdWxkU3RhcnRUaW1l
cikKLSAgICAgICAgbV9yZXN0b3JlVGltZXIuc3RhcnRPbmVTaG90KHNlY29uZHNCZXR3ZWVuUmVz
dG9yZUF0dGVtcHRzKTsKKyAgICBtX2NvbnRleHQgPSBjb250ZXh0OworICAgIG1fY29udGV4dExv
c3QgPSBmYWxzZTsKKyAgICBpbml0aWFsaXplTmV3Q29udGV4dCgpOworICAgIGNhbnZhcygpLT5k
aXNwYXRjaEV2ZW50KFdlYkdMQ29udGV4dEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLndlYmds
Y29udGV4dHJlc3RvcmVkRXZlbnQsIGZhbHNlLCB0cnVlLCAiIikpOwogfQogCiBXZWJHTFJlbmRl
cmluZ0NvbnRleHQ6OkxSVUltYWdlQnVmZmVyQ2FjaGU6OkxSVUltYWdlQnVmZmVyQ2FjaGUoaW50
IGNhcGFjaXR5KQpJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJp
bmdDb250ZXh0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvV2Vi
R0xSZW5kZXJpbmdDb250ZXh0LmgJKHJldmlzaW9uIDkxMzk3KQorKysgU291cmNlL1dlYkNvcmUv
aHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmgJKHdvcmtpbmcgY29weSkKQEAgLTI3
Nyw5ICsyNzcsMTYgQEAgcHVibGljOgogCiAgICAgdm9pZCB2aWV3cG9ydChHQzNEaW50IHgsIEdD
M0RpbnQgeSwgR0MzRHNpemVpIHdpZHRoLCBHQzNEc2l6ZWkgaGVpZ2h0KTsKIAotICAgIHZvaWQg
Zm9yY2VMb3N0Q29udGV4dCgpOwotICAgIHZvaWQgb25Mb3N0Q29udGV4dCgpOwotICAgIHZvaWQg
cmVzdG9yZUNvbnRleHQoKTsKKyAgICAvLyBXRUJLSVRfbG9zZV9jb250ZXh0IHN1cHBvcnQKKyAg
ICBlbnVtIExvc3RDb250ZXh0TW9kZSB7CisgICAgICAgIC8vIExvc3QgY29udGV4dCBvY2N1cnJl
ZCBhdCB0aGUgZ3JhcGhpY3Mgc3lzdGVtIGxldmVsLgorICAgICAgICBSZWFsTG9zdENvbnRleHQs
CisKKyAgICAgICAgLy8gTG9zdCBjb250ZXh0IHByb3Zva2VkIGJ5IFdFQktJVF9sb3NlX2NvbnRl
eHQuCisgICAgICAgIFN5bnRoZXRpY0xvc3RDb250ZXh0CisgICAgfTsKKyAgICB2b2lkIGZvcmNl
TG9zdENvbnRleHQoTG9zdENvbnRleHRNb2RlKTsKKyAgICB2b2lkIGZvcmNlUmVzdG9yZUNvbnRl
eHQoKTsKIAogICAgIEdyYXBoaWNzQ29udGV4dDNEKiBncmFwaGljc0NvbnRleHQzRCgpIGNvbnN0
IHsgcmV0dXJuIG1fY29udGV4dC5nZXQoKTsgfQogI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJ
VElORykKQEAgLTYxMCw4ICs2MTcsOSBAQCBwdWJsaWM6CiAgICAgYm9vbCBzaW11bGF0ZVZlcnRl
eEF0dHJpYjAoR0MzRHNpemVpIG51bVZlcnRleCk7CiAgICAgdm9pZCByZXN0b3JlU3RhdGVzQWZ0
ZXJWZXJ0ZXhBdHRyaWIwU2ltdWxhdGlvbigpOwogCisgICAgdm9pZCBsb3NlQ29udGV4dCgpOwog
ICAgIC8vIEhlbHBlciBmb3IgcmVzdG9yYXRpb24gYWZ0ZXIgY29udGV4dCBsb3N0LgotICAgIHZv
aWQgbWF5YmVSZXN0b3JlQ29udGV4dCgpOworICAgIHZvaWQgbWF5YmVSZXN0b3JlQ29udGV4dChM
b3N0Q29udGV4dE1vZGUpOwogCiAgICAgZnJpZW5kIGNsYXNzIFdlYkdMU3RhdGVSZXN0b3JlcjsK
IH07CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJLaXRMb3NlQ29udGV4dC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvV2ViS2l0TG9zZUNv
bnRleHQuY3BwCShyZXZpc2lvbiA5MTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFz
L1dlYktpdExvc2VDb250ZXh0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTQsNyArNTQsMTIgQEAg
UGFzc093blB0cjxXZWJLaXRMb3NlQ29udGV4dD4gV2ViS2l0TG9zZQogCiB2b2lkIFdlYktpdExv
c2VDb250ZXh0Ojpsb3NlQ29udGV4dCgpCiB7Ci0gICAgbV9jb250ZXh0LT5mb3JjZUxvc3RDb250
ZXh0KCk7CisgICAgbV9jb250ZXh0LT5mb3JjZUxvc3RDb250ZXh0KFdlYkdMUmVuZGVyaW5nQ29u
dGV4dDo6U3ludGhldGljTG9zdENvbnRleHQpOworfQorCit2b2lkIFdlYktpdExvc2VDb250ZXh0
OjpyZXN0b3JlQ29udGV4dCgpCit7CisgICAgbV9jb250ZXh0LT5mb3JjZVJlc3RvcmVDb250ZXh0
KCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0
bWwvY2FudmFzL1dlYktpdExvc2VDb250ZXh0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvaHRtbC9jYW52YXMvV2ViS2l0TG9zZUNvbnRleHQuaAkocmV2aXNpb24gOTEzOTcpCisrKyBT
b3VyY2UvV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJLaXRMb3NlQ29udGV4dC5oCSh3b3JraW5nIGNv
cHkpCkBAIC00MSw2ICs0MSw3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIEV4dGVuc2lvbk5hbWUg
Z2V0TmFtZSgpIGNvbnN0OwogCiAgICAgdm9pZCBsb3NlQ29udGV4dCgpOworICAgIHZvaWQgcmVz
dG9yZUNvbnRleHQoKTsKIAogcHJpdmF0ZToKICAgICBXZWJLaXRMb3NlQ29udGV4dChXZWJHTFJl
bmRlcmluZ0NvbnRleHQqKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL1dlYktp
dExvc2VDb250ZXh0LmlkbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL2NhbnZh
cy9XZWJLaXRMb3NlQ29udGV4dC5pZGwJKHJldmlzaW9uIDkxMzk3KQorKysgU291cmNlL1dlYkNv
cmUvaHRtbC9jYW52YXMvV2ViS2l0TG9zZUNvbnRleHQuaWRsCSh3b3JraW5nIGNvcHkpCkBAIC0z
MCw1ICszMCw2IEBAIG1vZHVsZSBodG1sIHsKICAgICAgICAgT21pdENvbnN0cnVjdG9yCiAgICAg
XSBXZWJLaXRMb3NlQ29udGV4dCB7CiAgICAgICAgIFtTdHJpY3RUeXBlQ2hlY2tpbmddIHZvaWQg
bG9zZUNvbnRleHQoKTsKKyAgICAgICAgW1N0cmljdFR5cGVDaGVja2luZ10gdm9pZCByZXN0b3Jl
Q29udGV4dCgpOwogICAgIH07CiB9CkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA5MTM5OSkKKysrIExheW91
dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE2IEBACisyMDExLTA3
LTIwICBLZW5uZXRoIFJ1c3NlbGwgIDxrYnJAZ29vZ2xlLmNvbT4KKworICAgICAgICBBZGQgcmVz
dG9yZUNvbnRleHQoKSB0byBXRUJLSVRfbG9zZV9jb250ZXh0CisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01ODYyNgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFVzZWQgdGhlIG5ldyBXRUJLSVRfbG9zZV9jb250
ZXh0IHJlc3RvcmVDb250ZXh0KCkgZW50cnkgcG9pbnQgaW4KKyAgICAgICAgdGhlIGFzc29jaWF0
ZWQgbGF5b3V0IHRlc3QuCisKKyAgICAgICAgKiBmYXN0L2NhbnZhcy93ZWJnbC9jb250ZXh0LWxv
c3QtcmVzdG9yZWQtZXhwZWN0ZWQudHh0OgorICAgICAgICAqIGZhc3QvY2FudmFzL3dlYmdsL2Nv
bnRleHQtbG9zdC1yZXN0b3JlZC5odG1sOgorCiAyMDExLTA3LTIwICBTdGVwaGVuIFdoaXRlICA8
c2Vub3JibGFuY29AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQ7IGNocm9taXVt
IHRlc3RfZXhwZWN0YXRpb25zIHVwZGF0ZS4KSW5kZXg6IExheW91dFRlc3RzL2Zhc3QvY2FudmFz
L3dlYmdsL2NvbnRleHQtbG9zdC1yZXN0b3JlZC1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
TGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvY29udGV4dC1sb3N0LXJlc3RvcmVkLWV4cGVj
dGVkLnR4dAkocmV2aXNpb24gOTEzOTcpCisrKyBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJn
bC9jb250ZXh0LWxvc3QtcmVzdG9yZWQtZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0x
LDcgKzEsMjIgQEAKLVRlc3RzIGJlaGF2aW9yIHVuZGVyIGEgcmVzdG9yZWQgY29udGV4dAorVGVz
dHMgYmVoYXZpb3IgdW5kZXIgYSByZXN0b3JlZCBjb250ZXh0LgogCiBPbiBzdWNjZXNzLCB5b3Ug
d2lsbCBzZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBD
T01QTEVURSIuCiAKK1Rlc3QgbG9zaW5nIGEgY29udGV4dCBhbmQgaW5hYmlsaXR5IHRvIHJlc3Rv
cmUgaXQuCitUZXN0IHZhbGlkIGNvbnRleHQKK1BBU1MgZ2wuaXNDb250ZXh0TG9zdCgpIGlzIGZh
bHNlCitQQVNTIGdsLmdldEVycm9yKCkgaXMgZ2wuTk9fRVJST1IKK1BBU1Mgc2hvdWxkQmUgMjU1
LDEwLDIwCitQQVNTIGdsLmdldEVycm9yKCkgaXMgZ2wuTk9fRVJST1IKKworVGVzdCBsb3N0IGNv
bnRleHQKK1BBU1MgZ2wuaXNDb250ZXh0TG9zdCgpIGlzIHRydWUKK1BBU1MgZ2wuZ2V0RXJyb3Io
KSBpcyBnbC5DT05URVhUX0xPU1RfV0VCR0wKK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyBnbC5OT19F
UlJPUgorCitQQVNTIGV4dGVuc2lvbi5yZXN0b3JlQ29udGV4dCgpIHdhcyBleHBlY3RlZCB2YWx1
ZTogSU5WQUxJRF9PUEVSQVRJT04uCisKK1Rlc3QgbG9zaW5nIGFuZCByZXN0b3JpbmcgYSBjb250
ZXh0LgogVGVzdCB2YWxpZCBjb250ZXh0CiBQQVNTIGdsLmlzQ29udGV4dExvc3QoKSBpcyBmYWxz
ZQogUEFTUyBnbC5nZXRFcnJvcigpIGlzIGdsLk5PX0VSUk9SCkBAIC0yNSw2ICs0MCw3IEBAIFBB
U1MgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHUKIFBBU1MgZ2wudXNlUHJvZ3Jh
bShwcm9ncmFtKSB3YXMgZXhwZWN0ZWQgdmFsdWU6IE5PX0VSUk9SLgogUEFTUyBnbC5iaW5kQnVm
ZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyT2JqZWN0c1swXSkgd2FzIGV4cGVjdGVkIHZhbHVl
OiBOT19FUlJPUi4KIAorCiBQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCiAKIFRFU1Qg
Q09NUExFVEUKSW5kZXg6IExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2NvbnRleHQtbG9z
dC1yZXN0b3JlZC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dl
YmdsL2NvbnRleHQtbG9zdC1yZXN0b3JlZC5odG1sCShyZXZpc2lvbiA5MTM5NykKKysrIExheW91
dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2NvbnRleHQtbG9zdC1yZXN0b3JlZC5odG1sCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMiwyNCArMjIsNjQgQEAgZnVuY3Rpb24gaW5pdCgpCiAgICAgICAgIHdp
bmRvdy5pbml0Tm9uS2hyb25vc0ZyYW1ld29yayh0cnVlKTsKICAgICB9CiAKLSAgICBkZXNjcmlw
dGlvbigiVGVzdHMgYmVoYXZpb3IgdW5kZXIgYSByZXN0b3JlZCBjb250ZXh0Iik7CisgICAgZGVz
Y3JpcHRpb24oIlRlc3RzIGJlaGF2aW9yIHVuZGVyIGEgcmVzdG9yZWQgY29udGV4dC4iKTsKIAot
ICAgIGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjYW52YXMiKTsKLSAgICBjYW52
YXMuYWRkRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0bG9zdCIsIHRlc3RMb3N0Q29udGV4dCk7
Ci0gICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIiwgdGVz
dFJlc3RvcmVkQ29udGV4dCk7Ci0KLSAgICBnbCA9IHd0dS5jcmVhdGUzRENvbnRleHQoY2FudmFz
KTsKICAgICBzaG91bGRHZW5lcmF0ZUdMRXJyb3IgPSB3dHUuc2hvdWxkR2VuZXJhdGVHTEVycm9y
OworICAgIHJ1blRlc3RzKCk7Cit9CisKK2Z1bmN0aW9uIHJ1blRlc3RzKCkKK3sKKyAgICB0ZXN0
TG9zaW5nQ29udGV4dCgpOworICAgIHRlc3RMb3NpbmdBbmRSZXN0b3JpbmdDb250ZXh0KCk7CisK
KyAgICBmaW5pc2goKTsKK30KIAorZnVuY3Rpb24gc2V0dXBUZXN0KCkKK3sKKyAgICBjYW52YXMg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKKyAgICBjYW52YXMud2lkdGggPSAx
OworICAgIGNhbnZhcy5oZWlnaHQgPSAxOworICAgIGdsID0gd3R1LmNyZWF0ZTNEQ29udGV4dChj
YW52YXMpOwogICAgIGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbihleHRlbnNpb25fbmFtZSk7
CiAgICAgaWYgKCFleHRlbnNpb24pIHsKICAgICAgICAgZGVidWcoZXh0ZW5zaW9uX25hbWUgKyAi
IGV4dGVuc2lvbiBub3QgZm91bmQuIik7Ci0gICAgICAgIGZpbmlzaCgpOwotICAgICAgICByZXR1
cm47CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisK
K2Z1bmN0aW9uIHRlc3RMb3NpbmdDb250ZXh0KCkKK3sKKyAgICBpZiAoIXNldHVwVGVzdCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBkZWJ1ZygiVGVzdCBsb3NpbmcgYSBjb250ZXh0IGFuZCBp
bmFiaWxpdHkgdG8gcmVzdG9yZSBpdC4iKTsKKworICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVy
KCJ3ZWJnbGNvbnRleHRsb3N0IiwgdGVzdExvc3RDb250ZXh0KTsKIAogICAgIHRlc3RPcmlnaW5h
bENvbnRleHQoKTsKICAgICBleHRlbnNpb24ubG9zZUNvbnRleHQoKTsKKyAgICAvLyBGSVhNRTog
dGhpcyBpc24ndCB5ZXQgc3BlYyBjb21wbGlhbnQuCisgICAgc2hvdWxkR2VuZXJhdGVHTEVycm9y
KGdsLCBnbC5JTlZBTElEX09QRVJBVElPTiwgImV4dGVuc2lvbi5yZXN0b3JlQ29udGV4dCgpIik7
CisgICAgZGVidWcoIiIpOworfQorCitmdW5jdGlvbiB0ZXN0TG9zaW5nQW5kUmVzdG9yaW5nQ29u
dGV4dCgpCit7CisgICAgaWYgKCFzZXR1cFRlc3QoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
ZGVidWcoIlRlc3QgbG9zaW5nIGFuZCByZXN0b3JpbmcgYSBjb250ZXh0LiIpOworCisgICAgY2Fu
dmFzLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLCB0ZXN0TG9zdENvbnRleHQp
OworICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsIHRl
c3RSZXN0b3JlZENvbnRleHQpOworCisgICAgdGVzdE9yaWdpbmFsQ29udGV4dCgpOworICAgIGV4
dGVuc2lvbi5sb3NlQ29udGV4dCgpOworICAgIGV4dGVuc2lvbi5yZXN0b3JlQ29udGV4dCgpOwor
ICAgIGRlYnVnKCIiKTsKIH0KIAogZnVuY3Rpb24gdGVzdFJlbmRlcmluZygpCkBAIC0xMDUsOCAr
MTQ1LDYgQEAgZnVuY3Rpb24gdGVzdFJlc3RvcmVkQ29udGV4dCgpCiAgICAgLy8gVmFsaWRhdGUg
bmV3IHJlc291cmNlcyBjcmVhdGVkIGluIHRlc3RSZW5kZXJpbmcoKS4KICAgICB0ZXN0UmVzb3Vy
Y2VzKGdsLk5PX0VSUk9SKTsKICAgICBkZWJ1ZygiIik7Ci0KLSAgICBmaW5pc2goKTsKIH0KIAog
ZnVuY3Rpb24gZmluaXNoKCkgewpAQCAtMTI1LDYgKzE2Myw1IEBAIGZ1bmN0aW9uIGZpbmlzaCgp
IHsKIDxib2R5IG9ubG9hZD0iaW5pdCgpIj4KIDxkaXYgaWQ9ImRlc2NyaXB0aW9uIj48L2Rpdj4K
IDxkaXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgotPGNhbnZhcyBpZD0iY2FudmFzIiB3aWR0aD0iMXB4
IiBoZWlnaHQ9IjFweCI+PC9jYW52YXM+CiA8L2JvZHk+CiA8L2h0bWw+Cg==
</data>
<flag name="review"
          id="96440"
          type_id="1"
          status="+"
          setter="jamesr"
    />
          </attachment>
      

    </bug>

</bugzilla>