<?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>907</bug_id>
          
          <creation_ts>2013-11-20 10:13:32 +0100</creation_ts>
          <short_desc>Add Dispatch Thread for Windows DummyWindow&apos;s allowing 3rd party applications to retrieve window names (send events)</short_desc>
          <delta_ts>2013-11-29 03:21:26 +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>windows</component>
          <version>2</version>
          <rep_platform>pc_all</rep_platform>
          <op_sys>windows</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>---</priority>
          <bug_severity>major</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Randolf Schultz">randolf.schultz</reporter>
          <assigned_to name="Sven Gothel">sgothel</assigned_to>
          
          
          <cf_type>---</cf_type>
          <cf_scm_refs>e9c711a86aa05f4f24c69972532833f5a98911a3
52c95c19dbd69a7fc6b307d2b2db357ceb43ddf5
f52c89e36cccd5eb141882a4b3378efe54aa9576
586446311ea1ba87f98236d5347955bf99b465d6
efc158abbb2c282029aaa746e032ec678e374d7b</cf_scm_refs>
          <cf_workaround>---</cf_workaround>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>3351</commentid>
    <comment_count>0</comment_count>
      <attachid>544</attachid>
    <who name="Randolf Schultz">randolf.schultz</who>
    <bug_when>2013-11-20 10:13:32 +0100</bug_when>
    <thetext>Created attachment 544
modified source

Greetings,

our application (using Jogl in a GLJPanel) blocks third party software that
use the EnumWindows()/GetWindowText() Win32 functions to discover/retrieve
window title names.

The problem is that the dummy windows created by Jogl do not process any
messages. The attached files modify the window creation process to occur
each in its own thread that then falls into a message processing loop for
this window.
The dummy window destruction also needed to change to not use
DestroyWindow() but to send a WM_CLOSE message instead.
See the attached files.

With these changes in place, our application no longer blocks
other applications.

regards,
Randolf</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3352</commentid>
    <comment_count>1</comment_count>
      <attachid>545</attachid>
    <who name="Randolf Schultz">randolf.schultz</who>
    <bug_when>2013-11-20 10:14:22 +0100</bug_when>
    <thetext>Created attachment 545
modified source</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3355</commentid>
    <comment_count>2</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2013-11-20 19:37:12 +0100</bug_when>
    <thetext>*** Bug 899 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3356</commentid>
    <comment_count>3</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2013-11-20 19:39:55 +0100</bug_when>
    <thetext>Dear Randolf, what is &apos;your application&apos; you mention as 3rd party software .. ?

I dislike the idea of creating one native thread per dummy-window - of course,
since it would explode the number of used resources even if they are almost sleeping.

I will look at this issue later on, but also would like to learn about this test case of yours.
Such knowledge might help to find another solution for the issue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3359</commentid>
    <comment_count>4</comment_count>
      <attachid>547</attachid>
    <who name="Randolf Schultz">randolf.schultz</who>
    <bug_when>2013-11-22 10:11:45 +0100</bug_when>
    <thetext>Created attachment 547
GDIMisc.c revised to use only one thread

I have revised the code to use only one extra thread.
The thread is created/destroyed with the window class.
Window creation/destruction is done via user-defined
messages. The ugly volatile stuff to communicate/sync
is still there and could be replaced by events.

