Re: [v3] Tiny project, state of v3 etc

Michael Powell <[email protected]> Fri, 28 Jun 2024 20:15:53 -0400
Newsgroups gmane.comp.parsers.spirit.general
Message-ID <CAM=aUXqvf9Rr-vpSgybGLa46e2HqZ3NmqDkOyC3AmwpHrV3NSA@mail.gmail.com>
--===============3525000475872694414==
Content-Type: multipart/alternative; boundary="00000000000019dae1061bfc45f4"

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

On Fri, Jun 28, 2024 at 7:18=E2=80=AFPM Seth via Spirit-general <
[email protected]> wrote:

> On Fri, Jun 28, 2024, at 5:56 PM, Michael Powell wrote:
>
> Hello,
>
> [...] negative versions should also be supported: "1.2", ".2", "1.", "1".
>
> This is very key, although C++ float is probably my only choice there, I
> do not know. Precision is an absolute must, floating point precision issu=
es
> cannot be tolerated.
>
>
> The decimal being "very key" are no issue at all. Here's demo using
> decimal floats and all the input formats you specified and then some:
> https://coliru.stacked-crooked.com/a/8aef2c571995464b
>
> #include <boost/fusion/adapted/std_tuple.hpp>
> #include <boost/multiprecision/cpp_dec_float.hpp>
> #include <boost/spirit/home/x3.hpp>
> #include <fmt/ostream.h>
> #include <fmt/ranges.h>
> #include <fmt/std.h>
>
> using Num   =3D boost::multiprecision::cpp_dec_float_50;
> using Coord =3D std::tuple<Num, Num, Num>;
> template <> struct fmt::formatter<Num> : ostream_formatter {};
>
> int main() {
>     namespace x3 =3D boost::spirit::x3;
>     auto num_    =3D x3::real_parser<Num>{};
>     auto coord_  =3D num_ >> num_ >> num_;
>     auto file_   =3D x3::skip(x3::blank)[coord_ % x3::eol];
>
>     for (std::string_view input : {
>              R"(1.1 2.2 3.3
>                 .1 .2 .3
>                 1. 2. 3.
>                 1 2 3)",
>              R"(-1.1 -2.2 -3.3
>                 -.1 -.2 -.3
>                 -1. -2. -3.
>                 -1 -2 -3)",
>              R"(1.1e1 2.2e2 3.3e3
>                 .1e1 .2e2 .3e3
>                 1.e1 2.e2 3.e3
>                 1e1 2e2 3e3)",
>              R"(1.1e-1 2.2e-2 3.3e-3
>                 .1e-1 .2e-2 .3e-3
>                 1.e-1 2.e-2 3.e-3
>                 1e-1 2e-2 3e-3)",
>              R"(inf -inf nan)",
>          }) {
>
>         std::vector<Coord> coords;
>         if (parse(begin(input), end(input), file_, coords))
>             fmt::print("Parsed:\n - {}\n", fmt::join(coords, "\n - "));
>         else
>             fmt::print("Failed to parse\n");
>     }
> }
>
> This prints (live on coliru as well):
>
> Parsed:
>
>  - (1.1, 2.2, 3.3)
>
>  - (0.1, 0.2, 0.3)
>
>  - (1, 2, 3)
>
>  - (1, 2, 3)
>
> Parsed:
>
>  - (-1.1, -2.2, -3.3)
>
>  - (-0.1, -0.2, -0.3)
>
>  - (-1, -2, -3)
>
>  - (-1, -2, -3)
>
> Parsed:
>
>  - (11, 220, 3300)
>
>  - (1, 20, 300)
>
>  - (10, 200, 3000)
>
>  - (10, 200, 3000)
>
> Parsed:
>
>  - (0.11, 0.022, 0.0033)
>
>  - (0.01, 0.002, 0.0003)
>
>  - (0.1, 0.02, 0.003)
>
>  - (0.1, 0.02, 0.003)
>
> Parsed:
>
>  - (inf, -inf, nan)
>
>
> In summary, might Spirit, either v2 or v3, possibly work there? I do not
> expect the rules, synthesis, etc, to be that complex. It will be trickier=
,
> perhaps, to message a listener from the parser, but not insurmountable, I
> think.
>
> Thoughts?
>
> Note that X3 is not yet interface stable, so you might want to prefer Qi:
> https://coliru.stacked-crooked.com/a/1bdbbc130ffba345
>
> Please don't use SWIG unless you are wrapping an API for use in other
> languages like Python or Matlab.
>

