From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id C1C647EEA4 for ; Tue, 21 Apr 2020 10:58:22 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=DX2w=6F=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=DX2w=6F=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=DX2w=6F=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=DX2w=6F=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=DX2w=6F=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=DX2w=6F=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3AgS5B+BE9KCv1kXfqaQq0s51GYnF86YWxBRYc798d?= =?us-ascii?q?s5kLTJ76os+9bnLW6fgltlLVR4KTs6sC17OL9fy9EjRRqb+681k6OKRWUBEEjc?= =?us-ascii?q?hE1ycBO+WiTXPBEfjxciYhF95DXlI2t1uyMExSBdqsLwaK+i764jEdAAjwOhRo?= =?us-ascii?q?LerpBIHSk9631+ev8JHPfglEnjWwba5yIRmsogjctsYajZdmJ60s1hbHv3xEdv?= =?us-ascii?q?hMy2h1P1yThRH85smx/J5n7Stdvu8q+tBDX6vnYak2VKRUAzs6PW874s3rrgTD?= =?us-ascii?q?QhCU5nQASGUWkwFHDBbD4RrnQ5r+qCr6tu562CmHIc37SK0/VDq+46t3ThLjlS?= =?us-ascii?q?AIOSMk8GHMksx/kr5UoA6vqRx4xo7beoCVNPxjda/Zct4XQW9NU8BRWyJCBIO8?= =?us-ascii?q?cYoPD/EAPelDq4nyuUYFrBW5BQm2Gezv0SJDinv40KEm1ugsFxzN0g49ENIUqH?= =?us-ascii?q?narMv7OrocX+62w6bH0S7OYOlK1Trn8oXEbgwtrPOKULltccTR004vFwbdg1iM?= =?us-ascii?q?rYzqJTWV3fkQvWeH7+pgUOOvi3I7qwpspTWg3MMshZPPho4P0VDL6SV5wIM0Jd?= =?us-ascii?q?2kVE52esakEJxUtyCaK4t5XN8tQ2FuuCY7070GpIC0cDINyJQ9yB7ScvqKeJWG?= =?us-ascii?q?7BLkUeaeOzZ4hHR9dbKnmRmy7UmgyvHiWcms11ZKqy9FncfWunALyRPT9tCLSv?= =?us-ascii?q?xh8Ui73DaP0xrf6uZeIUA7jabbJJ8hwqIwlpoOqkvPBDP5mELzjKOOaEok4PKo?= =?us-ascii?q?5P77YrXnv5+cKpF7hhviPaQugsCwHeE4MhUUU2eF5Ou8yaXv/VblQLpQkvI2ka?= =?us-ascii?q?7ZsI7EKsQBqK65BwhV04g55xmjCDem1cwUnWMALFJeZB2HjpXmO0zVIPziEfi/?= =?us-ascii?q?hFGsnC9kx/DHIr3hAojNIWPZnLfgerZx81VcxxYyzdBc5pJUFqgNIPbtVUDrrt?= =?us-ascii?q?zYCAU1Mwuuw+boENlyy4QeVn6MAqCHKqPeq0OH5uUqI+WUY48apCv9K+I/5/Hw?= =?us-ascii?q?i385hUURfa6z3ZsYcHy4GehpLF+cYXromtcBC2AKshAiQ+ztjV2OSSZTZ22sUK?= =?us-ascii?q?I44jE7D5mmAZ3fSYCqhbyNxCm7HodMaWBDEF+ACGvne5+YVPcLbSKeOs1hnSYC?= =?us-ascii?q?Vbe/UI8hyQuuuxHkxLp7NObb5ioYtZf72NRp/OLTjws99TpoAMSdyW2CU2Z0nm?= =?us-ascii?q?YQSz8z3aB/u1Zyylid3qRigvxYEsRf5/VQUgchLpHQ1e16C9fqVgLAeNeJUlem?= =?us-ascii?q?Tc+8DTE/VNI928UBY0BgFNW4kB/D3TCmDKMSl7yOHJA07rjT32LwJ8lg1XnGz7?= =?us-ascii?q?MtgEUhQstKLWGmh7Nw9gjXB47NiUmZkLyqdasa0SXQ92mD1XKDsFxGXAN0S6nJ?= =?us-ascii?q?QGwTa0TModn3+k/OVbGjBLs/PgZDysOOMLVGZ9L3gVlcWfvuN87Sb3++lmusAx?= =?us-ascii?q?uD26mCY5Dwe2oH2SXQEEgEnB4X/XaBLQU+Ayigr3/EADx2ElLvZ0Pt8fVgp3yn?= =?us-ascii?q?Tk80yQCKb1R817Wr4BIVguacS/wL0rIFvicutSl0EU6g097ID9eMvRdtcLlTbN?= =?us-ascii?q?8n7lpLyXjVugJyM5C4KqBtnF8ecwB5v0P00BV3D51Nn9U2on030AZ/MayW31Jf?= =?us-ascii?q?ezKWxZ39O73ZJ3Hq/BCob67X2k3e38iK9acP7vQ4qkzjvBy3GUY49HVnydZV3m?= =?us-ascii?q?OG6ZXOFgUSV4j9Ul0r+Bh6orHaYzU955/P2HJ3Nqm0rznC1M43C+s+0BqgethS?= =?us-ascii?q?MayeGA/1Cc0aCNCiKPY2lFixchIEIOdS+bYoMMy8cvuG3LenPOJhnDK9kWRK+5?= =?us-ascii?q?t900KJ9ypkUOHExZcFw/eC3guGTTjwllmhstqk0bxDMHsWAWz1gXzgG4h5YrJ0?= =?us-ascii?q?O4AGFTHqa4e82dM0z9a5UGFe3FqiHE8dns6laB6WKVvn0lsUnU8epHjinSqj0x?= =?us-ascii?q?R1lSsop+yRxmiGyOPnbDIDO3VXXy9ll13tPYGwgdcKGkW1PCYzkx7wzELzweBg?= =?us-ascii?q?r6R6LnXPCRNBeyHwaXppUq6xqqaqe8lL+Y8luiVRUf2hbBadULGr8EhS6D/qA2?= =?us-ascii?q?YLnGNzTDqtoJiswE0j1DCtaU1rpX+cQvlegA/F7YWNF+ZW2isaSSJ4jzjOG1X6?= =?us-ascii?q?OMOmr4zNysXz99umXmfkbaV9NCnmyYTa73m+9TQsGRq7juy+kd3hEBEn3Gn8zd?= =?us-ascii?q?Y4DHyZ/ia5WZHi0uGBCcwie0BpAFHm7M8jRdN0lZY2j5wLn31GltOS53VVyGo?= =?us-ascii?q?=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BqCQCItJ5ehyIeaIFmFoNQUwWBGVUyK?= =?us-ascii?q?oQeiQKFfIUfAoUojS+DB3mBEANQDgEDAQwYAQ4FAQIEAQGBUIIvRQIXgXkdBgE?= =?us-ascii?q?FMxMCEAEBBQEBAQIBAgMEARMBAQEKCwkIKYUxCCQMgjsMDAMDgx0DARgBCAQGP?= =?us-ascii?q?gIlIwMUAQYDAgQNARcBFAoXARIUBgKCP0sBgnwEAQqVBpo1GjV1fzOEOQEDAwI?= =?us-ascii?q?JBQEOCSaELYFADQITgRaFJYMZg1UmD4FMP4ERghJQbIJBAwoOCwEBAQEBgUABA?= =?us-ascii?q?QYLRYJcgl8Ei2mCKxskApEwkgIHgkd9BIVdOXOJbYYXglaBBodJhHGMQSGPT4F?= =?us-ascii?q?VhUkHa4EvhUqODYE/KoFHAR0MBzMaMEMNEoIWAQEBMQkJVg1WAoR+jA0BF4MoK?= =?us-ascii?q?GpUgSaBdTuFQz8zAgEBBweBEAEBBRMLAYsmgkMBAQ?= X-IPAS-Result: =?us-ascii?q?A0BqCQCItJ5ehyIeaIFmFoNQUwWBGVUyKoQeiQKFfIUfAoU?= =?us-ascii?q?ojS+DB3mBEANQDgEDAQwYAQ4FAQIEAQGBUIIvRQIXgXkdBgEFMxMCEAEBBQEBA?= =?us-ascii?q?QIBAgMEARMBAQEKCwkIKYUxCCQMgjsMDAMDgx0DARgBCAQGPgIlIwMUAQYDAgQ?= =?us-ascii?q?NARcBFAoXARIUBgKCP0sBgnwEAQqVBpo1GjV1fzOEOQEDAwIJBQEOCSaELYFAD?= =?us-ascii?q?QITgRaFJYMZg1UmD4FMP4ERghJQbIJBAwoOCwEBAQEBgUABAQYLRYJcgl8Ei2m?= =?us-ascii?q?CKxskApEwkgIHgkd9BIVdOXOJbYYXglaBBodJhHGMQSGPT4FVhUkHa4EvhUqOD?= =?us-ascii?q?YE/KoFHAR0MBzMaMEMNEoIWAQEBMQkJVg1WAoR+jA0BF4MoKGpUgSaBdTuFQz8?= =?us-ascii?q?zAgEBBweBEAEBBRMLAYsmgkMBAQ?= X-IronPort-AV: E=Sophos;i="5.72,409,1580770800"; d="scan'208,217";a="346515106" X-MGA-submission: =?us-ascii?q?MDFz1NCLecIov2QbFf/rwv+2m+sCBDcVEyuphg?= =?us-ascii?q?EGG+g6rIZTGGs8ZYkVeXgDFKNwfNGhYgpVXq+qJ1fm+lstmloz5OiRlL?= =?us-ascii?q?uZmrJCkdQh+Oxong5B64wiQukGqXHz1fqnxtJKBLcJz8q310So1PEuXy?= =?us-ascii?q?qQJxFHPahzfzKX03dRCpsU3w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Apr 2020 10:58:20 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 415915613BD; Tue, 21 Apr 2020 10:58:16 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 21 Apr 2020 10:58:15 +0200 Message-ID: <87h7xdnrko.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 21 10:58:17 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.086842, queueID=E39BF5613BF X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgQXByaWwgMTQgdG8gMjEsDQoyMDIwLg0KDQpU YWJsZSBvZiBDb250ZW50cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkN1cnJlbnRfaW5jcjogYSBz bWFsbCBpbmNyZW1lbnRhbCBsaWJyYXJ5IHdpdGggbm8gZGVwZW5kZW5jaWVz DQpTY2lraXQtbGVhcm4gZm9yIE9DYW1sDQpPQ2FtbCBhbmQgb3BhbSBjb250 YWluZXIgaW1hZ2VzIHVwZGF0ZWQ6IG5ldyBGZWRvcmEvQWxwaW5lL1VidW50 dSBpbWFnZXMNCk9DYW1sZm9ybWF0IDAuMTQuMA0KSGFzaGNvbnNpbmcgYW4g QVNUIHZpYSBQUFgNCkdlbnByaW50IHYwLjQNCk90aGVyIE9DYW1sIE5ld3MN Ck9sZCBDV04NCg0KDQpDdXJyZW50X2luY3I6IGEgc21hbGwgaW5jcmVtZW50 YWwgbGlicmFyeSB3aXRoIG5vIGRlcGVuZGVuY2llcw0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t Y3VycmVudC1pbmNyLWEtc21hbGwtaW5jcmVtZW50YWwtbGlicmFyeS13aXRo LW5vLWRlcGVuZGVuY2llcy81NTMxLzE+DQoNCg0KVGhvbWFzIExlb25hcmQg YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBU aGUgcmVjZW50IFtPQ3VycmVudCAwLjJdIHJlbGVhc2UgaW5jbHVkZWQgYSBs aXR0bGUgaW5jcmVtZW50YWwNCiAgbGlicmFyeSB3aGljaCBtaWdodCBiZSBp bnRlcmVzdGluZyB0byBzb21lIHBlb3BsZS4gSXQgaXMgdXNlZnVsIGZvcg0K ICB3cml0aW5nIHByb2dyYW1zIHRoYXQgbmVlZCB0byBrZWVwIHNvbWUgY29t cHV0YXRpb24gdXAtdG8tZGF0ZQ0KICBlZmZpY2llbnRseSBhcyB0aGUgaW5w dXRzIGNoYW5nZS4NCg0KICBJdCBpcyBzaW1pbGFyIHRvIHRoZSBleGlzdGlu ZyBbaW5jcmVtZW50YWxdIGFuZCBbcmVhY3RdIGxpYnJhcmllcw0KICBhbHJl YWR5IGluIG9wYW0uIFVubGlrZSBgaW5jcmVtZW50YWwnICh3aGljaCBwdWxs cyBpbiB0aGUgd2hvbGUgb2YNCiAgYGNvcmVfa2VybmVsJyksIGBjdXJyZW50 X2luY3InIGhhcyBubyBydW50aW1lIGRlcGVuZGVuY2llcyAoYW5kIGJ1aWxk DQogIGRlcGVuZGVuY2llcyBvbmx5IG9uIGBvY2FtbCcgYW5kIGBkdW5lJyku IFVubGlrZSBgcmVhY3QnLA0KICBgY3VycmVudF9pbmNyJyBpbW1lZGlhdGVs eSBzdG9wcyBjb21wdXRhdGlvbnMgd2hlbiB0aGV5IGFyZSBubyBsb25nZXIN CiAgbmVlZGVkIChyYXRoZXIgdGhhbiByZWx5aW5nIG9uIHdlYWsgcmVmZXJl bmNlcyBhbmQgdGhlIGdhcmJhZ2UNCiAgY29sbGVjdG9yKS4NCg0KICBJdCBp cyBhIGZhaXJseSBkaXJlY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIFtBZGFw dGl2ZSBGdW5jdGlvbmFsDQogIFByb2dyYW1taW5nXSBwYXBlciwgYW5kIG1p Z2h0IGJlIGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgcGVvcGxlDQogIHdh bnRpbmcgdG8gbGVhcm4gYWJvdXQgdGhhdC4NCg0KICBZb3UgY2FuIGdldCB0 aGUgbGlicmFyeSB1c2luZyBgb3BhbSc6DQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiBvcGFtIGluc3RhbGwgY3VycmVudF9pbmNyDQogIOKUlOKUgOKU gOKUgOKUgA0KDQogIEhlcmUncyBhIHNpbXBsZSBleGFtcGxlIChpbiB1dG9w KToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICNyZXF1aXJlICJjdXJy ZW50X2luY3IiOzsNCiAg4pSCDQogIOKUgiBsZXQgdG90YWwgPSBDdXJyZW50 X2luY3IudmFyIDEwDQogIOKUgiBsZXQgY29tcGxldGUgPSBDdXJyZW50X2lu Y3IudmFyIDUNCiAg4pSCDQogIOKUgiBsZXQgc3RhdHVzID0NCiAg4pSCICAg Q3VycmVudF9pbmNyLm9mX2NjIGJlZ2luDQogIOKUgiAgICAgQ3VycmVudF9p bmNyLnJlYWQgKEN1cnJlbnRfaW5jci5vZl92YXIgdG90YWwpIEBAIGZ1bmN0 aW9uDQogIOKUgiAgICAgfCAwIC0+IEN1cnJlbnRfaW5jci53cml0ZSAiTm8g am9icyINCiAg4pSCICAgICB8IHRvdGFsIC0+DQogIOKUgiAgICAgICBDdXJy ZW50X2luY3IucmVhZCAoQ3VycmVudF9pbmNyLm9mX3ZhciBjb21wbGV0ZSkg QEAgZnVuIGNvbXBsZXRlIC0+DQogIOKUgiAgICAgICBsZXQgZnJhYyA9IGZs b2F0X29mX2ludCBjb21wbGV0ZSAvLiBmbG9hdF9vZl9pbnQgdG90YWwgaW4N CiAg4pSCICAgICAgIFByaW50Zi5zcHJpbnRmICIlZC8lZCBqb2JzIGNvbXBs ZXRlICglLjFmJSUpIg0KICDilIIgCQkgICAgIGNvbXBsZXRlIHRvdGFsICgx MDAuICouIGZyYWMpDQogIOKUgiAgICAgICB8PiBDdXJyZW50X2luY3Iud3Jp dGUNCiAg4pSCICAgZW5kDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoaXMg ZGVmaW5lcyB0d28gaW5wdXQgdmFyaWFibGVzIChgdG90YWwnIGFuZCBgY29t cGxldGUnKSBhbmQgYQ0KICAiY2hhbmdlYWJsZSBjb21wdXRhdGlvbiIgKGBz dGF0dXMnKSB3aG9zZSBvdXRwdXQgZGVwZW5kcyBvbiB0aGVtLiBBdA0KICB0 aGUgdG9wLWxldmVsLCB3ZSBjYW4gb2JzZXJ2ZSB0aGUgaW5pdGlhbCBzdGF0 ZSB1c2luZyBgb2JzZXJ2ZSc6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKU giAjIHByaW50X2VuZGxpbmUgQEAgQ3VycmVudF9pbmNyLm9ic2VydmUgc3Rh dHVzOzsNCiAg4pSCIDUvMTAgam9icyBjb21wbGV0ZSAoNTAuMCUpDQogIOKU lOKUgOKUgOKUgOKUgA0KDQogIFVubGlrZSBhIHBsYWluIGByZWYnIGNlbGws IGEgYEN1cnJlbnRfaW5jci52YXInIGtlZXBzIHRyYWNrIG9mIHdoaWNoDQog IGNvbXB1dGF0aW9ucyBkZXBlbmQgb24gaXQuIEFmdGVyIGNoYW5naW5nIHRo ZW0sIHlvdSBtdXN0IGNhbGwNCiAgYHByb3BhZ2F0ZScgdG8gdXBkYXRlIHRo ZSByZXN1bHRzOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgIyBDdXJy ZW50X2luY3IuY2hhbmdlIHRvdGFsIDEyOzsNCiAg4pSCICMgQ3VycmVudF9p bmNyLmNoYW5nZSBjb21wbGV0ZSA0OzsNCiAg4pSCICMgcHJpbnRfZW5kbGlu ZSBAQCBDdXJyZW50X2luY3Iub2JzZXJ2ZSBzdGF0dXM7Ow0KICDilIIgNS8x MCBqb2JzIGNvbXBsZXRlICg1MC4wJSkJKCogTm90IHlldCB1cGRhdGVkICop DQogIOKUgg0KICDilIIgIyBDdXJyZW50X2luY3IucHJvcGFnYXRlICgpOw0K ICDilIIgIyBwcmludF9lbmRsaW5lIEBAIEN1cnJlbnRfaW5jci5vYnNlcnZl IHN0YXR1czs7DQogIOKUgiA0LzEyIGpvYnMgY29tcGxldGUgKDMzLjMlKQ0K ICDilJTilIDilIDilIDilIANCg0KICBDb21wdXRhdGlvbnMgY2FuIGhhdmUg c2lkZS1lZmZlY3RzLCBhbmQgeW91IGNhbiB1c2UgYG9uX3JlbGVhc2UnIHRv DQogIHJ1biBzb21lIGNvbXBlbnNhdGluZyBhY3Rpb24gaWYgdGhlIGNvbXB1 dGF0aW9uIG5lZWRzIHRvIGJlIHVuZG9uZQ0KICBsYXRlci4gSGVyZSdzIGEg ZnVuY3Rpb24gdGhhdCBwdWJsaXNoZXMgYSByZXN1bHQsIGFuZCBhbHNvIHJl Z2lzdGVycyBhDQogIGNvbXBlbnNhdGlvbiBmb3IgaXQ6DQoNCiAg4pSM4pSA 4pSA4pSA4pSADQogIOKUgiBsZXQgcHVibGlzaCBtc2cgPQ0KICDilIIgICBQ cmludGYucHJpbnRmICJQVUJMSVNIOiAlc1xuJSEiIG1zZzsNCiAg4pSCICAg Q3VycmVudF9pbmNyLm9uX3JlbGVhc2UgQEAgZnVuICgpIC0+DQogIOKUgiAg IFByaW50Zi5wcmludGYgIlJFVFJBQ1Q6ICVzXG4lISIgbXNnDQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIEl0IGNhbiBiZSB1c2VkIGxpa2UgdGhpczoNCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCICMgbGV0IGRpc3BsYXkgPSBDdXJy ZW50X2luY3IubWFwIHB1Ymxpc2ggc3RhdHVzOzsNCiAg4pSCIFBVQkxJU0g6 IDQvMTIgam9icyBjb21wbGV0ZSAoMzMuMyUpDQogIOKUgg0KICDilIIgIyBD dXJyZW50X2luY3IuY2hhbmdlIHRvdGFsIDA7DQogIOKUgiAjIEN1cnJlbnRf aW5jci5wcm9wYWdhdGUgKCkNCiAg4pSCIFJFVFJBQ1Q6IDQvMTIgam9icyBj b21wbGV0ZSAoMzMuMyUpDQogIOKUgiBQVUJMSVNIOiBObyBqb2JzDQogIOKU lOKUgOKUgOKUgOKUgA0KDQogIEEgbWFqb3IgZGlmZmVyZW5jZSBiZXR3ZWVu IHRoaXMgYW5kIHRoZSByZWFjdCBsaWJyYXJ5ICh3aGljaCBJJ3ZlIHVzZWQN CiAgaW4gcHJldmlvdXNseSBpbiBbMGluc3RhbGwncyBwcm9ncmVzcyByZXBv cnRpbmddIGFuZCBbQ3VlS2VlcGVyXSkgaXMNCiAgdGhhdCBgQ3VycmVudF9p bmNyJyBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGdhcmJhZ2UgY29sbGVjdG9y IHRvIGRlY2lkZQ0KICB3aGVuIHRvIHN0b3AgYSBjb21wdXRhdGlvbi4gSW4g cmVhY3QsIHlvdSdkIGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBtYWtlDQogIHN1 cmUgdGhhdCBgZGlzcGxheScgZGlkbid0IGdldCBHQydkIChldmVuIHRob3Vn aCB5b3UgZG9uJ3QgbmVlZCB0bw0KICByZWZlciB0byBpdCBhZ2FpbikgYmVj YXVzZSBpZiBpdCBkaWQgdGhlbiB0aGUgb3V0cHV0IHdvdWxkIHN0b3ANCiAg Z2V0dGluZyB1cGRhdGVkLiBBbHNvLCBzZXR0aW5nIGB0b3RhbCcgdG8gYDAn IGluIHJlYWN0IG1pZ2h0IGNhdXNlIHRoZQ0KICBwcm9ncmFtIHRvIGNyYXNo IHdpdGggYSBkaXZpc2lvbi1ieS16ZXJvIGV4Y2VwdGlvbiwgYmVjYXVzZSB0 aGUgYGZyYWMnDQogIGNvbXB1dGF0aW9uIHdpbGwgY29udGludWUgcnVubmlu ZyB1bnRpbCBpdCBnZXRzIEdDJ2QsIGV2ZW4gdGhvdWdoIGl0DQogIGlzbid0 IG5lZWRlZCBmb3IgYW55dGhpbmcgbm93Lg0KDQogIFtgQ3VycmVudF9pbmNy JydzIEFQSV0gaXMgcHJldHR5IHNtYWxsLiBZb3UgbWlnaHQgd2FudCB0byB3 cmFwIGl0IHRvDQogIHByb3ZpZGUgZXh0cmEgZmVhdHVyZXMsIGUuZy4NCg0K ICDigKIgVXNlIG9mIGEgYHJlc3VsdCcgdHlwZSB0byBwcm9wYWdhdGUgZXJy b3JzLg0KICDigKIgSW50ZWdyYXRpb24gd2l0aCBgTHd0JyB0byBhbGxvdyBh c3luY2hyb25vdXMgY29tcHV0YXRpb25zLg0KICDigKIgU3RhdGljIGFuYWx5 c2lzIHRvIHJlbmRlciB5b3VyIGNvbXB1dGF0aW9uIHdpdGggZ3JhcGh2aXou DQogIOKAoiBQZXJzaXN0ZW5jZSBvZiBzdGF0ZSB0byBkaXNrLg0KDQogIElm IHlvdSBuZWVkIHRoYXQsIGNvbnNpZGVyIHVzaW5nIHRoZSBtYWluIFtPQ3Vy cmVudF0gbGlicmFyeSwgd2hpY2gNCiAgZXh0ZW5kcyBgY3VycmVudF9pbmNy JyB3aXRoIHRoZXNlIGZlYXR1cmVzLg0KDQoNCltPQ3VycmVudCAwLjJdIDxo dHRwczovL2dpdGh1Yi5jb20vb2N1cnJlbnQvb2N1cnJlbnQvcmVsZWFzZXMv dGFnL3YwLjI+DQoNCltpbmNyZW1lbnRhbF0gPGh0dHBzOi8vZ2l0aHViLmNv bS9qYW5lc3RyZWV0L2luY3JlbWVudGFsPg0KDQpbcmVhY3RdIDxodHRwczov L2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9yZWFjdD4NCg0KW0FkYXB0aXZlIEZ1 bmN0aW9uYWwgUHJvZ3JhbW1pbmddDQo8aHR0cHM6Ly93d3cuY3MuY211LmVk dS9+Z3V5Yi9wYXBlcnMvcG9wbDAyLnBkZj4NCg0KWzBpbnN0YWxsJ3MgcHJv Z3Jlc3MgcmVwb3J0aW5nXQ0KPGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20v cXVlc3Rpb25zLzE5OTc1MTQwL2hvdy10by1zdG9wLW9jYW1sLWdhcmJhZ2Ut Y29sbGVjdGluZy1teS1yZWFjdGl2ZS1ldmVudC1oYW5kbGVyPg0KDQpbQ3Vl S2VlcGVyXQ0KPGh0dHBzOi8vcm9zY2lkdXMuY29tL2Jsb2cvYmxvZy8yMDE1 LzA2LzIyL2N1ZWtlZXBlci1pbnRlcm5hbHMtaXJtaW4vPg0KDQpbYEN1cnJl bnRfaW5jcicncyBBUEldDQo8aHR0cHM6Ly9vY3VycmVudC5naXRodWIuaW8v b2N1cnJlbnQvY3VycmVudF9pbmNyL0N1cnJlbnRfaW5jci9pbmRleC5odG1s Pg0KDQpbT0N1cnJlbnRdIDxodHRwczovL2dpdGh1Yi5jb20vb2N1cnJlbnQv b2N1cnJlbnQ+DQoNCg0KU2Npa2l0LWxlYXJuIGZvciBPQ2FtbA0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9zY2lraXQtbGVhcm4tZm9yLW9jYW1sLzU1MzYvMT4N Cg0KDQpVbml4SnVua2llIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgUm9uYW4gTGVoeSBqdXN0IGhhY2tlZCB0aGlzOg0KDQogIDxodHRwczov L2dpdGh1Yi5jb20vbGVoeS9vY2FtbC1za2xlYXJuPg0KDQogIFRoaXMgbWln aHQgaW50ZXJlc3QgYSBzaWduaWZpY2FudCBudW1iZXIgb2YgcGVvcGxlIG91 dCB0aGVyZS4gIFdlIGFyZQ0KICBubyBtb3JlIGNvbmRlbW5lZCB0byBsaXZl IGluIGEgd29ybGQgZnVsbCBvZiBzbmFrZXMgdGhhdCB3aWxsIGJpdGUgdXMN CiAgYXQgcnVuLXRpbWUuIDpzbWlsZXk6DQoNCg0KUm9uYW4gTGUgSHkgdGhl biBzYWlkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBTbyBJIGNhbWUgaGVy ZSB0byBhbm5vdW5jZSBvY2FtbC1za2xlYXJuIGFzIGl0IGp1c3QgZ290IHB1 Ymxpc2hlZCBvbg0KICBPcGFtLCBidXQgSSBzZWUgQFVuaXhKdW5raWUgZGlk IGl0IGZvciBtZSAoYXJpZ2F0byBnb3phaQ0KICBtYXN1KS4gQW55d2F5Og0K ICDigKIgdGhpcyBhbWJpdGlvbnMgdG8gY292ZXIgdGhlIGNvbXBsZXRlIHNj aWtpdC1sZWFybiBBUEkNCiAg4oCiIHRoaXMgYW1iaXRpb24gaXMgY3VycmVu dGx5IG5vdCB0b3RhbGx5IHJlYWxpemVkLCBidXQgSSB3YW50ZWQgdG8NCiAg ICByZWxlYXNlIHNvbWV0aGluZyBpbml0aWFsIHRoYXQgb25lIGNhbiBwbGF5 IHdpdGgNCiAg4oCiIGl0J3MgYWxsIEBVbml4SnVua2llJ3MgZmF1bHQgd2l0 aCBoaXMgZnVubnkgUiB3cmFwcGVycy4NCg0KICBTbzoNCiAg4oCiIG9wYW0g aW5zdGFsbCBza2xlYXJuDQogIOKAoiBnbyBjaGVjayBvdXQgW3NjaWtpdC1s ZWFybiBhbmQgaXRzIGF3ZXNvbWUgZG9jdW1lbnRhdGlvbl0gdG8ga25vdw0K ICAgIHdoYXQgaXQgZG9lcw0KICDigKIgbG9vayBhdCBbb2NhbWwtc2tsZWFy bidzIGRvY3VtZW50YXRpb25dIHRvIHNlZSB3aGF0IHRoZSBjdXJyZW50DQog ICAgT0NhbWwgQVBJIGxvb2tzIGxpa2UNCiAg4oCiIGhhdmUgZnVuIHdpdGgg aXQgYW5kIHRlbGwgbWUgd2hhdCB5b3UgdGhpbmsgb2YgaXQuDQoNCg0KW3Nj aWtpdC1sZWFybiBhbmQgaXRzIGF3ZXNvbWUgZG9jdW1lbnRhdGlvbl0gPGh0 dHBzOi8vc2Npa2l0LWxlYXJuLm9yZz4NCg0KW29jYW1sLXNrbGVhcm4ncyBk b2N1bWVudGF0aW9uXSA8aHR0cHM6Ly9sZWh5LmdpdGh1Yi5pby9vY2FtbC1z a2xlYXJuLz4NCg0KDQpBbnRvbiBLb2Noa292IHRoZW4gYWRkZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFByb2JhYmx5IHdvcnRoIHRv IGFkZCBoZXJlOg0KICDigKIgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1j b21tdW5pdHkvYXdlc29tZS1vY2FtbCNtYWNoaW5lLWxlYXJuaW5nPg0KDQoN Ck9DYW1sIGFuZCBvcGFtIGNvbnRhaW5lciBpbWFnZXMgdXBkYXRlZDogbmV3 IEZlZG9yYS9BbHBpbmUvVWJ1bnR1IGltYWdlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1hbmQtb3BhbS1jb250YWlu ZXItaW1hZ2VzLXVwZGF0ZWQtbmV3LWZlZG9yYS1hbHBpbmUtdWJ1bnR1LWlt YWdlcy81NTM5LzE+DQoNCg0KQW5pbCBNYWRoYXZhcGVkZHkgYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBU aGUgRG9ja2VyIFtvY2FtbCBhbmQgb3BhbSBjb250YWluZXIgaW1hZ2VzXSBo YXZlIGJlZW4gdXBkYXRlZDoNCg0KICDigKIgQWxwaW5lIDMuMTEsIEZlZG9y YSAzMSBhbmQgVWJ1bnR1IDIwLjA0IChiZXRhKSBhcmUgbm93IGluY2x1ZGVk Lg0KICDigKIgVWJ1bnR1IDE5LjA0IGFuZCBGZWRvcmEgMjkgYW5kIDMwIGFy ZSBub3cgZGVwcmVjYXRlZC4NCiAg4oCiIE9DYW1sIDQuMDkuMSBhbmQgNC4x MS4wfmRldiBoYXZlIGJlZW4gcmVmcmVzaGVkLg0KDQogIFlvdSBjYW4gZmlu ZCB0aGUgZnVsbCBkZXRhaWxzIG9mIHRoZSBjb250YWluZXIgaW1hZ2VzIGF2 YWlsYWJsZSBbb24NCiAgdGhlIE9DYW1sIGluZnJhc3RydWN0dXJlIHdpa2ld Lg0KDQogIFRoZSBjb250YWluZXJzIGFyZSBnZW5lcmF0ZWQgZnJvbSBhIHNl dCBvZiBzY3JpcHRzIHVzaW5nDQogIFtvY2FtbC1kb2NrZXJmaWxlXSwgYW5k IHdpbGwgYmUgbWlncmF0aW5nIG92ZXIgdGhlIG5leHQgc2l4IG1vbnRocyB0 bw0KICB1c2UgYW4gW29jdXJyZW50XS1iYXNlZCBpbmZyYXN0cnVjdHVyZS4g VGhlcmUgd2lsbCBiZSBhbiBhbm5vdW5jZW1lbnQNCiAgb24gdGhpcyBmb3J1 bSBhYm91dCBhbnkgdXNlci1mYWNpbmcgY2hhbmdlcyB0aGF0IGludm9sdmVz LCB3aXRoIHBsZW50eQ0KICBvZiB0aW1lIHRvIHRyYW5zaXRpb24geW91ciBv d24gQ0lzIG92ZXIuICBUaGFua3MgZ28gdG8gQHRhbGV4NSBhbmQNCiAgQFhW aWxrYSBmb3IgY29udHJpYnV0aW9ucyB0byB0aGlzIHJvdW5kIG9mIHVwZGF0 ZXMuDQoNCg0KW29jYW1sIGFuZCBvcGFtIGNvbnRhaW5lciBpbWFnZXNdIDxo dHRwczovL2h1Yi5kb2NrZXIuY29tL3Ivb2NhbWwvb3BhbTI+DQoNCltvbiB0 aGUgT0NhbWwgaW5mcmFzdHJ1Y3R1cmUgd2lraV0NCjxodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvaW5mcmFzdHJ1Y3R1cmUvd2lraS9Db250YWluZXJzPg0K DQpbb2NhbWwtZG9ja2VyZmlsZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9hdnNt L29jYW1sLWRvY2tlcmZpbGU+DQoNCltvY3VycmVudF0gPGh0dHBzOi8vb2N1 cnJlbnQub3JnPg0KDQoNCk9DYW1sZm9ybWF0IDAuMTQuMA0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tb2NhbWxmb3JtYXQtMC0xNC0wLzU0MzUvMjQ+DQoNCg0KSnVsZXMgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBBcyBFdGllbm5lIG1lbnRpb25lZCwgd2UgaGF2ZSBy ZWxlYXNlZCBPQ2FtbGZvcm1hdCAwLjE0LjEsIHJldmVydGluZw0KICB0aGUg Y2hhbmdlIHRvIHRoZSBkZWZhdWx0cyBhbmQgb3VyIHBsYW5zIHRvIGRlcHJl Y2F0ZSB0aGUNCiAgYGRvYy1jb21tZW50cycgb3B0aW9uLg0KDQogIEZvciBw cm9qZWN0cyB0aGF0IGFscmVhZHkgdXBncmFkZWQgdG8gMC4xNC4wIChlZy4g Q29xKSwgdGhlDQogIGBkb2MtY29tbWVudHMnIG9wdGlvbiB3aWxsIGNoYW5n ZSBpdHMgbWVhbmluZyBhZ2Fpbi4gSXQgaXMgbmVjZXNzYXJ5DQogIHRvIGFk ZCBgZG9jLWNvbW1lbnRzPWJlZm9yZScgdG8gaGF2ZSB0aGUgZG9jdW1lbnRh dGlvbiBjb21tZW50cyBwbGFjZWQNCiAgYmVmb3JlLiAgTW9yZW92ZXIsIHRo ZSBuZXcgb3B0aW9uIGBkb2MtY29tbWVudHMtdmFsJyBhZGRlZCBpbiAwLjE0 LjANCiAgaGFzIGEgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBgZG9jLWNvbW1l bnRzJywgZXZlbiB3aGVuIGl0J3Mgbm90DQogIHNldC4gSXQgaXMgdGh1cyBu ZWNlc3NhcnkgdG8gc2V0IHRoZW0gYm90aCB0byBgYmVmb3JlJyB0byBoYXZl IHRoZSBvbGQNCiAgImJlZm9yZSIgYmVoYXZpb3IuICBUaGlzIHdpbGwgYmUg aW1wcm92ZWQgaW4gdGhlIG5leHQgcmVsZWFzZSAoc2VlDQogIDxodHRwczov L2dpdGh1Yi5jb20vb2NhbWwtcHB4L29jYW1sZm9ybWF0L3B1bGwvMTM0MD4p Lg0KDQogIFRoYW5rIHlvdSB0byBvdXIgZWFybHkgYWRvcHRlcnMgdG8gYmVh ciB1cy4gV2UgYXJlIGltcHJvdmluZyBvdXINCiAgcmVsZWFzZSBwcm9jZXNz IHRvIHJlZHVjZSBjb25mdXNpb24gZm9yIHRoZSBuZXh0IHVwZGF0ZXMuIEFz IHVzdWFsLCBpZg0KICB5b3UgaGF2ZSBhbnkgZmVlZGJhY2ssIHBsZWFzZSBv cGVuIGFuIGlzc3VlIG9uDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwt cHB4L29jYW1sZm9ybWF0PiB0byBkaXNjdXNzIGl0IHdpdGggdXMuDQoNCg0K SGFzaGNvbnNpbmcgYW4gQVNUIHZpYSBQUFgNCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvaGFzaGNvbnNpbmctYW4tYXN0LXZpYS1wcHgv NTU1OC8xPg0KDQoNCkNoZXQgTXVydGh5IGFubm91bmNlZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgW3VwLWZyb250IChzbyBub2JvZHkgZ2V0cyB0aGUg d3JvbmcgaWRlYSk6IEknbSBub3QgcHVzaGluZyBDYW1scDUuDQogIFJhdGhl ciwgSSdtIGp1c3Qgbm90aW5nIHRoYXQgdGhpcyBzb3J0IG9mIHRoaW5nIGlz IHJlYWxseSBlYXN5IHRvIGRvLA0KICBhbmQgSSBlbmNvdXJhZ2Ugc29tZW9u ZSB0byBkbyBzb21ldGhpbmcgc2ltaWxhciB1c2luZyB0aGUgUFBYDQogIGlu ZnJhc3RydWN0dXJlLl0NCg0KICBJIGRpZG4ndCB3YW50IHRvIGRlcmFpbCB0 aGUgIkZ1dHVyZSBvZiBQUFgiIHRocmVhZCwgc28gSSB0aG91Z2h0IEknZA0K ICBwb3N0IHNlcGFyYXRlbHkgdG8gYW5zd2VyIGl2Z0AgJ3MgaXNzdWUgYWJv dXQgaGFzaGNvbnNpbmcgb2YgQVNUcw0KICB1c2luZyBQUFguICBJdCdzIGFj dHVhbGx5IFt1aCwgSSB0aGlua10gcmVhbGx5LCByZWFsbHkgZWFzeSB0bw0K ICBpbXBsZW1lbnQgaGFzaGNvbnNpbmcgb2YgQURUcywgdXNpbmcgYSBQUFgg ZXh0ZW5zaW9uLiAgT24gYSBsYXJrLCBJDQogIGRlY2lkZWQgdG8gZG8gaXQg KnRvZGF5KiwgYW5kIHdoaWxlIHRoZSBjb2RlIEkndmUgZ290IGlzbid0IHN1 ZmZpY2llbnQNCiAgdG8gdXNlLCBJIHRoaW5rIGl0J3Mgbm90IHZlcnkgZmFy IGF3YXksIGFuZCBJIGhhdmUgdGhlIHBlcmZlY3QNCiAgdXNlLWNhc2UgYWxy ZWFkeSBpbi1taW5kLiAgSXQgdG9vayBtZSB0d28gaG91cnMgdG8gaW1wbGVt ZW50IHRoZQ0KICByZXdyaXRlciBhbmQgdGhlIHRlc3RjYXNlLCBvbiB0b3Ag b2YgdGhlIG90aGVyIGluZnJhc3RydWN0dXJlLCB3aGljaA0KICBoYXMgbm8g c3VwcG9ydCBmb3IgaGFzaGNvbnNpbmcgb2YgYW55IHNvcnQuDQoNCiAgSGVy ZSBhcmUgc29tZSBleGFtcGxlcyBvZiBkYXRhLXR5cGVzIGFuZCBmdW5jdGlv bnMgdGhhdCBhcmUNCiAgYXV0b21hdGljYWx5IGhhc2gtY29uc2VkLiAgVGhl IGlkZWEgaXMgdGhhdCBpbiB0aGUgcGF0dGVybi1tYXRjaCB0aGUNCiAgcGF0 dGVybiBpcyBhbm5vdGF0ZWQgd2l0aCBhIHZhcmlhYmxlIChpbiB0aGlzIGV4 YW1wbGUsICJ6Iik7IHRoZQ0KICBleHByZXNzaW9uIHRoYXQgaXMgc3VwcG9z ZWQgdG8gYmUgaGFzaC1jb25zZWQgYWdhaW5zdCB0aGF0IHBhdHRlcm4gaXMN CiAgYW5ub3RhdGVkIHdpdGggdGhhdCBzYW1lIHZhcmlhYmxlLiAgW1RoZSBj b2RlIHRoYXQgZGVzY2VuZHMgdG8gdGhlDQogIGV4cHJlc3Npb24gaXMgYSBs aXR0bGUgd2VhayByaWdodCBub3csIGJ1dCBJIHRoaW5rIHRoYXQncyBlYXNp bHkNCiAgZml4YWJsZS5dICBUaGUgYWxnb3JpdGhtIGdvZXMgYXMgZm9sbG93 czoNCg0KICAoMSkgImRlY29yYXRlIiB0aGUgcGF0dGVybiB3aXRoICJhcyB6 XzxpbnRlZ2VyPiIgdmFyaWFibGVzIGV2ZXJ5d2hlcmUNCiAgaW4gY29uc3Ry dWN0b3JzLiAgVGhpcyBhbGxvd3MgdXMgdG8gcmVmZXIgdG8gcGFydHMgb2Yg dGhlIG9yaWdpbmFsDQogIHZhbHVlLg0KDQogICgyKSB0aGVuIGZpbmQgZWFj aCBleHByZXNzaW9uIHRoYXQgaXMgbWFya2VkIHdpdGggdGhhdCBzYW1lIHZh cmFibGUuDQogIFN0cnVjdHVyYWxseSBkZXNjZW5kIHRoZSBwYXR0ZXJuIGFu ZCB0aGUgZXhwcmVzc2lvbiBpbiBwYXJhbGxlbCBhbmQNCiAgZ2VuZXJhdGUg Y29kZSB0byBjb21wYXJlIHN1Yi1zdHJ1Y3R1cmUgYW5kIGhhc2hjb25zIHdo ZXJlIGFwcHJvcHJpYXRlLg0KDQogIEFuZCB0aGF0J3MgcmVhbGx5IGl0LiAg SSdtIHN1cmUgdGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIFBQ WA0KICB0b29scy4NCg0KICBTb21lIGNvbW1lbnRzOiAoMSkgd2hhdCdzIG5p Y2UsIGlzIHRoYXQgd2UgY2FuIGp1c3QgdGFrZQ0KICBhbHJlYWR5LXdyaXR0 ZW4gY29kZSBsaWtlIGBMaXN0Lm1hcCcgYW5kIGFubm90YXRlIGl0OyB0aGF0 IGdlbmVyYXRlcyBhDQogIGhhc2gtY29uc2VkIHZlcnNpb24uICBBbmQgc2lu Y2UgdGhlIGdlbmVyYXRlZCBjb2RlIG5ldmVyIHVzZXMgZGVlcA0KICBzdHJ1 Y3R1cmFsIGVxdWFsaXR5IChvbmx5IHBvaW50ZXItZXF1YWxpdHkpIGl0IHNo b3VsZCBiZSBvbmx5DQogIG1hcmdpbmFsbHkgc2xvd2VyIHRoYW4gdGhlIG9y aWdpbmFsIGltcGxlbWVudGF0aW9uLg0KDQogICgyKSBUaGUgdmFyaWFibGUg aW4gdGhlIGFubm90YXRpb24gKCJ6IikgaXMgdXNlZCBhcyB0aGUgYmFzZSBm b3INCiAgZ2VuZXJhdGluZyBhIHdob2xlIHNsZXcgb2YgZnJlc2ggdmFyaWFi bGVzLCBhbmQgSSBkb24ndCBib3RoZXIgKHlldCkNCiAgdG8gY2hlY2sgZm9y IGNsYXNoZXM7IHRoaXMgKGFnYWluKSBpcyBzdHJhaWdodGZvcndhcmQsIGJ1 dCBoZXksIEkNCiAgc3RhcnRlZCB0d28gaG91cnMgYWdvLg0KDQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgdHlwZSB0ID0gTGVhZiBvZiBpbnQgfCBOb2Rl IG9mIHQgKiBpbnQgKiB0DQogIOKUgg0KICDilIIgbW9kdWxlIEhDTGlzdCA9 IHN0cnVjdA0KICDilIINCiAg4pSCIGxldCByZWMgbWFwIGYgPSBmdW5jdGlv bg0KICDilIIgICAgIFtdW0BoYXNocmVjb25zIHpdIC0+IFtdW0BoYXNocmVj b25zIHpdDQogIOKUgiAgIHwgKGE6OmwpW0BoYXNocmVjb25zIHpdIC0+IGxl dCByID0gZiBhIGluICgociA6OiBtYXAgZiBsKVtAaGFzaHJlY29ucyB6XSkN CiAg4pSCDQogIOKUgiBlbmQNCiAg4pSCDQogIOKUgiBsZXQgZGVlcCA9DQog IOKUgiBsZXQgcmVjIGRlZXAgPSAoZnVuY3Rpb24NCiAg4pSCICAgTGVhZiBu W0BoYXNocmVjb25zIHpdIC0+IExlYWYgbltAaGFzaHJlY29ucyB6XQ0KICDi lIIgfCBOb2RlIChsLCBuLCByKSBbQGhhc2hyZWNvbnMgel0gLT4NCiAg4pSC ICAgTm9kZSAoZGVlcCBsLCBuLCBkZWVwIHIpIFtAaGFzaHJlY29ucyB6XQ0K ICDilIIgICApDQogIOKUgiBbQEBvY2FtbC53YXJuaW5nICItMjYiXQ0KICDi lIIgaW4gZGVlcA0KICDilIINCiAg4pSCIHR5cGUgc2V4cCA9DQogIOKUgiAg IHwgQXRvbSBvZiBzdHJpbmcNCiAg4pSCICAgfCBMaXN0IG9mIHNleHAgbGlz dA0KICDilIINCiAg4pSCIGxldCBzZXhwX2RlZXAgPQ0KICDilIIgICBsZXQg cmVjIGRlZXAgPSBmdW5jdGlvbg0KICDilIIgICAgICAgQXRvbSBzW0BoYXNo cmVjb25zIHpdIC0+IEF0b20gc1tAaGFzaHJlY29ucyB6XQ0KICDilIIgICAg IHwgTGlzdCBsW0BoYXNocmVjb25zIHpdIC0+IExpc3QgKEhDTGlzdC5tYXAg ZGVlcCBsKVtAaGFzaHJlY29ucyB6XQ0KICDilIIgICBpbiBkZWVwDQogIOKU lOKUgOKUgOKUgOKUgA0KDQogIExpbmtzOiBGaXJzdCwgYXQgdGhlIGNvbW1p dCwgc28gdGhleSB3b24ndCBjaGFuZ2UNCg0KICB0aGUgdGVzdGNhc2UgZmls ZToNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9jaGV0bXVydGh5L3BhX3BweC9j b21taXQvNWRkNmIyZWYzY2EzNjc3ZTExYTBhZDY5NjA3NDIwMDEwMWJkNjYx ZiNkaWZmLWU2ZGZmZTc4ZmM2YzI3YmRmZmE0MTk3MGM0YTdmMWNhPg0KDQog IHRoZSAicHB4IHJld3JpdGVyIjoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9j aGV0bXVydGh5L3BhX3BweC9jb21taXQvNWRkNmIyZWYzY2EzNjc3ZTExYTBh ZDY5NjA3NDIwMDEwMWJkNjYxZiNkaWZmLTI0YWVhZjUxMzY2MDE3OTQ4ZjU3 MzU3MjdmMDAxYzg1Pg0KDQogIFNlY29uZCwgdGhlIGZpbGVzIHdpdGggaHVt YW4tcmVhZGFibGUgbmFtZXMsIGV0Yy46DQoNCiAgdGhlIHRlc3RjYXNlOg0K ICA8aHR0cHM6Ly9naXRodWIuY29tL2NoZXRtdXJ0aHkvcGFfcHB4L2Jsb2Iv bWFzdGVyL3Rlc3RzL3Rlc3RfaGFzaHJlY29ucy5tbD4NCg0KICB0aGUgInBw eCByZXdyaXRlciI6DQogIDxodHRwczovL2dpdGh1Yi5jb20vY2hldG11cnRo eS9wYV9wcHgvYmxvYi9tYXN0ZXIvcGFfaGFzaHJlY29ucy9wYV9oYXNocmVj b25zLm1sPg0KDQogIFRoZSBwcm9qZWN0czoNCg0KICBjaGV0bXVydGh5L3Bh X3BweDogQSByZWltcGxlbWVudGF0aW9uIG9mIHBweF9kZXJpdmluZywgYWxs IGl0cw0KICBwbHVnaW5zLCBwcHhfaW1wb3J0LCBhbmQgYSBmZXcgb3RoZXJz Lg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vY2hldG11cnRoeS9wYV9wcHg+ DQoNCiAgY2hldG11cnRoeS9jYW1scDU6IENhbWxwNSwgdmVyc2lvbiBwcmUt OC4wMCBvbiB3aGljaCB0aGUgYWJvdmUgaXMNCiAgYmFzZWQuICBUaGlzIGlz IG9uIHRoZSBicmFuY2ggMjYuYXR0ZW1wdC1wYS1kZXJpdmluZyAuDQoNCg0K S2FrYWR1IHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIEkgZXhwZXJpbWVudGVkIHdpdGggdGhpcyBzb21lIHRpbWUgYWdv IGZvciBNTCB3b3Jrc2hvcC4gIFRoZSBpZGVhIHdhcw0KICB0byBwcm92aWRl IGZ1bmN0aW9uOiBgdCAtPiBodGJsIC0+IGh0YmwgKiB0JyB3aGljaCByZXdy aXRlcyB2YWx1ZSBvZg0KICB0eXBlIGB0JyBieSByZW1vdmluZyBlcXVhbCBz dWJ0cmVlcy4gRXNzZW50aWFsbHkgaXQgaXMganVzdCBhIGZvbGQNCiAgb3Zl ciBkYXRhIHR5cGUuDQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9rYWthZHUv R1QvYmxvYi9tYXN0ZXIvcmVncmVzc2lvbi90ZXN0ODE2aGFzaC5tbCNMNzQ+ DQoNCg0KQ2hldCBNdXJ0aHkgYXNrZWQgYW5kIEpvc2ggQmVyZGluZSByZXBs aWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICAgICAgICBJZiB5b3Ugd2FubmEgdXNlIGEgaGFzaHRhYmxlIChhbmQsIEkg cHJlc3VtZSwgT2JqLm1hZ2ljKQ0KICAgICAgICB5b3UgY2FuIHdyaXRlIGEg c2luZ2xlIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgdHJpY2sgZm9yDQogICAg ICAgIGFsbCBpbW11dGFibGUgZGF0YS10eXBlcywgcmlnaHQ/DQoNCiAgWWVz LCB3ZSBoYXZlIHNvbWUgbWFnaWMgQG1ib3Vheml6IFtjb2RlXSBpbiBJbmZl ciB0aGF0IGRvZXMgdGhpcyB0bw0KICBjcmVhdGUgYXMgbXVjaCBzaGFyaW5n IGFzIHBvc3NpYmxlIGFzIHZhbHVlcyBhcmUgTWFyc2hhbGVkIG91dC4NCg0K DQpbY29kZV0NCjxodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svaW5mZXIv YmxvYi9tYXN0ZXIvaW5mZXIvc3JjL2lzdGQvTWF4aW11bVNoYXJpbmcubWw+ DQoNCg0KR2VucHJpbnQgdjAuNA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tZ2VucHJpbnQtdjAtNC81NTc1LzE+DQoNCg0K cHJvZ21hbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEEgcmUtYW5ub3VuY2Vt ZW50IG9mIEdlbnByaW50LCBhIGdlbmVyYWwgdmFsdWUgcHJpbnRpbmcgbGli cmFyeSwgdGhhdA0KICBhZGRyZXNzZXMgcHJpb3IgbGltaXRhdGlvbnMgdGhh dCBtYWRlIGl0IG5vbmUgdG9vIHVzZWZ1bCENCg0KICAxLiBJdCBkaWRuJ3Qg d29yayBjb3JyZWN0bHkgZm9yIDQuMDguMCwgdGhlIGxhdGVzdCBjb21waWxl ciByZWxlYXNlIGFzDQogICAgIG9mIGZpcnN0IGFubm91bmNlbWVudCAodGhv dWdoIGZpbmUgZm9yIDQuMDIgLi4gNC4wNy4xKQ0KICAyLiBUaGVyZSB3YXMg YW4gYXdrd2FyZCBuZWVkIHRvIHNwZWNpZnkgYSBzZWFyY2ggcGF0aCBmb3Ig LmNtdCBmaWxlcw0KICAgICB3aGVuIHdvcmtpbmcgd2l0aCB0aGUgbGlrZXMg b2YgRHVuZSAod2hpY2ggdXNlcyBzZXBhcmF0ZQ0KICAgICBkaXJlY3Rvcmll cyBmb3Igc291cmNlLCAuY21pIGFuZCAoZm9yIG9wdCkgLmNtdCBmaWxlcykN CiAgMy4gTW9yZSBvZnRlbiB0aGFuIG5vdCB2YWx1ZXMgb2YgaW50ZXJlc3Qg d291bGQgZGlzcGxheSBzaW1wbHkgYXMNCiAgICAgYDxhYnN0cj4nIG93aW5n IHRvIHRoZSBwcmVzZW5jZSBvZiBzaWduYXR1cmUgYWJzdHJhY3Rpb24gb2Yg dGhlDQogICAgIG1vZHVsZSdzIHR5cGUgb2YgaW50ZXJlc3QuDQoNCiAgVGhl c2UgaXNzdWVzIGhhdmUgYmVlbiBhZGRyZXNzZWQ6DQogIDEuIFdvcmtzIHdp dGggdmVyc2lvbnMgNC4wNCAuLiA0LjEwLjAgKGVhcmxpZXIgdmVyc2lvbnMg YmVjYW1lIGludmFsaWQNCiAgICAgYWZ0ZXIgYSBkZXBlbmRlbmN5IGNoYW5n ZSB0byBwcHhsaWIpDQogIDIuIFRoZSBsb2NhdGlvbiBvZiAuY210IGZpbGVz IGlzIGNhcHR1cmVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFBQWA0KICAgICBw cmVwcm9jZXNzb3IuDQogIDMuIFNpZ25hdHVyZXMgYXQgdGhlIGltcGxlbWVu dGF0aW9uIGxldmVsICgubWxpIGZpbGVzKSBhbmQgaW50ZXJuYWxseQ0KICAg ICAoZnVuY3RvciBhcHBsaWNhdGlvbiBjb25zdHJhaW50cykgYXJlIHJlbW92 ZWQgdG8gcmV2ZWFsIHRoZSBpbm5lcg0KICAgICBzdHJ1Y3R1cmUgb2Ygb3Ro ZXJ3aXNlIGFic3RyYWN0IHZhbHVlcy4gIEZvciBpbnN0YW5jZSwgdGhlDQog ICAgIEVwaGVtZXJvbiBtb2R1bGU6DQogICAgIOKUjOKUgOKUgOKUgOKUgA0K ICAgICDilIIgbW9kdWxlIEVNPUVwaGVtZXJvbi5LMS5NYWtlKHN0cnVjdCB0 eXBlIHQ9aW50IGxldCBlcXVhbD0oPSkgbGV0IGhhc2g9SGFzaHRibC5oYXNo IGVuZCkNCiAgICAg4pSCIG9wZW4gRU0NCiAgICAg4pSCIGxldCBfPQ0KICAg ICDilIIgICBsZXQgdj1FTS5jcmVhdGUgMCBpbg0KICAgICDilIIgICBFTS5h ZGQgdiAxMjM0NTY3OCAnWCc7DQogICAgIOKUgiAgIGxldCBlbXByaW50IHBw ZiAodjogT2JqLkVwaGVtZXJvbi50KSA9DQogICAgIOKUgiAgICAgRm9ybWF0 LmZwcmludGYgcHBmICI8QyB3cmFwcGVyIG9mIGtleS9kYXRhPiIgaW4NCiAg ICAg4pSCICAgWyVpbnN0YWxsX3ByaW50ZXIgZW1wcmludF07DQogICAgIOKU giAgIFslcHIgZXBoZW0gdl07DQogICAgIOKUlOKUgOKUgOKUgOKUgA0KDQog ICAgIFdoaWNoIHByaW50czoNCiAgICAg4pSM4pSA4pSA4pSA4pSADQogICAg IOKUgiBlcGhlbSA9PiB7c2l6ZSA9IDE7DQogICAgIOKUgiAgICAgICAgICAg ZGF0YSA9DQogICAgIOKUgiAgICAgICAgICAgIFt8RW1wdHk7IEVtcHR5OyBF bXB0eTsgRW1wdHk7IEVtcHR5OyBFbXB0eTsgRW1wdHk7IEVtcHR5OyBFbXB0 eTsNCiAgICAg4pSCICAgICAgICAgICAgICBFbXB0eTsgRW1wdHk7IENvbnMg KDkyMjM4MTkxNSwgPEMgd3JhcHBlciBvZiBrZXkvZGF0YT4sIEVtcHR5KTsN CiAgICAg4pSCICAgICAgICAgICAgICBFbXB0eTsgRW1wdHk7IEVtcHR5OyBF bXB0eXxdOw0KICAgICDilIIgICAgICAgICAgIHNlZWQgPSAwOyBpbml0aWFs X3NpemUgPSAxNn0NCiAgICAg4pSU4pSA4pSA4pSA4pSADQogICAgIFRoaXMg YWxzbyBkZW1vcyB0aGUgWyVpbnN0YWxsX3ByaW50ZXJdIGZhY2lsaXR5IHdo aWNoIG1pcnJvcnMgdGhlDQogICAgIFJFUEwncy4NCg0KICBJbnN0YWxsYXRp b24gaXMgdmlhIHRoZSBPcGFtIG1haW4gcmVwb3NpdG9yeS4NCg0KICBBZGRp dGlvbmFsbHksIHRoZSBwcm9qZWN0IHJlcG9zaXRvcnkgW2NvbnRhaW5zXSB0 d28gY29tcGlsZXIgdmVyc2lvbnMNCiAgb2YgX29jYW1sZGVidWdfIGludGVn cmF0ZWQgd2l0aCB0aGUgR2VucHJpbnQgbGlicmFyeSB3aGljaCB0aGVyZWJ5 DQogIGJlY29tZXMgaXRzIGRlZmF1bHQgcHJpbnRlci4NCg0KICBBbGwgb2Yg d2hpY2ggbWFrZXMgdGhpcyBsaWJyYXJ5IG11Y2ggbW9yZSB1c2VmdWwgdGhh biBwcmV2aW91c2x5LiAgU2VlDQogIHRoZSBbcHJvamVjdCBwYWdlXSBmb3Ig dGhlIGRldGFpbHMuDQoNCg0KW2NvbnRhaW5zXQ0KPGh0dHBzOi8vZ2l0aHVi LmNvbS9wcm9nbWFuMS9nZW5wcmludGxpYi90cmVlL21hc3Rlci9kZWJ1Z2dl cj4NCg0KW3Byb2plY3QgcGFnZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9n bWFuMS9nZW5wcmludGxpYj4NCg0KDQpPdGhlciBPQ2FtbCBOZXdzDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KRnJvbSB0aGUgb2NhbWxjb3JlIHBsYW5ldCBibG9nDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBFZGl0 b3Igbm90ZTogVGhhbmtzIHRvIFtlemN1cmxdLCBJIGNhbiByZXN0b3JlIHRo aXMgc2VjdGlvbi4gSSdtDQogIHB1dHRpbmcgYWxsIHRoZSBsaW5rcyB0aGlz IHdlZWssIEkgd2lsbCBwcnVuZSB0byBvbmx5IHB1dCB0aGUgbmV3IG9uZXMN CiAgbmV4dCB3ZWVrLg0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBP Q2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFtPQ2FtbCBQbGFuZXRdLg0KDQog IOKAoiBbQW4gaW4tZGVwdGggTG9vayBhdCBPQ2FtbOKAmXMgbmV3IOKAnEJl c3QtZml04oCdIEdhcmJhZ2UgQ29sbGVjdG9yDQogICAgU3RyYXRlZ3ldDQog IOKAoiBbU2xpZGluZyBUaWxlIFB1enpsZSwgU2VsZi1Db250YWluZWQgT0Nh bWwgV2ViYXBwXQ0KICDigKIgW05ldyB2ZXJzaW9uIG9mIFRyeSBPQ2FtbCBp biBiZXRhIV0NCiAg4oCiIFtGcmFtYS1DbGFuZyAwLjAuOCBpcyBvdXQuIERv d25sb2FkIGl0IGhlcmUuXQ0KICDigKIgW0EgcmVhc29uYWJsZSBUeVhNTCBy ZWxlYXNlIHwgRHJ1cCdzIHRoaW5naWVzXQ0KICDigKIgW0FsdC1FcmdvIFVz ZXJz4oCZIENsdWIgQW5udWFsIE1lZXRpbmddDQogIOKAoiBbT0NhbWwgaU9T IEFwcHMgUG9ydGVkIHRvIEJyb3dzZXJdDQogIOKAoiBbV2F0Y2ggYWxsIG9m IEphbmUgU3RyZWV0J3MgdGVjaCB0YWxrc10NCiAg4oCiIFtNZXJjdXJpYWw6 IHByZXR0eWNvbmZpZyBleHRlbnNpb25dDQogIOKAoiBbTWVyY3VyaWFsIGV4 dGVuc2lvbnMgKHVwZGF0ZSldDQogIOKAoiBbMjAxOSBhdCBPQ2FtbFByb10N CiAg4oCiIFtCaXRidWNrZXQgcmVwb3NpdG9yeSBtaWdyYXRpb25dDQogIOKA oiBbVHJvdWJsZXNob290aW5nIHN5c3RlbWQgd2l0aCBTeXN0ZW1UYXBdDQog IOKAoiBbT2NzaWdlbiBTdGFydCB1cGRhdGVkXQ0KICDigKIgW09jc2lnZW4g U3RhcnQgdXBkYXRlZF0NCiAg4oCiIFtvcGFtIDIuMC42IHJlbGVhc2VdDQog IOKAoiBbb3BhbSAyLjAuNiByZWxlYXNlXQ0KICDigKIgW0hhY2tlcnMgYW5k IGNsaW1hdGUgYWN0aXZpc3RzIGpvaW4gZm9yY2VzIGluIExlaXB6aWddDQog IOKAoiBbRGVwbG95aW5nIGF1dGhvcml0YXRpdmUgT0NhbWwtRE5TIHNlcnZl cnMgYXMgTWlyYWdlT1MgdW5pa2VybmVsc10NCiAg4oCiIFtSZXByb2R1Y2li bGUgTWlyYWdlT1MgdW5pa2VybmVsIGJ1aWxkc10NCiAg4oCiIFtVc2luZyBQ eXRob24gYW5kIE9DYW1sIGluIHRoZSBzYW1lIEp1cHl0ZXIgbm90ZWJvb2td DQogIOKAoiBbQ29xIDguMTErYmV0YTEgaXMgb3V0XQ0KICDigKIgW0RlZXAt TGVhcm5pbmcgdGhlIEhhcmRlc3QgR28gUHJvYmxlbSBpbiB0aGUgV29ybGRd DQogIOKAoiBbRnJhbWEtQyAyMC4wIChDYWxjaXVtKSBpcyBvdXQuIERvd25s b2FkIGl0IGhlcmUuXQ0KICDigKIgW1Rlc3RpbmcgT0NhbWwgcmVsZWFzZXMg d2l0aCBvcGFtY2hlY2tdDQogIOKAoiBbQ29xIDguMTAuMiBpcyBvdXRdDQog IOKAoiBbQW5ub3VuY2luZyBJcm1pbiAyLjAuMF0NCiAg4oCiIFtCQVAgMi4w IGlzIHJlbGVhc2VkXQ0KICDigKIgW0NJL0NEIHBpcGVsaW5lczogTW9uYWQs IEFycm93IG9yIERhcnQ/XQ0KICDigKIgW09uIGZpeGVkLXBvaW50IHRoZW9y ZW1zIGluIHN5bnRoZXRpYyBjb21wdXRhYmlsaXR5XQ0KICDigKIgW1J1bm5l cnMgaW4gYWN0aW9uXQ0KICDigKIgW0NvcSA4LjEwLjEgaXMgb3V0XQ0KICDi gKIgW0Fubm91bmNpbmcgTWlyYWdlT1MgMy42LjBdDQogIOKAoiBbQ29tbWFz IGluIGJpZyBudW1iZXJzIGV2ZXJ5d2hlcmU6IEFuIE9wZW5UeXBlIGFkdmVu dHVyZV0NCiAg4oCiIFtDb3EgOC4xMC4wIGlzIG91dF0NCiAg4oCiIFtPQ2Ft bCBleHBlcnQgYW5kIGJlZ2lubmVyIHRyYWluaW5nIGJ5IE9DYW1sUHJvIChp biBGcmVuY2gpOg0KICAgIE5vdi4gNS02ICYgNy04XQ0KICDigKIgW01yLiBN SU1FIC0gUGFyc2UgYW5kIGdlbmVyYXRlIGVtYWlsc10NCiAg4oCiIFtBIGxv b2sgYmFjayBvbiBPQ2FtbCBzaW5jZSAyMDExXQ0KICDigKIgW0ZyYW1hLUMg MTkuMSAoUG90YXNzaXVtKSBpcyBvdXQuIERvd25sb2FkIGl0aGVyZS5dDQog IOKAoiBbQ29xIDguMTArYmV0YTMgaXMgb3V0XQ0KICDigKIgW1VwZGF0ZWQg Q2hlYXQgU2hlZXRzOiBPQ2FtbCBMYW5ndWFnZSBhbmQgT0NhbWwgU3RhbmRh cmQgTGlicmFyeV0NCiAg4oCiIFtGcmFtYS1DbGFuZyAwLjAuNyBpcyBvdXQu IERvd25sb2FkIGl0aGVyZS5dDQogIOKAoiBbRGVjb21wcmVzczogRXhwZXJp ZW5jZXMgd2l0aCBPQ2FtbCBvcHRpbWl6YXRpb25dDQogIOKAoiBbT24gY29t cGxldGUgb3JkZXJlZCBmaWVsZHNdDQogIOKAoiBbQW4gaW50cm9kdWN0aW9u IHRvIGZ1enppbmcgT0NhbWwgd2l0aCBBRkwsIENyb3diYXIgYW5kIEJ1bl0N CiAg4oCiIFtXaGF0IGlzIGFsZ2VicmFpYyBhYm91dCBhbGdlYnJhaWMgZWZm ZWN0cz9dDQogIOKAoiBbVGhlIGJsb2cgbW92ZWQgZnJvbSBXb3JkcHJlc3Mg dG8gSmVreWxsXQ0KICDigKIgW09DYW1sUHJv4oCZcyBjb21waWxlciB0ZWFt IHdvcmsgdXBkYXRlXQ0KICDigKIgW1doYXQgdGhlIGludGVybnMgaGF2ZSB3 cm91Z2h0LCAyMDE5IGVkaXRpb25dDQogIOKAoiBbRGVjb21wcmVzczogVGhl IE5ldyBEZWNvbXByZXNzIEFQSV0NCg0KDQpbZXpjdXJsXSA8aHR0cHM6Ly9n aXRodWIuY29tL2MtY3ViZS9lemN1cmw+DQoNCltPQ2FtbCBQbGFuZXRdIDxo dHRwOi8vb2NhbWwub3JnL2NvbW11bml0eS9wbGFuZXQvPg0KDQpbQW4gaW4t ZGVwdGggTG9vayBhdCBPQ2FtbOKAmXMgbmV3IOKAnEJlc3QtZml04oCdIEdh cmJhZ2UgQ29sbGVjdG9yIFN0cmF0ZWd5XQ0KPGh0dHA6Ly93d3cub2NhbWxw cm8uY29tLzIwMjAvMDMvMjMvb2NhbWwtbmV3LWJlc3QtZml0LWdhcmJhZ2Ut Y29sbGVjdG9yLz4NCg0KW1NsaWRpbmcgVGlsZSBQdXp6bGUsIFNlbGYtQ29u dGFpbmVkIE9DYW1sIFdlYmFwcF0NCjxodHRwOi8vcHNlbGxvcy5jb20vMjAy MC8wMy8yMDIwLjAzLmhvdy1pLXdyb3RlLWVsYXN0aWMtbWFuLmh0bWw+DQoN CltOZXcgdmVyc2lvbiBvZiBUcnkgT0NhbWwgaW4gYmV0YSFdDQo8aHR0cDov L3d3dy5vY2FtbHByby5jb20vMjAyMC8wMy8xNi9uZXctdmVyc2lvbi1vZi10 cnktb2NhbWwtaW4tYmV0YS8+DQoNCltGcmFtYS1DbGFuZyAwLjAuOCBpcyBv dXQuIERvd25sb2FkIGl0IGhlcmUuXQ0KPGh0dHA6Ly9mcmFtYS1jLmNvbS9p bmRleC5odG1sPg0KDQpbQSByZWFzb25hYmxlIFR5WE1MIHJlbGVhc2UgfCBE cnVwJ3MgdGhpbmdpZXNdDQo8aHR0cHM6Ly9kcnVwLmdpdGh1Yi5pby8yMDIw LzAzLzA2L3R5eG1sNDQwLz4NCg0KW0FsdC1FcmdvIFVzZXJz4oCZIENsdWIg QW5udWFsIE1lZXRpbmddDQo8aHR0cDovL3d3dy5vY2FtbHByby5jb20vMjAy MC8wMy8wMy9hbHQtZXJnby11c2Vyc3MtY2x1Yi1hbm51YWwtbWVldGluZy8+ DQoNCltPQ2FtbCBpT1MgQXBwcyBQb3J0ZWQgdG8gQnJvd3Nlcl0NCjxodHRw Oi8vcHNlbGxvcy5jb20vMjAyMC8wMi8yMDIwLjAyLmtpZC1jaGFybGVtYWdu ZS5odG1sPg0KDQpbV2F0Y2ggYWxsIG9mIEphbmUgU3RyZWV0J3MgdGVjaCB0 YWxrc10NCjxodHRwczovL2Jsb2cuamFuZXN0cmVldC5jb20vd2F0Y2gtYWxs LW9mLWphbmUtc3RyZWV0cy10ZWNoLXRhbGtzLz4NCg0KW01lcmN1cmlhbDog cHJldHR5Y29uZmlnIGV4dGVuc2lvbl0NCjxodHRwOi8vYmxvZy4wYnJhbmNo LmNvbS9wb3N0cy8yMDIwLTAyLTE1LXByZXR0eWNvbmZpZy1leHRlbnNpb24u aHRtbD4NCg0KW01lcmN1cmlhbCBleHRlbnNpb25zICh1cGRhdGUpXQ0KPGh0 dHA6Ly9ibG9nLjBicmFuY2guY29tL3Bvc3RzLzIwMjAtMDItMDUtaGctZXh0 ZW5zaW9ucy5odG1sPg0KDQpbMjAxOSBhdCBPQ2FtbFByb10NCjxodHRwOi8v d3d3Lm9jYW1scHJvLmNvbS8yMDIwLzAyLzA0LzIwMTktYXQtb2NhbWxwcm8v Pg0KDQpbQml0YnVja2V0IHJlcG9zaXRvcnkgbWlncmF0aW9uXQ0KPGh0dHA6 Ly9ibG9nLjBicmFuY2guY29tL3Bvc3RzLzIwMjAtMDItMDMtYml0YnVja2V0 LW1pZ3JhdGlvbi5odG1sPg0KDQpbVHJvdWJsZXNob290aW5nIHN5c3RlbWQg d2l0aCBTeXN0ZW1UYXBdDQo8aHR0cHM6Ly9ibG9nLmphbmVzdHJlZXQuY29t L3Ryb3VibGVzaG9vdGluZy1zeXN0ZW1kLXdpdGgtc3lzdGVtdGFwLz4NCg0K W09jc2lnZW4gU3RhcnQgdXBkYXRlZF0NCjxodHRwczovL29jc2lnZW4uZ2l0 aHViLmlvL2Jsb2cvMjAyMC8wMS8yMC9yZWxlYXNlLz4NCg0KW29wYW0gMi4w LjYgcmVsZWFzZV0NCjxodHRwOi8vd3d3Lm9jYW1scHJvLmNvbS8yMDIwLzAx LzE2L29wYW0tMi0wLTYtcmVsZWFzZS8+DQoNCltvcGFtIDIuMC42IHJlbGVh c2VdIDxodHRwczovL29wYW0ub2NhbWwub3JnL2Jsb2cvb3BhbS0yLTAtNi8+ DQoNCltIYWNrZXJzIGFuZCBjbGltYXRlIGFjdGl2aXN0cyBqb2luIGZvcmNl cyBpbiBMZWlwemlnXQ0KPGh0dHBzOi8vbWlyYWdlLmlvL2Jsb2cvY2NjLTIw MTktbGVpcHppZz4NCg0KW0RlcGxveWluZyBhdXRob3JpdGF0aXZlIE9DYW1s LUROUyBzZXJ2ZXJzIGFzIE1pcmFnZU9TIHVuaWtlcm5lbHNdDQo8aHR0cHM6 Ly9oYW5uZXMubnFzYi5pby9Qb3N0cy9EbnNTZXJ2ZXI+DQoNCltSZXByb2R1 Y2libGUgTWlyYWdlT1MgdW5pa2VybmVsIGJ1aWxkc10NCjxodHRwczovL2hh bm5lcy5ucXNiLmlvL1Bvc3RzL1JlcHJvZHVjaWJsZU9QQU0+DQoNCltVc2lu ZyBQeXRob24gYW5kIE9DYW1sIGluIHRoZSBzYW1lIEp1cHl0ZXIgbm90ZWJv b2tdDQo8aHR0cHM6Ly9ibG9nLmphbmVzdHJlZXQuY29tL3VzaW5nLXB5dGhv bi1hbmQtb2NhbWwtaW4tdGhlLXNhbWUtanVweXRlci1ub3RlYm9vay8+DQoN CltDb3EgOC4xMStiZXRhMSBpcyBvdXRdDQo8aHR0cHM6Ly9jb3EuaW5yaWEu ZnIvbmV3cy9jb3EtOC0xMWJldGExLWlzLW91dC5odG1sPg0KDQpbRGVlcC1M ZWFybmluZyB0aGUgSGFyZGVzdCBHbyBQcm9ibGVtIGluIHRoZSBXb3JsZF0N CjxodHRwczovL2Jsb2cuamFuZXN0cmVldC5jb20vZGVlcC1sZWFybmluZy10 aGUtaGFyZGVzdC1nby1wcm9ibGVtLWluLXRoZS13b3JsZC8+DQoNCltGcmFt YS1DIDIwLjAgKENhbGNpdW0pIGlzIG91dC4gRG93bmxvYWQgaXQgaGVyZS5d DQo8aHR0cDovL2ZyYW1hLWMuY29tL2luZGV4Lmh0bWw+DQoNCltUZXN0aW5n IE9DYW1sIHJlbGVhc2VzIHdpdGggb3BhbWNoZWNrXQ0KPGh0dHA6Ly9nYWxs aXVtLmlucmlhLmZyL2Jsb2cvYW4tb2NhbWwtcmVsZWFzZS1zdG9yeS0xPg0K DQpbQ29xIDguMTAuMiBpcyBvdXRdIDxodHRwczovL2NvcS5pbnJpYS5mci9u ZXdzL2NvcS04LTEwLTItaXMtb3V0Lmh0bWw+DQoNCltBbm5vdW5jaW5nIEly bWluIDIuMC4wXSA8aHR0cHM6Ly9taXJhZ2UuaW8vYmxvZy9pbnRyb2R1Y2lu Zy1pcm1pbi12Mj4NCg0KW0JBUCAyLjAgaXMgcmVsZWFzZWRdDQo8aHR0cDov L2JpbmFyeWFuYWx5c2lzcGxhdGZvcm0uZ2l0aHViLmlvL2JhcC0yLXJlbGVh c2U+DQoNCltDSS9DRCBwaXBlbGluZXM6IE1vbmFkLCBBcnJvdyBvciBEYXJ0 P10NCjxodHRwczovL3Jvc2NpZHVzLmNvbS9ibG9nL2Jsb2cvMjAxOS8xMS8x NC9jaWNkLXBpcGVsaW5lcy8+DQoNCltPbiBmaXhlZC1wb2ludCB0aGVvcmVt cyBpbiBzeW50aGV0aWMgY29tcHV0YWJpbGl0eV0NCjxodHRwOi8vbWF0aC5h bmRyZWouY29tLzIwMTkvMTEvMDcvb24tZml4ZWQtcG9pbnQtdGhlb3JlbXMt aW4tc3ludGhldGljLWNvbXB1dGFiaWxpdHkvPg0KDQpbUnVubmVycyBpbiBh Y3Rpb25dDQo8aHR0cDovL21hdGguYW5kcmVqLmNvbS8yMDE5LzEwLzI4L3J1 bm5lcnMtaW4tYWN0aW9uLz4NCg0KW0NvcSA4LjEwLjEgaXMgb3V0XSA8aHR0 cHM6Ly9jb3EuaW5yaWEuZnIvbmV3cy9jb3EtOC0xMC0xLWlzLW91dC5odG1s Pg0KDQpbQW5ub3VuY2luZyBNaXJhZ2VPUyAzLjYuMF0NCjxodHRwczovL21p cmFnZS5pby9ibG9nL2Fubm91bmNpbmctbWlyYWdlLTM2LXJlbGVhc2U+DQoN CltDb21tYXMgaW4gYmlnIG51bWJlcnMgZXZlcnl3aGVyZTogQW4gT3BlblR5 cGUgYWR2ZW50dXJlXQ0KPGh0dHBzOi8vYmxvZy5qYW5lc3RyZWV0LmNvbS9j b21tYXMtaW4tYmlnLW51bWJlcnMtZXZlcnl3aGVyZS8+DQoNCltDb3EgOC4x MC4wIGlzIG91dF0gPGh0dHBzOi8vY29xLmlucmlhLmZyL25ld3MvY29xLTgt MTAtMC1pcy1vdXQuaHRtbD4NCg0KW09DYW1sIGV4cGVydCBhbmQgYmVnaW5u ZXIgdHJhaW5pbmcgYnkgT0NhbWxQcm8gKGluIEZyZW5jaCk6IE5vdi4gNS02 ICYNCjctOF0NCjxodHRwOi8vd3d3Lm9jYW1scHJvLmNvbS8yMDE5LzA5LzI1 L29jYW1sLWV4cGVydC1hbmQtYmVnaW5uZXItdHJhaW5pbmctYnktb2NhbWxw cm8taW4tZnJlbmNoLW5vdi01LTYtNy04Lz4NCg0KW01yLiBNSU1FIC0gUGFy c2UgYW5kIGdlbmVyYXRlIGVtYWlsc10NCjxodHRwczovL3RhcmlkZXMuY29t L2Jsb2cvMjAxOS0wOS0yNS1tci1taW1lLXBhcnNlLWFuZC1nZW5lcmF0ZS1l bWFpbHMuaHRtbD4NCg0KW0EgbG9vayBiYWNrIG9uIE9DYW1sIHNpbmNlIDIw MTFdDQo8aHR0cDovL3d3dy5vY2FtbHByby5jb20vMjAxOS8wOS8yMC9hLWxv b2stYmFjay1vbi1vY2FtbC8+DQoNCltGcmFtYS1DIDE5LjEgKFBvdGFzc2l1 bSkgaXMgb3V0LiBEb3dubG9hZCBpdGhlcmUuXQ0KPGh0dHA6Ly9mcmFtYS1j LmNvbS9pbmRleC5odG1sPg0KDQpbQ29xIDguMTArYmV0YTMgaXMgb3V0XQ0K PGh0dHBzOi8vY29xLmlucmlhLmZyL25ld3MvY29xLTgtMTBiZXRhMy1pcy1v dXQuaHRtbD4NCg0KW1VwZGF0ZWQgQ2hlYXQgU2hlZXRzOiBPQ2FtbCBMYW5n dWFnZSBhbmQgT0NhbWwgU3RhbmRhcmQgTGlicmFyeV0NCjxodHRwOi8vd3d3 Lm9jYW1scHJvLmNvbS8yMDE5LzA5LzEzL3VwZGF0ZWQtY2hlYXQtc2hlZXRz LW9jYW1sLWxhbmd1YWdlLWFuZC1vY2FtbC1zdGFuZGFyZC1saWJyYXJ5Lz4N Cg0KW0ZyYW1hLUNsYW5nIDAuMC43IGlzIG91dC4gRG93bmxvYWQgaXRoZXJl Ll0NCjxodHRwOi8vZnJhbWEtYy5jb20vaW5kZXguaHRtbD4NCg0KW0RlY29t cHJlc3M6IEV4cGVyaWVuY2VzIHdpdGggT0NhbWwgb3B0aW1pemF0aW9uXQ0K PGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDE5LTA5LTEzLWRlY29tcHJl c3MtZXhwZXJpZW5jZXMtd2l0aC1vY2FtbC1vcHRpbWl6YXRpb24uaHRtbD4N Cg0KW09uIGNvbXBsZXRlIG9yZGVyZWQgZmllbGRzXQ0KPGh0dHA6Ly9tYXRo LmFuZHJlai5jb20vMjAxOS8wOS8wOS9vbi1jb21wbGV0ZS1vcmRlcmVkLWZp ZWxkcy8+DQoNCltBbiBpbnRyb2R1Y3Rpb24gdG8gZnV6emluZyBPQ2FtbCB3 aXRoIEFGTCwgQ3Jvd2JhciBhbmQgQnVuXQ0KPGh0dHBzOi8vdGFyaWRlcy5j b20vYmxvZy8yMDE5LTA5LTA0LWFuLWludHJvZHVjdGlvbi10by1mdXp6aW5n LW9jYW1sLXdpdGgtYWZsLWNyb3diYXItYW5kLWJ1bi5odG1sPg0KDQpbV2hh dCBpcyBhbGdlYnJhaWMgYWJvdXQgYWxnZWJyYWljIGVmZmVjdHM/XQ0KPGh0 dHA6Ly9tYXRoLmFuZHJlai5jb20vMjAxOS8wOS8wMy93aGF0LWlzLWFsZ2Vi cmFpYy1hYm91dC1hbGdlYnJhaWMtZWZmZWN0cy8+DQoNCltUaGUgYmxvZyBt b3ZlZCBmcm9tIFdvcmRwcmVzcyB0byBKZWt5bGxdDQo8aHR0cDovL21hdGgu YW5kcmVqLmNvbS8yMDE5LzA5LzAzL3RoZS1ibG9nLW1vdmVkLWZyb20td29y ZHByZXNzLXRvLWpla3lsbC8+DQoNCltPQ2FtbFByb+KAmXMgY29tcGlsZXIg dGVhbSB3b3JrIHVwZGF0ZV0NCjxodHRwOi8vd3d3Lm9jYW1scHJvLmNvbS8y MDE5LzA4LzMwL29jYW1scHJvcy1jb21waWxlci10ZWFtLXdvcmstdXBkYXRl Lz4NCg0KW1doYXQgdGhlIGludGVybnMgaGF2ZSB3cm91Z2h0LCAyMDE5IGVk aXRpb25dDQo8aHR0cHM6Ly9ibG9nLmphbmVzdHJlZXQuY29tL3doYXQtdGhl LWludGVybnMtaGF2ZS13cm91Z2h0LTIwMTkvPg0KDQpbRGVjb21wcmVzczog VGhlIE5ldyBEZWNvbXByZXNzIEFQSV0NCjxodHRwczovL3RhcmlkZXMuY29t L2Jsb2cvMjAxOS0wOC0yNi1kZWNvbXByZXNzLXRoZS1uZXctZGVjb21wcmVz cy1hcGkuaHRtbD4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDi lZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4g W3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlv dSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUg W1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFs c28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91 IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0 dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2ht aXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRw Oi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9m IHRoZSBhcmNoaXZlc10gPGh0dHA6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9j d24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5v cmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1p dHRdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of April 14 to 21, 2020.

