<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://jogamp.org/bugzilla/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.2"
          urlbase="https://jogamp.org/bugzilla/"
          
          maintainer="sgothel@jausoft.com"
>

    <bug>
          <bug_id>692</bug_id>
          
          <creation_ts>2013-02-19 06:51:46 +0100</creation_ts>
          <short_desc>Spurious exception thrown when using Vertex Array Objects (VAO) and glDrawElements</short_desc>
          <delta_ts>2014-01-03 21:40:20 +0100</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>3</classification_id>
          <classification>JogAmp</classification>
          <product>Jogl</product>
          <component>opengl</component>
          <version>2</version>
          <rep_platform>pc_x86_64</rep_platform>
          <op_sys>windows</op_sys>
          <bug_status>UNCONFIRMED</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P3</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Edgar Velazquez-Armendariz">edgarv.dev</reporter>
          <assigned_to name="Sven Gothel">sgothel</assigned_to>
          <cc>fredrik</cc>
    
    <cc>gouessej</cc>
          
          <cf_type>DEFECT</cf_type>
          <cf_scm_refs>594329b4334e453a3f0b7bb6f576a6e943263f95
d7096cfeee500177db85d97241cc142af41517cb
b414c4b1be05249590138e73558ada82bd170f15
10b2f2219306746f3a3af6043717f42ae32c31e3</cf_scm_refs>
          <cf_workaround>---</cf_workaround>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>2197</commentid>
    <comment_count>0</comment_count>
      <attachid>411</attachid>
    <who name="Edgar Velazquez-Armendariz">edgarv.dev</who>
    <bug_when>2013-02-19 06:51:46 +0100</bug_when>
    <thetext>Created attachment 411
Stand-alone test program

When calling glDrawElements after binding a Vertex Array Object which contains bindings for both ARRAY_BUFFER and ELEMENT_ARRAY_BUFFER jogl throws a GLException with the message “element vertex_buffer_object must be enabled to call this method”. According to the OpenGL 3.2 core spec, this behavior is incorrect. A workaround is binding the ELEMENT_ARRAY_BUFFER again after binding the VAO. To reproduce:

1) Setup VAO:
    glBindVertexArray(vao);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    // glEnableVertexAttribArray + glVertexAttribPointer …
    glBindVertexArray(0);

2) Upon drawing, this throws a GLException:
    glBindVertexArray(vao);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0L);
    glBindVertexArray(0);

3) The expected behavior is for glDrawElements to succeed.

4) Workaround:
    glBindVertexArray(vao);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); // This shouldn&apos;t be necessary
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0L);
    glBindVertexArray(0);

Online I found only one reference to this issue, on a forum post without replies from 2009: http://www.java-gaming.org/index.php?topic=21093.0

In the self-contained example program submitted as an attachment I call directly the native entry point for glDrawElements through reflection, thus avoiding the buffer checks which throw the exception. This way the call succeeds and behaves as expected.

I am using jogl 2.0 rc11 (javax.media.opengl implementation version 2.0-b66-20121101) with Java 7u13 64-bit on Windows 7. The GPU is the NVIDIA Quadro 1000M with drivers version 311.00.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2201</commentid>
    <comment_count>1</comment_count>
    <who name="Edgar Velazquez-Armendariz">edgarv.dev</who>
    <bug_when>2013-02-20 03:12:56 +0100</bug_when>
    <thetext>The results of the test program are the same on an Intel HD Graphics 3000 GPU, driver version 9.17.10.2932 (Windows 7 64-bit.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2213</commentid>
    <comment_count>2</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2013-02-21 11:13:16 +0100</bug_when>
    <thetext>Thank you Edgar.

Yes indeed - I see that our VBO validation is wrong is using VAO (ctx  &gt;= GL3.1).
Either we have to skip VBO tracking [maybe if VAO is in use], 
or would need to add full VAO/VBO tracking .. which I don&apos;t favor ofc.

Let me look at the details next week.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2472</commentid>
    <comment_count>3</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2013-04-14 02:23:56 +0200</bug_when>
    <thetext>.. working on it now ..</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2473</commentid>
    <comment_count>4</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2013-04-14 06:32:24 +0200</bug_when>
    <thetext>Add modified version of Edgar Velazquez-Armendariz&apos;s test case for testing alternating VAO and VBO usage.
    
    Alternating VBO/VAO usage triggers bug 692, where our VBO enable check throws an exception:

      javax.media.opengl.GLException: element vertex_buffer_object must be enabled to call this method
            at jogamp.opengl.gl4.GL4bcImpl.checkBufferObject(GL4bcImpl.java:34318)
            at jogamp.opengl.gl4.GL4bcImpl.checkElementVBOEnabled(GL4bcImpl.java:34361)
            at jogamp.opengl.gl4.GL4bcImpl.glDrawElements(GL4bcImpl.java:4395)
            at javax.media.opengl.DebugGL3.glDrawElements(DebugGL3.java:1006)
            at com.jogamp.opengl.test.junit.jogl.acore.TestBug692GL3VAO$GL3VAODemo.displayVAONormal(TestBug692GL3VAO.java:254)

+++

Add tracking of VERTEX_ARRAY_BINDING, and enable allowing a bound non default VAO 
to pass VBO enabled test, even if VBO is disabled.
    
  VAO is available if: GL &gt;= 3.0 or is having GL_ARB_vertex_array_object extension.
    
  checkBufferObject(..) checks whether VERTEX_ARRAY_BINDING has a non default VAO bound 
  in case no VBO is being bound and VAO is allowed.
    
  glBindVertexArray(int) is being tracked, i.e. on state VERTEX_ARRAY_BINDING</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2833</commentid>
    <comment_count>5</comment_count>
    <who name="Fredrik Tolf">fredrik</who>
    <bug_when>2013-07-31 22:31:19 +0200</bug_when>
    <thetext>From what I can see, only one side of the problem has been fixed. JOGL now seems to properly understand that an element buffer has been bound when I bind a VAO that previously had such a buffer attached.

However, when I unbind the VAO (that is, when I call gl.glBindVertexArray(0)), JOGL does not seem to track that the element buffer associated with the previous VOA is now unbound, and I get the following exception when I try to call glDrawElements with an element buffer in an ordinary java.nio Buffer:

Caused by: javax.media.opengl.GLException: element vertex_buffer_object must be disabled to call this method
        at jogamp.opengl.gl4.GL4bcImpl.checkBufferObject(GL4bcImpl.java:37273)
        at jogamp.opengl.gl4.GL4bcImpl.checkElementVBODisabled(GL4bcImpl.java:37296)
        at jogamp.opengl.gl4.GL4bcImpl.glDrawElements(GL4bcImpl.java:4675)
        at haven.FastMesh.cdraw(FastMesh.java:103) &lt;-- My program
        ...

It starts working if I just add a call to glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0) whenever I call glBindVertexArray(0), but it does not seem to me that the should be necessary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2834</commentid>
    <comment_count>6</comment_count>
    <who name="Fredrik Tolf">fredrik</who>
    <bug_when>2013-07-31 22:34:16 +0200</bug_when>
    <thetext>By the way, I&apos;m using 2.0.2, which the website currently links to as both jogamp-current and jogamp-next.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3253</commentid>
    <comment_count>7</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2013-11-01 05:25:23 +0100</bug_when>
    <thetext>10b2f2219306746f3a3af6043717f42ae32c31e3

