Attn: Development Editor, Latest OCaml Weekly News

Alan Schmitt <[email protected]> Tue, 12 May 2026 09:28:09 +0200
Newsgroups gmane.comp.lang.caml.inria
Message-ID <[email protected]>
--===-=-=
Content-Type: multipart/mixed; boundary="=-=-="

--=-=-=
Content-Type: multipart/alternative; boundary="==-=-="

--==-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hello

Here is the latest OCaml Weekly News, for the week of May 05 to 12,
2026.

Table of Contents
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80

Dune 3.23.0
Orcaset: Financial models in code
Miou, a simple scheduler for OCaml 5
Run-time types: uses and wants
Old CWN


Dune 3.23.0
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90

  Archive: <https://discuss.ocaml.org/t/ann-dune-3-23-0/18055/1>


Shon announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80

  The Dune team is pleased to announce [the release of dune 3.23.0].

  Along with many other fixes and improvements, some highlights include:

  =E2=80=A2 Add support for `c_library_flags' in foreign_stubs ([#13484],
    [@madroach])
  =E2=80=A2 Many improvements to the promotion and diffing functionality, by
    [@rgrinberg].
  =E2=80=A2 As part of the previous, a breaking change to the promotion log=
ic
    has been introduced: Dune does automatically promote generated opam
    files, which must now be manually promoted with `dune promote'. You
    can trigger building `.opam' files with the `@install', `@runtest',
    and `@opam' aliases. In release mode, `.opam' files aren't generated
    at all and whatever is in the source is used ([ocaml/dune#14108],
    [@rgrinberg]).
  =E2=80=A2 User rules and inline test runners are now sandboxed by default
    ([ocaml/dune#13805] and [ocaml/dune#14257], [@rgrinberg]).
  =E2=80=A2 The minimum OCaml version required to build dune is now 4.14.

  See [the full changelog] for all new features and fixes, and for
  attribution to the contributors who made it all possible. Thank you,
  contributors!

  If you encounter a problem with this release, please report it in [our
  issue tracker].


[the release of dune 3.23.0]
<https://github.com/ocaml/dune/releases/tag/3.23.0>

[#13484] <https://github.com/ocaml/dune/pull/13484>

[@madroach] <https://github.com/madroach>

[@rgrinberg] <https://github.com/rgrinberg>

[ocaml/dune#14108] <https://github.com/ocaml/dune/pull/14108>

[ocaml/dune#13805] <https://github.com/ocaml/dune/pull/13805>

[ocaml/dune#14257] <https://github.com/ocaml/dune/pull/14257>

[the full changelog] <https://github.com/ocaml/dune/releases/tag/3.23.0>

[our issue tracker] <https://github.com/ocaml/dune/issues>


Orcaset: Financial models in code
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90

  Archive:
  <https://discuss.ocaml.org/t/orcaset-financial-models-in-code/18056/1>


Jordan announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80

  Hi all, sharing `orcaset', a library for building financial statement
  models in code.

  Orcaset aims to give agents a robust tool for financial
  analysis. Based on tests against Claude and Codex Excel tools I've
  seen lower model error rates while using ~=E2=80=8B40% fewer tokens. I ex=
pect
  the gap to widen as a function of model scale (e.g. easier to reuse
  components in `orcaset') but haven't benchmarked in depth beyond
  models of a few hundred line items.

  It's mainly built from a private equity and credit perspective, but
  there's nothing inherently specific to those industries.

  A trivially simple example below for a taste of what it looks like.

  =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
  =E2=94=82 open Orcaset
  =E2=94=82 open Series
  =E2=94=82=20
  =E2=94=82 let offset =3D Offset.make ~quarters:1 ~month_end:true ()
  =E2=94=82 let periods =3D Period.make_seq ~start:(Date.make 2026 1 1) ~of=
fset |> Seq.take 4 |> List.of_seq
  =E2=94=82=20
  =E2=94=82 let revenue_proj =3D
  =E2=94=82   List.mapi (fun i period -> (period, 100.0 *. (1.03 ** float_o=
f_int (i - 1)))) periods
  =E2=94=82=20
  =E2=94=82 (* Define model *)
  =E2=94=82 let revenue =3D Spans.of_list ~label:"Revenue" ~split:Split.dai=
ly ~agg:Agg.sum revenue_proj
  =E2=94=82 let costs =3D Spans.scale ~label:"Costs" (-0.45) revenue
  =E2=94=82 let income =3D Spans.sum ~label:"Income" ~agg:Agg.sum [ revenue=
; costs ]
  =E2=94=82=20
  =E2=94=82 (* Build and print statement *)
  =E2=94=82 let () =3D
  =E2=94=82   let stmt =3D Stmt.span_total income (Stmt.span_lines [ revenu=
e; costs ]) in
  =E2=94=82   let resolved =3D Stmt.eval_periods periods stmt in
  =E2=94=82   Printf.printf "\n%s\n\n" (Stmt.fixed_width resolved)
  =E2=94=82=20
  =E2=94=82 (* Output:
  =E2=94=82            2026-04-30  2026-07-31  2026-10-31  2027-01-31
  =E2=94=82   Revenue       97.09      100.00      103.00      106.09
  =E2=94=82   Costs        -43.69      -45.00      -46.35      -47.74
  =E2=94=82            ----------  ----------  ----------  ----------
  =E2=94=82 Income          53.40       55.00       56.65       58.35 *)
  =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80

  Calculations are fully auditable. Line item relationships can be
  statically inspected, and dependencies across materialized values can
  also be traced. Dependencies can be cyclic, meaning you can easily
  model revolver plugs (or solve revenue growth to a 20% return, as is
  tradition).

  Experimental, but would appreciate feedback or suggestions!

  <https://github.com/Orcaset/orcaset-oc>


Miou, a simple scheduler for OCaml 5
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90

  Archive:
  <https://discuss.ocaml.org/t/ann-miou-a-simple-scheduler-for-ocaml-5/1296=
3/18>


Calascibetta Romain announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80

  I am delighted to announce the release of [miou.0.6.0]. This release
  mainly adds two new features:
  =E2=80=A2 a Miou event logging system
  =E2=80=A2 a new `Miou.take' function allowing you to retrieve tasks avail=
able
    in a `Miou.orphans'

  The addition of a logging system allows us to record events related to
  Miou (such as the creation of a new task) and to analyse these events
  to diagnose a Miou application that does not comply with [our
  fundamental rules] (such as never forgetting its children). This is
  why we offer several tools:
  =E2=80=A2 `mtbox.recd', which allows you to record Miou events in JSON fo=
rmat
    so that you can analyse a Miou application using software such as
    [perfetto.dev].
  =E2=80=A2 `mtbox.diag', which explains why a Miou application terminates =
with
    an exception such as `Still_has_children' (which results from a
    violation of one of our [rules])
  =E2=80=A2 `mtbox.mtop', which provides an _`htop'-style_ TUI for monitori=
ng a
    Miou application. You can see an example here:

  <https://github.com/robur-coop/mtbox/blob/main/assets/demo.gif?raw=3Dtrue>

  `mtbox' is experimental (very first release) but it demonstrates what
  can be done with Miou and now offers a [`nott{y,ui}-miou'] library
  allowing you to build your own TUI applications with Miou and [`lwd'].

  The addition of `Miou.take' relates more to our HTTP stack provided by
  our [`httpcats'] library and the [=CE=BD=CE=B9=CF=9D] Web Framework. Alon=
gside a few
  additions and bug fixes, we have notably undertaken to provide [a
  reproducible] benchmark of our HTTP servers, the results of which are
  available [here].

  <https://us1.discourse-cdn.com/flex020/uploads/ocaml/original/2X/9/92b03b=
a0b15881dbcff661dccec08dd00644b163.png>

  So, in addition to this Miou release, we continue to maintain and
  improve `httpcats', `vif' and [`hurl'] to provide an HTTP stack for
  the Miou ecosystem.

  Finally, as you are no doubt aware, we are continuing to experiment
  with the development of unikernels in OCaml using Miou, and this
  release is accompanied by a release of [`mkernel'] (our scheduler for
  unikernels), [`mnet'] (our TCP/IP stack), and [`mhttp'] and `vifu'
  (our HTTP stack for unikernels). Added to this are [`msendmail']
  (recently released to deploy our mailing list [email protected]),
  [`mfat'] (our FAT32 file system in OCaml) and `mnet-dns'. We are now
  able to offer you (in addition to [our existing unikernels]) new
  unikernels with OCaml 5:
  =E2=80=A2 [`ptt'] to manage your mailing list (announced [here])
  =E2=80=A2 [`annuaire'] acting as a recursive DNS resolver and stub DNS
    resolver (with a ban list)
  =E2=80=A2 [`contruno'] as a TLS termination proxy managing your Let=E2=80=
=99s Encrypt
    certificates and their renewal
  =E2=80=A2 and of course [`immuable'], our unikernel that enables the deli=
very
    of a static website (notably that of <https://mailingl.st> and
    <https://docs.osau.re>)

  We invite you to read [our tutorial] to learn how to develop
  unikernels and we recommend our [Albatross] project for deploying
  them.

  In short, we are beginning to consolidate the ecosystem around Miou
  and offer more and more libraries enabling you to develop your
  applications with our scheduler. We would like to thank everyone who
  has contributed, directly or indirectly, to the development of Miou,
  as well as those who have helped improve the libraries that make up
  our ecosystem. Please feel free to get involved, ask questions and,
  above all, start hacking!

  Happy hacking!


[miou.0.6.0] <https://github.com/robur-coop/miou>

[our fundamental rules]
<https://docs.osau.re/local/miou/Miou/index.html#user-task-management>

[perfetto.dev] <https://perfetto.dev/>

[rules]
<https://docs.osau.re/local/miou/Miou/index.html#user-task-management>

[`nott{y,ui}-miou'] <https://github.com/robur-coop/notty-miou>

[`lwd'] <https://github.com/let-def/lwd>

[`httpcats'] <https://github.com/robur-coop/httpcats>

[=CE=BD=CE=B9=CF=9D] <https://github.com/robur-coop/vif>

[a reproducible]
<https://github.com/robur-coop/httpcats/blob/main/bench/PROTOCOL.md>

[here] <https://robur-coop.github.io/httpcats>

[`hurl'] <https://github.com/robur-coop/hurl>

[`mkernel'] <https://github.com/robur-coop/mkernel>

[`mnet'] <https://github.com/robur-coop/mnet>

[`mhttp'] <https://github.com/robur-coop/mhttp>

[`msendmail'] <https://github.com/robur-coop/msendmail>

[`mfat'] <https://github.com/robur-coop/mfat>

[our existing unikernels] <https://builds.robur.coop/#Unikernels>

[`ptt'] <https://github.com/robur-coop/ptt>

[here]
<https://discuss.ocaml.org/t/ann-ptt-a-mailing-list-system-as-unikernel/179=
87>

[`annuaire'] <https://github.com/dinosaure/pagejaune>

[`contruno'] <https://git.robur.coop/robur/contruno>

[`immuable'] <https://github.com/dinosaure/immuable>

[our tutorial] <https://robur-coop.github.io/mnet/>

[Albatross] <https://github.com/robur-coop/albatross>


Run-time types: uses and wants
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90

  Archive:
  <https://discuss.ocaml.org/t/run-time-types-uses-and-wants/18085/1>


Rapha=C3=ABl Proust asked
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80

  This is an informal survey to assess the interest in run-time types
  from various users. If you are not sure what this is about check
  [lexifi's talk at funocaml] and specifically the type reflection
  section (timecode on the video: 33:00, slide number: 32).


[lexifi's talk at funocaml]
<https://www.lexifi.com/blog/ocaml/fun-ocaml-2025/>

the questions
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=
=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C

  Answer in any format you like :)

  Do you use type reflection / run-time types / whatchacallit? If not,
  would you use it if it was in the Stdlib or in an established lib in
  the ecosystem?

  Do you use some in-house solution or some off the shelf library? (Are
  you able to show the code?)

  What do you use it for? What would you use it for?

  Do you think it'd be useful even without any compiler support? What
  kind of tooling would make this viable?


the why
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C

  I've seen these things re-implemented multiple times. (I've even had
  to implement a couple of them myself.) I'm not sure there can be a
  stdlib module that covers all uses cases completely, but this survey
  and the ensuing conversation could maybe reveal that a large portion
  of use cases could be covered.

  I'm keen for this to exist in the Stdlib but I'm not keen to make a
  proposal that fails before it even leaves prototyping phase.


Old CWN
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90

  If you happen to miss a CWN, you can [send me a message] and I'll mail
  it to you, or go take a look at [the archive] or the [RSS feed of the
  archives].

  If you also wish to receive it every week by mail, you may subscribe
  to the [caml-list].

  [Alan Schmitt]


[send me a message] <mailto:[email protected]>

[the archive] <https://alan.petitepomme.net/cwn/>

[RSS feed of the archives] <https://alan.petitepomme.net/cwn/cwn.rss>

[caml-list] <https://sympa.inria.fr/sympa/info/caml-list>

[Alan Schmitt] <https://alan.petitepomme.net/>


--==-=-=
Content-Type: text/html; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

<?xml version=3D"1.0" encoding=3D"utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml" lang=3D"en" xml:lang=3D"en">
<head>
<!-- 2026-05-12 Tue 09:26 -->
<meta http-equiv=3D"Content-Type" content=3D"text/html;charset=3Dutf-8" />
<meta name=3D"viewport" content=3D"width=3Ddevice-width, initial-scale=3D1"=
 />
<title>OCaml Weekly News</title>
<meta name=3D"generator" content=3D"Org Mode" />
<style type=3D"text/css">
  #content { max-width: 60em; margin: auto; }
  .title  { text-align: center;
             margin-bottom: .2em; }
  .subtitle { text-align: center;
              font-size: medium;
              font-weight: bold;
              margin-top:0; }
  .todo   { font-family: monospace; color: red; }
  .done   { font-family: monospace; color: green; }
  .priority { font-family: monospace; color: orange; }
  .tag    { background-color: #eee; font-family: monospace;
            padding: 2px; font-size: 80%; font-weight: normal; }
  .timestamp { color: #bebebe; }
  .timestamp-kwd { color: #5f9ea0; }
  .org-right  { margin-left: auto; margin-right: 0px;  text-align: right; }
  .org-left   { margin-left: 0px;  margin-right: auto; text-align: left; }
  .org-center { margin-left: auto; margin-right: auto; text-align: center; }
  .underline { text-decoration: underline; }
  #postamble p, #preamble p { font-size: 90%; margin: .2em; }
  p.verse { margin-left: 3%; }
  pre {
    border: 1px solid #e6e6e6;
    border-radius: 3px;
    background-color: #f2f2f2;
    padding: 8pt;
    font-family: monospace;
    overflow: auto;
    margin: 1.2em;
  }
  pre.src {
    position: relative;
    overflow: auto;
  }
  pre.src:before {
    display: none;
    position: absolute;
    top: -8px;
    right: 12px;
    padding: 3px;
    color: #555;
    background-color: #f2f2f299;
  }
  pre.src:hover:before { display: inline; margin-top: 14px;}
  /* Languages per Org manual */
  pre.src-asymptote:before { content: 'Asymptote'; }
  pre.src-awk:before { content: 'Awk'; }
  pre.src-authinfo::before { content: 'Authinfo'; }
  pre.src-c:before { content: 'C'; }
  pre.src-C:before { content: 'C'; }
  /* pre.src-C++ doesn't work in CSS */
  pre.src-clojure:before { content: 'Clojure'; }
  pre.src-css:before { content: 'CSS'; }
  pre.src-D:before { content: 'D'; }
  pre.src-ditaa:before { content: 'ditaa'; }
  pre.src-dot:before { content: 'Graphviz'; }
  pre.src-calc:before { content: 'Emacs Calc'; }
  pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
  pre.src-fortran:before { content: 'Fortran'; }
  pre.src-gnuplot:before { content: 'gnuplot'; }
  pre.src-haskell:before { content: 'Haskell'; }
  pre.src-hledger:before { content: 'hledger'; }
  pre.src-java:before { content: 'Java'; }
  pre.src-js:before { content: 'JavaScript'; }
  pre.src-latex:before { content: 'LaTeX'; }
  pre.src-ledger:before { content: 'Ledger'; }
  pre.src-lisp:before { content: 'Lisp'; }
  pre.src-lilypond:before { content: 'Lilypond'; }
  pre.src-lua:before { content: 'Lua'; }
  pre.src-matlab:before { content: 'MATLAB'; }
  pre.src-mscgen:before { content: 'Mscgen'; }
  pre.src-ocaml:before { content: 'Objective Caml'; }
  pre.src-octave:before { content: 'Octave'; }
  pre.src-org:before { content: 'Org mode'; }
  pre.src-oz:before { content: 'OZ'; }
  pre.src-plantuml:before { content: 'Plantuml'; }
  pre.src-processing:before { content: 'Processing.js'; }
  pre.src-python:before { content: 'Python'; }
  pre.src-R:before { content: 'R'; }
  pre.src-ruby:before { content: 'Ruby'; }
  pre.src-sass:before { content: 'Sass'; }
  pre.src-scheme:before { content: 'Scheme'; }
  pre.src-screen:before { content: 'Gnu Screen'; }
  pre.src-sed:before { content: 'Sed'; }
  pre.src-sh:before { content: 'shell'; }
  pre.src-sql:before { content: 'SQL'; }
  pre.src-sqlite:before { content: 'SQLite'; }
  /* additional languages in org.el's org-babel-load-languages alist */
  pre.src-forth:before { content: 'Forth'; }
  pre.src-io:before { content: 'IO'; }
  pre.src-J:before { content: 'J'; }
  pre.src-makefile:before { content: 'Makefile'; }
  pre.src-maxima:before { content: 'Maxima'; }
  pre.src-perl:before { content: 'Perl'; }
  pre.src-picolisp:before { content: 'Pico Lisp'; }
  pre.src-scala:before { content: 'Scala'; }
  pre.src-shell:before { content: 'Shell Script'; }
  pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
  /* additional language identifiers per "defun org-babel-execute"
       in ob-*.el */
  pre.src-cpp:before  { content: 'C++'; }
  pre.src-abc:before  { content: 'ABC'; }
  pre.src-coq:before  { content: 'Coq'; }
  pre.src-groovy:before  { content: 'Groovy'; }
  /* additional language identifiers from org-babel-shell-names in
     ob-shell.el: ob-shell is the only babel language using a lambda to put
     the execution function name together. */
  pre.src-bash:before  { content: 'bash'; }
  pre.src-csh:before  { content: 'csh'; }
  pre.src-ash:before  { content: 'ash'; }
  pre.src-dash:before  { content: 'dash'; }
  pre.src-ksh:before  { content: 'ksh'; }
  pre.src-mksh:before  { content: 'mksh'; }
  pre.src-posh:before  { content: 'posh'; }
  /* Additional Emacs modes also supported by the LaTeX listings package */
  pre.src-ada:before { content: 'Ada'; }
  pre.src-asm:before { content: 'Assembler'; }
  pre.src-caml:before { content: 'Caml'; }
  pre.src-delphi:before { content: 'Delphi'; }
  pre.src-html:before { content: 'HTML'; }
  pre.src-idl:before { content: 'IDL'; }
  pre.src-mercury:before { content: 'Mercury'; }
  pre.src-metapost:before { content: 'MetaPost'; }
  pre.src-modula-2:before { content: 'Modula-2'; }
  pre.src-pascal:before { content: 'Pascal'; }
  pre.src-ps:before { content: 'PostScript'; }
  pre.src-prolog:before { content: 'Prolog'; }
  pre.src-simula:before { content: 'Simula'; }
  pre.src-tcl:before { content: 'tcl'; }
  pre.src-tex:before { content: 'TeX'; }
  pre.src-plain-tex:before { content: 'Plain TeX'; }
  pre.src-verilog:before { content: 'Verilog'; }
  pre.src-vhdl:before { content: 'VHDL'; }
  pre.src-xml:before { content: 'XML'; }
  pre.src-nxml:before { content: 'XML'; }
  /* add a generic configuration mode; LaTeX export needs an additional
     (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
  pre.src-conf:before { content: 'Configuration File'; }

  table { border-collapse:collapse; }
  caption.t-above { caption-side: top; }
  caption.t-bottom { caption-side: bottom; }
  td, th { vertical-align:top;  }
  th.org-right  { text-align: center;  }
  th.org-left   { text-align: center;   }
  th.org-center { text-align: center; }
  td.org-right  { text-align: right;  }
  td.org-left   { text-align: left;   }
  td.org-center { text-align: center; }
  dt { font-weight: bold; }
  .footpara { display: inline; }
  .footdef  { margin-bottom: 1em; }
  .figure { padding: 1em; }
  .figure p { text-align: center; }
  .equation-container {
    display: table;
    text-align: center;
    width: 100%;
  }
  .equation {
    vertical-align: middle;
  }
  .equation-label {
    display: table-cell;
    text-align: right;
    vertical-align: middle;
  }
  .inlinetask {
    padding: 10px;
    border: 2px solid gray;
    margin: 10px;
    background: #ffffcc;
  }
  #org-div-home-and-up
   { text-align: right; font-size: 70%; white-space: nowrap; }
  textarea { overflow-x: auto; }
  .linenr {
    font-size: smaller;
    @supports (content: attr(data-linenr)) {
      visibility: hidden;
      &::before { content: attr(data-linenr); visibility: visible; }
    }
  }
  .code-highlighted { background-color: #ffff00; }
  .org-info-js_info-navigation { border-style: none; }
  #org-info-js_console-label
    { font-size: 10px; font-weight: bold; white-space: nowrap; }
  .org-info-js_search-highlight
    { background-color: #ffff00; color: #000000; font-weight: bold; }
  .org-svg { }
</style>
<style type=3D"text/css">#table-of-contents h2 { display: none } .title { d=
isplay: none } .authorname { text-align: right }</style>
<style type=3D"text/css">.outline-2 {border-top: 1px solid black;}</style>
</head>
<body>
<div id=3D"content" class=3D"content">
<h1 class=3D"title">OCaml Weekly News</h1>
<p>
<a href=3D"https://alan.petitepomme.net/cwn/2026.05.05.html">Previous Week<=
/a> <a href=3D"https://alan.petitepomme.net/cwn/index.html">Up</a> <a href=
=3D"https://alan.petitepomme.net/cwn/2026.05.19.html">Next Week</a>
</p>

<p>
Hello
</p>

<p>
Here is the latest OCaml Weekly News, for the week of May 05 to 12, 2026.
</p>

<div id=3D"table-of-contents" role=3D"doc-toc">
<h2>Table of Contents</h2>
<div id=3D"text-table-of-contents" role=3D"doc-toc">
<ul>
<li><a href=3D"#1">Dune 3.23.0</a></li>
<li><a href=3D"#2">Orcaset: Financial models in code</a></li>
<li><a href=3D"#3">Miou, a simple scheduler for OCaml 5</a></li>
<li><a href=3D"#4">Run-time types: uses and wants</a></li>
<li><a href=3D"#orgd8e6865">Old CWN</a></li>
</ul>
</div>
</div>
<div id=3D"outline-container-1" class=3D"outline-2">
<h2 id=3D"1">Dune 3.23.0</h2>
<div class=3D"outline-text-2" id=3D"text-1">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-dune-3-23-0/18055/1">ht=
tps://discuss.ocaml.org/t/ann-dune-3-23-0/18055/1</a>
</p>
</div>
<div id=3D"outline-container-orge628788" class=3D"outline-3">
<h3 id=3D"orge628788">Shon announced</h3>
<div class=3D"outline-text-3" id=3D"text-orge628788">
<p>
The Dune team is pleased to announce <a href=3D"https://github.com/ocaml/du=
ne/releases/tag/3.23.0">the release of dune 3.23.0</a>.
</p>

<p>
Along with many other fixes and improvements, some highlights include:
</p>

<ul class=3D"org-ul">
<li>Add support for <code>c_library_flags</code> in foreign_stubs (<a href=
=3D"https://github.com/ocaml/dune/pull/13484">#13484</a>, <a href=3D"https:=
//github.com/madroach">@madroach</a>)</li>
<li>Many improvements to the promotion and diffing functionality, by <a hre=
f=3D"https://github.com/rgrinberg">@rgrinberg</a>.</li>
<li>As part of the previous, a breaking change to the promotion logic has b=
een
introduced: Dune does automatically promote generated opam files, which must
now be manually promoted with <code>dune promote</code>. You can trigger bu=
ilding <code>.opam</code>
files with the <code>@install</code>, <code>@runtest</code>, and <code>@opa=
m</code> aliases. In release mode,
<code>.opam</code> files aren't generated at all and whatever is in the sou=
rce is used
(<a href=3D"https://github.com/ocaml/dune/pull/14108">ocaml/dune#14108</a>,=
 <a href=3D"https://github.com/rgrinberg">@rgrinberg</a>).</li>
<li>User rules and inline test runners are now sandboxed by default
(<a href=3D"https://github.com/ocaml/dune/pull/13805">ocaml/dune#13805</a> =
and <a href=3D"https://github.com/ocaml/dune/pull/14257">ocaml/dune#14257</=
a>, <a href=3D"https://github.com/rgrinberg">@rgrinberg</a>).</li>
<li>The minimum OCaml version required to build dune is now 4.14.</li>
</ul>

<p>
See <a href=3D"https://github.com/ocaml/dune/releases/tag/3.23.0">the full =
changelog</a> for all new features and fixes, and for attribution to the co=
ntributors
who made it all possible. Thank you, contributors!
</p>

<p>
If you encounter a problem with this release, please report it in <a href=
=3D"https://github.com/ocaml/dune/issues">our issue
tracker</a>.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-2" class=3D"outline-2">
<h2 id=3D"2">Orcaset: Financial models in code</h2>
<div class=3D"outline-text-2" id=3D"text-2">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/orcaset-financial-models-in=
-code/18056/1">https://discuss.ocaml.org/t/orcaset-financial-models-in-code=
/18056/1</a>
</p>
</div>
<div id=3D"outline-container-org497318f" class=3D"outline-3">
<h3 id=3D"org497318f">Jordan announced</h3>
<div class=3D"outline-text-3" id=3D"text-org497318f">
<p>
Hi all, sharing <code>orcaset</code>, a library for building financial stat=
ement models in code.
</p>

<p>
Orcaset aims to give agents a robust tool for financial analysis. Based on =
tests against Claude and Codex Excel tools I've seen lower model error rate=
s while using ~=E2=80=8B40% fewer tokens. I expect the gap to widen as a fu=
nction of model scale (e.g. easier to reuse components in <code>orcaset</co=
de>) but haven't benchmarked in depth beyond models of a few hundred line i=
tems.
</p>

<p>
It's mainly built from a private equity and credit perspective, but there's=
 nothing inherently specific to those industries.
</p>

<p>
A trivially simple example below for a taste of what it looks like.
</p>

<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">open </span><span style=3D"color: #557400; font-weight: bold;">O=
rcaset</span>
<span style=3D"color: #242521; font-weight: bold;">open </span><span style=
=3D"color: #557400; font-weight: bold;">Series</span>

<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">offset</span> =3D <span style=3D"color: #557400; font-=
weight: bold;">Offset.</span>make <span style=3D"color: #444fcf; font-weigh=
t: bold;">~quarters</span>:1 <span style=3D"color: #444fcf; font-weight: bo=
ld;">~month_end</span>:<span style=3D"color: #00824f;">true</span> ()
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">periods</span> =3D <span style=3D"color: #557400; font=
-weight: bold;">Period.</span>make_seq <span style=3D"color: #444fcf; font-=
weight: bold;">~start</span>:(<span style=3D"color: #557400; font-weight: b=
old;">Date.</span>make 2026 1 1) ~offset <span style=3D"color: #9f0d0f;">|&=
gt;</span> <span style=3D"color: #557400; font-weight: bold;">Seq.</span>ta=
ke 4 <span style=3D"color: #9f0d0f;">|&gt;</span> <span style=3D"color: #55=
7400; font-weight: bold;">List.</span>of_seq

<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">revenue_proj</span> =3D
  <span style=3D"color: #557400; font-weight: bold;">List.</span>mapi (<spa=
n style=3D"color: #006f00; font-weight: bold;">fun</span> <span style=3D"co=
lor: #007a9f;">i</span> <span style=3D"color: #007a9f;">period</span> -&gt;=
 (period, 100.0 *. (1.03 ** float_of_int (i - 1)))) periods

<span style=3D"color: #8f6f4a; font-style: italic;">(* </span><span style=
=3D"color: #8f6f4a; font-style: italic;">Define model</span><span style=3D"=
color: #8f6f4a; font-style: italic;"> *)</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">revenue</span> =3D <span style=3D"color: #557400; font=
-weight: bold;">Spans.</span>of_list <span style=3D"color: #444fcf; font-we=
ight: bold;">~label</span>:<span style=3D"color: #ca3400;">"Revenue"</span>=
 <span style=3D"color: #444fcf; font-weight: bold;">~split</span>:<span sty=
le=3D"color: #557400; font-weight: bold;">Split.</span>daily <span style=3D=
"color: #444fcf; font-weight: bold;">~agg</span>:<span style=3D"color: #557=
400; font-weight: bold;">Agg.</span>sum revenue_proj
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">costs</span> =3D <span style=3D"color: #557400; font-w=
eight: bold;">Spans.</span>scale <span style=3D"color: #444fcf; font-weight=
: bold;">~label</span>:<span style=3D"color: #ca3400;">"Costs"</span> (-0.4=
5) revenue
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">income</span> =3D <span style=3D"color: #557400; font-=
weight: bold;">Spans.</span>sum <span style=3D"color: #444fcf; font-weight:=
 bold;">~label</span>:<span style=3D"color: #ca3400;">"Income"</span> <span=
 style=3D"color: #444fcf; font-weight: bold;">~agg</span>:<span style=3D"co=
lor: #557400; font-weight: bold;">Agg.</span>sum [ revenue; costs ]

<span style=3D"color: #8f6f4a; font-style: italic;">(* </span><span style=
=3D"color: #8f6f4a; font-style: italic;">Build and print statement</span><s=
pan style=3D"color: #8f6f4a; font-style: italic;"> *)</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> () =3D
  <span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">stmt</span> =3D <span style=3D"color: #557400; font-we=
ight: bold;">Stmt.</span>span_total income (<span style=3D"color: #557400; =
font-weight: bold;">Stmt.</span>span_lines [ revenue; costs ]) <span style=
=3D"color: #242521; font-weight: bold;">in</span>
  <span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">resolved</span> =3D <span style=3D"color: #557400; fon=
t-weight: bold;">Stmt.</span>eval_periods periods stmt <span style=3D"color=
: #242521; font-weight: bold;">in</span>
  <span style=3D"color: #557400; font-weight: bold;">Printf.</span>printf <=
span style=3D"color: #ca3400;">"\n%s\n\n"</span> (<span style=3D"color: #55=
7400; font-weight: bold;">Stmt.</span>fixed_width resolved)

<span style=3D"color: #8f6f4a; font-style: italic;">(* </span><span style=
=3D"color: #8f6f4a; font-style: italic;">Output:</span>
<span style=3D"color: #8f6f4a; font-style: italic;">           2026-04-30  =
2026-07-31  2026-10-31  2027-01-31</span>
<span style=3D"color: #8f6f4a; font-style: italic;">  Revenue       97.09  =
    100.00      103.00      106.09</span>
<span style=3D"color: #8f6f4a; font-style: italic;">  Costs        -43.69  =
    -45.00      -46.35      -47.74</span>
<span style=3D"color: #8f6f4a; font-style: italic;">           ----------  =
----------  ----------  ----------</span>
<span style=3D"color: #8f6f4a; font-style: italic;">Income          53.40  =
     55.00       56.65       58.35</span><span style=3D"color: #8f6f4a; fon=
t-style: italic;"> *)</span>
</code></pre>
</div>

<p>
Calculations are fully auditable. Line item relationships can be statically=
 inspected, and dependencies across materialized values can also be traced.=
 Dependencies can be cyclic, meaning you can easily model revolver plugs (o=
r solve revenue growth to a 20% return, as is tradition).=20
</p>

<p>
Experimental, but would appreciate feedback or suggestions!
</p>

<p>
<a href=3D"https://github.com/Orcaset/orcaset-oc">https://github.com/Orcase=
t/orcaset-oc</a>
</p>
</div>
</div>
</div>
<div id=3D"outline-container-3" class=3D"outline-2">
<h2 id=3D"3">Miou, a simple scheduler for OCaml 5</h2>
<div class=3D"outline-text-2" id=3D"text-3">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-miou-a-simple-scheduler=
-for-ocaml-5/12963/18">https://discuss.ocaml.org/t/ann-miou-a-simple-schedu=
ler-for-ocaml-5/12963/18</a>
</p>
</div>
<div id=3D"outline-container-orga516f52" class=3D"outline-3">
<h3 id=3D"orga516f52">Calascibetta Romain announced</h3>
<div class=3D"outline-text-3" id=3D"text-orga516f52">
<p>
I am delighted to announce the release of <a href=3D"https://github.com/rob=
ur-coop/miou">miou.0.6.0</a>. This release mainly adds two new features:
</p>
<ul class=3D"org-ul">
<li>a Miou event logging system</li>
<li>a new <code>Miou.take</code> function allowing you to retrieve tasks av=
ailable in a <code>Miou.orphans</code></li>
</ul>

<p>
The addition of a logging system allows us to record events related to Miou=
 (such as the creation of a new task) and to analyse these events to diagno=
se a Miou application that does not comply with <a href=3D"https://docs.osa=
u.re/local/miou/Miou/index.html#user-task-management">our fundamental rules=
</a> (such as never forgetting its children). This is why we offer several =
tools:
</p>
<ul class=3D"org-ul">
<li><code>mtbox.recd</code>, which allows you to record Miou events in JSON=
 format so that you can analyse a Miou application using software such as <=
a href=3D"https://perfetto.dev/">perfetto.dev</a>.</li>
<li><code>mtbox.diag</code>, which explains why a Miou application terminat=
es with an exception such as <code>Still_has_children</code> (which results=
 from a violation of one of our <a href=3D"https://docs.osau.re/local/miou/=
Miou/index.html#user-task-management">rules</a>)</li>
<li><code>mtbox.mtop</code>, which provides an <span class=3D"underline"><c=
ode>htop</code>-style</span> TUI for monitoring a Miou application. You can=
 see an example here:</li>
</ul>


<div id=3D"orgaa7f078" class=3D"figure">
<p><img src=3D"https://github.com/robur-coop/mtbox/blob/main/assets/demo.gi=
f?raw=3Dtrue" alt=3D"demo.gif?raw=3Dtrue" width=3D"80%" />
</p>
</div>

<p>
<code>mtbox</code> is experimental (very first release) but it demonstrates=
 what can be done with Miou and now offers a <a href=3D"https://github.com/=
robur-coop/notty-miou"><code>nott{y,ui}-miou</code></a> library allowing yo=
u to build your own TUI applications with Miou and <a href=3D"https://githu=
b.com/let-def/lwd"><code>lwd</code></a>.
</p>

<p>
The addition of <code>Miou.take</code> relates more to our HTTP stack provi=
ded by our <a href=3D"https://github.com/robur-coop/httpcats"><code>httpcat=
s</code></a> library and the <a href=3D"https://github.com/robur-coop/vif">=
=CE=BD=CE=B9=CF=9D</a> Web Framework. Alongside a few additions and bug fix=
es, we have notably undertaken to provide <a href=3D"https://github.com/rob=
ur-coop/httpcats/blob/main/bench/PROTOCOL.md">a reproducible</a> benchmark =
of our HTTP servers, the results of which are available <a href=3D"https://=
robur-coop.github.io/httpcats">here</a>.
</p>


<div id=3D"orgc609872" class=3D"figure">
<p><img src=3D"https://us1.discourse-cdn.com/flex020/uploads/ocaml/original=
/2X/9/92b03ba0b15881dbcff661dccec08dd00644b163.png" alt=3D"92b03ba0b15881db=
cff661dccec08dd00644b163.png" width=3D"80%" />
</p>
</div>

<p>
So, in addition to this Miou release, we continue to maintain and improve <=
code>httpcats</code>, <code>vif</code> and <a href=3D"https://github.com/ro=
bur-coop/hurl"><code>hurl</code></a> to provide an HTTP stack for the Miou =
ecosystem.
</p>

<p>
Finally, as you are no doubt aware, we are continuing to experiment with th=
e development of unikernels in OCaml using Miou, and this release is accomp=
anied by a release of <a href=3D"https://github.com/robur-coop/mkernel"><co=
de>mkernel</code></a> (our scheduler for unikernels), <a href=3D"https://gi=
thub.com/robur-coop/mnet"><code>mnet</code></a> (our TCP/IP stack), and <a =
href=3D"https://github.com/robur-coop/mhttp"><code>mhttp</code></a> and <co=
de>vifu</code> (our HTTP stack for unikernels). Added to this are <a href=
=3D"https://github.com/robur-coop/msendmail"><code>msendmail</code></a> (re=
cently released to deploy our mailing list [email protected]), <a href=3D"htt=
ps://github.com/robur-coop/mfat"><code>mfat</code></a> (our FAT32 file syst=
em in OCaml) and <code>mnet-dns</code>. We are now able to offer you (in ad=
dition to <a href=3D"https://builds.robur.coop/#Unikernels">our existing un=
ikernels</a>) new unikernels with OCaml 5:
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/robur-coop/ptt"><code>ptt</code></a> to m=
anage your mailing list (announced <a href=3D"https://discuss.ocaml.org/t/a=
nn-ptt-a-mailing-list-system-as-unikernel/17987">here</a>)</li>
<li><a href=3D"https://github.com/dinosaure/pagejaune"><code>annuaire</code=
></a> acting as a recursive DNS resolver and stub DNS resolver (with a ban =
list)</li>
<li><a href=3D"https://git.robur.coop/robur/contruno"><code>contruno</code>=
</a> as a TLS termination proxy managing your Let=E2=80=99s Encrypt certifi=
cates and their renewal</li>
<li>and of course <a href=3D"https://github.com/dinosaure/immuable"><code>i=
mmuable</code></a>, our unikernel that enables the delivery of a static web=
site (notably that of <a href=3D"https://mailingl.st">https://mailingl.st</=
a> and <a href=3D"https://docs.osau.re">https://docs.osau.re</a>)</li>
</ul>

<p>
We invite you to read <a href=3D"https://robur-coop.github.io/mnet/">our tu=
torial</a> to learn how to develop unikernels and we recommend our <a href=
=3D"https://github.com/robur-coop/albatross">Albatross</a> project for depl=
oying them.
</p>

<p>
In short, we are beginning to consolidate the ecosystem around Miou and off=
er more and more libraries enabling you to develop your applications with o=
ur scheduler. We would like to thank everyone who has contributed, directly=
 or indirectly, to the development of Miou, as well as those who have helpe=
d improve the libraries that make up our ecosystem. Please feel free to get=
 involved, ask questions and, above all, start hacking!
</p>

<p>
Happy hacking!
</p>
</div>
</div>
</div>
<div id=3D"outline-container-4" class=3D"outline-2">
<h2 id=3D"4">Run-time types: uses and wants</h2>
<div class=3D"outline-text-2" id=3D"text-4">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/run-time-types-uses-and-wan=
ts/18085/1">https://discuss.ocaml.org/t/run-time-types-uses-and-wants/18085=
/1</a>
</p>
</div>
<div id=3D"outline-container-orgc504ab9" class=3D"outline-3">
<h3 id=3D"orgc504ab9">Rapha=C3=ABl Proust asked</h3>
<div class=3D"outline-text-3" id=3D"text-orgc504ab9">
<p>
This is an informal survey to assess the interest in run-time types from va=
rious users. If you are not sure what this is about check <a href=3D"https:=
//www.lexifi.com/blog/ocaml/fun-ocaml-2025/">lexifi's talk at funocaml</a> =
and specifically the type reflection section (timecode on the video: 33:00,=
 slide number: 32).
</p>
</div>
<div id=3D"outline-container-orge5f3205" class=3D"outline-4">
<h4 id=3D"orge5f3205">the questions</h4>
<div class=3D"outline-text-4" id=3D"text-orge5f3205">
<p>
Answer in any format you like :)
</p>

<p>
Do you use type reflection / run-time types / whatchacallit? If not, would =
you use it if it was in the Stdlib or in an established lib in the ecosyste=
m?
</p>

<p>
Do you use some in-house solution or some off the shelf library? (Are you a=
ble to show the code?)
</p>

<p>
What do you use it for? What would you use it for?
</p>

<p>
Do you think it'd be useful even without any compiler support? What kind of=
 tooling would make this viable?
</p>
</div>
</div>
<div id=3D"outline-container-org1e80007" class=3D"outline-4">
<h4 id=3D"org1e80007">the why</h4>
<div class=3D"outline-text-4" id=3D"text-org1e80007">
<p>
I've seen these things re-implemented multiple times. (I've even had to imp=
lement a couple of them myself.) I'm not sure there can be a stdlib module =
that covers all uses cases completely, but this survey and the ensuing conv=
ersation could maybe reveal that a large portion of use cases could be cove=
red.
</p>

<p>
I'm keen for this to exist in the Stdlib but I'm not keen to make a proposa=
l that fails before it even leaves prototyping phase.
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-orgd8e6865" class=3D"outline-2">
<h2 id=3D"orgd8e6865">Old CWN</h2>
<div class=3D"outline-text-2" id=3D"text-orgd8e6865">
<p>
If you happen to miss a CWN, you can <a href=3D"mailto:alan.schmitt@polytec=
hnique.org">send me a message</a> and I'll mail it to you, or go take a loo=
k at <a href=3D"https://alan.petitepomme.net/cwn/">the archive</a> or the <=
a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive=
s</a>.
</p>

<p>
If you also wish to receive it every week by mail, you may subscribe to the=
 <a href=3D"https://sympa.inria.fr/sympa/info/caml-list">caml-list</a>.
</p>

<div class=3D"authorname" id=3D"orgc6b4eb6">
<p>
<a href=3D"https://alan.petitepomme.net/">Alan Schmitt</a>
</p>

</div>
</div>
</div>
</div>
</body>
</html>


--==-=-=--

--=-=-=--

--===-=-=
Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmoC1oobFIAAAAAABAAO
bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v
cmcACgkQBA0KO07S5ccCOggAypZyzUjQTYy2sAlTkum4QQyYvDWYOLXJRK0CBF83
ktVEKLejS6ZuQftq/25Cv6+ho9IPzGI3v9Wk+W4oNoEOnPaN9TJZsej+4rVKEJzg
262HpLzdbOGJth2WM52d+4BCr7zEi5i4OdLG3V+KoOlDwfuDAG3BhsiitJVUdc65
/8mLMimGGuYf3+R7SdASKRfxfcYDbQnOVyiAHbSlSdpZHnXbCVzTGMm+lObP59Bg
pv3SCLkLdpZfk8Sas8kfqCzALd3lZnuHtQ4a/5jQv3lRDdbMd7v6BFKKNxstMB1n
mRQpi2Au7D4aaAdweAP3ivKspho+fi0P5FOk3FpX6ilstg==
=OEXD
-----END PGP SIGNATURE-----
--===-=-=--