I'm not sure what "interface stable" means; the "X" presumably still short
for "experimental" side of experimental. Which is fair; although how long
has it been experimental? Only Qi analogs, thus far; still no Karma? Did
the project run out of funding somewhere along the way? Just curious, do
not need to elaborate.

I do not think of Spirit anything, Qi, X, etc, being more than internally
facing implementation details.

However, top level "parser" abstractions, listeners (i.e. to internally
triggered signals), 1000 pct. Or at least that's the intended goal, and
consume via dotnet runtime.

Regards, Seth
>
> _______________________________________________
> Spirit-general mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/spirit-general
>

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

<div dir=3D"ltr"><div dir=3D"ltr"><br></div><br><div class=3D"gmail_quote">=
<div dir=3D"ltr" class=3D"gmail_attr">On Fri, Jun 28, 2024 at 7:18=E2=80=AF=
PM Seth via Spirit-general &lt;<a href=3D"mailto:[email protected]=
eforge.net">[email protected]</a>&gt; wrote:<br></div><b=
lockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-le=
ft:1px solid rgb(204,204,204);padding-left:1ex"><div class=3D"msg-832600897=
3601726009"><u></u><div><div>On Fri, Jun 28, 2024, at 5:56 PM, Michael Powe=
ll wrote:<br></div><blockquote type=3D"cite" id=3D"m_-8326008973601726009qt=
"><div dir=3D"ltr"><div>Hello,<br></div><div><br></div><div>[...] negative =
versions should also be supported: &quot;1.2&quot;, &quot;.2&quot;, &quot;1=
.&quot;, &quot;1&quot;.<br></div><div><br></div><div>This is very key, alth=
ough C++ float is probably my only choice there, I do not know. Precision i=
s an absolute must,=C2=A0floating point precision issues cannot be tolerate=
d. <br></div></div></blockquote><div><div><br></div><div>The decimal being =
&quot;very key&quot; are no issue at all. Here&#39;s demo using decimal flo=
ats and all the input formats you specified and then some: <a href=3D"https=
://coliru.stacked-crooked.com/a/8aef2c571995464b" target=3D"_blank">https:/=
/coliru.stacked-crooked.com/a/8aef2c571995464b</a><br></div><div><br></div>=
<div><span style=3D"font-family:menlo,consolas,monospace,sans-serif"><span =
style=3D"font-size:0.889em">#include &lt;boost/fusion/adapted/std_tuple.hpp=
&gt;</span></span><br></div><div><span style=3D"font-family:menlo,consolas,=
monospace,sans-serif"><span style=3D"font-size:0.889em">#include &lt;boost/=
multiprecision/cpp_dec_float.hpp&gt;</span></span><br></div><div><span styl=
e=3D"font-family:menlo,consolas,monospace,sans-serif"><span style=3D"font-s=
ize:0.889em">#include &lt;boost/spirit/home/x3.hpp&gt;</span></span><br></d=
iv><div><span style=3D"font-family:menlo,consolas,monospace,sans-serif"><sp=
an style=3D"font-size:0.889em">#include &lt;fmt/ostream.h&gt;</span></span>=
<br></div><div><span style=3D"font-family:menlo,consolas,monospace,sans-ser=
if"><span style=3D"font-size:0.889em">#include &lt;fmt/ranges.h&gt;</span><=
/span><br></div><div><span style=3D"font-family:menlo,consolas,monospace,sa=
ns-serif"><span style=3D"font-size:0.889em">#include &lt;fmt/std.h&gt;</spa=
n></span><br></div><div><br></div><div><span style=3D"font-family:menlo,con=
solas,monospace,sans-serif"><span style=3D"font-size:0.889em">using Num=C2=
=A0=C2=A0 =3D boost::multiprecision::cpp_dec_float_50;</span></span><br></d=
iv><div><span style=3D"font-family:menlo,consolas,monospace,sans-serif"><sp=
an style=3D"font-size:0.889em">using Coord =3D std::tuple&lt;Num, Num, Num&=
gt;;</span></span><br></div><div><span style=3D"font-family:menlo,consolas,=
monospace,sans-serif"><span style=3D"font-size:0.889em">template &lt;&gt; s=
truct fmt::formatter&lt;Num&gt; : ostream_formatter {};</span></span><br></=
div><div><br></div><div><span style=3D"font-family:menlo,consolas,monospace=
,sans-serif"><span style=3D"font-size:0.889em">int main() {</span></span><b=
r></div><div><span style=3D"font-family:menlo,consolas,monospace,sans-serif=
"><span style=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0 namespace x3 =3D boo=
st::spirit::x3;</span></span><br></div><div><span style=3D"font-family:menl=
o,consolas,monospace,sans-serif"><span style=3D"font-size:0.889em">=C2=A0=
=C2=A0=C2=A0 auto num_=C2=A0=C2=A0=C2=A0 =3D x3::real_parser&lt;Num&gt;{};<=
/span></span><br></div><div><span style=3D"font-family:menlo,consolas,monos=
pace,sans-serif"><span style=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0 auto =
coord_=C2=A0 =3D num_ &gt;&gt; num_ &gt;&gt; num_;</span></span><br></div><=
div><span style=3D"font-family:menlo,consolas,monospace,sans-serif"><span s=
tyle=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0 auto file_=C2=A0=C2=A0 =3D x3=
::skip(x3::blank)[coord_ % x3::eol];</span></span><br></div><div><br></div>=
<div><span style=3D"font-family:menlo,consolas,monospace,sans-serif"><span =
style=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0 for (std::string_view input =
: {</span></span><br></div><div><span style=3D"font-family:menlo,consolas,m=
onospace,sans-serif"><span style=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 R&quot;(1.1 2.2 3.3<=
/span></span><br></div><div><span style=3D"font-family:menlo,consolas,monos=
pace,sans-serif"><span style=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .1 .2 .3=
</span></span><br></div><div><span style=3D"font-family:menlo,consolas,mono=
space,sans-serif"><span style=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1. 2.=
 3.</span></span><br></div><div><span style=3D"font-family:menlo,consolas,m=
onospace,sans-serif"><span style=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1 =
2 3)&quot;,</span></span><br></div><div><span style=3D"font-family:menlo,co=
nsolas,monospace,sans-serif"><span style=3D"font-size:0.889em">=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 R&quot;(-1.1 -=
2.2 -3.3</span></span><br></div><div><span style=3D"font-family:menlo,conso=
las,monospace,sans-serif"><span style=3D"font-size:0.889em">=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
 -.1 -.2 -.3</span></span><br></div><div><span style=3D"font-family:menlo,c=
onsolas,monospace,sans-serif"><span style=3D"font-size:0.889em">=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0 -1. -2. -3.</span></span><br></div><div><span style=3D"font-family:m=
enlo,consolas,monospace,sans-serif"><span style=3D"font-size:0.889em">=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0 -1 -2 -3)&quot;,</span></span><br></div><div><span style=3D"fo=
nt-family:menlo,consolas,monospace,sans-serif"><span style=3D"font-size:0.8=
89em">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0 R&quot;(1.1e1 2.2e2 3.3e3</span></span><br></div><div><span style=3D"fo=
nt-family:menlo,consolas,monospace,sans-serif"><span style=3D"font-size:0.8=
89em">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 .1e1 .2e2 .3e3</span></span><br></div><div><span styl=
e=3D"font-family:menlo,consolas,monospace,sans-serif"><span style=3D"font-s=
ize:0.889em">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1.e1 2.e2 3.e3</span></span><br></div><div><=
span style=3D"font-family:menlo,consolas,monospace,sans-serif"><span style=
=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1e1 2e2 3e3)&quot;,</span></span><b=
r></div><div><span style=3D"font-family:menlo,consolas,monospace,sans-serif=
"><span style=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 R&quot;(1.1e-1 2.2e-2 3.3e-3</span></span=
><br></div><div><span style=3D"font-family:menlo,consolas,monospace,sans-se=
rif"><span style=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .1e-1 .2e-2 .3e-3</s=
pan></span><br></div><div><span style=3D"font-family:menlo,consolas,monospa=
ce,sans-serif"><span style=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1.e-1 2.=
e-2 3.e-3</span></span><br></div><div><span style=3D"font-family:menlo,cons=
olas,monospace,sans-serif"><span style=3D"font-size:0.889em">=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0 1e-1 2e-2 3e-3)&quot;,</span></span><br></div><div><span style=3D"font-=
family:menlo,consolas,monospace,sans-serif"><span style=3D"font-size:0.889e=
m">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
 R&quot;(inf -inf nan)&quot;,</span></span><br></div><div><span style=3D"fo=