Current_incr: a small incremental library with no dependencies=

Thomas Leonard announced

The recent OCurrent 0.2 release included a little incremental library which might be interesting to some people. It is useful= for writing programs that need to keep some computation up-to-date efficiently as the inputs change.

It is similar to the existing incremental and react libraries already= in opam. Unlike incremental (which pulls in the whole of core_kernel), current_incr has no runtim= e dependencies (and build dependencies only on ocaml and dune). Unlike react, current_incr im= mediately stops computations when they are no longer needed (rather than relying on weak references and the garbage collector).

It is a fairly direct implementation of the Adaptive Functional Programming paper, and might be a good starting point for people wanting to learn about that.

You can get the library using opam:

opam install current_incr

Here's a simple example (in utop):

#require "current_incr";;

let total =3D Curre=
nt_incr.var 10
let complete =3D Cu=
rrent_incr.var 5

let status =3D
  Current_incr.of_cc begin
    Current_incr.read (Current_incr.of_var total) @@ function
    | 0 -> Current_incr.write "No jobs"
    | total ->
      Current_incr.read (Current_incr.of_var complete) @@ fun complete ->
      let frac =3D float_of_int complete /. float_of_=
int total in
      Printf.sprintf "%d/%d jobs complete (%.1f%%)"
                     complete total (100. *. frac)
      |> Current_incr.write
  end

