Re: Complex Exponential Integral

Erik Luijten <[email protected]> Tue, 8 Jul 2025 20:55:03 -0500
Newsgroups gmane.comp.graphics.gnuplot.devel
Message-ID <CAM4Pt--VfuJjMSkvZNNSwH8Zw95gYYmUmY0WPRfWwhty4YpUsw@mail.gmail.com>
--0000000000004bcf7e0639755ea2
Content-Type: multipart/alternative; boundary="0000000000004bcf7d0639755ea0"

--0000000000004bcf7d0639755ea0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Hi,

I found the code on https://dl.acm.org/doi/abs/10.1145/78928.78934; the
supplementary material contains all the subroutines concatenated into one
file (https://dl.acm.org/doi/suppl/10.1145/78928.78934/suppl_file/683.gz).
It is also available on https://www.netlib.org/toms-2014-06-10/ (scroll to
algorithm 683).
The fact that it is on netlib tells me it is likely free to use. However,
the ACM TOMS license agreement is here:
https://www.acm.org/publications/policies/software-copyright-notice . I am
not sure if this conflicts with Gnuplot's license? Whether a more
permissive license applies to cexint_.f  than to zexint_.f is also unclear
to me.

An awkward point, to the best of my understanding, is that an unmodified
version of cexint will not work with the Gnuplot source code, as it expects
single-precision arguments. Yet, changing cexint is not
completely straightforward: Comparing cexint and zexint (and the
accompanying routines cexent and zexent), I noticed the more subtle point
that cexint uses r1mach.f and zexint uses d1mach.f; moreover, they use
different constants from i1mach to establish precision (elements 12,13 vs.
15,16). Also, in zexint all constants are replaced by their
double-precision counterparts.

For all these reasons, I would argue that if copyright restrictions are the
same for cexint and zexint, it would be better to use the latter - a user
could then directly download this subroutine and use it without
modifications.

Lastly, a tricky point that is easily overlooked is that i1mach, r1mach,
d1mach need to be configured for x86. Moreover, since openspecfun is built
as a library, it already contains i1mach and d1mach, opening the door for
conflicting functions if one gathers cexint/zexint into a separate
library...

I am attaching my modified version of amos_airy.c, in case you are swayed
by my argument...

Best,

Erik







On Tue, Jul 8, 2025 at 7:26=E2=80=AFPM Ethan A Merritt <[email protected]> wro=
te:

> On Tuesday, 8 July 2025 14:21:01 PDT Erik Luijten wrote:
> > Hi Ethan,
> >
> > In amos_airy.c, you write:
> >
> >  * The cexint_() routine is also from the AMOS collection, but is not
> part
> >  * of the Bessel function subset and not included in libopenspecfun.
> >  * I could not find source for a version of the source that splits the
> >  * real and imaginary parts of the arguments as with the zxxxx.f Bessel
> >  * routines; this one accepts and returns a CMPLX argument rather than
> > separate
> >  * real and imaginary parts.
> >  *             D. E. Amos, ALGORITHM 683  A Portable FORTRAN Subroutine
> >  *             for Exponential Integrals of a Complex Argument
> >  *             ACM Trans. Math. Software 16:178-182 (1990)
> >
> > This confuses me for two reasons:
> > - You invoke CEXINT as a double precision function, even though this
> > Fortran function is single precision.
>
> > - The algorithm 683 you quote DOES provide a separate double precision
> > function, ZEXINT. Moreover, that function does exactly what you were
> > looking for, namely taking and returning separate real and imaginary
> parts.
>
> There is some history behind this due to IMHO over-zealous, or at least
> overly pessimistic, concern about license contamination with non-free cod=
e.
> I cited a publication in ACM/TMS that describes the implementation.
> However, people have assserted that code obtained through the ACM
> journal is non-free because the journal claims copyright.
> I believe this to be factually incorrect; the published article may be
> subject
> to copyright but not the code it describes. In any case, rather than purs=
ue
> the argument I instead used copies of the code obtained from US national
> lab repositories.  I found source there for cexint.f but not for zexint.f=
,
> so that is what I use myself to build libamos and what I invoked from the
> gnuplot code.
>
> Even so that was apparently not sufficient by itself to convince hard-cor=
e
> "free licenses only" gatekeepers.
> There is an explicit statement of the [non]copyright status of the code
> in the cited 1985 Sandia National Laboratory report, but that report
> predated development of the expint routines (1990?) and I did not find a
> separate Sandia report that mentions them specifically.
> That is probably why neither routine is included in libopenspec,
> and why inclusion in gnuplot is a configuration option.
>
> > I changed f_amos_cexint to use ZEXINT (just for my own edification) and
> it
> > works properly. However, before submitting it, I wonder what am I
> missing?
>
> Where did you obtain a copy of the source?
> Can you document the relevant claim or non-claim of copyright or
> licensing?
>
> And, out of curiosity, is there anything in the zexint.f code that would
> differentiate it from a single-precision version other than declaration
> of the variables as Fortran DOUBLE PRECISION?
>
>         Ethan
>
>
> >
> > Thank you,
> >
> > Erik
> >
>
>
>
>

--0000000000004bcf7d0639755ea0
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Hi,<div><br></div><div>I found the=C2=A0code on=C2=A0<a hr=
ef=3D"https://dl.acm.org/doi/abs/10.1145/78928.78934">https://dl.acm.org/do=
i/abs/10.1145/78928.78934</a>; the supplementary material contains all the =
subroutines concatenated into one file (<a href=3D"https://dl.acm.org/doi/s=
uppl/10.1145/78928.78934/suppl_file/683.gz">https://dl.acm.org/doi/suppl/10=
.1145/78928.78934/suppl_file/683.gz</a>).=C2=A0 It is also available on=C2=
=A0<a href=3D"https://www.netlib.org/toms-2014-06-10/">https://www.netlib.o=
rg/toms-2014-06-10/</a> (scroll to algorithm 683).<br>The fact that it is o=
n netlib tells me it is likely free to use. However, the ACM TOMS license a=
greement is here:=C2=A0<a href=3D"https://www.acm.org/publications/policies=
/software-copyright-notice">https://www.acm.org/publications/policies/softw=
are-copyright-notice</a> . I am not sure if this conflicts with Gnuplot&#39=
;s=C2=A0license? Whether a more permissive license applies to cexint_.f=C2=
=A0 than to zexint_.f is also unclear to me.<br><br>An awkward point, to th=
e best of my understanding, is that an unmodified version of cexint will no=
t work with the Gnuplot source code, as it expects single-precision argumen=
ts. Yet, changing=C2=A0cexint is not completely=C2=A0straightforward: Compa=
ring=C2=A0cexint and=C2=A0zexint (and the accompanying routines cexent=C2=
=A0and zexent), I noticed the more subtle point that cexint uses r1mach.f a=
nd zexint=C2=A0uses d1mach.f; moreover, they use different constants from i=
1mach to establish precision (elements 12,13 vs. 15,16). Also, in zexint al=
l constants are replaced by their double-precision counterparts.</div><div>=
<br></div><div>For all these reasons, I would argue that if copyright restr=
ictions are the same for cexint and zexint, it would be better to use the l=
atter - a user could then directly download this subroutine and use it with=
out modifications.</div><div><br></div><div>Lastly, a tricky point that is =
easily overlooked is that i1mach, r1mach, d1mach need to be configured for =
x86. Moreover, since openspecfun=C2=A0is built as a library, it already con=
tains i1mach=C2=A0and d1mach, opening the door for conflicting functions if=
 one gathers=C2=A0cexint/zexint=C2=A0into a separate library...</div><div><=