nt-family:menlo,consolas,monospace,sans-serif"><span style=3D"font-size:0.8=
89em">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }) {</span></span><b=
r></div><div><br></div><div><span style=3D"font-family:menlo,consolas,monos=
pace,sans-serif"><span style=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 std::vector&lt;Coord&gt; coords;</span></span><br></div>=
<div><span style=3D"font-family:menlo,consolas,monospace,sans-serif"><span =
style=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (=
parse(begin(input), end(input), file_, coords))</span></span><br></div><div=
><span style=3D"font-family:menlo,consolas,monospace,sans-serif"><span styl=
e=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 fmt::print(&quot;Parsed:\n - {}\n&quot;, fmt::join(coords, =
&quot;\n - &quot;));</span></span><br></div><div><span style=3D"font-family=
:menlo,consolas,monospace,sans-serif"><span style=3D"font-size:0.889em">=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 else</span></span><br></div><div><s=
pan style=3D"font-family:menlo,consolas,monospace,sans-serif"><span style=
=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 fmt::print(&quot;Failed to parse\n&quot;);</span></span><br=
></div><div><span style=3D"font-family:menlo,consolas,monospace,sans-serif"=
><span style=3D"font-size:0.889em">=C2=A0=C2=A0=C2=A0 }</span></span><br></=
div><div><span style=3D"font-family:menlo,consolas,monospace,sans-serif"><s=
pan style=3D"font-size:0.889em">}</span></span><br></div><div><br></div><di=
v>This prints (live on coliru as well):<br></div><div><br></div><div><pre s=
tyle=3D"display:inline-block;margin:0px;padding:0px">Parsed:<br></pre></div=
><div><pre style=3D"display:inline-block;margin:0px;padding:0px"> - (1.1, 2=
.2, 3.3)<br></pre></div><div><pre style=3D"display:inline-block;margin:0px;=
padding:0px"> - (0.1, 0.2, 0.3)<br></pre></div><div><pre style=3D"display:i=
nline-block;margin:0px;padding:0px"> - (1, 2, 3)<br></pre></div><div><pre s=
tyle=3D"display:inline-block;margin:0px;padding:0px"> - (1, 2, 3)<br></pre>=
</div><div><pre style=3D"display:inline-block;margin:0px;padding:0px">Parse=
d:<br></pre></div><div><pre style=3D"display:inline-block;margin:0px;paddin=
g:0px"> - (-1.1, -2.2, -3.3)<br></pre></div><div><pre style=3D"display:inli=
ne-block;margin:0px;padding:0px"> - (-0.1, -0.2, -0.3)<br></pre></div><div>=
<pre style=3D"display:inline-block;margin:0px;padding:0px"> - (-1, -2, -3)<=
br></pre></div><div><pre style=3D"display:inline-block;margin:0px;padding:0=
px"> - (-1, -2, -3)<br></pre></div><div><pre style=3D"display:inline-block;=
margin:0px;padding:0px">Parsed:<br></pre></div><div><pre style=3D"display:i=
nline-block;margin:0px;padding:0px"> - (11, 220, 3300)<br></pre></div><div>=
<pre style=3D"display:inline-block;margin:0px;padding:0px"> - (1, 20, 300)<=
br></pre></div><div><pre style=3D"display:inline-block;margin:0px;padding:0=
px"> - (10, 200, 3000)<br></pre></div><div><pre style=3D"display:inline-blo=
ck;margin:0px;padding:0px"> - (10, 200, 3000)<br></pre></div><div><pre styl=
e=3D"display:inline-block;margin:0px;padding:0px">Parsed:<br></pre></div><d=
iv><pre style=3D"display:inline-block;margin:0px;padding:0px"> - (0.11, 0.0=
22, 0.0033)<br></pre></div><div><pre style=3D"display:inline-block;margin:0=
px;padding:0px"> - (0.01, 0.002, 0.0003)<br></pre></div><div><pre style=3D"=
display:inline-block;margin:0px;padding:0px"> - (0.1, 0.02, 0.003)<br></pre=
></div><div><pre style=3D"display:inline-block;margin:0px;padding:0px"> - (=
0.1, 0.02, 0.003)<br></pre></div><div><pre style=3D"display:inline-block;ma=
rgin:0px;padding:0px">Parsed:<br></pre></div><div><pre style=3D"display:inl=
ine-block;margin:0px;padding:0px"> - (inf, -inf, nan)<br></pre></div><div><=
br></div></div><blockquote type=3D"cite" id=3D"m_-8326008973601726009qt"><d=
iv dir=3D"ltr"><div>In summary, might Spirit, either v2 or v3, possibly wor=
k there? I do not expect the rules, synthesis, etc, to be that complex. It =
will be trickier, perhaps, to message a listener from the parser, but not i=
nsurmountable, I think.<br></div><div><br></div><div>Thoughts?<br></div></d=
iv></blockquote><div><div><div><div><span style=3D"font-family:menlo,consol=
as,monospace,sans-serif"><span style=3D"font-size:0.889em">Note that X3 is =
not yet interface stable, so you might want to prefer Qi: </span></span><a =
href=3D"https://coliru.stacked-crooked.com/a/1bdbbc130ffba345" target=3D"_b=
lank">https://coliru.stacked-crooked.com/a/1bdbbc130ffba345</a><br></div><d=
iv><br></div><div><div>Please don&#39;t use SWIG unless you are wrapping an=
 API for use in other languages like Python or Matlab.<br></div></div></div=