This defines two input variables (total and complete) and a "changeable computation" (status) whose output depends on them. At the top-level, we can observe the initial state using <= code>observe:

# print_endline Current_incr.observe sta=
tus;;
5/10 jobs complete (50.0%)

Unlike a plain ref cell, a Current_incr.var keeps= track of which computations depend on it. After changing them, you must call propagate to update the results:

# Current_incr=
.change total 12;;
# Current_incr.change complete 4;;
# print_endline @@ Current_incr.observe status;;
5/10 jobs complete (50.0%)      (* Not y=
et updated *)

# Current_incr.propagate ();
# print_endline @@ Current_incr.observe status;;
4/12 jobs complete (33.3%)

Computations can have side-effects, and you can use on_release= to run some compensating action if the computation needs to be undone later. Here's a function that publishes a result, and al= so registers a compensation for it:

let publish msg =3D
  Printf.printf "PUBLISH: %s\n%!" msg;
  Current_incr.on_release @@ fun =
() ->
  Printf.printf "RETRACT: %s\n%!" msg

It can be used like this:

# let display =3D Current_incr.map publish status;;
PUBLISH: =
4/12 jobs complete (33.3%)

# Current_incr.change total 0;
# Current_incr.propagate ()
RETRACT: =
4/12 jobs complete (33.3%)
PUBLISH: =
No jobs

