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 c5ff346549e7 (Postfix) with ESMTPS id 810DC5D5 for ; Tue, 16 Nov 2021 08:41:28 +0000 (UTC) IronPort-Data: =?us-ascii?q?A9a23=3A7f5QYaAmpJqR3RVW/w7iw5YqxClBgxIJ4g17XOL?= =?us-ascii?q?fAFPt02sh0zAByWEYXzvUb6nfYDPwctlybI3j90kOucWAx9UxeLYW3SE0HigS8?= =?us-ascii?q?aIpJvzAcxyuZ3vKRiH7ofMOA/w2MrEsF+hpCC+DzvuRGuK59yAljPjWHuOU5NP?= =?us-ascii?q?sYUideyc1EU/Ntjozw4bVsqYw6TSIK1vlVeHa+6UzC3f5s9JACV/43orYwP9ZU?= =?us-ascii?q?FsejxtD1rA2TagjUFYzDBD5BrpHTU26ByOQroW5goeHq+j/ILGRpgs1/j82G9a?= =?us-ascii?q?9m/D6dFcLS/jcJ2BiiFIPAfjk00ME/3JolP9lbJLwam8O49mNt9t4zdEIsZ2rV?= =?us-ascii?q?UIuIavBgswcVQNZGmdwJ8Wq/ZeccSDu4JDPp6HBWz62qxl0N2k9NIgc4OdwHUl?= =?us-ascii?q?H9OYdITEJKBuI78q9ybe/D+1tndgLJ9L3O5kc/HZ6wlnxBv8jRZTCWLni6dhf2?= =?us-ascii?q?To9nIZFGvO2T8EQbD4qaBXbfzVBO10QDps1l+bugWPwGxVToVecv6M77nTO3CR?= =?us-ascii?q?+1bHsNJzefdnibc5cmVSYq2Ser0z2BxgbMJqUzj/t2nmlnvPGnCXnWJ8UGLCi3?= =?us-ascii?q?vFviVyXgGcUDXU+XlK+pby9i1Wic9NZIUsEvC0lpK02skuxQbHVVBS9pHqFpQI?= =?us-ascii?q?0WtxbEv835EeGza+8yw2QAmUCQjdbc906udQeRDoxyl6ClJXuHzMHmLacTHbY8?= =?us-ascii?q?raPsRu3PSkOMXREeS8JUhEE/8Xupp40lB6JRdFmeJNZJPWd9SrY2yqNoG06hq4?= =?us-ascii?q?PgNUWjvX9/FbdgjvqqIKhc+L83S2PNkrN0++zTNL1D2Bw1WXm0A=3D=3D?= X-IronPort-AV: E=Sophos;i="5.87,238,1631570400"; d="scan'208,217";a="3809944" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 16 Nov 2021 09:41:26 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id C4BCBE0385; Tue, 16 Nov 2021 09:41:25 +0100 (CET) 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 5CA14E0092 for ; Tue, 16 Nov 2021 09:41:18 +0100 (CET) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=ahyI=QD=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org IronPort-PHdr: =?us-ascii?q?A9a23=3AE4qIcB1CPmRuuxJgsmDO6wEyDhhOgF0UFjAc5pd?= =?us-ascii?q?vsb9SaKPrp82kYBaHo6Q0xwKWFazgqNt8w9LMtK7hXWFSqb2gi1slNKJ2ahkel?= =?us-ascii?q?M8NlBYhCsPWQWfyLfrtcjBoVJ8aDAwt8H60K1VaF9jjbFPOvHKy8SQSGhLiPgZ?= =?us-ascii?q?pO+j5AIHfg9qr2+yo/5DffgpEiTq/bLhvMBi4sALdu9UMj4B/MKgx0BzJonVJe?= =?us-ascii?q?+RS22xlIE+Ykgj/6Mmt4pNt6jxctP09+cFOV6X6ZLk4QqdDDDs6KWA15dbkugf?= =?us-ascii?q?FQACS+3YTSGQWkh5PAwjY8BH3W4r6vyXmuuZh3iSRIMr5Q60pWTS596dkVgPni?= =?us-ascii?q?DsJOT4+9WHYkM1wjKRGqx6lqBFyx4vYbYeVOPR9eKPdY9IaRXFAXslKUyxOHJ6?= =?us-ascii?q?3boUID+obIOlYtJT2q18AoBeiAAWhAv7kxD1ViX/sxaA00/ovHxzI0gIjEN0Br?= =?us-ascii?q?G/Zo8/pOKoIS+250LXEwDfFYvhL2Tn98o/IchU5rPyQWbJ/a8zRwlQyGQzZjlW?= =?us-ascii?q?QrI3lPy+J1u8QtGWU9e5gWvipi2I9sAF+vjivxsItionVmoIY0UjE9SJ9wIc1O?= =?us-ascii?q?d23VlJ0Yd6iEJtRriGaKpV5TtklQ2FytyY307sLsoO0cyYW0poo3QLfa+CZfIi?= =?us-ascii?q?S5BLuTOecLCt6iX9meL+yhxm//FWhx+HhWMe500tHojdEn9XSqH0Ayx3e5MeDR?= =?us-ascii?q?/Zg8UqtxSuD2gDT5+1YPEw5ka7WJ4Anz7UtmJQTtkHDETX3mEXwlKKWblsr+vS?= =?us-ascii?q?p6+T7fLrmvpicN4pxig7gKKgunNKwAfggPggJQ2eU4+G81Ln58U3+WrVKgeU6n?= =?us-ascii?q?bXbsJDdJMQboLK5DxVJ3YYk7hazFzim0NUEnXkHMVJKYwiLgJTuO1HLOPz4Ava?= =?us-ascii?q?/g0iskDd23P/KJLzhApLVInjZl7fhZqpy609Bxwou1tBT/Y5bCrYEIP7rVE7xt?= =?us-ascii?q?d/YDh4hMwOq3unnCc9y2pkZWWKVDa+VKKTSsUeW6eIpPeaMYoAVuDfnJPc45v7?= =?us-ascii?q?ui2U2lUUbfaa3wZsbcGy3HvN7LEqHenXjnM0BEWgQsgo5Vuzqh0WOUT9VZ3arW?= =?us-ascii?q?6Iz/Co0BJigDYjdWoChmKeB3DuhHp1RfmBGCk6DHW3pd4WBQ/sNZyeSItd5kjA?= =?us-ascii?q?eUrihUYAh2QmotA/j0LpoNfDY+iwftZ77ytd14+jTmQg29TNuCcSd3HuBT2Zun?= =?us-ascii?q?mMHXzM22bpwoU17yluZ1Kh4h+RUFdhN6PxTXAc6MYDTz/B4C9DpQA7OYtCJSFO?= =?us-ascii?q?+TtWpBzExU8g9w9gUY0ZyA9mijw3M3iquA78RjbCLA4Y08q3a0nPsJMh9027L2?= =?us-ascii?q?LQ/g1QiWMdDKHGqi6Fl+wXdG4LFiUuUmqmyeagB0iPB6X2PwXSOsUxXSgJ8TLn?= =?us-ascii?q?JUWoCakbUsdj04F7JQaW0BrQ9KARBzNaPKqtUZd3tilVLXPLjOdvDb26rg2ewA?= =?us-ascii?q?hKIx7OQbIX0Z2od3CPdCEkdkwAO43mKLw8+Bj2uo27GDTxuE0zgY1/0/OVjtn+?= =?us-ascii?q?2SlU4wxyWY0Buzba49AIZieaSRv4cxr4EvT0uqzRwHFazxdLWDN+AqhJ8cqtAf?= =?us-ascii?q?N0x/E9K2njZtw19PZKtN7tsiFAGfgRvuEPu0xV2Cplensc2rHMqygtyKbuF0Fx?= =?us-ascii?q?fbT+Y2orwOrLPJ2bo+BCgcajW1kvF0NmK+qcP7fU4q0n/vAyyDUUi9Ghn099J3?= =?us-ascii?q?HSC/ZXGFg8SXJ3+U0ot8Bh6vb7abjEn54zIzX1sLbW0sjja1t01HuQlzxKgc85?= =?us-ascii?q?bMKOFDw/yD9YXB9OuKewvg1imdAgIPOFU9K4uPsOpbeGK2KCxPLUooDXzx2BY5?= =?us-ascii?q?so1hkaT8QJ4VeiO2ZsZlbXQlACYUX20xAOqrcbfnYFfeSpUH2auzSyiA5ReMOk?= =?us-ascii?q?6do8ODSKqItar7tR4nZ/kHXBCp3C5AFZT8cugf1KpZFz43BFMnRAepXWh3zCzz?= =?us-ascii?q?zl1jy0Btq2bzTDDyOTkdQMaNyhMXmY03gSkGpS9k91PBBvgVAMujhbwuheSL0d?= =?us-ascii?q?zrqNiKWLeWgFNIziwKHttAPLYXluqZt4WrosvtTRLXe+8Z1GDV7O7pAEVgXqL9?= =?us-ascii?q?4523Dc/Zi2nsZX/ngVnhSSaNnkh9RLk?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3Av2vkqqNRNCgHT8BcTsajsMiBIKoaSvp037BL?= =?us-ascii?q?7SBMoHNuHfBw+/rFoB15737JYVQqNk3I8OroUMK9qBjnmaKdj7N9AZ6SGCHY/E?= =?us-ascii?q?GoIIth4YaK+UyCJwTOsshH2+NFe6h6YeeAaGSSYPyKgjWFLw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DnAAASaxphmCIeaIFahAVZQQFkVzoxh?= =?us-ascii?q?EeJBIZFgiSDKIV1hleNHANPEAEDAQ0qAQ4FAQIEAQGEeoJUAh4GAQUzEwECBBU?= =?us-ascii?q?BAQUBAQECAQMDBAETAQEBAQEBAQEJCxAGOiSFaA2CNQwMAwODdwEYAQgEBmUUD?= =?us-ascii?q?wMUAQYDAgQNARcBFAoDFAESGgKCCksBgwcFCkKLIJwKfzKBAYNNARYBDgmEO4F?= =?us-ascii?q?jDQIUgReFcFNIgm4Ig3ACJxCBVUSBFYIkUW6BT3wXAQEBAQGBOwEBCIMvgmQEg?= =?us-ascii?q?yEmDj4BAQ0+FQIYCQoBKQEBFwk3AQkJEQoLAQoZKwUBA0oLEScCA5EUIw6MQ4o?= =?us-ascii?q?4k1drLQeDK4ExBguHZoEVjEWHe4NlgUiKG4ZEkGkhlXCCHoVbfIEGBQmBdEGFf?= =?us-ascii?q?I00JxOFHYFNKoFMGw8HMxowgngBAQExCRZKDleNIQEzFoEEAQgBgkKCUROBPDk?= =?us-ascii?q?7hUtAMgIBATQCBgEKAQEDCYEIAQEFEwsBhgItghgBAQ?= X-IPAS-Result: =?us-ascii?q?A0DnAAASaxphmCIeaIFahAVZQQFkVzoxhEeJBIZFgiSDKIV?= =?us-ascii?q?1hleNHANPEAEDAQ0qAQ4FAQIEAQGEeoJUAh4GAQUzEwECBBUBAQUBAQECAQMDB?= =?us-ascii?q?AETAQEBAQEBAQEJCxAGOiSFaA2CNQwMAwODdwEYAQgEBmUUDwMUAQYDAgQNARc?= =?us-ascii?q?BFAoDFAESGgKCCksBgwcFCkKLIJwKfzKBAYNNARYBDgmEO4FjDQIUgReFcFNIg?= =?us-ascii?q?m4Ig3ACJxCBVUSBFYIkUW6BT3wXAQEBAQGBOwEBCIMvgmQEgyEmDj4BAQ0+FQI?= =?us-ascii?q?YCQoBKQEBFwk3AQkJEQoLAQoZKwUBA0oLEScCA5EUIw6MQ4o4k1drLQeDK4ExB?= =?us-ascii?q?guHZoEVjEWHe4NlgUiKG4ZEkGkhlXCCHoVbfIEGBQmBdEGFfI00JxOFHYFNKoF?= =?us-ascii?q?MGw8HMxowgngBAQExCRZKDleNIQEzFoEEAQgBgkKCUROBPDk7hUtAMgIBATQCB?= =?us-ascii?q?gEKAQEDCYEIAQEFEwsBhgItghgBAQ?= X-IronPort-AV: E=Sophos;i="5.84,326,1620684000"; d="scan'208,217";a="399489866" X-MGA-submission: =?us-ascii?q?MDFcUtFfUVA4lcM+O+GkbzVyCFG47uNcO2c8eN?= =?us-ascii?q?Arq7Lgm8EUs5+CGMXxcdUgs/TjL5AeHbn8Ovp0/k3kLGLnw1dPEQYinH?= =?us-ascii?q?jTrlwF/lkoUzDB3aXgP9MUWyNgfuMlwEzDIAFoCcv+f07k0VegPTq2fX?= =?us-ascii?q?WeXMBSBhyiNbqMOabnvQNUAg=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; 16 Nov 2021 09:41:15 +0100 Received: from set (set.irisa.fr [131.254.10.170]) (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 9F7C35605C2; Tue, 16 Nov 2021 09:41:14 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 16 Nov 2021 09:41:02 +0100 Message-ID: <875yssze5d.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 16 09:41:15 2021 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.001810, queueID=E0C1F5605C3 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 18614 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTm92ZW1iZXIgMDkgdG8gMTYsDQoyMDIxLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkVhcmx5 IHByZXZpZXcgb2YgdGhlIEFsZ29yaXRobWljIHdpdGggT0NhbWwgQm9vaw0KcHltbF9iaW5kZ2Vu OiBhIENMSSBhcHAgdG8gZ2VuZXJhdGUgUHl0aG9uIGJpbmRpbmdzIGRpcmVjdGx5IGZyb20gT0Nh bWwgdmFsdWUgc3BlY2lmaWNhdGlvbnMNCm9jYW1sLXdheWxhbmQgKHB1cmUgT0NhbWwgd2F5bGFu ZCBwcm90b2NvbCBsaWJyYXJ5KQ0KU2V0IHVwIE9DYW1sIDIuMC4wLWJldGE2DQpTZXQgdXAgT0Nh bWwgMi4wLjAtYmV0YTcNClNldCB1cCBPQ2FtbCAyLjAuMC1iZXRhOA0KcGh5bG9nZW5ldGljcywg YSBsaWJyYXJ5IGZvciBtb2xlY3VsYXIgZXZvbHV0aW9uDQpyZWxlYXNlIG9mIHN2bXdyYXA6IGEg d3JhcHBlciBhcm91bmQgbGlic3ZtLXRvb2xzDQpHZW9QdWIgLSBBIFhNUFAgd2ViIGNsaWVudA0K T2xkIENXTg0KDQoNCkVhcmx5IHByZXZpZXcgb2YgdGhlIEFsZ29yaXRobWljIHdpdGggT0NhbWwg Qm9vaw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9lYXJseS1wcmV2aWV3LW9mLXRoZS1hbGdvcml0aG1p Yy13aXRoLW9jYW1sLWJvb2svODc4NS8xPg0KDQoNCkRhbWllbiBHdWljaGFyZCBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFBsZWFzZSByZXBvcnQgYnVncywgYmFkIEVuZ2xpc2gg JiBub25zZW5zZXMuICBCdXQgZG8gbm90IHJlcG9ydA0KICBvbWlzc2lvbnMgKGl0IGlzIHdvcmst aW4tcHJvZ3Jlc3MgcGx1cyBpdCdzIG5vdCBhbiBvY2FtbCBiaWJsZSkuDQoNCiAgPGh0dHBzOi8v d3d3LmNqb2ludC5jb20vYy9LS2p1bEkxRHgwMz4NCg0KICBXaHkgdGhlIGJvb2sgaXMgbm90IGJv dHRvbSB1cCwgaW5zdGVhZCBzb21lIGNvbmNlcHRzIGFyZSB1c2VkIHdpdGhvdXQNCiAgZXhwbGFp bmVkID8NCg0KICDigKIgQmVjYXVzZSBzb21lIG5vdGlvbnMgKHdoYXQgaXMgdGhlIGB1bml0JyB0 eXBlID8gd2hhdCBpcyBhIHF1ZXVlID8pDQogICAgYXJlIGNvbnNpZGVyZWQgZWFzeS1lbm91Z2gg dG8gZ28gd2l0aG91dCBzYXlpbmcuDQoNCiAgV2hhdCB3aWxsIGJlIGluIHRoZSBtaXNzaW5nIGNo YXB0ZXIgNiA/DQoNCiAg4oCiIFR5cGUgcG9seW1vcnBoaXNtLCB1bml2ZXJzYWwgcXVhbnRpZmlj YXRpb24sIGBTdGRsaWIuY29tcGFyZScsIHdlYWsNCiAgICBwb2x5bW9ycGhpc20sIGNvbnN0cmFp bmVkIHBvbHltb3JwaGlzbSwgcGhhbnRvbSB0eXBlcywgdHlwZQ0KICAgIHZhcmlhbmNlLg0KDQog IFdoYXQgd2lsbCBiZSBpbiB0aGUgY2hhcHRlcnMgMTIgYW5kIG1vcmUgPw0KICDigKIgSGlnaCBw ZXJmb3JtYW5jZSBsZXhpbmcNCiAg4oCiIFJlY3Vyc2l2ZS1kZXNjZW50IHBhcnNpbmcNCiAg4oCi IFRoZSBhcnQgb2Ygc2VhcmNoaW5nDQogIOKAoiBEZXRhaWxlZCBjb25zdHJ1Y3Rpb24gb2YgdGhl IEVSaWMgMC4zIGFwcGxpY2F0aW9uDQoNCiAgV2lsbCB0aGUgc291cmNlIGZpbGVzIGdvIHRvIGEg cmVwb3NpdG9yeSA/DQoNCiAg4oCiIE5vLiBUaGUgc291cmNlIGZpbGVzIGFyZSBhbHJlYWR5IGlu Y2x1ZGVkIGluIHRoZSB6aXAgYXJjaGl2ZS4NCg0KDQpweW1sX2JpbmRnZW46IGEgQ0xJIGFwcCB0 byBnZW5lcmF0ZSBQeXRob24gYmluZGluZ3MgZGlyZWN0bHkgZnJvbSBPQ2FtbCB2YWx1ZSBzcGVj aWZpY2F0aW9ucw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcHlt bC1iaW5kZ2VuLWEtY2xpLWFwcC10by1nZW5lcmF0ZS1weXRob24tYmluZGluZ3MtZGlyZWN0bHkt ZnJvbS1vY2FtbC12YWx1ZS1zcGVjaWZpY2F0aW9ucy84Nzg2LzE+DQoNCg0KUnlhbiBNb29yZSBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIEkgd2FudGVkIHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxlYXNl IG9mIFtweW1sX2JpbmRnZW5dLCBhIENMSSBhcHANCiAgZm9yIGdlbmVyYXRpbmcgUHl0aG9uIGJp bmRpbmdzIHVzaW5nIFtweW1sXSBkaXJlY3RseSBmcm9tIE9DYW1sIHZhbHVlDQogIHNwZWNpZmlj YXRpb25zLg0KDQogIE1hbnVhbGx5IHdyaXRpbmcgYmluZGluZ3MgdG8gUHl0aG9uIGxpYnJhcmll cyBjYW4gZ2V0IHRlZGlvdXMgcHJldHR5DQogIHF1aWNrbHkuICBgcHltbF9iaW5kZ2VuJyBhaW1z IHRvIGhlbHAgeW91IGF2b2lkIGEgbG90IG9mIHRoZQ0KICByZXBldGl0aXZlIHdvcmsgd2hlbiBi aW5kaW5nIFB5dGhvbiBsaWJyYXJpZXMgYnkgbGV0dGluZyB5b3UgZm9jdXMgb24NCiAgdGhlIE9D YW1sIHNpZGUgb2YgdGhpbmdzIGFuZCAobW9zdGx5KSBub3Qgd29ycnlpbmcgYWJvdXQgdGhlDQog IGltcGxlbWVudGF0aW9uIG9mIHRoZSBweW1sIGJpbmRpbmdzLg0KDQoNCltweW1sX2JpbmRnZW5d IDxodHRwczovL2dpdGh1Yi5jb20vbW9vcmVyeWFuL29jYW1sX3B5dGhvbl9iaW5kZ2VuPg0KDQpb cHltbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS90aGllcnJ5LW1hcnRpbmV6L3B5bWwvPg0KDQpRdWlj ayBzdGFydA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgRmlyc3QsIGlu c3RhbGwgYHB5bWxfYmluZGdlbicuICBJdCBpcyBhdmFpbGFibGUgb24gW09wYW1dLg0KDQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgJCBvcGFtIGluc3RhbGwgcHltbF9iaW5kZ2VuDQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIFNheSB5b3UgaGF2ZSBhIFB5dGhvbiBjbGFzcyB5b3Ugd2FudCB0byBi aW5kIGFuZCB1c2UgaW4gT0NhbWwuDQogIChGaWxlbmFtZTogYGFkZGVyLnB5JykNCg0KICDilIzi lIDilIDilIDilIANCiAg4pSCIGNsYXNzIEFkZGVyOg0KICDilIIgICAgIEBzdGF0aWNtZXRob2QN CiAg4pSCICAgICBkZWYgYWRkKHgsIHkpOg0KICDilIIgCXJldHVybiB4ICsgeQ0KICDilJTilIDi lIDilIDilIANCg0KICBUbyBkbyBzbywgeW91IHdyaXRlIE9DYW1sIHZhbHVlIHNwZWNpZmljYXRp b25zIGZvciB0aGUgY2xhc3MgYW5kDQogIG1ldGhvZHMgeW91IHdhbnQgdG8gYmluZC4gIChGaWxl bmFtZTogYHZhbF9zcGVjcy50eHQnKQ0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgdmFsIGFk ZCA6IHg6aW50IC0+IHk6aW50IC0+IHVuaXQgLT4gaW50DQogIOKUlOKUgOKUgOKUgOKUgA0KDQog IFRoZW4sIHlvdSBydW4gYHB5bWxfYmluZGdlbicuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKU giAkIHB5bWxfYmluZGdlbiB2YWxfc3BlY3MudHh0IGFkZGVyIEFkZGVyIC0tY2FtbC1tb2R1bGUg QWRkZXIgPiBsaWIubWwNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgTm93IHlvdSBjYW4gdXNlIHlv dXIgZ2VuZXJhdGVkIGZ1bmN0aW9ucyBpbiB5b3VyIE9DYW1sIGNvZGUuDQogIChGaWxlbmFtZTog YHJ1bi5tbCcpDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGVuIExpYg0KICDilIIgDQog IOKUgiBsZXQgKCkgPSBQeS5pbml0aWFsaXplICgpDQogIOKUgiANCiAg4pSCIGxldCByZXN1bHQg PSBBZGRlci5hZGQgfng6MSB+eToyICgpDQogIOKUgiANCiAg4pSCIGxldCAoKSA9IGFzc2VydCAo cmVzdWx0ID0gMykNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgRmluYWxseSwgc2V0IHVwIGEgZHVu ZSBmaWxlIGFuZCBydW4gaXQuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAoZXhlY3V0YWJs ZQ0KICDilIIgIChuYW1lIHJ1bikNCiAg4pSCICAobGlicmFyaWVzIHB5bWwpKQ0KICDilJTilIDi lIDilIDilIANCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICQgZHVuZSBleGVjIC4vcnVuLmV4 ZQ0KICDilJTilIDilIDilIDilIANCg0KDQpbT3BhbV0gPGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcv cGFja2FnZXMvcHltbF9iaW5kZ2VuLz4NCg0KDQpEb2N1bWVudGF0aW9uDQrilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBp bnN0YWxsaW5nIGFuZCB1c2luZyBgcHltbF9iaW5kZ2VuJywgY2hlY2sgb3V0DQogIHRoZSBbZG9j c10uICBUaGVyZSB5b3Ugd2lsbCBmaW5kIGxvdHMgb2YgdGlwcyBhbmQgZXhhbXBsZXMgdG8gaGVs cCB5b3UNCiAgZ2V0IHN0YXJ0ZWQhDQoNCg0KW2RvY3NdIDxodHRwczovL21vb3Jlcnlhbi5naXRo dWIuaW8vb2NhbWxfcHl0aG9uX2JpbmRnZW4vPg0KDQoNCm9jYW1sLXdheWxhbmQgKHB1cmUgT0Nh bWwgd2F5bGFuZCBwcm90b2NvbCBsaWJyYXJ5KQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tb2NhbWwtd2F5bGFuZC1wdXJlLW9jYW1sLXdheWxhbmQtcHJvdG9jb2wtbGlicmFyeS83 NjE2LzI+DQoNCg0KVGhvbWFzIExlb25hcmQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBvY2FtbC13YXlsYW5kIGhhcyBiZWVuIHZlcnkgc3RhYmxlIG92ZXIgdGhlIGxhc3QgZmV3IG1v bnRocyBhbmQgc28NCiAgSSd2ZSBub3cgcmVsZWFzZWQgW3ZlcnNpb24gMS4wXS4gVGhlIG1haW4g Y2hhbmdlcyBhcmUgaW1wcm92ZWQgZXJyb3INCiAgaGFuZGxpbmcgYW5kIGRpYWdub3N0aWNzLg0K DQogIEkndmUgYmVlbiB1c2luZyB0aGlzIHRvIHdyaXRlIGFuIFh3YXlsYW5kIGFkYXB0b3IsIHdo aWNoIGFjdHMgYXMgYW4NCiAgWDExIHdpbmRvdyBtYW5hZ2VyIHRvIFh3YXlsYW5kLCBjb252ZXJ0 aW5nIGJldHdlZW4gdGhlIHR3bw0KICBwcm90b2NvbHMuIFRoaXMgYWxsb3dzIHJ1bm5pbmcgWDEx IGFwcHMgaW4gVk1zIGFuZCBoYXZpbmcgdGhlbSBhcHBlYXINCiAgYWxvbmdzaWRlIG90aGVyIGFw cGxpY2F0aW9uIHdpbmRvd3Mgb24gdGhlIGhvc3QuIEl0IGNhbiBhbHNvIGJlIHVzZWQNCiAgdG8g Zml4IG90aGVyIHByb2JsZW1zLCBzdWNoIGFzIHN1cHBvcnQgZm9yIEhpRFBJIHNjcmVlbnMgYW5k IFN3YXkncw0KICBidWdneSBjbGlwYm9hcmQgc3VwcG9ydDoNCg0KICA8aHR0cHM6Ly9yb3NjaWR1 cy5jb20vYmxvZy9ibG9nLzIwMjEvMTAvMzAveHdheWxhbmQvPg0KDQoNClt2ZXJzaW9uIDEuMF0N CjxodHRwczovL2dpdGh1Yi5jb20vdGFsZXg1L29jYW1sLXdheWxhbmQvcmVsZWFzZXMvdGFnL3Yx LjA+DQoNCg0KU2V0IHVwIE9DYW1sIDIuMC4wLWJldGE2DQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB cmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1zZXQtdXAtb2NhbWwt Mi0wLTAtYmV0YTYvODc5NS8xPg0KDQoNClNvcmEgTW9yaW1vdG8gYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KQ2hhbmdlZA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIFVubG9jayBv cGFtIDIuMSBvbiB0aGUgVWJ1bnR1IGFuZCBtYWNPUyBydW5uZXJzLg0KDQogIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvc2V0dXAtb2NhbWwvcmVsZWFzZXMvdGFnL3YyLjAuMC1iZXRhNj4NCg0K DQpTZXQgdXAgT0NhbWwgMi4wLjAtYmV0YTcNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNldC11cC1vY2FtbC0yLTAtMC1i ZXRhNy84Nzk2LzE+DQoNCg0KU29yYSBNb3JpbW90byBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQpGaXhlZA0K4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIFJldHVybiBhbiBlbXB0eSBhcnJheSB0 byBhdm9pZCBkZXBleHQgZmFpbHVyZSB3aGVuIGRlcGV4dCBmbGFncyBhcmUNCiAgICBub3QgcGFz c2VkLg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvc2V0dXAtb2NhbWwvcmVsZWFzZXMv dGFnL3YyLjAuMC1iZXRhNz4NCg0KDQpTZXQgdXAgT0NhbWwgMi4wLjAtYmV0YTgNCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LXNldC11cC1vY2FtbC0yLTAtMC1iZXRhOC84ODIxLzE+DQoNCg0KU29yYSBNb3JpbW90byBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpDaGFuZ2VkDQrilYzilYzilYzilYzilYzilYzilYwNCg0K ICDigKIgVXNlIDIuMSBtb2RlIGluc3RlYWQgb2YgMi4wIG1vZGUgb24gdGhlIFVidW50dSBhbmQg bWFjT1MgcnVubmVycy4NCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL3NldHVwLW9jYW1s L3JlbGVhc2VzL3RhZy92Mi4wLjAtYmV0YTg+DQoNCg0KcGh5bG9nZW5ldGljcywgYSBsaWJyYXJ5 IGZvciBtb2xlY3VsYXIgZXZvbHV0aW9uDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1waHlsb2dl bmV0aWNzLWEtbGlicmFyeS1mb3ItbW9sZWN1bGFyLWV2b2x1dGlvbi84ODEyLzE+DQoNCg0KUGhp bGlwcGUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBJJ20gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGF2YWlsYWJpbGl0 eSBvbiBvcGFtIG9mIFtwaHlsb2dlbmV0aWNzXSwgYQ0KICBiaW9pbmZvcm1hdGljcyBsaWJyYXJ5 IGRlZGljYXRlZCB0byBbbW9sZWN1bGFyIGV2b2x1dGlvbl0gYW5kDQogIHBoeWxvZ2VueS4gSXQg cHJvdmlkZXMgYSBmZXcgYWxnb3JpdGhtcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgY2FuDQog IGJlIHVzZWZ1bCB0byBzdHVkeSBob3cgYmlvbG9naWNhbCBzZXF1ZW5jZXMgbGlrZSBwcm90ZWlu cyBvciBnZW5lcw0KICBoYXZlIGV2b2x2ZWQsIG9yIHRvIHNpbXVsYXRlIGRhdGFzZXRzIHVuZGVy IHZhcmlvdXMgZXZvbHV0aW9uYXJ5DQogIG1vZGVscy4NCg0KICBDb21tZW50cy9xdWVzdGlvbnMg d2VsY29tZWQgb24gdGhlIHJlcG8ncyBpc3N1ZSB0cmFja2VyIQ0KDQoNCltwaHlsb2dlbmV0aWNz XSA8aHR0cHM6Ly9naXRodWIuY29tL2Jpb2NhbWwvcGh5bG9nZW5ldGljcz4NCg0KW21vbGVjdWxh ciBldm9sdXRpb25dDQo8aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9sZWN1bGFyX2V2 b2x1dGlvbj4NCg0KDQpyZWxlYXNlIG9mIHN2bXdyYXA6IGEgd3JhcHBlciBhcm91bmQgbGlic3Zt LXRvb2xzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1yZWxlYXNlLW9mLXN2bXdyYXAtYS13 cmFwcGVyLWFyb3VuZC1saWJzdm0tdG9vbHMvODgxOC8xPg0KDQoNClVuaXhKdW5raWUgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBJIGFtIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIGF2YWlsYWJpbGl0eSBp biBvcGFtIG9mIHRoZSBzdm13cmFwDQogIHBhY2thZ2UuICBBIHdyYXBwZXIgYXJvdW5kIGxpYnN2 bSdzIHN2bS10cmFpbiBhbmQgc3ZtLXByZWRpY3QNCiAgZXhlY3V0YWJsZXMuICBDdXJyZW50bHks IG9ubHkgcmVncmVzc2lvbiBtb2RlbGluZyBpcyBzdXBwb3J0ZWQsIHVzaW5nDQogIHRoZSBsaW5l YXIsIFJCRiwgc2lnbW9pZCBvciBwb2x5bm9taWFsIGtlcm5lbC4NCg0KICA8aHR0cHM6Ly9naXRo dWIuY29tL1VuaXhKdW5raWUvc3Ztd3JhcD4NCg0KICBUaGUgcXVpdGUgc2NhcnkgdXNhZ2UgbG9v a3MgbGlrZSB0aGlzOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHVzYWdlOiBzdm13cmFwDQog IOKUgiAgIC1pIDxmaWxlbmFtZT46IHRyYWluaW5nIHNldCBvciBEQiB0byBzY3JlZW4NCiAg4pSC ICAgLS1mZWF0cyA8aW50PjogbnVtYmVyIG9mIGZlYXR1cmVzDQogIOKUgiAgIFstbyA8ZmlsZW5h bWU+XTogcHJlZGljdGlvbnMgb3V0cHV0IGZpbGUNCiAg4pSCICAgWy1ucCA8aW50Pl06IG5jb3Jl cw0KICDilIIgICBbLS1rZXJuZWwgPHN0cmluZz5dIGNob29zZSBrZXJuZWwgdHlwZSB7TGlufFJC RnxTaWd8UG9sfQ0KICDilIIgICBbLWMgPGZsb2F0Pl06IGZpeCBDDQogIOKUgiAgIFstZSA8Zmxv YXQ+XTogZXBzaWxvbiBpbiB0aGUgbG9zcyBmdW5jdGlvbiBvZiBlcHNpbG9uLVNWUjsNCiAg4pSC ICAgKDAgPD0gZXBzaWxvbiA8PSBtYXhfaSh8eV9pfCkpDQogIOKUgiAgIFstZyA8ZmxvYXQ+XTog Zml4IGdhbW1hIChmb3IgUkJGIGFuZCBTaWcga2VybmVscykNCiAg4pSCICAgWy1yIDxmbG9hdD5d OiBmaXggciBmb3IgdGhlIFNpZyBrZXJuZWwNCiAg4pSCICAgWy0taXduXTogdHVybiBPTiBpbnN0 YW5jZS13aXNlLW5vcm1hbGl6YXRpb24NCiAg4pSCICAgWy0tc2NhbGVdOiB0dXJuIE9OIFswOjFd IHNjYWxpbmcgKE5PVCBQUk9EVUNUSU9OIFJFQURZKQ0KICDilIIgICBbLS1uby1wbG90XTogbm8g Z251cGxvdA0KICDilIIgICBbey1ufC0tTnhDVn0gPGludD5dOiBmb2xkcyBvZiBjcm9zcyB2YWxp ZGF0aW9uDQogIOKUgiAgIFstcV06IHF1aWV0DQogIOKUgiAgIFstdnwtLXZlcmJvc2VdOiBlcXVp dmFsZW50IHRvIG5vdCBzcGVjaWZ5aW5nIC1xDQogIOKUgiAgIFstLXNlZWQgPGludD5dOiBmaXgg cmFuZG9tIHNlZWQNCiAg4pSCICAgWy1wIDxmbG9hdD5dOiB0cmFpbmluZyBzZXQgcG9ydGlvbiAo aW4gWzAuMDoxLjBdKQ0KICDilIIgICBbLS1wYWlyc106IHJlYWQgZnJvbSAuQVAgZmlsZXMgKGF0 b20gcGFpcnM7IHdpbGwgb2Zmc2V0IGZlYXQuIGluZGV4ZXMgYnkgMSkNCiAg4pSCICAgWy0tdHJh aW4gPHRyYWluLmxpYmxpbj5dOiB0cmFpbmluZyBzZXQgKG92ZXJyaWRlcyAtcCkNCiAg4pSCICAg Wy0tdmFsaWQgPHZhbGlkLmxpYmxpbj5dOiB2YWxpZGF0aW9uIHNldCAob3ZlcnJpZGVzIC1wKQ0K ICDilIIgICBbLS10ZXN0IDx0ZXN0LmxpYmxpbj5dOiB0ZXN0IHNldCAob3ZlcnJpZGVzIC1wKQ0K ICDilIIgICBbey1sfC0tbG9hZH0gPGZpbGVuYW1lPl06IHByb2QuIG1vZGU7IHVzZSB0cmFpbmVk IG1vZGVscw0KICDilIIgICBbey1zfC0tc2F2ZX0gPGZpbGVuYW1lPl06IHRyYWluLiBtb2RlOyBz YXZlIHRyYWluZWQgbW9kZWxzDQogIOKUgiAgIFstZl06IGZvcmNlIG92ZXJ3cml0aW5nIGV4aXN0 aW5nIG1vZGVsIGZpbGUNCiAg4pSCICAgWy0tc2Nhbi1jXTogc2NhbiBmb3IgYmVzdCBDDQogIOKU giAgIFstLXNjYW4tZSA8aW50Pl06IGVwc2lsb24gc2NhbiAjc3RlcHMgZm9yIFNWUg0KICDilIIg ICBbLS1zY2FuLWddOiBzY2FuIGZvciBiZXN0IGdhbW1hDQogIOKUgiAgIFstLXJlZ3JdOiByZWdy ZXNzaW9uIChTVlIpOyBhbHNvLCBpbXBsaWVkIGJ5IC1lIGFuZCAtLXNjYW4tZQ0KICDilIIgICBb LS1lLXJhbmdlIDxmbG9hdD46PGludD46PGZsb2F0Pl06IHNwZWNpZmljIHJhbmdlIGZvciBlDQog IOKUgiAgIChzZW1hbnRpYz1zdGFydDpuc3RlcHM6c3RvcCkNCiAg4pSCICAgWy0tYy1yYW5nZSA8 ZmxvYXQsZmxvYXQsLi4uPl0gZXhwbGljaXQgc2NhbiByYW5nZSBmb3IgQw0KICDilIIgICAoZXhh bXBsZT0nMC4wMSwwLjAyLDAuMDMnKQ0KICDilIIgICBbLS1nLXJhbmdlIDxmbG9hdCxmbG9hdCwu Li4+XSBleHBsaWNpdCByYW5nZSBmb3IgZ2FtbWENCiAg4pSCICAgKGV4YW1wbGU9JzAuMDEsMC4w MiwwLjAzJykNCiAg4pSCICAgWy0tci1yYW5nZSA8ZmxvYXQsZmxvYXQsLi4uPl0gZXhwbGljaXQg cmFuZ2UgZm9yIHINCiAg4pSCICAgKGV4YW1wbGU9JzAuMDEsMC4wMiwwLjAzJykNCiAg4pSU4pSA 4pSA4pSA4pSADQoNCiAgRm9yIHBlb3BsZSB3aG8ga25vdyBteSBsaW53cmFwIG9wYW0gcGFja2Fn ZSAoYSB3cmFwcGVyIGFyb3VuZA0KICBsaWJsaW5lYXIgdG9vbHMpLCB0aGlzIGlzIHF1aXRlIHNp bWlsYXIuDQogIDxodHRwczovL2dpdGh1Yi5jb20vVW5peEp1bmtpZS9saW53cmFwPg0KDQoNCkdl b1B1YiAtIEEgWE1QUCB3ZWIgY2xpZW50DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNo aXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1nZW9wdWItYS14bXBwLXdl Yi1jbGllbnQvODgxOS8xPg0KDQoNCnB1a2thbXVzdGFyZCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEknZCBsaWtlIHRvIGFubm91bmNlIGFuIGluaXRpYWwsIHByb29mLW9mLWNvbmNlcHQgcmVs ZWFzZSBvZiBHZW9QdWIgLQ0KICBhbiBYTVBQIHdlYiBjbGllbnQuIFVubGlrZSBtYW55IFhNUFAg Y2xpZW50cyB0aGUgZm9jdXMgaXMgbm90IG9uDQogIGluc3RhbnQgbWVzc2FnaW5nIGJ1dCBvbiBj cmVhdGluZywgZGlzcGxheWluZyBhbmQgbWFuYWdpbmcgdGhpbmdzIHN1Y2gNCiAgYXMgZXZlbnRz LCBtYXBzLCBpbmZvcm1hdGlvbiBvbiBsb2NhbCBvcmdhbml6YXRpb25zIGFuZCBvdGhlciBsb2Nh bA0KICBrbm93bGVkZ2UgKHNlZSBbdGhlIG9wZW5FbmdpYWRpbmFdIHByb2plY3QgZm9yIHRoZSBj b250ZXh0KS4NCg0KICBUaGlzIGluaXRpYWwgcmVsZWFzZSBpcyBub3QgcmVhbGx5IGFueXRoaW5n IHVzZWZ1bCBidXQgYQ0KICBwcm9vZi1vZi1jb25jZXB0IGhvdyBzdWNoIGFuIGFwcGxpY2F0aW9u IGNhbiBiZSBkZXZlbG9wZWQgdXNpbmcgWE1QUA0KICBhbmQgT0NhbWwuIFRoZXJlIGFyZSBtYW55 IHJvdWdoIGVkZ2VzIGFuZCBicm9rZW4gaGFja3MgdGhhdCBuZWVkDQogIGZpeGluZy4gSSdkIGJl IHZlcnkgZ3JhdGVmdWwgZm9yIHlvdXIgZmVlZGJhY2ssIHRob3VnaHRzIGFuZCBpZGVhcy4NCg0K ICBUaGUgc291cmNlIGNvZGUgb2YgdGhlIGFwcCBpcyBvbiBbY29kZWJlcmddIGFuZCBhIHByZS1i dWlsdCBob3N0ZWQNCiAgdmVyc2lvbiBpcyBhdmFpbGFibGUgW2hlcmVdLg0KDQogIFRoZSBhcHBs aWNhdGlvbiBjb25zaXN0cyBvZiBzb21lIHBhcnRzIGFuZCBpZGVhcyB0aGF0IEknZCBsaWtlIHRv DQogIGlsbHVzdHJhdGUgc2VwYXJhdGVseToNCg0KDQpbdGhlIG9wZW5FbmdpYWRpbmFdIDxodHRw czovL29wZW5lbmdpYWRpbmEubmV0Pg0KDQpbY29kZWJlcmddIDxodHRwczovL2NvZGViZXJnLm9y Zy9vcGVuRW5naWFkaW5hL2dlb3B1Yj4NCg0KW2hlcmVdIDxodHRwczovL2dlb3B1Yi5vcGVuZW5n aWFkaW5hLm5ldC8+DQoNCm9jYW1sLXhtcHANCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIFtvY2FtbC14bXBwXSBpcyBhIFhNUFAgY2xpZW50IGxpYnJhcnkgZm9yIE9DYW1sIChk b2N1bWVudGF0aW9uDQogIGF2YWlsYWJsZSBbb25saW5lXS4NCg0KDQpbb2NhbWwteG1wcF0gPGh0 dHBzOi8vY29kZWJlcmcub3JnL29wZW5FbmdpYWRpbmEvb2NhbWwteG1wcD4NCg0KW29ubGluZV0g PGh0dHBzOi8vaW5xbGFiLm5ldC9wcm9qZWN0cy9vY2FtbC14bXBwLz4NCg0KUmVhY3RpdmUNCuKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIG9jYW1sLXhtcHAgaXMgcmVhY3RpdmUgaW4gdGhl IHNlbnNlIHRoYXQgdGhlIFhNUFAgY29ubmVjdGlvbiBpcw0KICBhYnN0cmFjdGVkIGFzIGEgUmVh Y3QgZXZlbnQgb2YgU3RhbnphcyAoc21hbGwgcGllY2VzIG9mIGluZm9ybWF0aW9uDQogIHRoYXQg ZmxvdyBvdmVyIFhNUFApOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgdmFsIHN0YW56YXMg OiB0IC0+IFN0YW56YS50IFJlYWN0LmV2ZW50DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoaXMg UmVhY3QgZXZlbnQgY2FuIGJlIGZpbHRlcmVkIGZvciBtZXNzYWdlcyBpbiBhIHNwZWNpZmljDQog IGNvbnZlcnNhdGlvbiwgZm9yIGV4YW1wbGUuDQoNCg0KVHJhbnNwb3J0cw0K4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSE4pSE4pSEDQoNCiAgWE1QUCB3b3JrcyB3aXRoIGRpZmZlcmVudCB0cmFuc3Bv cnQgbWVjaGFuaXNtcyBhbmQgb2NhbWwteG1wcCBzdXBwb3J0cw0KICB0aGlzLiBDdXJyZW50bHkg b2NhbWwteG1wcCBjYW4gYmUgdXNlZCBmcm9tIFVuaXggd2l0aCBhIFRDUC9TU0wNCiAgY29ubmVj dGlvbiB0byBhIFhNUFAgc2VydmVyIGFuZCBmcm9tIHdlYiBicm93c2VycyB3aXRoIGEgV2ViU29j a2V0DQogIGNvbm5lY3Rpb24uIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgYWJzdHJhY3RpbmcgdGhl IFhNUFAgdHJhbnNwb3J0Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbW9kdWxlIHR5cGUg VFJBTlNQT1JUID0gc2lnDQogIOKUgiAgICgqKiB7MiBDb25uZWN0aW9ufSAqKQ0KICDilIIgDQog IOKUgiAgIHR5cGUgb3B0aW9ucw0KICDilIIgICAoKiogQWRkaXRpb25hbCBvcHRpb25zIHRoYXQg bWF5IGJlIHBhc3NlZCB0byB0aGUgdHJhbnNwb3J0ICopDQogIOKUgiANCiAg4pSCICAgdHlwZSB0 DQogIOKUgiAgICgqKiBUeXBlIG9mIGFuIGluc3RhbnRpYXRlZCBjb25uZWN0aW9uIHRvIGFuIFhN UFAgc2VydmVyICopDQogIOKUgiANCiAg4pSCICAgdmFsIGNvbm5lY3QgOiBob3N0OnN0cmluZyAt PiBvcHRpb25zIC0+IHQgTHd0LnQNCiAg4pSCIA0KICDilIIgICB2YWwgY2xvc2UgOiB0IC0+IHVu aXQgTHd0LnQNCiAg4pSCIA0KICDilIIgICB2YWwgY2xvc2VkIDogdCAtPiB1bml0IEx3dC50DQog IOKUgiANCiAg4pSCICAgKCoqIHsyIFhNTCBTdHJlYW19ICopDQogIOKUgiANCiAg4pSCICAgdHlw ZSBzdHJlYW0NCiAg4pSCIA0KICDilIIgICB2YWwgb3Blbl9zdHJlYW0gOiB0IC0+IHRvJzpzdHJp bmcgLT4gc3RyZWFtIEx3dC50DQogIOKUgiANCiAg4pSCICAgdmFsIHN0cmVhbV9pZCA6IHN0cmVh bSAtPiBzdHJpbmcgTHd0LnQNCiAg4pSCIA0KICDilIIgICB2YWwgc2VuZF94bWwgOiBzdHJlYW0g LT4gWG1sYy50IC0+IHVuaXQgTHd0LnQNCiAg4pSCIA0KICDilIIgICB2YWwgc2lnbmFscyA6IHN0 cmVhbSAtPiBYbWxjLnNpZ25hbCBMd3Rfc3RyZWFtLnQNCiAg4pSCIA0KICDilIIgICB2YWwgc3Rv cF9zdHJlYW0gOiBzdHJlYW0gLT4gdW5pdCBMd3QudA0KICDilIIgZW5kDQogIOKUlOKUgOKUgOKU gOKUgA0KDQogIEEgdHJhbnNwb3J0IGVzdGFibGlzaGVzIHRoZSB1bmRlcmx5aW5nIGNvbm5lY3Rp b24gdG8gYSBzZXJ2ZXIgYW5kIGNhbg0KICBjcmVhdGUgWE1MIHN0cmVhbXMgKGluIFhNUFAgYSBj b25uZWN0aW9uIGlzIGJ5IG11bHRpcGxlIFhNTCBzdHJlYW1zDQogIHNlcXVlbnRpYWxseSkuIEZv ciB0ZWNobmljYWwgcmVhc29ucyBYTUwgcGFyc2luZyBpcyBhbHNvIGhhbmRsZWQgYnkNCiAgdGhl IHRyYW5zcG9ydCBhbmQgYSBzdHJlYW0gb2YgWE1MIHNpZ25hbHMgKGVsZW1lbnQgc3RhcnQsIGRh dGEsDQogIGVsZW1lbnQgZW5kKSBpcyByZXR1cm5lZC4gVGhpcyBpcyBkdWUgdG8gdGhlIGZhY3Qg dGhhdCBYTUwgcGFyc2luZyBpbg0KICBYTVBQIG5lZWRzIHRvIGJlIGRvbmUgc2xpZ2h0bHkgZGlm ZmVyZW50bHkgd2hlbiB1c2luZyBUQ1AgKGEgc2luZ2xlDQogIFhNTCBkb2N1bWVudCBvdmVyIHRo ZSBlbnRpcmUgc3RyZWFtKSBvciBXZWJTb2NrZXRzIChldmVyeSBXZWJTb2NrZXQNCiAgZnJhbWUg aXMgYSBwYXJzZS1hYmxlIFhNTCBkb2N1bWVudCkuDQoNCiAgVGhlIFVuaXgvVENQL1NTTCB0cmFu c3BvcnQgdXNlcyBNYXJrdXAubWwgYW5kIHdoZXJlYXMgdGhlIFdlYlNvY2tldA0KICB0cmFuc3Bv cnQgdXNlcyBYbWxtIChhbmQgQnJycikuDQoNCg0KUGFyc2VyIGNvbWJpbmF0b3JzIGZvciBYTUwN CuKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIEZvciBwYXJzaW5nIHN0cmVhbXMgb2YgWE1MIHNp Z25hbHMgdG8gT0NhbWwgdHlwZXMgb2NhbWwteG1wcCBjb250YWlucw0KICBhIHBhcnNlciBjb21i aW5hdG9yIGhlbHBlciBsaWJyYXJ5OiBbWG1sY10uIFRoaXMgYWxsb3dzIHBhcnNlciBmb3IgWE1M DQogIHN1Y2ggYXMgdGhpczoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIDxiaW5kIHhtbG5z PSd1cm46aWV0ZjpwYXJhbXM6eG1sOm5zOnhtcHAtYmluZCc+PGppZD53NGl1NGNrbjNramJxdmNk QGRlbW8ub3BlbmVuZ2lhZGluYS5uZXQvejhQa3pmYTg8L2ppZD48L2JpbmQ+DQogIOKUlOKUgOKU gOKUgOKUgA0KDQogIHRvIGJlIHBhcnNlcyBsaWtlIHRoaXM6DQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiBYbWxjLlBhcnNlci4oDQogIOKUgiAgIGVsZW1lbnQgKE5zLmJpbmQgImJpbmQiKSAo ZnVuIF8gLT4NCiAg4pSCICAgICBlbGVtZW50IChOcy5iaW5kICJqaWQiKSAoZnVuIF8gLT4NCiAg 4pSCICAgICAgIHRleHQgPj58IFN0cmluZy5jb25jYXQgIiIgPj49IGZ1biBqaWRfcyAtPg0KICDi lIIgICAgICAgbWF0Y2ggSmlkLm9mX3N0cmluZyBqaWRfcyB3aXRoDQogIOKUgiAgICAgICB8IFNv bWUgamlkIC0+IHJldHVybiBqaWQNCiAg4pSCICAgICAgIHwgTm9uZSAtPiBmYWlsX3dpdGggImlu dmFsaWQgSklEIikpKQ0KICDilJTilIDilIDilIDilIANCg0KDQpbWG1sY10gPGh0dHBzOi8vaW5x bGFiLm5ldC9wcm9qZWN0cy9vY2FtbC14bXBwL3htbGMvWG1sYy9pbmRleC5odG1sPg0KDQoNClhN UFAgZXh0ZW5zaW9ucw0K4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE 4pSEDQoNCiAgSW5zcGlyYXRpb24gZm9yIHRoZSBzY29wZSBvZiB0aGUgY29yZSBsaWJyYXJ5IGlz IHRha2VuIGZyb20gdGhlDQogIFtTdHJvcGhlXSBYTVBQIGxpYnJhcmllcyAtIGV2ZXJ5dGhpbmcg dGhhdCBkb2VzIG5vdCBoYXZlIGRpcmVjdGx5IHRvDQogIGRvIHdpdGggWE1QUCB0cmFuc3BvcnQs IGF1dGhlbnRpY2F0aW9uIG9yIHN0cmVhbSBtYW5hZ2VtZW50IGlzIGtlcHQNCiAgb3V0c2lkZSBv ZiB0aGUgY29yZSBsaWJyYXJ5Lg0KDQogIFRoZXJlIGFyZSBhbHJlYWR5IHNvbWUgImV4dGVuc2lv biIgbGlicmFyaWVzIG91dHNpZGUgb2YgdGhlIGNvcmUgZm9yDQogIHVzZWZ1bCBYTVBQIGZlYXR1 cmVzIChlLmcuIFtSb3N0ZXIgbWFuYWdlbWVudF0sIFtQdWJTdWJdIGFuZA0KICBbcGluZ2luZ10p Lg0KDQogIE9uZSB0aGluZyB0aGF0IEkgZG8gd2FudCB0byBhZGQgdG8gdGhlIGNvcmUgbGlicmFy eSBpcyBzdHJlYW0NCiAgbWFuYWdlbWVudCBhY2NvcmRpbmcgdG8gW1hFUC0wMTk4XS4gSSBleHBl Y3QgdGhpcyBhZGRpdGlvbiB0byBjaGFuZ2UNCiAgdGhlIGNvcmUgbGlicmFyeSBBUEkgLSB0aGUg QVBJIGlzIG5vdCBzdGFibGUgeWV0IQ0KDQogIE11Y2ggaW5zcGlyYXRpb24gd2FzIHRha2VuIGZy b20gW0phY2tsaW5lXSAtIGFuIE9DYW1sIFhNUFAgY2xpZW50IC0NCiAgYW5kIGluIHBhcnRpY3Vs YXIgW3RoaXMgcG9zdF0gb24gSmFja2xpbmUuIE1hbnkgdGhhbmtzIHRvIEBoYW5uZXMuDQoNCg0K W1N0cm9waGVdIDxodHRwOi8vc3Ryb3BoZS5pbS8+DQoNCltSb3N0ZXIgbWFuYWdlbWVudF0NCjxo dHRwczovL2lucWxhYi5uZXQvcHJvamVjdHMvb2NhbWwteG1wcC94bXBwL1htcHBfcm9zdGVyL2lu ZGV4Lmh0bWw+DQoNCltQdWJTdWJdDQo8aHR0cHM6Ly9pbnFsYWIubmV0L3Byb2plY3RzL29jYW1s LXhtcHAveG1wcC9YbXBwX3B1YnN1Yi9pbmRleC5odG1sPg0KDQpbcGluZ2luZ10NCjxodHRwczov L2lucWxhYi5uZXQvcHJvamVjdHMvb2NhbWwteG1wcC94bXBwL1htcHBfcGluZy9pbmRleC5odG1s Pg0KDQpbWEVQLTAxOThdIDxodHRwczovL3htcHAub3JnL2V4dGVuc2lvbnMveGVwLTAxOTguaHRt bD4NCg0KW0phY2tsaW5lXSA8aHR0cHM6Ly9naXRodWIuY29tL2hhbm5lc20vamFja2xpbmU+DQoN Clt0aGlzIHBvc3RdIDxodHRwczovL2hhbm5lcy5ucXNiLmlvL1Bvc3RzL0phY2tsaW5lPg0KDQoN CnJlYWN0b3INCuKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEdlb1B1YiB1c2VzIEJyci4gSSBo YWQgc29tZSB0cm91YmxlIGZpZ3VyaW5nIG91dCBhIHN1aXRhYmxlDQogICJhcmNoaXRlY3R1cmUi IGZvciBtYW5hZ2luZyBjb21wbGV4IGxvZ2ljIGFuZCBlbmRlZCB1cCBoYWNraW5nIGFuDQogIFtF bG1dIGluc3BpcmVkIGhlbHBlciBsaWJyYXJ5OiBbcmVhY3Rvci5tbGldLiBTdGF0ZSB1cGRhdGVz IGZvciB0aGUNCiAgZW50aXJlIGFwcGxpY2F0aW9uIGFyZSB0aGVuIGhhbmRsZWQgaW4gYSBzaW5n bGUgW3VwZGF0ZSBmdW5jdGlvbl0uDQoNCiAgSSdtIG5vdCB5ZXQgdmVyeSBoYXBweSB3aXRoIHRo aXMgbWFjaGluZXJ5IGFuZCBJJ20gcHJldHR5IHN1cmUgSSdtDQogIHVzaW5nIHJlYWN0IGluIHdy b25nIGFuZCBkYW5nZXJvdXMgd2F5cy4gSSdkIGJlIHZlcnkgZ3JhdGVmdWwgZm9yDQogIGlkZWFz IG9uIGhvdyB0byBpbXByb3ZlIHRoaXMuIFRIaXMgbWlnaHQgYmUgcmVsYXRlZCB0byB0aGlzDQog IGRpc2N1c3Npb246DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvc3RydWN0dXJpbmct ZnJwLXNwZWNpZmljYWxseS1ub3RlLWFwcGxpY2F0aW9ucy84NjQ1LzE3Pi4NCg0KICBUaGUgcmVh c29uIGZvciB1c2luZyBSZWFjdCBvdmVyIE5vdGUgaXMgYmVjYXVzZSBvY2FtbC14bXBwIHVzZXMg YSBsb3QNCiAgb2YgTHd0IGFuZCBgTHd0X3JlYWN0JyBwcm92aWRlcyBuaWNlIGJpbmRpbmdzIGZv ciB3b3JraW5nIHdpdGggYm90aC4gSQ0KICBndWVzcyBzb21ldGhpbmcgc2ltaWxhciBjb3VsZCBi ZSBjcmVhdGVkIGZvciBOb3RlIChlLmcuIGBMd3Rfbm90ZScpDQogIGFuZCBJJ20gb3BlbiB0byB1 c2luZyBOb3RlIChhbHNvIGluIG9jYW1sLXhtcHApLg0KDQoNCltFbG1dIDxodHRwczovL2VsbS1s YW5nLm9yZy8+DQoNCltyZWFjdG9yLm1saV0NCjxodHRwczovL2NvZGViZXJnLm9yZy9vcGVuRW5n aWFkaW5hL2dlb3B1Yi9zcmMvYnJhbmNoL21haW4vc3JjL3JlYWN0b3IvcmVhY3Rvci5tbGk+DQoN Clt1cGRhdGUgZnVuY3Rpb25dDQo8aHR0cHM6Ly9jb2RlYmVyZy5vcmcvb3BlbkVuZ2lhZGluYS9n ZW9wdWIvc3JjL2JyYW5jaC9tYWluL3NyYy9nZW9wdWIvbWFpbi5tbCNMMjg+DQoNCg0KTGVhZmxl dA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgR2VvUHViIGRpc3BsYXlzIGEgbWFwIHVzaW5n IHRoZSBbTGVhZmxldC5qc10gSmF2YVNjcmlwdA0KICBsaWJyYXJ5LiBHZW9QdWIgY29udGFpbnMg T0NhbWwgYmluZGluZ3MgdG8gTGVhZmxldCB1c2luZyBCcnI6DQogIFtsZWFmbGV0Lm1saV0uIFdy aXRpbmcgdGhpcyB3YXMgdmVyeSBzdHJhaWdodGZvcndhcmQgYW5kIHBsZWFzYW50IChJDQogIGxp a2UgQnJyISkuDQoNCiAgT25lIGlzc3VlIEkgaGF2ZSBpcyB0aGF0IHRoZSBMZWFmbGV0IG1hcCBu ZWVkcyB0byBiZSBtYW5pcHVsYXRlZCB2ZXJ5DQogIGltcGVyYXRpdmVseSwgd2hlcmVhcyB0aGUg cmVzdCBvZiB0aGUgYXBwbGljYXRpb24gaXMgbXVjaCBtb3JlDQogIGZ1bmN0aW9uYWwuIFRoaXMg Y2F1c2VzIHNvbWUgbWlzbWF0Y2hlcy4gSSBndWVzcyBvbmUgbmVlZHMgdG8gZmluZCBhDQogIHdh eSBvZiBoaWRpbmcgdGhlIGltcHJlc3NpdmVuZXNzIG9mIExlYWZsZXQgKGUuZy4gbGlrZQ0KICBb cmVhY3QtbGVhZmxldF0pLg0KDQoNCltMZWFmbGV0LmpzXSA8aHR0cHM6Ly9sZWFmbGV0anMuY29t Lz4NCg0KW2xlYWZsZXQubWxpXQ0KPGh0dHBzOi8vY29kZWJlcmcub3JnL29wZW5FbmdpYWRpbmEv Z2VvcHViL3NyYy9icmFuY2gvbWFpbi9zcmMvbGVhZmxldC9sZWFmbGV0Lm1saT4NCg0KW3JlYWN0 LWxlYWZsZXRdIDxodHRwczovL2dpdGh1Yi5jb20vUGF1bExlQ2FtL3JlYWN0LWxlYWZsZXQ+DQoN Cg0KR3VpeCBmb3IgYnVpbGQgYW5kIGRldmVsb3BtZW50IGVudmlyb25tZW50cw0K4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWMDQoNCiAgSSB1c2UgW0d1aXhdIGZvciBwcm92aWRpbmcgYSBidWlsZCBhbmQgZGV2ZWxv cG1lbnQgZW52aXJvbm1lbnQuIFdpdGgNCiAgZ3VpeCBpbnN0YWxsZWQgb25lIGNhbiBydW4gYGd1 aXggc2hlbGwnIGluIHRoZSBHZW9QdWIgcmVwb3NpdG9yeSB0bw0KICBnZXQgYSByZXByb2R1Y2li bGUgYnVpbGQgZW52aXJvbm1lbnQuIEFsbCBkZXBlbmRlbmNpZXMgYXJlIGZldGNoZWQgYW5kDQog IG1hZGUgYXZhaWxhYmxlIGJ5IEd1aXggaW4gdGhpcyBlbnZpcm9ubWVudCAoZS5nLiBgb2NhbWwt eG1wcCcgb3IgdGhlDQogIE9DYW1sIGNvbXBpbGVyKS4NCg0KICBJIHdpbGwgcHVibGlzaCBgb2Nh bWwteG1wcCcgb24gT1BBTSBvbmNlIHRoZSBBUEkgaXMgbW9yZSBzdGFibGUgYW5kIGFuDQogIGlu aXRpYWwgcmVsZWFzZSBjYW4gYmUgbWFkZS4NCg0KDQpbR3VpeF0gPGh0dHBzOi8vZ3VpeC5nbnUu b3JnLz4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFw cGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBt YWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0 aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0 byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29u bGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWls dG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRw czovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2 ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbb25saW5l XSA8aHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5Lz4NCg0K W0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of November 09 to 16, 2021.