></div></div></div></div></blockquote><div><br></div><div>I&#39;m not sure =
what &quot;interface stable&quot; means; the &quot;X&quot; presumably still=
 short for &quot;experimental&quot; side of experimental. Which is fair; al=
though how long has it been experimental? Only Qi analogs, thus far; still =
no Karma? Did the project run out of funding somewhere along the way? Just =
curious, do not need to elaborate.</div><div><br></div><div>I do not think =
of Spirit anything, Qi, X, etc, being more than internally facing implement=
ation details.</div><div><br></div><div>However, top level &quot;parser&quo=
t; abstractions, listeners (i.e. to internally triggered signals), 1000 pct=
. Or at least that&#39;s the intended goal, and consume via dotnet runtime.=
</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px =
0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div=
 class=3D"msg-8326008973601726009"><div><div><div><div><div><div></div><div=
>Regards, Seth<br></div></div></div></div></div><div><br></div></div>______=
_________________________________________<br>
Spirit-general mailing list<br>
<a href=3D"mailto:[email protected]" target=3D"_blank">S=
[email protected]</a><br>
<a href=3D"https://lists.sourceforge.net/lists/listinfo/spirit-general" rel=
=3D"noreferrer" target=3D"_blank">https://lists.sourceforge.net/lists/listi=
nfo/spirit-general</a><br>
</div></blockquote></div></div>

--00000000000019dae1061bfc45f4--


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


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

_______________________________________________
Spirit-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/spirit-general

--===============3525000475872694414==--