A major difference between this and the react library (which I've used in p= reviously in 0install's progre= ss reporting and CueKeeper) is that Current_incr does not depend on the garbage collector to decide when to stop a computation. I= n react, you'd have to be careful to make sure that display didn't get GC'd (even though you don't need = to refer to it again) because if it did then the output would stop getting updated. Also, setting total to 0 in react might cause the program to crash with a division-by-zero exception, because the frac computation will = continue running until it gets GC'd, even though it isn't needed for anything now.

Current_incr's API is pretty small. You might want to wrap it to provide extra features, e.g.

  • Use of a result type to propagate errors.
  • Integration with Lwt to allow asynchronous computations.
  • Static analysis to render your computation with graphviz.
  • Persistence of state to disk.

If you need that, consider using the main OCurrent library, which extends current_incr with these features.

Scikit-learn for OCaml

UnixJunkie announced

Ronan Lehy just hacked this:

https://github.com/lehy/o= caml-sklearn

This might interest a significant number of people out there. We are no more condemned to live in a world full of snakes that will bite us at run-time. :smiley:

Ronan Le Hy then said

So I came here to announce ocaml-sklearn as it just got published on Opam, = but I see @UnixJunkie did it for me (arigato gozai masu). Anyway:

  • this ambitions to cover the complete scikit-learn API
  • this ambition is currently not totally realized, but I wanted to releas= e something initial that one can play with
  • it's all @UnixJunkie's fault with his funny R wrappers.

