From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 20BE97F449 for ; Tue, 7 Apr 2020 09:51:25 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=3SsL=5X=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.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=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=3SsL=5X=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 (mail2-smtp-roc.national.inria.fr: domain of SRS0=3SsL=5X=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=3SsL=5X=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=3SsL=5X=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.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=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=3SsL=5X=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=3ArPoK3xKzuYfFtgFQ8dmcpTZWNBhigK39O0sv0rFi?= =?us-ascii?q?tYgXKPX4rarrMEGX3/hxlliBBdydt6sZzbOK+Pm6AyRAuc/H7CleNsQUFlcsso?= =?us-ascii?q?Y/oU8JOIa9E0r1LfrnPWQRPf9pcxtbxUy9KlVfA83kZlff8TWY5D8WHQjjZ0Iu?= =?us-ascii?q?frymUoHdgN6q2O+s5pbdfxtHhCanYbN1MR66sRjdutMZjId/Kqs90AbFr3RHd+?= =?us-ascii?q?hL229kO0+YkxLg6sut5pJu/Dlctv07+8JcTan2erkzQKBFAjghL20668rnuAXZ?= =?us-ascii?q?QwCS/HUcSGIWkhRJAwjB8h73W4r6vzX5uORgxiSUJNX6Qr8oVzus6adrUwLohz?= =?us-ascii?q?wcNzEl6mHXi9d/g7xdrRm8uhFw2Y/UYIWSNPpjYqPQeM4RSGRdUspNUSFKH4Sz?= =?us-ascii?q?YZYSD+oaJeZXsZXyp0cAoxu5AAmjHuLvyjlVjXPy0qA31+EtHAfG0AIjGdIOrn?= =?us-ascii?q?XUrM70NKgJVeC60rTDzDvEb/NMxDj985XDfhQvrP2QWL59d9fax0syGAPfllie?= =?us-ascii?q?qZLrMS6b2OoOvGeU8/FtWvizh2M9sQx9viSjy8Uqh4LUhowV0FfE9SBhzYspId?= =?us-ascii?q?23Ukh7asO5HpRMtyGaMop2Qt8+Q2p1vys10LkGtoS9fCQQ05Qo2x7fa/mGc4iU?= =?us-ascii?q?/hLuT/6RITB8hHNlZLKwmQq98Uimyu39T8m0zUhFojBCktnWuXAAzhre4dWJRP?= =?us-ascii?q?t6+0euwzeP1wbL5+FcP080iavbK4I/zb4okZoTtEHDETHslEXwkqCWal0o+u+0?= =?us-ascii?q?5Ov9Z7XmooWQN4huigHxKqgulc2/Afg4MggTRGeX4/iz1Lrm/UHhT7VKj+E2kq?= =?us-ascii?q?nEsJ/BP8gbp6m5DxdU0oYl8Ra/Di2p3M4WnXkdNF5FYxOHj4fxO1HKOv/4C+2z?= =?us-ascii?q?g1O2kDdk3/zGPrrhAonRIXjZiLftZ6py60lZyAYr0d9f54hbCqsOIPLuREDxrs?= =?us-ascii?q?bXDgIkPACuxObnEtp92psRWWKVGKCZKKPSsUGJ5uMuOeWMY5UVuDnlJ/gk+vHv?= =?us-ascii?q?jXs5mVsHcamux5sXZ3a1FellLUWBeXfgn8kNHGMQsgYjUODnh0eOXDBPa3qoUa?= =?us-ascii?q?8x6Sk3BYClAIvZWIygj6KN0D2mEpBZfGxKF1+BHWvueo6ZQfkDcjiSLdVkkjEc?= =?us-ascii?q?VbiuVYsh1Ra2uQ//xLtrM/DY+jUftZLn1Nl1+/Pcmg0y9TxyDsSdynyNQH9ukm?= =?us-ascii?q?MPXT8207hzoU17ylidzah1m+FUGcJX6v9TTws2KZHRw/Z0BtzuQA7McNiERE6j?= =?us-ascii?q?Qtq8ADExStwxw8UJY0Z4A9iskwzN0Te2D7INmbGFGYc0/KTE0nXxJslw027G1K?= =?us-ascii?q?4lj1gmXstAK3Gphq559wjSHo7JjluWm7ytdaQG0y7A7H2MzW6Us0FeSgJwSrnK?= =?us-ascii?q?XXAaZkvXsdT5+ljPQKSpCbQ6NAtO1dCNKrBQZt3sglhHS+3vONPEY2K+g2uwHw?= =?us-ascii?q?qHxquQbIr2fGUQxDnSB1IBkwAX5HqGMQk+Bjy9o2/FFzxvFVfvY1v2/uVkqXO7?= =?us-ascii?q?SFU0zwCQYEF72bq14E1dufvJAfcM2PhM7CM+rR1wA1D72d/KXZ7I7QF+eu8UKY?= =?us-ascii?q?c2/1Fv0WPCqxc7P5CxK6QkgUQRJUA/tErr01BzC55cuckstnIjigRobeqT11ZZ?= =?us-ascii?q?XzeZxozrfLrNIGju9RShbL6Q10yN/syR//Im7P0+427ovASoClZqp3xj2t8TyH?= =?us-ascii?q?Cc45TWECIKVpbgTks89x57vqzXJC4n6NWHhjVXLaCov2qaiJoSD+w/x0P/Lo4C?= =?us-ascii?q?YpPBLxf7FoghP+brKOEunALyPBcUZaZK86olI86td/2HwbOmeuF6k2D/1DgV0M?= =?us-ascii?q?VGykuJshFEZKvQxZ9ckqOA2Q+WSzr3jFGgq93634deamNLRzvt+W3fHIdUI5ZK?= =?us-ascii?q?U8MOAGaqLdeww4wh1ZTqRnhT+UXlAg8WnsizdkjLYg=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DgBQCKMIxehyIeaIFgBhaDUFiBGFUyK?= =?us-ascii?q?oQbiQGFe4UfhEVjizeHBQNQBQkBAwEMGAEOBQECBAEBgVCDDYIzHQYBBTMTAhA?= =?us-ascii?q?BAQUBAQECAQIDBAETAQEBCgsJCCmFXQyCOwwMAwODHAMBGAECBgQGOyojAxQBB?= =?us-ascii?q?gMCBA0BFwEUChcBCQkUBgGDCwGCfAQBCpQFm3l/M4Q1AQMDAgsDDy9Bg1CBPw0?= =?us-ascii?q?CE38XhSODF4NTJg+BTD+BEYISUGyBQYENDgsBAQEBAQGBGBMNBwEBEAGDIReCR?= =?us-ascii?q?wSLT4InGAMkA4hwYIcogTdTjmp6B4JAfASFSjVxhV2Dc0+FOIJOM1GDT4NlhF2?= =?us-ascii?q?MHyGPFoFShT5wgSaFQ4gIgTKEKoE/KoFIHgwHMxowgngBMwlfDVYBjVIXgQQBA?= =?us-ascii?q?oJJgT6BJoEkUTuFEzA/MwIBAQeBFwEBBRMLAYtBAiaCGwEB?= X-IPAS-Result: =?us-ascii?q?A0DgBQCKMIxehyIeaIFgBhaDUFiBGFUyKoQbiQGFe4UfhEV?= =?us-ascii?q?jizeHBQNQBQkBAwEMGAEOBQECBAEBgVCDDYIzHQYBBTMTAhABAQUBAQECAQIDB?= =?us-ascii?q?AETAQEBCgsJCCmFXQyCOwwMAwODHAMBGAECBgQGOyojAxQBBgMCBA0BFwEUChc?= =?us-ascii?q?BCQkUBgGDCwGCfAQBCpQFm3l/M4Q1AQMDAgsDDy9Bg1CBPw0CE38XhSODF4NTJ?= =?us-ascii?q?g+BTD+BEYISUGyBQYENDgsBAQEBAQGBGBMNBwEBEAGDIReCRwSLT4InGAMkA4h?= =?us-ascii?q?wYIcogTdTjmp6B4JAfASFSjVxhV2Dc0+FOIJOM1GDT4NlhF2MHyGPFoFShT5wg?= =?us-ascii?q?SaFQ4gIgTKEKoE/KoFIHgwHMxowgngBMwlfDVYBjVIXgQQBAoJJgT6BJoEkUTu?= =?us-ascii?q?FEzA/MwIBAQeBFwEBBRMLAYtBAiaCGwEB?= X-IronPort-AV: E=Sophos;i="5.72,353,1580770800"; d="scan'208,217";a="444163936" X-MGA-submission: =?us-ascii?q?MDGLKGXXDn+eRcdTNZtCngUyqltEaA+UchPYLh?= =?us-ascii?q?jUZWyD0IP4VllHIU/cgFR+F3kvgB5b5j0Z9L4Wz2G6YkCKNGsuM7gy4w?= =?us-ascii?q?/dhp3WZHC/jB7vnAjbS03b94BNm9qECYV3CJbhJoXL9mcepIxGjRiFj8?= =?us-ascii?q?Y3LdtLdRf2SLqZR94AVKoKpA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 07 Apr 2020 09:51:17 +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 630C75646C9; Tue, 7 Apr 2020 09:51:14 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 07 Apr 2020 09:51:13 +0200 Message-ID: <87y2r7enta.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 7 09:51:15 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.001075, queueID=DF58B5646CC 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 LCBmb3IgdGhlIHdlZWsgb2YgTWFyY2ggMzEgdG8gQXByaWwNCjA3LCAyMDIw Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCk1ha2luZyBhIG11 c2ljIHBsYXllciBpbiBPQ2FtbA0KVGhlIGVuZCBvZiBDYW1scDQNCk9DYW1s Zm9ybWF0IDAuMTQuMA0KTUwgRmFtaWx5IFdvcmtzaG9wIDIwMjA6IENhbGwg Zm9yIHByZXNlbnRhdGlvbnMNCkFubm91bmNpbmcgU2VrLCBhbiBlZmZpY2ll bnQgaW1wbGVtZW50YXRpb24gb2Ygc2VxdWVuY2VzDQpBbm5vdW5jaW5nIGR1 bmUtZGVwczogcHJvZHVjZXMgYSBwcm9qZWN0LWNlbnRyaWMgZGVwZW5kZW5j eSBncmFwaA0KT0NhbWwgVXNlcnMgYW5kIERldmVsb3BlcnMgTWVldGluZyAy MDIwDQpPbGQgQ1dODQoNCg0KTWFraW5nIGEgbXVzaWMgcGxheWVyIGluIE9D YW1sDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L21ha2luZy1hLW11c2ljLXBsYXllci1pbi1vY2FtbC81NDEzLzE+ DQoNCg0KRHJhY29zZSBhc2tlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdtIGludGVyZXN0ZWQgaW4gbWFraW5n IG15IG93biBtdXNpYyBwbGF5ZXIgaW4gT0NhbWwgc28gSSB3YW50ZWQgdG8N CiAga25vdyB3aGV0aGVyIHRoZXJlIHdlcmUgYW55IGV4aXN0aW5nIG9uZXMg YW5kL29yIGV4YW1wbGVzIG9mIGhvdyB0bw0KICBtYWtlIG9uZS4gQmVhciBp biBtaW5kLCBJIGFtIGludGVyZXN0ZWQgaW4gdGhlIGFjdHVhbCBsb2dpYyBv ZiBob3cgdG8NCiAgcmVhZCBhIG11c2ljIGZpbGUgKG9yIGEgcGxheWxpc3Qp IGFuZCBsaXN0ZW5pbmcgdG8gaXQsIHJhdGhlciB0aGFuIHRoZQ0KICBmcm9u dC1lbmQgcGFydCBvZiBhIG11c2ljIHBsYXllci4gIChNeSBrbm93bGVkZ2Ug b2YgT0NhbWwgaXMNCiAgaW50ZXJtZWRpYXRlKQ0KDQoNClRob21hcyBCbGFu YyBzdWdnZXN0ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFlvdSB3 YW50IHRvIGNoZWNrIDxodHRwczovL2dpdGh1Yi5jb20vc2F2b25ldC9saXF1 aWRzb2FwPg0KDQoNCllvdGFtIEJhcm5veSB0aGVuIHNhaWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIFdvdyBAUGF0SiBJIGRpZG4ndCBrbm93IGFi b3V0IGxpcXVpZHNvYXAuIEkgYWRkZWQgaXQgdG8NCiAgb2NhbWx2ZXJzZS4g VGhpcyBpcyB3aGF0IHdlIGhhdmUgZm9yIHRoZSBhdWRpbyBwYWdlIG5vdywg aW4gY2FzZSBpdCdzDQogIGhlbHBmdWwgdG8gdGhlIE9QOiA8aHR0cHM6Ly9v Y2FtbHZlcnNlLmdpdGh1Yi5pby9jb250ZW50L2F1ZGlvLmh0bWw+DQoNCg0K Z25kbCBhbHNvIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgZXhwZXJpbWVudGVk IHdpdGggc2V2ZXJhbCBzb2x1dGlvbnMgaW4gdGhlIFtwbGF5b10gcHJvamVj dC4gIE9uZSBvZg0KICB0aGUgcG9zc2libGUgc29sdXRpb25zIGlzIHRvIHVz ZSBbb2NhbWwtZ3N0cmVhbWVyXS4gIElmIHlvdSBmaW5kIHRoYXQNCiAgdGhl IGdzdHJlYW1lciBmcmFtZXdvcmsgaXMgdG9vIGFubm95aW5nICh3aGljaCBJ IGNhbiB1bmRlcnN0YW5kIDotKSwNCiAgeW91IGNhbiB1c2UgW29jYW1sLWZm bXBlZ10uIG5vdGUgaG93ZXZlciB0aGF0LCBpbiB0aGUgbGF0ZXN0IHZlcnNp b24NCiAgb2Ygb2NhbWwtZmZtcGVnLCB0aGUgYXVkaW8gZGV2aWNlIG91dHB1 dCBbbm8gbG9uZ2VyIHdvcmtzXS4gVG8NCiAgb3ZlcmNvbWUgdGhpcyBkcmF3 YmFjaywgeW91IGNhbiB1c2UgW29jYW1sLXBvcnRhdWRpb10uDQoNCg0KW3Bs YXlvXSA8aHR0cHM6Ly9naXRodWIuY29tL2duZGwvcGxheW8+DQoNCltvY2Ft bC1nc3RyZWFtZXJdIDxodHRwczovL2dpdGh1Yi5jb20vc2F2b25ldC9vY2Ft bC1nc3RyZWFtZXI+DQoNCltvY2FtbC1mZm1wZWddIDxodHRwczovL2dpdGh1 Yi5jb20vc2F2b25ldC9vY2FtbC1mZm1wZWc+DQoNCltubyBsb25nZXIgd29y a3NdIDxodHRwczovL2dpdGh1Yi5jb20vc2F2b25ldC9vY2FtbC1mZm1wZWcv aXNzdWVzLzMyPg0KDQpbb2NhbWwtcG9ydGF1ZGlvXSA8aHR0cHM6Ly9naXRo dWIuY29tL3Nhdm9uZXQvb2NhbWwtcG9ydGF1ZGlvPg0KDQoNClRoZSBlbmQg b2YgQ2FtbHA0DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L3RoZS1lbmQtb2YtY2FtbHA0LzQyMTYvOTY+DQoN Cg0KQ29udGludWluZyB0aGlzIG9sZCB0aHJlYWQsIENoZXQgTXVydGh5IGFu bm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgUGVyaGFwcyB3b3J0aCBtZW50 aW9uaW5nIGJyaWVmbHkgdGhhdCBmb3IgYW55Ym9keSB3aG8gLXdhbnRzLSB0 bw0KICBjb250aW51ZSB1c2luZyBjYW1scDQsIEknbSAoYSkgbWFpbnRhaW5p bmcgY2FtbHA1IGFuZCBicmluZ2luZyBpdA0KICB1cC10by1kYXRlIHdpdGgg ZXZlcnl0aGluZyBpbiBvY2FtbCA0LjEwLjAgdGhhdCBJIGNhbiB0aGluayBv ZiwgYW5kDQogIChiKSBJJ2QgYmUgaGFwcHkgdG8gaGVscCB0aGVtIHBvcnQg dGhlaXIgZGVwZW5kZW5jeSBvdmVyIHRvIGNhbWxwNS4NCg0KICBUaGlzIGlz IG5vdCB0byBiZSBjb25zdHJ1ZWQgYXMgYW4gYXJndW1lbnQgZm9yIHVzaW5n IGNhbWxwNC81Lg0KDQoNCk9DYW1sZm9ybWF0IDAuMTQuMA0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tb2NhbWxmb3JtYXQtMC0xNC0wLzU0MzUvMT4NCg0KDQpFdGllbm5lIE1p bGxvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIE9uIGJlaGFsZiBvZiB0aGUgZGV2ZWxvcG1lbnQgdGVhbSwgSSdkIGxp a2UgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YNCiAgb2NhbWxmb3JtYXQg dmVyc2lvbiAwLjE0LjAgOnRhZGE6Lg0KDQogIEhlcmUgYXJlIHRoZSBtYWlu IGhpZ2hsaWdodHMgb2YgdGhpcyByZWxlYXNlOg0KDQoNClN1cHBvcnQgZm9y IE9DYW1sIDQuMTANCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoaXMg bWVhbnMgYm90aCB0aGF0IGl0IGNvbXBpbGVzIGFuZCBydW5zIHVzaW5nIHRo aXMgdmVyc2lvbiwgYnV0IGFsc28NCiAgdGhhdCBpdCBjYW4gZm9ybWF0IDQu MTAtc3BlY2lmaWMgbGFuZ3VhZ2UgZmVhdHVyZXMgKGBtb2R1bGUgXycgYW5k DQogIG11bHRpLWluZGljZXMgb3BlcmF0b3JzKS4NCg0KDQpQcmVsaW1pbmFy eSBzdXBwb3J0IGZvciBpbnZhbGlkIGZpbGVzDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYwNCg0KICBBcyBPQ2FtbGZvcm1hdCBvcGVyYXRlcyBvbiBBU1RzLCBp dCBub3JtYWxseSByZXF1aXJlcyBhIHZhbGlkIGlucHV0DQogIGZpbGUuIFRo aXMgcmVsZWFzZSBhZGRzIGEgYC0tZm9ybWF0LWludmFsaWQtZmlsZXMnIG9w dGlvbiB0byBkZXRlY3QNCiAgaW52YWxpZCBwYXJ0cyBhbmQgcHJpbnQgdGhl bSB2ZXJiYXRpbS4gVGhpcyBmZWF0dXJlIGlzIHN0aWxsDQogIGV4cGVyaW1l bnRhbC4NCg0KDQpQcmVzZXJ2aW5nIG1vcmUgY29uY3JldGUgc3ludGF4DQri lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0KICBTdGFydGluZyB3aXRoIHRoaXMgcmVsZWFzZSwgT0NhbWxmb3Jt YXQgaXMgZ29pbmcgdG8gcHJlc2VydmUgbW9yZQ0KICBjb25jcmV0ZSBzeW50 YXguIEZvciBleGFtcGxlLCBgbW9kdWxlIE0gPSBmdW5jdG9yIChLIDogUykg LT4gc3RydWN0DQogIGVuZCcgYW5kIGBtb2R1bGUgTSAoSyA6IFMpID0gc3Ry dWN0IGVuZCcgYXJlIGVxdWl2YWxlbnQuIEluIHRoZSBwYXN0LA0KICBib3Ro IHZhcmlhbnRzIHdvdWxkIGJlIGZvcm1hdHRlZCBhcyB0aGUgbGF0dGVyLiBO b3csIHRoZSBvcmlnaW5hbA0KICBzeW50YXggaXMgcHJlc2VydmVkLiBJbiBz b21lIGNhc2VzLCBwcmVzZXJ2aW5nIHdhcyBwb3NzaWJsZSB0aHJvdWdoDQog IHRoZSBtZWFucyBvZiBhbiBvcHRpb246IGZvciBleGFtcGxlLCB0byBjaG9p Y2UgYmV0d2VlbiBgbGV0JW5hbWUgeCA9IGUNCiAgaW4gYm9keScgYW5kIGBb JW5hbWUgbGV0IHggPSBlIGluIGJvZHldJywgd2FzIGNvbnRyb2xsZWQgYnkg dGhlDQogIGBleHRlbnNpb24tc3VnYXInIG9wdGlvbi4gVGhpcyBvcHRpb24g aXMgbm93IGRlcHJlY2F0ZWQgYW5kDQogIE9DYW1sZm9ybWF0IHdpbGwgbm93 IGFsd2F5cyBwcmVzZXJ2ZSB3aGF0IHdhcyBpbiB0aGUgc291cmNlIGZpbGUg KHRoaXMNCiAgd2FzIHRoZSBkZWZhdWx0IGJlaGF2aW91cikuDQoNCiAgU2lt aWxhcmx5LCBpdCB3YXMgcG9zc2libGUgdG8gY29udHJvbCBob3cgc3BlY2lh bCBjaGFyYWN0ZXJzIGFyZQ0KICBlc2NhcGVkIGluIHN0cmluZyBhbmQgY2hh cmFjdGVyIGxpdGVyYWxzIHRocm91Z2ggdGhlIGBlc2NhcGUtc3RyaW5ncycN CiAgYW5kIGBlc2NhcGUtY2hhcnMnIG9wdGlvbnMuIFRoZXkgYXJlIGJlaW5n IGRlcHJlY2F0ZWQgYW5kIHRoZSBvbmx5DQogIHBvc3NpYmxlIGJlaGF2aW9y IHdpbGwgYmUgcHJlc2VydmluZyB0aGUgY29uY3JldGUgc3ludGF4IChhcyBk b25lIGJ5DQogIGRlZmF1bHQpLg0KDQogIFRoZSByZWFzb24gZm9yIHRoaXMg Y2hhbmdlIGlzIHRoYXQgd2UgZmVlbCB0aGF0IG9jYW1sZm9ybWF0IHNob3Vs ZCBiZQ0KICBqdXN0IGFib3V0IGZvcm1hdHRpbmcuIFRoZSBmYWN0IHRoYXQg dGhpcyBiZWhhdmlvciB3YXMgY29uZmlndXJhYmxlIGlzDQogIGluIHBhcnQg ZHVlIHRvIHRoZSBmYWN0IHRoYXQgaXQgb3BlcmF0ZXMgb24gT0NhbWwgQVNU cywgYnV0IGVuZCB1c2Vycw0KICBzaG91bGQgbm90IGhhdmUgdG8gYmUgc3Vy cHJpc2VkIGJ5IHRoZWlyIGNvZGUgYmVpbmcgdHJhbnNmb3JtZWQgb24NCiAg cmVmb3JtYXR0aW5nLg0KDQogIEluIHRoZSBmdXR1cmUsIHdlIHBsYW4gdG8g ZXh0ZW5kIHRoYXQgdG8gb3RoZXIgc2ltaWxhciBjb25zdHJ1Y3RzLA0KICBz dWNoIGFzIHVzaW5nIGAofi8nKX4gb3IgYGJlZ2lufi9+ZW5kJywgb3Igc3Bh Y2luZyBiZXR3ZWVuIG1vZHVsZQ0KICBpdGVtcy4NCg0KDQpQbGFjZW1lbnQg b2YgZG9jIGNvbW1lbnRzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0KICBQbGFjaW5nIGRvYyBjb21tZW50cyBgKCoqIC4uLiAqKScgaXMg Y29udHJvbGxlZCBieSB0aGUgYGRvYy1jb21tZW50cycNCiAgY29uZmlndXJh dGlvbiBvcHRpb24uIEl0IGlzIGFsd2F5cyBwb3NzaWJsZSB0byBwdXQgdGhl bSBiZWZvcmUgdGhlDQogIGl0ZW0gdGhleSByZWZlciB0bywgYW5kIHRoaXMg aXMgd2hhdCB0aGUgYGRvYy1jb21tZW50cz1iZWZvcmUnIG9wdGlvbg0KICBk b2VzLiBUaGUgYWx0ZXJuYXRpdmUgYGRvYy1jb21tZW50cz1hZnRlcicgd2ls bCB0cnkgdG8gZG8gaXRzIGJlc3QgdG8NCiAgcHV0IHRoZW0gYWZ0ZXIsIGJ1 dCBpbiBzb21lIGNhc2VzIGl0IGlzIG5vdCBwb3NzaWJsZS4gRm9yIGV4YW1w bGUsIGluDQogIGEgdmFyaWFudCB0eXBlIGRlY2xhcmF0aW9uLCBhIGRvYy1j b21tZW50IHB1dCBpbW1lZGlhdGVseSBhZnRlciB3aWxsDQogIGJlIGF0dGFj aGVkIHRvIHRoZSBsYXN0IGNvbnN0cnVjdG9yIGJ5IGRvY3VtZW50YXRpb24N CiAgdG9vbHMuIE9jYW1sZm9ybWF0IG5lZWRzIHRvIHByZXNlcnZlIHRoZSBt ZWFuaW5nIG9mIHByb2dyYW1zLCBzbyBpbg0KICB0aGVzZSBjYXNlcywgaXQg d2lsbCBpbnN0ZWFkIHB1dCB0aGUgY29tbWVudCBiZWZvcmUuIEluIHRoZSBj YXNlIG9mDQogIGBtb2R1bGUnIGRlY2xhcmF0aW9ucywgcHV0dGluZyB0aGUg Y29tbWVudCBhZnRlciBtaWdodCBub3QgYmUgdmVyeQ0KICB1c2VmdWwgaWYg dGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIGlzIHZlcnkgbGFyZ2UuDQoNCiAg VGhpcyByZXF1aXJlcyBhIGNvbXBsZXggcnVsZSB0byBkZXRlcm1pbmUgd2hp Y2ggY29tbWVudHMgd2lsbCBiZSBwdXQNCiAgYmVmb3JlIGFuZCB3aGljaCBj b21tZW50cyB3aWxsIGJlIHB1dCBhZnRlci4gU28gaW4gdGhpcyB2ZXJzaW9u LCB3ZQ0KICBhcmUgZGVwcmVjYXRpbmcgdGhpcyBtZWNoYW5pc20gYW5kIHJl cGxhY2luZyBpdCB3aXRoIGEgc2ltcGxlciBvbmUNCiAgY29udHJvbGxlZCBi eSBgZG9jLWNvbW1lbnRzLXZhbCcgdGhhdCBhcHBsaWVzIG9ubHkgdG8gYHZh bCcgYW5kDQogIGBleHRlcm5hbCcgaXRlbXMuIEZvciB0aGVzZSBpdGVtcywg aXQgaXMgYWx3YXlzIHBvc3NpYmxlIHRvIGF0dGFjaA0KICBkb2N1bWVudHMg YmVmb3JlIG9yIGFmdGVyIHRoZW0uIEZvciBhbGwgb3RoZXIgaXRlbXMsIGxp a2UgdHlwZSBvcg0KICBtb2R1bGUgZGVjbGFyYXRpb25zLCB0aGUgZG9jIGNv bW1lbnRzIHdpbGwgY29uc2lzdGVubHkgYmUgcHV0IGJlZm9yZS4NCg0KDQpN YW55IGJ1Z3MgZm91bmQgYnkgZnV6emluZw0K4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWMDQoNCiAgV2UgaG9va2VkIG9jYW1sZm9ybWF0IHRv IEFGTCwgbG9va2luZyBmb3IgcHJvZ3JhbXMgdGhhdCBwYXJzZQ0KICBjb3Jy ZWN0bHkgYnV0IHRyaWdnZXIgZXJyb3JzIGR1cmluZyBmb3JtYXR0aW5nLiBU aGlzIGFwcHJvYWNoIHdvcmtlZA0KICB2ZXJ5IHdlbGwgYW5kIG1vcmUgdGhh biAyMCBsb2dpY2FsIGJ1Z3Mgd2VyZSBmb3VuZCB3aXRoIHRoaXMNCiAgdGVj aG5pcXVlLg0KDQoNClVwZ3JhZGluZw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWMDQoNCiAgVG8gdXBncmFkZSBmcm9tIG9jYW1sZm9ybWF0IDAuMTMu MCwgb25lIG5lZWRzIHRvIHVwZ3JhZGUgdGhlDQogIG9jYW1sZm9ybWF0IGJp bmFyeSBhbmQgcmVwbGFjZSB0aGUgYHZlcnNpb24nIGZpZWxkIGluIGAub2Nh bWxmb3JtYXQnDQogIGZpbGVzIGJ5IGAwLjE0LjAnIGFuZCB0aGVuOg0KDQog IOKAoiBpZiB5b3UgdXNlZCBgZG9jLWNvbW1lbnRzPWFmdGVyJywgeW91IGNh biByZXBsYWNlIGl0IGJ5DQogICAgYGRvYy1jb21tZW50cy12YWw9YWZ0ZXIn LiAgVGhpcyB3aWxsIG1vdmUgZG9jLWNvbW1lbnRzIG9uIG1vZHVsZQ0KICAg IGl0ZW1zIGV4Y2VwdCBgdmFsJyBhbmQgYGV4dGVybmFsJyBvbmVzLg0KICDi gKIgaWYgeW91IHVzZWQgYGRvYy1jb21tZW50cz1iZWZvcmUnLCB5b3UgY2Fu IHJlbW92ZSBpdCBhcyBpdCBpcyBub3cNCiAgICB0aGUgZGVmYXVsdC4NCiAg 4oCiIGlmIHlvdSBzZXQgYGVzY2FwZS1jaGFycz1wcmVzZXJ2ZScsIGBlc2Nh cGUtc3RyaW5ncz1wcmVzZXJ2ZScsIG9yDQogICAgYGV4dGVuc2lvbi1zdWdh cj1wcmVzZXJ2ZScgZXhwbGljaXRseSwgeW91IGNhbg0KICByZW1vdmUgdGhl bSBzYWZlbHkgKHRoZXkgd2VyZSB0aGUgZGVmYXVsdCkNCiAg4oCiIGlmIHlv dSB1c2VkIGFub3RoZXIgdmFsdWUgZm9yIG9uZSBvZiB0aGVzZSBvcHRpb25z IChzdWNoIGFzDQogICAgYGVzY2FwZS1zdHJpbmdzPWhleGFkZWNpbWFsJyks IHlvdSB3aWxsIG5lZWQgdG8gcmVtb3ZlIHRoZW0gYXMNCiAgICB3ZWxsLiBU aGlzIHdpbGwgbm90IHRyaWdnZXIgYSBkaWZmLCBidXQgb2NhbWxmb3JtYXQg d2lsbCBub3QgZW5mb3JjZQ0KICAgIGEgcGFydGljdWxhciBjb25jcmV0ZSBz eW50YXggZm9yIG5ldyBjb2RlLg0KDQoNCkEgbm90ZSBmb3IgbmV3IHVzZXJz DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0KICBXZSBlbmNvdXJhZ2UgeW91IHRvIHRy eSBvY2FtbGZvcm1hdCwgdGhhdCBjYW4gYmUgaW5zdGFsbGVkIGZyb20gb3Bh bQ0KICBkaXJlY3RseSAoYG9wYW0gaW5zdGFsbCBvY2FtbGZvcm1hdCcpLCBi dXQgcGxlYXNlIHJlbWVtYmVyIHRoYXQgaXQgaXMNCiAgc3RpbGwgYmV0YSBz b2Z0d2FyZS4gV2UgYWRkZWQgYSBbRkFRIGZvciBuZXcgdXNlcnNdIHRoYXQg c2hvdWxkIGhlbHANCiAgeW91IGRlY2lkZSBpZiBvY2FtbGZvcm1hdCBpcyB0 aGUgcmlnaHQgY2hvaWNlIGZvciB5b3UuDQoNCg0KW0ZBUSBmb3IgbmV3IHVz ZXJzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgvb2NhbWxmb3Jt YXQjZmFxLWZvci1uZXctdXNlcnM+DQoNCg0KRXRpZW5uZSBNaWxsb24gbGF0 ZXIgYWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIFRoaXMgdXBncmFkZSBpcyBsaWtlbHkgdG8gZ2VuZXJhdGUgYSBodWdl IGRpZmYgb24gcHJvamVjdHMgdGhhdCB1c2UNCiAgdGhlIGRlZmF1bHQgcHJv ZmlsZSwgc28gSSB3b3VsZCBsaWtlIHRvIGV4cGFuZCBhIGJpdCBvbiB0aGUg cmVhc29uLg0KDQogIEFjY29yZGluZyB0byBbdGhlIHN5bnRheCBydWxlcyB1 c2VkIGJ5IHRoZSBvY2FtbCB0b29sc10gKHRoZSBvY2FtbA0KICBjb21waWxl cnMsIG9jYW1sZG9jLCBvZG9jKSwgaXQgaXMgYWx3YXlzIHBvc3NpYmxlIHRv IHB1dCB0aGUNCiAgZG9jLWNvbW1lbnQgYmVmb3JlIGFuIGl0ZW0uDQoNCiAg U29tZSB0ZWFtcyBwcmVmZXIgdG8gcHV0IHRoZSBkb2N1bWVudGF0aW9uIGFm dGVyLiBCdXQgdGhhdCBpcyBub3QNCiAgYWx3YXlzIHBvc3NpYmxlLiBGb3Ig ZXhhbXBsZSwgYHR5cGUgdCA9IEEgfCBCICgqKiBkb2MgKiknIHdpbGwgYXR0 YWNoDQogIHRoZSBkb2MtY29tbWVudCB0byBgQicsIG5vdCB0byBgdCcuIFRo ZSBvbmx5IHdheSB0byBhdHRhY2ggdGhlIGNvbW1lbnQNCiAgdG8gYHQnIGlz IGJ5IHB1dHRpbmcgdGhlIGNvbW1lbnQgYmVmb3JlLg0KDQogIEVudGVyIG9j YW1sZm9ybWF0OiBkb2MtY29tbWVudCBwbGFjZW1lbnQgaXMgY29udHJvbGxl ZCBieSBhbiBvcHRpb24NCiAgd2l0aCB0d28gdmFsdWVzLCBgYmVmb3JlJyBv ciBgYWZ0ZXInLiBgYmVmb3JlJyB3aWxsIGFsd2F5cyBwbGFjZSB0aGUNCiAg Y29tbWVudCBiZWZvcmUuIGBhZnRlcicgZGV0ZXJtaW5lcyBpZiBpdCBpcyBw b3NzaWJsZSB0byBwdXQgdGhlDQogIGNvbW1lbnQgYWZ0ZXIsIGFuZCBpZiBp dCBpcyBub3QsIHdpbGwgcHV0IGl0IGJlZm9yZS4NCg0KICBTb21lIGl0ZW1z IGNhbm5vdCBoYXZlIGNvbW1lbnRzIGFmdGVyLCBsaWtlIHZhcmlhbnQgdHlw ZXMgKGFzDQogIGRlc2NyaWJlZCBhYm92ZSkuIEJ1dCB0aGVyZSBpcyBhbm90 aGVyIHJlYXNvbiBub3QgdG8gcHV0IGNvbW1lbnRzDQogIGFmdGVyLiBJbiBz b21lIGNhc2VzLCB0aGF0IGNhbiBwdXQgdGhlIGNvbW1lbnQgZmFyIGZyb20g dGhlIHRoaW5nIGl0DQogIGlzIGRvY3VtZW50aW5nLiBDb25zaWRlcmluZyBt b2R1bGVzLCB0aGUgZm9sbG93aW5nIGlzIG5pY2U6DQoNCiAg4pSM4pSA4pSA 4pSA4pSADQogIOKUgiBtb2R1bGUgTSA9IEwuTQ0KICDilIIgKCoqIGRvYyAq KQ0KICDilJTilIDilIDilIDilIANCg0KICBCdXQgdGhpcyBpcyBub3QgZ3Jl YXQgaXMgdGhlIHN0cnVjdHVyZSBpcyBsYXJnZToNCg0KICDilIzilIDilIDi lIDilIANCiAg4pSCIG1vZHVsZSBNID0gc3RydWN0DQogIOKUgiAgIC4uLg0K ICDilIIgICAuLi4NCiAg4pSCIGVuZA0KICDilIIgKCoqIGRvYyAqKQ0KICDi lJTilIDilIDilIDilIANCg0KICBUbyBzdW1tYXJpemUsIHdoZW4gb2NhbWxm b3JtYXQgaXMgY29uZmlndXJlZCB0byBwdXQgY29tbWVudHMgYWZ0ZXIsIGl0 DQogIGhhcyB0byBmb2xsb3cgYSBjb21wbGV4IGhldXJpc3RpYyB0byBkZXRl cm1pbmUgd2hldGhlciBpdCBoYXMgdG8NCiAgZmFsbGJhY2sgdG8gYmVmb3Jl LiBJbiB0aGUgY2FzZSBvZiBhIG1vZHVsZSwgaXQgZGVwZW5kcyBvbiBpdHMg c2hhcGUsDQogIGhvdyBtYW55IGZ1bmN0b3IgYXJndW1lbnRzIGFyZSB0aGVy ZSwgdGhpcyBraW5kIG9mIHRoaW5ncyAoZm9yIHZhcmlvdXMNCiAgcmVhc29u cywgd2UgZG9uJ3Qga25vdyBob3cgbGFyZ2Ugc29tZXRoaW5nIGlzIGdvaW5n IHRvIGJlIGluIGFkdmFuY2UsDQogIHNvIHdlIGhhdmUgdG8gbG9vayBhdCBp dHMgc2hhcGUpLiBUaGUgcG9pbnQgaXMgdGhhdCBpdCBpcyBjb21wbGljYXRl ZA0KICB0byB1bmRlcnN0YW5kIGFuZCBleHBsYWluLCBhbmQgdGhhdCBmaXhp bmcgaXQgYWx3YXlzIG1ha2VzIGl0IG1vcmUNCiAgY29tcGxleC4gQW5vdGhl ciBhc3BlY3QgaXMgdGhhdCBpbiB0aGUgZW5kLCB3ZSB3YW50IG9jYW1sZm9y bWF0IHRvIGJlDQogIHByZXR0eSBzdGFibGUgd2hlbiBpdCByZWFjaGVzIDEu MC4wLCBhbmQgY29tcGxleCBydWxlcyBhcmUgYXQgb2Rkcw0KICB3aXRoIHRo aXMgZ29hbC4NCg0KICBTbywgd2UgaGF2ZSBkZWNpZGVkIHRvIHNpbXBsaWZ5 IHRoZSBydWxlOiBpbnN0ZWFkIG9mIGxvb2tpbmcgZGVlcCBpbg0KICB0aGUg QVNULCB3ZSBqdXN0IGxvb2sgYXQgdGhlIGtpbmQgb2YgaXRlbSB0aGlzIGlz LiBGb3IgYHZhbCcgYW5kDQogIGBleHRlcm5hbCcgaXRlbXMsIGl0IGlzIGFs d2F5cyBwb3NzaWJsZSB0byBwdXQgdGhlIGRvYy1jb21tZW50IGFmdGVyLA0K ICBzbyB3ZSBmb2xsb3cgZXhhY3RseSB3aGF0IHRoZSBjb25maWd1cmF0aW9u IG9wdGlvbiBzYXlzLg0KDQogIEFzIGEgdXNlciBvZiB0aGUgZGVmYXVsdCBw cm9maWxlLCB3aGF0IHRoaXMgbWVhbnMgZm9yIHlvdTogZm9yIGl0ZW1zDQog IHRoYXQgYXJlIG5vdCBgdmFsJyBvciBgZXh0ZXJuYWwnLCBhbmQgY29uc2lk ZXJlZCAic2ltcGxlIiBieSB0aGUNCiAgMC4xMy4wIGhldXJpc3RpYywgZG9j LWNvbW1lbnRzIGFyZSBnb2luZyB0byBtb3ZlIGZyb20gYWZ0ZXIgdG8gYmVm b3JlLg0KDQogIEJhc2VkIG9uIHRoZXNlIHJlYXNvbnMsIHlvdSB3aWxsIHVu ZGVyc3RhbmQgdGhhdCBgYmVmb3JlJyBpcyBhbHdheXMNCiAgc2ltcGxlci4g WW91IGNhbiBvcHQgaW50byB0aGlzIGJ5IHNldHRpbmcNCiAgYGRvYy1jb21t ZW50cy12YWw9YmVmb3JlJy4gVGhpcyB3aWxsIGNhdXNlIGFuIGV2ZW4gbGFy Z2VyIGRpZmYgYXMgYWxsDQogIGl0ZW1zIGFyZSBnb2luZyB0byBtb3ZlIGJl Zm9yZSAodGhhdCBpczogYWxsIGl0ZW1zIGRlc2NyaWJlZCBqdXN0DQogIGFi b3ZlLCBwbHVzIGB2YWwnIGFuZCBgZXh0ZXJuYWwnIGl0ZW1zKSwgYnV0IHRo ZSBydWxlIGdldHMgZXh0cmVtZWx5DQogIHNpbXBsZSAoZXZlcnl0aGluZyBp cyBwdXQgYmVmb3JlKS4gSXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIG9wdGlv bg0KICB3aWxsIGJlY29tZSB0aGUgZGVmYXVsdCBpbiB0aGUgZnV0dXJlLCBi dXQgd2UgaGF2ZSBub3QgZGVjaWRlZCB0aGlzDQogIHlldCAoaW4gdGhpcyBj YXNlLCBpZiB5b3UgZGlkIG5vdCBvcHQgaW50byBpdCwgeW91IHdpbGwgc2Vl IGNvbW1lbnRzDQogIG9uIGB2YWwnIGFuZCBgZXh0ZXJuYWwnIGl0ZW1zIG1v dmUgYXQgdGhhdCB0aW1lKS4NCg0KDQpbdGhlIHN5bnRheCBydWxlcyB1c2Vk IGJ5IHRoZSBvY2FtbCB0b29sc10NCjxodHRwczovL2NhbWwuaW5yaWEuZnIv cHViL2RvY3MvbWFudWFsLW9jYW1sL29jYW1sZG9jLmh0bWwjc3M6b2NhbWxk b2MtcGxhY2VtZW50Pg0KDQoNCk1MIEZhbWlseSBXb3Jrc2hvcCAyMDIwOiBD YWxsIGZvciBwcmVzZW50YXRpb25zDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L21sLWZhbWlseS13b3Jr c2hvcC0yMDIwLWNhbGwtZm9yLXByZXNlbnRhdGlvbnMvNTQ0MS8xPg0KDQoN CkxlbyBXaGl0ZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdlIGFy ZSBoYXBweSB0byBpbnZpdGUgc3VibWlzc2lvbnMgdG8gdGhlIE1MIEZhbWls eSBXb3Jrc2hvcCAyMDIwLCB0bw0KICBiZSBoZWxkIGR1cmluZyB0aGUgSUNG UCBjb25mZXJlbmNlIHdlZWsgb24gVGh1cnNkYXksIEF1Z3VzdCAyN3RoLg0K DQogIFRoZSBNTCBmYW1pbHkgd29ya3Nob3Agd2FybWx5IHdlbGNvbWVzIHN1 Ym1pc3Npb24gdG91Y2hpbmcgb24gdGhlDQogIHByb2dyYW1taW5nIGxhbmd1 YWdlcyB0cmFkaXRpb25hbGx5IHNlZW4gYXMgcGFydCBvZiB0aGUgIk1MIGZh bWlseSINCiAgKFN0YW5kYXJkIE1MLCBPQ2FtbCwgRiMsIENha2VNTCwgU01M IywgTWFudGljb3JlLCBNZXRhT0NhbWwsDQogIGV0Yy4pLiBUaGUgc2NvcGUg b2YgdGhlIHdvcmtzaG9wIGluY2x1ZGVzIGFsbCBhc3BlY3RzIG9mIHRoZSBk ZXNpZ24sDQogIHNlbWFudGljcywgdGhlb3J5LCBhcHBsaWNhdGlvbiwgaW1w bGVtZW50YXRpb24sIGFuZCB0ZWFjaGluZyBvZiB0aGUNCiAgbWVtYmVycyBv ZiB0aGUgTUwgZmFtaWx5LiBXZSBhbHNvIGVuY291cmFnZSBwcmVzZW50YXRp b25zIGZyb20gcmVsYXRlZA0KICBsYW5ndWFnZXMgKHN1Y2ggYXMgSGFza2Vs bCwgU2NhbGEsIFJ1c3QsIE5lbWVybGUsIExpbmtzLCBLb2thLCBGKiwNCiAg RWZmLCBBVFMsIGV0YyksIHRvIGV4Y2hhbmdlIGV4cGVyaWVuY2Ugb2YgZnVy dGhlciBkZXZlbG9waW5nIE1MIGlkZWFzLg0KDQogIEN1cnJlbnRseSwgdGhl IHdvcmtzaG9wIGlzIHN0aWxsIHNjaGVkdWxlZCB0byBnbyBhaGVhZCBhcyBw bGFubmVkIGluDQogIEplcnNleSBDaXR5LCBob3dldmVyIGl0IGlzIGxpa2Vs eSB0aGF0IHRoZSBNTCB3b3Jrc2hvcCB3aWxsIGVuZCB1cA0KICBiZWluZyBh IHZpcnR1YWwgd29ya3Nob3AgdGhpcyB5ZWFyLiBFaXRoZXIgd2F5IHByb3Zp c2lvbnMgd2lsbCBiZSBtYWRlDQogIHRvIGFsbG93IHNwZWFrZXJzIHRvIHBy ZXNlbnQgdGhlaXIgd29yayByZW1vdGVseS4NCg0KICBTZWUgb3VyIGRldGFp bGVkIENGUCBvbmxpbmUgb24gdGhlIElDRlAgd2Vic2l0ZToNCg0KICA8aHR0 cHM6Ly9pY2ZwMjAuc2lncGxhbi5vcmcvaG9tZS9tbGZhbWlseXdvcmtzaG9w LTIwMjA+DQoNCg0KSW1wb3J0YW50IGRhdGVzDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgRnJpZGF5 IDE1dGggTWF5IChhbnkgdGltZSB6b25lKTogQWJzdHJhY3Qgc3VibWlzc2lv biBkZWFkbGluZQ0KICDigKIgRnJpZGF5IDI2dGggSnVuZTogQXV0aG9yIG5v dGlmaWNhdGlvbg0KICDigKIgVGh1cnNkYXkgMjd0aCBBdWd1c3Q6IE1MIEZh bWlseSBXb3Jrc2hvcA0KDQoNClByb2dyYW0gY29tbWl0dGVlDQrilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwN Cg0KICDigKIgWW91eW91IENvbmcgKFRva3lvIEluc3RpdHV0ZSBvZiBUZWNo bm9sb2d5KQ0KICDigKIgR293dGhhbSBLYWtpIChQdXJkdWUgVW5pdmVyc2l0 eSkNCiAg4oCiIE5lZWwgS3Jpc2huYXN3YW1pIChVbml2ZXJzaXR5IG9mIENh bWJyaWRnZSkNCiAg4oCiIERhYW4gTGVpamVuIChNaWNyb3NvZnQgUmVzZWFy Y2gpDQogIOKAoiBLb2tvIE11cm95YSAoS3lvdG8gVW5pdmVyc2l0eSkNCiAg 4oCiIEF0c3VzaGkgT2hvcmkgKFRvaG9rdSBVbml2ZXJzaXR5KQ0KICDigKIg Sm9uYXRoYW4gUHJvdHplbmtvIChNaWNyb3NvZnQgUmVzZWFyY2gpDQogIOKA oiBHYWJyaWVsIFJhZGFubmUgKElOUklBKQ0KICDigKIgQ2xhdWRpbyBSdXNz byAoRGZpbml0eSkNCiAg4oCiIExlbyBXaGl0ZSAoSmFuZSBTdHJlZXQpIChD aGFpcikNCiAg4oCiIEplcmVteSBZYWxsb3AgKFVuaXZlcnNpdHkgb2YgQ2Ft YnJpZGdlKQ0KDQoNClN1Ym1pc3Npb24gZGV0YWlscw0K4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN CiAgU2VlIHRoZSBvbmxpbmUgQ0ZQIGZvciB0aGUgZGV0YWlscyBvbiB0aGUg ZXhwZWN0ZWQgc3VibWlzc2lvbiBmb3JtYXQuDQoNCiAgU3VibWlzc2lvbnMg bXVzdCBiZSB1cGxvYWRlZCB0byB0aGUgd29ya3Nob3Agc3VibWlzc2lvbiB3 ZWJzaXRlDQoNCiAgPGh0dHBzOi8vbWwyMDIwLmhvdGNycC5jb20vPg0KDQog IGJlZm9yZSB0aGUgc3VibWlzc2lvbiBkZWFkbGluZS4NCg0KDQpBbm5vdW5j aW5nIFNlaywgYW4gZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIG9mIHNlcXVl bmNlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm5v dW5jaW5nLXNlay1hbi1lZmZpY2llbnQtaW1wbGVtZW50YXRpb24tb2Ytc2Vx dWVuY2VzLzU0NDIvMT4NCg0KDQpGcmFuw6dvaXMgUG90dGllciBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdl IGFyZSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxlYXNlIG9m IFNlaywgYW4gT0NhbWwgbGlicmFyeQ0KICB0aGF0IG9mZmVycyBhbiBlZmZp Y2llbnQgaW1wbGVtZW50YXRpb24gb2Ygc2VxdWVuY2VzLg0KDQogIFRoZSBs aWJyYXJ5IG9mZmVycyBib3RoIGVwaGVtZXJhbCAobXV0YWJsZSkgc2VxdWVu Y2VzIGFuZCBwZXJzaXN0ZW50DQogIChpbW11dGFibGUpIHNlcXVlbmNlcywg YW5kIG9mZmVycyBjb25zdGFudC10aW1lIGNvbnZlcnNpb25zIGJldHdlZW4N CiAgdGhlc2UgZmxhdm9ycy4NCg0KICBJdCBzdXBwb3J0cyBhbGwgb2YgdGhl IHN0YW5kYXJkIG9wZXJhdGlvbnMgb24gc3RhY2tzLCBxdWV1ZXMsIGRlcXVl cw0KICAoZS5nLiAgcHVzaCwgcG9wIGF0IGVpdGhlciBlbmQpLCBjYXRlbmFi bGUgc2VxdWVuY2VzIChjb25jYXQsIHNwbGl0KSwNCiAgYW5kIHJhbmRvbSBh Y2Nlc3Mgc2VxdWVuY2VzIChnZXQsIHNldCkuDQoNCiAgRGF0YSBpcyBzdG9y ZWQgaW50ZXJuYWxseSBpbiBjaHVua3MgKGZpeGVkLWNhcGFjaXR5IGFycmF5 cyksIHdoaWNoIGlzDQogIHdoeSB0aGlzIGRhdGEgc3RydWN0dXJlIGlzIGtu b3duIGFzIGEgY2h1bksgU0VxdWVuY2UuDQoNCiAgSXQgaXMgaW50ZW5kZWQg dG8gYWNoaWV2ZSBleGNlbGxlbnQgdGltZSBjb21wbGV4aXR5IGFuZCBtZW1v cnkgdXNhZ2UuDQoNCiAgVGhpcyBpcyBhbiBpbml0aWFsIHJlbGVhc2UuIFRo ZSBsaWJyYXJ5IGhhcyBub3QgYmVlbiB0ZXN0ZWQgaW4NCiAgcHJvZHVjdGlv biwgYnV0IGhhcyByZWNlaXZlZCBleHRlbnNpdmUgdW5pdCB0ZXN0aW5nLCB2 aWEgYWZsLWZ1enogYW5kDQogIG9jYW1sK2FmbCDigJMgd2hpY2ggYXJlIHJl bWFya2FibHkgZWZmZWN0aXZlIHRvb2xzLCBieSB0aGUgd2F5IQ0KDQogIFRo aXMgaXMgd29yayBpbiBwcm9ncmVzczsgbW9yZSBmZWF0dXJlcywgc3VjaCBh cyBpdGVyYXRvcnMsIHdpbGwgYmUNCiAgYWRkZWQgaW4gdGhlIGZ1dHVyZS4N Cg0KICBUbyBpbnN0YWxsIFNlaywganVzdCB0eXBlDQoNCiAg4pSM4pSA4pSA 4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZSAmJiBvcGFtIGluc3RhbGwgc2Vr DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIERvY3VtZW50YXRpb24gaXMgW29u bGluZV0uDQoNCiAgRmVlZGJhY2sgaXMgd2VsY29tZSENCg0KICBBcnRodXIg Q2hhcmd1w6lyYXVkDQogIEZyYW7Dp29pcyBQb3R0aWVyDQogIHdpdGggY29u dHJpYnV0aW9ucyBieSDDiW1pbGllIEd1ZXJtZXVyDQoNCg0KW29ubGluZV0g PGh0dHA6Ly9jYW1iaXVtLmlucmlhLmZyL35mcG90dGllci9zZWsvZG9jL3Nl ay9TZWsvaW5kZXguaHRtbD4NCg0KDQpZYXJvbiBNaW5za3kgYXNrZWQgYW5k IEZhYmlhbiByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICAg ICAgICBJ4oCZbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBob3cgaXQg Y29tcGFyZXMgdG8NCiAgICAgICAgQmFzZS5TZXF1ZW5jZSBhbmQgU2VxIGlu IHRoZSBPQ2FtbCBkaXN0cmlidXRpb24sIGJ1dA0KICAgICAgICBzdXJlbHkg dGhlcmUgYXJlIG90aGVycyBhcyB3ZWxsLg0KDQogIFRoaXMgYWN0dWFsbHkg bG9va3MgbGlrZSBhbiBhcnJheS92ZWN0b3Igc3RydWN0dXJlIChzdXBwb3J0 aW5nLCBhbW9uZw0KICBvdGhlciB0aGluZ3MsIGZhc3QgYWNjZXNzIHRvIHRo ZSBudGggZWxlbWVudCksIHNvIGEgY29tcGFyaXNvbiB3aXRoDQogIGBDQ1Zl Y3RvcicsIGBDQ0Z1bl92ZWMnLCBgQmF0VmVjdCcsIGBDbGFyaXR5LlZlY3Rv cicgZXRjLiB3b3VsZCBiZQ0KICBtb3JlIGFwcHJvcHJpYXRlLiBUaGUgbmFt ZSBpcyBhIGJpdCB1bmZvcnR1bmF0ZSBjb25zaWRlcmluZyB0aGUgbmFtaW5n DQogIHVzZWQgaW4gdGhlIGdlbmVyYWwgZWNvc3lzdGVtLg0KDQogIFNvbWUg dGltZSBhZ28sIEkgYWRkZWQgc29tZSBjcnVkZSBiZW5jaG1hcmtzIHRvIFtj b250YWluZXJzJw0KICBiZW5jaHN1aXRlXS4gIEknbGwgc2VlIGlmIEkgY2Fu IGFkZCBTZWsgd2hlbiBJIGZpbmQgdGltZS4NCg0KDQpbY29udGFpbmVycycg YmVuY2hzdWl0ZV0NCjxodHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL29jYW1s LWNvbnRhaW5lcnMvYmxvYi9kMzRiNzU4OGIwMjhmMzYxOGNjNDRkM2Y0YzY0 MTcyOTVkYjU4NmM4L2JlbmNocy9ydW5fYmVuY2hzLm1sI0wxMTI+DQoNCg0K Z2FzY2hlIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIEkgdGhpbmsgaXQgcmVhbGx5IGlzIGEgc2VxdWVuY2UgbGlicmFy eSBpbiB0aGUgc2Vuc2UgdGhhdCBpbiBtYWludGFpbnMNCiAgYW4gaW4tb3Jk ZXIgc2VxdWVuY2Ugb2YgaXRlbXMsIGFuZCBzZXF1ZW5jZXMgY2FuIGJlIGpv aW5lZC9zcGxpdA0KICBlZmZpY2llbnRseS4gSXQgYWxzbyBwcm92aWRlcyBs b2dhcml0aG1pYyByYW5kb20gYWNjZXNzLCBidXQgdGhpcyBpcw0KICBwcm9i YWJseSBub3QgY29tcGV0aXRpdmUgd2l0aCBmaXhlZC1zaXplIGFycmF5cy4g SXQgd291bGQgYmUNCiAgY29tcGFyYWJsZSB0byAicGVyc2lzdGVudCB2ZWN0 b3IiIGxpYnJhcmllcywgcm9wZXMsIGZpbmdlciB0cmVlcywNCiAgZXRjLiBU aGUgZmFjdCB0aGF0IHRoZSBhdXRob3JzIGV4cG9zZSBhIFN0YWNrL1F1ZXVl IGludGVyZmFjZSBzdWdnZXN0cw0KICB0aGF0IGl0IGhhcyBhbHNvIGJlZW4g dHVuZWQgdG8gcGVyZm9ybSByZWFzb25hYmx5IHdlbGwgaW4gdGhpcyBjYXNl Lg0KDQogIEl0IGRvZXMgbm90IHByb3ZpZGUgYW55IGRlbGF5ZWQgY29tcHV0 YXRpb24gb2YgaXRlbXMsIHNvIGluIHRoYXQNCiAgcmVnYXJkIGl0IGlzIG5v dCBjb21wYXJhYmxlIHRvIFNlcXVlbmNlL1NlcS4NCg0KICBAY2hhcmd1ZXIg aGFzIGRlc2lnbmVkIHNpbWlsYXIgZGF0YXN0cnVjdHVyZXMgaW4gdGhlIHBh c3QgdG8gcmVwcmVzZW50DQogIHRoZSB3b3JrLXF1ZXVlcyBvZiBjb25jdXJy ZW50IHdvcmtlcnMgKHlvdSB3YW50IGF0IGxlYXN0IGEgZmFzdCAicHVzaCIN CiAgdG8gYWRkIGEgbmV3IHRhc2sgYW5kLCB3aGVuIGRvaW5nIHdvcmstc3Rl YWxpbmcsIGhhdmluZyBhIGZhc3QgInNwbGl0Ig0KICBpcyBjb252ZW5pZW50 KS4gU2VlIFtUaGVvcnkgYW5kIFByYWN0aWNlIG9mIENodW5rZWQgU2VxdWVu Y2VzXSwgVW11dA0KICBBY2FyLCBBcnRodXIgQ2hhcmd1w6lyYXVkLCBNaWtl IFJhaW5leSwgMjAxNCwgYW5kIFtBIFdvcmstRWZmaWNpZW50DQogIEFsZ29y aXRobSBmb3IgUGFyYWxsZWwgVW5vcmRlcmVkIERlcHRoLUZpcnN0IFNlYXJj aF0uDQoNCiAgQXMgZmFyIGFzIEkga25vdywgdGhlIE9DYW1sIGltcGxlbWVu dGF0aW9uIGp1c3QgcmVsZWFzZWQgaGFzIG5vdCBiZWVuDQogIHRlc3RlZC9i ZW5jaG1hcmtlZCBmb3IgcGFyYWxsZWwgYWxnb3JpdGhtcy4gSSB3b3VsZCBi ZSBjdXJpb3VzIHRvIHNlZQ0KICBhbiBleHBlcmltZW50IG9mIHBhcmFsbGVs IGdyYXBoIHRyYXZlcnNhbCB3aXRoIHRoaXMgc3RydWN0dXJlIGFuZA0KICBN dWx0aWNvcmUtT0NhbWwuDQoNCg0KW1RoZW9yeSBhbmQgUHJhY3RpY2Ugb2Yg Q2h1bmtlZCBTZXF1ZW5jZXNdDQo8aHR0cHM6Ly93d3cuY2hhcmd1ZXJhdWQu b3JnL3Jlc2VhcmNoLzIwMTQvY2h1bmtlZHNlcS9jaHVua2Vkc2VxLnBkZj4N Cg0KW0EgV29yay1FZmZpY2llbnQgQWxnb3JpdGhtIGZvciBQYXJhbGxlbCBV bm9yZGVyZWQgRGVwdGgtRmlyc3QgU2VhcmNoXQ0KPGh0dHBzOi8vd3d3LmNo YXJndWVyYXVkLm9yZy9yZXNlYXJjaC8yMDE1L3BkZnMvcGRmc19zYzE1LnBk Zj4NCg0KDQpBbm5vdW5jaW5nIGR1bmUtZGVwczogcHJvZHVjZXMgYSBwcm9q ZWN0LWNlbnRyaWMgZGVwZW5kZW5jeSBncmFwaA0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm5vdW5jaW5nLWR1bmUtZGVwcy1wcm9kdWNlcy1hLXByb2plY3QtY2Vu dHJpYy1kZXBlbmRlbmN5LWdyYXBoLzU0NTEvMT4NCg0KDQpNYXJ0aW4gSmFt Ym9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg SSdtIGhhcHB5IHRvIGFubm91bmNlIHRoZSBhdmFpbGFiaWxpdHkgb2YgW2R1 bmUtZGVwc10sIGEgY29tbWFuZC1saW5lDQogIHRvb2wgdGhhdCBzY2FucyBh IGR1bmUgcHJvamVjdCBhbmQgZ2F0aGVycyB0aGUgZGVwZW5kZW5jaWVzIGlu dG8gYQ0KICBncmFwaC4gVGhlIG91dHB1dCBpcyBpbiB0aGUgZG90IGZvcm1h dCwgc3VwcG9ydGVkIGJ5IHRoZSBgZG90JyBjb21tYW5kDQogIGZyb20gW2dy YXBodml6XS4NCg0KICBJdCBzaG93cyB0aGUgZGVwZW5kZW5jaWVzIGJldHdl ZW4gdGhlIGZvbGxvd2luZzoNCg0KICDigKIgbGlicmFyaWVzIGRlZmluZWQg YnkgdGhlIHByb2plY3QsDQogIOKAoiBleGVjdXRhYmxlcyBkZWZpbmVkIGJ5 IHRoZSBwcm9qZWN0LA0KICDigKIgZGlyZWN0IGRlcGVuZGVuY2llcyBvbiBl eHRlcm5hbCBsaWJyYXJpZXMuDQoNCiAgRGVwZW5kZW5jaWVzIGFyZSBleHRy YWN0ZWQgYnkgcGFyc2luZyBgZHVuZScgZmlsZXMuIEFzIGFuIGV4YW1wbGUs DQogIGhlcmUncyB3aGF0IHdlIG9idGFpbiBmb3IgdGhlIFtzb3VyY2VzIG9m IG9wYW1dLCB3aGljaCBoYXMgb3ZlciA1MEsNCiAgbGluZXMgb2YgY29kZToN Cg0KICA8aHR0cHM6Ly9hd3MxLmRpc2NvdXJzZS1jZG4uY29tL3N0YW5kYXJk MTEvdXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC9mL2Y2MjEzZmE3ZmRhNTI1 MjFjNjc4Mjk4ODE1NWFiMjNiOTk3ZGFmYjgucG5nPg0KDQogIFRoZSBjb21t YW5kcyBmb3IgdGhpcyBhcmU6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg IyBvYnRhaW4gdGhlIHByb2plY3QncyBzb3VyY2VzDQogIOKUgiAkIGdpdCBj bG9uZSAtLWRlcHRoPTEgaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0u Z2l0DQogIOKUgg0KICDilIIgIyBleHRyYWN0IGRlcGVuZGVuY2llcyBhbmQg ZWxpbWluYXRlIHN1cGVyZmx1b3VzIGdyYXBoIGVkZ2VzDQogIOKUgiAkIGR1 bmUtZGVwcyBvcGFtIHwgdHJlZCA+IGRlcHMuZG90DQogIOKUgg0KICDilIIg IyByZW5kZXIgdGhlIGdyYXBoDQogIOKUgiAkIGRvdCAtVHBuZyBkZXBzLmRv dCAtbyBkZXBzLnBuZw0KICDilJTilIDilIDilIDilIANCg0KICBBIHN1Z2dl c3Rpb24gaXMgdG8gaW5jbHVkZSBzdWNoIGdyYXBoIGluIHlvdXIgcHJvamVj dCdzIGBSRUFETUUubWQnLg0KDQoNCltkdW5lLWRlcHNdIDxodHRwczovL2dp dGh1Yi5jb20vbWphbWJvbi9kdW5lLWRlcHM+DQoNCltncmFwaHZpel0gPGh0 dHBzOi8vd3d3LmdyYXBodml6Lm9yZy8+DQoNCltzb3VyY2VzIG9mIG9wYW1d IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbT4NCg0KDQpPQ2FtbCBV c2VycyBhbmQgRGV2ZWxvcGVycyBNZWV0aW5nIDIwMjANCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtdXNlcnMtYW5kLWRldmVsb3BlcnMt bWVldGluZy0yMDIwLzU0NTQvMT4NCg0KDQpJdmFuIEdvdG92Y2hpdHMgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJ dCBpcyBteSBwbGVhc3VyZSB0byBpbnZpdGUgc3VibWlzc2lvbnMgdG8gdGhl IE9DYW1sIFVzZXJzIGFuZA0KICBEZXZlbG9wZXJzIFdvcmtzaG9wIDIwMjAs IHdoaWNoIGlzIGFnYWluIGNvLWxvY2F0ZWQgd2l0aCBJQ0ZQIGFuZCB3aWxs DQogIGJlIGhlbGQgb24gRnJpZGF5IDI4dGggQXVndXN0IDIwMjAgaW4gSmVy c2V5IENpdHksIE5KLCBVU0EuDQoNCiAgVGhlIE9DYW1sIFVzZXJzIGFuZCBE ZXZlbG9wZXJzIFdvcmtzaG9wIGJyaW5ncyB0b2dldGhlciB0aGUgT0NhbWwN CiAgY29tbXVuaXR5LCBpbmNsdWRpbmcgdXNlcnMgb2YgT0NhbWwgaW4gaW5k dXN0cnksIGFjYWRlbWlhLCBob2JieWlzdHMNCiAgYW5kIHRoZSBmcmVlIHNv ZnR3YXJlIGNvbW11bml0eS4gUHJldmlvdXMgZWRpdGlvbnMgaGF2ZSBiZWVu DQogIGNvLWxvY2F0ZWQgd2l0aCBJQ0ZQIHNpbmNlIDIwMTIgaW4gQ29wZW5o YWdlbiwgQm9zdG9uLCBHb3RoZW5idXJnLA0KICBOYXJhLCBPeGZvcmQsIFN0 IExvdWlzIGFuZCBsYXN0IHllYXIgaW4gQmVybGluLCBmb2xsb3dpbmcgT0Nh bWwNCiAgTWVldGluZ3MgaW4gUGFyaXMgaW4gMjAxMCBhbmQgMjAxMS4NCg0K DQpJbXBvcnRhbnQgTGlua3MNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiA8aHR0cHM6Ly9vY2FtbC5v cmcvbWVldGluZ3Mvb2NhbWwvMjAyMC8+DQogIOKAoiA8aHR0cHM6Ly9pY2Zw MjAuc2lncGxhbi5vcmcvaG9tZS9vY2FtbC0yMDIwPg0KICDigKIgPGh0dHBz Oi8vb2NhbWwyMDIwLmhvdGNycC5jb20vPg0KDQoNCkltcG9ydGFudCBEYXRl cw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAg4oCiIFRhbGsgcHJvcG9zYWwgc3VibWlzc2lvbiBkZWFkbGlu ZTogTWF5IDh0aCwgMjAyMCwgQW9FDQogIOKAoiBBdXRob3IgTm90aWZpY2F0 aW9uOiBKdW5lIDI2dGgsIDIwMjANCiAg4oCiIE9DYW1sIFdvcmtzaG9wOiBB dWd1c3QgMjh0aCwgMjAyMA0KDQoNClNjb3BlDQrilYzilYzilYzilYzilYwN Cg0KICBQcmVzZW50YXRpb25zIGFuZCBkaXNjdXNzaW9ucyBmb2N1cyBvbiB0 aGUgT0NhbWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UNCiAgYW5kIGl0cyBjb21t dW5pdHkuIFdlIGFpbSB0byBzb2xpY2l0IHRhbGtzIG9uIGFsbCBhc3BlY3Rz IHJlbGF0ZWQgdG8NCiAgaW1wcm92aW5nIHRoZSB1c2Ugb3IgZGV2ZWxvcG1l bnQgb2YgdGhlIGxhbmd1YWdlIGFuZCBpdHMgcHJvZ3JhbW1pbmcNCiAgZW52 aXJvbm1lbnQsIGluY2x1ZGluZywgZm9yIGV4YW1wbGUgKGJ1dCBub3QgbGlt aXRlZCB0byk6DQoNCiAg4oCiIGNvbXBpbGVyIGRldmVsb3BtZW50cywgbmV3 IGJhY2tlbmRzLCBydW50aW1lIGFuZCBhcmNoaXRlY3R1cmVzDQoNCiAg4oCi IHByYWN0aWNhbCB0eXBlIHN5c3RlbSBpbXByb3ZlbWVudHMsIHN1Y2ggYXMg R0FEVHMsIGZpcnN0LWNsYXNzDQogICAgbW9kdWxlcywgZ2VuZXJpYyBwcm9n cmFtbWluZywgb3IgZGVwZW5kZW50IHR5cGVzDQoNCiAg4oCiIG5ldyBsaWJy YXJ5IG9yIGFwcGxpY2F0aW9uIHJlbGVhc2VzLCBhbmQgdGhlaXIgZGVzaWdu IHJhdGlvbmFsZXMNCg0KICDigKIgdG9vbHMgYW5kIGluZnJhc3RydWN0dXJl IHNlcnZpY2VzLCBhbmQgdGhlaXIgZW5oYW5jZW1lbnRzDQoNCiAg4oCiIHBy b21pbmVudCBpbmR1c3RyaWFsIG9yIGV4cGVyaW1lbnRhbCB1c2VzIG9mIE9D YW1sLCBvciBkZXBsb3ltZW50cw0KICAgIGluIHVudXN1YWwgc2l0dWF0aW9u cy4NCg0KDQpQcmVzZW50YXRpb25zDQrilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0KICBUaGUgd29ya3Nob3AgaXMgYW4gaW5m b3JtYWwgbWVldGluZyB3aXRoIG5vIGZvcm1hbCBwcm9jZWVkaW5ncy4gVGhl DQogIHByZXNlbnRhdGlvbiBtYXRlcmlhbCB3aWxsIGJlIGF2YWlsYWJsZSBv bmxpbmUgZnJvbSB0aGUgd29ya3Nob3ANCiAgaG9tZXBhZ2UuIFRoZSBwcmVz ZW50YXRpb25zIG1heSBiZSByZWNvcmRlZCBhbmQgbWFkZSBhdmFpbGFibGUg YXQgYQ0KICBsYXRlciBkYXRlLg0KDQogIFRoZSBtYWluIHByZXNlbnRhdGlv biBmb3JtYXQgaXMgYSB3b3Jrc2hvcCB0YWxrLCB0cmFkaXRpb25hbGx5IGFy b3VuZA0KICAyMCBtaW51dGVzIGluIGxlbmd0aCwgcGx1cyBxdWVzdGlvbiB0 aW1lLCBidXQgd2UgYWxzbyBoYXZlIGEgcG9zdGVyDQogIHNlc3Npb24gZHVy aW5nIHRoZSB3b3Jrc2hvcCDigJMgdGhpcyBhbGxvd3MgdG8gcHJlc2VudCBt b3JlIGRpdmVyc2UNCiAgd29yaywgYW5kIGdpdmVzIHRpbWUgZm9yIGRpc2N1 c3Npb24uIFRoZSBwcm9ncmFtIGNvbW1pdHRlZSB3aWxsIGRlY2lkZQ0KICB3 aGljaCBwcmVzZW50YXRpb25zIHNob3VsZCBiZSBkZWxpdmVyZWQgYXMgcG9z dGVycyBvciB0YWxrcy4NCg0KDQpTdWJtaXNzaW9uDQrilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0KICBUbyBzdWJtaXQgYSBwcmVzZW50YXRp b24sIHBsZWFzZSByZWdpc3RlciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWxr DQogIChhYm91dCAyIHBhZ2VzIGxvbmcpIGF0DQoNCiAgPGh0dHBzOi8vb2Nh bWwyMDIwLmhvdGNycC5jb20vPg0KDQogIHByb3ZpZGluZyBhIGNsZWFyIHN0 YXRlbWVudCBvZiB3aGF0IHdpbGwgYmUgcHJvdmlkZWQgYnkgdGhlDQogIHBy ZXNlbnRhdGlvbjogdGhlIHByb2JsZW1zIHRoYXQgYXJlIGFkZHJlc3NlZCwg dGhlIHNvbHV0aW9ucyBvcg0KICBtZXRob2RzIHRoYXQgYXJlIHByb3Bvc2Vk Lg0KDQogIExhVGVYLXByb2R1Y2VkIFBERnMgYXJlIGEgY29tbW9uIGFuZCB3 ZWxjb21lIHN1Ym1pc3Npb24gZm9ybWF0LiBGb3INCiAgYWNjZXNzaWJpbGl0 eSBwdXJwb3Nlcywgd2UgYXNrIFBERiBzdWJtaXR0ZXJzIHRvIGFsc28gcHJv dmlkZSB0aGUNCiAgc291cmNlcyBvZiB0aGVpciBzdWJtaXNzaW9uIGluIGEg dGV4dHVhbCBmb3JtYXQsIHN1Y2ggYXMgLnRleA0KICBzb3VyY2VzLiBSZXZp ZXdlcnMgbWF5IHJlYWQgZWl0aGVyIHRoZSBzdWJtaXR0ZWQgUERGIG9yIHRo ZSB0ZXh0DQogIHZlcnNpb24uDQoNCg0KTUwgZmFtaWx5IHdvcmtzaG9wDQri lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYwNCg0KICBUaGUgTUwgZmFtaWx5IHdvcmtzaG9wLCBoZWxkIG9u IHRoZSBwcmV2aW91cyBkYXksIGRlYWxzIHdpdGggZ2VuZXJhbA0KICBpc3N1 ZXMgb2YgdGhlIE1MLXN0eWxlIHByb2dyYW1taW5nIGFuZCB0eXBlIHN5c3Rl bXMsIGZvY3VzZXMgb24gbW9yZQ0KICByZXNlYXJjaC1vcmllbnRlZCB3b3Jr IHRoYXQgaXMgbGVzcyBzcGVjaWZpYyB0byBhIGxhbmd1YWdlIGluDQogIHBh cnRpY3VsYXIuIFRoZXJlIGlzIGFuIG92ZXJsYXAgYmV0d2VlbiB0aGUgdHdv IHdvcmtzaG9wcywgYW5kIHdlIGhhdmUNCiAgb2NjYXNpb25hbGx5IHRyYW5z ZmVycmVkIHByZXNlbnRhdGlvbnMgZnJvbSBvbmUgdG8gdGhlIG90aGVyIGlu IHRoZQ0KICBwYXN0LiBBdXRob3JzIHdobyBmZWVsIHRoZWlyIHN1Ym1pc3Np b24gZml0cyBib3RoIHdvcmtzaG9wcyBhcmUNCiAgZW5jb3VyYWdlZCB0byBt ZW50aW9uIGl0IGF0IHN1Ym1pc3Npb24gdGltZSBhbmQvb3IgY29udGFjdCB0 aGUgUHJvZ3JhbQ0KICBDaGFpcnMuDQoNCg0KUHJvZ3JhbSBDb21taXR0ZWUN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIOKAoiBJdmFuIEdvdG92Y2hpdHMsIENNVSwgVVNBDQog IOKAoiBGbG9yaWFuIEFuZ2VsZXR0aSwgSU5SSUEsIEZyYW5jZQ0KICDigKIg Q2hyaXMgQ2FzaW5naGlubywgRHJhcGVyIExhYm9yYXRvcnksIFVTQQ0KICDi gKIgQ2F0aGVyaW5lIEdhc25pZXIsIEZhY2Vib29rLCBVU0ENCiAg4oCiIFJ1 ZGkgR3JpbmJlcmcsIE9DYW1sIExhYnMsIFVLDQogIOKAoiBPbGVnIEtpc2Vs eW92LCBUb2hva3UgVW5pdmVyc2l0eSwgSmFwYW4NCiAg4oCiIEFuZHJlYXMg Um9zc2JlcmcsIERmaW5pdHkgU3RpZnR1bmcsIEdlcm1hbnkNCiAg4oCiIE1h cmNlbGxvIFNlcmksIFVuaXZlcnNpdHkgb2YgR3JvbmluZ2VuLCBOZXRoZXJs YW5kcw0KICDigKIgRWR3aW4gVG9yb2ssIENpdHJpeCwgVUsNCiAg4oCiIExl byBXaGl0ZSwgSmFuZSBTdHJlZXQsIFVTQQ0KICDigKIgR3JldGEgWW9yc2gs IEphbmUgU3RyZWV0LCBVU0ENCiAg4oCiIFNhcmFoIFplbm5vdSwgQWlyYnVz LCBGcmFuY2UNCg0KDQpDT1ZJRC0xOSBOb3RpY2UNCuKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdoaWxlIElD RlAtMjAgW2lzIHN0aWxsIHNjaGVkdWxlZCB0byBiZSBoZWxkIGFzIHBsYW5u ZWRdLCBjaGFuY2VzIGFyZQ0KICBoaWdoIHRoYXQgaXQgd2lsbCBiZSB0dXJu ZWQgaW50byBhIHZpcnR1YWwgY29uZmVyZW5jZS4gV2hpY2ggbWVhbnMgYQ0K ICB3aWRlciBhdWRpZW5jZSBhbmQgcmVkdWNlZCAoaG9wZWZ1bGx5KSBmZWVz LiBXZSB3aWxsIGtlZXAgeW91IHBvc3RlZC4NCg0KDQpbaXMgc3RpbGwgc2No ZWR1bGVkIHRvIGJlIGhlbGQgYXMgcGxhbm5lZF0NCjxodHRwczovL2ljZnAy MC5zaWdwbGFuLm9yZy9ob21lL2ljZnAtMjAyMD4NCg0KDQpRdWVzdGlvbnMg YW5kIGNvbnRhY3QNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFBsZWFzZSBz ZW5kIGFueSBxdWVzdGlvbnMgdG8gdGhlIGNoYWlyOiBJdmFuIEdvdG92Y2hp dHMgKGl2Z0BpZWVlLm9yZykNCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDi lZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlv dSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0 IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBv ciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYg eW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFp bCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4g U2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxh bi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVd IDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBm ZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHA6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5p ZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFu IFNjaG1pdHRdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= 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 March 31 to April 07,= 2020.

Making a music player in OCaml

Dracose asked

I'm interested in making my own music player in OCaml so I wanted to know whether there were any existing ones and/or examples of how to make one. Be= ar in mind, I am interested in the actual logic of how to read a music file (or a playlist) and listening to it, rather than the front-end part of a music pl= ayer. (My knowledge of OCaml is intermediate)

Thomas Blanc suggested

Yotam Barnoy then said

Wow @PatJ I didn't know about liquidsoap. I added it to ocamlverse. This is= what we have for the audio page now, in case it's helpful to the OP: https://ocamlverse.github.io/content/audio.html

gndl also replied

I experimented with several solutions in the playo project. One of the possible solutions is to use ocaml-gstreamer. If you find that the gstreamer framework is too annoying (which I can under= stand :-), you can use ocaml-ffmpeg. note = however that, in the latest version of ocaml-ffmpeg, the audio device output no longer works. To overcome this drawback, you can use ocaml-portaudio.

The end of Camlp4

Continuing this old thread, Chet Murthy announced

Perhaps worth mentioning briefly that for anybody who -wants- to continue u= sing camlp4, I'm (a) maintaining camlp5 and bringing it up-to-date with everything in ocaml 4.10.0 that I can think= of, and (b) I'd be happy to help them port their dependency over to camlp5.

This is not to be construed as an argument for using camlp4/5.

OCamlformat 0.14.0

Etienne Millon announced

On behalf of the development team, I'd like to announce the release of ocam= lformat version 0.14.0 :tada:.

Here are the main highlights of this release:

Support for OCaml 4.10

This means both that it compiles and runs using this version, but also that= it can format 4.10-specific language features (module _ and multi-indices operators).

Preliminary support for invalid files

As OCamlformat operates on ASTs, it normally requires a valid input file. T= his release adds a --format-invalid-files option to detect invalid parts and prin= t them verbatim. This feature is still experimental.

Preserving more concrete syntax

Starting with this release, OCamlformat is going to preserve more concrete = syntax. For example, module M =3D functor (K : S) -> struct end and module M (K : S) =3D struct end are equivalent. In the past, both variants would be formatted as the latter. Now, the original syntax is preserved. In some cas= es, preserving was possible through the means of an option: for example, to choice between let%name x =3D e i= n body and [%name let x =3D e in body], was controlled by the extension-sugar option. This option is now d= eprecated and OCamlformat will now always preserve what was in the source file (this was the default behaviour).

Similarly, it was possible to control how special characters are escaped in= string and character literals through the escape-strings and escape-chars options. They are= being deprecated and the only possible behavior will be preserving the concrete syntax (as done by default).

The reason for this change is that we feel that ocamlformat should be just = about formatting. The fact that this behavior was configurable is in part due to the fact that it operates on OC= aml ASTs, but end users should not have to be surprised by their code being transformed on reformatting.

In the future, we plan to extend that to other similar constructs, such as = using (~/)~ or begin~/~end, or spacing between module items.

Placement of doc comments

Placing doc comments (** ... *) is controlled by the doc= -comments configuration option. It is always possible to put them before the item they refer to, and this is what the doc-comm= ents=3Dbefore option does. The alternative doc-comments=3Dafter will try to do its best to put them after= , but in some cases it is not possible. For example, in a variant type declaration, a doc-comment put immediately after will be att= ached to the last constructor by documentation tools. Ocamlformat needs to preserve the meaning of programs,= so in these cases, it will instead put the comment before. In the case of module declarations, putting the comment after might not be ve= ry useful if the corresponding module is very large.

This requires a complex rule to determine which comments will be put before= and which comments will be put after. So in this version, we are deprecating this mechanism and replacing it with a = simpler one controlled by doc-comments-val that applies only to val<= /code> and external items. For these items, it is always possible to attach documents before or after them. For all other items, lik= e type or module declarations, the doc comments will consistenly be put before.

Many bugs found by fuzzing

We hooked ocamlformat to AFL, looking for programs that parse correctly but= trigger errors during formatting. This approach worked very well and more than 20 logical bugs were found with this technique.

Upgrading

To upgrade from ocamlformat 0.13.0, one needs to upgrade the ocamlformat bi= nary and replace the version field in .ocamlformat files by 0.14.0 and then:

  • if you used doc-comments=3Dafter, you can replace it by doc-comments-val=3Dafter. This will move doc-comments on module items except val and external ones.
  • if you used doc-comments=3Dbefore, you can remove it as it= is now the default.
  • if you set escape-chars=3Dpreserve, escape-strings= =3Dpreserve, or extension-sugar=3Dpreserve explicitly, = you can

remove them safely (they were the default)

  • if you used another value for one of these options (such as escap= e-strings=3Dhexadecimal), you will need to remove them as well. This= will not trigger a diff, but ocamlformat will not enforce a particular con= crete syntax for new code.

A note for new users

We encourage you to try ocamlformat, that can be installed from opam direct= ly (opam install ocamlformat), but please remember that it is still beta software. We added a FAQ for new users that should help you decide if ocamlformat is the right choice for you.

Etienne Millon later added

This upgrade is likely to generate a huge diff on projects that use the def= ault profile, so I would like to expand a bit on the reason.

According to the syntax rules used by the ocaml tools (the ocaml compilers, ocamldoc, odoc), it is always possible to put the doc-comment before an ite= m.

Some teams prefer to put the documentation after. But that is not always po= ssible. For example, type t =3D A | B (** doc *) will attach t= he doc-comment to B, not to t. The only way to at= tach the comment to t is by putting the comment before.

Enter ocamlformat: doc-comment placement is controlled by an option with tw= o values, before or after. before will always place the comment before. after determines if it i= s possible to put the comment after, and if it is not, will put it before.

Some items cannot have comments after, like variant types (as described abo= ve). But there is another reason not to put comments after. In some cases, that can put the comment far from the th= ing it is documenting. Considering modules, the following is nice:

module M =3D L.M
(** doc *)

But this is not great is the structure is large:

module M =3D struct
  ...
  ...
end
(** doc *)

To summarize, when ocamlformat is configured to put comments after, it has = to follow a complex heuristic to determine whether it has to fallback to before. In the case of a module, it depends o= n its shape, how many functor arguments are there, this kind of things (for various reasons, we don't know how larg= e something is going to be in advance, so we have to look at its shape). The point is that it is complicated to under= stand and explain, and that fixing it always makes it more complex. Another aspect is that in the end, we want oc= amlformat to be pretty stable when it reaches 1.0.0, and complex rules are at odds with this goal.

So, we have decided to simplify the rule: instead of looking deep in the AS= T, we just look at the kind of item this is. For val and external items, it is always poss= ible to put the doc-comment after, so we follow exactly what the configuration option says.

As a user of the default profile, what this means for you: for items that a= re not val or external, and considered "simple" by the 0.13.0 heuristic, doc-comments are going to move from after= to before.

Based on these reasons, you will understand that before is alw= ays simpler. You can opt into this by setting doc-comments-val=3Dbefore. This will cause an even larger diff= as all items are going to move before (that is: all items described just above, plus val and external= items), but the rule gets extremely simple (everything is put before). It is possible that this option will become the default in the fut= ure, but we have not decided this yet (in this case, if you did not opt into it, you will see comments on val and external items move at that time).

ML Family Workshop 2020: Call for presentations

Leo White announced

We are happy to invite submissions to the ML Family Workshop 2020, to be held during the ICFP conference week on Thursday, August 27th.

The ML family workshop warmly welcomes submission touching on the programming languages traditionally seen as part of the "ML family" (Standard ML, OCaml, F#, CakeML, SML#, Manticore, MetaOCaml, etc.). The scope of the workshop includes all aspects of the design, semantics, theory, application, implementation, and teaching of the members of the ML family. We also encourage presentations from related languages (such as Haskell, Scala, Rust, Nemerle, Links, Koka, F*, Eff, ATS, etc), to exchange experience of further developing ML ideas.

Currently, the workshop is still scheduled to go ahead as planned in Jersey City, however it is likely that the ML workshop will end up being a virtual workshop this year. Either way provisions will be made to allow speakers to present their work remotely.

See our detailed CFP online on the ICFP website:

https://i= cfp20.sigplan.org/home/mlfamilyworkshop-2020

Important dates

  • Friday 15th May (any time zone): Abstract submission deadline
  • Friday 26th June: Author notification
  • Thursday 27th August: ML Family Workshop

Program committee

  • Youyou Cong (Tokyo Institute of Technology)
  • Gowtham Kaki (Purdue University)
  • Neel Krishnaswami (University of Cambridge)
  • Daan Leijen (Microsoft Research)
  • Koko Muroya (Kyoto University)
  • Atsushi Ohori (Tohoku University)
  • Jonathan Protzenko (Microsoft Research)
  • Gabriel Radanne (INRIA)
  • Claudio Russo (Dfinity)
  • Leo White (Jane Street) (Chair)
  • Jeremy Yallop (University of Cambridge)

Submission details

See the online CFP for the details on the expected submission format.

Submissions must be uploaded to the workshop submission website

https://ml2020.hotcrp.com/

before the submission deadline.

Announcing Sek, an efficient implementation of sequences

Fran=C3=A7ois Pottier announced

We are pleased to announce the first release of Sek, an OCaml library that offers an efficient implementation of sequences.

The library offers both ephemeral (mutable) sequences and persistent (immutable) sequences, and offers constant-time conversions between these flavors.

It supports all of the standard operations on stacks, queues, deques (e.g. push, pop at either end), catenable sequences (concat, split), and random access sequences (get, set).

Data is stored internally in chunks (fixed-capacity arrays), which is why this data structure is known as a chunK SEquence.

It is intended to achieve excellent time complexity and memory usage.

This is an initial release. The library has not been tested in production, but has received extensive unit testing, via afl-fuzz and ocaml+afl – which are remarkably effective tools, by the way!

This is work in progress; more features, such as iterators, will be added in the future.

To install Sek, just type

opam update && opam install sek

Documentation is online.

Feedback is welcome!

Arthur Chargu=C3=A9raud
Fran=C3=A7ois Pottier
with contributions by =C3=89milie Guermeur

Yaron Minsky asked and Fabian replied

I=E2=80=99m particularly interested in how it compares to Base.Sequence and= Seq in the OCaml distribution, but surely there are others as well.

This actually looks like an array/vector structure (supporting, among other= things, fast access to the nth element), so a comparison with CCVector, CCFun_vec, B= atVect, Clarity.Vector etc. would be more appropriate. = The name is a bit unfortunate considering the naming used in the general ecosystem.

Some time ago, I added some crude benchmarks to containers' benchsuite. I'll see if I can add Sek when I find time.

gasche said

I think it really is a sequence library in the sense that in maintains an i= n-order sequence of items, and sequences can be joined/split efficiently. It also provides logarithmic random access= , but this is probably not competitive with fixed-size arrays. It would be comparable to "persistent vector" libra= ries, ropes, finger trees, etc. The fact that the authors expose a Stack/Queue interface suggests that it has also b= een tuned to perform reasonably well in this case.

It does not provide any delayed computation of items, so in that regard it = is not comparable to Sequence/Seq.

@charguer has designed similar datastructures in the past to represent the = work-queues of concurrent workers (you want at least a fast "push" to add a= new task and, when doing work-stealing, having a fast "split" is convenien= t). See Theory and Practice of Chunked Sequences, Umut Acar, Arthu= r Chargu=C3=A9raud, Mike Rainey, 2014, and A Work-Efficient Algorithm for Par= allel Unordered Depth-First Search.

As far as I know, the OCaml implementation just released has not been teste= d/benchmarked for parallel algorithms. I would be curious to see an experiment of parallel graph traversal with this= structure and Multicore-OCaml.

Announcing dune-deps: produces a project-centric dependency gr= aph

Martin Jambon announced

I'm happy to announce the availability of dune-deps, a command-line tool that scans a dune project and gathers the dependencies into a graph. The output = is in the dot format, supported by the dot command from graphvi= z.

It shows the dependencies between the following:

  • libraries defined by the project,
  • executables defined by the project,
  • direct dependencies on external libraries.

Dependencies are extracted by parsing dune files. As an exampl= e, here's what we obtain for the = sources of opam, which has over 50K lines of code:

3D"f6213fa7fda5=

The commands for this are:

# obtain the project's sources
$ git clone --depth=3D1 https://github.com/ocaml/opam.git

# ex=
tract dependencies and eliminate superfluous graph edges
$ dune-deps opam | tred > deps.dot

# re=
nder the graph
$ dot -Tpng deps.dot -o deps.png

A suggestion is to include such graph in your project's README.md.

OCaml Users and Developers Meeting 2020

Ivan Gotovchits announced

It is my pleasure to invite submissions to the OCaml Users and Developers Workshop 2020, which is again co-located with ICFP and will be held on Friday 28th August 2020 in Jersey City, NJ, USA.

The OCaml Users and Developers Workshop brings together the OCaml community, including users of OCaml in industry, academia, hobbyists and the free software community. Previous editions have been co-located with ICFP since 2012 in Copenhagen, Boston, Gothenburg, Nara, Oxford, St Louis and last year in Berlin, following OCaml Meetings in Paris in 2010 and 2011.

Important Dates

  • Talk proposal submission deadline: May 8th, 2020, AoE
  • Author Notification: June 26th, 2020
  • OCaml Workshop: August 28th, 2020

Scope

Presentations and discussions focus on the OCaml programming language and its community. We aim to solicit talks on all aspects related to improving the use or development of the language and its programming environment, including, for example (but not limited to):

  • compiler developments, new backends, runtime and architectures
  • practical type system improvements, such as GADTs, first-class modules, generic programming, or dependent types
  • new library or application releases, and their design rationales
  • tools and infrastructure services, and their enhancements
  • prominent industrial or experimental uses of OCaml, or deployments in unusual situations.

Presentations

The workshop is an informal meeting with no formal proceedings. The presentation material will be available online from the workshop homepage. The presentations may be recorded and made available at a later date.

The main presentation format is a workshop talk, traditionally around 20 minutes in length, plus question time, but we also have a poster session during the workshop – this allows to present more diverse work, and gives time for discussion. The program committee will decide which presentations should be delivered as posters or talks.

Submission

To submit a presentation, please register a description of the talk (about 2 pages long) at

https://ocaml2020.hotcrp.com/

providing a clear statement of what will be provided by the presentation: the problems that are addressed, the solutions or methods that are proposed.

LaTeX-produced PDFs are a common and welcome submission format. For accessibility purposes, we ask PDF submitters to also provide the sources of their submission in a textual format, such as .tex sources. Reviewers may read either the submitted PDF or the text version.

ML family workshop

The ML family workshop, held on the previous day, deals with general issues of the ML-style programming and type systems, focuses on more research-oriented work that is less specific to a language in particular. There is an overlap between the two workshops, and we have occasionally transferred presentations from one to the other in the past. Authors who feel their submission fits both workshops are encouraged to mention it at submission time and/or contact the Program Chairs.

Program Committee

  • Ivan Gotovchits, CMU, USA
  • Florian Angeletti, INRIA, France
  • Chris Casinghino, Draper Laboratory, USA
  • Catherine Gasnier, Facebook, USA
  • Rudi Grinberg, OCaml Labs, UK
  • Oleg Kiselyov, Tohoku University, Japan
  • Andreas Rossberg, Dfinity Stiftung, Germany
  • Marcello Seri, University of Groningen, Netherlands
  • Edwin Torok, Citrix, UK
  • Leo White, Jane Street, USA
  • Greta Yorsh, Jane Street, USA
  • Sarah Zennou, Airbus, France

COVID-19 Notice

While ICFP-20 is stil= l scheduled to be held as planned, chances are high that it will be turned into a virtual conference. Which means a wider audie= nce and reduced (hopefully) fees. We will keep you posted.

Questions and contact

Please send any questions to the chair: Ivan Gotovchits (ivg@ieee.org)

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.

--=-=-=--