Comment 5 [seems] to be invalid:

    + * Note that VAO initialization does unbind the VBO .. since otherwise they are still bound
    + * and the CPU_SRC test will fail!&lt;br/&gt;
    + * The OpenGL spec does not mention that unbinding a VAO will also unbind the bound VBOs
    + * during their setup.&lt;br/&gt;
    + * Local tests here on NV and AMD proprietary driver resulted in &lt;i&gt;no ourput image&lt;/i&gt;
    + * when not unbinding said VBOs before the CPU_SRC tests.&lt;br/&gt;
    + * Hence Bug 692 Comment 5 is invalid, i.e. &lt;https://jogamp.org/bugzilla/show_bug.cgi?id=692#c5&gt;,
    + * and we should throw an exception to give users a hint!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3255</commentid>
    <comment_count>8</comment_count>
    <who name="Fredrik Tolf">fredrik</who>
    <bug_when>2013-11-01 06:12:51 +0100</bug_when>
    <thetext>(In reply to comment #7)
&gt;     + * The OpenGL spec does not mention that unbinding a VAO will also
&gt; unbind the bound VBOs

The vertex_array_object extension[1] states that a VAO tracks all the state in tables 6.6, 6.7 and 6.8 from the OpenGL 2.1 specification[2], excepting only the CLIENT_ACTIVE_TEXTURE and ARRAY_BUFFER_BINDING state. Table 6.8 does however also contain ELEMENT_ARRAY_BUFFER_BINDING state.

That should imply that the OpenGL spec implies that the element array buffer should be unbound when rebinding a VAO that had no bound such state, shouldn&apos;t it?

  [1]: http://www.opengl.org/registry/specs/ARB/vertex_array_object.txt
  [2]: www.opengl.org/registry/doc/glspec21.20061201.pdf‎</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3256</commentid>
    <comment_count>9</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2013-11-01 09:01:38 +0100</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #7)
&gt; &gt;     + * The OpenGL spec does not mention that unbinding a VAO will also
&gt; &gt; unbind the bound VBOs
&gt; 
&gt; The vertex_array_object extension[1] states that a VAO tracks all the state
&gt; in tables 6.6, 6.7 and 6.8 from the OpenGL 2.1 specification[2], excepting
&gt; only the CLIENT_ACTIVE_TEXTURE and ARRAY_BUFFER_BINDING state. Table 6.8
&gt; does however also contain ELEMENT_ARRAY_BUFFER_BINDING state.
&gt; 
&gt; That should imply that the OpenGL spec implies that the element array buffer
&gt; should be unbound when rebinding a VAO that had no bound such state,
&gt; shouldn&apos;t it?
&gt; 
&gt;   [1]: http://www.opengl.org/registry/specs/ARB/vertex_array_object.txt
&gt;   [2]: www.opengl.org/registry/doc/glspec21.20061201.pdf‎


I read the 3.2 and 4.4 spec (w/ compatibility) and yes, they are _tracked_,
but it doesn&apos;t explicitly state that unbinding clears them if &apos;manually&apos; bound earlier (for VAO setup).
At least I couldn&apos;t find such statement.

However, I tested the clearing, you can see this in the unit test change and GLBufferStateTracker,
but got no visible result :(

Long story short: Can you try to patch GLBufferStateTracker
(enable the clearance .. and clear the states you think which should be cleared
by unbinding a VAO .. w/ your above reference) and the unit tests init_vao().
If you got &apos;visible&apos; results .. we can go from there.

Or .. if you have a better unit tests, please provide it.

Today is 2.1.2 .. release, maybe we can get this in .. if working, 
otherwise .. next release.

Thank you!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3541</commentid>
    <comment_count>10</comment_count>
    <who name="Fredrik Tolf">fredrik</who>
    <bug_when>2014-01-03 21:40:20 +0100</bug_when>
    <thetext>I finally got this tested. Instead of trying to understand JOGL&apos;s build system to patch the tests, I wrote a small test program i C. You can get it at &lt;http://www.dolda2000.com/~fredrik/tmp/vaotest.c&gt;. It uses SDL for the window system interface.

It does seem to work quite fine for me. As you can see, I never explicitly unbind the GL_ELEMENT_ARRAY_BUFFER binding, but simply reset the VAO binding to 0. I also explicitly leave the first vertex unused in the triangle that I draw from memory, just to make sure that the element arrays are different for the VAO triangle and the client-memory triangle.

Also, this makes sense to me, seeing as how OpenGL seems to define glBindVertexArray(0) not as &quot;unbinding&quot; the VAO, but simply as rebinding the default VAO (named 0), which should already be tracking its own GL_ELEMENT_ARRAY_BUFFER binding as being unbound.

I&apos;m therefore reopening the bug, if you don&apos;t bind.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>411</attachid>
            <date>2013-02-19 06:51:46 +0100</date>
            <delta_ts>2013-02-19 06:51:46 +0100</delta_ts>
            <desc>Stand-alone test program</desc>
            <filename>VAOTest.java</filename>
            <type>application/octet-stream</type>
            <size>14547</size>
            <attacher name="Edgar Velazquez-Armendariz">edgarv.dev</attacher>
            
              <data encoding="base64">aW1wb3J0IHN0YXRpYyBjb20uam9nYW1wLmNvbW1vbi5uaW8uQnVmZmVycy5TSVpFT0ZfRkxPQVQ7
DQppbXBvcnQgc3RhdGljIGNvbS5qb2dhbXAuY29tbW9uLm5pby5CdWZmZXJzLlNJWkVPRl9TSE9S
VDsNCmltcG9ydCBjb20uam9nYW1wLm9wZW5nbC51dGlsLkdMQnVmZmVyczsNCmltcG9ydCBqYXZh
LmF3dC5DYW52YXM7DQppbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOw0KaW1wb3J0IGphdmEuYXd0
LmV2ZW50Lk1vdXNlQWRhcHRlcjsNCmltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50Ow0K
aW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0
Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247DQppbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0
aG9kOw0KaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOw0KaW1wb3J0IGphdmEubmlvLlNob3J0
QnVmZmVyOw0KaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOw0KaW1wb3J0IGphdmEudXRp
bC5sb2dnaW5nLkxvZ2dlcjsNCmltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuRGVidWdHTDM7DQpp
bXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMOw0KaW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5H
TDM7DQppbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMQXV0b0RyYXdhYmxlOw0KaW1wb3J0IGph
dmF4Lm1lZGlhLm9wZW5nbC5HTENhcGFiaWxpdGllczsNCmltcG9ydCBqYXZheC5tZWRpYS5vcGVu
Z2wuR0xFdmVudExpc3RlbmVyOw0KaW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV4Y2VwdGlv
bjsNCmltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuR0xQcm9maWxlOw0KaW1wb3J0IGphdmF4Lm1l
ZGlhLm9wZW5nbC5hd3QuR0xDYW52YXM7DQppbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOw0KaW1w
b3J0IGphdmF4LnN3aW5nLlN3aW5nVXRpbGl0aWVzOw0KaW1wb3J0IGpvZ2FtcC5vcGVuZ2wuR0xD
b250ZXh0SW1wbDsNCmltcG9ydCBqb2dhbXAub3BlbmdsLmdsNC5HTDRiY0ltcGw7DQppbXBvcnQg
am9nYW1wLm9wZW5nbC5nbDQuR0w0YmNQcm9jQWRkcmVzc1RhYmxlOw0KDQpwdWJsaWMgY2xhc3Mg
VkFPVGVzdCBpbXBsZW1lbnRzIEdMRXZlbnRMaXN0ZW5lciB7DQogICAgDQogICAgLyoqIERpZmZl
cmVudCBtb2RlcyBvZiBkaXNwbGF5aW5nIHRoZSBnZW9tZXRyeSAqLw0KICAgIHByaXZhdGUgZW51
bSBNb2RlIHsNCiAgICAgICAgLyoqIFRyYWRpdGlvbmFsIG9uZSB3aXRob3V0IHVzaW5nIFZBTyAq
Lw0KICAgICAgICBOT1JNQUwgew0KICAgICAgICAgICAgQE92ZXJyaWRlDQogICAgICAgICAgICB2
b2lkIGRpc3BsYXkoVkFPVGVzdCB0LCBHTDMgZ2wpIHsNCiAgICAgICAgICAgICAgICB0LmRpc3Bs
YXlOb3JtYWwoZ2wpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICANCiAgICAg
ICAgLyoqIFVzaW5nIFZBT3MgdGhyb3dzIFtpbmNvcnJlY3RseSBhcyBvZiBKT0dMIDIuMHJjMTFd
IGEgR0xFeGNlcHRpb24gKi8NCiAgICAgICAgVkFPX0VYQ0VQVElPTiB7DQogICAgICAgICAgICBA
T3ZlcnJpZGUNCiAgICAgICAgICAgIHZvaWQgZGlzcGxheShWQU9UZXN0IHQsIEdMMyBnbCkgew0K
ICAgICAgICAgICAgICAgIHQuZGlzcGxheVZBT0V4Y2VwdGlvbihnbCk7DQogICAgICAgICAgICB9
DQogICAgICAgIH0sDQogICAgICAgIA0KICAgICAgICAvKiogDQogICAgICAgICAqIFVzaW5nIFZB
TyBzcGVjaWZ5aW5nIHRoZSB7QGNvZGUgRUxFTUVOVF9BUlJBWV9CVUZGRVIgfSBiaW5kaW5nIGFn
YWluDQogICAgICAgICAqIGFzIGEgd29ya2Fyb3VuZCB0byBhdm9pZCB0aGUgSk9HTCBleGNlcHRp
b24NCiAgICAgICAgICovDQogICAgICAgIFZBT19XT1JLQVJPVU5EIHsNCiAgICAgICAgICAgIEBP
dmVycmlkZQ0KICAgICAgICAgICAgdm9pZCBkaXNwbGF5KFZBT1Rlc3QgdCwgR0wzIGdsKSB7DQog
ICAgICAgICAgICAgICAgdC5kaXNwbGF5VkFPV29ya2Fyb3VuZChnbCk7DQogICAgICAgICAgICB9
DQogICAgICAgIH0sDQogICAgICAgIA0KICAgICAgICAvKioNCiAgICAgICAgICogQ2FsbCB0aGUg
bmF0aXZlIG1ldGhvZCBkaXJlY3RseSB0aHJvdWdoIHJlZmxlY3Rpb24sIGF2b2lkaW5nIHRoZQ0K
ICAgICAgICAgKiBKT0dMIHJ1bnRpbWUgY2hlY2tzLiBUaGlzIHdheSBWQU9zIGJlaGF2ZSBhcyBl
eHBlY3RlZC4NCiAgICAgICAgICovDQogICAgICAgIFJFRkxFQ1RJT05fRElSRUNUIHsNCiAgICAg
ICAgICAgIEBPdmVycmlkZQ0KICAgICAgICAgICAgdm9pZCBkaXNwbGF5KFZBT1Rlc3QgdCwgR0wz
IGdsKSB7DQogICAgICAgICAgICAgICAgdC5kaXNwbGF5UmVmbGVjdGlvbihnbCk7DQogICAgICAg
ICAgICB9DQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICBhYnN0cmFjdCB2b2lkIGRpc3Bs
YXkoVkFPVGVzdCB0LCBHTDMgZ2wpOw0KICAgIH0NCiAgICANCiAgICBwcml2YXRlIGZpbmFsIHN0
YXRpYyBmbG9hdFtdIHZlcnRleERhdGEgPSBuZXcgZmxvYXRbXXsNCiAgICAgICAgIDAuMGYsICAw
Ljc1ZiwgMC4wZiwgIDEsMCwwLA0KICAgICAgICAtMC41ZiwgLTAuNzVmLCAwLjBmLCAgMCwxLDAs
DQogICAgICAgICAwLjlmLCAtMC43NWYsIDAuMGYsICAwLDAsMQ0KICAgIH07DQogICAgDQogICAg
cHJpdmF0ZSBpbnQgaWJvID0gLTE7DQogICAgcHJpdmF0ZSBpbnQgdmJvID0gLTE7DQogICAgcHJp
dmF0ZSBpbnQgdmVydElEID0gLTE7DQogICAgcHJpdmF0ZSBpbnQgZnJhZ0lEID0gLTE7DQogICAg
cHJpdmF0ZSBpbnQgcHJvZ0lEID0gLTE7DQogICAgDQogICAgcHJpdmF0ZSBpbnQgdmFvRXhjZXB0
aW9uICA9IC0xOw0KICAgIHByaXZhdGUgaW50IHZhb1dvcmthcm91bmQgPSAtMTsNCiAgICBwcml2
YXRlIGludCB2YW9SZWZsZWN0aW9uID0gLTE7DQogICAgDQogICAgcHJpdmF0ZSBNb2RlIG1vZGUg
PSBNb2RlLlJFRkxFQ1RJT05fRElSRUNUOw0KICAgIA0KICAgIHByaXZhdGUgRmllbGQgY2xhenpf
RGVidWdHTDNfZG93bnN0cmVhbUdMMzsNCiAgICBwcml2YXRlIE1ldGhvZCBjbGF6el9HTDRiY0lt
cGxfZGlzcGF0Y2hfZ2xEcmF3RWxlbWVudHMxOw0KICAgIHByaXZhdGUgbG9uZyBjbGF6el9HTDRi
Y0ltcGxfYWRkcmVzc29mX2dsRHJhd0VsZW1lbnRzOw0KICAgIA0KICAgIHByaXZhdGUgc3RhdGlj
IGludCBjcmVhdGVTaGFkZXIoZmluYWwgR0wzIGdsLCBpbnQgdHlwZSwNCiAgICAgICAgICAgIGZp
bmFsIFN0cmluZ1tdIHNyY0xpbmVzKXsNCiAgICAgICAgaW50IHNoYWRlcklEID0gZ2wuZ2xDcmVh
dGVTaGFkZXIodHlwZSk7DQogICAgICAgIGFzc2VydCBzaGFkZXJJRCA+IDA7DQogICAgICAgIGlu
dFtdIGxlbmd0aHMgID0gbmV3IGludFtzcmNMaW5lcy5sZW5ndGhdOw0KICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IHNyY0xpbmVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBsZW5ndGhz
W2ldID0gc3JjTGluZXNbaV0ubGVuZ3RoKCk7DQogICAgICAgIH0NCiAgICAgICAgZ2wuZ2xTaGFk
ZXJTb3VyY2Uoc2hhZGVySUQsIHNyY0xpbmVzLmxlbmd0aCwgc3JjTGluZXMsIGxlbmd0aHMsIDAp
Ow0KICAgICAgICBnbC5nbENvbXBpbGVTaGFkZXIoc2hhZGVySUQpOw0KICAgICAgICByZXR1cm4g
c2hhZGVySUQ7DQogICAgfQ0KICAgIA0KICAgIHByaXZhdGUgdm9pZCBpbml0QnVmZmVycyhHTDMg
Z2wpIHsNCiAgICAgICAgLy8gSURzIGZvciAyIGJ1ZmZlcnMNCiAgICAgICAgaW50W10gYnVmZkFy
cmF5ID0gbmV3IGludFsyXTsNCiAgICAgICAgZ2wuZ2xHZW5CdWZmZXJzKGJ1ZmZBcnJheS5sZW5n
dGgsIGJ1ZmZBcnJheSwgMCk7DQogICAgICAgIHZibyA9IGJ1ZmZBcnJheVswXTsNCiAgICAgICAg
YXNzZXJ0IHZibyA+IDA7DQogICAgICAgIA0KICAgICAgICAvLyBCaW5kIGJ1ZmZlciBhbmQgdXBs
b2FkIGRhdGENCiAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMMy5HTF9BUlJBWV9CVUZGRVIsIHZi
byk7DQogICAgICAgIEZsb2F0QnVmZmVyIGJ1ZmZlciA9IEdMQnVmZmVycy5uZXdEaXJlY3RGbG9h
dEJ1ZmZlcih2ZXJ0ZXhEYXRhKTsNCiAgICAgICAgYXNzZXJ0IGJ1ZmZlci5yZW1haW5pbmcoKSA9
PSB2ZXJ0ZXhEYXRhLmxlbmd0aDsNCiAgICAgICAgZ2wuZ2xCdWZmZXJEYXRhKEdMMy5HTF9BUlJB
WV9CVUZGRVIsIHZlcnRleERhdGEubGVuZ3RoICogU0laRU9GX0ZMT0FULA0KICAgICAgICAgICAg
ICAgIGJ1ZmZlciwgR0wzLkdMX1NUQVRJQ19EUkFXKTsNCiAgICAgICAgZ2wuZ2xCaW5kQnVmZmVy
KEdMMy5HTF9BUlJBWV9CVUZGRVIsIDApOw0KICAgICAgICANCiAgICAgICAgLy8gQnVmZmVyIHdp
dGggdGhlIDMgaW5kaWNlcyByZXF1aXJlZCBmb3Igb25lIHRyaWFuZ2xlDQogICAgICAgIGlibyA9
IGJ1ZmZBcnJheVsxXTsNCiAgICAgICAgYXNzZXJ0IGlibyA+IDA7DQogICAgICAgIGZpbmFsIHNo
b3J0W10gaW5kaWNlcyA9IG5ldyBzaG9ydFtdezAsIDEsIDJ9Ow0KICAgICAgICBTaG9ydEJ1ZmZl
ciBzaG9ydEJ1ZmZlciA9IEdMQnVmZmVycy5uZXdEaXJlY3RTaG9ydEJ1ZmZlcihpbmRpY2VzKTsN
CiAgICAgICAgYXNzZXJ0IHNob3J0QnVmZmVyLnJlbWFpbmluZygpID09IGluZGljZXMubGVuZ3Ro
Ow0KICAgICAgICBnbC5nbEJpbmRCdWZmZXIoR0wzLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBp
Ym8pOw0KICAgICAgICBnbC5nbEJ1ZmZlckRhdGEoR0wzLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVS
LGluZGljZXMubGVuZ3RoKlNJWkVPRl9TSE9SVCwNCiAgICAgICAgICAgICAgICBzaG9ydEJ1ZmZl
ciwgR0wzLkdMX1NUQVRJQ19EUkFXKTsNCiAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMMy5HTF9F
TEVNRU5UX0FSUkFZX0JVRkZFUiwgMCk7DQogICAgfQ0KICAgIHByaXZhdGUgdm9pZCBpbml0U2hh
ZGVycyhHTDMgZ2wpIHsNCiAgICAgICAgZmluYWwgU3RyaW5nW10gdmVydFNyYyA9IG5ldyBTdHJp
bmdbXXsNCiAgICAgICAgICAgICIjdmVyc2lvbiAxNTAgY29yZVxuIiwNCiAgICAgICAgICAgICJp
biB2ZWM0IHZQb3NpdGlvbjtcbiIsDQogICAgICAgICAgICAiaW4gdmVjNCB2Q29sb3I7XG4iLA0K
ICAgICAgICAgICAgIm91dCB2ZWM0IHBDb2xvcjtcbiIsDQogICAgICAgICAgICAidm9pZCBtYWlu
KCkge1xuIiwNCiAgICAgICAgICAgICIgICAgcENvbG9yICAgICAgID0gdkNvbG9yO1xuIiwNCiAg
ICAgICAgICAgICIgICAgZ2xfUG9zaXRpb24gPSB2UG9zaXRpb247XG4iLA0KICAgICAgICAgICAg
In1cbiINCiAgICAgICAgfTsNCiAgICAgICAgdmVydElEID0gY3JlYXRlU2hhZGVyKGdsLCBHTDMu
R0xfVkVSVEVYX1NIQURFUiwgdmVydFNyYyk7DQoNCiAgICAgICAgZmluYWwgU3RyaW5nW10gZnJh
Z1NyYyA9IG5ldyBTdHJpbmdbXXsNCiAgICAgICAgICAgICIjdmVyc2lvbiAxNTAgY29yZVxuIiwN
CiAgICAgICAgICAgICJpbiB2ZWM0IHBDb2xvcjtcbiIsDQogICAgICAgICAgICAidm9pZCBtYWlu
KCkge1xuIiwNCiAgICAgICAgICAgICIgICAgZ2xfRnJhZ0NvbG9yID0gcENvbG9yO1xuIiwNCiAg
ICAgICAgICAgICJ9XG4iDQogICAgICAgIH07DQogICAgICAgIGZyYWdJRCA9IGNyZWF0ZVNoYWRl
cihnbCwgR0wzLkdMX0ZSQUdNRU5UX1NIQURFUiwgZnJhZ1NyYyk7DQoNCiAgICAgICAgLy8gV2Un
cmUgZG9uZSB3aXRoIHRoZSBjb21waWxlcg0KICAgICAgICBnbC5nbFJlbGVhc2VTaGFkZXJDb21w
aWxlcigpOw0KDQogICAgICAgIHByb2dJRCA9IGdsLmdsQ3JlYXRlUHJvZ3JhbSgpOw0KICAgICAg
ICBhc3NlcnQgcHJvZ0lEID4gMDsNCiAgICAgICAgZ2wuZ2xBdHRhY2hTaGFkZXIocHJvZ0lELCB2
ZXJ0SUQpOw0KICAgICAgICBnbC5nbEF0dGFjaFNoYWRlcihwcm9nSUQsIGZyYWdJRCk7DQogICAg
ICAgIGdsLmdsTGlua1Byb2dyYW0ocHJvZ0lEKTsNCiAgICAgICAgZ2wuZ2xWYWxpZGF0ZVByb2dy
YW0ocHJvZ0lEKTsNCiAgICB9DQogICAgDQogICAgcHJpdmF0ZSBpbnQgaW5pdFZBTyhHTDMgZ2wp
IHsNCiAgICAgICAgaW50W10gYnVmZiA9IG5ldyBpbnRbMV07DQogICAgICAgIGdsLmdsR2VuVmVy
dGV4QXJyYXlzKDEsIGJ1ZmYsIDApOw0KICAgICAgICBpbnQgdmFvID0gYnVmZlswXTsNCiAgICAg
ICAgYXNzZXJ0IHZhbyA+IDA7DQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgZ2wuZ2xVc2VQ
cm9ncmFtKHByb2dJRCk7DQogICAgICAgIGZpbmFsIGludCBwb3NMb2MgPSBnbC5nbEdldEF0dHJp
YkxvY2F0aW9uKHByb2dJRCwgInZQb3NpdGlvbiIpOw0KICAgICAgICBmaW5hbCBpbnQgY29sb3JM
b2MgPSBnbC5nbEdldEF0dHJpYkxvY2F0aW9uKHByb2dJRCwgInZDb2xvciIpOw0KICAgICAgICBn
bC5nbFVzZVByb2dyYW0oMCk7DQogICAgICAgIA0KICAgICAgICBnbC5nbEJpbmRWZXJ0ZXhBcnJh
eSh2YW8pOw0KICAgICAgICBnbC5nbEJpbmRCdWZmZXIoR0wzLkdMX0FSUkFZX0JVRkZFUiwgdmJv
KTsNCiAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMMy5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwg
aWJvKTsNCiAgICAgICAgDQogICAgICAgIGdsLmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9z
TG9jKTsNCiAgICAgICAgZ2wuZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShjb2xvckxvYyk7DQog
ICAgICAgIA0KICAgICAgICBmaW5hbCBpbnQgc3RyaWRlID0gNiAqIFNJWkVPRl9GTE9BVDsNCiAg
ICAgICAgZmluYWwgaW50IGNPZmYgICA9IDMgKiBTSVpFT0ZfRkxPQVQ7DQogICAgICAgIGdsLmds
VmVydGV4QXR0cmliUG9pbnRlcihwb3NMb2MsICAzLCBHTDMuR0xfRkxPQVQsIGZhbHNlLCBzdHJp
ZGUsIDBMKTsNCiAgICAgICAgZ2wuZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGNvbG9yTG9jLDMsIEdM
My5HTF9GTE9BVCwgZmFsc2UsIHN0cmlkZSwgY09mZik7DQoNCiAgICAgICAgZ2wuZ2xCaW5kVmVy
dGV4QXJyYXkoMCk7DQogICAgICAgIHJldHVybiB2YW87DQogICAgfQ0KDQogICAgQE92ZXJyaWRl
DQogICAgcHVibGljIHZvaWQgaW5pdChHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSkgew0KICAgICAg
ICBpbml0UmVmbGVjdGlvbihkcmF3YWJsZS5nZXRHTCgpLmdldEdMMygpKTsNCiAgICAgICAgZHJh
d2FibGUuc2V0R0wobmV3IERlYnVnR0wzKGRyYXdhYmxlLmdldEdMKCkuZ2V0R0wzKCkpKTsNCiAg
ICAgICAgDQogICAgICAgIGZpbmFsIEdMMyBnbCA9IGRyYXdhYmxlLmdldEdMKCkuZ2V0R0wzKCk7
DQogICAgICAgIGdsLmdsRW5hYmxlKEdMMy5HTF9ERVBUSF9URVNUKTsNCiAgICAgICAgZ2wuZ2xE
aXNhYmxlKEdMMy5HTF9DVUxMX0ZBQ0UpOw0KICAgICAgICBpbml0QnVmZmVycyhnbCk7DQogICAg
ICAgIGluaXRTaGFkZXJzKGdsKTsNCiAgICAgICAgDQogICAgICAgIHZhb0V4Y2VwdGlvbiAgPSBp
bml0VkFPKGdsKTsNCiAgICAgICAgdmFvV29ya2Fyb3VuZCA9IGluaXRWQU8oZ2wpOw0KICAgICAg
ICB2YW9SZWZsZWN0aW9uID0gaW5pdFZBTyhnbCk7DQogICAgfQ0KDQogICAgQE92ZXJyaWRlDQog
ICAgcHVibGljIHZvaWQgZGlzcG9zZShHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSkgew0KICAgICAg
ICBmaW5hbCBHTDMgZ2wgPSBkcmF3YWJsZS5nZXRHTCgpLmdldEdMMygpOw0KICAgICAgICBnbC5n
bERlbGV0ZUJ1ZmZlcnMoMiwgbmV3IGludFtde3ZibywgaWJvfSwgMCk7DQogICAgICAgIGdsLmds
RGV0YWNoU2hhZGVyKHByb2dJRCwgZnJhZ0lEKTsNCiAgICAgICAgZ2wuZ2xEZXRhY2hTaGFkZXIo
cHJvZ0lELCB2ZXJ0SUQpOw0KICAgICAgICBnbC5nbERlbGV0ZVByb2dyYW0ocHJvZ0lEKTsNCiAg
ICAgICAgZ2wuZ2xEZWxldGVTaGFkZXIoZnJhZ0lEKTsNCiAgICAgICAgZ2wuZ2xEZWxldGVTaGFk
ZXIodmVydElEKTsNCiAgICB9DQogICAgDQogICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlOb3JtYWwo
ZmluYWwgR0wzIGdsKSB7DQogICAgICAgZmluYWwgaW50IHBvc0xvYyAgICA9IGdsLmdsR2V0QXR0
cmliTG9jYXRpb24ocHJvZ0lELCAidlBvc2l0aW9uIik7DQogICAgICAgIGZpbmFsIGludCBjb2xv
ckxvYyA9IGdsLmdsR2V0QXR0cmliTG9jYXRpb24ocHJvZ0lELCAidkNvbG9yIik7DQogICAgICAg
IGdsLmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zTG9jKTsNCiAgICAgICAgZ2wuZ2xFbmFi
bGVWZXJ0ZXhBdHRyaWJBcnJheShjb2xvckxvYyk7DQoNCiAgICAgICAgZ2wuZ2xCaW5kQnVmZmVy
KEdMMy5HTF9BUlJBWV9CVUZGRVIsIHZibyk7DQogICAgICAgIGZpbmFsIGludCBzdHJpZGUgPSA2
ICogU0laRU9GX0ZMT0FUOw0KICAgICAgICBmaW5hbCBpbnQgY09mZiAgID0gMyAqIFNJWkVPRl9G
TE9BVDsNCiAgICAgICAgZ2wuZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHBvc0xvYywgIDMsIEdMMy5H
TF9GTE9BVCwgZmFsc2UsIHN0cmlkZSwgMEwpOw0KICAgICAgICBnbC5nbFZlcnRleEF0dHJpYlBv
aW50ZXIoY29sb3JMb2MsMywgR0wzLkdMX0ZMT0FULCBmYWxzZSwgc3RyaWRlLCBjT2ZmKTsNCiAg
ICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMMy5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgaWJvKTsN
CiAgICAgICAgZ2wuZ2xEcmF3RWxlbWVudHMoR0wzLkdMX1RSSUFOR0xFUywgMywgR0wzLkdMX1VO
U0lHTkVEX1NIT1JULCAwTCk7DQoNCiAgICAgICAgZ2wuZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJy
YXkocG9zTG9jKTsNCiAgICAgICAgZ2wuZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoY29sb3JM
b2MpOw0KICAgICAgICBnbC5nbEJpbmRCdWZmZXIoR0wzLkdMX0FSUkFZX0JVRkZFUiwgMCk7DQog
ICAgICAgIGdsLmdsQmluZEJ1ZmZlcihHTDMuR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDApOw0K
ICAgIH0NCiAgICANCiAgICBwcml2YXRlIHZvaWQgZGlzcGxheVZBT0V4Y2VwdGlvbihmaW5hbCBH
TDMgZ2wpIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGdsLmdsQmluZFZlcnRleEFycmF5
KHZhb0V4Y2VwdGlvbik7DQogICAgICAgICAgICBnbC5nbERyYXdFbGVtZW50cyhHTDMuR0xfVFJJ
QU5HTEVTLCAzLCBHTDMuR0xfVU5TSUdORURfU0hPUlQsIDBMKTsNCiAgICAgICAgICAgIGdsLmds
QmluZFZlcnRleEFycmF5KDApOw0KICAgICAgICB9IGNhdGNoIChHTEV4Y2VwdGlvbiBleCkgew0K
ICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihWQU9UZXN0LmNsYXNzLmdldE5hbWUoKSkubG9n
KExldmVsLlNFVkVSRSxudWxsLGV4KTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICBwcml2
YXRlIHZvaWQgZGlzcGxheVZBT1dvcmthcm91bmQoZmluYWwgR0wzIGdsKSB7DQogICAgICAgIGds
LmdsQmluZFZlcnRleEFycmF5KHZhb1dvcmthcm91bmQpOw0KICAgICAgICBnbC5nbEJpbmRCdWZm
ZXIoR0wuR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGlibyk7DQogICAgICAgIGdsLmdsRHJhd0Vs
ZW1lbnRzKEdMMy5HTF9UUklBTkdMRVMsIDMsIEdMMy5HTF9VTlNJR05FRF9TSE9SVCwgMEwpOw0K
ICAgICAgICBnbC5nbEJpbmRCdWZmZXIoR0wuR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDApOw0K
ICAgICAgICBnbC5nbEJpbmRWZXJ0ZXhBcnJheSgwKTsNCiAgICB9DQogICAgDQogICAgcHJpdmF0
ZSB2b2lkIGRpc3BsYXlSZWZsZWN0aW9uKGZpbmFsIEdMMyBnbCkgew0KICAgICAgICBpZiAoY2xh
enpfRGVidWdHTDNfZG93bnN0cmVhbUdMMyA9PSBudWxsIHx8DQogICAgICAgICAgICBjbGF6el9H
TDRiY0ltcGxfZGlzcGF0Y2hfZ2xEcmF3RWxlbWVudHMxID09IG51bGwgfHwNCiAgICAgICAgICAg
IGNsYXp6X0dMNGJjSW1wbF9hZGRyZXNzb2ZfZ2xEcmF3RWxlbWVudHMgPT0gMEwpIHsNCiAgICAg
ICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCB1c2UgdGhlIHJl
ZmxlY3Rpb24gbWV0aG9kIik7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGdsLmdsQmlu
ZFZlcnRleEFycmF5KHZhb1JlZmxlY3Rpb24pOw0KICAgICAgICANCiAgICAgICAgaW50W10gYnVm
ZmVyID0gbmV3IGludFsxXTsNCiAgICAgICAgZ2wuZ2xHZXRJbnRlZ2VydihHTDMuR0xfRUxFTUVO
VF9BUlJBWV9CVUZGRVJfQklORElORywgYnVmZmVyLCAwKTsNCiAgICAgICAgaWYgKGJ1ZmZlclsw
XSA9PSAwKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgR0xFeGNlcHRpb24oIkVMRU1FTlRfQVJS
QVlfQlVGRkVSIGJpbmRpbmcgbWlzc2luZyEiKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAg
ICAgdHJ5IHsNCiAgICAgICAgICAgIEdMNGJjSW1wbCBnbDRiY0ltcGw9KEdMNGJjSW1wbCljbGF6
el9EZWJ1Z0dMM19kb3duc3RyZWFtR0wzLmdldChnbCk7DQogICAgICAgICAgICBjbGF6el9HTDRi
Y0ltcGxfZGlzcGF0Y2hfZ2xEcmF3RWxlbWVudHMxLmludm9rZShnbDRiY0ltcGwsDQogICAgICAg
ICAgICAgICAgICAgIEdMMy5HTF9UUklBTkdMRVMsIDMsIEdMMy5HTF9VTlNJR05FRF9TSE9SVCwg
MEwsDQogICAgICAgICAgICAgICAgICAgIGNsYXp6X0dMNGJjSW1wbF9hZGRyZXNzb2ZfZ2xEcmF3
RWxlbWVudHMpOw0KICAgICAgICAgICAgZ2wuZ2xCaW5kVmVydGV4QXJyYXkoMCk7DQogICAgICAg
IH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gfCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRp
b24gfA0KICAgICAgICAgICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gfCBDbGFzc0Nh
c3RFeGNlcHRpb24gZXgpIHsNCiAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoVkFPVGVzdC5j
bGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsbnVsbCxleCk7DQogICAgICAgIH0gZmlu
YWxseSB7DQogICAgICAgICAgICBnbC5nbEJpbmRWZXJ0ZXhBcnJheSgwKTsNCiAgICAgICAgfQ0K
ICAgIH0NCg0KICAgIHByaXZhdGUgTW9kZSBsYXN0TW9kZSA9IG51bGw7DQogICAgQE92ZXJyaWRl
DQogICAgcHVibGljIHZvaWQgZGlzcGxheShHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSkgew0KICAg
ICAgICBmaW5hbCBHTDMgZ2wgPSBkcmF3YWJsZS5nZXRHTCgpLmdldEdMMygpOw0KICAgICAgICBm
bG9hdCBjb2xvciA9ICgoZmxvYXQpIG1vZGUub3JkaW5hbCgpICsgMSkgLyAoTW9kZS52YWx1ZXMo
KS5sZW5ndGggKyAyKTsNCiAgICAgICAgZ2wuZ2xDbGVhckNvbG9yKGNvbG9yLCBjb2xvciwgY29s
b3IsIDApOw0KICAgICAgICBnbC5nbENsZWFyKEdMMy5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wz
LkdMX0RFUFRIX0JVRkZFUl9CSVQpOw0KICAgICAgICBnbC5nbFVzZVByb2dyYW0ocHJvZ0lEKTsN
CiAgICAgICAgaWYgKGxhc3RNb2RlICE9IG1vZGUpIHsNCiAgICAgICAgICAgIFN5c3RlbS5vdXQu
cHJpbnRsbigiRGlzcGxheSBtb2RlOiAiICsgbW9kZSk7DQogICAgICAgICAgICBsYXN0TW9kZSA9
IG1vZGU7DQogICAgICAgIH0NCiAgICAgICAgbW9kZS5kaXNwbGF5KHRoaXMsIGdsKTsNCiAgICAg
ICAgZ2wuZ2xVc2VQcm9ncmFtKDApOw0KICAgIH0NCg0KICAgIEBPdmVycmlkZQ0KICAgIHB1Ymxp
YyB2b2lkIHJlc2hhcGUoR0xBdXRvRHJhd2FibGUgZHJhd2FibGUsIGludCB4LCBpbnQgeSwgaW50
IHcsIGludCBoKSB7DQogICAgICAgICgoQ2FudmFzKSBkcmF3YWJsZS5nZXRVcHN0cmVhbVdpZGdl
dCgpKS5yZXBhaW50KCk7DQogICAgfQ0KICAgIA0KICAgIHByaXZhdGUgdm9pZCBpbml0UmVmbGVj
dGlvbihHTDMgZ2wpIHsNCiAgICAgICAgaWYgKCEoZ2wgaW5zdGFuY2VvZiBHTDRiY0ltcGwpKSB7
DQogICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVuZXhwZWN0ZWQ6ICIrZ2wuZ2V0Q2xh
c3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9
DQogICAgICAgIGZpbmFsIEZpZWxkIGZpZWxkOw0KICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9k
Ow0KICAgICAgICBmaW5hbCBsb25nIGFkZHI7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICBD
bGFzczxEZWJ1Z0dMMz4gY2x6RGVidWdHTDMgPSBEZWJ1Z0dMMy5jbGFzczsNCiAgICAgICAgICAg
IGZpZWxkID0gY2x6RGVidWdHTDMuZ2V0RGVjbGFyZWRGaWVsZCgiZG93bnN0cmVhbUdMMyIpOw0K
ICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsNCiAgICAgICAgICAgIA0KICAg
ICAgICAgICAgQ2xhc3M8R0w0YmNJbXBsPiBjbHpHTDRiY0ltcGwgPSBHTDRiY0ltcGwuY2xhc3M7
DQogICAgICAgICAgICBGaWVsZCBjb250ZXh0RmllbGQgPSBjbHpHTDRiY0ltcGwuZ2V0RGVjbGFy
ZWRGaWVsZCgiX2NvbnRleHQiKTsNCiAgICAgICAgICAgIGNvbnRleHRGaWVsZC5zZXRBY2Nlc3Np
YmxlKHRydWUpOw0KICAgICAgICAgICAgZmluYWwgR0xDb250ZXh0SW1wbCBjb250ZXh0ID0gKEdM
Q29udGV4dEltcGwpIGNvbnRleHRGaWVsZC5nZXQoZ2wpOw0KICAgICAgICAgICAgZmluYWwgR0w0
YmNQcm9jQWRkcmVzc1RhYmxlIHRhYmxlID0NCiAgICAgICAgICAgICAgICAgICAgKEdMNGJjUHJv
Y0FkZHJlc3NUYWJsZSkgY29udGV4dC5nZXRHTFByb2NBZGRyZXNzVGFibGUoKTsNCiAgICAgICAg
ICAgIGFkZHIgPSB0YWJsZS5fYWRkcmVzc29mX2dsRHJhd0VsZW1lbnRzOw0KICAgICAgICAgICAg
aWYgKGFkZHIgPT0gMCkgew0KICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWV0
aG9kIFwiZ2xEcmF3RWxlbWVudHNcIiBub3QgYXZhaWxhYmxlIik7DQogICAgICAgICAgICAgICAg
cmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbWV0aG9kID0gY2x6R0w0YmNJbXBs
LmdldERlY2xhcmVkTWV0aG9kKCJkaXNwYXRjaF9nbERyYXdFbGVtZW50czEiLA0KICAgICAgICAg
ICAgICAgICAgICBJbnRlZ2VyLlRZUEUsSW50ZWdlci5UWVBFLEludGVnZXIuVFlQRSxMb25nLlRZ
UEUsTG9uZy5UWVBFKTsNCiAgICAgICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0K
ICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB8IFNlY3VyaXR5RXhjZXB0aW9u
IHwNCiAgICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gfCBJbGxlZ2FsQWNj
ZXNzRXhjZXB0aW9uIHwNCiAgICAgICAgICAgICAgICBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgp
IHsNCiAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoVkFPVGVzdC5jbGFzcy5nZXROYW1lKCkp
LmxvZyhMZXZlbC5TRVZFUkUsbnVsbCxleCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAg
IH0NCiAgICAgICAgY2xhenpfRGVidWdHTDNfZG93bnN0cmVhbUdMMyA9IGZpZWxkOw0KICAgICAg
ICBjbGF6el9HTDRiY0ltcGxfZGlzcGF0Y2hfZ2xEcmF3RWxlbWVudHMxID0gbWV0aG9kOw0KICAg
ICAgICBjbGF6el9HTDRiY0ltcGxfYWRkcmVzc29mX2dsRHJhd0VsZW1lbnRzID0gYWRkcjsNCiAg
ICB9DQogICAgDQogICAgcHJpdmF0ZSB2b2lkIGN5Y2xlRGlzcGxheU1vZGUoKSB7DQogICAgICAg
IGFzc2VydCBtb2RlICE9IG51bGw7DQogICAgICAgIGZpbmFsIE1vZGVbXSB2YWxzID0gTW9kZS52
YWx1ZXMoKTsNCiAgICAgICAgbW9kZSA9IHZhbHNbKG1vZGUub3JkaW5hbCgpICsgMSkgJSB2YWxz
Lmxlbmd0aF07DQogICAgfQ0KICAgIA0KICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcnVuKCkgew0K
ICAgICAgICBKRnJhbWUgZnJhbWUgPSBuZXcgSkZyYW1lKCJWZXJ0ZXhBcnJheU9iamVjdCAtIFRF
U1QiKTsNCiAgICAgICAgZnJhbWUuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5ESVNQ
T1NFX09OX0NMT1NFKTsgICAgICAgIA0KICAgICAgICBHTFByb2ZpbGUgcHJvZmlsZSA9IEdMUHJv
ZmlsZS5nZXQoR0xQcm9maWxlLkdMMyk7DQogICAgICAgIEdMQ2FwYWJpbGl0aWVzIGNhcGFiaWxp
dGllcyA9IG5ldyBHTENhcGFiaWxpdGllcyhwcm9maWxlKTsNCiAgICAgICAgZmluYWwgR0xDYW52
YXMgY2FudmFzID0gbmV3IEdMQ2FudmFzKGNhcGFiaWxpdGllcyk7DQogICAgICAgIGZpbmFsIFZB
T1Rlc3QgdmFvVGVzdCA9IG5ldyBWQU9UZXN0KCk7DQogICAgICAgIGNhbnZhcy5zZXRQcmVmZXJy
ZWRTaXplKG5ldyBEaW1lbnNpb24oNTEyLCA1MTIpKTsNCiAgICAgICAgY2FudmFzLmFkZEdMRXZl
bnRMaXN0ZW5lcih2YW9UZXN0KTsNCiAgICAgICAgY2FudmFzLmFkZE1vdXNlTGlzdGVuZXIobmV3
IE1vdXNlQWRhcHRlcigpIHsNCiAgICAgICAgICAgIEBPdmVycmlkZQ0KICAgICAgICAgICAgcHVi
bGljIHZvaWQgbW91c2VQcmVzc2VkKE1vdXNlRXZlbnQgZSkgew0KICAgICAgICAgICAgICAgIHZh
b1Rlc3QuY3ljbGVEaXNwbGF5TW9kZSgpOw0KICAgICAgICAgICAgICAgIGNhbnZhcy5yZXBhaW50
KCk7DQogICAgICAgICAgICB9ICAgICAgICANCiAgICAgICAgfSk7DQogICAgICAgIGZyYW1lLmFk
ZChjYW52YXMpOw0KICAgICAgICBmcmFtZS5wYWNrKCk7DQogICAgICAgIGZyYW1lLnNldFZpc2li
bGUodHJ1ZSk7DQogICAgICAgIGNhbnZhcy5yZXF1ZXN0Rm9jdXNJbldpbmRvdygpOw0KICAgIH0N
CiAgICANCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQogICAg
ICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsNCg0KICAgICAg
ICAgICAgQE92ZXJyaWRlDQogICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7DQogICAgICAg
ICAgICAgICAgVkFPVGVzdC5ydW4oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAg
fQ0KICAgIA0KfQ0K
</data>

          </attachment>
      

    </bug>

</bugzilla>