So:

Anton Kochkov then added

OCaml and opam container images updated: new Fedora/Alpine/Ubu= ntu images

Anil Madhavapeddy announced

The Docker ocaml and opam = container images have been updated:

  • Alpine 3.11, Fedora 31 and Ubuntu 20.04 (beta) are now included.
  • Ubuntu 19.04 and Fedora 29 and 30 are now deprecated.
  • OCaml 4.09.1 and 4.11.0~dev have been refreshed.

You can find the full details of the container images available on the OCaml infra= structure wiki.

The containers are generated from a set of scripts using ocaml-dockerfile, = and will be migrating over the next six months to use an ocurrent-based infrastructure. Ther= e will be an announcement on this forum about any user-facing changes that involves, with plenty of time to transition your o= wn CIs over. Thanks go to @talex5 and @XVilka for contributions to this round of updates.

OCamlformat 0.14.0

Jules announced

As Etienne mentioned, we have released OCamlformat 0.14.1, reverting the ch= ange to the defaults and our plans to deprecate the doc-comments option.

For projects that already upgraded to 0.14.0 (eg. Coq), the doc-comme= nts option will change its meaning again. It is necessary to add doc-comments=3Dbefore to have the document= ation comments placed before. Moreover, the new option doc-comments-val added in 0.14.0 has = a higher precedence than doc-comments, even when it's not set. It is thus necessary to set them both to before = to have the old "before" behavior. This will be improved in the next release (see https://github.com/ocaml-ppx/ocamlformat= /pull/1340).