br></div><div>I am attaching my modified version of amos_airy.c, in case yo=
u are swayed by my argument...</div><div><br></div><div>Best,</div><div><br=
></div><div>Erik</div><div><br></div><div><br></div><div><br></div><div><br=
></div><div><br></div><div><br></div></div><br><div class=3D"gmail_quote gm=
ail_quote_container"><div dir=3D"ltr" class=3D"gmail_attr">On Tue, Jul 8, 2=
025 at 7:26=E2=80=AFPM Ethan A Merritt &lt;<a href=3D"mailto:[email protected]=
">[email protected]</a>&gt; wrote:<br></div><blockquote class=3D"gmail_quote" =
style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);pa=
dding-left:1ex">On Tuesday, 8 July 2025 14:21:01 PDT Erik Luijten wrote:<br=
>
&gt; Hi Ethan,<br>
&gt; <br>
&gt; In amos_airy.c, you write:<br>
&gt; <br>
&gt;=C2=A0 * The cexint_() routine is also from the AMOS collection, but is=
 not part<br>
&gt;=C2=A0 * of the Bessel function subset and not included in libopenspecf=
un.<br>
&gt;=C2=A0 * I could not find source for a version of the source that split=
s the<br>
&gt;=C2=A0 * real and imaginary parts of the arguments as with the zxxxx.f =
Bessel<br>
&gt;=C2=A0 * routines; this one accepts and returns a CMPLX argument rather=
 than<br>
&gt; separate<br>
&gt;=C2=A0 * real and imaginary parts.<br>
&gt;=C2=A0 *=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0D. E. Amos, ALG=
ORITHM 683=C2=A0 A Portable FORTRAN Subroutine<br>
&gt;=C2=A0 *=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for Exponential=
 Integrals of a Complex Argument<br>
&gt;=C2=A0 *=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ACM Trans. Math=
. Software 16:178-182 (1990)<br>
&gt; <br>
&gt; This confuses me for two reasons:<br>
&gt; - You invoke CEXINT as a double precision function, even though this<b=
r>
&gt; Fortran function is single precision.<br>
<br>
&gt; - The algorithm 683 you quote DOES provide a separate double precision=
<br>
&gt; function, ZEXINT. Moreover, that function does exactly what you were<b=
r>
&gt; looking for, namely taking and returning separate real and imaginary p=
arts.<br>
<br>
There is some history behind this due to IMHO over-zealous, or at least<br>
overly pessimistic, concern about license contamination with non-free code.=
<br>
I cited a publication in ACM/TMS that describes the implementation.<br>
However, people have assserted that code obtained through the ACM<br>
journal is non-free because the journal claims copyright.<br>
I believe this to be factually incorrect; the published article may be subj=
ect<br>
to copyright but not the code it describes. In any case, rather than pursue=
<br>
the argument I instead used copies of the code obtained from US national<br=
>
lab repositories.=C2=A0 I found source there for cexint.f but not for zexin=
t.f,<br>
so that is what I use myself to build libamos and what I invoked from the<b=
r>
gnuplot code.<br>
<br>
Even so that was apparently not sufficient by itself to convince hard-core<=
br>
&quot;free licenses only&quot; gatekeepers.<br>
There is an explicit statement of the [non]copyright status of the code<br>
in the cited 1985 Sandia National Laboratory report, but that report<br>
predated development of the expint routines (1990?) and I did not find a<br=
>
separate Sandia report that mentions them specifically. <br>
That is probably why neither routine is included in libopenspec,<br>
and why inclusion in gnuplot is a configuration option.<br>
<br>
&gt; I changed f_amos_cexint to use ZEXINT (just for my own edification) an=
d it<br>
&gt; works properly. However, before submitting it, I wonder what am I miss=
ing?<br>
<br>
Where did you obtain a copy of the source?<br>
Can you document the relevant claim or non-claim of copyright or<br>
licensing?<br>
<br>
And, out of curiosity, is there anything in the zexint.f code that would<br=
>
differentiate it from a single-precision version other than declaration<br>
of the variables as Fortran DOUBLE PRECISION?<br>
<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 Ethan<br>
<br>
<br>
&gt; <br>
&gt; Thank you,<br>
&gt; <br>
&gt; Erik<br>
&gt; <br>
<br>
<br>
<br>
</blockquote></div>

--0000000000004bcf7d0639755ea0--
--0000000000004bcf7e0639755ea2
Content-Type: application/octet-stream; name="amos_airy.c"
Content-Disposition: attachment; filename="amos_airy.c"
Content-Transfer-Encoding: base64
Content-ID: <f_mcvb2o450>
X-Attachment-Id: f_mcvb2o450