Early preview of the Algorithmic with OCaml Book

Damien Guichard announced

Please report bugs, bad English & nonsenses. But do not report omissions (it is work-in-progress plus it's not an ocaml bible).

https://www.cjoint.com/c/KKjulI1Dx03

Why the book is not bottom up, instead some concepts are used without explained ?

  • Because some notions (what is the unit type ? what is a queue ?) are considered easy-enough to go without saying.

What will be in the missing chapter 6 ?

  • Type polymorphism, universal quantification, Stdlib.compare, weak polymorphism, constrained polymorphism, phantom types, type variance.

What will be in the chapters 12 and more ?

  • High performance lexing
  • Recursive-descent parsing
  • The art of searching
  • Detailed construction of the ERic 0.3 application

Will the source files go to a repository ?

  • No. The source files are already included in the zip archive.

pyml_bindgen: a CLI app to generate Python bindings directly from OCaml value specifications

Ryan Moore announced

I wanted to announce the first release of pyml_bindgen, a CLI app for generating Python bindings using pyml directly from OCaml value specifications.

Manually writing bindings to Python libraries can get tedious pretty quickly. pyml_bindgen aims to help you avoid a lot of the repetitive work when binding Python libraries by letting you focus on the OCaml side of things and (mostly) not worrying about the implementation of the pyml bindings.

Quick start

First, install pyml_bindgen. It is available on Opam.

$ opam install pyml_bindgen

Say you have a Python class you want to bind and use in OCaml. (Filename: adder.py)

class Adder:
    @staticmethod
    def add(x, y):
        return x + y

To do so, you write OCaml value specifications for the class and methods you want to bind. (Filename: val_specs.txt)

val add : x:int -> y:int -> unit -> int

Then, you run pyml_bindgen.

$ pyml_bindgen val_specs.txt adder Adder --caml-module Adder > lib.ml

Now you can use your generated functions in your OCaml code. (Filename: run.ml)

open Lib

let () = Py.initialize ()

let result = Adder.add ~x:1 ~y:2 ()

let () = assert (result = 3)

Finally, set up a dune file and run it.

(executable
 (name run)
 (libraries pyml))
$ dune exec ./run.exe

Documentation

For more information on installing and using pyml_bindgen, check out the docs. There you will find lots of tips and examples to help you get started!

ocaml-wayland (pure OCaml wayland protocol library)

Thomas Leonard announced

ocaml-wayland has been very stable over the last few months and so I've now released version 1.0. The main changes are improved error handling and diagnostics.

I've been using this to write an Xwayland adaptor, which acts as an X11 window manager to Xwayland, converting between the two protocols. This allows running X11 apps in VMs and having them appear alongside other application windows on the host. It can also be used to fix other problems, such as support for HiDPI screens and Sway's buggy clipboard support:

https://roscidus.com/blog/blog/2021/10/30/xwayland/

Set up OCaml 2.0.0-beta6

Sora Morimoto announced

Changed

  • Unlock opam 2.1 on the Ubuntu and macOS runners.

https://github.com/ocaml/setup-ocaml/releases/tag/v2.0.0-beta6

Set up OCaml 2.0.0-beta7

Sora Morimoto announced

Fixed

  • Return an empty array to avoid depext failure when depext flags are not passed.

https://github.com/ocaml/setup-ocaml/releases/tag/v2.0.0-beta7

Set up OCaml 2.0.0-beta8

Sora Morimoto announced

Changed

  • Use 2.1 mode instead of 2.0 mode on the Ubuntu and macOS runners.

https://github.com/ocaml/setup-ocaml/releases/tag/v2.0.0-beta8

phylogenetics, a library for molecular evolution

Philippe announced

I'm happy to announce the availability on opam of phylogenetics, a bioinformatics library dedicated to molecular evolution and phylogeny. It provides a few algorithms and data structures that can be useful to study how biological sequences like proteins or genes have evolved, or to simulate datasets under various evolutionary models.

Comments/questions welcomed on the repo's issue tracker!

release of svmwrap: a wrapper around libsvm-tools

UnixJunkie announced

I am pleased to announce the availability in opam of the svmwrap package. A wrapper around libsvm's svm-train and svm-predict executables. Currently, only regression modeling is supported, using the linear, RBF, sigmoid or polynomial kernel.

https://github.com/UnixJunkie/svmwrap

The quite scary usage looks like this:

usage: svmwrap
  -i <filename>: training set or DB to screen
  --feats <int>: number of features
  [-o <filename>]: predictions output file
  [-np <int>]: ncores
  [--kernel <string>] choose kernel type {Lin|RBF|Sig|Pol}
  [-c <float>]: fix C
  [-e <float>]: epsilon in the loss function of epsilon-SVR;
  (0 <= epsilon <= max_i(|y_i|))
  [-g <float>]: fix gamma (for RBF and Sig kernels)
  [-r <float>]: fix r for the Sig kernel
  [--iwn]: turn ON instance-wise-normalization
  [--scale]: turn ON [0:1] scaling (NOT PRODUCTION READY)
  [--no-plot]: no gnuplot
  [{-n|--NxCV} <int>]: folds of cross validation
  [-q]: quiet
  [-v|--verbose]: equivalent to not specifying -q
  [--seed <int>]: fix random seed
  [-p <float>]: training set portion (in [0.0:1.0])
  [--pairs]: read from .AP files (atom pairs; will offset feat. indexes by 1)
  [--train <train.liblin>]: training set (overrides -p)
  [--valid <valid.liblin>]: validation set (overrides -p)
  [--test <test.liblin>]: test set (overrides -p)
  [{-l|--load} <filename>]: prod. mode; use trained models
  [{-s|--save} <filename>]: train. mode; save trained models
  [-f]: force overwriting existing model file
  [--scan-c]: scan for best C
  [--scan-e <int>]: epsilon scan #steps for SVR
  [--scan-g]: scan for best gamma
  [--regr]: regression (SVR); also, implied by -e and --scan-e
  [--e-range <float>:<int>:<float>]: specific range for e
  (semantic=start:nsteps:stop)
  [--c-range <float,float,...>] explicit scan range for C
  (example='0.01,0.02,0.03')
  [--g-range <float,float,...>] explicit range for gamma
  (example='0.01,0.02,0.03')
  [--r-range <float,float,...>] explicit range for r
  (example='0.01,0.02,0.03')

For people who know my linwrap opam package (a wrapper around liblinear tools), this is quite similar. https://github.com/UnixJunkie/linwrap

GeoPub - A XMPP web client

pukkamustard announced

I'd like to announce an initial, proof-of-concept release of GeoPub - an XMPP web client. Unlike many XMPP clients the focus is not on instant messaging but on creating, displaying and managing things such as events, maps, information on local organizations and other local knowledge (see the openEngiadina project for the context).

This initial release is not really anything useful but a proof-of-concept how such an application can be developed using XMPP and OCaml. There are many rough edges and broken hacks that need fixing. I'd be very grateful for your feedback, thoughts and ideas.

The source code of the app is on codeberg and a pre-built hosted version is available here.

The application consists of some parts and ideas that I'd like to illustrate separately:

ocaml-xmpp

ocaml-xmpp is a XMPP client library for OCaml (documentation available online.

Reactive

ocaml-xmpp is reactive in the sense that the XMPP connection is abstracted as a React event of Stanzas (small pieces of information that flow over XMPP):

val stanzas : t -> Stanza.t React.event

This React event can be filtered for messages in a specific conversation, for example.

Transports

XMPP works with different transport mechanisms and ocaml-xmpp supports this. Currently ocaml-xmpp can be used from Unix with a TCP/SSL connection to a XMPP server and from web browsers with a WebSocket connection. This is implemented by abstracting the XMPP transport:

module type TRANSPORT = sig
  (** {2 Connection} *)

  type options
  (** Additional options that may be passed to the transport *)

  type t
  (** Type of an instantiated connection to an XMPP server *)

  val connect : host:string -> options -> t Lwt.t

  val close : t -> unit Lwt.t

  val closed : t -> unit Lwt.t

  (** {2 XML Stream} *)

  type stream

  val open_stream : t -> to':string -> stream Lwt.t

  val stream_id : stream -> string Lwt.t

  val send_xml : stream -> Xmlc.t -> unit Lwt.t

  val signals : stream -> Xmlc.signal Lwt_stream.t

  val stop_stream : stream -> unit Lwt.t
end

A transport establishes the underlying connection to a server and can create XML streams (in XMPP a connection is by multiple XML streams sequentially). For technical reasons XML parsing is also handled by the transport and a stream of XML signals (element start, data, element end) is returned. This is due to the fact that XML parsing in XMPP needs to be done slightly differently when using TCP (a single XML document over the entire stream) or WebSockets (every WebSocket frame is a parse-able XML document).

The Unix/TCP/SSL transport uses Markup.ml and whereas the WebSocket transport uses Xmlm (and Brrr).

Parser combinators for XML

For parsing streams of XML signals to OCaml types ocaml-xmpp contains a parser combinator helper library: Xmlc. This allows parser for XML such as this:

<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><jid>w4iu4ckn3kjbqvcd@demo.openengiadina.net/z8Pkzfa8</jid></bind>

to be parses like this:

Xmlc.Parser.(
  element (Ns.bind "bind") (fun _ ->
    element (Ns.bind "jid") (fun _ ->
      text >>| String.concat "" >>= fun jid_s ->
      match Jid.of_string jid_s with
      | Some jid -> return jid
      | None -> fail_with "invalid JID")))
XMPP extensions

Inspiration for the scope of the core library is taken from the Strophe XMPP libraries - everything that does not have directly to do with XMPP transport, authentication or stream management is kept outside of the core library.

There are already some "extension" libraries outside of the core for useful XMPP features (e.g. Roster management, PubSub and pinging).

One thing that I do want to add to the core library is stream management according to XEP-0198. I expect this addition to change the core library API - the API is not stable yet!

Much inspiration was taken from Jackline - an OCaml XMPP client - and in particular this post on Jackline. Many thanks to @hannes.

reactor

GeoPub uses Brr. I had some trouble figuring out a suitable "architecture" for managing complex logic and ended up hacking an Elm inspired helper library: reactor.mli. State updates for the entire application are then handled in a single update function.

I'm not yet very happy with this machinery and I'm pretty sure I'm using react in wrong and dangerous ways. I'd be very grateful for ideas on how to improve this. THis might be related to this discussion: https://discuss.ocaml.org/t/structuring-frp-specifically-note-applications/8645/17.

The reason for using React over Note is because ocaml-xmpp uses a lot of Lwt and Lwt_react provides nice bindings for working with both. I guess something similar could be created for Note (e.g. Lwt_note) and I'm open to using Note (also in ocaml-xmpp).

Leaflet

GeoPub displays a map using the Leaflet.js JavaScript library. GeoPub contains OCaml bindings to Leaflet using Brr: leaflet.mli. Writing this was very straightforward and pleasant (I like Brr!).

One issue I have is that the Leaflet map needs to be manipulated very imperatively, whereas the rest of the application is much more functional. This causes some mismatches. I guess one needs to find a way of hiding the impressiveness of Leaflet (e.g. like react-leaflet).

Guix for build and development environments

I use Guix for providing a build and development environment. With guix installed one can run guix shell in the GeoPub repository to get a reproducible build environment. All dependencies are fetched and made available by Guix in this environment (e.g. ocaml-xmpp or the OCaml compiler).

I will publish ocaml-xmpp on OPAM once the API is more stable and an initial release can be made.

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 look at the archive or the RSS feed of the archives.

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

--=-=-=--