This probably breaks NEWT unless the creation of the
message processing thread is confined to AWT by another
if statement (you are probably more qualified than I to
insert this one).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3360</commentid>
    <comment_count>5</comment_count>
    <who name="Randolf Schultz">randolf.schultz</who>
    <bug_when>2013-11-22 10:39:37 +0100</bug_when>
    <thetext>(In reply to comment #3)
&gt; Dear Randolf, what is &apos;your application&apos; you mention as 3rd party software

it is actually a whole application scenario, in a hospital, where the
blocked application tries to connect a patient information system and
yet another system. The connecting application is probably continually
sending messages to wait for a certain window to appear.
Needless to say: all three applications are completely beyond our control.

When we run with OpenGL activated, the connecting application is
blocked. The only real solution is to start processing messages.

For testing purposes, I can provide a Win32 executable that just does
the EnumWindows()/GetWindowText() in an endless loop (just like the
connecting app) and that we also successfully block/unblock depending
on the changes to GDImisc.c...

regards,
Randolf</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3361</commentid>
    <comment_count>6</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2013-11-22 11:51:27 +0100</bug_when>
    <thetext>(In reply to comment #4)
&gt; Created attachment 547 [details]
&gt; GDIMisc.c revised to use only one thread
&gt; 
&gt; I have revised the code to use only one extra thread.
&gt; The thread is created/destroyed with the window class.
&gt; Window creation/destruction is done via user-defined
&gt; messages. The ugly volatile stuff to communicate/sync
&gt; is still there and could be replaced by events.

Reads much better now, thank you!

Please provide a git patch (email or pull request from a repo)
if possible. Otherwise I would need to apply your patch 
using your author name.

What I don&apos;t understand - why should we use WM_CLOSE
for destruction ? AFAIK we do not use such mechanism
in NEWT, but simply destroy the window - will double check.

&gt; 
&gt; This probably breaks NEWT unless the creation of the
&gt; message processing thread is confined to AWT by another
&gt; if statement (you are probably more qualified than I to
&gt; insert this one).

Yes.
So this must be made optional for creating the &apos;window class&apos;.

Note: All this has nothing todo w/ AWT!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3362</commentid>
    <comment_count>7</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2013-11-22 11:52:39 +0100</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #3)
&gt; &gt; Dear Randolf, what is &apos;your application&apos; you mention as 3rd party software
&gt; 
&gt; it is actually a whole application scenario, in a hospital, where the
&gt; blocked application tries to connect a patient information system and
&gt; yet another system. The connecting application is probably continually
&gt; sending messages to wait for a certain window to appear.
&gt; Needless to say: all three applications are completely beyond our control.
&gt; 
&gt; When we run with OpenGL activated, the connecting application is
&gt; blocked. The only real solution is to start processing messages.
&gt; 
&gt; For testing purposes, I can provide a Win32 executable that just does
&gt; the EnumWindows()/GetWindowText() in an endless loop (just like the
&gt; connecting app) and that we also successfully block/unblock depending
&gt; on the changes to GDImisc.c...
&gt; 

Thank you for sharing the rational.

Pls do attach a test case (ANSI-C source code - ofc).
I will add it to the test-native folder.

It is mandatory to have this test to validate against it.

&gt; regards,
&gt; Randolf</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3363</commentid>
    <comment_count>8</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2013-11-22 11:53:31 +0100</bug_when>
    <thetext>(In reply to comment #7)
&gt; Pls do attach a test case (ANSI-C source code - ofc).

We must be able to compile the ANSI-C source code 
w/ MINGW-64.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3378</commentid>
    <comment_count>9</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2013-11-23 21:15:32 +0100</bug_when>
    <thetext>Dear Randolf,

I would appreciate your input/results,
so we can add the solution into 2.1.3 release.

If we fail 2.1.3, 2.2.0 is next and is planned to &apos;take a while&apos;.

At least - pls provide the test case, to validate changes. 
Thank you!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3405</commentid>
    <comment_count>10</comment_count>
      <attachid>561</attachid>
    <who name="Randolf Schultz">randolf.schultz</who>
    <bug_when>2013-11-27 11:23:21 +0100</bug_when>
    <thetext>Created attachment 561
test program

Dear Sven,

sorry for getting back to you so late.

I have attached a simple test program as source.
It prints &quot;SUCCESS!&quot;/&quot;FAILURE!&quot; to the console
depending on whether there are windows that do
not process the WM_GETTEXT message.

Regarding your questions:
Sending WM_CLOSE was necessary in my first version
of the patch as this was a multi-thread scenario
and you can not use DestroyWindow() over a thread
boundary. In the one-thread version we can use
DestroyWindow() directly again, as it is called
from the ThreadFunc().

Thanks for clarification wrt. AWT, I used the term
to distinguish between NEWT and &quot;the other integration&quot;
we use. :)

Randolf</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3411</commentid>
    <comment_count>11</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2013-11-28 14:33:06 +0100</bug_when>
    <thetext>(In reply to comment #10)
&gt; Created attachment 561 [details]
&gt; test program
&gt; 
&gt; Dear Sven,
&gt; 
&gt; sorry for getting back to you so late.
still in time for 2.1.3 - thank you for getting back at all

&gt; 
&gt; I have attached a simple test program as source.
&gt; It prints &quot;SUCCESS!&quot;/&quot;FAILURE!&quot; to the console
&gt; depending on whether there are windows that do
&gt; not process the WM_GETTEXT message.

Great.

&gt; 
&gt; Regarding your questions:
&gt; Sending WM_CLOSE was necessary in my first version
&gt; of the patch as this was a multi-thread scenario
&gt; and you can not use DestroyWindow() over a thread
&gt; boundary. In the one-thread version we can use
&gt; DestroyWindow() directly again, as it is called
&gt; from the ThreadFunc().

Perfect.

&gt; 
&gt; Thanks for clarification wrt. AWT, I used the term
&gt; to distinguish between NEWT and &quot;the other integration&quot;
&gt; we use. :)

Since you have not provided a git patch or git pull request,
[1] I need to merge your changes and hence need your 
full name  and your email address for the git commit.

Either I take your credentials as known from this bug report,
or [2] you provide a git patch (email, pull request, ..).

Regardless, I test your changes now
and hence may already performed [1].

~Sven

&gt; 
&gt; Randolf</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3412</commentid>
    <comment_count>12</comment_count>
    <who name="Randolf Schultz">randolf.schultz</who>
    <bug_when>2013-11-28 20:52:13 +0100</bug_when>
    <thetext>(In reply to comment #11)

Dear Sven,

&gt; Since you have not provided a git patch or git pull request,
&gt; [1] I need to merge your changes and hence need your 
&gt; full name  and your email address for the git commit.

you can use the information from Bugzilla.

Note, that there is still some work left to do:
a) The creation of the thread must not take place for NEWT.
b) The original CreateDummyWindow0() can probably be
removed altogether (but I did not check for potential
references besides the one from GDIUtil and so left it in).

regards,
Randolf</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3413</commentid>
    <comment_count>13</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2013-11-29 02:28:24 +0100</bug_when>
    <thetext>e9c711a86aa05f4f24c69972532833f5a98911a3
   Initial patch allowing Jogl to respond to other applications that try to retrieve window names


52c95c19dbd69a7fc6b307d2b2db357ceb43ddf5
    Cleanup Commit e9c711a86aa05f4f24c69972532833f5a98911a3:
      - Fix while loop in SendCloseMessage (native)
    
      - static &apos;threadid&apos; must be volatile
    
      - Whitespace
    
      - Redundancy
        - CreateDummyWindow
    
      - Scope (java, move JNI funcs back to private)
    
      - Remove [invalid] pointer usage (native)
        - ThreadParam&apos;s threadReady and hWndPtr shall not be pointers - invalid
        - No need to use a threadReady pointer.
    
      - Validate threadid (native)
    
    TODO:
      - Make &apos;native dispatch thread&apos; optional
      - Store &apos;native dispatch thread&apos; in window class


f52c89e36cccd5eb141882a4b3378efe54aa9576
    Bug 907 - Fix regression of &apos;cleanup&apos; Commit 52c95c19dbd69a7fc6b307d2b2db357ceb43ddf5


586446311ea1ba87f98236d5347955bf99b465d6
    Refine DummyDispatchThread (DDT) Handling ...


586446311ea1ba87f98236d5347955bf99b465d6
    Proper OO integration of DDT in RegisteredClass
      - DDT is optional to RegisteredClass[Factory],
        i.e. NEWT without DDT and DummyWindow with DDT.
    
      - Using native type DummyThreadContext per DDT
        passed as DDT handle to java referenced in RegisteredClass
    
      - Passing DDT handle to related native methods,
        if not null use DDT - otherwise work on current thread.
        The latter impacts CreateDummyWindow0 and DestroyWindow0.
    
    Safe DDT Post/WaitForReady handling and error cases ; ...
      - Wait until command it complete using a 3s timeout
      - Terminate thread if errors occur and throw an exception
    
    +++
    
    Discussion: DDT Native Implementation
    
    Due to original code, the DDT is implemented in native code.
    Usually we should favor running the DDT from a java thread.
    However, since it&apos;s main purpose is _not_ to interact w/ java
    and the native implementation has less footprint (performance and memory)
    we shall be OK w/ it for now - as long the implementation IS SAFE.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3414</commentid>
    <comment_count>14</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2013-11-29 03:19:25 +0100</bug_when>
    <thetext>efc158abbb2c282029aaa746e032ec678e374d7b
  Add native Windows test sending WM_GETTEXT to all windows and dumping the result. 
  If working, Bug907 is fixed and hence DDT is working.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>544</attachid>
            <date>2013-11-20 10:13:32 +0100</date>
            <delta_ts>2013-11-20 10:13:32 +0100</delta_ts>
            <desc>modified source</desc>
            <filename>GDImisc.c</filename>
            <type>application/octet-stream</type>
            <size>11287</size>
            <attacher name="Randolf Schultz">randolf.schultz</attacher>
            
              <data encoding="base64">I2luY2x1ZGUgPGpuaS5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4K
CiNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgojaW5jbHVkZSA8d2luZG93cy5oPgojdW5kZWYg
V0lOMzJfTEVBTl9BTkRfTUVBTgoKI2luY2x1ZGUgPHdpbmdkaS5oPgojaW5jbHVkZSA8c3RkZGVm
Lmg+CgojaW5jbHVkZSA8Z2x1ZWdlbl9zdGRpbnQuaD4KCiNpbmNsdWRlIDxzdGRpby5oPgoKI2lu
Y2x1ZGUgIk5hdGl2ZXdpbmRvd0NvbW1vbi5oIgojaW5jbHVkZSAiam9nYW1wX25hdGl2ZXdpbmRv
d193aW5kb3dzX0dESVV0aWwuaCIKCi8vICNkZWZpbmUgVkVSQk9TRV9PTiAxCgojaWZkZWYgVkVS
Qk9TRV9PTgogICAgI2RlZmluZSBEQkdfUFJJTlQoYXJncy4uLikgZnByaW50ZihzdGRlcnIsIGFy
Z3MpOwojZWxzZQogICAgI2RlZmluZSBEQkdfUFJJTlQoYXJncy4uLikKI2VuZGlmCgpzdGF0aWMg
Y29uc3QgY2hhciAqIGNvbnN0IENsYXp6TmFtZVBvaW50ID0gImphdmF4L21lZGlhL25hdGl2ZXdp
bmRvdy91dGlsL1BvaW50IjsKc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBDbGF6ekFueUNzdHJO
YW1lID0gIjxpbml0PiI7CnN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgQ2xhenpOYW1lUG9pbnRD
c3RyU2lnbmF0dXJlID0gIihJSSlWIjsKCnN0YXRpYyBqY2xhc3MgcG9pbnRDbHogPSBOVUxMOwpz
dGF0aWMgam1ldGhvZElEIHBvaW50Q3N0ciA9IE5VTEw7CgpISU5TVEFOQ0UgR2V0QXBwbGljYXRp
b25IYW5kbGUoKSB7CiAgICByZXR1cm4gR2V0TW9kdWxlSGFuZGxlKE5VTEwpOwp9Cgp0eXBlZGVm
IHN0cnVjdCBUaHJlYWRQYXJhbV9zCnsKICBqbG9uZyBqSEluc3RhbmNlOwogIGNvbnN0IFRDSEFS
KiB3bmRDbGFzc05hbWU7CiAgY29uc3QgVENIQVIqIHduZE5hbWU7CiAgamludCB4OwogIGppbnQg
eTsKICBqaW50IHdpZHRoOwogIGppbnQgaGVpZ2h0OwogIHZvbGF0aWxlIEhXTkQgKmhXbmRQdHI7
CiAgdm9sYXRpbGUgQk9PTCAqd25kSXNDcmVhdGVkOwp9IFRocmVhZFBhcmFtOwoKCkRXT1JEIFdJ
TkFQSSBDcmVhdGVXaW5kb3dXaXRoTWVzc2FnZUxvb3AoTFBWT0lEIHBhcmFtKQp7CiBUaHJlYWRQ
YXJhbSAqdFBhcmFtID0gKFRocmVhZFBhcmFtKilwYXJhbTsKIEhJTlNUQU5DRSBoSW5zdGFuY2Ug
PSAoSElOU1RBTkNFKSAoaW50cHRyX3QpIHRQYXJhbS0+akhJbnN0YW5jZTsKIERXT1JEIGR3RXhT
dHlsZTsKIERXT1JEIGR3U3R5bGU7CgogZHdFeFN0eWxlID0gV1NfRVhfQVBQV0lORE9XIHwgV1Nf
RVhfV0lORE9XRURHRTsKIGR3U3R5bGUgPSBXU19PVkVSTEFQUEVEV0lORE9XOwoKIEhXTkQgaHdu
ZCA9IENyZWF0ZVdpbmRvd0V4KCBkd0V4U3R5bGUsCgkJCSAgICB0UGFyYW0tPnduZENsYXNzTmFt
ZSwKCQkJICAgIHRQYXJhbS0+d25kTmFtZSwKCQkJICAgIGR3U3R5bGUgfCBXU19DTElQU0lCTElO
R1MgfCBXU19DTElQQ0hJTERSRU4sCgkJCSAgICB0UGFyYW0tPngsIHRQYXJhbS0+eSwgdFBhcmFt
LT53aWR0aCwgdFBhcmFtLT5oZWlnaHQsCgkJCSAgICBOVUxMLCBOVUxMLCBoSW5zdGFuY2UsIE5V
TEwgKTsKCiAqKHRQYXJhbS0+aFduZFB0cikgPSBod25kOwogKih0UGFyYW0tPnduZElzQ3JlYXRl
ZCkgPSBUUlVFOwoKIC8qIHJ1biB0aGUgbWVzc2FnZSBsb29wICovCiBNU0cgbXNnOwogQk9PTCBi
UmV0OwoKIHdoaWxlKCAoYlJldCA9IEdldE1lc3NhZ2UoICZtc2csIGh3bmQsIDAsIDAgKSkgIT0g
MCkKICAgeyAKICAgICBpZiAoYlJldCA9PSAtMSkKICAgICAgIHsKCSByZXR1cm4gMDsKICAgICAg
IH0KICAgICBlbHNlCiAgICAgICB7CgkgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsgCgkgRGlzcGF0
Y2hNZXNzYWdlKCZtc2cpOyAKICAgICAgIH0KICAgfSAKCiByZXR1cm4gMDsKfQoKCi8qICAgSmF2
YS0+QyBnbHVlIGNvZGU6CiAqICAgSmF2YSBwYWNrYWdlOiBqb2dhbXAubmF0aXZld2luZG93Lndp
bmRvd3MuR0RJVXRpbAogKiAgICBKYXZhIG1ldGhvZDogYm9vbGVhbiBDcmVhdGVXaW5kb3dDbGFz
cyhsb25nIGhJbnN0YW5jZSwgamF2YS5sYW5nLlN0cmluZyBjbGF6ek5hbWUsIGxvbmcgd25kUHJv
YykKICogICAgIEMgZnVuY3Rpb246IEJPT0wgQ3JlYXRlV2luZG93Q2xhc3MoSEFORExFIGhJbnN0
YW5jZSwgTFBDU1RSIGNsYXp6TmFtZSwgSEFORExFIHduZFByb2MpOwogKi8KSk5JRVhQT1JUIGpi
b29sZWFuIEpOSUNBTEwKSmF2YV9qb2dhbXBfbmF0aXZld2luZG93X3dpbmRvd3NfR0RJVXRpbF9D
cmVhdGVXaW5kb3dDbGFzcwogICAgKEpOSUVudiAqZW52LCBqY2xhc3MgX3VudXNlZCwgamxvbmcg
akhJbnN0YW5jZSwganN0cmluZyBqQ2xhenpOYW1lLCBqbG9uZyB3bmRQcm9jKSAKewogICAgSElO
U1RBTkNFIGhJbnN0YW5jZSA9IChISU5TVEFOQ0UpIChpbnRwdHJfdCkgakhJbnN0YW5jZTsKICAg
IGNvbnN0IFRDSEFSKiBjbGF6ek5hbWUgPSBOVUxMOwogICAgV05EQ0xBU1MgIHdjOwogICAgamJv
b2xlYW4gcmVzOwoKI2lmZGVmIFVOSUNPREUKICAgIGNsYXp6TmFtZSA9IE5ld3RDb21tb25fR2V0
TnVsbFRlcm1pbmF0ZWRTdHJpbmdDaGFycyhlbnYsIGpDbGF6ek5hbWUpOwojZWxzZQogICAgY2xh
enpOYW1lID0gKCplbnYpLT5HZXRTdHJpbmdVVEZDaGFycyhlbnYsIGpDbGF6ek5hbWUsIE5VTEwp
OwojZW5kaWYKCiAgICBaZXJvTWVtb3J5KCAmd2MsIHNpemVvZiggd2MgKSApOwogICAgaWYoIEdl
dENsYXNzSW5mbyggaEluc3RhbmNlLCAgY2xhenpOYW1lLCAmd2MgKSApIHsKICAgICAgICAvLyBy
ZWdpc3RlcmVkIGFscmVhZHkKICAgICAgICByZXMgPSBKTklfVFJVRTsKICAgIH0gZWxzZSB7ICAg
ICAgCiAgICAgICAgLy8gcmVnaXN0ZXIgbm93CiAgICAgICAgWmVyb01lbW9yeSggJndjLCBzaXpl
b2YoIHdjICkgKTsKICAgICAgICB3Yy5zdHlsZSA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXIDsK
ICAgICAgICB3Yy5scGZuV25kUHJvYyA9IChXTkRQUk9DKSAoaW50cHRyX3QpIHduZFByb2M7CiAg
ICAgICAgd2MuY2JDbHNFeHRyYSA9IDA7CiAgICAgICAgd2MuY2JXbmRFeHRyYSA9IDA7CiAgICAg
ICAgd2MuaEluc3RhbmNlID0gaEluc3RhbmNlOwogICAgICAgIHdjLmhJY29uID0gTlVMTDsKICAg
ICAgICB3Yy5oQ3Vyc29yID0gTG9hZEN1cnNvciggTlVMTCwgSURDX0FSUk9XKTsKICAgICAgICB3
Yy5oYnJCYWNrZ3JvdW5kID0gTlVMTDsgLy8gbm8gYmFja2dyb3VuZCBwYWludCAtIEdldFN0b2Nr
T2JqZWN0KEJMQUNLX0JSVVNIKTsKICAgICAgICB3Yy5scHN6TWVudU5hbWUgPSBOVUxMOwogICAg
ICAgIHdjLmxwc3pDbGFzc05hbWUgPSBjbGF6ek5hbWU7CiAgICAgICAgcmVzID0gKCAwICE9IFJl
Z2lzdGVyQ2xhc3MoICZ3YyApICkgPyBKTklfVFJVRSA6IEpOSV9GQUxTRSA7CiAgICB9CgojaWZk
ZWYgVU5JQ09ERQogICAgZnJlZSgodm9pZCopIGNsYXp6TmFtZSk7CiNlbHNlCiAgICAoKmVudikt
PlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbnYsIGpDbGF6ek5hbWUsIGNsYXp6TmFtZSk7CiNlbmRp
ZgoKICAgIHJldHVybiByZXM7Cn0KCi8qICAgSmF2YS0+QyBnbHVlIGNvZGU6CiAqICAgSmF2YSBw
YWNrYWdlOiBqb2dhbXAubmF0aXZld2luZG93LndpbmRvd3MuR0RJVXRpbAogKiAgICBKYXZhIG1l
dGhvZDogYm9vbGVhbiBEZXN0cm95V2luZG93Q2xhc3MobG9uZyBoSW5zdGFuY2UsIGphdmEubGFu
Zy5TdHJpbmcgY2xhc3NOYW1lKQogKiAgICAgQyBmdW5jdGlvbjogQk9PTCBEZXN0cm95V2luZG93
Q2xhc3MoSEFORExFIGhJbnN0YW5jZSwgTFBDU1RSIGNsYXNzTmFtZSk7CiAqLwpKTklFWFBPUlQg
amJvb2xlYW4gSk5JQ0FMTApKYXZhX2pvZ2FtcF9uYXRpdmV3aW5kb3dfd2luZG93c19HRElVdGls
X0Rlc3Ryb3lXaW5kb3dDbGFzcwogICAgKEpOSUVudiAqZW52LCBqY2xhc3MgX3VudXNlZCwgamxv
bmcgakhJbnN0YW5jZSwganN0cmluZyBqQ2xhenpOYW1lKSAKewogICAgSElOU1RBTkNFIGhJbnN0
YW5jZSA9IChISU5TVEFOQ0UpIChpbnRwdHJfdCkgakhJbnN0YW5jZTsKICAgIGNvbnN0IFRDSEFS
KiBjbGF6ek5hbWUgPSBOVUxMOwogICAgamJvb2xlYW4gcmVzOwoKI2lmZGVmIFVOSUNPREUKICAg
IGNsYXp6TmFtZSA9IE5ld3RDb21tb25fR2V0TnVsbFRlcm1pbmF0ZWRTdHJpbmdDaGFycyhlbnYs
IGpDbGF6ek5hbWUpOwojZWxzZQogICAgY2xhenpOYW1lID0gKCplbnYpLT5HZXRTdHJpbmdVVEZD
aGFycyhlbnYsIGpDbGF6ek5hbWUsIE5VTEwpOwojZW5kaWYKCiAgICByZXMgPSAoIDAgIT0gVW5y
ZWdpc3RlckNsYXNzKCBjbGF6ek5hbWUsIGhJbnN0YW5jZSApICkgPyBKTklfVFJVRSA6IEpOSV9G
QUxTRSA7CgojaWZkZWYgVU5JQ09ERQogICAgZnJlZSgodm9pZCopIGNsYXp6TmFtZSk7CiNlbHNl
CiAgICAoKmVudiktPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbnYsIGpDbGF6ek5hbWUsIGNsYXp6
TmFtZSk7CiNlbmRpZgoKICAgIHJldHVybiByZXM7Cn0KCi8qICAgSmF2YS0+QyBnbHVlIGNvZGU6
CiAqICAgSmF2YSBwYWNrYWdlOiBqb2dhbXAubmF0aXZld2luZG93LndpbmRvd3MuR0RJVXRpbAog
KiAgICBKYXZhIG1ldGhvZDogbG9uZyBDcmVhdGVEdW1teVdpbmRvd0FuZE1lc3NhZ2VMb29wKGxv
bmcgaEluc3RhbmNlLCBqYXZhLmxhbmcuU3RyaW5nIGNsYXNzTmFtZSwgamF2YS5sYW5nLlN0cmlu
ZyB3aW5kb3dOYW1lLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKICogICAg
IEMgZnVuY3Rpb246IEhBTkRMRSBDcmVhdGVEdW1teVdpbmRvd0FuZE1lc3NhZ2VMb29wKEhBTkRM
RSBoSW5zdGFuY2UsIExQQ1NUUiBjbGFzc05hbWUsIExQQ1NUUiB3aW5kb3dOYW1lLCBpbnQgeCwg
aW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAqLwpKTklFWFBPUlQgamxvbmcgSk5JQ0FM
TApKYXZhX2pvZ2FtcF9uYXRpdmV3aW5kb3dfd2luZG93c19HRElVdGlsX0NyZWF0ZUR1bW15V2lu
ZG93QW5kTWVzc2FnZUxvb3AKICAgIChKTklFbnYgKmVudiwgamNsYXNzIF91bnVzZWQsIGpsb25n
IGpISW5zdGFuY2UsIGpzdHJpbmcgalduZENsYXNzTmFtZSwganN0cmluZyBqV25kTmFtZSwgamlu
dCB4LCBqaW50IHksIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KSAKewogIHZvbGF0aWxlIEhXTkQg
aFduZCA9IDA7CiAgdm9sYXRpbGUgQk9PTCB3bmRJc0NyZWF0ZWQgPSBGQUxTRTsKICBUaHJlYWRQ
YXJhbSB0UGFyYW0gPSB7MH07CgogIHRQYXJhbS5qSEluc3RhbmNlID0gakhJbnN0YW5jZTsKICB0
UGFyYW0ueCA9IHg7CiAgdFBhcmFtLnkgPSB5OwogIHRQYXJhbS53aWR0aCA9IHdpZHRoOwogIHRQ
YXJhbS5oZWlnaHQgPSBoZWlnaHQ7CiAgdFBhcmFtLmhXbmRQdHIgPSAmaFduZDsKICB0UGFyYW0u
d25kSXNDcmVhdGVkID0gJnduZElzQ3JlYXRlZDsKCiNpZmRlZiBVTklDT0RFCiAgICB0UGFyYW0u
d25kQ2xhc3NOYW1lID0gTmV3dENvbW1vbl9HZXROdWxsVGVybWluYXRlZFN0cmluZ0NoYXJzKGVu
diwgalduZENsYXNzTmFtZSk7CiAgICB0UGFyYW0ud25kTmFtZSA9IE5ld3RDb21tb25fR2V0TnVs
bFRlcm1pbmF0ZWRTdHJpbmdDaGFycyhlbnYsIGpXbmROYW1lKTsKI2Vsc2UKICAgIHRQYXJhbS53
bmRDbGFzc05hbWUgPSAoKmVudiktPkdldFN0cmluZ1VURkNoYXJzKGVudiwgalduZENsYXNzTmFt
ZSwgTlVMTCk7CiAgICB0UGFyYW0ud25kTmFtZSA9ICgqZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMo
ZW52LCBqV25kTmFtZSwgTlVMTCk7CiNlbmRpZgoKICBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgQ3Jl
YXRlV2luZG93V2l0aE1lc3NhZ2VMb29wLCAmdFBhcmFtLCAwLCBOVUxMKTsKCiAgd2hpbGUoMSkK
ICAgIHsKICAgICAgaWYod25kSXNDcmVhdGVkKQoJYnJlYWs7CiAgICB9CgojaWZkZWYgVU5JQ09E
RQogICAgZnJlZSgodm9pZCopIHRQYXJhbS53bmRDbGFzc05hbWUpOwogICAgZnJlZSgodm9pZCop
IHRQYXJhbS53bmROYW1lKTsKI2Vsc2UKICAgICgqZW52KS0+UmVsZWFzZVN0cmluZ1VURkNoYXJz
KGVudiwgalduZENsYXNzTmFtZSwgdFBhcmFtLnduZENsYXNzTmFtZSk7CiAgICAoKmVudiktPlJl
bGVhc2VTdHJpbmdVVEZDaGFycyhlbnYsIGpXbmROYW1lLCB0UGFyYW0ud25kTmFtZSk7CiNlbmRp
ZgoKICByZXR1cm4gKGpsb25nKSAoaW50cHRyX3QpIGhXbmQ7Cn0KCi8qICAgSmF2YS0+QyBnbHVl
IGNvZGU6CiAqICAgSmF2YSBwYWNrYWdlOiBqb2dhbXAubmF0aXZld2luZG93LndpbmRvd3MuR0RJ
VXRpbAogKiAgICBKYXZhIG1ldGhvZDogbG9uZyBDcmVhdGVEdW1teVdpbmRvdzAobG9uZyBoSW5z
dGFuY2UsIGphdmEubGFuZy5TdHJpbmcgY2xhc3NOYW1lLCBqYXZhLmxhbmcuU3RyaW5nIHdpbmRv
d05hbWUsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogKiAgICAgQyBmdW5j
dGlvbjogSEFORExFIENyZWF0ZUR1bW15V2luZG93MChIQU5ETEUgaEluc3RhbmNlLCBMUENTVFIg
Y2xhc3NOYW1lLCBMUENTVFIgd2luZG93TmFtZSwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGlu
dCBoZWlnaHQpOwogKi8KSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwKSmF2YV9qb2dhbXBfbmF0aXZl
d2luZG93X3dpbmRvd3NfR0RJVXRpbF9DcmVhdGVEdW1teVdpbmRvdzAKICAgIChKTklFbnYgKmVu
diwgamNsYXNzIF91bnVzZWQsIGpsb25nIGpISW5zdGFuY2UsIGpzdHJpbmcgalduZENsYXNzTmFt
ZSwganN0cmluZyBqV25kTmFtZSwgamludCB4LCBqaW50IHksIGppbnQgd2lkdGgsIGppbnQgaGVp
Z2h0KSAKewogICAgSElOU1RBTkNFIGhJbnN0YW5jZSA9IChISU5TVEFOQ0UpIChpbnRwdHJfdCkg
akhJbnN0YW5jZTsKICAgIGNvbnN0IFRDSEFSKiB3bmRDbGFzc05hbWUgPSBOVUxMOwogICAgY29u
c3QgVENIQVIqIHduZE5hbWUgPSBOVUxMOwogICAgRFdPUkQgICAgIGR3RXhTdHlsZTsKICAgIERX
T1JEICAgICBkd1N0eWxlOwogICAgSFdORCAgICAgIGhXbmQ7CgojaWZkZWYgVU5JQ09ERQogICAg
d25kQ2xhc3NOYW1lID0gTmV3dENvbW1vbl9HZXROdWxsVGVybWluYXRlZFN0cmluZ0NoYXJzKGVu
diwgalduZENsYXNzTmFtZSk7CiAgICB3bmROYW1lID0gTmV3dENvbW1vbl9HZXROdWxsVGVybWlu
YXRlZFN0cmluZ0NoYXJzKGVudiwgalduZE5hbWUpOwojZWxzZQogICAgd25kQ2xhc3NOYW1lID0g
KCplbnYpLT5HZXRTdHJpbmdVVEZDaGFycyhlbnYsIGpXbmRDbGFzc05hbWUsIE5VTEwpOwogICAg
d25kTmFtZSA9ICgqZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMoZW52LCBqV25kTmFtZSwgTlVMTCk7
CiNlbmRpZgoKICAgIGR3RXhTdHlsZSA9IFdTX0VYX0FQUFdJTkRPVyB8IFdTX0VYX1dJTkRPV0VE
R0U7CiAgICBkd1N0eWxlID0gV1NfT1ZFUkxBUFBFRFdJTkRPVzsKCiAgICBoV25kID0gQ3JlYXRl
V2luZG93RXgoIGR3RXhTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kQ2xhc3NO
YW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICB3bmROYW1lLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICBkd1N0eWxlIHwgV1NfQ0xJUFNJQkxJTkdTIHwgV1NfQ0xJUENISUxEUkVOLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAg
ICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBoSW5zdGFuY2UsIE5VTEwgKTsKCiNpZmRlZiBV
TklDT0RFCiAgICBmcmVlKCh2b2lkKikgd25kQ2xhc3NOYW1lKTsKICAgIGZyZWUoKHZvaWQqKSB3
bmROYW1lKTsKI2Vsc2UKICAgICgqZW52KS0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGVudiwgaldu
ZENsYXNzTmFtZSwgd25kQ2xhc3NOYW1lKTsKICAgICgqZW52KS0+UmVsZWFzZVN0cmluZ1VURkNo
YXJzKGVudiwgalduZE5hbWUsIHduZE5hbWUpOwojZW5kaWYKCiAgICByZXR1cm4gKGpsb25nKSAo
aW50cHRyX3QpIGhXbmQ7Cn0KCgovKgogKiBDbGFzczogICAgIGpvZ2FtcF9uYXRpdmV3aW5kb3df
d2luZG93c19HRElVdGlsCiAqIE1ldGhvZDogICAgaW5pdElEczAKICogU2lnbmF0dXJlOiAoKVoK
ICovCkpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfam9nYW1wX25hdGl2ZXdpbmRvd193
aW5kb3dzX0dESVV0aWxfaW5pdElEczAKICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eikKewog
ICAgaWYoTmF0aXZld2luZG93Q29tbW9uX2luaXQoZW52KSkgewogICAgICAgIGpjbGFzcyBjID0g
KCplbnYpLT5GaW5kQ2xhc3MoZW52LCBDbGF6ek5hbWVQb2ludCk7CiAgICAgICAgaWYoTlVMTD09
YykgewogICAgICAgICAgICBOYXRpdmV3aW5kb3dDb21tb25fRmF0YWxFcnJvcihlbnYsICJGYXRh
bEVycm9yIGpvZ2FtcF9uYXRpdmV3aW5kb3dfd2luZG93c19HRElVdGlsOiBjYW4ndCBmaW5kICVz
IiwgQ2xhenpOYW1lUG9pbnQpOwogICAgICAgIH0KICAgICAgICBwb2ludENseiA9IChqY2xhc3Mp
KCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBjKTsKICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2Fs
UmVmKGVudiwgYyk7CiAgICAgICAgaWYoTlVMTD09cG9pbnRDbHopIHsKICAgICAgICAgICAgTmF0
aXZld2luZG93Q29tbW9uX0ZhdGFsRXJyb3IoZW52LCAiRmF0YWxFcnJvciBqb2dhbXBfbmF0aXZl
d2luZG93X3dpbmRvd3NfR0RJVXRpbDogY2FuJ3QgdXNlICVzIiwgQ2xhenpOYW1lUG9pbnQpOwog
ICAgICAgIH0KICAgICAgICBwb2ludENzdHIgPSAoKmVudiktPkdldE1ldGhvZElEKGVudiwgcG9p
bnRDbHosIENsYXp6QW55Q3N0ck5hbWUsIENsYXp6TmFtZVBvaW50Q3N0clNpZ25hdHVyZSk7CiAg
ICAgICAgaWYoTlVMTD09cG9pbnRDc3RyKSB7CiAgICAgICAgICAgIE5hdGl2ZXdpbmRvd0NvbW1v
bl9GYXRhbEVycm9yKGVudiwgIkZhdGFsRXJyb3Igam9nYW1wX25hdGl2ZXdpbmRvd193aW5kb3dz
X0dESVV0aWw6IGNhbid0IGZldGNoICVzLiVzICVzIiwKICAgICAgICAgICAgICAgIENsYXp6TmFt
ZVBvaW50LCBDbGF6ekFueUNzdHJOYW1lLCBDbGF6ek5hbWVQb2ludENzdHJTaWduYXR1cmUpOwog
ICAgICAgIH0KICAgIH0KICAgIHJldHVybiBKTklfVFJVRTsKfQoKTFJFU1VMVCBDQUxMQkFDSyBE
dW1teVduZFByb2MoIEhXTkQgaFduZCwgVUlOVCB1TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0g
bFBhcmFtKQp7CiAgcmV0dXJuIERlZldpbmRvd1Byb2MoaFduZCx1TXNnLHdQYXJhbSxsUGFyYW0p
Owp9CgovKgogKiBDbGFzczogICAgIGpvZ2FtcF9uYXRpdmV3aW5kb3dfd2luZG93c19HRElVdGls
CiAqIE1ldGhvZDogICAgZ2V0RHVtbXlXbmRQcm9jMAogKiBTaWduYXR1cmU6ICgpSgogKi8KSk5J
RVhQT1JUIGpsb25nIEpOSUNBTEwgSmF2YV9qb2dhbXBfbmF0aXZld2luZG93X3dpbmRvd3NfR0RJ
VXRpbF9nZXREdW1teVduZFByb2MwCiAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenopCnsKICBy
ZXR1cm4gKGpsb25nKSAoaW50cHRyX3QpIER1bW15V25kUHJvYzsKfQoKLyoKICogQ2xhc3M6ICAg
ICBqb2dhbXBfbmF0aXZld2luZG93X3dpbmRvd3NfR0RJVXRpbAogKiBNZXRob2Q6ICAgIEdldFJl
bGF0aXZlTG9jYXRpb24wCiAqIFNpZ25hdHVyZTogKEpKSUkpTGphdmF4L21lZGlhL25hdGl2ZXdp
bmRvdy91dGlsL1BvaW50OwogKi8KSk5JRVhQT1JUIGpvYmplY3QgSk5JQ0FMTCBKYXZhX2pvZ2Ft
cF9uYXRpdmV3aW5kb3dfd2luZG93c19HRElVdGlsX0dldFJlbGF0aXZlTG9jYXRpb24wCiAgKEpO
SUVudiAqZW52LCBqY2xhc3MgdW51c2VkLCBqbG9uZyBqc3JjX3dpbiwgamxvbmcgamRlc3Rfd2lu
LCBqaW50IHNyY194LCBqaW50IHNyY195KQp7CiAgICBIV05EIHNyY193aW4gPSAoSFdORCkgKGlu
dHB0cl90KSBqc3JjX3dpbjsKICAgIEhXTkQgZGVzdF93aW4gPSAoSFdORCkgKGludHB0cl90KSBq
ZGVzdF93aW47CiAgICBQT0lOVCBkZXN0ID0geyBzcmNfeCwgc3JjX3kgfSA7CiAgICBpbnQgcmVz
OwoKICAgIHJlcyA9IE1hcFdpbmRvd1BvaW50cyhzcmNfd2luLCBkZXN0X3dpbiwgJmRlc3QsIDEp
OwoKICAgIERCR19QUklOVCgiKioqIFdpbmRvd3NXaW5kb3c6IGdldFJlbGF0aXZlTG9jYXRpb24w
OiAlcCAlZC8lZCAtPiAlcCAlZC8lZCAtIG9rOiAlZFxuIiwKICAgICAgICAodm9pZCopc3JjX3dp
biwgc3JjX3gsIHNyY195LCAodm9pZCopZGVzdF93aW4sIChpbnQpZGVzdC54LCAoaW50KWRlc3Qu
eSwgcmVzKTsKCiAgICByZXR1cm4gKCplbnYpLT5OZXdPYmplY3QoZW52LCBwb2ludENseiwgcG9p
bnRDc3RyLCAoamludClkZXN0LngsIChqaW50KWRlc3QueSk7Cn0KCi8qCiAqIENsYXNzOiAgICAg
am9nYW1wX25hdGl2ZXdpbmRvd193aW5kb3dzX0dESVV0aWwKICogTWV0aG9kOiAgICBJc0NoaWxk
MAogKi8KSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9qb2dhbXBfbmF0aXZld2luZG93
X3dpbmRvd3NfR0RJVXRpbF9Jc0NoaWxkMAogIChKTklFbnYgKmVudiwgamNsYXNzIHVudXNlZCwg
amxvbmcgandpbikKewogICAgSFdORCBod25kID0gKEhXTkQpIChpbnRwdHJfdCkgandpbjsKICAg
IExPTkcgc3R5bGUgPSBHZXRXaW5kb3dMb25nKGh3bmQsIEdXTF9TVFlMRSk7CiAgICBCT09MIGJJ
c0NoaWxkID0gMCAhPSAoc3R5bGUgJiBXU19DSElMRCkgOwogICAgcmV0dXJuIGJJc0NoaWxkID8g
Sk5JX1RSVUUgOiBKTklfRkFMU0U7Cn0KCi8qCiAqIENsYXNzOiAgICAgam9nYW1wX25hdGl2ZXdp
bmRvd193aW5kb3dzX0dESVV0aWwKICogTWV0aG9kOiAgICBJc1VuZGVjb3JhdGVkMAogKi8KSk5J
RVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9qb2dhbXBfbmF0aXZld2luZG93X3dpbmRvd3Nf
R0RJVXRpbF9Jc1VuZGVjb3JhdGVkMAogIChKTklFbnYgKmVudiwgamNsYXNzIHVudXNlZCwgamxv
bmcgandpbikKewogICAgSFdORCBod25kID0gKEhXTkQpIChpbnRwdHJfdCkgandpbjsKICAgIExP
Tkcgc3R5bGUgPSBHZXRXaW5kb3dMb25nKGh3bmQsIEdXTF9TVFlMRSk7CiAgICBCT09MIGJJc1Vu
ZGVjb3JhdGVkID0gMCAhPSAoc3R5bGUgJiAoV1NfQ0hJTER8V1NfUE9QVVApKSA7CiAgICByZXR1
cm4gYklzVW5kZWNvcmF0ZWQgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKfQoKLyoKICogQ2xhc3M6
ICAgICBqb2dhbXBfbmF0aXZld2luZG93X3dpbmRvd3NfR0RJVXRpbAogKiBNZXRob2Q6ICAgIFNl
bmRDbG9zZU1lc3NhZ2UKICovCkpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfam9nYW1w
X25hdGl2ZXdpbmRvd193aW5kb3dzX0dESVV0aWxfU2VuZENsb3NlTWVzc2FnZQooSk5JRW52ICpl
bnYsIGpjbGFzcyB1bnVzZWQsIGpsb25nIGp3aW4pCnsKICAgIEhXTkQgaHduZCA9IChIV05EKSAo
aW50cHRyX3QpIGp3aW47CgogICAgQk9PTCByZXMgPSBQb3N0TWVzc2FnZShod25kLCBXTV9DTE9T
RSwgMCwgMCk7CgogICAgcmV0dXJuIHJlcyAhPSAwID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7Cn0K
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>545</attachid>
            <date>2013-11-20 10:14:22 +0100</date>
            <delta_ts>2013-11-20 10:14:22 +0100</delta_ts>
            <desc>modified source</desc>
            <filename>GDIUtil.java</filename>
            <type>application/octet-stream</type>
            <size>5786</size>
            <attacher name="Randolf Schultz">randolf.schultz</attacher>
            
              <data encoding="base64">LyoqCiAqIENvcHlyaWdodCAyMDExIEpvZ0FtcCBDb21tdW5pdHkuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQogKiBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKICoKICogICAgMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YKICogICAgICAgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgogKgogKiAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdAog
KiAgICAgICBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwogKiAgICAgICBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
Sm9nQW1wIENvbW11bml0eSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKICog
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgSm9nQW1wIENvbW11
bml0eSBPUgogKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgogKiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SCiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KICogQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORwogKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKICog
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqIFRoZSB2aWV3
cyBhbmQgY29uY2x1c2lvbnMgY29udGFpbmVkIGluIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRh
dGlvbiBhcmUgdGhvc2Ugb2YgdGhlCiAqIGF1dGhvcnMgYW5kIHNob3VsZCBub3QgYmUgaW50ZXJw
cmV0ZWQgYXMgcmVwcmVzZW50aW5nIG9mZmljaWFsIHBvbGljaWVzLCBlaXRoZXIgZXhwcmVzc2Vk
CiAqIG9yIGltcGxpZWQsIG9mIEpvZ0FtcCBDb21tdW5pdHkuCiAqLwpwYWNrYWdlIGpvZ2FtcC5u
YXRpdmV3aW5kb3cud2luZG93czsKCmltcG9ydCBqYXZheC5tZWRpYS5uYXRpdmV3aW5kb3cudXRp
bC5Qb2ludDsKaW1wb3J0IGphdmF4Lm1lZGlhLm5hdGl2ZXdpbmRvdy5OYXRpdmVXaW5kb3dFeGNl
cHRpb247CmltcG9ydCBqYXZheC5tZWRpYS5uYXRpdmV3aW5kb3cuTmF0aXZlV2luZG93RmFjdG9y
eTsKCmltcG9ydCBqb2dhbXAubmF0aXZld2luZG93Lk5XSk5JTGliTG9hZGVyOwppbXBvcnQgam9n
YW1wLm5hdGl2ZXdpbmRvdy5EZWJ1ZzsKaW1wb3J0IGpvZ2FtcC5uYXRpdmV3aW5kb3cuVG9vbGtp
dFByb3BlcnRpZXM7CgpwdWJsaWMgY2xhc3MgR0RJVXRpbCBpbXBsZW1lbnRzIFRvb2xraXRQcm9w
ZXJ0aWVzIHsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBEZWJ1Zy5k
ZWJ1ZygiR0RJVXRpbCIpOwoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkdW1teVdp
bmRvd0NsYXNzTmFtZUJhc2UgPSAiX2R1bW15V2luZG93X2NsYXp6IiA7CiAgICBwcml2YXRlIHN0
YXRpYyBSZWdpc3RlcmVkQ2xhc3NGYWN0b3J5IGR1bW15V2luZG93Q2xhc3NGYWN0b3J5OwogICAg
cHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXQgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIENh
bGxlZCBieSB7QGxpbmsgTmF0aXZlV2luZG93RmFjdG9yeSNpbml0U2luZ2xldG9uKCl9CiAgICAg
KiBAc2VlIFRvb2xraXRQcm9wZXJ0aWVzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgc3luY2hy
b25pemVkIHZvaWQgaW5pdFNpbmdsZXRvbigpIHsKICAgICAgICBpZighaXNJbml0KSB7CiAgICAg
ICAgICAgIHN5bmNocm9uaXplZChHRElVdGlsLmNsYXNzKSB7CiAgICAgICAgICAgICAgICBpZigh
aXNJbml0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcpIHsKICAgICAgICAgICAgICAg
ICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHREkuaW5pdFNpbmdsZXRvbigpIik7CiAgICAg
ICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmKCFOV0pOSUxpYkxvYWRlci5s
b2FkTmF0aXZlV2luZG93KCJ3aW4zMiIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93
IG5ldyBOYXRpdmVXaW5kb3dFeGNlcHRpb24oIk5hdGl2ZVdpbmRvdyBXaW5kb3dzIG5hdGl2ZSBs
aWJyYXJ5IGxvYWQgZXJyb3IuIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAg
ICAgICAgIGlmKCAhaW5pdElEczAoKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cg
bmV3IE5hdGl2ZVdpbmRvd0V4Y2VwdGlvbigiR0RJOiBDb3VsZCBub3QgaW5pdGlhbGl6ZWQgbmF0
aXZlIHN0dWIiKTsKICAgICAgICAgICAgICAgICAgICB9CgkJICAgIGxvbmcgYSA9IGdldER1bW15
V25kUHJvYzAoKTsKICAgICAgICAgICAgICAgICAgICBkdW1teVdpbmRvd0NsYXNzRmFjdG9yeSA9
IG5ldyBSZWdpc3RlcmVkQ2xhc3NGYWN0b3J5KGR1bW15V2luZG93Q2xhc3NOYW1lQmFzZSwgYSk7
CiAgICAgICAgICAgICAgICAgICAgaXNJbml0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAg
ICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENhbGxlZCBieSB7QGxp
bmsgTmF0aXZlV2luZG93RmFjdG9yeSNzaHV0ZG93bigpfQogICAgICogQHNlZSBUb29sa2l0UHJv
cGVydGllcwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7CiAgICB9
CgogICAgLyoqCiAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE5hdGl2ZVdpbmRvd0ZhY3RvcnkjaW5p
dFNpbmdsZXRvbigpfQogICAgICogQHNlZSBUb29sa2l0UHJvcGVydGllcwogICAgICovCiAgICBw
dWJsaWMgc3RhdGljIGJvb2xlYW4gcmVxdWlyZXNUb29sa2l0TG9jaygpIHsgcmV0dXJuIGZhbHNl
OyB9CgogICAgLyoqCiAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE5hdGl2ZVdpbmRvd0ZhY3Rvcnkj
aW5pdFNpbmdsZXRvbigpfQogICAgICogQHNlZSBUb29sa2l0UHJvcGVydGllcwogICAgICovCiAg
ICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaGFzVGhyZWFkaW5nSXNzdWVzKCkgeyByZXR1
cm4gZmFsc2U7IH0KCiAgICBwcml2YXRlIHN0YXRpYyBSZWdpc3RlcmVkQ2xhc3MgZHVtbXlXaW5k
b3dDbGFzcyA9IG51bGw7CiAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZHVtbXlXaW5kb3dTeW5j
ID0gbmV3IE9iamVjdCgpOwoKICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBDcmVhdGVEdW1teVdpbmRv
dyhpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgIHN5bmNocm9u
aXplZChkdW1teVdpbmRvd1N5bmMpIHsKICAgICAgICAgICAgZHVtbXlXaW5kb3dDbGFzcyA9IGR1
bW15V2luZG93Q2xhc3NGYWN0b3J5LmdldFNoYXJlZENsYXNzKCk7CiAgICAgICAgICAgIHJldHVy
biBDcmVhdGVEdW1teVdpbmRvd0FuZE1lc3NhZ2VMb29wKGR1bW15V2luZG93Q2xhc3MuZ2V0SElu
c3RhbmNlKCksIGR1bW15V2luZG93Q2xhc3MuZ2V0TmFtZSgpLCBkdW1teVdpbmRvd0NsYXNzLmdl
dE5hbWUoKSwgeCwgeSwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgfQogICAgfQoKICAgIHB1Ymxp
YyBzdGF0aWMgYm9vbGVhbiBEZXN0cm95RHVtbXlXaW5kb3cobG9uZyBod25kKSB7CiAgICAgICAg
Ym9vbGVhbiByZXM7CiAgICAgICAgc3luY2hyb25pemVkKGR1bW15V2luZG93U3luYykgewogICAg
ICAgICAgICBpZiggbnVsbCA9PSBkdW1teVdpbmRvd0NsYXNzICkgewogICAgICAgICAgICAgICAg
dGhyb3cgbmV3IEludGVybmFsRXJyb3IoIkdESSBFcnJvciAoIitkdW1teVdpbmRvd0NsYXNzRmFj
dG9yeS5nZXRTaGFyZWRSZWZDb3VudCgpKyIpOiBTaGFyZWRDbGFzcyBpcyBudWxsIik7CiAgICAg
ICAgICAgIH0KICAgICAgICAgICAgcmVzID0gU2VuZENsb3NlTWVzc2FnZShod25kKTsKICAgICAg
ICAgICAgZHVtbXlXaW5kb3dDbGFzc0ZhY3RvcnkucmVsZWFzZVNoYXJlZENsYXNzKCk7CiAgICAg
ICAgfQogICAgICAgIHJldHVybiByZXM7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBQb2ludCBH
ZXRSZWxhdGl2ZUxvY2F0aW9uKGxvbmcgc3JjX3dpbiwgbG9uZyBkZXN0X3dpbiwgaW50IHNyY194
LCBpbnQgc3JjX3kpIHsKICAgICAgICByZXR1cm4gKFBvaW50KSBHZXRSZWxhdGl2ZUxvY2F0aW9u
MChzcmNfd2luLCBkZXN0X3dpbiwgc3JjX3gsIHNyY195KTsKICAgIH0KCiAgICBwdWJsaWMgc3Rh
dGljIGJvb2xlYW4gSXNVbmRlY29yYXRlZChsb25nIHdpbikgewogICAgICAgIHJldHVybiBJc1Vu
ZGVjb3JhdGVkMCh3aW4pOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBJc0NoaWxk
KGxvbmcgd2luKSB7CiAgICAgICAgcmV0dXJuIElzQ2hpbGQwKHdpbik7CiAgICB9CgogICAgcHVi
bGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBDcmVhdGVXaW5kb3dDbGFzcyhsb25nIGhJbnN0YW5j
ZSwgU3RyaW5nIGNsYXp6TmFtZSwgbG9uZyB3bmRQcm9jKTsKICAgIHB1YmxpYyBzdGF0aWMgbmF0
aXZlIGJvb2xlYW4gRGVzdHJveVdpbmRvd0NsYXNzKGxvbmcgaEluc3RhbmNlLCBTdHJpbmcgY2xh
c3NOYW1lKTsKCiAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBpbml0SURzMCgpOwog
ICAgc3RhdGljIG5hdGl2ZSBsb25nIGdldER1bW15V25kUHJvYzAoKTsKICAgIHByaXZhdGUgc3Rh
dGljIG5hdGl2ZSBPYmplY3QgR2V0UmVsYXRpdmVMb2NhdGlvbjAobG9uZyBzcmNfd2luLCBsb25n
IGRlc3Rfd2luLCBpbnQgc3JjX3gsIGludCBzcmNfeSk7CiAgICBwcml2YXRlIHN0YXRpYyBuYXRp
dmUgYm9vbGVhbiBJc0NoaWxkMChsb25nIHdpbik7CiAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUg
Ym9vbGVhbiBJc1VuZGVjb3JhdGVkMChsb25nIHdpbik7CgogICAgc3RhdGljIG5hdGl2ZSBsb25n
IENyZWF0ZUR1bW15V2luZG93MChsb25nIGhJbnN0YW5jZSwgU3RyaW5nIGNsYXNzTmFtZSwgU3Ry
aW5nIHdpbmRvd05hbWUsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKCiAg
ICBzdGF0aWMgbmF0aXZlIGxvbmcgQ3JlYXRlRHVtbXlXaW5kb3dBbmRNZXNzYWdlTG9vcChsb25n
IGhJbnN0YW5jZSwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHdpbmRvd05hbWUsIGludCB4LCBp
bnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICAgIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBT
ZW5kQ2xvc2VNZXNzYWdlKGxvbmcgd2luKTsKfQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>547</attachid>
            <date>2013-11-22 10:11:45 +0100</date>
            <delta_ts>2013-11-22 10:11:45 +0100</delta_ts>
            <desc>GDIMisc.c revised to use only one thread</desc>
            <filename>GDImisc.c</filename>
            <type>application/octet-stream</type>
            <size>12707</size>
            <attacher name="Randolf Schultz">randolf.schultz</attacher>
            
              <data encoding="base64">I2luY2x1ZGUgPGpuaS5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4K
CiNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgojaW5jbHVkZSA8d2luZG93cy5oPgojdW5kZWYg
V0lOMzJfTEVBTl9BTkRfTUVBTgoKI2luY2x1ZGUgPHdpbmdkaS5oPgojaW5jbHVkZSA8c3RkZGVm
Lmg+CgojaW5jbHVkZSA8Z2x1ZWdlbl9zdGRpbnQuaD4KCiNpbmNsdWRlIDxzdGRpby5oPgoKI2lu
Y2x1ZGUgIk5hdGl2ZXdpbmRvd0NvbW1vbi5oIgojaW5jbHVkZSAiam9nYW1wX25hdGl2ZXdpbmRv
d193aW5kb3dzX0dESVV0aWwuaCIKCi8vICNkZWZpbmUgVkVSQk9TRV9PTiAxCgojaWZkZWYgVkVS
Qk9TRV9PTgogICAgI2RlZmluZSBEQkdfUFJJTlQoYXJncy4uLikgZnByaW50ZihzdGRlcnIsIGFy
Z3MpOwojZWxzZQogICAgI2RlZmluZSBEQkdfUFJJTlQoYXJncy4uLikKI2VuZGlmCgpzdGF0aWMg
Y29uc3QgY2hhciAqIGNvbnN0IENsYXp6TmFtZVBvaW50ID0gImphdmF4L21lZGlhL25hdGl2ZXdp
bmRvdy91dGlsL1BvaW50IjsKc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBDbGF6ekFueUNzdHJO
YW1lID0gIjxpbml0PiI7CnN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgQ2xhenpOYW1lUG9pbnRD
c3RyU2lnbmF0dXJlID0gIihJSSlWIjsKCnN0YXRpYyBqY2xhc3MgcG9pbnRDbHogPSBOVUxMOwpz
dGF0aWMgam1ldGhvZElEIHBvaW50Q3N0ciA9IE5VTEw7CgpzdGF0aWMgRFdPUkQgdGhyZWFkaWQg
PSAwOwoKdHlwZWRlZiBzdHJ1Y3QgVGhyZWFkUGFyYW1fcwp7CiAgamxvbmcgakhJbnN0YW5jZTsK
ICBjb25zdCBUQ0hBUiogd25kQ2xhc3NOYW1lOwogIGNvbnN0IFRDSEFSKiB3bmROYW1lOwogIGpp
bnQgeDsKICBqaW50IHk7CiAgamludCB3aWR0aDsKICBqaW50IGhlaWdodDsKICB2b2xhdGlsZSBI
V05EICpoV25kUHRyOwogIHZvbGF0aWxlIEJPT0wgKnRocmVhZFJlYWR5Owp9IFRocmVhZFBhcmFt
OwoKI2RlZmluZSBUTV9PUEVOV0lOIFdNX0FQUCsxCiNkZWZpbmUgVE1fQ0xPU0VXSU4gV01fQVBQ
KzIKI2RlZmluZSBUTV9TVE9QIFdNX0FQUCszCgpEV09SRCBXSU5BUEkgVGhyZWFkRnVuYyhMUFZP
SUQgcGFyYW0pCnsKIE1TRyBtc2c7CiBCT09MIGJSZXQ7CiBUaHJlYWRQYXJhbSAqc3RhcnR1cFRo
cmVhZFBhcmFtID0gKFRocmVhZFBhcmFtKilwYXJhbTsKCiAgLyogdGhlcmUgY2FuIG5vdCBiZSBh
bnkgbWVzc2FnZXMgZm9yIHVzIG5vdywgYXMgdGhlIGNyZWF0b3Igd2FpdHMgZm9yCiAgICAgdGhy
ZWFkUmVhZHkgYmVmb3JlIGNvbnRpbnVpbmcsIGJ1dCB3ZSBtdXN0IHVzZSB0aGlzIFBlZWtNZXNz
YWdlKCkgdG8KICAgICBjcmVhdGUgdGhlIHRocmVhZCBtZXNzYWdlIHF1ZXVlICovCiAgUGVla01l
c3NhZ2UoJm1zZywgTlVMTCwgMCwgMCwgUE1fTk9SRU1PVkUpOwoKICAvKiBub3cgd2UgY2FuIHNh
ZmVseSBzYXk6IHdlIGhhdmUgYSBxZXVlIGFuZCBhcmUgcmVhZHkgdG8gcmVjZWl2ZSBtZXNzYWdl
cyAqLwogICooc3RhcnR1cFRocmVhZFBhcmFtLT50aHJlYWRSZWFkeSkgPSBUUlVFOwoKICB3aGls
ZSggKGJSZXQgPSBHZXRNZXNzYWdlKCAmbXNnLCBOVUxMLCAwLCAwICkpICE9IDApCiAgICB7CiAg
ICAgIGlmIChiUmV0ID09IC0xKQoJewoJICByZXR1cm4gMDsKCX0KICAgICAgZWxzZQoJewoJICBz
d2l0Y2gobXNnLm1lc3NhZ2UpCgkgICAgewoJICAgIGNhc2UgVE1fT1BFTldJTjoKCSAgICAgIHsK
CQlUaHJlYWRQYXJhbSAqdFBhcmFtID0gKFRocmVhZFBhcmFtKiltc2cud1BhcmFtOwoJCUhJTlNU
QU5DRSBoSW5zdGFuY2UgPSAoSElOU1RBTkNFKSAoaW50cHRyX3QpIHRQYXJhbS0+akhJbnN0YW5j
ZTsKCQlEV09SRCBkd0V4U3R5bGU7CgkJRFdPUkQgZHdTdHlsZTsKCgkJZHdFeFN0eWxlID0gV1Nf
RVhfQVBQV0lORE9XIHwgV1NfRVhfV0lORE9XRURHRTsKCQlkd1N0eWxlID0gV1NfT1ZFUkxBUFBF
RFdJTkRPVzsKCgkJSFdORCBod25kID0gQ3JlYXRlV2luZG93RXgoIGR3RXhTdHlsZSwKCQkJCQkg
ICAgdFBhcmFtLT53bmRDbGFzc05hbWUsCgkJCQkJICAgIHRQYXJhbS0+d25kTmFtZSwKCQkJCWR3
U3R5bGUgfCBXU19DTElQU0lCTElOR1MgfCBXU19DTElQQ0hJTERSRU4sCgkJCSAgdFBhcmFtLT54
LCB0UGFyYW0tPnksIHRQYXJhbS0+d2lkdGgsIHRQYXJhbS0+aGVpZ2h0LAoJCQkJCSAgICBOVUxM
LCBOVUxMLCBoSW5zdGFuY2UsIE5VTEwgKTsKCgkJKih0UGFyYW0tPmhXbmRQdHIpID0gaHduZDsK
CQkqKHRQYXJhbS0+dGhyZWFkUmVhZHkpID0gVFJVRTsKCSAgICAgIH0KCSAgICAgIGJyZWFrOwoJ
ICAgIGNhc2UgVE1fQ0xPU0VXSU46CgkgICAgICB7CgkJVGhyZWFkUGFyYW0gKnRQYXJhbSA9IChU
aHJlYWRQYXJhbSopbXNnLndQYXJhbTsKCQlIV05EIGh3bmQgPSAqKHRQYXJhbS0+aFduZFB0cik7
CgkJRGVzdHJveVdpbmRvdyhod25kKTsKCQkqKHRQYXJhbS0+dGhyZWFkUmVhZHkpID0gVFJVRTsK
CSAgICAgIH0KCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgVE1fU1RPUDoKCSAgICAgIHJldHVybiAw
OwoJICAgICAgYnJlYWs7CSAgICAKCSAgICBkZWZhdWx0OgoJICAgICAgVHJhbnNsYXRlTWVzc2Fn
ZSgmbXNnKTsgCgkgICAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7IAoJICAgICAgYnJlYWs7Cgkg
ICAgfQoJfQogICAgfQoKIHJldHVybiAwOwp9IC8qIFRocmVhZEZ1bmMgKi8KCgpISU5TVEFOQ0Ug
R2V0QXBwbGljYXRpb25IYW5kbGUoKSB7CiAgICByZXR1cm4gR2V0TW9kdWxlSGFuZGxlKE5VTEwp
Owp9CgovKiAgIEphdmEtPkMgZ2x1ZSBjb2RlOgogKiAgIEphdmEgcGFja2FnZTogam9nYW1wLm5h
dGl2ZXdpbmRvdy53aW5kb3dzLkdESVV0aWwKICogICAgSmF2YSBtZXRob2Q6IGJvb2xlYW4gQ3Jl
YXRlV2luZG93Q2xhc3MobG9uZyBoSW5zdGFuY2UsIGphdmEubGFuZy5TdHJpbmcgY2xhenpOYW1l
LCBsb25nIHduZFByb2MpCiAqICAgICBDIGZ1bmN0aW9uOiBCT09MIENyZWF0ZVdpbmRvd0NsYXNz
KEhBTkRMRSBoSW5zdGFuY2UsIExQQ1NUUiBjbGF6ek5hbWUsIEhBTkRMRSB3bmRQcm9jKTsKICov
CkpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCkphdmFfam9nYW1wX25hdGl2ZXdpbmRvd193aW5k
b3dzX0dESVV0aWxfQ3JlYXRlV2luZG93Q2xhc3MKICAgIChKTklFbnYgKmVudiwgamNsYXNzIF91
bnVzZWQsIGpsb25nIGpISW5zdGFuY2UsIGpzdHJpbmcgakNsYXp6TmFtZSwgamxvbmcgd25kUHJv
YykgCnsKICAgIEhJTlNUQU5DRSBoSW5zdGFuY2UgPSAoSElOU1RBTkNFKSAoaW50cHRyX3QpIGpI
SW5zdGFuY2U7CiAgICBjb25zdCBUQ0hBUiogY2xhenpOYW1lID0gTlVMTDsKICAgIFdORENMQVNT
ICB3YzsKICAgIGpib29sZWFuIHJlczsKCiNpZmRlZiBVTklDT0RFCiAgICBjbGF6ek5hbWUgPSBO
ZXd0Q29tbW9uX0dldE51bGxUZXJtaW5hdGVkU3RyaW5nQ2hhcnMoZW52LCBqQ2xhenpOYW1lKTsK
I2Vsc2UKICAgIGNsYXp6TmFtZSA9ICgqZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMoZW52LCBqQ2xh
enpOYW1lLCBOVUxMKTsKI2VuZGlmCgogICAgWmVyb01lbW9yeSggJndjLCBzaXplb2YoIHdjICkg
KTsKICAgIGlmKCBHZXRDbGFzc0luZm8oIGhJbnN0YW5jZSwgIGNsYXp6TmFtZSwgJndjICkgKSB7
CiAgICAgICAgLy8gcmVnaXN0ZXJlZCBhbHJlYWR5CiAgICAgICAgcmVzID0gSk5JX1RSVUU7CiAg
ICB9IGVsc2UgeyAgICAgIAogICAgICAgIC8vIHJlZ2lzdGVyIG5vdwogICAgICAgIFplcm9NZW1v
cnkoICZ3Yywgc2l6ZW9mKCB3YyApICk7CiAgICAgICAgd2Muc3R5bGUgPSBDU19IUkVEUkFXIHwg
Q1NfVlJFRFJBVyA7CiAgICAgICAgd2MubHBmblduZFByb2MgPSAoV05EUFJPQykgKGludHB0cl90
KSB3bmRQcm9jOwogICAgICAgIHdjLmNiQ2xzRXh0cmEgPSAwOwogICAgICAgIHdjLmNiV25kRXh0
cmEgPSAwOwogICAgICAgIHdjLmhJbnN0YW5jZSA9IGhJbnN0YW5jZTsKICAgICAgICB3Yy5oSWNv
biA9IE5VTEw7CiAgICAgICAgd2MuaEN1cnNvciA9IExvYWRDdXJzb3IoIE5VTEwsIElEQ19BUlJP
Vyk7CiAgICAgICAgd2MuaGJyQmFja2dyb3VuZCA9IE5VTEw7IC8vIG5vIGJhY2tncm91bmQgcGFp
bnQgLSBHZXRTdG9ja09iamVjdChCTEFDS19CUlVTSCk7CiAgICAgICAgd2MubHBzek1lbnVOYW1l
ID0gTlVMTDsKICAgICAgICB3Yy5scHN6Q2xhc3NOYW1lID0gY2xhenpOYW1lOwogICAgICAgIHJl
cyA9ICggMCAhPSBSZWdpc3RlckNsYXNzKCAmd2MgKSApID8gSk5JX1RSVUUgOiBKTklfRkFMU0Ug
OwogICAgfQoKI2lmZGVmIFVOSUNPREUKICAgIGZyZWUoKHZvaWQqKSBjbGF6ek5hbWUpOwojZWxz
ZQogICAgKCplbnYpLT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZW52LCBqQ2xhenpOYW1lLCBjbGF6
ek5hbWUpOwojZW5kaWYKCiAgICBpZihyZXMgPT0gSk5JX1RSVUUpCiAgICAgIHsKCXZvbGF0aWxl
IEJPT0wgdGhyZWFkUmVhZHkgPSBGQUxTRTsKCVRocmVhZFBhcmFtIHRQYXJhbSA9IHswfTsKCXRQ
YXJhbS50aHJlYWRSZWFkeSA9ICZ0aHJlYWRSZWFkeTsKCglDcmVhdGVUaHJlYWQoTlVMTCwgMCwg
VGhyZWFkRnVuYywgKExQVk9JRCkmdFBhcmFtLCAwLCAmKHRocmVhZGlkKSk7CglpZih0aHJlYWRp
ZCkKCSAgewoJICAgIHdoaWxlKDEpCgkgICAgICB7CgkJaWYodGhyZWFkUmVhZHkpCgkJICBicmVh
azsKCSAgICAgIH0KCSAgfQoJZWxzZQoJICB7CgkgICAgcmVzID0gSk5JX0ZBTFNFOwoJICB9CiAg
ICAgIH0KCiAgICByZXR1cm4gcmVzOwp9CgovKiAgIEphdmEtPkMgZ2x1ZSBjb2RlOgogKiAgIEph
dmEgcGFja2FnZTogam9nYW1wLm5hdGl2ZXdpbmRvdy53aW5kb3dzLkdESVV0aWwKICogICAgSmF2
YSBtZXRob2Q6IGJvb2xlYW4gRGVzdHJveVdpbmRvd0NsYXNzKGxvbmcgaEluc3RhbmNlLCBqYXZh
LmxhbmcuU3RyaW5nIGNsYXNzTmFtZSkKICogICAgIEMgZnVuY3Rpb246IEJPT0wgRGVzdHJveVdp
bmRvd0NsYXNzKEhBTkRMRSBoSW5zdGFuY2UsIExQQ1NUUiBjbGFzc05hbWUpOwogKi8KSk5JRVhQ
T1JUIGpib29sZWFuIEpOSUNBTEwKSmF2YV9qb2dhbXBfbmF0aXZld2luZG93X3dpbmRvd3NfR0RJ
VXRpbF9EZXN0cm95V2luZG93Q2xhc3MKICAgIChKTklFbnYgKmVudiwgamNsYXNzIF91bnVzZWQs
IGpsb25nIGpISW5zdGFuY2UsIGpzdHJpbmcgakNsYXp6TmFtZSkgCnsKICAgIEhJTlNUQU5DRSBo
SW5zdGFuY2UgPSAoSElOU1RBTkNFKSAoaW50cHRyX3QpIGpISW5zdGFuY2U7CiAgICBjb25zdCBU
Q0hBUiogY2xhenpOYW1lID0gTlVMTDsKICAgIGpib29sZWFuIHJlczsKCiNpZmRlZiBVTklDT0RF
CiAgICBjbGF6ek5hbWUgPSBOZXd0Q29tbW9uX0dldE51bGxUZXJtaW5hdGVkU3RyaW5nQ2hhcnMo
ZW52LCBqQ2xhenpOYW1lKTsKI2Vsc2UKICAgIGNsYXp6TmFtZSA9ICgqZW52KS0+R2V0U3RyaW5n
VVRGQ2hhcnMoZW52LCBqQ2xhenpOYW1lLCBOVUxMKTsKI2VuZGlmCgogICAgcmVzID0gKCAwICE9
IFVucmVnaXN0ZXJDbGFzcyggY2xhenpOYW1lLCBoSW5zdGFuY2UgKSApID8gSk5JX1RSVUUgOiBK
TklfRkFMU0UgOwoKI2lmZGVmIFVOSUNPREUKICAgIGZyZWUoKHZvaWQqKSBjbGF6ek5hbWUpOwoj
ZWxzZQogICAgKCplbnYpLT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZW52LCBqQ2xhenpOYW1lLCBj
bGF6ek5hbWUpOwojZW5kaWYKCiAgICBQb3N0VGhyZWFkTWVzc2FnZSh0aHJlYWRpZCwgVE1fU1RP
UCwgMCwgMCk7CgogICAgcmV0dXJuIHJlczsKfQoKLyogICBKYXZhLT5DIGdsdWUgY29kZToKICog
ICBKYXZhIHBhY2thZ2U6IGpvZ2FtcC5uYXRpdmV3aW5kb3cud2luZG93cy5HRElVdGlsCiAqICAg
IEphdmEgbWV0aG9kOiBsb25nIENyZWF0ZUR1bW15V2luZG93QW5kTWVzc2FnZUxvb3AobG9uZyBo
SW5zdGFuY2UsIGphdmEubGFuZy5TdHJpbmcgY2xhc3NOYW1lLCBqYXZhLmxhbmcuU3RyaW5nIHdp
bmRvd05hbWUsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogKiAgICAgQyBm
dW5jdGlvbjogSEFORExFIENyZWF0ZUR1bW15V2luZG93QW5kTWVzc2FnZUxvb3AoSEFORExFIGhJ
bnN0YW5jZSwgTFBDU1RSIGNsYXNzTmFtZSwgTFBDU1RSIHdpbmRvd05hbWUsIGludCB4LCBpbnQg
eSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICovCkpOSUVYUE9SVCBqbG9uZyBKTklDQUxMCkph
dmFfam9nYW1wX25hdGl2ZXdpbmRvd193aW5kb3dzX0dESVV0aWxfQ3JlYXRlRHVtbXlXaW5kb3dB
bmRNZXNzYWdlTG9vcAogICAgKEpOSUVudiAqZW52LCBqY2xhc3MgX3VudXNlZCwgamxvbmcgakhJ
bnN0YW5jZSwganN0cmluZyBqV25kQ2xhc3NOYW1lLCBqc3RyaW5nIGpXbmROYW1lLCBqaW50IHgs
IGppbnQgeSwgamludCB3aWR0aCwgamludCBoZWlnaHQpIAp7CiAgdm9sYXRpbGUgSFdORCBoV25k
ID0gMDsKICB2b2xhdGlsZSBCT09MIHRocmVhZFJlYWR5ID0gRkFMU0U7CiAgVGhyZWFkUGFyYW0g
dFBhcmFtID0gezB9OwoKICB0UGFyYW0uakhJbnN0YW5jZSA9IGpISW5zdGFuY2U7CiAgdFBhcmFt
LnggPSB4OwogIHRQYXJhbS55ID0geTsKICB0UGFyYW0ud2lkdGggPSB3aWR0aDsKICB0UGFyYW0u
aGVpZ2h0ID0gaGVpZ2h0OwogIHRQYXJhbS5oV25kUHRyID0gJmhXbmQ7CiAgdFBhcmFtLnRocmVh
ZFJlYWR5ID0gJnRocmVhZFJlYWR5OwoKI2lmZGVmIFVOSUNPREUKICAgIHRQYXJhbS53bmRDbGFz
c05hbWUgPSBOZXd0Q29tbW9uX0dldE51bGxUZXJtaW5hdGVkU3RyaW5nQ2hhcnMoZW52LCBqV25k
Q2xhc3NOYW1lKTsKICAgIHRQYXJhbS53bmROYW1lID0gTmV3dENvbW1vbl9HZXROdWxsVGVybWlu
YXRlZFN0cmluZ0NoYXJzKGVudiwgalduZE5hbWUpOwojZWxzZQogICAgdFBhcmFtLnduZENsYXNz
TmFtZSA9ICgqZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMoZW52LCBqV25kQ2xhc3NOYW1lLCBOVUxM
KTsKICAgIHRQYXJhbS53bmROYW1lID0gKCplbnYpLT5HZXRTdHJpbmdVVEZDaGFycyhlbnYsIGpX
bmROYW1lLCBOVUxMKTsKI2VuZGlmCgogIFBvc3RUaHJlYWRNZXNzYWdlKHRocmVhZGlkLCBUTV9P
UEVOV0lOLCAoV1BBUkFNKSZ0UGFyYW0sIDApOwoKICB3aGlsZSgxKQogICAgewogICAgICBpZih0
aHJlYWRSZWFkeSkKCWJyZWFrOwogICAgfQoKI2lmZGVmIFVOSUNPREUKICAgIGZyZWUoKHZvaWQq
KSB0UGFyYW0ud25kQ2xhc3NOYW1lKTsKICAgIGZyZWUoKHZvaWQqKSB0UGFyYW0ud25kTmFtZSk7
CiNlbHNlCiAgICAoKmVudiktPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbnYsIGpXbmRDbGFzc05h
bWUsIHRQYXJhbS53bmRDbGFzc05hbWUpOwogICAgKCplbnYpLT5SZWxlYXNlU3RyaW5nVVRGQ2hh
cnMoZW52LCBqV25kTmFtZSwgdFBhcmFtLnduZE5hbWUpOwojZW5kaWYKCiAgcmV0dXJuIChqbG9u
ZykgKGludHB0cl90KSBoV25kOwp9CgovKiAgIEphdmEtPkMgZ2x1ZSBjb2RlOgogKiAgIEphdmEg
cGFja2FnZTogam9nYW1wLm5hdGl2ZXdpbmRvdy53aW5kb3dzLkdESVV0aWwKICogICAgSmF2YSBt
ZXRob2Q6IGxvbmcgQ3JlYXRlRHVtbXlXaW5kb3cwKGxvbmcgaEluc3RhbmNlLCBqYXZhLmxhbmcu
U3RyaW5nIGNsYXNzTmFtZSwgamF2YS5sYW5nLlN0cmluZyB3aW5kb3dOYW1lLCBpbnQgeCwgaW50
IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKICogICAgIEMgZnVuY3Rpb246IEhBTkRMRSBDcmVh
dGVEdW1teVdpbmRvdzAoSEFORExFIGhJbnN0YW5jZSwgTFBDU1RSIGNsYXNzTmFtZSwgTFBDU1RS
IHdpbmRvd05hbWUsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICovCkpO
SUVYUE9SVCBqbG9uZyBKTklDQUxMCkphdmFfam9nYW1wX25hdGl2ZXdpbmRvd193aW5kb3dzX0dE
SVV0aWxfQ3JlYXRlRHVtbXlXaW5kb3cwCiAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBfdW51c2Vk
LCBqbG9uZyBqSEluc3RhbmNlLCBqc3RyaW5nIGpXbmRDbGFzc05hbWUsIGpzdHJpbmcgalduZE5h
bWUsIGppbnQgeCwgamludCB5LCBqaW50IHdpZHRoLCBqaW50IGhlaWdodCkgCnsKICAgIEhJTlNU
QU5DRSBoSW5zdGFuY2UgPSAoSElOU1RBTkNFKSAoaW50cHRyX3QpIGpISW5zdGFuY2U7CiAgICBj
b25zdCBUQ0hBUiogd25kQ2xhc3NOYW1lID0gTlVMTDsKICAgIGNvbnN0IFRDSEFSKiB3bmROYW1l
ID0gTlVMTDsKICAgIERXT1JEICAgICBkd0V4U3R5bGU7CiAgICBEV09SRCAgICAgZHdTdHlsZTsK
ICAgIEhXTkQgICAgICBoV25kOwoKI2lmZGVmIFVOSUNPREUKICAgIHduZENsYXNzTmFtZSA9IE5l
d3RDb21tb25fR2V0TnVsbFRlcm1pbmF0ZWRTdHJpbmdDaGFycyhlbnYsIGpXbmRDbGFzc05hbWUp
OwogICAgd25kTmFtZSA9IE5ld3RDb21tb25fR2V0TnVsbFRlcm1pbmF0ZWRTdHJpbmdDaGFycyhl
bnYsIGpXbmROYW1lKTsKI2Vsc2UKICAgIHduZENsYXNzTmFtZSA9ICgqZW52KS0+R2V0U3RyaW5n
VVRGQ2hhcnMoZW52LCBqV25kQ2xhc3NOYW1lLCBOVUxMKTsKICAgIHduZE5hbWUgPSAoKmVudikt
PkdldFN0cmluZ1VURkNoYXJzKGVudiwgalduZE5hbWUsIE5VTEwpOwojZW5kaWYKCiAgICBkd0V4
U3R5bGUgPSBXU19FWF9BUFBXSU5ET1cgfCBXU19FWF9XSU5ET1dFREdFOwogICAgZHdTdHlsZSA9
IFdTX09WRVJMQVBQRURXSU5ET1c7CgogICAgaFduZCA9IENyZWF0ZVdpbmRvd0V4KCBkd0V4U3R5
bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHduZENsYXNzTmFtZSwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgd25kTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdHls
ZSB8IFdTX0NMSVBTSUJMSU5HUyB8IFdTX0NMSVBDSElMRFJFTiwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgeCwgeSwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
TlVMTCwgTlVMTCwgaEluc3RhbmNlLCBOVUxMICk7CgojaWZkZWYgVU5JQ09ERQogICAgZnJlZSgo
dm9pZCopIHduZENsYXNzTmFtZSk7CiAgICBmcmVlKCh2b2lkKikgd25kTmFtZSk7CiNlbHNlCiAg
ICAoKmVudiktPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbnYsIGpXbmRDbGFzc05hbWUsIHduZENs
YXNzTmFtZSk7CiAgICAoKmVudiktPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbnYsIGpXbmROYW1l
LCB3bmROYW1lKTsKI2VuZGlmCgogICAgcmV0dXJuIChqbG9uZykgKGludHB0cl90KSBoV25kOwp9
CgoKLyoKICogQ2xhc3M6ICAgICBqb2dhbXBfbmF0aXZld2luZG93X3dpbmRvd3NfR0RJVXRpbAog
KiBNZXRob2Q6ICAgIGluaXRJRHMwCiAqIFNpZ25hdHVyZTogKClaCiAqLwpKTklFWFBPUlQgamJv
b2xlYW4gSk5JQ0FMTCBKYXZhX2pvZ2FtcF9uYXRpdmV3aW5kb3dfd2luZG93c19HRElVdGlsX2lu
aXRJRHMwCiAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenopCnsKICAgIGlmKE5hdGl2ZXdpbmRv
d0NvbW1vbl9pbml0KGVudikpIHsKICAgICAgICBqY2xhc3MgYyA9ICgqZW52KS0+RmluZENsYXNz
KGVudiwgQ2xhenpOYW1lUG9pbnQpOwogICAgICAgIGlmKE5VTEw9PWMpIHsKICAgICAgICAgICAg
TmF0aXZld2luZG93Q29tbW9uX0ZhdGFsRXJyb3IoZW52LCAiRmF0YWxFcnJvciBqb2dhbXBfbmF0
aXZld2luZG93X3dpbmRvd3NfR0RJVXRpbDogY2FuJ3QgZmluZCAlcyIsIENsYXp6TmFtZVBvaW50
KTsKICAgICAgICB9CiAgICAgICAgcG9pbnRDbHogPSAoamNsYXNzKSgqZW52KS0+TmV3R2xvYmFs
UmVmKGVudiwgYyk7CiAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGMpOwogICAg
ICAgIGlmKE5VTEw9PXBvaW50Q2x6KSB7CiAgICAgICAgICAgIE5hdGl2ZXdpbmRvd0NvbW1vbl9G
YXRhbEVycm9yKGVudiwgIkZhdGFsRXJyb3Igam9nYW1wX25hdGl2ZXdpbmRvd193aW5kb3dzX0dE
SVV0aWw6IGNhbid0IHVzZSAlcyIsIENsYXp6TmFtZVBvaW50KTsKICAgICAgICB9CiAgICAgICAg
cG9pbnRDc3RyID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIHBvaW50Q2x6LCBDbGF6ekFueUNz
dHJOYW1lLCBDbGF6ek5hbWVQb2ludENzdHJTaWduYXR1cmUpOwogICAgICAgIGlmKE5VTEw9PXBv
aW50Q3N0cikgewogICAgICAgICAgICBOYXRpdmV3aW5kb3dDb21tb25fRmF0YWxFcnJvcihlbnYs
ICJGYXRhbEVycm9yIGpvZ2FtcF9uYXRpdmV3aW5kb3dfd2luZG93c19HRElVdGlsOiBjYW4ndCBm
ZXRjaCAlcy4lcyAlcyIsCiAgICAgICAgICAgICAgICBDbGF6ek5hbWVQb2ludCwgQ2xhenpBbnlD
c3RyTmFtZSwgQ2xhenpOYW1lUG9pbnRDc3RyU2lnbmF0dXJlKTsKICAgICAgICB9CiAgICB9CiAg
ICByZXR1cm4gSk5JX1RSVUU7Cn0KCkxSRVNVTFQgQ0FMTEJBQ0sgRHVtbXlXbmRQcm9jKCBIV05E
IGhXbmQsIFVJTlQgdU1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKewogIHJldHVy
biBEZWZXaW5kb3dQcm9jKGhXbmQsdU1zZyx3UGFyYW0sbFBhcmFtKTsKfQoKLyoKICogQ2xhc3M6
ICAgICBqb2dhbXBfbmF0aXZld2luZG93X3dpbmRvd3NfR0RJVXRpbAogKiBNZXRob2Q6ICAgIGdl
dER1bW15V25kUHJvYzAKICogU2lnbmF0dXJlOiAoKUoKICovCkpOSUVYUE9SVCBqbG9uZyBKTklD
QUxMIEphdmFfam9nYW1wX25hdGl2ZXdpbmRvd193aW5kb3dzX0dESVV0aWxfZ2V0RHVtbXlXbmRQ
cm9jMAogIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6KQp7CiAgcmV0dXJuIChqbG9uZykgKGlu
dHB0cl90KSBEdW1teVduZFByb2M7Cn0KCi8qCiAqIENsYXNzOiAgICAgam9nYW1wX25hdGl2ZXdp
bmRvd193aW5kb3dzX0dESVV0aWwKICogTWV0aG9kOiAgICBHZXRSZWxhdGl2ZUxvY2F0aW9uMAog
KiBTaWduYXR1cmU6IChKSklJKUxqYXZheC9tZWRpYS9uYXRpdmV3aW5kb3cvdXRpbC9Qb2ludDsK
ICovCkpOSUVYUE9SVCBqb2JqZWN0IEpOSUNBTEwgSmF2YV9qb2dhbXBfbmF0aXZld2luZG93X3dp
bmRvd3NfR0RJVXRpbF9HZXRSZWxhdGl2ZUxvY2F0aW9uMAogIChKTklFbnYgKmVudiwgamNsYXNz
IHVudXNlZCwgamxvbmcganNyY193aW4sIGpsb25nIGpkZXN0X3dpbiwgamludCBzcmNfeCwgamlu
dCBzcmNfeSkKewogICAgSFdORCBzcmNfd2luID0gKEhXTkQpIChpbnRwdHJfdCkganNyY193aW47
CiAgICBIV05EIGRlc3Rfd2luID0gKEhXTkQpIChpbnRwdHJfdCkgamRlc3Rfd2luOwogICAgUE9J
TlQgZGVzdCA9IHsgc3JjX3gsIHNyY195IH0gOwogICAgaW50IHJlczsKCiAgICByZXMgPSBNYXBX
aW5kb3dQb2ludHMoc3JjX3dpbiwgZGVzdF93aW4sICZkZXN0LCAxKTsKCiAgICBEQkdfUFJJTlQo
IioqKiBXaW5kb3dzV2luZG93OiBnZXRSZWxhdGl2ZUxvY2F0aW9uMDogJXAgJWQvJWQgLT4gJXAg
JWQvJWQgLSBvazogJWRcbiIsCiAgICAgICAgKHZvaWQqKXNyY193aW4sIHNyY194LCBzcmNfeSwg
KHZvaWQqKWRlc3Rfd2luLCAoaW50KWRlc3QueCwgKGludClkZXN0LnksIHJlcyk7CgogICAgcmV0
dXJuICgqZW52KS0+TmV3T2JqZWN0KGVudiwgcG9pbnRDbHosIHBvaW50Q3N0ciwgKGppbnQpZGVz
dC54LCAoamludClkZXN0LnkpOwp9CgovKgogKiBDbGFzczogICAgIGpvZ2FtcF9uYXRpdmV3aW5k
b3dfd2luZG93c19HRElVdGlsCiAqIE1ldGhvZDogICAgSXNDaGlsZDAKICovCkpOSUVYUE9SVCBq
Ym9vbGVhbiBKTklDQUxMIEphdmFfam9nYW1wX25hdGl2ZXdpbmRvd193aW5kb3dzX0dESVV0aWxf
SXNDaGlsZDAKICAoSk5JRW52ICplbnYsIGpjbGFzcyB1bnVzZWQsIGpsb25nIGp3aW4pCnsKICAg
IEhXTkQgaHduZCA9IChIV05EKSAoaW50cHRyX3QpIGp3aW47CiAgICBMT05HIHN0eWxlID0gR2V0
V2luZG93TG9uZyhod25kLCBHV0xfU1RZTEUpOwogICAgQk9PTCBiSXNDaGlsZCA9IDAgIT0gKHN0
eWxlICYgV1NfQ0hJTEQpIDsKICAgIHJldHVybiBiSXNDaGlsZCA/IEpOSV9UUlVFIDogSk5JX0ZB
TFNFOwp9CgovKgogKiBDbGFzczogICAgIGpvZ2FtcF9uYXRpdmV3aW5kb3dfd2luZG93c19HRElV
dGlsCiAqIE1ldGhvZDogICAgSXNVbmRlY29yYXRlZDAKICovCkpOSUVYUE9SVCBqYm9vbGVhbiBK
TklDQUxMIEphdmFfam9nYW1wX25hdGl2ZXdpbmRvd193aW5kb3dzX0dESVV0aWxfSXNVbmRlY29y
YXRlZDAKICAoSk5JRW52ICplbnYsIGpjbGFzcyB1bnVzZWQsIGpsb25nIGp3aW4pCnsKICAgIEhX
TkQgaHduZCA9IChIV05EKSAoaW50cHRyX3QpIGp3aW47CiAgICBMT05HIHN0eWxlID0gR2V0V2lu
ZG93TG9uZyhod25kLCBHV0xfU1RZTEUpOwogICAgQk9PTCBiSXNVbmRlY29yYXRlZCA9IDAgIT0g
KHN0eWxlICYgKFdTX0NISUxEfFdTX1BPUFVQKSkgOwogICAgcmV0dXJuIGJJc1VuZGVjb3JhdGVk
ID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7Cn0KCi8qCiAqIENsYXNzOiAgICAgam9nYW1wX25hdGl2
ZXdpbmRvd193aW5kb3dzX0dESVV0aWwKICogTWV0aG9kOiAgICBTZW5kQ2xvc2VNZXNzYWdlCiAq
LwpKTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2pvZ2FtcF9uYXRpdmV3aW5kb3dfd2lu
ZG93c19HRElVdGlsX1NlbmRDbG9zZU1lc3NhZ2UKKEpOSUVudiAqZW52LCBqY2xhc3MgdW51c2Vk
LCBqbG9uZyBqd2luKQp7CiAgVGhyZWFkUGFyYW0gdFBhcmFtID0gezB9OwogIHZvbGF0aWxlIEhX
TkQgaHduZCA9IChIV05EKSAoaW50cHRyX3QpIGp3aW47CiAgdm9sYXRpbGUgQk9PTCB0aHJlYWRS
ZWFkeSA9IEZBTFNFOwoKICB0UGFyYW0uaFduZFB0ciA9ICYoaHduZCk7CiAgdFBhcmFtLnRocmVh
ZFJlYWR5ID0gJih0aHJlYWRSZWFkeSk7CgogIFBvc3RUaHJlYWRNZXNzYWdlKHRocmVhZGlkLCBU
TV9DTE9TRVdJTiwgKFdQQVJBTSkmdFBhcmFtLCAwKTsKCiAgd2hpbGUoMSkKICAgIHsKICAgICAg
aWYodGhyZWFkUmVhZHkpCglicmVhazsKICAgIH0KCiAgcmV0dXJuIEpOSV9UUlVFOwp9Cgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>561</attachid>
            <date>2013-11-27 11:23:21 +0100</date>
            <delta_ts>2013-11-27 11:23:21 +0100</delta_ts>
            <desc>test program</desc>
            <filename>tmpr.c</filename>
            <type>application/octet-stream</type>
            <size>636</size>
            <attacher name="Randolf Schultz">randolf.schultz</attacher>
            
              <data encoding="base64">I2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFODQojaW5jbHVkZSA8d2luZG93cy5oPg0KI3VuZGVm
IFdJTjMyX0xFQU5fQU5EX01FQU4NCg0KI2luY2x1ZGUgPHdpbmdkaS5oPg0KI2luY2x1ZGUgPHN0
ZGRlZi5oPg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQoNCkJPT0wgQ0FMTEJBQ0sgRW51bVdpbmRvd3NQ
cm9jKEhXTkQgaHduZCwgTFBBUkFNIGxQYXJhbSkNCnsNCiBCT09MIGJSZXQgPSBTZW5kTWVzc2Fn
ZVRpbWVvdXQoaHduZCwgV01fR0VUVEVYVCwgMCwgMCwNCgkJCQlTTVRPX0FCT1JUSUZIVU5HLCAx
MDAwLyptcyovLCBOVUxMKTsNCiBpZihiUmV0ID09IDApDQogICB7DQogICAgIGZwcmludGYoc3Rk
ZXJyLCJGQUlMVVJFISIpOw0KICAgICBleGl0KEVYSVRfRkFJTFVSRSk7DQogICB9DQogcmV0dXJu
IFRSVUU7DQp9DQoNCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikNCnsNCiBCT09MIGJS
ZXQgPSBFbnVtV2luZG93cyhFbnVtV2luZG93c1Byb2MsIDApOw0KIGlmKGJSZXQgPT0gMCkNCiAg
IHsNCiAgICAgZnByaW50ZihzdGRlcnIsIkVSUk9SISIpOw0KICAgICBleGl0KEVYSVRfRkFJTFVS
RSk7DQogICB9DQogZnByaW50ZihzdGRlcnIsIlNVQ0NFU1MhIik7DQogZXhpdChFWElUX1NVQ0NF
U1MpOw0KfQ0K
</data>

          </attachment>
      

    </bug>

</bugzilla>