LyoKICogQmVzc2VsIGZ1bmN0aW9ucyBhbmQgcmVsYXRlZCBzcGVjaWFsIGZ1bmN0aW9ucy4KICog
VGhlIHJvdXRpbmVzIGluIHRoaXMgZmlsZSBhcmUgd3JhcHBlcnMgZm9yIGltcGxlbWVudGF0aW9u
cyBpbiBhbgogKiBleHRlcm5hbCBsaWJyYXJ5IGRldGVjdGVkIGF0IGNvbmZpZ3VyYXRpb24vYnVp
bGQgdGltZS4KICoJQU1PUyAtIEEgUG9ydGFibGUgUGFja2FnZSBmb3IgQmVzc2VsIEZ1bmN0aW9u
cyBvZiBhIENvbXBsZXggQXJndW1lbnQKICoJICAgICAgIGFuZCBOb25uZWdhdGl2ZSBPcmRlcgog
KiAgICAgICAgICAgICBELiBFLiBBbW9zLCBTYW5kaWEgTmF0aW9uYWwgTGFib3JhdG9yaWVzLCBT
QU5EODUtMTAxOCAoMTk4NSkKICogVGhlIGFtb3Mgcm91dGluZXMgaGF2ZSBiZWVuIHBhY2thZ2Vk
IGJ5IHZhcmlvdXMgcHJvamVjdHMgaW4gc2xpZ2h0bHkgCiAqIGRpZmZlcmVudCB3YXlzLgogKiBU
aGUgemFpcnlfKCkgcm91dGluZSAobm90ZSBGb3J0cmFuIG5hbWluZyBhbmQgcGFyYW1ldGVyIHBh
c3NpbmcgY29udmVudGlvbnMpCiAqIGlzIGZvdW5kLCBmb3IgZXhhbXBsZSwgaW4gbGlib3BlbnNw
ZWNmdW4uICBXZSB1c2UgaXQgdG8gY2FsY3VsYXRlIEFpKHopLgogKiBTaW1pbGFybHkgemJpcnlf
KCkgaXMgdXNlZCB0byBjYWxjdWFsdGUgQmkoeikuCiAqCiAqIFRoZSBjZXhpbnRfKCkgcm91dGlu
ZSBpcyBhbHNvIGZyb20gdGhlIEFNT1MgY29sbGVjdGlvbiwgYnV0IGlzIG5vdCBwYXJ0CiAqIG9m
IHRoZSBCZXNzZWwgZnVuY3Rpb24gc3Vic2V0IGFuZCBub3QgaW5jbHVkZWQgaW4gbGlib3BlbnNw
ZWNmdW4uCiAqIEkgY291bGQgbm90IGZpbmQgc291cmNlIGZvciBhIHZlcnNpb24gb2YgdGhlIHNv
dXJjZSB0aGF0IHNwbGl0cyB0aGUKICogcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIG9mIHRoZSBh
cmd1bWVudHMgYXMgd2l0aCB0aGUgenh4eHguZiBCZXNzZWwKICogcm91dGluZXM7IHRoaXMgb25l
IGFjY2VwdHMgYW5kIHJldHVybnMgYSBDTVBMWCBhcmd1bWVudCByYXRoZXIgdGhhbiBzZXBhcmF0
ZQogKiByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMuCiAqICAgICAgICAgICAgIEQuIEUuIEFtb3Ms
IEFMR09SSVRITSA2ODMgIEEgUG9ydGFibGUgRk9SVFJBTiBTdWJyb3V0aW5lCiAqICAgICAgICAg
ICAgIGZvciBFeHBvbmVudGlhbCBJbnRlZ3JhbHMgb2YgYSBDb21wbGV4IEFyZ3VtZW50CiAqICAg
ICAgICAgICAgIEFDTSBUcmFucy4gTWF0aC4gU29mdHdhcmUgMTY6MTc4LTE4MiAoMTk5MCkKICoK
ICogSUVSUiBjb2RlcyBmcm9tIGxpYmFtb3MgQmVzc2VsIGZ1bmN0aW9ucwogKgkwCW5vIGVycm9y
CiAqCTEJaW5wdXQgZXJyb3IsIG5vIGNvbXB1dGF0aW9uCiAqCTIJb3ZlcmZsb3cgcHJlZGljdGVk
IGZyb20gaW5wdXQgdmFsdWUKICoJMwlvdmVyZmxvdyBmcm9tIGNvbXB1dGF0aW9uCiAqCTQJaW5w
dXQgdmFsdWUgb3V0IG9mIHJhbmdlLCBubyBjb21wdXRhdGlvbgogKgk1CW90aGVyIGVycm9yCiAq
IElFUlIgY29kZXMgZnJvbSBjZXhpbnQKICoJMgl1bmRlcmZsb3cKICoJNC01CWFyZ3VtZW50IHJl
ZHVjdGlvbiBjYXVzZWQgbG9zcyBvZiBzaWduaWZpY2FuY2UKICoJNglmYWlsZWQgdG8gY29udmVy
Z2UKICoKICogRXRoYW4gQSBNZXJyaXR0IC0gTWFyY2ggMjAyMAogKgogKiBDaGFuZ2VkIGZyb20g
dGhlIHNpbmdsZSBwcmVjaXNpb24gY2V4aW50XygpIHRvIGRvdWJsZSBwcmVjaXNpb24gemV4aW50
XygpLgogKiAoV2hpY2gsIGluIGFkZGl0aW9uLCB1c2VzIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24g
d2l0aCBzZXBhcmF0ZQogKiAgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIGZvciBib3RoIHRoZSBh
cmd1bWVudCBhbmQgdGhlIHJldHVybiB2YWx1ZS4pCiAqCiAqIEVyaWsgTHVpanRlbiAtIEp1bHkg
MjAyNQogKi8KCiNpbmNsdWRlICJldmFsLmgiCiNpbmNsdWRlICJzdGRmbi5oIgkvKiBmb3Igbm90
X2FfbnVtYmVyKCkgKi8KCiNpZmRlZiBIQVZFX0FNT1MKCmV4dGVybiB2b2lkIHphaXJ5XyggZG91
YmxlICp6ciwgZG91YmxlICp6aSwgaW50MzJfdCAqaWQsIGludDMyX3QgKmtvZGUsCgkJICAgIGRv
dWJsZSAqYWlyLCBkb3VibGUgKmFpaSwgaW50MzJfdCAqdW5kZXJmbG93LCBpbnQzMl90ICppZXJy
ICk7CmV4dGVybiB2b2lkIHpiaXJ5XyggZG91YmxlICp6ciwgZG91YmxlICp6aSwgaW50MzJfdCAq
aWQsIGludDMyX3QgKmtvZGUsCgkJICAgIGRvdWJsZSAqYWlyLCBkb3VibGUgKmFpaSwgaW50MzJf
dCAqaWVyciApOwpleHRlcm4gdm9pZCB6YmVzaF8oIGRvdWJsZSAqenIsIGRvdWJsZSAqemksIGRv
dWJsZSAqbnUsIGludDMyX3QgKmtvZGUsCgkJICAgIGludDMyX3QgKmtpbmQsIGludDMyX3QgKmxl
bmd0aCwKCQkgICAgZG91YmxlICp6YnIsIGRvdWJsZSAqemJpLCBpbnQzMl90ICp1bmRlcmZsb3cs
IGludDMyX3QgKmllcnIpOwpleHRlcm4gdm9pZCB6YmVzaV8oIGRvdWJsZSAqenIsIGRvdWJsZSAq
emksIGRvdWJsZSAqbnUsIGludDMyX3QgKmtvZGUsIGludDMyX3QgKmxlbmd0aCwKCQkgICAgZG91
YmxlICp6YnIsIGRvdWJsZSAqemJpLCBpbnQzMl90ICp1bmRlcmZsb3csIGludDMyX3QgKmllcnIp
OwpleHRlcm4gdm9pZCB6YmVzal8oIGRvdWJsZSAqenIsIGRvdWJsZSAqemksIGRvdWJsZSAqbnUs
IGludDMyX3QgKmtvZGUsIGludDMyX3QgKmxlbmd0aCwKCQkgICAgZG91YmxlICp6YnIsIGRvdWJs
ZSAqemJpLCBpbnQzMl90ICp1bmRlcmZsb3csIGludDMyX3QgKmllcnIpOwpleHRlcm4gdm9pZCB6
YmVza18oIGRvdWJsZSAqenIsIGRvdWJsZSAqemksIGRvdWJsZSAqbnUsIGludDMyX3QgKmtvZGUs
IGludDMyX3QgKmxlbmd0aCwKCQkgICAgZG91YmxlICp6YnIsIGRvdWJsZSAqemJpLCBpbnQzMl90
ICp1bmRlcmZsb3csIGludDMyX3QgKmllcnIpOwpleHRlcm4gdm9pZCB6YmVzeV8oIGRvdWJsZSAq
enIsIGRvdWJsZSAqemksIGRvdWJsZSAqbnUsIGludDMyX3QgKmtvZGUsIGludDMyX3QgKmxlbmd0
aCwKCQkgICAgZG91YmxlICp6YnIsIGRvdWJsZSAqemJpLCBpbnQzMl90ICp1bmRlcmZsb3csCgkJ
ICAgIGRvdWJsZSAqd3IsIGRvdWJsZSAqd2ksIGludDMyX3QgKmllcnIpOwoKI2lmIGRlZmluZWQo
SEFWRV9DRVhJTlQpICYmIGRlZmluZWQoSEFWRV9DT01QTEVYX0gpCiNpbmNsdWRlIDxjb21wbGV4
Lmg+CiNpbmNsdWRlIDx1dGlsLmg+CS8qIGZvciBpbnRfZXJyb3IoKSAqLwoKZXh0ZXJuIHZvaWQg
emV4aW50XyggZG91YmxlICp6cmVhbCwgZG91YmxlICp6aW1hZywgaW50MzJfdCAqbm9yZGVyLCBp
bnQzMl90ICprb2RlLAoJCSAgICAgZG91YmxlICp0b2wsIGludDMyX3QgKmxlbmd0aCwKCQkgICAg
IGRvdWJsZSAqY3lyZWFsLCBkb3VibGUgKmN5aW1hZywgaW50MzJfdCAqaWVycik7CiNlbmRpZgoK
dm9pZApmX2Ftb3NfQWkodW5pb24gYXJndW1lbnQgKmFyZykKewogICAgc3RydWN0IHZhbHVlIGE7
CiAgICBzdHJ1Y3QgY21wbHggeiwgYWk7CiAgICBpbnQzMl90IGlkLCBrb2RlLCB1bmRlcmZsb3cs
IGllcnI7CgogICAgKHZvaWQpIGFyZzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhdm9pZCAt
V3VudXNlZCB3YXJuaW5nICovCiAgICBwb3AoJmEpOwoKICAgIGlkID0gMDsJLyogMCA9IEFpICAx
ID0gZGVsQWkvZGVsWiAqLwogICAga29kZSA9IDE7CS8qIDEgPSB1bnNjYWxlZCAgIDIgPSBzY2Fs
ZWQgKi8KCiAgICBpZiAoYS50eXBlID09IElOVEdSKSB7Cgl6LnJlYWwgPSBhLnYuaW50X3ZhbDsK
CXouaW1hZyA9IDA7CiAgICB9IGVsc2UgewoJei5yZWFsID0gYS52LmNtcGx4X3ZhbC5yZWFsOwoJ
ei5pbWFnID0gYS52LmNtcGx4X3ZhbC5pbWFnOwogICAgfQoKICAgIC8qIEZvcnRyYW4gY2FsbGlu
ZyBjb252ZW50aW9ucyEgKi8KICAgIHphaXJ5XyggJnoucmVhbCwgJnouaW1hZywgJmlkLCAma29k
ZSwgJmFpLnJlYWwsICZhaS5pbWFnLCAmdW5kZXJmbG93LCAmaWVyciApOwoKICAgIGlmICh1bmRl
cmZsb3cgIT0gMCB8fCBpZXJyICE9IDApIHsKCUZQUklOVEYoKHN0ZGVyciwiemFpcnkoIHslLjNm
LCAlLjNmfSApOiB1bmRlcmZsb3cgPSAlZCAgIGllcnIgPSAlZFxuIiwKCQl6LnJlYWwsIHouaW1h
ZywgdW5kZXJmbG93LCBpZXJyKSk7Cgl1bmRlZmluZWQgPSBUUlVFOwoJR2NvbXBsZXgoJmEsIG5v
dF9hX251bWJlcigpLCAwLjApOwogICAgfSBlbHNlIHsKCUdjb21wbGV4KCZhLCBhaS5yZWFsLCBh
aS5pbWFnKTsKICAgIH0KCiAgICBwdXNoKCZhKTsKfQoKdm9pZApmX2Ftb3NfQmkodW5pb24gYXJn
dW1lbnQgKmFyZykKewogICAgc3RydWN0IHZhbHVlIGE7CiAgICBzdHJ1Y3QgY21wbHggeiwgYmk7
CiAgICBpbnQzMl90IGlkLCBrb2RlLCBpZXJyOwoKICAgICh2b2lkKSBhcmc7ICAgICAgICAgICAg
ICAgICAgICAgICAgLyogYXZvaWQgLVd1bnVzZWQgd2FybmluZyAqLwogICAgcG9wKCZhKTsKCiAg
ICBpZCA9IDA7CS8qIDAgPSBCaSAgMSA9IGRlbEJpL2RlbFogKi8KICAgIGtvZGUgPSAxOwkvKiAx
ID0gdW5zY2FsZWQgICAyID0gc2NhbGVkICovCgogICAgaWYgKGEudHlwZSA9PSBJTlRHUikgewoJ
ei5yZWFsID0gYS52LmludF92YWw7Cgl6LmltYWcgPSAwOwogICAgfSBlbHNlIHsKCXoucmVhbCA9
IGEudi5jbXBseF92YWwucmVhbDsKCXouaW1hZyA9IGEudi5jbXBseF92YWwuaW1hZzsKICAgIH0K
CiAgICAvKiBGb3J0cmFuIGNhbGxpbmcgY29udmVudGlvbnMhICovCiAgICB6YmlyeV8oICZ6LnJl
YWwsICZ6LmltYWcsICZpZCwgJmtvZGUsICZiaS5yZWFsLCAmYmkuaW1hZywgJmllcnIgKTsKCiAg
ICBpZiAoaWVyciAhPSAwKSB7CglGUFJJTlRGKChzdGRlcnIsInpiaXJ5KCB7JS4zZiwgJS4zZn0g
KTogaWVyciA9ICVkXG4iLAoJCXoucmVhbCwgei5pbWFnLCBpZXJyKSk7Cgl1bmRlZmluZWQgPSBU
UlVFOwoJR2NvbXBsZXgoJmEsIG5vdF9hX251bWJlcigpLCAwLjApOwogICAgfSBlbHNlIHsKCUdj
b21wbGV4KCZhLCBiaS5yZWFsLCBiaS5pbWFnKTsKICAgIH0KCiAgICBwdXNoKCZhKTsKfQoKLyoK
ICogTW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBzZWNvbmQga2luZCBLX251KHopCiAq
CXZhbCA9IEJlc3NlbEsoIG51LCB6ICkKICogVGhlIHVuZGVybHlpbmcgbGliYW1vcyByb3V0aW5l
IGJlc2sgZmlsbHMgaW4gYW4gYXJyYXkgb2YgdmFsdWVzCiAqIHZhbFtqXSBjb3JyZXNwb25kaW5n
IHRvIGEgc2VxdWVuY2UgZnVuY3Rpb25zIEJlc3NlbEsoIG51K2osIHogKQogKiBidXQgd2UgYXNr
IGZvciBvbmx5IHRoZSBqPTAgY2FzZS4KICovCiNkZWZpbmUgTkogMQp2b2lkCmZfYW1vc19CZXNz
ZWxLKHVuaW9uIGFyZ3VtZW50ICphcmcpCnsKICAgIHN0cnVjdCB2YWx1ZSBhOwogICAgc3RydWN0
IGNtcGx4IHo7CiAgICBzdHJ1Y3QgY21wbHggQmtbTkpdOwogICAgZG91YmxlIG51OwogICAgaW50
MzJfdCBrb2RlLCBsZW5ndGgsIHVuZGVyZmxvdywgaWVycjsKCiAgICAodm9pZCkgYXJnOyAgICAg
ICAgICAgICAgICAgICAgICAgIC8qIGF2b2lkIC1XdW51c2VkIHdhcm5pbmcgKi8KCiAgICAvKiAu
Li4gdW5wYWNrIGFyZ3VtZW50cyAuLi4gKi8KICAgIHBvcCgmYSk7CiAgICBpZiAoYS50eXBlID09
IElOVEdSKSB7Cgl6LnJlYWwgPSBhLnYuaW50X3ZhbDsKCXouaW1hZyA9IDA7CiAgICB9IGVsc2Ug
ewoJei5yZWFsID0gYS52LmNtcGx4X3ZhbC5yZWFsOwoJei5pbWFnID0gYS52LmNtcGx4X3ZhbC5p
bWFnOwogICAgfQogICAgbnUgPSByZWFsKHBvcCgmYSkpOwoKCiAgICBrb2RlID0gMTsJCS8qIDEg
PSB1bnNjYWxlZCAgIDIgPSBzY2FsZWQgKi8KICAgIGxlbmd0aCA9IE5KOwkvKiBudW1iZXIgb2Yg
bWVtYmVycyBpbiB0aGUgcmV0dXJuZWQgc2VxdWVuY2Ugb2YgZnVuY3Rpb25zICovCgogICAgLyog
Rm9ydHJhbiBjYWxsaW5nIGNvbnZlbnRpb25zISAqLwogICAgemJlc2tfKCAmei5yZWFsLCAmei5p
bWFnLCAmbnUsICZrb2RlLCAmbGVuZ3RoLAoJICAgICZCa1swXS5yZWFsLCAmQmtbMF0uaW1hZywg
JnVuZGVyZmxvdywgJmllcnIgKTsKCiAgICBpZiAoaWVyciAhPSAwKSB7CglGUFJJTlRGKChzdGRl
cnIsInpiZXNrKCB7JS4zZiwgJS4zZn0gKTogaWVyciA9ICVkXG4iLAoJCXoucmVhbCwgei5pbWFn
LCBpZXJyKSk7Cgl1bmRlZmluZWQgPSBUUlVFOwoJR2NvbXBsZXgoJmEsIG5vdF9hX251bWJlcigp
LCAwLjApOwogICAgfSBlbHNlIHsKCUdjb21wbGV4KCZhLCBCa1swXS5yZWFsLCBCa1swXS5pbWFn
KTsKICAgIH0KCiAgICBwdXNoKCZhKTsKfQoKCi8qCiAqIEhhbmtlbCBmdW5jdGlvbnMgb2YgdGhl
IGZpcnN0IGFuZCBzZWNvbmQga2luZHMKICoJdmFsID0gSGFua2VsMSggbnUsIHogKSA9IEpudSh6
KSArIGlZbnUoeikKICoJdmFsID0gSGFua2VsMiggbnUsIHogKSA9IEpudSh6KSAtIGlZbnUoeikK
ICogVGhlIHVuZGVybHlpbmcgbGliYW1vcyByb3V0aW5lIGJlc2kgZmlsbHMgaW4gYW4gYXJyYXkg
b2YgdmFsdWVzCiAqIHZhbFtqXSBjb3JyZXNwb25kaW5nIHRvIGEgc2VxdWVuY2UgZnVuY3Rpb25z
IEhhbmtlbCgga2luZCwgbnUraiwgeiApCiAqIGJ1dCB3ZSBhc2sgZm9yIG9ubHkgdGhlIGo9MCBj
YXNlLgogKi8Kdm9pZApmX2Ftb3NfSGFua2VsKGludCBrLCB1bmlvbiBhcmd1bWVudCAqYXJnKQp7
CiAgICBzdHJ1Y3QgdmFsdWUgYTsKICAgIHN0cnVjdCBjbXBseCB6OwogICAgc3RydWN0IGNtcGx4
IEhbTkpdOwogICAgZG91YmxlIG51OwogICAgaW50MzJfdCBrb2RlLCBraW5kLCBsZW5ndGgsIHVu
ZGVyZmxvdywgaWVycjsKCiAgICAodm9pZCkgYXJnOyAgICAgICAgICAgICAgICAgICAgICAgIC8q
IGF2b2lkIC1XdW51c2VkIHdhcm5pbmcgKi8KCiAgICAvKiAuLi4gdW5wYWNrIGFyZ3VtZW50cyAu
Li4gKi8KICAgIHBvcCgmYSk7CiAgICBpZiAoYS50eXBlID09IElOVEdSKSB7Cgl6LnJlYWwgPSBh
LnYuaW50X3ZhbDsKCXouaW1hZyA9IDA7CiAgICB9IGVsc2UgewoJei5yZWFsID0gYS52LmNtcGx4
X3ZhbC5yZWFsOwoJei5pbWFnID0gYS52LmNtcGx4X3ZhbC5pbWFnOwogICAgfQogICAgbnUgPSBy
ZWFsKHBvcCgmYSkpOwoKCiAgICBrb2RlID0gMTsJCS8qIDEgPSB1bnNjYWxlZCAgIDIgPSBzY2Fs
ZWQgKi8KICAgIGtpbmQgPSBrOwkJLyogMSA9IGZpcnN0IGtpbmQsIDIgPSBzZWNvbmQga2luZCAq
LwogICAgbGVuZ3RoID0gTko7CS8qIG51bWJlciBvZiBtZW1iZXJzIGluIHRoZSByZXR1cm5lZCBz
ZXF1ZW5jZSBvZiBmdW5jdGlvbnMgKi8KCiAgICAvKiBGb3J0cmFuIGNhbGxpbmcgY29udmVudGlv
bnMhICovCiAgICB6YmVzaF8oICZ6LnJlYWwsICZ6LmltYWcsICZudSwgJmtvZGUsICZraW5kLCAm
bGVuZ3RoLAoJICAgICZIWzBdLnJlYWwsICZIWzBdLmltYWcsICZ1bmRlcmZsb3csICZpZXJyICk7
CgogICAgaWYgKGllcnIgIT0gMCkgewoJRlBSSU5URigoc3RkZXJyLCJ6YmVzaCggeyUuM2YsICUu
M2Z9ICk6IGllcnIgPSAlZFxuIiwKCQl6LnJlYWwsIHouaW1hZywgaWVycikpOwoJdW5kZWZpbmVk
ID0gVFJVRTsKCUdjb21wbGV4KCZhLCBub3RfYV9udW1iZXIoKSwgMC4wKTsKICAgIH0gZWxzZSB7
CglHY29tcGxleCgmYSwgSFswXS5yZWFsLCBIWzBdLmltYWcpOwogICAgfQoKICAgIHB1c2goJmEp
Owp9Cgp2b2lkCmZfSGFua2VsMSh1bmlvbiBhcmd1bWVudCAqYXJnKSB7IGZfYW1vc19IYW5rZWwo
IDEsIGFyZyApOyB9Cgp2b2lkCmZfSGFua2VsMih1bmlvbiBhcmd1bWVudCAqYXJnKSB7IGZfYW1v
c19IYW5rZWwoIDIsIGFyZyApOyB9CgoKCi8qCiAqIE1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbiBv
ZiB0aGUgZmlyc3Qga2luZCBJX251KHopCiAqIHdpdGggY29tcGxleCBhcmd1bWVudCB6LgogKgl2
YWwgPSBCZXNzZWxJKCBudSwgeiApCiAqIFRoZSB1bmRlcmx5aW5nIGxpYmFtb3Mgcm91dGluZSBi
ZXNpIGZpbGxzIGluIGFuIGFycmF5IG9mIHZhbHVlcwogKiB2YWxbal0gY29ycmVzcG9uZGluZyB0
byBhIHNlcXVlbmNlIGZ1bmN0aW9ucyBCZXNzZWxJKCBudStqLCB6ICkKICogYnV0IHdlIGFzayBm
b3Igb25seSB0aGUgaj0wIGNhc2UuCiAqLwp2b2lkCmZfYW1vc19CZXNzZWxJKHVuaW9uIGFyZ3Vt
ZW50ICphcmcpCnsKICAgIHN0cnVjdCB2YWx1ZSBhOwogICAgc3RydWN0IGNtcGx4IHo7CiAgICBz
dHJ1Y3QgY21wbHggQmlbTkpdOwogICAgZG91YmxlIG51OwogICAgaW50MzJfdCBrb2RlLCBsZW5n
dGgsIHVuZGVyZmxvdywgaWVycjsKCiAgICAodm9pZCkgYXJnOyAgICAgICAgICAgICAgICAgICAg
ICAgIC8qIGF2b2lkIC1XdW51c2VkIHdhcm5pbmcgKi8KCiAgICAvKiAuLi4gdW5wYWNrIGFyZ3Vt
ZW50cyAuLi4gKi8KICAgIHBvcCgmYSk7CiAgICBpZiAoYS50eXBlID09IElOVEdSKSB7Cgl6LnJl
YWwgPSBhLnYuaW50X3ZhbDsKCXouaW1hZyA9IDA7CiAgICB9IGVsc2UgewoJei5yZWFsID0gYS52
LmNtcGx4X3ZhbC5yZWFsOwoJei5pbWFnID0gYS52LmNtcGx4X3ZhbC5pbWFnOwogICAgfQogICAg
bnUgPSByZWFsKHBvcCgmYSkpOwoKCiAgICBrb2RlID0gMTsJCS8qIDEgPSB1bnNjYWxlZCAgIDIg
PSBzY2FsZWQgKi8KICAgIGxlbmd0aCA9IE5KOwkvKiBudW1iZXIgb2YgbWVtYmVycyBpbiB0aGUg
cmV0dXJuZWQgc2VxdWVuY2Ugb2YgZnVuY3Rpb25zICovCgogICAgLyogRm9ydHJhbiBjYWxsaW5n
IGNvbnZlbnRpb25zISAqLwogICAgemJlc2lfKCAmei5yZWFsLCAmei5pbWFnLCAmbnUsICZrb2Rl
LCAmbGVuZ3RoLAoJICAgICZCaVswXS5yZWFsLCAmQmlbMF0uaW1hZywgJnVuZGVyZmxvdywgJmll
cnIgKTsKCiAgICBpZiAoaWVyciAhPSAwKSB7CglGUFJJTlRGKChzdGRlcnIsInpiZXNpKCB7JS4z
ZiwgJS4zZn0gKTogaWVyciA9ICVkXG4iLAoJCXoucmVhbCwgei5pbWFnLCBpZXJyKSk7Cgl1bmRl
ZmluZWQgPSBUUlVFOwoJR2NvbXBsZXgoJmEsIG5vdF9hX251bWJlcigpLCAwLjApOwogICAgfSBl
bHNlIHsKCUdjb21wbGV4KCZhLCBCaVswXS5yZWFsLCBCaVswXS5pbWFnKTsKICAgIH0KCiAgICBw
dXNoKCZhKTsKfQoKCi8qCiAqIE1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qg
a2luZCBKX251KHopCiAqIHdpdGggY29tcGxleCBhcmd1bWVudCB6LgogKgl2YWwgPSBCZXNzZWxK
KCBudSwgeiApCiAqIFRoZSB1bmRlcmx5aW5nIGxpYmFtb3Mgcm91dGluZSBiZXNpIGZpbGxzIGlu
IGFuIGFycmF5IG9mIHZhbHVlcwogKiB2YWxbal0gY29ycmVzcG9uZGluZyB0byBhIHNlcXVlbmNl
IGZ1bmN0aW9ucyBCZXNzZWxKKCBudStqLCB6ICkKICogYnV0IHdlIGFzayBmb3Igb25seSB0aGUg
aj0wIGNhc2UuCiAqLwp2b2lkCmZfYW1vc19CZXNzZWxKKHVuaW9uIGFyZ3VtZW50ICphcmcpCnsK
ICAgIHN0cnVjdCB2YWx1ZSBhOwogICAgc3RydWN0IGNtcGx4IHo7CiAgICBzdHJ1Y3QgY21wbHgg
QmpbTkpdOwogICAgZG91YmxlIG51OwogICAgaW50MzJfdCBrb2RlLCBsZW5ndGgsIHVuZGVyZmxv
dywgaWVycjsKCiAgICAodm9pZCkgYXJnOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGF2b2lk
IC1XdW51c2VkIHdhcm5pbmcgKi8KCiAgICAvKiAuLi4gdW5wYWNrIGFyZ3VtZW50cyAuLi4gKi8K
ICAgIHBvcCgmYSk7CiAgICBpZiAoYS50eXBlID09IElOVEdSKSB7Cgl6LnJlYWwgPSBhLnYuaW50
X3ZhbDsKCXouaW1hZyA9IDA7CiAgICB9IGVsc2UgewoJei5yZWFsID0gYS52LmNtcGx4X3ZhbC5y
ZWFsOwoJei5pbWFnID0gYS52LmNtcGx4X3ZhbC5pbWFnOwogICAgfQogICAgbnUgPSByZWFsKHBv
cCgmYSkpOwoKCiAgICBrb2RlID0gMTsJCS8qIDEgPSB1bnNjYWxlZCAgIDIgPSBzY2FsZWQgKi8K
ICAgIGxlbmd0aCA9IE5KOwkvKiBudW1iZXIgb2YgbWVtYmVycyBpbiB0aGUgcmV0dXJuZWQgc2Vx
dWVuY2Ugb2YgZnVuY3Rpb25zICovCgogICAgLyogRm9ydHJhbiBjYWxsaW5nIGNvbnZlbnRpb25z
ISAqLwogICAgemJlc2pfKCAmei5yZWFsLCAmei5pbWFnLCAmbnUsICZrb2RlLCAmbGVuZ3RoLAoJ
ICAgICZCalswXS5yZWFsLCAmQmpbMF0uaW1hZywgJnVuZGVyZmxvdywgJmllcnIgKTsKCiAgICBp
ZiAoaWVyciAhPSAwKSB7CglGUFJJTlRGKChzdGRlcnIsInpiZXNqKCB7JS4zZiwgJS4zZn0gKTog
aWVyciA9ICVkXG4iLAoJCXoucmVhbCwgei5pbWFnLCBpZXJyKSk7Cgl1bmRlZmluZWQgPSBUUlVF
OwoJR2NvbXBsZXgoJmEsIG5vdF9hX251bWJlcigpLCAwLjApOwogICAgfSBlbHNlIHsKCUdjb21w
bGV4KCZhLCBCalswXS5yZWFsLCBCalswXS5pbWFnKTsKICAgIH0KCiAgICBwdXNoKCZhKTsKfQoK
Ci8qCiAqIE1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQgWV9udSh6
KQogKiB3aXRoIGNvbXBsZXggYXJndW1lbnQgei4KICoJdmFsID0gQmVzc2VsWSggbnUsIHogKQog
KiBUaGUgdW5kZXJseWluZyBsaWJhbW9zIHJvdXRpbmUgYmVzaSBmaWxscyBpbiBhbiBhcnJheSBv
ZiB2YWx1ZXMKICogdmFsW2pdIGNvcnJlc3BvbmRpbmcgdG8gYSBzZXF1ZW5jZSBmdW5jdGlvbnMg
QmVzc2VsSiggbnUraiwgeiApCiAqIGJ1dCB3ZSBhc2sgZm9yIG9ubHkgdGhlIGo9MCBjYXNlLgog
Ki8Kdm9pZApmX2Ftb3NfQmVzc2VsWSh1bmlvbiBhcmd1bWVudCAqYXJnKQp7CiAgICBzdHJ1Y3Qg
dmFsdWUgYTsKICAgIHN0cnVjdCBjbXBseCB6OwogICAgc3RydWN0IGNtcGx4IEJ5W05KXTsKICAg
IGRvdWJsZSBXb3JrUltOSl0sIFdvcmtJW05KXTsJLyogU2NyYXRjaCBzcGFjZSBmb3IgemJlc3lf
ICovCiAgICBkb3VibGUgbnU7CiAgICBpbnQzMl90IGtvZGUsIGxlbmd0aCwgdW5kZXJmbG93LCBp
ZXJyOwoKICAgICh2b2lkKSBhcmc7ICAgICAgICAgICAgICAgICAgICAgICAgLyogYXZvaWQgLVd1
bnVzZWQgd2FybmluZyAqLwoKICAgIC8qIC4uLiB1bnBhY2sgYXJndW1lbnRzIC4uLiAqLwogICAg
cG9wKCZhKTsKICAgIGlmIChhLnR5cGUgPT0gSU5UR1IpIHsKCXoucmVhbCA9IGEudi5pbnRfdmFs
OwoJei5pbWFnID0gMDsKICAgIH0gZWxzZSB7Cgl6LnJlYWwgPSBhLnYuY21wbHhfdmFsLnJlYWw7
Cgl6LmltYWcgPSBhLnYuY21wbHhfdmFsLmltYWc7CiAgICB9CiAgICBudSA9IHJlYWwocG9wKCZh
KSk7CgoKICAgIGtvZGUgPSAxOwkJLyogMSA9IHVuc2NhbGVkICAgMiA9IHNjYWxlZCAqLwogICAg
bGVuZ3RoID0gTko7CS8qIG51bWJlciBvZiBtZW1iZXJzIGluIHRoZSByZXR1cm5lZCBzZXF1ZW5j
ZSBvZiBmdW5jdGlvbnMgKi8KCiAgICAvKiBGb3J0cmFuIGNhbGxpbmcgY29udmVudGlvbnMhICov
CiAgICB6YmVzeV8oICZ6LnJlYWwsICZ6LmltYWcsICZudSwgJmtvZGUsICZsZW5ndGgsCgkgICAg
JkJ5WzBdLnJlYWwsICZCeVswXS5pbWFnLCAmdW5kZXJmbG93LAoJICAgICZXb3JrUlswXSwgICZX
b3JrSVswXSwgJmllcnIgKTsKCiAgICBpZiAoaWVyciAhPSAwKSB7CglmcHJpbnRmKHN0ZGVyciwi
emJlc3koIHslLjNmLCAlLjNmfSApOiBpZXJyID0gJWRcbiIsCgkJei5yZWFsLCB6LmltYWcsIGll
cnIpOwoJdW5kZWZpbmVkID0gVFJVRTsKCUdjb21wbGV4KCZhLCBub3RfYV9udW1iZXIoKSwgMC4w
KTsKICAgIH0gZWxzZSB7CglHY29tcGxleCgmYSwgQnlbMF0ucmVhbCwgQnlbMF0uaW1hZyk7CiAg
ICB9CgogICAgcHVzaCgmYSk7Cn0KCiNpZiBkZWZpbmVkKEhBVkVfQ0VYSU5UKSAmJiBkZWZpbmVk
KEhBVkVfQ09NUExFWF9IKQoKdm9pZApmX2Ftb3NfY2V4aW50KHVuaW9uIGFyZ3VtZW50ICphcmcp
CnsKICAgIHN0cnVjdCB2YWx1ZSBhOwogICAgZG91YmxlIGNvbXBsZXggeiwgY3k7CiAgICBkb3Vi
bGUgenJlYWwsIHppbWFnLCBjeXJlYWwsIGN5aW1hZywgdG9sZXJhbmNlOwogICAgaW50MzJfdCBu
b3JkZXIsIGtvZGUsIGxlbmd0aCwgaWVycjsKCiAgICAodm9pZCkgYXJnOwkJLyogYXZvaWQgLVd1
bnVzZWQgd2FybmluZyAqLwogICAgcG9wKCZhKTsJCS8qIGNvbXBsZXggeiAqLwoKICAgIGtvZGUg
PSAxOwkJLyogMSA9IHVuc2NhbGVkICAgMiA9IHNjYWxlZCAqLwogICAgbGVuZ3RoID0gTko7CS8q
IG51bWJlciBvZiBtZW1iZXJzIGluIHRoZSByZXR1cm5lZCBzZXF1ZW5jZSBvZiBmdW5jdGlvbnMg
Ki8KICAgIHRvbGVyYW5jZSA9IDEuZS04OwkvKiBGSVhNRTogbm90IHN1cmUgd2hhdCBpcyByZWFz
b25hYmxlIHRvIGFzayBmb3IgKi8KCiAgICBpZiAoYS50eXBlID09IElOVEdSKSB7Cgl6ID0gKGRv
dWJsZSlhLnYuaW50X3ZhbDsKICAgIH0gZWxzZSB7Cgl6ID0gYS52LmNtcGx4X3ZhbC5yZWFsICsg
SSAqIGEudi5jbXBseF92YWwuaW1hZzsKICAgIH0KICAgIGlmIChjYXJnKHopIDwgLU1fUEkgfHwg
Y2FyZyh6KSA+IE1fUEkpCglpbnRfZXJyb3IoTk9fQ0FSRVQsICJjZXhpbnQgcmVxdWlyZXMgYXJn
KHopIGluIFstcGk6cGldIik7CgogICAgcG9wKCZhKTsJCS8qIGludGVnZXIgbm9yZGVyICovCiAg
ICBpZiAoYS50eXBlID09IElOVEdSKQoJbm9yZGVyID0gYS52LmludF92YWw7CiAgICBpZiAoYS50
eXBlICE9IElOVEdSIHx8IG5vcmRlciA8IDApCglpbnRfZXJyb3IoTk9fQ0FSRVQsICJjZXhpbnQg
cmVxdWlyZXMgaW50ZWdlciBuID49IDAiKTsKCiAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIG4gPSAw
LgogICAgICogRTAoeikgPSBleHAoLXopL3ogYnkgZGVmaW5pdGlvbiwgc28ganVzdCByZXR1cm4g
dGhhdAogICAgICovCiAgICBpZiAobm9yZGVyID09IDApIHsKCWN5ID0gY2V4cCgteikvejsKCXB1
c2goR2NvbXBsZXgoJmEsIGNyZWFsKGN5KSwgY2ltYWcoY3kpKSk7CglyZXR1cm47CiAgICB9Cgog
ICAgLyogRm9ydHJhbiBjYWxsaW5nIGNvbnZlbnRpb25zISAqLwogICAgenJlYWw9Y3JlYWwoeik7
CiAgICB6aW1hZz1jaW1hZyh6KTsKICAgIHpleGludF8oICZ6cmVhbCwgJnppbWFnLCAmbm9yZGVy
LCAma29kZSwgJnRvbGVyYW5jZSwgJmxlbmd0aCwgJmN5cmVhbCwgJmN5aW1hZywgJmllcnIgKTsK
CiAgICAvKiBpZXJyID09IDIgbWVhbnMgdW5kZXJmbG93LCBpbiB3aGljaCBjYXNlIGN5IGhhcyBh
bHJlYWR5IGJlZW4gc2V0IHRvIDAgKi8KICAgIGlmIChpZXJyID09IDEgfHwgaWVyciA+IDIpIHsK
CUZQUklOVEYoKHN0ZGVyciwgImZfYW1vc19jZXhpbnQoICVkLCB7JWcsICVnfSApOiBpZXJyID0g
JWRcbiIsCgkJbm9yZGVyLCB6cmVhbCwgemltYWcsIGllcnIpKTsKCXVuZGVmaW5lZCA9IFRSVUU7
CglHY29tcGxleCgmYSwgbm90X2FfbnVtYmVyKCksIDAuMCk7CiAgICB9IGVsc2UgewogICAgICAg
IEdjb21wbGV4KCZhLCBjeXJlYWwsIGN5aW1hZyk7CiAgICB9CgogICAgcHVzaCgmYSk7Cn0KCiNl
bmRpZgoKCiN1bmRlZiBOSgoKI2VuZGlmCS8qIEhBVkVfQU1PUyAqLwo=
--0000000000004bcf7e0639755ea2
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline


--0000000000004bcf7e0639755ea2
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
gnuplot-beta mailing list
[email protected]
Membership management via: https://lists.sourceforge.net/lists/listinfo/gnuplot-beta

--0000000000004bcf7e0639755ea2--