Attn: Development Editor, Latest OCaml Weekly News
Alan Schmitt <[email protected]> Tue, 14 Apr 2026 11:50:00 +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: base64
SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl
ZWsgb2YgQXByaWwgMDcgdG8gMTQsDQoyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkNhbGwgZm9y
IHByZXNlbnRhdGlvbnM6IENhbWwgaW4gdGhlIENhcGl0YWwgSUkNCkxpc3QgeW91ciBvcGVuIE9D
YW1sIHBvc2l0aW9ucyBvbiB0aGUgT0NhbWwub3JnIGpvYiBib2FyZA0KWUFNTHg6IHB1cmUtT0Nh
bWwgWUFNTCAxLjIvMS4xIGxpYnJhcnkNCm9jYW1sLWxldHNlbmNyeXB0LCBhbiBPQ2FtbCB3YXkg
dG8gZ2V0IFRMUyBjZXJ0aWZpY2F0ZXMNCk5ldyByZWxlYXNlIG9mIE9DYW1sIExTUCAxLjI2LjAg
YW5kIE1lcmxpbiA1LjcuMC01MDQNCk9DYW1sIFlBTUwgbGlicmFyeQ0KSTE4biA1LjAg4oCUIElu
dGVybmF0aW9uYWxpc2F0aW9uIG1hZGUgZWFzeSBmb3IgYW55IE9DYW1sIGFwcA0KQVREIDQuMS4w
IC0gbm93IHdpdGggWUFNTCBzdXBwb3J0DQpPbGQgQ1dODQoNCg0KQ2FsbCBmb3IgcHJlc2VudGF0
aW9uczogQ2FtbCBpbiB0aGUgQ2FwaXRhbCBJSQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN
CiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9jYWxsLWZvci1wcmVz
ZW50YXRpb25zLWNhbWwtaW4tdGhlLWNhcGl0YWwtaWkvMTc5NTkvMT4NCg0KDQpTYWNoYSBBeW91
biBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25lIDp3YXZpbmdfaGFuZDoNCg0KICBG
b2xsb3dpbmcgdGhlIHN1Y2Nlc3Mgb2YgdGhlIGxhc3QgZXZlbnQsIHdlJ3JlIG9yZ2FuaXNpbmcg
YSBzZWNvbmQNCiAgZWRpdGlvbiBvZiBDYW1sIEluIHRoZSBDYXBpdGFsIChoYXBwZW5pbmcgaW4g
TG9uZG9uKS4gRnJvbSB0YWxraW5nIHRvDQogIHRoZSBhdHRlbmRlZXMgYXQgdGhlIGZpcnN0IGV2
ZW50LCB3ZSB3aWxsIGJlIGRvaW5nIHNob3J0ZXIgdGFsa3MgYW5kDQogIG1vcmUgc29jaWFsaXNp
bmcg8J+NlQ0KDQogIFNvIGZhciwgd2UgYXJlIGFpbWluZyBmb3IgKk1heSAxNHRoKiwgdG8gYmUg
Y29uZmlybWVkIG9uY2Ugd2UgaGF2ZQ0KICBzZWN1cmVkIGEgdmVudWUuIFBsZWFzZSBsZXQgdXMg
a25vdyBpZiB0aGlzIGlzIGNsYXNoaW5nIHdpdGggYW5vdGhlcg0KICBiaWcgZXZlbnQgb2ZmIG91
ciByYWRhci4NCg0KICBPbmNlIHdlIGNvbmZpcm0gdGhlIGRhdGUgYW5kIHByZXNlbnRhdGlvbnMs
IHdlJ2xsIHBvc3QgaGVyZSBhbmQgb24gdGhlDQogIGRlZGljYXRlZCBbWnVsaXAgY2hhbm5lbF0g
YXMgd2VsbCBhcyBbb3VyIHdlYnNpdGVdLg0KDQoNCltadWxpcCBjaGFubmVsXQ0KPGh0dHBzOi8v
b2NhbWwuenVsaXBjaGF0LmNvbS8jbmFycm93L2NoYW5uZWwvNTUzMzc1LUNhbWwtSW4tVGhlLUNh
cGl0YWw+DQoNCltvdXIgd2Vic2l0ZV0gPGh0dHBzOi8vY2FtbC1pbi10aGUtY2FwaXRhbC5naXRo
dWIuaW8+DQoNCkNhbGwgZm9yIHByZXNlbnRhdGlvbnMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdlJ3JlIGxv
b2tpbmcgZm9yIHRhbGtzIHRoYXQgYXJlIG9mIGludGVyZXN0IHRvIHRoZSBlbnRpcmUgT0NhbWwN
CiAgY29tbXVuaXR5LiAgVG9waWNzIGluY2x1ZGVzIChidXQgYXJlIG5vdCBsaW1pdGVkIHRvKToN
CiAg4oCiIE9DYW1sIHRvb2xpbmcgKGJ1aWxkIHN5c3RlbXMsIHBhY2thZ2UgbWFuYWdlbWVudCwg
bHNwLA0KICAgIGRvY3VtZW50YXRpb27igKYpDQogIOKAoiBUaGUgY29vbCBsaWJyYXJ5IHlvdSdy
ZSB3b3JraW5nIG9uDQogIOKAoiBZb3VyIE9DYW1sLXJlbGF0ZWQgcmVzZWFyY2ggKGFzIGxvbmcg
YXMgeW91IG1ha2UgaXQgYWNjZXNzaWJsZSBmb3INCiAgICBwZW9wbGUgb3V0c2lkZSB5b3VyIGZp
ZWxkKQ0KICDigKIgU29tZSBwaWVjZSBvZiB0aGUgT0NhbWwgZWNvc3lzdGVtIHRoYXQgeW91J2Qg
bGlrZSBwZW9wbGUgdG8gaGVhcg0KICAgIGFib3V0IChvY2FtbC5vcmcsIHRoZSBPQ2FtbCBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCDigKYpDQogIOKAoiBZb3VyIGluZHVzdHJpYWwgdXNlIG9mIE9DYW1s
DQogIOKAoiBldGMuDQoNCiAgSWYgeW914oCZZCBsaWtlIHRvIGdpdmUgYSB0YWxrLCBwbGVhc2Ug
bWVzc2FnZSBtZSBvciBAQWxpc3RhaXIgZGlyZWN0bHkNCiAgd2l0aCBhIHRpdGxlIGFuZCBzaG9y
dCBhYnN0cmFjdC4NCg0KDQpMaXN0IHlvdXIgb3BlbiBPQ2FtbCBwb3NpdGlvbnMgb24gdGhlIE9D
YW1sLm9yZyBqb2IgYm9hcmQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh
bWwub3JnL3QvbGlzdC15b3VyLW9wZW4tb2NhbWwtcG9zaXRpb25zLW9uLXRoZS1vY2FtbC1vcmct
am9iLWJvYXJkLzExMzc3LzIxPg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIFZpa2FzSyBh
bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgd291bGQgbGlrZSB0byBwb3N0IHRoaXMgam9iIHRoYXQg
d2UgYXJlIGhpcmluZyBmb3IuDQoNCiAg4oCiIHRpdGxlOiBMZWFkIFN5c3RlbXMgU29mdHdhcmUg
RW5naW5lZXINCiAg4oCiIGxpbms6DQogICAgPGh0dHBzOi8vY2FyZWVycy5jbG91ZC5jb20vam9i
cy9sZWFkLXN5c3RlbXMtc29mdHdhcmUtZW5naW5lZXItcmVtb3RlLXVuaXRlZC1raW5nZG9tPg0K
ICDigKIgbG9jYXRpb25zOg0KICAgIOKAoiBSZW1vdGUNCiAgICDigKIgVW5pdGVkLUtpbmdkb20N
CiAg4oCiIHB1YmxpY2F0aW9uX2RhdGU6IDIwMjYtMDQtMDgNCiAg4oCiIGNvbXBhbnk6IENsb3Vk
IFNvZnR3YXJlIEdyb3VwDQogIOKAoiBjb21wYW55X2xvZ286DQogICAgPGh0dHBzOi8vd3d3LmNs
b3VkLmNvbS9tZWRpYV8xZTQwZTdkMDQ4ZjAxMTdkNDU0M2M5NDBmOWU3NDMzYjU0OWMwOGEwMy5z
dmc+DQoNCg0KWUFNTHg6IHB1cmUtT0NhbWwgWUFNTCAxLjIvMS4xIGxpYnJhcnkNCuKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy
Y2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXlhbWx4LXB1cmUtb2Nh
bWwteWFtbC0xLTItMS0xLWxpYnJhcnkvMTc5NzAvMT4NCg0KDQpNYXJ0aW4gSmFtYm9uIGFubm91
bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVsbG8sDQoNCiAgSSdtIGV4Y2l0ZWQgdG8gYW5ub3Vu
Y2UgdGhlIGF2YWlsYWJpbGl0eSBvZiBbWUFNTHhdLCBhIGNvbXBsZXRlDQogIGltcGxlbWVudGF0
aW9uIG9mIHRoZSBZQU1MIDEuMiBhbmQgMS4xIHN0YW5kYXJkcy4gSXQgaXMgaW50ZW5kZWQgdG8N
CiAgc3VwcG9ydCBtb3N0IHVzZXMgb2YgWUFNTCBpbmNsdWRpbmcgaXRzIHVzZSBhcyBhIGNvbmZp
Z3VyYXRpb24gZmlsZQ0KICBmb3JtYXQgaW4gbmV3IGFwcGxpY2F0aW9ucyBhbmQgYW5hbHl6aW5n
IFlBTUwgZmlsZXMgb2Ygb3RoZXINCiAgYXBwbGljYXRpb25zLg0KDQogIEZvciBhIGZ1bGxlciBk
ZXNjcmlwdGlvbiwgY2hlY2sgb3V0IHRoZSBbcmVsZWFzZSBub3Rlc10uDQoNCiAgR2V0IHN0YXJ0
ZWQgd2l0aCBgb3BhbSBpbnN0YWxsIHlhbWx4Jy4gVGhlbiB1c2UgdGhlIGB5YW1seCcgY29tcGFu
aW9uDQogIGNvbW1hbmQgdG8gY2hlY2sgdGhhdCBpdCBwYXJzZXMgYW5kIGludGVycHJldHMgeW91
ciBmYXZvcml0ZSBZQU1MDQogIGZpbGVzIGNvcnJlY3RseS4NCg0KICBIZXJlJ3MgYW4gZXhhbXBs
ZSBzaG93aW5nIHRoZSB1c2Ugb2YgdGhlIGxpYnJhcnkgdG8gY29udmVydCBZQU1MIHRvDQogIEpT
T046DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAoKiBSZWFkIFlBTUwgZnJvbSBzdGRpbiB3
aXRoIFlBTUx4LCBwcmludCBKU09OIHRvIHN0ZG91dCB3aXRoIFlvanNvbg0KICDilIIgDQogIOKU
giAgICBUaGlzIGlzIGEgZGVtbyBzaG93aW5nIGhvdyB0byB1c2UgdGhlIFlBTUx4IGxpYnJhcnkg
d2l0aCB0aGUgZGVmYXVsdA0KICDilIIgICAgc2V0dGluZ3MuICdZQU1MeC5WYWx1ZXMub25lX29m
X3lhbWxfZXhuJyBvZmZlcnMgb3B0aW9ucyB0byByZXN0cmljdA0KICDilIIgICAgdGhlIGlucHV0
IGxhbmd1YWdlIG9yIHRvIGZvcmNlIHRoZSBpbnRlcnByZXRhdGlvbiBhcyBZQU1MIDEuMSBpbnN0
ZWFkIG9mDQogIOKUgiAgICBZQU1MIDEuMi4NCiAg4pSCIA0KICDilIIgICAgQ29tcGlsZSB3aXRo
Og0KICDilIIgICAgICBvY2FtbGZpbmQgb3B0IC1vIHlhbWwtdG8tanNvbiBcDQogIOKUgiAgICAg
ICAgLXBhY2thZ2UgeWFtbHgseW9qc29uIC1saW5rcGtnIHlhbWxfdG9fanNvbi5tbA0KICDilIIg
KikNCiAg4pSCIA0KICDilIIgb3BlbiBQcmludGYNCiAg4pSCIA0KICDilIIgbGV0IHJlYyB5b2pz
b25fb2ZfeWFtbHggKHggOiBZQU1MeC52YWx1ZSkgOiBZb2pzb24uU2FmZS50ID0NCiAg4pSCICAg
bWF0Y2ggeCB3aXRoDQogIOKUgiAgIHwgTnVsbCBfIC0+IGBOdWxsDQogIOKUgiAgIHwgQm9vbCAo
XywgeCkgLT4gYEJvb2wgeA0KICDilIIgICB8IEludCAoXywgeCkgLT4gYEludGxpdCAoSW50NjQu
dG9fc3RyaW5nIHgpDQogIOKUgiAgIHwgRmxvYXQgKF8sIHgpIC0+IGBGbG9hdCB4DQogIOKUgiAg
IHwgU3RyaW5nIChfLCB4KSAtPiBgU3RyaW5nIHgNCiAg4pSCICAgfCBTZXEgKF8sIHhzKSAtPiBg
TGlzdCAoTGlzdC5tYXAgeW9qc29uX29mX3lhbWx4IHhzKQ0KICDilIIgICB8IE1hcCAoXywgeHMp
IC0+DQogIOKUgiAgICAgICBgQXNzb2MgKExpc3QubWFwIChmdW4gKGxvYywgaywgdikgLT4NCiAg
4pSCICAgICAgICAgbWF0Y2ggKGsgOiBZQU1MeC52YWx1ZSkgd2l0aA0KICDilIIgICAgICAgICB8
IFN0cmluZyAoXywgaykgLT4gKGssIHlvanNvbl9vZl95YW1seCB2KQ0KICDilIIgICAgICAgICB8
IF8gLT4NCiAg4pSCICAgICAgICAgICAgIGtzcHJpbnRmIGZhaWx3aXRoICIlczogb25seSBzdHJp
bmcga2V5cyBhcmUgc3VwcG9ydGVkIg0KICDilIIgICAgICAgICAgICAgICAoWUFNTHguZGVmYXVs
dF9mb3JtYXRfbG9jIGxvYykNCiAg4pSCICAgICAgICkgeHMpDQogIOKUgiANCiAg4pSCIGxldCAo
KSA9DQogIOKUgiAgIFlBTUx4LnJlZ2lzdGVyX2V4Y2VwdGlvbl9wcmludGVycyAoKTsNCiAg4pSC
ICAgc3RkaW4NCiAg4pSCICAgfD4gSW5fY2hhbm5lbC5pbnB1dF9hbGwNCiAg4pSCICAgfD4gWUFN
THguVmFsdWVzLm9uZV9vZl95YW1sX2V4bg0KICDilIIgICB8PiB5b2pzb25fb2ZfeWFtbHgNCiAg
4pSCICAgfD4gWW9qc29uLlNhZmUucHJldHR5X3RvX2NoYW5uZWwgc3Rkb3V0DQogIOKUgiAgIHw+
IHByaW50X25ld2xpbmUNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KW1lBTUx4XSA8aHR0cHM6Ly9n
aXRodWIuY29tL21qYW1ib24veWFtbHg+DQoNCltyZWxlYXNlIG5vdGVzXSA8aHR0cHM6Ly9naXRo
dWIuY29tL21qYW1ib24veWFtbHgvcmVsZWFzZXMvdGFnLzAuMS4wPg0KDQpGdW5kaW5nDQrilYzi
lYzilYzilYzilYzilYzilYwNCg0KICBZQU1MeCBpcyBjdXJyZW50bHkgcmVsZWFzZWQgdW5kZXIg
dGhlICpBR1BMKi4gVGhlcmUgaXMgYW4gb25nb2luZw0KICBmdW5kcmFpc2VyOiBvbmNlIGEgZnVu
ZGluZyBnb2FsIGlzIHJlYWNoZWQsIHRoZSBsaWNlbnNlIHdpbGwgc3dpdGNoIHRvDQogIHRoZSBw
ZXJtaXNzaXZlICpJU0MqIGxpY2Vuc2UgZm9yIGV2ZXJ5b25lLiBEb25vcnMgYWJvdmUgYSBjZXJ0
YWluDQogIHRocmVzaG9sZCByZWNlaXZlIGFuIGltbWVkaWF0ZSAqY29tbWVyY2lhbCBsaWNlbnNl
Ki4gU2VlIFtteSBHaXRIdWINCiAgU3BvbnNvcnMgcHJvZmlsZV0gZm9yIGRldGFpbHMuDQoNCg0K
W215IEdpdEh1YiBTcG9uc29ycyBwcm9maWxlXSA8aHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3Jz
L21qYW1ib24+DQoNCg0Kb2NhbWwtbGV0c2VuY3J5cHQsIGFuIE9DYW1sIHdheSB0byBnZXQgVExT
IGNlcnRpZmljYXRlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h
bm4tb2NhbWwtbGV0c2VuY3J5cHQtYW4tb2NhbWwtd2F5LXRvLWdldC10bHMtY2VydGlmaWNhdGVz
LzE3OTc1LzE+DQoNCg0KQ2FsYXNjaWJldHRhIFJvbWFpbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gZGVsaWdodGVkIHRvIGFubm91bmNlIHRoZSBy
ZWxlYXNlIG9mIFtvY2FtbC1sZXRzZW5jcnlwdF0gKHZlcnNpb24NCiAgMi4xLjApLiBUaGlzIHZl
cnNpb24gaW50cm9kdWNlcyBhIG5ldyBBUEkgdGhhdCBhbGxvd3MgaXQgdG8gb3BlcmF0ZQ0KICBp
bmRlcGVuZGVudGx5IG9mIGEgc2NoZWR1bGVyIGFuZCBhbiBIVFRQIGNsaWVudC4gSXQgaXMgYWxz
byBhIHJld3JpdGUNCiAgdXNpbmcgb3VyIGJyYW5kLW5ldyBbandzXSBsaWJyYXJ5LCB3aGljaCBu
b3cgdXRpbGlzZXMgdGhlIFtqc29udF0NCiAgbGlicmFyeSAocmF0aGVyIHRoYW4gW3lvanNvbl0p
Lg0KDQogIGBvY2FtbC1sZXRzZW5jcnlwdCcgaW1wbGVtZW50cyBbY2hhbGxlbmdlc10gbmVlZGVk
IHRvIG9idGFpbiBhDQogIGNlcnRpZmljYXRlIHZpYSB0aGUgdGhyZWUgd2F5czogRE5TLCBIVFRQ
IGFuZCBBQ01FLVRMUy4gSXQgdGhlcmVmb3JlDQogIGVuYWJsZXMgYSB3ZWJzaXRlIGRlcGxveW1l
bnQgc3RyYXRlZ3kgKGltcGxlbWVudGVkIHdpdGggW1ZpZl0sIGZvcg0KICBleGFtcGxlKSB0byBi
ZSBwcm92aWRlZCBlbnRpcmVseSBpbiBPQ2FtbC4NCg0KICBXZSB1c2UgaXQgd2l0aGluIG91ciBj
b29wZXJhdGl2ZSBmb3IgcHJvamVjdHMgc3VjaCBhczoNCiAg4oCiIFtgZG5zLWxldHNlbmNyeXB0
LXNlY29uZGFyeSddLCBhIHVuaWtlcm5lbCB0aGF0IGFjdHMgYXMgYSBzZWNvbmRhcnkNCiAgICBE
TlMgc2VydmVyIGNhcGFibGUgb2YgcGVyZm9ybWluZyB0aGUgRE5TIGNoYWxsZW5nZSBmb3IgYSBz
cGVjaWZpYw0KICAgIGRvbWFpbiBhbmQgZ2VuZXJhdGluZyB0aGUgY2VydGlmaWNhdGUgYW5kIHBy
aXZhdGUga2V5LiBJdCBnZW5lcmFsbHkNCiAgICB3b3JrcyBpbiB0YW5kZW0gd2l0aCBvdXIgW2Bw
cmltYXJ5LWdpdCddLCBvdXIgcHJpbWFyeSBETlMgc2VydmVyLg0KICDigKIgW2Bjb250cnVubydd
LCBhIHVuaWtlcm5lbCB0aGF0IGFjdHMgYXMgYSBUTFMgcmV2ZXJzZSBwcm94eSBhbmQgaXMNCiAg
ICBjYXBhYmxlIG9mIHBlcmZvcm1pbmcgSFRUUCBjaGFsbGVuZ2VzLiBUaGUgbGF0dGVyIGlzIGN1
cnJlbnRseSBiZWluZw0KICAgIGNvbXBsZXRlbHkgcmV3cml0dGVuIHVzaW5nIFtgbW5ldCddLg0K
DQogIEdvb2QgbHVjayB3aXRoIGRlcGxveWluZyB5b3VyIHdlYnNpdGVzLCBhbmQgaGFwcHkgaGFj
a2luZyEgSGVyZeKAmXMNCiAgaG9waW5nIHRoYXQgYGp3cycgYWxzbyBmaW5kcyBpdHMgcGxhY2Ug
YXMgYSBsaWJyYXJ5IHdpdGhpbiB0aGUgT0NhbWwNCiAgZWNvc3lzdGVtLg0KDQoNCltvY2FtbC1s
ZXRzZW5jcnlwdF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL29jYW1sLWxldHNlbmNy
eXB0Pg0KDQpbandzXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvandzPg0KDQpbanNv
bnRdIDxodHRwczovL2VycmF0aXF1ZS5jaC9sb2dpY2llbC9qc29udD4NCg0KW3lvanNvbl0gPGh0
dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1jb21tdW5pdHkveW9qc29uPg0KDQpbY2hhbGxlbmdlc10g
PGh0dHBzOi8vbGV0c2VuY3J5cHQub3JnL2ZyL2RvY3MvY2hhbGxlbmdlLXR5cGVzLz4NCg0KW1Zp
Zl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL3ZpZj4NCg0KW2BkbnMtbGV0c2VuY3J5
cHQtc2Vjb25kYXJ5J10NCjxodHRwczovL2dpdGh1Yi5jb20vcm9idXItY29vcC9kbnMtbGV0c2Vu
Y3J5cHQtc2Vjb25kYXJ5Lz4NCg0KW2BwcmltYXJ5LWdpdCddIDxodHRwczovL2dpdGh1Yi5jb20v
cm9idXItY29vcC9kbnMtcHJpbWFyeS1naXQ+DQoNCltgY29udHJ1bm8nXSA8aHR0cHM6Ly9naXRo
dWIuY29tL2Rpbm9zYXVyZS9jb250cnVubz4NCg0KW2BtbmV0J10NCjxodHRwczovL2Rpc2N1c3Mu
b2NhbWwub3JnL3QvYW5uLW1uZXQtYS1uZXctdGNwLWlwLXN0YWNrLWZvci11bmlrZXJuZWxzLWlu
LW9jYW1sLzE3ODUxPg0KDQoNCk5ldyByZWxlYXNlIG9mIE9DYW1sIExTUCAxLjI2LjAgYW5kIE1l
cmxpbiA1LjcuMC01MDQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1y
ZWxlYXNlLW9mLW9jYW1sLWxzcC0xLTI2LTAtbWVybGluLTUtNy0wLTUwNC8xNzk3OC8xPg0KDQoN
ClBpemllRHVzdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25lLA0KDQogIFdlIGFyZSBoYXBw
eSB0byBhbm5vdW5jZSB0aGUgZG91YmxlIHJlbGVhc2Ugb2YgW21lcmxpbiA1LjcuMC01MDRdIGFu
ZA0KICBbb2NhbWwtbHNwIDEuMjYuMF0uDQoNCiAgVGhlIG5ldyByZWxlYXNlcyBjb250YWlucyBl
eGNpdGluZyBjaGFuZ2VzIHN1Y2ggYXMgaW1wcm92ZW1lbnRzIHRvDQogIHR5cGUgZW5jbG9zaW5n
IGJlaGF2aW91ciBvbiB2YXJpb3VzIGNsYXNzIGFuZCBvYmplY3QgcmVsYXRlZCBpdGVtcywNCiAg
c2lnbmF0dXJlIGhlbHAgaW1wcm92ZW1lbnRzIGFuZCBzZXZlcmFsIHNldmVyYWwgYnVnIGZpeGVz
Lg0KDQogIFBsZWFzZSBkbyBub3QgaGVzaXRhdGUgb3BlbiBpc3N1ZXMgb24gb3VyIGJ1ZyB0cmFj
a2VycyBpZiB5b3UNCiAgZW5jb3VudGVyIGFueSBwcm9ibGVtczoNCg0KICDigKIgTWVybGluOiBb
QnVnIFRyYWNrZXJdDQogIOKAoiBPQ2FtbCBMU1A6IFtCdWcgVGFja2VyXQ0KDQoNClttZXJsaW4g
NS43LjAtNTA0XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4vcmVsZWFzZXMvdGFn
L3Y1LjcuMC01MDQ+DQoNCltvY2FtbC1sc3AgMS4yNi4wXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9v
Y2FtbC9vY2FtbC1sc3AvcmVsZWFzZXMvdGFnLzEuMjYuMD4NCg0KW0J1ZyBUcmFja2VyXSA8aHR0
cHM6Ly9naXRodWIuY29tL29jYW1sL21lcmxpbi9pc3N1ZXM+DQoNCltCdWcgVGFja2VyXSA8aHR0
cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWxzcC9pc3N1ZXM+DQoNCg0KT0NhbWwgWUFNTCBs
aWJyYXJ5DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXlh
bWwtbGlicmFyeS80Mjk3Lzc+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgTWFydGluIEph
bWJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIDIwMjYgdXBk
YXRlOg0KICDigKIgaW4gRGVjZW1iZXIgMjAyNSwgQGF2c20gY3JlYXRlZCBhIHB1cmUtT0NhbWwg
WUFNTCBsaWJyYXJ5IGluIGp1c3QNCiAgICBvbmUgZGF5IHVzaW5nIGFuIEFJIGFnZW50IGFuZCBb
d3JvdGUgYWJvdXQgaXRdLg0KICDigKIgaW4gQXByaWwgMjAyNiwgSSBkaWQgc29tZXRoaW5nIHNp
bWlsYXIgYW5kIHRvb2sgdGhlIHRpbWUgdG8gbWFrZSBpdA0KICAgIGEgY29tcGxldGUsIHByb2R1
Y3Rpb24tZ3JhZGUgMS4yLzEuMSBZQU1MIGxpYnJhcnkgY2FsbGVkIFlBTUx4IHRoYXQNCiAgICBJ
IFthbm5vdW5jZWQgaGVyZV0uDQoNCg0KW3dyb3RlIGFib3V0IGl0XSA8aHR0cHM6Ly9hbmlsLnJl
Y29pbC5vcmcvbm90ZXMvYW9haC0yMDI1LTY+DQoNClthbm5vdW5jZWQgaGVyZV0NCjxodHRwczov
L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXlhbWx4LXB1cmUtb2NhbWwteWFtbC0xLTItMS0xLWxp
YnJhcnkvMTc5NzA+DQoNCg0KSTE4biA1LjAg4oCUIEludGVybmF0aW9uYWxpc2F0aW9uIG1hZGUg
ZWFzeSBmb3IgYW55IE9DYW1sIGFwcA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8v
ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4taTE4bi01LTAtaW50ZXJuYXRpb25hbGlzYXRpb24tbWFk
ZS1lYXN5LWZvci1hbnktb2NhbWwtYXBwLzE3OTgxLzE+DQoNCg0KVmluY2VudCBCYWxhdCBhbm5v
dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSBPY3NpZ2VuIHRlYW0gaXMgaGFwcHkgdG8gYW5u
b3VuY2UgdGhlIHJlbGVhc2Ugb2YgKm9jc2lnZW4taTE4bg0KICA1LjAqLCBhIHNtYWxsIGJ1dCBw
cmFjdGljYWwgaW50ZXJuYXRpb25hbGlzYXRpb24gbGlicmFyeSBmb3IgT0NhbWwuDQoNCiAgVGhl
IGJpZyBjaGFuZ2UgaW4gdGhpcyByZWxlYXNlOiBvY3NpZ2VuLWkxOG4gaXMgbm8gbG9uZ2VyIHRp
ZWQgdG8NCiAgRWxpb20uIEl0IGNhbiBub3cgYmUgdXNlZCBpbiAqYW55IE9DYW1sIHByb2plY3Qq
LCB3aXRoIG9wdGlvbmFsDQogIGV4dGVuc2lvbnMgZm9yIFR5eG1sIGFuZCBFbGlvbSB3aGVuIHlv
dSBuZWVkIHRoZW0uDQoNCiAgT2NzaWdlbi1pMThuIHdhcyBpbml0aWFsbHkgd3JpdHRlbiBieSBA
c2Fnb3RjaCBmcm9tIEJlIFNwb3J0LiBUaGlzDQogIHJlbGVhc2UgaGFzIGJlZW4gbWFkZSBwb3Nz
aWJsZSB0aGFua3MgdG8gdGhlIHdvcmsgb2YgW0hhYmliXSwgZnVuZGVkDQogIGJ5IFtJUklMTF0u
DQoNCiAgICAgICAgb3BhbSBpbnN0YWxsIG9jc2lnZW4taTE4bg0KDQoNCltIYWJpYl0gPGh0dHBz
Oi8vZ2l0aHViLmNvbS9taGpkPg0KDQpbSVJJTExdIDxodHRwczovL3d3dy5pcmlsbC5vcmc+DQoN
CkhvdyBpdCB3b3Jrcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg
VHJhbnNsYXRpb25zIGFyZSB3cml0dGVuIGluIGEgcGxhaW4gKlRTViBmaWxlKiAob25lIGtleSBw
ZXIgbGluZSwgb25lDQogIGNvbHVtbiBwZXIgbGFuZ3VhZ2UpOg0KDQogIOKUjOKUgOKUgOKUgOKU
gA0KICDilIIgZm9vICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgc2ltcGxlIGtleS4gICAgICAg
IENlY2kgZXN0IHVuZSBjbMOpIHRvdXRlIHNpbXBsZS4NCiAg4pSCIGFfaHVtYW4gICAgICAgICAg
ICAgYSBodW1hbiAgICAgICAgICAgICAgICAgICAgICB1biBodW1haW4NCiAg4pSCIGJhciAgICAg
ICAgICAgICAgICAgSSBhbSB7e3h9fS4gICAgICAgICAgICAgICAgICBKZSBzdWlzIHt7eH19Lg0K
ICDilIIgYmF6ICAgICAgICAgICAgICAgICBUaGVyZSB7e3tjP2FyZXx8aXMgYW59fX0gYXBwbGV7
e3tjP3N8fH19fSBoZXJlISAgSWwgeSBhIHt7e2M/ZGVzfHx1bmV9fX0gcG9tbWV7e3tjP3N8fH19
fSBpY2kgIQ0KICDilIIgYnUgICAgICAgICAgICAgICAgICBJIGFtIHt7eCAlc319ICh7e24gJWR9
fSkuICAgIEplIHN1aXMge3t4ICVzfX0gKHt7biAlZH19KS4NCiAg4pSU4pSA4pSA4pSA4pSADQoN
CiAgVGhlIG1pbmktdGVtcGxhdGluZyBsYW5ndWFnZSBzdXBwb3J0czoNCg0KICDigKIgYHt7eH19
JyBhIHN0cmluZyB2YXJpYWJsZSBgfngnDQogIOKAoiBge3t4ICVkfX0nIGEgdHlwZWQgdmFyaWFi
bGUgdXNpbmcgdGhlIGdpdmVuIGZvcm1hdCBzcGVjaWZpZXINCiAg4oCiIGB7e3tjP3llc3x8bm99
fX0nIGFuIG9wdGlvbmFsIGJvb2xlYW4gYD9jJyBzd2l0Y2hpbmcgYmV0d2VlbiB0d28NCiAgICBz
dHJpbmdzDQoNCiAgVGhlbiBpbiB5b3VyIGNvZGUsIGEgKlBQWCBleHRlbnNpb24qIHR1cm5zIGBb
JWkxOG4ga2V5XScgaW50byB0aGUNCiAgcmlnaHQgY2FsbDoNCg0KICDilIzilIDilIDilIDilIAN
CiAg4pSCIHByaW50X2VuZGxpbmUgWyVpMThuIGZvb107DQogIOKUgiBwcmludF9lbmRsaW5lIFsl
aTE4biBiYXIgfng6WyVpMThuIGFfaHVtYW5dXTsNCiAg4pSCIHByaW50X2VuZGxpbmUgWyVpMThu
IGJheiB+YzoobmIgPiAxKV07DQogIOKUgiBwcmludF9lbmRsaW5lIFslaTE4biBidSB+eDoiSmVh
bi1NaWNoZWwiIH5uOjQyXTsNCiAg4pSCIA0KICDilIIgKCogU3dpdGNoaW5nIGxhbmd1YWdlIGV4
cGxpY2l0bHkgKikNCiAg4pSCIHByaW50X2VuZGxpbmUgWyVpMThuIGZvbyB+bGFuZzpNeV9pMThu
LkZyXTsNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhlIGN1cnJlbnQgbGFuZ3VhZ2UgaXMgaGVs
ZCBpbiBhIG11dGFibGUgcmVmZXJlbmNlIHlvdSBjYW4gc3dhcCAob3INCiAgcmVwbGFjZSB3aXRo
IGFuIEVsaW9tIHNjb3BlZCByZWZlcmVuY2UgaWYgeW91IG5lZWQgcGVyLXNlc3Npb24vdGFiDQog
IGxhbmd1YWdlcykuDQoNCg0KRHVuZSBpbnRlZ3JhdGlvbg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM
4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIHRvb2wgcGx1Z3MgaW50byBEdW5l
IHZlcnkgbmF0dXJhbGx5LiBHZW5lcmF0ZSB0aGUgT0NhbWwgbW9kdWxlDQogIGZyb20geW91ciBU
U1YgZmlsZSB3aXRoIGEgcnVsZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIChydWxlDQog
IOKUgiAgKHRhcmdldCBleGFtcGxlX2kxOG4ubWwpDQogIOKUgiAgKGRlcHMgZXhhbXBsZV9pMThu
LnRzdikNCiAg4pSCICAoYWN0aW9uDQogIOKUgiAgIChydW4gJXtiaW46b2NzaWdlbi1pMThufSAt
LWxhbmd1YWdlcyBlbixmciAtLWlucHV0LWZpbGUgJXtkZXBzfQ0KICDilIIgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgLS1vdXRwdXQtZmlsZSAle3RhcmdldH0pKSkNCiAg4pSU4pSA4pSA4pSA
4pSADQoNCiAgQW5kIHdpcmUgdGhlIFBQWCBpbiB5b3VyIGxpYnJhcnkvZXhlY3V0YWJsZToNCg0K
ICDilIzilIDilIDilIDilIANCiAg4pSCIChwcmVwcm9jZXNzIChwcHMgb2NzaWdlbi1pMThuIC0t
IC0tZGVmYXVsdC1tb2R1bGUgRXhhbXBsZV9pMThuKSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg
VGhhdOKAmXMgYWxsIHlvdSBuZWVkIGZvciBhIHBsYWluIE9DYW1sIHByb2plY3QuDQoNCg0KVHl4
bWwgc3VwcG9ydA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg
UGFzcyBgLS10eXhtbCcgdG8gdGhlIGdlbmVyYXRvciBhbmQgdGhlIHNhbWUgYFslaTE4biBrZXld
JyBleHByZXNzaW9uDQogIG5vdyBwcm9kdWNlcyBhICpsaXN0IG9mIFR5eG1sIEhUTUwgZWxlbWVu
dHMqIGluc3RlYWQgb2YgYSBzdHJpbmc6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAoKiBC
dWlsZHMgYW4gSFRNTCBmcmFnbWVudCwgcmVhZHkgdG8gZHJvcCBpbnRvIGEgVHl4bWwgdHJlZSAq
KQ0KICDilIIgbGV0IGdyZWV0aW5nID0gWyVpMThuIGJhciB+eDpbJWkxOG4gYV9odW1hbl1dDQog
IOKUlOKUgOKUgOKUgOKUgA0KDQogIFZhcmlhYmxlcyBjYW4gdGhlbXNlbHZlcyBiZSBsaXN0cyBv
ZiBIVE1MIG5vZGVzLCBzbyB5b3UgY2FuIG1peA0KICB0cmFuc2xhdGVkIHRleHQgd2l0aCBtYXJr
dXAgbmF0dXJhbGx5Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgWyVpMThuIGJhciB+eDpb
IHR4dCAiSmVhbi1NaWNoZWwgKCINCiAg4pSCICAgICAgICAgICAgICAgOyB0eHQgKHN0cmluZ19v
Zl9pbnQgaWQpDQogIOKUgiAgICAgICAgICAgICAgIDsgdHh0ICIpIiBdXQ0KICDilJTilIDilIDi
lIDilIANCg0KICBJZiB5b3UgbmVlZCBhIHBsYWluIHN0cmluZyBpbiBUeXhtbCBtb2RlIChmb3Ig
YW4gYXR0cmlidXRlLCBmb3INCiAgaW5zdGFuY2UpLCBqdXN0IHByZWZpeCB3aXRoIGBTLic6DQoN
CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBbJWkxOG4gUy5iYXIgfng6WyVpMThuIFMuYV9odW1h
bl1dICAgKCogc3RyaW5nIG91dHB1dCAqKQ0KICDilJTilIDilIDilIDilIANCg0KDQpFbGlvbSBz
dXBwb3J0DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBGb3Ig
Y2xpZW504oCTc2VydmVyIEVsaW9tIGFwcHMsIHBhc3MgYC0tZWxpb20nLiBUaGUgZ2VuZXJhdG9y
IGVtaXRzIGFuDQogIGAuZWxpb20nIGZpbGUgKHNvIHRoZSBzYW1lIHRyYW5zbGF0aW9ucyBhcmUg
YXZhaWxhYmxlIG9uIGJvdGggc2lkZXMpLA0KICBpbXBsaWVzIGAtLXR5eG1sJywgYW5kIGFkZHMg
YFtAQGRlcml2aW5nIGpzb25dJyBvbiB0aGUgbGFuZ3VhZ2UgdHlwZQ0KICBzbyB5b3UgY2FuIHNl
cmlhbGlzZSBpdCBhY3Jvc3MgdGhlIHdpcmU6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAo
cnVsZQ0KICDilIIgICh0YXJnZXQgZXhhbXBsZV9pMThuLmVsaW9tKQ0KICDilIIgIChkZXBzIGV4
YW1wbGVfaTE4bi50c3YpDQogIOKUgiAgKGFjdGlvbg0KICDilIIgICAocnVuICV7YmluOm9jc2ln
ZW4taTE4bn0gLS1lbGlvbSAtLWxhbmd1YWdlcyBlbixmciAtLWlucHV0LWZpbGUgJXtkZXBzfQ0K
ICDilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1vdXRwdXQtZmlsZSAle3RhcmdldH0p
KSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KTXVsdGlwbGUgVFNWIGZpbGVzDQrilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBZb3UgY2Fu
IHNwbGl0IHRyYW5zbGF0aW9ucyBhY3Jvc3Mgc2V2ZXJhbCBmaWxlcy4gVGhlIFBQWCB1c2VzIHlv
dXINCiAgbW9kdWxlIHBhdGggdG8gZmluZCB0aGUgcmlnaHQgb25lOg0KDQogIOKUjOKUgOKUgOKU
gOKUgA0KICDilIIgWyVpMThuIGZvb10gICAgICAgICAgICAgICAgICAgICAgICAgICgqIGRlZmF1
bHQgbW9kdWxlICopDQogIOKUgiBbJWkxOG4gTXlJMThuLmZvb10gICAgICAgICAgICAgICAgICAg
KCogTXlJMThuLmZvbyAqKQ0KICDilIIgWyVpMThuIE15STE4bi5TLmJhciB+eDpbJWkxOG4gUy5m
b29dXQ0KICDilJTilIDilIDilIDilIANCg0KICBPcHRpb25hbCBgLS1wcmVmaXgnIC8gYC0tc3Vm
Zml4JyBmbGFncyBsZXQgeW91IGtlZXAgY2FsbC1zaXRlcyBjb25jaXNlDQogIChgWyVpMThuIEZl
YXR1cmUuZm9vXScg4oaSIGBQcl9GZWF0dXJlX2kxOG4uZm9vICgpJykuDQoNCiAg4oCUDQoNCiAg
4oCiIFNvdXJjZXM6IDxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi9vY3NpZ2VuLWkxOG4+DQog
IOKAoiBEb2N1bWVudGF0aW9uOiBSRUFETUUgb24gdGhlIHJlcG8NCiAg4oCiIEJ1ZyByZXBvcnRz
OiA8aHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vb2NzaWdlbi1pMThuL2lzc3Vlcz4NCg0KICBI
YXBweSB0cmFuc2xhdGluZyENCg0KDQpBVEQgNC4xLjAgLSBub3cgd2l0aCBZQU1MIHN1cHBvcnQN
CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6
DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWF0ZC00LTEtMC1ub3ctd2l0aC15
YW1sLXN1cHBvcnQvMTc5ODIvMT4NCg0KDQpNYXJ0aW4gSmFtYm9uIGFubm91bmNlZA0K4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSADQoNCiAgW0FURF0gbm93IGhhcyBPQ2FtbCBzdXBwb3J0IGZvciBjb252ZW5pZW50bHkg
cmVhZGluZyBkYXRhIGZyb20gWUFNTA0KICBmaWxlcyBhcyB3ZWxsIGFzIGZyb20gb3RoZXIgZm9y
bWF0cyB3aXRoIG1pbmltYWwgZWZmb3J0LiBJdCBtZWFuczoNCg0KICAxLiBZb3UgZGVmaW5lIGEg
W3R5cGUgZm9yIHlvdXIgY29uZmlnIGRhdGFdLg0KICAyLiBgYXRkbWwgLS1tb2RlIGpzb25saWtl
IGFwcF9jb25maWcuYXRkJyBnZW5lcmF0ZXMgdGhlIE9DYW1sIGNvZGUNCiAgICAgdGhhdCBjb252
ZXJ0cyBhIEpTT04tbGlrZSBBU1QgY29udGFpbmluZyBzb3VyY2UgbG9jYXRpb25zIGludG8geW91
cg0KICAgICBjb25maWcgZGF0YSBzdHJ1Y3R1cmUuDQogIDMuIFtZb3VyIHByb2dyYW1dIGxvYWRz
IGEgWUFNTCBmaWxlLCBjb252ZXJ0cyBpdCB0byBhIEpTT04tbGlrZSB0cmVlLA0KICAgICBhbmQg
dGhlbiBjYWxscyB0aGUgZ2VuZXJhdGVkIGZ1bmN0aW9uIHRvIHRyYW5zbGF0ZSBpdCBpbnRvIGFu
DQogICAgIE9DYW1sIGRhdGEgc3RydWN0dXJlLg0KICA0LiBZb3VyIGFwcGxpY2F0aW9uIHByaW50
cyB1c2VmdWwgZXJyb3IgbWVzc2FnZXMgaWYgdGhlIGNvbmZpZyBpcw0KICAgICBtYWxmb3JtZWQg
b3IgaW5jb21wbGV0ZS4NCg0KICBBbiBbZXhhbXBsZV0gaXMgaW5jbHVkZWQgaW4gdGhlIGRpc3Ry
aWJ1dGlvbi4gSXQgdXNlcyB0aGUgW3JlY2VudGx5DQogIHJlbGVhc2VkIFlBTUx4IGxpYnJhcnld
Lg0KDQogIF9Ob3RlIHRoYXQgWUFNTHggbmVlZHMgZ2VuZXJvdXMgc3BvbnNvcnMgdG8gZnVuZCB0
aGUgd29yayB0aGF0IHdhcw0KICBkb25lIGFuZCBbdW5sb2NrIGEgcGVybWlzc2l2ZSBJU0MgbGlj
ZW5zZV0gZm9yIGV2ZXJ5b25lLiBPciB5b3UgY2FuDQogIGFjY2VwdCB0aGUgdGVybXMgb2YgdGhl
IFtBR1BMIGxpY2Vuc2VdIGlmIHlvdSdyZSBoYXBweSB0byBzaGFyZSB5b3VyDQogIGFwcGxpY2F0
aW9uJ3Mgc291cmNlIGNvZGUgd2l0aCB0aGUgdXNlcnMuXw0KDQogIE90aGVyIGlucHV0IGZpbGUg
Zm9ybWF0cyBvciBvdGhlciBZQU1MIGxpYnJhcmllcyBjYW4gYmUgdXNlZCBzaW1pbGFybHkNCiAg
d2l0aCBtaW5pbXVtIGVmZm9ydCBhcyBsb25nIGFzIHNvdXJjZSBsb2NhdGlvbnMgYXJlIGF2YWls
YWJsZS4gRm9yDQogIHRoaXMsIHlvdSdsbCBuZWVkIFthIGJyaWRnZV0gdGhhdCBjb252ZXJ0cyB5
b3VyIEFTVCBpbnRvIHRoZQ0KICBbSlNPTi1saWtlIEFTVF0uDQoNCg0KW0FURF0gPGh0dHBzOi8v
Z2l0aHViLmNvbS9haHJlZnMvYXRkPg0KDQpbdHlwZSBmb3IgeW91ciBjb25maWcgZGF0YV0NCjxo
dHRwczovL2dpdGh1Yi5jb20vYWhyZWZzL2F0ZC9ibG9iL21hc3Rlci9hdGQteWFtbHgvZXhhbXBs
ZXMvYXBwX2NvbmZpZy5hdGQ+DQoNCltZb3VyIHByb2dyYW1dDQo8aHR0cHM6Ly9naXRodWIuY29t
L2FocmVmcy9hdGQvYmxvYi9tYXN0ZXIvYXRkLXlhbWx4L2V4YW1wbGVzL21haW4ubWw+DQoNCltl
eGFtcGxlXSA8aHR0cHM6Ly9naXRodWIuY29tL2FocmVmcy9hdGQvYmxvYi9tYXN0ZXIvYXRkLXlh
bWx4L2V4YW1wbGVzPg0KDQpbcmVjZW50bHkgcmVsZWFzZWQgWUFNTHggbGlicmFyeV0NCjxodHRw
czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXlhbWx4LXB1cmUtb2NhbWwteWFtbC0xLTItMS0x
LWxpYnJhcnkvMTc5NzA+DQoNClt1bmxvY2sgYSBwZXJtaXNzaXZlIElTQyBsaWNlbnNlXQ0KPGh0
dHBzOi8vZ2l0aHViLmNvbS9tamFtYm9uL3lhbWx4L2Jsb2IvbWFpbi9GVU5ESU5HLm1kPg0KDQpb
QUdQTCBsaWNlbnNlXQ0KPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dOVV9BZmZlcm9f
R2VuZXJhbF9QdWJsaWNfTGljZW5zZT4NCg0KW2EgYnJpZGdlXQ0KPGh0dHBzOi8vZ2l0aHViLmNv
bS9haHJlZnMvYXRkL2Jsb2IvbWFzdGVyL2F0ZC15YW1seC9zcmMvQXRkX3lhbWx4Lm1sPg0KDQpb
SlNPTi1saWtlIEFTVF0NCjxodHRwczovL2dpdGh1Yi5jb20vYWhyZWZzL2F0ZC9ibG9iL21hc3Rl
ci9hdGQtanNvbmxpa2Uvc3JjL0FTVC5tbGk+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1l
IGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29r
IGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0K
DQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlv
dSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0
XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2hu
aXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv
Y3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVw
b21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlh
LmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFu
LnBldGl0ZXBvbW1lLm5ldC8+DQoNCg==
--==-=-=
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-04-14 Tue 11:49 -->
<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 }
.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.04.07.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.04.21.html">Next Week</a>
</p>
<p>
Hello
</p>
<p>
Here is the latest OCaml Weekly News, for the week of April 07 to 14, 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">Call for presentations: Caml in the Capital II</a></li>
<li><a href=3D"#2">List your open OCaml positions on the OCaml.org job boar=
d</a></li>
<li><a href=3D"#3">YAMLx: pure-OCaml YAML 1.2/1.1 library</a></li>
<li><a href=3D"#4">ocaml-letsencrypt, an OCaml way to get TLS certificates<=
/a></li>
<li><a href=3D"#5">New release of OCaml LSP 1.26.0 and Merlin 5.7.0-504</a>=
</li>
<li><a href=3D"#6">OCaml YAML library</a></li>
<li><a href=3D"#7">I18n 5.0 =E2=80=94 Internationalisation made easy for an=
y OCaml app</a></li>
<li><a href=3D"#8">ATD 4.1.0 - now with YAML support</a></li>
<li><a href=3D"#orgbb18b0e">Old CWN</a></li>
</ul>
</div>
</div>
<div id=3D"outline-container-1" class=3D"outline-2">
<h2 id=3D"1">Call for presentations: Caml in the Capital II</h2>
<div class=3D"outline-text-2" id=3D"text-1">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/call-for-presentations-caml=
-in-the-capital-ii/17959/1">https://discuss.ocaml.org/t/call-for-presentati=
ons-caml-in-the-capital-ii/17959/1</a>
</p>
</div>
<div id=3D"outline-container-org2e2b112" class=3D"outline-3">
<h3 id=3D"org2e2b112">Sacha Ayoun announced</h3>
<div class=3D"outline-text-3" id=3D"text-org2e2b112">
<p>
Hi everyone :waving_hand:
</p>
<p>
Following the success of the last event, we're organising a second edition =
of Caml In the Capital (happening in London). From talking to the attendees=
at the first event, we will be doing shorter talks and more socialising =
=F0=9F=8D=95
</p>
<p>
So far, we are aiming for <b>May 14th</b>, to be confirmed once we have sec=
ured a venue. Please let us know if this is clashing with another big event=
off our radar.
</p>
<p>
Once we confirm the date and presentations, we'll post here and on the dedi=
cated <a href=3D"https://ocaml.zulipchat.com/#narrow/channel/553375-Caml-In=
-The-Capital">Zulip channel</a> as well as <a href=3D"https://caml-in-the-c=
apital.github.io">our website</a>.
</p>
</div>
<div id=3D"outline-container-org5408036" class=3D"outline-4">
<h4 id=3D"org5408036">Call for presentations</h4>
<div class=3D"outline-text-4" id=3D"text-org5408036">
<p>
We're looking for talks that are of interest to the entire OCaml community.
Topics includes (but are not limited to):
</p>
<ul class=3D"org-ul">
<li>OCaml tooling (build systems, package management, lsp, documentation&he=
llip;)</li>
<li>The cool library you're working on</li>
<li>Your OCaml-related research (as long as you make it accessible for peop=
le outside your field)</li>
<li>Some piece of the OCaml ecosystem that you'd like people to hear about =
(ocaml.org, the OCaml Software Foundation, …)</li>
<li>Your industrial use of OCaml</li>
<li>etc.</li>
</ul>
<p>
If you=E2=80=99d like to give a talk, please message me or @Alistair direct=
ly with a title and short abstract.
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-2" class=3D"outline-2">
<h2 id=3D"2">List your open OCaml positions on the OCaml.org job board</h2>
<div class=3D"outline-text-2" id=3D"text-2">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/list-your-open-ocaml-positi=
ons-on-the-ocaml-org-job-board/11377/21">https://discuss.ocaml.org/t/list-y=
our-open-ocaml-positions-on-the-ocaml-org-job-board/11377/21</a>
</p>
</div>
<div id=3D"outline-container-orgf0f15f7" class=3D"outline-3">
<h3 id=3D"orgf0f15f7">Continuing this thread, VikasK announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgf0f15f7">
<p>
I would like to post this job that we are hiring for.
</p>
<ul class=3D"org-ul">
<li>title: Lead Systems Software Engineer</li>
<li>link: <a href=3D"https://careers.cloud.com/jobs/lead-systems-software-e=
ngineer-remote-united-kingdom">https://careers.cloud.com/jobs/lead-systems-=
software-engineer-remote-united-kingdom</a></li>
<li>locations:
<ul class=3D"org-ul">
<li>Remote</li>
<li>United-Kingdom</li>
</ul></li>
<li>publication_date: 2026-04-08</li>
<li>company: Cloud Software Group</li>
<li>company_logo: <img src=3D"https://www.cloud.com/media_1e40e7d048f0117d4=
543c940f9e7433b549c08a03.svg" alt=3D"media_1e40e7d048f0117d4543c940f9e7433b=
549c08a03.svg" class=3D"org-svg" /></li>
</ul>
</div>
</div>
</div>
<div id=3D"outline-container-3" class=3D"outline-2">
<h2 id=3D"3">YAMLx: pure-OCaml YAML 1.2/1.1 library</h2>
<div class=3D"outline-text-2" id=3D"text-3">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-yamlx-pure-ocaml-yaml-1=
-2-1-1-library/17970/1">https://discuss.ocaml.org/t/ann-yamlx-pure-ocaml-ya=
ml-1-2-1-1-library/17970/1</a>
</p>
</div>
<div id=3D"outline-container-org86b1c4a" class=3D"outline-3">
<h3 id=3D"org86b1c4a">Martin Jambon announced</h3>
<div class=3D"outline-text-3" id=3D"text-org86b1c4a">
<p>
Hello,
</p>
<p>
I'm excited to announce the availability of <a href=3D"https://github.com/m=
jambon/yamlx">YAMLx</a>, a complete implementation of the YAML 1.2 and 1.1 =
standards. It is intended to support most uses of YAML including its use as=
a configuration file format in new applications and analyzing YAML files o=
f other applications.
</p>
<p>
For a fuller description, check out the <a href=3D"https://github.com/mjamb=
on/yamlx/releases/tag/0.1.0">release notes</a>.
</p>
<p>
Get started with <code>opam install yamlx</code>. Then use the <code>yamlx<=
/code> companion command to check that it parses and interprets your favori=
te YAML files correctly.
</p>
<p>
Here's an example showing the use of the library to convert YAML to JSON:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #8f6f4a; font-styl=
e: italic;">(* </span><span style=3D"color: #8f6f4a; font-style: italic;">R=
ead YAML from stdin with YAMLx, print JSON to stdout with Yojson
This is a demo showing how to use the YAMLx library with the default
settings. 'YAMLx.Values.one_of_yaml_exn' offers options to restrict
the input language or to force the interpretation as YAML 1.1 instead of
YAML 1.2.
Compile with:
ocamlfind opt -o yaml-to-json \
-package yamlx,yojson -linkpkg yaml_to_json.ml
</span><span style=3D"color: #8f6f4a; font-style: italic;">*)</span>
<span style=3D"color: #242521; font-weight: bold;">open </span><span style=
=3D"color: #557400; font-weight: bold;">Printf</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #242521; font-weight: bold;">rec</span> <span style=3D"color: #a=
7601f;">yojson_of_yamlx</span> (<span style=3D"color: #007a9f;">x</span> :<=
span style=3D"color: #444fcf; font-weight: bold;"> YAMLx.value</span>) :<sp=
an style=3D"color: #444fcf; font-weight: bold;"> </span><span style=3D"colo=
r: #557400; font-weight: bold;">Yojson.Safe.</span><span style=3D"color: #4=
44fcf; font-weight: bold;">t </span>=3D
<span style=3D"color: #006f00; font-weight: bold;">match</span> x <span s=
tyle=3D"color: #006f00; font-weight: bold;">with</span>
| <span style=3D"color: #242521;">Null</span> _ -> <span style=3D"colo=
r: #242521;">`Null</span>
| <span style=3D"color: #242521;">Bool</span> (_, x) -> <span style=3D=
"color: #242521;">`Bool</span> x
| <span style=3D"color: #242521;">Int</span> (_, x) -> <span style=3D"=
color: #242521;">`Intlit</span> (<span style=3D"color: #557400; font-weight=
: bold;">Int64.</span>to_string x)
| <span style=3D"color: #242521;">Float</span> (_, x) -> <span style=
=3D"color: #242521;">`Float</span> x
| <span style=3D"color: #242521;">String</span> (_, x) -> <span style=
=3D"color: #242521;">`String</span> x
| <span style=3D"color: #242521;">Seq</span> (_, xs) -> <span style=3D=
"color: #242521;">`List</span> (<span style=3D"color: #557400; font-weight:=
bold;">List.</span>map yojson_of_yamlx xs)
| <span style=3D"color: #242521;">Map</span> (_, xs) ->
<span style=3D"color: #242521;">`Assoc</span> (<span style=3D"color: =
#557400; font-weight: bold;">List.</span>map (<span style=3D"color: #006f00=
; font-weight: bold;">fun</span> (<span style=3D"color: #007a9f;">loc</span=
>, <span style=3D"color: #007a9f;">k</span>, <span style=3D"color: #007a9f;=
">v</span>) ->
<span style=3D"color: #006f00; font-weight: bold;">match</span> (k =
: <span style=3D"color: #444fcf; font-weight: bold;">YAMLx.value</span>) <s=
pan style=3D"color: #006f00; font-weight: bold;">with</span>
| <span style=3D"color: #242521;">String</span> (_, k) -> (k, yo=
json_of_yamlx v)
| _ ->
ksprintf <span style=3D"color: #557400; font-weight: bold;">fai=
lwith</span> <span style=3D"color: #ca3400;">"%s: only string keys are supp=
orted"</span>
(<span style=3D"color: #557400; font-weight: bold;">YAMLx.</s=
pan>default_format_loc loc)
) xs)
<span style=3D"color: #242521; font-weight: bold;">let</span> () =3D
<span style=3D"color: #557400; font-weight: bold;">YAMLx.</span>register_=
exception_printers ();
stdin
<span style=3D"color: #9f0d0f;">|></span> <span style=3D"color: #55740=
0; font-weight: bold;">In_channel.</span>input_all
<span style=3D"color: #9f0d0f;">|></span> <span style=3D"color: #55740=
0; font-weight: bold;">YAMLx.Values.</span>one_of_yaml_exn
<span style=3D"color: #9f0d0f;">|></span> yojson_of_yamlx
<span style=3D"color: #9f0d0f;">|></span> <span style=3D"color: #55740=
0; font-weight: bold;">Yojson.Safe.</span>pretty_to_channel stdout
<span style=3D"color: #9f0d0f;">|></span> print_newline
</code></pre>
</div>
</div>
<div id=3D"outline-container-orgc530f86" class=3D"outline-4">
<h4 id=3D"orgc530f86">Funding</h4>
<div class=3D"outline-text-4" id=3D"text-orgc530f86">
<p>
YAMLx is currently released under the <b>AGPL</b>. There is an ongoing fund=
raiser: once a funding goal is reached, the license will switch to the perm=
issive <b>ISC</b> license for everyone. Donors above a certain threshold re=
ceive an immediate <b>commercial license</b>. See <a href=3D"https://github=
.com/sponsors/mjambon">my GitHub Sponsors profile</a> for details.
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-4" class=3D"outline-2">
<h2 id=3D"4">ocaml-letsencrypt, an OCaml way to get TLS certificates</h2>
<div class=3D"outline-text-2" id=3D"text-4">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-ocaml-letsencrypt-an-oc=
aml-way-to-get-tls-certificates/17975/1">https://discuss.ocaml.org/t/ann-oc=
aml-letsencrypt-an-ocaml-way-to-get-tls-certificates/17975/1</a>
</p>
</div>
<div id=3D"outline-container-orgf5aa4a9" class=3D"outline-3">
<h3 id=3D"orgf5aa4a9">Calascibetta Romain announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgf5aa4a9">
<p>
I am delighted to announce the release of <a href=3D"https://github.com/rob=
ur-coop/ocaml-letsencrypt">ocaml-letsencrypt</a> (version 2.1.0). This vers=
ion introduces a new API that allows it to operate independently of a sched=
uler and an HTTP client. It is also a rewrite using our brand-new <a href=
=3D"https://github.com/robur-coop/jws">jws</a> library, which now utilises =
the <a href=3D"https://erratique.ch/logiciel/jsont">jsont</a> library (rath=
er than <a href=3D"https://github.com/ocaml-community/yojson">yojson</a>).
</p>
<p>
<code>ocaml-letsencrypt</code> implements <a href=3D"https://letsencrypt.or=
g/fr/docs/challenge-types/">challenges</a> needed to obtain a certificate v=
ia the three ways: DNS, HTTP and ACME-TLS. It therefore enables a website d=
eployment strategy (implemented with <a href=3D"https://github.com/robur-co=
op/vif">Vif</a>, for example) to be provided entirely in OCaml.
</p>
<p>
We use it within our cooperative for projects such as:
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/robur-coop/dns-letsencrypt-secondary/"><c=
ode>dns-letsencrypt-secondary</code></a>, a unikernel that acts as a second=
ary DNS server capable of performing the DNS challenge for a specific domai=
n and generating the certificate and private key. It generally works in tan=
dem with our <a href=3D"https://github.com/robur-coop/dns-primary-git"><cod=
e>primary-git</code></a>, our primary DNS server.</li>
<li><a href=3D"https://github.com/dinosaure/contruno"><code>contruno</code>=
</a>, a unikernel that acts as a TLS reverse proxy and is capable of perfor=
ming HTTP challenges. The latter is currently being completely rewritten us=
ing <a href=3D"https://discuss.ocaml.org/t/ann-mnet-a-new-tcp-ip-stack-for-=
unikernels-in-ocaml/17851"><code>mnet</code></a>.</li>
</ul>
<p>
Good luck with deploying your websites, and happy hacking! Here=E2=80=99s h=
oping that <code>jws</code> also finds its place as a library within the OC=
aml ecosystem.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-5" class=3D"outline-2">
<h2 id=3D"5">New release of OCaml LSP 1.26.0 and Merlin 5.7.0-504</h2>
<div class=3D"outline-text-2" id=3D"text-5">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-new-release-of-ocaml-ls=
p-1-26-0-merlin-5-7-0-504/17978/1">https://discuss.ocaml.org/t/ann-new-rele=
ase-of-ocaml-lsp-1-26-0-merlin-5-7-0-504/17978/1</a>
</p>
</div>
<div id=3D"outline-container-org23d6110" class=3D"outline-3">
<h3 id=3D"org23d6110">PizieDust announced</h3>
<div class=3D"outline-text-3" id=3D"text-org23d6110">
<p>
Hi everyone,
</p>
<p>
We are happy to announce the double release of <a href=3D"https://github.co=
m/ocaml/merlin/releases/tag/v5.7.0-504">merlin 5.7.0-504</a> and <a href=3D=
"https://github.com/ocaml/ocaml-lsp/releases/tag/1.26.0">ocaml-lsp 1.26.0</=
a>.
</p>
<p>
The new releases contains exciting changes such as improvements to type enc=
losing behaviour on various class and object related items, signature help=
improvements and several several bug fixes.
</p>
<p>
Please do not hesitate open issues on our bug trackers if you encounter any=
problems:
</p>
<ul class=3D"org-ul">
<li>Merlin: <a href=3D"https://github.com/ocaml/merlin/issues">Bug Tracker<=
/a></li>
<li>OCaml LSP: <a href=3D"https://github.com/ocaml/ocaml-lsp/issues">Bug Ta=
cker</a></li>
</ul>
</div>
</div>
</div>
<div id=3D"outline-container-6" class=3D"outline-2">
<h2 id=3D"6">OCaml YAML library</h2>
<div class=3D"outline-text-2" id=3D"text-6">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ocaml-yaml-library/4297/7">=
https://discuss.ocaml.org/t/ocaml-yaml-library/4297/7</a>
</p>
</div>
<div id=3D"outline-container-org09c7fe3" class=3D"outline-3">
<h3 id=3D"org09c7fe3">Continuing this thread, Martin Jambon announced</h3>
<div class=3D"outline-text-3" id=3D"text-org09c7fe3">
<p>
2026 update:=20
</p>
<ul class=3D"org-ul">
<li>in December 2025, @avsm created a pure-OCaml YAML library in just one d=
ay using an AI agent and <a href=3D"https://anil.recoil.org/notes/aoah-2025=
-6">wrote about it</a>.</li>
<li>in April 2026, I did something similar and took the time to make it a c=
omplete, production-grade 1.2/1.1 YAML library called YAMLx that I <a href=
=3D"https://discuss.ocaml.org/t/ann-yamlx-pure-ocaml-yaml-1-2-1-1-library/1=
7970">announced here</a>.</li>
</ul>
</div>
</div>
</div>
<div id=3D"outline-container-7" class=3D"outline-2">
<h2 id=3D"7">I18n 5.0 =E2=80=94 Internationalisation made easy for any OCam=
l app</h2>
<div class=3D"outline-text-2" id=3D"text-7">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-i18n-5-0-internationali=
sation-made-easy-for-any-ocaml-app/17981/1">https://discuss.ocaml.org/t/ann=
-i18n-5-0-internationalisation-made-easy-for-any-ocaml-app/17981/1</a>
</p>
</div>
<div id=3D"outline-container-org771dc5c" class=3D"outline-3">
<h3 id=3D"org771dc5c">Vincent Balat announced</h3>
<div class=3D"outline-text-3" id=3D"text-org771dc5c">
<p>
The Ocsigen team is happy to announce the release of <b>ocsigen-i18n 5.0</b=
>, a small but practical internationalisation library for OCaml.
</p>
<p>
The big change in this release: ocsigen-i18n is no longer tied to Eliom. It=
can now be used in <b>any OCaml project</b>, with optional extensions for =
Tyxml and Eliom when you need them.
</p>
<p>
Ocsigen-i18n was initially written by @sagotch from Be Sport. This release =
has been made possible thanks to the work of <a href=3D"https://github.com/=
mhjd">Habib</a>, funded by <a href=3D"https://www.irill.org">IRILL</a>.
</p>
<blockquote>
<p>
opam install ocsigen-i18n
</p>
</blockquote>
</div>
<div id=3D"outline-container-org00d29c8" class=3D"outline-4">
<h4 id=3D"org00d29c8">How it works</h4>
<div class=3D"outline-text-4" id=3D"text-org00d29c8">
<p>
Translations are written in a plain <b>TSV file</b> (one key per line, one =
column per language):
</p>
<pre class=3D"example" id=3D"org9e7cb82">
foo This is a simple key. Ceci est une cl=C3=A9 tout=
e simple.
a_human a human un humain
bar I am {{x}}. Je suis {{x}}.
baz There {{{c?are||is an}}} apple{{{c?s||}}} here! Il y a=
{{{c?des||une}}} pomme{{{c?s||}}} ici !
bu I am {{x %s}} ({{n %d}}). Je suis {{x %s}} ({{n %d}}=
).
</pre>
<p>
The mini-templating language supports:
</p>
<ul class=3D"org-ul">
<li><code>{{x}}</code> a string variable <code>~x</code></li>
<li><code>{{x %d}}</code> a typed variable using the given format specifier=
</li>
<li><code>{{{c?yes||no}}}</code> an optional boolean <code>?c</code> switch=
ing between two strings</li>
</ul>
<p>
Then in your code, a <b>PPX extension</b> turns <code>[%i18n key]</code> in=
to the right call:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code>print_endline <span style=3D"color: #a76=
01f; background-color: #ebebeb;">[%i18n</span> foo<span style=3D"color: #a7=
601f; background-color: #ebebeb;">]</span>;
print_endline <span style=3D"color: #a7601f; background-color: #ebebeb;">[%=
i18n</span> bar <span style=3D"color: #444fcf; font-weight: bold;">~x</span=
>:[<span style=3D"color: #9f0d0f;">%</span>i18n a_human]<span style=3D"colo=
r: #a7601f; background-color: #ebebeb;">]</span>;
print_endline <span style=3D"color: #a7601f; background-color: #ebebeb;">[%=
i18n</span> baz <span style=3D"color: #444fcf; font-weight: bold;">~c</span=
>:(nb > 1)<span style=3D"color: #a7601f; background-color: #ebebeb;">]</=
span>;
print_endline <span style=3D"color: #a7601f; background-color: #ebebeb;">[%=
i18n</span> bu <span style=3D"color: #444fcf; font-weight: bold;">~x</span>=
:<span style=3D"color: #ca3400;">"Jean-Michel"</span> <span style=3D"color:=
#444fcf; font-weight: bold;">~n</span>:42<span style=3D"color: #a7601f; ba=
ckground-color: #ebebeb;">]</span>;
<span style=3D"color: #8f6f4a; font-style: italic;">(* </span><span style=
=3D"color: #8f6f4a; font-style: italic;">Switching language explicitly</spa=
n><span style=3D"color: #8f6f4a; font-style: italic;"> *)</span>
print_endline <span style=3D"color: #a7601f; background-color: #ebebeb;">[%=
i18n</span> foo <span style=3D"color: #444fcf; font-weight: bold;">~lang</s=
pan>:<span style=3D"color: #557400; font-weight: bold;">My_i18n.</span><spa=
n style=3D"color: #242521;">Fr</span><span style=3D"color: #a7601f; backgro=
und-color: #ebebeb;">]</span>;
</code></pre>
</div>
<p>
The current language is held in a mutable reference you can swap (or replac=
e with an Eliom scoped reference if you need per-session/tab languages).
</p>
</div>
</div>
<div id=3D"outline-container-org72492cb" class=3D"outline-4">
<h4 id=3D"org72492cb">Dune integration</h4>
<div class=3D"outline-text-4" id=3D"text-org72492cb">
<p>
The tool plugs into Dune very naturally. Generate the OCaml module from you=
r TSV file with a rule:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-lisp"><code>(rule
(target example_i18n.ml)
(deps example_i18n.tsv)
(action
(run %{bin:ocsigen-i18n} --languages en,fr --input-file %{deps}
--output-file %{target})))
</code></pre>
</div>
<p>
And wire the PPX in your library/executable:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-lisp"><code>(preprocess (pps ocsigen-i18n -- --defaul=
t-module Example_i18n))
</code></pre>
</div>
<p>
That=E2=80=99s all you need for a plain OCaml project.
</p>
</div>
</div>
<div id=3D"outline-container-orgd92bc98" class=3D"outline-4">
<h4 id=3D"orgd92bc98">Tyxml support</h4>
<div class=3D"outline-text-4" id=3D"text-orgd92bc98">
<p>
Pass <code>--tyxml</code> to the generator and the same <code>[%i18n key]</=
code> expression now produces a <b>list of Tyxml HTML elements</b> instead =
of a string:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #8f6f4a; font-styl=
e: italic;">(* </span><span style=3D"color: #8f6f4a; font-style: italic;">B=
uilds an HTML fragment, ready to drop into a Tyxml tree</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;">greeting</span> =3D <span style=3D"color: #a7601f; bac=
kground-color: #ebebeb;">[%i18n</span> bar <span style=3D"color: #444fcf; f=
ont-weight: bold;">~x</span>:[<span style=3D"color: #9f0d0f;">%</span>i18n =
a_human]<span style=3D"color: #a7601f; background-color: #ebebeb;">]</span>
</code></pre>
</div>
<p>
Variables can themselves be lists of HTML nodes, so you can mix translated =
text with markup naturally:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #a7601f; backgroun=
d-color: #ebebeb;">[%i18n</span> bar <span style=3D"color: #444fcf; font-we=
ight: bold;">~x</span>:[ txt <span style=3D"color: #ca3400;">"Jean-Michel (=
"</span>
; txt (string_of_int id)
; txt <span style=3D"color: #ca3400;">")"</span> ]<span style=
=3D"color: #a7601f; background-color: #ebebeb;">]</span>
</code></pre>
</div>
<p>
If you need a plain string in Tyxml mode (for an attribute, for instance), =
just prefix with <code>S.</code>:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #a7601f; backgroun=
d-color: #ebebeb;">[%i18n</span> <span style=3D"color: #557400; font-weight=
: bold;">S.</span>bar <span style=3D"color: #444fcf; font-weight: bold;">~x=
</span>:[<span style=3D"color: #9f0d0f;">%</span>i18n <span style=3D"color:=
#557400; font-weight: bold;">S.</span>a_human]<span style=3D"color: #a7601=
f; background-color: #ebebeb;">]</span> <span style=3D"color: #8f6f4a; fo=
nt-style: italic;">(* </span><span style=3D"color: #8f6f4a; font-style: ita=
lic;">string output</span><span style=3D"color: #8f6f4a; font-style: italic=
;"> *)</span>
</code></pre>
</div>
</div>
</div>
<div id=3D"outline-container-org78184ed" class=3D"outline-4">
<h4 id=3D"org78184ed">Eliom support</h4>
<div class=3D"outline-text-4" id=3D"text-org78184ed">
<p>
For client=E2=80=93server Eliom apps, pass <code>--eliom</code>. The genera=
tor emits an <code>.eliom</code> file (so the same translations are availab=
le on both sides), implies <code>--tyxml</code>, and adds <code>[@@deriving=
json]</code> on the language type so you can serialise it across the wire:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-lisp"><code>(rule
(target example_i18n.eliom)
(deps example_i18n.tsv)
(action
(run %{bin:ocsigen-i18n} --eliom --languages en,fr --input-file %{deps}
--output-file %{target})))
</code></pre>
</div>
</div>
</div>
<div id=3D"outline-container-orgb5d5770" class=3D"outline-4">
<h4 id=3D"orgb5d5770">Multiple TSV files</h4>
<div class=3D"outline-text-4" id=3D"text-orgb5d5770">
<p>
You can split translations across several files. The PPX uses your module p=
ath to find the right one:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #a7601f; backgroun=
d-color: #ebebeb;">[%i18n</span> foo<span style=3D"color: #a7601f; backgrou=
nd-color: #ebebeb;">]</span> <span style=3D"color:=
#8f6f4a; font-style: italic;">(* </span><span style=3D"color: #8f6f4a; fon=
t-style: italic;">default module</span><span style=3D"color: #8f6f4a; font-=
style: italic;"> *)</span>
<span style=3D"color: #a7601f; background-color: #ebebeb;">[%i18n</span> <s=
pan style=3D"color: #557400; font-weight: bold;">MyI18n.</span>foo<span sty=
le=3D"color: #a7601f; background-color: #ebebeb;">]</span> =
<span style=3D"color: #8f6f4a; font-style: italic;">(* </span><span style=
=3D"color: #8f6f4a; font-style: italic;">MyI18n.foo</span><span style=3D"co=
lor: #8f6f4a; font-style: italic;"> *)</span>
<span style=3D"color: #a7601f; background-color: #ebebeb;">[%i18n</span> <s=
pan style=3D"color: #557400; font-weight: bold;">MyI18n.S.</span>bar <span =
style=3D"color: #444fcf; font-weight: bold;">~x</span>:[<span style=3D"colo=
r: #9f0d0f;">%</span>i18n <span style=3D"color: #557400; font-weight: bold;=
">S.</span>foo]<span style=3D"color: #a7601f; background-color: #ebebeb;">]=
</span>
</code></pre>
</div>
<p>
Optional <code>--prefix</code> / <code>--suffix</code> flags let you keep c=
all-sites concise (<code>[%i18n Feature.foo]</code> =E2=86=92 <code>Pr_Feat=
ure_i18n.foo ()</code>).
</p>
<p>
—
</p>
<ul class=3D"org-ul">
<li>Sources: <a href=3D"https://github.com/ocsigen/ocsigen-i18n">https://gi=
thub.com/ocsigen/ocsigen-i18n</a></li>
<li>Documentation: README on the repo</li>
<li>Bug reports: <a href=3D"https://github.com/ocsigen/ocsigen-i18n/issues"=
>https://github.com/ocsigen/ocsigen-i18n/issues</a></li>
</ul>
<p>
Happy translating!
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-8" class=3D"outline-2">
<h2 id=3D"8">ATD 4.1.0 - now with YAML support</h2>
<div class=3D"outline-text-2" id=3D"text-8">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-atd-4-1-0-now-with-yaml=
-support/17982/1">https://discuss.ocaml.org/t/ann-atd-4-1-0-now-with-yaml-s=
upport/17982/1</a>
</p>
</div>
<div id=3D"outline-container-org5dfd34e" class=3D"outline-3">
<h3 id=3D"org5dfd34e">Martin Jambon announced</h3>
<div class=3D"outline-text-3" id=3D"text-org5dfd34e">
<p>
<a href=3D"https://github.com/ahrefs/atd">ATD</a> now has OCaml support for=
conveniently reading data from YAML files as well as from other formats wi=
th minimal effort. It means:
</p>
<ol class=3D"org-ol">
<li>You define a <a href=3D"https://github.com/ahrefs/atd/blob/master/atd-y=
amlx/examples/app_config.atd">type for your config data</a>.</li>
<li><code>atdml --mode jsonlike app_config.atd</code> generates the OCaml c=
ode that converts a JSON-like AST containing source locations into your con=
fig data structure.</li>
<li><a href=3D"https://github.com/ahrefs/atd/blob/master/atd-yamlx/examples=
/main.ml">Your program</a> loads a YAML file, converts it to a JSON-like tr=
ee, and then calls the generated function to translate it into an OCaml dat=
a structure.</li>
<li>Your application prints useful error messages if the config is malforme=
d or incomplete.</li>
</ol>
<p>
An <a href=3D"https://github.com/ahrefs/atd/blob/master/atd-yamlx/examples"=
>example</a> is included in the distribution. It uses the <a href=3D"https:=
//discuss.ocaml.org/t/ann-yamlx-pure-ocaml-yaml-1-2-1-1-library/17970">rece=
ntly released YAMLx library</a>.
</p>
<p>
<span class=3D"underline">Note that YAMLx needs generous sponsors to fund t=
he work that was done and <a href=3D"https://github.com/mjambon/yamlx/blob/=
main/FUNDING.md">unlock a permissive ISC license</a> for everyone. Or you c=
an accept the terms of the <a href=3D"https://en.wikipedia.org/wiki/GNU_Aff=
ero_General_Public_License">AGPL license</a> if you're happy to share your =
application's source code with the users.</span>
</p>
<p>
Other input file formats or other YAML libraries can be used similarly with=
minimum effort as long as source locations are available. For this, you'll=
need <a href=3D"https://github.com/ahrefs/atd/blob/master/atd-yamlx/src/At=
d_yamlx.ml">a bridge</a> that converts your AST into the <a href=3D"https:/=
/github.com/ahrefs/atd/blob/master/atd-jsonlike/src/AST.mli">JSON-like AST<=
/a>.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-orgbb18b0e" class=3D"outline-2">
<h2 id=3D"orgbb18b0e">Old CWN</h2>
<div class=3D"outline-text-2" id=3D"text-orgbb18b0e">
<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"orgd995a42">
<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/BsSVW56ZmGBA0KO07S5ccFAmneDckbFIAAAAAABAAO
bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v
cmcACgkQBA0KO07S5ceFRgf/XhNku8f9cofDMBVUDoGIqf2diQ/AHn0a5pfJhZeu
9XdpslfekVBIkViylQfn2qVPgRMbFLG4S7REQcVjp+T9uT3luhyTY7cVY29/7VuV
sRg5wSG5SP+mvKWYtPint/RJjhsKVgo1V3PadSDqMu70++N5w0Hw0nIUtlf0+keI
qjbgVSXCWMBkGkia6AupuaqLr33WCr4q2ABZ3YKKVl5sIR+As49YIbzfeQ6Se3d7
9K5pMOur9IvTCoQ66T8AWVAY9Awmbt3NeIG/IXauIFBORw3FfDI0vNQCggzJLeGk
75dWJ+QhJKt5X3dbimKngZIuvs9GPsh1wmi2gxyMkpChWA==
=fpPG
-----END PGP SIGNATURE-----
--===-=-=--