Thank you to our early adopters to bear us. We are improving our release pr= ocess to reduce confusion for the next updates. As usual, if you have any feedback, please open an issue on https://github.com/ocaml-ppx= /ocamlformat to discuss it with us.

Hashconsing an AST via PPX

Chet Murthy announced

[up-front (so nobody gets the wrong idea): I'm not pushing Camlp5. Rather, I'm just noting that this sort of thing is really easy to do, and I encourage someone to do something similar using the PPX infrastructure.]

I didn't want to derail the "Future of PPX" thread, so I thought I'd post separately to answer ivg@ 's issue about hashconsing of ASTs using PPX. It's actually [uh, I think] really, really easy to implement hashconsing of ADTs, using a PPX extension. On a lark, I decided to do it today, and while the code I've got isn't sufficient to use, I think it's not very far away, and I have the perfect use-case already in-mind. It took me two hours to implement the rewriter and the testcase, on top of the other infrastructure, which has no support for hashconsing of any sort.

Here are some examples of data-types and functions that are automaticaly hash-consed. The idea is that in the pattern-match the pattern is annotated with a variable (in this example, "z"); the expression that is supposed to be hash-consed against that pattern is annotated with that same variable. [The code that descends to the expression is a little weak right now, but I think that's easily fixable.] The algorithm goes as follows:

(1) "decorate" the pattern with "as z_<integer>" variables everywhere in constructors. This allows us to refer to parts of the original value.

(2) then find each expression that is marked with that same varable. Structurally descend the pattern and the expression in parallel and generate code to compare sub-structure and hashcons where appropriate.

And that's really it. I'm sure this can be implemented using the PPX tools.

Some comments: (1) what's nice, is that we can just take already-written code like List.map and annotate it; that generates a hash-cons= ed version. And since the generated code never uses deep structural equality (only pointer-equality) it should be only marginally slower than the original implementation.

(2) The variable in the annotation ("z") is used as the base for generating a whole slew of fresh variables, and I don't bother (yet) to check for clashes; this (again) is straightforward, but hey, I started two hours ago.

type t =3D Leaf of int | Node of t * =
int * t

module HCList =3D struct

let rec map f =3D function
    [][@hashrecons z] -> [][@hashrecons z]
  | (a::l=
)[@hashrecons z] -> let r =3D f a in ((r :=
: map f l)[@hashrecons z])

end

let deep =3D
let rec deep =3D (function
  Leaf n<=
span style=3D"color: #483d8b;">[@hashrecons z] -> Leaf n[@hashrecons z]
| Node (l=
, n, r) [@hashrecons z] ->
  Node (d=
eep l, n, deep r) [@hashrecons z]
  )
[@@ocaml.warning "-26"]
in deep

type sexp =3D
  | Atom =
of string
  | List =
of sexp list

let sexp_deep =3D
  let rec deep =3D function
      Atom s[@hashrecons z] -> Atom s[@hashrecons z]
    | List l[@hashrecons z] -> List (HCList.map deep l)=
[@hashrecons z]
  in deep

Links: First, at the commit, so they won't change

the testcase file: https://github.= com/chetmurthy/pa_ppx/commit/5dd6b2ef3ca3677e11a0ad696074200101bd661f#diff-= e6dffe78fc6c27bdffa41970c4a7f1ca

the "ppx rewriter": https://github.= com/chetmurthy/pa_ppx/commit/5dd6b2ef3ca3677e11a0ad696074200101bd661f#diff-= 24aeaf51366017948f5735727f001c85

Second, the files with human-readable names, etc.:

the testcase: https://github.com/chetmurthy/pa_ppx/blob/master/t= ests/test_hashrecons.ml

the "ppx rewriter": https://github.com/chetmurthy/pa_ppx/b= lob/master/pa_hashrecons/pa_hashrecons.ml

The projects:

chetmurthy/pa_ppx: A reimplementation of ppx_deriving, all its plugins, ppx= _import, and a few others.

https://github.com/chetmur= thy/pa_ppx

chetmurthy/camlp5: Camlp5, version pre-8.00 on which the above is based. T= his is on the branch 26.attempt-pa-deriving .

Kakadu said

I experimented with this some time ago for ML workshop. The idea was to provide function: t -> htbl -> htbl * t = which rewrites value of type t by removing equal subtrees. Essentially it is just a fold over data type.

https://github.com/kakadu/GT/blob/master/regression/test816hash.ml#= L74

Chet Murthy asked and Josh Berdine replied

If you wanna use a hashtable (and, I presume, Obj.magic) you can write a si= ngle function that does the trick for all immutable data-types, right?

Yes, we have some magic @mbouaziz code in Infer that does this to create as much sharing as possible as values are Marshaled out.

Genprint v0.4

progman announced

A re-announcement of Genprint, a general value printing library, that addre= sses prior limitations that made it none too useful!

  1. It didn't work correctly for 4.08.0, the latest compiler release as of = first announcement (though fine for 4.02 .. 4.07.1)
  2. There was an awkward need to specify a search path for .cmt files when = working with the likes of Dune (which uses separate directories for source,= .cmi and (for opt) .cmt files)
  3. More often than not values of interest would display simply as &l= t;abstr> owing to the presence of signature abstraction of the mo= dule's type of interest.

These issues have been addressed:

  1. Works with versions 4.04 .. 4.10.0 (earlier versions became invalid af= ter a dependency change to ppxlib)
  2. The location of .cmt files is captured automatically by the PPX preproc= essor.
  3. Signatures at the implementation level (.mli files) and internally (functor= application constraints) are removed to reveal the inner structure of othe= rwise abstract values. For instance, the Ephemeron module:

    module EM=3DEphemeron.K1.Make(struct type t=3Dint let equal=3D(=3D) =
    let hash=3DHashtbl.=
    hash end)
    open EM
    let _=3D
      let v=3DEM.c=
    reate 0 in
      EM.add v 12345678 'X';
      let emprint ppf (v: Obj.Ephemeron.t) =3D
        Format.fprintf ppf "<C wrapper of key/data>" in
      [%install_prin=
    ter emprint[%pr ep=
    hem v];
    

    Which prints:

    ephem =3D> {size =3D 1;
              data =3D
               [|Empty; Empty; Empty; Empty; Empty; Empty; Empty; Empty; Empty;
                 Empty; Empty; Cons (922381915, <C wrapper of key/data>, =
    Empty);
                 Empty; Empty; Empty; Empty|];
              seed =3D 0; initial_size =3D 16}
    

    This also demos the [%install_printer] facility which mirrors the REPL's.

Installation is via the Opam main repository.

Additionally, the project repository contains two compiler versions of ocamldebug integrated= with the Genprint library which thereby becomes its default printer.

All of which makes this library much more useful than previously. See the project page for the details.

Other OCaml News

From the ocamlcore planet blog

Editor note: Thanks to ezcurl<= /a>, I can restore this section. I'm putting all the links this week, I wil= l prune to only put the new ones next week.

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=--